ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2YzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjIgQEAKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAiYXYtdHlwZXMtYWlkbCIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSW50ZXJwb2xhdG9yQ29uZmlnLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0ludGVycG9sYXRvclR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm9EYXRhLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWcuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyT3BlcmF0aW9uLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWcuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyU3RhdGUuYWlkbCIsCisgICAgXSwKKyAgICBiYWNrZW5kOiB7CisgICAgICAgIGNwcDogeworICAgICAgICAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgICAgICAgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJhdi1oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYXYtdHlwZXMtYWlkbC11bnN0YWJsZS1jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWworICAgICAgICAiYXYtdHlwZXMtYWlkbC11bnN0YWJsZS1jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3OTc1YwotLS0gL2Rldi9udWxsCisrKyBiL01FVEFEQVRBCkBAIC0wLDAgKzEsMyBAQAordGhpcmRfcGFydHkgeworICBsaWNlbnNlX3R5cGU6IE5PVElDRQorfQpkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCmluZGV4IDhmNDA1ZTkuLjdmNTIzYTIgMTAwNjQ0Ci0tLSBhL09XTkVSUworKysgYi9PV05FUlMKQEAgLTEsNCArMSwxMCBAQAorY2h6QGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KIGV0YWx2YWxhQGdvb2dsZS5jb20KK2hrdWFuZ0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCiBtYXJjb25lQGdvb2dsZS5jb20KKworIyBMT04KK29sbHlAZ29vZ2xlLmNvbQorYW5kcmV3bGV3aXNAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvUFJFVVBMT0FELmNmZyBiL1BSRVVQTE9BRC5jZmcKaW5kZXggYWU5MjBjMC4uOGZlNDhjMiAxMDA2NDQKLS0tIGEvUFJFVVBMT0FELmNmZworKysgYi9QUkVVUExPQUQuY2ZnCkBAIC0xLDIgKzEsMTEgQEAKIFtIb29rIFNjcmlwdHNdCiBtYWlubGluZV9ob29rID0gJHtSRVBPX1JPT1R9L2ZyYW1ld29ya3MvYXYvdG9vbHMvbWFpbmxpbmVfaG9va19wYXJ0aWFsLnNoICR7UkVQT19ST09UfSAke1BSRVVQTE9BRF9GSUxFU30KKworW0J1aWx0aW4gSG9va3NdCitjbGFuZ19mb3JtYXQgPSB0cnVlCisKK1tCdWlsdGluIEhvb2tzIE9wdGlvbnNdCisjIE9ubHkgdHVybiBvbiBjbGFuZy1mb3JtYXQgY2hlY2sgZm9yIHRoZSBmb2xsb3dpbmcgc3ViZm9sZGVycy4KK2NsYW5nX2Zvcm1hdCA9IC0tY29tbWl0ICR7UFJFVVBMT0FEX0NPTU1JVH0gLS1zdHlsZSBmaWxlIC0tZXh0ZW5zaW9ucyBjLGgsY2MsY3BwCisgICAgICAgICAgICAgICBtZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nLworICAgICAgICAgICAgICAgc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy8KZGlmZiAtLWdpdCBhL2FpZGwvYW5kcm9pZC9tZWRpYS9JbnRlcnBvbGF0b3JDb25maWcuYWlkbCBiL2FpZGwvYW5kcm9pZC9tZWRpYS9JbnRlcnBvbGF0b3JDb25maWcuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjc0ODZlCi0tLSAvZGV2L251bGwKKysrIGIvYWlkbC9hbmRyb2lkL21lZGlhL0ludGVycG9sYXRvckNvbmZpZy5haWRsCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkludGVycG9sYXRvclR5cGU7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEludGVycG9sYXRvckNvbmZpZyB7CisgICAgSW50ZXJwb2xhdG9yVHlwZSB0eXBlOworICAgIC8qKiBGb3IgY3ViaWMgaW50ZXJwb2xhdGlvbiwgdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMgaW4gc2xvcGUuICovCisgICAgZmxvYXQgZmlyc3RTbG9wZTsKKyAgICBmbG9hdCBsYXN0U2xvcGU7CisgICAgLyoqIEEgZmxhdHRlbmVkIGxpc3Qgb2YgPHgsIHk+IHBhaXJzLCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgaW4geC4gKi8KKyAgICBmbG9hdFtdIHh5OworfQpkaWZmIC0tZ2l0IGEvYWlkbC9hbmRyb2lkL21lZGlhL0ludGVycG9sYXRvclR5cGUuYWlkbCBiL2FpZGwvYW5kcm9pZC9tZWRpYS9JbnRlcnBvbGF0b3JUeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyMmNhZAotLS0gL2Rldi9udWxsCisrKyBiL2FpZGwvYW5kcm9pZC9tZWRpYS9JbnRlcnBvbGF0b3JUeXBlLmFpZGwKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogUG9seW5vbWlhbCBzcGxpbmUgaW50ZXJwb2xhdG9ycy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEludGVycG9sYXRvclR5cGUgeworICAgIC8qKiBOb3QgY29udGludW91cy4gKi8KKyAgICBTVEVQLAorICAgIC8qKiBDMC4gKi8KKyAgICBMSU5FQVIsCisgICAgLyoqIEMxLiAqLworICAgIENVQklDLAorICAgIC8qKiBDMSAodG8gcHJvdmlkZSBsb2NhbGx5IG1vbm90b25pYyBjdXJ2ZXMpLiAqLworICAgIENVQklDX01PTk9UT05JQywKKyAgICAvLyBDVUJJQ19DMiwgLy8gVE9ETyAtIHJlcXVpcmVzIGdsb2JhbCBjb21wdXRhdGlvbiAvIGNhY2hlCit9CmRpZmYgLS1naXQgYS9haWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm9EYXRhLmFpZGwgYi9haWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm9EYXRhLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3YmZhNQotLS0gL2Rldi9udWxsCisrKyBiL2FpZGwvYW5kcm9pZC9tZWRpYS9NaWNyb3Bob25lSW5mb0RhdGEuYWlkbApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIE1pY3JvcGhvbmVJbmZvRGF0YSB7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgZGV2aWNlSWQ7CisgICAgaW50IHBvcnRJZDsKKyAgICBpbnQgdHlwZTsKKyAgICBAdXRmOEluQ3BwIFN0cmluZyBhZGRyZXNzOworICAgIGludCBkZXZpY2VMb2NhdGlvbjsKKyAgICBpbnQgZGV2aWNlR3JvdXA7CisgICAgaW50IGluZGV4SW5UaGVHcm91cDsKKyAgICBmbG9hdFtdIGdlb21ldHJpY0xvY2F0aW9uOworICAgIGZsb2F0W10gb3JpZW50YXRpb247CisgICAgZmxvYXRbXSBmcmVxdWVuY2llczsKKyAgICBmbG9hdFtdIGZyZXF1ZW5jeVJlc3BvbnNlczsKKyAgICBpbnRbXSBjaGFubmVsTWFwcGluZzsKKyAgICBmbG9hdCBzZW5zaXRpdml0eTsKKyAgICBmbG9hdCBtYXhTcGw7CisgICAgZmxvYXQgbWluU3BsOworICAgIGludCBkaXJlY3Rpb25hbGl0eTsKK30KZGlmZiAtLWdpdCBhL2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uLmFpZGwgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjE4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkludGVycG9sYXRvckNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGU7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24geworICAgIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlIHR5cGU7CisgICAgaW50IGlkOworICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnLiAqLworICAgIGludCBvcHRpb25GbGFnczsKKyAgICBkb3VibGUgZHVyYXRpb25NczsKKyAgICBJbnRlcnBvbGF0b3JDb25maWcgaW50ZXJwb2xhdG9yQ29uZmlnOworfQpkaWZmIC0tZ2l0IGEvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnLmFpZGwgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWcuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTgzY2VlCi0tLSAvZGV2L251bGwKKysrIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnLmFpZGwKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnIHsKKyAgICBWT0xVTUVfSU5fREJGUywKKyAgICBDTE9DS19USU1FLAorfQpkaWZmIC0tZ2l0IGEvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlLmFpZGwgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTYzMzRlCi0tLSAvZGV2L251bGwKKysrIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlLmFpZGwKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlIHsKKyAgICBJRCwKKyAgICBTQ0FMRSwKK30KZGlmZiAtLWdpdCBhL2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXJPcGVyYXRpb24uYWlkbCBiL2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXJPcGVyYXRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDlhMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFZvbHVtZVNoYXBlck9wZXJhdGlvbiB7CisgICAgLyoqIE9wZXJhdGlvbnMgdG8gZG8uIEJpdG1hc2sgb2YgVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZy4gKi8KKyAgICBpbnQgZmxhZ3M7CisgICAgLyoqIElmID49IDAgdGhlIGlkIHRvIHJlbW92ZSBpbiBhIHJlcGxhY2Ugb3BlcmF0aW9uLiAqLworICAgIGludCByZXBsYWNlSWQ7CisgICAgLyoqIFBvc2l0aW9uIGluIHRoZSBjdXJ2ZSB0byBzZXQgaWYgYSB2YWxpZCBudW1iZXIgKG5vdCBuYW4pLiAqLworICAgIGZsb2F0IHhPZmZzZXQ7Cit9CmRpZmYgLS1naXQgYS9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZy5haWRsIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWcuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU1Mjc1Ci0tLSAvZGV2L251bGwKKysrIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWcuYWlkbApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZyB7CisgICAgLyoqIFRoZSBhYnNlbmNlIG9mIHRoaXMgZmxhZyBpbmRpY2F0ZXMgInBsYXkiLiAqLworICAgIFJFVkVSU0UsCisgICAgVEVSTUlOQVRFLAorICAgIEpPSU4sCisgICAgREVMQVksCisgICAgQ1JFQVRFX0lGX05FQ0VTU0FSWSwKK30KZGlmZiAtLWdpdCBhL2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXJTdGF0ZS5haWRsIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlclN0YXRlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4NWUyYgotLS0gL2Rldi9udWxsCisrKyBiL2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXJTdGF0ZS5haWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFZvbHVtZVNoYXBlclN0YXRlIHsKKyAgICAvKiogTGluZWFyIHZvbHVtZSBpbiB0aGUgcmFuZ2UgTUlOX0xJTkVBUl9WT0xVTUUgdG8gTUFYX0xJTkVBUl9WT0xVTUUuICovCisgICAgZmxvYXQgdm9sdW1lOworICAgIC8qKiBQb3NpdGlvbiBvbiBjdXJ2ZSBleHByZXNzZWQgZnJvbSBNSU5fQ1VSVkVfVElNRSB0byBNQVhfQ1VSVkVfVElNRS4gKi8KKyAgICBmbG9hdCB4T2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvYXBleC9BbmRyb2lkLmJwIGIvYXBleC9BbmRyb2lkLmJwCmluZGV4IDJiYTYyNjcuLjZiYTljYjkgMTAwNjQ0Ci0tLSBhL2FwZXgvQW5kcm9pZC5icAorKysgYi9hcGV4L0FuZHJvaWQuYnAKQEAgLTYyLDYgKzYyLDE1IEBACiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICBtYW5pZmVzdDogIm1hbmlmZXN0Lmpzb24iLAogICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIl0sCisgICAgcHJlYnVpbHRzOiBbCisgICAgICAgICJtZWRpYS1saW5rZXItY29uZmlnIiwKKyAgICBdLAorfQorCitsaW5rZXJfY29uZmlnIHsKKyAgICBuYW1lOiAibWVkaWEtbGlua2VyLWNvbmZpZyIsCisgICAgc3JjOiAibGlua2VyLmNvbmZpZy5qc29uIiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCiB9CiAKIGZpbGVncm91cCB7CmRpZmYgLS1naXQgYS9hcGV4L1RFU1RfTUFQUElORyBiL2FwZXgvVEVTVF9NQVBQSU5HCmluZGV4IGYwMzY1MTYuLjA5YzQ2ZDYgMTAwNjQ0Ci0tLSBhL2FwZXgvVEVTVF9NQVBQSU5HCisrKyBiL2FwZXgvVEVTVF9NQVBQSU5HCkBAIC0xNCwxNyArMTQsOSBAQAogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVHZW5lcmljT3BzVGVzdHMiCi0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogIkd0c0V4b1BsYXllclRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyIgOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Tb2NQcmVzdWJtaXQiCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLmV4b3BsYXllci5ndHMuRGFzaFRlc3QjdGVzdFdpZGV2aW5lMjNGcHNIMjY0Rml4ZWQiCisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVZb3VUdWJlUGVyZm9ybWFuY2VUZXN0cyIKICAgICAgICAgfQogICAgICAgXQogICAgIH0KZGlmZiAtLWdpdCBhL2FwZXgvbGlua2VyLmNvbmZpZy5qc29uIGIvYXBleC9saW5rZXIuY29uZmlnLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjMDc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvbGlua2VyLmNvbmZpZy5qc29uCkBAIC0wLDAgKzEsMyBAQAoreworICAgICJ2aXNpYmxlIjogdHJ1ZQorfQpkaWZmIC0tZ2l0IGEvYXBleC9tZWRpYXN3Y29kZWMucmMgYi9hcGV4L21lZGlhc3djb2RlYy5yYwppbmRleCBkMTc0ODFiLi4wYzliOGM4IDEwMDY0NAotLS0gYS9hcGV4L21lZGlhc3djb2RlYy5yYworKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMiw2ICsyLDUgQEAKICAgICBjbGFzcyBtYWluCiAgICAgdXNlciBtZWRpYWNvZGVjCiAgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQotICAgIG92ZXJyaWRlCiAgICAgaW9wcmlvIHJ0IDQKICAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icCBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCmluZGV4IGEwNGFiM2YuLmQ4NjA5NGUgMTAwNjQ0Ci0tLSBhL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCisrKyBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCkBAIC0xNyw3ICsxNywxMCBAQAogICAgIG1hbmlmZXN0OiAidGVzdF9tYW5pZmVzdC5qc29uIiwKICAgICBmaWxlX2NvbnRleHRzOiAiOmNvbS5hbmRyb2lkLm1lZGlhLWZpbGVfY29udGV4dHMiLAogICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIl0sCi0gICAgcHJlYnVpbHRzOiBbInNka2luZm9fNDUiXSwKKyAgICBwcmVidWlsdHM6IFsKKyAgICAgICAgInNka2luZm9fNDUiLAorICAgICAgICAibWVkaWEtbGlua2VyLWNvbmZpZyIsCisgICAgXSwKICAgICBpbnN0YWxsYWJsZTogZmFsc2UsCiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLmJwIGIvY2FtZXJhL0FuZHJvaWQuYnAKaW5kZXggZmEzNmJiMy4uYTllMDBkMCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL0FuZHJvaWQuYnAKQEAgLTM1LDEwICszNSwxMCBAQAogICAgICAgICAiQ2FtZXJhUGFyYW1ldGVycy5jcHAiLAogICAgICAgICAiQ2FwdHVyZVJlc3VsdC5jcHAiLAogICAgICAgICAiQ2FtZXJhUGFyYW1ldGVyczIuY3BwIiwKKyAgICAgICAgIkNhbWVyYVNlc3Npb25TdGF0cy5jcHAiLAogICAgICAgICAiSUNhbWVyYS5jcHAiLAogICAgICAgICAiSUNhbWVyYUNsaWVudC5jcHAiLAogICAgICAgICAiSUNhbWVyYVJlY29yZGluZ1Byb3h5LmNwcCIsCi0gICAgICAgICJJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAiLAogICAgICAgICAiY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAiLAogICAgICAgICAiY2FtZXJhMi9Db25jdXJyZW50Q2FtZXJhLmNwcCIsCiAgICAgICAgICJjYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIiwKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmEuY3BwIGIvY2FtZXJhL0NhbWVyYS5jcHAKaW5kZXggODRkMWQ5My4uZjdkMTk0ZSAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYS5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogCiAjaW5jbHVkZSA8Q2FtZXJhLmg+Ci0jaW5jbHVkZSA8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CiAKQEAgLTc3LDYzICs3Niw2IEBACiAgICAgcmV0dXJuIENhbWVyYUJhc2VUOjpjb25uZWN0KGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQpOwogfQogCi1zdGF0dXNfdCBDYW1lcmE6OmNvbm5lY3RMZWdhY3koaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICBzcDxDYW1lcmE+JiBjYW1lcmEpCi17Ci0gICAgQUxPR1YoIiVzOiBjb25uZWN0IGxlZ2FjeSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKLSAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKGNhbWVyYUlkKTsKLSAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiBjbCA9IGM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U+JiBjcyA9IENhbWVyYUJhc2VUOjpnZXRDYW1lcmFTZXJ2aWNlKCk7Ci0KLSAgICBiaW5kZXI6OlN0YXR1cyByZXQ7Ci0gICAgaWYgKGNzICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0ID0gY3MuZ2V0KCktPmNvbm5lY3RMZWdhY3koY2wsIGNhbWVyYUlkLCBoYWxWZXJzaW9uLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjbGllbnRVaWQsIC8qb3V0Ki8mKGMtPm1DYW1lcmEpKTsKLSAgICB9Ci0gICAgaWYgKHJldC5pc09rKCkgJiYgYy0+bUNhbWVyYSAhPSBudWxscHRyKSB7Ci0gICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGMtPm1DYW1lcmEpLT5saW5rVG9EZWF0aChjKTsKLSAgICAgICAgYy0+bVN0YXR1cyA9IE5PX0VSUk9SOwotICAgICAgICBjYW1lcmEgPSBjOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaChyZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLUVOT0RFVjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9DQU1FUkFfSU5fVVNFOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FQlVTWTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX01BWF9DQU1FUkFTX0lOX1VTRToKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRVVTRVJTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RFUFJFQ0FURURfSEFMOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FT1BOT1RTVVBQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0FCTEVEOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FQUNDRVM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfUEVSTUlTU0lPTl9ERU5JRUQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNvbm5lY3RpbmcgdG8gY2FtZXJhICVkOiAlcyIsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgKGNzICE9IG51bGxwdHIpID8gIlNlcnZpY2Ugbm90IGF2YWlsYWJsZSIgOiByZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGMuY2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhOjpyZWNvbm5lY3QoKQogewogICAgIEFMT0dWKCJyZWNvbm5lY3QiKTsKQEAgLTIxNCwxMCArMTU2LDYgQEAKIHZvaWQgQ2FtZXJhOjpzdG9wUmVjb3JkaW5nKCkKIHsKICAgICBBTE9HVigic3RvcFJlY29yZGluZyIpOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgbVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY2xlYXIoKTsKLSAgICB9CiAgICAgc3AgPDo6YW5kcm9pZDo6aGFyZHdhcmU6OklDYW1lcmE+IGMgPSBtQ2FtZXJhOwogICAgIGlmIChjID09IDApIHJldHVybjsKICAgICBjLT5zdG9wUmVjb3JkaW5nKCk7CkBAIC0zMjUsMTIgKzI2Myw2IEBACiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiB9CiAKLXZvaWQgQ2FtZXJhOjpzZXRSZWNvcmRpbmdQcm94eUxpc3RlbmVyKGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiYgbGlzdGVuZXIpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtUmVjb3JkaW5nUHJveHlMaXN0ZW5lciA9IGxpc3RlbmVyOwotfQotCiB2b2lkIENhbWVyYTo6c2V0UHJldmlld0NhbGxiYWNrRmxhZ3MoaW50IGZsYWcpCiB7CiAgICAgQUxPR1YoInNldFByZXZpZXdDYWxsYmFja0ZsYWdzIik7CkBAIC0zODQsMTkgKzMxNiw2IEBACiAvLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlIHdoZW4gdGltZXN0YW1wZWQgZnJhbWUgaXMgcmVhZHkKIHZvaWQgQ2FtZXJhOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpCiB7Ci0gICAgLy8gSWYgcmVjb3JkaW5nIHByb3h5IGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQsIGZvcndhcmQgdGhlIGZyYW1lIGFuZCByZXR1cm4uCi0gICAgLy8gVGhlIG90aGVyIGxpc3RlbmVyIChtTGlzdGVuZXIpIGlzIGlnbm9yZWQgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgbmVlZHMgdG8KLSAgICAvLyBjYWxsIHJlbGVhc2VSZWNvcmRpbmdGcmFtZS4KLSAgICBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4gcHJveHlsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHByb3h5bGlzdGVuZXIgPSBtUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjsKLSAgICB9Ci0gICAgaWYgKHByb3h5bGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBwcm94eWxpc3RlbmVyLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLCBtc2dUeXBlLCBkYXRhUHRyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIHNwPENhbWVyYUxpc3RlbmVyPiBsaXN0ZW5lcjsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC00MTMsMTkgKzMzMiw2IEBACiAKIHZvaWQgQ2FtZXJhOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkKIHsKLSAgICAvLyBJZiByZWNvcmRpbmcgcHJveHkgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCwgZm9yd2FyZCB0aGUgZnJhbWUgYW5kIHJldHVybi4KLSAgICAvLyBUaGUgb3RoZXIgbGlzdGVuZXIgKG1MaXN0ZW5lcikgaXMgaWdub3JlZCBiZWNhdXNlIHRoZSByZWNlaXZlciBuZWVkcyB0bwotICAgIC8vIGNhbGwgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlLgotICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiBwcm94eWxpc3RlbmVyOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgcHJveHlsaXN0ZW5lciA9IG1SZWNvcmRpbmdQcm94eUxpc3RlbmVyOwotICAgIH0KLSAgICBpZiAocHJveHlsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIHByb3h5bGlzdGVuZXItPnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLCBoYW5kbGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgc3A8Q2FtZXJhTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ0NCwxOSArMzUwLDYgQEAKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bnNlY3NfdD4mIHRpbWVzdGFtcHMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKQogewotICAgIC8vIElmIHJlY29yZGluZyBwcm94eSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLCBmb3J3YXJkIHRoZSBmcmFtZSBhbmQgcmV0dXJuLgotICAgIC8vIFRoZSBvdGhlciBsaXN0ZW5lciAobUxpc3RlbmVyKSBpcyBpZ25vcmVkIGJlY2F1c2UgdGhlIHJlY2VpdmVyIG5lZWRzIHRvCi0gICAgLy8gY2FsbCByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUuCi0gICAgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+IHByb3h5bGlzdGVuZXI7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBwcm94eWxpc3RlbmVyID0gbVJlY29yZGluZ1Byb3h5TGlzdGVuZXI7Ci0gICAgfQotICAgIGlmIChwcm94eWxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgcHJveHlsaXN0ZW5lci0+cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKHRpbWVzdGFtcHMsIGhhbmRsZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgc3A8Q2FtZXJhTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ3NiwxMCArMzY5LDkgQEAKICAgICByZXR1cm4gbmV3IFJlY29yZGluZ1Byb3h5KHRoaXMpOwogfQogCi1zdGF0dXNfdCBDYW1lcmE6OlJlY29yZGluZ1Byb3h5OjpzdGFydFJlY29yZGluZyhjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4mIGxpc3RlbmVyKQorc3RhdHVzX3QgQ2FtZXJhOjpSZWNvcmRpbmdQcm94eTo6c3RhcnRSZWNvcmRpbmcoKQogewogICAgIEFMT0dWKCJSZWNvcmRpbmdQcm94eTo6c3RhcnRSZWNvcmRpbmciKTsKLSAgICBtQ2FtZXJhLT5zZXRSZWNvcmRpbmdQcm94eUxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICBtQ2FtZXJhLT5yZWNvbm5lY3QoKTsKICAgICByZXR1cm4gbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKTsKIH0KQEAgLTQ5MCwyMyArMzgyLDYgQEAKICAgICBtQ2FtZXJhLT5zdG9wUmVjb3JkaW5nKCk7CiB9CiAKLXZvaWQgQ2FtZXJhOjpSZWNvcmRpbmdQcm94eTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pCi17Ci0gICAgQUxPR1YoIlJlY29yZGluZ1Byb3h5OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUiKTsKLSAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUobWVtKTsKLX0KLQotdm9pZCBDYW1lcmE6OlJlY29yZGluZ1Byb3h5OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIHsKLSAgICBBTE9HVigiUmVjb3JkaW5nUHJveHk6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZSIpOwotICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShoYW5kbGUpOwotfQotCi12b2lkIENhbWVyYTo6UmVjb3JkaW5nUHJveHk6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiYgaGFuZGxlcykgewotICAgIEFMT0dWKCJSZWNvcmRpbmdQcm94eTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2giKTsKLSAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaChoYW5kbGVzKTsKLX0KLQogQ2FtZXJhOjpSZWNvcmRpbmdQcm94eTo6UmVjb3JkaW5nUHJveHkoY29uc3Qgc3A8Q2FtZXJhPiYgY2FtZXJhKQogewogICAgIG1DYW1lcmEgPSBjYW1lcmE7CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAgYi9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKaW5kZXggYWVjYjcwYS4uMGIwZjU4NCAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhQmFzZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogCiAvLyBuZWVkZWQgdG8gaW5zdGFudGlhdGUKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC0xMjQsOSArMTI1LDcgQEAKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgIGlmIChnQ2FtZXJhU2VydmljZS5nZXQoKSA9PSAwKSB7Ci0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJjb25maWcuZGlzYWJsZV9jYW1lcmFzZXJ2aWNlIiwgdmFsdWUsICIwIik7Ci0gICAgICAgIGlmIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDAgJiYgc3RybmNhc2VjbXAodmFsdWUsICJmYWxzZSIsIDYpICE9IDApIHsKKyAgICAgICAgaWYgKENhbWVyYVV0aWxzOjppc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ0NhbWVyYVNlcnZpY2U7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggMTM1Mzg0YS4uOTZlYTVmMiAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE2OSw2ICsxNzAsMTEgQEAKICAgICByZXR1cm4gZW50cnlDb3VudCgpID09IDA7CiB9CiAKK3NpemVfdCBDYW1lcmFNZXRhZGF0YTo6YnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1CdWZmZXIgPT0gTlVMTCkgPyAwIDoKKyAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShtQnVmZmVyKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhTWV0YWRhdGE6OnNvcnQoKSB7CiAgICAgaWYgKG1Mb2NrZWQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmFNZXRhZGF0YSBpcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwpAQCAtODcyLDUgKzg3OCw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCittZXRhZGF0YV92ZW5kb3JfaWRfdCBDYW1lcmFNZXRhZGF0YTo6Z2V0VmVuZG9ySWQoKSB7CisgICAgcmV0dXJuIGdldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKG1CdWZmZXIpOworfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCmluZGV4IDY4OTY5Y2YuLmU5NWM5MWMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCmluZGV4IGMyOTIzM2MuLmExY2YzNTUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwIGIvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4YjRkMAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2Vzc2lvblN0YXRzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CisKK3N0YXR1c190IENhbWVyYVN0cmVhbVN0YXRzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgeworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IE51bGwgcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGludCB3aWR0aCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmd2lkdGgpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHdpZHRoIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaGVpZ2h0ID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZoZWlnaHQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGhlaWdodCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGZvcm1hdCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmZm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBmb3JtYXQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBkYXRhU3BhY2UgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmRhdGFTcGFjZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgZGF0YVNwYWNlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHVzYWdlID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDY0KCZ1c2FnZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgdXNhZ2UgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDY0X3QgcmVxdWVzdENvdW50ID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDY0KCZyZXF1ZXN0Q291bnQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHJlcXVlc3QgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDY0X3QgZXJyb3JDb3VudCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQ2NCgmZXJyb3JDb3VudCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgZXJyb3IgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBzdGFydExhdGVuY3lNcyA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc3RhcnRMYXRlbmN5TXMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN0YXJ0IGxhdGVuY3kgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBtYXhIYWxCdWZmZXJzID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZtYXhIYWxCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBtYXggSGFsIGJ1ZmZlcnMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBtYXhBcHBCdWZmZXJzID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZtYXhBcHBCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBtYXggYXBwIGJ1ZmZlcnMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgbUZvcm1hdCA9IGZvcm1hdDsKKyAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOworICAgIG1Vc2FnZSA9IHVzYWdlOworICAgIG1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CisgICAgbUVycm9yQ291bnQgPSBlcnJvckNvdW50OworICAgIG1TdGFydExhdGVuY3lNcyA9IHN0YXJ0TGF0ZW5jeU1zOworICAgIG1NYXhIYWxCdWZmZXJzID0gbWF4SGFsQnVmZmVyczsKKyAgICBtTWF4QXBwQnVmZmVycyA9IG1heEFwcEJ1ZmZlcnM7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVN0cmVhbVN0YXRzOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVdpZHRoKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgc3RyZWFtIHdpZHRoISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUhlaWdodCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHN0cmVhbSBoZWlnaHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtRm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgc3RyZWFtIGZvcm1hdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1EYXRhU3BhY2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gZGF0YVNwYWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobVVzYWdlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgc3RyZWFtIHVzYWdlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobVJlcXVlc3RDb3VudCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHN0cmVhbSByZXF1ZXN0IGNvdW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobUVycm9yQ291bnQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gZXJyb3IgY291bnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU3RhcnRMYXRlbmN5TXMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gc3RhcnQgbGF0ZW5jeSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1NYXhIYWxCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgbWF4IGhhbCBidWZmZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtTWF4QXBwQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG1heCBhcHAgYnVmZmVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitjb25zdCBpbnQgQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfU1RBVEVfT1BFTiA9IDA7Citjb25zdCBpbnQgQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfU1RBVEVfQUNUSVZFID0gMTsKK2NvbnN0IGludCBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9TVEFURV9JRExFID0gMjsKK2NvbnN0IGludCBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9TVEFURV9DTE9TRUQgPSAzOworCitjb25zdCBpbnQgQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfRkFDSU5HX0JBQ0sgPSAwOworY29uc3QgaW50IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX0ZBQ0lOR19GUk9OVCA9IDE7Citjb25zdCBpbnQgQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfRkFDSU5HX0VYVEVSTkFMID0gMjsKKworY29uc3QgaW50IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX0FQSV9MRVZFTF8xID0gMTsKK2NvbnN0IGludCBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9BUElfTEVWRUxfMiA9IDI7CisKK0NhbWVyYVNlc3Npb25TdGF0czo6Q2FtZXJhU2Vzc2lvblN0YXRzKCkgOgorICAgICAgICBtRmFjaW5nKENBTUVSQV9GQUNJTkdfQkFDSyksCisgICAgICAgIG1OZXdDYW1lcmFTdGF0ZShDQU1FUkFfU1RBVEVfQ0xPU0VEKSwKKyAgICAgICAgbUFwaUxldmVsKDApLAorICAgICAgICBtSXNOZGsoZmFsc2UpLAorICAgICAgICBtTGF0ZW5jeU1zKC0xKSwKKyAgICAgICAgbVNlc3Npb25UeXBlKDApLAorICAgICAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSgwKSwKKyAgICAgICAgbVJlcXVlc3RDb3VudCgwKSwKKyAgICAgICAgbVJlc3VsdEVycm9yQ291bnQoMCksCisgICAgICAgIG1EZXZpY2VFcnJvcihmYWxzZSkge30KKworQ2FtZXJhU2Vzc2lvblN0YXRzOjpDYW1lcmFTZXNzaW9uU3RhdHMoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICBpbnQgZmFjaW5nLCBpbnQgbmV3Q2FtZXJhU3RhdGUsIGNvbnN0IFN0cmluZzE2JiBjbGllbnROYW1lLAorICAgICAgICBpbnQgYXBpTGV2ZWwsIGJvb2wgaXNOZGssIGludDMyX3QgbGF0ZW5jeU1zKSA6CisgICAgICAgICAgICAgICAgbUNhbWVyYUlkKGNhbWVyYUlkKSwKKyAgICAgICAgICAgICAgICBtRmFjaW5nKGZhY2luZyksCisgICAgICAgICAgICAgICAgbU5ld0NhbWVyYVN0YXRlKG5ld0NhbWVyYVN0YXRlKSwKKyAgICAgICAgICAgICAgICBtQ2xpZW50TmFtZShjbGllbnROYW1lKSwKKyAgICAgICAgICAgICAgICBtQXBpTGV2ZWwoYXBpTGV2ZWwpLAorICAgICAgICAgICAgICAgIG1Jc05kayhpc05kayksCisgICAgICAgICAgICAgICAgbUxhdGVuY3lNcyhsYXRlbmN5TXMpLAorICAgICAgICAgICAgICAgIG1TZXNzaW9uVHlwZSgwKSwKKyAgICAgICAgICAgICAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSgwKSwKKyAgICAgICAgICAgICAgICBtUmVxdWVzdENvdW50KDApLAorICAgICAgICAgICAgICAgIG1SZXN1bHRFcnJvckNvdW50KDApLAorICAgICAgICAgICAgICAgIG1EZXZpY2VFcnJvcigwKSB7fQorCitzdGF0dXNfdCBDYW1lcmFTZXNzaW9uU3RhdHM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgU3RyaW5nMTYgaWQ7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigmaWQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGNhbWVyYSBpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCBmYWNpbmcgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmZhY2luZykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgY2FtZXJhIGZhY2luZyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50MzJfdCBuZXdDYW1lcmFTdGF0ZTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZuZXdDYW1lcmFTdGF0ZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbmV3IGNhbWVyYSBzdGF0ZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgU3RyaW5nMTYgY2xpZW50TmFtZTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZjbGllbnROYW1lKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBjbGllbnQgbmFtZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgYXBpTGV2ZWw7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmYXBpTGV2ZWwpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGFwaSBsZXZlbCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYm9vbCBpc05kazsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEJvb2woJmlzTmRrKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpc05kayBmbGFnIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQzMl90IGxhdGVuY3lNczsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZsYXRlbmN5TXMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGxhdGVuY3lNcyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50MzJfdCBzZXNzaW9uVHlwZTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzZXNzaW9uVHlwZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc2Vzc2lvbiB0eXBlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQzMl90IGludGVybmFsUmVjb25maWd1cmU7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW50ZXJuYWxSZWNvbmZpZ3VyZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW50ZXJuYWwgcmVjb25maWd1cmUgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDY0X3QgcmVxdWVzdENvdW50OworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnJlcXVlc3RDb3VudCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVxdWVzdCBjb3VudCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50NjRfdCByZXN1bHRFcnJvckNvdW50OworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnJlc3VsdEVycm9yQ291bnQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHJlc3VsdCBlcnJvciBjb3VudCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYm9vbCBkZXZpY2VFcnJvcjsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEJvb2woJmRldmljZUVycm9yKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBkZXZpY2UgZXJyb3IgZmxhZyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Q2FtZXJhU3RyZWFtU3RhdHM+IHN0cmVhbVN0YXRzOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3Rvcigmc3RyZWFtU3RhdHMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN0cmVhbSBzdGF0ZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbUNhbWVyYUlkID0gaWQ7CisgICAgbUZhY2luZyA9IGZhY2luZzsKKyAgICBtTmV3Q2FtZXJhU3RhdGUgPSBuZXdDYW1lcmFTdGF0ZTsKKyAgICBtQ2xpZW50TmFtZSA9IGNsaWVudE5hbWU7CisgICAgbUFwaUxldmVsID0gYXBpTGV2ZWw7CisgICAgbUlzTmRrID0gaXNOZGs7CisgICAgbUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKKyAgICBtU2Vzc2lvblR5cGUgPSBzZXNzaW9uVHlwZTsKKyAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSA9IGludGVybmFsUmVjb25maWd1cmU7CisgICAgbVJlcXVlc3RDb3VudCA9IHJlcXVlc3RDb3VudDsKKyAgICBtUmVzdWx0RXJyb3JDb3VudCA9IHJlc3VsdEVycm9yQ291bnQ7CisgICAgbURldmljZUVycm9yID0gZGV2aWNlRXJyb3I7CisgICAgbVN0cmVhbVN0YXRzID0gc3RkOjptb3ZlKHN0cmVhbVN0YXRzKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2Vzc2lvblN0YXRzOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYobUNhbWVyYUlkKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgY2FtZXJhIGlkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUZhY2luZykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIGNhbWVyYSBmYWNpbmchIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtTmV3Q2FtZXJhU3RhdGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBuZXcgY2FtZXJhIHN0YXRlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYobUNsaWVudE5hbWUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBjbGllbnQgbmFtZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1BcGlMZXZlbCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIGFwaSBsZXZlbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUJvb2wobUlzTmRrKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgaXNOZGsgZmxhZyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1MYXRlbmN5TXMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBsYXRlbmN5IGluIE1zISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVNlc3Npb25UeXBlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgc2Vzc2lvbiB0eXBlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUludGVybmFsUmVjb25maWd1cmUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBpbnRlcm5hbCByZWNvbmZpZ3VyZSBjb3VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDY0KG1SZXF1ZXN0Q291bnQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSByZXF1ZXN0IGNvdW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobVJlc3VsdEVycm9yQ291bnQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSByZXN1bHQgZXJyb3IgY291bnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVCb29sKG1EZXZpY2VFcnJvcikpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIGRldmljZSBlcnJvciBmbGFnISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihtU3RyZWFtU3RhdHMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gc3RhdGVzISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc21wYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAgYi9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwCmluZGV4IDY3ZmMxMTYuLmY5YjFiMzcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTEyMiw0ICsxMjMsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2Jvb2wgQ2FtZXJhVXRpbHM6OmlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoImNvbmZpZy5kaXNhYmxlX2NhbWVyYXNlcnZpY2UiLCB2YWx1ZSwgIjAiKTsKKyAgICByZXR1cm4gKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCAmJiBzdHJuY2FzZWNtcCh2YWx1ZSwgImZhbHNlIiwgNikgIT0gMCk7Cit9CisKIH0gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcCBiL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcAppbmRleCBjMDJjODFiLi5iZWYyZWEwIDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYUNsaWVudC5jcHAKKysrIGIvY2FtZXJhL0lDYW1lcmFDbGllbnQuY3BwCkBAIC0xNDIsNyArMTQyLDggQEAKICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90IG1ldGFkYXRhOwogICAgICAgICAgICAgaWYgKGRhdGEuZGF0YUF2YWlsKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgbWV0YWRhdGEubnVtYmVyX29mX2ZhY2VzID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEubnVtYmVyX29mX2ZhY2VzIDw9IDAgfHwKKyAgICAgICAgICAgICAgICAvLyBaZXJvIGZhY2VzIGlzIGEgdmFsaWQgY2FzZSwgdG8gbm90aWZ5IGNsaWVudHMgdGhhdCBubyBmYWNlcyBhcmUgbm93IHZpc2libGUKKyAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEubnVtYmVyX29mX2ZhY2VzIDwgMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEubnVtYmVyX29mX2ZhY2VzID4gKGludDMyX3QpKElOVDMyX01BWCAvIHNpemVvZihjYW1lcmFfZmFjZV90KSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUb28gbGFyZ2UgZmFjZSBjb3VudDogJWQiLCBfX0ZVTkNUSU9OX18sIG1ldGFkYXRhLm51bWJlcl9vZl9mYWNlcyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5LmNwcCBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCmluZGV4IGJkNmFmNzUuLjk3NTIzYTUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCkBAIC0xOCw3ICsxOCw2IEBACiAjZGVmaW5lIExPR19UQUcgIklDYW1lcmFSZWNvcmRpbmdQcm94eSIKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5Lmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KQEAgLTI5LDEwICsyOCw3IEBACiAKIGVudW0gewogICAgIFNUQVJUX1JFQ09SRElORyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgU1RPUF9SRUNPUkRJTkcsCi0gICAgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUUsCi0gICAgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUVfSEFORExFLAotICAgIFJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9CQVRDSCwKKyAgICBTVE9QX1JFQ09SRElORwogfTsKIAogCkBAIC00NCwxMiArNDAsMTEgQEAKICAgICB7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc3RhcnRSZWNvcmRpbmcoY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+JiBsaXN0ZW5lcikKKyAgICBzdGF0dXNfdCBzdGFydFJlY29yZGluZygpCiAgICAgewogICAgICAgICBBTE9HVigic3RhcnRSZWNvcmRpbmciKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9SRUNPUkRJTkcsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC02MSw0NiArNTYsNiBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9SRUNPUkRJTkcsIGRhdGEsICZyZXBseSk7CiAgICAgfQotCi0gICAgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlUmVjb3JkaW5nRnJhbWUiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG1lbSkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUUsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZSIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVOYXRpdmVIYW5kbGUoaGFuZGxlKTsKLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUVfSEFORExFLCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIC8vIENsb3NlIHRoZSBuYXRpdmUgaGFuZGxlIGJlY2F1c2UgY2FtZXJhIHJlY2VpdmVkIGEgZHVwIGNvcHkuCi0gICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHVpbnQzMl90IG4gPSBoYW5kbGVzLnNpemUoKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMihuKTsKLSAgICAgICAgZm9yIChhdXRvJiBoYW5kbGUgOiBoYW5kbGVzKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlTmF0aXZlSGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9CQVRDSCwgZGF0YSwgJnJlcGx5KTsKLQotICAgICAgICAvLyBDbG9zZSB0aGUgbmF0aXZlIGhhbmRsZSBiZWNhdXNlIGNhbWVyYSByZWNlaXZlZCBhIGR1cCBjb3B5LgotICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXMpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhUmVjb3JkaW5nUHJveHksICJhbmRyb2lkLmhhcmR3YXJlLklDYW1lcmFSZWNvcmRpbmdQcm94eSIpOwpAQCAtMTE0LDkgKzY5LDcgQEAKICAgICAgICAgY2FzZSBTVEFSVF9SRUNPUkRJTkc6IHsKICAgICAgICAgICAgIEFMT0dWKCJTVEFSVF9SRUNPUkRJTkciKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhUmVjb3JkaW5nUHJveHksIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiBsaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXJ0UmVjb3JkaW5nKGxpc3RlbmVyKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGFydFJlY29yZGluZygpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTVE9QX1JFQ09SRElORzogewpAQCAtMTI1LDQ2ICs3OCw2IEBACiAgICAgICAgICAgICBzdG9wUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUU6IHsKLSAgICAgICAgICAgIEFMT0dWKCJSRUxFQVNFX1JFQ09SRElOR19GUkFNRSIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFSZWNvcmRpbmdQcm94eSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKG1lbSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUVfSEFORExFOiB7Ci0gICAgICAgICAgICBBTE9HVigiUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUVfSEFORExFIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVJlY29yZGluZ1Byb3h5LCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIC8vIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZSB3aWxsIGJlIHJlc3BvbnNibGUgdG8gY2xvc2UgdGhlIG5hdGl2ZSBoYW5kbGUuCi0gICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoZGF0YS5yZWFkTmF0aXZlSGFuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9CQVRDSDogewotICAgICAgICAgICAgQUxPR1YoIlJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9CQVRDSCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFSZWNvcmRpbmdQcm94eSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgbiA9IDA7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkYXRhLnJlYWRVaW50MzIoJm4pOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgYmF0Y2ggc2l6ZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGhhbmRsZXM7Ci0gICAgICAgICAgICBoYW5kbGVzLnJlc2VydmUobik7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBkYXRhLnJlYWROYXRpdmVIYW5kbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZWNlaXZlZCBhIG51bGwgbmF0aXZlIGhhbmRsZSBhdCBoYW5kbGVzWyVkXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlcy5wdXNoX2JhY2soaGFuZGxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2ggd2lsbCBiZSByZXNwb25zYmxlIHRvIGNsb3NlIHRoZSBuYXRpdmUgaGFuZGxlLgotICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goaGFuZGxlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KQEAgLTE3Myw0ICs4NiwzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAgYi9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmZhZjhmLi4wMDAwMDAwCi0tLSBhL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIiCi0jaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBEQVRBX0NBTExCQUNLX1RJTUVTVEFNUCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9DQUxMQkFDS19USU1FU1RBTVAsCi0gICAgUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9DQUxMQkFDS19USU1FU1RBTVBfQkFUQ0gKLX07Ci0KLWNsYXNzIEJwQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjogcHVibGljIEJwSW50ZXJmYWNlPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPgotewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGltYWdlRGF0YSkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2siKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NCh0aW1lc3RhbXApOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobXNnVHlwZSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoaW1hZ2VEYXRhKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChEQVRBX0NBTExCQUNLX1RJTUVTVEFNUCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgfQotCi0gICAgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgewotICAgICAgICBBTE9HVigicmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7Ci0gICAgICAgIGRhdGEud3JpdGVOYXRpdmVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFQ09SRElOR19GUkFNRV9IQU5ETEVfQ0FMTEJBQ0tfVElNRVNUQU1QLCBkYXRhLCAmcmVwbHksCi0gICAgICAgICAgICAgICAgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotCi0gICAgICAgIC8vIFRoZSBuYXRpdmUgaGFuZGxlIGlzIGR1cHBlZCBpbiBJQ2FtZXJhQ2xpZW50IHNvIHdlIG5lZWQgdG8gZnJlZSBpdCBoZXJlLgotICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgfQotCi0gICAgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxuc2Vjc190PiYgdGltZXN0YW1wcywKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSB7Ci0gICAgICAgIEFMT0dWKCJyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2giKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgdWludDMyX3QgbiA9IHRpbWVzdGFtcHMuc2l6ZSgpOwotICAgICAgICBpZiAobiAhPSBoYW5kbGVzLnNpemUoKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBzaXplIG9mIHRpbWVzdGFtcHMoJXp1KSBhbmQgaGFuZGxlcyglenUpIG1pc21hdGNoISIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdGltZXN0YW1wcy5zaXplKCksIGhhbmRsZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlVWludDMyKG4pOwotICAgICAgICBmb3IgKGF1dG8gdHMgOiB0aW1lc3RhbXBzKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50NjQodHMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoYXV0byYgaGFuZGxlIDogaGFuZGxlcykgewotICAgICAgICAgICAgZGF0YS53cml0ZU5hdGl2ZUhhbmRsZShoYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUNPUkRJTkdfRlJBTUVfSEFORExFX0NBTExCQUNLX1RJTUVTVEFNUF9CQVRDSCwgZGF0YSwgJnJlcGx5LAotICAgICAgICAgICAgICAgIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLQotICAgICAgICAvLyBUaGUgbmF0aXZlIGhhbmRsZSBpcyBkdXBwZWQgaW4gSUNhbWVyYUNsaWVudCBzbyB3ZSBuZWVkIHRvIGZyZWUgaXQgaGVyZS4KLSAgICAgICAgZm9yIChhdXRvJiBoYW5kbGUgOiBoYW5kbGVzKSB7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKENhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIsICJhbmRyb2lkLmhhcmR3YXJlLklDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5DYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBEQVRBX0NBTExCQUNLX1RJTUVTVEFNUDogewotICAgICAgICAgICAgQUxPR1YoIkRBVEFfQ0FMTEJBQ0tfVElNRVNUQU1QIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wID0gZGF0YS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIGludDMyX3QgbXNnVHlwZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5PiBpbWFnZURhdGEgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLCBtc2dUeXBlLCBpbWFnZURhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFJFQ09SRElOR19GUkFNRV9IQU5ETEVfQ0FMTEJBQ0tfVElNRVNUQU1QOiB7Ci0gICAgICAgICAgICBBTE9HVigiUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9DQUxMQkFDS19USU1FU1RBTVAiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXA7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkYXRhLnJlYWRJbnQ2NCgmdGltZXN0YW1wKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHRpbWVzdGFtcDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBkYXRhLnJlYWROYXRpdmVIYW5kbGUoKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUmVjZWl2ZWQgYSBudWxsIG5hdGl2ZSBoYW5kbGUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgbmF0aXZlIGhhbmRsZSB3aWxsIGJlIGZyZWVkIGluCi0gICAgICAgICAgICAvLyBCcENhbWVyYVJlY29yZGluZ1Byb3h5OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUuCi0gICAgICAgICAgICByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcCwgaGFuZGxlKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBSRUNPUkRJTkdfRlJBTUVfSEFORExFX0NBTExCQUNLX1RJTUVTVEFNUF9CQVRDSDogewotICAgICAgICAgICAgQUxPR1YoIlJFQ09SRElOR19GUkFNRV9IQU5ETEVfQ0FMTEJBQ0tfVElNRVNUQU1QX0JBVENIIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IG4gPSAwOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gZGF0YS5yZWFkVWludDMyKCZuKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGJhdGNoIHNpemU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGQ6OnZlY3Rvcjxuc2Vjc190PiB0aW1lc3RhbXBzOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlczsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMucmVzZXJ2ZShuKTsKLSAgICAgICAgICAgIGhhbmRsZXMucmVzZXJ2ZShuKTsKLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBuc2Vjc190IHQ7Ci0gICAgICAgICAgICAgICAgcmVzID0gZGF0YS5yZWFkSW50NjQoJnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB0aW1lc3RhbXBbJWRdOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBzLnB1c2hfYmFjayh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IGRhdGEucmVhZE5hdGl2ZUhhbmRsZSgpOwotICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlY2VpdmVkIGEgbnVsbCBuYXRpdmUgaGFuZGxlIGF0IGhhbmRsZXNbJWRdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVzLnB1c2hfYmFjayhoYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlIG5hdGl2ZSBoYW5kbGUgd2lsbCBiZSBmcmVlZCBpbgotICAgICAgICAgICAgLy8gQnBDYW1lcmFSZWNvcmRpbmdQcm94eTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2guCi0gICAgICAgICAgICByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2godGltZXN0YW1wcywgaGFuZGxlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9jYW1lcmEvVEVTVF9NQVBQSU5HIGIvY2FtZXJhL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNlMTgzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDExIEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c0NhbWVyYVRlc3RDYXNlcyIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c0NhbWVyYVRlc3RDYXNlcyIsCisgICAgICAia2V5d29yZHMiOiBbInByaW1hcnktZGV2aWNlIl0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcCBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAppbmRleCBkNzEzZDJkLi4yNGZhOTEyIDEwMDY0NAotLS0gYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKKysrIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCkBAIC02NjAsNiArNjYwLDE2IEBACiAgICAgcmV0dXJuIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU7CiB9CiAKK2Jvb2wgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjppc1ZlbmRvckNhY2hlUHJlc2VudChtZXRhZGF0YV92ZW5kb3JfaWRfdCB2ZW5kb3JJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgaWYgKChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlLmdldCgpICE9IG51bGxwdHIpICYmCisgICAgICAgICAgICAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZS0+Z2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKS5maW5kKHZlbmRvcklkKSAhPQorICAgICAgICAgICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUtPmdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCkuZW5kKCkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGV4dGVybiAiQyIgewogCiBpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogLyp2Ki8pIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhU2Vzc2lvblN0YXRzLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYVNlc3Npb25TdGF0cy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTY3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYVNlc3Npb25TdGF0cy5haWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmU7CisKKy8qKiBAaGlkZSAqLworcGFyY2VsYWJsZSBDYW1lcmFTZXNzaW9uU3RhdHMgY3BwX2hlYWRlciAiY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oIjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAppbmRleCBhYzdhMzViLi44YWY3MDRkIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCkBAIC02OSw3ICs2OSw3IEBACiAKICAgICAvKioKICAgICAgKiBEZWZhdWx0IFVJRC9QSUQgdmFsdWVzIGZvciBub24tcHJpdmlsZWdlZCBjYWxsZXJzIG9mCi0gICAgICogY29ubmVjdCgpLCBjb25uZWN0RGV2aWNlKCksIGFuZCBjb25uZWN0TGVnYWN5KCkKKyAgICAgKiBjb25uZWN0KCkgYW5kIGNvbm5lY3REZXZpY2UoKQogICAgICAqLwogICAgIGNvbnN0IGludCBVU0VfQ0FMTElOR19VSUQgPSAtMTsKICAgICBjb25zdCBpbnQgVVNFX0NBTExJTkdfUElEID0gLTE7CkBAIC05MywyMCArOTMsNiBAQAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCk7CiAKICAgICAvKioKLSAgICAgKiBoYWxWZXJzaW9uIGNvbnN0YW50IGZvciBjb25uZWN0TGVnYWN5Ci0gICAgICovCi0gICAgY29uc3QgaW50IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9wZW4gYSBjYW1lcmEgZGV2aWNlIGluIGxlZ2FjeSBtb2RlLCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGNhbWVyYSBtb2R1bGUgSEFMLgotICAgICAqLwotICAgIElDYW1lcmEgY29ubmVjdExlZ2FjeShJQ2FtZXJhQ2xpZW50IGNsaWVudCwKLSAgICAgICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgU3RyaW5nIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkKTsKLQotICAgIC8qKgogICAgICAqIEFkZCBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBjYW1lcmEgZGV2aWNlIGFuZCBmbGFzaGxpZ2h0IHN0YXRlLgogICAgICAqCiAgICAgICogQWxzbyByZXR1cm5zIHRoZSBzZXQgb2YgY3VycmVudGx5LWtub3duIGNhbWVyYSBJRHMgYW5kIHN0YXRlIG9mIGVhY2ggZGV2aWNlLgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlUHJveHkuYWlkbAppbmRleCA3NTc1OTQ4Li5kNDI4YjRlIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlUHJveHkuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlUHJveHkuYWlkbApAQCAtMTYsMTEgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZTsKIAoraW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhU2Vzc2lvblN0YXRzOworCiAvKioKICAqIEJpbmRlciBpbnRlcmZhY2UgZm9yIHRoZSBjYW1lcmEgc2VydmljZSBwcm94eSBydW5uaW5nIGluIHN5c3RlbV9zZXJ2ZXIuCiAgKgotICogS2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZVByb3h5LmgKLSAqCiAgKiBAaGlkZQogICovCiBpbnRlcmZhY2UgSUNhbWVyYVNlcnZpY2VQcm94eQpAQCAtMzAsMzAgKzMwLDkgQEAKICAgICAgKi8KICAgICBvbmV3YXkgdm9pZCBwaW5nRm9yVXNlclVwZGF0ZSgpOwogCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGZvciBub3RpZnlDYW1lcmFTdGF0ZSBuZXdDYW1lcmFTdGF0ZQotICAgICAqLwotICAgIGNvbnN0IGludCBDQU1FUkFfU1RBVEVfT1BFTiA9IDA7Ci0gICAgY29uc3QgaW50IENBTUVSQV9TVEFURV9BQ1RJVkUgPSAxOwotICAgIGNvbnN0IGludCBDQU1FUkFfU1RBVEVfSURMRSA9IDI7Ci0gICAgY29uc3QgaW50IENBTUVSQV9TVEFURV9DTE9TRUQgPSAzOwotCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGZvciBub3RpZnlDYW1lcmFTdGF0ZSBmYWNpbmcKLSAgICAgKi8KLSAgICBjb25zdCBpbnQgQ0FNRVJBX0ZBQ0lOR19CQUNLID0gMDsKLSAgICBjb25zdCBpbnQgQ0FNRVJBX0ZBQ0lOR19GUk9OVCA9IDE7Ci0gICAgY29uc3QgaW50IENBTUVSQV9GQUNJTkdfRVhURVJOQUwgPSAyOwotCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGZvciBub3RpZnlDYW1lcmFTdGF0ZSBhcGkgbGV2ZWwKLSAgICAgKi8KLSAgICAgY29uc3QgaW50IENBTUVSQV9BUElfTEVWRUxfMSA9IDE7Ci0gICAgIGNvbnN0IGludCBDQU1FUkFfQVBJX0xFVkVMXzIgPSAyOwogCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBjYW1lcmEgZGV2aWNlLgogICAgICAqLwotICAgIG9uZXdheSB2b2lkIG5vdGlmeUNhbWVyYVN0YXRlKFN0cmluZyBjYW1lcmFJZCwgaW50IGZhY2luZywgaW50IG5ld0NhbWVyYVN0YXRlLAotICAgICAgICAgICAgU3RyaW5nIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCk7CisgICAgb25ld2F5IHZvaWQgbm90aWZ5Q2FtZXJhU3RhdGUoaW4gQ2FtZXJhU2Vzc2lvblN0YXRzIGNhbWVyYVNlc3Npb25TdGF0cyk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCmluZGV4IGIxODNjY2MuLjI4YTU3YmQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCkBAIC04Myw5ICs4MywxMSBAQAogICAgICAqIEBwYXJhbSBvcGVyYXRpbmdNb2RlIFRoZSBraW5kIG9mIHNlc3Npb24gdG8gY3JlYXRlOyBlaXRoZXIgTk9STUFMX01PREUgb3IKICAgICAgKiAgICAgQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLgogICAgICAqIEBwYXJhbSBzZXNzaW9uUGFyYW1zIFNlc3Npb24gd2lkZSBjYW1lcmEgcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyBUaGUgdGltZXN0YW1wIG9mIHNlc3Npb24gY3JlYXRpb24gc3RhcnQsIG1lYXN1cmVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcy4KICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzdHJlYW0gaWRzIHRoYXQgY2FuIGJlIHVzZWQgaW4gb2ZmbGluZSBtb2RlIHZpYSAic3dpdGNoVG9PZmZsaW5lIgogICAgICAqLwotICAgIGludFtdIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwgaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgc2Vzc2lvblBhcmFtcyk7CisgICAgaW50W10gZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlLCBpbiBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBzZXNzaW9uUGFyYW1zLCBsb25nIHN0YXJ0VGltZU1zKTsKIAogICAgIC8qKgogICAgICAgKiBDaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gaGFzIGNhbWVyYSBkZXZpY2UKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBiL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcAppbmRleCAxODQzZWM0Li5lYmMwOWQ3IDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCkBAIC05NCwxMiArOTQsMTIgQEAKICAgICAvLyBEbyBub3QgZGlzdGluZ3Vpc2ggbnVsbCBhcnJheXMgZnJvbSAwLXNpemVkIGFycmF5cy4KICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICAgLy8gUGFyY2VsLndyaXRlUGFyY2VsYWJsZUFycmF5Ci0gICAgICAgIHNpemVfdCBsZW47Ci0gICAgICAgIGNvbnN0IGNoYXIxNl90KiBjbGFzc05hbWUgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNklucGxhY2UoJmxlbik7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGNsYXNzTmFtZTsKKyAgICAgICAgcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmY2xhc3NOYW1lKTsKICAgICAgICAgQUxPR1YoIiVzOiBSZWFkIHN1cmZhY2UgY2xhc3MgPSAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgY2xhc3NOYW1lICE9IE5VTEwgPyBTdHJpbmc4KGNsYXNzTmFtZSkuc3RyaW5nKCkgOiAiPG51bGw+Iik7CisgICAgICAgICAgICAgIGNsYXNzTmFtZS52YWx1ZV9vcigiPG51bGw+IikuY19zdHIoKSk7CiAKLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChjbGFzc05hbWUgPT0gc3RkOjpudWxsb3B0KSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggZGM3Zjg4YS4uNWMzZTNiMCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icApAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLApAQCAtNDgsNiArNDgsNiBAQAogICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCiAKICAgICB2aW50Zl9mcmFnbWVudHM6IFsKLSAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4xLnhtbCIsCisgICAgICAgICJtYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMi54bWwiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4xLnhtbCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTE1YjM1Li4wMDAwMDAwCi0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KLSAgICA8aGFsPgotICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgotICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgPGludGVyZmFjZT4KLSAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgotICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgotICAgICAgICA8L2ludGVyZmFjZT4KLSAgICA8L2hhbD4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4yLnhtbCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWZjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4yLnhtbApAQCAtMCwwICsxLDExIEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJmcmFtZXdvcmsiPgorICAgIDxoYWw+CisgICAgICAgIDxuYW1lPmFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2U8L25hbWU+CisgICAgICAgIDx0cmFuc3BvcnQ+aHdiaW5kZXI8L3RyYW5zcG9ydD4KKyAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICA8aW50ZXJmYWNlPgorICAgICAgICAgICAgPG5hbWU+SUNhbWVyYVNlcnZpY2U8L25hbWU+CisgICAgICAgICAgICA8aW5zdGFuY2U+ZGVmYXVsdDwvaW5zdGFuY2U+CisgICAgICAgIDwvaW50ZXJmYWNlPgorICAgIDwvaGFsPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAppbmRleCAyY2RiNjE3Li41NTc5MTgzIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oPgotI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGNhbWVyYS9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhQ2xpZW50Lmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUJhc2UuaD4KQEAgLTg0LDEwICs4Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCk7CiAKLSAgICBzdGF0aWMgIHN0YXR1c190ICBjb25uZWN0TGVnYWN5KGludCBjYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsIHNwPENhbWVyYT4mIGNhbWVyYSk7Ci0KICAgICAgICAgICAgIHZpcnR1YWwgICAgIH5DYW1lcmEoKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgcmVjb25uZWN0KCk7CkBAIC0xNTQsNyArMTQ5LDYgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFZpZGVvVGFyZ2V0KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcik7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPENhbWVyYUxpc3RlbmVyPiYgbGlzdGVuZXIpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0UmVjb3JkaW5nUHJveHlMaXN0ZW5lcihjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKIAogICAgICAgICAgICAgLy8gQ29uZmlndXJlIHByZXZpZXcgY2FsbGJhY2tzIHRvIGFwcC4gT25seSBvbmUgb2YgdGhlIG9sZGVyCiAgICAgICAgICAgICAvLyBjYWxsYmFja3Mgb3IgdGhlIGNhbGxiYWNrIHN1cmZhY2UgY2FuIGJlIGFjdGl2ZSBhdCB0aGUgc2FtZSB0aW1lOwpAQCAtMTg3LDEyICsxODEsOCBAQAogICAgICAgICBleHBsaWNpdCBSZWNvcmRpbmdQcm94eShjb25zdCBzcDxDYW1lcmE+JiBjYW1lcmEpOwogCiAgICAgICAgIC8vIElDYW1lcmFSZWNvcmRpbmdQcm94eSBpbnRlcmZhY2UKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29yZGluZyhjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29yZGluZygpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgc3RvcFJlY29yZGluZygpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKTsKIAogICAgIHByaXZhdGU6CiAgICAgICAgIHNwPENhbWVyYT4gICAgICAgICBtQ2FtZXJhOwpAQCAtMjAzLDggKzE5Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmEoY29uc3QgQ2FtZXJhJik7CiAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmEmIG9wZXJhdG9yPShjb25zdCBDYW1lcmEpOwogCi0gICAgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+ICBtUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjsKLQogICAgIGZyaWVuZCBjbGFzcyAgICAgICAgQ2FtZXJhQmFzZTsKIH07CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgKaW5kZXggOWQxYjVjNy4uYzU2ZWU2ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgKQEAgLTEyOCw2ICsxMjgsMTEgQEAKICAgICBib29sIGlzRW1wdHkoKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWxsb2NhdGVkIGNhbWVyYSBtZXRhZGF0YSBidWZmZXIgc2l6ZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICBzaXplX3QgYnVmZmVyU2l6ZSgpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogU29ydCBtZXRhZGF0YSBidWZmZXIgZm9yIGZhc3RlciBmaW5kCiAgICAgICovCiAgICAgc3RhdHVzX3Qgc29ydCgpOwpAQCAtMjM3LDYgKzI0MiwxMSBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRUYWdGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgY29uc3QgVmVuZG9yVGFnRGVzY3JpcHRvciogdlRhZ3MsIHVpbnQzMl90ICp0YWcpOwogCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHZlbmRvciB0YWcgaWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWV0YWRhdGEuCisgICAgICovCisgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2V0VmVuZG9ySWQoKTsKKwogICBwcml2YXRlOgogICAgIGNhbWVyYV9tZXRhZGF0YV90ICptQnVmZmVyOwogICAgIG11dGFibGUgYm9vbCAgICAgICBtTG9ja2VkOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTc1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX1NFUlZJQ0VfU0VTU0lPTl9TVEFUU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX1NFUlZJQ0VfU0VTU0lPTl9TVEFUU19ICisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworCisvKioKKyAqIENhbWVyYSBzdHJlYW0gaW5mbyBhbmQgc3RhdGlzdGljcworICovCitjbGFzcyBDYW1lcmFTdHJlYW1TdGF0cyA6IHB1YmxpYyBhbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworICAgIGludCBtRm9ybWF0OworICAgIGludCBtRGF0YVNwYWNlOworICAgIGludDY0X3QgbVVzYWdlOworCisgICAgLy8gVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgYnVmZmVycworICAgIGludDY0X3QgbVJlcXVlc3RDb3VudDsKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGJ1ZmZlciBlcnJvcnMKKyAgICBpbnQ2NF90IG1FcnJvckNvdW50OworCisgICAgLy8gVGhlIGNhcHR1cmUgbGF0ZW5jeSBvZiAxc3QgcmVxdWVzdCBmb3IgdGhpcyBzdHJlYW0KKyAgICBpbnQzMl90IG1TdGFydExhdGVuY3lNczsKKworICAgIC8vIEJ1ZmZlciBjb3VudCBpbmZvCisgICAgaW50IG1NYXhIYWxCdWZmZXJzOworICAgIGludCBtTWF4QXBwQnVmZmVyczsKKworICAgIENhbWVyYVN0cmVhbVN0YXRzKCkgOgorICAgICAgICAgICAgbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtRm9ybWF0KDApLCBtRGF0YVNwYWNlKDApLCBtVXNhZ2UoMCksCisgICAgICAgICAgICBtUmVxdWVzdENvdW50KDApLCBtRXJyb3JDb3VudCgwKSwgbVN0YXJ0TGF0ZW5jeU1zKDApLAorICAgICAgICAgICAgbU1heEhhbEJ1ZmZlcnMoMCksIG1NYXhBcHBCdWZmZXJzKDApIHt9CisgICAgQ2FtZXJhU3RyZWFtU3RhdHMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgZGF0YVNwYWNlLCBpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgaW50IG1heEhhbEJ1ZmZlcnMsIGludCBtYXhBcHBCdWZmZXJzKQorICAgICAgICAgICAgOiBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Gb3JtYXQoZm9ybWF0KSwgbURhdGFTcGFjZShkYXRhU3BhY2UpLAorICAgICAgICAgICAgICBtVXNhZ2UodXNhZ2UpLCBtUmVxdWVzdENvdW50KDApLCBtRXJyb3JDb3VudCgwKSwgbVN0YXJ0TGF0ZW5jeU1zKDApLAorICAgICAgICAgICAgICBtTWF4SGFsQnVmZmVycyhtYXhIYWxCdWZmZXJzKSwgbU1heEFwcEJ1ZmZlcnMobWF4QXBwQnVmZmVycykge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvKioKKyAqIENhbWVyYSBzZXNzaW9uIHN0YXRpc3RpY3MKKyAqCisgKiBUaGlzIGluY2x1ZGVzIHNlc3Npb24gd2lkZSBpbmZvIGFuZCBzdHJlYW0gc3RhdGlzdGljcy4KKyAqLworY2xhc3MgQ2FtZXJhU2Vzc2lvblN0YXRzIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFZhbHVlcyBmb3Igbm90aWZ5Q2FtZXJhU3RhdGUgbmV3Q2FtZXJhU3RhdGUKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IENBTUVSQV9TVEFURV9PUEVOOworICAgIHN0YXRpYyBjb25zdCBpbnQgQ0FNRVJBX1NUQVRFX0FDVElWRTsKKyAgICBzdGF0aWMgY29uc3QgaW50IENBTUVSQV9TVEFURV9JRExFOworICAgIHN0YXRpYyBjb25zdCBpbnQgQ0FNRVJBX1NUQVRFX0NMT1NFRDsKKworICAgIC8qKgorICAgICAqIFZhbHVlcyBmb3Igbm90aWZ5Q2FtZXJhU3RhdGUgZmFjaW5nCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBDQU1FUkFfRkFDSU5HX0JBQ0s7CisgICAgc3RhdGljIGNvbnN0IGludCBDQU1FUkFfRkFDSU5HX0ZST05UOworICAgIHN0YXRpYyBjb25zdCBpbnQgQ0FNRVJBX0ZBQ0lOR19FWFRFUk5BTDsKKworICAgIC8qKgorICAgICAqIFZhbHVlcyBmb3Igbm90aWZ5Q2FtZXJhU3RhdGUgYXBpIGxldmVsCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBDQU1FUkFfQVBJX0xFVkVMXzE7CisgICAgc3RhdGljIGNvbnN0IGludCBDQU1FUkFfQVBJX0xFVkVMXzI7CisKKyAgICBTdHJpbmcxNiBtQ2FtZXJhSWQ7CisgICAgaW50IG1GYWNpbmc7CisgICAgaW50IG1OZXdDYW1lcmFTdGF0ZTsKKyAgICBTdHJpbmcxNiBtQ2xpZW50TmFtZTsKKyAgICBpbnQgbUFwaUxldmVsOworICAgIGJvb2wgbUlzTmRrOworICAgIC8vIGxhdGVuY3kgaW4gbXMgZm9yIGNhbWVyYSBvcGVuLCBjbG9zZSwgb3Igc2Vzc2lvbiBjcmVhdGlvbi4KKyAgICBpbnQgbUxhdGVuY3lNczsKKworICAgIC8vIFNlc3Npb24gaW5mbyBhbmQgc3RhdGlzdGljcworICAgIGludCBtU2Vzc2lvblR5cGU7CisgICAgaW50IG1JbnRlcm5hbFJlY29uZmlndXJlOworICAgIC8vIFRoZSBudW1iZXIgb2YgY2FwdHVyZSByZXF1ZXN0cworICAgIGludDY0X3QgbVJlcXVlc3RDb3VudDsKKyAgICAvLyBUaGUgbnVtYmVyIG9mIHJlc3VsdCBlcnJvcgorICAgIGludDY0X3QgbVJlc3VsdEVycm9yQ291bnQ7CisgICAgLy8gV2hldGhlciB0aGUgZGV2aWNlIHJ1bnMgaW50byBhbiBlcnJvciBzdGF0ZQorICAgIGJvb2wgbURldmljZUVycm9yOworICAgIHN0ZDo6dmVjdG9yPENhbWVyYVN0cmVhbVN0YXRzPiBtU3RyZWFtU3RhdHM7CisKKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICBDYW1lcmFTZXNzaW9uU3RhdHMoKTsKKyAgICBDYW1lcmFTZXNzaW9uU3RhdHMoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgbmV3Q2FtZXJhU3RhdGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwgaW50IGFwaUxldmVsLCBib29sIGlzTmRrLCBpbnQzMl90IGxhdGVuY3lNcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkFfU0VSVklDRV9TRVNTSU9OX1NUQVRTX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVV0aWxzLmgKaW5kZXggZjU5NmY4MC4uYTM5N2NjZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVV0aWxzLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVV0aWxzLmgKQEAgLTQ3LDYgKzQ3LDExIEBACiAgICAgICAgICAqLwogICAgICAgICBzdGF0aWMgYm9vbCBpc05hdGl2ZUhhbmRsZU1ldGFkYXRhKGNvbnN0IHNwPElNZW1vcnk+JiBpbWFnZURhdGEpOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayBpZiBjYW1lcmEgc2VydmljZSBpcyBkaXNhYmxlZCBvbiB0aGlzIGRldmljZQorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGJvb2wgaXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIENhbWVyYVV0aWxzKCk7CiB9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oCmluZGV4IDAyYWYyZjMuLjQzMDZkYzEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5LmgKQEAgLTI0LDEzICsyNCwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOwotY2xhc3MgSU1lbW9yeTsKIGNsYXNzIFBhcmNlbDsKIAogLyoKLSAqIFRoZSBwdXJwb3NlIG9mIElDYW1lcmFSZWNvcmRpbmdQcm94eSBhbmQgSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIgaXMgdG8KLSAqIGFsbG93IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgY2FtZXJhIGR1cmluZyByZWNvcmRpbmcuCisgKiBUaGUgcHVycG9zZSBvZiBJQ2FtZXJhUmVjb3JkaW5nUHJveHkgaXMgdG8KKyAqIGFsbG93IGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlIGNhbWVyYSBkdXJpbmcgcmVjb3JkaW5nIHdpdGggdGhlIG9sZCBjYW1lcmEgQVBJLgogICoKICAqIENhbWVyYSBzZXJ2aWNlIGFsbG93cyBvbmx5IG9uZSBjbGllbnQgYXQgYSB0aW1lLiBTaW5jZSBjYW1jb3JkZXIgYXBwbGljYXRpb24KICAqIG5lZWRzIHRvIG93biB0aGUgY2FtZXJhIHRvIGRvIHRoaW5ncyBsaWtlIHpvb20sIHRoZSBtZWRpYSByZWNvcmRlciBjYW5ub3QKQEAgLTQyLDM1ICs0MCwyOSBAQAogICogSUNhbWVyYVJlY29yZGluZ1Byb3h5CiAgKiAgIHN0YXJ0UmVjb3JkaW5nKCkKICAqICAgc3RvcFJlY29yZGluZygpCi0gKiAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpCiAgKgotICogSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIKLSAqICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkKLQogICogVGhlIGNhbWNvcmRlciBhcHAgb3BlbnMgdGhlIGNhbWVyYSBhbmQgc3RhcnRzIHRoZSBwcmV2aWV3LiBUaGUgYXBwIHBhc3NlcwogICogSUNhbWVyYSBhbmQgSUNhbWVyYVJlY29yZGluZ1Byb3h5IHRvIHRoZSBtZWRpYSByZWNvcmRlciBieQogICogTWVkaWFSZWNvcmRlcjo6c2V0Q2FtZXJhKCkuIFRoZSByZWNvcmRlciB1c2VzIElDYW1lcmEgdG8gc2V0dXAgdGhlIGNhbWVyYSBpbgogICogTWVkaWFSZWNvcmRlcjo6c3RhcnQoKS4gQWZ0ZXIgc2V0dXAsIHRoZSByZWNvcmRlciBkaXNjb25uZWN0cyBmcm9tIGNhbWVyYQotICogc2VydmljZS4gVGhlIHJlY29yZGVyIGNhbGxzIElDYW1lcmFSZWNvcmRpbmdQcm94eTo6c3RhcnRSZWNvcmRpbmcoKSBhbmQKLSAqIHBhc3NlcyBhIElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyIHRvIHRoZSBhcHAuIFRoZSBhcHAgY29ubmVjdHMgYmFjayB0bwotICogY2FtZXJhIHNlcnZpY2UgYW5kIHN0YXJ0cyB0aGUgcmVjb3JkaW5nLiBUaGUgYXBwIG93bnMgdGhlIGNhbWVyYSBhbmQgY2FuIGRvCi0gKiB0aGluZ3MgbGlrZSB6b29tLiBUaGUgbWVkaWEgcmVjb3JkZXIgcmVjZWl2ZXMgdGhlIHZpZGVvIGZyYW1lcyBmcm9tIHRoZQotICogbGlzdGVuZXIgYW5kIHJlbGVhc2VzIHRoZW0gYnkgSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUuCi0gKiBUaGUgcmVjb3JkZXIgY2FsbHMgSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpzdG9wUmVjb3JkaW5nKCkgdG8gc3RvcCB0aGUKLSAqIHJlY29yZGluZy4KKyAqIHNlcnZpY2UuIFRoZSByZWNvcmRlciBjYWxscyBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OnN0YXJ0UmVjb3JkaW5nKCkgYW5kIFRoZQorICogYXBwIG93bnMgdGhlIGNhbWVyYSBhbmQgY2FuIGRvIHRoaW5ncyBsaWtlIHpvb20uIFRoZSBtZWRpYSByZWNvcmRlciByZWNlaXZlcworICogdGhlIHZpZGVvIGZyYW1lcyB2aWEgYSBidWZmZXIgcXVldWUuICBUaGUgcmVjb3JkZXIgY2FsbHMKKyAqIElDYW1lcmFSZWNvcmRpbmdQcm94eTo6c3RvcFJlY29yZGluZygpIHRvIHN0b3AgdGhlIHJlY29yZGluZy4KICAqCiAgKiBUaGUgY2FsbCBzZXF1ZW5jZXMgYXJlIGFzIGZvbGxvd3M6CiAgKiAxLiBUaGUgYXBwOiBDYW1lcmEudW5sb2NrKCkuCiAgKiAyLiBUaGUgYXBwOiBNZWRpYVJlY29yZGVyLnNldENhbWVyYSgpLgogICogMy4gU3RhcnQgcmVjb3JkaW5nCiAgKiAgICAoMSkgVGhlIGFwcDogTWVkaWFSZWNvcmRlci5zdGFydCgpLgotICogICAgKDIpIFRoZSByZWNvcmRlcjogSUNhbWVyYS51bmxvY2soKSBhbmQgSUNhbWVyYS5kaXNjb25uZWN0KCkuCi0gKiAgICAoMykgVGhlIHJlY29yZGVyOiBJQ2FtZXJhUmVjb3JkaW5nUHJveHkuc3RhcnRSZWNvcmRpbmcoKS4KLSAqICAgICg0KSBUaGUgYXBwOiBJQ2FtZXJhLnJlY29ubmVjdCgpLgotICogICAgKDUpIFRoZSBhcHA6IElDYW1lcmEuc3RhcnRSZWNvcmRpbmcoKS4KKyAqICAgICgyKSBUaGUgcmVjb3JkZXI6IElDYW1lcmEuc2V0VmlkZW9UYXJnZXQoYnVmZmVyIHF1ZXVlKS4KKyAqICAgICgzKSBUaGUgcmVjb3JkZXI6IElDYW1lcmEudW5sb2NrKCkgYW5kIElDYW1lcmEuZGlzY29ubmVjdCgpLgorICogICAgKDQpIFRoZSByZWNvcmRlcjogSUNhbWVyYVJlY29yZGluZ1Byb3h5LnN0YXJ0UmVjb3JkaW5nKCkuCisgKiAgICAoNSkgVGhlIGFwcDogSUNhbWVyYS5yZWNvbm5lY3QoKS4KKyAqICAgICg2KSBUaGUgYXBwOiBJQ2FtZXJhLnN0YXJ0UmVjb3JkaW5nKCkuCiAgKiA0LiBEdXJpbmcgcmVjb3JkaW5nCi0gKiAgICAoMSkgVGhlIHJlY29yZGVyOiByZWNlaXZlIGZyYW1lcyBmcm9tIElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmRhdGFDYWxsYmFja1RpbWVzdGFtcCgpCi0gKiAgICAoMikgVGhlIHJlY29yZGVyOiByZWxlYXNlIGZyYW1lcyBieSBJQ2FtZXJhUmVjb3JkaW5nUHJveHkucmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkuCisgKiAgICAoMSkgVGhlIHJlY29yZGVyOiByZWNlaXZlIGZyYW1lcyB2aWEgYSBidWZmZXIgcXVldWUKKyAqICAgICgyKSBUaGUgcmVjb3JkZXI6IHJlbGVhc2UgZnJhbWVzIHZpYSBhIGJ1ZmZlciBxdWV1ZQogICogNS4gU3RvcCByZWNvcmRpbmcKICAqICAgICgxKSBUaGUgYXBwOiBNZWRpYVJlY29yZGVyLnN0b3AoKQogICogICAgKDIpIFRoZSByZWNvcmRlcjogSUNhbWVyYVJlY29yZGluZ1Byb3h5LnN0b3BSZWNvcmRpbmcoKS4KQEAgLTgyLDEyICs3NCw4IEBACiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShDYW1lcmFSZWNvcmRpbmdQcm94eSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydFJlY29yZGluZyhjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4mIGxpc3RlbmVyKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRSZWNvcmRpbmcoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcFJlY29yZGluZygpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMDNjNTYuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lDQU1FUkFfUkVDT1JESU5HX1BST1hZX0xJU1RFTkVSX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JQ0FNRVJBX1JFQ09SRElOR19QUk9YWV9MSVNURU5FUl9ICi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBQYXJjZWw7Ci1jbGFzcyBJTWVtb3J5OwotCi1jbGFzcyBJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIpOwotCi0gICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGEpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bnNlY3NfdD4mIHRpbWVzdGFtcHMsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiYgaGFuZGxlcykgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI6IHB1YmxpYyBCbkludGVyZmFjZTxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKaW5kZXggYjJmYmYzYS4uYjM0NDBkNSAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCkBAIC0yNDksNiArMjQ5LDEyIEBACiAgICAgICovCiAgICAgc3RhdGljIHZvaWQgY2xlYXJHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOwogCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgZ2l2ZW4gdmVuZG9yIGlkIGlzIHByZXNlbnQgaW4gdGhlIHZlbmRvciB0YWcgY2FjaGVzLCByZXR1cm4KKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljIGJvb2wgaXNWZW5kb3JDYWNoZVByZXNlbnQobWV0YWRhdGFfdmVuZG9yX2lkX3QgdmVuZG9ySWQpOworCiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL0FuZHJvaWQuYnAgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKaW5kZXggN2JhODJjMS4uM2NmOTRkMCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9uZGsvQW5kcm9pZC5icApAQCAtMTIxLDkgKzEyMSwxMSBAQAogICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMSIsCiAgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKICAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKICAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4xIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4yIiwKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wLWhlbHBlciIsCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKaW5kZXggYzE1YzVhNS4uMDhjODhjZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMTg2LDYgKzE4Niw3IEBACiAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIG5zZWNzX3Qgc3RhcnRUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CiAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBjdXJyZW50U2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CkBAIC0xOTksNyArMjAwLDcgQEAKICAgICB9CiAKICAgICAvLyBDcmVhdGUgbmV3IHNlc3Npb24KLSAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzKTsKKyAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzLCBzdGFydFRpbWVOcyk7CiAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbi4gY2Fubm90IGNvbmZpZ3VyZSBzdHJlYW1zIik7CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC00NTAsNyArNDUxLDExIEBACiAgICAgfQogCiAgICAgLy8gTm8gbmV3IHNlc3Npb24sIHVuY29uZmlndXJlIG5vdwotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG51bGxwdHIsIG51bGxwdHIpOworICAgIC8vIE5vdGU6IFRoZSB1bmNvbmZpZ3VyYXRpb24gb2Ygc2Vzc2lvbiB3b24ndCBiZSBhY2NvdW50ZWQgZm9yIHNlc3Npb24KKyAgICAvLyBsYXRlbmN5IGJlY2F1c2UgYSBzdHJlYW0gY29uZmlndXJhdGlvbiB3aXRoIDAgc3RyZWFtcyB3b24ndCBldmVyIGJlY29tZQorICAgIC8vIGFjdGl2ZS4KKyAgICBuc2Vjc190IHN0YXJ0VGltZU5zID0gc3lzdGVtVGltZSgpOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG51bGxwdHIsIG51bGxwdHIsIHN0YXJ0VGltZU5zKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlIHN0cmVhbSBmYWlsZWQuIERldmljZSBtaWdodCBzdGlsbCBiZSBjb25maWd1cmVkISByZXQgJWQiLCByZXQpOwogICAgIH0KQEAgLTYwOSw3ICs2MTQsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIENhbWVyYURldmljZTo6Y29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCi0gICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpIHsKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywgbnNlY3NfdCBzdGFydFRpbWVOcykgewogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciBlbXB0eU91dHB1dDsKICAgICBpZiAob3V0cHV0cyA9PSBudWxscHRyKSB7CiAgICAgICAgIG91dHB1dHMgPSAmZW1wdHlPdXRwdXQ7CkBAIC03MTEsNyArNzE2LDggQEAKICAgICAgICAgcGFyYW1zLmFwcGVuZChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpKTsKICAgICB9CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBvZmZsaW5lU3RyZWFtSWRzOwotICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmVuZENvbmZpZ3VyZSgvKmlzQ29uc3RyYWluZWRIaWdoU3BlZWQqLyBmYWxzZSwgcGFyYW1zLCAmb2ZmbGluZVN0cmVhbUlkcyk7CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+ZW5kQ29uZmlndXJlKC8qaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCovIGZhbHNlLCBwYXJhbXMsCisgICAgICAgICAgICBuczJtcyhzdGFydFRpbWVOcyksICZvZmZsaW5lU3RyZWFtSWRzKTsKICAgICBpZiAocmVtb3RlUmV0LnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpID09IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBjYW5ubm90IHN1cHBvcnQgYXBwIG91dHB1dCBjb25maWd1cmF0aW9uOiAlcyIsIGdldElkKCksCiAgICAgICAgICAgICAgICAgcmVtb3RlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IGQ5Mzc4NjUuLjEyNWU2ZTMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgdm9pZCBub3RpZnlTZXNzaW9uRW5kT2ZMaWZlTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbik7CiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCi0gICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpOworICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLCBuc2Vjc190IHN0YXJ0VGltZU5zKTsKIAogICAgIC8vIElucHV0IG1lc3NhZ2Ugd2lsbCBiZSBwb3N0ZWQgYW5kIGNsZWFyZWQgYWZ0ZXIgdGhpcyByZXR1cm5zCiAgICAgdm9pZCBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggYjU4ZWJlMi4uNzNjYWJiZiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKQEAgLTcwLDEyICs3MSw2IEBACiAgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKIH0KIAotc3RhdGljIGJvb2wgaXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSB7Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgiY29uZmlnLmRpc2FibGVfY2FtZXJhc2VydmljZSIsIHZhbHVlLCAiMCIpOwotICAgIHJldHVybiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAyKSAhPSAwICYmIHN0cm5jYXNlY21wKHZhbHVlLCAiZmFsc2UiLCA2KSAhPSAwKTsKLX0KLQogc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcmV0dXJuIGdldENhbWVyYVNlcnZpY2VMb2NrZWQoKTsKQEAgLTgzLDcgKzc4LDcgQEAKIAogc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlTG9ja2VkKCkgewogICAgIGlmIChtQ2FtZXJhU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChpc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpKSB7CisgICAgICAgIGlmIChDYW1lcmFVdGlsczo6aXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG1DYW1lcmFTZXJ2aWNlOwogICAgICAgICB9CiAKQEAgLTc0Myw3ICs3MzgsNyBAQAogICAgIC8vIE5vIHdheSB0byBnZXQgcGFja2FnZSBuYW1lIGZyb20gbmF0aXZlLgogICAgIC8vIFNlbmQgYSB6ZXJvIGxlbmd0aCBwYWNrYWdlIG5hbWUgYW5kIGxldCBjYW1lcmEgc2VydmljZSBmaWd1cmUgaXQgb3V0IGZyb20gVUlECiAgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IGNzLT5jb25uZWN0RGV2aWNlKAotICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZCksIFN0cmluZzE2KCIiKSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLAorICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZCksIFN0cmluZzE2KCIiKSwge30sCiAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOwogCiAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAppbmRleCBiZmE2MGQ5Li44OTU1MTRlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcApAQCAtNDI2LDYgKzQyNiw3IEBACiAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKICAgICAgICAgICAgIGludCByZXQgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJhd01ldGFkYXRhLCBpLCAmZW50cnkpOwogICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbURhdGEtPnVubG9jayhyYXdNZXRhZGF0YSk7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBlcnJvciByZWFkaW5nIG1ldGFkYXRhIGluZGV4ICV6dSIsIF9fRlVOQ1RJT05fXywgaSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KQEAgLTUyNyw2ICs1MjgsNyBAQAogICAgICAgICBjYXNlIEFDQU1FUkFfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERToKICAgICAgICAgY2FzZSBBQ0FNRVJBX05PSVNFX1JFRFVDVElPTl9NT0RFOgogICAgICAgICBjYXNlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OOgorICAgICAgICBjYXNlIEFDQU1FUkFfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUDoKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NFTlNPUl9FWFBPU1VSRV9USU1FOgogICAgICAgICBjYXNlIEFDQU1FUkFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OOgogICAgICAgICBjYXNlIEFDQU1FUkFfU0VOU09SX1NFTlNJVElWSVRZOgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDA3MmJiMDIuLmE4NDBiZDEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKQEAgLTM2LDYgKzM2LDcgQEAKICNpZm5kZWYgX05ES19DQU1FUkFfTUVUQURBVEFfSAogI2RlZmluZSBfTkRLX0NBTUVSQV9NRVRBREFUQV9ICiAKKyNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCmluZGV4IDEzNTRmY2UuLjUwMDZjZDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaApAQCAtMTk1Nyw3ICsxOTU3LDEwIEBACiAgICAgICogZXhwbGljaXRseSBzZXQgQUNBTUVSQV9DT05UUk9MX1pPT01fUkFUSU8sIGl0cyB2YWx1ZSBkZWZhdWx0cyB0byAxLjAuPC9wPgogICAgICAqIDxwPk9uZSBsaW1pdGF0aW9uIG9mIGNvbnRyb2xsaW5nIHpvb20gdXNpbmcgem9vbVJhdGlvIGlzIHRoYXQgdGhlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OCiAgICAgICogbXVzdCBvbmx5IGJlIHVzZWQgZm9yIGxldHRlcmJveGluZyBvciBwaWxsYXJib3hpbmcgb2YgdGhlIHNlbnNvciBhY3RpdmUgYXJyYXksIGFuZCBubwotICAgICAqIEZSRUVGT1JNIGNyb3BwaW5nIGNhbiBiZSB1c2VkIHdpdGggQUNBTUVSQV9DT05UUk9MX1pPT01fUkFUSU8gb3RoZXIgdGhhbiAxLjAuPC9wPgorICAgICAqIEZSRUVGT1JNIGNyb3BwaW5nIGNhbiBiZSB1c2VkIHdpdGggQUNBTUVSQV9DT05UUk9MX1pPT01fUkFUSU8gb3RoZXIgdGhhbiAxLjAuIElmCisgICAgICogQUNBTUVSQV9DT05UUk9MX1pPT01fUkFUSU8gaXMgbm90IDEuMCwgYW5kIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIGlzIHNldCB0byBiZQorICAgICAqIHdpbmRvd2JveGluZywgdGhlIGNhbWVyYSBmcmFtZXdvcmsgd2lsbCBvdmVycmlkZSB0aGUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04gdG8gYmUKKyAgICAgKiB0aGUgYWN0aXZlIGFycmF5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1JFR0lPTlMKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPCkBAIC0zNjUxLDcgKzM2NTQsOSBAQAogICAgICAqIDwvb2w+CiAgICAgICogPC9saT4KICAgICAgKiA8bGk+U2V0dGluZyBBQ0FNRVJBX0NPTlRST0xfWk9PTV9SQVRJTyB0byB2YWx1ZXMgZGlmZmVyZW50IHRoYW4gMS4wIGFuZAotICAgICAqIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIHRvIGJlIHdpbmRvd2JveGluZyBhdCB0aGUgc2FtZSB0aW1lIGlzIHVuZGVmaW5lZCBiZWhhdmlvci48L2xpPgorICAgICAqIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIHRvIGJlIHdpbmRvd2JveGluZyBhdCB0aGUgc2FtZSB0aW1lIGFyZSBub3Qgc3VwcG9ydGVkLiBJbiB0aGlzCisgICAgICogY2FzZSwgdGhlIGNhbWVyYSBmcmFtZXdvcmsgd2lsbCBvdmVycmlkZSB0aGUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04gdG8gYmUgdGhlIGFjdGl2ZQorICAgICAqIGFycmF5LjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5MRUdBQ1kgY2FwYWJpbGl0eSBkZXZpY2VzIHdpbGwgb25seSBzdXBwb3J0IENFTlRFUl9PTkxZIGNyb3BwaW5nLjwvcD4KICAgICAgKgpAQCAtMzczNiw2ICszNzQxLDEwOCBAQAogICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9JTlBVVF9PVVRQVVRfRk9STUFUU19NQVAgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgogICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNSwKKyAgICAvKioKKyAgICAgKiA8cD5MaXN0IG9mIHJvdGF0ZS1hbmQtY3JvcCBtb2RlcyBmb3IgQUNBTUVSQV9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGNhbWVyYSBkZXZpY2UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1AKKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGVbbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBlbnRyeSBsaXN0cyB0aGUgdmFsaWQgbW9kZXMgZm9yIEFDQU1FUkFfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUCBmb3IgdGhpcyBjYW1lcmEgZGV2aWNlLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyB3aXRoIEFQSSBsZXZlbCAzMCwgYWxsIGRldmljZXMgd2lsbCBsaXN0IGF0IGxlYXN0IDxjb2RlPlJPVEFURV9BTkRfQ1JPUF9OT05FPC9jb2RlPi4KKyAgICAgKiBEZXZpY2VzIHdpdGggc3VwcG9ydCBmb3Igcm90YXRlLWFuZC1jcm9wIHdpbGwgYWRkaXRpb25hbGx5IGxpc3QgYXQgbGVhc3QKKyAgICAgKiA8Y29kZT5ST1RBVEVfQU5EX0NST1BfQVVUTzwvY29kZT4gYW5kIDxjb2RlPlJPVEFURV9BTkRfQ1JPUF85MDwvY29kZT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1AKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUk9UQVRFX0FORF9DUk9QX01PREVTID0gICAgICAgICAgICAvLyBieXRlW25dCisgICAgICAgICAgICBBQ0FNRVJBX1NDQUxFUl9TVEFSVCArIDE2LAorICAgIC8qKgorICAgICAqIDxwPldoZXRoZXIgYSByb3RhdGlvbi1hbmQtY3JvcCBvcGVyYXRpb24gaXMgYXBwbGllZCB0byBwcm9jZXNzZWQKKyAgICAgKiBvdXRwdXRzIGZyb20gdGhlIGNhbWVyYS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgY2FsbGJhY2tzPC9saT4KKyAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBjb250cm9sIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBoZWxwIGNhbWVyYSBhcHBsaWNhdGlvbnMgd2l0aCBubyBzdXBwb3J0IGZvcgorICAgICAqIG11bHRpLXdpbmRvdyBtb2RlcyB0byB3b3JrIGNvcnJlY3RseSBvbiBkZXZpY2VzIHdoZXJlIG11bHRpLXdpbmRvdyBzY2VuYXJpb3MgYXJlCisgICAgICogdW5hdm9pZGFibGUsIHN1Y2ggYXMgZm9sZGFibGVzIG9yIG90aGVyIGRldmljZXMgd2l0aCB2YXJpYWJsZSBkaXNwbGF5IGdlb21ldHJ5IG9yIG1vcmUKKyAgICAgKiBmcmVlLWZvcm0gd2luZG93IHBsYWNlbWVudCAoc3VjaCBhcyBsYXB0b3BzLCB3aGljaCBvZnRlbiBwbGFjZSBwb3J0cmFpdC1vcmllbnRhdGlvbiBhcHBzCisgICAgICogaW4gbGFuZHNjYXBlIHdpdGggcGlsbGFyYm94aW5nKS48L3A+CisgICAgICogPHA+SWYgc3VwcG9ydGVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5ST1RBVEVfQU5EX0NST1BfQVVUTzwvY29kZT4sIHdoaWNoIGFsbG93cyB0aGUgY2FtZXJhIEFQSQorICAgICAqIHRvIGVuYWJsZSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBzdXBwb3J0IGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCByZXNpemluZworICAgICAqIC8gbXVsdGktd2luZG93IG1vZGVzLCB3aGVuIHRoZSBkZXZpY2UgaXMgaW4gZmFjdCBpbiBhIG11bHRpLXdpbmRvdyBtb2RlIChzdWNoIGFzIGluc2V0CisgICAgICogcG9ydHJhaXQgb24gbGFwdG9wcywgb3Igb24gYSBmb2xkYWJsZSBkZXZpY2UgaW4gc29tZSBmb2xkIHN0YXRlcykuICBJbiBhZGRpdGlvbiwKKyAgICAgKiA8Y29kZT5ST1RBVEVfQU5EX0NST1BfTk9ORTwvY29kZT4gYW5kIDxjb2RlPlJPVEFURV9BTkRfQ1JPUF85MDwvY29kZT4gd2lsbCBhbHdheXMgYmUgYXZhaWxhYmxlIGlmIHRoaXMgY29udHJvbAorICAgICAqIGlzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLiAgSWYgbm90IHN1cHBvcnRlZCwgZGV2aWNlcyBBUEkgbGV2ZWwgMzAgb3IgaGlnaGVyIHdpbGwgYWx3YXlzCisgICAgICogbGlzdCBvbmx5IDxjb2RlPlJPVEFURV9BTkRfQ1JPUF9OT05FPC9jb2RlPi48L3A+CisgICAgICogPHA+V2hlbiA8Y29kZT5DUk9QX0FVVE88L2NvZGU+IGlzIGluIHVzZSwgYW5kIHRoZSBjYW1lcmEgQVBJIGFjdGl2YXRlcyBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IG1vZGUsCisgICAgICogc2V2ZXJhbCBtZXRhZGF0YSBmaWVsZHMgd2lsbCBhbHNvIGJlIHBhcnNlZCBkaWZmZXJlbnRseSB0byBlbnN1cmUgdGhhdCBjb29yZGluYXRlcyBhcmUKKyAgICAgKiBjb3JyZWN0bHkgaGFuZGxlZCBmb3IgZmVhdHVyZXMgbGlrZSBkcmF3aW5nIGZhY2UgZGV0ZWN0aW9uIGJveGVzIG9yIHBhc3NpbmcgaW4KKyAgICAgKiB0YXAtdG8tZm9jdXMgY29vcmRpbmF0ZXMuICBUaGUgY2FtZXJhIEFQSSB3aWxsIGNvbnZlcnQgcG9zaXRpb25zIGluIHRoZSBhY3RpdmUgYXJyYXkKKyAgICAgKiBjb29yZGluYXRlIHN5c3RlbSB0by9mcm9tIHRoZSBjcm9wcGVkLWFuZC1yb3RhdGVkIGNvb3JkaW5hdGUgc3lzdGVtIHRvIG1ha2UgdGhlCisgICAgICogb3BlcmF0aW9uIHRyYW5zcGFyZW50IGZvciBhcHBsaWNhdGlvbnMuICBUaGUgZm9sbG93aW5nIGNvbnRyb2xzIGFyZSBhZmZlY3RlZDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5BQ0FNRVJBX0NPTlRST0xfQUVfUkVHSU9OUzwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfQ09OVFJPTF9BRl9SRUdJT05TPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9DT05UUk9MX0FXQl9SRUdJT05TPC9saT4KKyAgICAgKiA8bGk+YW5kcm9pZC5zdGF0aXN0aWNzLmZhY2VzPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPkNhcHR1cmUgcmVzdWx0cyB3aWxsIGNvbnRhaW4gdGhlIGFjdHVhbCB2YWx1ZSBzZWxlY3RlZCBieSB0aGUgQVBJOworICAgICAqIDxjb2RlPlJPVEFURV9BTkRfQ1JPUF9BVVRPPC9jb2RlPiB3aWxsIG5ldmVyIGJlIHNlZW4gaW4gYSBjYXB0dXJlIHJlc3VsdC48L3A+CisgICAgICogPHA+QXBwbGljYXRpb25zIGNhbiBhbHNvIHNlbGVjdCB0aGVpciBwcmVmZXJyZWQgY3JvcHBpbmcgbW9kZSwgZWl0aGVyIHRvIG9wdCBvdXQgb2YgdGhlCisgICAgICogYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgdHJlYXRtZW50LCBvciB0byB1c2UgdGhlIGNyb3BwaW5nIGZlYXR1cmUgdGhlbXNlbHZlcyBhcyBuZWVkZWQuCisgICAgICogSW4gdGhpcyBjYXNlLCBubyBjb29yZGluYXRlIHRyYW5zbGF0aW9uIHdpbGwgYmUgZG9uZSBhdXRvbWF0aWNhbGx5LCBhbmQgYWxsIGNvbnRyb2xzCisgICAgICogd2lsbCBjb250aW51ZSB0byB1c2UgdGhlIG5vcm1hbCBhY3RpdmUgYXJyYXkgY29vcmRpbmF0ZXMuPC9wPgorICAgICAqIDxwPkNyb3BwaW5nIGFuZCByb3RhdGluZyBpcyBkb25lIGFmdGVyIHRoZSBhcHBsaWNhdGlvbiBvZiBkaWdpdGFsIHpvb20gKHZpYSBlaXRoZXIKKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTiBvciBBQ0FNRVJBX0NPTlRST0xfWk9PTV9SQVRJTyksIGJ1dCBiZWZvcmUgZWFjaCBpbmRpdmlkdWFsCisgICAgICogb3V0cHV0IGlzIGZ1cnRoZXIgY3JvcHBlZCBhbmQgc2NhbGVkLiBJdCBvbmx5IGFmZmVjdHMgcHJvY2Vzc2VkIG91dHB1dHMgc3VjaCBhcworICAgICAqIFlVViwgUFJJVkFURSwgYW5kIEpQRUcuICBJdCBoYXMgbm8gZWZmZWN0IG9uIFJBVyBvdXRwdXRzLjwvcD4KKyAgICAgKiA8cD5XaGVuIDxjb2RlPkNST1BfOTA8L2NvZGU+IG9yIDxjb2RlPkNST1BfMjcwPC9jb2RlPiBhcmUgc2VsZWN0ZWQsIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgbG9zcyB0byB0aGUgZmllbGQgb2YKKyAgICAgKiB2aWV3LiBGb3IgZXhhbXBsZSwgd2l0aCBhIDQ6MyBhc3BlY3QgcmF0aW8gb3V0cHV0IG9mIDE2MDB4MTIwMCwgPGNvZGU+Q1JPUF85MDwvY29kZT4gd2lsbCBzdGlsbAorICAgICAqIHByb2R1Y2UgMTYwMHgxMjAwIG91dHB1dCwgYnV0IHRoZXNlIGJ1ZmZlcnMgYXJlIGNyb3BwZWQgZnJvbSBhIHZlcnRpY2FsIDM6NCBzbGljZSBhdCB0aGUKKyAgICAgKiBjZW50ZXIgb2YgdGhlIDQ6MyBhcmVhLCB0aGVuIHJvdGF0ZWQgdG8gYmUgNDozLCBhbmQgdGhlbiB1cHNjYWxlZCB0byAxNjAweDEyMDAuICBPbmx5CisgICAgICogNTYuMjUlIG9mIHRoZSBvcmlnaW5hbCBGT1YgaXMgc3RpbGwgdmlzaWJsZS4gIEluIGdlbmVyYWwsIGZvciBhbiBhc3BlY3QgcmF0aW8gb2YgPGNvZGU+dzpoPC9jb2RlPiwKKyAgICAgKiB0aGUgY3JvcCBhbmQgcm90YXRlIG9wZXJhdGlvbiBsZWF2ZXMgPGNvZGU+KGgvdyleMjwvY29kZT4gb2YgdGhlIGZpZWxkIG9mIHZpZXcgdmlzaWJsZS4gRm9yIDE2OjksCisgICAgICogdGhpcyBpcyB+MzEuNiUuPC9wPgorICAgICAqIDxwPkFzIGEgdmlzdWFsIGV4YW1wbGUsIHRoZSBmaWd1cmUgYmVsb3cgc2hvd3MgdGhlIGVmZmVjdCBvZiA8Y29kZT5ST1RBVEVfQU5EX0NST1BfOTA8L2NvZGU+IG9uIHRoZQorICAgICAqIG91dHB1dHMgZm9yIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5TZW5zb3IgYWN0aXZlIGFycmF5OiA8Y29kZT4yMDAweDE1MDA8L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+Q3JvcCByZWdpb246IHRvcC1sZWZ0OiA8Y29kZT4oNTAwLCAzNzUpPC9jb2RlPiwgc2l6ZTogPGNvZGU+KDEwMDAsIDc1MCk8L2NvZGU+ICg0OjMgYXNwZWN0IHJhdGlvKTwvbGk+CisgICAgICogPGxpPk91dHB1dCBzdHJlYW1zOiBZVVYgPGNvZGU+NjQweDQ4MDwvY29kZT4gYW5kIFlVViA8Y29kZT4xMjgweDcyMDwvY29kZT48L2xpPgorICAgICAqIDxsaT48Y29kZT5ST1RBVEVfQU5EX0NST1BfOTA8L2NvZGU+PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPjxpbWcgYWx0PSJFZmZlY3Qgb2YgUk9UQVRFX0FORF9DUk9QXzkwIiBzcmM9Ii4uL2ltYWdlcy9jYW1lcmEyL21ldGFkYXRhL2FuZHJvaWQuc2NhbGVyLnJvdGF0ZUFuZENyb3AvY3JvcC1yZWdpb24tcm90YXRlLTkwLTQzLXJhdGlvLnBuZyIgLz48L3A+CisgICAgICogPHA+V2l0aCB0aGVzZSBzZXR0aW5ncywgdGhlIHJlZ2lvbnMgb2YgdGhlIGFjdGl2ZSBhcnJheSBjb3ZlcmVkIGJ5IHRoZSBvdXRwdXQgc3RyZWFtcyBhcmU6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+NjQweDQ4MCBzdHJlYW0gY3JvcDogdG9wLWxlZnQ6IDxjb2RlPigyMTksIDM3NSk8L2NvZGU+LCBzaXplOiA8Y29kZT4oNTYyLCA3NTApPC9jb2RlPjwvbGk+CisgICAgICogPGxpPjEyODB4NzIwIHN0cmVhbSBjcm9wOiB0b3AtbGVmdDogPGNvZGU+KDI4OSwgMzc1KTwvY29kZT4sIHNpemU6IDxjb2RlPig0MjIsIDc1MCk8L2NvZGU+PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPlNpbmNlIHRoZSBidWZmZXJzIGFyZSByb3RhdGVkLCB0aGUgYnVmZmVycyBhcyBzZWVuIGJ5IHRoZSBhcHBsaWNhdGlvbiBhcmU6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+NjQweDQ4MCBzdHJlYW06IHRvcC1sZWZ0OiA8Y29kZT4oNzgxLCAzNzUpPC9jb2RlPiBvbiBhY3RpdmUgYXJyYXksIHNpemU6IDxjb2RlPig2NDAsIDQ4MCk8L2NvZGU+LCBkb3duc2NhbGVkIDEuMTd4IGZyb20gc2Vuc29yIHBpeGVsczwvbGk+CisgICAgICogPGxpPjEyODB4NzIwIHN0cmVhbTogdG9wLWxlZnQ6IDxjb2RlPig3MTEsIDM3NSk8L2NvZGU+IG9uIGFjdGl2ZSBhcnJheSwgc2l6ZTogPGNvZGU+KDEyODAsIDcyMCk8L2NvZGU+LCB1cHNjYWxlZCAxLjcxeCBmcm9tIHNlbnNvciBwaXhlbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9BRV9SRUdJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUZfUkVHSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FXQl9SRUdJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfWk9PTV9SQVRJTworICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1AgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3QpCisgICAgICAgICAgICBBQ0FNRVJBX1NDQUxFUl9TVEFSVCArIDE3LAogICAgIEFDQU1FUkFfU0NBTEVSX0VORCwKIAogICAgIC8qKgpAQCAtNDc3OSw3ICs0ODg2LDcgQEAKICAgICAgKiByZWN0YW5nbGUsIGFuZCBjcm9wcGluZyB0byB0aGUgcmVjdGFuZ2xlIGdpdmVuIGluIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUuPC9wPgogICAgICAqIDxwPkUuZy4gdG8gY2FsY3VsYXRlIHBvc2l0aW9uIG9mIGEgcGl4ZWwsICh4LHkpLCBpbiBhIHByb2Nlc3NlZCBZVVYgb3V0cHV0IGltYWdlIHdpdGggdGhlCiAgICAgICogZGltZW5zaW9ucyBpbiBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFIGdpdmVuIHRoZSBwb3NpdGlvbiBvZiBhIHBpeGVsLAotICAgICAqICh4JywgeScpLCBpbiB0aGUgcmF3IHBpeGVsIGFycmF5IHdpdGggZGltZW5zaW9ucyBnaXZlIGluCisgICAgICogKHgnLCB5JyksIGluIHRoZSByYXcgcGl4ZWwgYXJyYXkgd2l0aCBkaW1lbnNpb25zIGdpdmVuIGluCiAgICAgICogQUNBTUVSQV9TRU5TT1JfSU5GT19QSVhFTF9BUlJBWV9TSVpFOjwvcD4KICAgICAgKiA8b2w+CiAgICAgICogPGxpPkNob29zZSBhIHBpeGVsICh4JywgeScpIHdpdGhpbiB0aGUgYWN0aXZlIGFycmF5IHJlZ2lvbiBvZiB0aGUgcmF3IGJ1ZmZlciBnaXZlbiBpbgpAQCAtODI5OCw2ICs4NDA1LDUxIEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKIAorLy8gQUNBTUVSQV9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcCB7CisgICAgLyoqCisgICAgICogPHA+Tm8gcm90YXRlIGFuZCBjcm9wIGlzIGFwcGxpZWQuIFByb2Nlc3NlZCBvdXRwdXRzIGFyZSBpbiB0aGUgc2Vuc29yIG9yaWVudGF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKworICAgIC8qKgorICAgICAqIDxwPlByb2Nlc3NlZCBpbWFnZXMgYXJlIHJvdGF0ZWQgYnkgOTAgZGVncmVlcyBjbG9ja3dpc2UsIGFuZCB0aGVuIGNyb3BwZWQKKyAgICAgKiB0byB0aGUgb3JpZ2luYWwgYXNwZWN0IHJhdGlvLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfOTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworICAgIC8qKgorICAgICAqIDxwPlByb2Nlc3NlZCBpbWFnZXMgYXJlIHJvdGF0ZWQgYnkgMTgwIGRlZ3JlZXMuICBTaW5jZSB0aGUgYXNwZWN0IHJhdGlvIGRvZXMgbm90CisgICAgICogY2hhbmdlLCBubyBjcm9wcGluZyBpcyBwZXJmb3JtZWQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF8xODAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorCisgICAgLyoqCisgICAgICogPHA+UHJvY2Vzc2VkIGltYWdlcyBhcmUgcm90YXRlZCBieSAyNzAgZGVncmVlcyBjbG9ja3dpc2UsIGFuZCB0aGVuIGNyb3BwZWQKKyAgICAgKiB0byB0aGUgb3JpZ2luYWwgYXNwZWN0IHJhdGlvLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfMjcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgQVBJIGF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgYmVzdCBjb25jcmV0ZSB2YWx1ZSBmb3IKKyAgICAgKiByb3RhdGUtYW5kLWNyb3AgYmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCBmb3IgcmVzaXphYmlsaXR5IGFuZCB0aGUgY3VycmVudAorICAgICAqIG11bHRpLXdpbmRvdyBtb2RlLjwvcD4KKyAgICAgKiA8cD5JZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcG9ydCByZXNpemluZyBidXQgdGhlIGRpc3BsYXkgbW9kZSBmb3IgaXRzIG1haW4KKyAgICAgKiBBY3Rpdml0eSBpcyBub3QgaW4gYSB0eXBpY2FsIG9yaWVudGF0aW9uLCB0aGUgY2FtZXJhIEFQSSB3aWxsIHNldCA8Y29kZT5ST1RBVEVfQU5EX0NST1BfOTA8L2NvZGU+CisgICAgICogb3Igc29tZSBvdGhlciBzdXBwb3J0ZWQgcm90YXRpb24gdmFsdWUsIGRlcGVuZGluZyBvbiBkZXZpY2UgY29uZmlndXJhdGlvbiwKKyAgICAgKiB0byBlbnN1cmUgcHJldmlldyBhbmQgY2FwdHVyZWQgaW1hZ2VzIGFyZSBjb3JyZWN0bHkgc2hvd24gdG8gdGhlIHVzZXIuIE90aGVyd2lzZSwKKyAgICAgKiA8Y29kZT5ST1RBVEVfQU5EX0NST1BfTk9ORTwvY29kZT4gd2lsbCBiZSBzZWxlY3RlZC48L3A+CisgICAgICogPHA+V2hlbiBhIHZhbHVlIG90aGVyIHRoYW4gTk9ORSBpcyBzZWxlY3RlZCwgc2V2ZXJhbCBtZXRhZGF0YSBmaWVsZHMgd2lsbCBhbHNvIGJlIHBhcnNlZAorICAgICAqIGRpZmZlcmVudGx5IHRvIGVuc3VyZSB0aGF0IGNvb3JkaW5hdGVzIGFyZSBjb3JyZWN0bHkgaGFuZGxlZCBmb3IgZmVhdHVyZXMgbGlrZSBkcmF3aW5nCisgICAgICogZmFjZSBkZXRlY3Rpb24gYm94ZXMgb3IgcGFzc2luZyBpbiB0YXAtdG8tZm9jdXMgY29vcmRpbmF0ZXMuICBUaGUgY2FtZXJhIEFQSSB3aWxsCisgICAgICogY29udmVydCBwb3NpdGlvbnMgaW4gdGhlIGFjdGl2ZSBhcnJheSBjb29yZGluYXRlIHN5c3RlbSB0by9mcm9tIHRoZSBjcm9wcGVkLWFuZC1yb3RhdGVkCisgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gdG8gbWFrZSB0aGUgb3BlcmF0aW9uIHRyYW5zcGFyZW50IGZvciBhcHBsaWNhdGlvbnMuPC9wPgorICAgICAqIDxwPk5vIGNvb3JkaW5hdGUgbWFwcGluZyB3aWxsIGJlIGRvbmUgd2hlbiB0aGUgYXBwbGljYXRpb24gc2VsZWN0cyBhIG5vbi1BVVRPIG1vZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9yb3RhdGVfYW5kX2Nyb3BfdDsKKwogCiAvLyBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zZW5zb3JfcmVmZXJlbmNlX2lsbHVtaW5hbnQxIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKaW5kZXggOTlmNjdlOS4uZGY5NzdkYSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKICAqLwogI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotdHlwZWRlZiBuYXRpdmVfaGFuZGxlX3QgQUNhbWVyYVdpbmRvd1R5cGU7Cit0eXBlZGVmIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCBBQ2FtZXJhV2luZG93VHlwZTsKICNlbHNlCiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiB0eXBlZGVmIEFOYXRpdmVXaW5kb3cgQUNhbWVyYVdpbmRvd1R5cGU7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oCmluZGV4IGUxYWY4YzEuLjVhMWFmNzkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSAidXRpbHMuaCIKIAogc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7Ci0gICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UsCisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkID0gIiIpIDoKICAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSwgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkge307CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAKaW5kZXggZTUxMWEzZi4uOWY2MzA5OSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTE4MCw2ICsxODAsNyBAQAogICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAogICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pIHsKKyAgICBuc2Vjc190IHN0YXJ0VGltZU5zID0gc3lzdGVtVGltZSgpOwogICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOwpAQCAtMTkzLDcgKzE5NCw3IEBACiAgICAgfQogCiAgICAgLy8gQ3JlYXRlIG5ldyBzZXNzaW9uCi0gICAgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycyk7CisgICAgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgc3RhcnRUaW1lTnMpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICBBTE9HRSgiRmFpbCB0byBjcmVhdGUgbmV3IHNlc3Npb24uIGNhbm5vdCBjb25maWd1cmUgc3RyZWFtcyIpOwogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMzU1LDcgKzM1Niw3IEBACiAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVxdWVzdFN0cmVhbUlkeExpc3Q7CiAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVxdWVzdFN1cmZhY2VJZHhMaXN0OwogICAgIGZvciAoYXV0byBvdXRwdXRUYXJnZXQgOiByZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cykgewotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dHB1dFRhcmdldC5tV2luZG93OworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dHB1dFRhcmdldC5tV2luZG93OwogICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgICAgIHJlcS0+bVN1cmZhY2VMaXN0LnB1c2hfYmFjayhhbncpOwogICAgICAgICAvLyBsb29rdXAgc3RyZWFtL3N1cmZhY2UgSUQKQEAgLTQzNCw3ICs0MzUsNyBAQAogICAgIH0KICAgICBwUmVxdWVzdC0+dGFyZ2V0cyA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxLT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSByZXEtPm1TdXJmYWNlTGlzdFtpXTsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBhbncgPSByZXEtPm1TdXJmYWNlTGlzdFtpXTsKICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCBvdXRwdXRUYXJnZXQoYW53KTsKICAgICAgICAgcFJlcXVlc3QtPnRhcmdldHMtPm1PdXRwdXRzLmluc2VydChvdXRwdXRUYXJnZXQpOwogICAgIH0KQEAgLTQ3Miw3ICs0NzMsMTEgQEAKICAgICB9CiAKICAgICAvLyBObyBuZXcgc2Vzc2lvbiwgdW5jb25maWd1cmUgbm93Ci0gICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQobnVsbHB0ciwgbnVsbHB0cik7CisgICAgLy8gTm90ZTogVGhlIHVuY29uZmlndXJhdGlvbiBvZiBzZXNzaW9uIHdvbid0IGJlIGFjY291bnRlZCBmb3Igc2Vzc2lvbgorICAgIC8vIGxhdGVuY3kgYmVjYXVzZSBhIHN0cmVhbSBjb25maWd1cmF0aW9uIHdpdGggMCBzdHJlYW1zIHdvbid0IGV2ZXIgYmVjb21lCisgICAgLy8gYWN0aXZlLgorICAgIG5zZWNzX3Qgc3RhcnRUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQobnVsbHB0ciwgbnVsbHB0ciwgc3RhcnRUaW1lTnMpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICBBTE9HRSgiVW5jb25maWd1cmUgc3RyZWFtIGZhaWxlZC4gRGV2aWNlIG1pZ2h0IHN0aWxsIGJlIGNvbmZpZ3VyZWQhIHJldCAlZCIsIHJldCk7CiAgICAgfQpAQCAtNTk4LDcgKzYwMyw3IEBACiAKIGNhbWVyYV9zdGF0dXNfdAogQ2FtZXJhRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zTG9ja2VkKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogb3V0cHV0cywKLSAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycykgeworICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLCBuc2Vjc190IHN0YXJ0VGltZU5zKSB7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIGVtcHR5T3V0cHV0OwogICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIpIHsKICAgICAgICAgb3V0cHV0cyA9ICZlbXB0eU91dHB1dDsKQEAgLTYxMSw3ICs2MTYsNyBAQAogCiAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gb3V0cHV0U2V0OwogICAgIGZvciAoYXV0byBvdXRDb25maWcgOiBvdXRwdXRzLT5tT3V0cHV0cykgewotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dENvbmZpZy5tV2luZG93OworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dENvbmZpZy5tV2luZG93OwogICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdJbnNlcnRXOwogICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uICZvdXRDb25maWdJbnNlcnQgPSBvdXRDb25maWdJbnNlcnRXLm1PdXRwdXRDb25maWd1cmF0aW9uOwogICAgICAgICBvdXRDb25maWdJbnNlcnQucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRDb25maWcubVJvdGF0aW9uKTsKQEAgLTY5Nyw3ICs3MDIsOCBAQAogICAgICAgICB1dGlsczo6Y29udmVydFRvSGlkbChwYXJhbXNfbWV0YWRhdGEsICZoaWRsUGFyYW1zKTsKICAgICAgICAgcGFyYW1zLnVubG9jayhwYXJhbXNfbWV0YWRhdGEpOwogICAgIH0KLSAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5lbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFLCBoaWRsUGFyYW1zKTsKKyAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5lbmRDb25maWd1cmVfMl8xKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxQYXJhbXMsIHN0YXJ0VGltZU5zKTsKICAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgcmVtb3RlUmV0LCAiZW5kQ29uZmlndXJlKCkiKQogICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQpAQCAtODQ2LDggKzg1Miw3IEBACiAgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtQW5kV2luZG93SWQgOiByZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCB3aW5kb3dJZCA9IHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOwogICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXSxvdXRIYW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBhbncgPSB3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXS5nZXROYXRpdmVIYW5kbGUoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CiAKQEAgLTEyNDQsNyArMTI0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudzsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBhbnc7CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQW53S2V5LCAodm9pZCoqKSAmYW53KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBuYXRpdmVfaGFuZGxlX3QhIiwgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCA3ZmM2OTllLi4wYjZjN2M4IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjEvSUNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CkBAIC00NCw3ICs0NCw4IEBACiBuYW1lc3BhY2UgYWNhbSB7CiAKIHVzaW5nIElDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwotdXNpbmcgSUNhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSUNhbWVyYURldmljZVVzZXJfMl8wID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIElDYW1lcmFEZXZpY2VVc2VyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8xOjpJQ2FtZXJhRGV2aWNlVXNlcjsKIHVzaW5nIENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7CiB1c2luZyBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwogdXNpbmcgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKQEAgLTIwMSw3ICsyMDIsNyBAQAogICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOwogCiAgICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAotICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywgbnNlY3NfdCBzdGFydFRpbWVOcyk7CiAKICAgICAvLyBJbnB1dCBtZXNzYWdlIHdpbGwgYmUgcG9zdGVkIGFuZCBjbGVhcmVkIGFmdGVyIHRoaXMgcmV0dXJucwogICAgIHZvaWQgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCA1YWE5YzQ2Li43N2M5MzRhIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC03NjQsMTUgKzc2NCwxNSBAQAogICAgIH0KIAogICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2tzID0gZGV2aWNlLT5nZXRTZXJ2aWNlQ2FsbGJhY2soKTsKLSAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlOworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyXzJfMD4gZGV2aWNlUmVtb3RlXzJfMDsKIAogICAgIC8vIE5vIHdheSB0byBnZXQgcGFja2FnZSBuYW1lIGZyb20gbmF0aXZlLgogICAgIC8vIFNlbmQgYSB6ZXJvIGxlbmd0aCBwYWNrYWdlIG5hbWUgYW5kIGxldCBjYW1lcmEgc2VydmljZSBmaWd1cmUgaXQgb3V0IGZyb20gVUlECiAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CiAgICAgYXV0byBzZXJ2aWNlUmV0ID0gY3MtPmNvbm5lY3REZXZpY2UoCi0gICAgICAgICAgICBjYWxsYmFja3MsIGNhbWVyYUlkLCBbJnN0YXR1cywgJmRldmljZVJlbW90ZV0oYXV0byBzLCBhdXRvICZkZXZpY2UpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhSWQsIFsmc3RhdHVzLCAmZGV2aWNlUmVtb3RlXzJfMF0oYXV0byBzLCBhdXRvICZkZXZpY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVJlbW90ZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VSZW1vdGVfMl8wID0gZGV2aWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAKICAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CkBAIC03ODAsMTEgKzc4MCwxOCBAQAogICAgICAgICBkZWxldGUgZGV2aWNlOwogICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOwogICAgIH0KLSAgICBpZiAoZGV2aWNlUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICBpZiAoZGV2aWNlUmVtb3RlXzJfMCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCEgcmVtb3RlIGRldmljZSBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgZGVsZXRlIGRldmljZTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKICAgICB9CisgICAgYXV0byBjYXN0UmVzdWx0ID0gSUNhbWVyYURldmljZVVzZXI6OmNhc3RGcm9tKGRldmljZVJlbW90ZV8yXzApOworICAgIGlmICghY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY2FzdCByZW1vdGUgZGV2aWNlIHRvIHZlcnNpb24gMi4xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgc3A8SUNhbWVyYURldmljZVVzZXI+IGRldmljZVJlbW90ZSA9IGNhc3RSZXN1bHQ7CiAgICAgZGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UoZGV2aWNlUmVtb3RlKTsKICAgICBkZXZpY2UtPnNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CiAgICAgKm91dERldmljZSA9IGRldmljZTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IDg1ZGEzZTkuLjgzNTliYjEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjEvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMi9JQ2FtZXJhU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4xL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KIAogI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CkBAIC0zOCw3ICszOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYWNhbSB7CiAKLXVzaW5nIElDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMTo6SUNhbWVyYVNlcnZpY2U7Cit1c2luZyBJQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzI6OklDYW1lcmFTZXJ2aWNlOwogdXNpbmcgQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwogdXNpbmcgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzE6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CiB1c2luZyBQaHlzaWNhbENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMTo6UGh5c2ljYWxDYW1lcmFTdGF0dXNBbmRJZDsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKaW5kZXggZWQ2NzYxNS4uNTcxNWQ3NyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlICJ1dGlscy5oIgogCiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7Ci0gICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChuYXRpdmVfaGFuZGxlX3QqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChjb25zdCBuYXRpdmVfaGFuZGxlX3QqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CiAKICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKaW5kZXggZjM4OWYwMy4uNmY1ODIwZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCkBAIC00Miw3ICs0Miw3IEBACiAvLyBVdGlsaXR5IGNsYXNzIHNvIHRoYXQgQ2FwdHVyZVJlcXVlc3QgY2FuIGJlIHN0b3JlZCBieSBzcDw+CiBzdHJ1Y3QgQ2FwdHVyZVJlcXVlc3QgOiBwdWJsaWMgUmVmQmFzZSB7CiAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgbUNhcHR1cmVSZXF1ZXN0OwotICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QgKj4gbVN1cmZhY2VMaXN0OworICBzdGQ6OnZlY3Rvcjxjb25zdCBuYXRpdmVfaGFuZGxlX3QgKj4gbVN1cmZhY2VMaXN0OwogICAvL1BoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncyBtZXRhZGF0YSBpcyBzdG9yZWQgaGVyZSwgc2luY2UgdGhlIGNhcHR1cmUgcmVxdWVzdAogICAvL21pZ2h0IG5vdCBjb250YWluIGl0LiBUaGF0J3Mgc2luY2UsIGZtcSBtaWdodCBoYXZlIGNvbnN1bWVkIGl0LgogICBoaWRsX3ZlYzxQaHlzaWNhbENhbWVyYVNldHRpbmdzPiBtUGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKQEAgLTYyLDEzICs2MiwxMyBAQAogLy8gVXRpbGl0eSBjbGFzcyBzbyB0aGUgbmF0aXZlX2hhbmRsZV90IGNhbiBiZSBjb21wYXJlZCB3aXRoICBpdHMgY29udGVudHMgaW5zdGVhZAogLy8gb2YganVzdCByYXcgcG9pbnRlciBjb21wYXJpc29ucy4KIHN0cnVjdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIHsKLSAgICBuYXRpdmVfaGFuZGxlX3QgKm1XaW5kb3cgPSBudWxscHRyOworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbVdpbmRvdyA9IG51bGxwdHI7CiAKLSAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKG5hdGl2ZV9oYW5kbGVfdCAqbmgpIDogbVdpbmRvdyhuaCkgeyB9CisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oKSA6IG1XaW5kb3cobmgpIHsgfQogCiAgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcigpID0gZGVmYXVsdDsKIAotICAgIG9wZXJhdG9yIG5hdGl2ZV9oYW5kbGVfdCAqKCkgY29uc3QgeyByZXR1cm4gbVdpbmRvdzsgfQorICAgIG9wZXJhdG9yIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKCkgY29uc3QgeyByZXR1cm4gbVdpbmRvdzsgfQogCiAgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCmluZGV4IDkzOGI1ZjUuLmJhMTRjNWMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIHN0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OwogCiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOwotdXNpbmcgQ29uZmlndXJlZFdpbmRvd3MgPSBzdGQ6OnNldDxuYXRpdmVfaGFuZGxlX3QgKj47Cit1c2luZyBDb25maWd1cmVkV2luZG93cyA9IHN0ZDo6c2V0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqPjsKIAogY2xhc3MgQ2FtZXJhSGVscGVyIHsKICAgIHB1YmxpYzoKQEAgLTYwLDExICs2MCwxMSBAQAogCiAgICAgc3RydWN0IFBoeXNpY2FsSW1nUmVhZGVySW5mbyB7CiAgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQ7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudzsKICAgICB9OwogCiAgICAgLy8gUmV0YWluaW5nIHRoZSBlcnJvciBjb2RlIGluIGNhc2UgdGhlIGNhbGxlciBuZWVkcyB0byBhbmFseXplIGl0LgotICAgIHN0ZDo6dmFyaWFudDxpbnQsIENvbmZpZ3VyZWRXaW5kb3dzPiBpbml0Q2FtZXJhKG5hdGl2ZV9oYW5kbGVfdCogaW1nUmVhZGVyQW53LAorICAgIHN0ZDo6dmFyaWFudDxpbnQsIENvbmZpZ3VyZWRXaW5kb3dzPiBpbml0Q2FtZXJhKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaW1nUmVhZGVyQW53LAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxJbWdSZWFkZXJJbmZvPiYgcGh5c2ljYWxJbWdSZWFkZXJzLAogICAgICAgICAgICAgYm9vbCB1c2VQaHlzaWNhbFNldHRpbmdzKSB7CiAgICAgICAgIENvbmZpZ3VyZWRXaW5kb3dzIGNvbmZpZ3VyZWRXaW5kb3dzOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtRGV2aWNlQ2J7dGhpcywgbnVsbHB0ciwgbnVsbHB0cn07CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1TZXNzaW9uQ2J7IHRoaXMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9OwogCi0gICAgbmF0aXZlX2hhbmRsZV90KiBtSW1nUmVhZGVyQW53ID0gbnVsbHB0cjsgIC8vIG5vdCBvd25lZCBieSB1cy4KKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOyAgLy8gbm90IG93bmVkIGJ5IHVzLgogCiAgICAgLy8gQ2FtZXJhIGRldmljZQogICAgIEFDYW1lcmFEZXZpY2UqIG1EZXZpY2UgPSBudWxscHRyOwpAQCAtMzk2LDcgKzM5Niw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIG5hdGl2ZV9oYW5kbGVfdCogZ2V0TmF0aXZlV2luZG93KCkgeyByZXR1cm4gbUltZ1JlYWRlckFudzsgfQorICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogZ2V0TmF0aXZlV2luZG93KCkgeyByZXR1cm4gbUltZ1JlYWRlckFudzsgfQogCiAgICAgaW50IGdldEFjcXVpcmVkSW1hZ2VDb3VudCgpIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCmluZGV4IDhjY2RlZDIuLjBjZjM5MGYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcApAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgICAgIHNwPFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyhuZXcgVGVzdENhbWVyYURldmljZUNhbGxiYWNrcygpKTsKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2U7CiAgICAgICAgIHJlcyA9IHNlcnZpY2UtPmNvbm5lY3REZXZpY2UoY2FsbGJhY2tzLCBjYW1lcmFJZCwgU3RyaW5nMTYoIm1lZWVlZWVlZWUhIiksCi0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwKKyAgICAgICAgICAgICAgICB7fSwgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsCiAgICAgICAgICAgICAgICAgLypvdXQqLyZkZXZpY2UpOwogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBkZXZpY2UuZ2V0KCkpOwpAQCAtNDIxLDcgKzQyMSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSgib3Blbk5ld0RldmljZSIpOwogICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gc2VydmljZS0+Y29ubmVjdERldmljZShjYWxsYmFja3MsIGRldmljZUlkLCBTdHJpbmcxNigibWVlZWVlZWVlZSEiKSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwKKyAgICAgICAgICAgICAgICAgICAge30sIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELAogICAgICAgICAgICAgICAgICAgICAvKm91dCovJmRldmljZSk7CiAgICAgICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIH0KQEAgLTUxNyw3ICs1MTcsNyBAQAogICAgICAgICBDYW1lcmFNZXRhZGF0YSBzZXNzaW9uUGFyYW1zOwogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IG9mZmxpbmVTdHJlYW1JZHM7CiAgICAgICAgIHJlcyA9IGRldmljZS0+ZW5kQ29uZmlndXJlKC8qaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCovIGZhbHNlLCBzZXNzaW9uUGFyYW1zLAotICAgICAgICAgICAgICAgICZvZmZsaW5lU3RyZWFtSWRzKTsKKyAgICAgICAgICAgICAgICBuczJtcyhzeXN0ZW1UaW1lKCkpLCAmb2ZmbGluZVN0cmVhbUlkcyk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CiAKQEAgLTYyOSw3ICs2MjksNyBAQAogICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgcmVzID0gZGV2aWNlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UsIHNlc3Npb25QYXJhbXMsCi0gICAgICAgICAgICAgICAgJm9mZmxpbmVTdHJlYW1JZHMpOworICAgICAgICAgICAgICAgIG5zMm1zKHN5c3RlbVRpbWUoKSksICZvZmZsaW5lU3RyZWFtSWRzKTsKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogCiAgICAgICAgIHNsZWVwKC8qc2Vjb25kKi8xKTsgLy8gYWxsb3cgc29tZSB0aW1lIGZvciBlcnJvcnMgdG8gc2hvdyB1cCwgaWYgYW55CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCBmNGZiNjI2Li5iMzFhNThiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTI3MywxNCArMjczLDExIEBACiAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24mIHQsCiAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBkcHksCiAgICAgICAgIGNvbnN0IHVpOjpEaXNwbGF5U3RhdGUmIGRpc3BsYXlTdGF0ZSkgewotICAgIGNvbnN0IHVpOjpTaXplJiB2aWV3cG9ydCA9IGRpc3BsYXlTdGF0ZS52aWV3cG9ydDsKLQotICAgIC8vIFNldCB0aGUgcmVnaW9uIG9mIHRoZSBsYXllciBzdGFjayB3ZSdyZSBpbnRlcmVzdGVkIGluLCB3aGljaCBpbiBvdXIKLSAgICAvLyBjYXNlIGlzICJhbGwgb2YgaXQiLgotICAgIFJlY3QgbGF5ZXJTdGFja1JlY3Qodmlld3BvcnQpOworICAgIC8vIFNldCB0aGUgcmVnaW9uIG9mIHRoZSBsYXllciBzdGFjayB3ZSdyZSBpbnRlcmVzdGVkIGluLCB3aGljaCBpbiBvdXIgY2FzZSBpcyAiYWxsIG9mIGl0Ii4KKyAgICBSZWN0IGxheWVyU3RhY2tSZWN0KGRpc3BsYXlTdGF0ZS5sYXllclN0YWNrU3BhY2VSZWN0KTsKIAogICAgIC8vIFdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgZGlzcGxheS4KLSAgICBmbG9hdCBkaXNwbGF5QXNwZWN0ID0gdmlld3BvcnQuZ2V0SGVpZ2h0KCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4odmlld3BvcnQuZ2V0V2lkdGgoKSk7CisgICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IGxheWVyU3RhY2tSZWN0LmdldEhlaWdodCgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGxheWVyU3RhY2tSZWN0LmdldFdpZHRoKCkpOwogCiAKICAgICAvLyBTZXQgdGhlIHdheSB3ZSBtYXAgdGhlIG91dHB1dCBvbnRvIHRoZSBkaXNwbGF5IHN1cmZhY2UgKHdoaWNoIHdpbGwKQEAgLTY5OSwyMCArNjk2LDIxIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgY29uc3QgdWk6OlNpemUmIHZpZXdwb3J0ID0gZGlzcGxheVN0YXRlLnZpZXdwb3J0OworICAgIGNvbnN0IHVpOjpTaXplJiBsYXllclN0YWNrU3BhY2VSZWN0ID0gZGlzcGxheVN0YXRlLmxheWVyU3RhY2tTcGFjZVJlY3Q7CiAgICAgaWYgKGdWZXJib3NlKSB7CiAgICAgICAgIHByaW50ZigiRGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXMpLCBsYXllclN0YWNrPSV1XG4iLAotICAgICAgICAgICAgICAgIHZpZXdwb3J0LmdldFdpZHRoKCksIHZpZXdwb3J0LmdldEhlaWdodCgpLCBkaXNwbGF5Q29uZmlnLnJlZnJlc2hSYXRlLAotICAgICAgICAgICAgICAgIHRvQ1N0cmluZyhkaXNwbGF5U3RhdGUub3JpZW50YXRpb24pLCBkaXNwbGF5U3RhdGUubGF5ZXJTdGFjayk7CisgICAgICAgICAgICAgICAgbGF5ZXJTdGFja1NwYWNlUmVjdC5nZXRXaWR0aCgpLCBsYXllclN0YWNrU3BhY2VSZWN0LmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgIGRpc3BsYXlDb25maWcucmVmcmVzaFJhdGUsIHRvQ1N0cmluZyhkaXNwbGF5U3RhdGUub3JpZW50YXRpb24pLAorICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0ZS5sYXllclN0YWNrKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCiAgICAgLy8gRW5jb2RlciBjYW4ndCB0YWtlIG9kZCBudW1iZXIgYXMgY29uZmlnCiAgICAgaWYgKGdWaWRlb1dpZHRoID09IDApIHsKLSAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbih2aWV3cG9ydC5nZXRXaWR0aCgpKTsKKyAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihsYXllclN0YWNrU3BhY2VSZWN0LmdldFdpZHRoKCkpOwogICAgIH0KICAgICBpZiAoZ1ZpZGVvSGVpZ2h0ID09IDApIHsKLSAgICAgICAgZ1ZpZGVvSGVpZ2h0ID0gZmxvb3JUb0V2ZW4odmlld3BvcnQuZ2V0SGVpZ2h0KCkpOworICAgICAgICBnVmlkZW9IZWlnaHQgPSBmbG9vclRvRXZlbihsYXllclN0YWNrU3BhY2VSZWN0LmdldEhlaWdodCgpKTsKICAgICB9CiAKICAgICAvLyBDb25maWd1cmUgYW5kIHN0YXJ0IHRoZSBlbmNvZGVyLgpAQCAtMTE3MCwxNCArMTE2OCwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgZ1BoeXNpY2FsRGlzcGxheUlkID0gYXRvbGwob3B0YXJnKTsKLSAgICAgICAgICAgIGlmIChnUGh5c2ljYWxEaXNwbGF5SWQgPT0gMCkgeworICAgICAgICAgICAgZ1BoeXNpY2FsRGlzcGxheUlkID0gUGh5c2ljYWxEaXNwbGF5SWQoYXRvbGwob3B0YXJnKSk7CisgICAgICAgICAgICBpZiAoZ1BoeXNpY2FsRGlzcGxheUlkLnZhbHVlID09IDApIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgcGh5c2ljYWwgZGlzcGxheSBpZFxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKFN1cmZhY2VDb21wb3NlckNsaWVudDo6CiAgICAgICAgICAgICAgICAgICAgIGdldFBoeXNpY2FsRGlzcGxheVRva2VuKGdQaHlzaWNhbERpc3BsYXlJZCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwaHlzaWNhbCBkaXNwbGF5IGlkOiAlIgotICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9QSFlTSUNBTF9ESVNQTEFZX0lEX0ZPUk1BVCAiXG4iLCBnUGh5c2ljYWxEaXNwbGF5SWQpOworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwaHlzaWNhbCBkaXNwbGF5IGlkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyhnUGh5c2ljYWxEaXNwbGF5SWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGViNzY5NTMuLjU1NDI3Y2EgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0xMzQsMTUgKzEzNCwxOCBAQAogICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAotICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIGNoYW5uZWxNYXNrOworICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CiAgICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscyk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAKLSAgICBpZighZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY2hhbm5lbE1hc2spKSB7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CisgICAgaWYgKGludDMyX3QgcmF3Q2hhbm5lbE1hc2s7ICFmb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZyYXdDaGFubmVsTWFzaykpIHsKICAgICAgICAgLy8gbG9nIG9ubHkgd2hlbiB0aGVyZSdzIGEgcmlzayBvZiBhbWJpZ3VpdHkgb2YgY2hhbm5lbCBtYXNrIHNlbGVjdGlvbgogICAgICAgICBBTE9HSV9JRihudW1DaGFubmVscyA+IDIsCiAgICAgICAgICAgICAgICAgInNvdXJjZSBmb3JtYXQgZGlkbid0IHNwZWNpZnkgY2hhbm5lbCBtYXNrLCB1c2luZyAoJWQpIGNoYW5uZWwgb3JkZXIiLCBudW1DaGFubmVscyk7CiAgICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHJhd0NoYW5uZWxNYXNrKTsKICAgICB9CiAKICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCmluZGV4IDM3MDkxYzQuLjA5OGMyNzggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKQEAgLTI1OSwzMSArMjU5LDYgQEAKICAgICBwcmludGYoIiRcbiIpOwogI2VuZGlmCiAKLSNpZiAwCi0gICAgQ2FtZXJhU291cmNlICpzb3VyY2UgPSBDYW1lcmFTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgICAgIFN0cmluZzE2KGFyZ3ZbMF0sIHN0cmxlbihhcmd2WzBdKSkpOwotICAgIHNvdXJjZS0+c3RhcnQoKTsKLQotICAgIHByaW50Zigic291cmNlID0gJXBcbiIsIHNvdXJjZSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKLSAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgIHByaW50ZigiZ290IGEgZnJhbWUsIGRhdGE9JXAsIHNpemU9JWRcbiIsCi0gICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgZXJyID0gc291cmNlLT5zdG9wKCk7Ci0KLSAgICBkZWxldGUgc291cmNlOwotICAgIHNvdXJjZSA9IE5VTEw7Ci0jZW5kaWYKLQogICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZWNvcmQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKICAgICAgICAgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9kcm0vVEVTVF9NQVBQSU5HIGIvZHJtL1RFU1RfTUFQUElORwppbmRleCAyNTk1ZTNlLi45ZjZhNTMyIDEwMDY0NAotLS0gYS9kcm0vVEVTVF9NQVBQSU5HCisrKyBiL2RybS9URVNUX01BUFBJTkcKQEAgLTksMTcgKzksOSBAQAogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVHZW5lcmljT3BzVGVzdHMiCi0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogIkd0c0V4b1BsYXllclRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyIgOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Tb2NQcmVzdWJtaXQiCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLmV4b3BsYXllci5ndHMuRGFzaFRlc3QjdGVzdFdpZGV2aW5lMjNGcHNIMjY0Rml4ZWQiCisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVZb3VUdWJlUGVyZm9ybWFuY2VUZXN0cyIKICAgICAgICAgfQogICAgICAgXQogICAgIH0KZGlmZiAtLWdpdCBhL2RybS9jb21tb24vQW5kcm9pZC5icCBiL2RybS9jb21tb24vQW5kcm9pZC5icAppbmRleCAyNzI2ODRjLi4yNDg1NzBlIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvZHJtL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xNCw3ICsxNCw3IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKLWNjX2xpYnJhcnlfc3RhdGljIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJkcm1mcmFtZXdvcmtjb21tb24iLAogCiAgICAgc3JjczogWwpAQCAtMzUsNyArMzUsMTEgQEAKIAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiAKLSAgICBzaGFyZWRfbGliczogWyJsaWJiaW5kZXIiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIKKyAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAppbmRleCA3M2YxMWE0Li5jMGE1ZTNiIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKQEAgLTMwOSw3ICszMDksNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqIERSTSBmcmFtZXdvcmsuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KICAgICAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAppbmRleCAxODM3YTExLi5hNTQ1OTQxIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqIERSTSBmcmFtZXdvcmsuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KICAgICAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0FuZHJvaWQuYnAgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggYjY4ZTZjMi4uOGI3YzU1MSAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5icApAQCAtMzEsMTkgKzMxLDE4IEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmRybWZyYW1ld29ya2NvbW1vbiIsCiAgICAgICAgICJsaWJzZWxpbnV4IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBzdGF0aWNfbGliczogWyJsaWJkcm1mcmFtZXdvcmtjb21tb24iXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKyAgICBjb21waWxlX211bHRpbGliOiAicHJlZmVyMzIiLAogCiAgICAgaW5pdF9yYzogWyJkcm1zZXJ2ZXIucmMiXSwKIH0KZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IDlhMzJjYzUuLjc0ZTMyMjMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtOTksMTMgKzk5LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBtZXNzYWdlIHR5cGU6ICV6ZCIsIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgbWVzc2FnZSB0eXBlOiAldSIsIG1zZy0+d2hhdCgpKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogaW50NjRfdCBEcm1NYW5hZ2VyOjpnZXRNZXRyaWNzRmx1c2hQZXJpb2RVcygpIHsKLSAgICByZXR1cm4gMTAwMCAqIDEwMDAgKiBzdGQ6Om1heCgxbGwsIHByb3BlcnR5X2dldF9pbnQ2NCgiZHJtbWFuYWdlci5tZXRyaWNzLnBlcmlvZCIsIDg2NDAwKSk7CisgICAgcmV0dXJuIDEwMDAgKiAxMDAwICogc3RkOjptYXgoMWxsLCAobG9uZyBsb25nKXByb3BlcnR5X2dldF9pbnQ2NCgiZHJtbWFuYWdlci5tZXRyaWNzLnBlcmlvZCIsIDg2NDAwKSk7CiB9CiAKIHZvaWQgRHJtTWFuYWdlcjo6cmVjb3JkRW5naW5lTWV0cmljcygKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icAppbmRleCA5NDBjMTdkLi5iNGE3YjI1IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwCkBAIC0yOSwxMiArMjksMTEgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZHJtZnJhbWV3b3JrY29tbW9uIiwKICAgICBdLAogCi0gICAgc3RhdGljX2xpYnM6IFsibGliZHJtZnJhbWV3b3JrY29tbW9uIl0sCi0KICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLSAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbImxpYmRybWZyYW1ld29ya2NvbW1vbiJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGliZHJtZnJhbWV3b3JrY29tbW9uIl0sCiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaAppbmRleCAzODU4Njc1Li44Yzg3ODNiIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaApAQCAtMjMwLDcgKzIzMCw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKaW5kZXggYmI5ZDdlYy4uOWY1MmY3YSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKQEAgLTM2LDExICszNiwxMSBAQAogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYnNzbCIsCiAgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAorICAgICAgICAibGliZHJtZnJhbWV3b3JrY29tbW9uIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmRybXV0aWxpdHkiLAotICAgICAgICAibGliZHJtZnJhbWV3b3JrY29tbW9uIiwKICAgICAgICAgImxpYmZ3ZGxvY2stY29tbW9uIiwKICAgICAgICAgImxpYmZ3ZGxvY2stY29udmVydGVyIiwKICAgICAgICAgImxpYmZ3ZGxvY2stZGVjb2RlciIsCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKaW5kZXggYjYyZGRiOS4uZWI1YjBmNiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApAQCAtMjUyLDggKzI1Miw3IEBACiAKIC8qKgogICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0IGJ1dCBkb2VzIG5vdGhpbmcgZm9yCi0gKiBGb3J3YXJkIExvY2sgRW5naW5lLgorICogRFJNIGZyYW1ld29yay4gRG9lcyBub3RoaW5nIGZvciBGb3J3YXJkIExvY2sgRW5naW5lLgogICoKICAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCiAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbAppbmRleCA4Zjk1Y2QyLi5jMWQ1YjNkIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwKQEAgLTQ4OCw3ICs0ODgsNyBAQAogPHAgY2xhc3M9TXNvQm9keVRleHQ+PGI+Tm90ZTo8L2I+IFRoZSBrZXktZW5jcnlwdGlvbiBrZXkgbXVzdCBiZSB1bmlxdWUgdG8gZWFjaAogZGV2aWNlOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhlIGZpbGVzIGZvcndhcmQgbG9ja5Zwcm90ZWN0ZWQuIElkZWFsbHksIGl0IHNob3VsZAogYmUgZGVyaXZlZCBmcm9tIHNlY3JldCBoYXJkd2FyZSBwYXJhbWV0ZXJzLCBidXQgYXQgdGhlIHZlcnkgbGVhc3QgaXQgc2hvdWxkIGJlCi1wZXJzaXN0ZW50IGZyb20gb25lIG1hc3RlciByZXNldCB0byB0aGUgbmV4dC48L3A+CitwZXJzaXN0ZW50IGZyb20gb25lIGZhY3RvcnkgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgogCiA8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDtwYWRkaW5nOjEuMHB0IDQuMHB0IDEuMHB0IDQuMHB0OwogYmFja2dyb3VuZDojRjJGMkYyJz4KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKaW5kZXggMDViNjQ0MC4uODA0NTU4NiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKQEAgLTE5LDEyICsxOSwxMSBAQAogCiAgICAgc3JjczogWyJzcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwIl0sCiAKLSAgICBzdGF0aWNfbGliczogWyJsaWJkcm1mcmFtZXdvcmtjb21tb24iXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZHJtZnJhbWV3b3JrY29tbW9uIiwKICAgICBdLAogCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzQ29uc3VtZXIuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3NDb25zdW1lci5jcHAKaW5kZXggYjQ3YjRmZi4uNWYwYjI2ZSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3NDb25zdW1lci5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3NDb25zdW1lci5jcHAKQEAgLTM3LDggKzM3LDggQEAKIHRlbXBsYXRlIDw+IHN0ZDo6c3RyaW5nIEdldEF0dHJpYnV0ZU5hbWU8S2V5U3RhdHVzVHlwZT4oS2V5U3RhdHVzVHlwZSB0eXBlKSB7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiVVNBQkxFIiwgIkVYUElSRUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9VVFBVVF9OT1RfQUxMT1dFRCIsICJTVEFUVVNfUEVORElORyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5URVJOQUxfRVJST1IifTsKLSAgICBpZiAoKChzaXplX3QpdHlwZSkgPiBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlRFUk5BTF9FUlJPUiIsICJVU0FCTEVfSU5fRlVUVVJFIn07CisgICAgaWYgKCgoc2l6ZV90KXR5cGUpID49IGFycmF5c2l6ZSh0eXBlX25hbWVzKSkgewogICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CiAgICAgfQogICAgIHJldHVybiB0eXBlX25hbWVzWyhzaXplX3QpdHlwZV07CkBAIC00OCw3ICs0OCw3IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiUFJPVklTSU9OX1JFUVVJUkVEIiwgIktFWV9ORUVERUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktFWV9FWFBJUkVEIiwgIlZFTkRPUl9ERUZJTkVEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRVNTSU9OX1JFQ0xBSU1FRCJ9OwotICAgIGlmICgoKHNpemVfdCl0eXBlKSA+IGFycmF5c2l6ZSh0eXBlX25hbWVzKSkgeworICAgIGlmICgoKHNpemVfdCl0eXBlKSA+PSBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKICAgICAgICAgcmV0dXJuICJVTktOT1dOX1RZUEUiOwogICAgIH0KICAgICByZXR1cm4gdHlwZV9uYW1lc1soc2l6ZV90KXR5cGVdOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKaW5kZXggNTI5MjcwNS4uZTMxMzk1ZCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwCkBAIC02Niw3ICs2Niw3IEBACiAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwogICAgIE1lZGlhUmVzb3VyY2VQYXJjZWwgcmVzb3VyY2V7CiAgICAgICAgICAgICBUeXBlOjprRHJtU2Vzc2lvbiwgU3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSwKLSAgICAgICAgICAgIHRvU3RkVmVjPGludDhfdD4oc2Vzc2lvbklkKSwgdmFsdWV9OworICAgICAgICAgICAgdG9TdGRWZWM8PihzZXNzaW9uSWQpLCB2YWx1ZX07CiAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhyZXNvdXJjZSk7CiAgICAgcmV0dXJuIHJlc291cmNlczsKIH0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oCmluZGV4IDllNDM1MDQuLmM1NmJmMDEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaApAQCAtNjIsNyArNjIsNyBAQAogICAgIHZvaWQgcmVtb3ZlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CiAgICAgYm9vbCByZWNsYWltU2Vzc2lvbihpbnQgY2FsbGluZ1BpZCk7CiAKLSAgICAvLyBzYW5pdHkgY2hlY2sgQVBJcworICAgIC8vIGluc3BlY3Rpb24gQVBJcwogICAgIHNpemVfdCBnZXRTZXNzaW9uQ291bnQoKSBjb25zdDsKICAgICBib29sIGNvbnRhaW5zU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9wcm90b3MvQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjZjZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBUaGlzIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBkcm0gbWV0cmljcyBjb25maWd1cmVkIGZvciBwcm90b2J1ZiBmdWxsIG9uIGhvc3QuCisvLyBJdCBpcyB1c2VkIGJ5IHRoZSBtZXRyaWNzX2R1bXAgdG9vbC4KKworY2NfbGlicmFyeV9ob3N0X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmRybV9tZXRyaWNzX3Byb3Rvc19mdWxsX2hvc3QiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsiZXh0ZXJuYWwvcHJvdG9idWYvc3JjIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZXRyaWNzLnByb3RvIiwKKyAgICBdLAorCisgICAgcHJvdG86IHsKKyAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCisgICAgICAgIHR5cGU6ICJmdWxsIiwKKyAgICB9LAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgIC8vIFN1cHByZXNzIHVudXNlZCBwYXJhbWV0ZXIgZXJyb3IuIFRoaXMgZXJyb3Igb2NjdXJzCisgICAgICAgIC8vIHdoZW4gdXNpbmcgdGhlIG1hcCB0eXBlIGluIGEgcHJvdG8gZGVmaW5pdGlvbi4KKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCmluZGV4IGNiNjlmOTEuLjQ2NmU1NzEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcApAQCAtNjIsOCArNjIsOCBAQAogICAgIH0KICAgICBBTE9HVigiZGVzY3JpcHRvcl9zaXplPSV6dSIsIGNvbnRhaW5lci5kZXNjcmlwdG9yX3NpemUoKSk7CiAKLSAgICAvLyBTYW5pdHkgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIEJyb2FkY2FzdEVuY3J5cHRvciBpcyBzZW5kaW5nIGEgcHJvcGVybHkKLSAgICAvLyBmb3JtZWQgRWNtQ29udGFpbmVyLiBJZiBpdCBjb250YWlucyB0d28gRWNtcywgdGhlIGlkcyBzaG91bGQgaGF2ZSBkaWZmZXJlbnQKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBCcm9hZGNhc3RFbmNyeXB0b3IgaXMgc2VuZGluZyBhIHByb3Blcmx5IGZvcm1lZAorICAgIC8vIEVjbUNvbnRhaW5lci4gSWYgaXQgY29udGFpbnMgdHdvIEVjbXMsIHRoZSBpZHMgc2hvdWxkIGhhdmUgZGlmZmVyZW50CiAgICAgLy8gcGFyaXR5IChvbmUgb2RkLCBvbmUgZXZlbikuIFRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgYWZmZWN0IGRlY3J5cHRpb24KICAgICAvLyBidXQgaW5kaWNhdGVzIGEgcHJvYmxlbSB3aXRoIEVjbSBnZW5lcmF0aW9uLgogICAgIGlmIChjb250YWluZXIuZGVzY3JpcHRvcl9zaXplKCkgPT0gMikgewpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKaW5kZXggMmRjZDAwZi4uMDUxYTk2OCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0xNSw3ICsxNSw3IEBACiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBzdGQ6OnN0cmluZyBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIHNpemVfdCBpbmRleCA9IHBhdGguZmluZF9sYXN0X29mKCIvIik7CisgICAgc2l6ZV90IGluZGV4ID0gcGF0aC5maW5kX2xhc3Rfb2YoJy8nKTsKICAgICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGluZGV4KzEpOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmggYi9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKaW5kZXggODY2ZWRhYy4uYTM4YWE5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCisrKyBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaApAQCAtMzE4LDcgKzMxOCw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9URVNUX01BUFBJTkcgYi9pbmNsdWRlL2RybS9URVNUX01BUFBJTkcKaW5kZXggMjhlNDMyZS4uNTEyZTg0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vVEVTVF9NQVBQSU5HCisrKyBiL2luY2x1ZGUvZHJtL1RFU1RfTUFQUElORwpAQCAtOCwxNyArOCw5IEBACiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLm1lZGlhLmd0cy5XaWRldmluZUdlbmVyaWNPcHNUZXN0cyIKLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiOiAiR3RzRXhvUGxheWVyVGVzdENhc2VzIiwKLSAgICAgICJvcHRpb25zIiA6IFsKLSAgICAgICAgewotICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlNvY1ByZXN1Ym1pdCIKICAgICAgICAgfSwKICAgICAgICAgewotICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJjb20uZ29vZ2xlLmFuZHJvaWQuZXhvcGxheWVyLmd0cy5EYXNoVGVzdCN0ZXN0V2lkZXZpbmUyM0Zwc0gyNjRGaXhlZCIKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLm1lZGlhLmd0cy5XaWRldmluZVlvdVR1YmVQZXJmb3JtYW5jZVRlc3RzIgogICAgICAgICB9CiAgICAgICBdCiAgICAgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JbnRlcnBvbGF0b3IuaCBiL2luY2x1ZGUvbWVkaWEvSW50ZXJwb2xhdG9yLmgKaW5kZXggNzAzY2Y3Ny4uMjAwNGFjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JbnRlcnBvbGF0b3IuaAorKysgYi9pbmNsdWRlL21lZGlhL0ludGVycG9sYXRvci5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JbnRlcnBvbGF0b3JDb25maWcuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCkBAIC0zOSwxNyArNDAsMTAgQEAKIGNsYXNzIEludGVycG9sYXRvciA6IHB1YmxpYyBzdGQ6Om1hcDxTLCBUPiB7CiBwdWJsaWM6CiAgICAgLy8gUG9seW5vbWlhbCBzcGxpbmUgaW50ZXJwb2xhdG9ycwotICAgIC8vIEV4dGVuZCBvbmx5IGF0IHRoZSBlbmQgb2YgZW51bSwgYXMgdGhpcyBtdXN0IG1hdGNoIG9yZGVyIGluIFZvbHVtZVNoYXBlcnMuamF2YS4KLSAgICBlbnVtIEludGVycG9sYXRvclR5cGUgOiBpbnQzMl90IHsKLSAgICAgICAgSU5URVJQT0xBVE9SX1RZUEVfU1RFUCwgICAvLyBOb3QgY29udGludW91cwotICAgICAgICBJTlRFUlBPTEFUT1JfVFlQRV9MSU5FQVIsIC8vIEMwCi0gICAgICAgIElOVEVSUE9MQVRPUl9UWVBFX0NVQklDLCAgLy8gQzEKLSAgICAgICAgSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUNfTU9OT1RPTklDLCAvLyBDMSAodG8gcHJvdmlkZSBsb2NhbGx5IG1vbm90b25pYyBjdXJ2ZXMpCi0gICAgICAgIC8vIElOVEVSUE9MQVRPUl9UWVBFX0NVQklDX0MyLCAvLyBUT0RPIC0gcmVxdWlyZXMgZ2xvYmFsIGNvbXB1dGF0aW9uIC8gY2FjaGUKLSAgICB9OworICAgIHVzaW5nIEludGVycG9sYXRvclR5cGUgID0gbWVkaWE6OkludGVycG9sYXRvclR5cGU7CiAKICAgICBleHBsaWNpdCBJbnRlcnBvbGF0b3IoCi0gICAgICAgICAgICBJbnRlcnBvbGF0b3JUeXBlIGludGVycG9sYXRvclR5cGUgPSBJTlRFUlBPTEFUT1JfVFlQRV9MSU5FQVIsCisgICAgICAgICAgICBJbnRlcnBvbGF0b3JUeXBlIGludGVycG9sYXRvclR5cGUgPSBJbnRlcnBvbGF0b3JUeXBlOjpMSU5FQVIsCiAgICAgICAgICAgICBib29sIGNhY2hlID0gdHJ1ZSkKICAgICAgICAgOiBtQ2FjaGUoY2FjaGUpCiAgICAgICAgICwgbUZpcnN0U2xvcGUoMCkKQEAgLTgyLDEzICs3NiwxMyBAQAogCiAgICAgICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdHdvIGFkamFjZW50IHBvaW50czoKICAgICAgICAgc3dpdGNoIChtSW50ZXJwb2xhdG9yVHlwZSkgewotICAgICAgICBjYXNlIElOVEVSUE9MQVRPUl9UWVBFX1NURVA6CisgICAgICAgIGNhc2UgSW50ZXJwb2xhdG9yVHlwZTo6U1RFUDoKICAgICAgICAgICAgIHJldHVybiBoaWdoLT5maXJzdCA9PSB4ID8gaGlnaC0+c2Vjb25kIDogbG93LT5zZWNvbmQ7Ci0gICAgICAgIGNhc2UgSU5URVJQT0xBVE9SX1RZUEVfTElORUFSOgorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OkxJTkVBUjoKICAgICAgICAgICAgIHJldHVybiAoKGhpZ2gtPmZpcnN0IC0geCkgKiBsb3ctPnNlY29uZCArICh4IC0gbG93LT5maXJzdCkgKiBoaWdoLT5zZWNvbmQpCiAgICAgICAgICAgICAgICAgICAgIC8gKGhpZ2gtPmZpcnN0IC0gbG93LT5maXJzdCk7Ci0gICAgICAgIGNhc2UgSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUM6Ci0gICAgICAgIGNhc2UgSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUNfTU9OT1RPTklDOgorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OkNVQklDOgorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OkNVQklDX01PTk9UT05JQzoKICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX0hlcm1pdGVfc3BsaW5lCiAKQEAgLTExNiw3ICsxMTAsNyBAQAogICAgICAgICAgICAgLy8gbm9uIGNhdG11bGxSb20gKGZpbml0ZSBkaWZmZXJlbmNlKSB3aXRoIHJlZ3VsYXIgY3ViaWM7CiAgICAgICAgICAgICAvLyB0aGUgY2hvaWNlcyBoZXJlIG1pbmltaXplIGNvbXB1dGF0aW9uLgogICAgICAgICAgICAgYm9vbCBtb25vdG9uaWMsIGNhdG11bGxSb207Ci0gICAgICAgICAgICBpZiAobUludGVycG9sYXRvclR5cGUgPT0gSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUNfTU9OT1RPTklDKSB7CisgICAgICAgICAgICBpZiAobUludGVycG9sYXRvclR5cGUgPT0gSW50ZXJwb2xhdG9yVHlwZTo6Q1VCSUNfTU9OT1RPTklDKSB7CiAgICAgICAgICAgICAgICAgbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBjYXRtdWxsUm9tID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjAyLDExICsxOTYsMTEgQEAKIAogICAgIHN0YXR1c190IHNldEludGVycG9sYXRvclR5cGUoSW50ZXJwb2xhdG9yVHlwZSBpbnRlcnBvbGF0b3JUeXBlKSB7CiAgICAgICAgIHN3aXRjaCAoaW50ZXJwb2xhdG9yVHlwZSkgewotICAgICAgICBjYXNlIElOVEVSUE9MQVRPUl9UWVBFX1NURVA6ICAgLy8gTm90IGNvbnRpbnVvdXMKLSAgICAgICAgY2FzZSBJTlRFUlBPTEFUT1JfVFlQRV9MSU5FQVI6IC8vIEMwCi0gICAgICAgIGNhc2UgSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUM6ICAvLyBDMQotICAgICAgICBjYXNlIElOVEVSUE9MQVRPUl9UWVBFX0NVQklDX01PTk9UT05JQzogLy8gQzEgKyBvdGhlciBjb25zdHJhaW50cwotICAgICAgICAvLyBjYXNlIElOVEVSUE9MQVRPUl9UWVBFX0NVQklDX0MyOgorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OlNURVA6ICAgLy8gTm90IGNvbnRpbnVvdXMKKyAgICAgICAgY2FzZSBJbnRlcnBvbGF0b3JUeXBlOjpMSU5FQVI6IC8vIEMwCisgICAgICAgIGNhc2UgSW50ZXJwb2xhdG9yVHlwZTo6Q1VCSUM6ICAvLyBDMQorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OkNVQklDX01PTk9UT05JQzogLy8gQzEgKyBvdGhlciBjb25zdHJhaW50cworICAgICAgICAvLyBjYXNlIEludGVycG9sYXRvclR5cGU6OkNVQklDX0MyOgogICAgICAgICAgICAgbUludGVycG9sYXRvclR5cGUgPSBpbnRlcnBvbGF0b3JUeXBlOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICBkZWZhdWx0OgpAQCAtMjM1LDQ5ICsyMjksNTAgQEAKICAgICAgICAgbU1lbW8uY2xlYXIoKTsKICAgICB9CiAKKyAgICAvLyBUT0RPKHl0YWkpOiByZW1vdmUgdGhpcyBtZXRob2Qgb25jZSBpdCBpcyBub3QgdXNlZC4KICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7Ci0gICAgICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUludGVycG9sYXRvclR5cGUpCi0gICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZUZsb2F0KG1GaXJzdFNsb3BlKQotICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVGbG9hdChtTGFzdFNsb3BlKQotICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVVaW50MzIoKHVpbnQzMl90KXRoaXMtPnNpemUoKSk7IC8vIHNpbGVudCB0cnVuY2F0aW9uCi0gICAgICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwdCA6ICp0aGlzKSB7Ci0gICAgICAgICAgICByZXMgPSBwYXJjZWwtPndyaXRlRmxvYXQocHQuZmlyc3QpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVGbG9hdChwdC5zZWNvbmQpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBtZWRpYTo6SW50ZXJwb2xhdG9yQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgd3JpdGVUb0NvbmZpZygmY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgfQogCisgICAgdm9pZCB3cml0ZVRvQ29uZmlnKG1lZGlhOjpJbnRlcnBvbGF0b3JDb25maWcgKmNvbmZpZykgY29uc3QgeworICAgICAgICBjb25maWctPnR5cGUgPSBtSW50ZXJwb2xhdG9yVHlwZTsKKyAgICAgICAgY29uZmlnLT5maXJzdFNsb3BlID0gbUZpcnN0U2xvcGU7CisgICAgICAgIGNvbmZpZy0+bGFzdFNsb3BlID0gbUxhc3RTbG9wZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwdCA6ICp0aGlzKSB7CisgICAgICAgICAgICBjb25maWctPnh5LnB1c2hfYmFjayhwdC5maXJzdCk7CisgICAgICAgICAgICBjb25maWctPnh5LnB1c2hfYmFjayhwdC5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyh5dGFpKTogcmVtb3ZlIHRoaXMgbWV0aG9kIG9uY2UgaXQgaXMgbm90IHVzZWQuCiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKLSAgICAgICAgdGhpcy0+Y2xlYXIoKTsKLSAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICB1aW50MzJfdCBzaXplOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJjZWwucmVhZEludDMyKCZ0eXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLnJlYWRGbG9hdCgmbUZpcnN0U2xvcGUpCi0gICAgICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwucmVhZEZsb2F0KCZtTGFzdFNsb3BlKQotICAgICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLnJlYWRVaW50MzIoJnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICA/OiBzZXRJbnRlcnBvbGF0b3JUeXBlKChJbnRlcnBvbGF0b3JUeXBlKXR5cGUpOworICAgICAgICBtZWRpYTo6SW50ZXJwb2xhdG9yQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gY29uZmlnLnJlYWRGcm9tUGFyY2VsKCZwYXJjZWwpOwogICAgICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkRnJvbUNvbmZpZyhjb25maWcpOworICAgIH0KKworICAgIHN0YXR1c190IHJlYWRGcm9tQ29uZmlnKGNvbnN0IG1lZGlhOjpJbnRlcnBvbGF0b3JDb25maWcgJmNvbmZpZykgeworICAgICAgICB0aGlzLT5jbGVhcigpOworICAgICAgICBzZXRJbnRlcnBvbGF0b3JUeXBlKGNvbmZpZy50eXBlKTsKKyAgICAgICAgaWYgKChjb25maWcueHkuc2l6ZSgpICYgMSkgIT0gMCkgeworICAgICAgICAgICAgLy8geHkgc2l6ZSBtdXN0IGJlIGV2ZW4uCisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IHNpemUgPSBjb25maWcueHkuc2l6ZSgpIC8gMjsKKyAgICAgICAgbUZpcnN0U2xvcGUgPSBjb25maWcuZmlyc3RTbG9wZTsKKyAgICAgICAgbUxhc3RTbG9wZSA9IGNvbmZpZy5sYXN0U2xvcGU7CisKICAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBzaXplIGlzIHdpdGhpbiBzb21lIGJvdW5kcyBhcwogICAgICAgICAvLyB0aGUgUGFyY2VsIHJlYWQgd2lsbCBmYWlsIGlmIHNpemUgaXMgaW5jb3JyZWN0bHkgc3BlY2lmaWVkIHRvbyBsYXJnZS4KICAgICAgICAgZmxvYXQgbGFzdHg7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgIGZsb2F0IHgsIHk7Ci0gICAgICAgICAgICByZXMgPSBwYXJjZWwucmVhZEZsb2F0KCZ4KQotICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwucmVhZEZsb2F0KCZ5KTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgeCA9IGNvbmZpZy54eVtpICogMl07CisgICAgICAgICAgICBmbG9hdCB5ID0gY29uZmlnLnh5W2kgKiAyICsgMV07CiAgICAgICAgICAgICBpZiAoKGkgPiAwICYmICEoeCA+IGxhc3R4KSkgLyogaGFuZGxlIG5hbiAqLwogICAgICAgICAgICAgICAgICAgICB8fCB5ICE9IHkgLyogaGFuZGxlIG5hbiAqLykgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGQ6Om1hcCBvYmplY3Qgd2hpY2ggaW1wb3NlcyBzb3J0ZWQgb3JkZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaCBiL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaAppbmRleCAyMjg3YWNhLi5hNTA0NWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01pY3JvcGhvbmVJbmZvLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NaWNyb3Bob25lSW5mby5oCkBAIC0xNywzMyArMTcsMjQgQEAKICNpZm5kZWYgQU5EUk9JRF9NSUNST1BIT05FX0lORk9fSAogI2RlZmluZSBBTkRST0lEX01JQ1JPUEhPTkVfSU5GT19ICiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL01pY3JvcGhvbmVJbmZvRGF0YS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBtZWRpYSB7CiAKLSNkZWZpbmUgUkVUVVJOX0lGX0ZBSUxFRChjYWxsZWRPbmNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0dXNfdCByZXR1cm5TdGF0dXMgPSBjYWxsZWRPbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHJldHVyblN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIGF0ICVzOiVkICglcykiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsgXAotICAgICAgICAgICAgcmV0dXJuIHJldHVyblN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCiBjbGFzcyBNaWNyb3Bob25lSW5mbyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKIHB1YmxpYzoKICAgICBNaWNyb3Bob25lSW5mbygpID0gZGVmYXVsdDsKICAgICBNaWNyb3Bob25lSW5mbyhjb25zdCBNaWNyb3Bob25lSW5mbyYgbWljcm9waG9uZUluZm8pID0gZGVmYXVsdDsKICAgICBNaWNyb3Bob25lSW5mbyhhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QmIGNoYXJhY3RlcmlzdGljKSB7Ci0gICAgICAgIG1EZXZpY2VJZCA9IFN0cmluZzE2KCZjaGFyYWN0ZXJpc3RpYy5kZXZpY2VfaWRbMF0pOworICAgICAgICBtRGV2aWNlSWQgPSBzdGQ6OnN0cmluZygmY2hhcmFjdGVyaXN0aWMuZGV2aWNlX2lkWzBdKTsKICAgICAgICAgbVBvcnRJZCA9IGNoYXJhY3RlcmlzdGljLmlkOwogICAgICAgICBtVHlwZSA9IGNoYXJhY3RlcmlzdGljLmRldmljZTsKLSAgICAgICAgbUFkZHJlc3MgPSBTdHJpbmcxNigmY2hhcmFjdGVyaXN0aWMuYWRkcmVzc1swXSk7CisgICAgICAgIG1BZGRyZXNzID0gc3RkOjpzdHJpbmcoJmNoYXJhY3RlcmlzdGljLmFkZHJlc3NbMF0pOwogICAgICAgICBtRGV2aWNlTG9jYXRpb24gPSBjaGFyYWN0ZXJpc3RpYy5sb2NhdGlvbjsKICAgICAgICAgbURldmljZUdyb3VwID0gY2hhcmFjdGVyaXN0aWMuZ3JvdXA7CiAgICAgICAgIG1JbmRleEluVGhlR3JvdXAgPSBjaGFyYWN0ZXJpc3RpYy5pbmRleF9pbl90aGVfZ3JvdXA7CkBAIC01Myw4ICs0NCw4IEBACiAgICAgICAgIG1PcmllbnRhdGlvbi5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMub3JpZW50YXRpb24ueCk7CiAgICAgICAgIG1PcmllbnRhdGlvbi5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMub3JpZW50YXRpb24ueSk7CiAgICAgICAgIG1PcmllbnRhdGlvbi5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMub3JpZW50YXRpb24ueik7Ci0gICAgICAgIFZlY3RvcjxmbG9hdD4gZnJlcXVlbmNpZXM7Ci0gICAgICAgIFZlY3RvcjxmbG9hdD4gcmVzcG9uc2VzOworICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZnJlcXVlbmNpZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZXNwb25zZXM7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhcmFjdGVyaXN0aWMubnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXM7IGkrKykgewogICAgICAgICAgICAgZnJlcXVlbmNpZXMucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLmZyZXF1ZW5jeV9yZXNwb25zZXNbMF1baV0pOwogICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2hfYmFjayhjaGFyYWN0ZXJpc3RpYy5mcmVxdWVuY3lfcmVzcG9uc2VzWzFdW2ldKTsKQEAgLTczLDc2ICs2NCw3MyBAQAogICAgIHZpcnR1YWwgfk1pY3JvcGhvbmVJbmZvKCkgPSBkZWZhdWx0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZVN0cmluZzE2KG1EZXZpY2VJZCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtUG9ydElkKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZVVpbnQzMihtVHlwZSkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVTdHJpbmcxNihtQWRkcmVzcykpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtRGV2aWNlTG9jYXRpb24pKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobURldmljZUdyb3VwKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUludDMyKG1JbmRleEluVGhlR3JvdXApKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRCh3cml0ZUZsb2F0VmVjdG9yKHBhcmNlbCwgbUdlb21ldHJpY0xvY2F0aW9uKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQod3JpdGVGbG9hdFZlY3RvcihwYXJjZWwsIG1PcmllbnRhdGlvbikpOworICAgICAgICBNaWNyb3Bob25lSW5mb0RhdGEgcGFyY2VsYWJsZTsKKyAgICAgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQorICAgICAgICAgICAgICAgPzogcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShNaWNyb3Bob25lSW5mb0RhdGEqIHBhcmNlbGFibGUpIGNvbnN0IHsKKyAgICAgICAgcGFyY2VsYWJsZS0+ZGV2aWNlSWQgPSBtRGV2aWNlSWQ7CisgICAgICAgIHBhcmNlbGFibGUtPnBvcnRJZCA9IG1Qb3J0SWQ7CisgICAgICAgIHBhcmNlbGFibGUtPnR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihtVHlwZSkpOworICAgICAgICBwYXJjZWxhYmxlLT5hZGRyZXNzID0gbUFkZHJlc3M7CisgICAgICAgIHBhcmNlbGFibGUtPmRldmljZUdyb3VwID0gbURldmljZUdyb3VwOworICAgICAgICBwYXJjZWxhYmxlLT5pbmRleEluVGhlR3JvdXAgPSBtSW5kZXhJblRoZUdyb3VwOworICAgICAgICBwYXJjZWxhYmxlLT5nZW9tZXRyaWNMb2NhdGlvbiA9IG1HZW9tZXRyaWNMb2NhdGlvbjsKKyAgICAgICAgcGFyY2VsYWJsZS0+b3JpZW50YXRpb24gPSBtT3JpZW50YXRpb247CiAgICAgICAgIGlmIChtRnJlcXVlbmN5UmVzcG9uc2VzLnNpemUoKSAhPSAyKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZyZXF1ZW5jeVJlc3BvbnNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobUZyZXF1ZW5jeVJlc3BvbnNlc1tpXS5zaXplKCkpKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQod3JpdGVGbG9hdFZlY3RvcihwYXJjZWwsIG1GcmVxdWVuY3lSZXNwb25zZXNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGNoYW5uZWxNYXBwaW5nOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFwcGluZy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcucHVzaF9iYWNrKG1DaGFubmVsTWFwcGluZ1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzJWZWN0b3IoY2hhbm5lbE1hcHBpbmcpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlRmxvYXQobVNlbnNpdGl2aXR5KSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUZsb2F0KG1NYXhTcGwpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlRmxvYXQobU1pblNwbCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtRGlyZWN0aW9uYWxpdHkpKTsKKyAgICAgICAgcGFyY2VsYWJsZS0+ZnJlcXVlbmNpZXMgPSBtRnJlcXVlbmN5UmVzcG9uc2VzWzBdOworICAgICAgICBwYXJjZWxhYmxlLT5mcmVxdWVuY3lSZXNwb25zZXMgPSBtRnJlcXVlbmN5UmVzcG9uc2VzWzFdOworICAgICAgICBwYXJjZWxhYmxlLT5jaGFubmVsTWFwcGluZyA9IG1DaGFubmVsTWFwcGluZzsKKyAgICAgICAgcGFyY2VsYWJsZS0+c2Vuc2l0aXZpdHkgPSBtU2Vuc2l0aXZpdHk7CisgICAgICAgIHBhcmNlbGFibGUtPm1heFNwbCA9IG1NYXhTcGw7CisgICAgICAgIHBhcmNlbGFibGUtPm1pblNwbCA9IG1NaW5TcGw7CisgICAgICAgIHBhcmNlbGFibGUtPmRpcmVjdGlvbmFsaXR5ID0gbURpcmVjdGlvbmFsaXR5OwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZFN0cmluZzE2KCZtRGV2aWNlSWQpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmbVBvcnRJZCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZFVpbnQzMigmbVR5cGUpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRTdHJpbmcxNigmbUFkZHJlc3MpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmbURldmljZUxvY2F0aW9uKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJm1EZXZpY2VHcm91cCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZtSW5kZXhJblRoZUdyb3VwKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocmVhZEZsb2F0VmVjdG9yKHBhcmNlbCwgJm1HZW9tZXRyaWNMb2NhdGlvbiwgMykpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHJlYWRGbG9hdFZlY3RvcihwYXJjZWwsICZtT3JpZW50YXRpb24sIDMpKTsKLSAgICAgICAgaW50MzJfdCBmcmVxdWVuY2llc051bTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmZnJlcXVlbmNpZXNOdW0pKTsKLSAgICAgICAgVmVjdG9yPGZsb2F0PiBmcmVxdWVuY2llczsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChyZWFkRmxvYXRWZWN0b3IocGFyY2VsLCAmZnJlcXVlbmNpZXMsIGZyZXF1ZW5jaWVzTnVtKSk7Ci0gICAgICAgIGludDMyX3QgcmVzcG9uc2VzTnVtOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZyZXNwb25zZXNOdW0pKTsKLSAgICAgICAgVmVjdG9yPGZsb2F0PiByZXNwb25zZXM7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocmVhZEZsb2F0VmVjdG9yKHBhcmNlbCwgJnJlc3BvbnNlcywgcmVzcG9uc2VzTnVtKSk7Ci0gICAgICAgIGlmIChmcmVxdWVuY2llcy5zaXplKCkgIT0gcmVzcG9uc2VzLnNpemUoKSkgeworICAgICAgICBNaWNyb3Bob25lSW5mb0RhdGEgZGF0YTsKKyAgICAgICAgcmV0dXJuIGRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKGRhdGEpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IE1pY3JvcGhvbmVJbmZvRGF0YSYgcGFyY2VsYWJsZSkgeworICAgICAgICBtRGV2aWNlSWQgPSBwYXJjZWxhYmxlLmRldmljZUlkOworICAgICAgICBtUG9ydElkID0gcGFyY2VsYWJsZS5wb3J0SWQ7CisgICAgICAgIG1UeXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0UmVpbnRlcnByZXQ8dWludDMyX3Q+KHBhcmNlbGFibGUudHlwZSkpOworICAgICAgICBtQWRkcmVzcyA9IHBhcmNlbGFibGUuYWRkcmVzczsKKyAgICAgICAgbURldmljZUxvY2F0aW9uID0gcGFyY2VsYWJsZS5kZXZpY2VMb2NhdGlvbjsKKyAgICAgICAgbURldmljZUdyb3VwID0gcGFyY2VsYWJsZS5kZXZpY2VHcm91cDsKKyAgICAgICAgbUluZGV4SW5UaGVHcm91cCA9IHBhcmNlbGFibGUuaW5kZXhJblRoZUdyb3VwOworICAgICAgICBpZiAocGFyY2VsYWJsZS5nZW9tZXRyaWNMb2NhdGlvbi5zaXplKCkgIT0gMykgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRnJlcXVlbmN5UmVzcG9uc2VzLnB1c2hfYmFjayhmcmVxdWVuY2llcyk7Ci0gICAgICAgIG1GcmVxdWVuY3lSZXNwb25zZXMucHVzaF9iYWNrKHJlc3BvbnNlcyk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGludD4gY2hhbm5lbE1hcHBpbmc7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHBhcmNlbC0+cmVhZEludDMyVmVjdG9yKCZjaGFubmVsTWFwcGluZyk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5uZWxNYXBwaW5nLnNpemUoKSAhPSBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICBtR2VvbWV0cmljTG9jYXRpb24gPSBwYXJjZWxhYmxlLmdlb21ldHJpY0xvY2F0aW9uOworICAgICAgICBpZiAocGFyY2VsYWJsZS5vcmllbnRhdGlvbi5zaXplKCkgIT0gMykgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYW5uZWxNYXBwaW5nLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hcHBpbmcucHVzaF9iYWNrKGNoYW5uZWxNYXBwaW5nW2ldKTsKKyAgICAgICAgbU9yaWVudGF0aW9uID0gcGFyY2VsYWJsZS5vcmllbnRhdGlvbjsKKyAgICAgICAgaWYgKHBhcmNlbGFibGUuZnJlcXVlbmNpZXMuc2l6ZSgpICE9IHBhcmNlbGFibGUuZnJlcXVlbmN5UmVzcG9uc2VzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEZsb2F0KCZtU2Vuc2l0aXZpdHkpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRGbG9hdCgmbU1heFNwbCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEZsb2F0KCZtTWluU3BsKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJm1EaXJlY3Rpb25hbGl0eSkpOworCisgICAgICAgIG1GcmVxdWVuY3lSZXNwb25zZXMucHVzaF9iYWNrKHBhcmNlbGFibGUuZnJlcXVlbmNpZXMpOworICAgICAgICBtRnJlcXVlbmN5UmVzcG9uc2VzLnB1c2hfYmFjayhwYXJjZWxhYmxlLmZyZXF1ZW5jeVJlc3BvbnNlcyk7CisgICAgICAgIGlmIChwYXJjZWxhYmxlLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAhPSBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtQ2hhbm5lbE1hcHBpbmcgPSBwYXJjZWxhYmxlLmNoYW5uZWxNYXBwaW5nOworICAgICAgICBtU2Vuc2l0aXZpdHkgPSBwYXJjZWxhYmxlLnNlbnNpdGl2aXR5OworICAgICAgICBtTWF4U3BsID0gcGFyY2VsYWJsZS5tYXhTcGw7CisgICAgICAgIG1NaW5TcGwgPSBwYXJjZWxhYmxlLm1pblNwbDsKKyAgICAgICAgbURpcmVjdGlvbmFsaXR5ID0gcGFyY2VsYWJsZS5kaXJlY3Rpb25hbGl0eTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIFN0cmluZzE2IGdldERldmljZUlkKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUlkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURldmljZUlkOwogICAgIH0KIApAQCAtMTU0LDcgKzE0Miw3IEBACiAgICAgICAgIHJldHVybiBtVHlwZTsKICAgICB9CiAKLSAgICBTdHJpbmcxNiBnZXRBZGRyZXNzKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGdldEFkZHJlc3MoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQWRkcmVzczsKICAgICB9CiAKQEAgLTE3MCwxOSArMTU4LDE5IEBACiAgICAgICAgIHJldHVybiBtSW5kZXhJblRoZUdyb3VwOwogICAgIH0KIAotICAgIGNvbnN0IFZlY3RvcjxmbG9hdD4mIGdldEdlb21ldHJpY0xvY2F0aW9uKCkgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgZ2V0R2VvbWV0cmljTG9jYXRpb24oKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtR2VvbWV0cmljTG9jYXRpb247CiAgICAgfQogCi0gICAgY29uc3QgVmVjdG9yPGZsb2F0PiYgZ2V0T3JpZW50YXRpb24oKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBnZXRPcmllbnRhdGlvbigpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1PcmllbnRhdGlvbjsKICAgICB9CiAKLSAgICBjb25zdCBWZWN0b3I8VmVjdG9yPGZsb2F0Pj4mIGdldEZyZXF1ZW5jeVJlc3BvbnNlcygpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxmbG9hdD4+JiBnZXRGcmVxdWVuY3lSZXNwb25zZXMoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRnJlcXVlbmN5UmVzcG9uc2VzOwogICAgIH0KIAotICAgIGNvbnN0IFZlY3RvcjxpbnQ+JiBnZXRDaGFubmVsTWFwcGluZygpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBnZXRDaGFubmVsTWFwcGluZygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFwcGluZzsKICAgICB9CiAKQEAgLTIwMyw0NiArMTkxLDM4IEBACiAgICAgfQogCiBwcml2YXRlOgotICAgIHN0YXR1c190IHJlYWRGbG9hdFZlY3RvcigKLSAgICAgICAgICAgIGNvbnN0IFBhcmNlbCogcGFyY2VsLCBWZWN0b3I8ZmxvYXQ+ICp2ZWN0b3JQdHIsIHNpemVfdCBkZWZhdWx0TGVuZ3RoKSB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxmbG9hdD4+IHY7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHBhcmNlbC0+cmVhZEZsb2F0VmVjdG9yKCZ2KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgdmVjdG9yUHRyLT5jbGVhcigpOwotICAgICAgICBpZiAodi5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiAqdikgewotICAgICAgICAgICAgICAgIHZlY3RvclB0ci0+cHVzaF9iYWNrKGl0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVjdG9yUHRyLT5yZXNpemUoZGVmYXVsdExlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBzdGF0dXNfdCB3cml0ZUZsb2F0VmVjdG9yKFBhcmNlbCogcGFyY2VsLCBjb25zdCBWZWN0b3I8ZmxvYXQ+JiB2ZWN0b3IpIGNvbnN0IHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHY7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICB2LnB1c2hfYmFjayh2ZWN0b3JbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJjZWwtPndyaXRlRmxvYXRWZWN0b3Iodik7Ci0gICAgfQotCi0gICAgU3RyaW5nMTYgbURldmljZUlkOworICAgIHN0ZDo6c3RyaW5nIG1EZXZpY2VJZDsKICAgICBpbnQzMl90IG1Qb3J0SWQ7CiAgICAgdWludDMyX3QgbVR5cGU7Ci0gICAgU3RyaW5nMTYgbUFkZHJlc3M7CisgICAgc3RkOjpzdHJpbmcgbUFkZHJlc3M7CiAgICAgaW50MzJfdCBtRGV2aWNlTG9jYXRpb247CiAgICAgaW50MzJfdCBtRGV2aWNlR3JvdXA7CiAgICAgaW50MzJfdCBtSW5kZXhJblRoZUdyb3VwOwotICAgIFZlY3RvcjxmbG9hdD4gbUdlb21ldHJpY0xvY2F0aW9uOwotICAgIFZlY3RvcjxmbG9hdD4gbU9yaWVudGF0aW9uOwotICAgIFZlY3RvcjxWZWN0b3I8ZmxvYXQ+PiBtRnJlcXVlbmN5UmVzcG9uc2VzOwotICAgIFZlY3RvcjxpbnQ+IG1DaGFubmVsTWFwcGluZzsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbUdlb21ldHJpY0xvY2F0aW9uOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtT3JpZW50YXRpb247CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZmxvYXQ+PiBtRnJlcXVlbmN5UmVzcG9uc2VzOworICAgIHN0ZDo6dmVjdG9yPGludD4gbUNoYW5uZWxNYXBwaW5nOwogICAgIGZsb2F0IG1TZW5zaXRpdml0eTsKICAgICBmbG9hdCBtTWF4U3BsOwogICAgIGZsb2F0IG1NaW5TcGw7CiAgICAgaW50MzJfdCBtRGlyZWN0aW9uYWxpdHk7CiB9OwogCisvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KK2lubGluZSBDb252ZXJzaW9uUmVzdWx0PE1pY3JvcGhvbmVJbmZvPgorYWlkbDJsZWdhY3lfTWljcm9waG9uZUluZm8oY29uc3QgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YSYgYWlkbCkgeworICAgIE1pY3JvcGhvbmVJbmZvIGxlZ2FjeTsKKyAgICBSRVRVUk5fSUZfRVJST1IobGVnYWN5LnJlYWRGcm9tUGFyY2VsYWJsZShhaWRsKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworaW5saW5lIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YT4KK2xlZ2FjeTJhaWRsX01pY3JvcGhvbmVJbmZvKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6TWljcm9waG9uZUluZm9EYXRhIGFpZGw7CisgICAgUkVUVVJOX0lGX0VSUk9SKGxlZ2FjeS53cml0ZVRvUGFyY2VsYWJsZSgmYWlkbCkpOworICAgIHJldHVybiBhaWRsOworfQorCiB9IC8vIG5hbWVzcGFjZSBtZWRpYQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01tYXBTdHJlYW1JbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oCmluZGV4IGIzYmYxNmQuLjYxZGU5ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCisjaW5jbHVkZSA8dGltZS5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1tYXBTdHJlYW1DYWxsYmFjazsKQEAgLTEwMyw2ICsxMDUsMTkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgorICAgICAqIEdldCBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQvcmVjZWl2ZWQgdG8vZnJvbSBhbgorICAgICAqIGV4dGVybmFsIG9ic2VydmVyLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gcG9zaXRpb24gY291bnQgb2YgcHJlc2VudGVkIGF1ZGlvIGZyYW1lcworICAgICAqIFxwYXJhbVtvdXRdIHRpbWVOYW5vcyBhc3NvY2lhdGVkIGNsb2NrIHRpbWUKKyAgICAgKgorICAgICAqIFxyZXR1cm4gT0sgaWYgdGhlIGV4dGVybmFsIHBvc2l0aW9uIGlzIHNldCBjb3JyZWN0bHkuCisgICAgICogICAgICAgICBOT19JTklUIGluIGNhc2Ugb2YgaW5pdGlhbGl6YXRpb24gZXJyb3IKKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFeHRlcm5hbFBvc2l0aW9uKHVpbnQ2NF90KiBwb3NpdGlvbiwgaW50NjRfdCogdGltZU5hbm9zKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgogICAgICAqIGNyZWF0ZU1tYXBCdWZmZXIoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBzdGFydCgpCiAgICAgICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmggYi9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oCmluZGV4IGZlNTE5YmIuLmY4ZWFkMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9Wb2x1bWVTaGFwZXIuaApAQCAtMjIsNiArMjIsMTEgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3N0cmVhbT4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSW50ZXJwb2xhdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KQEAgLTI4NCwzMCArMjg5LDM4IEBACiAgICAgICAgICAgICBjbGFtcFZvbHVtZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVGhlIHBhcmNlbCBsYXlvdXQgbXVzdCBtYXRjaCBWb2x1bWVTaGFwZXIuamF2YQogICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KW1UeXBlKQotICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPndyaXRlSW50MzIobUlkKQotICAgICAgICAgICAgICAgICAgICA/OiBtVHlwZSA9PSBUWVBFX0lECi0gICAgICAgICAgICAgICAgICAgICAgICA/IE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCltT3B0aW9uRmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZURvdWJsZShtRHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/OiBJbnRlcnBvbGF0b3I8UywgVD46OndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgICAgIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24gcGFyY2VsYWJsZTsKKyAgICAgICAgICAgIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBpbnQzMl90IHR5cGUsIG9wdGlvbkZsYWdzOwotICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC0+cmVhZEludDMyKCZ0eXBlKQotICAgICAgICAgICAgICAgICAgICA/OiBzZXRUeXBlKChUeXBlKXR5cGUpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZEludDMyKCZtSWQpCi0gICAgICAgICAgICAgICAgICAgID86IG1UeXBlID09IFRZUEVfSUQKLSAgICAgICAgICAgICAgICAgICAgICAgID8gTk9fRVJST1IKLSAgICAgICAgICAgICAgICAgICAgICAgIDogcGFyY2VsLT5yZWFkSW50MzIoJm9wdGlvbkZsYWdzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IHNldE9wdGlvbkZsYWdzKChPcHRpb25GbGFnKW9wdGlvbkZsYWdzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZERvdWJsZSgmbUR1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogSW50ZXJwb2xhdG9yPFMsIFQ+OjpyZWFkRnJvbVBhcmNlbCgqcGFyY2VsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IGNoZWNrQ3VydmUoKTsKKyAgICAgICAgdm9pZCB3cml0ZVRvUGFyY2VsYWJsZShWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uICpwYXJjZWxhYmxlKSBjb25zdCB7CisgICAgICAgICAgICBwYXJjZWxhYmxlLT5pZCA9IGdldElkKCk7CisgICAgICAgICAgICBwYXJjZWxhYmxlLT50eXBlID0gZ2V0VHlwZUFzQWlkbCgpOworICAgICAgICAgICAgcGFyY2VsYWJsZS0+b3B0aW9uRmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKG1UeXBlICE9IFRZUEVfSUQpIHsKKyAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLT5vcHRpb25GbGFncyA9IGdldE9wdGlvbkZsYWdzQXNBaWRsKCk7CisgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS0+ZHVyYXRpb25NcyA9IGdldER1cmF0aW9uTXMoKTsKKyAgICAgICAgICAgICAgICBJbnRlcnBvbGF0b3I8UywgVD46OndyaXRlVG9Db25maWcoJnBhcmNlbGFibGUtPmludGVycG9sYXRvckNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiBkYXRhOworICAgICAgICAgICAgcmV0dXJuIGRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICAgICAgICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uJiBwYXJjZWxhYmxlKSB7CisgICAgICAgICAgICBzZXRJZChwYXJjZWxhYmxlLmlkKTsKKyAgICAgICAgICAgIHJldHVybiBzZXRUeXBlRnJvbUFpZGwocGFyY2VsYWJsZS50eXBlKQorICAgICAgICAgICAgICAgICAgID86IG1UeXBlID09IFRZUEVfSUQKKyAgICAgICAgICAgICAgICAgICAgICA/IE5PX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICAgOiBzZXRPcHRpb25GbGFnc0Zyb21BaWRsKHBhcmNlbGFibGUub3B0aW9uRmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICA/OiBzZXREdXJhdGlvbk1zKHBhcmNlbGFibGUuZHVyYXRpb25NcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID86IEludGVycG9sYXRvcjxTLCBUPjo6cmVhZEZyb21Db25maWcocGFyY2VsYWJsZS5pbnRlcnBvbGF0b3JDb25maWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/OiBjaGVja0N1cnZlKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBSZXR1cm5zIGEgc3RyaW5nIGZvciBkZWJ1ZyBwcmludGluZy4KQEAgLTMyOSw2ICszNDIsNTEgQEAKICAgICAgICAgaW50MzJfdCBtSWQ7ICAgICAgICAgICAgIC8vIEEgdmFsaWQgaWQgaXMgPj0gMC4KICAgICAgICAgT3B0aW9uRmxhZyBtT3B0aW9uRmxhZ3M7IC8vIG9wdGlvbiBmbGFncyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgIGRvdWJsZSBtRHVyYXRpb25NczsgICAgICAvLyBkdXJhdGlvbiwgbXVzdCBiZSA+IDA7IGRlZmF1bHQgaXMgMTAwMCBtcy4KKworICAgICAgICBpbnQzMl90IGdldE9wdGlvbkZsYWdzQXNBaWRsKCkgY29uc3QgeworICAgICAgICAgICAgaW50MzJfdCByZXN1bHQgPSAwOworICAgICAgICAgICAgaWYgKGdldE9wdGlvbkZsYWdzKCkgJiBPUFRJT05fRkxBR19WT0xVTUVfSU5fREJGUykgeworICAgICAgICAgICAgICAgIHJlc3VsdCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnOjpWT0xVTUVfSU5fREJGUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0T3B0aW9uRmxhZ3MoKSAmIE9QVElPTl9GTEFHX0NMT0NLX1RJTUUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnOjpDTE9DS19USU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzZXRPcHRpb25GbGFnc0Zyb21BaWRsKGludDMyX3QgYWlkbCkgeworICAgICAgICAgICAgc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxPcHRpb25GbGFnPiBvcHRpb25zID0gMDsKKyAgICAgICAgICAgIGlmIChhaWRsICYgKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT3B0aW9uRmxhZzo6Vk9MVU1FX0lOX0RCRlMpKSkgeworICAgICAgICAgICAgICAgIG9wdGlvbnMgfD0gT1BUSU9OX0ZMQUdfVk9MVU1FX0lOX0RCRlM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWlkbCAmICgxIDw8IHN0YXRpY19jYXN0PGludD4oVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWc6OkNMT0NLX1RJTUUpKSkgeworICAgICAgICAgICAgICAgIG9wdGlvbnMgfD0gT1BUSU9OX0ZMQUdfQ0xPQ0tfVElNRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXRPcHRpb25GbGFncyhzdGF0aWNfY2FzdDxPcHRpb25GbGFnPihvcHRpb25zKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzZXRUeXBlRnJvbUFpZGwoVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUgYWlkbCkgeworICAgICAgICAgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uVHlwZTo6SUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRUeXBlKFRZUEVfSUQpOworICAgICAgICAgICAgICAgIGNhc2UgVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGU6OlNDQUxFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VHlwZShUWVBFX1NDQUxFKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUgZ2V0VHlwZUFzQWlkbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCAoZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGU6OklEOworICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9TQ0FMRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlOjpTQ0FMRTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH07IC8vIENvbmZpZ3VyYXRpb24KIAogICAgIC8qIFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uIGV4cHJlc3NlcyBhbiBvcGVyYXRpb24gdG8gcGVyZm9ybSBvbiB0aGUKQEAgLTQyMCwxOSArNDc4LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIHJldHVybiBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpbUZsYWdzKQotICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPndyaXRlSW50MzIobVJlcGxhY2VJZCkKLSAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZUZsb2F0KG1YT2Zmc2V0KTsKKyAgICAgICAgICAgIFZvbHVtZVNoYXBlck9wZXJhdGlvbiBvcDsKKyAgICAgICAgICAgIHdyaXRlVG9QYXJjZWxhYmxlKCZvcCk7CisgICAgICAgICAgICByZXR1cm4gb3Aud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLT5yZWFkSW50MzIoJmZsYWdzKQotICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPnJlYWRJbnQzMigmbVJlcGxhY2VJZCkKLSAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT5yZWFkRmxvYXQoJm1YT2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICA/OiBzZXRGbGFncygoRmxhZylmbGFncyk7CisgICAgICAgIHZvaWQgd3JpdGVUb1BhcmNlbGFibGUoVm9sdW1lU2hhcGVyT3BlcmF0aW9uKiBvcCkgY29uc3QgeworICAgICAgICAgICAgb3AtPmZsYWdzID0gZ2V0RmxhZ3NBc0FpZGwoKTsKKyAgICAgICAgICAgIG9wLT5yZXBsYWNlSWQgPSBtUmVwbGFjZUlkOworICAgICAgICAgICAgb3AtPnhPZmZzZXQgPSBtWE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZSB7CisgICAgICAgICAgICBWb2x1bWVTaGFwZXJPcGVyYXRpb24gb3A7CisgICAgICAgICAgICByZXR1cm4gb3AucmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICAgICAgICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShvcCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgVm9sdW1lU2hhcGVyT3BlcmF0aW9uJiBvcCkgeworICAgICAgICAgICAgbVJlcGxhY2VJZCA9IG9wLnJlcGxhY2VJZDsKKyAgICAgICAgICAgIG1YT2Zmc2V0ID0gb3AueE9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBzZXRGbGFnc0Zyb21BaWRsKG9wLmZsYWdzKTsKICAgICAgICAgfQogCiAgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewpAQCAtNDQ1LDYgKzUxMyw0OCBAQAogICAgICAgICB9CiAKICAgICBwcml2YXRlOgorICAgICAgICBzdGF0dXNfdCBzZXRGbGFnc0Zyb21BaWRsKGludDMyX3QgYWlkbCkgeworICAgICAgICAgICAgc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxGbGFnPiBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoYWlkbCAmICgxIDw8IHN0YXRpY19jYXN0PGludD4oVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZzo6UkVWRVJTRSkpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19SRVZFUlNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFpZGwgJiAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWc6OlRFUk1JTkFURSkpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19URVJNSU5BVEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWlkbCAmICgxIDw8IHN0YXRpY19jYXN0PGludD4oVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZzo6Sk9JTikpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19KT0lOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFpZGwgJiAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWc6OkRFTEFZKSkpIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0RFTEFZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFpZGwgJiAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWc6OkNSRUFURV9JRl9ORUNFU1NBUlkpKSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQ1JFQVRFX0lGX05FQ0VTU0FSWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXRGbGFncyhzdGF0aWNfY2FzdDxGbGFnPihmbGFncykpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBnZXRGbGFnc0FzQWlkbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIGludDMyX3QgYWlkbCA9IDA7CisgICAgICAgICAgICBzdGQ6OnVuZGVybHlpbmdfdHlwZV90PEZsYWc+IGZsYWdzID0gZ2V0RmxhZ3MoKTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdfUkVWRVJTRSkgeworICAgICAgICAgICAgICAgIGFpZGwgfD0gKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnOjpSRVZFUlNFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX1RFUk1JTkFURSkgeworICAgICAgICAgICAgICAgIGFpZGwgfD0gKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnOjpURVJNSU5BVEUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdfSk9JTikgeworICAgICAgICAgICAgICAgIGFpZGwgfD0gKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnOjpKT0lOKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX0RFTEFZKSB7CisgICAgICAgICAgICAgICAgYWlkbCB8PSAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWc6OkRFTEFZKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX0NSRUFURV9JRl9ORUNFU1NBUlkpIHsKKyAgICAgICAgICAgICAgICBhaWRsIHw9ICgxIDw8IHN0YXRpY19jYXN0PGludD4oVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZzo6Q1JFQVRFX0lGX05FQ0VTU0FSWSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFpZGw7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CiAgICAgICAgIEZsYWcgbUZsYWdzOyAgICAgICAgLy8gb3BlcmF0aW9uIHRvIGRvCiAgICAgICAgIGludDMyX3QgbVJlcGxhY2VJZDsgLy8gaWYgPj0gMCB0aGUgaWQgdG8gcmVtb3ZlIGluIGEgcmVwbGFjZSBvcGVyYXRpb24uCiAgICAgICAgIFMgbVhPZmZzZXQ7ICAgICAgICAgLy8gcG9zaXRpb24gaW4gdGhlIGN1cnZlIHRvIHNldCBpZiBhIHZhbGlkIG51bWJlciAobm90IG5hbikKQEAgLTQ4MywxNSArNTkzLDI4IEBACiAgICAgICAgICAgICBtWE9mZnNldCA9IHhPZmZzZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIHJldHVybiBwYXJjZWwtPndyaXRlRmxvYXQobVZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZUZsb2F0KG1YT2Zmc2V0KTsKKyAgICAgICAgICAgIFZvbHVtZVNoYXBlclN0YXRlIHN0YXRlOworICAgICAgICAgICAgd3JpdGVUb1BhcmNlbGFibGUoJnN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIH0KIAotICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC0+cmVhZEZsb2F0KCZtVm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT5yZWFkRmxvYXQoJm1YT2Zmc2V0KTsKKyAgICAgICAgdm9pZCB3cml0ZVRvUGFyY2VsYWJsZShWb2x1bWVTaGFwZXJTdGF0ZSogcGFyY2VsYWJsZSkgY29uc3QgeworICAgICAgICAgICAgcGFyY2VsYWJsZS0+dm9sdW1lID0gbVZvbHVtZTsKKyAgICAgICAgICAgIHBhcmNlbGFibGUtPnhPZmZzZXQgPSBtWE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZSB7CisgICAgICAgICAgICBWb2x1bWVTaGFwZXJTdGF0ZSBzdGF0ZTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCisgICAgICAgICAgICAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKHN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBWb2x1bWVTaGFwZXJTdGF0ZSYgcGFyY2VsYWJsZSkgeworICAgICAgICAgICAgbVZvbHVtZSA9IHBhcmNlbGFibGUudm9sdW1lOworICAgICAgICAgICAgbVhPZmZzZXQgPSBwYXJjZWxhYmxlLnhPZmZzZXQ7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCAxYWZjMjUzLi4zZTE5NGYwIDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC04LDEzICs4LDE0IEBACiBodW5nYUBnb29nbGUuY29tCiBqaWFiaW5AZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCi1rcm9jYXJkQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KIG1hcmNvbmVAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorbmNoYWxrb0Bnb29nbGUuY29tCiBwYXdpbkBnb29nbGUuY29tCiBwaGlsYnVya0Bnb29nbGUuY29tCiBwbWNsZWFuQGdvb2dsZS5jb20KK3F1eGlhbmdmYW5nQGdvb2dsZS5jb20KIHJhY2hhZEBnb29nbGUuY29tCiByYWdvQGdvb2dsZS5jb20KIHJvYmVydHNoaWhAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvVEVTVF9NQVBQSU5HIGIvbWVkaWEvVEVTVF9NQVBQSU5HCmluZGV4IGE2ZGZiMjEuLjUwZmFjZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9URVNUX01BUFBJTkcKQEAgLTEsMzIgKzEsNjMgQEAKKy8vIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhCiB7Ci0gICJwcmVzdWJtaXQiOiBbCi0gICAgewotICAgICAgIm5hbWUiOiAiR3RzTWVkaWFUZXN0Q2FzZXMiLAotICAgICAgIm9wdGlvbnMiIDogWworICAgICJwcmVzdWJtaXQiOiBbCisgICAgICAgIC8vIHJ1bnMgd2hlbmV2ZXIgd2UgY2hhbmdlIHNvbWV0aGluZyBpbiB0aGlzIHRyZWUKICAgICAgICAgewotICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICAgICAgICJvcHRpb25zIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkVuY29kZURlY29kZVRlc3QiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXQogICAgICAgICB9LAogICAgICAgICB7Ci0gICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVHZW5lcmljT3BzVGVzdHMiCi0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogIkd0c0V4b1BsYXllclRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyIgOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Tb2NQcmVzdWJtaXQiCisgICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5EZWNvZGVFZGl0RW5jb2RlVGVzdCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLmV4b3BsYXllci5ndHMuRGFzaFRlc3QjdGVzdFdpZGV2aW5lMjNGcHNIMjY0Rml4ZWQiCisgICAgICAgICAgICAibmFtZSI6ICJHdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJjb20uZ29vZ2xlLmFuZHJvaWQubWVkaWEuZ3RzLldpZGV2aW5lR2VuZXJpY09wc1Rlc3RzIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLm1lZGlhLmd0cy5XaWRldmluZVlvdVR1YmVQZXJmb3JtYW5jZVRlc3RzIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0KICAgICAgICAgfQotICAgICAgXQotICAgIH0KLSAgXSwKLSAgImltcG9ydHMiOiBbCi0gICAgewotICAgICAgInBhdGgiOiAiZnJhbWV3b3Jrcy9hdi9kcm0vbWVkaWFkcm0vcGx1Z2lucyIKLSAgICB9Ci0gIF0KLX0KKyAgICBdLAogCisgICAgImltcG9ydHMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJwYXRoIjogImZyYW1ld29ya3MvYXYvZHJtL21lZGlhZHJtL3BsdWdpbnMiCisgICAgICAgIH0KKyAgICBdLAorCisgICAgInBsYXRpbnVtLXBvc3RzdWJtaXQiOiBbCisgICAgICAgIC8vIHJ1bnMgcmVndWxhcmx5LCBpbmRlcGVuZGVudCBvZiBjaGFuZ2VzIGluIHRoaXMgdHJlZS4KKyAgICAgICAgLy8gc2lnbmFscyBpZiBjaGFuZ2VzIGVsc2V3aGVyZSBicmVhayBtZWRpYSBmdW5jdGlvbmFsaXR5CisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICAgICAgICJvcHRpb25zIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkVuY29kZURlY29kZVRlc3QiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5EZWNvZGVFZGl0RW5jb2RlVGVzdCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdCisgICAgICAgIH0KKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLmJwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNjODFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU4IEBACitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhdWRpb3NlcnZlciIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtYWluX2F1ZGlvc2VydmVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpb3NlcnZpY2UiLAorICAgICAgICAibGliYXVkaW9mbGluZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5c2VydmljZSIsCisgICAgICAgICJsaWJhdWRpb3Byb2Nlc3NpbmciLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFsb2dzZXJ2aWNlIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibmJhaW8iLAorICAgICAgICAibGlibmJsb2ciLAorICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKKworICAgIF0sCisKKyAgICAvLyBUT0RPIGNoZWNrIGlmIHdlIHN0aWxsIG5lZWQgYWxsIG9mIHRoZXNlIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL3NvbmljIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIiwKKworICAgICAgICAvLyBUT0RPIG9ib2VzZXJ2aWNlIGlzIHRoZSBvbGQgZm9sZGVyIG5hbWUgZm9yIGFhdWRpb3NlcnZpY2UuIEl0IHdpbGwgYmUgY2hhbmdlZC4KKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvb2JvZXNlcnZpY2UiLAorICAgIF0sCisKKyAgICBpbml0X3JjOiBbImF1ZGlvc2VydmVyLnJjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxYzE0Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCW1haW5fYXVkaW9zZXJ2ZXIuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliYWF1ZGlvc2VydmljZSBcCi0JbGliYXVkaW9mbGluZ2VyIFwKLQlsaWJhdWRpb3BvbGljeXNlcnZpY2UgXAotCWxpYmF1ZGlvcHJvY2Vzc2luZyBcCi0JbGliYmluZGVyIFwKLQlsaWJjdXRpbHMgXAotCWxpYmxvZyBcCi0JbGliaGlkbGJhc2UgXAotCWxpYm1lZGlhIFwKLQlsaWJtZWRpYWxvZ3NlcnZpY2UgXAotCWxpYm1lZGlhdXRpbHMgXAotCWxpYm5iYWlvIFwKLQlsaWJuYmxvZyBcCi0JbGlidXRpbHMgXAotCWxpYnZpYnJhdG9yCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotCWxpYmF1ZGlvaGFsX2hlYWRlcnMgXAotCWxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotIyBUT0RPIG9ib2VzZXJ2aWNlIGlzIHRoZSBvbGQgZm9sZGVyIG5hbWUgZm9yIGFhdWRpb3NlcnZpY2UuIEl0IHdpbGwgYmUgY2hhbmdlZC4KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLQlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKLQlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZSBcCi0JZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0JZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLQlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UgXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFsb2cgXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvb2JvZXNlcnZpY2UgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvaW5jbHVkZSBcCi0JZXh0ZXJuYWwvc29uaWMgXAotCi1MT0NBTF9NT0RVTEUgOj0gYXVkaW9zZXJ2ZXIKLQotTE9DQUxfSU5JVF9SQyA6PSBhdWRpb3NlcnZlci5yYwotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKaW5kZXggZjA1YzJkMi4uYzRhNjYwMSAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKQEAgLTYsOCArNiwxMiBAQAogICAgIGNhcGFiaWxpdGllcyBCTE9DS19TVVNQRU5ECiAgICAgaW9wcmlvIHJ0IDQKICAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2ggSGlnaFBlcmZvcm1hbmNlCi0KLSAgICBvbnJlc3RhcnQgc2V0cHJvcCBzeXMuYXVkaW8ucmVzdGFydC5oYWwgMQorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTQtMC1tc2QKKyAgICBvbnJlc3RhcnQgcmVzdGFydCBhdWRpb19wcm94eV9zZXJ2aWNlCisgICAgIyBLZWVwIHRoZSBvcmlnaW5hbCBzZXJ2aWNlIG5hbWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKKyAgICBvbnJlc3RhcnQgcmVzdGFydCBhdWRpby1oYWwtMi0wCiAKIG9uIHByb3BlcnR5OnZ0cy5uYXRpdmVfc2VydmVyLm9uPTEKICAgICBzdG9wIGF1ZGlvc2VydmVyCkBAIC0xNyw2ICsyMSw3IEBACiBvbiBwcm9wZXJ0eTppbml0LnN2Yy5hdWRpb3NlcnZlcj1zdG9wcGVkCiAgICAgc3RvcCB2ZW5kb3IuYXVkaW8taGFsCiAgICAgc3RvcCB2ZW5kb3IuYXVkaW8taGFsLTQtMC1tc2QKKyAgICBzdG9wIGF1ZGlvX3Byb3h5X3NlcnZpY2UKICAgICAjIEtlZXAgdGhlIG9yaWdpbmFsIHNlcnZpY2UgbmFtZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICBzdG9wIHZlbmRvci5hdWRpby1oYWwtMi0wCiAgICAgc3RvcCBhdWRpby1oYWwtMi0wCkBAIC0yNSw2ICszMCw3IEBACiAgICAgIyBhdWRpb3NlcnZlciBicmluZ2luZyBpdCBiYWNrIGludG8gcnVubmluZyBzdGF0ZS4KICAgICBzdGFydCB2ZW5kb3IuYXVkaW8taGFsCiAgICAgc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC00LTAtbXNkCisgICAgc3RhcnQgYXVkaW9fcHJveHlfc2VydmljZQogICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgIHN0YXJ0IHZlbmRvci5hdWRpby1oYWwtMi0wCiAgICAgc3RhcnQgYXVkaW8taGFsLTItMApAQCAtMzIsMTYgKzM4LDI0IEBACiBvbiBwcm9wZXJ0eTppbml0LnN2Yy5hdWRpb3NlcnZlcj1ydW5uaW5nCiAgICAgc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbAogICAgIHN0YXJ0IHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAorICAgIHN0YXJ0IGF1ZGlvX3Byb3h5X3NlcnZpY2UKICAgICAjIEtlZXAgdGhlIG9yaWdpbmFsIHNlcnZpY2UgbmFtZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICBzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAogICAgIHN0YXJ0IGF1ZGlvLWhhbC0yLTAKIAogb24gcHJvcGVydHk6c3lzLmF1ZGlvLnJlc3RhcnQuaGFsPTEKLSAgICByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwKLSAgICByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAorICAgICMgU2VlIGIvMTU5OTY2MjQzLiBBdm9pZCByZXN0YXJ0IGxvb3AgYmV0d2VlbiBhdWRpb3NlcnZlciBhbmQgSEFMLgogICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgIHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKLSAgICByZXN0YXJ0IGF1ZGlvLWhhbC0yLTAKKyAgICBzdG9wIHZlbmRvci5hdWRpby1oYWwKKyAgICBzdG9wIHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAorICAgIHN0b3AgYXVkaW9fcHJveHlfc2VydmljZQorICAgIHN0b3AgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKKyAgICBzdG9wIGF1ZGlvLWhhbC0yLTAKKyAgICBzdGFydCB2ZW5kb3IuYXVkaW8taGFsCisgICAgc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC00LTAtbXNkCisgICAgc3RhcnQgYXVkaW9fcHJveHlfc2VydmljZQorICAgIHN0YXJ0IHZlbmRvci5hdWRpby1oYWwtMi0wCisgICAgc3RhcnQgYXVkaW8taGFsLTItMAogICAgICMgcmVzZXQgdGhlIHByb3BlcnR5CiAgICAgc2V0cHJvcCBzeXMuYXVkaW8ucmVzdGFydC5oYWwgMAogCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcCBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCmluZGV4IGY5ZjRmMzEuLjhlZTFlZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCkBAIC0yOSw4ICsyOSw4IEBACiAjaW5jbHVkZSA8bWVkaWF1dGlscy9MaW1pdFByb2Nlc3NNZW1vcnkuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCi0jaW5jbHVkZSAiYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaCIKKy8vIGZyb20gaW5jbHVkZV9kaXJzCisjaW5jbHVkZSAiYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaCIgLy8gYWF1ZGlvX3BvbGljeV90LCBBQVVESU9fUFJPUF9NTUFQX1BPTElDWSwgQUFVRElPX1BPTElDWV8qCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgpAQCAtNDksNyArNDksMTIgQEAKIAogICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKIAorI2lmIDEKKyAgICAvLyBGSVhNRSBTZWUgYnVnIDE2NTcwMjM5NCBhbmQgYnVnIDE2ODUxMTQ4NQorICAgIGNvbnN0IGJvb2wgZG9Mb2cgPSBmYWxzZTsKKyNlbHNlCiAgICAgYm9vbCBkb0xvZyA9IChib29sKSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8udGVzdF9oYXJuZXNzIiwgMCk7CisjZW5kaWYKIAogICAgIHBpZF90IGNoaWxkUGlkOwogICAgIC8vIEZJWE1FIFRoZSBhZHZhbnRhZ2Ugb2YgbWFraW5nIHRoZSBwcm9jZXNzIGNvbnRhaW5pbmcgbWVkaWEubG9nIHNlcnZpY2UgdGhlIHBhcmVudCBwcm9jZXNzIG9mCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9URVNUX01BUFBJTkcgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlNmE1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDggQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2J1ZmZlcnBvb2wvMS4wCit7CisgICJwcmVzdWJtaXQiOiBbCisKKyAgICB7ICJuYW1lIjogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRTaW5nbGVUZXN0IiB9LAorICAgIHsgIm5hbWUiOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldE11bHRpVGVzdCJ9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKaW5kZXggZWU1YTc1Ny4uNjkxZWQ0MCAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDcgQEAKIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKICAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKQEAgLTM0LDYgKzM1LDcgQEAKIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRNdWx0aVRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAogICAgIHNyY3M6IFsKICAgICAgICAgImFsbG9jYXRvci5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKaW5kZXggMTc5NjgxOS4uZDhjYzI4NSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCkBAIC0yMTUsNyArMjE1LDcgQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHNldGVudigiVFJFQkxFX1RFU1RJTkdfT1ZFUlJJREUiLCAidHJ1ZSIsIHRydWUpOworICBhbmRyb2lkOjpoYXJkd2FyZTo6ZGV0YWlsczo6c2V0VHJlYmxlVGVzdGluZ092ZXJyaWRlKHRydWUpOwogICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKICAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKaW5kZXggNjExMWZlYS4uMWQyNTYyZSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwCkBAIC0zOSw2ICszOSw4IEBACiAKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uID0gMTAyNCoxMDI0KjE1OwogICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uID0gMjU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heFVudXNlZEJ1ZmZlckNvdW50ID0gNjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1VudXNlZEJ1ZmZlckNvdW50VGFyZ2V0ID0ga01heFVudXNlZEJ1ZmZlckNvdW50IC0gMTY7CiAKICAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga0V2aWN0R3JhbnVsYXJpdHlOcyA9IDEwMDAwMDAwMDA7IC8vIDEgc2VjCiAgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtFdmljdER1cmF0aW9uTnMgPSA1MDAwMDAwMDAwOyAvLyA1IHNlY3MKQEAgLTcyNCw5ICs3MjYsMTEgQEAKIH0KIAogdm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKLSAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgIGlmIChjbGVhckNhY2hlIHx8IG1UaW1lc3RhbXBVcyA+IG1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzIHx8CisgICAgICAgICAgICBtU3RhdHMuYnVmZmVyc05vdEluVXNlKCkgPiBrTWF4VW51c2VkQnVmZmVyQ291bnQpIHsKICAgICAgICAgbUxhc3RDbGVhblVwVXMgPSBtVGltZXN0YW1wVXM7Ci0gICAgICAgIGlmIChtVGltZXN0YW1wVXMgPiBtTGFzdExvZ1VzICsga0xvZ0R1cmF0aW9uVXMpIHsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcyB8fAorICAgICAgICAgICAgICAgIG1TdGF0cy5idWZmZXJzTm90SW5Vc2UoKSA+IGtNYXhVbnVzZWRCdWZmZXJDb3VudCkgewogICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKICAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sMiAlcCA6ICV6dSglenUgc2l6ZSkgdG90YWwgYnVmZmVycyAtICIKICAgICAgICAgICAgICAgICAgICIlenUoJXp1IHNpemUpIHVzZWQgYnVmZmVycyAtICV6dS8lenUgKHJlY3ljbGUvYWxsb2MpIC0gIgpAQCAtNzM3LDggKzc0MSw5IEBACiAgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgewotICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIChtU3RhdHMubVNpemVDYWNoZWQgPCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIHx8IG1CdWZmZXJzLnNpemUoKSA8IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uKSkgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5idWZmZXJzTm90SW5Vc2UoKSA8PSBrVW51c2VkQnVmZmVyQ291bnRUYXJnZXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gfHwKKyAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLnNpemUoKSA8IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCmluZGV4IGNkMWI0ZDAuLjNkMzk5NDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCkBAIC0xOTMsNiArMTkzLDEyIEBACiAgICAgICAgICAgICAgICAgOiBtU2l6ZUNhY2hlZCgwKSwgbUJ1ZmZlcnNDYWNoZWQoMCksIG1TaXplSW5Vc2UoMCksIG1CdWZmZXJzSW5Vc2UoMCksCiAgICAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucygwKSwgbVRvdGFsUmVjeWNsZXMoMCksIG1Ub3RhbFRyYW5zZmVycygwKSwgbVRvdGFsRmV0Y2hlcygwKSB7fQogCisgICAgICAgICAgICAvLy8gIyBvZiBjdXJyZW50bHkgdW51c2VkIGJ1ZmZlcnMKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJzTm90SW5Vc2UoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobUJ1ZmZlcnNDYWNoZWQgPj0gbUJ1ZmZlcnNJblVzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1CdWZmZXJzQ2FjaGVkIC0gbUJ1ZmZlcnNJblVzZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgogICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CiAgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcAppbmRleCAzNDJmZWY2Li45MzA4YjgxIDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApAQCAtMzIsNiArMzIsOCBAQAogc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMTAwMDAwMDsgLy8gMTAwbXMKIHN0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOwogc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCitzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4Q2FjaGVkQnVmZmVyQ291bnQgPSA2NDsKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtDYWNoZWRCdWZmZXJDb3VudFRhcmdldCA9IGtNYXhDYWNoZWRCdWZmZXJDb3VudCAtIDE2OwogCiBjbGFzcyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsCiAgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gewpAQCAtMTM2LDYgKzEzOCwxMCBAQAogICAgICAgICAgICAgLS1tQWN0aXZlOwogICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOwogICAgICAgICB9CisKKyAgICAgICAgaW50IGNhY2hlZEJ1ZmZlckNvdW50KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1CdWZmZXJzLnNpemUoKSAtIG1BY3RpdmU7CisgICAgICAgIH0KICAgICB9IG1DYWNoZTsKIAogICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKQEAgLTY2OCwxMCArNjc0LDEyIEBACiAvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKIHZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CiAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKLSAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgIGlmIChub3cgPj0gbUxhc3RFdmljdENhY2hlVXMgKyBrQ2FjaGVUdGxVcyB8fAorICAgICAgICAgICAgY2xlYXJDYWNoZSB8fCBtQ2FjaGUuY2FjaGVkQnVmZmVyQ291bnQoKSA+IGtNYXhDYWNoZWRCdWZmZXJDb3VudCkgewogICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7Ci0gICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckNhY2hlIHx8IG1DYWNoZS5jYWNoZWRCdWZmZXJDb3VudCgpID4ga0NhY2hlZEJ1ZmZlckNvdW50VGFyZ2V0KSkgewogICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKICAgICAgICAgICAgICAgICArK2V2aWN0ZWQ7CiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvVEVTVF9NQVBQSU5HIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZGVlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw3IEBACisvLyBtYXBwaW5ncyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYS9idWZmZXJwb29sLzIuMAoreworICAicHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldFNpbmdsZVRlc3QifSwKKyAgICB7ICJuYW1lIjogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRNdWx0aVRlc3QifQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icAppbmRleCA4YjQ0ZjYxLi44NDkyOTM5IDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDcgQEAKIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKICAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKQEAgLTM0LDYgKzM1LDcgQEAKIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRNdWx0aVRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAogICAgIHNyY3M6IFsKICAgICAgICAgImFsbG9jYXRvci5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCmluZGV4IDY4YjY5OTIuLmI0MDgzOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKQEAgLTIxNSw3ICsyMTUsNyBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpzZXRUcmVibGVUZXN0aW5nT3ZlcnJpZGUodHJ1ZSk7CiAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWMyL1RFU1RfTUFQUElORwppbmRleCA4YWZhMWE4Li5mY2EzNDc3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2NvZGVjMi9URVNUX01BUFBJTkcKQEAgLTEsNSArMSwxMCBAQAogewogICAicHJlc3VibWl0IjogWworICAgIC8vIFRPRE8gZmFpbGluZyA0IG9mIDEzCisgICAgLy8geyAibmFtZSI6ICJjb2RlYzJfY29yZV9wYXJhbV90ZXN0In0sCisgICAgLy8gVE9ETyhiLzE1NTUxNjUyNCkKKyAgICAvLyB7ICJuYW1lIjogImNvZGVjMl92bmRrX2ludGVyZmFjZV90ZXN0In0sCisgICAgeyAibmFtZSI6ICJjb2RlYzJfdm5ka190ZXN0In0sCiAgICAgewogICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAogICAgICAgIm9wdGlvbnMiOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCmluZGV4IDllY2E1ODUuLjUwNDk1YTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTE1LDcgKzE1LDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcAppbmRleCBiZWU5NjliLi43Y2U1YzlkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgaW50IG5ld0hlYXZ5ICAgICAgICAgID0gbURlc0hlYXZ5OwogCiAgICAgaWYgKG1EYXRhVXBkYXRlKSB7Ci0gICAgICAgIC8vIHNhbml0eSBjaGVjaworICAgICAgICAvLyBWYWxpZGF0aW9uIGNoZWNrCiAgICAgICAgIGlmICgobURlc1RhcmdldCA8IE1BWF9UQVJHRVRfTEVWRUwpICYmIChtRGVzVGFyZ2V0ICE9IC0xKSl7CiAgICAgICAgICAgICBtRGVzVGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsgIC8vIGxpbWl0IHRhcmdldCBsZXZlbCB0byAtMTAgZEIgb3IgYmVsb3cKICAgICAgICAgICAgIG5ld1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7CkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlIHsgLy8gaGFuZGxlIG90aGVyIHVzZWQgZW5jb2RlciB0YXJnZXQgbGV2ZWxzCiAKLSAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjazogRFJDIHByZXNlbnRhdGlvbiBtb2RlIGlzIG9ubHkgc3BlY2lmaWVkIGZvciBtYXguIDUuMSBjaGFubmVscworICAgICAgICAgICAgLy8gVmFsaWRhdGlvbiBjaGVjazogRFJDIHByZXNlbnRhdGlvbiBtb2RlIGlzIG9ubHkgc3BlY2lmaWVkIGZvciBtYXguIDUuMSBjaGFubmVscwogICAgICAgICAgICAgaWYgKG1TdHJlYW1OckFBQ0NoYW4gPiA2KSB7CiAgICAgICAgICAgICAgICAgZHJjUHJlc01vZGUgPSAwOwogICAgICAgICAgICAgfQpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgICAgICAgICB9IC8vIHN3aXRjaCgpCiAgICAgICAgIH0gLy8gaWYgKG1FbmNvZGVyVGFyZ2V0ICA9PSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwpCiAKLSAgICAgICAgLy8gc2FuaXR5IGFnYWluCisgICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2sgYWdhaW4KICAgICAgICAgaWYgKG5ld0hlYXZ5ID09IDEpIHsKICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yPTEyNzsgLy8gbm90IHJlYWxseSBuZWVkZWQgYXMgdGhlIHNhbWUgd291bGQgYmUgZG9uZSBieSB0aGUgZGVjb2RlciBhbnl3YXkKICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKaW5kZXggY2UyNWJjOS4uYjA5YTUwNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtNDAsNyArNDAsNyBAQAogICAgIF0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1yd2JlbmMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCmluZGV4IDYxZGJkNGMuLmZjYzQ1NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2MWRlY19hb20iLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCmluZGV4IGM3MDQ2Y2IuLjliYTNiNjk3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtNTA2LDMwICs1MDYsMjggQEAKIH0KIAogc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIHVpbnQ4X3QqIGRzdFN0YXJ0ID0gZHN0OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7CiAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgIG1lbWNweShkc3RWLCBzcmNWLCB3aWR0aCAvIDIpOwogICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggLyAyKTsKICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogfQogCkBAIC01OTYsMTYgKzU5NCwxMiBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIodWludDhfdCAqZHN0LAorc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OwotICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7Ci0gICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKLSAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOwotICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CkBAIC02OTYsNyArNjkwLDkgQEAKICAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsCiAgICAgICAgICAgKGludCkqKGludDY0X3QqKWltZy0+dXNlcl9wcml2KTsKIAotICAgIHVpbnQ4X3QqIGRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIGRzdFkgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90KiBkc3RVID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCogZHN0ViA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOwogICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ldOwogICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1VdOwogICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ZdOwpAQCAtNzEwLDEzICs3MDYsMTQgQEAKICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CiAKICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9CkBAIC03MjUsNyArNzIyLDcgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CiAgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLAogICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCiAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKaW5kZXggNDAyMTQ0NC4uNmIwZTM2MyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtMTUsNyArMTUsNyBAQAogICAgIF0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdmNlbmMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKaW5kZXggZjEwODM1Zi4uMzcxMjU2NCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icApAQCAtMSw2ICsxLDYgQEAKIC8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQogLy8gdXNlIGxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIGluc3RlYWQKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAogICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTk2LDcgKzk2LDcgQEAKIH0KIAogLy8gVEVNUDogdXNlZCBieSBjaGVldHMyIHByb2plY3QgLSByZW1vdmUgd2hlbiBubyBsb25nZXIgdXNlZAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zaW1wbGVfY29tcG9uZW50IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKaW5kZXggZDYwMjVkZS4uYTE3YjA0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAKIFNpbXBsZVBsYXllcjo6U2ltcGxlUGxheWVyKCkKICAgICA6IG1MaXN0ZW5lcihuZXcgTGlzdGVuZXIodGhpcykpLAotICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IER1bW15UHJvZHVjZXJMaXN0ZW5lciksCisgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgU3R1YlByb2R1Y2VyTGlzdGVuZXIpLAogICAgICAgbUxpbmVhclBvb2xJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpLAogICAgICAgbUNvbXBvc2VyQ2xpZW50KG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQpIHsKICAgICBDSEVDS19FUShtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCmluZGV4IDQ4Y2M1MWIuLjYwM2M0MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTE0LDcgKzE0LDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2VuYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCmluZGV4IDQwOGRiN2UuLjcyOTEwYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApAQCAtMjYyLDkgKzI2MiwxMCBAQAogICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOwotICAgIGlmICh3Vmlldy5lcnJvcigpKSB7Ci0gICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKworICAgIGVyciA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCkuZXJyb3IoKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCBlcnIpOwogICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKaW5kZXggM2VkZTY4Yy4uYzM5ZGY3YiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTcsMTIgKzcsMTQgQEAKIAogICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKIAorICAgIHN0YXRpY19saWJzOiBbImNvZGVjc19nNzExZGVjIl0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1EQUxBVyIsCiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtMjAsNCArMjIsNiBAQAogICAgIF0sCiAKICAgICBzcmNzOiBbIkMyU29mdEc3MTFEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJjb2RlY3NfZzcxMWRlYyJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKaW5kZXggNGZmMDc5My4uN2Y5YzM0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgogI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+Ci0KKyNpbmNsdWRlIDxnNzExRGVjLmg+CiAjaW5jbHVkZSAiQzJTb2Z0RzcxMURlYy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yMjQsNTMgKzIyNCw2IEBACiAgICAgcmV0dXJuIEMyX09LOwogfQogCi0jaWZkZWYgQUxBVwotdm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVBTGF3KAotICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7Ci0gICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKLSAgICAgICAgaW5TaXplLS07Ci0gICAgICAgIGludDMyX3QgeCA9ICppbisrOwotCi0gICAgICAgIGludDMyX3QgaXggPSB4IF4gMHg1NTsKLSAgICAgICAgaXggJj0gMHg3ZjsKLQotICAgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OwotICAgICAgICBpbnQzMl90IG1hbnQgPSBpeCAmIDB4MGY7Ci0KLSAgICAgICAgaWYgKGlleHAgPiAwKSB7Ci0gICAgICAgICAgICBtYW50ICs9IDE2OwotICAgICAgICB9Ci0KLSAgICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKLQotICAgICAgICBpZiAoaWV4cCA+IDEpIHsKLSAgICAgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0KysgPSAoeCA+IDEyNykgPyBtYW50IDogLW1hbnQ7Ci0gICAgfQotfQotI2Vsc2UKLXZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlTUxhdygKLSAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgewotICAgIHdoaWxlIChpblNpemUgPiAwKSB7Ci0gICAgICAgIGluU2l6ZS0tOwotICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKLQotICAgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7Ci0gICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OwotICAgICAgICBpbnQzMl90IHNlZ21lbnQgPSBleHBvbmVudCArIDE7Ci0gICAgICAgIG1hbnRpc3NhICY9IDB4MGY7Ci0KLSAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OwotCi0gICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOwotCi0gICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOwotICAgIH0KLX0KLSNlbmRpZgotCiBjbGFzcyBDMlNvZnRHNzExRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgewogcHVibGljOgogICAgIEMyU29mdEc3MTFEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCmluZGV4IDIzZThmZmMuLmY5Mzg0MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCkBAIC00NSwxMiArNDUsNiBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CiAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwogCi0jaWZkZWYgQUxBVwotICAgIHZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKLSNlbHNlCi0gICAgdm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOwotI2VuZGlmCi0KICAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHNzExRGVjKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icAppbmRleCBmMzc0MDg5Li4zMmFhOThkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2MWRlY19nYXYxIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKaW5kZXggMTIwYmE3YS4uYTE5MjllNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCkBAIC00NTgsMzIgKzQ1OCwyOCBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0gIHVpbnQ4X3QgKmNvbnN0IGRzdFN0YXJ0ID0gZHN0Oworc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICB9CiAKLSAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7CiAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICB9CiAKLSAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwogICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgfQogfQogCkBAIC01NTUsMTUgKzU1MSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKLSAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwKLSAgICBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAotICAgIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCiAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0gIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKLSAgc2l6ZV90IGRzdFlTaXplID0gZHN0WVN0cmlkZSAqIGhlaWdodDsKLSAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKLSAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKLSAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CiAKICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewpAQCAtNjY3LDEwICs2NTksMTMgQEAKICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLCBibG9jay0+d2lkdGgoKSwKICAgICAgICAgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsIChpbnQpYnVmZmVyLT51c2VyX3ByaXZhdGVfZGF0YSk7CiAKLSAgdWludDhfdCAqZHN0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICB1aW50OF90ICpkc3RZID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICB1aW50OF90ICpkc3RVID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICB1aW50OF90ICpkc3RWID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOwogICBzaXplX3Qgc3JjWVN0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlWzBdOwogICBzaXplX3Qgc3JjVVN0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlWzFdOwogICBzaXplX3Qgc3JjVlN0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlWzJdOworCiAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHdWaWV3LmxheW91dCgpOwogICBzaXplX3QgZHN0WVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOwpAQCAtNjgyLDIwICs2NzcsMjQgQEAKIAogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKLSAgICAgICAgICAodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwKKyAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsCiAgICAgICAgICAgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgfQogICB9IGVsc2UgewogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMF07CiAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVsxXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzJdOwotICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNWU3RyaWRlLCBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZShkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgfQogICBmaW5pc2hXb3JrKGJ1ZmZlci0+dXNlcl9wcml2YXRlX2RhdGEsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOwogICBibG9jayA9IG51bGxwdHI7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCmluZGV4IDkzMzBjMDEuLjdmNTRhZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaAppbmRleCAyYjIwOWZlLi5lZGQyNzNiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCkBAIC0xOSwxMCArMTksNyBAQAogCiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAotCi1leHRlcm4gIkMiIHsKLSAgICAjaW5jbHVkZSAiZ3NtLmgiCi19CisjaW5jbHVkZSAiZ3NtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCmluZGV4IDM2OWJkNzguLjI4NTgyMTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTExLDcgKzExLDcgQEAKIAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2VuYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKaW5kZXggNjY2NjVlZC4uYjRmYjFiMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKaW5kZXggODQxZjBhOS4uNjY2ZTY5NyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCmluZGV4IDQxZTRmNDQuLjA2NzM3MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC0xNSw3ICsxNSw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC0zMSw3ICszMSw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtNDksNyArNDksNyBAQAogICAgIF0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcAppbmRleCA2MWIyODZjLi4xM2NjMGVjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtNDY0LDM0ICs0NjQsMzQgQEAKIC8qIFRPRE86IGNhbiByZW1vdmUgdGVtcG9yYXJ5IGNvcHkgYWZ0ZXIgbGlicmFyeSBzdXBwb3J0cyB3cml0aW5nIHRvIGRpc3BsYXkKICAqIGJ1ZmZlciBZLCBVIGFuZCBWIHBsYW5lIHBvaW50ZXJzIHVzaW5nIHN0cmlkZSBpbmZvLiAqLwogc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCB1aW50OF90ICpzcmMsCiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwKICAgICAgICAgdWludDMyX3QgaGVpZ2h0KSB7CiAgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CiAgICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7Ci0gICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisKICAgICBzaXplX3QgdlN0cmlkZSA9IGFsaWduKGhlaWdodCwgMTYpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgICAgICAgbWVtY3B5KGRzdFksIHNyYywgd2lkdGgpOwogICAgICAgICAgc3JjICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgICB9CisKICAgICAvKiBVIGJ1ZmZlciAqLwogICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7Ci0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFUsIHNyYywgd2lkdGggLyAyKTsKICAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQorCiAgICAgLyogViBidWZmZXIgKi8KICAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7Ci0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3RWLCBzcmMsIHdpZHRoIC8gMik7CiAgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIH0KIApAQCAtNjcyLDExICs2NzIsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclkgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJVID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyViA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKICAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOwogICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CiAgICAgICAgICh2b2lkKWNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlclksCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyWSwgb3V0cHV0QnVmZmVyVSwgb3V0cHV0QnVmZmVyViwKICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0sCiAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKaW5kZXggMGVkMTQxYi4uMzJlMmJmOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtOSw3ICs5LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbImxpYm9wdXMiXSwKIH0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZW5jIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icAppbmRleCBkYzk0NGRhLi5kNGZiOGY4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9yYXdkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCmluZGV4IGJjMWMzODAuLmZmMTE4M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAKaW5kZXggYThiNTM3Ny4uZDNiNmUzMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAKQEAgLTM1OSw2ICszNTksMTAgQEAKICAgICB9CiAgICAgbWVtY3B5KCZudW1QYWdlRnJhbWVzLCBkYXRhICsgaW5TaXplIC0gc2l6ZW9mKG51bVBhZ2VGcmFtZXMpLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOwogICAgIGluU2l6ZSAtPSBzaXplb2YobnVtUGFnZUZyYW1lcyk7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIC8vIGVtcHR5IGJ1ZmZlciwgaWdub3JlCisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKG51bVBhZ2VGcmFtZXMgPj0gMCkgewogICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VGcmFtZXM7CiAgICAgfQpAQCAtNDA5LDcgKzQxMyw3IEBACiAgICAgICAgICAgICAgICAgbVN0YXRlLCAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkpLAogICAgICAgICAgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCk7CiAgICAgICAgIGlmIChudW1GcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9wY21vdXQgcmV0dXJuZWQgJWQiLCBudW1GcmFtZXMpOworICAgICAgICAgICAgQUxPR0QoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIGZyYW1lcyIsIG51bUZyYW1lcyk7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSAwOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icAppbmRleCAzNGY1NzUzLi43MjE3OGFhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDlkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC0xNCw3ICsxNCw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTI2LDcgKzI2LDcgQEAKICAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTQzLDcgKzQzLDcgQEAKICAgICBjZmxhZ3M6IFsiLURWUDkiXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKaW5kZXggM2VlZjFlMy4uOTEyMzhlOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKQEAgLTYzMSwzMSArNjMxLDMwIEBACiB9CiAKIHN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLSAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7CiAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKICAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogCi0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwogICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgICB9CisKIH0KIAogc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCkBAIC03MjEsMTYgKzcyMCwxMiBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIodWludDhfdCAqZHN0LAorc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OwotICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7Ci0gICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKLSAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOwotICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CkBAIC04MjMsNyArODE4LDEwIEBACiAgICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwKICAgICAgICAgICAgKChjMl9jbnRyNjRfdCAqKWltZy0+dXNlcl9wcml2KS0+cGVla2xsKCkpOwogCi0gICAgdWludDhfdCAqZHN0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKmRzdFkgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqZHN0VSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICpkc3RWID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCiAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CiAgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CiAgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CkBAIC04NDIsMTggKzg0MCwxOCBAQAogICAgICAgICAgICAgY29uc3RleHByIHNpemVfdCBrSGVpZ2h0ID0gNjQ7CiAgICAgICAgICAgICBmb3IgKDsgaSA8IG1IZWlnaHQ7IGkgKz0ga0hlaWdodCkgewogICAgICAgICAgICAgICAgIHF1ZXVlLT5lbnRyaWVzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIFtkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICBbZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLCBkc3RZU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbVdpZHRoLCBoZWlnaHQgPSBzdGQ6Om1pbihtSGVpZ2h0IC0gaSwga0hlaWdodCldIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgLyAyICoga0hlaWdodDsKICAgICAgICAgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGUgLyAyICogKGtIZWlnaHQgLyAyKTsKICAgICAgICAgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGUgLyAyICogKGtIZWlnaHQgLyAyKTsKLSAgICAgICAgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZSAqIGtIZWlnaHQ7CisgICAgICAgICAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlICoga0hlaWdodDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBxdWV1ZS0+bnVtUGVuZGluZyk7CiAgICAgICAgICAgICBxdWV1ZS0+bnVtUGVuZGluZyA9IHF1ZXVlLT5lbnRyaWVzLnNpemUoKTsKQEAgLTg2Miw4ICs4NjAsOSBAQAogICAgICAgICAgICAgICAgIHF1ZXVlLndhaXRGb3JDb25kaXRpb24ocXVldWUtPmNvbmQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgfQpAQCAtODcxLDggKzg3MCwxMCBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOworCiAgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCiAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwCmluZGV4IDc3OTVjYzEuLjQ4ODlkNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfeGFhY2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCmluZGV4IGNlMWM5YWMuLmJlZWFkYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icApAQCAtNSw3ICs1LDcgQEAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCkBAIC0yMSw2ICsyMSwxMCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogeworICAgICAgICBjaGVja19hbGxfYXBpczogdHJ1ZSwKKyAgICB9LAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oCmluZGV4IDNkMzU4N2MuLmZlMzdiMDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKQEAgLTczNCw2ICs3MzQsMjIgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB0cnVlIGlmIHRoZSBoYW5kbGUgbG9va3MgdmFsaWQgZm9yIHRoaXMgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogSXQgZG9lcyBub3QgYWN0dWFsbHkgdmFsaWRhdGUgdGhhdCB0aGUgaGFuZGxlIHJlcHJlc2VudHMgYSB2YWxpZCBhbGxvY2F0aW9uIChieSB0aGlzCisgICAgICogYWxsb2NhdG9yKSwgb25seSB0aGF0IHRoZSBoYW5kbGUgY291bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IHRoaXMgYWxsb2NhdG9yLiBBcyBzdWNoLAorICAgICAqIG11bHRpcGxlIGFsbG9jYXRvcnMgbWF5IHJldHVybiB0cnVlIGZvciBsb29rc1ZhbGlkIGZvciB0aGUgc2FtZSBoYW5kbGUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciLCBNVVNUIG5vdCBhY2Nlc3Mga2VybmVsIGFuZC9vciBkZXZpY2UgZHJpdmVycywgYW5kCisgICAgICogcmV0dXJuIHdpdGhpbiAxdXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbiAocG9zc2libHkgZnJvbSBhbm90aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgY29uc3QgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgQzJBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CiB9OwpAQCAtMjE1Niw5ICsyMTcyLDEyIEBACiB9OwogCiAvKioKLSAqIEFuIGV4dGVuc2lvbiBvZiBDMkluZm8gb2JqZWN0cyB0aGF0IGNhbiBjb250YWluIGFyYml0cmFyeSBidWZmZXIgZGF0YS4KKyAqIEEgY29uc3QgbWV0YWRhdGEgb2JqZWN0IHRoYXQgY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IGJ1ZmZlciBkYXRhLgogICoKLSAqIFxub3RlIFRoaXMgb2JqZWN0IGlzIG5vdCBkZXNjcmliYWJsZSBhbmQgY29udGFpbnMgb3BhcXVlIGRhdGEuCisgKiBUaGlzIG9iamVjdCBpcyBub3QgYW4gYWN0dWFsIEMySW5mbyBhbmQgaXMgbm90IGF0dGFjaGVkIHRvIGJ1ZmZlcnMgKEMyQnVmZmVyKSwgYnV0IHJhdGhlciB0bworICogZnJhbWVzIChDMkZyYW1lRGF0YSkuIEl0IGlzIG5vdCBkZXNjcmliYWJsZSB2aWEgQzJQYXJhbURlc2NyaXB0b3IuCisgKgorICogQzJJbmZvQnVmZmVyIGlzIGEgY29uc3Qgb2JqZWN0IHRoYXQgY2FuIGJlIGFsbG9jYXRlZCBvbiBzdGFjayBhbmQgaXMgY29waWFibGUuCiAgKi8KIGNsYXNzIEMySW5mb0J1ZmZlciB7CiBwdWJsaWM6CkBAIC0yMTY3LDE0ICsyMTg2LDY1IEBACiAgICAgICoKICAgICAgKiBccmV0dXJuIHRoZSBwYXJhbWV0ZXIgaW5kZXguCiAgICAgICovCi0gICAgY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleDsgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYnVmZmVyJ3MgZGF0YS4KICAgICAgKgogICAgICAqIFxyZXR1cm4gdGhlIGJ1ZmZlcidzIGRhdGEuCiAgICAgICovCi0gICAgY29uc3QgQzJCdWZmZXJEYXRhIGRhdGEoKSBjb25zdDsKKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9CisKKyAgICAvLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgYXMgYSBnbG9iYWwgaW5mbyBidWZmZXIuCisgICAgQzJJbmZvQnVmZmVyIGFzR2xvYmFsKCkgY29uc3QgeworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IG1JbmRleDsKKyAgICAgICAgaW5kZXguY29udmVydFRvR2xvYmFsKCk7CisgICAgICAgIHJldHVybiBDMkluZm9CdWZmZXIoaW5kZXgsIG1EYXRhKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgYXMgYSBwb3J0IGluZm8gYnVmZmVyLgorICAgIEMySW5mb0J1ZmZlciBhc1BvcnQoYm9vbCBvdXRwdXQpIGNvbnN0IHsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXggPSBtSW5kZXg7CisgICAgICAgIGluZGV4LmNvbnZlcnRUb1BvcnQob3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEMySW5mb0J1ZmZlcihpbmRleCwgbURhdGEpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBhcyBhIHN0cmVhbSBpbmZvIGJ1ZmZlci4KKyAgICBDMkluZm9CdWZmZXIgYXNTdHJlYW0oYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgY29uc3QgeworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IG1JbmRleDsKKyAgICAgICAgaW5kZXguY29udmVydFRvU3RyZWFtKG91dHB1dCwgc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIEMySW5mb0J1ZmZlcihpbmRleCwgbURhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBnbG9iYWwgaW5mbyBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBsaW5lYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIGNvcmUgcGFyYW1ldGVyIGluZGV4IG9mIHRoaXMgaW5mbyBidWZmZXIuCisgICAgICogXHBhcmFtIGJsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBpbmZvIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgaW5mbyBidWZmZXIuCisgICAgICovCisgICAgc3RhdGljIEMySW5mb0J1ZmZlciBDcmVhdGVMaW5lYXJCdWZmZXIoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBnbG9iYWwgaW5mbyBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBncmFwaGljIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBjb3JlIHBhcmFtZXRlciBpbmRleCBvZiB0aGlzIGluZm8gYnVmZmVyLgorICAgICAqIFxwYXJhbSBibG9jayB0aGUgY29udGVudCBvZiB0aGUgaW5mbyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGluZm8gYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBDMkluZm9CdWZmZXIgQ3JlYXRlR3JhcGhpY0J1ZmZlcihDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKTsKKworcHJvdGVjdGVkOgorICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IEMySW5mb0J1ZmZlcihDMlBhcmFtOjpJbmRleCBpbmRleCwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKyAgICBleHBsaWNpdCBDMkluZm9CdWZmZXIoQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpOworCitwcml2YXRlOgorICAgIEMyUGFyYW06OkluZGV4IG1JbmRleDsKKyAgICBDMkJ1ZmZlckRhdGEgbURhdGE7CisgICAgZXhwbGljaXQgQzJJbmZvQnVmZmVyKEMyUGFyYW06OkluZGV4IGluZGV4LCBjb25zdCBDMkJ1ZmZlckRhdGEgJmRhdGEpOwogfTsKIAogLy8vIEB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKaW5kZXggMjliY2NkNS4uMzhmNzM4OSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaApAQCAtMjQ5LDYgKzI0OSwxMyBAQAogCiAgICAgLy8gbG93IGxhdGVuY3kgbW9kZQogICAgIGtQYXJhbUluZGV4TG93TGF0ZW5jeU1vZGUsIC8vIGJvb2wKKworICAgIC8vIHR1bm5lbGVkIGNvZGVjCisgICAga1BhcmFtSW5kZXhUdW5uZWxlZE1vZGUsIC8vIHN0cnVjdAorICAgIGtQYXJhbUluZGV4VHVubmVsSGFuZGxlLCAvLyBpbnQzMltdCisgICAga1BhcmFtSW5kZXhUdW5uZWxTeXN0ZW1UaW1lLCAvLyBpbnQ2NAorCisgICAga1BhcmFtSW5kZXhTdG9yZURtYUJ1ZlVzYWdlLCAgLy8gc3RvcmUsIHN0cnVjdAogfTsKIAogfQpAQCAtMjAzNiw2ICsyMDQzLDMzIEBACiAgICAgICAgIEMyU3RvcmVJb25Vc2FnZUluZm87CiAKIC8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBwcmVmZXJyZWQgRE1BLUJ1ZiBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gbWVtb3J5IHVzYWdlLgorICovCitzdHJ1Y3QgQzJTdG9yZURtYUJ1ZlVzYWdlU3RydWN0IHsKKyAgICBpbmxpbmUgQzJTdG9yZURtYUJ1ZlVzYWdlU3RydWN0KCkgeyBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7IH0KKworICAgIGlubGluZSBDMlN0b3JlRG1hQnVmVXNhZ2VTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgdWludDY0X3QgdXNhZ2VfLCB1aW50MzJfdCBjYXBhY2l0eV8pCisgICAgICAgIDogdXNhZ2UodXNhZ2VfKSwgY2FwYWNpdHkoY2FwYWNpdHlfKSwgYWxsb2NGbGFncygwKSB7CisgICAgICAgIG1lbXNldChoZWFwTmFtZSwgMCwgZmxleENvdW50KTsKKyAgICB9CisKKyAgICB1aW50NjRfdCB1c2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBDMk1lbW9yeVVzYWdlCisgICAgdWludDMyX3QgY2FwYWNpdHk7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2FwYWNpdHkKKyAgICBpbnQzMl90IGFsbG9jRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBpb24gYWxsb2NhdGlvbiBmbGFncworICAgIGNoYXIgaGVhcE5hbWVbXTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGRtYWJ1ZiBoZWFwIG5hbWUKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChTdG9yZURtYUJ1ZlVzYWdlLCBoZWFwTmFtZSkKKyAgICBDMkZJRUxEKHVzYWdlLCAidXNhZ2UiKQorICAgIEMyRklFTEQoY2FwYWNpdHksICJjYXBhY2l0eSIpCisgICAgQzJGSUVMRChhbGxvY0ZsYWdzLCAiYWxsb2MtZmxhZ3MiKQorICAgIEMyRklFTEQoaGVhcE5hbWUsICJoZWFwLW5hbWUiKQorfTsKKworLy8gc3RvcmUsIHByaXZhdGUKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RvcmVEbWFCdWZVc2FnZVN0cnVjdCwga1BhcmFtSW5kZXhTdG9yZURtYUJ1ZlVzYWdlPgorICAgICAgICBDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvOworCisvKioKICAqIEZsZXhpYmxlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycwogICovCiBzdHJ1Y3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCB7CkBAIC0yMTgyLDYgKzIyMTYsNzkgQEAKIHR5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdD4gQzJQb3J0VGltZXN0YW1wR2FwVHVuaW5nOwogY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FU1RBTVBfQURKVVNUTUVOVFtdID0gImlucHV0LXN1cmZhY2UudGltZXN0YW1wLWFkanVzdG1lbnQiOwogCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRVTk5FTEVEIENPREVDID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFR1bm5lbGVkIGNvZGVjIGNvbnRyb2wuCisgKi8KK3N0cnVjdCBDMlR1bm5lbGVkTW9kZVN0cnVjdCB7CisgICAgLy8vIG1vZGUKKyAgICBlbnVtIG1vZGVfdCA6IHVpbnQzMl90OworICAgIC8vLyBzeW5jIHR5cGUKKyAgICBlbnVtIHN5bmNfdHlwZV90IDogdWludDMyX3Q7CisKKyAgICBpbmxpbmUgQzJUdW5uZWxlZE1vZGVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisKKyAgICBpbmxpbmUgQzJUdW5uZWxlZE1vZGVTdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgZmxleENvdW50LCBtb2RlX3QgbW9kZV8sIHN5bmNfdHlwZV90IHR5cGUsIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGlkKQorICAgICAgICA6IG1vZGUobW9kZV8pLCBzeW5jVHlwZSh0eXBlKSB7CisgICAgICAgIG1lbWNweSgmc3luY0lkLCAmaWRbMF0sIGMyX21pbihpZC5zaXplKCksIGZsZXhDb3VudCkgKiBGTEVYX1NJWkUpOworICAgIH0KKworICAgIGlubGluZSBDMlR1bm5lbGVkTW9kZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBtb2RlX3QgbW9kZV8sIHN5bmNfdHlwZV90IHR5cGUsIGludDMyX3QgaWQpCisgICAgICAgIDogbW9kZShtb2RlXyksIHN5bmNUeXBlKHR5cGUpIHsKKyAgICAgICAgaWYgKGZsZXhDb3VudCA+PSAxKSB7CisgICAgICAgICAgICBzeW5jSWRbMF0gPSBpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1vZGVfdCBtb2RlOyAgICAgICAgICAvLy88IHR1bm5lbGVkIG1vZGUKKyAgICBzeW5jX3R5cGVfdCBzeW5jVHlwZTsgLy8vPCB0eXBlIG9mIHN5bmMgdXNlZCBmb3IgdHVubmVsZWQgbW9kZQorICAgIGludDMyX3Qgc3luY0lkW107ICAgICAvLy88IHN5bmMgaWQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUdW5uZWxlZE1vZGUsIHN5bmNJZCkKKyAgICBDMkZJRUxEKG1vZGUsICJtb2RlIikKKyAgICBDMkZJRUxEKHN5bmNUeXBlLCAic3luYy10eXBlIikKKyAgICBDMkZJRUxEKHN5bmNJZCwgInN5bmMtaWQiKQorCit9OworCitDMkVOVU0oQzJUdW5uZWxlZE1vZGVTdHJ1Y3Q6Om1vZGVfdCwgdWludDMyX3QsCisgICAgTk9ORSwKKyAgICBTSURFQkFORCwKKyk7CisKKworQzJFTlVNKEMyVHVubmVsZWRNb2RlU3RydWN0OjpzeW5jX3R5cGVfdCwgdWludDMyX3QsCisgICAgUkVBTFRJTUUsCisgICAgQVVESU9fSFdfU1lOQywKKyAgICBIV19BVl9TWU5DLAorKTsKKworLyoqCisgKiBDb25maWd1cmUgdHVubmVsZWQgbW9kZQorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlR1bm5lbGVkTW9kZVN0cnVjdCwga1BhcmFtSW5kZXhUdW5uZWxlZE1vZGU+CisgICAgICAgIEMyUG9ydFR1bm5lbGVkTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RVTk5FTEVEX1JFTkRFUltdID0gIm91dHB1dC50dW5uZWxlZC1yZW5kZXIiOworCisvKioKKyAqIFR1bm5lbGVkIG1vZGUgaGFuZGxlLiBUaGUgbWVhbmluZyBvZiB0aGlzIGlzIGRlcGVuZHMgb24gdGhlCisgKiB0dW5uZWxlZCBtb2RlLiBJZiB0aGUgdHVubmVsZWQgbW9kZSBpcyBTSURFQkFORCwgdGhpcyBpcyB0aGUKKyAqIHNpZGViYW5kIGhhbmRsZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJJbnQzMkFycmF5LCBrUGFyYW1JbmRleFR1bm5lbEhhbmRsZT4gQzJQb3J0VHVubmVsSGFuZGxlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1RVTk5FTF9IQU5ETEVbXSA9ICJvdXRwdXQudHVubmVsLWhhbmRsZSI7CisKKy8qKgorICogVGhlIHN5c3RlbSB0aW1lIHVzaW5nIENMT0NLX01PTk9UT05JQyBpbiBuYW5vc2Vjb25kcyBhdCB0aGUgdHVubmVsIGVuZHBvaW50LgorICogRm9yIGRlY29kZXJzIHRoaXMgaXMgdGhlIHJlbmRlciB0aW1lIGZvciB0aGUgb3V0cHV0IGZyYW1lIGFuZAorICogdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWEgdGltZXN0YW1wIG9mIHRoZSBvdXRwdXQgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PGludDY0X3Q+LCBrUGFyYW1JbmRleFR1bm5lbFN5c3RlbVRpbWU+CisgICAgICAgIEMyUG9ydFR1bm5lbFN5c3RlbVRpbWU7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfUkVOREVSX1RJTUVbXSA9ICJvdXRwdXQucmVuZGVyLXRpbWUiOworCiAvLy8gQH0KIAogI2VuZGlmICAvLyBDMkNPTkZJR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmgKaW5kZXggYjBmYWQ4Zi4uZGExZjQzYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCkBAIC01NCw3ICs1NCw3IEBACiAvLy8gXG5vdGUgdGhpcyB3aWxsIGNvbnRhaW4gYW55IGluaXRpYWxpemF0aW9uLCB3aGljaCB3ZSB3aWxsIHJlbW92ZSB3aGVuIGNvbnZlcnRpbmcgdG8gbG93ZXItY2FzZQogI2RlZmluZSBfQzJfR0VUX0VOVU1fTkFNRSh4LCB5KSAjeAogLy8vIG1hcHBlciB0byBnZXQgdmFsdWUgb2YgZW51bQotI2RlZmluZSBfQzJfR0VUX0VOVU1fVkFMVUUoeCwgdHlwZSkgKF9DMkVudW1Db25zdDx0eXBlPil4CisjZGVmaW5lIF9DMl9HRVRfRU5VTV9WQUxVRSh4LCB0eXBlXykgKF9DMkVudW1Db25zdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTx0eXBlXz46OnR5cGU+KXR5cGVfOjp4CiAKIC8vLyBcZW5kY29uZAogCkBAIC0xMDYsNyArMTA2LDcgQEAKIHRlbXBsYXRlPD4gXAogQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCiAgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVzKCBcCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHsgX0MyX01BUChfQzJfR0VUX0VOVU1fVkFMVUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHsgX0MyX01BUChfQzJfR0VUX0VOVU1fVkFMVUUsIG5hbWUsIF9fVkFfQVJHU19fKSB9LCBcCiAgICAgICAgICAgICB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX05BTUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCiAgICAgICAgICAgICBwcmVmaXgpOyBcCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCmluZGV4IDUxZDQxN2EuLmU5MzhmOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCkBAIC0zMTcsNyArMzE3LDggQEAKICAgICAgICAgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKEluZGV4LCBtSW5kZXgpCiAKICAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgICAgICAgICAvLyBmb3Igc2V0U3RyZWFtLCBNYWtlU3RyZWFtSWQsIGlzVmFsaWQKKyAgICAgICAgZnJpZW5kIGNsYXNzIEMySW5mb0J1ZmZlcjsgICAgICAgLy8gZm9yIGNvbnZlcnRUbyoKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgICAgICAgICAgLy8gZm9yIHNldFN0cmVhbSwgTWFrZVN0cmVhbUlkLCBpc1ZhbGlkLCBjb252ZXJ0VG8qCiAgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCiAKICAgICAgICAgLyoqCkBAIC01MDgsNiArNTA5LDE0IEBACiAgICAgICAgIHJldHVybiBfbUluZGV4LnNldFBvcnQob3V0cHV0KTsKICAgICB9CiAKKyAgICAvLy8gc2V0cyB0aGUgc2l6ZSBvZiB0aGlzIHBhcmFtZXRlci4KKyAgICBpbmxpbmUgdm9pZCBzZXRTaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICBfbVNpemUgPSBjMl9taW4oc2l6ZSwgX21TaXplKTsKKyAgICB9CisKIHB1YmxpYzoKICAgICAvLy8gaW52YWxpZGF0ZSB0aGlzIHBhcmFtZXRlci4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkgZnJvbSB0aGlzIGNhbGw7IGUuZy4gcGFyYW1ldGVyCiAgICAgLy8vIGNhbm5vdCBiZSAnY29ycmVjdGVkJyB0byBiZSB2YWxpZC4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKaW5kZXggMGEzMzI4My4uZDU3ODgyMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKQEAgLTk3LDYgKzk3LDkgQEAKICAgICAgICAgUEFSQU1fVFlQRSA9IENvcmVJbmRleCB8IFR5cGVGbGFncwogICAgIH07CiAKKyAgICAvLyB0aGUgdW5kZXJseWluZyBwYXJhbSBzdHJ1Y3QgdHlwZQorICAgIHR5cGVkZWYgUyBTdHJ1Y3Q7CisKIHByb3RlY3RlZDoKICAgICBlbnVtIDogdWludDMyX3QgewogICAgICAgICBGTEVYX1NJWkUgPSAwLApAQCAtMjcwLDYgKzI3MywxMSBAQAogICAgICAgICB9IFwKICAgICAgICAgcmV0dXJuIDA7IFwKICAgICB9IFwKKyAgICBpbmxpbmUgdm9pZCBzZXRGbGV4Q291bnQoc2l6ZV90IGNvdW50KSB7IFwKKyAgICAgICAgaWYgKGNvdW50IDwgZmxleENvdW50KCkpIHsgXAorICAgICAgICAgICAgdGhpcy0+c2V0U2l6ZShzaXplb2YoX1R5cGUpICsgX1R5cGU6OkZMRVhfU0laRSAqIGNvdW50KTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKIAogLy8vIE1hcmsgZmxleGlibGUgbWVtYmVyIHZhcmlhYmxlIGFuZCBtYWtlIHN0cnVjdHVyZSBmbGV4aWJsZS4KICNkZWZpbmUgRkxFWChjbHMsIG0pIFwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCmluZGV4IDY5MjNmM2UuLjY3MDg0Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaApAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgLy88IGZvciBpbml0aWFsIHdvcmsgaXRlbSwgdGhlc2UgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBwYXJzZXIgLSBpZiBwcm92aWRlZAogICAgIC8vPCBmb3Igb3V0cHV0IGJ1ZmZlcnMsIHRoZXNlIGFyZSB0aGUgcmVzcG9uc2VzIHRvIHJlcXVlc3RlZEluZm9zCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAgICAgIGNvbmZpZ1VwZGF0ZTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPj4gaW5mb0J1ZmZlcnM7CisgICAgc3RkOjp2ZWN0b3I8QzJJbmZvQnVmZmVyPiBpbmZvQnVmZmVyczsKIH07CiAKIHN0cnVjdCBDMldvcmtsZXQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAKaW5kZXggYzczY2I1Mi4uMWYwYzg1NiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCkBAIC05NDMsMTQgKzk0Myw5IEBACiAKICAgICBkLT5pbmZvQnVmZmVycy5yZXNpemUocy5pbmZvQnVmZmVycy5zaXplKCkpOwogICAgIGkgPSAwOwotICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mb0J1ZmZlcj4mIHNJbmZvQnVmZmVyIDogcy5pbmZvQnVmZmVycykgeworICAgIGZvciAoY29uc3QgQzJJbmZvQnVmZmVyJiBzSW5mb0J1ZmZlciA6IHMuaW5mb0J1ZmZlcnMpIHsKICAgICAgICAgSW5mb0J1ZmZlciYgZEluZm9CdWZmZXIgPSBkLT5pbmZvQnVmZmVyc1tpKytdOwotICAgICAgICBpZiAoIXNJbmZvQnVmZmVyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJOdWxsIEMyRnJhbWVEYXRhOjppbmZvQnVmZmVyc1siCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFvYmpjcHkoJmRJbmZvQnVmZmVyLCAqc0luZm9CdWZmZXIsCisgICAgICAgIGlmICghb2JqY3B5KCZkSW5mb0J1ZmZlciwgc0luZm9CdWZmZXIsCiAgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGcmFtZURhdGE6OmluZm9CdWZmZXJzWyIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgaSAtIDEgPDwgIl0uIjsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCmluZGV4IGVjYWYzYTguLjViY2VhNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApAQCAtMTA3LDYgKzEwNywxMyBAQAogICAgICAgICBtT3V0cHV0U2l6ZSA9IDB1OwogICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOwogICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKworICAgICAgICBDMlNlY3VyZU1vZGVUdW5pbmcgc2VjdXJlTW9kZVR1bmluZ3t9OworICAgICAgICBtQ29tcG9uZW50LT5xdWVyeSh7JnNlY3VyZU1vZGVUdW5pbmd9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHNlY3VyZU1vZGVUdW5pbmcudmFsdWUgPT0gQzJDb25maWc6OlNNX1JFQURfUFJPVEVDVEVEKSB7CisgICAgICAgICAgICBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCmluZGV4IDM4NmY2ZTIuLmFiODYzNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCkBAIC00NCw2ICs0NCwxMiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgXSwKKworICAgIC8vIERldmljZSBkb2VzIG5vdCBib290IHdoZW4gZ2xvYmFsIFRoaW5MVE8gaXMgZW5hYmxlZCBmb3IgdGhpcyBsaWJyYXJ5LgorICAgIC8vIGh0dHA6Ly9iLzE3MDU5NTQyOQorICAgIGx0bzogeworICAgICAgICBuZXZlcjogdHJ1ZSwKKyAgICB9LAogfQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKaW5kZXggN2U0MzUyZC4uNDY1MDY3MiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKQEAgLTg0Myw2ICs4NDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSB0cmFuc2FjdGlvbiBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRyYW5zU3RhdHVzLmRlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKaW5kZXggYTE2YjEwNi4uMzc4MGE1YSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCkBAIC01Miw2ICs1Miw5IEBACiAgICAgLy8gZGlyZWN0bHkgaW4gdGhlIG1haW4gZGV2aWNlIG1hbmlmZXN0LnhtbCBmaWxlIG9yIHZpYSB2aW50Zl9mcmFnbWVudHMuCiAgICAgLy8gKFJlbW92ZSB0aGUgbGluZSBiZWxvdyBpZiB0aGUgZW50cnkgaXMgYWxyZWFkeSBpbiB0aGUgbWFpbiBtYW5pZmVzdC4pCiAgICAgdmludGZfZnJhZ21lbnRzOiBbIm1hbmlmZXN0X21lZGlhX2MyX1YxXzFfZGVmYXVsdC54bWwiXSwKKworICAgIC8vIFJlbW92ZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHRoaXMgbW9kdWxlLgorICAgIGVuYWJsZWQ6IGZhbHNlLAogfQogCiAvLyBzZWNjb21wIHBvbGljeSBmaWxlLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKaW5kZXggODFiZmZlYi4uM2RkYjAzOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCkBAIC0xMjIsNiArMTIyLDE4IEBACiAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXRJb25Vc2FnZSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRG1hQnVmVXNhZ2VJbmZvLCAiZG1hYnVmLXVzYWdlIikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RvcmVEbWFCdWZVc2FnZUluZm8oKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRG1hQnVmVXNhZ2VJbmZvLCB1c2FnZSkuZmxhZ3Moe0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRG1hQnVmVXNhZ2VJbmZvLCBjYXBhY2l0eSkuaW5SYW5nZSgwLCBVSU5UMzJfTUFYLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EbWFCdWZVc2FnZUluZm8sIGhlYXBOYW1lKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EbWFCdWZVc2FnZUluZm8sIGFsbG9jRmxhZ3MpLmZsYWdzKHt9KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldERtYUJ1ZlVzYWdlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIHZpcnR1YWwgfkludGVyZmFjZSgpID0gZGVmYXVsdDsKQEAgLTEzNSw3ICsxNDcsMTYgQEAKICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CiAgICAgICAgIH0KIAorICAgICAgICBzdGF0aWMgQzJSIFNldERtYUJ1ZlVzYWdlKGJvb2wgLyogbWF5QmxvY2sgKi8sIEMyUDxDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvPiAmbWUpIHsKKyAgICAgICAgICAgIC8vIFZlbmRvcidzIFRPRE86IHB1dCBhcHByb3ByaWF0ZSBtYXBwaW5nIGxvZ2ljCisgICAgICAgICAgICBzdHJuY3B5KG1lLnNldCgpLm0uaGVhcE5hbWUsICJzeXN0ZW0iLCBtZS52LmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLm0uYWxsb2NGbGFncyA9IDA7CisgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICB9CisKKwogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdG9yZUlvblVzYWdlSW5mbz4gbUlvblVzYWdlSW5mbzsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RvcmVEbWFCdWZVc2FnZUluZm8+IG1EbWFCdWZVc2FnZUluZm87CiAgICAgfTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1SZWZsZWN0b3JIZWxwZXI7CiAgICAgSW50ZXJmYWNlIG1JbnRlcmZhY2U7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCmluZGV4IGM3NTg4ZTkuLmRkMWY0ODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CiAjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CiAjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAKICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CkBAIC00NCw2ICs0NSw4IEBACiAKIG5hbWVzcGFjZSB7CiAKK2NvbnN0ZXhwciBPTVhfVTMyIGtQb3J0SW5kZXhJbnB1dCA9IDA7CisKIGNsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkge30KQEAgLTIwMCwxMSArMjAzLDI3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBEZWYgPSAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgdGhlc2UgZnJvbSBpbnRmKCkKKyAgICAgICAgICAgIGlmIChwRGVmLT5uUG9ydEluZGV4ICE9IGtQb3J0SW5kZXhJbnB1dCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0gbUNvbXAubG9jaygpOworICAgICAgICAgICAgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0IGlucHV0RGVsYXkoMCk7CisgICAgICAgICAgICBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcgcGlwZWxpbmVEZWxheSgwKTsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcC0+cXVlcnkoCisgICAgICAgICAgICAgICAgICAgIHsmaW5wdXREZWxheSwgJnBpcGVsaW5lRGVsYXl9LCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoYzJlcnIgPT0gQzJfT0sgfHwgYzJlcnIgPT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgcERlZi0+bkJ1ZmZlckNvdW50QWN0dWFsID0gNDsKKyAgICAgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgKz0gKGlucHV0RGVsYXkgPyBpbnB1dERlbGF5LnZhbHVlIDogMHUpOworICAgICAgICAgICAgICAgIHBEZWYtPm5CdWZmZXJDb3VudEFjdHVhbCArPSAocGlwZWxpbmVEZWxheSA/IHBpcGVsaW5lRGVsYXkudmFsdWUgOiAwdSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOwogICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwogICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBwRGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWU7CiAgICAgICAgICAgICBlcnIgPSBPSzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCmluZGV4IDE5NzJkM2YuLjljMWRmNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCkBAIC0yNDYsOCArMjQ2LDE5IEBACiAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3RleHByIHNpemVfdCBrTnVtU2xvdHMgPSAxNjsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU2xvdHM7ICsraSkgeworCisgICAgICAgIHNpemVfdCBudW1TbG90cyA9IDQ7CisgICAgICAgIGNvbnN0ZXhwciBPTVhfVTMyIGtQb3J0SW5kZXhJbnB1dCA9IDA7CisKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBwYXJhbTsKKyAgICAgICAgcGFyYW0ublBvcnRJbmRleCA9IGtQb3J0SW5kZXhJbnB1dDsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbU5vZGUtPmdldFBhcmFtZXRlcihPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG51bVNsb3RzID0gcGFyYW0ubkJ1ZmZlckNvdW50QWN0dWFsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TbG90czsgKytpKSB7CiAgICAgICAgICAgICBzb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKTsKICAgICAgICAgfQogCkBAIC0xMzMxLDggKzEzNDIsNiBAQAogICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyMiwgQUNUSU9OX0NPREVfRkFUQUwpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIC8vIFdlJ3JlIG5vdCBzdGFydGluZyBhZnRlciBmbHVzaC4KLSAgICAodm9pZCltU2VudENvbmZpZ0FmdGVyUmVzdW1lLnRlc3RfYW5kX3NldCgpOwogICAgIGVycjIgPSBtQ2hhbm5lbC0+c3RhcnQoaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCwgYnVmZmVyc0JvdW5kVG9Db2RlYyk7CiAgICAgaWYgKGVycjIgIT0gT0spIHsKICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKQEAgLTE1ODAsNyArMTU4OSw2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtU2VudENvbmZpZ0FmdGVyUmVzdW1lLmNsZWFyKCk7CiAgICAgewogICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CkBAIC0xNzk3LDcgKzE4MDUsNyBAQAogICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOwogICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7Ci0gICAgICAgICAgICBib29sIGNoYW5nZWQgPSAhbVNlbnRDb25maWdBZnRlclJlc3VtZS50ZXN0X2FuZF9zZXQoKTsKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgQ29uZmlnOjpXYXRjaGVyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGluaXREYXRhID0KICAgICAgICAgICAgICAgICBjb25maWctPndhdGNoPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KCk7CiAgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkKQEAgLTE4MTYsMTUgKzE4MjQsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYWxsIGluZm8gaW50byBvdXRwdXQtc3RyZWFtICMwIGRvbWFpbgogICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weUFzU3RyZWFtKCppbmZvLCB0cnVlIC8qIG91dHB1dCAqLywgc3RyZWFtKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA6IGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgeworCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGJsb2NrcyA9IGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vdyBvbmx5IGRvIHRoZSBmaXJzdCBibG9jaworICAgICAgICAgICAgICAgICAgICBpZiAoIWJsb2Nrcy5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTE9HVigiZ290IG91dHB1dCBidWZmZXIgd2l0aCBjcm9wICV1LCV1KyV1LCV1IGFuZCBzaXplICV1LCV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLmxlZnQsIGJsb2NrLmNyb3AoKS50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgPSBibG9ja3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dChzdHJlYW0sIGJsb2NrLmNyb3AoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZm9yIG5vdyBvbmx5IGRvIHRoZSBmaXJzdCBibG9jawogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOwogICAgICAgICAgICAgICAgIH0KQEAgLTE4MzYsNyArMTg0Nyw3IEBACiAgICAgICAgICAgICAgICAgLy8gY29weSBzdGFuZGFyZCBpbmZvcyB0byBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IGFscmVhZHkgcHJlc2VudCAob3RoZXJ3aXNlLCB3ZQogICAgICAgICAgICAgICAgIC8vIG1heSBvdmVyd3JpdGUgdGhlIGFjdHVhbCBpbnRlcm1lZGlhdGUgdmFsdWUgd2l0aCBhIGZpbmFsIHZhbHVlKQogICAgICAgICAgICAgICAgIHN0cmVhbSA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBzdGRHZnhJbmZvcyA9IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgQzJQYXJhbTo6SW5kZXggc3RkR2Z4SW5mb3NbXSA9IHsKICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLApAQCAtMjE2OCwxNSArMjE3OSwxNyBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQotICAgIHVpbnQ2NF90IG1pblVzYWdlID0gdXNhZ2UuZXhwZWN0ZWQ7Ci0gICAgdWludDY0X3QgbWF4VXNhZ2UgPSB+MHVsbDsKICAgICBzdGQ6OnNldDxDMkFsbG9jYXRvcjo6aWRfdD4gYWxsb2NhdG9yczsKICAgICBHZXRDb21tb25BbGxvY2F0b3JJZHMobmFtZXMsIEMyQWxsb2NhdG9yOjpMSU5FQVIsICZhbGxvY2F0b3JzKTsKICAgICBpZiAoYWxsb2NhdG9ycy5lbXB0eSgpKSB7CiAgICAgICAgICppc0NvbXBhdGlibGUgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KKworICAgIHVpbnQ2NF90IG1pblVzYWdlID0gMDsKKyAgICB1aW50NjRfdCBtYXhVc2FnZSA9IH4wdWxsOwogICAgIENhbGN1bGF0ZU1pbk1heFVzYWdlKG5hbWVzLCAmbWluVXNhZ2UsICZtYXhVc2FnZSk7CisgICAgbWluVXNhZ2UgfD0gdXNhZ2UuZXhwZWN0ZWQ7CiAgICAgKmlzQ29tcGF0aWJsZSA9ICgobWF4VXNhZ2UgJiBtaW5Vc2FnZSkgPT0gbWluVXNhZ2UpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTIyMDMsMTQgKzIyMTYsMTYgQEAKIC8vIHN0YXRpYwogc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENDb2RlYzo6RmV0Y2hMaW5lYXJCbG9jaygKICAgICAgICAgc2l6ZV90IGNhcGFjaXR5LCBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgewotICAgIHVpbnQ2NF90IG1pblVzYWdlID0gdXNhZ2UuZXhwZWN0ZWQ7Ci0gICAgdWludDY0X3QgbWF4VXNhZ2UgPSB+MHVsbDsKICAgICBzdGQ6OnNldDxDMkFsbG9jYXRvcjo6aWRfdD4gYWxsb2NhdG9yczsKICAgICBHZXRDb21tb25BbGxvY2F0b3JJZHMobmFtZXMsIEMyQWxsb2NhdG9yOjpMSU5FQVIsICZhbGxvY2F0b3JzKTsKICAgICBpZiAoYWxsb2NhdG9ycy5lbXB0eSgpKSB7CiAgICAgICAgIGFsbG9jYXRvcnMuaW5zZXJ0KEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIpOwogICAgIH0KKworICAgIHVpbnQ2NF90IG1pblVzYWdlID0gMDsKKyAgICB1aW50NjRfdCBtYXhVc2FnZSA9IH4wdWxsOwogICAgIENhbGN1bGF0ZU1pbk1heFVzYWdlKG5hbWVzLCAmbWluVXNhZ2UsICZtYXhVc2FnZSk7CisgICAgbWluVXNhZ2UgfD0gdXNhZ2UuZXhwZWN0ZWQ7CiAgICAgaWYgKChtYXhVc2FnZSAmIG1pblVzYWdlKSAhPSBtaW5Vc2FnZSkgewogICAgICAgICBhbGxvY2F0b3JzLmNsZWFyKCk7CiAgICAgICAgIGFsbG9jYXRvcnMuaW5zZXJ0KEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCmluZGV4IDA2MjZjOGQuLjNlZjQ1NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTYxOCwyNSArNjE4LDI2IEBACiB9CiAKIHZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpIHsKLSAgICBpZiAobUlucHV0TWV0RW9zIHx8IG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5waXBlbGluZUZ1bGwoKSkgeworICAgIGlmIChtSW5wdXRNZXRFb3MpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKICAgICAgICAgaWYgKCFvdXRwdXQtPmJ1ZmZlcnMgfHwKICAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPmhhc1BlbmRpbmcoKSB8fAotICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy0+bnVtQ2xpZW50QnVmZmVycygpID49IG91dHB1dC0+bnVtU2xvdHMpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPm51bUFjdGl2ZVNsb3RzKCkgPj0gb3V0cHV0LT5udW1TbG90cykgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIHNpemVfdCBudW1JbnB1dFNsb3RzID0gbUlucHV0LmxvY2soKS0+bnVtU2xvdHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICBzaXplX3QgbnVtQWN0aXZlU2xvdHMgPSAwOworICAgIHdoaWxlICghbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPnBpcGVsaW5lRnVsbCgpKSB7CiAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGluQnVmZmVyOwogICAgICAgICBzaXplX3QgaW5kZXg7CiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKLSAgICAgICAgICAgIGlmIChpbnB1dC0+YnVmZmVycy0+bnVtQ2xpZW50QnVmZmVycygpID49IGlucHV0LT5udW1TbG90cykgewotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG51bUFjdGl2ZVNsb3RzID0gaW5wdXQtPmJ1ZmZlcnMtPm51bUFjdGl2ZVNsb3RzKCk7CisgICAgICAgICAgICBpZiAobnVtQWN0aXZlU2xvdHMgPj0gaW5wdXQtPm51bVNsb3RzKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWlucHV0LT5idWZmZXJzLT5yZXF1ZXN0TmV3QnVmZmVyKCZpbmRleCwgJmluQnVmZmVyKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG5vIG5ldyBidWZmZXIgYXZhaWxhYmxlIiwgbU5hbWUpOwpAQCAtNjQ2LDYgKzY0Nyw3IEBACiAgICAgICAgIEFMT0dWKCJbJXNdIG5ldyBpbnB1dCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBpbkJ1ZmZlci5nZXQoKSk7CiAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgaW5CdWZmZXIpOwogICAgIH0KKyAgICBBTE9HVigiWyVzXSAjIGFjdGl2ZSBzbG90cyBhZnRlciBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSA9ICV6dSIsIG1OYW1lLCBudW1BY3RpdmVTbG90cyk7CiB9CiAKIHN0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlbmRlck91dHB1dEJ1ZmZlcigKQEAgLTgxNCw2ICs4MTYsOSBAQAogICAgIHN0YXR1c190IHJlc3VsdCA9IG1Db21wb25lbnQtPnF1ZXVlVG9PdXRwdXRTdXJmYWNlKGJsb2NrLCBxYmksICZxYm8pOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0koIlslc10gcXVldWVCdWZmZXIgZmFpbGVkOiAlZCIsIG1OYW1lLCByZXN1bHQpOworICAgICAgICBpZiAocmVzdWx0ID09IE5PX0lOSVQpIHsKKyAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgQUxPR1YoIlslc10gcXVldWUgYnVmZmVyIHN1Y2Nlc3NmdWwiLCBtTmFtZSk7CkBAIC0xMDYxLDkgKzEwNjYsNiBAQAogICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CiAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0gbnVtT3V0cHV0U2xvdHMgKwogICAgICAgICAgICAgICAgICAgICByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7Ci0gICAgICAgICAgICBpZiAoIXNlY3VyZSkgewotICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgKz0gbnVtSW5wdXRTbG90czsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIG91dHB1dFN1cmZhY2UgPSBvdXRwdXQtPnN1cmZhY2UgPwogICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSA6IG51bGxwdHI7CiAgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgewpAQCAtMTUyNCw2ICsxNTI2LDcgQEAKICAgICB9CiAKICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBuZXdJbnB1dERlbGF5LCBuZXdQaXBlbGluZURlbGF5OworICAgIGJvb2wgbmVlZE1heERlcXVldWVCdWZmZXJDb3VudFVwZGF0ZSA9IGZhbHNlOwogICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKICAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CkBAIC0xNTMyLDI0ICsxNTM1LDEwIEBACiAgICAgICAgICAgICBjYXNlIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6Q09SRV9JTkRFWDogewogICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6b3V0cHV0IHJlb3JkZXJEZXB0aDsKICAgICAgICAgICAgICAgICBpZiAocmVvcmRlckRlcHRoLnVwZGF0ZUZyb20oKnBhcmFtKSkgewotICAgICAgICAgICAgICAgICAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZzo6bnBvczsKLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dC5sb2NrKCktPmJ1ZmZlcnMtPnNldFJlb3JkZXJEZXB0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW9yZGVyRGVwdGgudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIgZGVwdGggdG8gJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlckRlcHRoLnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzID0gbU91dHB1dC5sb2NrKCktPm51bVNsb3RzOwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IG1JbnB1dC5sb2NrKCktPm51bVNsb3RzOwotICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyA9IG51bU91dHB1dFNsb3RzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2VjdXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzICs9IG51bUlucHV0U2xvdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LmxvY2soKS0+YnVmZmVycy0+c2V0UmVvcmRlckRlcHRoKHJlb3JkZXJEZXB0aC52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG5lZWRNYXhEZXF1ZXVlQnVmZmVyQ291bnRVcGRhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIgZGVwdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSk7CkBAIC0xNTkzLDE0ICsxNTgyLDExIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZWxheS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0aW5nIG91dHB1dCBkZWxheSAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0RGVsYXkudmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZWN1cmUgPSBtQ29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiLnNlY3VyZSIpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpucG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm91dHB1dERlbGF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZWxheS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCltUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b3V0cHV0RGVsYXkob3V0cHV0RGVsYXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE1heERlcXVldWVCdWZmZXJDb3VudFVwZGF0ZSA9IHRydWU7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRTbG90cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IG1JbnB1dC5sb2NrKCktPm51bVNsb3RzOwogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dC0+YnVmZmVycykgewpAQCAtMTYyNiwxNiArMTYxMiw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyc0NoYW5nZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVwdGggPSBtT3V0cHV0LmxvY2soKS0+YnVmZmVycy0+Z2V0UmVvcmRlckRlcHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBudW1PdXRwdXRTbG90cyArIGRlcHRoICsga1JlbmRlcmluZ0RlcHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWN1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzICs9IG51bUlucHV0U2xvdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LT5zdXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTY2NCw2ICsxNjQwLDIwIEBACiAgICAgICAgICAgICBpbnB1dC0+bnVtU2xvdHMgPSBuZXdOdW1TbG90czsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAobmVlZE1heERlcXVldWVCdWZmZXJDb3VudFVwZGF0ZSkgeworICAgICAgICBzaXplX3QgbnVtT3V0cHV0U2xvdHMgPSAwOworICAgICAgICB1aW50MzJfdCByZW9yZGVyRGVwdGggPSAwOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgICAgICBudW1PdXRwdXRTbG90cyA9IG91dHB1dC0+bnVtU2xvdHM7CisgICAgICAgICAgICByZW9yZGVyRGVwdGggPSBvdXRwdXQtPmJ1ZmZlcnMtPmdldFJlb3JkZXJEZXB0aCgpOworICAgICAgICB9CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0gbnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGggKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UpIHsKKyAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGludDMyX3QgZmxhZ3MgPSAwOwogICAgIGlmICh3b3JrbGV0LT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CkBAIC0xNzE4LDcgKzE3MDgsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChub3RpZnlDbGllbnQgJiYgIWJ1ZmZlciAmJiAhZmxhZ3MpIHsKKyAgICBib29sIGRyb3AgPSBmYWxzZTsKKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRFJPUF9GUkFNRSkgeworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBkcm9wIGJ1ZmZlciBidXQga2VlcCBtZXRhZGF0YSIsIG1OYW1lKTsKKyAgICAgICAgZHJvcCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKG5vdGlmeUNsaWVudCAmJiAhYnVmZmVyICYmICFmbGFncyAmJiAhKGRyb3AgJiYgb3V0cHV0Rm9ybWF0KSkgewogICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBOb3QgcmVwb3J0aW5nIG91dHB1dCBidWZmZXIgKCVsbGQpIiwKICAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOwogICAgICAgICBub3RpZnlDbGllbnQgPSBmYWxzZTsKQEAgLTE3NDUsNyArMTc0MSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgb3V0cHV0LT5idWZmZXJzLT5wdXNoVG9TdGFzaCgKLSAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgZHJvcCA/IG51bGxwdHIgOiBidWZmZXIsCiAgICAgICAgICAgICAgICAgbm90aWZ5Q2xpZW50LAogICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5wZWVrKCksCiAgICAgICAgICAgICAgICAgZmxhZ3MsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKaW5kZXggZTU4YTFlNC4uNjkyZGE1OCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcApAQCAtOTEsNyArOTEsOSBAQAogICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU1RSSURFLCBzdHJpZGUpOwogICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgc3RyaWRlID0gJWQiLCBtTmFtZSwgc3RyaWRlKTsKICAgICAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSAoaW1nLT5tUGxhbmVbMV0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQpIC8gc3RyaWRlOworICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0RGVsdGEgPQorICAgICAgICAgICAgICAgICAgICAoaW50NjRfdClpbWctPm1QbGFuZVsxXS5tT2Zmc2V0IC0gKGludDY0X3QpaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSBpbnQzMl90KG9mZnNldERlbHRhIC8gc3RyaWRlKTsKICAgICAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9TTElDRV9IRUlHSFQsIHZzdHJpZGUpOwogICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIHZzdHJpZGUgPSAlZCIsIG1OYW1lLCB2c3RyaWRlKTsKICAgICAgICAgICAgIH0KQEAgLTI3Miw4ICsyNzQsNiBAQAogCiAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgY2FuIGJlIHByb2Nlc3NlZCB3aXRob3V0IGEgcmVnaXN0ZXJlZCBzbG90LgogICAgIGlmIChvdXRwdXRGb3JtYXQpIHsKLSAgICAgICAgQUxPR0QoIlslc10gcG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXI6IG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlcyIsCi0gICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgdXBkYXRlU2tpcEN1dEJ1ZmZlcihvdXRwdXRGb3JtYXQsIGVudHJ5Lm5vdGlmeSk7CiAgICAgfQogCkBAIC0zMDEsNiArMzAxLDEwIEBACiAgICAgfQogCiAgICAgaWYgKCFlbnRyeS5ub3RpZnkpIHsKKyAgICAgICAgaWYgKG91dHB1dEZvcm1hdCkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gcG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXI6IG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlcyIsCisgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIH0KICAgICAgICAgbVBlbmRpbmcucG9wX2Zyb250KCk7CiAgICAgICAgIHJldHVybiBESVNDQVJEOwogICAgIH0KQEAgLTMxNyw2ICszMjEsMTAgQEAKICAgICAvLyBBcHBlbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZnJvbnQgc3Rhc2ggZW50cnkgdG8gb3V0QnVmZmVyLgogICAgICgqb3V0QnVmZmVyKS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgZW50cnkudGltZXN0YW1wKTsKICAgICAoKm91dEJ1ZmZlciktPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgZW50cnkuZmxhZ3MpOworICAgIGlmIChvdXRwdXRGb3JtYXQpIHsKKyAgICAgICAgQUxPR0QoIlslc10gcG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXI6IG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlcyIsCisgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CiAgICAgQUxPR1YoIlslc10gcG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXI6ICIKICAgICAgICAgICAib3V0IGJ1ZmZlciBpbmRleCA9ICV6dSBbJXBdID0+ICVwICsgJXp1ICglbGxkKSIsCiAgICAgICAgICAgbU5hbWUsICppbmRleCwgb3V0QnVmZmVyLT5nZXQoKSwKQEAgLTQ4NywxMSArNDk1LDEyIEBACiAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKIH0KIAotc2l6ZV90IEZsZXhCdWZmZXJzSW1wbDo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKK3NpemVfdCBGbGV4QnVmZmVyc0ltcGw6Om51bUFjdGl2ZVNsb3RzKCkgY29uc3QgewogICAgIHJldHVybiBzdGQ6OmNvdW50X2lmKAogICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCiAgICAgICAgICAgICBbXShjb25zdCBFbnRyeSAmZW50cnkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5LmNsaWVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5LmNsaWVudEJ1ZmZlciAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhZW50cnkuY29tcEJ1ZmZlci5leHBpcmVkKCkpOwogICAgICAgICAgICAgfSk7CiB9CiAKQEAgLTYzNywxMSArNjQ2LDExIEBACiAgICAgfQogfQogCi1zaXplX3QgQnVmZmVyc0FycmF5SW1wbDo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKK3NpemVfdCBCdWZmZXJzQXJyYXlJbXBsOjpudW1BY3RpdmVTbG90cygpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjpjb3VudF9pZigKICAgICAgICAgICAgIG1CdWZmZXJzLmJlZ2luKCksIG1CdWZmZXJzLmVuZCgpLAogICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm93bmVkQnlDbGllbnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm93bmVkQnlDbGllbnQgfHwgIWVudHJ5LmNvbXBCdWZmZXIuZXhwaXJlZCgpOwogICAgICAgICAgICAgfSk7CiB9CiAKQEAgLTY5MSw4ICs3MDAsOCBAQAogICAgIG1JbXBsLmZsdXNoKCk7CiB9CiAKLXNpemVfdCBJbnB1dEJ1ZmZlcnNBcnJheTo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworc2l6ZV90IElucHV0QnVmZmVyc0FycmF5OjpudW1BY3RpdmVTbG90cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQWN0aXZlU2xvdHMoKTsKIH0KIAogc3A8Q29kZWMyQnVmZmVyPiBJbnB1dEJ1ZmZlcnNBcnJheTo6Y3JlYXRlTmV3QnVmZmVyKCkgewpAQCAtNzI5LDggKzczOCw4IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXNpemVfdCBTbG90SW5wdXRCdWZmZXJzOjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CitzaXplX3QgU2xvdElucHV0QnVmZmVyczo6bnVtQWN0aXZlU2xvdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUFjdGl2ZVNsb3RzKCk7CiB9CiAKIHNwPENvZGVjMkJ1ZmZlcj4gU2xvdElucHV0QnVmZmVyczo6Y3JlYXRlTmV3QnVmZmVyKCkgewpAQCAtNzgxLDggKzc5MCw4IEBACiAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CiB9CiAKLXNpemVfdCBMaW5lYXJJbnB1dEJ1ZmZlcnM6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK3NpemVfdCBMaW5lYXJJbnB1dEJ1ZmZlcnM6Om51bUFjdGl2ZVNsb3RzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC5udW1BY3RpdmVTbG90cygpOwogfQogCiAvLyBzdGF0aWMKQEAgLTk1OCw4ICs5NjcsOCBAQAogICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOwogfQogCi1zaXplX3QgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzOjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CitzaXplX3QgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzOjpudW1BY3RpdmVTbG90cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQWN0aXZlU2xvdHMoKTsKIH0KIAogc3A8Q29kZWMyQnVmZmVyPiBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6OmNyZWF0ZU5ld0J1ZmZlcigpIHsKQEAgLTEwMjMsOCArMTAzMiw4IEBACiAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CiB9CiAKLXNpemVfdCBHcmFwaGljSW5wdXRCdWZmZXJzOjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CitzaXplX3QgR3JhcGhpY0lucHV0QnVmZmVyczo6bnVtQWN0aXZlU2xvdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUFjdGl2ZVNsb3RzKCk7CiB9CiAKIHNwPENvZGVjMkJ1ZmZlcj4gR3JhcGhpY0lucHV0QnVmZmVyczo6Y3JlYXRlTmV3QnVmZmVyKCkgewpAQCAtMTExMyw4ICsxMTIyLDggQEAKICAgICBtSW1wbC5nZXRBcnJheShhcnJheSk7CiB9CiAKLXNpemVfdCBPdXRwdXRCdWZmZXJzQXJyYXk6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK3NpemVfdCBPdXRwdXRCdWZmZXJzQXJyYXk6Om51bUFjdGl2ZVNsb3RzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC5udW1BY3RpdmVTbG90cygpOwogfQogCiB2b2lkIE91dHB1dEJ1ZmZlcnNBcnJheTo6cmVhbGxvYyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgewpAQCAtMTIyNCw4ICsxMjMzLDggQEAKICAgICByZXR1cm4gYXJyYXk7CiB9CiAKLXNpemVfdCBGbGV4T3V0cHV0QnVmZmVyczo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworc2l6ZV90IEZsZXhPdXRwdXRCdWZmZXJzOjpudW1BY3RpdmVTbG90cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQWN0aXZlU2xvdHMoKTsKIH0KIAogLy8gTGluZWFyT3V0cHV0QnVmZmVycwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKaW5kZXggMGQ0ZmE4MS4uYzM4M2E3YyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oCkBAIC0zMyw4ICszMyw4IEBACiBjbGFzcyBTa2lwQ3V0QnVmZmVyOwogCiBjb25zdGV4cHIgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKLS8vIFRoaXMgY2FuIGZpdCA0SyBSR0JBIGZyYW1lLCBhbmQgbW9zdCBsaWtlbHkgY2xpZW50IHdvbid0IG5lZWQgbW9yZSB0aGFuIHRoaXMuCi1jb25zdGV4cHIgc2l6ZV90IGtNYXhMaW5lYXJCdWZmZXJTaXplID0gNDA5NiAqIDIzMDQgKiA0OworLy8gVGhpcyBjYW4gZml0IGFuIDhLIGZyYW1lLgorY29uc3RleHByIHNpemVfdCBrTWF4TGluZWFyQnVmZmVyU2l6ZSA9IDc2ODAgKiA0MzIwICogMjsKIAogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciByZXByZXNlbnRhdGlvbiBvZiBidWZmZXJzIGF0IG9uZSBwb3J0LgpAQCAtNzIsNyArNzIsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBudW1iZXIgb2YgYnVmZmVycyB0aGUgY2xpZW50IG93bnMuCiAgICAgICovCi0gICAgdmlydHVhbCBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCBudW1BY3RpdmVTbG90cygpIGNvbnN0ID0gMDsKIAogICAgIC8qKgogICAgICAqIEV4YW1pbmUgaW1hZ2UgZGF0YSBmcm9tIHRoZSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgZm9ybWF0IGlmIG5lY2Vzc2FyeS4KQEAgLTU4NCw3ICs1ODQsNyBAQAogICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhcmUgc2VudCB0byB0aGUgY2xpZW50IGJ1dCBub3QgcmVsZWFzZWQKICAgICAgKiB5ZXQuCiAgICAgICovCi0gICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdDsKKyAgICBzaXplX3QgbnVtQWN0aXZlU2xvdHMoKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhcmUgc2VudCB0byB0aGUgY29tcG9uZW50IGJ1dCBub3QKQEAgLTcwNSw3ICs3MDUsNyBAQAogICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhcmUgc2VudCB0byB0aGUgY2xpZW50IGJ1dCBub3QgcmVsZWFzZWQKICAgICAgKiB5ZXQuCiAgICAgICovCi0gICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdDsKKyAgICBzaXplX3QgbnVtQWN0aXZlU2xvdHMoKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkuCkBAIC03NjUsNyArNzY1LDcgQEAKIAogICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZTsKIAotICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWw7CisgICAgc2l6ZV90IG51bUFjdGl2ZVNsb3RzKCkgY29uc3QgZmluYWw7CiAKIHByb3RlY3RlZDoKICAgICBzcDxDb2RlYzJCdWZmZXI+IGNyZWF0ZU5ld0J1ZmZlcigpIG92ZXJyaWRlOwpAQCAtNzk2LDcgKzc5Niw3IEBACiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgZmluYWw7CiAKLSAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsOworICAgIHNpemVfdCBudW1BY3RpdmVTbG90cygpIGNvbnN0IGZpbmFsOwogCiBwcm90ZWN0ZWQ6CiAgICAgc3A8Q29kZWMyQnVmZmVyPiBjcmVhdGVOZXdCdWZmZXIoKSBmaW5hbDsKQEAgLTgyNiw3ICs4MjYsNyBAQAogCiAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCi0gICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKyAgICBzaXplX3QgbnVtQWN0aXZlU2xvdHMoKSBjb25zdCBmaW5hbDsKIAogcHJvdGVjdGVkOgogICAgIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgb3ZlcnJpZGU7CkBAIC04OTQsNyArODk0LDcgQEAKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSBmaW5hbDsKIAotICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWw7CisgICAgc2l6ZV90IG51bUFjdGl2ZVNsb3RzKCkgY29uc3QgZmluYWw7CiAKIHByb3RlY3RlZDoKICAgICBzcDxDb2RlYzJCdWZmZXI+IGNyZWF0ZU5ld0J1ZmZlcigpIG92ZXJyaWRlOwpAQCAtOTI0LDcgKzkyNCw3IEBACiAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWw7CiAKLSAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsOworICAgIHNpemVfdCBudW1BY3RpdmVTbG90cygpIGNvbnN0IGZpbmFsOwogCiBwcm90ZWN0ZWQ6CiAgICAgc3A8Q29kZWMyQnVmZmVyPiBjcmVhdGVOZXdCdWZmZXIoKSBvdmVycmlkZTsKQEAgLTk2NSw3ICs5NjUsNyBAQAogICAgICAgICBhcnJheS0+Y2xlYXIoKTsKICAgICB9CiAKLSAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICBzaXplX3QgbnVtQWN0aXZlU2xvdHMoKSBjb25zdCBmaW5hbCB7CiAgICAgICAgIHJldHVybiAwdTsKICAgICB9CiAKQEAgLTEwMTksNyArMTAxOSw3IEBACiAKICAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbDsKIAotICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWw7CisgICAgc2l6ZV90IG51bUFjdGl2ZVNsb3RzKCkgY29uc3QgZmluYWw7CiAKICAgICAvKioKICAgICAgKiBSZWFsbG9jYXRlIHRoZSBhcnJheSwgZmlsbGVkIHdpdGggYnVmZmVycyB3aXRoIHRoZSBzYW1lIHNpemUgYXMgZ2l2ZW4KQEAgLTEwNzMsNyArMTA3Myw3IEBACiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVyc0FycmF5PiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKLSAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsOworICAgIHNpemVfdCBudW1BY3RpdmVTbG90cygpIGNvbnN0IGZpbmFsOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGFuIGFwcHJvcHJpYXRlIENvZGVjMkJ1ZmZlciBvYmplY3QgZm9yIHRoZSB0eXBlIG9mIGJ1ZmZlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCmluZGV4IDk2Zjg2ZTguLjc5YzYyMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCkBAIC0xMTUxLDE0ICsxMTUxLDExIEBACiAKICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgICBpZiAoZG9tYWluICYgbUlucHV0RG9tYWluKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBvbGRGb3JtYXQgPSBtSW5wdXRGb3JtYXQ7Ci0gICAgICAgIG1JbnB1dEZvcm1hdCA9IG1JbnB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgZm9ybWF0IGNoYW5nZWQKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG9sZEZvcm1hdCA9IG1JbnB1dEZvcm1hdC0+ZHVwKCk7CiAgICAgICAgIG1JbnB1dEZvcm1hdC0+ZXh0ZW5kKGdldEZvcm1hdEZvckRvbWFpbihyZWZsZWN0ZWQsIG1JbnB1dERvbWFpbikpOwogICAgICAgICBpZiAobUlucHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCiAgICAgICAgICAgICAgICAgfHwgbUlucHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpLT5jb3VudEVudHJpZXMoKSA+IDApIHsKICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoZG9tYWluICYgbU91dHB1dERvbWFpbikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1RFU1RfTUFQUElORyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1ZTViNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3NmcGx1Z2luCit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgLy8gZmFpbGluZyAxIG9mIDExCisgICAgLy8gVE9ETyhiLzE1NjE2NzQ3MSkKKyAgICAvLyB7ICJuYW1lIjogImNjb2RlY191bml0X3Rlc3QiIH0sCisKKyAgICAvLyBmYWlsaW5nIDQgb2YgMTcsIGFyb3VuZCBtYXgtaW5wdXQtc2l6ZSBkZWZhdWx0cyAmIG92ZXJyaWRlcworICAgIC8vIFRPRE8oYi8xNTYxNjc0NzEpCisgICAgLy97ICJuYW1lIjogIm1jX3Nhbml0eV90ZXN0In0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ0NvZGVjLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DQ29kZWMuaAppbmRleCBlY2IyNTA2Li5kYmJiNWQ1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DQ29kZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DQ29kZWMuaApAQCAtMTkzLDcgKzE5Myw2IEBACiAKICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNDb25maWc+PiBtQ29uZmlnOwogICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj4gbVdvcmtEb25lUXVldWU7Ci0gICAgc3RkOjphdG9taWNfZmxhZyBtU2VudENvbmZpZ0FmdGVyUmVzdW1lOwogCiAgICAgZnJpZW5kIGNsYXNzIENDb2RlY0NhbGxiYWNrSW1wbDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icAppbmRleCA4ZDFhOWMzLi41Yzc3NGEyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJjY29kZWNfdW5pdF90ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkNDb2RlY0J1ZmZlcnNfdGVzdC5jcHAiLApAQCAtNDMsNiArNDQsNyBAQAogCiBjY190ZXN0IHsKICAgICBuYW1lOiAibWNfc2FuaXR5X3Rlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogCiAgICAgc3JjczogWwogICAgICAgICAiTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icAppbmRleCA2Mjg3MjIxLi5lN2RjOTJhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icAppbmRleCBmY2U2ZTIxLi5jOTE2OWE5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJjb2RlYzJfY29yZV9wYXJhbV90ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkMyUGFyYW1fdGVzdC5jcHAiLApAQCAtMjgsNiArMjksNyBAQAogCiBjY190ZXN0IHsKICAgICBuYW1lOiAiY29kZWMyX3ZuZGtfdGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJDMl90ZXN0LmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCmluZGV4IDU2NGQ0ZDIuLmJiODEzMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCkBAIC05Niw3ICs5Niw3IEBACiAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKICAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAgLy8gPD0gbmVlZGVkIGZvciBDMkZpZWxkRGVzY3JpcHRvcgogICAgIGNvbnN0IHN0YXRpYyBGRDo6dHlwZV90IFRZUEUgPSAoRkQ6OnR5cGVfdCkoQ09SRV9JTkRFWCB8IEZEOjpTVFJVQ1RfRkxBRyk7Ci19OworfSBDMl9QQUNLOwogCiBERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihDMlNpemVTdHJ1Y3QpCiAKQEAgLTExMSwxMSArMTExLDEzIEBACiAKIHN0cnVjdCBDMlRlc3RTdHJ1Y3RfQSB7CiAgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CiAgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CiAgICAgZmxvYXQgZnAzMjsKLSAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgQzJTaXplU3RydWN0IHN6WzNdOyAvLyA4LWJ5dGUgc3RydWN0dXJlLCBidXQgNC1ieXRlIGFsaWduZWQKICAgICB1aW50OF90IGJsb2JbMTAwXTsKICAgICBjaGFyIHN0cmluZ1sxMDBdOwogICAgIGJvb2wgeWVzTm9bMTAwXTsKQEAgLTEyNCwyMSArMTI2LDIxIEBACiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKICAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0IH07CiAgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfQSBfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKIAogY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BOjpGaWVsZExpc3QoKSB7CiAgICAgcmV0dXJuIF9GSUVMRF9MSVNUOwogfQogY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BOjpfRklFTERfTElTVCA9CiAgICAgeyB7IEZEOjpJTlQzMiwgICAgMSwgInMzMiIsICAgMCwgNCB9LAotICAgICAgeyBGRDo6SU5UNjQsICAgIDIsICJzNjQiLCAgIDQsIDggfSwKLSAgICAgIHsgRkQ6OlVJTlQzMiwgICAxLCAidTMyIiwgIDIwLCA0IH0sCi0gICAgICB7IEZEOjpVSU5UNjQsICAgMSwgInU2NCIsICAyNCwgOCB9LAotICAgICAgeyBGRDo6RkxPQVQsICAgIDEsICJmcCIsICAgMzIsIDQgfSwKLSAgICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAzLCAic2l6ZSIsIDM2LCA4IH0sCi0gICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgImJsb2IiLCA2MCwgMSB9LAotICAgICAgeyBGRDo6U1RSSU5HLCAxMDAsICJzdHIiLCAxNjAsIDEgfSwKLSAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAieS1uIiwgMjYwLCAxIH0gfTsKKyAgICAgIHsgRkQ6OklOVDY0LCAgICAyLCAiczY0IiwgICA4LCA4IH0sCisgICAgICB7IEZEOjpVSU5UMzIsICAgMSwgInUzMiIsICAyNCwgNCB9LAorICAgICAgeyBGRDo6VUlOVDY0LCAgIDEsICJ1NjQiLCAgMzIsIDggfSwKKyAgICAgIHsgRkQ6OkZMT0FULCAgICAxLCAiZnAiLCAgIDQwLCA0IH0sCisgICAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMywgInNpemUiLCA0NCwgOCB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJibG9iIiwgNjgsIDEgfSwKKyAgICAgIHsgRkQ6OlNUUklORywgMTAwLCAic3RyIiwgMTY4LCAxIH0sCisgICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgInktbiIsIDI2OCwgMSB9IH07CiAKIFRFU1RfUChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KSB7CiAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IEdldFBhcmFtKCksIGV4cGVjdGVkID0gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUOwpAQCAtMTk4LDExICsyMDAsMTMgQEAKIAogc3RydWN0IEMyVGVzdEFTdHJ1Y3QgewogICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgLy8gNC1ieXRlIHBhZGRpbmcKICAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOwogICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgLy8gNC1ieXRlIHBhZGRpbmcKICAgICB1aW50NjRfdCB1bnNpZ25lZDY0OwogICAgIGZsb2F0IGZwMzI7Ci0gICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsgLy8gOC1ieXRlIHN0cnVjdHVyZSwgYnV0IDQtYnl0ZSBhbGlnbmVkCiAgICAgdWludDhfdCBibG9iWzEwMF07CiAgICAgY2hhciBzdHJpbmdbMTAwXTsKICAgICBib29sIHllc05vWzEwMF07CkBAIC0yMjksMTEgKzIzMywxMyBAQAogCiBzdHJ1Y3QgQzJUZXN0QlN0cnVjdCB7CiAgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CiAgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CiAgICAgZmxvYXQgZnAzMjsKLSAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgQzJTaXplU3RydWN0IHN6WzNdOyAvLyA4LWJ5dGUgc3RydWN0dXJlLCBidXQgNC1ieXRlIGFsaWduZWQKICAgICB1aW50OF90IGJsb2JbMTAwXTsKICAgICBjaGFyIHN0cmluZ1sxMDBdOwogICAgIGJvb2wgeWVzTm9bMTAwXTsKQEAgLTI4Niw3ICsyOTIsNyBAQAogICAgICAgICBpZiAoZmllbGRzLnNpemUoKSA+IDEpIHsKICAgICAgICAgICAgIEVYUEVDVF9FUSgydSwgZmllbGRzLnNpemUoKSk7CiAgICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IoRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCksIGZpZWxkc1swXSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IodGhpcy0+RmxleFR5cGUsIDAsICJmbGV4IiwgNCwgdGhpcy0+RkxFWF9TSVpFKSwKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5GbGV4VHlwZSwgMCwgImZsZXgiLCBhbGlnbm9mKFR5cGVQYXJhbSkgLyogb2Zmc2V0ICovLCB0aGlzLT5GTEVYX1NJWkUpLAogICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1sxXSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOwpAQCAtMzkyLDYgKzM5OCw3IEBACiAKIHN0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCB7CiAgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIGludDY0X3QgbVNpZ25lZDY0RmxleFtdOwogCiAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKQEAgLTQwNiw3ICs0MTMsNyBAQAogfQogY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpfRklFTERfTElTVCA9IHsKICAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKLSAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCA0LCA4IH0sCisgICAgeyBGRDo6SU5UNjQsIDAsICJmbGV4IiwgOCwgOCB9LAogfTsKIAogc3RydWN0IEMyVGVzdEZsZXhTNjRTdHJ1Y3QgewpAQCAtNDE5LDYgKzQyNiw3IEBACiAKIHN0cnVjdCBDMlRlc3RGbGV4RW5kUzY0U3RydWN0IHsKICAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIC8vIDQtYnl0ZSBwYWRkaW5nCiAgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CiAgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCgpIHt9CiAKQEAgLTQ2OCw3ICs0NzYsNyBAQAogICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUsIEZMRVhfU0laRSA9IDggfTsKICAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSBfdHlwZTsKICAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBGbGV4VHlwZTsKLX07Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKIAogY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6RmllbGRMaXN0KCkgewogICAgIHJldHVybiBfRklFTERfTElTVDsKQEAgLTUzOSwxNCArNTQ3LDE0IEBACiBURVNUX0YoQzJQYXJhbVRlc3QsIEZpZWxkSWQpIHsKICAgICAvLyBwb2ludGVyIGNvbnN0cnVjdG9yCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmZwMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zeikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmJsb2IpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnllc05vKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+eWVzTm8pKTsKIAogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+c2lnbmVkMzIpKTsKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1GbGV4U2l6ZSkpOwpAQCAtNTU2LDE0ICs1NjQsMTQgQEAKIAogICAgIC8vIG1lbWJlciBwb2ludGVyIGNvbnN0cnVjdG9yCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzeikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6YmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CiAKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6c2lnbmVkMzIpKTsKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CkBAIC01NzMsMTQgKzU4MSwxNCBAQAogCiAgICAgLy8gbWVtYmVyIHBvaW50ZXIgc2FucyB0eXBlIHBvaW50ZXIKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6ZnAzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN6KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6YmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOwogCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOwogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CkBAIC01OTQsMTQgKzYwMiwxNCBAQAogCiAgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvciBpbiBDMlBhcmFtCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5mcDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3opKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5ibG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT55ZXNObykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0OCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg3NiwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTc2LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI3NiwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT55ZXNObykpOwogCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5zaWduZWQzMikpOwogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm8qKTApLT5tLm1GbGV4U2l6ZSkpOwpAQCAtNjExLDE0ICs2MTksMTQgQEAKIAogICAgIC8vIG1lbWJlciBwb2ludGVyIGluIEMyUGFyYW0KICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpmcDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzeikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6YmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Onllc05vKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDUyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg3NiwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNzYsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNzYsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp5ZXNObykpOwogCiAgICAgLy8gTk9URTogY2Fubm90IHVzZSBhIG1lbWJlciBwb2ludGVyIGZvciBmbGV4IHBhcmFtcyBkdWUgdG8gaW50cm9kdWN0aW9uIG9mICdtJwogICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0uc2lnbmVkMzIpKTsKQEAgLTIzMjgsNiArMjMzNiwxNyBAQAogICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShibG9iVmFsdWUtPm0udmFsdWUpLCB1aW50OF90W10+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90W10iKTsKICAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CiAgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGJsb2JWYWx1ZS0+c2V0RmxleENvdW50KDd1KTsgLy8gaW5jcmVhc2luZyB0aGUgY291bnQgZG9lcyBub3QgY2hhbmdlIGl0CisgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGJsb2JWYWx1ZS0+c2V0RmxleENvdW50KDJ1KTsgLy8gZGVjcmVhc2luZyB0aGUgY291bnQgY2hhbmdlcyBpdCB0byBpdAorICAgICAgICBFWFBFQ1RfRVEoMnUsIGJsb2JWYWx1ZS0+ZmxleENvdW50KCkpOworICAgICAgICBibG9iVmFsdWUtPnNldEZsZXhDb3VudCgwdSk7IC8vIGNhbiBkZWNyZWFzZSB0byAwIGFuZCBibG9iIHJlbWFpbnMgdmFsaWQKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJsb2JWYWx1ZSk7CisgICAgICAgIGJsb2JWYWx1ZS0+aW52YWxpZGF0ZSgpOyAvLyBmbGV4IHBhcmFtcyBjYW4gYmUgaW52YWxpZGF0ZWQgPT4gcmVzdWx0cyBpbiAwIHNpemUKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCpibG9iVmFsdWUpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJsb2JWYWx1ZS0+c2l6ZSgpKTsKKwogICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYmxvYlZhbHVlLT5GaWVsZExpc3QoKTsKICAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKICAgICAgICAgRVhQRUNUX0VRKEZEOjpCTE9CLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKaW5kZXggNTljZDMxMy4uMmQ2NmRmMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcApAQCAtNzgsNyArNzgsNyBAQAogICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKICAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCiAgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pOwotICAgIEVudW0zIGUzOworICAgIEVudW0zIGUzKEludmFsaWQpOwogICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcihlMyk7CiAKICAgICAvLyB1cHBlciBjYXNlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcAppbmRleCA3ODA5OTRhLi5hOWY4ZTE3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAKQEAgLTc2NSw0ICs3NjUsNTQgQEAKICAgICB9CiB9CiAKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEluZm9CdWZmZXJUZXN0KSB7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSA1MjQyODh1OworCisgICAgLy8gYWxsb2NhdGUgYSBsaW5lYXIgYmxvY2sKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGxpbmVhclBvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2s7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2spKTsKKworICAgIEMySW5mb0J1ZmZlciBpbmZvID0gQzJJbmZvQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlcjEsIGxpbmVhckJsb2NrLT5zaGFyZSgxMDI0LCBrQ2FwYWNpdHkgLyAyLCBDMkZlbmNlKCkpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiBzcEluZm8obmV3IEMySW5mb0J1ZmZlcihpbmZvKSk7CisgICAgQVNTRVJUX0VRKGtQYXJhbUluZGV4TnVtYmVyMSwgc3BJbmZvLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBBU1NFUlRfVFJVRShzcEluZm8tPmluZGV4KCkuaXNHbG9iYWwoKSk7CisgICAgQVNTRVJUX0VRKEMyUGFyYW06OklORk8sIHNwSW5mby0+aW5kZXgoKS5raW5kKCkpOworICAgIEFTU0VSVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUiwgc3BJbmZvLT5kYXRhKCkudHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMTAyNCwgc3BJbmZvLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHkgLyAyLCBzcEluZm8tPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkpOworICAgIC8vIGhhbmRsZXMgbXVzdCBhY3R1YWxseSBiZSBpZGVudGljYWwgYWZ0ZXIgc2hhcmluZyBpbnRvIGFuIGluZm8gYnVmZmVyCisgICAgQVNTRVJUX0VRKGxpbmVhckJsb2NrLT5oYW5kbGUoKSwgc3BJbmZvLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uaGFuZGxlKCkpOworICAgIEFTU0VSVF9FUShsaW5lYXJQb29sLT5nZXRBbGxvY2F0b3JJZCgpLCBzcEluZm8tPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5nZXRBbGxvY2F0b3JJZCgpKTsKKworICAgIEMySW5mb0J1ZmZlciBzdHJlYW1JbmZvID0gaW5mby5hc1N0cmVhbShmYWxzZSAvKiBvdXRwdXQgKi8sICAxdSk7CisgICAgQVNTRVJUX0VRKGtQYXJhbUluZGV4TnVtYmVyMSwgc3RyZWFtSW5mby5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmZvLmluZGV4KCkuZm9yU3RyZWFtKCkpOworICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZm8uaW5kZXgoKS5mb3JJbnB1dCgpKTsKKyAgICBBU1NFUlRfRVEoMXUsIHN0cmVhbUluZm8uaW5kZXgoKS5zdHJlYW0oKSk7CisgICAgQVNTRVJUX0VRKEMyUGFyYW06OklORk8sIHN0cmVhbUluZm8uaW5kZXgoKS5raW5kKCkpOworICAgIEFTU0VSVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUiwgc3RyZWFtSW5mby5kYXRhKCkudHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMTAyNCwgc3RyZWFtSW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHkgLyAyLCBzdHJlYW1JbmZvLmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkpOworICAgIC8vIGhhbmRsZXMgbXVzdCBhY3R1YWxseSBiZSBpZGVudGljYWwgYWZ0ZXIgc2hhcmluZyBpbnRvIGFuIGluZm8gYnVmZmVyCisgICAgQVNTRVJUX0VRKGxpbmVhckJsb2NrLT5oYW5kbGUoKSwgc3RyZWFtSW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uaGFuZGxlKCkpOworICAgIEFTU0VSVF9FUShsaW5lYXJQb29sLT5nZXRBbGxvY2F0b3JJZCgpLCBzdHJlYW1JbmZvLmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5nZXRBbGxvY2F0b3JJZCgpKTsKKworICAgIEMySW5mb0J1ZmZlciBwb3J0SW5mbyA9IHN0cmVhbUluZm8uYXNQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICBBU1NFUlRfRVEoa1BhcmFtSW5kZXhOdW1iZXIxLCBwb3J0SW5mby5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBBU1NFUlRfVFJVRShwb3J0SW5mby5pbmRleCgpLmZvclBvcnQoKSk7CisgICAgQVNTRVJUX1RSVUUocG9ydEluZm8uaW5kZXgoKS5mb3JPdXRwdXQoKSk7CisgICAgQVNTRVJUX0VRKEMyUGFyYW06OklORk8sIHBvcnRJbmZvLmluZGV4KCkua2luZCgpKTsKKyAgICBBU1NFUlRfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIHBvcnRJbmZvLmRhdGEoKS50eXBlKCkpOworICAgIEFTU0VSVF9FUSgxMDI0LCBwb3J0SW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHkgLyAyLCBwb3J0SW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpKTsKKyAgICAvLyBoYW5kbGVzIG11c3QgYWN0dWFsbHkgYmUgaWRlbnRpY2FsIGFmdGVyIHNoYXJpbmcgaW50byBhbiBpbmZvIGJ1ZmZlcgorICAgIEFTU0VSVF9FUShsaW5lYXJCbG9jay0+aGFuZGxlKCksIHBvcnRJbmZvLmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5oYW5kbGUoKSk7CisgICAgQVNTRVJUX0VRKGxpbmVhclBvb2wtPmdldEFsbG9jYXRvcklkKCksIHBvcnRJbmZvLmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5nZXRBbGxvY2F0b3JJZCgpKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKaW5kZXggNmY3YWNjZS4uMTlhZmNjZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0xMyw3ICsxMyw3IEBACiAKIC8vICEhIURPIE5PVCBERVBFTkQgT04gVEhJUyBTSEFSRUQgTElCUkFSWSBESVJFQ1RMWSEhIQogLy8gdXNlIGxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIGluc3RlYWQKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfdm5kayIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCkBAIC0yNiw2ICsyNiw3IEBACiAgICAgICAgICJDMkFsbG9jYXRvckdyYWxsb2MuY3BwIiwKICAgICAgICAgIkMyQnVmZmVyLmNwcCIsCiAgICAgICAgICJDMkNvbmZpZy5jcHAiLAorICAgICAgICAiQzJEbWFCdWZBbGxvY2F0b3IuY3BwIiwKICAgICAgICAgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAiLAogICAgICAgICAiQzJTdG9yZS5jcHAiLAogICAgICAgICAicGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAiLApAQCAtNjQsNiArNjUsNyBAQAogICAgICAgICAibGliaGFyZHdhcmUiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAogICAgICAgICAibGliZm1xIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JCbG9iLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yQmxvYi5jcHAKaW5kZXggNTBjOWU1OS4uNjM0MGNiYSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JCbG9iLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckJsb2IuY3BwCkBAIC0xNyw2ICsxNyw4IEBACiAvLyAjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvckJsb2IiCiAKKyNpbmNsdWRlIDxzZXQ+CisKICNpbmNsdWRlIDxDMkFsbG9jYXRvckJsb2IuaD4KICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgogCkBAIC02Nyw2ICs2OSwxMCBAQAogcHJpdmF0ZToKICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUdyYXBoaWNBbGxvY2F0aW9uOwogICAgIGNvbnN0IEMyQWxsb2NhdG9yOjppZF90IG1BbGxvY2F0b3JJZDsKKworICAgIHN0ZDo6bXV0ZXggbU1hcExvY2s7CisgICAgc3RkOjptdWx0aXNldDxzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+PiBtTWFwcGVkT2Zmc2V0U2l6ZTsKKyAgICB1aW50OF90ICptTWFwcGVkQWRkcjsKIH07CiAKIEMyQWxsb2NhdGlvbkJsb2I6OkMyQWxsb2NhdGlvbkJsb2IoCkBAIC03NCwyMCArODAsNzQgQEAKICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQpCiAgICAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihjYXBhY2l0eSksCiAgICAgICAgIG1HcmFwaGljQWxsb2NhdGlvbihzdGQ6Om1vdmUoZ3JhcGhpY0FsbG9jYXRpb24pKSwKLSAgICAgICAgbUFsbG9jYXRvcklkKGFsbG9jYXRvcklkKSB7fQorICAgICAgICBtQWxsb2NhdG9ySWQoYWxsb2NhdG9ySWQpLAorICAgICAgICBtTWFwcGVkQWRkcihudWxscHRyKSB7fQogCi1DMkFsbG9jYXRpb25CbG9iOjp+QzJBbGxvY2F0aW9uQmxvYigpIHt9CitDMkFsbG9jYXRpb25CbG9iOjp+QzJBbGxvY2F0aW9uQmxvYigpIHsKKyAgICBpZiAobU1hcHBlZEFkZHIpIHsKKyAgICAgICAgQzJSZWN0IHJlY3QoY2FwYWNpdHkoKSwga0xpbmVhckJ1ZmZlckhlaWdodCk7CisgICAgICAgIG1HcmFwaGljQWxsb2NhdGlvbi0+dW5tYXAoJm1NYXBwZWRBZGRyLCByZWN0LCBudWxscHRyKTsKKyAgICB9Cit9CiAKIGMyX3N0YXR1c190IEMyQWxsb2NhdGlvbkJsb2I6Om1hcChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZlbmNlKiBmZW5jZSwgdm9pZCoqIGFkZHIgLyogbm9ubnVsbCAqLykgeworICAgICphZGRyID0gbnVsbHB0cjsKKyAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KCkgfHwgb2Zmc2V0ID4gY2FwYWNpdHkoKSB8fCBvZmZzZXQgPiBjYXBhY2l0eSgpIC0gc2l6ZSkgeworICAgICAgICBBTE9HVigiQzJBbGxvY2F0aW9uQmxvYjogbWFwOiBiYWQgb2Zmc2V0IC8gc2l6ZTogb2Zmc2V0PSV6dSBzaXplPSV6dSBjYXBhY2l0eT0ldSIsCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBzaXplLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NYXBMb2NrKTsKKyAgICBpZiAobU1hcHBlZEFkZHIpIHsKKyAgICAgICAgKmFkZHIgPSBtTWFwcGVkQWRkciArIG9mZnNldDsKKyAgICAgICAgbU1hcHBlZE9mZnNldFNpemUuaW5zZXJ0KHtvZmZzZXQsIHNpemV9KTsKKyAgICAgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkJsb2I6IG1hcHBlZCBmcm9tIGV4aXN0aW5nIG1hcHBpbmc6IG9mZnNldD0lenUgc2l6ZT0lenUgY2FwYWNpdHk9JXUiLAorICAgICAgICAgICAgICAgIG9mZnNldCwgc2l6ZSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CiAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0OwotICAgIEMyUmVjdCByZWN0ID0gQzJSZWN0KHNpemUsIGtMaW5lYXJCdWZmZXJIZWlnaHQpLmF0KG9mZnNldCwgMHUpOwotICAgIHJldHVybiBtR3JhcGhpY0FsbG9jYXRpb24tPm1hcChyZWN0LCB1c2FnZSwgZmVuY2UsICZsYXlvdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCoqPihhZGRyKSk7CisgICAgQzJSZWN0IHJlY3QgPSBDMlJlY3QoY2FwYWNpdHkoKSwga0xpbmVhckJ1ZmZlckhlaWdodCk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUdyYXBoaWNBbGxvY2F0aW9uLT5tYXAocmVjdCwgdXNhZ2UsIGZlbmNlLCAmbGF5b3V0LCAmbU1hcHBlZEFkZHIpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkJsb2I6IG1hcCBmYWlsZWQ6IG9mZnNldD0lenUgc2l6ZT0lenUgY2FwYWNpdHk9JXUgZXJyPSVkIiwKKyAgICAgICAgICAgICAgICBvZmZzZXQsIHNpemUsIGNhcGFjaXR5KCksIGVycik7CisgICAgICAgIG1NYXBwZWRBZGRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgKmFkZHIgPSBtTWFwcGVkQWRkciArIG9mZnNldDsKKyAgICBtTWFwcGVkT2Zmc2V0U2l6ZS5pbnNlcnQoe29mZnNldCwgc2l6ZX0pOworICAgIEFMT0dWKCJDMkFsbG9jYXRpb25CbG9iOiBuZXcgbWFwIHN1Y2NlZWRlZDogb2Zmc2V0PSV6dSBzaXplPSV6dSBjYXBhY2l0eT0ldSIsCisgICAgICAgICAgICBvZmZzZXQsIHNpemUsIGNhcGFjaXR5KCkpOworICAgIHJldHVybiBDMl9PSzsKIH0KIAogYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uQmxvYjo6dW5tYXAodm9pZCogYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UqIGZlbmNlRmQpIHsKLSAgICBDMlJlY3QgcmVjdChzaXplLCBrTGluZWFyQnVmZmVySGVpZ2h0KTsKLSAgICByZXR1cm4gbUdyYXBoaWNBbGxvY2F0aW9uLT51bm1hcChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJmFkZHIpLCByZWN0LCBmZW5jZUZkKTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcExvY2spOworICAgIHVpbnQ4X3QgKnU4QWRkciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oYWRkcik7CisgICAgaWYgKHU4QWRkciA8IG1NYXBwZWRBZGRyIHx8IG1NYXBwZWRBZGRyICsgY2FwYWNpdHkoKSA8IHU4QWRkciArIHNpemUpIHsKKyAgICAgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkJsb2I6IHVubWFwOiBCYWQgYWRkciAvIHNpemU6IGFkZHI9JXAgc2l6ZT0lenUgY2FwYWNpdHk9JXUiLAorICAgICAgICAgICAgICAgIGFkZHIsIHNpemUsIGNhcGFjaXR5KCkpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdXRvIGl0ID0gbU1hcHBlZE9mZnNldFNpemUuZmluZChzdGQ6Om1ha2VfcGFpcih1OEFkZHIgLSBtTWFwcGVkQWRkciwgc2l6ZSkpOworICAgIGlmIChpdCA9PSBtTWFwcGVkT2Zmc2V0U2l6ZS5lbmQoKSkgeworICAgICAgICBBTE9HVigiQzJBbGxvY2F0aW9uQmxvYjogdW5yZWNvZ25pemVkIG1hcDogYWRkcj0lcCBzaXplPSV6dSBjYXBhY2l0eT0ldSIsCisgICAgICAgICAgICAgICAgYWRkciwgc2l6ZSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIG1NYXBwZWRPZmZzZXRTaXplLmVyYXNlKGl0KTsKKyAgICBpZiAoIW1NYXBwZWRPZmZzZXRTaXplLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkJsb2I6IHN0aWxsIG1haW50YWluIG1hcHBpbmc6IGFkZHI9JXAgc2l6ZT0lenUgY2FwYWNpdHk9JXUiLAorICAgICAgICAgICAgICAgIGFkZHIsIHNpemUsIGNhcGFjaXR5KCkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIEMyUmVjdCByZWN0KGNhcGFjaXR5KCksIGtMaW5lYXJCdWZmZXJIZWlnaHQpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1HcmFwaGljQWxsb2NhdGlvbi0+dW5tYXAoJm1NYXBwZWRBZGRyLCByZWN0LCBmZW5jZUZkKTsKKyAgICBBTE9HVigiQzJBbGxvY2F0aW9uQmxvYjogbGFzdCB1bm1hcDogYWRkcj0lcCBzaXplPSV6dSBjYXBhY2l0eT0ldSBlcnI9JWQiLAorICAgICAgICAgICAgYWRkciwgc2l6ZSwgY2FwYWNpdHkoKSwgZXJyKTsKKyAgICBtTWFwcGVkQWRkciA9IG51bGxwdHI7CisgICAgcmV0dXJuIGVycjsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQkxPQiBBTExPQ0FUT1IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTE3NSwxMiArMjM1LDEyIEBACiB9CiAKIC8vIHN0YXRpYwotYm9vbCBDMkFsbG9jYXRvckJsb2I6OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKK2Jvb2wgQzJBbGxvY2F0b3JCbG9iOjpDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgewogICAgIHNpemVfdCBjYXBhY2l0eTsKICAgICAvLyBEaXN0aW5ndWlzaCBDMkhhbmRsZSBwdXJlbHkgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYywgb3Igb25lIGFsbG9jYXRlZCB0aHJvdWdoCiAgICAgLy8gQzJBbGxvY2F0b3JCbG9iLCBieSBjaGVja2luZyB0aGUgaGFuZGxlJ3MgaGVpZ2h0IGlzIDEsIGFuZCBpdHMgZm9ybWF0IGlzCiAgICAgLy8gUGl4ZWxGb3JtYXQ6OkJMT0IgYnkgR2V0Q2FwYWNpdHlGcm9tSGFuZGxlKCkuCi0gICAgcmV0dXJuIEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChvKSAmJiBHZXRDYXBhY2l0eUZyb21IYW5kbGUobywgJmNhcGFjaXR5KSA9PSBDMl9PSzsKKyAgICByZXR1cm4gQzJBbGxvY2F0b3JHcmFsbG9jOjpDaGVja0hhbmRsZShvKSAmJiBHZXRDYXBhY2l0eUZyb21IYW5kbGUobywgJmNhcGFjaXR5KSA9PSBDMl9PSzsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCmluZGV4IGUxZTEzNzcuLjU5NDcxYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KIAogI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CkBAIC0xMDMsNyArMTA0LDcgQEAKICAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFHSUMgPSAnXHhjMmdyXHgwMCc7CiAKICAgICBzdGF0aWMKLSAgICBjb25zdCBFeHRyYURhdGEqIGdldEV4dHJhRGF0YShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgY29uc3QgRXh0cmFEYXRhKiBHZXRFeHRyYURhdGEoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgewogICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIKICAgICAgICAgICAgICAgICB8fCBuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoaGFuZGxlKQogICAgICAgICAgICAgICAgIHx8IGhhbmRsZS0+bnVtSW50cyA8IE5VTV9JTlRTKSB7CkBAIC0xMTQsMjMgKzExNSwyMyBAQAogICAgIH0KIAogICAgIHN0YXRpYwotICAgIEV4dHJhRGF0YSAqZ2V0RXh0cmFEYXRhKEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXh0cmFEYXRhICo+KGdldEV4dHJhRGF0YShjb25zdF9jYXN0PGNvbnN0IEMySGFuZGxlICpjb25zdD4oaGFuZGxlKSkpOworICAgIEV4dHJhRGF0YSAqR2V0RXh0cmFEYXRhKEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXh0cmFEYXRhICo+KEdldEV4dHJhRGF0YShjb25zdF9jYXN0PGNvbnN0IEMySGFuZGxlICpjb25zdD4oaGFuZGxlKSkpOwogICAgIH0KIAogcHVibGljOgogICAgIHZvaWQgZ2V0SWdicERhdGEodWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSBjb25zdCB7Ci0gICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqZWQgPSBnZXRFeHRyYURhdGEodGhpcyk7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqZWQgPSBHZXRFeHRyYURhdGEodGhpcyk7CiAgICAgICAgICpnZW5lcmF0aW9uID0gZWQtPmdlbmVyYXRpb247CiAgICAgICAgICppZ2JwX2lkID0gdW5zaWduZWQoZWQtPmlnYnBfaWRfbG8pIHwgdWludDY0X3QodW5zaWduZWQoZWQtPmlnYnBfaWRfaGkpKSA8PCAzMjsKICAgICAgICAgKmlnYnBfc2xvdCA9IGVkLT5pZ2JwX3Nsb3Q7CiAgICAgfQogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqY29uc3QgbykgeworICAgIHN0YXRpYyBib29sIElzVmFsaWQoY29uc3QgQzJIYW5kbGUgKmNvbnN0IG8pIHsKICAgICAgICAgaWYgKG8gPT0gbnVsbHB0cikgeyAvLyBudWxsIGhhbmRsZSBpcyBhbHdheXMgdmFsaWQKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEobyk7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBHZXRFeHRyYURhdGEobyk7CiAgICAgICAgIC8vIHdlIGNhbm5vdCB2YWxpZGF0ZSB3aWR0aC9oZWlnaHQvZm9ybWF0L3VzYWdlIHdpdGhvdXQgYWNjZXNzaW5nIGdyYWxsb2MgZHJpdmVyCiAgICAgICAgIHJldHVybiB4ZCAhPSBudWxscHRyICYmIHhkLT5tYWdpYyA9PSBNQUdJQzsKICAgICB9CkBAIC0xNTIsNyArMTUzLDcgQEAKICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzICsgTlVNX0lOVFMpOwogICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cykpOwotICAgICAgICAgICAgKmdldEV4dHJhRGF0YShyZXMpID0geGQ7CisgICAgICAgICAgICAqR2V0RXh0cmFEYXRhKHJlcykgPSB4ZDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDMkhhbmRsZUdyYWxsb2MgKj4ocmVzKTsKICAgICB9CkBAIC0xODAsMTAgKzE4MSwxMCBAQAogICAgIHN0YXRpYyBib29sIE1pZ3JhdGVOYXRpdmVIYW5kbGUoCiAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQsIHVpbnQzMl90IGlnYnBfc2xvdCkgewotICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIgfHwgIWlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIgfHwgIUlzVmFsaWQoaGFuZGxlKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIEV4dHJhRGF0YSAqZWQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgRXh0cmFEYXRhICplZCA9IEdldEV4dHJhRGF0YShoYW5kbGUpOwogICAgICAgICBpZiAoIWVkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGVkLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKICAgICAgICAgZWQtPmlnYnBfaWRfbG8gPSB1aW50MzJfdChpZ2JwX2lkICYgMHhGRkZGRkZGRik7CkBAIC0xOTUsNyArMTk2LDcgQEAKIAogICAgIHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QqIFVud3JhcE5hdGl2ZUhhbmRsZSgKICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKLSAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gR2V0RXh0cmFEYXRhKGhhbmRsZSk7CiAgICAgICAgIGlmICh4ZCA9PSBudWxscHRyIHx8IHhkLT5tYWdpYyAhPSBNQUdJQykgewogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KQEAgLTIxMSw3ICsyMTIsNyBAQAogICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LAogICAgICAgICAgICAgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAogICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7Ci0gICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IEdldEV4dHJhRGF0YShoYW5kbGUpOwogICAgICAgICBpZiAoeGQgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KQEAgLTI1Myw3ICsyNTQsNyBAQAogICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbkdyYWxsb2MoKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAotICAgICAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICAgICAgQzJSZWN0IGMyUmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCiAgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAoCiAgICAgICAgICAgICB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovLCBDMlJlY3QgcmVjdCwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8pIG92ZXJyaWRlOwpAQCAtMzM2LDggKzMzNywxMiBAQAogfQogCiBjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25HcmFsbG9jOjptYXAoCi0gICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgQzJSZWN0IGMyUmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCiAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgeworICAgIGNvbnN0IFJlY3QgcmVjdHsoaW50MzJfdCljMlJlY3QubGVmdCwgKGludDMyX3QpYzJSZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGMyUmVjdC5sZWZ0ICsgYzJSZWN0LndpZHRoKSAvKiByaWdodCAqLywKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGMyUmVjdC50b3AgKyBjMlJlY3QuaGVpZ2h0KSAvKiBib3R0b20gKi99OworCiAgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gc3RhdGljX2Nhc3Q8QzJBbmRyb2lkTWVtb3J5VXNhZ2U+KHVzYWdlKS5hc0dyYWxsb2NVc2FnZSgpOwogICAgIEFMT0dWKCJtYXBwaW5nIGJ1ZmZlciB3aXRoIHVzYWdlICUjbGx4ID0+ICUjbGx4IiwKICAgICAgICAgICAobG9uZyBsb25nKXVzYWdlLmV4cGVjdGVkLCAobG9uZyBsb25nKWdyYWxsb2NVc2FnZSk7CkBAIC0zODYsMTAgKzM5MSw3IEBACiAgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50ZXIpOworICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmcG9pbnRlcik7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhSR0JBXzEwMTAxMDIpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKQEAgLTQ2NCwxMCArNDY2LDcgQEAKICAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOwogICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmcG9pbnRlcik7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhSR0JBXzg4ODgpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKQEAgLTUyNCwxMCArNTIzLDcgQEAKICAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOwogICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmcG9pbnRlcik7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhCTE9CKSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CkBAIC01NDQsMTAgKzU0MCw3IEBACiAgICAgICAgICAgICBhbmRyb2lkX3ljYmNyIHljYmNyTGF5b3V0OwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrWUNiQ3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmeWNiY3JMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsIHJlY3QsICZ5Y2JjckxheW91dCk7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9ja1lDYkNyIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKQEAgLTc4NCw4ICs3NzcsOSBAQAogICAgIHJldHVybiBtSW1wbC0+c3RhdHVzKCk7CiB9CiAKLWJvb2wgQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7Ci0gICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6aXNWYWxpZChvKTsKKy8vIHN0YXRpYworYm9vbCBDMkFsbG9jYXRvckdyYWxsb2M6OkNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6SXNWYWxpZChvKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCmluZGV4IDZkMjdhMDIuLjg1NjIzYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAKQEAgLTczLDcgKzczLDcgQEAKIH07CiAKIC8vIHN0YXRpYwotYm9vbCBDMkhhbmRsZUlvbjo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pIHsKK2Jvb2wgQzJIYW5kbGVJb246OklzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKSB7CiAgICAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgICAgIHJldHVybiBtSW5pdDsKICAgICB9CiAKLSAgICBpZiAoIUMySGFuZGxlSW9uOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICBpZiAoIUMySGFuZGxlSW9uOjpJc1ZhbGlkKGhhbmRsZSkpIHsKICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU5Niw5ICs1OTYsOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wgQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKLSAgICByZXR1cm4gQzJIYW5kbGVJb246OmlzVmFsaWQobyk7Citib29sIEMyQWxsb2NhdG9ySW9uOjpDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUlvbjo6SXNWYWxpZChvKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAKaW5kZXggMGIwOGYzMS4uMTQzMzU1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApAQCAtMTA2LDYgKzEwNiw3IEBACiBjbGFzcyBCdWZmZXJEYXRhQnVkZHkgOiBwdWJsaWMgQzJCdWZmZXJEYXRhIHsKICAgICB1c2luZyBDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YTsKICAgICBmcmllbmQgY2xhc3MgOjpDMkJ1ZmZlcjsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkluZm9CdWZmZXI7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTM5NiwyNiArMzk3LDE4IEBACiBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSkgewogICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/Ci0gICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcj4gc0FsbG9jYXRvciA9IFtdewotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OkdldFByZWZlcnJlZExpbmVhckFsbG9jYXRvcklkKGFuZHJvaWQ6OkdldENvZGVjMlBvb2xNYXNrKCkpID09Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCTE9CKSB7Ci0gICAgICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yQmxvYj4oYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCTE9CKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JJb24+KGFuZHJvaWQ6OkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OKTsKLSAgICAgICAgfQorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IHNBbGxvY2F0b3IgPSBbXXsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmYWxsb2NhdG9yKTsKKwogICAgICAgICByZXR1cm4gYWxsb2NhdG9yOwogICAgIH0oKTsKIAogICAgIGlmIChzQWxsb2NhdG9yID09IG51bGxwdHIpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgYm9vbCBpc1ZhbGlkSGFuZGxlID0gZmFsc2U7Ci0gICAgaWYgKHNBbGxvY2F0b3ItPmdldElkKCkgPT0gYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCTE9CKSB7Ci0gICAgICAgIGlzVmFsaWRIYW5kbGUgPSBDMkFsbG9jYXRvckJsb2I6OmlzVmFsaWQoaGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpc1ZhbGlkSGFuZGxlID0gQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoaGFuZGxlKTsKLSAgICB9CisgICAgYm9vbCBpc1ZhbGlkSGFuZGxlID0gc0FsbG9jYXRvci0+Y2hlY2tIYW5kbGUoaGFuZGxlKTsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOwogICAgIGlmIChpc1ZhbGlkSGFuZGxlKSB7CkBAIC00MzEsMjYgKzQyNCwxOCBAQAogc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCiAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CiAgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KLSAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yPiBzQWxsb2NhdG9yID0gW117Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOwotICAgICAgICBpZiAoYW5kcm9pZDo6R2V0UHJlZmVycmVkTGluZWFyQWxsb2NhdG9ySWQoYW5kcm9pZDo6R2V0Q29kZWMyUG9vbE1hc2soKSkgPT0KLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpIHsKLSAgICAgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JCbG9iPihhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04pOwotICAgICAgICB9CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gc0FsbG9jYXRvciA9IFtdeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0gYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworCiAgICAgICAgIHJldHVybiBhbGxvY2F0b3I7CiAgICAgfSgpOwogCiAgICAgaWYgKHNBbGxvY2F0b3IgPT0gbnVsbHB0cikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBib29sIGlzVmFsaWRIYW5kbGUgPSBmYWxzZTsKLSAgICBpZiAoc0FsbG9jYXRvci0+Z2V0SWQoKSA9PSBhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpIHsKLSAgICAgICAgaXNWYWxpZEhhbmRsZSA9IEMyQWxsb2NhdG9yQmxvYjo6aXNWYWxpZChjSGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpc1ZhbGlkSGFuZGxlID0gQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY0hhbmRsZSk7Ci0gICAgfQorICAgIGJvb2wgaXNWYWxpZEhhbmRsZSA9IHNBbGxvY2F0b3ItPmNoZWNrSGFuZGxlKGNIYW5kbGUpOwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CiAgICAgaWYgKGlzVmFsaWRIYW5kbGUpIHsKQEAgLTExNDgsNyArMTEzMyw3IEBACiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7Ci0gICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjSGFuZGxlKSkgeworICAgIGlmIChzQWxsb2NhdG9yLT5pc1ZhbGlkKGNIYW5kbGUpKSB7CiAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oY0hhbmRsZSwgJmFsbG9jKTsKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQogICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKQEAgLTExODUsNiArMTE3MCw3IEBACiAgICAgdHlwZV90IG1UeXBlOwogICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gbUxpbmVhckJsb2NrczsKICAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBtR3JhcGhpY0Jsb2NrczsKKyAgICBmcmllbmQgY2xhc3MgQzJJbmZvQnVmZmVyOwogfTsKIAogQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IG1JbXBsKG5ldyBJbXBsKGJsb2NrcykpIHt9CkBAIC0xMjAwLDYgKzExODYsMzUgQEAKICAgICByZXR1cm4gbUltcGwtPmdyYXBoaWNCbG9ja3MoKTsKIH0KIAorQzJJbmZvQnVmZmVyOjpDMkluZm9CdWZmZXIoCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICA6IG1JbmRleChpbmRleCksIG1EYXRhKEJ1ZmZlckRhdGFCdWRkeShibG9ja3MpKSB7Cit9CisKK0MySW5mb0J1ZmZlcjo6QzJJbmZvQnVmZmVyKAorICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgIDogbUluZGV4KGluZGV4KSwgbURhdGEoQnVmZmVyRGF0YUJ1ZGR5KGJsb2NrcykpIHsKK30KKworQzJJbmZvQnVmZmVyOjpDMkluZm9CdWZmZXIoCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IEMyQnVmZmVyRGF0YSAmZGF0YSkKKyAgICA6IG1JbmRleChpbmRleCksIG1EYXRhKGRhdGEpIHsKK30KKworLy8gc3RhdGljCitDMkluZm9CdWZmZXIgQzJJbmZvQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZibG9jaykgeworICAgIHJldHVybiBDMkluZm9CdWZmZXIoaW5kZXguY29yZUluZGV4KCkgfCBDMlBhcmFtOjpJbmRleDo6S0lORF9JTkZPIHwgQzJQYXJhbTo6SW5kZXg6OkRJUl9HTE9CQUwsCisgICAgICAgICAgICAgICAgICAgICAgICB7IGJsb2NrIH0pOworfQorCisvLyBzdGF0aWMKK0MySW5mb0J1ZmZlciBDMkluZm9CdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spIHsKKyAgICByZXR1cm4gQzJJbmZvQnVmZmVyKGluZGV4LmNvcmVJbmRleCgpIHwgQzJQYXJhbTo6SW5kZXg6OktJTkRfSU5GTyB8IEMyUGFyYW06OkluZGV4OjpESVJfR0xPQkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgeyBibG9jayB9KTsKK30KKwogY2xhc3MgQzJCdWZmZXI6OkltcGwgewogcHVibGljOgogICAgIEltcGwoQzJCdWZmZXIgKnRoaXosIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKQEAgLTEzMzAsNCArMTM0NSwzIEBACiBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKSB7CiAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOwogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkRtYUJ1ZkFsbG9jYXRvci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkRtYUJ1ZkFsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllODJlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyRG1hQnVmQWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJEbWFCdWZBbGxvY2F0b3IiCisjaW5jbHVkZSA8QnVmZmVyQWxsb2NhdG9yL0J1ZmZlckFsbG9jYXRvci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyRG1hQnVmQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8QzJFcnJub1V0aWxzLmg+CisjaW5jbHVkZSA8bGludXgvaW9uLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIGdldHBhZ2VzaXplLCBzaXplX3QsIGNsb3NlLCBkdXAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpZmRlZiBfX0FORFJPSURfQVBFWF9fCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7Citjb25zdGV4cHIgc2l6ZV90IFVTQUdFX0xSVV9DQUNIRV9TSVpFID0gMTAyNDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09IEJVRkZFUiBIQU5ETEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKioKKyAqIEJ1ZmZlciBoYW5kbGUKKyAqCisgKiBTdG9yZXMgZG1hYnVmIGZkICYgbWV0YWRhdGEKKyAqCisgKiBUaGlzIGhhbmRsZSB3aWxsIG5vdCBjYXB0dXJlIG1hcHBlZCBmZC1zIGFzIHVwZGF0aW5nIHRoYXQgd291bGQgcmVxdWlyZSBhCisgKiBnbG9iYWwgbXV0ZXguCisgKi8KKworc3RydWN0IEMySGFuZGxlQnVmIDogcHVibGljIEMySGFuZGxlIHsKKyAgICBDMkhhbmRsZUJ1ZihpbnQgYnVmZmVyRmQsIHNpemVfdCBzaXplKQorICAgICAgICA6IEMySGFuZGxlKGNIZWFkZXIpLAorICAgICAgICAgIG1GZHN7YnVmZmVyRmR9LAorICAgICAgICAgIG1JbnRze2ludChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpY30ge30KKworICAgIHN0YXRpYyBib29sIElzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgaW50IGJ1ZmZlckZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQnVmZmVyOyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1CdWZmZXI7ICAvLyBkbWFidWYgZmQKKyAgICB9IG1GZHM7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1TaXplTG87ICAvLyBsb3cgMzItYml0cyBvZiBzaXplCisgICAgICAgIGludCBtU2l6ZUhpOyAgLy8gaGlnaCAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1NYWdpYzsKKyAgICB9IG1JbnRzOworCisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgQzJIYW5kbGVCdWYgX3R5cGU7CisgICAgZW51bSB7CisgICAgICAgIGtNYWdpYyA9ICdceGMyaW9ceDAwJywKKyAgICAgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIHZlcnNpb24gPSBzaXplb2YoQzJIYW5kbGUpCisgICAgfTsKKyAgICAvLyBjb25zdGV4cHIgc3RhdGljIEMySGFuZGxlIGNIZWFkZXIgPSB7IHZlcnNpb24sIG51bUZkcywgbnVtSW50cywge30gfTsKKyAgICBjb25zdCBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlcjsKK307CisKK2NvbnN0IEMySGFuZGxlIEMySGFuZGxlQnVmOjpjSGVhZGVyID0geworICAgICAgICBDMkhhbmRsZUJ1Zjo6dmVyc2lvbiwgQzJIYW5kbGVCdWY6Om51bUZkcywgQzJIYW5kbGVCdWY6Om51bUludHMsIHt9fTsKKworLy8gc3RhdGljCitib29sIEMySGFuZGxlQnVmOjpJc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMySGFuZGxlQnVmKiBvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEMySGFuZGxlQnVmKj4obyk7CisgICAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gRE1BQlVGIEFMTE9DQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkRtYUJ1ZkFsbG9jYXRpb24gOiBwdWJsaWMgQzJMaW5lYXJBbGxvY2F0aW9uIHsKKyAgIHB1YmxpYzoKKyAgICAvKiBJbnRlcmZhY2UgbWV0aG9kcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlKiBmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogYWRkciAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlKiBmZW5jZUZkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIH5DMkRtYUJ1ZkFsbG9jYXRpb24oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGNvbnN0IEMySGFuZGxlKiBoYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+JiBvdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBpbnRlcm5hbCBtZXRob2RzCisgICAgQzJEbWFCdWZBbGxvY2F0aW9uKEJ1ZmZlckFsbG9jYXRvciYgYWxsb2MsIHNpemVfdCBzaXplLCBDMlN0cmluZyBoZWFwX25hbWUsIHVuc2lnbmVkIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisgICAgQzJEbWFCdWZBbGxvY2F0aW9uKHNpemVfdCBzaXplLCBpbnQgc2hhcmVGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcEludGVybmFsKHNpemVfdCBtYXBTaXplLCBzaXplX3QgbWFwT2Zmc2V0LCBzaXplX3QgYWxpZ25tZW50Qnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvdCwgaW50IGZsYWdzLCB2b2lkKiogYmFzZSwgdm9pZCoqIGFkZHIpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgICpiYXNlID0gbW1hcChudWxscHRyLCBtYXBTaXplLCBwcm90LCBmbGFncywgbUhhbmRsZS5idWZmZXJGZCgpLCBtYXBPZmZzZXQpOworICAgICAgICBBTE9HVigibW1hcChzaXplID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQsIG1hcEZkID0gJWQsIG9mZnNldCA9ICV6dSkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtSGFuZGxlLmJ1ZmZlckZkKCksIG1hcE9mZnNldCwgZXJybm8pOworICAgICAgICBpZiAoKmJhc2UgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgKmJhc2UgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPihlcnJubyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90KikqYmFzZSArIGFsaWdubWVudEJ5dGVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgbUlkOworICAgIEMySGFuZGxlQnVmIG1IYW5kbGU7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3RydWN0IE1hcHBpbmcgeworICAgICAgICB2b2lkKiBhZGRyOworICAgICAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIHNpemVfdCBzaXplOworICAgIH07CisgICAgc3RkOjpsaXN0PE1hcHBpbmc+IG1NYXBwaW5nczsKKworICAgIC8vIFRPRE86IHdlIGNvdWxkIG1ha2UgdGhpcyBlbmNhcHN1bGF0ZSBzaGFyZWRfcHRyIGFuZCBjb3BpYWJsZQorICAgIEMyX0RPX05PVF9DT1BZKEMyRG1hQnVmQWxsb2NhdGlvbik7Cit9OworCitjMl9zdGF0dXNfdCBDMkRtYUJ1ZkFsbG9jYXRpb246Om1hcChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSogZmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogYWRkcikgeworICAgICh2b2lkKWZlbmNlOyAgLy8gVE9ETzogd2FpdCBmb3IgZmVuY2UKKyAgICAqYWRkciA9IG51bGxwdHI7CisgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigibXVsdGlwbGUgbWFwIik7CisgICAgICAgIC8vIFRPRE86IHRlY2huaWNhbGx5IHdlIHNob3VsZCByZXR1cm4gRFVQTElDQVRFIGhlcmUsIGJ1dCBvdXIgYmxvY2sgdmlld3MKKyAgICAgICAgLy8gZG9uJ3QgYWN0dWFsbHkgdW5tYXAsIHNvIHdlIGVuZCB1cCByZW1hcHBpbmcgdGhlIGJ1ZmZlciBtdWx0aXBsZSB0aW1lcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCBwcm90ID0gUFJPVF9OT05FOworICAgIGludCBmbGFncyA9IE1BUF9TSEFSRUQ7CisgICAgaWYgKHVzYWdlLmV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpIHsKKyAgICAgICAgcHJvdCB8PSBQUk9UX1JFQUQ7CisgICAgfQorICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkgeworICAgICAgICBwcm90IHw9IFBST1RfV1JJVEU7CisgICAgfQorCisgICAgc2l6ZV90IGFsaWdubWVudEJ5dGVzID0gb2Zmc2V0ICUgUEFHRV9TSVpFOworICAgIHNpemVfdCBtYXBPZmZzZXQgPSBvZmZzZXQgLSBhbGlnbm1lbnRCeXRlczsKKyAgICBzaXplX3QgbWFwU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnRCeXRlczsKKyAgICBNYXBwaW5nIG1hcCA9IHtudWxscHRyLCBhbGlnbm1lbnRCeXRlcywgbWFwU2l6ZX07CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgbWFwSW50ZXJuYWwobWFwU2l6ZSwgbWFwT2Zmc2V0LCBhbGlnbm1lbnRCeXRlcywgcHJvdCwgZmxhZ3MsICYobWFwLmFkZHIpLCBhZGRyKTsKKyAgICBpZiAobWFwLmFkZHIpIHsKKyAgICAgICAgbU1hcHBpbmdzLnB1c2hfYmFjayhtYXApOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitjMl9zdGF0dXNfdCBDMkRtYUJ1ZkFsbG9jYXRpb246OnVubWFwKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlKiBmZW5jZSkgeworICAgIGlmIChtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICBBTE9HRCgidHJpZWQgdG8gdW5tYXAgdW5tYXBwZWQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorICAgIGZvciAoYXV0byBpdCA9IG1NYXBwaW5ncy5iZWdpbigpOyBpdCAhPSBtTWFwcGluZ3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGFkZHIgIT0gKHVpbnQ4X3QqKWl0LT5hZGRyICsgaXQtPmFsaWdubWVudEJ5dGVzIHx8CisgICAgICAgICAgICBzaXplICsgaXQtPmFsaWdubWVudEJ5dGVzICE9IGl0LT5zaXplKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZXJyID0gbXVubWFwKGl0LT5hZGRyLCBpdC0+c2l6ZSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoIm11bm1hcCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBjMl9tYXBfZXJybm88RUlOVkFMPihlcnJubyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICAqZmVuY2UgPSBDMkZlbmNlKCk7ICAvLyBub3QgdXNpbmcgZmVuY2VzCisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpbU1hcHBpbmdzLmVyYXNlKGl0KTsKKyAgICAgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSB1bm1hcHBlZDogJWQiLCBtSGFuZGxlLmJ1ZmZlckZkKCkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIEFMT0dEKCJ1bm1hcCBmYWlsZWQgdG8gZmluZCBzcGVjaWZpZWQgbWFwIik7CisgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKK30KKworYzJfc3RhdHVzX3QgQzJEbWFCdWZBbGxvY2F0aW9uOjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0OworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkRtYUJ1ZkFsbG9jYXRpb246OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSWQ7Cit9CisKK2Jvb2wgQzJEbWFCdWZBbGxvY2F0aW9uOjplcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4mIG90aGVyKSBjb25zdCB7CisgICAgaWYgKCFvdGhlciB8fCBvdGhlci0+Z2V0QWxsb2NhdG9ySWQoKSAhPSBnZXRBbGxvY2F0b3JJZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gZ2V0IHVzZXIgaGFuZGxlIHRvIGNvbXBhcmUgb2JqZWN0cworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkRtYUJ1ZkFsbG9jYXRpb24+IG90aGVyQXNCdWYgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyRG1hQnVmQWxsb2NhdGlvbj4ob3RoZXIpOworICAgIHJldHVybiBtSGFuZGxlLmJ1ZmZlckZkKCkgPT0gb3RoZXJBc0J1Zi0+bUhhbmRsZS5idWZmZXJGZCgpOworfQorCitjb25zdCBDMkhhbmRsZSogQzJEbWFCdWZBbGxvY2F0aW9uOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuICZtSGFuZGxlOworfQorCitDMkRtYUJ1ZkFsbG9jYXRpb246On5DMkRtYUJ1ZkFsbG9jYXRpb24oKSB7CisgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICBBTE9HRCgiRGFuZ2xpbmcgbWFwcGluZ3MhIik7CisgICAgICAgIGZvciAoY29uc3QgTWFwcGluZyYgbWFwIDogbU1hcHBpbmdzKSB7CisgICAgICAgICAgICBpbnQgZXJyID0gbXVubWFwKG1hcC5hZGRyLCBtYXAuc2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyKSBBTE9HRCgibXVubWFwIGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICB9Cit9CisKK0MyRG1hQnVmQWxsb2NhdGlvbjo6QzJEbWFCdWZBbGxvY2F0aW9uKEJ1ZmZlckFsbG9jYXRvciYgYWxsb2MsIHNpemVfdCBzaXplLCBDMlN0cmluZyBoZWFwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpCisgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZSksIG1IYW5kbGUoLTEsIDApIHsKKyAgICBpbnQgYnVmZmVyRmQgPSAtMTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGJ1ZmZlckZkID0gYWxsb2MuQWxsb2MoaGVhcF9uYW1lLCBzaXplLCBmbGFncyk7CisgICAgaWYgKGJ1ZmZlckZkIDwgMCkgcmV0ID0gYnVmZmVyRmQ7CisKKyAgICBtSGFuZGxlID0gQzJIYW5kbGVCdWYoYnVmZmVyRmQsIHNpemUpOworICAgIG1JZCA9IGlkOworICAgIG1Jbml0ID0gYzJfc3RhdHVzX3QoYzJfbWFwX2Vycm5vPEVOT01FTSwgRUFDQ0VTLCBFSU5WQUw+KHJldCkpOworfQorCitDMkRtYUJ1ZkFsbG9jYXRpb246OkMyRG1hQnVmQWxsb2NhdGlvbihzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKQorICAgIDogQzJMaW5lYXJBbGxvY2F0aW9uKHNpemUpLCBtSGFuZGxlKC0xLCAwKSB7CisgICAgbUhhbmRsZSA9IEMySGFuZGxlQnVmKHNoYXJlRmQsIHNpemUpOworICAgIG1JZCA9IGlkOworICAgIG1Jbml0ID0gYzJfc3RhdHVzX3QoYzJfbWFwX2Vycm5vPEVOT01FTSwgRUFDQ0VTLCBFSU5WQUw+KDApKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09IERNQUJVRiBBTExPQ0FUT1IgPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitDMkRtYUJ1ZkFsbG9jYXRvcjo6QzJEbWFCdWZBbGxvY2F0b3IoaWRfdCBpZCkgOiBtSW5pdChDMl9PSykgeworICAgIEMyTWVtb3J5VXNhZ2UgbWluVXNhZ2UgPSB7MCwgMH07CisgICAgQzJNZW1vcnlVc2FnZSBtYXhVc2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICBUcmFpdHMgdHJhaXRzID0geyJhbmRyb2lkLmFsbG9jYXRvci5kbWFidWYiLCBpZCwgTElORUFSLCBtaW5Vc2FnZSwgbWF4VXNhZ2V9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWl0cz4odHJhaXRzKTsKK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJEbWFCdWZBbGxvY2F0b3I6OmdldElkKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzLT5pZDsKK30KKworQzJTdHJpbmcgQzJEbWFCdWZBbGxvY2F0b3I6OmdldE5hbWUoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHMtPm5hbWU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPiBDMkRtYUJ1ZkFsbG9jYXRvcjo6Z2V0VHJhaXRzKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzOworfQorCit2b2lkIEMyRG1hQnVmQWxsb2NhdG9yOjpzZXRVc2FnZU1hcHBlcihjb25zdCBVc2FnZU1hcHBlckZuJiBtYXBwZXIgX191bnVzZWQsIHVpbnQ2NF90IG1pblVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbWF4VXNhZ2UsIHVpbnQ2NF90IGJsb2NrU2l6ZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIG1Vc2FnZU1hcHBlckNhY2hlLmNsZWFyKCk7CisgICAgbVVzYWdlTWFwcGVyTHJ1LmNsZWFyKCk7CisgICAgbVVzYWdlTWFwcGVyID0gbWFwcGVyOworICAgIFRyYWl0cyB0cmFpdHMgPSB7bVRyYWl0cy0+bmFtZSwgbVRyYWl0cy0+aWQsIExJTkVBUiwgQzJNZW1vcnlVc2FnZShtaW5Vc2FnZSksCisgICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlKG1heFVzYWdlKX07CisgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhaXRzPih0cmFpdHMpOworICAgIG1CbG9ja1NpemUgPSBibG9ja1NpemU7Cit9CisKK3N0ZDo6c2l6ZV90IEMyRG1hQnVmQWxsb2NhdG9yOjpNYXBwZXJLZXlIYXNoOjpvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSYgaykgY29uc3QgeworICAgIHJldHVybiBzdGQ6Omhhc2g8dWludDY0X3Q+e30oay5maXJzdCkgXiBzdGQ6Omhhc2g8c2l6ZV90Pnt9KGsuc2Vjb25kKTsKK30KKworYzJfc3RhdHVzX3QgQzJEbWFCdWZBbGxvY2F0b3I6Om1hcFVzYWdlKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBjYXBhY2l0eSwgQzJTdHJpbmcqIGhlYXBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCogZmxhZ3MpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9PSzsKKyAgICAvLyBhbGlnbiBjYXBhY2l0eQorICAgIGNhcGFjaXR5ID0gKGNhcGFjaXR5ICsgbUJsb2NrU2l6ZSAtIDEpICYgfihtQmxvY2tTaXplIC0gMSk7CisgICAgTWFwcGVyS2V5IGtleSA9IHN0ZDo6bWFrZV9wYWlyKHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSk7CisgICAgYXV0byBlbnRyeSA9IG1Vc2FnZU1hcHBlckNhY2hlLmZpbmQoa2V5KTsKKyAgICBpZiAoZW50cnkgPT0gbVVzYWdlTWFwcGVyQ2FjaGUuZW5kKCkpIHsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlcikgeworICAgICAgICAgICAgcmVzID0gbVVzYWdlTWFwcGVyKHVzYWdlLCBjYXBhY2l0eSwgaGVhcF9uYW1lLCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBObyBzeXN0ZW0tdW5jYWNoZWQgeWV0LCBzbyBkaXNhYmxlZCBmb3Igbm93CisgICAgICAgICAgICBpZiAoMCAmJiAhKHVzYWdlLmV4cGVjdGVkICYgKEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSkpCisgICAgICAgICAgICAgICAgKmhlYXBfbmFtZSA9ICJzeXN0ZW0tdW5jYWNoZWQiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpoZWFwX25hbWUgPSAic3lzdGVtIjsKKyAgICAgICAgICAgICpmbGFncyA9IDA7CisgICAgICAgICAgICByZXMgPSBDMl9OT19JTklUOworICAgICAgICB9CisgICAgICAgIC8vIGFkZCB1c2FnZSB0byBjYWNoZQorICAgICAgICBNYXBwZXJWYWx1ZSB2YWx1ZSA9IHN0ZDo6bWFrZV90dXBsZSgqaGVhcF9uYW1lLCAqZmxhZ3MsIHJlcyk7CisgICAgICAgIG1Vc2FnZU1hcHBlckxydS5lbXBsYWNlX2Zyb250KGtleSwgdmFsdWUpOworICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGtleSwgbVVzYWdlTWFwcGVyTHJ1LmJlZ2luKCkpKTsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlckNhY2hlLnNpemUoKSA+IFVTQUdFX0xSVV9DQUNIRV9TSVpFKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgTFJVIGVudHJ5CisgICAgICAgICAgICBNYXBwZXJLZXkgbHJ1S2V5ID0gbVVzYWdlTWFwcGVyTHJ1LmZyb250KCkuZmlyc3Q7CisgICAgICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lcmFzZShscnVLZXkpOworICAgICAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtb3ZlIGVudHJ5IHRvIE1SVQorICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuc3BsaWNlKG1Vc2FnZU1hcHBlckxydS5iZWdpbigpLCBtVXNhZ2VNYXBwZXJMcnUsIGVudHJ5LT5zZWNvbmQpOworICAgICAgICBjb25zdCBNYXBwZXJWYWx1ZSYgdmFsdWUgPSBlbnRyeS0+c2Vjb25kLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dGllKCpoZWFwX25hbWUsICpmbGFncywgcmVzKSA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMkRtYUJ1ZkFsbG9jYXRvcjo6bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+KiBhbGxvY2F0aW9uKSB7CisgICAgaWYgKGFsbG9jYXRpb24gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGFsbG9jYXRpb24tPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBDMlN0cmluZyBoZWFwX25hbWU7CisgICAgdW5zaWduZWQgZmxhZ3MgPSAwOworICAgIGMyX3N0YXR1c190IHJldCA9IG1hcFVzYWdlKHVzYWdlLCBjYXBhY2l0eSwgJmhlYXBfbmFtZSwgJmZsYWdzKTsKKyAgICBpZiAocmV0ICYmIHJldCAhPSBDMl9OT19JTklUKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRG1hQnVmQWxsb2NhdGlvbj4gYWxsb2MgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyRG1hQnVmQWxsb2NhdGlvbj4oCisgICAgICAgICAgICBtQnVmZmVyQWxsb2NhdG9yLCBjYXBhY2l0eSwgaGVhcF9uYW1lLCBmbGFncywgZ2V0SWQoKSk7CisgICAgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYzJfc3RhdHVzX3QgQzJEbWFCdWZBbGxvY2F0b3I6OnByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4qIGFsbG9jYXRpb24pIHsKKyAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBpZiAoIUMySGFuZGxlQnVmOjpJc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBnZXQgY2FwYWNpdHkgYW5kIHZhbGlkYXRlIGl0CisgICAgY29uc3QgQzJIYW5kbGVCdWYqIGggPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUJ1Zio+KGhhbmRsZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRG1hQnVmQWxsb2NhdGlvbj4gYWxsb2MgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkRtYUJ1ZkFsbG9jYXRpb24+KGgtPnNpemUoKSwgaC0+YnVmZmVyRmQoKSwgZ2V0SWQoKSk7CisgICAgYzJfc3RhdHVzX3QgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoCisgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihyZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCo+KGhhbmRsZSkpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gc3RhdGljCitib29sIEMyRG1hQnVmQWxsb2NhdG9yOjpDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUJ1Zjo6SXNWYWxpZChvKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwCmluZGV4IDRjMzMwZTUuLmJlZTAyOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApAQCAtMzMsNyArMzMsOCBAQAogfSAgLy8gdW5uYW1lZAogCiBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKQotICAgIDogbUNyZWF0ZUJsb2NrUG9vbChudWxscHRyKSB7CisgICAgOiBtQ3JlYXRlQmxvY2tQb29sKG51bGxwdHIpLAorICAgICAgbUNyZWF0ZUFsbG9jYXRvcihudWxscHRyKSB7CiAgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyB8IFJUTERfTk9ERUxFVEUpOwogICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBsb2FkIGxpYnJhcnk6ICVzICglcykiLCBsaWJQYXRoLCBkbGVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcAppbmRleCBkMTY1MjdlLi4xZTkwN2MxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPEMyQWxsb2NhdG9yQmxvYi5oPgogI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgogI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJEbWFCdWZBbGxvY2F0b3IuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KICNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgogI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CkBAIC04Miw2ICs4Myw3IEBACiAKICAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gaW9uIGFsbG9jYXRvcgogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoRG1hQnVmQWxsb2NhdG9yKCk7CiAKICAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gZ3JhbGxvYyBhbGxvY2F0b3IKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoR3JhbGxvY0FsbG9jYXRvcigpOwpAQCAtOTksNiArMTAxLDIwIEBACiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCkgewogfQogCitzdGF0aWMgYm9vbCB1c2luZ19pb24odm9pZCkgeworICAgIHN0YXRpYyBpbnQgY2FjaGVkX3Jlc3VsdCA9IC0xOworCisgICAgaWYgKGNhY2hlZF9yZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmZmVyOworICAgICAgICBjYWNoZWRfcmVzdWx0ID0gKHN0YXQoIi9kZXYvaW9uIiwgJmJ1ZmZlcikgPT0gMCk7CisgICAgICAgIGlmIChjYWNoZWRfcmVzdWx0KQorICAgICAgICAgICAgQUxPR0QoIlVzaW5nIElPTlxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFMT0dEKCJVc2luZyBETUFCVUYgSGVhcHNcbiIpOworICAgIH0KKyAgICByZXR1cm4gKGNhY2hlZF9yZXN1bHQgPT0gMSk7Cit9CisKIGMyX3N0YXR1c190IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoQWxsb2NhdG9yKAogICAgICAgICBpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICpjb25zdCBhbGxvY2F0b3IpIHsKICAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CkBAIC0xMDcsOCArMTIzLDExIEBACiAgICAgfQogICAgIHN3aXRjaCAoaWQpIHsKICAgICAvLyBUT0RPOiBzaG91bGQgd2UgaW1wbGVtZW50IGEgZ2VuZXJpYyByZWdpc3RyeSBmb3IgYWxsLCBhbmQgdXNlIHRoYXQ/Ci0gICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKLSAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoSW9uQWxsb2NhdG9yKCk7CisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjogLyogYWxzbyA6OkRNQUJVRkhFQVAgKi8KKyAgICAgICAgaWYgKHVzaW5nX2lvbigpKQorICAgICAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoSW9uQWxsb2NhdG9yKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaERtYUJ1ZkFsbG9jYXRvcigpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgpAQCAtMTQyLDcgKzE2MSw5IEBACiBuYW1lc3BhY2UgewogCiBzdGQ6Om11dGV4IGdJb25BbGxvY2F0b3JNdXRleDsKK3N0ZDo6bXV0ZXggZ0RtYUJ1ZkFsbG9jYXRvck11dGV4Owogc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcklvbj4gZ0lvbkFsbG9jYXRvcjsKK3N0ZDo6d2Vha19wdHI8QzJEbWFCdWZBbGxvY2F0b3I+IGdEbWFCdWZBbGxvY2F0b3I7CiAKIHZvaWQgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yLApAQCAtMTk3LDYgKzIxOCw2NSBAQAogICAgIGFsbG9jYXRvci0+c2V0VXNhZ2VNYXBwZXIobWFwcGVyLCBtaW5Vc2FnZSwgbWF4VXNhZ2UsIGJsb2NrU2l6ZSk7CiB9CiAKK3ZvaWQgVXNlQ29tcG9uZW50U3RvcmVGb3JEbWFCdWZBbGxvY2F0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRG1hQnVmQWxsb2NhdG9yPiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgeworICAgIEMyRG1hQnVmQWxsb2NhdG9yOjpVc2FnZU1hcHBlckZuIG1hcHBlcjsKKyAgICBjb25zdCBzaXplX3QgbWF4SGVhcE5hbWVMZW4gPSAxMjg7CisgICAgdWludDY0X3QgbWluVXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IG1heFVzYWdlID0gQzJNZW1vcnlVc2FnZShDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKS5leHBlY3RlZDsKKyAgICBzaXplX3QgYmxvY2tTaXplID0gZ2V0cGFnZXNpemUoKTsKKworICAgIC8vIHF1ZXJ5IG1pbiBhbmQgbWF4IHVzYWdlIGFzIHdlbGwgYXMgYmxvY2sgc2l6ZSB2aWEgc3VwcG9ydGVkIHZhbHVlcworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvPiB1c2FnZUluZm87CisgICAgdXNhZ2VJbmZvID0gQzJTdG9yZURtYUJ1ZlVzYWdlSW5mbzo6QWxsb2NVbmlxdWUobWF4SGVhcE5hbWVMZW4pOworCisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBxdWVyeSA9IHsKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkOjpNYWtlKCp1c2FnZUluZm8sIHVzYWdlSW5mby0+bS51c2FnZSkpLAorICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZSgKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkOjpNYWtlKCp1c2FnZUluZm8sIHVzYWdlSW5mby0+bS5jYXBhY2l0eSkpLAorICAgIH07CisgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKHF1ZXJ5KTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIGlmIChxdWVyeVswXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMmIGZzdiA9IHF1ZXJ5WzBdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUyAmJiAhZnN2LnZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbWluVXNhZ2UgPSBmc3YudmFsdWVzWzBdLnU2NDsKKyAgICAgICAgICAgICAgICBtYXhVc2FnZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGZzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4VXNhZ2UgfD0gdi51NjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChxdWVyeVsxXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMmIGZzdiA9IHF1ZXJ5WzFdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSAmJiBmc3YucmFuZ2Uuc3RlcC51MzIgPiAwKSB7CisgICAgICAgICAgICAgICAgYmxvY2tTaXplID0gZnN2LnJhbmdlLnN0ZXAudTMyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWFwcGVyID0gW3N0b3JlXShDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3QgY2FwYWNpdHksIEMyU3RyaW5nKiBoZWFwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCogZmxhZ3MpIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgIGlmIChjYXBhY2l0eSA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdG9yZURtYUJ1ZlVzYWdlSW5mbz4gdXNhZ2VJbmZvOworICAgICAgICAgICAgdXNhZ2VJbmZvID0gQzJTdG9yZURtYUJ1ZlVzYWdlSW5mbzo6QWxsb2NVbmlxdWUobWF4SGVhcE5hbWVMZW4sIHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7ICAvLyBUT0RPOiByZW1vdmUKKworICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPmNvbmZpZ19zbSh7Jip1c2FnZUluZm99LCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICpoZWFwTmFtZSA9IEMyU3RyaW5nKHVzYWdlSW5mby0+bS5oZWFwTmFtZSk7CisgICAgICAgICAgICAgICAgKmZsYWdzID0gdXNhZ2VJbmZvLT5tLmFsbG9jRmxhZ3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH07CisgICAgfQorCisgICAgYWxsb2NhdG9yLT5zZXRVc2FnZU1hcHBlcihtYXBwZXIsIG1pblVzYWdlLCBtYXhVc2FnZSwgYmxvY2tTaXplKTsKK30KKwogfQogCiB2b2lkIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OnNldENvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgewpAQCAtMjMzLDYgKzMxMywyMiBAQAogICAgIHJldHVybiBhbGxvY2F0b3I7CiB9CiAKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hEbWFCdWZBbGxvY2F0b3IoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0RtYUJ1ZkFsbG9jYXRvck11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJEbWFCdWZBbGxvY2F0b3I+IGFsbG9jYXRvciA9IGdEbWFCdWZBbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmU7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jayk7CisgICAgICAgICAgICBjb21wb25lbnRTdG9yZSA9IF9tQ29tcG9uZW50U3RvcmU7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkRtYUJ1ZkFsbG9jYXRvcj4oQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpETUFCVUZIRUFQKTsKKyAgICAgICAgVXNlQ29tcG9uZW50U3RvcmVGb3JEbWFCdWZBbGxvY2F0b3IoYWxsb2NhdG9yLCBjb21wb25lbnRTdG9yZSk7CisgICAgICAgIGdEbWFCdWZBbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hCbG9iQWxsb2NhdG9yKCkgewogICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OwogICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9yPiBibG9iQWxsb2NhdG9yOwpAQCAtMzQ3LDcgKzQ0Myw3IEBACiAgICAgICAgICAgICBhbGxvY2F0b3JJZCA9IEdldFByZWZlcnJlZExpbmVhckFsbG9jYXRvcklkKEdldENvZGVjMlBvb2xNYXNrKCkpOwogICAgICAgICB9CiAgICAgICAgIHN3aXRjaChhbGxvY2F0b3JJZCkgewotICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT046IC8qIGFsc28gOjpETUFCVUZIRUFQICovCiAgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04sICZhbGxvY2F0b3IpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKQEAgLTY0NSw2ICs3NDEsNyBAQAogCiAgICAgc3RydWN0IEludGVyZmFjZSA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlSW9uVXNhZ2VJbmZvPiBtSW9uVXNhZ2VJbmZvOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdG9yZURtYUJ1ZlVzYWdlSW5mbz4gbURtYUJ1ZlVzYWdlSW5mbzsKIAogICAgICAgICBJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCiAgICAgICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKHJlZmxlY3RvcikgewpAQCAtNjgwLDcgKzc3NywxMyBAQAogICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5taW5BbGlnbm1lbnQgPSAwOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBzdGF0aWMgQzJSIHNldERtYUJ1ZlVzYWdlKGJvb2wgLyogbWF5QmxvY2sgKi8sIEMyUDxDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvPiAmbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNweShtZS5zZXQoKS5tLmhlYXBOYW1lLCAic3lzdGVtIiwgbWUudi5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLm0uYWxsb2NGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKQEAgLTY5NSw2ICs3OTgsMTggQEAKICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjo6c2V0SW9uVXNhZ2UpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURtYUJ1ZlVzYWdlSW5mbywgImRtYWJ1Zi11c2FnZSIpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3RvcmVEbWFCdWZVc2FnZUluZm86OkFsbG9jU2hhcmVkKDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EbWFCdWZVc2FnZUluZm8sIG0udXNhZ2UpLmZsYWdzKHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgbS5jYXBhY2l0eSkuaW5SYW5nZSgwLCBVSU5UMzJfTUFYLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EbWFCdWZVc2FnZUluZm8sIG0uYWxsb2NGbGFncykuZmxhZ3Moe30pLAorICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgbS5oZWFwTmFtZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI6OnNldERtYUJ1ZlVzYWdlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgfQogICAgIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JCbG9iLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yQmxvYi5oCmluZGV4IDg5Y2U5NDkuLmZjNjdhZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JCbG9iLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckJsb2IuaApAQCAtNDQsNyArNDQsMTIgQEAKIAogICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yQmxvYigpIG92ZXJyaWRlOwogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQorCisgICAgc3RhdGljIGJvb2wgQ2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgLy8gZGVwcmVjYXRlZAorICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsgcmV0dXJuIENoZWNrSGFuZGxlKG8pOyB9CiAKIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gbVRyYWl0czsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oCmluZGV4IGVlNzUyNGUuLjU3OGNmNzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApAQCAtODQsNyArODQsMTIgQEAKIAogICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yR3JhbGxvYygpIG92ZXJyaWRlOwogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQorCisgICAgc3RhdGljIGJvb2wgQ2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgLy8gZGVwcmVjYXRlZAorICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsgcmV0dXJuIENoZWNrSGFuZGxlKG8pOyB9CiAKIHByaXZhdGU6CiAgICAgY2xhc3MgSW1wbDsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaAppbmRleCAxYjIwNTFmLi42YTQ5YjdkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCkBAIC01Nyw3ICs1NywxMiBAQAogCiAgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JJb24oKSBvdmVycmlkZTsKIAotICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworICAgIHZpcnR1YWwgYm9vbCBjaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQ2hlY2tIYW5kbGUobyk7IH0KKworICAgIHN0YXRpYyBib29sIENoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKworICAgIC8vIGRlcHJlY2F0ZWQKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQogCiAgICAgLyoqCiAgICAgICogVXBkYXRlcyB0aGUgdXNhZ2UgbWFwcGVyIGZvciBzdWJzZXF1ZW50IG5ldyBhbGxvY2F0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRG1hQnVmQWxsb2NhdG9yLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRG1hQnVmQWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiODMwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEbWFCdWZBbGxvY2F0b3IuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9CVUZfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9CVUZfSF8KKworI2luY2x1ZGUgPEJ1ZmZlckFsbG9jYXRvci9CdWZmZXJBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBzdGF0CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMkRtYUJ1ZkFsbG9jYXRvciA6IHB1YmxpYyBDMkFsbG9jYXRvciB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiogYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlKiBoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+KiBhbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyRG1hQnVmQWxsb2NhdG9yKGlkX3QgaWQpOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtSW5pdDsgfQorCisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQorCisgICAgc3RhdGljIGJvb2wgQ2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBVc2FnZSBtYXBwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYWxsb2NhdG9yCisgICAgLy8gICAodXNhZ2UsIGNhcGFjaXR5KSA9PiAoaGVhcE5hbWUsIGZsYWdzKQorICAgIC8vCisgICAgLy8gY2FwYWNpdHkgaXMgYWxpZ25lZCB0byB0aGUgZGVmYXVsdCBibG9jay1zaXplIChkZWZhdWx0cyB0byBwYWdlIHNpemUpIHRvCisgICAgLy8gcmVkdWNlIGNhY2hpbmcgb3ZlcmhlYWQKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoQzJNZW1vcnlVc2FnZSwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBDMlN0cmluZyosIHVuc2lnbmVkKik+CisgICAgICAgICAgICBVc2FnZU1hcHBlckZuOworCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgdXNhZ2UgbWFwcGVyIGZvciBzdWJzZXF1ZW50IG5ldyBhbGxvY2F0aW9ucywgYXMgd2VsbCBhcyB0aGUKKyAgICAgKiBzdXBwb3J0ZWQgbWluaW11bSBhbmQgbWF4aW11bSB1c2FnZSBtYXNrcyBhbmQgZGVmYXVsdCBibG9jay1zaXplIHRvIHVzZQorICAgICAqIGZvciB0aGUgbWFwcGVyLgorICAgICAqCisgICAgICogXHBhcmFtIG1hcHBlciAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gbWFwIENvZGVjIDIuMCBidWZmZXIgdXNhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRtYWJ1ZiBoZWFwIG5hbWUgYW5kIGZsYWdzIHJlcXVpcmVkIGJ5IHRoZSBkbWEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiBoZWFwIGRldmljZQorICAgICAqCisgICAgICogXHBhcmFtIG1pblVzYWdlICAgICAgICBNaW5pbXVtIGJ1ZmZlciB1c2FnZSByZXF1aXJlZCBmb3Igc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyAoZGVmYXVsdHMgdG8gMCkKKyAgICAgKgorICAgICAqIFxwYXJhbSBtYXhVc2FnZSAgICAgICAgTWF4aW11bSBidWZmZXIgdXNhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBpb24gYWxsb2NhdG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdHMgdG8gU1dfUkVBRCB8IFNXX1dSSVRFKQorICAgICAqCisgICAgICogXHBhcmFtIGJsb2NrU2l6ZSAgICAgICBBbGlnbm1lbnQgdXNlZCBwcmlvciB0byBjYWxsaW5nIHxtYXBwZXJ8IGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBjYXBhY2l0eS4gVGhpcyBhbHNvIGhlbHBzIHJlZHVjZSB0aGUgc2l6ZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgcmVxdWlyZWQgZm9yIGNhY2hpbmcgbWFwcGVyIHJlc3VsdHMuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdHMgdG8gdGhlIHBhZ2Ugc2l6ZSkKKyAgICAgKi8KKyAgICB2b2lkIHNldFVzYWdlTWFwcGVyKGNvbnN0IFVzYWdlTWFwcGVyRm4mIG1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYmxvY2tTaXplKTsKKworICAgcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBCdWZmZXJBbGxvY2F0b3IgbUJ1ZmZlckFsbG9jYXRvcjsKKworICAgIGMyX3N0YXR1c190IG1hcFVzYWdlKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIC8qID0+ICovIEMyU3RyaW5nKiBoZWFwX25hbWUsIHVuc2lnbmVkKiBmbGFncyk7CisKKyAgICAvLyB0aGlzIGxvY2tzIG1UcmFpdHMsIG1CbG9ja1NpemUsIG1Vc2FnZU1hcHBlciwgbVVzYWdlTWFwcGVyTHJ1IGFuZAorICAgIC8vIG1Vc2FnZU1hcHBlckNhY2hlCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Vc2FnZU1hcHBlckxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gbVRyYWl0czsKKyAgICBzaXplX3QgbUJsb2NrU2l6ZTsKKyAgICBVc2FnZU1hcHBlckZuIG1Vc2FnZU1hcHBlcjsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1aW50NjRfdCwgc2l6ZV90PiBNYXBwZXJLZXk7CisgICAgc3RydWN0IE1hcHBlcktleUhhc2ggeworICAgICAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSYpIGNvbnN0OworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6OnR1cGxlPEMyU3RyaW5nLCB1bnNpZ25lZCwgYzJfc3RhdHVzX3Q+IE1hcHBlclZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPE1hcHBlcktleSwgTWFwcGVyVmFsdWU+IE1hcHBlcktleVZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPjo6aXRlcmF0b3IgTWFwcGVyS2V5VmFsdWVQb2ludGVyOworICAgIHN0ZDo6bGlzdDxNYXBwZXJLZXlWYWx1ZT4gbVVzYWdlTWFwcGVyTHJ1OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxNYXBwZXJLZXksIE1hcHBlcktleVZhbHVlUG9pbnRlciwgTWFwcGVyS2V5SGFzaD4gbVVzYWdlTWFwcGVyQ2FjaGU7Cit9OworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0JVRl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCmluZGV4IGExNGUwZDMuLjQ4MTQ0OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKQEAgLTQ3LDYgKzQ3LDE3IEBACiAgICAgICAgICAqLwogICAgICAgICBJT04gPSBQTEFURk9STV9TVEFSVCwKIAorICAgICAgICAvKgorICAgICAgICAgKiBJRCBvZiB0aGUgRE1BLUJ1ZiBIZWFwIChpb24gcmVwbGFjZW1lbnQpIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGNvbnNpc3RzIG9mOgorICAgICAgICAgKiAgIGZkICBzaGFyZWQgZG1hYnVmIGJ1ZmZlciBoYW5kbGUKKyAgICAgICAgICogICBpbnQgc2l6ZSAobG8gMzIgYml0cykKKyAgICAgICAgICogICBpbnQgc2l6ZSAoaGkgMzIgYml0cykKKyAgICAgICAgICogICBpbnQgbWFnaWMgJ1x4YzJpb1x4MDAnCisgICAgICAgICAqLworICAgICAgICBETUFCVUZIRUFQID0gSU9OLAorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJRCBvZiB0aGUgZ3JhbGxvYyBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgogICAgICAgICAgKgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJIYW5kbGVJb25JbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJIYW5kbGVJb25JbnRlcm5hbC5oCmluZGV4IGMwZTFkODMuLmM2NzY5OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MySGFuZGxlSW9uSW50ZXJuYWwuaAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkhhbmRsZUlvbkludGVybmFsLmgKQEAgLTI4LDcgKzI4LDEwIEBACiAgICAgICAgICAgbUZkc3sgYnVmZmVyRmQgfSwKICAgICAgICAgICBtSW50c3sgaW50KHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0geyB9CiAKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3Qgbyk7CisgICAgc3RhdGljIGJvb2wgSXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pOworCisgICAgLy8gZGVwcmVjYXRlZAorICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKSB7IHJldHVybiBJc1ZhbGlkKG8pOyB9CiAKICAgICBpbnQgYnVmZmVyRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1CdWZmZXI7IH0KICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKaW5kZXggNjI5MzZmNi4uZmZmMTJjNCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JHcmFsbG9jPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvckdyYWxsb2M+KDApOwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOwotICAgIGlmIChDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIGlmIChDMkFsbG9jYXRvckdyYWxsb2M6OkNoZWNrSGFuZGxlKGhhbmRsZSkpIHsKICAgICAgICAgdWludDMyX3Qgd2lkdGg7CiAgICAgICAgIHVpbnQzMl90IGhlaWdodDsKICAgICAgICAgdWludDMyX3QgZm9ybWF0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL1RFU1RfTUFQUElORyBiL21lZGlhL2NvZGVjcy9hbXJuYi9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzZDA4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMCBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iCit7CisgIC8vIHRlc3RzIHdoaWNoIHJlcXVpcmUgZHluYW1pYyBjb250ZW50CisgIC8vIGludm9rZSB3aXRoOiBhdGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCisgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKKyAgImR5bmFtaWMtcHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiQW1ybmJEZWNvZGVyVGVzdCJ9LAorICAgIHsgIm5hbWUiOiAiQW1ybmJFbmNvZGVyVGVzdCJ9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vTk9USUNFIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vTk9USUNFCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Fic19zLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYWJzX3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Fic19zLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hYnNfcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYWRkLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYWRkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hZGQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2FkZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYXpfbHNwLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYXpfbHNwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hel9sc3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2F6X2xzcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3AuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9hcm1fZ2NjX3Y1LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfYXJtX2djY192NS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfYXJtX2djY192NS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfYXJtX2djY192NS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfYXJtX3Y1LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfYXJtX3Y1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9hcm1fdjUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2FybV92NS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfY19lcXVpdmFsZW50LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfY19lcXVpdmFsZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9jX2VxdWl2YWxlbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2NfZXF1aXZhbGVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNvcF9tYWxsb2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY29wX21hbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNvcF9tYWxsb2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljb3BfbWFsbG9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRub190YWIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRub190YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdG5vX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0bm9fdGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRyZW9yZGVyX3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdHJlb3JkZXJfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRyZW9yZGVyX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0cmVvcmRlcl90YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdHMycHJtLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0czJwcm0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdHMycHJtLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRzMnBybS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY25zdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Nuc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Nuc3QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Nuc3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Nuc3RfdmFkLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY25zdF92YWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Nuc3RfdmFkLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jbnN0X3ZhZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY29weS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2NvcHkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2NvcHkuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2NvcHkuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfZ2Fpbl9jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9nYWluX2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfZ2Fpbl9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX2dhaW5fYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9nYWluX3AuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX2dhaW5fcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9nYWluX3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfZ2Fpbl9wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX3Bsc2YuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX3Bsc2YuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfcGxzZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9wbHNmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kaXZfMzIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kaXZfMzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Rpdl8zMi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZGl2XzMyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kaXZfcy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Rpdl9zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kaXZfcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZGl2X3MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2R0eF9jb21tb25fZGVmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZHR4X2NvbW1vbl9kZWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2R0eF9jb21tb25fZGVmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kdHhfY29tbW9uX2RlZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZXh0cmFjdF9oLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZXh0cmFjdF9oLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9leHRyYWN0X2guaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2V4dHJhY3RfaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZXh0cmFjdF9sLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZXh0cmFjdF9sLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9leHRyYWN0X2wuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2V4dHJhY3RfbC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZV90eXBlXzNncHAuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZV90eXBlXzNncHAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lX3R5cGVfM2dwcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWVfdHlwZV8zZ3BwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nY19wcmVkLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ2NfcHJlZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ2NfcHJlZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ2NfcHJlZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ21lZF9uLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ21lZF9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nbWVkX24uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2dtZWRfbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ3NtX2Ftcl90eXBlZGVmcy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2dzbV9hbXJfdHlwZWRlZnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2dzbV9hbXJfdHlwZWRlZnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2dzbV9hbXJfdHlwZWRlZnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludF9scGMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnRfbHBjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnRfbHBjLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnRfbHBjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnRfbHNmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW50X2xzZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW50X2xzZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW50X2xzZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW52X3NxcnQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnZfc3FydC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW52X3NxcnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludl9zcXJ0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2Ficy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWJzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2Ficy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hYnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWRkLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hZGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWRkLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2FkZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hZGRfYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWRkX2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWRkX2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWRkX2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfY29tcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfY29tcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9jb21wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2NvbXAuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZGVwb3NpdF9oLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9kZXBvc2l0X2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZGVwb3NpdF9oLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2RlcG9zaXRfaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9kZXBvc2l0X2wuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2RlcG9zaXRfbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9kZXBvc2l0X2wuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZGVwb3NpdF9sLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2V4dHJhY3QuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2V4dHJhY3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZXh0cmFjdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9leHRyYWN0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX21hYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbWFjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX21hYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tYWMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbXN1LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tc3UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbXN1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX21zdS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tdWx0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tdWx0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX211bHQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbXVsdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9uZWdhdGUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX25lZ2F0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9uZWdhdGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbmVnYXRlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3NobC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3NobC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaGwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaHIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3Noci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaHJfci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hyX3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hyX3IuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hyX3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc3ViLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zdWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc3ViLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3N1Yi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbG9nMi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xvZzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xvZzIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xvZzIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xvZzJfbm9ybS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xvZzJfbm9ybS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbG9nMl9ub3JtLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sb2cyX25vcm0uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzZnd0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNmd3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzZnd0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc2Z3dC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX2F6LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX2F6LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfYXouaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF9hei5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX2xzZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF9sc2YuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF9sc2YuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF9sc2YuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF90YWIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfdGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tYWNfMzIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tYWNfMzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21hY18zMi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbWFjXzMyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tb2RlLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbW9kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbW9kZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbW9kZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXB5XzMyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXB5XzMyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tcHlfMzIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21weV8zMi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXB5XzMyXzE2LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXB5XzMyXzE2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tcHlfMzJfMTYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21weV8zMl8xNi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXVsdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL211bHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL211bHQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL211bHQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL211bHRfci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL211bHRfci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXVsdF9yLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tdWx0X3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25fcHJvYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25fcHJvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbl9wcm9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9uX3Byb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25lZ2F0ZS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25lZ2F0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbmVnYXRlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9uZWdhdGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25vcm1fbC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25vcm1fbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbm9ybV9sLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9ub3JtX2wuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25vcm1fcy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25vcm1fcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbm9ybV9zLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9ub3JtX3MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL29wZXJfMzJiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvb3Blcl8zMmIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL29wZXJfMzJiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9vcGVyXzMyYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcF9vbF93Z2guaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wX29sX3dnaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcF9vbF93Z2guaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Bfb2xfd2doLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wb3cyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcG93Mi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcG93Mi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcG93Mi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcHJlZF9sdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ByZWRfbHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ByZWRfbHQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ByZWRfbHQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2YuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZl8zX3RibC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZl8zX3RibC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmXzNfdGJsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2ZfM190YmwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZl81X3RibC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZl81X3RibC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmXzVfdGJsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2ZfNV90YmwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FnYWluNDc1X3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FnYWluNDc1X3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcWdhaW40NzVfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xZ2FpbjQ3NV90YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3F1YV9nYWluLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcXVhX2dhaW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3F1YV9nYWluLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xdWFfZ2Fpbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcXVhX2dhaW5fdGJsLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcXVhX2dhaW5fdGJsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xdWFfZ2Fpbl90YmwuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3F1YV9nYWluX3RibC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmVvcmRlci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Jlb3JkZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Jlb3JkZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Jlb3JkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Jlc2lkdS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Jlc2lkdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmVzaWR1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZXNpZHUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3JldmVyc2VfYml0cy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3JldmVyc2VfYml0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmV2ZXJzZV9iaXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZXZlcnNlX2JpdHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3JvdW5kLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcm91bmQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3JvdW5kLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yb3VuZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2V0X3plcm8uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zZXRfemVyby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2V0X3plcm8uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NldF96ZXJvLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaGwuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NobC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaHIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaHIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Noci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaHJfci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Nocl9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaHJfci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hyX3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NxcnRfbC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NxcnRfbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3FydF9sLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zcXJ0X2wuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3N1Yi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3N1Yi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3ViLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zdWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3N5bl9maWx0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3luX2ZpbHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3N5bl9maWx0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zeW5fZmlsdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdHlwZWRlZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3R5cGVkZWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3R5cGVkZWYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3R5cGVkZWYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZDEuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQxLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQxLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkMi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkMi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkMi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd2VpZ2h0X2EuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93ZWlnaHRfYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd2VpZ2h0X2EuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dlaWdodF9hLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93aW5kb3dfdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd2luZG93X3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd2luZG93X3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd2luZG93X3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd21mX3RvX2V0cy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dtZl90b19ldHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dtZl90b19ldHMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dtZl90b19ldHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYWRkLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2FkZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2FkZC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2FkZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2F6X2xzcC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hel9sc3AuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hel9sc3AuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hel9sc3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRub190YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0bm9fdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0bm9fdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0bm9fdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0cmVvcmRlcl90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0cmVvcmRlcl90YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRyZW9yZGVyX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdHJlb3JkZXJfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0czJwcm0uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0czJwcm0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRzMnBybS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdHMycHJtLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYzJfOXBmX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9jMl85cGZfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYzJfOXBmX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2MyXzlwZl90YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9jb3B5LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2NvcHkuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9jb3B5LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvY29weS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl8zMi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfMzIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfMzIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfMzIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfcy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfcy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl9zLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2X3MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9leHRyYWN0X2guY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZXh0cmFjdF9oLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZXh0cmFjdF9oLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZXh0cmFjdF9oLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZXh0cmFjdF9sLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2V4dHJhY3RfbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2V4dHJhY3RfbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2V4dHJhY3RfbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dhaW5zX3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nYWluc190YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nYWluc190YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nYWluc190YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nY19wcmVkLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2djX3ByZWQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nY19wcmVkLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2NfcHJlZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dtZWRfbi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nbWVkX24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nbWVkX24uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nbWVkX24uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ncmF5X3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ncmF5X3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dyYXlfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ3JheV90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ncmlkX3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ncmlkX3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dyaWRfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ3JpZF90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnRfbHBjLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludF9scGMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnRfbHBjLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW50X2xwYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludl9zcXJ0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludl9zcXJ0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW52X3NxcnQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnZfc3FydC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludl9zcXJ0X3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnZfc3FydF90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnZfc3FydF90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnZfc3FydF90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2Ficy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2Ficy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfYWJzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9hYnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2RlcG9zaXRfaC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2RlcG9zaXRfaC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfZGVwb3NpdF9oLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9kZXBvc2l0X2guY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2RlcG9zaXRfbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2RlcG9zaXRfbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfZGVwb3NpdF9sLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9kZXBvc2l0X2wuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX3Nocl9yLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfc2hyX3IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX3Nocl9yLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9zaHJfci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMl9ub3JtLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzJfbm9ybS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzJfbm9ybS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzJfbm9ybS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzJfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzJfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMl90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyX3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzZnd0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzZnd0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNmd3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc2Z3dC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3AuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3AuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfYXouY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2F6LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2F6LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2F6LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2xzZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfbHNmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2xzZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9sc2YuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfbHNmX3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfbHNmX3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9sc2ZfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2xzZl90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF90YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL211bHRfci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9tdWx0X3IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9tdWx0X3IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9tdWx0X3IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9uZWdhdGUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbmVnYXRlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbmVnYXRlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbmVnYXRlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9sLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fcy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX3MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX3MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX3MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9waF9kaXNwX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9waF9kaXNwX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BoX2Rpc3BfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcGhfZGlzcF90YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wb3cyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BvdzIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wb3cyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcG93Mi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BvdzJfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BvdzJfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcG93Ml90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wb3cyX3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ByZWRfbHQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcHJlZF9sdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ByZWRfbHQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wcmVkX2x0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfMy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zX3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfM190YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfM190YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfM190YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfNS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfNS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl81LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfNV90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzVfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzVfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzVfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcXVhX2dhaW5fdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3F1YV9nYWluX3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3F1YV9nYWluX3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3F1YV9nYWluX3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlb3JkZXIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVvcmRlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlb3JkZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZW9yZGVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVzaWR1LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlc2lkdS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlc2lkdS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlc2lkdS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3JvdW5kLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3JvdW5kLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcm91bmQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yb3VuZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NldF96ZXJvLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NldF96ZXJvLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2V0X3plcm8uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zZXRfemVyby5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Noci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHJfci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHJfci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Nocl9yLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyX3IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zcXJ0X2wuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3FydF9sLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3FydF9sLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3FydF9sLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3FydF9sX3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zcXJ0X2xfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3FydF9sX3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NxcnRfbF90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zdWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3ViLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3ViLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3ViLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3luX2ZpbHQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3luX2ZpbHQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zeW5fZmlsdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3N5bl9maWx0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvdmFkMS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy92YWQxLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvdmFkMS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ZhZDEuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93ZWlnaHRfYS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93ZWlnaHRfYS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dlaWdodF9hLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2VpZ2h0X2EuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93aW5kb3dfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dpbmRvd190YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93aW5kb3dfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2luZG93X3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDRmZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTA2IEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9hX3JlZmwuY3BwIiwKKyAgICAgICAgInNyYy9hZ2MuY3BwIiwKKyAgICAgICAgInNyYy9hbXJkZWNvZGUuY3BwIiwKKyAgICAgICAgInNyYy9iX2NuX2NvZC5jcHAiLAorICAgICAgICAic3JjL2JnbnNjZC5jcHAiLAorICAgICAgICAic3JjL2NfZ19hdmVyLmNwcCIsCisgICAgICAgICJzcmMvZDEwMzVwZi5jcHAiLAorICAgICAgICAic3JjL2QyXzExcGYuY3BwIiwKKyAgICAgICAgInNyYy9kMl85cGYuY3BwIiwKKyAgICAgICAgInNyYy9kM18xNHBmLmNwcCIsCisgICAgICAgICJzcmMvZDRfMTdwZi5jcHAiLAorICAgICAgICAic3JjL2Q4XzMxcGYuY3BwIiwKKyAgICAgICAgInNyYy9kX2dhaW5fYy5jcHAiLAorICAgICAgICAic3JjL2RfZ2Fpbl9wLmNwcCIsCisgICAgICAgICJzcmMvZF9wbHNmLmNwcCIsCisgICAgICAgICJzcmMvZF9wbHNmXzMuY3BwIiwKKyAgICAgICAgInNyYy9kX3Bsc2ZfNS5jcHAiLAorICAgICAgICAic3JjL2RlY19hbXIuY3BwIiwKKyAgICAgICAgInNyYy9kZWNfZ2Fpbi5jcHAiLAorICAgICAgICAic3JjL2RlY19pbnB1dF9mb3JtYXRfdGFiLmNwcCIsCisgICAgICAgICJzcmMvZGVjX2xhZzMuY3BwIiwKKyAgICAgICAgInNyYy9kZWNfbGFnNi5jcHAiLAorICAgICAgICAic3JjL2R0eF9kZWMuY3BwIiwKKyAgICAgICAgInNyYy9lY19nYWlucy5jcHAiLAorICAgICAgICAic3JjL2V4X2N0cmwuY3BwIiwKKyAgICAgICAgInNyYy9pZjJfdG9fZXRzLmNwcCIsCisgICAgICAgICJzcmMvaW50X2xzZi5jcHAiLAorICAgICAgICAic3JjL2xzcF9hdmcuY3BwIiwKKyAgICAgICAgInNyYy9waF9kaXNwLmNwcCIsCisgICAgICAgICJzcmMvcG9zdF9wcm8uY3BwIiwKKyAgICAgICAgInNyYy9wcmVlbXBoLmNwcCIsCisgICAgICAgICJzcmMvcHN0ZmlsdC5jcHAiLAorICAgICAgICAic3JjL3FnYWluNDc1X3RhYi5jcHAiLAorICAgICAgICAic3JjL3NwX2RlYy5jcHAiLAorICAgICAgICAic3JjL3dtZl90b19ldHMuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICAvL3Nhbml0aXplOiB7CisgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAvLyAgICBdLAorICAgIC8vfSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWNfdGVzdCIsCisgICAgZ3Rlc3Q6IGZhbHNlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWyJ0ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYnNuZGZpbGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIC8vc2FuaXRpemU6IHsKKyAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWworICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgIC8vICAgIF0sCisgICAgLy99LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hX3JlZmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYV9yZWZsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYV9yZWZsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYV9yZWZsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYV9yZWZsLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hX3JlZmwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYV9yZWZsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FfcmVmbC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hZ2MuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYWdjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYWdjLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYWdjLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYWdjLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hZ2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYWdjLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FnYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hbXJkZWNvZGUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYW1yZGVjb2RlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYW1yZGVjb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYW1yZGVjb2RlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYW1yZGVjb2RlLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hbXJkZWNvZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYW1yZGVjb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FtcmRlY29kZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iX2NuX2NvZC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iX2NuX2NvZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JfY25fY29kLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYl9jbl9jb2QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iX2NuX2NvZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYl9jbl9jb2QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYl9jbl9jb2QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYl9jbl9jb2QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYmduc2NkLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JnbnNjZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JnbnNjZC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JnbnNjZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JnbnNjZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYmduc2NkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JnbnNjZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iZ25zY2QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvY19nX2F2ZXIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvY19nX2F2ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9jX2dfYXZlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2NfZ19hdmVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvY19nX2F2ZXIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2NfZ19hdmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2NfZ19hdmVyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2NfZ19hdmVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfMTFwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl8xMXBmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfMTFwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzExcGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl8xMXBmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl8xMXBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzExcGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfMTFwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl85cGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfOXBmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfOXBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfOXBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfOXBmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl85cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfOXBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzlwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kM18xNHBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QzXzE0cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kM18xNHBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDNfMTRwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QzXzE0cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QzXzE0cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDNfMTRwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kM18xNHBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q0XzE3cGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDRfMTdwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q0XzE3cGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kNF8xN3BmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDRfMTdwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDRfMTdwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kNF8xN3BmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q0XzE3cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDhfMzFwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kOF8zMXBmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDhfMzFwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q4XzMxcGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kOF8zMXBmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kOF8zMXBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q4XzMxcGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDhfMzFwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX2dhaW5fYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX2dhaW5fYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfZ2Fpbl9jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9nYWluX2MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX2dhaW5fcC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX2dhaW5fcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfZ2Fpbl9wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9nYWluX3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2YuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfMy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl8zLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfNS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl81LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2Ftci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfYW1yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2Ftci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19hbXIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfYW1yLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfYW1yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19hbXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2Ftci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfZ2Fpbi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfZ2Fpbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19nYWluLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2dhaW4uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfZ2Fpbi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2dhaW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2dhaW4uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2dhaW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2lucHV0X2Zvcm1hdF90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2lucHV0X2Zvcm1hdF90YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfaW5wdXRfZm9ybWF0X3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19pbnB1dF9mb3JtYXRfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnMy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWczLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWczLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWczLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWczLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWc2LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWc2LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnNi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWc2LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnNi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnNi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kdHhfZGVjLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2R0eF9kZWMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kdHhfZGVjLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZHR4X2RlYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2R0eF9kZWMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2R0eF9kZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZHR4X2RlYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kdHhfZGVjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2VjX2dhaW5zLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2VjX2dhaW5zLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZWNfZ2FpbnMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9lY19nYWlucy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2VjX2dhaW5zLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9lY19nYWlucy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9lY19nYWlucy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9lY19nYWlucy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9leF9jdHJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2V4X2N0cmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9leF9jdHJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZXhfY3RybC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2V4X2N0cmwuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2V4X2N0cmwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZXhfY3RybC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9leF9jdHJsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2dzbWFtcl9kZWMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2dzbWFtcl9kZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZ3NtYW1yX2RlYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9nc21hbXJfZGVjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2lmMl90b19ldHMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaWYyX3RvX2V0cy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2lmMl90b19ldHMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pZjJfdG9fZXRzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaWYyX3RvX2V0cy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaWYyX3RvX2V0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pZjJfdG9fZXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2lmMl90b19ldHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaW50X2xzZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pbnRfbHNmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaW50X2xzZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2ludF9sc2YuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9sc3BfYXZnLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2xzcF9hdmcuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9sc3BfYXZnLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvbHNwX2F2Zy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2xzcF9hdmcuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2xzcF9hdmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvbHNwX2F2Zy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9sc3BfYXZnLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcG9zdF9wcm8uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcG9zdF9wcm8uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wb3N0X3Byby5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3Bvc3RfcHJvLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcG9zdF9wcm8uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3Bvc3RfcHJvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3Bvc3RfcHJvLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3Bvc3RfcHJvLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3ByZWVtcGguY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHJlZW1waC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3ByZWVtcGguY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wcmVlbXBoLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHJlZW1waC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHJlZW1waC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wcmVlbXBoLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3ByZWVtcGguaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9xZ2FpbjQ3NV90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcWdhaW40NzVfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcWdhaW40NzVfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcWdhaW40NzVfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvd21mX3RvX2V0cy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy93bWZfdG9fZXRzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvd21mX3RvX2V0cy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3dtZl90b19ldHMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY1Rlc3RFbnZpcm9ubWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNUZXN0RW52aXJvbm1lbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY29kZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjOWY4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQW1ybmJEZWNvZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBbXJuYkRlY29kZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJzbmRmaWxlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOWU2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBBbXItbmIgRGVjb2RlciB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkFtcm5iRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkFtcm5iRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA3M2U0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQU1SLU5CIERlY29kZXIgOgorVGhlIEFtci1OYiBEZWNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBhbXJuYiBkZWNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQW1ybmJEZWNvZGVyVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BbXJuYkRlY29kZXJUZXN0L0Ftcm5iRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BbXJuYkRlY29kZXJUZXN0L0Ftcm5iRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggQW1ybmJEZWNvZGVyVGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogQW1ybmJEZWNvZGVyVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBBbXJuYkRlY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9hbXJuYmRlY190ZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNGNlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMTMgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgc3JjczogWworICAgICAgICAic3JjL2FtcmVuY29kZS5jcHAiLAorICAgICAgICAic3JjL2F1dG9jb3JyLmNwcCIsCisgICAgICAgICJzcmMvYzEwMzVwZi5jcHAiLAorICAgICAgICAic3JjL2MyXzExcGYuY3BwIiwKKyAgICAgICAgInNyYy9jMl85cGYuY3BwIiwKKyAgICAgICAgInNyYy9jM18xNHBmLmNwcCIsCisgICAgICAgICJzcmMvYzRfMTdwZi5jcHAiLAorICAgICAgICAic3JjL2M4XzMxcGYuY3BwIiwKKyAgICAgICAgInNyYy9jYWxjX2Nvci5jcHAiLAorICAgICAgICAic3JjL2NhbGNfZW4uY3BwIiwKKyAgICAgICAgInNyYy9jYnNlYXJjaC5jcHAiLAorICAgICAgICAic3JjL2NsX2x0cC5jcHAiLAorICAgICAgICAic3JjL2NvZF9hbXIuY3BwIiwKKyAgICAgICAgInNyYy9jb252b2x2ZS5jcHAiLAorICAgICAgICAic3JjL2Nvcl9oLmNwcCIsCisgICAgICAgICJzcmMvY29yX2hfeC5jcHAiLAorICAgICAgICAic3JjL2Nvcl9oX3gyLmNwcCIsCisgICAgICAgICJzcmMvY29ycndnaHRfdGFiLmNwcCIsCisgICAgICAgICJzcmMvZHR4X2VuYy5jcHAiLAorICAgICAgICAic3JjL2VuY19sYWczLmNwcCIsCisgICAgICAgICJzcmMvZW5jX2xhZzYuY3BwIiwKKyAgICAgICAgInNyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwIiwKKyAgICAgICAgInNyYy9ldHNfdG9faWYyLmNwcCIsCisgICAgICAgICJzcmMvZXRzX3RvX3dtZi5jcHAiLAorICAgICAgICAic3JjL2dfYWRhcHQuY3BwIiwKKyAgICAgICAgInNyYy9nX2NvZGUuY3BwIiwKKyAgICAgICAgInNyYy9nX3BpdGNoLmNwcCIsCisgICAgICAgICJzcmMvZ2Fpbl9xLmNwcCIsCisgICAgICAgICJzcmMvaHBfbWF4LmNwcCIsCisgICAgICAgICJzcmMvaW50ZXJfMzYuY3BwIiwKKyAgICAgICAgInNyYy9pbnRlcl8zNl90YWIuY3BwIiwKKyAgICAgICAgInNyYy9sX2NvbXAuY3BwIiwKKyAgICAgICAgInNyYy9sX2V4dHJhY3QuY3BwIiwKKyAgICAgICAgInNyYy9sX25lZ2F0ZS5jcHAiLAorICAgICAgICAic3JjL2xhZ193aW5kLmNwcCIsCisgICAgICAgICJzcmMvbGFnX3dpbmRfdGFiLmNwcCIsCisgICAgICAgICJzcmMvbGV2aW5zb24uY3BwIiwKKyAgICAgICAgInNyYy9scGMuY3BwIiwKKyAgICAgICAgInNyYy9vbF9sdHAuY3BwIiwKKyAgICAgICAgInNyYy9wX29sX3dnaC5jcHAiLAorICAgICAgICAic3JjL3BpdGNoX2ZyLmNwcCIsCisgICAgICAgICJzcmMvcGl0Y2hfb2wuY3BwIiwKKyAgICAgICAgInNyYy9wcmVfYmlnLmNwcCIsCisgICAgICAgICJzcmMvcHJlX3Byb2MuY3BwIiwKKyAgICAgICAgInNyYy9wcm0yYml0cy5jcHAiLAorICAgICAgICAic3JjL3FfZ2Fpbl9jLmNwcCIsCisgICAgICAgICJzcmMvcV9nYWluX3AuY3BwIiwKKyAgICAgICAgInNyYy9xZ2FpbjQ3NS5jcHAiLAorICAgICAgICAic3JjL3FnYWluNzk1LmNwcCIsCisgICAgICAgICJzcmMvcXVhX2dhaW4uY3BwIiwKKyAgICAgICAgInNyYy9zMTBfOHBmLmNwcCIsCisgICAgICAgICJzcmMvc2V0X3NpZ24uY3BwIiwKKyAgICAgICAgInNyYy9zaWRfc3luYy5jcHAiLAorICAgICAgICAic3JjL3NwX2VuYy5jcHAiLAorICAgICAgICAic3JjL3NwcmVwcm9jLmNwcCIsCisgICAgICAgICJzcmMvc3BzdHByb2MuY3BwIiwKKyAgICAgICAgInNyYy90b25fc3RhYi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICAvL2FkZHJlc3NpbmcgYi8yNTQwOTc0NAorICAgIC8vc2FuaXRpemU6IHsKKyAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWworICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgIC8vICAgIF0sCisgICAgLy99LAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIl0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2NfdGVzdCB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jX3Rlc3QiLAorICAgIGd0ZXN0OiBmYWxzZSwKKworICAgIHNyY3M6IFsidGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAiXSwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIl0sCisKKyAgICAvL2FkZHJlc3NpbmcgYi8yNTQwOTc0NAorICAgIC8vc2FuaXRpemU6IHsKKyAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWworICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgIC8vICAgIF0sCisgICAgLy99LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhlNWViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworY2NfZnV6eiB7CisgICAgbmFtZTogImFtcm5iX2VuY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiYW1ybmJfZW5jX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzliNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjAgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyBlbmNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBBTVItTkIgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitBTVItV0Igc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gT3V0cHV0IEZvcm1hdCAocGFyYW1ldGVyIG5hbWU6IGBvdXRwdXRGb3JtYXRgKQorMi4gTW9kZSAocGFyYW1ldGVyIG5hbWU6IGBtb2RlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBvdXRwdXRGb3JtYXRgIHwgMC4gYEFNUl9UWF9XTUZgIDEuIGBBTVJfVFhfSUYyYCAyLiBgQU1SX1RYX0VUU2AgfCBCaXRzIDAsIDEgYW5kIDIgb2YgMXN0IGJ5dGUgb2YgZGF0YS4gfAorfCBgbW9kZWAgICB8IDAuIGBNUjQ3NWAgMS4gYE1SNTE1YCAyLiBgTVI1OWAgMy4gYE1SNjdgICA0LiBgTVI3NCBgIDUuIGBNUjc5NWAgNi4gYE1SMTAyYCA3LiBgTVIxMjJgIDguIGBNUkRUWGAgfCBCaXRzIDMsIDQsIDUgYW5kIDYgb2YgMXN0IGJ5dGUgb2YgZGF0YS4gfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIHVzaW5nIGEgbG9vcC4KK0lmIHRoZSBlbmNvZGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgdGhlIGZyYW1lIHNpemUuCitJZiB0aGUgZW5jb2RlIG9wZXJhdGlvbiB3YXMgdW4tc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIHN0aWxsIGFkdmFuY2VkIGJ5IGZyYW1lIHNpemUgc28KK3RoYXQgdGhlIGZ1enplciBjYW4gcHJvY2VlZCB0byBmZWVkIHRoZSBuZXh0IGZyYW1lLgorCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGFtcm5iX2VuY19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGFtcm5iX2VuY19mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBwY20gZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvYW1ybmJfZW5jX2Z1enplci9hbXJuYl9lbmNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorVG8gcnVuIG9uIGhvc3QKK2BgYAorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2Ftcm5iX2VuY19mdXp6ZXIvYW1ybmJfZW5jX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL2Z1enplci9hbXJuYl9lbmNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvZnV6emVyL2Ftcm5iX2VuY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmY2JmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL2Z1enplci9hbXJuYl9lbmNfZnV6emVyLmNwcApAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgImdzbWFtcl9lbmMuaCIKKworLy8gQ29uc3RhbnRzIGZvciBBTVItTkIKK2NvbnN0IGludDMyX3Qga051bUlucHV0U2FtcGxlcyA9IExfRlJBTUU7ICAvLyAxNjAgc2FtcGxlcworY29uc3QgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IDIgKiBrTnVtSW5wdXRTYW1wbGVzICogc2l6ZW9mKFdvcmQxNik7Citjb25zdCBNb2RlIGtNb2Rlc1s5XSA9IHtNUjQ3NSwgLyogNC43NSBrYnBzICovCisgICAgICAgICAgICAgICAgICAgICAgICBNUjUxNSwgLyogNS4xNSBrYnBzICovCisgICAgICAgICAgICAgICAgICAgICAgICBNUjU5LCAgLyogNS45MCBrYnBzICovCisgICAgICAgICAgICAgICAgICAgICAgICBNUjY3LCAgLyogNi43MCBrYnBzICovCisgICAgICAgICAgICAgICAgICAgICAgICBNUjc0LCAgLyogNy40MCBrYnBzICovCisgICAgICAgICAgICAgICAgICAgICAgICBNUjc5NSwgLyogNy45NSBrYnBzICovCisgICAgICAgICAgICAgICAgICAgICAgICBNUjEwMiwgLyogMTAuMiBrYnBzICovCisgICAgICAgICAgICAgICAgICAgICAgICBNUjEyMiwgLyogMTIuMiBrYnBzICovCisgICAgICAgICAgICAgICAgICAgICAgICBNUkRUWCwgLyogRFRYICAgICAgICovfTsKK2NvbnN0IFdvcmQxNiBrT3V0cHV0Rm9ybWF0WzNdID0ge0FNUl9UWF9XTUYsIEFNUl9UWF9JRjIsIEFNUl9UWF9FVFN9OworCitjbGFzcyBDb2RlYyB7CisgICBwdWJsaWM6CisgICAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgICAgfkNvZGVjKCkgeyBkZUluaXRFbmNvZGVyKCk7IH0KKyAgICBXb3JkMTYgaW5pdEVuY29kZXIoY29uc3QgdWludDhfdCAqZGF0YSk7CisgICAgdm9pZCBkZUluaXRFbmNvZGVyKCk7CisgICAgdm9pZCBlbmNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICBwcml2YXRlOgorICAgIHZvaWQgKm1FbmNTdGF0ZSA9IG51bGxwdHI7CisgICAgdm9pZCAqbVNpZFN0YXRlID0gbnVsbHB0cjsKK307CisKK1dvcmQxNiBDb2RlYzo6aW5pdEVuY29kZXIoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIHJldHVybiBBTVJFbmNvZGVJbml0KCZtRW5jU3RhdGUsICZtU2lkU3RhdGUsICgqZGF0YSA+PiAxKSAmIDB4MDEgLyogZHR4X2VuYWJsZSBmbGFnICovKTsKK30KKwordm9pZCBDb2RlYzo6ZGVJbml0RW5jb2RlcigpIHsKKyAgICBpZiAobUVuY1N0YXRlKSB7CisgICAgICAgIEFNUkVuY29kZUV4aXQoJm1FbmNTdGF0ZSwgJm1TaWRTdGF0ZSk7CisgICAgICAgIG1FbmNTdGF0ZSA9IG51bGxwdHI7CisgICAgICAgIG1TaWRTdGF0ZSA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIENvZGVjOjplbmNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBTVJFbmNvZGVSZXNldChtRW5jU3RhdGUsIG1TaWRTdGF0ZSk7CisgICAgdWludDhfdCBzdGFydEJ5dGUgPSAqZGF0YTsKKyAgICBpbnQgbW9kZUluZGV4ID0gKChzdGFydEJ5dGUgPj4gMykgJSA5KTsKKyAgICBpbnQgb3V0cHV0Rm9ybWF0SW5kZXggPSAoc3RhcnRCeXRlICUgMyk7CisgICAgTW9kZSBtb2RlID0ga01vZGVzW21vZGVJbmRleF07CisgICAgV29yZDE2IG91dHB1dEZvcm1hdCA9IGtPdXRwdXRGb3JtYXRbb3V0cHV0Rm9ybWF0SW5kZXhdOworCisgICAgLy8gQ29uc3VtZSBzdGFydEJ5dGUKKyAgICBkYXRhKys7CisgICAgc2l6ZS0tOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGUgPSAoRnJhbWVfVHlwZV8zR1BQKW1vZGU7CisKKyAgICAgICAgV29yZDE2IGlucHV0QnVmW2tOdW1JbnB1dFNhbXBsZXNdID0ge307CisgICAgICAgIGludDMyX3QgbWluU2l6ZSA9IHN0ZDo6bWluKHNpemUsIHNpemVvZihpbnB1dEJ1ZikpOworCisgICAgICAgIHVpbnQ4X3Qgb3V0cHV0QnVmW2tPdXRwdXRCdWZmZXJTaXplXSA9IHt9OworICAgICAgICBtZW1jcHkoaW5wdXRCdWYsIGRhdGEsIG1pblNpemUpOworCisgICAgICAgIEFNUkVuY29kZShtRW5jU3RhdGUsIG1TaWRTdGF0ZSwgbW9kZSwgaW5wdXRCdWYsIG91dHB1dEJ1ZiwgJmZyYW1lVHlwZSwgb3V0cHV0Rm9ybWF0KTsKKworICAgICAgICBkYXRhICs9IG1pblNpemU7CisgICAgICAgIHNpemUgLT0gbWluU2l6ZTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjb2RlYy0+aW5pdEVuY29kZXIoZGF0YSkgPT0gMCkgeworICAgICAgICBjb2RlYy0+ZW5jb2RlRnJhbWVzKGRhdGEsIHNpemUpOworICAgIH0KKyAgICBkZWxldGUgY29kZWM7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYW1yZW5jb2RlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYW1yZW5jb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYW1yZW5jb2RlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYW1yZW5jb2RlLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYW1yZW5jb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2FtcmVuY29kZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYXV0b2NvcnIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYXV0b2NvcnIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYXV0b2NvcnIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYXV0b2NvcnIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzEwMzVwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzEwMzVwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MxMDM1cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MxMDM1cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzEwMzVwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl8xMXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl8xMXBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfMTFwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfMTFwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl8xMXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfOXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MzXzE0cGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MzXzE0cGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jM18xNHBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jM18xNHBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MzXzE0cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzRfMTdwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzRfMTdwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M0XzE3cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M0XzE3cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzRfMTdwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jOF8zMXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jOF8zMXBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzhfMzFwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzhfMzFwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jOF8zMXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19jb3IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2Nvci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2Nvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2Nvci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2Nvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2VuLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2VuLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19lbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19lbi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2VuLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2JzZWFyY2guY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYnNlYXJjaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYnNlYXJjaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYnNlYXJjaC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYnNlYXJjaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NsX2x0cC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb2RfYW1yLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb2RfYW1yLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29kX2Ftci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29kX2Ftci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb2RfYW1yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29ycndnaHRfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvcnJ3Z2h0X3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvcnJ3Z2h0X3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvcnJ3Z2h0X3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnMy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX291dHB1dF9mb3JtYXRfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX291dHB1dF9mb3JtYXRfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX291dHB1dF9mb3JtYXRfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX2lmMi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX2lmMi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b19pZjIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b19pZjIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX2lmMi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9fd21mLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9fd21mLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX3dtZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX3dtZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9fd21mLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfYWRhcHQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfYWRhcHQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2FkYXB0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2FkYXB0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfYWRhcHQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2NvZGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19waXRjaC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19waXRjaC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfcGl0Y2guY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfcGl0Y2guaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19waXRjaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dhaW5fcS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nc21hbXJfZW5jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nc21hbXJfZW5jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dzbWFtcl9lbmMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ3NtYW1yX2VuYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2hwX21heC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNl90YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9jb21wLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfY29tcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfY29tcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfY29tcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfZXh0cmFjdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX2V4dHJhY3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX2V4dHJhY3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX2V4dHJhY3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX25lZ2F0ZS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX25lZ2F0ZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfbmVnYXRlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9uZWdhdGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZF90YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sZXZpbnNvbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbHBjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvb2xfbHRwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Bfb2xfd2doLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Bfb2xfd2doLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcF9vbF93Z2guY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wX29sX3dnaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfZnIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX29sLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX2JpZy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX2JpZy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9iaWcuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9iaWcuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX2JpZy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9wcm9jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcm0yYml0cy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX2MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTVjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAKQEAgLTAsMCArMSwxNDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgM0dQUCBzdGFuZGFyZDoKKworICAgIDNHUFAgVFMgMjYuMDczCisgICAgQU5TSS1DIGNvZGUgZm9yIHRoZSBBZGFwdGl2ZSBNdWx0aS1SYXRlIChBTVIpIHNwZWVjaCBjb2RlYworICAgIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuM2dwcC5vcmcKKworKEMpIDIwMDQsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRUQSwgVFRDKQorUGVybWlzc2lvbiB0byBkaXN0cmlidXRlLCBtb2RpZnkgYW5kIHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHN0YW5kYXJkIGxpY2Vuc2UKK3Rlcm1zIGxpc3RlZCBhYm92ZSBoYXMgYmVlbiBvYnRhaW5lZCBmcm9tIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKyBQYXRobmFtZTogLi9hdWRpby9nc20tYW1yL2Mvc3JjL3FnYWluNDc1LmMKKyBGdW50aW9uczogTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cworICAgICAgICAgICBNUjQ3NV91cGRhdGVfdW5xX3ByZWQKKyAgICAgICAgICAgTVI0NzVfZ2Fpbl9xdWFudAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBNT0RVTEUgREVTQ1JJUFRJT04KKworIFRoZXNlIG1vZHVsZXMgaGFuZGxlIHRoZSBxdWFudGl6YXRpb24gb2YgcGl0Y2ggYW5kIGNvZGVib29rIGdhaW5zIGZvciBNUjQ3NS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJTkNMVURFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAicWdhaW40NzUuaCIKKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisjaW5jbHVkZSAiYmFzaWNfb3AuaCIKKyNpbmNsdWRlICJtb2RlLmgiCisjaW5jbHVkZSAiY25zdC5oIgorI2luY2x1ZGUgInBvdzIuaCIKKyNpbmNsdWRlICJsb2cyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNQUNST1MKKzsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERFRklORVMKKzsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKKzsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNUjQ3NV9WUV9TSVpFIDI1NgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKKzsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IExPQ0FMIFZBUklBQkxFIERFRklOSVRJT05TCis7IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGUgdGFibGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkYXRhOgorICoKKyAqICAgIGdfcGl0Y2goMCkgICAgICAgIChRMTQpIC8vIGZvciBzdWItCisgKiAgICBnX2ZhYygwKSAgICAgICAgICAoUTEyKSAvLyBmcmFtZSAwIGFuZCAyCisgKiAgICBnX3BpdGNoKDEpICAgICAgICAoUTE0KSAvLyBmb3Igc3ViLQorICogICAgZ19mYWMoMikgICAgICAgICAgKFExMikgLy8gZnJhbWUgMSBhbmQgMworICoKKyAqLworc3RhdGljIGNvbnN0IFdvcmQxNiB0YWJsZV9nYWluX01SNDc1W01SNDc1X1ZRX1NJWkUqNF0gPQoreworICAgIC8qZ19waXQoMCksIGdfZmFjKDApLCAgICAgIGdfcGl0KDEpLCBnX2ZhYygxKSAqLworICAgIDgxMiwgICAgICAgICAgMTI4LCAgICAgICAgICAgNTQyLCAgICAgIDE0MCwKKyAgICAyODczLCAgICAgICAgIDExMzUsICAgICAgICAgIDIyNjYsICAgICAzNDAyLAorICAgIDIwNjcsICAgICAgICAgIDU2MywgICAgICAgICAxMjY3NywgICAgICA2NDcsCisgICAgNDEzMiwgICAgICAgICAxNzk4LCAgICAgICAgICA1NjAxLCAgICAgNTI4NSwKKyAgICA3Njg5LCAgICAgICAgICAzNzQsICAgICAgICAgIDM3MzUsICAgICAgNDQxLAorICAgIDEwOTEyLCAgICAgICAgIDI2MzgsICAgICAgICAgMTE4MDcsICAgICAyNDk0LAorICAgIDIwNDkwLCAgICAgICAgICA3OTcsICAgICAgICAgIDUyMTgsICAgICAgNjc1LAorICAgIDY3MjQsICAgICAgICAgODM1NCwgICAgICAgICAgNTI4MiwgICAgIDE2OTYsCisgICAgMTQ4OCwgICAgICAgICAgNDI4LCAgICAgICAgICA1ODgyLCAgICAgIDQ1MiwKKyAgICA1MzMyLCAgICAgICAgIDQwNzIsICAgICAgICAgIDM1ODMsICAgICAxMjY4LAorICAgIDI0NjksICAgICAgICAgIDkwMSwgICAgICAgICAxNTg5NCwgICAgIDEwMDUsCisgICAgMTQ5ODIsICAgICAgICAgMzI3MSwgICAgICAgICAxMDMzMSwgICAgIDQ4NTgsCisgICAgMzYzNSwgICAgICAgICAyMDIxLCAgICAgICAgICAyNTk2LCAgICAgIDgzNSwKKyAgICAxMjM2MCwgICAgICAgICA0ODkyLCAgICAgICAgIDEyMjA2LCAgICAgMTcwNCwKKyAgICAxMzQzMiwgICAgICAgICAxNjA0LCAgICAgICAgICA5MTE4LCAgICAgMjM0MSwKKyAgICAzOTY4LCAgICAgICAgIDE1MzgsICAgICAgICAgIDU0NzksICAgICA5OTM2LAorICAgIDM3OTUsICAgICAgICAgIDQxNywgICAgICAgICAgMTM1OSwgICAgICA0MTQsCisgICAgMzY0MCwgICAgICAgICAxNTY5LCAgICAgICAgICA3OTk1LCAgICAgMzU0MSwKKyAgICAxMTQwNSwgICAgICAgICAgNjQ1LCAgICAgICAgICA4NTUyLCAgICAgIDYzNSwKKyAgICA0MDU2LCAgICAgICAgIDEzNzcsICAgICAgICAgMTY2MDgsICAgICA2MTI0LAorICAgIDExNDIwLCAgICAgICAgICA3MDAsICAgICAgICAgIDIwMDcsICAgICAgNjA3LAorICAgIDEyNDE1LCAgICAgICAgIDE1NzgsICAgICAgICAgMTExMTksICAgICA0NjU0LAorICAgIDEzNjgwLCAgICAgICAgIDE3MDgsICAgICAgICAgMTE5OTAsICAgICAxMjI5LAorICAgIDc5OTYsICAgICAgICAgNzI5NywgICAgICAgICAxMzIzMSwgICAgIDU3MTUsCisgICAgMjQyOCwgICAgICAgICAxMTU5LCAgICAgICAgICAyMDczLCAgICAgMTk0MSwKKyAgICA2MjE4LCAgICAgICAgIDYxMjEsICAgICAgICAgIDM1NDYsICAgICAxODA0LAorICAgIDg5MjUsICAgICAgICAgMTgwMiwgICAgICAgICAgODY3OSwgICAgIDE1ODAsCisgICAgMTM5MzUsICAgICAgICAgMzU3NiwgICAgICAgICAxMzMxMywgICAgIDYyMzcsCisgICAgNjE0MiwgICAgICAgICAxMTMwLCAgICAgICAgICA1OTk0LCAgICAgMTczNCwKKyAgICAxNDE0MSwgICAgICAgICA0NjYyLCAgICAgICAgIDExMjcxLCAgICAgMzMyMSwKKyAgICAxMjIyNiwgICAgICAgICAxNTUxLCAgICAgICAgIDEzOTMxLCAgICAgMzAxNSwKKyAgICA1MDgxLCAgICAgICAgMTA0NjQsICAgICAgICAgIDk0NDQsICAgICA2NzA2LAorICAgIDE2ODksICAgICAgICAgIDY4MywgICAgICAgICAgMTQzNiwgICAgIDEzMDYsCisgICAgNzIxMiwgICAgICAgICAzOTMzLCAgICAgICAgICA0MDgyLCAgICAgMjcxMywKKyAgICA3NzkzLCAgICAgICAgICA3MDQsICAgICAgICAgMTUwNzAsICAgICAgODAyLAorICAgIDYyOTksICAgICAgICAgNTIxMiwgICAgICAgICAgNDMzNywgICAgIDUzNTcsCisgICAgNjY3NiwgICAgICAgICAgNTQxLCAgICAgICAgICA2MDYyLCAgICAgIDYyNiwKKyAgICAxMzY1MSwgICAgICAgICAzNzAwLCAgICAgICAgIDExNDk4LCAgICAgMjQwOCwKKyAgICAxNjE1NiwgICAgICAgICAgNzE2LCAgICAgICAgIDEyMTc3LCAgICAgIDc1MSwKKyAgICA4MDY1LCAgICAgICAgMTE0ODksICAgICAgICAgIDYzMTQsICAgICAyMjU2LAorICAgIDQ0NjYsICAgICAgICAgIDQ5NiwgICAgICAgICAgNzI5MywgICAgICA1MjMsCisgICAgMTAyMTMsICAgICAgICAgMzgzMywgICAgICAgICAgODM5NCwgICAgIDMwMzcsCisgICAgODQwMywgICAgICAgICAgOTY2LCAgICAgICAgIDE0MjI4LCAgICAgMTg4MCwKKyAgICA4NzAzLCAgICAgICAgIDU0MDksICAgICAgICAgMTYzOTUsICAgICA0ODYzLAorICAgIDc0MjAsICAgICAgICAgMTk3OSwgICAgICAgICAgNjA4OSwgICAgIDEyMzAsCisgICAgOTM3MSwgICAgICAgICA0Mzk4LCAgICAgICAgIDE0NTU4LCAgICAgMzM2MywKKyAgICAxMzU1OSwgICAgICAgICAyODczLCAgICAgICAgIDEzMTYzLCAgICAgMTQ2NSwKKyAgICA1NTM0LCAgICAgICAgIDE2NzgsICAgICAgICAgMTMxMzgsICAgIDE0NzcxLAorICAgIDczMzgsICAgICAgICAgIDYwMCwgICAgICAgICAgMTMxOCwgICAgICA1NDgsCisgICAgNDI1MiwgICAgICAgICAzNTM5LCAgICAgICAgIDEwMDQ0LCAgICAgMjM2NCwKKyAgICAxMDU4NywgICAgICAgICAgNjIyLCAgICAgICAgIDEzMDg4LCAgICAgIDY2OSwKKyAgICAxNDEyNiwgICAgICAgICAzNTI2LCAgICAgICAgICA1MDM5LCAgICAgOTc4NCwKKyAgICAxNTMzOCwgICAgICAgICAgNjE5LCAgICAgICAgICAzMTE1LCAgICAgIDU5MCwKKyAgICAxNjQ0MiwgICAgICAgICAzMDEzLCAgICAgICAgIDE1NTQyLCAgICAgNDE2OCwKKyAgICAxNTUzNywgICAgICAgICAxNjExLCAgICAgICAgIDE1NDA1LCAgICAgMTIyOCwKKyAgICAxNjAyMywgICAgICAgICA5Mjk5LCAgICAgICAgICA3NTM0LCAgICAgNDk3NiwKKyAgICAxOTkwLCAgICAgICAgIDEyMTMsICAgICAgICAgMTE0NDcsICAgICAxMTU3LAorICAgIDEyNTEyLCAgICAgICAgIDU1MTksICAgICAgICAgIDk0NzUsICAgICAyNjQ0LAorICAgIDc3MTYsICAgICAgICAgMjAzNCwgICAgICAgICAxMzI4MCwgICAgIDIyMzksCisgICAgMTYwMTEsICAgICAgICAgNTA5MywgICAgICAgICAgODA2NiwgICAgIDY3NjEsCisgICAgMTAwODMsICAgICAgICAgMTQxMywgICAgICAgICAgNTAwMiwgICAgIDIzNDcsCisgICAgMTI1MjMsICAgICAgICAgNTk3NSwgICAgICAgICAxNTEyNiwgICAgIDI4OTksCisgICAgMTgyNjQsICAgICAgICAgMjI4OSwgICAgICAgICAxNTgyNywgICAgIDI1MjcsCisgICAgMTYyNjUsICAgICAgICAxMDI1NCwgICAgICAgICAxNDY1MSwgICAgMTEzMTksCisgICAgMTc5NywgICAgICAgICAgMzM3LCAgICAgICAgICAzMTE1LCAgICAgIDM5NywKKyAgICAzNTEwLCAgICAgICAgIDI5MjgsICAgICAgICAgIDQ1OTIsICAgICAyNjcwLAorICAgIDc1MTksICAgICAgICAgIDYyOCwgICAgICAgICAxMTQxNSwgICAgICA2NTYsCisgICAgNTk0NiwgICAgICAgICAyNDM1LCAgICAgICAgICA2NTQ0LCAgICAgNzM2NywKKyAgICA4MjM4LCAgICAgICAgICA4MjksICAgICAgICAgIDQwMDAsICAgICAgODYzLAorICAgIDEwMDMyLCAgICAgICAgIDI0OTIsICAgICAgICAgMTYwNTcsICAgICAzNTUxLAorICAgIDE4MjA0LCAgICAgICAgIDEwNTQsICAgICAgICAgIDYxMDMsICAgICAxNDU0LAorICAgIDU4ODQsICAgICAgICAgNzkwMCwgICAgICAgICAxODc1MiwgICAgIDM0NjgsCisgICAgMTg2NCwgICAgICAgICAgNTQ0LCAgICAgICAgICA5MTk4LCAgICAgIDY4MywKKyAgICAxMTYyMywgICAgICAgICA0MTYwLCAgICAgICAgICA0NTk0LCAgICAgMTY0NCwKKyAgICAzMTU4LCAgICAgICAgIDExNTcsICAgICAgICAgMTU5NTMsICAgICAyNTYwLAorICAgIDEyMzQ5LCAgICAgICAgIDM3MzMsICAgICAgICAgMTc0MjAsICAgICA1MjYwLAorICAgIDYxMDYsICAgICAgICAgMjAwNCwgICAgICAgICAgMjkxNywgICAgIDE3NDIsCisgICAgMTY0NjcsICAgICAgICAgNTI1NywgICAgICAgICAxNjc4NywgICAgIDE2ODAsCisgICAgMTcyMDUsICAgICAgICAgMTc1OSwgICAgICAgICAgNDc3MywgICAgIDMyMzEsCisgICAgNzM4NiwgICAgICAgICA2MDM1LCAgICAgICAgIDE0MzQyLCAgICAxMDAxMiwKKyAgICA0MDM1LCAgICAgICAgICA0NDIsICAgICAgICAgIDQxOTQsICAgICAgNDU4LAorICAgIDkyMTQsICAgICAgICAgMjI0MiwgICAgICAgICAgNzQyNywgICAgIDQyMTcsCisgICAgMTI4NjAsICAgICAgICAgIDgwMSwgICAgICAgICAxMTE4NiwgICAgICA4MjUsCisgICAgMTI2NDgsICAgICAgICAgMjA4NCwgICAgICAgICAxMjk1NiwgICAgIDY1NTQsCisgICAgOTUwNSwgICAgICAgICAgOTk2LCAgICAgICAgICA2NjI5LCAgICAgIDk4NSwKKyAgICAxMDUzNywgICAgICAgICAyNTAyLCAgICAgICAgIDE1Mjg5LCAgICAgNTAwNiwKKyAgICAxMjYwMiwgICAgICAgICAyMDU1LCAgICAgICAgIDE1NDg0LCAgICAgMTY1MywKKyAgICAxNjE5NCwgICAgICAgICA2OTIxLCAgICAgICAgIDE0MjMxLCAgICAgNTc5MCwKKyAgICAyNjI2LCAgICAgICAgICA4MjgsICAgICAgICAgIDU2MTUsICAgICAxNjg2LAorICAgIDEzNjYzLCAgICAgICAgIDU3NzgsICAgICAgICAgIDM2NjgsICAgICAxNTU0LAorICAgIDExMzEzLCAgICAgICAgIDI2MzMsICAgICAgICAgIDk3NzAsICAgICAxNDU5LAorICAgIDE0MDAzLCAgICAgICAgIDQ3MzMsICAgICAgICAgMTU4OTcsICAgICA2MjkxLAorICAgIDYyNzgsICAgICAgICAgMTg3MCwgICAgICAgICAgNzkxMCwgICAgIDIyODUsCisgICAgMTY5NzgsICAgICAgICAgNDU3MSwgICAgICAgICAxNjU3NiwgICAgIDM4NDksCisgICAgMTUyNDgsICAgICAgICAgMjMxMSwgICAgICAgICAxNjAyMywgICAgIDMyNDQsCisgICAgMTQ0NTksICAgICAgICAxNzgwOCwgICAgICAgICAxMTg0NywgICAgIDI3NjMsCisgICAgMTk4MSwgICAgICAgICAxNDA3LCAgICAgICAgICAxNDAwLCAgICAgIDg3NiwKKyAgICA0MzM1LCAgICAgICAgIDM1NDcsICAgICAgICAgIDQzOTEsICAgICA0MjEwLAorICAgIDU0MDUsICAgICAgICAgIDY4MCwgICAgICAgICAxNzQ2MSwgICAgICA3ODEsCisgICAgNjUwMSwgICAgICAgICA1MTE4LCAgICAgICAgICA4MDkxLCAgICAgNzY3NywKKyAgICA3MzU1LCAgICAgICAgICA3OTQsICAgICAgICAgIDgzMzMsICAgICAxMTgyLAorICAgIDE1MDQxLCAgICAgICAgIDMxNjAsICAgICAgICAgMTQ5MjgsICAgICAzMDM5LAorICAgIDIwNDIxLCAgICAgICAgICA4ODAsICAgICAgICAgMTQ1NDUsICAgICAgODUyLAorICAgIDEyMzM3LCAgICAgICAgMTQ3MDgsICAgICAgICAgIDY5MDQsICAgICAxOTIwLAorICAgIDQyMjUsICAgICAgICAgIDkzMywgICAgICAgICAgODIxOCwgICAgIDEwODcsCisgICAgMTA2NTksICAgICAgICAgNDA4NCwgICAgICAgICAxMDA4MiwgICAgIDQ1MzMsCisgICAgMjczNSwgICAgICAgICAgODQwLCAgICAgICAgIDIwNjU3LCAgICAgMTA4MSwKKyAgICAxNjcxMSwgICAgICAgICA1OTY2LCAgICAgICAgIDE1ODczLCAgICAgNDU3OCwKKyAgICAxMDg3MSwgICAgICAgICAyNTc0LCAgICAgICAgICAzNzczLCAgICAgMTE2NiwKKyAgICAxNDUxOSwgICAgICAgICA0MDQ0LCAgICAgICAgIDIwNjk5LCAgICAgMjYyNywKKyAgICAxNTIxOSwgICAgICAgICAyNzM0LCAgICAgICAgIDE1Mjc0LCAgICAgMjE4NiwKKyAgICA2MjU3LCAgICAgICAgIDMyMjYsICAgICAgICAgMTMxMjUsICAgIDE5NDgwLAorICAgIDcxOTYsICAgICAgICAgIDkzMCwgICAgICAgICAgMjQ2MiwgICAgIDE2MTgsCisgICAgNDUxNSwgICAgICAgICAzMDkyLCAgICAgICAgIDEzODUyLCAgICAgNDI3NywKKyAgICAxMDQ2MCwgICAgICAgICAgODMzLCAgICAgICAgIDE3MzM5LCAgICAgIDgxMCwKKyAgICAxNjg5MSwgICAgICAgICAyMjg5LCAgICAgICAgIDE1NTQ2LCAgICAgODIxNywKKyAgICAxMzYwMywgICAgICAgICAxNjg0LCAgICAgICAgICAzMTk3LCAgICAgMTgzNCwKKyAgICAxNTk0OCwgICAgICAgICAyODIwLCAgICAgICAgIDE1ODEyLCAgICAgNTMyNywKKyAgICAxNzAwNiwgICAgICAgICAyNDM4LCAgICAgICAgIDE2Nzg4LCAgICAgMTMyNiwKKyAgICAxNTY3MSwgICAgICAgICA4MTU2LCAgICAgICAgIDExNzI2LCAgICAgODU1NiwKKyAgICAzNzYyLCAgICAgICAgIDIwNTMsICAgICAgICAgIDk1NjMsICAgICAxMzE3LAorICAgIDEzNTYxLCAgICAgICAgIDY3OTAsICAgICAgICAgMTIyMjcsICAgICAxOTM2LAorICAgIDgxODAsICAgICAgICAgMzU1MCwgICAgICAgICAxMzI4NywgICAgIDE3NzgsCisgICAgMTYyOTksICAgICAgICAgNjU5OSwgICAgICAgICAxNjI5MSwgICAgIDc3NTgsCisgICAgODUyMSwgICAgICAgICAyNTUxLCAgICAgICAgICA3MjI1LCAgICAgMjY0NSwKKyAgICAxODI2OSwgICAgICAgICA3NDg5LCAgICAgICAgIDE2ODg1LCAgICAgMjI0OCwKKyAgICAxNzg4MiwgICAgICAgICAyODg0LCAgICAgICAgIDE3MjY1LCAgICAgMzMyOCwKKyAgICA5NDE3LCAgICAgICAgMjAxNjIsICAgICAgICAgMTEwNDIsICAgICA4MzIwLAorICAgIDEyODYsICAgICAgICAgIDYyMCwgICAgICAgICAgMTQzMSwgICAgICA1ODMsCisgICAgNTk5MywgICAgICAgICAyMjg5LCAgICAgICAgICAzOTc4LCAgICAgMzYyNiwKKyAgICA1MTQ0LCAgICAgICAgICA3NTIsICAgICAgICAgMTM0MDksICAgICAgODMwLAorICAgIDU1NTMsICAgICAgICAgMjg2MCwgICAgICAgICAxMTc2NCwgICAgIDU5MDgsCisgICAgMTA3MzcsICAgICAgICAgIDU2MCwgICAgICAgICAgNTQ0NiwgICAgICA1NjQsCisgICAgMTMzMjEsICAgICAgICAgMzAwOCwgICAgICAgICAxMTk0NiwgICAgIDM2ODMsCisgICAgMTk4ODcsICAgICAgICAgIDc5OCwgICAgICAgICAgOTgyNSwgICAgICA3MjgsCisgICAgMTM2NjMsICAgICAgICAgODc0OCwgICAgICAgICAgNzM5MSwgICAgIDMwNTMsCisgICAgMjUxNSwgICAgICAgICAgNzc4LCAgICAgICAgICA2MDUwLCAgICAgIDgzMywKKyAgICA2NDY5LCAgICAgICAgIDUwNzQsICAgICAgICAgIDgzMDUsICAgICAyNDYzLAorICAgIDYxNDEsICAgICAgICAgMTg2NSwgICAgICAgICAxNTMwOCwgICAgIDEyNjIsCisgICAgMTQ0MDgsICAgICAgICAgNDU0NywgICAgICAgICAxMzY2MywgICAgIDQ1MTUsCisgICAgMzEzNywgICAgICAgICAyOTgzLCAgICAgICAgICAyNDc5LCAgICAgMTI1OSwKKyAgICAxNTA4OCwgICAgICAgICA0NjQ3LCAgICAgICAgIDE1MzgyLCAgICAgMjYwNywKKyAgICAxNDQ5MiwgICAgICAgICAyMzkyLCAgICAgICAgIDEyNDYyLCAgICAgMjUzNywKKyAgICA3NTM5LCAgICAgICAgIDI5NDksICAgICAgICAgMTI5MDksICAgIDEyMDYwLAorICAgIDU0NjgsICAgICAgICAgIDY4NCwgICAgICAgICAgMzE0MSwgICAgICA3MjIsCisgICAgNTA4MSwgICAgICAgICAxMjc0LCAgICAgICAgIDEyNzMyLCAgICAgNDIwMCwKKyAgICAxNTMwMiwgICAgICAgICAgNjgxLCAgICAgICAgICA3ODE5LCAgICAgIDU5MiwKKyAgICA2NTM0LCAgICAgICAgIDIwMjEsICAgICAgICAgMTY0NzgsICAgICA4NzM3LAorICAgIDEzMzY0LCAgICAgICAgICA4ODIsICAgICAgICAgIDUzOTcsICAgICAgODk5LAorICAgIDE0NjU2LCAgICAgICAgIDIxNzgsICAgICAgICAgMTQ3NDEsICAgICA0MjI3LAorICAgIDE0MjcwLCAgICAgICAgIDEyOTgsICAgICAgICAgMTM5MjksICAgICAyMDI5LAorICAgIDE1NDc3LCAgICAgICAgIDc0ODIsICAgICAgICAgMTU4MTUsICAgICA0NTcyLAorICAgIDI1MjEsICAgICAgICAgMjAxMywgICAgICAgICAgNTA2MiwgICAgIDE4MDQsCisgICAgNTE1OSwgICAgICAgICA2NTgyLCAgICAgICAgICA3MTMwLCAgICAgMzU5NywKKyAgICAxMDkyMCwgICAgICAgICAxNjExLCAgICAgICAgIDExNzI5LCAgICAgMTcwOCwKKyAgICAxNjkwMywgICAgICAgICAzNDU1LCAgICAgICAgIDE2MjY4LCAgICAgNjY0MCwKKyAgICA5MzA2LCAgICAgICAgIDEwMDcsICAgICAgICAgIDkzNjksICAgICAyMTA2LAorICAgIDE5MTgyLCAgICAgICAgIDUwMzcsICAgICAgICAgMTI0NDEsICAgICA0MjY5LAorICAgIDE1OTE5LCAgICAgICAgIDEzMzIsICAgICAgICAgMTUzNTcsICAgICAzNTEyLAorICAgIDExODk4LCAgICAgICAgMTQxNDEsICAgICAgICAgMTYxMDEsICAgICA2ODU0LAorICAgIDIwMTAsICAgICAgICAgIDczNywgICAgICAgICAgMzc3OSwgICAgICA4NjEsCisgICAgMTE0NTQsICAgICAgICAgMjg4MCwgICAgICAgICAgMzU2NCwgICAgIDM1NDAsCisgICAgOTA1NywgICAgICAgICAxMjQxLCAgICAgICAgIDEyMzkxLCAgICAgIDg5NiwKKyAgICA4NTQ2LCAgICAgICAgIDQ2MjksICAgICAgICAgMTE1NjEsICAgICA1Nzc2LAorICAgIDgxMjksICAgICAgICAgIDU4OSwgICAgICAgICAgODIxOCwgICAgICA1ODgsCisgICAgMTg3MjgsICAgICAgICAgMzc1NSwgICAgICAgICAxMjk3MywgICAgIDMxNDksCisgICAgMTU3MjksICAgICAgICAgIDc1OCwgICAgICAgICAxNjYzNCwgICAgICA3NTQsCisgICAgMTUyMjIsICAgICAgICAxMTEzOCwgICAgICAgICAxNTg3MSwgICAgIDIyMDgsCisgICAgNDY3MywgICAgICAgICAgNjEwLCAgICAgICAgIDEwMjE4LCAgICAgIDY3OCwKKyAgICAxNTI1NywgICAgICAgICA0MTQ2LCAgICAgICAgICA1NzI5LCAgICAgMzMyNywKKyAgICA4Mzc3LCAgICAgICAgIDE2NzAsICAgICAgICAgMTk4NjIsICAgICAyMzIxLAorICAgIDE1NDUwLCAgICAgICAgIDU1MTEsICAgICAgICAgMTQwNTQsICAgICA1NDgxLAorICAgIDU3MjgsICAgICAgICAgMjg4OCwgICAgICAgICAgNzU4MCwgICAgIDEzNDYsCisgICAgMTQzODQsICAgICAgICAgNTMyNSwgICAgICAgICAxNjIzNiwgICAgIDM5NTAsCisgICAgMTUxMTgsICAgICAgICAgMzc0NCwgICAgICAgICAxNTMwNiwgICAgIDE0MzUsCisgICAgMTQ1OTcsICAgICAgICAgNDA3MCwgICAgICAgICAxMjMwMSwgICAgMTU2OTYsCisgICAgNzYxNywgICAgICAgICAxNjk5LCAgICAgICAgICAyMTcwLCAgICAgIDg4NCwKKyAgICA0NDU5LCAgICAgICAgIDQ1NjcsICAgICAgICAgMTgwOTQsICAgICAzMzA2LAorICAgIDEyNzQyLCAgICAgICAgICA4MTUsICAgICAgICAgMTQ5MjYsICAgICAgOTA3LAorICAgIDE1MDE2LCAgICAgICAgIDQyODEsICAgICAgICAgMTU1MTgsICAgICA4MzY4LAorICAgIDE3OTk0LCAgICAgICAgIDEwODcsICAgICAgICAgIDIzNTgsICAgICAgODY1LAorICAgIDE2MjgxLCAgICAgICAgIDM3ODcsICAgICAgICAgMTU2NzksICAgICA0NTk2LAorICAgIDE2MzU2LCAgICAgICAgIDE1MzQsICAgICAgICAgMTY1ODQsICAgICAyMjEwLAorICAgIDE2ODMzLCAgICAgICAgIDk2OTcsICAgICAgICAgMTU5MjksICAgICA0NTEzLAorICAgIDMyNzcsICAgICAgICAgMTA4NSwgICAgICAgICAgOTY0MywgICAgIDIxODcsCisgICAgMTE5NzMsICAgICAgICAgNjA2OCwgICAgICAgICAgOTE5OSwgICAgIDQ0NjIsCisgICAgODk1NSwgICAgICAgICAxNjI5LCAgICAgICAgIDEwMjg5LCAgICAgMzA2MiwKKyAgICAxNjQ4MSwgICAgICAgICA1MTU1LCAgICAgICAgIDE1NDY2LCAgICAgNzA2NiwKKyAgICAxMzY3OCwgICAgICAgICAyNTQzLCAgICAgICAgICA1MjczLCAgICAgMjI3NywKKyAgICAxNjc0NiwgICAgICAgICA2MjEzLCAgICAgICAgIDE2NjU1LCAgICAgMzQwOCwKKyAgICAyMDMwNCwgICAgICAgICAzMzYzLCAgICAgICAgIDE4Njg4LCAgICAgMTk4NSwKKyAgICAxNDE3MiwgICAgICAgIDEyODY3LCAgICAgICAgIDE1MTU0LCAgICAxNTcwMywKKyAgICA0NDczLCAgICAgICAgIDEwMjAsICAgICAgICAgIDE2ODEsICAgICAgODg2LAorICAgIDQzMTEsICAgICAgICAgNDMwMSwgICAgICAgICAgODk1MiwgICAgIDM2NTcsCisgICAgNTg5MywgICAgICAgICAxMTQ3LCAgICAgICAgIDExNjQ3LCAgICAgMTQ1MiwKKyAgICAxNTg4NiwgICAgICAgICAyMjI3LCAgICAgICAgICA0NTgyLCAgICAgNjY0NCwKKyAgICA2OTI5LCAgICAgICAgIDEyMDUsICAgICAgICAgIDYyMjAsICAgICAgNzk5LAorICAgIDEyNDE1LCAgICAgICAgIDM0MDksICAgICAgICAgMTU5NjgsICAgICAzODc3LAorICAgIDE5ODU5LCAgICAgICAgIDIxMDksICAgICAgICAgIDk2ODksICAgICAyMTQxLAorICAgIDE0NzQyLCAgICAgICAgIDg4MzAsICAgICAgICAgMTQ0ODAsICAgICAyNTk5LAorICAgIDE4MTcsICAgICAgICAgMTIzOCwgICAgICAgICAgNzc3MSwgICAgICA4MTMsCisgICAgMTkwNzksICAgICAgICAgNDQxMCwgICAgICAgICAgNTU1NCwgICAgIDIwNjQsCisgICAgMzY4NywgICAgICAgICAyODQ0LCAgICAgICAgIDE3NDM1LCAgICAgMjI1NiwKKyAgICAxNjY5NywgICAgICAgICA0NDg2LCAgICAgICAgIDE2MTk5LCAgICAgNTM4OCwKKyAgICA4MDI4LCAgICAgICAgIDI3NjMsICAgICAgICAgIDM0MDUsICAgICAyMTE5LAorICAgIDE3NDI2LCAgICAgICAgIDU0NzcsICAgICAgICAgMTM2OTgsICAgICAyNzg2LAorICAgIDE5ODc5LCAgICAgICAgIDI3MjAsICAgICAgICAgIDkwOTgsICAgICAzODgwLAorICAgIDE4MTcyLCAgICAgICAgIDQ4MzMsICAgICAgICAgMTczMzYsICAgIDEyMjA3LAorICAgIDUxMTYsICAgICAgICAgIDk5NiwgICAgICAgICAgNDkzNSwgICAgICA5ODgsCisgICAgOTg4OCwgICAgICAgICAzMDgxLCAgICAgICAgICA2MDE0LCAgICAgNTM3MSwKKyAgICAxNTg4MSwgICAgICAgICAxNjY3LCAgICAgICAgICA4NDA1LCAgICAgMTE4MywKKyAgICAxNTA4NywgICAgICAgICAyMzY2LCAgICAgICAgIDE5Nzc3LCAgICAgNzAwMiwKKyAgICAxMTk2MywgICAgICAgICAxNTYyLCAgICAgICAgICA3Mjc5LCAgICAgMTEyOCwKKyAgICAxNjg1OSwgICAgICAgICAxNTMyLCAgICAgICAgIDE1NzYyLCAgICAgNTM4MSwKKyAgICAxNDcwOCwgICAgICAgICAyMDY1LCAgICAgICAgIDIwMTA1LCAgICAgMjE1NSwKKyAgICAxNzE1OCwgICAgICAgICA4MjQ1LCAgICAgICAgIDE3OTExLCAgICAgNjMxOCwKKyAgICA1NDY3LCAgICAgICAgIDE1MDQsICAgICAgICAgIDQxMDAsICAgICAyNTc0LAorICAgIDE3NDIxLCAgICAgICAgIDY4MTAsICAgICAgICAgIDU2NzMsICAgICAyODg4LAorICAgIDE2NjM2LCAgICAgICAgIDMzODIsICAgICAgICAgIDg5NzUsICAgICAxODMxLAorICAgIDIwMTU5LCAgICAgICAgIDQ3MzcsICAgICAgICAgMTk1NTAsICAgICA3Mjk0LAorICAgIDY2NTgsICAgICAgICAgMjc4MSwgICAgICAgICAxMTQ3MiwgICAgIDMzMjEsCisgICAgMTkzOTcsICAgICAgICAgNTA1NCwgICAgICAgICAxODg3OCwgICAgIDQ3MjIsCisgICAgMTY0MzksICAgICAgICAgMjM3MywgICAgICAgICAyMDQzMCwgICAgIDQzODYsCisgICAgMTEzNTMsICAgICAgICAyNjUyNiwgICAgICAgICAxMTU5MywgICAgIDMwNjgsCisgICAgMjg2NiwgICAgICAgICAxNTY2LCAgICAgICAgICA1MTA4LCAgICAgMTA3MCwKKyAgICA5NjE0LCAgICAgICAgIDQ5MTUsICAgICAgICAgIDQ5MzksICAgICAzNTM2LAorICAgIDc1NDEsICAgICAgICAgIDg3OCwgICAgICAgICAyMDcxNywgICAgICA4NTEsCisgICAgNjkzOCwgICAgICAgICA0Mzk1LCAgICAgICAgIDE2Nzk5LCAgICAgNzczMywKKyAgICAxMDEzNywgICAgICAgICAxMDE5LCAgICAgICAgICA5ODQ1LCAgICAgIDk2NCwKKyAgICAxNTQ5NCwgICAgICAgICAzOTU1LCAgICAgICAgIDE1NDU5LCAgICAgMzQzMCwKKyAgICAxODg2MywgICAgICAgICAgOTgyLCAgICAgICAgIDIwMTIwLCAgICAgIDk2MywKKyAgICAxNjg3NiwgICAgICAgIDEyODg3LCAgICAgICAgIDE0MzM0LCAgICAgNDIwMCwKKyAgICA2NTk5LCAgICAgICAgIDEyMjAsICAgICAgICAgIDkyMjIsICAgICAgODE0LAorICAgIDE2OTQyLCAgICAgICAgIDUxMzQsICAgICAgICAgIDU2NjEsICAgICA0ODk4LAorICAgIDU0ODgsICAgICAgICAgMTc5OCwgICAgICAgICAyMDI1OCwgICAgIDM5NjIsCisgICAgMTcwMDUsICAgICAgICAgNjE3OCwgICAgICAgICAxNzkyOSwgICAgIDU5MjksCisgICAgOTM2NSwgICAgICAgICAzNDIwLCAgICAgICAgICA3NDc0LCAgICAgMTk3MSwKKyAgICAxOTUzNywgICAgICAgICA1MTc3LCAgICAgICAgIDE5MDAzLCAgICAgMzAwNiwKKyAgICAxNjQ1NCwgICAgICAgICAzNzg4LCAgICAgICAgIDE2MDcwLCAgICAgMjM2NywKKyAgICA4NjY0LCAgICAgICAgIDI3NDMsICAgICAgICAgIDk0NDUsICAgIDI2MzU4LAorICAgIDEwODU2LCAgICAgICAgIDEyODcsICAgICAgICAgIDM1NTUsICAgICAxMDA5LAorICAgIDU2MDYsICAgICAgICAgMzYyMiwgICAgICAgICAxOTQ1MywgICAgIDU1MTIsCisgICAgMTI0NTMsICAgICAgICAgIDc5NywgICAgICAgICAyMDYzNCwgICAgICA5MTEsCisgICAgMTU0MjcsICAgICAgICAgMzA2NiwgICAgICAgICAxNzAzNywgICAgMTAyNzUsCisgICAgMTg4ODMsICAgICAgICAgMjYzMywgICAgICAgICAgMzkxMywgICAgIDEyNjgsCisgICAgMTk1MTksICAgICAgICAgMzM3MSwgICAgICAgICAxODA1MiwgICAgIDUyMzAsCisgICAgMTkyOTEsICAgICAgICAgMTY3OCwgICAgICAgICAxOTUwOCwgICAgIDMxNzIsCisgICAgMTgwNzIsICAgICAgICAxMDc1NCwgICAgICAgICAxNjYyNSwgICAgIDY4NDUsCisgICAgMzEzNCwgICAgICAgICAyMjk4LCAgICAgICAgIDEwODY5LCAgICAgMjQzNywKKyAgICAxNTU4MCwgICAgICAgICA2OTEzLCAgICAgICAgIDEyNTk3LCAgICAgMzM4MSwKKyAgICAxMTExNiwgICAgICAgICAzMjk3LCAgICAgICAgIDE2NzYyLCAgICAgMjQyNCwKKyAgICAxODg1MywgICAgICAgICA2NzE1LCAgICAgICAgIDE3MTcxLCAgICAgOTg4NywKKyAgICAxMjc0MywgICAgICAgICAyNjA1LCAgICAgICAgICA4OTM3LCAgICAgMzE0MCwKKyAgICAxOTAzMywgICAgICAgICA3NzY0LCAgICAgICAgIDE4MzQ3LCAgICAgMzg4MCwKKyAgICAyMDQ3NSwgICAgICAgICAzNjgyLCAgICAgICAgIDE5NjAyLCAgICAgMzM4MCwKKyAgICAxMzA0NCwgICAgICAgIDE5MzczLCAgICAgICAgIDEwNTI2LCAgICAyMzEyNAorfTsKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIE5BTUU6IE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKKworIElucHV0czoKKyAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKKyAgICBwID0gcG9pbnRlciB0byBzZWxlY3RlZCBxdWFudGl6ZXIgdGFibGUgZW50cnkgKGNvbnN0IFdvcmQxNikKKyAgICBnY29kZTAgPSBwcmVkaWN0ZWQgQ0IgZ2FpbiAoV29yZDE2KQorICAgIGV4cF9nY29kZTAgPSBleHBvbmVudCBvZiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoV29yZDE2KQorICAgIGdhaW5fcGl0ID0gcG9pbnRlciB0byBQaXRjaCBnYWluIChXb3JkMTYpCisgICAgZ2Fpbl9jb2QgPSBwb2ludGVyIHRvIENvZGUgZ2FpbiAoV29yZDE2KQorCisgT3V0cHV0czoKKyAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKKyAgICBnYWluX3BpdCBwb2ludHMgdG8gUGl0Y2ggZ2FpbgorICAgIGdhaW5fY29kIHBvaW50cyB0byBDb2RlIGdhaW4KKyAgICBwT3ZlcmZsb3cgcG9pbnRzIHRvIG92ZXJmbG93IGluZGljYXRvciAoRmxhZykKKworIFJldHVybnM6CisgICAgTm9uZS4KKworIEdsb2JhbCBWYXJpYWJsZXMgVXNlZDoKKyAgICBOb25lLgorCisgTG9jYWwgVmFyaWFibGVzIE5lZWRlZDoKKyAgICBOb25lLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBERVNDUklQVElPTgorCisgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBmaW5hbCBmaXhlZCBjb2RlYm9vayBnYWluIGFuZCB0aGUgcHJlZGljdG9yCisgdXBkYXRlIHZhbHVlcywgYW5kIHVwZGF0ZXMgdGhlIGdhaW4gcHJlZGljdG9yLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVFVSVJFTUVOVFMKKworIE5vbmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFRkVSRU5DRVMKKworIHFnYWluNDc1LmMsIFVNVFMgR1NNIEFNUiBzcGVlY2ggY29kZWMsIFI5OSAtIFZlcnNpb24gMy4yLjAsIE1hcmNoIDIsIDIwMDEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUFNFVURPLUNPREUKKworc3RhdGljIHZvaWQgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cygKKworICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLy8gaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QKKyAgICBjb25zdCBXb3JkMTYgKnAsICAgICAgIC8vIGkgIDogcG9pbnRlciB0byBzZWxlY3RlZCBxdWFudGl6ZXIgdGFibGUgZW50cnkKKyAgICBXb3JkMTYgZ2NvZGUwLCAgICAgICAgIC8vIGkgIDogcHJlZGljdGVkIENCIGdhaW4sICAgICBRKDE0IC0gZXhwX2djb2RlMCkKKyAgICBXb3JkMTYgZXhwX2djb2RlMCwgICAgIC8vIGkgIDogZXhwb25lbnQgb2YgcHJlZGljdGVkIENCIGdhaW4sICAgICAgICBRMAorICAgIFdvcmQxNiAqZ2Fpbl9waXQsICAgICAgLy8gbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFExNAorICAgIFdvcmQxNiAqZ2Fpbl9jb2QgICAgICAgLy8gbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExCispCit7CisKKyAgICBXb3JkMTYgZ19jb2RlLCBleHAsIGZyYWMsIHRtcDsKKyAgICBXb3JkMzIgTF90bXA7CisKKyAgICBXb3JkMTYgcXVhX2VuZXJfTVIxMjI7IC8vIG8gIDogcXVhbnRpemVkIGVuZXJneSBlcnJvciwgTVIxMjIgdmVyc2lvbiBRMTAKKyAgICBXb3JkMTYgcXVhX2VuZXI7ICAgICAgIC8vIG8gIDogcXVhbnRpemVkIGVuZXJneSBlcnJvciwgICAgICAgICAgICAgICBRMTAKKworICAgIC8vIFJlYWQgdGhlIHF1YW50aXplZCBnYWlucworICAgICpnYWluX3BpdCA9ICpwKys7CisgICAgZ19jb2RlID0gKnArKzsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBjYWxjdWxhdGUgZmluYWwgZml4ZWQgY29kZWJvb2sgZ2FpbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgZ2MgPSBnYzAgKiBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBMX3RtcCA9IExfbXVsdChnX2NvZGUsIGdjb2RlMCk7CisgICAgTF90bXAgPSBMX3NocihMX3RtcCwgc3ViKDEwLCBleHBfZ2NvZGUwKSk7CisgICAgKmdhaW5fY29kID0gZXh0cmFjdF9oKExfdG1wKTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBjYWxjdWxhdGUgcHJlZGljdG9yIHVwZGF0ZSB2YWx1ZXMgYW5kIHVwZGF0ZSBnYWluIHByZWRpY3RvcjogICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgcXVhX2VuZXIgICAgICAgPSBsb2cyKGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSAyMCpsb2cxMChnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBMb2cyIChMX2RlcG9zaXRfbCAoZ19jb2RlKSwgJmV4cCwgJmZyYWMpOyAvLyBMb2cyKHggUTEyKSA9IGxvZzIoeCkgKyAxMgorICAgIGV4cCA9IHN1YihleHAsIDEyKTsKKworICAgIHRtcCA9IHNocl9yIChmcmFjLCA1KTsKKyAgICBxdWFfZW5lcl9NUjEyMiA9IGFkZCAodG1wLCBzaGwgKGV4cCwgMTApKTsKKworICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjApOyAvLyAyNDY2MCBRMTIgfj0gNi4wMjA2ID0gMjAqbG9nMTAoMikKKyAgICBxdWFfZW5lciA9IHB2X3JvdW5kIChMX3NobCAoTF90bXAsIDEzKSk7IC8vIFExMiAqIFEwID0gUTEzIC0+IFExMAorCisgICAgZ2NfcHJlZF91cGRhdGUocHJlZF9zdCwgcXVhX2VuZXJfTVIxMjIsIHF1YV9lbmVyKTsKK30KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVTT1VSQ0VTIFVTRUQgW29wdGlvbmFsXQorCisgV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCisgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgorCisgSEVBUCBNRU1PUlkgVVNFRDogeCBieXRlcworCisgU1RBQ0sgTUVNT1JZIFVTRUQ6IHggYnl0ZXMKKworIENMT0NLIENZQ0xFUzogKGN5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uKSArICh2YXJpYWJsZQorICAgICAgICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKKyAgICAgICAgICAgICAgICBjYWxsZWQpCisgICAgIHdoZXJlOiAoY3ljbGUgY291bnQgdmFyaWFibGUpID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ0FVVElPTiBbb3B0aW9uYWxdCisgW1N0YXRlIGFueSBzcGVjaWFsIG5vdGVzLCBjb25zdHJhaW50cyBvciBjYXV0aW9ucyBmb3IgdXNlcnMgb2YgdGhpcyBmdW5jdGlvbl0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdGF0aWMgdm9pZCBNUjQ3NV9xdWFudF9zdG9yZV9yZXN1bHRzKAorICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAgICAqLworICAgIGNvbnN0IFdvcmQxNiAqcCwgICAgICAgLyogaSAgOiBwb2ludGVyIHRvIHNlbGVjdGVkIHF1YW50aXplciB0YWJsZSBlbnRyeSAqLworICAgIFdvcmQxNiBnY29kZTAsICAgICAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiwgICAgIFEoMTQgLSBleHBfZ2NvZGUwKSAqLworICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLyogaSAgOiBleHBvbmVudCBvZiBwcmVkaWN0ZWQgQ0IgZ2FpbiwgICAgICAgIFEwICAqLworICAgIFdvcmQxNiAqZ2Fpbl9waXQsICAgICAgLyogbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFExNCAqLworICAgIFdvcmQxNiAqZ2Fpbl9jb2QsICAgICAgLyogbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExICAqLworICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgLyogbyAgOiBvdmVyZmxvdyBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAqLworKQoreworICAgIFdvcmQxNiBnX2NvZGU7CisgICAgV29yZDE2IGV4cDsKKyAgICBXb3JkMTYgZnJhYzsKKyAgICBXb3JkMTYgdG1wOworICAgIFdvcmQzMiBMX3RtcDsKKworICAgIFdvcmQxNiBxdWFfZW5lcl9NUjEyMjsgLyogbyAgOiBxdWFudGl6ZWQgZW5lcmd5IGVycm9yLCBNUjEyMiB2ZXJzaW9uIFExMCAqLworICAgIFdvcmQxNiBxdWFfZW5lcjsgICAgICAgLyogbyAgOiBxdWFudGl6ZWQgZW5lcmd5IGVycm9yLCAgICAgICAgICAgICAgIFExMCAqLworCisKKyAgICAvKiBSZWFkIHRoZSBxdWFudGl6ZWQgZ2FpbnMgKi8KKyAgICAqZ2Fpbl9waXQgPSAqcCsrOworICAgIGdfY29kZSA9ICpwKys7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAgY2FsY3VsYXRlIGZpbmFsIGZpeGVkIGNvZGVib29rIGdhaW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgIGdjID0gZ2MwICogZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBMX3RtcCA9ICgoV29yZDMyKSBnX2NvZGUgKiBnY29kZTApIDw8IDE7CisgICAgdG1wICAgPSAxMCAtIGV4cF9nY29kZTA7CisgICAgTF90bXAgPSBMX3NocihMX3RtcCwgdG1wLCBwT3ZlcmZsb3cpOworICAgICpnYWluX2NvZCA9IChXb3JkMTYpKExfdG1wID4+IDE2KTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBjYWxjdWxhdGUgcHJlZGljdG9yIHVwZGF0ZSB2YWx1ZXMgYW5kIHVwZGF0ZSBnYWluIHByZWRpY3RvcjogICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgcXVhX2VuZXIgICAgICAgPSBsb2cyKGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSAyMCpsb2cxMChnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qIExvZzIoeCBRMTIpID0gbG9nMih4KSArIDEyICovCisgICAgTG9nMigoV29yZDMyKSBnX2NvZGUsICZleHAsICZmcmFjLCBwT3ZlcmZsb3cpOworICAgIGV4cCAtPSAxMjsKKworICAgIHRtcCA9IHNocl9yKGZyYWMsIDUsIHBPdmVyZmxvdyk7CisgICAgcXVhX2VuZXJfTVIxMjIgPSBleHAgPDwgMTA7CisgICAgcXVhX2VuZXJfTVIxMjIgPSB0bXAgKyBxdWFfZW5lcl9NUjEyMjsKKworICAgIC8qIDI0NjYwIFExMiB+PSA2LjAyMDYgPSAyMCpsb2cxMCgyKSAqLworICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjAsIHBPdmVyZmxvdyk7CisgICAgTF90bXAgPSBMX3RtcCA8PCAxMzsKKworICAgIC8qIFExMiAqIFEwID0gUTEzIC0+IFExMCAqLworICAgIHF1YV9lbmVyID0gKFdvcmQxNikoKExfdG1wICsgKFdvcmQzMikgMHgwMDAwODAwMEwpID4+IDE2KTsKKworICAgIGdjX3ByZWRfdXBkYXRlKHByZWRfc3QsIHF1YV9lbmVyX01SMTIyLCBxdWFfZW5lcik7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBOQU1FOiBNUjQ3NV91cGRhdGVfdW5xX3ByZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKKworIElucHV0czoKKyAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKKyAgICBleHBfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGV4cG9uZW50IE1TVykgKFdvcmQxNikKKyAgICBmcmFjX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBMU1cpIChXb3JkMTYpCisgICAgY29kX2dhaW5fZXhwID0gb3B0aW11bSBjb2RlYm9vayBnYWluIChleHBvbmVudCkoV29yZDE2KQorICAgIGNvZF9nYWluX2ZyYWMgPSBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGZyYWN0aW9uKSAoV29yZDE2KQorCisgT3V0cHV0czoKKyAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKKyAgICBwT3ZlcmZsb3cgcG9pbnRzIHRvIG92ZXJmbG93IGluZGljYXRvciAoRmxhZykKKworIFJldHVybnM6CisgICAgTm9uZS4KKworIEdsb2JhbCBWYXJpYWJsZXMgVXNlZDoKKyAgICBOb25lLgorCisgTG9jYWwgVmFyaWFibGVzIE5lZWRlZDoKKyAgICBOb25lLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBERVNDUklQVElPTgorCisgVGhpcyBtb2R1bGUgdXNlcyB0aGUgb3B0aW11bSBjb2RlYm9vayBnYWluIGFuZCB1cGRhdGVzIHRoZSAidW5xdWFudGl6ZWQiCisgZ2FpbiBwcmVkaWN0b3Igd2l0aCB0aGUgKGJvdW5kZWQpIHByZWRpY3Rpb24gZXJyb3IuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFUVVJUkVNRU5UUworCisgTm9uZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVGRVJFTkNFUworCisgcWdhaW40NzUuYywgVU1UUyBHU00gQU1SIHNwZWVjaCBjb2RlYywgUjk5IC0gVmVyc2lvbiAzLjIuMCwgTWFyY2ggMiwgMjAwMQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQU0VVRE8tQ09ERQorCit2b2lkCitNUjQ3NV91cGRhdGVfdW5xX3ByZWQoCisgICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAvLyBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdAorICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTVNXKSwgIFEwCisgICAgV29yZDE2IGZyYWNfZ2NvZGUwLCAgICAvLyBpICA6IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBMU1cpLCAgUTE1CisgICAgV29yZDE2IGNvZF9nYWluX2V4cCwgICAvLyBpICA6IG9wdGltdW0gY29kZWJvb2sgZ2FpbiAoZXhwb25lbnQpLCAgUTAKKyAgICBXb3JkMTYgY29kX2dhaW5fZnJhYyAgIC8vIGkgIDogb3B0aW11bSBjb2RlYm9vayBnYWluIChmcmFjdGlvbiksICBRMTUKKykKK3sKKyAgICBXb3JkMTYgdG1wLCBleHAsIGZyYWM7CisgICAgV29yZDE2IHF1YV9lbmVyLCBxdWFfZW5lcl9NUjEyMjsKKyAgICBXb3JkMzIgTF90bXA7CisKKyAgICAvLyBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciBmYWN0b3IgKGdpdmVuIG9wdGltdW0gQ0IgZ2FpbiBnY3UpOgorICAgIC8vICAgcHJlZEVyckZhY3QgPSBnY3UgLyBnY29kZTAKKyAgICAvLyAgIChsaW1pdCB0byBNSU5fUFJFRF9FUlJfRkFDVCA8PSBwcmVkRXJyRmFjdCA8PSBNQVhfUFJFRF9FUlJfRkFDVAorICAgIC8vICAgIC0+IGxpbWl0IHF1YV9lbmVyKikKKyAgICAvLworICAgIC8vIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIChsb2cpOgorICAgIC8vCisgICAgLy8gICBxdWFfZW5lcl9NUjEyMiA9IGxvZzIocHJlZEVyckZhY3QpCisgICAgLy8gICBxdWFfZW5lciAgICAgICA9IDIwKmxvZzEwKHByZWRFcnJGYWN0KQorCisgICAgaWYgKGNvZF9nYWluX2ZyYWMgPD0gMCkKKyAgICB7CisgICAgICAgIC8vIGlmIGdjdSA8PSAwIC0+IHByZWRFcnJGYWN0ID0gMCA8IE1JTl9QUkVEX0VSUl9GQUNUCisgICAgICAgIC8vIC0+IHNldCBxdWFfZW5lcihfTVIxMjIpIGRpcmVjdGx5CisgICAgICAgIHF1YV9lbmVyID0gTUlOX1FVQV9FTkVSOworICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gY29udmVydCBnY29kZTAgZnJvbSBEUEYgdG8gc3RhbmRhcmQgZnJhY3Rpb24vZXhwb25lbnQgZm9ybWF0CisgICAgICAgIC8vIHdpdGggbm9ybWFsaXplZCBmcmFjLCBpLmUuIDE2Mzg0IDw9IGZyYWMgPD0gMzI3NjcKKyAgICAgICAgLy8gTm90ZTogZXhwb25lbnQgY29ycmVjdGlvbiAoZXhwPWV4cC0xNCkgaXMgZG9uZSBhZnRlciBkaXZfcworICAgICAgICBmcmFjX2djb2RlMCA9IGV4dHJhY3RfbCAoUG93MiAoMTQsIGZyYWNfZ2NvZGUwKSk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIGNvZF9nYWluX2ZyYWMgPCBmcmFjX2djb2RlMCAgZm9yIGRpdl9zCisgICAgICAgIGlmIChzdWIoY29kX2dhaW5fZnJhYywgZnJhY19nY29kZTApID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZF9nYWluX2ZyYWMgPSBzaHIgKGNvZF9nYWluX2ZyYWMsIDEpOworICAgICAgICAgICAgY29kX2dhaW5fZXhwID0gYWRkIChjb2RfZ2Fpbl9leHAsIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJlZEVyckZhY3QKKyAgICAgICAgLy8gICA9IGdjdSAvIGdjb2RlMAorICAgICAgICAvLyAgID0gY29kX2dhaW5fZnJhYy9mcmFjX2djb2RlMCAqIDJeKGNvZF9nYWluX2V4cC0oZXhwX2djb2RlMC0xNCkpCisgICAgICAgIC8vICAgPSBkaXZfcyAoY19nX2YsIGZyYWNfZ2NvZGUwKSoyXi0xNSAqIDJeKGNfZ19lLWV4cF9nY29kZTArMTQpCisgICAgICAgIC8vICAgPSBkaXZfcyAqIDJeKGNvZF9nYWluX2V4cC1leHBfZ2NvZGUwIC0gMSkKKworICAgICAgICBmcmFjID0gZGl2X3MgKGNvZF9nYWluX2ZyYWMsIGZyYWNfZ2NvZGUwKTsKKyAgICAgICAgdG1wID0gc3ViIChzdWIgKGNvZF9nYWluX2V4cCwgZXhwX2djb2RlMCksIDEpOworCisgICAgICAgIExvZzIgKExfZGVwb3NpdF9sIChmcmFjKSwgJmV4cCwgJmZyYWMpOworICAgICAgICBleHAgPSBhZGQgKGV4cCwgdG1wKTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAobG9nMiwgUTEwKQorICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IHNocl9yIChmcmFjLCA1KTsKKyAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBhZGQgKHF1YV9lbmVyX01SMTIyLCBzaGwgKGV4cCwgMTApKTsKKworICAgICAgICBpZiAoc3ViKHF1YV9lbmVyX01SMTIyLCBNSU5fUVVBX0VORVJfTVIxMjIpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcXVhX2VuZXIgPSBNSU5fUVVBX0VORVI7CisgICAgICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdWIocXVhX2VuZXJfTVIxMjIsIE1BWF9RVUFfRU5FUl9NUjEyMikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBxdWFfZW5lciA9IE1BWF9RVUFfRU5FUjsKKyAgICAgICAgICAgIHF1YV9lbmVyX01SMTIyID0gTUFYX1FVQV9FTkVSX01SMTIyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHByZWRpY3Rpb24gZXJyb3IgKDIwKmxvZzEwLCBRMTApCisgICAgICAgICAgICBMX3RtcCA9IE1weV8zMl8xNihleHAsIGZyYWMsIDI0NjYwKTsKKyAgICAgICAgICAgIC8vIDI0NjYwIFExMiB+PSA2LjAyMDYgPSAyMCpsb2cxMCgyKQorICAgICAgICAgICAgcXVhX2VuZXIgPSBwdl9yb3VuZCAoTF9zaGwgKExfdG1wLCAxMykpOworICAgICAgICAgICAgLy8gUTEyICogUTAgPSBRMTMgLT4gUTI2IC0+IFExMAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXBkYXRlIE1BIHByZWRpY3RvciBtZW1vcnkKKyAgICBnY19wcmVkX3VwZGF0ZShwcmVkX3N0LCBxdWFfZW5lcl9NUjEyMiwgcXVhX2VuZXIpOworfQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCisKKyBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKKyB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCisKKyBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCisKKyBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcworCisgQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCisgICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQorICAgICAgICAgICAgICAgIGNhbGxlZCkKKyAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDQVVUSU9OIFtvcHRpb25hbF0KKyBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQgTVI0NzVfdXBkYXRlX3VucV9wcmVkKAorICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAqLworICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTVNXKSwgIFEwICAqLworICAgIFdvcmQxNiBmcmFjX2djb2RlMCwgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTFNXKSwgIFExNSAqLworICAgIFdvcmQxNiBjb2RfZ2Fpbl9leHAsICAgLyogaSAgOiBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGV4cG9uZW50KSwgIFEwICAqLworICAgIFdvcmQxNiBjb2RfZ2Fpbl9mcmFjLCAgLyogaSAgOiBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGZyYWN0aW9uKSwgIFExNSAqLworICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgLyogbyAgOiBvdmVyZmxvdyBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAqLworKQoreworICAgIFdvcmQxNiB0bXA7CisgICAgV29yZDE2IGV4cDsKKyAgICBXb3JkMTYgZnJhYzsKKyAgICBXb3JkMTYgcXVhX2VuZXI7CisgICAgV29yZDE2IHF1YV9lbmVyX01SMTIyOworICAgIFdvcmQzMiBMX3RtcDsKKworICAgIC8qIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIGZhY3RvciAoZ2l2ZW4gb3B0aW11bSBDQiBnYWluIGdjdSk6CisgICAgICoKKyAgICAgKiAgIHByZWRFcnJGYWN0ID0gZ2N1IC8gZ2NvZGUwCisgICAgICogICAobGltaXQgdG8gTUlOX1BSRURfRVJSX0ZBQ1QgPD0gcHJlZEVyckZhY3QgPD0gTUFYX1BSRURfRVJSX0ZBQ1QKKyAgICAgKiAgICAtPiBsaW1pdCBxdWFfZW5lciopCisgICAgICoKKyAgICAgKiBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAobG9nKToKKyAgICAgKgorICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSBsb2cyKHByZWRFcnJGYWN0KQorICAgICAqICAgcXVhX2VuZXIgICAgICAgPSAyMCpsb2cxMChwcmVkRXJyRmFjdCkKKyAgICAgKgorICAgICAqLworCisgICAgaWYgKGNvZF9nYWluX2ZyYWMgPD0gMCkKKyAgICB7CisgICAgICAgIC8qIGlmIGdjdSA8PSAwIC0+IHByZWRFcnJGYWN0ID0gMCA8IE1JTl9QUkVEX0VSUl9GQUNUICovCisgICAgICAgIC8qIC0+IHNldCBxdWFfZW5lcihfTVIxMjIpIGRpcmVjdGx5ICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHF1YV9lbmVyID0gTUlOX1FVQV9FTkVSOworICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogY29udmVydCBnY29kZTAgZnJvbSBEUEYgdG8gc3RhbmRhcmQgZnJhY3Rpb24vZXhwb25lbnQgZm9ybWF0ICovCisgICAgICAgIC8qIHdpdGggbm9ybWFsaXplZCBmcmFjLCBpLmUuIDE2Mzg0IDw9IGZyYWMgPD0gMzI3NjcgICAgICAgICAgICAqLworICAgICAgICAvKiBOb3RlOiBleHBvbmVudCBjb3JyZWN0aW9uIChleHA9ZXhwLTE0KSBpcyBkb25lIGFmdGVyIGRpdl9zICAgKi8KKyAgICAgICAgZnJhY19nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBmcmFjX2djb2RlMCwgcE92ZXJmbG93KSk7CisKKyAgICAgICAgLyogbWFrZSBzdXJlIGNvZF9nYWluX2ZyYWMgPCBmcmFjX2djb2RlMCAgZm9yIGRpdl9zICovCisgICAgICAgIGlmIChjb2RfZ2Fpbl9mcmFjID49IGZyYWNfZ2NvZGUwKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RfZ2Fpbl9mcmFjID4+PSAxOworICAgICAgICAgICAgY29kX2dhaW5fZXhwICs9IDE7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgIHByZWRFcnJGYWN0CisgICAgICAgICAgICAgPSBnY3UgLyBnY29kZTAKKyAgICAgICAgICAgICA9IGNvZF9nYWluX2ZyYWMvZnJhY19nY29kZTAgKiAyXihjb2RfZ2Fpbl9leHAtKGV4cF9nY29kZTAtMTQpKQorICAgICAgICAgICAgID0gZGl2X3MgKGNfZ19mLCBmcmFjX2djb2RlMCkqMl4tMTUgKiAyXihjX2dfZS1leHBfZ2NvZGUwKzE0KQorICAgICAgICAgICAgID0gZGl2X3MgKiAyXihjb2RfZ2Fpbl9leHAtZXhwX2djb2RlMCAtIDEpCisgICAgICAgICovCisgICAgICAgIGZyYWMgPSBkaXZfcyhjb2RfZ2Fpbl9mcmFjLCBmcmFjX2djb2RlMCk7CisgICAgICAgIHRtcCA9IGNvZF9nYWluX2V4cCAtIGV4cF9nY29kZTA7CisgICAgICAgIHRtcCAtPSAxOworCisgICAgICAgIExvZzIoKFdvcmQzMikgZnJhYywgJmV4cCwgJmZyYWMsIHBPdmVyZmxvdyk7CisgICAgICAgIGV4cCArPSB0bXA7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIHByZWRpY3Rpb24gZXJyb3IgKGxvZzIsIFExMCkgKi8KKyAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBzaHJfcihmcmFjLCA1LCBwT3ZlcmZsb3cpOworICAgICAgICB0bXAgPSBleHAgPDwgMTA7CisgICAgICAgIHF1YV9lbmVyX01SMTIyICs9IHRtcDsKKworICAgICAgICBpZiAocXVhX2VuZXJfTVIxMjIgPiBNQVhfUVVBX0VORVJfTVIxMjIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHF1YV9lbmVyID0gTUFYX1FVQV9FTkVSOworICAgICAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBNQVhfUVVBX0VORVJfTVIxMjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAoMjAqbG9nMTAsIFExMCkgKi8KKyAgICAgICAgICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjAsIHBPdmVyZmxvdyk7CisgICAgICAgICAgICAvKiAyNDY2MCBRMTIgfj0gNi4wMjA2ID0gMjAqbG9nMTAoMikgKi8KKyAgICAgICAgICAgIExfdG1wID0gIExfc2hsKExfdG1wLCAxMywgcE92ZXJmbG93KTsKKyAgICAgICAgICAgIHF1YV9lbmVyID0gcHZfcm91bmQoTF90bXAsIHBPdmVyZmxvdyk7CisKKyAgICAgICAgICAgIC8qIFExMiAqIFEwID0gUTEzIC0+IFEyNiAtPiBRMTAgICAgICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1cGRhdGUgTUEgcHJlZGljdG9yIG1lbW9yeSAqLworICAgIGdjX3ByZWRfdXBkYXRlKHByZWRfc3QsIHF1YV9lbmVyX01SMTIyLCBxdWFfZW5lcik7CisKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIE5BTUU6IE1SNDc1X2dhaW5fcXVhbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKKworIElucHV0czoKKyAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKKyAgICBzZjBfZXhwX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCkgKFdvcmQxNikKKyAgICBmMF9mcmFjX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChmcmFjdGlvbikgKFdvcmQxNikKKyAgICBzZjBfZXhwX2NvZWZmID0gZW5lcmd5IGNvZWZmLiAoZXhwb25lbnQgcGFydCkgKFdvcmQxNikKKyAgICBzZjBfZnJhY19jb2VmZiA9IGVuZXJneSBjb2VmZi4gKChmcmFjdGlvbiBwYXJ0KSAoV29yZDE2KQorICAgIHNmMF9leHBfdGFyZ2V0X2VuID0gZXhwb25lbnQgb2YgdGFyZ2V0IGVuZXJneSAoV29yZDE2KQorICAgIHNmMF9mcmFjX3RhcmdldF9lbiA9IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3kgKFdvcmQxNikKKyAgICBzZjFfY29kZV9ub3NoYXJwID0gaW5ub3ZhdGl2ZSBjb2RlYm9vayB2ZWN0b3IgIChXb3JkMTYpCisgICAgc2YxX2V4cF9nY29kZTAgPSBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpIChXb3JkMTYpCisgICAgc2YxX2ZyYWNfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSAoV29yZDE2KQorICAgIHNmMV9leHBfY29lZmYgPSBlbmVyZ3kgY29lZmYuIChleHBvbmVudCBwYXJ0KSAoV29yZDE2KQorICAgIHNmMV9mcmFjX2NvZWZmID0gZW5lcmd5IGNvZWZmLiAoZnJhY3Rpb24gcGFydCkgKFdvcmQxNikKKyAgICBzZjFfZXhwX3RhcmdldF9lbiA9IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3kgKFdvcmQxNikKKyAgICBzZjFfZnJhY190YXJnZXRfZW4gPSBmcmFjdGlvbiBvZiB0YXJnZXQgZW5lcmd5IChXb3JkMTYpCisgICAgZ3BfbGltaXQgPSBwaXRjaCBnYWluIGxpbWl0IChXb3JkMTYpCisgICAgc2YwX2dhaW5fcGl0ID0gcG9pbnRlciB0byBQaXRjaCBnYWluIChXb3JkMTYpCisgICAgc2YwX2dhaW5fY29kID0gcG9pbnRlciB0byBDb2RlIGdhaW4gKFdvcmQxNikKKyAgICBzZjFfZ2Fpbl9waXQgPSBwb2ludGVyIHRvIFBpdGNoIGdhaW4gKFdvcmQxNikKKyAgICBzZjFfZ2Fpbl9jb2QgPSBwb2ludGVyIHRvIENvZGUgZ2FpbiAoV29yZDE2KQorCisgT3V0cHV0czoKKyAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKKyAgICBzZjBfZ2Fpbl9waXQgcG9pbnRzIHRvIFBpdGNoIGdhaW4KKyAgICBzZjBfZ2Fpbl9jb2QgcG9pbnRzIHRvIENvZGUgZ2FpbgorICAgIHNmMV9nYWluX3BpdCBwb2ludHMgdG8gUGl0Y2ggZ2FpbgorICAgIHNmMV9nYWluX2NvZCBwb2ludHMgdG8gQ29kZSBnYWluCisKKyBSZXR1cm5zOgorICAgIGluZGV4ID0gaW5kZXggb2YgcXVhbnRpemF0aW9uCisKKyBHbG9iYWwgVmFyaWFibGVzIFVzZWQ6CisgICAgTm9uZS4KKworIExvY2FsIFZhcmlhYmxlcyBOZWVkZWQ6CisgICAgTm9uZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gREVTQ1JJUFRJT04KKworIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHF1YW50aXphdGlvbiBvZiBwaXRjaCBhbmQgY29kZWJvb2sgZ2FpbnMgZm9yIHR3bworIHN1YmZyYW1lcyB1c2luZyB0aGUgcHJlZGljdGVkIGNvZGVib29rIGdhaW4uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFUVVJUkVNRU5UUworCisgTm9uZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVGRVJFTkNFUworCisgcWdhaW40NzUuYywgVU1UUyBHU00gQU1SIHNwZWVjaCBjb2RlYywgUjk5IC0gVmVyc2lvbiAzLjIuMCwgTWFyY2ggMiwgMjAwMQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQU0VVRE8tQ09ERQorCitXb3JkMTYKK01SNDc1X2dhaW5fcXVhbnQoICAgICAgICAgICAgICAvLyBvICA6IGluZGV4IG9mIHF1YW50aXphdGlvbi4KKyAgICBnY19wcmVkU3RhdGUgKnByZWRfc3QsICAgICAvLyBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBmcm9tIHN1YmZyYW1lIDAgKG9yIDIpCisgICAgV29yZDE2IHNmMF9leHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwCisgICAgV29yZDE2IHNmMF9mcmFjX2djb2RlMCwgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZnJhY3Rpb24pLCAgICAgIFExNQorICAgIFdvcmQxNiBzZjBfZXhwX2NvZWZmW10sICAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGV4cG9uZW50IHBhcnQsICBRMAorICAgIFdvcmQxNiBzZjBfZnJhY19jb2VmZltdLCAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGZyYWN0aW9uIHBhcnQsICBRMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIChmcmFjX2NvZWZmIGFuZCBleHBfY29lZmYgY29tcHV0ZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkKKyAgICBXb3JkMTYgc2YwX2V4cF90YXJnZXRfZW4sICAvLyBpICA6IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTAKKyAgICBXb3JkMTYgc2YwX2ZyYWNfdGFyZ2V0X2VuLCAvLyBpICA6IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTE1CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGZyb20gc3ViZnJhbWUgMSAob3IgMykKKyAgICBXb3JkMTYgc2YxX2NvZGVfbm9zaGFycFtdLCAvLyBpICA6IGlubm92YXRpdmUgY29kZWJvb2sgdmVjdG9yIChMX1NVQkZSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgKHdoaXRob3V0IHBpdGNoIHNoYXJwZW5pbmcpCisgICAgV29yZDE2IHNmMV9leHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwCisgICAgV29yZDE2IHNmMV9mcmFjX2djb2RlMCwgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZnJhY3Rpb24pLCAgICAgIFExNQorICAgIFdvcmQxNiBzZjFfZXhwX2NvZWZmW10sICAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGV4cG9uZW50IHBhcnQsICBRMAorICAgIFdvcmQxNiBzZjFfZnJhY19jb2VmZltdLCAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGZyYWN0aW9uIHBhcnQsICBRMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIChmcmFjX2NvZWZmIGFuZCBleHBfY29lZmYgY29tcHV0ZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkKKyAgICBXb3JkMTYgc2YxX2V4cF90YXJnZXRfZW4sICAvLyBpICA6IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTAKKyAgICBXb3JkMTYgc2YxX2ZyYWNfdGFyZ2V0X2VuLCAvLyBpICA6IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTE1CisKKyAgICBXb3JkMTYgZ3BfbGltaXQsICAgICAgICAgICAvLyBpICA6IHBpdGNoIGdhaW4gbGltaXQKKworICAgIFdvcmQxNiAqc2YwX2dhaW5fcGl0LCAgICAgIC8vIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQKKyAgICBXb3JkMTYgKnNmMF9nYWluX2NvZCwgICAgICAvLyBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEKKworICAgIFdvcmQxNiAqc2YxX2dhaW5fcGl0LCAgICAgIC8vIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQKKyAgICBXb3JkMTYgKnNmMV9nYWluX2NvZCAgICAgICAvLyBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEKKykKK3sKKyAgICBjb25zdCBXb3JkMTYgKnA7CisgICAgV29yZDE2IGksIGluZGV4ID0gMDsKKyAgICBXb3JkMTYgdG1wOworICAgIFdvcmQxNiBleHA7CisgICAgV29yZDE2IHNmMF9nY29kZTAsIHNmMV9nY29kZTA7CisgICAgV29yZDE2IGdfcGl0Y2gsIGcyX3BpdGNoLCBnX2NvZGUsIGcyX2NvZGUsIGdfcGl0X2NvZDsKKyAgICBXb3JkMTYgY29lZmZbMTBdLCBjb2VmZl9sb1sxMF0sIGV4cF9tYXhbMTBdOyAgLy8gMC4uNDogc2YwOyA1Li45OiBzZjEKKyAgICBXb3JkMzIgTF90bXAsIGRpc3RfbWluOworCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBwcmVkaWN0ZWQgY29kZWJvb2sgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIGdjMCAgICAgPSAyXmV4cF9nY29kZTAgKyAyXmZyYWNfZ2NvZGUwICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgZ2NvZGUwIChRMTQpID0gMl4xNCoyXmZyYWNfZ2NvZGUwID0gZ2MwICogMl4oMTQtZXhwX2djb2RlMCkgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCisgICAgc2YwX2djb2RlMCA9IGV4dHJhY3RfbChQb3cyKDE0LCBzZjBfZnJhY19nY29kZTApKTsKKyAgICBzZjFfZ2NvZGUwID0gZXh0cmFjdF9sKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCkpOworCisgICAgICogRm9yIGVhY2ggc3ViZnJhbWUsIHRoZSBlcnJvciBlbmVyZ3kgKHN1bSkgdG8gYmUgbWluaW1pemVkIGNvbnNpc3RzCisgICAgICogb2YgZml2ZSB0ZXJtcywgdFswLi40XS4KKyAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbMF0gPSAgICBncF4yICAqIDx5MSB5MT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzFdID0gLTIqZ3AgICAgKiA8eG4geTE+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgdFsyXSA9ICAgIGdjXjIgICogPHkyIHkyPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbM10gPSAtMipnYyAgICAqIDx4biB5Mj4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzRdID0gIDIqZ3AqZ2MgKiA8eTEgeTI+CisgICAgICoKKworICAgIC8vIHNmIDAKKyAgICAvLyBkZXRlcm1pbmUgdGhlIHNjYWxpbmcgZXhwb25lbnQgZm9yIGdfY29kZTogZWMgPSBlYzAgLSAxMQorICAgIGV4cCA9IHN1YihzZjBfZXhwX2djb2RlMCwgMTEpOworCisgICAgLy8gY2FsY3VsYXRlIGV4cF9tYXhbaV0gPSBzW2ldLTEKKyAgICBleHBfbWF4WzBdID0gc3ViKHNmMF9leHBfY29lZmZbMF0sIDEzKTsKKyAgICBleHBfbWF4WzFdID0gc3ViKHNmMF9leHBfY29lZmZbMV0sIDE0KTsKKyAgICBleHBfbWF4WzJdID0gYWRkKHNmMF9leHBfY29lZmZbMl0sIGFkZCgxNSwgc2hsKGV4cCwgMSkpKTsKKyAgICBleHBfbWF4WzNdID0gYWRkKHNmMF9leHBfY29lZmZbM10sIGV4cCk7CisgICAgZXhwX21heFs0XSA9IGFkZChzZjBfZXhwX2NvZWZmWzRdLCBhZGQoMSwgZXhwKSk7CisKKyAgICAvLyBzZiAxCisgICAgLy8gZGV0ZXJtaW5lIHRoZSBzY2FsaW5nIGV4cG9uZW50IGZvciBnX2NvZGU6IGVjID0gZWMwIC0gMTEKKyAgICBleHAgPSBzdWIoc2YxX2V4cF9nY29kZTAsIDExKTsKKworICAgIC8vIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xCisgICAgZXhwX21heFs1XSA9IHN1YihzZjFfZXhwX2NvZWZmWzBdLCAxMyk7CisgICAgZXhwX21heFs2XSA9IHN1YihzZjFfZXhwX2NvZWZmWzFdLCAxNCk7CisgICAgZXhwX21heFs3XSA9IGFkZChzZjFfZXhwX2NvZWZmWzJdLCBhZGQoMTUsIHNobChleHAsIDEpKSk7CisgICAgZXhwX21heFs4XSA9IGFkZChzZjFfZXhwX2NvZWZmWzNdLCBleHApOworICAgIGV4cF9tYXhbOV0gPSBhZGQoc2YxX2V4cF9jb2VmZls0XSwgYWRkKDEsIGV4cCkpOworCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBHYWluIHNlYXJjaCBlcXVhbGlzYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIFRoZSBNU0UgZm9yIHRoZSB0d28gc3ViZnJhbWVzIGlzIHdlaWdodGVkIGRpZmZlcmVudGx5IGlmIHRoZXJlICAgKgorICAgICAqICBpcyBhIGJpZyBkaWZmZXJlbmNlIGluIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldCBlbmVyZ2llcyAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisKKyAgICAvLyBtYWtlIHRoZSB0YXJnZXQgZW5lcmd5IGV4cG9uZW50cyB0aGUgc2FtZSBieSBkZS1ub3JtYWxpemluZyB0aGUKKyAgICAvLyBmcmFjdGlvbiBvZiB0aGUgc21hbGxlciBvbmUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGJlIGFibGUgdG8gY29tcGFyZQorICAgIC8vIHRoZW0KKworICAgIGV4cCA9IHNmMF9leHBfdGFyZ2V0X2VuIC0gc2YxX2V4cF90YXJnZXRfZW47CisgICAgaWYgKGV4cCA+IDApCisgICAgeworICAgICAgICBzZjFfZnJhY190YXJnZXRfZW4gPSBzaHIgKHNmMV9mcmFjX3RhcmdldF9lbiwgZXhwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2YwX2ZyYWNfdGFyZ2V0X2VuID0gc2hsIChzZjBfZnJhY190YXJnZXRfZW4sIGV4cCk7CisgICAgfQorCisgICAgLy8gYXNzdW1lIG5vIGNoYW5nZSBvZiBleHBvbmVudHMKKyAgICBleHAgPSAwOworCisgICAgLy8gdGVzdCBmb3IgdGFyZ2V0IGVuZXJneSBkaWZmZXJlbmNlOyBzZXQgZXhwIHRvICsxIG9yIC0xIHRvIHNjYWxlCisgICAgLy8gdXAvZG93biBjb2VmZmljaWVudHMgZm9yIHNmIDEKKworICAgIHRtcCA9IHNocl9yIChzZjFfZnJhY190YXJnZXRfZW4sIDEpOyAgIC8vIHRtcCA9IGNlaWwoMC41KmVuKHNmMSkpCisgICAgaWYgKHN1YiAodG1wLCBzZjBfZnJhY190YXJnZXRfZW4pID4gMCkgLy8gdG1wID4gZW4oc2YwKT8KKyAgICB7CisgICAgICAgIC8vIHRhcmdldF9lbmVyZ3koc2YxKSA+IDIqdGFyZ2V0X2VuZXJneShzZjApCisgICAgICAgIC8vICAgLT4gc2NhbGUgdXAgTVNFKHNmMCkgYnkgMiBieSBhZGRpbmcgMSB0byBleHBvbmVudHMgMC4uNAorICAgICAgICBleHAgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSBzaHIgKGFkZCAoc2YwX2ZyYWNfdGFyZ2V0X2VuLCAzKSwgMik7IC8vIHRtcD1jZWlsKDAuMjUqZW4oc2YwKSkKKyAgICAgICAgaWYgKHN1YiAodG1wLCBzZjFfZnJhY190YXJnZXRfZW4pID4gMCkgICAgICAvLyB0bXAgPiBlbihzZjEpPworICAgICAgICB7CisgICAgICAgICAgICAvLyB0YXJnZXRfZW5lcmd5KHNmMSkgPCAwLjI1KnRhcmdldF9lbmVyZ3koc2YwKQorICAgICAgICAgICAgLy8gICAtPiBzY2FsZSBkb3duIE1TRShzZjApIGJ5IDAuNSBieSBzdWJ0cmFjdGluZyAxIGZyb20KKyAgICAgICAgICAgIC8vICAgICAgY29lZmZpY2llbnRzIDAuLjQKKyAgICAgICAgICAgIGV4cCA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICAgIGV4cF9tYXhbaV0gPSBhZGQgKGV4cF9tYXhbaV0sIGV4cCk7CisgICAgfQorCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBGaW5kIG1heGltdW0gZXhwb25lbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICBGb3IgdGhlIHN1bSBvcGVyYXRpb24sIGFsbCB0ZXJtcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2NhbGluZzsgICAgICoKKyAgICAgKiAgdGhhdCBzY2FsaW5nIHNob3VsZCBiZSBsb3cgZW5vdWdoIHRvIHByZXZlbnQgb3ZlcmZsb3cuIFRoZXJlLSAgICAqCisgICAgICogIGZvcmUsIHRoZSBtYXhpbXVtIHNjYWxlIGlzIGRldGVybWluZWQgYW5kIGFsbCBjb2VmZmljaWVudHMgYXJlICAgKgorICAgICAqICByZS1zY2FsZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgZXhwID0gbWF4KGV4cF9tYXhbaV0pICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgIGUgPSBleHBfbWF4W2ldLWV4cDsgICAgICAgICBlIDw9IDAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICBjW2ldID0gY1tpXSoyXmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCisgICAgZXhwID0gZXhwX21heFswXTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzdWIoZXhwX21heFtpXSwgZXhwKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4cCA9IGV4cF9tYXhbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgZXhwID0gYWRkKGV4cCwgMSk7ICAgICAgLy8gVG8gYXZvaWQgb3ZlcmZsb3cKKworICAgIHAgPSAmc2YwX2ZyYWNfY29lZmZbMF07CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICB0bXAgPSBzdWIoZXhwLCBleHBfbWF4W2ldKTsKKyAgICAgICAgTF90bXAgPSBMX2RlcG9zaXRfaCgqcCsrKTsKKyAgICAgICAgTF90bXAgPSBMX3NocihMX3RtcCwgdG1wKTsKKyAgICAgICAgTF9FeHRyYWN0KExfdG1wLCAmY29lZmZbaV0sICZjb2VmZl9sb1tpXSk7CisgICAgfQorICAgIHAgPSAmc2YxX2ZyYWNfY29lZmZbMF07CisgICAgZm9yICg7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgIHRtcCA9IHN1YihleHAsIGV4cF9tYXhbaV0pOworICAgICAgICBMX3RtcCA9IExfZGVwb3NpdF9oKCpwKyspOworICAgICAgICBMX3RtcCA9IExfc2hyKExfdG1wLCB0bXApOworICAgICAgICBMX0V4dHJhY3QoTF90bXAsICZjb2VmZltpXSwgJmNvZWZmX2xvW2ldKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIENvZGVib29rIHNlYXJjaDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIEZvciBlYWNoIHBhaXIgKGdfcGl0Y2gsIGdfZmFjKSBpbiB0aGUgdGFibGUgY2FsY3VsYXRlIHRoZSAgICAgICAgKgorICAgICAqICB0ZXJtcyB0WzAuLjRdIGFuZCBzdW0gdGhlbSB1cDsgdGhlIHJlc3VsdCBpcyB0aGUgbWVhbiBzcXVhcmVkICAgICoKKyAgICAgKiAgZXJyb3IgZm9yIHRoZSBxdWFudGl6ZWQgZ2FpbnMgZnJvbSB0aGUgdGFibGUuIFRoZSBpbmRleCBmb3IgdGhlICAqCisgICAgICogIG1pbmltdW0gTVNFIGlzIHN0b3JlZCBhbmQgZmluYWxseSB1c2VkIHRvIHJldHJpZXZlIHRoZSBxdWFudGl6ZWQgKgorICAgICAqICBnYWlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIHN0YXJ0IHdpdGggImluZmluaXRlIiBNU0UKKyAgICBkaXN0X21pbiA9IE1BWF8zMjsKKworICAgIHAgPSAmdGFibGVfZ2Fpbl9NUjQ3NVswXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNUjQ3NV9WUV9TSVpFOyBpKyspCisgICAgeworICAgICAgICAvLyBzdWJmcmFtZSAwIChhbmQgMikgY2FsY3VsYXRpb25zCisgICAgICAgIGdfcGl0Y2ggPSAqcCsrOworICAgICAgICBnX2NvZGUgPSAqcCsrOworCisgICAgICAgIGdfY29kZSA9IG11bHQoZ19jb2RlLCBzZjBfZ2NvZGUwKTsKKyAgICAgICAgZzJfcGl0Y2ggPSBtdWx0KGdfcGl0Y2gsIGdfcGl0Y2gpOworICAgICAgICBnMl9jb2RlID0gbXVsdChnX2NvZGUsIGdfY29kZSk7CisgICAgICAgIGdfcGl0X2NvZCA9IG11bHQoZ19jb2RlLCBnX3BpdGNoKTsKKworICAgICAgICBMX3RtcCA9IE1weV8zMl8xNiggICAgICAgY29lZmZbMF0sIGNvZWZmX2xvWzBdLCBnMl9waXRjaCk7CisgICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZlsxXSwgY29lZmZfbG9bMV0sIGdfcGl0Y2gpOworICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbMl0sIGNvZWZmX2xvWzJdLCBnMl9jb2RlKTsKKyAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzNdLCBjb2VmZl9sb1szXSwgZ19jb2RlKTsKKyAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzRdLCBjb2VmZl9sb1s0XSwgZ19waXRfY29kKTsKKworICAgICAgICB0bXAgPSBzdWIgKGdfcGl0Y2gsIGdwX2xpbWl0KTsKKworICAgICAgICAvLyBzdWJmcmFtZSAxIChhbmQgMykgY2FsY3VsYXRpb25zCisgICAgICAgIGdfcGl0Y2ggPSAqcCsrOworICAgICAgICBnX2NvZGUgPSAqcCsrOworCisgICAgICAgIGlmICh0bXAgPD0gMCAmJiBzdWIoZ19waXRjaCwgZ3BfbGltaXQpIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGdfY29kZSA9IG11bHQoZ19jb2RlLCBzZjFfZ2NvZGUwKTsKKyAgICAgICAgICAgIGcyX3BpdGNoID0gbXVsdChnX3BpdGNoLCBnX3BpdGNoKTsKKyAgICAgICAgICAgIGcyX2NvZGUgPSBtdWx0KGdfY29kZSwgZ19jb2RlKTsKKyAgICAgICAgICAgIGdfcGl0X2NvZCA9IG11bHQoZ19jb2RlLCBnX3BpdGNoKTsKKworICAgICAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzVdLCBjb2VmZl9sb1s1XSwgZzJfcGl0Y2gpOworICAgICAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzZdLCBjb2VmZl9sb1s2XSwgZ19waXRjaCk7CisgICAgICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbN10sIGNvZWZmX2xvWzddLCBnMl9jb2RlKTsKKyAgICAgICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZls4XSwgY29lZmZfbG9bOF0sIGdfY29kZSk7CisgICAgICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbOV0sIGNvZWZmX2xvWzldLCBnX3BpdF9jb2QpOworCisgICAgICAgICAgICAvLyBzdG9yZSB0YWJsZSBpbmRleCBpZiBNU0UgZm9yIHRoaXMgaW5kZXggaXMgbG93ZXIKKyAgICAgICAgICAgICAgIHRoYW4gdGhlIG1pbmltdW0gTVNFIHNlZW4gc28gZmFyCisgICAgICAgICAgICBpZiAoTF9zdWIoTF90bXAsIGRpc3RfbWluKSA8IChXb3JkMzIpIDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlzdF9taW4gPSBMX3RtcDsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAgcmVhZCBxdWFudGl6ZWQgZ2FpbnMgYW5kIHVwZGF0ZSBNQSBwcmVkaWN0b3IgbWVtb3JpZXMgICAgICAgICAgICoKKyAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKworICAgIC8vIGZvciBzdWJmcmFtZSAwLCB0aGUgcHJlLWNhbGN1bGF0ZWQgZ2NvZGUwL2V4cF9nY29kZTAgYXJlIHRoZSBzYW1lCisgICAgLy8gYXMgdGhvc2UgY2FsY3VsYXRlZCBmcm9tIHRoZSAicmVhbCIgcHJlZGljdG9yIHVzaW5nIHF1YW50aXplZCBnYWlucworICAgIHRtcCA9IHNobChpbmRleCwgMik7CisgICAgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cyhwcmVkX3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlX2dhaW5fTVI0NzVbdG1wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nY29kZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZXhwX2djb2RlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX3BpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX2NvZCk7CisKKyAgICAvLyBjYWxjdWxhdGUgbmV3IHByZWRpY3RlZCBnYWluIGZvciBzdWJmcmFtZSAxICh0aGlzIHRpbWUgdXNpbmcKKyAgICAvLyB0aGUgcmVhbCwgcXVhbnRpemVkIGdhaW5zKQorICAgIGdjX3ByZWQocHJlZF9zdCwgTVI0NzUsIHNmMV9jb2RlX25vc2hhcnAsCisgICAgICAgICAgICAmc2YxX2V4cF9nY29kZTAsICZzZjFfZnJhY19nY29kZTAsCisgICAgICAgICAgICAmc2YwX2V4cF9nY29kZTAsICZzZjBfZ2NvZGUwKTsgLy8gbGFzdCB0d28gYXJncyBhcmUgdW51c2VkCisgICAgc2YxX2djb2RlMCA9IGV4dHJhY3RfbChQb3cyKDE0LCBzZjFfZnJhY19nY29kZTApKTsKKworICAgIHRtcCA9IGFkZCAodG1wLCAyKTsKKyAgICBNUjQ3NV9xdWFudF9zdG9yZV9yZXN1bHRzKHByZWRfc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFibGVfZ2Fpbl9NUjQ3NVt0bXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YxX2djb2RlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMV9leHBfZ2NvZGUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YxX2dhaW5fcGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YxX2dhaW5fY29kKTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVTT1VSQ0VTIFVTRUQgW29wdGlvbmFsXQorCisgV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCisgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgorCisgSEVBUCBNRU1PUlkgVVNFRDogeCBieXRlcworCisgU1RBQ0sgTUVNT1JZIFVTRUQ6IHggYnl0ZXMKKworIENMT0NLIENZQ0xFUzogKGN5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uKSArICh2YXJpYWJsZQorICAgICAgICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKKyAgICAgICAgICAgICAgICBjYWxsZWQpCisgICAgIHdoZXJlOiAoY3ljbGUgY291bnQgdmFyaWFibGUpID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ0FVVElPTiBbb3B0aW9uYWxdCisgW1N0YXRlIGFueSBzcGVjaWFsIG5vdGVzLCBjb25zdHJhaW50cyBvciBjYXV0aW9ucyBmb3IgdXNlcnMgb2YgdGhpcyBmdW5jdGlvbl0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitXb3JkMTYgTVI0NzVfZ2Fpbl9xdWFudCggICAgICAgLyogbyAgOiBpbmRleCBvZiBxdWFudGl6YXRpb24uICAgICAgICAgICAgICAgICAqLworICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgICAgIC8qIGkvbzogZ2FpbiBwcmVkaWN0b3Igc3RhdGUgc3RydWN0ICAgICAgICAgICAgKi8KKworICAgIC8qIGRhdGEgZnJvbSBzdWJmcmFtZSAwIChvciAyKSAqLworICAgIFdvcmQxNiBzZjBfZXhwX2djb2RlMCwgICAgIC8qIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGV4cG9uZW50KSwgICAgICBRMCAgKi8KKyAgICBXb3JkMTYgc2YwX2ZyYWNfZ2NvZGUwLCAgICAvKiBpICA6IHByZWRpY3RlZCBDQiBnYWluIChmcmFjdGlvbiksICAgICAgUTE1ICovCisgICAgV29yZDE2IHNmMF9leHBfY29lZmZbXSwgICAgLyogaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZXhwb25lbnQgcGFydCwgIFEwICAqLworICAgIFdvcmQxNiBzZjBfZnJhY19jb2VmZltdLCAgIC8qIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGZyYWN0aW9uIHBhcnQsICBRMTUgKi8KKyAgICAvKiAgICAgIChmcmFjX2NvZWZmIGFuZCBleHBfY29lZmYgY29tcHV0ZWQgaW4gICovCisgICAgLyogICAgICAgY2FsY19maWx0X2VuZXJnaWVzKCkpICAgICAgICAgICAgICAgICAqLworICAgIFdvcmQxNiBzZjBfZXhwX3RhcmdldF9lbiwgIC8qIGkgIDogZXhwb25lbnQgb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMCAgKi8KKyAgICBXb3JkMTYgc2YwX2ZyYWNfdGFyZ2V0X2VuLCAvKiBpICA6IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTE1ICovCisKKyAgICAvKiBkYXRhIGZyb20gc3ViZnJhbWUgMSAob3IgMykgKi8KKyAgICBXb3JkMTYgc2YxX2NvZGVfbm9zaGFycFtdLCAvKiBpICA6IGlubm92YXRpdmUgY29kZWJvb2sgdmVjdG9yIChMX1NVQkZSKSAgICovCisgICAgLyogICAgICAod2hpdGhvdXQgcGl0Y2ggc2hhcnBlbmluZykgICAgICAgICAgICAqLworICAgIFdvcmQxNiBzZjFfZXhwX2djb2RlMCwgICAgIC8qIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGV4cG9uZW50KSwgICAgICBRMCAgKi8KKyAgICBXb3JkMTYgc2YxX2ZyYWNfZ2NvZGUwLCAgICAvKiBpICA6IHByZWRpY3RlZCBDQiBnYWluIChmcmFjdGlvbiksICAgICAgUTE1ICovCisgICAgV29yZDE2IHNmMV9leHBfY29lZmZbXSwgICAgLyogaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZXhwb25lbnQgcGFydCwgIFEwICAqLworICAgIFdvcmQxNiBzZjFfZnJhY19jb2VmZltdLCAgIC8qIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGZyYWN0aW9uIHBhcnQsICBRMTUgKi8KKyAgICAvKiAgICAgIChmcmFjX2NvZWZmIGFuZCBleHBfY29lZmYgY29tcHV0ZWQgaW4gICovCisgICAgLyogICAgICAgY2FsY19maWx0X2VuZXJnaWVzKCkpICAgICAgICAgICAgICAgICAqLworICAgIFdvcmQxNiBzZjFfZXhwX3RhcmdldF9lbiwgIC8qIGkgIDogZXhwb25lbnQgb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMCAgKi8KKyAgICBXb3JkMTYgc2YxX2ZyYWNfdGFyZ2V0X2VuLCAvKiBpICA6IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTE1ICovCisKKyAgICBXb3JkMTYgZ3BfbGltaXQsICAgICAgICAgICAvKiBpICA6IHBpdGNoIGdhaW4gbGltaXQgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBXb3JkMTYgKnNmMF9nYWluX3BpdCwgICAgICAvKiBvICA6IFBpdGNoIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgUTE0ICovCisgICAgV29yZDE2ICpzZjBfZ2Fpbl9jb2QsICAgICAgLyogbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgIFExICAqLworCisgICAgV29yZDE2ICpzZjFfZ2Fpbl9waXQsICAgICAgLyogbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgIFExNCAqLworICAgIFdvcmQxNiAqc2YxX2dhaW5fY29kLCAgICAgIC8qIG8gIDogQ29kZSBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICBRMSAgKi8KKyAgICBGbGFnICAgKnBPdmVyZmxvdyAgICAgICAgICAvKiBvICA6IG92ZXJmbG93IGluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICovCispCit7CisgICAgY29uc3QgV29yZDE2ICpwOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiBpbmRleCA9IDA7CisgICAgV29yZDE2IHRtcDsKKyAgICBXb3JkMTYgZXhwOworICAgIFdvcmQxNiBzZjBfZ2NvZGUwOworICAgIFdvcmQxNiBzZjFfZ2NvZGUwOworICAgIFdvcmQxNiBnX3BpdGNoOworICAgIFdvcmQxNiBnMl9waXRjaDsKKyAgICBXb3JkMTYgZ19jb2RlOworICAgIFdvcmQxNiBnMl9jb2RlOworICAgIFdvcmQxNiBnX3BpdF9jb2Q7CisgICAgV29yZDE2IGNvZWZmWzEwXTsKKyAgICBXb3JkMTYgY29lZmZfbG9bMTBdOworICAgIFdvcmQxNiBleHBfbWF4WzEwXTsgIC8qIDAuLjQ6IHNmMDsgNS4uOTogc2YxICovCisgICAgV29yZDMyIExfdG1wOworICAgIFdvcmQzMiBkaXN0X21pbjsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAgcHJlZGljdGVkIGNvZGVib29rIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICBnYzAgICAgID0gMl5leHBfZ2NvZGUwICsgMl5mcmFjX2djb2RlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIGdjb2RlMCAoUTE0KSA9IDJeMTQqMl5mcmFjX2djb2RlMCA9IGdjMCAqIDJeKDE0LWV4cF9nY29kZTApICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBzZjBfZ2NvZGUwID0gKFdvcmQxNikoUG93MigxNCwgc2YwX2ZyYWNfZ2NvZGUwLCBwT3ZlcmZsb3cpKTsKKyAgICBzZjFfZ2NvZGUwID0gKFdvcmQxNikoUG93MigxNCwgc2YxX2ZyYWNfZ2NvZGUwLCBwT3ZlcmZsb3cpKTsKKworICAgIC8qCisgICAgICogRm9yIGVhY2ggc3ViZnJhbWUsIHRoZSBlcnJvciBlbmVyZ3kgKHN1bSkgdG8gYmUgbWluaW1pemVkIGNvbnNpc3RzCisgICAgICogb2YgZml2ZSB0ZXJtcywgdFswLi40XS4KKyAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbMF0gPSAgICBncF4yICAqIDx5MSB5MT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzFdID0gLTIqZ3AgICAgKiA8eG4geTE+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgdFsyXSA9ICAgIGdjXjIgICogPHkyIHkyPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbM10gPSAtMipnYyAgICAqIDx4biB5Mj4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzRdID0gIDIqZ3AqZ2MgKiA8eTEgeTI+CisgICAgICoKKyAgICAgKi8KKworICAgIC8qIHNmIDAgKi8KKyAgICAvKiBkZXRlcm1pbmUgdGhlIHNjYWxpbmcgZXhwb25lbnQgZm9yIGdfY29kZTogZWMgPSBlYzAgLSAxMSAqLworICAgIGV4cCA9IHNmMF9leHBfZ2NvZGUwIC0gMTE7CisKKyAgICAvKiBjYWxjdWxhdGUgZXhwX21heFtpXSA9IHNbaV0tMSAqLworICAgIGV4cF9tYXhbMF0gPSAoc2YwX2V4cF9jb2VmZlswXSAtIDEzKTsKKyAgICBleHBfbWF4WzFdID0gKHNmMF9leHBfY29lZmZbMV0gLSAxNCk7CisgICAgZXhwX21heFsyXSA9IChzZjBfZXhwX2NvZWZmWzJdICsgKDE1ICsgKGV4cCA8PCAxKSkpOworICAgIGV4cF9tYXhbM10gPSAoc2YwX2V4cF9jb2VmZlszXSArIGV4cCk7CisgICAgZXhwX21heFs0XSA9IChzZjBfZXhwX2NvZWZmWzRdICsgKDEgKyBleHApKTsKKworICAgIC8qIHNmIDEgKi8KKyAgICAvKiBkZXRlcm1pbmUgdGhlIHNjYWxpbmcgZXhwb25lbnQgZm9yIGdfY29kZTogZWMgPSBlYzAgLSAxMSAqLworICAgIGV4cCA9IHNmMV9leHBfZ2NvZGUwIC0gMTE7CisKKyAgICAvKiBjYWxjdWxhdGUgZXhwX21heFtpXSA9IHNbaV0tMSAqLworICAgIGV4cF9tYXhbNV0gPSAoc2YxX2V4cF9jb2VmZlswXSAtIDEzKTsKKyAgICBleHBfbWF4WzZdID0gKHNmMV9leHBfY29lZmZbMV0gLSAxNCk7CisgICAgZXhwX21heFs3XSA9IChzZjFfZXhwX2NvZWZmWzJdICsgKDE1ICsgKGV4cCA8PCAxKSkpOworICAgIGV4cF9tYXhbOF0gPSAoc2YxX2V4cF9jb2VmZlszXSArIGV4cCk7CisgICAgZXhwX21heFs5XSA9IChzZjFfZXhwX2NvZWZmWzRdICsgKDEgKyBleHApKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAgR2FpbiBzZWFyY2ggZXF1YWxpc2F0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICBUaGUgTVNFIGZvciB0aGUgdHdvIHN1YmZyYW1lcyBpcyB3ZWlnaHRlZCBkaWZmZXJlbnRseSBpZiB0aGVyZSAgICoKKyAgICAgKiAgaXMgYSBiaWcgZGlmZmVyZW5jZSBpbiB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXQgZW5lcmdpZXMgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qIG1ha2UgdGhlIHRhcmdldCBlbmVyZ3kgZXhwb25lbnRzIHRoZSBzYW1lIGJ5IGRlLW5vcm1hbGl6aW5nIHRoZQorICAgICAgIGZyYWN0aW9uIG9mIHRoZSBzbWFsbGVyIG9uZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYmUgYWJsZSB0byBjb21wYXJlCisgICAgICAgdGhlbQorICAgICAqLworICAgIGV4cCA9IHNmMF9leHBfdGFyZ2V0X2VuIC0gc2YxX2V4cF90YXJnZXRfZW47CisgICAgaWYgKGV4cCA+IDApCisgICAgeworICAgICAgICBzZjFfZnJhY190YXJnZXRfZW4gPj49IGV4cDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2YwX2ZyYWNfdGFyZ2V0X2VuID4+PSAoLWV4cCk7CisgICAgfQorCisgICAgLyogYXNzdW1lIG5vIGNoYW5nZSBvZiBleHBvbmVudHMgKi8KKyAgICBleHAgPSAwOworCisgICAgLyogdGVzdCBmb3IgdGFyZ2V0IGVuZXJneSBkaWZmZXJlbmNlOyBzZXQgZXhwIHRvICsxIG9yIC0xIHRvIHNjYWxlCisgICAgICogdXAvZG93biBjb2VmZmljaWVudHMgZm9yIHNmIDEKKyAgICAgKi8KKyAgICB0bXAgPSBzaHJfcihzZjFfZnJhY190YXJnZXRfZW4sIDEsIHBPdmVyZmxvdyk7ICAvKiB0bXAgPSBjZWlsKDAuNSplbihzZjEpKSAqLworCisgICAgaWYgKHRtcCA+IHNmMF9mcmFjX3RhcmdldF9lbikgICAgICAgICAgLyogdG1wID4gZW4oc2YwKT8gKi8KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIHRhcmdldF9lbmVyZ3koc2YxKSA+IDIqdGFyZ2V0X2VuZXJneShzZjApCisgICAgICAgICAqICAgLT4gc2NhbGUgdXAgTVNFKHNmMCkgYnkgMiBieSBhZGRpbmcgMSB0byBleHBvbmVudHMgMC4uNAorICAgICAgICAgKi8KKyAgICAgICAgZXhwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gKChzZjBfZnJhY190YXJnZXRfZW4gKyAzKSA+PiAyKTsgLyogdG1wPWNlaWwoMC4yNSplbihzZjApKSAqLworCisgICAgICAgIGlmICh0bXAgPiBzZjFfZnJhY190YXJnZXRfZW4pICAgICAgLyogdG1wID4gZW4oc2YxKT8gKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHRhcmdldF9lbmVyZ3koc2YxKSA8IDAuMjUqdGFyZ2V0X2VuZXJneShzZjApCisgICAgICAgICAgICAgKiAgIC0+IHNjYWxlIGRvd24gTVNFKHNmMCkgYnkgMC41IGJ5IHN1YnRyYWN0aW5nIDEgZnJvbQorICAgICAgICAgICAgICogICAgICBjb2VmZmljaWVudHMgMC4uNAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBleHAgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgeworICAgICAgICBleHBfbWF4W2ldICs9IGV4cDsKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIEZpbmQgbWF4aW11bSBleHBvbmVudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIEZvciB0aGUgc3VtIG9wZXJhdGlvbiwgYWxsIHRlcm1zIG11c3QgaGF2ZSB0aGUgc2FtZSBzY2FsaW5nOyAgICAgKgorICAgICAqICB0aGF0IHNjYWxpbmcgc2hvdWxkIGJlIGxvdyBlbm91Z2ggdG8gcHJldmVudCBvdmVyZmxvdy4gVGhlcmUtICAgICoKKyAgICAgKiAgZm9yZSwgdGhlIG1heGltdW0gc2NhbGUgaXMgZGV0ZXJtaW5lZCBhbmQgYWxsIGNvZWZmaWNpZW50cyBhcmUgICAqCisgICAgICogIHJlLXNjYWxlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICBleHAgPSBtYXgoZXhwX21heFtpXSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgZSA9IGV4cF9tYXhbaV0tZXhwOyAgICAgICAgIGUgPD0gMCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgIGNbaV0gPSBjW2ldKjJeZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgZXhwID0gZXhwX21heFswXTsKKyAgICBmb3IgKGkgPSA5OyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgICAgaWYgKGV4cF9tYXhbaV0gPiBleHApCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4cCA9IGV4cF9tYXhbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgZXhwKys7ICAgICAgLyogVG8gYXZvaWQgb3ZlcmZsb3cgKi8KKworICAgIHAgPSAmc2YwX2ZyYWNfY29lZmZbMF07CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IChleHAgLSBleHBfbWF4W2ldKTsKKyAgICAgICAgTF90bXAgPSAoKFdvcmQzMikoKnArKykgPDwgMTYpOworICAgICAgICBMX3RtcCA9IExfc2hyKExfdG1wLCB0bXAsIHBPdmVyZmxvdyk7CisgICAgICAgIGNvZWZmW2ldID0gKFdvcmQxNikoTF90bXAgPj4gMTYpOworICAgICAgICBjb2VmZl9sb1tpXSA9IChXb3JkMTYpKChMX3RtcCA+PiAxKSAtICgoTF90bXAgPj4gMTYpIDw8IDE1KSk7CisgICAgfQorICAgIHAgPSAmc2YxX2ZyYWNfY29lZmZbMF07CisgICAgZm9yICg7IGkgPCAxMDsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gZXhwIC0gZXhwX21heFtpXTsKKyAgICAgICAgTF90bXAgPSAoKFdvcmQzMikoKnArKykgPDwgMTYpOworICAgICAgICBMX3RtcCA9IExfc2hyKExfdG1wLCB0bXAsIHBPdmVyZmxvdyk7CisgICAgICAgIGNvZWZmW2ldID0gKFdvcmQxNikoTF90bXAgPj4gMTYpOworICAgICAgICBjb2VmZl9sb1tpXSA9IChXb3JkMTYpKChMX3RtcCA+PiAxKSAtICgoTF90bXAgPj4gMTYpIDw8IDE1KSk7CisgICAgfQorCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIENvZGVib29rIHNlYXJjaDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIEZvciBlYWNoIHBhaXIgKGdfcGl0Y2gsIGdfZmFjKSBpbiB0aGUgdGFibGUgY2FsY3VsYXRlIHRoZSAgICAgICAgKgorICAgICAqICB0ZXJtcyB0WzAuLjRdIGFuZCBzdW0gdGhlbSB1cDsgdGhlIHJlc3VsdCBpcyB0aGUgbWVhbiBzcXVhcmVkICAgICoKKyAgICAgKiAgZXJyb3IgZm9yIHRoZSBxdWFudGl6ZWQgZ2FpbnMgZnJvbSB0aGUgdGFibGUuIFRoZSBpbmRleCBmb3IgdGhlICAqCisgICAgICogIG1pbmltdW0gTVNFIGlzIHN0b3JlZCBhbmQgZmluYWxseSB1c2VkIHRvIHJldHJpZXZlIHRoZSBxdWFudGl6ZWQgKgorICAgICAqICBnYWlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyogc3RhcnQgd2l0aCAiaW5maW5pdGUiIE1TRSAqLworICAgIGRpc3RfbWluID0gTUFYXzMyOworCisgICAgcCA9ICZ0YWJsZV9nYWluX01SNDc1WzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IE1SNDc1X1ZRX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIC8qIHN1YmZyYW1lIDAgKGFuZCAyKSBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgZ19waXRjaCA9ICpwKys7CisgICAgICAgIGdfY29kZSA9ICpwKys7CisKKyAgICAgICAgLyogTmVlZCB0byBiZSB0aGVyZSBPS0EgKi8KKyAgICAgICAgZ19jb2RlICAgID0gKFdvcmQxNikoKChXb3JkMzIpIGdfY29kZSAqIHNmMF9nY29kZTApID4+IDE1KTsKKyAgICAgICAgZzJfcGl0Y2ggID0gKFdvcmQxNikoKChXb3JkMzIpIGdfcGl0Y2ggKiBnX3BpdGNoKSA+PiAxNSk7CisgICAgICAgIGcyX2NvZGUgICA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBnX2NvZGUpID4+IDE1KTsKKyAgICAgICAgZ19waXRfY29kID0gKFdvcmQxNikoKChXb3JkMzIpIGdfY29kZSAqIGdfcGl0Y2gpID4+IDE1KTsKKworCisgICAgICAgIExfdG1wID0gTXB5XzMyXzE2KGNvZWZmWzBdLCBjb2VmZl9sb1swXSwgZzJfcGl0Y2gsIHBPdmVyZmxvdykgKworICAgICAgICAgICAgICAgIE1weV8zMl8xNihjb2VmZlsxXSwgY29lZmZfbG9bMV0sIGdfcGl0Y2gsIHBPdmVyZmxvdykgKworICAgICAgICAgICAgICAgIE1weV8zMl8xNihjb2VmZlsyXSwgY29lZmZfbG9bMl0sIGcyX2NvZGUsIHBPdmVyZmxvdykgKworICAgICAgICAgICAgICAgIE1weV8zMl8xNihjb2VmZlszXSwgY29lZmZfbG9bM10sIGdfY29kZSwgcE92ZXJmbG93KSArCisgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzRdLCBjb2VmZl9sb1s0XSwgZ19waXRfY29kLCBwT3ZlcmZsb3cpOworCisgICAgICAgIHRtcCA9IChnX3BpdGNoIC0gZ3BfbGltaXQpOworCisgICAgICAgIC8qIHN1YmZyYW1lIDEgKGFuZCAzKSBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgZ19waXRjaCA9ICpwKys7CisgICAgICAgIGdfY29kZSA9ICpwKys7CisKKyAgICAgICAgaWYgKCh0bXAgPD0gMCkgJiYgKGdfcGl0Y2ggPD0gZ3BfbGltaXQpKQorICAgICAgICB7CisgICAgICAgICAgICBnX2NvZGUgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogc2YxX2djb2RlMCkgPj4gMTUpOworICAgICAgICAgICAgZzJfcGl0Y2ggID0gKFdvcmQxNikoKChXb3JkMzIpIGdfcGl0Y2ggKiBnX3BpdGNoKSA+PiAxNSk7CisgICAgICAgICAgICBnMl9jb2RlICAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogZ19jb2RlKSA+PiAxNSk7CisgICAgICAgICAgICBnX3BpdF9jb2QgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogZ19waXRjaCkgPj4gMTUpOworCisgICAgICAgICAgICBMX3RtcCArPSAoTXB5XzMyXzE2KGNvZWZmWzVdLCBjb2VmZl9sb1s1XSwgZzJfcGl0Y2gsIHBPdmVyZmxvdykgKworICAgICAgICAgICAgICAgICAgICAgIE1weV8zMl8xNihjb2VmZls2XSwgY29lZmZfbG9bNl0sIGdfcGl0Y2gsIHBPdmVyZmxvdykgKworICAgICAgICAgICAgICAgICAgICAgIE1weV8zMl8xNihjb2VmZls3XSwgY29lZmZfbG9bN10sIGcyX2NvZGUsIHBPdmVyZmxvdykgKworICAgICAgICAgICAgICAgICAgICAgIE1weV8zMl8xNihjb2VmZls4XSwgY29lZmZfbG9bOF0sIGdfY29kZSwgcE92ZXJmbG93KSArCisgICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzldLCBjb2VmZl9sb1s5XSwgZ19waXRfY29kLCBwT3ZlcmZsb3cpKTsKKworICAgICAgICAgICAgLyogc3RvcmUgdGFibGUgaW5kZXggaWYgTVNFIGZvciB0aGlzIGluZGV4IGlzIGxvd2VyCisgICAgICAgICAgICAgICB0aGFuIHRoZSBtaW5pbXVtIE1TRSBzZWVuIHNvIGZhciAqLworICAgICAgICAgICAgaWYgKExfdG1wIDwgZGlzdF9taW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlzdF9taW4gPSBMX3RtcDsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAgcmVhZCBxdWFudGl6ZWQgZ2FpbnMgYW5kIHVwZGF0ZSBNQSBwcmVkaWN0b3IgbWVtb3JpZXMgICAgICAgICAgICoKKyAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKiBmb3Igc3ViZnJhbWUgMCwgdGhlIHByZS1jYWxjdWxhdGVkIGdjb2RlMC9leHBfZ2NvZGUwIGFyZSB0aGUgc2FtZQorICAgICAgIGFzIHRob3NlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgInJlYWwiIHByZWRpY3RvciB1c2luZyBxdWFudGl6ZWQgZ2FpbnMgKi8KKyAgICB0bXAgPSBpbmRleCA8PCAyOworICAgIE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMocHJlZF9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZV9nYWluX01SNDc1W3RtcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZ2NvZGUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YwX2V4cF9nY29kZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZ2Fpbl9waXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZ2Fpbl9jb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3cpOworCisgICAgLyogY2FsY3VsYXRlIG5ldyBwcmVkaWN0ZWQgZ2FpbiBmb3Igc3ViZnJhbWUgMSAodGhpcyB0aW1lIHVzaW5nCisgICAgICAgdGhlIHJlYWwsIHF1YW50aXplZCBnYWlucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZ2NfcHJlZChwcmVkX3N0LCBNUjQ3NSwgc2YxX2NvZGVfbm9zaGFycCwKKyAgICAgICAgICAgICZzZjFfZXhwX2djb2RlMCwgJnNmMV9mcmFjX2djb2RlMCwKKyAgICAgICAgICAgICZzZjBfZXhwX2djb2RlMCwgJnNmMF9nY29kZTAsIC8qIHVudXNlZCBhcmdzICovCisgICAgICAgICAgICBwT3ZlcmZsb3cpOworCisgICAgc2YxX2djb2RlMCA9IChXb3JkMTYpKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCwgcE92ZXJmbG93KSk7CisKKyAgICB0bXAgKz0gMjsKKyAgICBNUjQ3NV9xdWFudF9zdG9yZV9yZXN1bHRzKAorICAgICAgICBwcmVkX3N0LAorICAgICAgICAmdGFibGVfZ2Fpbl9NUjQ3NVt0bXBdLAorICAgICAgICBzZjFfZ2NvZGUwLAorICAgICAgICBzZjFfZXhwX2djb2RlMCwKKyAgICAgICAgc2YxX2dhaW5fcGl0LAorICAgICAgICBzZjFfZ2Fpbl9jb2QsCisgICAgICAgIHBPdmVyZmxvdyk7CisKKyAgICByZXR1cm4oaW5kZXgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNDc1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNDc1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNDc1LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW43OTUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2Fpbjc5NS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2Fpbjc5NS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2Fpbjc5NS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2Fpbjc5NS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xdWFfZ2Fpbi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xdWFfZ2Fpbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3F1YV9nYWluLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcXVhX2dhaW4uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zMTBfOHBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zMTBfOHBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvczEwXzhwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvczEwXzhwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zMTBfOHBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NpZF9zeW5jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2lkX3N5bmMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2lkX3N5bmMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2lkX3N5bmMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2lkX3N5bmMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwX2VuYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwX2VuYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwX2VuYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwX2VuYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwX2VuYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcF9lbmMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHJlcHJvYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwcmVwcm9jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwcmVwcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwcmVwcm9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwcmVwcm9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BzdHByb2MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHN0cHJvYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHN0cHJvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHN0cHJvYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHN0cHJvYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Rvbl9zdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvdG9uX3N0YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvdG9uX3N0YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvdG9uX3N0YWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvdG9uX3N0YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0Ftcm5iRW5jVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNUZXN0RW52aXJvbm1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0Ftcm5iRW5jVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY1Rlc3RFbnZpcm9ubWVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNvZGVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNvZGVyVGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY29kZXJUZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0Ftcm5iRW5jb2RlclRlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMWI1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFtcm5iRW5jb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQW1ybmJFbmNvZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvYW1ybmJfZW5jX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvYW1ybmJfZW5jX3Rlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvYW1ybmJfZW5jX3Rlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlYWE1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworY2NfZnV6eiB7CisgICAgbmFtZTogImFtcm5iX2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFtcm5iX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL2Ftcm5iX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E3Mzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiZ3NtYW1yX2RlYy5oIgorCisvLyBDb25zdGFudHMgZm9yIEFNUi1OQgorY29uc3RleHByIGludDMyX3Qga1NhbXBsZXNQZXJGcmFtZSA9IExfRlJBTUU7Citjb25zdGV4cHIgaW50MzJfdCBrQml0c1BlclNhbXBsZSA9IDE2OworY29uc3RleHByIGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSBrU2FtcGxlc1BlckZyYW1lICoga0JpdHNQZXJTYW1wbGUgLyA4OworY29uc3QgYml0c3RyZWFtX2Zvcm1hdCBrQml0U3RyZWFtRm9ybWF0c1syXSA9IHtNSU1FX0lFVEYsIElGMn07Citjb25zdCBpbnQzMl90IGtMb2NhbFdtZkRlY0J5dGVzUGVyRnJhbWVbMTZdID0gezEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgIDYsICA1LCAgNSwgIDAsICAwLCAgMCwgIDB9OworY29uc3QgaW50MzJfdCBrTG9jYWxJZjJEZWNCeXRlc1BlckZyYW1lWzE2XSA9IHsxMywgMTQsIDE2LCAxOCwgMTksIDIxLCAyNiwgMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDI2LCAzMX07CisKK2NsYXNzIENvZGVjIHsKKyBwdWJsaWM6CisgIENvZGVjKCkgPSBkZWZhdWx0OworICB+Q29kZWMoKSB7IGRlSW5pdERlY29kZXIoKTsgfQorICBpbnQxNl90IGluaXREZWNvZGVyKCk7CisgIHZvaWQgZGVJbml0RGVjb2RlcigpOworICB2b2lkIGRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyBwcml2YXRlOgorICB2b2lkICptQW1ySGFuZGxlID0gbnVsbHB0cjsKK307CisKK2ludDE2X3QgQ29kZWM6OmluaXREZWNvZGVyKCkgeyByZXR1cm4gR1NNSW5pdERlY29kZSgmbUFtckhhbmRsZSwgKFdvcmQ4ICopIkFNUk5CRGVjb2RlciIpOyB9CisKK3ZvaWQgQ29kZWM6OmRlSW5pdERlY29kZXIoKSB7IEdTTURlY29kZUZyYW1lRXhpdCgmbUFtckhhbmRsZSk7IH0KKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHdoaWxlIChzaXplID4gMCkgeworICAgIHVpbnQ4X3QgbW9kZSA9ICpkYXRhOworICAgIGJvb2wgYml0ID0gbW9kZSAmIDB4MDE7CisgICAgYml0c3RyZWFtX2Zvcm1hdCBiaXRzcmVhbUZvcm1hdCA9IGtCaXRTdHJlYW1Gb3JtYXRzW2JpdF07CisgICAgaW50MzJfdCBmcmFtZVNpemUgPSAwOworICAgIC8qIEZpbmQgZnJhbWUgdHlwZSAqLworICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGUgPSBzdGF0aWNfY2FzdDxGcmFtZV9UeXBlXzNHUFA+KChtb2RlID4+IDMpICYgMHgwZik7CisgICAgKytkYXRhOworICAgIC0tc2l6ZTsKKyAgICBpZiAoYml0KSB7CisgICAgICBmcmFtZVNpemUgPSBrTG9jYWxJZjJEZWNCeXRlc1BlckZyYW1lW2ZyYW1lVHlwZV07CisgICAgfSBlbHNlIHsKKyAgICAgIGZyYW1lU2l6ZSA9IGtMb2NhbFdtZkRlY0J5dGVzUGVyRnJhbWVbZnJhbWVUeXBlXTsKKyAgICB9CisgICAgaW50MTZfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdOworICAgIHVpbnQ4X3QgKmlucHV0QnVmID0gbmV3IHVpbnQ4X3RbZnJhbWVTaXplXTsKKyAgICBpZiAoIWlucHV0QnVmKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3QgbWluU2l6ZSA9IHN0ZDo6bWluKChpbnQzMl90KXNpemUsIGZyYW1lU2l6ZSk7CisgICAgbWVtY3B5KGlucHV0QnVmLCBkYXRhLCBtaW5TaXplKTsKKyAgICBBTVJEZWNvZGUobUFtckhhbmRsZSwgZnJhbWVUeXBlLCBpbnB1dEJ1Ziwgb3V0cHV0QnVmLCBiaXRzcmVhbUZvcm1hdCk7CisgICAgLyogQU1SRGVjb2RlKCkgZGVjb2RlcyBtaW5TaXplIG51bWJlciBvZiBieXRlcyBpZiBkZWNvZGUgaXMgc3VjY2Vzc2Z1bC4KKyAgICAgKiBBTVJEZWNvZGUoKSByZXR1cm5zIC0xIGlmIGRlY29kZSBmYWlscy4KKyAgICAgKiBFdmVuIGlmIG5vIGJ5dGVzIGFyZSBkZWNvZGVkLCBpbmNyZW1lbnQgYnkgbWluU2l6ZSB0byBlbnN1cmUgZnV6emVyIHByb2NlZWRzCisgICAgICogdG8gZmVlZCBuZXh0IGRhdGEgKi8KKyAgICBkYXRhICs9IG1pblNpemU7CisgICAgc2l6ZSAtPSBtaW5TaXplOworICAgIGRlbGV0ZVtdIGlucHV0QnVmOworICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNpemUgPCAyKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7CisgIGlmICghY29kZWMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoY29kZWMtPmluaXREZWNvZGVyKCkgPT0gMCkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgIH0KKyAgZGVsZXRlIGNvZGVjOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlY3MvYW1ybmIvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvQW5kcm9pZC5icApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL05PVElDRSBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9OT1RJQ0UKY29weSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9URVNUX01BUFBJTkcgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc4ZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMCBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiCit7CisgIC8vIHRlc3RzIHdoaWNoIHJlcXVpcmUgZHluYW1pYyBjb250ZW50CisgIC8vIGludm9rZSB3aXRoOiBhdGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCisgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKKyAgImR5bmFtaWMtcHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiQW1yd2JEZWNvZGVyVGVzdCJ9CisKKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNmEzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhbXJ3Yl9kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbXJ3Yl9kZWNfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9hbXJ3Yl9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL2FtcndiX2RlY19mdXp6ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL2FtcndiX2RlY19mdXp6ZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2Z1enplci9hbXJ3Yl9kZWNfZnV6emVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2luY2x1ZGUvcHZhbXJ3YmRlY29kZXJfYXBpLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2luY2x1ZGUvcHZhbXJ3YmRlY29kZXJfYXBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9pbmNsdWRlL3B2YW1yd2JkZWNvZGVyX2FwaS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2luY2x1ZGUvcHZhbXJ3YmRlY29kZXJfYXBpLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApjb3B5IHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2FnYzJfYW1yX3diLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2FnYzJfYW1yX3diLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9hZ2MyX2Ftcl93Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2FnYzJfYW1yX3diLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9iYW5kX3Bhc3NfNmtfN2suY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvYmFuZF9wYXNzXzZrXzdrLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9iYW5kX3Bhc3NfNmtfN2suY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9iYW5kX3Bhc3NfNmtfN2suY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWNfYWNlbHBfMnBfaW5fNjQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19hY2VscF80cF9pbl82NC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfYWxnX2NvZGVib29rLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19hbGdfY29kZWJvb2suY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hbGdfY29kZWJvb2suY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWNfYWxnX2NvZGVib29rLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfZ2FpbjJfYW1yX3diLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19nYWluMl9hbXJfd2IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19nYWluMl9hbXJfd2IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWNfZ2FpbjJfYW1yX3diLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWVtcGhhc2lzXzMyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlZW1waGFzaXNfMzIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlZW1waGFzaXNfMzIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWVtcGhhc2lzXzMyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kdHguaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2R0eC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2R0eC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kdHguaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kdHhfZGVjb2Rlcl9hbXJfd2IuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZHR4X2RlY29kZXJfYW1yX3diLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kdHhfZGVjb2Rlcl9hbXJfd2IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kdHhfZGVjb2Rlcl9hbXJfd2IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2VfcHZfYW1yd2JkZWMuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2VfcHZfYW1yd2JkZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9lX3B2X2FtcndiZGVjLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2VfcHZfYW1yd2JkZWMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9nZXRfYW1yX3diX2JpdHMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZ2V0X2Ftcl93Yl9iaXRzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9nZXRfYW1yX3diX2JpdHMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9nZXRfYW1yX3diX2JpdHMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2dldF9hbXJfd2JfYml0cy5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZ2V0X2Ftcl93Yl9iaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZ2V0X2Ftcl93Yl9iaXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2dldF9hbXJfd2JfYml0cy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2hpZ2hwYXNzXzQwMGh6X2F0XzEyazguY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaGlnaHBhc3NfNDAwaHpfYXRfMTJrOC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaGlnaHBhc3NfNDAwaHpfYXRfMTJrOC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2hpZ2hwYXNzXzQwMGh6X2F0XzEyazguY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2hpZ2hwYXNzXzUwaHpfYXRfMTJrOC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9oaWdocGFzc181MGh6X2F0XzEyazguY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2hpZ2hwYXNzXzUwaHpfYXRfMTJrOC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2hpZ2hwYXNzXzUwaHpfYXRfMTJrOC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaG9taW5nX2Ftcl93Yl9kZWMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaG9taW5nX2Ftcl93Yl9kZWMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2hvbWluZ19hbXJfd2JfZGVjLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaG9taW5nX2Ftcl93Yl9kZWMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2ludGVycG9sYXRlX2lzcC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pbnRlcnBvbGF0ZV9pc3AuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2ludGVycG9sYXRlX2lzcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2ludGVycG9sYXRlX2lzcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaXNmX2V4dHJhcG9sYXRpb24uY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaXNmX2V4dHJhcG9sYXRpb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2lzZl9leHRyYXBvbGF0aW9uLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaXNmX2V4dHJhcG9sYXRpb24uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2lzcF9hei5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pc3BfYXouY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2lzcF9hei5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2lzcF9hei5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaXNwX2lzZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pc3BfaXNmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9pc3BfaXNmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaXNwX2lzZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbGFnY29uY2VhbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9sYWdjb25jZWFsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9sYWdjb25jZWFsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbGFnY29uY2VhbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbG93X3Bhc3NfZmlsdF83ay5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9sb3dfcGFzc19maWx0XzdrLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9sb3dfcGFzc19maWx0XzdrLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbG93X3Bhc3NfZmlsdF83ay5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWVkaWFuNS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9tZWRpYW41LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9tZWRpYW41LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbWVkaWFuNS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWltZV9pby5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9taW1lX2lvLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9taW1lX2lvLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbWltZV9pby5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWltZV9pby5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbWltZV9pby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL21pbWVfaW8uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbWltZV9pby5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vaXNlX2dlbl9hbXJ3Yi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ub2lzZV9nZW5fYW1yd2IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vaXNlX2dlbl9hbXJ3Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL25vaXNlX2dlbl9hbXJ3Yi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9ybWFsaXplX2Ftcl93Yi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbm9ybWFsaXplX2Ftcl93Yi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9ybWFsaXplX2Ftcl93Yi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbm9ybWFsaXplX2Ftcl93Yi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vcm1hbGl6ZV9hbXJfd2IuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbm9ybWFsaXplX2Ftcl93Yi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL292ZXJzYW1wXzEyazhfdG9fMTZrLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL292ZXJzYW1wXzEyazhfdG9fMTZrLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9vdmVyc2FtcF8xMms4X3RvXzE2ay5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL292ZXJzYW1wXzEyazhfdG9fMTZrLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9waGFzZV9kaXNwZXJzaW9uLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3BoYXNlX2Rpc3BlcnNpb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3BoYXNlX2Rpc3BlcnNpb24uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9waGFzZV9kaXNwZXJzaW9uLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9waXRfc2hycC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9waXRfc2hycC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcGl0X3NocnAuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9waXRfc2hycC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHJlZF9sdDQuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHJlZF9sdDQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3ByZWRfbHQ0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHJlZF9sdDQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3ByZWVtcGhfYW1yd2JfZGVjLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3ByZWVtcGhfYW1yd2JfZGVjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wcmVlbXBoX2FtcndiX2RlYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3ByZWVtcGhfYW1yd2JfZGVjLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdl9hbXJfd2JfdHlwZV9kZWZzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdl9hbXJfd2JfdHlwZV9kZWZzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZfYW1yX3diX3R5cGVfZGVmcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdl9hbXJfd2JfdHlwZV9kZWZzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JfbWF0aF9vcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiX21hdGhfb3AuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JfbWF0aF9vcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JfbWF0aF9vcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiX21hdGhfb3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9hY2VscC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYWNlbHAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9hY2VscC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9hY2VscC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfYXJtdjUuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2FybXY1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfYXJtdjUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfYXJtdjUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfY2VxdWl2YWxlbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2djY19hcm12NS5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfZ2NjX2FybXY1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfZ2NjX2FybXY1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2djY19hcm12NS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Nuc3QuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Nuc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9jbnN0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Nuc3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9tZW1fZnVuY3MuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX21lbV9mdW5jcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX21lbV9mdW5jcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9tZW1fZnVuY3MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xX2dhaW4yX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xX2dhaW4yX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcV9nYWluMl90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xX2dhaW4yX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcV9wdWxzZS5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcV9wdWxzZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FfcHVsc2UuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcV9wdWxzZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3Fpc2ZfbnMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcWlzZl9ucy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcWlzZl9ucy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3Fpc2ZfbnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3Fpc2ZfbnMuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3Fpc2ZfbnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xaXNmX25zLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3Fpc2ZfbnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xaXNmX25zX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xaXNmX25zX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcWlzZl9uc190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xaXNmX25zX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcXBpc2ZfMnMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FwaXNmXzJzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcXBpc2ZfMnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FwaXNmXzJzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xcGlzZl8ycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FwaXNmXzJzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3FwaXNmXzJzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnNfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3FwaXNmXzJzX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnNfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcXBpc2ZfMnNfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9zY2FsZV9zaWduYWwuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvc2NhbGVfc2lnbmFsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9zY2FsZV9zaWduYWwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9zY2FsZV9zaWduYWwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3N5bnRoZXNpc19hbXJfd2IuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvc3ludGhlc2lzX2Ftcl93Yi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvc3ludGhlc2lzX2Ftcl93Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3N5bnRoZXNpc19hbXJfd2IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3N5bnRoZXNpc19hbXJfd2IuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3N5bnRoZXNpc19hbXJfd2IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9zeW50aGVzaXNfYW1yX3diLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3N5bnRoZXNpc19hbXJfd2IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy92b2ljZV9mYWN0b3IuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvdm9pY2VfZmFjdG9yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy92b2ljZV9mYWN0b3IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy92b2ljZV9mYWN0b3IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy93Yl9zeW5fZmlsdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy93Yl9zeW5fZmlsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2MDMyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3diX3N5bl9maWx0LmNwcApAQCAtMCwwICsxLDMwNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgZm9sbG93aW5nIDNHUFAgc3RhbmRhcmQ6CisKKyAgICAzR1BQIFRTIDI2LjE3MworICAgIEFOU0ktQyBjb2RlIGZvciB0aGUgQWRhcHRpdmUgTXVsdGktUmF0ZSAtIFdpZGViYW5kIChBTVItV0IpIHNwZWVjaCBjb2RlYworICAgIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuM2dwcC5vcmcKKworKEMpIDIwMDcsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRUQSwgVFRDKQorUGVybWlzc2lvbiB0byBkaXN0cmlidXRlLCBtb2RpZnkgYW5kIHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHN0YW5kYXJkIGxpY2Vuc2UKK3Rlcm1zIGxpc3RlZCBhYm92ZSBoYXMgYmVlbiBvYnRhaW5lZCBmcm9tIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKyBGaWxlbmFtZTogd2Jfc3luX2ZpbHQuY3BwCisKKyAgICAgRGF0ZTogMDUvMDgvMjAwNAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVZJU0lPTiBISVNUT1JZCisKKworIERlc2NyaXB0aW9uOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCisKK3diX3N5bl9maWx0CisKKyAgICAgaW50MTYgYVtdLCAgICAgICAgICAgICAgIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMKKyAgICAgaW50MTYgbSwgICAgICAgICAgICAgICAgIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIKKyAgICAgaW50MTYgeFtdLCAgICAgICAgICAgICAgIChpKSAgICAgOiBpbnB1dCBzaWduYWwKKyAgICAgaW50MTYgeVtdLCAgICAgICAgICAgICAgIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsCisgICAgIGludDE2IGxnLCAgICAgICAgICAgICAgICAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcKKyAgICAgaW50MTYgbWVtW10sICAgICAgICAgICAgIChpL28pICAgOiBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsdGVyaW5nLgorICAgICBpbnQxNiB1cGRhdGUsICAgICAgICAgICAgKGkpICAgICA6IDA9bm8gdXBkYXRlLCAxPXVwZGF0ZSBvZiBtZW1vcnkuCisgICAgIGludDE2IHlfYnVmW10KKworU3luX2ZpbHRfMzIKKworICAgICBpbnQxNiBhW10sICAgICAgICAgICAgICAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzCisgICAgIGludDE2IG0sICAgICAgICAgICAgICAgIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIKKyAgICAgaW50MTYgZXhjW10sICAgICAgICAgICAgKGkpIFFuZXc6IGV4Y2l0YXRpb24gKGV4Y1tpXSA+PiBRbmV3KQorICAgICBpbnQxNiBRbmV3LCAgICAgICAgICAgICAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpCisgICAgIGludDE2IHNpZ19oaVtdLCAgICAgICAgIChvKSAvMTYgOiBzeW50aGVzaXMgaGlnaAorICAgICBpbnQxNiBzaWdfbG9bXSwgICAgICAgICAobykgLzE2IDogc3ludGhlc2lzIGxvdworICAgICBpbnQxNiBsZyAgICAgICAgICAgICAgICAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gREVTQ1JJUFRJT04KKworICAgIERvIHRoZSBzeW50aGVzaXMgZmlsdGVyaW5nIDEvQSh6KSAgMTYgYW5kIDMyLWJpdHMgdmVyc2lvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVFVSVJFTUVOVFMKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRUZFUkVOQ0VTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFBTRVVETy1DT0RFCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSU5DTFVERVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpbmNsdWRlICJwdl9hbXJfd2JfdHlwZV9kZWZzLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfbWVtX2Z1bmNzLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfYmFzaWNfb3AuaCIKKyNpbmNsdWRlICJwdmFtcndiX21hdGhfb3AuaCIKKyNpbmNsdWRlICJwdmFtcndiZGVjb2Rlcl9jbnN0LmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfYWNlbHAuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1BQ1JPUworOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgREVGSU5FUworOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAorOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCis7IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCis7IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHdiX3N5bl9maWx0KAorICAgIGludDE2IGFbXSwgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8KKyAgICBpbnQxNiBtLCAgICAgICAgIC8qIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50MTYgeFtdLCAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludDE2IHlbXSwgICAgICAgLyogKG8pICAgICA6IG91dHB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQxNiBsZywgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50MTYgbWVtW10sICAgICAvKiAoaS9vKSAgIDogbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlcmluZy4gICAqLworICAgIGludDE2IHVwZGF0ZSwgICAgLyogKGkpICAgICA6IDA9bm8gdXBkYXRlLCAxPXVwZGF0ZSBvZiBtZW1vcnkuICAgICAgICAgKi8KKyAgICBpbnQxNiB5X2J1ZltdCispCit7CisKKyAgICBpbnQxNiBpLCBqOworICAgIGludDMyIExfdG1wMTsKKyAgICBpbnQzMiBMX3RtcDI7CisgICAgaW50MzIgTF90bXAzOworICAgIGludDMyIExfdG1wNDsKKyAgICBpbnQxNiAqeXk7CisKKyAgICAvKiBjb3B5IGluaXRpYWwgZmlsdGVyIHN0YXRlcyBpbnRvIHN5bnRoZXNpcyBidWZmZXIgKi8KKyAgICBwdl9tZW1jcHkoeV9idWYsIG1lbSwgbSpzaXplb2YoKnl5KSk7CisKKyAgICB5eSA9ICZ5X2J1ZlttXTsKKworICAgIC8qIERvIHRoZSBmaWx0ZXJpbmcuICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGcgPj4gMjsgaSsrKQorICAgIHsKKyAgICAgICAgTF90bXAxID0gLSgoaW50MzIpeFsoaTw8MildIDw8IDExKTsKKyAgICAgICAgTF90bXAyID0gLSgoaW50MzIpeFsoaTw8MikrMV0gPDwgMTEpOworICAgICAgICBMX3RtcDMgPSAtKChpbnQzMil4WyhpPDwyKSsyXSA8PCAxMSk7CisgICAgICAgIExfdG1wNCA9IC0oKGludDMyKXhbKGk8PDIpKzNdIDw8IDExKTsKKworICAgICAgICAvKiBhW10gdXNlcyBRMTIgYW5kIGFicyhhKSA9PCAxICovCisKKyAgICAgICAgTF90bXAxICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAtM10sIGFbM10sIExfdG1wMSk7CisgICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLTJdLCBhWzNdLCBMX3RtcDIpOworICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpIC0yXSwgYVsyXSwgTF90bXAxKTsKKyAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAtMV0sIGFbMl0sIExfdG1wMik7CisgICAgICAgIExfdG1wMSAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLTFdLCBhWzFdLCBMX3RtcDEpOworCisgICAgICAgIGZvciAoaiA9IDQ7IGogPCBtOyBqICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIExfdG1wMSAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MiktMSAgLSBqXSwgYVtqKzFdLCBMX3RtcDEpOworICAgICAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAgICAtIGpdLCBhW2orMV0sIExfdG1wMik7CisgICAgICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICAgIC0gal0sIGFbaiAgXSwgTF90bXAxKTsKKyAgICAgICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMSAgLSBqXSwgYVtqICBdLCBMX3RtcDIpOworICAgICAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsxICAtIGpdLCBhW2orMV0sIExfdG1wMyk7CisgICAgICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzIgIC0gal0sIGFbaisxXSwgTF90bXA0KTsKKyAgICAgICAgICAgIExfdG1wMyAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMiAgLSBqXSwgYVtqICBdLCBMX3RtcDMpOworICAgICAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSszICAtIGpdLCBhW2ogIF0sIExfdG1wNCk7CisgICAgICAgIH0KKworICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICAgIC0gal0sIGFbal0sIExfdG1wMSk7CisgICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMSAgLSBqXSwgYVtqXSwgTF90bXAyKTsKKyAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsyICAtIGpdLCBhW2pdLCBMX3RtcDMpOworICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzMgIC0gal0sIGFbal0sIExfdG1wNCk7CisKKyAgICAgICAgTF90bXAxID0gc2hsX2ludDMyKExfdG1wMSwgNCk7CisKKyAgICAgICAgeVsoaTw8MildID0geXlbKGk8PDIpXSA9IGFtcl93Yl9yb3VuZCgtTF90bXAxKTsKKworICAgICAgICBMX3RtcDIgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpXSwgYVsxXSwgTF90bXAyKTsKKworICAgICAgICBMX3RtcDIgPSBzaGxfaW50MzIoTF90bXAyLCA0KTsKKworICAgICAgICB5WyhpPDwyKSsxXSA9IHl5WyhpPDwyKSsxXSA9IGFtcl93Yl9yb3VuZCgtTF90bXAyKTsKKworICAgICAgICBMX3RtcDMgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpIC0gMV0sIGFbM10sIExfdG1wMyk7CisgICAgICAgIExfdG1wNCAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MildLCBhWzNdLCBMX3RtcDQpOworICAgICAgICBMX3RtcDMgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpXSwgYVsyXSwgTF90bXAzKTsKKyAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSArIDFdLCBhWzJdLCBMX3RtcDQpOworICAgICAgICBMX3RtcDMgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICsgMV0sIGFbMV0sIExfdG1wMyk7CisKKyAgICAgICAgTF90bXAzID0gc2hsX2ludDMyKExfdG1wMywgNCk7CisKKyAgICAgICAgeVsoaTw8MikrMl0gPSB5eVsoaTw8MikrMl0gPSBhbXJfd2Jfcm91bmQoLUxfdG1wMyk7CisKKyAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsyXSwgYVsxXSwgTF90bXA0KTsKKworICAgICAgICBMX3RtcDQgPSBzaGxfaW50MzIoTF90bXA0LCA0KTsKKworICAgICAgICB5WyhpPDwyKSszXSA9IHl5WyhpPDwyKSszXSA9IGFtcl93Yl9yb3VuZCgtTF90bXA0KTsKKyAgICB9CisKKworICAgIC8qIFVwZGF0ZSBtZW1vcnkgaWYgcmVxdWlyZWQgKi8KKworICAgIGlmICh1cGRhdGUpCisgICAgeworICAgICAgICBwdl9tZW1jcHkobWVtLCAmeVtsZyAtIG1dLCBtKnNpemVvZigqeSkpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFN5bl9maWx0XzMyKAorICAgIGludDE2IGFbXSwgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgKi8KKyAgICBpbnQxNiBtLCAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyICAgICAgICAgICAgICovCisgICAgaW50MTYgZXhjW10sICAgICAgICAgICAgLyogKGkpIFFuZXc6IGV4Y2l0YXRpb24gKGV4Y1tpXSA+PiBRbmV3KSAgICAqLworICAgIGludDE2IFFuZXcsICAgICAgICAgICAgIC8qIChpKSAgICAgOiBleGMgc2NhbGluZyA9IDAobWluKSB0byA4KG1heCkgKi8KKyAgICBpbnQxNiBzaWdfaGlbXSwgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGhpZ2ggICAgICAgICAgICAgICAgICovCisgICAgaW50MTYgc2lnX2xvW10sICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBsb3cgICAgICAgICAgICAgICAgICAqLworICAgIGludDE2IGxnICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgKi8KKykKK3sKKyAgICBpbnQxNiBpLCBrLCBhMDsKKyAgICBpbnQzMiBMX3RtcDE7CisgICAgaW50MzIgTF90bXAyOworICAgIGludDMyIExfdG1wMzsKKyAgICBpbnQzMiBMX3RtcDQ7CisKKyAgICBhMCA9IDkgLSBRbmV3OyAgICAgICAgLyogaW5wdXQgLyAxNiBhbmQgPj5RbmV3ICovCisKKyAgICAvKiBEbyB0aGUgZmlsdGVyaW5nLiAqLworCisgICAgZm9yIChpID0gMDsgaSA8IGxnID4+IDE7IGkrKykKKyAgICB7CisKKyAgICAgICAgTF90bXAzID0gMDsKKyAgICAgICAgTF90bXA0ID0gMDsKKworICAgICAgICBMX3RtcDEgPSBmeHBfbXVsXzE2YnkxNihzaWdfbG9bKGk8PDEpIC0gMV0sIGFbMV0pOworICAgICAgICBMX3RtcDIgPSBmeHBfbXVsXzE2YnkxNihzaWdfaGlbKGk8PDEpIC0gMV0sIGFbMV0pOworCisgICAgICAgIGZvciAoayA9IDI7IGsgPCBtOyBrICs9IDIpCisgICAgICAgIHsKKworICAgICAgICAgICAgTF90bXAxID0gZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKS0xIC0ga10sIGFbaysxXSwgTF90bXAxKTsKKyAgICAgICAgICAgIExfdG1wMiA9IGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSktMSAtIGtdLCBhW2srMV0sIExfdG1wMik7CisgICAgICAgICAgICBMX3RtcDEgPSBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpICAgLSBrXSwgYVtrICBdLCBMX3RtcDEpOworICAgICAgICAgICAgTF90bXAyID0gZnhwX21hY18xNmJ5MTYoc2lnX2hpWyhpPDwxKSAgIC0ga10sIGFbayAgXSwgTF90bXAyKTsKKyAgICAgICAgICAgIExfdG1wMyA9IGZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSkgICAtIGtdLCBhW2srMV0sIExfdG1wMyk7CisgICAgICAgICAgICBMX3RtcDQgPSBmeHBfbWFjXzE2YnkxNihzaWdfaGlbKGk8PDEpICAgLSBrXSwgYVtrKzFdLCBMX3RtcDQpOworICAgICAgICAgICAgTF90bXAzID0gZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKSsxIC0ga10sIGFbayAgXSwgTF90bXAzKTsKKyAgICAgICAgICAgIExfdG1wNCA9IGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSkrMSAtIGtdLCBhW2sgIF0sIExfdG1wNCk7CisgICAgICAgIH0KKworICAgICAgICBMX3RtcDEgPSAtZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKSAgIC0ga10sIGFba10sIExfdG1wMSk7CisgICAgICAgIExfdG1wMyA9ICBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpKzEgLSBrXSwgYVtrXSwgTF90bXAzKTsKKyAgICAgICAgTF90bXAyID0gIGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSkgICAtIGtdLCBhW2tdLCBMX3RtcDIpOworICAgICAgICBMX3RtcDQgPSAgZnhwX21hY18xNmJ5MTYoc2lnX2hpWyhpPDwxKSsxIC0ga10sIGFba10sIExfdG1wNCk7CisKKworCisgICAgICAgIExfdG1wMSA+Pj0gMTE7ICAgICAgLyogLTQgOiBzaWdfbG9baV0gPDwgNCAqLworCisgICAgICAgIGludDY0IHNpZ190bXA7CisgICAgICAgIHNpZ190bXAgPSAoaW50NjQpTF90bXAxICsgKGludDMyKShleGNbKGk8PDEpXSA8PCBhMCk7CisgICAgICAgIExfdG1wMSA9IChpbnQzMikoc2lnX3RtcCAtIChMX3RtcDIgPDwgMSkpOworCisgICAgICAgIC8qIHNpZ19oaSA9IGJpdDE2IHRvIGJpdDMxIG9mIHN5bnRoZXNpcyAqLworICAgICAgICBMX3RtcDEgPSBzaGxfaW50MzIoTF90bXAxLCAzKTsgICAgICAgICAgIC8qIGFpIGluIFExMiAqLworCisgICAgICAgIHNpZ19oaVsoaTw8MSldID0gKGludDE2KShMX3RtcDEgPj4gMTYpOworCisgICAgICAgIExfdG1wNCA9IGZ4cF9tYWNfMTZieTE2KChpbnQxNikoTF90bXAxID4+IDE2KSwgYVsxXSwgTF90bXA0KTsKKworICAgICAgICAvKiBzaWdfbG8gPSBiaXQ0IHRvIGJpdDE1IG9mIHN5bnRoZXNpcyAqLworICAgICAgICAvKiBMX3RtcDEgPj49IDQgOiBzaWdfbG9baV0gPj4gNCAqLworICAgICAgICBzaWdfbG9bKGk8PDEpXSA9IChpbnQxNikoKExfdG1wMSA+PiA0KSAtICgoTF90bXAxID4+IDE2KSA8PCAxMikpOworCisgICAgICAgIExfdG1wMyA9IGZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSldLCBhWzFdLCBMX3RtcDMpOworICAgICAgICBMX3RtcDMgPSAtTF90bXAzID4+IDExOworCisgICAgICAgIHNpZ190bXAgPSAoaW50NjQpTF90bXAzICsgKGludDMyKShleGNbKGk8PDEpKzFdIDw8IGEwKTsKKyAgICAgICAgTF90bXAzID0gKGludDMyKShzaWdfdG1wIC0gKExfdG1wNCA8PCAxKSk7CisgICAgICAgIC8qIHNpZ19oaSA9IGJpdDE2IHRvIGJpdDMxIG9mIHN5bnRoZXNpcyAqLworICAgICAgICBMX3RtcDMgPSBzaGxfaW50MzIoTF90bXAzLCAzKTsgICAgICAgICAgIC8qIGFpIGluIFExMiAqLworICAgICAgICBzaWdfaGlbKGk8PDEpKzFdID0gKGludDE2KShMX3RtcDMgPj4gMTYpOworCisgICAgICAgIC8qIHNpZ19sbyA9IGJpdDQgdG8gYml0MTUgb2Ygc3ludGhlc2lzICovCisgICAgICAgIC8qIExfdG1wMSA+Pj0gNCA6IHNpZ19sb1tpXSA+PiA0ICovCisgICAgICAgIHNpZ19sb1soaTw8MSkrMV0gPSAoaW50MTYpKChMX3RtcDMgPj4gNCkgLSAoc2lnX2hpWyhpPDwxKSsxXSA8PCAxMikpOworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvd2VpZ2h0X2FtcndiX2xwYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy93ZWlnaHRfYW1yd2JfbHBjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy93ZWlnaHRfYW1yd2JfbHBjLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvd2VpZ2h0X2FtcndiX2xwYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FtcndiRGVjVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW1yd2JEZWNUZXN0RW52aXJvbm1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW1yd2JEZWNUZXN0RW52aXJvbm1lbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FtcndiRGVjVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FtcndiRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FtcndiRGVjb2RlclRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbXJ3YkRlY29kZXJUZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FtcndiRGVjb2RlclRlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTJhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFtcndiRGVjb2RlclRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQW1yd2JEZWNvZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWRUZXN0LnhtbApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvUkVBRE1FLm1kCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9hbXJ3YmRlY190ZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9hbXJ3YmRlY190ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvYW1yd2JkZWNfdGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9hbXJ3YmRlY190ZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjFhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNDkgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgc3JjczogWworICAgICAgICAic3JjL2F1dG9jb3JyLmMiLAorICAgICAgICAic3JjL2F6X2lzcC5jIiwKKyAgICAgICAgInNyYy9iaXRzLmMiLAorICAgICAgICAic3JjL2MydDY0ZnguYyIsCisgICAgICAgICJzcmMvYzR0NjRmeC5jIiwKKyAgICAgICAgInNyYy9jb252b2x2ZS5jIiwKKyAgICAgICAgInNyYy9jb3JfaF94LmMiLAorICAgICAgICAic3JjL2RlY2ltNTQuYyIsCisgICAgICAgICJzcmMvZGVlbXBoLmMiLAorICAgICAgICAic3JjL2R0eC5jIiwKKyAgICAgICAgInNyYy9nX3BpdGNoLmMiLAorICAgICAgICAic3JjL2dwY2xpcC5jIiwKKyAgICAgICAgInNyYy9ob21pbmcuYyIsCisgICAgICAgICJzcmMvaHA0MDAuYyIsCisgICAgICAgICJzcmMvaHA1MC5jIiwKKyAgICAgICAgInNyYy9ocDZrLmMiLAorICAgICAgICAic3JjL2hwX3dzcC5jIiwKKyAgICAgICAgInNyYy9pbnRfbHBjLmMiLAorICAgICAgICAic3JjL2lzcF9hei5jIiwKKyAgICAgICAgInNyYy9pc3BfaXNmLmMiLAorICAgICAgICAic3JjL2xhZ193aW5kLmMiLAorICAgICAgICAic3JjL2xldmluc29uLmMiLAorICAgICAgICAic3JjL2xvZzIuYyIsCisgICAgICAgICJzcmMvbHBfZGVjMi5jIiwKKyAgICAgICAgInNyYy9tYXRoX29wLmMiLAorICAgICAgICAic3JjL29wZXJfMzJiLmMiLAorICAgICAgICAic3JjL3BfbWVkX29sLmMiLAorICAgICAgICAic3JjL3BpdF9zaHJwLmMiLAorICAgICAgICAic3JjL3BpdGNoX2Y0LmMiLAorICAgICAgICAic3JjL3ByZWRfbHQ0LmMiLAorICAgICAgICAic3JjL3ByZWVtcGguYyIsCisgICAgICAgICJzcmMvcV9nYWluMi5jIiwKKyAgICAgICAgInNyYy9xX3B1bHNlLmMiLAorICAgICAgICAic3JjL3Fpc2ZfbnMuYyIsCisgICAgICAgICJzcmMvcXBpc2ZfMnMuYyIsCisgICAgICAgICJzcmMvcmFuZG9tLmMiLAorICAgICAgICAic3JjL3Jlc2lkdS5jIiwKKyAgICAgICAgInNyYy9zY2FsZS5jIiwKKyAgICAgICAgInNyYy9zdHJlYW0uYyIsCisgICAgICAgICJzcmMvc3luX2ZpbHQuYyIsCisgICAgICAgICJzcmMvdXBkdF90YXIuYyIsCisgICAgICAgICJzcmMvdXRpbC5jIiwKKyAgICAgICAgInNyYy92b0FNUldCRW5jLmMiLAorICAgICAgICAic3JjL3ZvaWNlZmFjLmMiLAorICAgICAgICAic3JjL3diX3ZhZC5jIiwKKyAgICAgICAgInNyYy93ZWlnaHRfYS5jIiwKKyAgICAgICAgInNyYy9tZW1fYWxpZ24uYyIsCisgICAgXSwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICBzcmNzOiBbCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9TeW5fZmlsdF8zMl9vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zIiwKKyAgICAgICAgICAgIF0sCisKKyAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICItREFSTSIsCisgICAgICAgICAgICAgICAgIi1EQVNNX09QVCIsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYy9hc20vQVJNVjVFIl0sCisKKyAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCisKKyAgICAgICAgICAgIG5lb246IHsKKyAgICAgICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9TeW5fZmlsdF8zMl9vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucyIsCisgICAgICAgICAgICAgICAgXSwKKworICAgICAgICAgICAgICAgIHNyY3M6IFsKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvY29udm9sdmVfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvY29yX2hfdmVjX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvc2NhbGVfc2lnX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L1N5bl9maWx0XzMyX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L3N5bl9maWx0X25lb24ucyIsCisgICAgICAgICAgICAgICAgXSwKKworICAgICAgICAgICAgICAgIC8vIGRvbid0IGFjdHVhbGx5IGdlbmVyYXRlIG5lb24gaW5zdHJ1Y3Rpb25zLCBzZWUgYnVnIDI2OTMyOTgwCisgICAgICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgICAgICItREFSTVY3IiwKKyAgICAgICAgICAgICAgICAgICAgIi1tZnB1PXZmcHYzIiwKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNyIsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAorICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvTk9USUNFIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9TYW1wbGVDb2RlL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1NhbXBsZUNvZGUvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1ZThiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTAgQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYworeworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIkFtcndiRW5jb2RlclRlc3QifQorCisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9kb2Mvdm9BTVJXQkVuY29kZXJTREsucGRmIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9kb2Mvdm9BTVJXQkVuY29kZXJTREsucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvZG9jL3ZvQU1SV0JFbmNvZGVyU0RLLnBkZgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9kb2Mvdm9BTVJXQkVuY29kZXJTREsucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDczZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1yd2JfZW5jX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJhbXJ3Yl9lbmNfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDdmYmZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjAgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyBlbmNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBBTVItV0IgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitBTVItV0Igc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gRnJhbWUgVHlwZSAocGFyYW1ldGVyIG5hbWU6IGBmcmFtZVR5cGVgKQorMi4gTW9kZSAocGFyYW1ldGVyIG5hbWU6IGBtb2RlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBmcmFtZVR5cGVgIHwgMC4gYFZPQU1SV0JfREVGQVVMVGAgMS4gYFZPQU1SV0JfSVRVYCAyLiBgVk9BTVJXQl9SRkMzMjY3YCB8IEJpdHMgMCwgMSBhbmQgMiBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8Cit8IGBtb2RlYCAgIHwgMC4gYFZPQU1SV0JfTUQ2NmAgMS4gYFZPQU1SV0JfTUQ4ODVgIDIuIGBWT0FNUldCX01EMTI2NWAgMy4gYFZPQU1SV0JfTUQxNDI1YCAgNC4gYFZPQU1SV0JfTUQxNTg1IGAgNS4gYFZPQU1SV0JfTUQxODI1YCA2LiBgVk9BTVJXQl9NRDE5ODVgIDcuIGBWT0FNUldCX01EMjMwNWAgOC4gYFZPQU1SV0JfTUQyMzg1YCA5LiBgVk9BTVJXQl9OX01PREVTYCB8IEJpdHMgNCwgNSwgNiBhbmQgNyBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgY29kZWMgdXNpbmcgYSBsb29wLgorSWYgdGhlIGVuY29kZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSB0aGUgZnJhbWUgc2l6ZS4KK0lmIHRoZSBlbmNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgc3RpbGwgYWR2YW5jZWQgYnkgZnJhbWUgc2l6ZSBzbwordGhhdCB0aGUgZnV6emVyIGNhbiBwcm9jZWVkIHRvIGZlZWQgdGhlIG5leHQgZnJhbWUuCisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYW1yd2JfZW5jX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgYW1yd2JfZW5jX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIHBjbSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hbXJ3Yl9lbmNfZnV6emVyL2FtcndiX2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvYW1yd2JfZW5jX2Z1enplci9hbXJ3Yl9lbmNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL2FtcndiX2VuY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvYW1yd2JfZW5jX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3M2ExZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL2FtcndiX2VuY19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiY21uTWVtb3J5LmgiCisjaW5jbHVkZSAidm9BTVJXQi5oIgorI2luY2x1ZGUgImNuc3QuaCIKKwordHlwZWRlZiBpbnQoVk9fQVBJICpWT0dFVEFVRElPRU5DQVBJKShWT19BVURJT19DT0RFQ0FQSSAqcEVuY0hhbmRsZSk7Citjb25zdCBpbnQzMl90IGtJbnB1dEJ1ZmZlclNpemUgPSBMX0ZSQU1FMTZrICogc2l6ZW9mKGludDE2X3QpICogMjsKK2NvbnN0IGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSAyICoga0lucHV0QnVmZmVyU2l6ZTsKK2NvbnN0IGludDMyX3Qga01vZGVzW10gPSB7Vk9BTVJXQl9NRDY2IC8qIDYuNjBrYnBzICovLCAgICBWT0FNUldCX01EODg1IC8qIDguODVrYnBzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWT0FNUldCX01EMTI2NSAvKiAxMi42NWticHMgKi8sIFZPQU1SV0JfTUQxNDI1IC8qIDE0LjI1a2JwcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVk9BTVJXQl9NRDE1ODUgLyogMTUuODVrYnBzICovLCBWT0FNUldCX01EMTgyNSAvKiAxOC4yNWticHMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZPQU1SV0JfTUQxOTg1IC8qIDE5Ljg1a2JwcyAqLywgVk9BTVJXQl9NRDIzMDUgLyogMjMuMDVrYnBzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWT0FNUldCX01EMjM4NSAvKiAyMy44NWticHMgKi8sIFZPQU1SV0JfTl9NT0RFUyAvKiBJbnZhbGlkIE1vZGUgKi99OworY29uc3QgVk9BTVJXQkZSQU1FVFlQRSBrRnJhbWVUeXBlc1tdID0ge1ZPQU1SV0JfREVGQVVMVCwgVk9BTVJXQl9JVFUsIFZPQU1SV0JfUkZDMzI2N307CisKK2NsYXNzIENvZGVjIHsKKyAgIHB1YmxpYzoKKyAgICBDb2RlYygpID0gZGVmYXVsdDsKKyAgICB+Q29kZWMoKSB7IGRlSW5pdEVuY29kZXIoKTsgfQorICAgIGJvb2wgaW5pdEVuY29kZXIoY29uc3QgdWludDhfdCAqZGF0YSk7CisgICAgdm9pZCBkZUluaXRFbmNvZGVyKCk7CisgICAgdm9pZCBlbmNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICBwcml2YXRlOgorICAgIFZPX0FVRElPX0NPREVDQVBJICptQXBpSGFuZGxlID0gbnVsbHB0cjsKKyAgICBWT19NRU1fT1BFUkFUT1IgKm1NZW1PcGVyYXRvciA9IG51bGxwdHI7CisgICAgVk9fSEFORExFIG1FbmNvZGVySGFuZGxlID0gbnVsbHB0cjsKK307CisKK2Jvb2wgQ29kZWM6OmluaXRFbmNvZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgICB1aW50OF90IHN0YXJ0Qnl0ZSA9ICpkYXRhOworICAgIGludDMyX3QgbW9kZSA9IGtNb2Rlc1soc3RhcnRCeXRlID4+IDQpICUgMTBdOworICAgIFZPQU1SV0JGUkFNRVRZUEUgZnJhbWVUeXBlID0ga0ZyYW1lVHlwZXNbc3RhcnRCeXRlICUgM107CisgICAgbU1lbU9wZXJhdG9yID0gbmV3IFZPX01FTV9PUEVSQVRPUjsKKyAgICBpZiAoIW1NZW1PcGVyYXRvcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOworICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7CisgICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKKyAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKKyAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7CisKKyAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOworICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOworICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOworICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKW1NZW1PcGVyYXRvcjsKKworICAgIG1BcGlIYW5kbGUgPSBuZXcgVk9fQVVESU9fQ09ERUNBUEk7CisgICAgaWYgKCFtQXBpSGFuZGxlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKFZPX0VSUl9OT05FICE9IHZvR2V0QU1SV0JFbmNBUEkobUFwaUhhbmRsZSkpIHsKKyAgICAgICAgLy8gRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPkluaXQoJm1FbmNvZGVySGFuZGxlLCBWT19BVURJT19Db2RpbmdBTVJXQiwgJnVzZXJEYXRhKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gaW5pdCBBTVJXQiBlbmNvZGVyCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfRlJBTUVUWVBFLCAmZnJhbWVUeXBlKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbShtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX01PREUsICZtb2RlKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjOjpkZUluaXRFbmNvZGVyKCkgeworICAgIGlmIChtRW5jb2RlckhhbmRsZSkgeworICAgICAgICBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpOworICAgICAgICBtRW5jb2RlckhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtQXBpSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtQXBpSGFuZGxlOworICAgICAgICBtQXBpSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1NZW1PcGVyYXRvcikgeworICAgICAgICBkZWxldGUgbU1lbU9wZXJhdG9yOworICAgICAgICBtTWVtT3BlcmF0b3IgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBDb2RlYzo6ZW5jb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgZG8geworICAgICAgICBpbnQzMl90IG1pblNpemUgPSBzdGQ6Om1pbigoaW50MzJfdClzaXplLCBrSW5wdXRCdWZmZXJTaXplKTsKKyAgICAgICAgdWludDhfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdID0ge307CisgICAgICAgIFZPX0NPREVDQlVGRkVSIGluRGF0YTsKKyAgICAgICAgVk9fQ09ERUNCVUZGRVIgb3V0RGF0YTsKKyAgICAgICAgVk9fQVVESU9fT1VUUFVUSU5GTyBvdXRGb3JtYXQ7CisgICAgICAgIGluRGF0YS5CdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKWRhdGE7CisgICAgICAgIGluRGF0YS5MZW5ndGggPSBtaW5TaXplOworICAgICAgICBvdXREYXRhLkJ1ZmZlciA9IG91dHB1dEJ1ZjsKKyAgICAgICAgbUFwaUhhbmRsZS0+U2V0SW5wdXREYXRhKG1FbmNvZGVySGFuZGxlLCAmaW5EYXRhKTsKKyAgICAgICAgbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJm91dERhdGEsICZvdXRGb3JtYXQpOworICAgICAgICBkYXRhICs9IG1pblNpemU7CisgICAgICAgIHNpemUgLT0gbWluU2l6ZTsKKyAgICB9IHdoaWxlIChzaXplID4gMCk7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjb2RlYy0+aW5pdEVuY29kZXIoZGF0YSkpIHsKKyAgICAgICAgLy8gQ29uc3VtZSBmaXJzdCBieXRlCisgICAgICAgICsrZGF0YTsKKyAgICAgICAgLS1zaXplOworICAgICAgICBjb2RlYy0+ZW5jb2RlRnJhbWVzKGRhdGEsIHNpemUpOworICAgIH0KKyAgICBkZWxldGUgY29kZWM7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2FjZWxwLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9hY2VscC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2FjZWxwLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2FjZWxwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYmFzaWNfb3AuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2Jhc2ljX29wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYmFzaWNfb3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvYmFzaWNfb3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iaXRzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9iaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYml0cy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9iaXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY25zdC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvY25zdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2Nuc3QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvY25zdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2NvZF9tYWluLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9jb2RfbWFpbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2NvZF9tYWluLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2NvZF9tYWluLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZHR4LmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9kdHguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9kdHguaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvZHR4LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZ3JpZDEwMC50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9ncmlkMTAwLnRhYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ncmlkMTAwLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvZ3JpZDEwMC50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaGFtX3dpbmQudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvaGFtX3dpbmQudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hhbV93aW5kLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvaGFtX3dpbmQudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hvbWluZy50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9ob21pbmcudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hvbWluZy50YWIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2hvbWluZy50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaXNwX2lzZi50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9pc3BfaXNmLnRhYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9pc3BfaXNmLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvaXNwX2lzZi50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbGFnX3dpbmQudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbGFnX3dpbmQudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xhZ193aW5kLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbGFnX3dpbmQudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzIuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2xvZzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2xvZzIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyX3RhYi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbG9nMl90YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9sb2cyX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21haW4uaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL21haW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tYWluLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL21haW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tYXRoX29wLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9tYXRoX29wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWF0aF9vcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9tYXRoX29wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWVtX2FsaWduLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9tZW1fYWxpZ24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tZW1fYWxpZ24uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbWVtX2FsaWduLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWltZV9pby50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9taW1lX2lvLnRhYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9taW1lX2lvLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbWltZV9pby50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvb3Blcl8zMmIuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL29wZXJfMzJiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvb3Blcl8zMmIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvb3Blcl8zMmIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9wX21lZF9vLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9wX21lZF9vLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfby5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9wX21lZF9vLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfb2wudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcF9tZWRfb2wudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3BfbWVkX29sLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcF9tZWRfb2wudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfZ2FpbjIudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcV9nYWluMi50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcV9nYWluMi50YWIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3FfZ2FpbjIudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfcHVsc2UuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3FfcHVsc2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xX3B1bHNlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3FfcHVsc2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xaXNmX25zLnRhYiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3Fpc2ZfbnMudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3Fpc2ZfbnMudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9xaXNmX25zLnRhYgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xcGlzZl8ycy50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9xcGlzZl8ycy50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcXBpc2ZfMnMudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9xcGlzZl8ycy50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvc3RyZWFtLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9zdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9zdHJlYW0uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvc3RyZWFtLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvdHlwZWRlZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvdHlwZWRlZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWZzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy90eXBlZGVmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWZzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3R5cGVkZWZzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy93Yl92YWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvd2JfdmFkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkX2MuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3diX3ZhZF9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkX2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvd2JfdmFkX2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9TeW5fZmlsdF8zMl9vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Ob3JtX0NvcnJfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9Ob3JtX0NvcnJfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvU3luX2ZpbHRfMzJfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29yX2hfdmVjX25lb24ucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvY29yX2hfdmVjX25lb24ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2F1dG9jb3JyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXV0b2NvcnIuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hel9pc3AuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2F6X2lzcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F6X2lzcC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hel9pc3AuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9iaXRzLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9iaXRzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYml0cy5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9iaXRzLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYzJ0NjRmeC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2MydDY0ZnguYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYzJ0NjRmeC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2M0dDY0ZnguYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2M0dDY0ZnguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2M0dDY0ZnguYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvY29udm9sdmUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9jb252b2x2ZS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2Nvcl9oX3guYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb3JfaF94LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2Nvcl9oX3guYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWNpbTU0LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kZWNpbTU0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVjaW01NC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kZWNpbTU0LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVlbXBoLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kZWVtcGguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWVtcGguYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZGVlbXBoLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZHR4LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kdHguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kdHguYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZHR4LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ19waXRjaC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZ19waXRjaC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dfcGl0Y2guYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZ19waXRjaC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dwY2xpcC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZ3BjbGlwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ3BjbGlwLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2dwY2xpcC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hvbWluZy5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaG9taW5nLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaG9taW5nLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hvbWluZy5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNDAwLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9ocDQwMC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNDAwLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwNDAwLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaHA1MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNTAuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaHA1MC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNmsuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwNmsuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDZrLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwNmsuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocF93c3AuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwX3dzcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwX3dzcC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9ocF93c3AuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pbnRfbHBjLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaW50X2xwYy5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pbnRfbHBjLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2F6LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pc3BfYXouYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfYXouYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaXNwX2F6LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2lzZi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaXNwX2lzZi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2lzcF9pc2YuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaXNwX2lzZi5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xhZ193aW5kLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9sYWdfd2luZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xhZ193aW5kLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2xhZ193aW5kLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGV2aW5zb24uYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2xldmluc29uLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGV2aW5zb24uYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbGV2aW5zb24uYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sb2cyLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9sb2cyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbG9nMi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9sb2cyLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbHBfZGVjMi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbHBfZGVjMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xwX2RlYzIuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbHBfZGVjMi5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21hdGhfb3AuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL21hdGhfb3AuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tYXRoX29wLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL21hdGhfb3AuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tZW1fYWxpZ24uYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL21lbV9hbGlnbi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21lbV9hbGlnbi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9tZW1fYWxpZ24uYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9vcGVyXzMyYi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvb3Blcl8zMmIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9vcGVyXzMyYi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9vcGVyXzMyYi5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BfbWVkX29sLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9wX21lZF9vbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BfbWVkX29sLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3BfbWVkX29sLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0X3NocnAuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3BpdF9zaHJwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0X3NocnAuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcGl0X3NocnAuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcGl0Y2hfZjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9waXRjaF9mNC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9wcmVkX2x0NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3ByZWRfbHQ0LmMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3ByZWVtcGguYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3ByZWVtcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDM4NDFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcHJlZW1waC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgRmlsZTogcHJlZW1waC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICBEZXNjcmlwdGlvbjogUHJlZW1waGFzaXM6IGZpbHRlcmluZyB0aHJvdWdoIDEgLSBnIHpeLTEgICAgICAgICAqCisqICAgICAgICAgICAgICBQcmVlbXBoMiAtLT4gc2lnbmFsIGlzIG11bHRpcGxpZWQgYnkgMiAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHlwZWRlZi5oIgorI2luY2x1ZGUgImJhc2ljX29wLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgUHJlZW1waCgKKyAgICAgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8KKyAgICAgICAgV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogcHJlZW1waGFzaXMgY29lZmZpY2llbnQgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbGVuZ2h0IG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh4Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgKQoreworICAgIFdvcmQxNiB0ZW1wOworICAgIFdvcmQzMiBpLCBMX3RtcDsKKworICAgIHRlbXAgPSB4W2xnIC0gMV07CisKKyAgICBmb3IgKGkgPSBsZyAtIDE7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgICBMX3RtcCA9IExfZGVwb3NpdF9oKHhbaV0pOworICAgICAgICBMX3RtcCAtPSAoeFtpIC0gMV0gKiBtdSk8PDE7CisgICAgICAgIHhbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsKKyAgICB9CisKKyAgICBMX3RtcCA9IExfZGVwb3NpdF9oKHhbMF0pOworICAgIExfdG1wIC09ICgoKm1lbSkgKiBtdSk8PDE7CisgICAgeFswXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OworCisgICAgKm1lbSA9IHRlbXA7CisKKyAgICByZXR1cm47Cit9CisKKwordm9pZCBQcmVlbXBoMigKKyAgICAgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8KKyAgICAgICAgV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogcHJlZW1waGFzaXMgY29lZmZpY2llbnQgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbGVuZ2h0IG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh4Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICkKK3sKKyAgICBXb3JkMTYgdGVtcDsKKyAgICBXb3JkMzIgaSwgTF90bXA7CisKKyAgICB0ZW1wID0geFtsZyAtIDFdOworCisgICAgZm9yIChpID0gKFdvcmQxNikgKGxnIC0gMSk7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgICBMX3RtcCA9IExfZGVwb3NpdF9oKHhbaV0pOworICAgICAgICBMX3RtcCAtPSAoeFtpIC0gMV0gKiBtdSk8PDE7IC8vIG9ubHkgY2FsbGVkIHdpdGggbXUgPT0gMjIyODIsIHNvIHRoaXMgd29uJ3Qgb3ZlcmZsb3cKKyAgICAgICAgaWYgKExfdG1wID4gSU5UMzJfTUFYIC8gMikgeworICAgICAgICAgICAgTF90bXAgPSBJTlQzMl9NQVggLyAyOworICAgICAgICB9CisgICAgICAgIExfdG1wID0gKExfdG1wIDw8IDEpOworICAgICAgICBpZiAoTF90bXAgPiBJTlQzMl9NQVggLSAweDgwMDApIHsKKyAgICAgICAgICAgIExfdG1wID0gSU5UMzJfTUFYIC0gMHg4MDAwOworICAgICAgICB9CisgICAgICAgIHhbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsKKyAgICB9CisKKyAgICBMX3RtcCA9IExfZGVwb3NpdF9oKHhbMF0pOworICAgIExfdG1wIC09ICgoKm1lbSkgKiBtdSk8PDE7CisgICAgaWYgKExfdG1wID4gSU5UMzJfTUFYIC8gMikgeworICAgICAgICBMX3RtcCA9IElOVDMyX01BWCAvIDI7CisgICAgfQorICAgIExfdG1wID0gKExfdG1wIDw8IDEpOworICAgIGlmIChMX3RtcCA+IElOVDMyX01BWCAtIDB4ODAwMCkgeworICAgICAgICBMX3RtcCA9IElOVDMyX01BWCAtIDB4ODAwMDsKKyAgICB9CisgICAgeFswXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OworCisgICAgKm1lbSA9IHRlbXA7CisKKyAgICByZXR1cm47Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfZ2FpbjIuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3FfZ2FpbjIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX2dhaW4yLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3FfZ2FpbjIuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcV9wdWxzZS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcV9wdWxzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2I2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xX3B1bHNlLmMKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICBGaWxlOiBxX3B1bHNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgRGVzY3JpcHRpb246IENvZGluZyBhbmQgZGVjb2Rpbmcgb2YgYWxnZWJyYWljIGNvZGVib29rICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisjaW5jbHVkZSAiYmFzaWNfb3AuaCIKKyNpbmNsdWRlICJxX3B1bHNlLmgiCisKKyNkZWZpbmUgTkJfUE9TIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3MgaW4gdHJhY2ssIG1hc2sgZm9yIHNpZ24gYml0ICovCisjZGVmaW5lIFVOVVNFRF9WQVIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKworV29yZDMyIHF1YW50XzFwX04xKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gTisxIGJpdHMgICAgICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvcywgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlICAgICAgICovCisgICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLworeworICAgIFdvcmQxNiBtYXNrOworICAgIFdvcmQzMiBpbmRleDsKKworICAgIG1hc2sgPSAoMSA8PCBOKSAtIDE7ICAgICAgICAgICAgICAvKiBtYXNrID0gKCgxPDxOKS0xKTsgKi8KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogUXVhbnRpemF0aW9uIG9mIDEgcHVsc2Ugd2l0aCBOKzEgYml0czogICAgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaW5kZXggPSBMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zICYgbWFzaykpOworICAgIGlmICgocG9zICYgTkJfUE9TKSAhPSAwKQorICAgIHsKKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgTF9kZXBvc2l0X2woMSA8PCBOKSk7ICAgLyogaW5kZXggKz0gMSA8PCBOOyAqLworICAgIH0KKyAgICByZXR1cm4gKGluZGV4KTsKK30KKworCitXb3JkMzIgcXVhbnRfMnBfMk4xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoMipOKSsxIGJpdHMgICAgICAgICAqLworICAgICAgICBXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovCisgICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLworeworICAgIFdvcmQxNiBtYXNrLCB0bXA7CisgICAgV29yZDMyIGluZGV4OworICAgIG1hc2sgPSAoMSA8PCBOKSAtIDE7ICAgICAgICAgICAgICAvKiBtYXNrID0gKCgxPDxOKS0xKTsgKi8KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogUXVhbnRpemF0aW9uIG9mIDIgcHVsc2VzIHdpdGggMipOKzEgYml0czogICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgocG9zMiBeIHBvczEpICYgTkJfUE9TKSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogc2lnbiBvZiAxc3QgcHVsc2UgPT0gc2lnbiBvZiAydGggcHVsc2UgKi8KKyAgICAgICAgaWYocG9zMSA8PSBwb3MyKSAgICAgICAgICAvKiAoKHBvczEgLSBwb3MyKSA8PSAwKSAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBpbmRleCA9ICgocG9zMSAmIG1hc2spIDw8IE4pICsgKHBvczIgJiBtYXNrKTsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MxICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qICgocG9zMiAmIG1hc2spIDw8IE4pICsgKHBvczEgJiBtYXNrKTsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MyICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBvczEgJiBOQl9QT1MpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IChOIDw8IDEpOworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKDFMIDw8IHRtcCkpOyAgICAgICAvKiBpbmRleCArPSAxIDw8ICgyKk4pOyAqLworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgeworICAgICAgICAvKiBzaWduIG9mIDFzdCBwdWxzZSAhPSBzaWduIG9mIDJ0aCBwdWxzZSAqLworICAgICAgICBpZiAodm9fc3ViKChXb3JkMTYpIChwb3MxICYgbWFzayksIChXb3JkMTYpIChwb3MyICYgbWFzaykpIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGluZGV4ID0gKChwb3MyICYgbWFzaykgPDwgTikgKyAocG9zMSAmIG1hc2spOyAqLworICAgICAgICAgICAgaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMSAmIG1hc2spKSkpOworICAgICAgICAgICAgaWYgKChwb3MyICYgTkJfUE9TKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IChOIDw8IDEpOyAgICAgICAgICAgLyogaW5kZXggKz0gMSA8PCAoMipOKTsgKi8KKyAgICAgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMUwgPDwgdG1wKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpbmRleCA9ICgocG9zMSAmIG1hc2spIDw8IE4pICsgKHBvczIgJiBtYXNrKTsgICAgICovCisgICAgICAgICAgICBpbmRleCA9IExfZGVwb3NpdF9sKGFkZDEoKCgoV29yZDE2KSAocG9zMSAmIG1hc2spKSA8PCBOKSwgKChXb3JkMTYpIChwb3MyICYgbWFzaykpKSk7CisgICAgICAgICAgICBpZiAoKHBvczEgJiBOQl9QT1MpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gKE4gPDwgMSk7CisgICAgICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKDEgPDwgdG1wKSk7ICAgIC8qIGluZGV4ICs9IDEgPDwgKDIqTik7ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChpbmRleCk7Cit9CisKKworV29yZDMyIHF1YW50XzNwXzNOMSggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDMqTikrMSBiaXRzICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovCisgICAgICAgIFdvcmQxNiBwb3MyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAyICAgICAqLworICAgICAgICBXb3JkMTYgcG9zMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMyAgICAgKi8KKyAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCit7CisgICAgV29yZDE2IG5iX3BvczsKKyAgICBXb3JkMzIgaW5kZXg7CisKKyAgICBuYl9wb3MgPSgxIDw8KE4gLSAxKSk7ICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PChOLTEpKTsgKi8KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogUXVhbnRpemF0aW9uIG9mIDMgcHVsc2VzIHdpdGggMypOKzEgYml0czogICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgocG9zMSBeIHBvczIpICYgbmJfcG9zKSA9PSAwKQorICAgIHsKKyAgICAgICAgaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMiwgc3ViKE4sIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMiwgKE4tMSkpOyAqLworICAgICAgICAvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8KKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOworICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3MzLCBOKSA8PCAoMipOKTsgKi8KKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczMsIE4pPDwoTiA8PCAxKSkpOworCisgICAgfSBlbHNlIGlmICgoKHBvczEgXiBwb3MzKSAmIG5iX3BvcykgPT0gMCkKKyAgICB7CisgICAgICAgIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIHN1YihOLCAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIChOLTEpKTsgKi8KKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOworICAgICAgICAvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8KKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczIsIE4pIDw8IChOIDw8IDEpKSk7CisgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczIsIE4pIDw8CisgICAgICAgICAqICgyKk4pOyAqLworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zMywgKE4gLSAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczMsIChOLTEpKTsgKi8KKyAgICAgICAgLyogaW5kZXggKz0gKHBvczIgJiBuYl9wb3MpIDw8IE47ICAgICAgICAgICAgKi8KKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MyICYgbmJfcG9zKSkgPDwgTikpOworICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3MxLCBOKSA8PCAoMipOKTsgICAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMXBfTjEocG9zMSwgTikgPDwgKE4gPDwgMSkpKTsKKyAgICB9CisgICAgcmV0dXJuIChpbmRleCk7Cit9CisKKworV29yZDMyIHF1YW50XzRwXzROMSggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDQqTikrMSBiaXRzICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovCisgICAgICAgIFdvcmQxNiBwb3MyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAyICAgICAqLworICAgICAgICBXb3JkMTYgcG9zMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMyAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvczQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDQgICAgICovCisgICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLworeworICAgIFdvcmQxNiBuYl9wb3M7CisgICAgV29yZDMyIGluZGV4OworCisgICAgbmJfcG9zID0gMSA8PCAoTiAtIDEpOyAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDwoTi0xKSk7ICAqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiBRdWFudGl6YXRpb24gb2YgNCBwdWxzZXMgd2l0aCA0Kk4rMSBiaXRzOiAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChwb3MxIF4gcG9zMikgJiBuYl9wb3MpID09IDApCisgICAgeworICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCBzdWIoTiwgMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCAoTi0xKSk7ICovCisgICAgICAgIC8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAgICAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7CisgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3MzLCBwb3M0LCBOKSA8PCAoMipOKTsgKi8KKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzJwXzJOMShwb3MzLCBwb3M0LCBOKSA8PCAoTiA8PCAxKSkpOworICAgIH0gZWxzZSBpZiAoKChwb3MxIF4gcG9zMykgJiBuYl9wb3MpID09IDApCisgICAgeworICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MzLCAoTiAtIDEpKTsKKyAgICAgICAgLyogaW5kZXggKz0gKHBvczEgJiBuYl9wb3MpIDw8IE47ICovCisgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMSAmIG5iX3BvcykpIDw8IE4pKTsKKyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczQsIE4pIDw8ICgyKk4pOyAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczIsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTiAtIDEpKTsKKyAgICAgICAgLyogaW5kZXggKz0gKHBvczIgJiBuYl9wb3MpIDw8IE47ICovCisgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMiAmIG5iX3BvcykpIDw8IE4pKTsKKyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczQsIE4pIDw8ICgyKk4pOyAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczEsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7CisgICAgfQorICAgIHJldHVybiAoaW5kZXgpOworfQorCisKK1dvcmQzMiBxdWFudF80cF80TiggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuIDQqTiBiaXRzICAgICAgICAgICAgICovCisgICAgICAgIFdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi40ICAqLworICAgICAgICBXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8KK3sKKyAgICBXb3JkMTYgbmJfcG9zLCBtYXNrIFVOVVNFRF9WQVIsIG5fMSwgdG1wOworICAgIFdvcmQxNiBwb3NBWzRdLCBwb3NCWzRdOworICAgIFdvcmQzMiBpLCBqLCBrLCBpbmRleDsKKworICAgIG5fMSA9IChXb3JkMTYpIChOIC0gMSk7CisgICAgbmJfcG9zID0gKDEgPDwgbl8xKTsgICAgICAgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8bl8xKTsgKi8KKyAgICBtYXNrID0gdm9fc3ViKCgxIDw8IE4pLCAxKTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLworCisgICAgaSA9IDA7CisgICAgaiA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKyAgICB7CisgICAgICAgIGlmICgocG9zW2tdICYgbmJfcG9zKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwb3NBW2krK10gPSBwb3Nba107CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwb3NCW2orK10gPSBwb3Nba107CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGkpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0bXAgPSB2b19zdWIoKE4gPDwgMiksIDMpOyAgICAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNCpOKS0zKTsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gKDFMIDw8IHRtcCk7CisgICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF80cF80TjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgcG9zQlszXSwgbl8xKTsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzRwXzROMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBwb3NCWzNdLCBuXzEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSkgPDwgKCgzKm5fMSkrMSk7ICovCisgICAgICAgICAgICB0bXAgPSBhZGQxKChXb3JkMTYpKCh2b19MX211bHQoMywgbl8xKSA+PiAxKSksIDEpOworICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpLCB0bXApOworICAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSk7ICovCisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdG1wID0gKChuXzEgPDwgMSkgKyAxKTsgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBuXzEpIDw8ICgoMipuXzEpKzEpOyAqLworICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKSwgdG1wKTsKKyAgICAgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpOyAqLworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgTjsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIE4pOworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3NCWzBdLCBuXzEpOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGluZGV4ID0gcXVhbnRfNHBfNE4xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIHBvc0FbM10sIG5fMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgaW4gZnVuY3Rpb24gcXVhbnRfNHBfNE5cbiIpOworICAgIH0KKyAgICB0bXAgPSAoKE4gPDwgMikgLSAyKTsgICAgICAgICAgICAgICAvKiBpbmRleCArPSAoaSAmIDMpIDw8ICgoNCpOKS0yKTsgKi8KKyAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBMX3NobCgoTF9kZXBvc2l0X2woaSkgJiAoM0wpKSwgdG1wKSk7CisKKyAgICByZXR1cm4gKGluZGV4KTsKK30KKworCisKK1dvcmQzMiBxdWFudF81cF81TiggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuIDUqTiBiaXRzICAgICAgICAgICAgICovCisgICAgICAgIFdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi41ICAqLworICAgICAgICBXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8KK3sKKyAgICBXb3JkMTYgbmJfcG9zLCBuXzEsIHRtcDsKKyAgICBXb3JkMTYgcG9zQVs1XSwgcG9zQls1XTsKKyAgICBXb3JkMzIgaSwgaiwgaywgaW5kZXgsIHRtcDI7CisKKyAgICBuXzEgPSAoV29yZDE2KSAoTiAtIDEpOworICAgIG5iX3BvcyA9ICgxIDw8IG5fMSk7ICAgICAgICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PG5fMSk7ICovCisKKyAgICBpID0gMDsKKyAgICBqID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgNTsgaysrKQorICAgIHsKKyAgICAgICAgaWYgKChwb3Nba10gJiBuYl9wb3MpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc0FbaSsrXSA9IHBvc1trXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc0JbaisrXSA9IHBvc1trXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoaSkKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRtcCA9IHZvX3N1YigoV29yZDE2KSgodm9fTF9tdWx0KDUsIE4pID4+IDEpKSwgMSk7ICAgICAgICAvKiAoKDUqTiktMSkpICovCisgICAgICAgICAgICBpbmRleCA9IExfc2hsKDFMLCB0bXApOyAgIC8qIGluZGV4ID0gMSA8PCAoKDUqTiktMSk7ICovCisgICAgICAgICAgICB0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgIC8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsqLworICAgICAgICAgICAgdG1wMiA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpLCB0bXApOworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgdG1wMik7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQls0XSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbM10sIHBvc0JbNF0sIE4pOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHRtcCA9IHZvX3N1YigoV29yZDE2KSgodm9fTF9tdWx0KDUsIE4pID4+IDEpKSwgMSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg1Kk4pLTEpOyAqLworICAgICAgICAgICAgaW5kZXggPSBMX3NobCgxTCwgdG1wKTsKKyAgICAgICAgICAgIHRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgIC8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpIDw8KCgyKk4pKzEpOyAgKi8KKyAgICAgICAgICAgIHRtcDIgPSBMX3NobChxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSwgdG1wKTsKKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHRtcDIpOworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbM10sIHBvc0FbMF0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzNdLCBwb3NBWzBdLCBOKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0bXAgPSB2b19zdWIoKFdvcmQxNikoKHZvX0xfbXVsdCg1LCBOKSA+PiAxKSksIDEpOyAgICAgICAgLyogKCg1Kk4pLTEpKSAqLworICAgICAgICAgICAgaW5kZXggPSBMX3NobCgxTCwgdG1wKTsgICAgICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg1Kk4pLTEpOyAqLworICAgICAgICAgICAgdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLworICAgICAgICAgICAgdG1wMiA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpLCB0bXApOworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgdG1wMik7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIE4pOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLworICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSwgdG1wKTsKKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgTik7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsgICovCisgICAgICAgICAgICBpbmRleCA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpLCB0bXApOworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0JbMF0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NBWzNdLCBwb3NCWzBdLCBOKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyAgKi8KKyAgICAgICAgICAgIGluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIHRtcCk7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVszXSwgcG9zQVs0XSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0FbNF0sIE4pOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGluIGZ1bmN0aW9uIHF1YW50XzVwXzVOXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKGluZGV4KTsKK30KKworCitXb3JkMzIgcXVhbnRfNnBfNk5fMiggICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoNipOKS0yIGJpdHMgICAgICAgICAqLworICAgICAgICBXb3JkMTYgcG9zW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMS4uNiAgKi8KKyAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCit7CisgICAgV29yZDE2IG5iX3Bvcywgbl8xOworICAgIFdvcmQxNiBwb3NBWzZdLCBwb3NCWzZdOworICAgIFdvcmQzMiBpLCBqLCBrLCBpbmRleDsKKworICAgIC8qICEhICBOIGFuZCBuXzEgYXJlIGNvbnN0YW50cyAtPiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgb3BlcmF0ZWQgYnkgQmFzaWMgT3BlcmF0b3JzICovCisgICAgbl8xID0gKFdvcmQxNikgKE4gLSAxKTsKKyAgICBuYl9wb3MgPSAoMSA8PCBuXzEpOyAgICAgICAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDxuXzEpOyAqLworCisgICAgaSA9IDA7CisgICAgaiA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IDY7IGsrKykKKyAgICB7CisgICAgICAgIGlmICgocG9zW2tdICYgbmJfcG9zKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwb3NBW2krK10gPSBwb3Nba107CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwb3NCW2orK10gPSBwb3Nba107CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGkpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpbmRleCA9ICgxIDw8IChXb3JkMTYpICg2ICogTiAtIDUpKTsgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDYqTiktNSk7ICovCisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOKSk7IC8qIGluZGV4ICs9IHF1YW50XzVwXzVOKHBvc0IsIG5fMSkgPDwgTjsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0JbNV0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQls1XSwgbl8xKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpbmRleCA9ICgxTCA8PCAoV29yZDE2KSAoNiAqIE4gLSA1KSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg2Kk4pLTUpOyAqLworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzVwXzVOKHBvc0IsIG5fMSkgPDwgTikpOyAvKiBpbmRleCArPSBxdWFudF81cF81Tihwb3NCLCBuXzEpIDw8IE47ICovCisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSk7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaW5kZXggPSAoMUwgPDwgKFdvcmQxNikgKDYgKiBOIC0gNSkpOyAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNipOKS01KTsgKi8KKyAgICAgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzRwXzROKHBvc0IsIG5fMSkgPDwgKCgyKm5fMSkrMSk7ICovCisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfNHBfNE4ocG9zQiwgbl8xKSA8PCAoV29yZDE2KSAoMiAqIG5fMSArIDEpKSk7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKSk7ICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIG5fMSk7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaW5kZXggPSAocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKFdvcmQxNikgKDMgKiBuXzEgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoKDMqbl8xKSsxKTsgKi8KKyAgICAgICAgICAgIGluZGV4ID12b19MX2FkZChpbmRleCwgcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSk7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgaSA9IDI7CisgICAgICAgICAgICBpbmRleCA9IChxdWFudF80cF80Tihwb3NBLCBuXzEpIDw8IChXb3JkMTYpICgyICogbl8xICsgMSkpOyAgLyogaW5kZXggPSBxdWFudF80cF80Tihwb3NBLCBuXzEpIDw8ICgoMipuXzEpKzEpOyAqLworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSkpOyAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgaW5kZXggPSAocXVhbnRfNXBfNU4ocG9zQSwgbl8xKSA8PCBOKTsgICAgICAgLyogaW5kZXggPSBxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE47ICovCisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NCWzBdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSk7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBpbmRleCA9IChxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE4pOyAgICAgICAvKiBpbmRleCA9IHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTjsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0FbNV0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQVs1XSwgbl8xKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiBmdW5jdGlvbiBxdWFudF82cF82Tl8yXG4iKTsKKyAgICB9CisgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKChMX2RlcG9zaXRfbChpKSAmIDNMKSA8PCAoV29yZDE2KSAoNiAqIE4gLSA0KSkpOyAgIC8qIGluZGV4ICs9IChpICYgMykgPDwgKCg2Kk4pLTQpOyAqLworCisgICAgcmV0dXJuIChpbmRleCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xaXNmX25zLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xaXNmX25zLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcWlzZl9ucy5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xaXNmX25zLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcXBpc2ZfMnMuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3FwaXNmXzJzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcXBpc2ZfMnMuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcXBpc2ZfMnMuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9yYW5kb20uYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3JhbmRvbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3JhbmRvbS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9yYW5kb20uYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9yZXNpZHUuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3Jlc2lkdS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Jlc2lkdS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9yZXNpZHUuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zY2FsZS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvc2NhbGUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zY2FsZS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9zY2FsZS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N0cmVhbS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvc3RyZWFtLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3RyZWFtLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3N0cmVhbS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9zeW5fZmlsdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3N5bl9maWx0LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXBkdF90YXIuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3VwZHRfdGFyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXBkdF90YXIuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvdXBkdF90YXIuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy91dGlsLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy91dGlsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXRpbC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy91dGlsLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvdm9BTVJXQkVuYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvdm9BTVJXQkVuYy5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvaWNlZmFjLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy92b2ljZWZhYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvaWNlZmFjLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3ZvaWNlZmFjLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2JfdmFkLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy93Yl92YWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93Yl92YWQuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvd2JfdmFkLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2VpZ2h0X2EuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3dlaWdodF9hLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2VpZ2h0X2EuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvd2VpZ2h0X2EuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbXJ3YkVuY1Rlc3RFbnZpcm9ubWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbXJ3YkVuY1Rlc3RFbnZpcm9ubWVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW1yd2JFbmNUZXN0RW52aXJvbm1lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FtcndiRW5jb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3MjU3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQW1yd2JFbmNvZGVyVGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBbXJ3YkVuY29kZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L1JFQURNRS5tZApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy90ZXN0L1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmY2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAiY29kZWNzX2c3MTFkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJnNzExRGVjQWxhdy5jcHAiLAorICAgICAgICAiZzcxMURlY01sYXcuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjLmggYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTM1N2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRzcxMV9ERUNfSF8KKyNkZWZpbmUgRzcxMV9ERUNfSF8KKworLyoqCisgKiBAZmlsZSBnNzExRGVjLmgKKyAqIEBicmllZiBnNzExIERlY29kZXIgQVBJOiBEZWNvZGVBTGF3IGFuZCBEZWNvZGVNTGF3CisgKi8KKworLyoqIERlY29kZXMgaW5wdXQgYnl0ZXMgb2Ygc2l6ZSBpblNpemUgYWNjb3JkaW5nIHRvIEFMQVcKKyAqCisgKiBAcGFyYW0gW2luXSBvdXQgPHR0PmludDE2X3QqPC90dD46IG91dHB1dCBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggZGVjb2RlZCBieXRlcy4KKyAqIEBwYXJhbSBbaW5dIGluIDx0dD5jb25zdCB1aW50OF90KjwvdHQ+OiBpbnB1dCBidWZmZXIgY29udGFpbmluZyBieXRlcyB0byBiZSBkZWNvZGVkLgorICogQHBhcmFtIFtpbl0gaW5TaXplIDx0dD5zaXplX3Q8L3R0Pjogc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLgorICovCit2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisKKy8qKiBEZWNvZGVzIGlucHV0IGJ5dGVzIG9mIHNpemUgaW5TaXplIGFjY29yZGluZyB0byBNTEFXCisgKgorICogQHBhcmFtIFtpbl0gb3V0IDx0dD5pbnQxNl90KjwvdHQ+OiBvdXRwdXQgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGRlY29kZWQgYnl0ZXMuCisgKiBAcGFyYW0gW2luXSBpbiA8dHQ+Y29uc3QgdWludDhfdCo8L3R0PjogaW5wdXQgYnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXMgdG8gYmUgZGVjb2RlZC4KKyAqIEBwYXJhbSBbaW5dIGluU2l6ZSA8dHQ+c2l6ZV90PC90dD46IHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlci4KKyAqLwordm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworCisjZW5kaWYgIC8vIEc3MTFfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjQWxhdy5jcHAgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNBbGF3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDFhN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjQWxhdy5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCBEZWNvZGVBTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgaWYgKG91dCAhPSBudWxscHRyICYmIGluICE9IG51bGxwdHIpIHsKKyAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgaW5TaXplLS07CisgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgaXggJj0gMHg3ZjsKKworICAgICAgaW50MzJfdCBpZXhwID0gaXggPj4gNDsKKyAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgaWYgKGlleHAgPiAwKSB7CisgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICB9CisKKyAgICAgIG1hbnQgPSAobWFudCA8PCA0KSArIDg7CisKKyAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICBtYW50ID0gbWFudCA8PCAoaWV4cCAtIDEpOworICAgICAgfQorCisgICAgICAqb3V0KysgPSAoeCA+IDEyNykgPyBtYW50IDogLW1hbnQ7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNNbGF3LmNwcCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY01sYXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMmNhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNNbGF3LmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICBpZiAob3V0ICE9IG51bGxwdHIgJiYgaW4gIT0gbnVsbHB0cikgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICBpblNpemUtLTsKKyAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7CisgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKKyAgICAgIGludDMyX3Qgc2VnbWVudCA9IGV4cG9uZW50ICsgMTsKKyAgICAgIG1hbnRpc3NhICY9IDB4MGY7CisKKyAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKKworICAgICAgaW50MzJfdCBhYnMgPSAoMHg4MGwgPDwgZXhwb25lbnQpICsgc3RlcCAqIG1hbnRpc3NhICsgc3RlcCAvIDIgLSA0ICogMzM7CisKKyAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVlZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK2NjX2Z1enogeworICAgIG5hbWU6ICJnNzExYWxhd19kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJnNzExX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJjb2RlY3NfZzcxMWRlYyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQUxBVyIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJnNzExbWxhd19kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJnNzExX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJjb2RlY3NfZzcxMWRlYyIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzFjMzZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDQ5IEBACisjIEZ1enplciBmb3IgbGlic3RhZ2VmcmlnaHRfZzcxMWRlYyBkZWNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBHNzExIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorY29kZWMgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRzcxMSBzdXBwb3J0cyB0d28gdHlwZXMgb2YgZGVjb2Rpbmc6CisxLiBEZWNvZGVBTGF3CisyLiBEZWNvZGVNTGF3CisKK1RoZXNlIHR3byBkZWNvZGVyIEFQSSdzIGFyZSBmdXp6ZWQgc2VwYXJhdGVseSB1c2luZyBnNzExYWxhd19kZWNfZnV6emVyIGFuZAorZzcxMW1sYXdfZGVjX2Z1enplciByZXNwZWN0aXZlbHkuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBjb2RlYyBhcyBleHBlY3RlZCBieSBkZWNvZGVyIEFQSS4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgZzcxMWFsYXdfZGVjX2Z1enplciBhbmQgZzcxMW1sYXdfZGVjX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgZzcxMWFsYXdfZGVjX2Z1enplcgorICAkIG1tIC1qJChucHJvYykgZzcxMW1sYXdfZGVjX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIGc3MTEgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvZzcxMWFsYXdfZGVjX2Z1enplci9nNzExYWxhd19kZWNfZnV6emVyIENPUlBVU19ESVIKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9nNzExbWxhd19kZWNfZnV6emVyL2c3MTFtbGF3X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvZzcxMWFsYXdfZGVjX2Z1enplci9nNzExYWxhd19kZWNfZnV6emVyIENPUlBVU19ESVIKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9nNzExbWxhd19kZWNfZnV6emVyL2c3MTFtbGF3X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL2c3MTFfZGVjX2Z1enplci5jcHAgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvZzcxMV9kZWNfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZiY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL2c3MTFfZGVjX2Z1enplci5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnNzExRGVjLmgiCisKK2NsYXNzIENvZGVjIHsKKyBwdWJsaWM6CisgIENvZGVjKCkgPSBkZWZhdWx0OworICB+Q29kZWMoKSA9IGRlZmF1bHQ7CisgIHZvaWQgZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKK307CisKK3ZvaWQgQ29kZWM6OmRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSA9IHNpemVvZihpbnQxNl90KSAqIHNpemU7CisgIGludDE2X3QgKm91dCA9IG5ldyBpbnQxNl90W291dHB1dEJ1ZmZlclNpemVdOworICBpZiAoIW91dCkgeworICAgIHJldHVybjsKKyAgfQorI2lmZGVmIEFMQVcKKyAgRGVjb2RlQUxhdyhvdXQsIGRhdGEsIHNpemUpOworI2Vsc2UKKyAgRGVjb2RlTUxhdyhvdXQsIGRhdGEsIHNpemUpOworI2VuZGlmCisgIGRlbGV0ZVtdIG91dDsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGNvZGVjLT5kZWNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgIGRlbGV0ZSBjb2RlYzsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTNmZjFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDE4IEBACisvLyBtYXBwaW5ncyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMKK3sKKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisKKyAgICAvLyB0aGUgZGVjb2RlciByZXBvcnRzIHNvbWV0aGluZyBiYWQgYWJvdXQgYW4gdW5leHBlY3RlZCBuZXdsaW5lIGluIHRoZSAqY29uZmlnIGZpbGUKKyAgICAvLyBhbmQgdGhlIGNvbmZpZyBmaWxlIGxvb2tzIGxpa2UgdGhlIEFuZHJvaWRUZXN0LnhtbCBmaWxlIHRoYXQgd2UgcHV0IGluIHRoZXJlLgorICAgIC8vIEkgZG9uJ3QgZ2V0IHRoaXMgZnJvbSB0aGUgRW5jb2RlciAtLSBhbmQgSSBkb24ndCBzZWUgYW55IHN1YnN0YW50aXZlIGRpZmZlcmVuY2UKKyAgICAvLyBiZXR3ZWVuIGRlY29kZSBhbmQgZW5jb2RlIEFuZHJvaWRUZXN0LnhtbCBmaWxlcyAtLSBleGNlcHQgdGhhdCBlbmNvZGUgZG9lcyBOT1QKKyAgICAvLyBmaW5pc2ggd2l0aCBhIG5ld2xpbmUuCisgICAgLy8gc3RyYW5nZS4KKyAgICB7ICJuYW1lIjogIk1wZWc0SDI2M0RlY29kZXJUZXN0In0sCisgICAgeyAibmFtZSI6ICJNcGVnNEgyNjNFbmNvZGVyVGVzdCJ9CisKKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDc0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OCBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmxvZyJdLAorCisgICAgc3JjczogWworICAgICAgICAic3JjL2JpdHN0cmVhbS5jcHAiLAorICAgICAgICAic3JjL2Jsb2NrX2lkY3QuY3BwIiwKKyAgICAgICAgInNyYy9jYWxfZGNfc2NhbGVyLmNwcCIsCisgICAgICAgICJzcmMvY29tYmluZWRfZGVjb2RlLmNwcCIsCisgICAgICAgICJzcmMvY29uY2VhbC5jcHAiLAorICAgICAgICAic3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAiLAorICAgICAgICAic3JjL2RjYWNfcHJlZGljdGlvbi5jcHAiLAorICAgICAgICAic3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcCIsCisgICAgICAgICJzcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcCIsCisgICAgICAgICJzcmMvZ2V0X3ByZWRfb3V0c2lkZS5jcHAiLAorICAgICAgICAic3JjL2lkY3QuY3BwIiwKKyAgICAgICAgInNyYy9pZGN0X3ZjYS5jcHAiLAorICAgICAgICAic3JjL21iX21vdGlvbl9jb21wLmNwcCIsCisgICAgICAgICJzcmMvbWJfdXRpbHMuY3BwIiwKKyAgICAgICAgInNyYy9wYWNrZXRfdXRpbC5jcHAiLAorICAgICAgICAic3JjL3Bvc3RfZmlsdGVyLmNwcCIsCisgICAgICAgICJzcmMvcHZkZWNfYXBpLmNwcCIsCisgICAgICAgICJzcmMvc2NhbGluZ190YWIuY3BwIiwKKyAgICAgICAgInNyYy92bGNfZGVjb2RlLmNwcCIsCisgICAgICAgICJzcmMvdmxjX2RlcXVhbnQuY3BwIiwKKyAgICAgICAgInNyYy92bGNfdGFiLmNwcCIsCisgICAgICAgICJzcmMvdm9wLmNwcCIsCisgICAgICAgICJzcmMvemlnemFnX3RhYi5jcHAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL05PVElDRSBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tNHZoMjYzX2RlY29kZXJfcHZfdHlwZXMuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tNHZoMjYzX2RlY29kZXJfcHZfdHlwZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL200dmgyNjNfZGVjb2Rlcl9wdl90eXBlcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbTR2aDI2M19kZWNvZGVyX3B2X3R5cGVzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YWVlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oCkBAIC0wLDAgKzEsMTgxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfTVA0REVDX0FQSV9IXworI2RlZmluZSBfTVA0REVDX0FQSV9IXworCisjaW5jbHVkZSAibTR2aDI2M19kZWNvZGVyX3B2X3R5cGVzLmgiCisKKy8vICNkZWZpbmUgUFZfVE9MRVJBVEVfVk9MX0VSUk9SUworI2RlZmluZSBQVl9NRU1PUllfUE9PTAorCisjaWZuZGVmIF9QVl9UWVBFU18KKyNkZWZpbmUgX1BWX1RZUEVTXworCit0eXBlZGVmIHVpbnQgQm9vbDsKKworI2RlZmluZSBQVl9DT0RFQ19JTklUICAwCisjZGVmaW5lIFBWX0NPREVDX1NUT1AgIDEKKyNlbmRpZgorCisjZGVmaW5lIFBWX1RSVUUgIDEKKyNkZWZpbmUgUFZfRkFMU0UgMAorCisjaWZuZGVmIE9TQ0xfSU1QT1JUX1JFRgorI2RlZmluZSBPU0NMX0lNUE9SVF9SRUYgLyogZW1wdHkgKi8KKyNlbmRpZgorI2lmbmRlZiBPU0NMX0VYUE9SVF9SRUYKKyNkZWZpbmUgT1NDTF9FWFBPUlRfUkVGIC8qIGVtcHR5ICovCisjZW5kaWYKKworCisjZGVmaW5lIFBWX05PX1BPU1RfUFJPQyAwCisjZGVmaW5lIFBWX0RFQkxPQ0sgMQorI2RlZmluZSBQVl9ERVJJTkcgIDIKKworCisKKyNpbmNsdWRlICJ2aXN1YWxfaGVhZGVyLmgiIC8vIHN0cnVjdCBWb2xJbmZvIGlzIGRlZmluZWQKKworCisvKipAbmFtZSBTdHJ1Y3R1cmUgYW5kIERhdGEgVHlwZXMKKyAqIFRoZXNlIHR5cGUgZGVmaW5pdGlvbnMgc3BlY2lmeSB0aGUgaW5wdXQgLyBvdXRwdXQgZnJvbSB0aGUgUFZNZXNzYWdlCisgKiBsaWJyYXJ5LgorICovCisKKy8qQHsqLworLyogVGhlIGFwcGxpY2F0aW9uIGhhcyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ091dHB1dEZyYW1lCit7CisgICAgdWludDggICAgICAgKmRhdGE7ICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0cHV0IFlVViBidWZmZXIgKi8KKyAgICB1aW50MzIgICAgICB0aW1lU3RhbXA7ICAgICAgLyogdGltZSBzdGFtcCAqLworfSBPdXRwdXRGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQXBwbGljYXRpb25EYXRhCit7CisgICAgaW50IGxheWVyOyAgICAgICAgICAvKiBjdXJyZW50IHZpZGVvIGxheWVyICovCisgICAgdm9pZCAqb2JqZWN0OyAgICAgICAvKiBzb21lIG9wdGlvbmFsIGRhdGEgZmllbGQgKi8KK30gYXBwbGljYXRpb25EYXRhOworCisvKiBBcHBsaWNhdGlvbiBjb250cm9scywgdGhpcyBzdHJ1Y3RlZCBzaGFsbCBiZSBhbGxvY2F0ZWQgKi8KKy8qICAgIGFuZCBpbml0aWFsaXplZCBpbiB0aGUgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9scworeworICAgIC8qIFRoZSBmb2xsb3dpbmcgZnVjbnRpb24gcG9pbnRlciBpcyBjb3BpZWQgdG8gQml0c3RyZWFtRGVjVmlkZW8gc3RydWN0dXJlICAqLworICAgIC8qICAgIHVwb24gaW5pdGlhbGl6YXRpb24gYW5kIG5ldmVyIHVzZWQgYWdhaW4uICovCisgICAgaW50ICgqcmVhZEJpdHN0cmVhbURhdGEpKHVpbnQ4ICpidWYsIGludCBuYnl0ZXNfcmVxdWlyZWQsIHZvaWQgKmFwcERhdGEpOworICAgIGFwcGxpY2F0aW9uRGF0YSBhcHBEYXRhOworCisgICAgdWludDggKm91dHB1dEZyYW1lOworICAgIHZvaWQgKnZpZGVvRGVjb2RlckRhdGE7ICAgICAvKiB0aGlzIGlzIGFuIGludGVybmFsIHBvaW50ZXIgdGhhdCBpcyBvbmx5IHVzZWQgKi8KKyAgICAvKiBpbiB0aGUgZGVjb2RlciBsaWJyYXJ5LiAgICovCisjaWZkZWYgUFZfTUVNT1JZX1BPT0wKKyAgICBpbnQzMiBzaXplOworI2VuZGlmCisgICAgaW50IG5MYXllcnM7CisgICAgLyogcG9pbnRlcnMgdG8gVk9MIGRhdGEgZm9yIGZyYW1lLWJhc2VkIGRlY29kaW5nLiAqLworICAgIHVpbnQ4ICp2b2xidWZbMl07ICAgICAgICAgICAvKiBtYXhpbXVtIG9mIDIgbGF5ZXJzIGZvciBub3cgKi8KKyAgICBpbnQzMiB2b2xidWZfc2l6ZVsyXTsKKworfSBWaWRlb0RlY0NvbnRyb2xzOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBIMjYzX01PREUgPSAwLCBNUEVHNF9NT0RFLCBVTktOT1dOX01PREUKK30gTVA0RGVjb2RpbmdNb2RlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBNUDRfSV9GUkFNRSwgTVA0X1BfRlJBTUUsIE1QNF9CX0ZSQU1FLCBNUDRfQkFEX0ZSQU1FCit9IE1QNEZyYW1lVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVm9wSGVhZGVySW5mbworeworICAgIGludCAgICAgY3VyckxheWVyOworICAgIHVpbnQzMiAgdGltZXN0YW1wOworICAgIE1QNEZyYW1lVHlwZSAgICBmcmFtZVR5cGU7CisgICAgaW50ICAgICByZWZTZWxDb2RlOworICAgIGludDE2ICAgICAgIHF1YW50aXplcjsKK30gVm9wSGVhZGVySW5mbzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIFZpZGVvUmVmQ29weUluZm86CisgKiBPTUFQIERTUCBzcGVjaWZpYyB0eXBlZGVmIHN0cnVjdHVyZSwgdG8gc3VwcG9ydCB0aGUgdXNlciAoQVJNKSBjb3B5aW5nCisgKiBvZiBhIFJlZmVyZW5jZSBGcmFtZSBpbnRvIHRoZSBWaWRlbyBEZWNvZGVyLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCB0YWdWaWRlb1JlZkNvcHlJbmZvUHRyCit7CisgICAgdWludDggICAqeUNoYW47ICAgICAgICAgICAgIC8qIFRoZSBZIGNvbXBvbmVudCBmcmFtZSB0aGUgdXNlciBjYW4gY29weSBhIG5ldyByZWZlcmVuY2UgdG8gKi8KKyAgICB1aW50OCAgICp1Q2hhbjsgICAgICAgICAgICAgLyogVGhlIFUgY29tcG9uZW50IGZyYW1lIHRoZSB1c2VyIGNhbiBjb3B5IGEgbmV3IHJlZmVyZW5jZSB0byAqLworICAgIHVpbnQ4ICAgKnZDaGFuOyAgICAgICAgICAgICAvKiBUaGUgViBjb21wb25lbnQgZnJhbWUgdGhlIHVzZXIgY2FuIGNvcHkgYSBuZXcgcmVmZXJlbmNlIHRvICovCisgICAgdWludDggICAqY3VycmVudFZvcDsgICAgICAgIC8qIFRoZSBWb3AgZm9yIHZpZGVvIHRoZSB1c2VyIGNhbiBjb3B5IGEgbmV3IHJlZmVyZW5jZSB0byAqLworfSBWaWRlb1JlZkNvcHlJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCB0YWdWaWRlb1JlZkNvcHlJbmZvRGF0YQoreworICAgIGludDE2ICAgd2lkdGg7ICAgICAgICAgICAgICAvKiBXaWR0aCAqLworICAgIGludDE2ICAgaGVpZ2h0OyAgICAgICAgICAgICAvKiBIZWlnaHQgKi8KKyAgICBpbnQxNiAgIHJlYWxXaWR0aDsgICAgICAgICAgLyogTm9uLXBhZGRlZCB3aWR0aCwgbm90IGEgbXVsdGlwbGUgb2YgMTYuICovCisgICAgaW50MTYgICByZWFsSGVpZ2h0OyAgICAgICAgIC8qIE5vbi1wYWRkZWQgaGVpZ2h0LCBub3QgYSBtdWx0aXBsZSBvZiAxNi4gKi8KK30gVmlkZW9SZWZDb3B5SW5mb0RhdGE7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1ZpZGVvUmVmQ29weUluZm8KK3sKKyAgICBWaWRlb1JlZkNvcHlJbmZvRGF0YSBkYXRhOworICAgIFZpZGVvUmVmQ29weUluZm9QdHIgcHRyczsKK30gVmlkZW9SZWZDb3B5SW5mbzsKKworLypAfSovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWSW5pdFZpZGVvRGVjb2RlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqdm9sYnVmW10sIGludDMyICp2b2xidWZfc2l6ZSwgaW50IG5MYXllcnMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgTVA0RGVjb2RpbmdNb2RlIG1vZGUpOworICAgIEJvb2wgICAgUFZBbGxvY1ZpZGVvRGF0YShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuTGF5ZXJzKTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7CisgICAgQm9vbCAgICBQVlJlc2V0VmlkZW9EZWNvZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOworICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWU2V0UmVmZXJlbmNlWVVWKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYpOworICAgIEJvb2wgICAgUFZEZWNTZXRSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgdWludDMyIHRpbWVzdGFtcCk7CisgICAgQm9vbCAgICBQVkRlY1NldEVuaFJlZmVyZW5jZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWLCB1aW50MzIgdGltZXN0YW1wKTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkRlY29kZVZpZGVvRnJhbWUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKmJpdHN0cmVhbVtdLCB1aW50MzIgKnRpbWVzdGFtcCwgaW50MzIgKmJ1ZmZlcl9zaXplLCB1aW50IHVzZV9leHRfdGltZXN0YW1wW10sIHVpbnQ4KiBjdXJyWVVWKTsKKyAgICBCb29sICAgIFBWRGVjb2RlVm9wSGVhZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpidWZmZXJbXSwgdWludDMyIHRpbWVzdGFtcFtdLCBpbnQzMiBidWZmZXJfc2l6ZVtdLCBWb3BIZWFkZXJJbmZvICpoZWFkZXJfaW5mbywgdWludCB1c2VfZXh0X3RpbWVzdGFtcFtdLCB1aW50OCAqY3VycllVVik7CisgICAgQm9vbCAgICBQVkRlY29kZVZvcEJvZHkoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50MzIgYnVmZmVyX3NpemVbXSk7CisgICAgdm9pZCAgICBQVkRlY1Bvc3RQcm9jZXNzKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpvdXRwdXRZVVYpOworICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyICpkaXNwbGF5X3dpZHRoLCBpbnQzMiAqZGlzcGxheV9oZWlnaHQpOworICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQzMiAqYnVmX3dpZHRoLCBpbnQzMiAqYnVmX2hlaWdodCk7CisgICAgT1NDTF9JTVBPUlRfUkVGIHZvaWQgICAgUFZTZXRQb3N0UHJvY1R5cGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50IG1vZGUpOworICAgIHVpbnQzMiAgUFZHZXRWaWRlb1RpbWVTdGFtcChWaWRlb0RlY0NvbnRyb2xzICpkZWNvZGVyQ29udHJvbCk7CisgICAgaW50ICAgICBQVkdldERlY0JpdHJhdGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7CisgICAgaW50ICAgICBQVkdldERlY0ZyYW1lcmF0ZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKKyAgICB1aW50OCAgICpQVkdldERlY091dHB1dEZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOworICAgIGludCAgICAgUFZHZXRMYXllcklEKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOworICAgIGludDMyICAgUFZHZXREZWNNZW1vcnlVc2FnZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgTVA0RGVjb2RpbmdNb2RlIFBWR2V0RGVjQml0c3RyZWFtTW9kZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKKyAgICBCb29sICAgIFBWRXh0cmFjdFZvbEhlYWRlcih1aW50OCAqdmlkZW9fYnVmZmVyLCB1aW50OCAqdm9sX2hlYWRlciwgaW50MzIgKnZvbF9oZWFkZXJfc2l6ZSk7CisgICAgaW50MzIgICBQVkxvY2F0ZUZyYW1lSGVhZGVyKHVpbnQ4ICp2aWRlb19idWZmZXIsIGludDMyIHZvcF9zaXplKTsKKyAgICBpbnQzMiAgIFBWTG9jYXRlSDI2M0ZyYW1lSGVhZGVyKHVpbnQ4ICp2aWRlb19idWZmZXIsIGludDMyIHZvcF9zaXplKTsKKyAgICBCb29sICAgIFBWR2V0Vm9sSW5mbyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBWb2xJbmZvICpwVm9sSW5mbyk7IC8vIEJYIDYvMjQvMDQKKyAgICBCb29sICAgIElzSW50cmFGcmFtZShWaWRlb0RlY0NvbnRyb2xzICpkZWNvZGVyQ29udHJvbCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogX01QNERFQ19BUElfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL3Zpc3VhbF9oZWFkZXIuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS92aXN1YWxfaGVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS92aXN1YWxfaGVhZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS92aXN1YWxfaGVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9iaXRzdHJlYW0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9iaXRzdHJlYW0uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9iaXRzdHJlYW0uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9iaXRzdHJlYW0uaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9iaXRzdHJlYW0uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYml0c3RyZWFtLmgKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3MDhlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCkBAIC0wLDAgKzEsOTE0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKKworIElucHV0czoKKyAgICBbaW5wdXRfdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IHRvIG1vZHVsZSwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKKyAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHN0b3JlLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbbG9jYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBidWZmZXIsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbbG9jYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBwb2ludGVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKyBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgorICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBzdG9yZSwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorICAgIFtnbG9iYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgYnVmZmVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisgICAgW2dsb2JhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBwb2ludGVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorCisgT3V0cHV0czoKKyAgICBbcmV0dXJuX3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIGRhdGEvcG9pbnRlciByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgYnkgbW9kdWxlLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KKworIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgorICAgIFt2YXJpYWJsZV9iZnJfcHRyXSBwb2ludHMgdG8gdGhlIFtkZXNjcmliZSB3aGVyZSB0aGUKKyAgICAgIHZhcmlhYmxlX2Jmcl9wdHIgcG9pbnRzIHRvLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCisgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbdmFyaWFibGVfYmZyXSBjb250ZW50cyBhcmUgW2Rlc2NyaWJlIHRoZSBuZXcgY29udGVudHMgb2YKKyAgICAgIHZhcmlhYmxlX2Jmcl0KKworIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKKyAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6CisgICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gREVTQ1JJUFRJT04KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVRVUlSRU1FTlRTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFRkVSRU5DRVMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUFNFVURPLUNPREUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVTT1VSQ0VTIFVTRUQKKyAgIFdoZW4gdGhlIGNvZGUgaXMgd3JpdHRlbiBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yIHRoZQorICAgICB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCisKKyBTVEFDSyBVU0FHRTogW3N0YWNrIGNvdW50IGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUgdG8gcmVwcmVzZW50CisgICAgICAgICAgc3RhY2sgdXNhZ2UgZm9yIGVhY2ggc3Vicm91dGluZSBjYWxsZWRdCisKKyAgICAgd2hlcmU6IFtzdGFjayB1c2FnZSB2YXJpYWJsZV0gPSBzdGFjayB1c2FnZSBmb3IgW3N1YnJvdXRpbmUKKyAgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCisKKyBEQVRBIE1FTU9SWSBVU0VEOiB4IHdvcmRzCisKKyBQUk9HUkFNIE1FTU9SWSBVU0VEOiB4IHdvcmRzCisKKyBDTE9DSyBDWUNMRVM6IFtjeWNsZSBjb3VudCBlcXVhdGlvbiBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlCisgICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKKyAgICAgICAgICAgY2FsbGVkXQorCisgICAgIHdoZXJlOiBbY3ljbGUgY291bnQgdmFyaWFibGVdID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCisgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IElOQ0xVREVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJtcDRkZWNfbGliLmgiCisjaW5jbHVkZSAiaWRjdC5oIgorI2luY2x1ZGUgIm1vdGlvbl9jb21wLmgiCisKKyNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09OVl9QT1NTSUJMRV9MT1NTX09GX0RBVEEKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNQUNST1MKKzsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBERUZJTkVTCis7IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCis7IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCis7IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBwcml2YXRlIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGlkY3Ryb3coaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCk7CitzdGF0aWMgdm9pZCBpZGN0cm93X2ludHJhKGludDE2ICpibGssIFBJWEVMICosIGludCB3aWR0aCk7CitzdGF0aWMgdm9pZCBpZGN0Y29sKGludDE2ICpibGspOworCisjaWZkZWYgRkFTVF9JRENUCisvLyBtYXBwaW5nIGZyb20gbnpfY29lZnMgdG8gZnVuY3Rpb25zIHRvIGJlIHVzZWQKKworCisvLyBBUk00IGRvZXMgbm90IGFsbG93IGdsb2JhbCBkYXRhIHdoZW4gdGhleSBhcmUgbm90IGNvbnN0YW50IGhlbmNlCisvLyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBjYW5ub3QgYmUgY29uc2lkZXJlZCBhcyBhcnJheSBvZiBjb25zdGFudHMKKy8vIChhY3R1YWwgYWRkcmVzc2VzIGFyZSBvbmx5IGtub3duIHdoZW4gdGhlIGRsbCBpcyBsb2FkZWQpLgorLy8gU28gaW5zdGVhZCBvZiBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMsIHdlJ2xsIHN0b3JlIGhlcmUKKy8vIGFycmF5cyBvZiByb3dzIG9yIGNvbHVtbnMgYW5kIHRoZW4gY2FsbCB0aGUgaWRjdCBmdW5jdGlvbgorLy8gY29ycmVzcG9uZGluZyB0byBzdWNoIHRoZSByb3cvY29sdW1uIG51bWJlcjoKKworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Rjb2xWQ0FbMTBdWzRdKShpbnQxNiopID0KK3sKKyAgICB7JmlkY3Rjb2wxLCAmaWRjdGNvbDAsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKKyAgICB7JmlkY3Rjb2wxLCAmaWRjdGNvbDEsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKKyAgICB7JmlkY3Rjb2wyLCAmaWRjdGNvbDEsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKKyAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDEsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKKyAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKKyAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMSwgJmlkY3Rjb2wwfSwKKyAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMSwgJmlkY3Rjb2wxfSwKKyAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMiwgJmlkY3Rjb2wxfSwKKyAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDMsICZpZGN0Y29sMiwgJmlkY3Rjb2wxfSwKKyAgICB7JmlkY3Rjb2w0LCAmaWRjdGNvbDMsICZpZGN0Y29sMiwgJmlkY3Rjb2wxfQorfTsKKworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0FbMTBdKShpbnQxNiosIHVpbnQ4KiwgdWludDgqLCBpbnQpID0KK3sKKyAgICAmaWRjdHJvdzEsCisgICAgJmlkY3Ryb3cyLAorICAgICZpZGN0cm93MiwKKyAgICAmaWRjdHJvdzIsCisgICAgJmlkY3Ryb3cyLAorICAgICZpZGN0cm93MywKKyAgICAmaWRjdHJvdzQsCisgICAgJmlkY3Ryb3c0LAorICAgICZpZGN0cm93NCwKKyAgICAmaWRjdHJvdzQKK307CisKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0Y29sVkNBMlsxNl0pKGludDE2KikgPQoreworICAgICZpZGN0Y29sMCwgJmlkY3Rjb2w0LCAmaWRjdGNvbDMsICZpZGN0Y29sNCwKKyAgICAmaWRjdGNvbDIsICZpZGN0Y29sNCwgJmlkY3Rjb2wzLCAmaWRjdGNvbDQsCisgICAgJmlkY3Rjb2wxLCAmaWRjdGNvbDQsICZpZGN0Y29sMywgJmlkY3Rjb2w0LAorICAgICZpZGN0Y29sMiwgJmlkY3Rjb2w0LCAmaWRjdGNvbDMsICZpZGN0Y29sNAorfTsKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBMls4XSkoaW50MTYqLCB1aW50OCosIHVpbnQ4KiwgaW50KSA9Cit7CisgICAgJmlkY3Ryb3cxLCAmaWRjdHJvdzQsICZpZGN0cm93MywgJmlkY3Ryb3c0LAorICAgICZpZGN0cm93MiwgJmlkY3Ryb3c0LCAmaWRjdHJvdzMsICZpZGN0cm93NAorfTsKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBX2ludHJhWzEwXSkoaW50MTYqLCBQSVhFTCAqLCBpbnQpID0KK3sKKyAgICAmaWRjdHJvdzFfaW50cmEsCisgICAgJmlkY3Ryb3cyX2ludHJhLAorICAgICZpZGN0cm93Ml9pbnRyYSwKKyAgICAmaWRjdHJvdzJfaW50cmEsCisgICAgJmlkY3Ryb3cyX2ludHJhLAorICAgICZpZGN0cm93M19pbnRyYSwKKyAgICAmaWRjdHJvdzRfaW50cmEsCisgICAgJmlkY3Ryb3c0X2ludHJhLAorICAgICZpZGN0cm93NF9pbnRyYSwKKyAgICAmaWRjdHJvdzRfaW50cmEKK307CisKK3N0YXRpYyB2b2lkICgqY29uc3QgaWRjdHJvd1ZDQTJfaW50cmFbOF0pKGludDE2KiwgUElYRUwgKiwgaW50KSA9Cit7CisgICAgJmlkY3Ryb3cxX2ludHJhLCAmaWRjdHJvdzRfaW50cmEsICZpZGN0cm93M19pbnRyYSwgJmlkY3Ryb3c0X2ludHJhLAorICAgICZpZGN0cm93Ml9pbnRyYSwgJmlkY3Ryb3c0X2ludHJhLCAmaWRjdHJvdzNfaW50cmEsICZpZGN0cm93NF9pbnRyYQorfTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKKzsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCis7IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCis7IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBNQmxvY2tJRENUKFZpZGVvRGVjRGF0YSAqdmlkZW8pCit7CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgTWFjcm9CbG9jayAqbWJsb2NrID0gdmlkZW8tPm1ibG9jazsKKyAgICBQSVhFTCAqY19jb21wOworICAgIFBJWEVMICpjdV9jb21wOworICAgIFBJWEVMICpjdl9jb21wOworICAgIGludCB4X3BvcyA9IHZpZGVvLT5tYm51bV9jb2w7CisgICAgaW50IHlfcG9zID0gdmlkZW8tPm1ibnVtX3JvdzsKKyAgICBpbnQgd2lkdGgsIHdpZHRoX3V2OworICAgIGludDMyIG9mZnNldDsKKyAgICB3aWR0aCA9IHZpZGVvLT53aWR0aDsKKyAgICB3aWR0aF91diA9IHdpZHRoID4+IDE7CisgICAgb2Zmc2V0ID0gKGludDMyKSh5X3BvcyA8PCA0KSAqIHdpZHRoICsgKHhfcG9zIDw8IDQpOworCisgICAgY19jb21wICA9IGN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OworICAgIGN1X2NvbXAgPSBjdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMik7CisgICAgY3ZfY29tcCA9IGN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKTsKKworICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGNfY29tcCwgMCwgd2lkdGgpOworICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGNfY29tcCArIDgsIDEsIHdpZHRoKTsKKyAgICBCbG9ja0lEQ1RfaW50cmEobWJsb2NrLCBjX2NvbXAgKyAod2lkdGggPDwgMyksIDIsIHdpZHRoKTsKKyAgICBCbG9ja0lEQ1RfaW50cmEobWJsb2NrLCBjX2NvbXAgKyAod2lkdGggPDwgMykgKyA4LCAzLCB3aWR0aCk7CisgICAgQmxvY2tJRENUX2ludHJhKG1ibG9jaywgY3VfY29tcCwgNCwgd2lkdGhfdXYpOworICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGN2X2NvbXAsIDUsIHdpZHRoX3V2KTsKK30KKworCit2b2lkIEJsb2NrSURDVF9pbnRyYSgKKyAgICBNYWNyb0Jsb2NrICptYmxvY2ssIFBJWEVMICpjX2NvbXAsIGludCBjb21wLCBpbnQgd2lkdGgpCit7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGludDE2ICpjb2VmZl9pbiA9IG1ibG9jay0+YmxvY2tbY29tcF07CisjaWZkZWYgSU5URUdFUl9JRENUCisjaWZkZWYgRkFTVF9JRENUICAvKiBWQ0EgSURDVCB1c2luZyBuemNvZWZzIGFuZCBiaXRtYXBzKi8KKyAgICBpbnQgaSwgYm1hcHI7CisgICAgaW50IG56X2NvZWZzID0gbWJsb2NrLT5ub19jb2VmZltjb21wXTsKKyAgICB1aW50OCAqYml0bWFwY29sID0gbWJsb2NrLT5iaXRtYXBjb2xbY29tcF07CisgICAgdWludDggYml0bWFwcm93ID0gbWJsb2NrLT5iaXRtYXByb3dbY29tcF07CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChuel9jb2VmcyA8PSAxMCkKKyAgICB7CisgICAgICAgIGJtYXByID0gKG56X2NvZWZzIC0gMSk7CisKKyAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl0pKShjb2VmZl9pbik7CisgICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdWzFdKSkoY29lZmZfaW4gKyAxKTsKKyAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl1bMl0pKShjb2VmZl9pbiArIDIpOworICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXVszXSkpKGNvZWZmX2luICsgMyk7CisKKyAgICAgICAgKCppZGN0cm93VkNBX2ludHJhW256X2NvZWZzLTFdKShjb2VmZl9pbiwgY19jb21wLCB3aWR0aCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGkgPSA4OworICAgICAgICB3aGlsZSAoaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBibWFwciA9IChpbnQpYml0bWFwY29sW2ldOworICAgICAgICAgICAgaWYgKGJtYXByKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYm1hcHImMHhmKSA9PSAwKSAgICAgICAgIC8qICAwNy8xOC8wMSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKCooaWRjdGNvbFZDQTJbYm1hcHI+PjRdKSkoY29lZmZfaW4gKyBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWRjdGNvbChjb2VmZl9pbiArIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGJpdG1hcGNvbFs0XSB8IGJpdG1hcGNvbFs1XSB8IGJpdG1hcGNvbFs2XSB8IGJpdG1hcGNvbFs3XSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYml0bWFwcm93ID4+PSA0OworICAgICAgICAgICAgKCooaWRjdHJvd1ZDQTJfaW50cmFbKGludCliaXRtYXByb3ddKSkoY29lZmZfaW4sIGNfY29tcCwgd2lkdGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWRjdHJvd19pbnRyYShjb2VmZl9pbiwgY19jb21wLCB3aWR0aCk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHZvaWQgaWRjdF9pbnRyYShpbnQgKmJsb2NrLCB1aW50OCAqY29tcCwgaW50IHdpZHRoKTsKKyAgICBpZGN0X2ludHJhKGNvZWZmX2luLCBjX2NvbXAsIHdpZHRoKTsKKyNlbmRpZgorI2Vsc2UKKyAgICB2b2lkIGlkY3RyZWZfaW50cmEoaW50ICpibG9jaywgdWludDggKmNvbXAsIGludCB3aWR0aCk7CisgICAgaWRjdHJlZl9pbnRyYShjb2VmZl9pbiwgY19jb21wLCB3aWR0aCk7CisjZW5kaWYKKworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHJldHVybjsKK30KKworLyogIDA4LzA0LzA1LCBubyByZXNpZHVlLCBqdXN0IGNvcHkgZnJvbSBwcmVkIHRvIG91dHB1dCAqLwordm9pZCBDb3B5X0Jsa190b19Wb3AodWludDggKmRzdCwgdWludDggKnByZWQsIGludCB3aWR0aCkKK3sKKyAgICAvKiBjb3B5IDQgYnl0ZXMgYXQgYSB0aW1lICovCisgICAgd2lkdGggLT0gNDsKKyAgICAqKCh1aW50MzIqKWRzdCkgPSAqKCh1aW50MzIqKXByZWQpOworICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7CisgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7CisgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOworICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOworICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7CisgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7CisgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOworICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOworICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7CisKKyAgICByZXR1cm4gOworfQorCisvKiAgMDgvMDQvMDUgY29tcHV0ZSBJRENUIGFuZCBhZGQgcHJlZGljdGlvbiBhdCB0aGUgZW5kICAqLwordm9pZCBCbG9ja0lEQ1QoCisgICAgdWludDggKmRzdCwgIC8qIGRlc3RpbmF0aW9uICovCisgICAgdWludDggKnByZWQsIC8qIHByZWRpY3Rpb24gYmxvY2ssIHBpdGNoIDE2ICovCisgICAgaW50MTYgICAqY29lZmZfaW4sICAvKiBEQ1QgZGF0YSwgc2l6ZSA2NCAqLworICAgIGludCB3aWR0aCwgLyogd2lkdGggb2YgZHN0ICovCisgICAgaW50IG56X2NvZWZzLAorICAgIHVpbnQ4ICpiaXRtYXBjb2wsCisgICAgdWludDggYml0bWFwcm93CispCit7CisjaWZkZWYgSU5URUdFUl9JRENUCisjaWZkZWYgRkFTVF9JRENUICAvKiBWQ0EgSURDVCB1c2luZyBuemNvZWZzIGFuZCBiaXRtYXBzKi8KKyAgICBpbnQgaSwgYm1hcHI7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAobnpfY29lZnMgPD0gMTApCisgICAgeworICAgICAgICBibWFwciA9IChuel9jb2VmcyAtIDEpOworICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXSkpKGNvZWZmX2luKTsKKyAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl1bMV0pKShjb2VmZl9pbiArIDEpOworICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXVsyXSkpKGNvZWZmX2luICsgMik7CisgICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdWzNdKSkoY29lZmZfaW4gKyAzKTsKKworICAgICAgICAoKmlkY3Ryb3dWQ0FbbnpfY29lZnMtMV0pKGNvZWZmX2luLCBwcmVkLCBkc3QsIHdpZHRoKTsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaSA9IDg7CisKKyAgICAgICAgd2hpbGUgKGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgYm1hcHIgPSAoaW50KWJpdG1hcGNvbFtpXTsKKyAgICAgICAgICAgIGlmIChibWFwcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJtYXByJjB4ZikgPT0gMCkgICAgICAgICAvKiAgMDcvMTgvMDEgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICgqKGlkY3Rjb2xWQ0EyW2JtYXByPj40XSkpKGNvZWZmX2luICsgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlkY3Rjb2woY29lZmZfaW4gKyBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChiaXRtYXBjb2xbNF0gfCBiaXRtYXBjb2xbNV0gfCBiaXRtYXBjb2xbNl0gfCBiaXRtYXBjb2xbN10pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICgqKGlkY3Ryb3dWQ0EyW2JpdG1hcHJvdz4+NF0pKShjb2VmZl9pbiwgcHJlZCwgZHN0LCB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZGN0cm93KGNvZWZmX2luLCBwcmVkLCBkc3QsIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyNlbHNlIC8vIEZBU1RfSURDVAorICAgIHZvaWQgaWRjdChpbnQgKmJsb2NrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKTsKKyAgICBpZGN0KGNvZWZmX2luLCBwcmVkLCBkc3QsIHdpZHRoKTsKKyAgICByZXR1cm47CisjZW5kaWYgLy8gRkFTVF9JRENUCisjZWxzZSAvLyBJTlRFR0VSX0lEQ1QKKyAgICB2b2lkIGlkY3RyZWYoaW50ICpibG9jaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCk7CisgICAgaWRjdHJlZihjb2VmZl9pbiwgcHJlZCwgZHN0LCB3aWR0aCk7CisgICAgcmV0dXJuOworI2VuZGlmIC8vIElOVEVHRVJfSURDVAorCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgIEVuZCBGdW5jdGlvbjogYmxvY2tfaWRjdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBOQU1FOiBpZGN0cm93CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TIEZPUiBpZGN0cm93CisKKyBJbnB1dHM6CisgICAgW2lucHV0X3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBpbnB1dCB0byBtb2R1bGUsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKyBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6CisgICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBzdG9yZSwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisgICAgW2xvY2FsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgYnVmZmVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisgICAgW2xvY2FsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgcG9pbnRlciwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorCisgR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKKyAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgc3RvcmUsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbZ2xvYmFsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIGJ1ZmZlciwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorICAgIFtnbG9iYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgcG9pbnRlciwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIE91dHB1dHM6CisgICAgW3JldHVybl92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiBkYXRhL3BvaW50ZXIgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICAgIGJ5IG1vZHVsZSwgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAorICAgICAgICAgICAgICAgICAgKHdoZW4gYXBwbGljYWJsZSldCisKKyBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKKyAgICBbdmFyaWFibGVfYmZyX3B0cl0gcG9pbnRzIHRvIHRoZSBbZGVzY3JpYmUgd2hlcmUgdGhlCisgICAgICB2YXJpYWJsZV9iZnJfcHRyIHBvaW50cyB0bywgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAorICAgICAgKHdoZW4gYXBwbGljYWJsZSldCisgICAgW3ZhcmlhYmxlX2Jmcl0gY29udGVudHMgYXJlIFtkZXNjcmliZSB0aGUgbmV3IGNvbnRlbnRzIG9mCisgICAgICB2YXJpYWJsZV9iZnJdCisKKyBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6CisgICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKyBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgorICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIERFU0NSSVBUSU9OIEZPUiBpZGN0cm93CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFUVVJUkVNRU5UUyBGT1IgaWRjdHJvdworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRUZFUkVOQ0VTIEZPUiBpZGN0cm93CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFBTRVVETy1DT0RFIEZPUiBpZGN0cm93CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFU09VUkNFUyBVU0VEIEZPUiBpZGN0cm93CisgICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKKyAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgorCisgU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAorICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQorCisgICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCisgICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQorCisgREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcworCisgUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcworCisgQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQorICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCisgICAgICAgICAgIGNhbGxlZF0KKworICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQorICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGdW5jdGlvbiBDb2RlIEZPUiBpZGN0cm93CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdHJvdygKKyAgICBpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoCispCit7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIHJvdyAoaG9yaXpvbnRhbCkgSURDVAorICAgICoKKyAgICAqIDcgICAgICAgICAgICAgICAgICAgICAgIHBpICAgICAgICAgMSBkc3Rba10gPSBzdW0gY1tsXSAqIHNyY1tsXSAqIGNvcyggLS0gKgorICAgICogKCBrICsgLSApICogbCApIGw9MCAgICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgIDIKKyAgICAqCisgICAgKiB3aGVyZTogY1swXSAgICA9IDEyOCBjWzEuLjddID0gMTI4KnNxcnQoMikgKi8KKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICB3aWR0aCAtPSA0OworICAgIGRzdCAtPSB3aWR0aDsKKyAgICBwcmVkIC09IDEyOworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgxID0gKGludDMyKWJsa1sxMl0gPDwgODsKKyAgICAgICAgYmxrWzEyXSA9IDA7CisgICAgICAgIHgyID0gYmxrWzE0XTsKKyAgICAgICAgYmxrWzE0XSA9IDA7CisgICAgICAgIHgzID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHg0ID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4NSA9IGJsa1sxNV07CisgICAgICAgIGJsa1sxNV0gPSAwOworICAgICAgICB4NiA9IGJsa1sxM107CisgICAgICAgIGJsa1sxM10gPSAwOworICAgICAgICB4NyA9IGJsa1sxMV07CisgICAgICAgIGJsa1sxMV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgYmxrWzBdID0gMDsgICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgICAgICB4OCA9IFc3ICogKHg0ICsgeDUpICsgNDsKKyAgICAgICAgeDQgPSAoeDggKyAoVzEgLSBXNykgKiB4NCkgPj4gMzsKKyAgICAgICAgeDUgPSAoeDggLSAoVzEgKyBXNykgKiB4NSkgPj4gMzsKKyAgICAgICAgeDggPSBXMyAqICh4NiArIHg3KSArIDQ7CisgICAgICAgIHg2ID0gKHg4IC0gKFczIC0gVzUpICogeDYpID4+IDM7CisgICAgICAgIHg3ID0gKHg4IC0gKFczICsgVzUpICogeDcpID4+IDM7CisKKyAgICAgICAgLyogc2Vjb25kIHN0YWdlICovCisgICAgICAgIHg4ID0geDAgKyB4MTsKKyAgICAgICAgeDAgLT0geDE7CisgICAgICAgIHgxID0gVzYgKiAoeDMgKyB4MikgKyA0OworICAgICAgICB4MiA9ICh4MSAtIChXMiArIFc2KSAqIHgyKSA+PiAzOworICAgICAgICB4MyA9ICh4MSArIChXMiAtIFc2KSAqIHgzKSA+PiAzOworICAgICAgICB4MSA9IHg0ICsgeDY7CisgICAgICAgIHg0IC09IHg2OworICAgICAgICB4NiA9IHg1ICsgeDc7CisgICAgICAgIHg1IC09IHg3OworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHg3ID0geDggKyB4MzsKKyAgICAgICAgeDggLT0geDM7CisgICAgICAgIHgzID0geDAgKyB4MjsKKyAgICAgICAgeDAgLT0geDI7CisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDQgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKworICAgICAgICByZXMgPSAoeDcgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4MyArIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHgwICsgeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDggKyB4NikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworCisgICAgICAgIHJlcyA9ICh4OCAtIHg2KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHgwIC0geDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDMgLSB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4NyAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICByZXR1cm47Cit9CisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdHJvd19pbnRyYSgKKyAgICBpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoCispCit7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHRlbXA7CisgICAgaW50IGkgPSA4OworICAgIGludCBvZmZzZXQgPSB3aWR0aDsKKyAgICBpbnQzMiB3b3JkOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiByb3cgKGhvcml6b250YWwpIElEQ1QKKyAgICAqCisgICAgKiA3ICAgICAgICAgICAgICAgICAgICAgICBwaSAgICAgICAgIDEgZHN0W2tdID0gc3VtIGNbbF0gKiBzcmNbbF0gKiBjb3MoIC0tICoKKyAgICAqICggayArIC0gKSAqIGwgKSBsPTAgICAgICAgICAgICAgICAgICAgICAgOCAgICAgICAgICAyCisgICAgKgorICAgICogd2hlcmU6IGNbMF0gICAgPSAxMjggY1sxLi43XSA9IDEyOCpzcXJ0KDIpICovCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgxID0gKGludDMyKWJsa1s0XSA8PCA4OworICAgICAgICBibGtbNF0gPSAwOworICAgICAgICB4MiA9IGJsa1s2XTsKKyAgICAgICAgYmxrWzZdID0gMDsKKyAgICAgICAgeDMgPSBibGtbMl07CisgICAgICAgIGJsa1syXSA9IDA7CisgICAgICAgIHg0ID0gYmxrWzFdOworICAgICAgICBibGtbMV0gPSAwOworICAgICAgICB4NSA9IGJsa1s3XTsKKyAgICAgICAgYmxrWzddID0gMDsKKyAgICAgICAgeDYgPSBibGtbNV07CisgICAgICAgIGJsa1s1XSA9IDA7CisgICAgICAgIHg3ID0gYmxrWzNdOworICAgICAgICBibGtbM10gPSAwOworI2lmbmRlZiBGQVNUX0lEQ1QKKyAgICAgICAgLyogc2hvcnRjdXQgKi8gIC8qIGNvdmVyZWQgYnkgaWRjdHJvdzEgIDAxLzkvMjAwMSAqLworICAgICAgICBpZiAoISh4MSB8IHgyIHwgeDMgfCB4NCB8IHg1IHwgeDYgfCB4NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJsa1swXSA9IGJsa1sxXSA9IGJsa1syXSA9IGJsa1szXSA9IGJsa1s0XSA9IGJsa1s1XSA9IGJsa1s2XSA9IGJsa1s3XSA9IChibGtbMF0gKyAzMikgPj4gNjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgOCkgKyA4MTkyOworICAgICAgICBibGtbMF0gPSAwOyAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDggPSBXNyAqICh4NCArIHg1KSArIDQ7CisgICAgICAgIHg0ID0gKHg4ICsgKFcxIC0gVzcpICogeDQpID4+IDM7CisgICAgICAgIHg1ID0gKHg4IC0gKFcxICsgVzcpICogeDUpID4+IDM7CisgICAgICAgIHg4ID0gVzMgKiAoeDYgKyB4NykgKyA0OworICAgICAgICB4NiA9ICh4OCAtIChXMyAtIFc1KSAqIHg2KSA+PiAzOworICAgICAgICB4NyA9ICh4OCAtIChXMyArIFc1KSAqIHg3KSA+PiAzOworCisgICAgICAgIC8qIHNlY29uZCBzdGFnZSAqLworICAgICAgICB4OCA9IHgwICsgeDE7CisgICAgICAgIHgwIC09IHgxOworICAgICAgICB4MSA9IFc2ICogKHgzICsgeDIpICsgNDsKKyAgICAgICAgeDIgPSAoeDEgLSAoVzIgKyBXNikgKiB4MikgPj4gMzsKKyAgICAgICAgeDMgPSAoeDEgKyAoVzIgLSBXNikgKiB4MykgPj4gMzsKKyAgICAgICAgeDEgPSB4NCArIHg2OworICAgICAgICB4NCAtPSB4NjsKKyAgICAgICAgeDYgPSB4NSArIHg3OworICAgICAgICB4NSAtPSB4NzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4NyA9IHg4ICsgeDM7CisgICAgICAgIHg4IC09IHgzOworICAgICAgICB4MyA9IHgwICsgeDI7CisgICAgICAgIHgwIC09IHgyOworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHg0ID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgd29yZCA9ICgoeDcgKyB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh3b3JkKQorCisgICAgICAgIHRlbXAgPSAoKHgzICsgeDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKKworICAgICAgICB0ZW1wID0gKCh4MCArIHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMTYpOworCisgICAgICAgIHRlbXAgPSAoKHg4ICsgeDYpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAyNCk7CisgICAgICAgICooKGludDMyKikoY29tcCkpID0gd29yZDsKKworICAgICAgICB3b3JkID0gKCh4OCAtIHg2KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCisKKyAgICAgICAgdGVtcCA9ICgoeDAgLSB4NCkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOworCisgICAgICAgIHRlbXAgPSAoKHgzIC0geDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7CisKKyAgICAgICAgdGVtcCA9ICgoeDcgLSB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKKyAgICAgICAgKigoaW50MzIqKShjb21wICsgNCkpID0gd29yZDsKKyAgICAgICAgY29tcCArPSBvZmZzZXQ7CisKKyAgICAgICAgYmxrICs9IEJfU0laRTsKKyAgICB9CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVuZCBGdW5jdGlvbjogaWRjdHJvdworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBOQU1FOiBpZGN0Y29sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TIEZPUiBpZGN0Y29sCisKKyBJbnB1dHM6CisgICAgW2lucHV0X3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBpbnB1dCB0byBtb2R1bGUsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKyBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6CisgICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBzdG9yZSwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisgICAgW2xvY2FsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgYnVmZmVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisgICAgW2xvY2FsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgcG9pbnRlciwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorCisgR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKKyAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgc3RvcmUsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbZ2xvYmFsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIGJ1ZmZlciwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorICAgIFtnbG9iYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgcG9pbnRlciwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIE91dHB1dHM6CisgICAgW3JldHVybl92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiBkYXRhL3BvaW50ZXIgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICAgIGJ5IG1vZHVsZSwgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAorICAgICAgICAgICAgICAgICAgKHdoZW4gYXBwbGljYWJsZSldCisKKyBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKKyAgICBbdmFyaWFibGVfYmZyX3B0cl0gcG9pbnRzIHRvIHRoZSBbZGVzY3JpYmUgd2hlcmUgdGhlCisgICAgICB2YXJpYWJsZV9iZnJfcHRyIHBvaW50cyB0bywgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAorICAgICAgKHdoZW4gYXBwbGljYWJsZSldCisgICAgW3ZhcmlhYmxlX2Jmcl0gY29udGVudHMgYXJlIFtkZXNjcmliZSB0aGUgbmV3IGNvbnRlbnRzIG9mCisgICAgICB2YXJpYWJsZV9iZnJdCisKKyBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6CisgICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKyBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgorICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIERFU0NSSVBUSU9OIEZPUiBpZGN0Y29sCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFUVVJUkVNRU5UUyBGT1IgaWRjdGNvbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRUZFUkVOQ0VTIEZPUiBpZGN0Y29sCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFBTRVVETy1DT0RFIEZPUiBpZGN0Y29sCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFU09VUkNFUyBVU0VEIEZPUiBpZGN0Y29sCisgICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKKyAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgorCisgU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAorICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQorCisgICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCisgICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQorCisgREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcworCisgUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcworCisgQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQorICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCisgICAgICAgICAgIGNhbGxlZF0KKworICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQorICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGdW5jdGlvbiBDb2RlIEZPUiBpZGN0Y29sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdGNvbCgKKyAgICBpbnQxNiAqYmxrCispCit7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGNvbHVtbiAodmVydGljYWwpIElEQ1QKKyAgICAqCisgICAgKiA3ICAgICAgICAgICAgICAgICAgICAgICAgIHBpICAgICAgICAgMSBkc3RbOCprXSA9IHN1bSBjW2xdICogc3JjWzgqbF0gKgorICAgICogY29zKCAtLSAqICggayArIC0gKSAqIGwgKSBsPTAgICAgICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgIDIKKyAgICAqCisgICAgKiB3aGVyZTogY1swXSAgICA9IDEvMTAyNCBjWzEuLjddID0gKDEvMTAyNCkqc3FydCgyKSAqLworICAgIHgxID0gKGludDMyKWJsa1szMl0gPDwgMTE7CisgICAgeDIgPSBibGtbNDhdOworICAgIHgzID0gYmxrWzE2XTsKKyAgICB4NCA9IGJsa1s4XTsKKyAgICB4NSA9IGJsa1s1Nl07CisgICAgeDYgPSBibGtbNDBdOworICAgIHg3ID0gYmxrWzI0XTsKKyNpZm5kZWYgRkFTVF9JRENUCisgICAgLyogc2hvcnRjdXQgKi8gICAgICAgIC8qIGNvdmVyZWQgYnkgaWRjdGNvbHVtbjEgIDAxLzkvMjAwMSAqLworICAgIGlmICghKHgxIHwgeDIgfCB4MyB8IHg0IHwgeDUgfCB4NiB8IHg3KSkKKyAgICB7CisgICAgICAgIGJsa1swXSA9IGJsa1s4XSA9IGJsa1sxNl0gPSBibGtbMjRdID0gYmxrWzMyXSA9IGJsa1s0MF0gPSBibGtbNDhdID0gYmxrWzU2XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYmxrWzBdIDw8IDM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OworCisgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICB4OCA9IFc3ICogKHg0ICsgeDUpOworICAgIHg0ID0geDggKyAoVzEgLSBXNykgKiB4NDsKKyAgICB4NSA9IHg4IC0gKFcxICsgVzcpICogeDU7CisgICAgeDggPSBXMyAqICh4NiArIHg3KTsKKyAgICB4NiA9IHg4IC0gKFczIC0gVzUpICogeDY7CisgICAgeDcgPSB4OCAtIChXMyArIFc1KSAqIHg3OworCisgICAgLyogc2Vjb25kIHN0YWdlICovCisgICAgeDggPSB4MCArIHgxOworICAgIHgwIC09IHgxOworICAgIHgxID0gVzYgKiAoeDMgKyB4Mik7CisgICAgeDIgPSB4MSAtIChXMiArIFc2KSAqIHgyOworICAgIHgzID0geDEgKyAoVzIgLSBXNikgKiB4MzsKKyAgICB4MSA9IHg0ICsgeDY7CisgICAgeDQgLT0geDY7CisgICAgeDYgPSB4NSArIHg3OworICAgIHg1IC09IHg3OworCisgICAgLyogdGhpcmQgc3RhZ2UgKi8KKyAgICB4NyA9IHg4ICsgeDM7CisgICAgeDggLT0geDM7CisgICAgeDMgPSB4MCArIHgyOworICAgIHgwIC09IHgyOworICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICB4NCA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7CisKKyAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICBibGtbMF0gICAgPSAoeDcgKyB4MSkgPj4gODsKKyAgICBibGtbOF0gPSAoeDMgKyB4MikgPj4gODsKKyAgICBibGtbMTZdID0gKHgwICsgeDQpID4+IDg7CisgICAgYmxrWzI0XSA9ICh4OCArIHg2KSA+PiA4OworICAgIGJsa1szMl0gPSAoeDggLSB4NikgPj4gODsKKyAgICBibGtbNDBdID0gKHgwIC0geDQpID4+IDg7CisgICAgYmxrWzQ4XSA9ICh4MyAtIHgyKSA+PiA4OworICAgIGJsa1s1Nl0gPSAoeDcgLSB4MSkgPj4gODsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7ICBFbmQgRnVuY3Rpb246IGlkY3Rjb2wKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jYWxfZGNfc2NhbGVyLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NhbF9kY19zY2FsZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jYWxfZGNfc2NhbGVyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2FsX2RjX3NjYWxlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb21iaW5lZF9kZWNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyY2JlODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb21iaW5lZF9kZWNvZGUuY3BwCkBAIC0wLDAgKzEsNzQ0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGRlY19saWIuaCIgLyogdmlkZW8gZGVjb2RlciBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjaW5jbHVkZSAidmxjX2RlY29kZS5oIgorI2luY2x1ZGUgImJpdHN0cmVhbS5oIgorI2luY2x1ZGUgInNjYWxpbmcuaCIKKyNpbmNsdWRlICJtYnR5cGVfbW9kZS5oIgorCisjZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTkRJVElPTkFMX0lTX0NPTlNUQU5UCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IERlY29kZUZyYW1lQ29tYmluZWRNb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRGVjb2RlIGEgZnJhbWUgb2YgTVBFRzQgYml0c3RyZWFtIGluIGNvbWJpbmVkIG1vZGUuICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMDMvMzAvMjAwMCA6IENsZWFuZWQgdXAgYW5kIG9wdGltaXplZCB0aGUgY29kZS4gICAgICAgICAgICAgKi8KKy8qICAgICAgMDMvMzEvMjAwMCA6IEFkZGVkIHByb3BlciBoYW5kbGluZyBvZiBNQiBzdHVmZmluZy4gICAgICAgICAgKi8KKy8qICAgICAgMDQvMTMvMjAwMCA6IFJld3JvdGUgdGhpcyBjb21iaW5lZCBtb2RlIHBhdGggY29tcGxldGVseSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBoYW5kbGVzICJDb21iaW5lZCBNb2RlIFdpdGggRXJyb3IgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNpbGllbmNlLiIgIE5vdyB0aGUgY29kZSByZXNlbWJsZXMgdGhlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkbyBjb2RlcyBpbiBNUEVHLTQgc3RhbmRhcmQgYmV0dGVyLiAgICAgICAgKi8KKy8qICAgICAgMTAvMTMvMjAwMCA6IEFkZCBmYXN0IFZMQytkZXF1YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMDQvMTMvMjAwMSA6IGZpeCBNQl9zdHVmZmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwOC8wNy8yMDAxIDogcmVtb3ZlIE1CemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRGVjb2RlRnJhbWVDb21iaW5lZE1vZGUoVmlkZW9EZWNEYXRhICp2aWRlbykKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIGludCBtYm51bTsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKKyAgICBpbnQgc2hvcnRWaWRlb0hlYWRlciA9IHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyOworICAgIGludDE2IFFQLCAqUVBNQiA9IHZpZGVvLT5RUE1COworICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKKyAgICBpbnQgblRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7CisgICAgaW50IG5NQlBlclJvdyA9IHZpZGVvLT5uTUJQZXJSb3c7CisgICAgaW50IHNsaWNlX2NvdW50ZXI7CisgICAgdWludDMyIHRtcHZhciwgbG9uZ196ZXJvX2JpdHM7CisgICAgdWludCBjb2RlOworICAgIGludCB2YWxpZF9zdHVmZmluZzsKKyAgICBpbnQgcmVzeW5jX21hcmtlcl9sZW5ndGg7CisgICAgaW50IHN0dWZmaW5nX2xlbmd0aDsKKworICAgIC8qIGFkZCB0aGlzIGZvciBlcnJvciByZXNpbGllbnQsIDA1LzE4LzIwMDAgKi8KKyAgICBpbnQzMiBzdGFydFBhY2tldDsKKyAgICBpbnQgbWJfc3RhcnQ7CisgICAgLyogY29weSBhbmQgcGFkIHRvIHByZXZfVm9wIGZvciBJTlRFUiBjb2RpbmcgKi8KKyAgICBzd2l0Y2ggKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBJX1ZPUCA6CisvLyAgICAgIG9zY2xfbWVtc2V0KE1vZGUsIE1PREVfSU5UUkEsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOworICAgICAgICAgICAgcmVzeW5jX21hcmtlcl9sZW5ndGggPSAxNzsKKyAgICAgICAgICAgIHN0dWZmaW5nX2xlbmd0aCA9IDk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX1ZPUCA6CisgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkqNCpuVG90YWxNQik7CisgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+bW90WSwgMCwgc2l6ZW9mKE1PVCkqNCpuVG90YWxNQik7CisvLyAgICAgIG9zY2xfbWVtc2V0KE1vZGUsIE1PREVfSU5URVIsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOworICAgICAgICAgICAgcmVzeW5jX21hcmtlcl9sZW5ndGggPSAxNiArIGN1cnJWb3AtPmZjb2RlRm9yd2FyZDsKKyAgICAgICAgICAgIHN0dWZmaW5nX2xlbmd0aCA9IDEwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlRnJhbWVDb21iaW5lZE1vZGUoKTogVm9wIHR5cGUgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgfQorI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgIGlmICh2aWRlby0+c2hvcnRWaWRlb0hlYWRlcikKKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+YWR2YW5jZWRfSU5UUkEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bW9kaWZpZWRfcXVhbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcl9Bbm5leElUOworICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXJfQW5uZXhUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludHJhID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXJfQW5uZXhJOworICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPm1vZGlmaWVkX3F1YW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcl9Bbm5leFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSB2aWRlby0+dmxjRGVjQ29lZmZJbnRyYSA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjZW5kaWYKKworICAgIC8qKiBJbml0aWFsaXplIHNsaWNlTm8gKioqLworICAgIG1ibnVtID0gc2xpY2VfY291bnRlciA9IDA7CisvLyAgb3NjbF9tZW1zZXQodmlkZW8tPnNsaWNlTm8sIDAsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOworICAgIFFQID0gdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplcjsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgZXF1aXZhbGVudCB0byBtb3Rpb25fc2hhcGVfdGV4dHVyZSgpICovCisgICAgICAgIC8qICAgIGluIHRoZSBNUEVHLTQgc3RhbmRhcmQuICAgICAwNC8xMy8yMDAwICAgICAgICAgICovCisgICAgICAgIG1iX3N0YXJ0ID0gbWJudW07CisgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOyAgICAgICAgICAgICAvKiAgMDQvMjcvMDEgKi8KKyAgICAgICAgc3RhcnRQYWNrZXQgPSBnZXRQb2ludGVyKHN0cmVhbSk7CisKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICAgICAgaWYgKHZpZGVvLT5tb2RpZmllZF9xdWFudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPlFQX0NIUiA9IE1RX2Nocm9tYV9RUF90YWJsZVtRUF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+UVBfQ0hSID0gUVA7ICAgICAvKiBBTk5FWF9UICovCisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiByZW1vdmUgYW55IHN0dWZmaW5nIGJpdHMgKi8KKyAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIHN0dWZmaW5nX2xlbmd0aCwgJmNvZGUpOworICAgICAgICB3aGlsZSAoY29kZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBzdHVmZmluZ19sZW5ndGgpOworICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIHN0dWZmaW5nX2xlbmd0aCwgJmNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgLyogd2UgbmVlZCB2aWRlby0+bWJudW0gaW4gbG93ZXIgbGV2ZWwgZnVuY3Rpb25zICovCisgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKyAgICAgICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKG1ibnVtLCBuTUJQZXJSb3cpOworICAgICAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IG1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKKyAgICAgICAgICAgIC8qIGFzc2lnbiBzbGljZSBudW1iZXIgZm9yIGVhY2ggbWFjcm9ibG9ja3MgKi8KKyAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9ICh1aW50OCkgc2xpY2VfY291bnRlcjsKKworICAgICAgICAgICAgLyogZGVjb2RlIENPRCwgTUNCUEMsIEFDcHJlZF9mbGFnLCBDUEJZIGFuZCBEUVVBTlQgKi8KKyAgICAgICAgICAgIC8qIFdlIGhhdmUgdG8gZGlzY2FyZCBzdHVmZmVkIE1CIGhlYWRlciAqLworICAgICAgICAgICAgc3RhdHVzID0gR2V0TUJoZWFkZXIodmlkZW8sICZRUCk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKKyAgICAgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgKHN0YXJ0UGFja2V0ICYgLTgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU3RvcmUgdGhlIFFQIHZhbHVlIGZvciBsYXRlciB1c2UgaW4gQUMgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgUVBNQlttYm51bV0gPSBRUDsKKworICAgICAgICAgICAgaWYgKE1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBkZWNvZGUgdGhlIERDVCBjb2VmaWNpZW50cyBmb3IgdGhlIE1CICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gR2V0TUJEYXRhKHZpZGVvKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCAoc3RhcnRQYWNrZXQgJiAtOCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIE1PREVfU0tJUFBFRCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNraXBwZWRNQk1vdGlvbkNvbXAodmlkZW8pOyAvKiAgMDgvMDQvMDUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE1vdGlvbiBjb21wZW5zYXRpb24gYW5kIHB1dCB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrCisgICAgICAgICAgICBtYm51bSsrOworCisgICAgICAgICAgICAvKiByZW1vdmUgYW55IHN0dWZmaW5nIGJpdHMgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCBzdHVmZmluZ19sZW5ndGgsICZjb2RlKTsKKyAgICAgICAgICAgIHdoaWxlIChjb2RlID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgc3R1ZmZpbmdfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgc3R1ZmZpbmdfbGVuZ3RoLCAmY29kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhdmUgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB2aWRlbyBwYWNrZXQgb3Igdm9wPyAqLworICAgICAgICAgICAgaWYgKHNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgICAgICB7CisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKCF2aWRlby0+c2xpY2Vfc3RydWN0dXJlKQorICAgICAgICAgICAgICAgIHsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAobWJudW0gPj0gKGludCkodmlkZW8tPm1ibnVtX3JvdyArIDEpKnZpZGVvLT5uTUJpbkdPQikgICAvKiAgMTAvMTEvMDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ibnVtID49IG5Ub3RhbE1CKSByZXR1cm4gUFZfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzIoc3RyZWFtLCBHT0JfUkVTWU5DX01BUktFUl9MRU5HVEgsICZ0bXB2YXIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IEdPQl9SRVNZTkNfTUFSS0VSKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0JpdHN0cmVhbVNob3dCaXRzQnl0ZUFsaWduKHN0cmVhbSwgR09CX1JFU1lOQ19NQVJLRVJfTEVOR1RILCAmdG1wdmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IEdPQl9SRVNZTkNfTUFSS0VSKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGlmIChtYm51bSA+PSBuVG90YWxNQikgIC8qIGluIGNhc2Ugbm8gdmFsaWQgc3R1ZmZpbmcgIDA2LzIzLzAxICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX3N0dWZmaW5nID0gdmFsaWRTdHVmZmluZ19oMjYzKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRfc3R1ZmZpbmcgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jZWFsUGFja2V0KHZpZGVvLCBtYl9zdGFydCwgblRvdGFsTUIsIHNsaWNlX2NvdW50ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogQU5ORVhfSyAqLworICAgICAgICAgICAgICAgICAgICBQVl9CaXRzdHJlYW1TaG93Qml0c0J5dGVBbGlnbk5vRm9yY2VTdHVmZmluZyhzdHJlYW0sIDE3LCAmdG1wdmFyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcHZhciA9PSBSRVNZTkNfTUFSS0VSKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmdfaDI2MyhzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkX3N0dWZmaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiAgMDYvMjEvMDEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1ibnVtID49IG5Ub3RhbE1CKSAgLyogaW4gY2FzZSBubyB2YWxpZCBzdHVmZmluZyAgMDYvMjMvMDEgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qICAxMS8wMS8yMDAyIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZSBhbmQgdGhlcmUgaXMgc29tZSBnYXJiYWdlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUgKGkuZS4gbm8gbmV4dCBzdGFydGNvZGUpIGJyZWFrIGlmIHRoZSBzdHVmZmluZyBpcyB2YWxpZCAqLworICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmcoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkX3N0dWZmaW5nID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAxMS8wMS8yMDAyICovCisgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlYWxQYWNrZXQodmlkZW8sIG1iX3N0YXJ0LCBuVG90YWxNQiwgc2xpY2VfY291bnRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtQnl0ZUFsaWduKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9TVUNDRVNTOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0JpdHN0cmVhbVNob3dCaXRzQnl0ZUFsaWduKHN0cmVhbSwgMjMsICZ0bXB2YXIpOyAvKiB0aGlzIGNhbGwgaXMgdmFsaWQgZm9yIGZfY29kZSA8IDggKi8KKyAgICAgICAgICAgICAgICBsb25nX3plcm9fYml0cyA9ICF0bXB2YXI7CisKKyAgICAgICAgICAgICAgICBpZiAoKHRtcHZhciA+PiAoMjMgLSByZXN5bmNfbWFya2VyX2xlbmd0aCkpID09IFJFU1lOQ19NQVJLRVIgfHwgbG9uZ196ZXJvX2JpdHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmcoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkX3N0dWZmaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qICAwNi8yMS8wMSAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChUUlVFKTsKKworICAgICAgICBpZiAoc2hvcnRWaWRlb0hlYWRlcikKKyAgICAgICAgeyAvKiBXZSBuZWVkIHRvIGNoZWNrIG5ld2dvYiB0byByZWZyZXNoIHF1YW50aXplciAqLworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICAgICAgaWYgKCF2aWRlby0+c2xpY2Vfc3RydWN0dXJlKQorICAgICAgICAgICAgeworI2VuZGlmCisgICAgICAgICAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBQVl9Hb2JIZWFkZXIodmlkZW8pKSA9PSBQVl9GQUlMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBxdWlja1NlYXJjaEdPQkhlYWRlcihzdHJlYW0pKSAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1ibnVtID0gY3VyclZvcC0+Z29iTnVtYmVyICogdmlkZW8tPm5NQmluR09COworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICgoc3RhdHVzID0gUFZfSDI2M1NsaWNlSGVhZGVyKHZpZGVvLCAmbWJudW0pKSA9PSBQVl9GQUlMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBxdWlja1NlYXJjaEgyNjNTbGljZUhlYWRlcihzdHJlYW0pKSAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IFBWX1JlYWRWaWRlb1BhY2tldEhlYWRlcih2aWRlbywgJm1ibnVtKSkgPT0gUFZfRkFJTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IHF1aWNrU2VhcmNoVmlkZW9QYWNrZXRIZWFkZXIoc3RyZWFtLCByZXN5bmNfbWFya2VyX2xlbmd0aCkpICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9WT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1ibnVtID0gblRvdGFsTUI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWJudW0gPiB2aWRlby0+bWJudW0gKyAxKQorICAgICAgICB7CisgICAgICAgICAgICBDb25jZWFsUGFja2V0KHZpZGVvLCB2aWRlby0+bWJudW0sIG1ibnVtLCBzbGljZV9jb3VudGVyKTsKKyAgICAgICAgfQorICAgICAgICBRUCA9IHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXI7CisgICAgICAgIHNsaWNlX2NvdW50ZXIrKzsKKyAgICAgICAgaWYgKG1ibnVtID49IG5Ub3RhbE1CKSBicmVhazsKKworICAgIH0KKyAgICB3aGlsZSAoVFJVRSk7CisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogR2V0TUJIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRGVjb2RlIE1CIGhlYWRlciwgbm90X2NvZGVkLCBtY2JwYywgYWNfcHJlZF9mbGFnLCBjYnB5LCBkcXVhbnQuICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAzLzI5LzAwIDogQ2hhbmdlZCB0aGUgcmV0dXJuZWQgdmFsdWUgYW5kIG9wdGltaXplZCB0aGUgY29kZS4gICAgKi8KKy8qICAgICAgNC8wMS8wMSA6IG5ldyBBQ0RDIHByZWRpY3Rpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgR2V0TUJoZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50MTYgKlFQKQoreworICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOworICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKKyAgICB1aW50OCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7CisgICAgaW50IHhfcG9zID0gdmlkZW8tPm1ibnVtX2NvbDsKKyAgICB0eXBlRENTdG9yZSAqREMgPSB2aWRlby0+cHJlZERDICsgbWJudW07CisgICAgdHlwZURDQUNTdG9yZSAqRENBQ19yb3cgPSB2aWRlby0+cHJlZERDQUNfcm93ICsgeF9wb3M7CisgICAgdHlwZURDQUNTdG9yZSAqRENBQ19jb2wgPSB2aWRlby0+cHJlZERDQUNfY29sOworICAgIGNvbnN0IHN0YXRpYyBpbnQxNiAgRFFfdGFiWzRdID0geyAtMSwgLTIsIDEsIDJ9OworCisgICAgaW50IENCUFksIENCUEM7CisgICAgaW50IE1CdHlwZSwgVm9wVHlwZTsKKyAgICBpbnQgTUNCUEM7CisgICAgdWludCBEUVVBTlQ7CisgICAgaW50IGNvbXA7CisgICAgQm9vbCBtYl9jb2RlZDsKKworICAgIFZvcFR5cGUgPSB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7CisgICAgbWJfY29kZWQgPSAoKFZvcFR5cGUgPT0gSV9WT1ApID8gVFJVRSA6ICFCaXRzdHJlYW1SZWFkMUJpdHNfSU5MSU5FKHN0cmVhbSkpOworCisgICAgaWYgKCFtYl9jb2RlZCkKKyAgICB7CisgICAgICAgIC8qIHNraXBwZWQgbWFjcm9ibG9jayAqLworICAgICAgICBNb2RlW21ibnVtXSA9IE1PREVfU0tJUFBFRDsKKyAgICAgICAgLy9vc2NsX21lbXNldChEQ0FDX3JvdywgMCwgc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsgICAvKiAgU0tJUFBFRF9BQ0RDICovCisgICAgICAgIC8vb3NjbF9tZW1zZXQoRENBQ19jb2wsIDAsIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CisgICAgICAgIFpFUk9fT1VUXzY0QllURVMoRENBQ19yb3cpOworICAgICAgICBaRVJPX09VVF82NEJZVEVTKERDQUNfY29sKTsgLyogIDA4LzEyLzA1ICovCisKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKKyAgICAgICAgeworICAgICAgICAgICAgKCpEQylbY29tcF0gPSBtaWRfZ3JheTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBjb2RlZCBtYWNyb2Jsb2NrICovCisgICAgICAgIGlmIChWb3BUeXBlID09IElfVk9QKQorICAgICAgICB7CisgICAgICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRyYShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICAgICAgaWYgKCF2aWRlby0+ZGVibG9ja2luZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRlcihzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1DQlBDID0gUFZfVmxjRGVjTUNCUENfY29tX2ludGVyX0gyNjMoc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRlcihzdHJlYW0pOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKE1DQlBDKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICBNb2RlW21ibnVtXSA9ICh1aW50OCkoTUJ0eXBlID0gTUJ0eXBlX21vZGVbTUNCUEMgJiA3XSk7CisgICAgICAgIENCUEMgPSAoTUNCUEMgPj4gNCkgJiAzOworCisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgIGlmIChNQnR5cGUgJiBJTlRSQV9NQVNLKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9ICh1aW50OCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5hZHZhbmNlZF9JTlRSQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tYmxvY2stPmRpcmVjdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibG9jay0+ZGlyZWN0aW9uID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKChNQnR5cGUgJiBJTlRSQV9NQVNLKSAmJiAhdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9ICh1aW50OCkgQml0c3RyZWFtUmVhZDFCaXRzX0lOTElORShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIENCUFkgPSBQVl9WbGNEZWNDQlBZKHN0cmVhbSwgTUJ0eXBlICYgSU5UUkFfTUFTSyk7IC8qIElOVFJBIHx8IElOVFJBX1EgKi8KKyAgICAgICAgaWYgKENCUFkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdXIDA0LzIzLzk5CisgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gPSAodWludDgpKENCUFkgPDwgMiB8IChDQlBDICYgMykpOworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICBpZiAoTUJ0eXBlICYgUV9NQVNLKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXZpZGVvLT5tb2RpZmllZF9xdWFudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEUVVBTlQgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7CisgICAgICAgICAgICAgICAgKlFQICs9IERRX3RhYltEUVVBTlRdOworCisgICAgICAgICAgICAgICAgaWYgKCpRUCA8IDEpICpRUCA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKlFQID4gMzEpICpRUCA9IDMxOworICAgICAgICAgICAgICAgIHZpZGVvLT5RUF9DSFIgPSAqUVA7ICAvKiBBTk5FWF9UICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqUVAgKz0gRFFfdGFiX0FubmV4X1RfMTFbKlFQXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpRUCArPSBEUV90YWJfQW5uZXhfVF8xMFsqUVBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgqUVAgPCAxKSAqUVAgPSAxOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgqUVAgPiAzMSkgKlFQID0gMzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpRUCA9IChpbnQxNilCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZpZGVvLT5RUF9DSFIgPSAgTVFfY2hyb21hX1FQX3RhYmxlWypRUF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmIChNQnR5cGUgJiBRX01BU0spCisgICAgICAgIHsKKyAgICAgICAgICAgIERRVUFOVCA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKKyAgICAgICAgICAgICpRUCArPSBEUV90YWJbRFFVQU5UXTsKKworICAgICAgICAgICAgaWYgKCpRUCA8IDEpICpRUCA9IDE7CisgICAgICAgICAgICBlbHNlIGlmICgqUVAgPiAzMSkgKlFQID0gMzE7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKKyogICAgICAgMy8xMC8wMCAgOiBpbml0aWFsIG1vZGlmaWNhdGlvbiB0byB0aGUKKyogICAgICAgICAgICAgICAgbmV3IFBWLURlY29kZXIgTGliIGZvcm1hdC4KKyogICAgICAgNC8yLzIwMDAgOiBDbGVhbnVwIGFuZCBlcnJvci1oYW5kbGluZyBtb2RpZmljYXRpb24uICBUaGlzCisqICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGRpdmlkZWQgaW50byBzZXZlcmFsIHN1Yi1mdW5jdGlvbnMgZm9yCisqICAgICAgICAgICAgICAgICAgIGJldHRlciBjb2Rpbmcgc3R5bGUgYW5kIG1haW50YWluYW5jZSByZWFzb24uICBJIGFsc28KKyogICAgICAgICAgICAgICAgICAgZ3JlYXRseSBzaHJ1bmsgdGhlIGNvZGUgc2l6ZSBoZXJlLgorKiAgICAgICA5LzE4LzIwMDAgOiBWbGNEZWNvZGUrRGVxdWFudCBvcHRpbWl6YXRpb24gKgorKiAgICAgICA0LzAxLzIwMDEgOiBuZXcgQUNEQyBwcmVkaWN0aW9uIHN0cnVjdHVyZQorKiAgICAgICAzLzI5LzIwMDIgOiByZW1vdmVkIEdldEludHJhTUIgYW5kIEdldEludGVyTUIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLworUFZfU1RBVFVTIEdldE1CRGF0YShWaWRlb0RlY0RhdGEgKnZpZGVvKQoreworICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOworICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKKyAgICBNYWNyb0Jsb2NrICptYmxvY2sgPSB2aWRlby0+bWJsb2NrOworICAgIGludDE2ICpkYXRhQmxvY2s7CisgICAgUElYRUwgKmNfY29tcDsKKyAgICB1aW50IG1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtXTsKKyAgICB1aW50IENCUCA9IHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV07CisgICAgdHlwZURDU3RvcmUgKkRDID0gdmlkZW8tPnByZWREQyArIG1ibnVtOworICAgIGludCBpbnRyYV9kY192bGNfdGhyID0gdmlkZW8tPmN1cnJWb3AtPmludHJhRENWbGNUaHI7CisgICAgaW50MTYgUVAgPSB2aWRlby0+UVBNQlttYm51bV07CisgICAgaW50MTYgUVBfdG1wID0gUVA7CisgICAgaW50IHdpZHRoID0gdmlkZW8tPndpZHRoOworICAgIGludCAgY29tcDsKKyAgICBpbnQgIHN3aXRjaGVkOworICAgIGludCBuY29lZmZzWzZdID0gezAsIDAsIDAsIDAsIDAsIDB9OworICAgIGludCAqbm9fY29lZmYgPSBtYmxvY2stPm5vX2NvZWZmOworICAgIGludDE2IERDX2NvZWZmOworICAgIFBWX1NUQVRVUyBzdGF0dXM7CisKKyAgICBpbnQgeV9wb3MgPSB2aWRlby0+bWJudW1fcm93OworICAgIGludCB4X3BvcyA9IHZpZGVvLT5tYm51bV9jb2w7CisgICAgaW50MzIgb2Zmc2V0ID0gKGludDMyKSh5X3BvcyA8PCA0KSAqIHdpZHRoICsgKHhfcG9zIDw8IDQpOworCisgICAgLyogRGVjb2RlIGVhY2ggOC1ieS04IGJsb2Nrcy4gY29tcCAwIH4gMyBhcmUgbHVtaW5hbmNlIGJsb2NrcywgNCB+IDUgKi8KKyAgICAvKiAgYXJlIGNocm9taW5hbmNlIGJsb2Nrcy4gICAwNC8wMy8yMDAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8qICBvc2NsX21lbXNldChtYmxvY2stPmJsb2NrLCAwLCBzaXplb2YodHlwZU1CU3RvcmUpKTsgICAgQXVnIDksMjAwNSAqLworCisgICAgaWYgKG1vZGUgJiBJTlRSQV9NQVNLKSAvKiBNT0RFX0lOVFJBIHx8IE1PREVfSU5UUkFfUSAqLworICAgIHsKKyAgICAgICAgc3dpdGNoZWQgPSAwOworICAgICAgICBpZiAoaW50cmFfZGNfdmxjX3RocikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT51c2VQcmV2UVApCisgICAgICAgICAgICAgICAgUVBfdG1wID0gdmlkZW8tPlFQTUJbbWJudW0tMV07ICAgLyogcnVubmluZyBRUCAgMDQvMjYvMDEgKi8KKworICAgICAgICAgICAgc3dpdGNoZWQgPSAoaW50cmFfZGNfdmxjX3RociA9PSA3IHx8IFFQX3RtcCA+PSBpbnRyYV9kY192bGNfdGhyICogMiArIDExKTsKKyAgICAgICAgfQorCisgICAgICAgIG1ibG9jay0+RENTY2FsYXJMdW0gPSBjYWxfZGNfc2NhbGVyKFFQLCBMVU1JTkFOQ0VfRENfVFlQRSk7ICAgLyogIDMvMDEvMDEgKi8KKyAgICAgICAgbWJsb2NrLT5EQ1NjYWxhckNociA9IGNhbF9kY19zY2FsZXIoUVAsIENIUk9NSU5BTkNFX0RDX1RZUEUpOworCisgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFCbG9jayA9IG1ibG9jay0+YmxvY2tbY29tcF07ICAgIC8qIDEwLzIwLzIwMDAgKi8KKworICAgICAgICAgICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgICAgICAgICAgeworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmICghdmlkZW8tPmFkdmFuY2VkX0lOVFJBKQorICAgICAgICAgICAgICAgIHsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBEQ19jb2VmZiA9IChpbnQxNikgQml0c3RyZWFtUmVhZEJpdHMxNl9JTkxJTkUoc3RyZWFtLCA4KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKERDX2NvZWZmICYgMHg3ZikgPT0gMCkgLyogMTI4ICYgMCAgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudGx5IHdlIHdpbGwgb25seSBzaWduYWwgRkFJTCBmb3IgMTI4LiBXZSB3aWxsIGlnbm9yZSB0aGUgMCBjYXNlICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERDX2NvZWZmID09IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoRENfY29lZmYgPT0gMjU1KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEQ19jb2VmZiA9IDEyODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2tbMF0gPSAoaW50MTYpIERDX2NvZWZmOworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludHJhQmxvY2tfU0godmlkZW8sIGNvbXAsIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN3aXRjaGVkID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9EZWNvZGVQcmVkaWN0ZWRJbnRyYURDKGNvbXAsIHN0cmVhbSwgJkRDX2NvZWZmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2tbMF0gPSAoaW50MTYpIERDX2NvZWZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gVmxjRGVxdWFudEgyNjNJbnRyYUJsb2NrKHZpZGVvLCBjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hlZCwgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1tjb21wXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN3aXRjaGVkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoKGRhdGFCbG9jayArIDEpLCAwLCBzaXplb2YoaW50MTYpKjYzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub19jb2VmZltjb21wXSA9IG5jb2VmZnNbY29tcF07CisKKyAgICAgICAgfQorICAgICAgICBNQmxvY2tJRENUKHZpZGVvKTsKKyAgICB9CisgICAgZWxzZSAgICAgIC8qIElOVEVSIG1vZGVzICovCisgICAgeyAgIC8qICBtb3ZlZCBpdCBoZXJlIEF1ZyAxNSwgMjAwNSAqLworICAgICAgICAvKiBkZWNvZGUgdGhlIG1vdGlvbiB2ZWN0b3IgKGlmIHRoZXJlIGFyZSBhbnkpICovCisgICAgICAgIHN0YXR1cyA9IFBWX0dldE1CdmVjdG9ycyh2aWRlbywgbW9kZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisKKyAgICAgICAgTUJNb3Rpb25Db21wKHZpZGVvLCBDQlApOworICAgICAgICBjX2NvbXAgID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OworCisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA0OyBjb21wKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICgqREMpW2NvbXBdID0gbWlkX2dyYXk7CisgICAgICAgICAgICBpZiAoQ0JQICYgKDEgPDwgKDUgLSBjb21wKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgY29tcCwgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CisgICAgICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzW2NvbXBdKSkgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgICAgICBCbG9ja0lEQ1QoY19jb21wICsgKGNvbXAmMikqKHdpZHRoIDw8IDIpICsgOCooY29tcCYxKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgKGNvbXAmMikqNjQgKyA4Kihjb21wJjEpLCBtYmxvY2stPmJsb2NrW2NvbXBdLCB3aWR0aCwgbmNvZWZmc1tjb21wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sIG1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPlFQTUJbbWJudW1dID0gdmlkZW8tPlFQX0NIUjsgICAgIC8qIEFOTkVYX1QgKi8KKworCisKKyAgICAgICAgKCpEQylbNF0gPSBtaWRfZ3JheTsKKyAgICAgICAgaWYgKENCUCAmIDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jb2VmZnNbNF0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIDQsIG1ibG9jay0+Yml0bWFwY29sWzRdLCAmbWJsb2NrLT5iaXRtYXByb3dbNF0pOworICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzWzRdKSkgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNTYsIG1ibG9jay0+YmxvY2tbNF0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNF0sIG1ibG9jay0+Yml0bWFwcm93WzRdKTsKKworICAgICAgICB9CisgICAgICAgICgqREMpWzVdID0gbWlkX2dyYXk7CisgICAgICAgIGlmIChDQlAgJiAxKQorICAgICAgICB7CisgICAgICAgICAgICBuY29lZmZzWzVdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCA1LCBtYmxvY2stPmJpdG1hcGNvbFs1XSwgJm1ibG9jay0+Yml0bWFwcm93WzVdKTsKKyAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1s1XSkpIHJldHVybiBQVl9GQUlMOworCisgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjY0LCBtYmxvY2stPmJsb2NrWzVdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzVdLAorICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCBtYmxvY2stPmJpdG1hcHJvd1s1XSk7CisKKyAgICAgICAgfQorICAgICAgICB2aWRlby0+UVBNQlttYm51bV0gPSBRUDsgIC8qIHJlc3RvcmUgdGhlIFFQIHZhbHVlcyAgQU5ORVhfVCovCisjZWxzZQorICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNDsgY29tcCsrKQorICAgICAgICB7CisgICAgICAgICAgICAoKkRDKVtjb21wXSA9IG1pZF9ncmF5OworICAgICAgICAgICAgaWYgKENCUCAmICgxIDw8ICg1IC0gY29tcCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIGNvbXAsIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOworICAgICAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1tjb21wXSkpIHJldHVybiBQVl9GQUlMOworCisgICAgICAgICAgICAgICAgQmxvY2tJRENUKGNfY29tcCArIChjb21wJjIpKih3aWR0aCA8PCAyKSArIDgqKGNvbXAmMSksIG1ibG9jay0+cHJlZF9ibG9jayArIChjb21wJjIpKjY0ICsgOCooY29tcCYxKSwgbWJsb2NrLT5ibG9ja1tjb21wXSwgd2lkdGgsIG5jb2VmZnNbY29tcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCBtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICgqREMpWzRdID0gbWlkX2dyYXk7CisgICAgICAgIGlmIChDQlAgJiAyKQorICAgICAgICB7CisgICAgICAgICAgICBuY29lZmZzWzRdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCA0LCBtYmxvY2stPmJpdG1hcGNvbFs0XSwgJm1ibG9jay0+Yml0bWFwcm93WzRdKTsKKyAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1s0XSkpIHJldHVybiBQVl9GQUlMOworCisgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjU2LCBtYmxvY2stPmJsb2NrWzRdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzRdLAorICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzRdLCBtYmxvY2stPmJpdG1hcHJvd1s0XSk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgfQorICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OworICAgICAgICBpZiAoQ0JQICYgMSkKKyAgICAgICAgeworICAgICAgICAgICAgbmNvZWZmc1s1XSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgNSwgbWJsb2NrLT5iaXRtYXBjb2xbNV0sICZtYmxvY2stPmJpdG1hcHJvd1s1XSk7CisgICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbNV0pKSByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI2NCwgbWJsb2NrLT5ibG9ja1s1XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s1XSwKKyAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs1XSwgbWJsb2NrLT5iaXRtYXByb3dbNV0pOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCisjZW5kaWYgIC8vIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorCisKKworCisKKworICAgIH0KKworICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOyAgICAgICAgICAvKiBzaG91bGQgYmUgc2V0IGFmdGVyIGRlY29kaW5nIHRoZSBmaXJzdCBDb2RlZCAgMDQvMjcvMDEgKi8KKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbmNlYWwuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29uY2VhbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbmNlYWwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb25jZWFsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3MWY0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAKQEAgLTAsMCArMSw3NTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVjX2xpYi5oIgorI2luY2x1ZGUgInZsY19kZWNvZGUuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJzY2FsaW5nLmgiCisjaW5jbHVkZSAibWJ0eXBlX21vZGUuaCIKKyNpbmNsdWRlICJpZGN0LmgiCisKKyNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09ORElUSU9OQUxfSVNfQ09OU1RBTlQKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRGVjb2RlRnJhbWVEYXRhUGFydE1vZGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWNvZGUgYSBmcmFtZSBvZiBNUEVHNCBiaXRzdHJlYW0gaW4gZGF0YXBhcnRpdGlvbmluZyBtb2RlLiAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwNC8yNS8yMDAwIDogUmV3cml0ZSB0aGUgZGF0YSBwYXJ0aXRpb25pbmcgcGF0aCBjb21wbGV0ZWx5ICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHBzZXVkbyBjb2RlcyBpbiBNUEVHLTQgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6IDA5LzE4LzIwMDAgYWRkIGZhc3QgVmxjRGVjb2RlK0RlcXVhbnQgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAwNC8xNy8yMDAxIGNsZWFudXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRGVjb2RlRnJhbWVEYXRhUGFydE1vZGUoVmlkZW9EZWNEYXRhICp2aWRlbykKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOworCisgICAgaW50IG5NQlBlclJvdyA9IHZpZGVvLT5uTUJQZXJSb3c7CisKKyAgICBpbnQgdm9wVHlwZSA9IGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOworICAgIGludCBtYm51bTsKKyAgICBpbnQgblRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7CisgICAgaW50IHNsaWNlX2NvdW50ZXI7CisgICAgaW50IHJlc3luY19tYXJrZXJfbGVuZ3RoOworCisgICAgLyogY29weSBhbmQgcGFkIHRvIHByZXZfVm9wIGZvciBJTlRFUiBjb2RpbmcgKi8KKyAgICBzd2l0Y2ggKHZvcFR5cGUpCisgICAgeworICAgICAgICBjYXNlIElfVk9QIDoKKy8vICAgICAgb3NjbF9tZW1zZXQoTW9kZSwgTU9ERV9JTlRSQSwgc2l6ZW9mKHVpbnQ4KSpuVG90YWxNQik7CisgICAgICAgICAgICByZXN5bmNfbWFya2VyX2xlbmd0aCA9IDE3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9WT1AgOgorICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1vdFgsIDAsIHNpemVvZihNT1QpKjQqblRvdGFsTUIpOworICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1vdFksIDAsIHNpemVvZihNT1QpKjQqblRvdGFsTUIpOworLy8gICAgICBvc2NsX21lbXNldChNb2RlLCBNT0RFX0lOVEVSLCBzaXplb2YodWludDgpKm5Ub3RhbE1CKTsKKyAgICAgICAgICAgIHJlc3luY19tYXJrZXJfbGVuZ3RoID0gMTYgKyBjdXJyVm9wLT5mY29kZUZvcndhcmQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVGcmFtZURhdGFQYXJ0TW9kZSgpOiBWb3AgdHlwZSBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICB9CisKKyAgICAvKiogSW5pdGlhbGl6ZSBzbGljZU5vICoqKi8KKyAgICBtYm51bSA9IHNsaWNlX2NvdW50ZXIgPSAwOworLy8gIG9zY2xfbWVtc2V0KHZpZGVvLT5zbGljZU5vLCAwLCBzaXplb2YodWludDgpKm5Ub3RhbE1CKTsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgZXF1aXZhbGVudCB0byBtb3Rpb25fc2hhcGVfdGV4dHVyZSgpICovCisgICAgICAgIC8qIGluIHRoZSBNUEVHLTQgc3RhbmRhcmQuICAgICAgICAgICAgMDQvMTMvMjAwMCAgICAgICovCisgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyhtYm51bSwgbk1CUGVyUm93KTsgICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbmJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCisgICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7CisKKyAgICAgICAgc3dpdGNoICh2b3BUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElfVk9QIDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVEYXRhUGFydF9JX1ZpZGVvUGFja2V0KHZpZGVvLCBzbGljZV9jb3VudGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBQX1ZPUCA6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRGF0YVBhcnRfUF9WaWRlb1BhY2tldCh2aWRlbywgc2xpY2VfY291bnRlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIG1wNGRlY19sb2coIkRlY29kZUZyYW1lRGF0YVBhcnRNb2RlKCk6IFZvcCB0eXBlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgoc3RhdHVzID0gUFZfUmVhZFZpZGVvUGFja2V0SGVhZGVyKHZpZGVvLCAmbWJudW0pKSA9PSBQVl9GQUlMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IHF1aWNrU2VhcmNoVmlkZW9QYWNrZXRIZWFkZXIoc3RyZWFtLCByZXN5bmNfbWFya2VyX2xlbmd0aCkpICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9WT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1ibnVtID0gblRvdGFsTUI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWJudW0gPiB2aWRlby0+bWJudW0gKyAxKQorICAgICAgICB7CisgICAgICAgICAgICBDb25jZWFsUGFja2V0KHZpZGVvLCB2aWRlby0+bWJudW0sIG1ibnVtLCBzbGljZV9jb3VudGVyKTsKKyAgICAgICAgfQorICAgICAgICBzbGljZV9jb3VudGVyKys7CisgICAgICAgIGlmIChtYm51bSA+PSBuVG90YWxNQikKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgfQorICAgIHdoaWxlIChUUlVFKTsKKworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRGVjb2RlRGF0YVBhcnRfSV9WaWRlb1BhY2tldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8yNS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IERlY29kZSBEYXRhIFBhcnRpdGlvbmVkIE1vZGUgVmlkZW8gUGFja2V0IGluIEktVk9QICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgUFZfRkFJTCBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6IDA5LzE4LzIwMDAgYWRkIGZhc3QgVmxjRGVjb2RlK0RlcXVhbnQgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAwNC8wMS8yMDAxIGZpeGVkIE1CX3N0dWZmaW5nLCByZW1vdmVkIHVubmVjZXNzYXJ5IGNvZGUgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRGVjb2RlRGF0YVBhcnRfSV9WaWRlb1BhY2tldChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgc2xpY2VfY291bnRlcikKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKKyAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKKyAgICBpbnQgIG5Ub3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COworICAgIGludCAgbWJudW0sIG1iX3N0YXJ0LCBtYl9lbmQ7CisgICAgaW50MTYgUVAsICpRUE1CID0gdmlkZW8tPlFQTUI7CisgICAgaW50ICBNQnR5cGUsIE1DQlBDLCBDQlBZOworICAgIHVpbnQzMiB0bXB2YXI7CisgICAgdWludCBjb2RlOworICAgIGludCBuTUJQZXJSb3cgPSB2aWRlby0+bk1CUGVyUm93OworICAgIEJvb2wgdmFsaWRfc3R1ZmZpbmc7CisgICAgaW50MzIgc3RhcnRTZWNvbmRQYXJ0LCBzdGFydEZpcnN0UGFydCA9IGdldFBvaW50ZXIoc3RyZWFtKTsKKworICAgIC8qIGRlY29kZSB0aGUgZmlyc3QgcGFydGl0aW9uICovCisgICAgUVAgPSB2aWRlby0+Y3VyclZvcC0+cXVhbnRpemVyOworICAgIG1iX3N0YXJ0ID0gbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7ICAgICAgICAgLyogIDA0LzI3LzAxICovCisKKworICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCA5LCAmY29kZSk7CisgICAgd2hpbGUgKGNvZGUgPT0gMSkKKyAgICB7CisgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDkpOworICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgOSwgJmNvZGUpOworICAgIH0KKworICAgIGRvCisgICAgeworICAgICAgICAvKiBkZWNvZGUgQ09ELCBNQ0JQQywgQUNwcmVkX2ZsYWcsIENQQlkgYW5kIERRVUFOVCAqLworICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRyYShzdHJlYW0pOworCisgICAgICAgIGlmICghVkxDX0VSUk9SX0RFVEVDVEVEKE1DQlBDKSkKKyAgICAgICAgeworICAgICAgICAgICAgTW9kZVttYm51bV0gPSAodWludDgpKE1CdHlwZSA9IE1CdHlwZV9tb2RlW01DQlBDICYgN10pOworICAgICAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSA9ICh1aW50OCkoKE1DQlBDID4+IDQpICYgMyk7CisgICAgICAgICAgICBzdGF0dXMgPSBHZXRNQmhlYWRlckRhdGFQYXJ0X0RRVUFOVF9EQyh2aWRlbywgJlFQKTsKKyAgICAgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOyAgICAgICAgLyogc2V0IGl0IGFmdGVyIHRoZSBmaXJzdCBjb2RlZCBNQiAgICAgIDA0LzI3LzAxICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCisgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OworICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0Rmlyc3RQYXJ0KTsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gKHVpbnQ4KSBzbGljZV9jb3VudGVyOworICAgICAgICBRUE1CW21ibnVtXSA9IFFQOworICAgICAgICB2aWRlby0+bWJudW0gPSArK21ibnVtOworCisgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCA5LCAmY29kZSk7CisgICAgICAgIHdoaWxlIChjb2RlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDkpOworICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDksICZjb2RlKTsKKyAgICAgICAgfQorICAgICAgICAvKiBoYXZlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gcGFja2V0IG9yIHZvcD8gKi8KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIERDX01BUktFUl9MRU5HVEgsICZ0bXB2YXIpOworCisgICAgfQorICAgIHdoaWxlICh0bXB2YXIgIT0gRENfTUFSS0VSICYmIHZpZGVvLT5tYm51bSA8IG5Ub3RhbE1CKTsKKworICAgIGlmICh0bXB2YXIgPT0gRENfTUFSS0VSKQorICAgIHsKKyAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgRENfTUFSS0VSX0xFTkdUSCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHF1aWNrU2VhcmNoRENNKHN0cmVhbSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogb25seSB3YXkgeW91IGNhbiBlbmQgdXAgYmVpbmcgaGVyZSBpcyBpbiB0aGUgbGFzdCBwYWNrZXQsYW5kIHRoZXJlIGlzIHN0dWZmaW5nIGF0CisgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBmaXJzdCBwYXJ0aXRpb24gKi8KKyAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIERDX01BUktFUl9MRU5HVEgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLworICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7CisgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRGaXJzdFBhcnQpOworICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7CisgICAgICAgICAgICAvKiBjb25jZWFsbWVudCB3aWxsIGJlIHRha2VuIGNhcmUgb2YgaW4gdGhlIHVwcGVyIGxheWVyICovCisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlY29kZSB0aGUgc2Vjb25kIHBhcnRpdGlvbiAqLworICAgIHN0YXJ0U2Vjb25kUGFydCA9IGdldFBvaW50ZXIoc3RyZWFtKTsKKworICAgIG1iX2VuZCA9IHZpZGVvLT5tYm51bTsKKworICAgIGZvciAobWJudW0gPSBtYl9zdGFydDsgbWJudW0gPCBtYl9lbmQ7IG1ibnVtKyspCisgICAgeworICAgICAgICBNQnR5cGUgPSBNb2RlW21ibnVtXTsKKyAgICAgICAgLyogTm8gc2tpcHBlZCBtb2RlIGluIEktcGFja2V0cyAgMy8xLzIwMDEgICAgKi8KKyAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisKKyAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1cobWJudW0sIG5NQlBlclJvdyk7ICAgLyogIFRoaXMgaXMgbmVlZGVkIGlmIG5ibnVtIGlzIHJlYWQgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAqLworICAgICAgICB2aWRlby0+bWJudW1fY29sID0gbWJudW0gLSB2aWRlby0+bWJudW1fcm93ICogbk1CUGVyUm93OworICAgICAgICAvKiB0aGVyZSBpcyBhbHdheXMgYWNkY3ByZWQgaW4gRGF0YVBhcnQgbW9kZSAgMDQvMTAvMDEgKi8KKyAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gKHVpbnQ4KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKworICAgICAgICBDQlBZID0gUFZfVmxjRGVjQ0JQWShzdHJlYW0sIE1CdHlwZSAmIElOVFJBX01BU0spOyAvKiBNT0RFX0lOVFJBIHx8IE1PREVfSU5UUkFfUSAqLworICAgICAgICBpZiAoQ0JQWSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KKyAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0U2Vjb25kUGFydCk7IC8qICAqLworICAgICAgICAgICAgLyogQ29uY2VhbCBwYWNrZXQsICAwNS8xNS8yMDAwICovCisgICAgICAgICAgICBDb25jZWFsVGV4dHVyZV9JKHZpZGVvLCBzdGFydEZpcnN0UGFydCwgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gfD0gKHVpbnQ4KShDQlBZIDw8IDIpOworICAgIH0KKworICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOworCisgICAgZm9yIChtYm51bSA9IG1iX3N0YXJ0OyBtYm51bSA8IG1iX2VuZDsgbWJudW0rKykKKyAgICB7CisgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworCisgICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKG1ibnVtICwgbk1CUGVyUm93KTsgIC8qICBUaGlzIGlzIG5lZWRlZCBpZiBuYm51bSBpcyByZWFkIGZyb20gdGhlIHBhY2tldCBoZWFkZXIgKi8KKyAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IG1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKKyAgICAgICAgLyogTm8gc2tpcHBlZCBtb2RlIGluIEktcGFja2V0cyAgMy8xLzIwMDEgICAgKi8KKyAgICAgICAgLyogZGVjb2RlIHRoZSBEQ1QgY29lZmljaWVudHMgZm9yIHRoZSBNQiAqLworICAgICAgICBzdGF0dXMgPSBHZXRNQkRhdGFfRGF0YVBhcnQodmlkZW8pOworICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KKyAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0U2Vjb25kUGFydCk7IC8qICAqLworICAgICAgICAgICAgLyogQ29uY2VhbCBwYWNrZXQsICAwNS8xNS8yMDAwICovCisgICAgICAgICAgICBDb25jZWFsVGV4dHVyZV9JKHZpZGVvLCBzdGFydEZpcnN0UGFydCwgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOyAgICAgICAgICAgLyogIDA0LzI3LzAxIHNob3VsZCBiZSBzZXQgYWZ0ZXIgZGVjb2RpbmcgZmlyc3QgTUIgKi8KKyAgICB9CisKKyAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmcoc3RyZWFtKTsKKyAgICBpZiAoIXZhbGlkX3N0dWZmaW5nKQorICAgIHsKKyAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7CisgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydFNlY29uZFBhcnQpOworICAgICAgICBDb25jZWFsVGV4dHVyZV9JKHZpZGVvLCBzdGFydEZpcnN0UGFydCwgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7CisgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgIH0KKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IERlY29kZURhdGFQYXJ0X1BfVmlkZW9QYWNrZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMjUvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWNvZGUgRGF0YSBQYXJ0aXRpb25lZCBNb2RlIFZpZGVvIFBhY2tldCBpbiBQLVZPUCAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIFBWX0ZBSUwgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgIDA5LzE4LzIwMDAsICBmYXN0IFZsY0RlY29kZStEZXF1YW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAwNC8xMy8yMDAxLCAgZml4ZWQgTUJfc3R1ZmZpbmcsIG5ldyBBQ0RDIHByZWQgc3RydWN0dXJlLCAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIDA4LzA3LzIwMDEsICByZW1vdmUgTUJ6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIERlY29kZURhdGFQYXJ0X1BfVmlkZW9QYWNrZXQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IHNsaWNlX2NvdW50ZXIpCit7CisgICAgUFZfU1RBVFVTIHN0YXR1czsKKyAgICB1aW50OCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7CisgICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07CisgICAgaW50IG5Ub3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COworICAgIGludCBtYm51bSwgbWJfc3RhcnQsIG1iX2VuZDsKKyAgICBpbnQxNiBRUCwgKlFQTUIgPSB2aWRlby0+UVBNQjsKKyAgICBpbnQgTUJ0eXBlLCBDQlBZOworICAgIEJvb2wgdmFsaWRfc3R1ZmZpbmc7CisgICAgaW50IGludHJhX01COworICAgIHVpbnQzMiB0bXB2YXI7CisgICAgdWludCBjb2RlOworICAgIGludDMyICBzdGFydEZpcnN0UGFydCwgc3RhcnRTZWNvbmRQYXJ0OworICAgIGludCBuTUJQZXJSb3cgPSB2aWRlby0+bk1CUGVyUm93OworICAgIHVpbnQ4ICpwYnl0ZTsKKyAgICAvKiBkZWNvZGUgdGhlIGZpcnN0IHBhcnRpdGlvbiAqLworICAgIHN0YXJ0Rmlyc3RQYXJ0ID0gZ2V0UG9pbnRlcihzdHJlYW0pOworICAgIG1iX3N0YXJ0ID0gdmlkZW8tPm1ibnVtOworICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOyAgICAgICAgICAgIC8qICAwNC8yNy8wMSAqLworCisgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDEwLCAmY29kZSk7CisgICAgd2hpbGUgKGNvZGUgPT0gMSkKKyAgICB7CisgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDEwKTsKKyAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDEwLCAmY29kZSk7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGRlY29kZSBDT0QsIE1DQlBDLCBBQ3ByZWRfZmxhZywgQ1BCWSBhbmQgRFFVQU5UICovCisgICAgICAgIC8qIFdlIGhhdmUgdG8gZGlzY2FyZCBzdHVmZmVkIE1CIGhlYWRlciAqLworCisgICAgICAgIHN0YXR1cyA9IEdldE1CaGVhZGVyRGF0YVBhcnRfUCh2aWRlbyk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCisgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydEZpcnN0UGFydCk7CisgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgbXVzdCB1cGRhdGUgc2xpY2VfY291bnRlciBiZWZvcmUgbW90aW9uIHZlY3RvciBkZWNvZGluZy4gICAqLworICAgICAgICB2aWRlby0+c2xpY2VOb1t2aWRlby0+bWJudW1dID0gKHVpbnQ4KSBzbGljZV9jb3VudGVyOworCisgICAgICAgIGlmIChNb2RlW3ZpZGVvLT5tYm51bV0gJiBJTlRFUl9NQVNLKSAvKiBJTlRFUiB8fCBJTlRFUl9RIHx8IElOVEVSXzRWICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgbW90aW9uIHZlY3RvciAoaWYgdGhlcmUgYXJlIGFueSkgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0dldE1CdmVjdG9ycyh2aWRlbywgTW9kZVt2aWRlby0+bWJudW1dKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCisgICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7CisgICAgICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0Rmlyc3RQYXJ0KTsKKyAgICAgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aWRlby0+bWJudW0rKzsKKworICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyh2aWRlby0+bWJudW0sIG5NQlBlclJvdyk7ICAgLyogIFRoaXMgaXMgbmVlZGVkIGlmIG1ibnVtIGlzIHJlYWQgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAqLworICAgICAgICB2aWRlby0+bWJudW1fY29sID0gdmlkZW8tPm1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKKworICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgMTAsICZjb2RlKTsKKyAgICAgICAgd2hpbGUgKGNvZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgMTApOworICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDEwLCAmY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogaGF2ZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvIHBhY2tldCBvciB2b3A/ICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzIoc3RyZWFtLCBNT1RJT05fTUFSS0VSX0NPTUJfTEVOR1RILCAmdG1wdmFyKTsKKyAgICAgICAgLyogICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFBWX0VORF9PRl9CVUZGRVIpIHJldHVybiBzdGF0dXM7ICAqLworICAgIH0KKyAgICB3aGlsZSAodG1wdmFyICE9IE1PVElPTl9NQVJLRVJfQ09NQiAmJiB2aWRlby0+bWJudW0gPCBuVG90YWxNQik7CisKKyAgICBpZiAodG1wdmFyID09IE1PVElPTl9NQVJLRVJfQ09NQikKKyAgICB7CisgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIE1PVElPTl9NQVJLRVJfQ09NQl9MRU5HVEgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBxdWlja1NlYXJjaE1vdGlvbk1hcmtlcihzdHJlYW0pOworICAgICAgICBpZiAoc3RhdHVzID09IFBWX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG9ubHkgd2F5IHlvdSBjYW4gZW5kIHVwIGJlaW5nIGhlcmUgaXMgaW4gdGhlIGxhc3QgcGFja2V0LGFuZCB0aGVyZSBpcyBzdHVmZmluZyBhdAorICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgZmlyc3QgcGFydGl0aW9uICovCisgICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBNT1RJT05fTUFSS0VSX0NPTUJfTEVOR1RIKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KKyAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0Rmlyc3RQYXJ0KTsKKyAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OworICAgICAgICAgICAgLyogY29uY2VhbG1lbnQgd2lsbCBiZSB0YWtlbiBjYXJlIG9mIGluIHRoZSB1cHBlciBsYXllciAgKi8KKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZGVjb2RlIHRoZSBzZWNvbmQgcGFydGl0aW9uICovCisgICAgc3RhcnRTZWNvbmRQYXJ0ID0gZ2V0UG9pbnRlcihzdHJlYW0pOworICAgIFFQID0gdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplcjsKKworICAgIG1iX2VuZCA9IHZpZGVvLT5tYm51bTsKKworICAgIGZvciAobWJudW0gPSBtYl9zdGFydDsgbWJudW0gPCBtYl9lbmQ7IG1ibnVtKyspCisgICAgeworICAgICAgICBNQnR5cGUgPSBNb2RlW21ibnVtXTsKKworICAgICAgICBpZiAoTUJ0eXBlID09IE1PREVfU0tJUFBFRCkKKyAgICAgICAgeworICAgICAgICAgICAgUVBNQlttYm51bV0gPSBRUDsgLyogIDAzLzAxLzAxICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnRyYV9NQiA9IChNQnR5cGUgJiBJTlRSQV9NQVNLKTsgLyogKE1CdHlwZSA9PSBNT0RFX0lOVFJBIHx8IE1CdHlwZSA9PSBNT0RFX0lOVFJBX1EpICovCisgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyhtYm51bSwgbk1CUGVyUm93KTsgICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbmJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCisgICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7CisKKyAgICAgICAgLyogdGhlcmUgaXMgYWx3YXlzIGFjZGNwcmVkaWN0aW9uIGluIERhdGFQYXJ0IG1vZGUgICAgMDQvMTAvMDEgKi8KKyAgICAgICAgaWYgKGludHJhX01CKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAodWludDgpIEJpdHN0cmVhbVJlYWQxQml0c19JTkxJTkUoc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIENCUFkgPSBQVl9WbGNEZWNDQlBZKHN0cmVhbSwgaW50cmFfTUIpOworICAgICAgICBpZiAoQ0JQWSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KKyAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgLyogQ29uY2VhbCBzZWNvbmQgcGFydGl0aW9uLCAgNS8xNS8yMDAwICovCisgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRTZWNvbmRQYXJ0KTsKKyAgICAgICAgICAgIENvbmNlYWxUZXh0dXJlX1AodmlkZW8sIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dIHw9ICh1aW50OCkoQ0JQWSA8PCAyKTsKKyAgICAgICAgaWYgKGludHJhX01CIHx8IE1CdHlwZSA9PSBNT0RFX0lOVEVSX1EpICAgICAgICAgICAgICAgICAgICAgLyogIDA0LzI2LzAxICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEdldE1CaGVhZGVyRGF0YVBhcnRfRFFVQU5UX0RDKHZpZGVvLCAmUVApOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOyAgICAgICAgLyogIDA0LzI3LzAxICovCisgICAgICAgIFFQTUJbbWJudW1dID0gUVA7CisgICAgfQorCisgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7ICAvKiAgMDQvMjcvMDEgKi8KKworICAgIGZvciAobWJudW0gPSBtYl9zdGFydDsgbWJudW0gPCBtYl9lbmQ7IG1ibnVtKyspCisgICAgeworICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKyAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1cobWJudW0sIG5NQlBlclJvdyk7ICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbmJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCisgICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7CisKKworICAgICAgICBpZiAoTW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkZWNvZGUgdGhlIERDVCBjb2VmaWNpZW50cyBmb3IgdGhlIE1CICovCisgICAgICAgICAgICBzdGF0dXMgPSBHZXRNQkRhdGFfRGF0YVBhcnQodmlkZW8pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KKyAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKworICAgICAgICAgICAgICAgIC8qIENvbmNlYWwgc2Vjb25kIHBhcnRpdGlvbiwgIDUvMTUvMjAwMCAqLworICAgICAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydFNlY29uZFBhcnQpOworICAgICAgICAgICAgICAgIENvbmNlYWxUZXh0dXJlX1AodmlkZW8sIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMTsgIC8qICAwNC8yNy8wMSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgIC8vIFNLSVBQRUQKKworICAgICAgICAgICAgLyogTW90aW9uIGNvbXBlbnNhdGlvbiBhbmQgcHV0IGl0IHRvIHZpZGVvLT5tYmxvY2stPnByZWRfYmxvY2sgKi8KKyAgICAgICAgICAgIFNraXBwZWRNQk1vdGlvbkNvbXAodmlkZW8pOworCisgICAgICAgICAgICAvL29zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19yb3cgKyB2aWRlby0+bWJudW1fY29sLCAwLCBzaXplb2YodHlwZURDQUNTdG9yZSkpOyAvKiAgU0tJUFBFRF9BQ0RDICovCisgICAgICAgICAgICAvL29zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19jb2wsIDAsIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CisgICAgICAgICAgICAvKiAgMDgvMDgvMjAwNSAqLworICAgICAgICAgICAgcGJ5dGUgPSAodWludDgqKSh2aWRlby0+cHJlZERDQUNfcm93ICsgdmlkZW8tPm1ibnVtX2NvbCk7CisgICAgICAgICAgICBaRVJPX09VVF82NEJZVEVTKHBieXRlKTsKKyAgICAgICAgICAgIHBieXRlID0gKHVpbnQ4KikodmlkZW8tPnByZWREQ0FDX2NvbCk7CisgICAgICAgICAgICBaRVJPX09VVF82NEJZVEVTKHBieXRlKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgdmFsaWRfc3R1ZmZpbmcgPSB2YWxpZFN0dWZmaW5nKHN0cmVhbSk7ICAgLyogICovCisgICAgaWYgKCF2YWxpZF9zdHVmZmluZykKKyAgICB7CisgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRTZWNvbmRQYXJ0KTsgLyogICovCisgICAgICAgIENvbmNlYWxUZXh0dXJlX1AodmlkZW8sIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOworCisgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgIH0KKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEdldE1CaGVhZGVyRGF0YVBhcnRfRFFVQU5UX0RDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMjYvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWNvZGUgRFFVQU5UIGFuZCBEQyBpbiBEYXRhIFBhcnRpdGlvbmVkIE1vZGUgZm9yIGJvdGggICAgICAgKi8KKy8qICAgICAgICAgICAgIEktVk9QIGFuZCBQLVZPUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgUFZfRkFJTCBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6IDAyLzEzLzIwMDEgbmV3IEFDREMgcHJlZGljdGlvbiBzdHJ1Y3R1cmUsICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBHZXRNQmhlYWRlckRhdGFQYXJ0X0RRVUFOVF9EQyhWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQxNiAqUVApCit7CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07CisgICAgaW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIGludCBpbnRyYV9kY192bGNfdGhyID0gdmlkZW8tPmN1cnJWb3AtPmludHJhRENWbGNUaHI7CisgICAgdWludDggKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOworICAgIGludCAgTUJ0eXBlID0gTW9kZVttYm51bV07CisgICAgdHlwZURDU3RvcmUgKkRDID0gdmlkZW8tPnByZWREQyArIG1ibnVtOworICAgIGludCAgY29tcDsKKyAgICBCb29sIHN3aXRjaGVkOworICAgIHVpbnQgIERRVUFOVDsKKyAgICBpbnQxNiBRUF90bXA7CisKKyAgICBjb25zdCBzdGF0aWMgaW50ICBEUV90YWJbNF0gPSB7IC0xLCAtMiwgMSwgMn07CisKKyAgICBpZiAoTUJ0eXBlICYgUV9NQVNLKSAgICAgICAgICAgICAvKiBJTlRSQV9RIHx8IElOVEVSX1EgKi8KKyAgICB7CisgICAgICAgIERRVUFOVCA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKKyAgICAgICAgKlFQICs9IERRX3RhYltEUVVBTlRdOworCisgICAgICAgIGlmICgqUVAgPCAxKSAqUVAgPSAxOworICAgICAgICBlbHNlIGlmICgqUVAgPiAzMSkgKlFQID0gMzE7CisgICAgfQorICAgIGlmIChNQnR5cGUgJiBJTlRSQV9NQVNLKSAgLyogSU5UUkEgfHwgSU5UUkFfUSAqLyAvKiBubyBzd2l0Y2gsIGNvZGUgREMgc2VwYXJhdGVseSAqLworICAgIHsKKyAgICAgICAgUVBfdG1wID0gKlFQOyAgICAgICAgICAgICAgICAgICAgICAvKiBydW5uaW5nIFFQICAwNC8yNi8wMSovCisgICAgICAgIHN3aXRjaGVkID0gMDsKKyAgICAgICAgaWYgKGludHJhX2RjX3ZsY190aHIpICAgICAgICAgICAgICAgICAvKiAgMDQvMjcvMDEgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT51c2VQcmV2UVApCisgICAgICAgICAgICAgICAgUVBfdG1wID0gdmlkZW8tPlFQTUJbbWJudW0tMV07CisgICAgICAgICAgICBzd2l0Y2hlZCA9IChpbnRyYV9kY192bGNfdGhyID09IDcgfHwgUVBfdG1wID49IGludHJhX2RjX3ZsY190aHIgKiAyICsgMTEpOworICAgICAgICB9CisgICAgICAgIGlmICghc3dpdGNoZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRGVjb2RlUHJlZGljdGVkSW50cmFEQyhjb21wLCBzdHJlYW0sICgqREMgKyBjb21wKSk7ICAgLyogIDAzLzAxLzAxICovCisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCpEQylbY29tcF0gPSAwOyAgIC8qICAwNC8yNi8wMSBuZWVkZWQgZm9yIHN3aXRjaGVkIGNhc2UqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCisqICAgICAgIDA0LzI1LzIwMDAgOiBJbml0aWFsIG1vZGlmaWNhdGlvbiB0byB0aGUgbmV3IFBWIExpYiBmb3JtYXQuCisqICAgICAgIDA0LzE3LzIwMDEgOiBuZXcgQUNEQyBwcmVkIHN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50RW5kKioqKioqKiovCitQVl9TVEFUVVMgR2V0TUJoZWFkZXJEYXRhUGFydF9QKFZpZGVvRGVjRGF0YSAqdmlkZW8pCit7CisgICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07CisgICAgaW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKKyAgICB0eXBlRENTdG9yZSAqREMgPSB2aWRlby0+cHJlZERDICsgbWJudW07CisgICAgdWludCBub19kY3RfZmxhZzsKKyAgICBpbnQgY29tcDsKKyAgICBpbnQgTUNCUEM7CisKKyAgICBub19kY3RfZmxhZyA9IEJpdHN0cmVhbVJlYWQxQml0c19JTkxJTkUoc3RyZWFtKTsKKworICAgIGlmIChub19kY3RfZmxhZykKKyAgICB7CisgICAgICAgIC8qIHNraXBwZWQgbWFjcm9ibG9jayAqLworICAgICAgICBNb2RlW21ibnVtXSA9IE1PREVfU0tJUFBFRDsKKworICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQorICAgICAgICB7CisgICAgICAgICAgICAoKkRDKVtjb21wXSA9IG1pZF9ncmF5OworICAgICAgICAgICAgLyogIEFDREMgUkVNT1ZFIEFDIGNvZWZzIGFyZSBzZXQgaW4gRGVjb2RlRGF0YVBhcnRfUCAqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGNvZGVkIG1hY3JvYmxvY2sgKi8KKyAgICAgICAgTUNCUEMgPSBQVl9WbGNEZWNNQ0JQQ19jb21faW50ZXIoc3RyZWFtKTsKKworICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKE1DQlBDKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICBNb2RlW21ibnVtXSA9ICh1aW50OClNQnR5cGVfbW9kZVtNQ0JQQyAmIDddOworICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dID0gKHVpbnQ4KSgoTUNCUEMgPj4gNCkgJiAzKTsKKyAgICB9CisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKKyogICAgICAgMDQvMTcvMDEgIG5ldyBBQ0RDIHByZWQgc3RydWN0dXJlLCByZW9yZ2FuaXplZCBjb2RlLCBjbGVhbnVwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRFbmQqKioqKioqKi8KK1BWX1NUQVRVUyBHZXRNQkRhdGFfRGF0YVBhcnQoVmlkZW9EZWNEYXRhICp2aWRlbykKK3sKKyAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgaW50MTYgKmRhdGFCbG9jazsKKyAgICBNYWNyb0Jsb2NrICptYmxvY2sgPSB2aWRlby0+bWJsb2NrOworICAgIGludCBRUCA9IHZpZGVvLT5RUE1CW21ibnVtXTsKKyAgICBpbnQzMiBvZmZzZXQ7CisgICAgUElYRUwgKmNfY29tcDsKKyAgICBpbnQgd2lkdGggPSB2aWRlby0+d2lkdGg7CisgICAgaW50IGludHJhX2RjX3ZsY190aHIgPSB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RocjsKKyAgICB1aW50IENCUCA9IHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV07CisgICAgdWludDggbW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOworICAgIGludCB4X3BvcyA9IHZpZGVvLT5tYm51bV9jb2w7CisgICAgdHlwZURDU3RvcmUgKkRDID0gdmlkZW8tPnByZWREQyArIG1ibnVtOworICAgIGludCAgbmNvZWZmc1s2XSwgKm5vX2NvZWZmID0gbWJsb2NrLT5ub19jb2VmZjsKKyAgICBpbnQgIGNvbXA7CisgICAgQm9vbCAgc3dpdGNoZWQ7CisgICAgaW50IFFQX3RtcCA9IFFQOworCisgICAgaW50IHlfcG9zID0gdmlkZW8tPm1ibnVtX3JvdzsKKworCisKKworICAgIC8qICBvc2NsX21lbXNldChtYmxvY2stPmJsb2NrLCAwLCBzaXplb2YodHlwZU1CU3RvcmUpKTsgICAgQXVnIDksMjAwNSAqLworCisgICAgaWYgKG1vZGUgJiBJTlRSQV9NQVNLKSAvKiBNT0RFX0lOVFJBIHx8IG1vZGUgPT0gTU9ERV9JTlRSQV9RICovCisgICAgeworICAgICAgICBzd2l0Y2hlZCA9IDA7CisgICAgICAgIGlmIChpbnRyYV9kY192bGNfdGhyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPnVzZVByZXZRUCkKKyAgICAgICAgICAgICAgICBRUF90bXAgPSB2aWRlby0+UVBNQlttYm51bS0xXTsgICAvKiBydW5uaW5nIFFQICAwNC8yNi8wMSAqLworCisgICAgICAgICAgICBzd2l0Y2hlZCA9IChpbnRyYV9kY192bGNfdGhyID09IDcgfHwgUVBfdG1wID49IGludHJhX2RjX3ZsY190aHIgKiAyICsgMTEpOworICAgICAgICB9CisKKyAgICAgICAgbWJsb2NrLT5EQ1NjYWxhckx1bSA9IGNhbF9kY19zY2FsZXIoUVAsIExVTUlOQU5DRV9EQ19UWVBFKTsgICAgIC8qICAgQUNEQyAwMy8wMS8wMSAqLworICAgICAgICBtYmxvY2stPkRDU2NhbGFyQ2hyID0gY2FsX2RjX3NjYWxlcihRUCwgQ0hST01JTkFOQ0VfRENfVFlQRSk7CisKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YUJsb2NrID0gbWJsb2NrLT5ibG9ja1tjb21wXTsgICAgLyosIDEwLzIwLzIwMDAgKi8KKworICAgICAgICAgICAgZGF0YUJsb2NrWzBdID0gKCpEQylbY29tcF07CisKKyAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludHJhQmxvY2sodmlkZW8sIGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoZWQsIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOworCisgICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbY29tcF0pKSAgICAgICAgIC8qICAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hlZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KChkYXRhQmxvY2sgKyAxKSwgMCwgc2l6ZW9mKGludDE2KSo2Myk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9fY29lZmZbY29tcF0gPSBuY29lZmZzW2NvbXBdOworICAgICAgICAgICAgLyogIG1vZGlmaWVkIHRvIG5ldyBzZW1hcGhvcmUgZm9yIHBvc3QtcHJvYyAqLworICAgICAgICAgICAgLy8gRnV0dXJlIHdvcms6OiBjYW4gYmUgY29tYmluZWQgaW4gdGhlIGRlcXVhbnQgZnVuY3Rpb24KKyAgICAgICAgICAgIC8vIEB0b2RvIERlYmxvY2tpbmcgU2VtYXBob3JlIGZvciBJTlRSQSBibG9jaworICAgICAgICB9CisgICAgICAgIE1CbG9ja0lEQ1QodmlkZW8pOworICAgIH0KKyAgICBlbHNlIC8qIE1PREUgSU5URVIqLworICAgIHsKKworCisKKworICAgICAgICBNQk1vdGlvbkNvbXAodmlkZW8sIENCUCk7CisgICAgICAgIG9mZnNldCA9IChpbnQzMikoeV9wb3MgPDwgNCkgKiB3aWR0aCArICh4X3BvcyA8PCA0KTsKKyAgICAgICAgY19jb21wICA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIG9mZnNldDsKKworCisgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA0OyBjb21wKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICgqREMpW2NvbXBdID0gbWlkX2dyYXk7CisKKyAgICAgICAgICAgIGlmIChDQlAgJiAoMSA8PCAoNSAtIGNvbXApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCBjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgJm1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKKyAgICAgICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbY29tcF0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKworCisgICAgICAgICAgICAgICAgQmxvY2tJRENUKGNfY29tcCArIChjb21wJjIpKih3aWR0aCA8PCAyKSArIDgqKGNvbXAmMSksIG1ibG9jay0+cHJlZF9ibG9jayArIChjb21wJjIpKjY0ICsgOCooY29tcCYxKSwgbWJsb2NrLT5ibG9ja1tjb21wXSwgd2lkdGgsIG5jb2VmZnNbY29tcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCBtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogIEB0b2RvIERlYmxvY2tpbmcgU2VtYXBob3JlIGZvciBJTlRSQSBibG9jaywgZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAgKi8KKyAgICAgICAgfQorCisgICAgICAgICgqREMpWzRdID0gbWlkX2dyYXk7CisgICAgICAgIGlmIChDQlAgJiAyKQorICAgICAgICB7CisgICAgICAgICAgICBuY29lZmZzWzRdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgJm1ibG9jay0+Yml0bWFwcm93WzRdKTsKKyAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1s0XSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNTYsIG1ibG9jay0+YmxvY2tbNF0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNF0sIG1ibG9jay0+Yml0bWFwcm93WzRdKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbmNvZWZmc1s0XSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgKCpEQylbNV0gPSBtaWRfZ3JheTsKKyAgICAgICAgaWYgKENCUCAmIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jb2VmZnNbNV0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCAmbWJsb2NrLT5iaXRtYXByb3dbNV0pOworICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzWzVdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI2NCwgbWJsb2NrLT5ibG9ja1s1XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s1XSwKKyAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs1XSwgbWJsb2NrLT5iaXRtYXByb3dbNV0pOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBuY29lZmZzWzVdID0gMDsKKyAgICAgICAgfQorCisKKworCisgICAgICAgIC8qIE1vdGlvbiBjb21wZW5zYXRpb24gYW5kIHB1dCBpdCB0byB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrICovCisgICAgfQorICAgIHJldHVybiBQVl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGNhY19wcmVkaWN0aW9uLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RjYWNfcHJlZGljdGlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RjYWNfcHJlZGljdGlvbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RjYWNfcHJlZGljdGlvbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVjX3ByZWRfaW50cmFfZGMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZWNfcHJlZF9pbnRyYV9kYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9vdXRzaWRlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX291dHNpZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9vdXRzaWRlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfb3V0c2lkZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWY1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAKQEAgLTAsMCArMSw2NzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAiaWRjdC5oIgorI2luY2x1ZGUgIm1vdGlvbl9jb21wLmgiCisKKyNpZmRlZiBGQVNUX0lEQ1QKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgdmNhX2lkY3QuYyA6IGNyZWF0ZWQgNi8xLzk5IGZvciBzZXZlcmFsIG9wdGlvbnMKKyogICAgICAgICAgICAgICAgICAgICBvZiBoYXJkLWNvZGVkIHJlZHVjZWQgaWRjdCBmdW5jdGlvbiAodXNpbmcgbnpfY29lZnMpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vcHJldGVzdGVkIHZlcnNpb24KK3ZvaWQgaWRjdHJvdzAoaW50MTYgKiwgdWludDggKiwgdWludDggKiwgaW50KQoreworICAgIHJldHVybiA7Cit9Cit2b2lkIGlkY3Rjb2wwKGludDE2ICopCit7CisgICAgcmV0dXJuIDsKK30KKworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0cm93MShpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKQoreworICAgIC8qIHNob3J0Y3V0ICovCisgICAgaW50IHRtcDsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICB3aWR0aCAtPSA0OworICAgIGRzdCAtPSB3aWR0aDsKKyAgICBwcmVkIC09IDEyOworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHRtcCA9ICgqKGJsayArPSA4KSArIDMyKSA+PiA2OworICAgICAgICAqYmxrID0gMDsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gdG1wICsgKHByZWRfd29yZCAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICByZXMyID0gdG1wICsgKChwcmVkX3dvcmQgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDE2KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMjQpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gdG1wICsgKHByZWRfd29yZCAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICByZXMyID0gdG1wICsgKChwcmVkX3dvcmQgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDE2KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMjQpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGlkY3Rjb2wxKGludDE2ICpibGspCit7IC8qIHNob3J0Y3V0ICovCisgICAgYmxrWzBdID0gYmxrWzhdID0gYmxrWzE2XSA9IGJsa1syNF0gPSBibGtbMzJdID0gYmxrWzQwXSA9IGJsa1s0OF0gPSBibGtbNTZdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtbMF0gPDwgMzsKKyAgICByZXR1cm47Cit9CisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdHJvdzIoaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4NCwgeDU7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgd2lkdGggLT0gNDsKKyAgICBkc3QgLT0gd2lkdGg7CisgICAgcHJlZCAtPSAxMjsKKyAgICBibGsgLT0gODsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICAvKiBzaG9ydGN1dCAqLworICAgICAgICB4NCA9IGJsa1s5XTsKKyAgICAgICAgYmxrWzldID0gMDsKKyAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7CisgICAgICAgICpibGsgPSAwOyAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDUgPSAoVzcgKiB4NCArIDQpID4+IDM7CisgICAgICAgIHg0ID0gKFcxICogeDQgKyA0KSA+PiAzOworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDEgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwICsgeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDAgKyB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MCArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwICsgeDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwIC0geDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MCAtIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwIC0geDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuIDsKK30KKworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0Y29sMihpbnQxNiAqYmxrKQoreworICAgIGludDMyIHgwLCB4MSwgeDMsIHg1LCB4NzsvLywgeDg7CisKKyAgICB4MSA9IGJsa1s4XTsKKyAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKKyAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisKKyAgICB4NyA9IFc3ICogeDE7CisgICAgeDEgPSBXMSAqIHgxOworCisgICAgeDMgPSB4NzsKKyAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7CisgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OworCisgICAgYmxrWzBdID0gKHgwICsgeDEpID4+IDg7CisgICAgYmxrWzhdID0gKHgwICsgeDcpID4+IDg7CisgICAgYmxrWzE2XSA9ICh4MCArIHg1KSA+PiA4OworICAgIGJsa1syNF0gPSAoeDAgKyB4MykgPj4gODsKKyAgICBibGtbNTZdID0gKHgwIC0geDEpID4+IDg7CisgICAgYmxrWzQ4XSA9ICh4MCAtIHg3KSA+PiA4OworICAgIGJsa1s0MF0gPSAoeDAgLSB4NSkgPj4gODsKKyAgICBibGtbMzJdID0gKHgwIC0geDMpID4+IDg7CisKKyAgICByZXR1cm4gOworfQorCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCit2b2lkIGlkY3Ryb3czKGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICB3aWR0aCAtPSA0OworICAgIGRzdCAtPSB3aWR0aDsKKyAgICBwcmVkIC09IDEyOworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHgxID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisgICAgICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KKyAgICAgICAgLyogYm90aCB4Mm9yeDYgYW5kIHgwb3J4NCAqLworCisgICAgICAgIHg0ID0geDA7CisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MCAtIHgyOworICAgICAgICB4MCArPSB4MjsKKyAgICAgICAgeDIgPSB4ODsKKyAgICAgICAgeDggPSB4NCAtIHg2OworICAgICAgICB4NCArPSB4NjsKKyAgICAgICAgeDYgPSB4ODsKKworICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgzID0geDc7CisgICAgICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDAgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NCArIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg2ICsgeDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDIgKyB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDIgLSB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg0IC0geDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdGNvbDMoaW50MTYgKmJsaykKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworCisgICAgeDIgPSBibGtbMTZdOworICAgIHgxID0gYmxrWzhdOworICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OworCisgICAgeDQgPSB4MDsKKyAgICB4NiA9IFc2ICogeDI7CisgICAgeDIgPSBXMiAqIHgyOworICAgIHg4ID0geDAgLSB4MjsKKyAgICB4MCArPSB4MjsKKyAgICB4MiA9IHg4OworICAgIHg4ID0geDQgLSB4NjsKKyAgICB4NCArPSB4NjsKKyAgICB4NiA9IHg4OworCisgICAgeDcgPSBXNyAqIHgxOworICAgIHgxID0gVzEgKiB4MTsKKyAgICB4MyA9IHg3OworICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKKyAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7CisKKyAgICBibGtbMF0gPSAoeDAgKyB4MSkgPj4gODsKKyAgICBibGtbOF0gPSAoeDQgKyB4NykgPj4gODsKKyAgICBibGtbMTZdID0gKHg2ICsgeDUpID4+IDg7CisgICAgYmxrWzI0XSA9ICh4MiArIHgzKSA+PiA4OworICAgIGJsa1s1Nl0gPSAoeDAgLSB4MSkgPj4gODsKKyAgICBibGtbNDhdID0gKHg0IC0geDcpID4+IDg7CisgICAgYmxrWzQwXSA9ICh4NiAtIHg1KSA+PiA4OworICAgIGJsa1szMl0gPSAoeDIgLSB4MykgPj4gODsKKworICAgIHJldHVybjsKK30KKworCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCit2b2lkIGlkY3Ryb3c0KGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICB3aWR0aCAtPSA0OworICAgIGRzdCAtPSB3aWR0aDsKKyAgICBwcmVkIC09IDEyOworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHgxID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MyA9IGJsa1sxMV07CisgICAgICAgIGJsa1sxMV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIHg0ID0geDA7CisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MCAtIHgyOworICAgICAgICB4MCArPSB4MjsKKyAgICAgICAgeDIgPSB4ODsKKyAgICAgICAgeDggPSB4NCAtIHg2OworICAgICAgICB4NCArPSB4NjsKKyAgICAgICAgeDYgPSB4ODsKKworICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHg1ID0gKFczICogeDMgKyA0KSA+PiAzOworICAgICAgICB4MyA9ICgtIFc1ICogeDMgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgxIC0geDU7CisgICAgICAgIHgxICs9IHg1OworICAgICAgICB4NSA9IHg4OworICAgICAgICB4OCA9IHg3IC0geDM7CisgICAgICAgIHgzICs9IHg3OworICAgICAgICB4NyA9ICgxODEgKiAoeDUgKyB4OCkgKyAxMjgpID4+IDg7CisgICAgICAgIHg1ID0gKDE4MSAqICh4NSAtIHg4KSArIDEyOCkgPj4gODsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDQgKyB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NiArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgyICsgeDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgyIC0geDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDYgLSB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NCAtIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwIC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuIDsKK30KKworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0Y29sNChpbnQxNiAqYmxrKQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgeDIgPSBibGtbMTZdOworICAgIHgxID0gYmxrWzhdOworICAgIHgzID0gYmxrWzI0XTsKKyAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKKworICAgIHg0ID0geDA7CisgICAgeDYgPSBXNiAqIHgyOworICAgIHgyID0gVzIgKiB4MjsKKyAgICB4OCA9IHgwIC0geDI7CisgICAgeDAgKz0geDI7CisgICAgeDIgPSB4ODsKKyAgICB4OCA9IHg0IC0geDY7CisgICAgeDQgKz0geDY7CisgICAgeDYgPSB4ODsKKworICAgIHg3ID0gVzcgKiB4MTsKKyAgICB4MSA9IFcxICogeDE7CisgICAgeDUgPSBXMyAqIHgzOworICAgIHgzID0gLVc1ICogeDM7CisgICAgeDggPSB4MSAtIHg1OworICAgIHgxICs9IHg1OworICAgIHg1ID0geDg7CisgICAgeDggPSB4NyAtIHgzOworICAgIHgzICs9IHg3OworICAgIHg3ID0gKDE4MSAqICh4NSArIHg4KSArIDEyOCkgPj4gODsKKyAgICB4NSA9ICgxODEgKiAoeDUgLSB4OCkgKyAxMjgpID4+IDg7CisKKworICAgIGJsa1swXSA9ICh4MCArIHgxKSA+PiA4OworICAgIGJsa1s4XSA9ICh4NCArIHg3KSA+PiA4OworICAgIGJsa1sxNl0gPSAoeDYgKyB4NSkgPj4gODsKKyAgICBibGtbMjRdID0gKHgyICsgeDMpID4+IDg7CisgICAgYmxrWzU2XSA9ICh4MCAtIHgxKSA+PiA4OworICAgIGJsa1s0OF0gPSAoeDQgLSB4NykgPj4gODsKKyAgICBibGtbNDBdID0gKHg2IC0geDUpID4+IDg7CisgICAgYmxrWzMyXSA9ICh4MiAtIHgzKSA+PiA4OworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0cm93MF9pbnRyYShpbnQxNiAqLCBQSVhFTCAqLCBpbnQpCit7CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0cm93MV9pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoKQoreworICAgIC8qIHNob3J0Y3V0ICovCisgICAgaW50MzIgdG1wOworICAgIGludCBpID0gODsKKyAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7CisgICAgdWludDMyIHdvcmQ7CisKKyAgICBjb21wIC09IG9mZnNldDsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgdG1wID0gKChibGtbMF0gKyAzMikgPj4gNik7CisgICAgICAgIGJsa1swXSA9IDA7CisgICAgICAgIENMSVBfUkVTVUxUKHRtcCkKKworICAgICAgICB3b3JkID0gKHRtcCA8PCA4KSB8IHRtcDsKKyAgICAgICAgd29yZCA9ICh3b3JkIDw8IDE2KSB8IHdvcmQ7CisKKyAgICAgICAgKigodWludDMyKikoY29tcCArPSBvZmZzZXQpKSA9IHdvcmQ7CisgICAgICAgICooKHVpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOworCisKKworCisgICAgICAgIGJsayArPSBCX1NJWkU7CisgICAgfQorICAgIHJldHVybjsKK30KKworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0cm93Ml9pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoKQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHg0LCB4NSwgdGVtcDsKKyAgICBpbnQgaSA9IDg7CisgICAgaW50IG9mZnNldCA9IHdpZHRoOworICAgIGludDMyIHdvcmQ7CisKKyAgICBjb21wIC09IG9mZnNldDsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgLyogc2hvcnRjdXQgKi8KKyAgICAgICAgeDQgPSBibGtbMV07CisgICAgICAgIGJsa1sxXSA9IDA7CisgICAgICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgOCkgKyA4MTkyOworICAgICAgICBibGtbMF0gPSAwOyAgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg1ID0gKFc3ICogeDQgKyA0KSA+PiAzOworICAgICAgICB4NCA9IChXMSAqIHg0ICsgNCkgPj4gMzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHgxID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgd29yZCA9ICgoeDAgKyB4NCkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh3b3JkKQorCisgICAgICAgIHRlbXAgPSAoKHgwICsgeDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKKyAgICAgICAgdGVtcCA9ICgoeDAgKyB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgdGVtcCA9ICgoeDAgKyB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKKyAgICAgICAgKigoaW50MzIqKShjb21wICs9IG9mZnNldCkpID0gd29yZDsKKworICAgICAgICB3b3JkID0gKCh4MCAtIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCisgICAgICAgIHRlbXAgPSAoKHgwIC0geDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKKyAgICAgICAgdGVtcCA9ICgoeDAgLSB4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgdGVtcCA9ICgoeDAgLSB4NCkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKKyAgICAgICAgKigoaW50MzIqKShjb21wICsgNCkpID0gd29yZDsKKworICAgICAgICBibGsgKz0gQl9TSVpFOworICAgIH0KKyAgICByZXR1cm4gOworfQorCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCit2b2lkIGlkY3Ryb3czX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKKyAgICBpbnQgaSA9IDg7CisgICAgaW50IG9mZnNldCA9IHdpZHRoOworICAgIGludDMyIHdvcmQ7CisKKyAgICBjb21wIC09IG9mZnNldDsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1syXTsKKyAgICAgICAgYmxrWzJdID0gMDsKKyAgICAgICAgeDEgPSBibGtbMV07CisgICAgICAgIGJsa1sxXSA9IDA7CisgICAgICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgOCkgKyA4MTkyOworICAgICAgICBibGtbMF0gPSAwOy8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisgICAgICAgIC8qIGJvdGggeDJvcng2IGFuZCB4MG9yeDQgKi8KKworICAgICAgICB4NCA9IHgwOworICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDAgLSB4MjsKKyAgICAgICAgeDAgKz0geDI7CisgICAgICAgIHgyID0geDg7CisgICAgICAgIHg4ID0geDQgLSB4NjsKKyAgICAgICAgeDQgKz0geDY7CisgICAgICAgIHg2ID0geDg7CisKKyAgICAgICAgeDcgPSAoVzcgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgxID0gKFcxICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MyA9IHg3OworICAgICAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7CisgICAgICAgIHg3ID0gKDE4MSAqICh4MSArIHg3KSArIDEyOCkgPj4gODsKKworICAgICAgICB3b3JkID0gKCh4MCArIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCisgICAgICAgIHRlbXAgPSAoKHg0ICsgeDcpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKKworCisgICAgICAgIHRlbXAgPSAoKHg2ICsgeDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7CisKKyAgICAgICAgdGVtcCA9ICgoeDIgKyB4MykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKKyAgICAgICAgKigoaW50MzIqKShjb21wICs9IG9mZnNldCkpID0gd29yZDsKKworICAgICAgICB3b3JkID0gKCh4MiAtIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCisKKyAgICAgICAgdGVtcCA9ICgoeDYgLSB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOworCisgICAgICAgIHRlbXAgPSAoKHg0IC0geDcpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7CisKKyAgICAgICAgdGVtcCA9ICgoeDAgLSB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKKyAgICAgICAgKigoaW50MzIqKShjb21wICsgNCkpID0gd29yZDsKKworICAgICAgICBibGsgKz0gQl9TSVpFOworICAgIH0KKyAgICByZXR1cm4gOworfQorCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCit2b2lkIGlkY3Ryb3c0X2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKKyAgICBpbnQgaSA9IDg7CisgICAgaW50IG9mZnNldCA9IHdpZHRoOworICAgIGludDMyIHdvcmQ7CisKKyAgICBjb21wIC09IG9mZnNldDsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1syXTsKKyAgICAgICAgYmxrWzJdID0gMDsKKyAgICAgICAgeDEgPSBibGtbMV07CisgICAgICAgIGJsa1sxXSA9IDA7CisgICAgICAgIHgzID0gYmxrWzNdOworICAgICAgICBibGtbM10gPSAwOworICAgICAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDgpICsgODE5MjsKKyAgICAgICAgYmxrWzBdID0gMDsvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICB4NCA9IHgwOworICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDAgLSB4MjsKKyAgICAgICAgeDAgKz0geDI7CisgICAgICAgIHgyID0geDg7CisgICAgICAgIHg4ID0geDQgLSB4NjsKKyAgICAgICAgeDQgKz0geDY7CisgICAgICAgIHg2ID0geDg7CisKKyAgICAgICAgeDcgPSAoVzcgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgxID0gKFcxICogeDEgKyA0KSA+PiAzOworICAgICAgICB4NSA9IChXMyAqIHgzICsgNCkgPj4gMzsKKyAgICAgICAgeDMgPSAoLSBXNSAqIHgzICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MSAtIHg1OworICAgICAgICB4MSArPSB4NTsKKyAgICAgICAgeDUgPSB4ODsKKyAgICAgICAgeDggPSB4NyAtIHgzOworICAgICAgICB4MyArPSB4NzsKKyAgICAgICAgeDcgPSAoMTgxICogKHg1ICsgeDgpICsgMTI4KSA+PiA4OworICAgICAgICB4NSA9ICgxODEgKiAoeDUgLSB4OCkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgd29yZCA9ICgoeDAgKyB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh3b3JkKQorCisgICAgICAgIHRlbXAgPSAoKHg0ICsgeDcpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKKworCisgICAgICAgIHRlbXAgPSAoKHg2ICsgeDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7CisKKyAgICAgICAgdGVtcCA9ICgoeDIgKyB4MykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKKyAgICAgICAgKigoaW50MzIqKShjb21wICs9IG9mZnNldCkpID0gd29yZDsKKworICAgICAgICB3b3JkID0gKCh4MiAtIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCisKKyAgICAgICAgdGVtcCA9ICgoeDYgLSB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOworCisgICAgICAgIHRlbXAgPSAoKHg0IC0geDcpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7CisKKyAgICAgICAgdGVtcCA9ICgoeDAgLSB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKKyAgICAgICAgKigoaW50MzIqKShjb21wICsgNCkpID0gd29yZDsKKworICAgICAgICBibGsgKz0gQl9TSVpFOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYXhfbGV2ZWwuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21heF9sZXZlbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYXhfbGV2ZWwuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWF4X2xldmVsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc2MGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwCkBAIC0wLDAgKzEsNTY1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIExPR19UQUcgIm00dl9oMjYzIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKKworIElucHV0czoKKyAgICB2aWRlbyA9IHBvaW50ZXIgdG8gc3RydWN0dXJlIG9mIHR5cGUgVmlkZW9EZWNEYXRhCisKKyBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6CisgICAgcm91bmR0YWIxNiA9IHJvdW5kaW5nIHRhYmxlCisKKyBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgorICAgIE5vbmUKKworIE91dHB1dHM6CisgICAgTm9uZQorCisgUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6CisgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuIGNvbnRlbnRzIGFyZSB0aGUgbmV3bHkgY2FsY3VsYXRlZCBsdW1pbmFuY2UKKyAgICAgIGRhdGEKKyAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gY29udGVudHMgYXJlIHRoZSBuZXdseSBjYWxjdWxhdGVkIGNocm9taW5hbmNlCisgICAgICBiIGRhdGEKKyAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gY29udGVudHMgYXJlIHRoZSBuZXdseSBjYWxjdWxhdGVkIGNocm9taW5hbmNlCisgICAgICByIGRhdGEKKyAgICB2aWRlby0+cHN0cHJjVHlwQ3VyIGNvbnRlbnRzIGFyZSB0aGUgdXBkYXRlZCBzZW1hcGhvcmUgcHJvcGFnYXRpb24KKyAgICAgIHZhbHVlcworCisgTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgorICAgIE5vbmUKKworIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6CisgICAgTm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBERVNDUklQVElPTgorCisgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBoaWdoIGxldmVsIG1vdGlvbiBjb21wZW5zYXRpb24gb24gdGhlIGx1bWluYW5jZSBhbmQKKyBjaHJvbWluYW5jZSBkYXRhLiBJdCBzZXRzIHVwIGFsbCB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb25zCisgdGhhdCBwZXJmb3JtIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcHJlZGljdGlvbiBhbmQgaXQgaW5pdGlhbGl6ZXMgdGhlCisgcG9pbnRlciB0byB0aGUgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZXMgb2YgYSBnaXZlbiBibG9jay4gSXQgYWxzbyBjaGVja3MKKyB0aGUgbW90aW9uIGNvbXBlbnNhdGlvbiBtb2RlIGluIG9yZGVyIHRvIGRldGVybWluZSB3aGljaCBsdW1pbmFuY2Ugb3IKKyBjaHJvbWluYW5jZSBwcmVkaWN0aW9uIGZ1bmN0aW9ucyB0byBjYWxsIGFuZCBkZXRlcm1pbmVzIGhvdyB0aGUgcG9zdAorIHByb2Nlc3Npbmcgc2VtYXBob3JlcyBhcmUgdXBkYXRlZC4KKworKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSU5DTFVERVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIm1wNGRlY19saWIuaCIKKyNpbmNsdWRlICJtb3Rpb25fY29tcC5oIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1BQ1JPUworOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgREVGSU5FUworOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAorOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCis7IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCis7IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogMDkvMjkvMjAwMCBicmluZyB0aGlzIGZyb20gbXA0ZGVmLmggKi8KKy8vIGNvbnN0IHN0YXRpYyBpbnQgcm91bmR0YWI0W10gPSB7MCwxLDEsMX07CisvLyBjb25zdCBzdGF0aWMgaW50IHJvdW5kdGFiOFtdID0gezAsMCwxLDEsMSwxLDEsMn07CisvKioqIDEwLzMwIGZvciBUUFMgKi8KKy8vIGNvbnN0IHN0YXRpYyBpbnQgcm91bmR0YWIxMltdID0gezAsMCwwLDEsMSwxLDEsMSwxLDEsMiwyfTsKKy8qIDEwLzMwIGZvciBUUFMgKioqLworY29uc3Qgc3RhdGljIGludCByb3VuZHRhYjE2W10gPSB7MCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMn07CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKKzsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKKzsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBDT0RFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIG1vZGlmaWVkIDMgQXVndXN0IDIwMDUgdG8gZG8gcHJlZGljdGlvbiBhbmQgcHV0IHRoZSByZXN1bHRzIGluCit2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrLCBubyBhZGRpbmcgd2l0aCByZXNpZHVlICovCisKK3ZvaWQgIE1CTW90aW9uQ29tcCgKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvLAorICAgIGludCBDQlAKKykKK3sKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBQcmV2aW91cyBWaWRlbyBPYmplY3QgUGxhbmUgKi8KKyAgICBWb3AgKnByZXYgPSB2aWRlby0+cHJldlZvcDsKKworICAgIC8qIEN1cnJlbnQgTWFjcm9ibG9jayAoTUIpIGluIHRoZSBWT1AgKi8KKyAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisKKyAgICAvKiBOdW1iZXIgb2YgTUIgcGVyIGRhdGEgcm93ICovCisgICAgaW50IE1CX2luX3dpZHRoID0gdmlkZW8tPm5NQlBlclJvdzsKKyAgICBpbnQgeXBvcywgeHBvczsKKyAgICBQSVhFTCAqY19jb21wLCAqY19wcmV2OworICAgIFBJWEVMICpjdV9jb21wLCAqY3VfcHJldjsKKyAgICBQSVhFTCAqY3ZfY29tcCwgKmN2X3ByZXY7CisgICAgaW50IGhlaWdodCwgd2lkdGgsIHByZWRfd2lkdGg7CisgICAgaW50IGltdiwgbXZ3aWR0aDsKKyAgICBpbnQzMiBvZmZzZXQ7CisgICAgdWludDggbW9kZTsKKyAgICB1aW50OCAqcHJlZF9ibG9jaywgKnByZWQ7CisKKyAgICAvKiBNb3Rpb24gdmVjdG9yIChkeCxkeSkgaW4gaGFsZi1wZWwgcmVzb2x1dGlvbiAqLworICAgIGludCBkeCwgZHk7CisKKyAgICBNT1QgcHhbNF0sIHB5WzRdOworICAgIGludCB4cHJlZCwgeXByZWQ7CisgICAgaW50IHhzdW07CisgICAgaW50IHJvdW5kMTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIFNldCByb3VuZGluZyB0eXBlICovCisgICAgLyogY2hhbmdlIGZyb20gYXJyYXkgdG8gc2luZ2xlIDA5LzI5LzIwMDAgKi8KKyAgICByb3VuZDEgPSAoaW50KSgxIC0gdmlkZW8tPmN1cnJWb3AtPnJvdW5kaW5nVHlwZSk7CisKKyAgICAvKiB3aWR0aCBvZiBsdW1pbmFuY2UgZGF0YSBpbiBwaXhlbHMgKHkgYXhpcykgKi8KKyAgICB3aWR0aCA9IHZpZGVvLT53aWR0aDsKKworICAgIC8qIGhlaWd0aCBvZiBsdW1pbmFuY2UgZGF0YSBpbiBwaXhlbHMgKHggYXhpcykgKi8KKyAgICBoZWlnaHQgPSB2aWRlby0+aGVpZ2h0OworCisgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgcm93ICovCisgICAgbXZ3aWR0aCA9IE1CX2luX3dpZHRoIDw8IDE7CisKKyAgICAvKiBzdGFydGluZyB5IHBvc2l0aW9uIGluIGN1cnJlbnQgTUI7IG9yaWdpbiBvZiBNQiAqLworICAgIHlwb3MgPSB2aWRlby0+bWJudW1fcm93IDw8IDQgOworICAgIC8qIHN0YXJ0aW5nIHggcG9zaXRpb24gaW4gY3VycmVudCBNQjsgb3JpZ2luIG9mIE1CICovCisgICAgeHBvcyA9IHZpZGVvLT5tYm51bV9jb2wgPDwgNCA7CisKKyAgICAvKiBvZmZzZXQgdG8gKHgseSkgcG9zaXRpb24gaW4gY3VycmVudCBsdW1pbmFuY2UgTUIgKi8KKyAgICAvKiBpbiBwaXhlbCByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiB5cG9zKndpZHRoIC0+IHJvdywgK3ggLT4gY29sdW1uICovCisgICAgb2Zmc2V0ID0gKGludDMyKXlwb3MgKiB3aWR0aCArIHhwb3M7CisKKyAgICAvKiBnZXQgbW9kZSBmb3IgY3VycmVudCBNQiAqLworICAgIG1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtXTsKKworICAgIC8qIGJsb2NrIGluZGV4ICovCisgICAgLyogaW12ID0gKHhwb3MvOCkgKyAoKHlwb3MvOCkgKiBtdndpZHRoKSAqLworICAgIGltdiA9IChvZmZzZXQgPj4gNikgLSAoeHBvcyA+PiA2KSArICh4cG9zID4+IDMpOworICAgIGlmIChtb2RlICYgSU5URVJfMVZNQVNLKQorICAgIHsKKyAgICAgICAgZHggPSBweFswXSA9IHB4WzFdID0gcHhbMl0gPSBweFszXSA9IHZpZGVvLT5tb3RYW2ltdl07CisgICAgICAgIGR5ID0gcHlbMF0gPSBweVsxXSA9IHB5WzJdID0gcHlbM10gPSB2aWRlby0+bW90WVtpbXZdOworICAgICAgICBpZiAoKGR4ICYgMykgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZHggPSBkeCA+PiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogeCBjb21wb25lbnQgb2YgTVYgaXMgb3InZWQgZm9yIHJvdW5kaW5nICg/KSAqLworICAgICAgICAgICAgZHggPSAoZHggPj4gMSkgfCAxOworICAgICAgICB9CisKKyAgICAgICAgLyogeSBjb21wb25lbnQgb2YgbW90aW9uIHZlY3RvcjsgZGl2aWRlIGJ5IDIgZm9yIHRvICovCisgICAgICAgIC8qIGNvbnZlcnQgdG8gZnVsbC1wZWwgcmVzb2x1dGlvbi4gICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoKGR5ICYgMykgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZHkgPSBkeSA+PiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogeSBjb21wb25lbnQgb2YgTVYgaXMgb3InZWQgZm9yIHJvdW5kaW5nICg/KSAqLworICAgICAgICAgICAgZHkgPSAoZHkgPj4gMSkgfCAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHB4WzBdID0gdmlkZW8tPm1vdFhbaW12XTsKKyAgICAgICAgcHhbMV0gPSB2aWRlby0+bW90WFtpbXYrMV07CisgICAgICAgIHB4WzJdID0gdmlkZW8tPm1vdFhbaW12K212d2lkdGhdOworICAgICAgICBweFszXSA9IHZpZGVvLT5tb3RYW2ltdittdndpZHRoKzFdOworICAgICAgICB4c3VtID0gcHhbMF0gKyBweFsxXSArIHB4WzJdICsgcHhbM107CisgICAgICAgIGR4ID0gUFZfU0lHTih4c3VtKSAqIChyb3VuZHRhYjE2WyhQVl9BQlMoeHN1bSkpICYgMHhGXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChQVl9BQlMoeHN1bSkpID4+IDQpIDw8IDEpKTsKKyAgICAgICAgcHlbMF0gPSB2aWRlby0+bW90WVtpbXZdOworICAgICAgICBweVsxXSA9IHZpZGVvLT5tb3RZW2ltdisxXTsKKyAgICAgICAgcHlbMl0gPSB2aWRlby0+bW90WVtpbXYrbXZ3aWR0aF07CisgICAgICAgIHB5WzNdID0gdmlkZW8tPm1vdFlbaW12K212d2lkdGgrMV07CisgICAgICAgIHhzdW0gPSBweVswXSArIHB5WzFdICsgcHlbMl0gKyBweVszXTsKKyAgICAgICAgZHkgPSBQVl9TSUdOKHhzdW0pICogKHJvdW5kdGFiMTZbKFBWX0FCUyh4c3VtKSkgJiAweEZdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFBWX0FCUyh4c3VtKSkgPj4gNCkgPDwgMSkpOworICAgIH0KKworICAgIC8qIFBvaW50ZXIgdG8gcHJldmlvdXMgbHVtaW5hbmNlIGZyYW1lICovCisgICAgY19wcmV2ICA9IHByZXYtPnlDaGFuOworICAgIGlmICghY19wcmV2KSB7CisgICAgICAgIEFMT0dFKCJiLzM1MjY5NjM1Iik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzUyNjk2MzUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByZWRfYmxvY2sgPSB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrOworCisgICAgLyogc29tZSBibG9ja3MgaGF2ZSBubyByZXNpZHVlIG9yIElOVEVSNFYgKi8KKyAgICAvKmlmIChtb2RlID09IE1PREVfSU5URVI0VikgICAwNS8wOC8xNSAqLworICAgIC8qIE1vdGlvbiBDb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB3aXRoaW4gYSBNQiAqLworICAgIC8qICg0IE1WIHBlciBNQikgKi8KKworCisKKyAgICAvKiBDYWxsIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgbHVtaW5hbmNlIHByZWRpY3Rpb24gKi8KKyAgICAvKiAgICAgIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXI0dih4cG9zLCB5cG9zLCBweCwgcHksIGNfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibG9jay0+cHJlZF9ibG9jaywgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcm91bmQxLCBtdndpZHRoLCAmeHN1bSwgJnlzdW0pOyovCisgICAgY19jb21wID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OworCisKKyAgICB4cHJlZCA9IChpbnQpKCh4cG9zIDw8IDEpICsgcHhbMF0pOworICAgIHlwcmVkID0gKGludCkoKHlwb3MgPDwgMSkgKyBweVswXSk7CisKKyAgICBpZiAoKENCUCA+PiA1KSYxKQorICAgIHsKKyAgICAgICAgcHJlZCA9IHByZWRfYmxvY2s7CisgICAgICAgIHByZWRfd2lkdGggPSAxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJlZCA9IGNfY29tcDsKKyAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOworICAgIH0KKworICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1WIHBvaW50cyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipCX1NJWkUpKSAmJgorICAgICAgICAgICAgeXByZWQgPj0gMCAmJiB5cHJlZCA8PSAoKGhlaWdodCA8PCAxKSAtICgyKkJfU0laRSkpKQorICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICA7CisgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsIGNfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKKyAgICB9CisKKworICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiB2YWx1ZXMgb3ZlciBjdXJyZW50IGx1bWluYW5jZSBNQiAqLworICAgIC8qIChibG9ja3MgMSk7IGFkZCBtb3Rpb24gdmVjdG9yIHByaW9yIHRvIGlucHV0OyAgICAgICAqLworICAgIC8qIGFkZCA4IHRvIHhfcG9zIHRvIGFkdmFuY2UgdG8gbmV4dCBibG9jayAgICAgICAgICovCisgICAgeHByZWQgPSAoaW50KSgoKHhwb3MgKyBCX1NJWkUpIDw8IDEpICsgcHhbMV0pOworICAgIHlwcmVkID0gKGludCkoKHlwb3MgPDwgMSkgKyBweVsxXSk7CisKKyAgICBpZiAoKENCUCA+PiA0KSYxKQorICAgIHsKKyAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyA4OworICAgICAgICBwcmVkX3dpZHRoID0gMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByZWQgPSBjX2NvbXAgKyA4OworICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmCisgICAgICAgICAgICB5cHJlZCA+PSAwICYmIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCisgICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsIGNfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKKyAgICB9CisKKworCisgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIHZhbHVlcyBvdmVyIGN1cnJlbnQgbHVtaW5hbmNlIE1CICovCisgICAgLyogKGJsb2NrcyAyKTsgYWRkIG1vdGlvbiB2ZWN0b3IgcHJpb3IgdG8gaW5wdXQgICAgICAgICovCisgICAgLyogYWRkIDggdG8geV9wb3MgdG8gYWR2YW5jZSB0byBibG9jayBvbiBuZXh0IHJvdyAgICAgICovCisgICAgeHByZWQgPSAoaW50KSgoeHBvcyA8PCAxKSArIHB4WzJdKTsKKyAgICB5cHJlZCA9IChpbnQpKCgoeXBvcyArIEJfU0laRSkgPDwgMSkgKyBweVsyXSk7CisKKyAgICBpZiAoKENCUCA+PiAzKSYxKQorICAgIHsKKyAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyAxMjg7CisgICAgICAgIHByZWRfd2lkdGggPSAxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJlZCA9IGNfY29tcCArICh3aWR0aCA8PCAzKTsKKyAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOworICAgIH0KKworICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1WIHBvaW50cyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipCX1NJWkUpKSAmJgorICAgICAgICAgICAgeXByZWQgPj0gMCAmJiB5cHJlZCA8PSAoKGhlaWdodCA8PCAxKSAtICgyKkJfU0laRSkpKQorICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCAocHJlZF93aWR0aCA8PCAxKSB8IHJvdW5kMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLCBjX3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCBoZWlnaHQsIHJvdW5kMSwgcHJlZF93aWR0aCk7CisgICAgfQorCisKKworICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiB2YWx1ZXMgb3ZlciBjdXJyZW50IGx1bWluYW5jZSBNQiAqLworICAgIC8qIChibG9ja3MgMyk7IGFkZCBtb3Rpb24gdmVjdG9yIHByaW9yIHRvIGlucHV0OyAgICAgICAqLworICAgIC8qIGFkZCA4IHRvIHhfcG9zIGFuZCB5X3BvcyB0byBhZHZhbmNlIHRvIG5leHQgYmxvY2sgICAqLworICAgIC8qIG9uIG5leHQgcm93ICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgeHByZWQgPSAoaW50KSgoKHhwb3MgKyBCX1NJWkUpIDw8IDEpICsgcHhbM10pOworICAgIHlwcmVkID0gKGludCkoKCh5cG9zICsgQl9TSVpFKSA8PCAxKSArIHB5WzNdKTsKKworICAgIGlmICgoQ0JQID4+IDIpJjEpCisgICAgeworICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDEzNjsKKyAgICAgICAgcHJlZF93aWR0aCA9IDE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmVkID0gY19jb21wICsgKHdpZHRoIDw8IDMpICsgODsKKyAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOworICAgIH0KKworICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1WIHBvaW50cyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipCX1NJWkUpKSAmJgorICAgICAgICAgICAgeXByZWQgPj0gMCAmJiB5cHJlZCA8PSAoKGhlaWdodCA8PCAxKSAtICgyKkJfU0laRSkpKQorICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCAocHJlZF93aWR0aCA8PCAxKSB8IHJvdW5kMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLCBjX3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCBoZWlnaHQsIHJvdW5kMSwgcHJlZF93aWR0aCk7CisgICAgfQorICAgIC8qIENhbGwgZnVuY3Rpb24gdG8gc2V0IGRlLWJsb2NraW5nIGFuZCBkZS1yaW5naW5nICovCisgICAgLyogICBzZW1hcGhvcmVzIGZvciBsdW1pbmFuY2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisKKyAgICAvKiB4cHJlZCBhbmQgeXByZWQgY2FsY3VsYXRpb24gZm9yIENocm9taW5hbmNlIGlzICovCisgICAgLyogaW4gZnVsbC1wZWwgcmVzb2x1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgLyogQ2hyb21pbmFuY2UgKi8KKyAgICAvKiB3aWR0aCBvZiBjaHJvbWluYW5jZSBkYXRhIGluIHBpeGVscyAoeSBheGlzKSAqLworICAgIHdpZHRoID4+PSAxOworCisgICAgLyogaGVpZ3RoIG9mIGNocm9taW5hbmNlIGRhdGEgaW4gcGl4ZWxzICh4IGF4aXMpICovCisgICAgaGVpZ2h0ID4+PSAxOworCisgICAgLyogUG9pbnRlciB0byBwcmV2aW91cyBjaHJvbWluYW5jZSBiIGZyYW1lICovCisgICAgY3VfcHJldiA9IHByZXYtPnVDaGFuOworCisgICAgLyogUG9pbnRlciB0byBwcmV2aW91cyBjaHJvbWluYW5jZSByIGZyYW1lICovCisgICAgY3ZfcHJldiA9IHByZXYtPnZDaGFuOworCisgICAgLyogeCBwb3NpdGlvbiBpbiBwcmVkaWN0aW9uIGRhdGEgb2Zmc2V0IGJ5IG1vdGlvbiB2ZWN0b3IgKi8KKyAgICAvKiB4cHJlZCBjYWxjdWxhdGlvbiBmb3IgQ2hyb21pbmFuY2UgaXMgaW4gZnVsbC1wZWwgICAgICAqLworICAgIC8qIHJlc29sdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgeHByZWQgPSB4cG9zICsgZHg7CisKKyAgICAvKiB5IHBvc2l0aW9uIGluIHByZWRpY3Rpb24gZGF0YSBvZmZzZXQgYnkgbW90aW9uIHZlY3RvciAqLworICAgIC8qIHlwcmVkIGNhbGN1bGF0aW9uIGZvciBDaHJvbWluYW5jZSBpcyBpbiBmdWxsLXBlbCAgICAgICovCisgICAgLyogcmVzb2x1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB5cHJlZCA9IHlwb3MgKyBkeTsKKworICAgIGN1X2NvbXAgPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhwb3MgPj4gMik7CisgICAgY3ZfY29tcCA9IHZpZGVvLT5jdXJyVm9wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKKworICAgIC8qIENhbGwgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBjaHJvbWluYW5jZSBwcmVkaWN0aW9uICovCisgICAgLyogICAgICBjaHJvbWluYW5jZV9wcmVkKHhwcmVkLCB5cHJlZCwgY3VfcHJldiwgY3ZfcHJldiwKKyAgICAgICAgICAgIHByZWRfYmxvY2ssIHdpZHRoX3V2LCBoZWlnaHRfdXYsCisgICAgICAgICAgICByb3VuZDEpOyovCisgICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmIHlwcmVkID49IDAgJiYKKyAgICAgICAgICAgIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZiAoKENCUCA+PiAxKSYxKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDI1NjsKKyAgICAgICAgICAgIHByZWRfd2lkdGggPSAxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgPSBjdV9jb21wOworICAgICAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSBiIChibG9ja1s0XSkgKi8KKyAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjdV9wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKKworICAgICAgICBpZiAoQ0JQJjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgPSBwcmVkX2Jsb2NrICsgMjY0OworICAgICAgICAgICAgcHJlZF93aWR0aCA9IDE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZCA9IGN2X2NvbXA7CisgICAgICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSByIChibG9ja1s1XSkgKi8KKyAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjdl9wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKKworICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZiAoKENCUCA+PiAxKSYxKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDI1NjsKKyAgICAgICAgICAgIHByZWRfd2lkdGggPSAxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgPSBjdV9jb21wOworICAgICAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSBiIChibG9ja1s0XSkgKi8KKyAgICAgICAgR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLCAgICBjdV9wcmV2LAorICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgaGVpZ2h0LCByb3VuZDEsIHByZWRfd2lkdGgpOworCisgICAgICAgIGlmIChDQlAmMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyAyNjQ7CisgICAgICAgICAgICBwcmVkX3dpZHRoID0gMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkID0gY3ZfY29tcDsKKyAgICAgICAgICAgIHByZWRfd2lkdGggPSB3aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiBmb3IgQ2hyb21pbmFuY2UgciAoYmxvY2tbNV0pICovCisgICAgICAgIEdldFByZWRPdXRzaWRlKHhwcmVkLCB5cHJlZCwgICAgY3ZfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworfQorCisvKioqIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHNraXBwZWQgbWFjcm9ibG9jaywgIEF1ZyAxNSwgMjAwNSAqLwordm9pZCAgU2tpcHBlZE1CTW90aW9uQ29tcCgKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvCispCit7CisgICAgVm9wICpwcmV2ID0gdmlkZW8tPnByZXZWb3A7CisgICAgVm9wICpjb21wOworICAgIGludCB5cG9zLCB4cG9zOworICAgIFBJWEVMICpjX2NvbXAsICpjX3ByZXY7CisgICAgUElYRUwgKmN1X2NvbXAsICpjdV9wcmV2OworICAgIFBJWEVMICpjdl9jb21wLCAqY3ZfcHJldjsKKyAgICBpbnQgd2lkdGgsIHdpZHRoX3V2OworICAgIGludDMyIG9mZnNldDsKKworICAgIHdpZHRoID0gdmlkZW8tPndpZHRoOworICAgIHdpZHRoX3V2ICA9IHdpZHRoID4+IDE7CisgICAgeXBvcyA9IHZpZGVvLT5tYm51bV9yb3cgPDwgNCA7CisgICAgeHBvcyA9IHZpZGVvLT5tYm51bV9jb2wgPDwgNCA7CisgICAgb2Zmc2V0ID0gKGludDMyKXlwb3MgKiB3aWR0aCArIHhwb3M7CisKKworICAgIC8qIHplcm8gbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAvKm1ieSp3aWR0aCArIG1ieDsqLworICAgIGNfcHJldiAgPSBwcmV2LT55Q2hhbjsKKyAgICBpZiAoIWNfcHJldikgeworICAgICAgICBBTE9HRSgiYi8zNTI2OTYzNSIpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM1MjY5NjM1Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY19wcmV2ICs9IG9mZnNldDsKKworICAgIC8qYnkqd2lkdGhfdXYgKyBieDsqLworICAgIGN1X3ByZXYgPSBwcmV2LT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKKyAgICAvKmJ5KndpZHRoX3V2ICsgYng7Ki8KKyAgICBjdl9wcmV2ID0gcHJldi0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhwb3MgPj4gMik7CisKKyAgICBjb21wID0gdmlkZW8tPmN1cnJWb3A7CisKKyAgICBjX2NvbXAgID0gY29tcC0+eUNoYW4gKyBvZmZzZXQ7CisgICAgY3VfY29tcCA9IGNvbXAtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4cG9zID4+IDIpOworICAgIGN2X2NvbXAgPSBjb21wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKKworCisgICAgLyogQ29weSBwcmV2aW91cyByZWNvbnN0cnVjdGVkIGZyYW1lIGludG8gdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBQdXRTS0lQUEVEX01CKGNfY29tcCwgIGNfcHJldiwgd2lkdGgpOworICAgIFB1dFNLSVBQRURfQihjdV9jb21wLCBjdV9wcmV2LCB3aWR0aF91dik7CisgICAgUHV0U0tJUFBFRF9CKGN2X2NvbXAsIGN2X3ByZXYsIHdpZHRoX3V2KTsKKworICAgIC8qICAxMC8yNC8yMDAwIHBvc3RfcHJvY2Vzc2luZyBzZW1hcGhvcmUgZ2VuZXJhdGlvbiAqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX3V0aWxzLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX3V0aWxzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfdXRpbHMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl91dGlscy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21idHlwZV9tb2RlLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYnR5cGVfbW9kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYnR5cGVfbW9kZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYnR5cGVfbW9kZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tb3Rpb25fY29tcC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbW90aW9uX2NvbXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbW90aW9uX2NvbXAuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbW90aW9uX2NvbXAuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmY5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWNfbGliLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9NUDRERUNMSUJfSF8KKyNkZWZpbmUgX01QNERFQ0xJQl9IXworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSU5DTFVERVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIm1wNGRlZi5oIiAvKiB0eXBlZGVmICovCisjaW5jbHVkZSAibXA0bGliX2ludC5oIiAvKiBtYWluIHZpZGVvIHN0cnVjdHVyZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTUFDUk9TCis7IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgREVGSU5FUworOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRVhURVJOQUwgVkFSSUFCTEVTIFJFRkVSRU5DRVMKKzsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgU0lNUExFIFRZUEVERUYnUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFTlVNRVJBVEVEIFRZUEVERUYnUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTVFJVQ1RVUkVTIFRZUEVERUYnUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBHTE9CQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKKzsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyAgICAvKiBkZWZpbmVkIGluIHB2ZGVjX2FwaS5jLCB0aGVzZSBmdW5jdGlvbiBhcmUgbm90IHN1cHBvc2VkIHRvIGJlICAgICovCisgICAgLyogZXhwb3NlZCB0byBwcm9ncmFtbWVycyBvdXRzaWRlIFBhY2tldFZpZGVvLiAgMDgvMTUvMjAwMC4gICAgKi8KKyAgICB1aW50IFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQoVmlkZW9EZWNEYXRhICp2aWRlbyk7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgdm9pZCBtNHZkZWNfZHByaW50ZihjaGFyICpmb3JtYXQsIC4uLik7CisjZGVmaW5lIG1wNGRlY19sb2cobWVzc2FnZSkgbTR2ZGVjX2RwcmludGYobWVzc2FnZSkKKyNlbHNlCisjZGVmaW5lIG1wNGRlY19sb2cobWVzc2FnZSkKKyNlbmRpZgorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBmcmFtZV9idWZmZXIuYyAqLworICAgIFBWX1NUQVRVUyBGaWxsRnJhbWVCdWZmZXJOZXcoQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSk7CisgICAgUFZfU1RBVFVTIEZpbGxGcmFtZUJ1ZmZlcihCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtLCBpbnQgc2hvcnRfaGVhZGVyKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gZGNfYWNfcHJlZC5jICovCisgICAgaW50IGNhbF9kY19zY2FsZXIoaW50IFFQLCBpbnQgdHlwZSk7CisgICAgUFZfU1RBVFVTIFBWX0RlY29kZVByZWRpY3RlZEludHJhREMoaW50IGNvbXBudW0sIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTYgKkludHJhRENfZGVsdGEpOworCisgICAgdm9pZCAgICBkb0RDQUNQcmVkaWN0aW9uKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBjb21wLCBpbnQxNiAqcV9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXJlY3Rpb24pOworCisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgdm9pZCAgICBkb0RDQUNQcmVkaWN0aW9uX0koVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGNvbXAsIGludDE2ICpxX2Jsb2NrKTsKKyNlbmRpZgorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gYmxvY2tfaWRjdC5jICovCisgICAgdm9pZCBNQmxvY2tJRENUQWRkKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBuel9jb2Vmc1tdKTsKKworICAgIHZvaWQgQmxvY2tJRENUKHVpbnQ4ICpkc3QsIHVpbnQ4ICpwcmVkLCBpbnQxNiAqYmxrLCBpbnQgd2lkdGgsIGludCBuemNvZWZzLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpiaXRtYXBjb2wsIHVpbnQ4IGJpdG1hcHJvdyk7CisKKyAgICB2b2lkIE1CbG9ja0lEQ1QoVmlkZW9EZWNEYXRhICp2aWRlbyk7CisgICAgdm9pZCBCbG9ja0lEQ1RfaW50cmEoTWFjcm9CbG9jayAqbWJsb2NrLCBQSVhFTCAqY19jb21wLCBpbnQgY29tcCwgaW50IHdpZHRoX29mZnNldCk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBjb21iaW5lZF9kZWNvZGUuYyAqLworICAgIFBWX1NUQVRVUyBEZWNvZGVGcmFtZUNvbWJpbmVkTW9kZShWaWRlb0RlY0RhdGEgKnZpZGVvKTsKKyAgICBQVl9TVEFUVVMgR2V0TUJoZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50MTYgKlFQKTsKKyAgICBQVl9TVEFUVVMgR2V0TUJEYXRhKFZpZGVvRGVjRGF0YSAqdmlkZW8pOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBkYXRhcGFydF9kZWNvZGUuYyAqLworICAgIFBWX1NUQVRVUyBEZWNvZGVGcmFtZURhdGFQYXJ0TW9kZShWaWRlb0RlY0RhdGEgKnZpZGVvKTsKKyAgICBQVl9TVEFUVVMgR2V0TUJoZWFkZXJEYXRhUGFydF9EUVVBTlRfREMoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50MTYgKlFQKTsKKyAgICBQVl9TVEFUVVMgR2V0TUJoZWFkZXJEYXRhUGFydF9QKFZpZGVvRGVjRGF0YSAqdmlkZW8pOworICAgIFBWX1NUQVRVUyBEZWNvZGVEYXRhUGFydF9JX1ZpZGVvUGFja2V0KFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBzbGljZV9jb3VudGVyKTsKKyAgICBQVl9TVEFUVVMgRGVjb2RlRGF0YVBhcnRfUF9WaWRlb1BhY2tldChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgc2xpY2VfY291bnRlcik7CisgICAgUFZfU1RBVFVTIEdldE1CRGF0YV9EYXRhUGFydChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gcGFja2V0X3V0aWwuYyAqLworICAgIFBWX1NUQVRVUyBQVl9SZWFkVmlkZW9QYWNrZXRIZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50ICpuZXh0X01CKTsKKyAgICBQVl9TVEFUVVMgUmVjb3ZlclBhY2tldEVycm9yKEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0sIGludCBtYXJrZXJfbGVuZ3RoLCBpbnQzMiAqbmV4dFZvcCk7CisgICAgUFZfU1RBVFVTIFJlY292ZXJHT0JFcnJvcihCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtLCBpbnQgbWFya2VyX2xlbmd0aCwgaW50MzIgKnZvcFBvcyk7CisgICAgUFZfU1RBVFVTIFBWX0dvYkhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvKTsKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICBQVl9TVEFUVVMgUFZfSDI2M1NsaWNlSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW9JbnQsIGludCAqbmV4dF9NQik7CisjZW5kaWYKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIG1vdGlvbl9jb21wLmMgKi8KKyAgICB2b2lkIE1CTW90aW9uQ29tcChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgQ0JQKTsKKyAgICB2b2lkICBTa2lwcGVkTUJNb3Rpb25Db21wKFZpZGVvRGVjRGF0YSAqdmlkZW8pOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBjaHJvbWluYW5jZV9wcmVkLmMgKi8KKyAgICB2b2lkIGNocm9taW5hbmNlX3ByZWQoCisgICAgICAgIGludCB4cHJlZCwgICAgICAgICAgLyogaSAqLworICAgICAgICBpbnQgeXByZWQsICAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgdWludDggKmN1X3ByZXYsICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpjdl9wcmV2LCAgICAgLyogaSAqLworICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywgIC8qIGkgKi8KKyAgICAgICAgaW50IHdpZHRoX3V2LCAgICAgICAvKiBpICovCisgICAgICAgIGludCBoZWlnaHRfdXYsICAgICAgLyogaSAqLworICAgICAgICBpbnQgcm91bmQxCisgICAgKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gbHVtaW5hbmNlX3ByZWRfbW9kZV9pbnRlci5jICovCisgICAgdm9pZCBsdW1pbmFuY2VfcHJlZF9tb2RlX2ludGVyKAorICAgICAgICBpbnQgeHByZWQsICAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IHlwcmVkLCAgICAgICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpjX3ByZXYsICAgICAgLyogaSAqLworICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywgIC8qIGkgKi8KKyAgICAgICAgaW50IHdpZHRoLCAgICAgICAgICAvKiBpICovCisgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgLyogaSAqLworICAgICAgICBpbnQgcm91bmQxCisgICAgKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gbHVtaW5hbmNlX3ByZWRfbW9kZV9pbnRlcjR2LmMgKi8KKyAgICB2b2lkIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXI0digKKyAgICAgICAgaW50IHhwb3MsICAgICAgICAgICAvKiBpICovCisgICAgICAgIGludCB5cG9zLCAgICAgICAgICAgLyogaSAqLworICAgICAgICBNT1QgKnB4LCAgICAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgTU9UICpweSwgICAgICAgICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpjX3ByZXYsICAgICAgLyogaSAqLworICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywgIC8qIGkgKi8KKyAgICAgICAgaW50IHdpZHRoLCAgICAgICAgICAvKiBpICovCisgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgLyogaSAqLworICAgICAgICBpbnQgcm91bmQxLCAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IG12d2lkdGgsICAgICAgICAgICAgLyogaSAqLworICAgICAgICBpbnQgKnhzdW1fcHRyLCAgICAgICAgICAvKiBpL28gKi8KKyAgICAgICAgaW50ICp5c3VtX3B0ciAgICAgICAgICAgLyogaS9vICovCisgICAgKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBnZXRfcHJlZF9hZHZfbWJfYWRkLmMgKi8KKyAgICBpbnQgR2V0UHJlZEFkdmFuY2VkTUIoCisgICAgICAgIGludCB4cG9zLAorICAgICAgICBpbnQgeXBvcywKKyAgICAgICAgdWludDggKmNfcHJldiwKKyAgICAgICAgdWludDggKnByZWRfYmxvY2ssCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IHJuZDEKKyAgICApOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBnZXRfcHJlZF9hZHZfYl9hZGQuYyAqLworICAgIGludCBHZXRQcmVkQWR2YW5jZWRCeTB4MCgKKyAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IHdpZHRoLCAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IHByZWRfd2lkdGhfcm5kIC8qIGkgKi8KKyAgICApOworCisgICAgaW50IEdldFByZWRBZHZhbmNlZEJ5MHgxKAorICAgICAgICB1aW50OCAqY19wcmV2LCAgICAgIC8qIGkgKi8KKyAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAgICAgLyogaSAqLworICAgICAgICBpbnQgd2lkdGgsICAgICAgLyogaSAqLworICAgICAgICBpbnQgcHJlZF93aWR0aF9ybmQgLyogaSAqLworICAgICk7CisKKyAgICBpbnQgR2V0UHJlZEFkdmFuY2VkQnkxeDAoCisgICAgICAgIHVpbnQ4ICpjX3ByZXYsICAgICAgLyogaSAqLworICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywgICAgICAvKiBpICovCisgICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCisgICAgICAgIGludCBwcmVkX3dpZHRoX3JuZCAvKiBpICovCisgICAgKTsKKworICAgIGludCBHZXRQcmVkQWR2YW5jZWRCeTF4MSgKKyAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IHdpZHRoLCAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IHByZWRfd2lkdGhfcm5kIC8qIGkgKi8KKyAgICApOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBnZXRfcHJlZF9vdXRzaWRlLmMgKi8KKyAgICBpbnQgR2V0UHJlZE91dHNpZGUoCisgICAgICAgIGludCB4cG9zLAorICAgICAgICBpbnQgeXBvcywKKyAgICAgICAgdWludDggKmNfcHJldiwKKyAgICAgICAgdWludDggKnByZWRfYmxvY2ssCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgaW50IHJuZDEsCisgICAgICAgIGludCBwcmVkX3dpZHRoCisgICAgKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gZmluZF9wbXZzRXJyUmVzLmMgKi8KKyAgICB2b2lkIG12X3ByZWRpY3Rpb24oVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGJsb2NrLCBNT1QgKm12eCwgTU9UICptdnkpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIG1iX3V0aWxzLmMgKi8KKyAgICB2b2lkIENvcHlfTUJfaW50b19Wb3AodWludDggKmNvbXAsIGludCB5Q2hhbltdW05DT0VGRl9CTE9DS10sIGludCB3aWR0aCk7CisgICAgdm9pZCBDb3B5X0JfaW50b19Wb3AodWludDggKmNvbXAsIGludCBjQ2hhbltdLCBpbnQgd2lkdGgpOworICAgIHZvaWQgUHV0U0tJUFBFRF9NQih1aW50OCAqY29tcCwgdWludDggKmNfcHJldiwgaW50IHdpZHRoKTsKKyAgICB2b2lkIFB1dFNLSVBQRURfQih1aW50OCAqY29tcCwgdWludDggKmNfcHJldiwgaW50IHdpZHRoKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gdm9wLmMgKi8KKyAgICBQVl9TVEFUVVMgRGVjb2RlR09WSGVhZGVyKEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0sIHVpbnQzMiAqdGltZV9iYXNlKTsKKyAgICBQVl9TVEFUVVMgRGVjb2RlVk9MSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBsYXllcik7CisgICAgUFZfU1RBVFVTIERlY29kZVZPUEhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBWb3AgKmN1cnJWb3AsIEJvb2wgdXNlX2V4dF90aWVtc3RhbXApOworICAgIFBWX1NUQVRVUyBEZWNvZGVTaG9ydEhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBWb3AgKmN1cnJWb3ApOworICAgIFBWX1NUQVRVUyBQVl9EZWNvZGVWb3AoVmlkZW9EZWNEYXRhICp2aWRlbyk7CisgICAgdWludDMyIENhbGNWb3BEaXNwbGF5VGltZShWb2wgKmN1cnJWb2wsIFZvcCAqY3VyclZvcCwgaW50IHNob3J0VmlkZW9IZWFkZXIpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBwb3N0X3Byb2MuYyAqLworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgIHZvaWQgSDI2M19EZWJsb2NrKHVpbnQ4ICpyZWMsICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQxNiAqUVBfc3RvcmUsIHVpbnQ4ICptb2RlLCBpbnQgY2hyLCBpbnQgVCk7CisjZW5kaWYKKyAgICBpbnQgIFBvc3RQcm9jU2VtYXBob3JlKGludDE2ICpxX2Jsb2NrKTsKKyAgICB2b2lkIFBvc3RGaWx0ZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGZpbGVyX3R5cGUsIHVpbnQ4ICpvdXRwdXQpOworICAgIHZvaWQgRmluZE1heE1pbih1aW50OCAqcHRyLCBpbnQgKm1pbiwgaW50ICptYXgsIGludCBpbmNyKTsKKyAgICB2b2lkIERlcmluZ0FkYXB0aXZlU21vb3RoTU1YKHVpbnQ4ICppbWcsIGludCBpbmNyLCBpbnQgdGhyZXMsIGludCBteGRmKTsKKyAgICB2b2lkIEFkYXB0aXZlU21vb3RoX05vTU1YKHVpbnQ4ICpSZWNfWSwgaW50IHYwLCBpbnQgaDAsIGludCB2X2JsaywgaW50IGhfYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRociwgaW50IHdpZHRoLCBpbnQgbWF4X2RpZmYpOworICAgIHZvaWQgRGVyaW5naW5nX0x1bWEodWludDggKlJlY19ZLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludDE2ICpRUF9zdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb21iaW5lZCwgdWludDggKnBwX21vZCk7CisgICAgdm9pZCBEZXJpbmdpbmdfQ2hyb21hKHVpbnQ4ICpSZWNfQywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQxNiAqUVBfc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb21iaW5lZCwgdWludDggKnBwX21vZCk7CisgICAgdm9pZCBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyKHVpbnQ4ICpyZWMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50MTYgKlFQX3N0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyLCB1aW50OCAqcHBfbW9kKTsKKyAgICB2b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXJfTm9Tb2Z0RGVibG9ja2luZyh1aW50OCAqcmVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludDE2ICpRUF9zdG9yZSwKKyAgICAgICAgICAgIGludCBjaHIsIHVpbnQ4ICpwcF9tb2QpOworICAgIHZvaWQgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIodWludDggKnJlYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTYgKlFQX3N0b3JlLCBpbnQgY2hyLCB1aW50OCAqcHBfbW9kKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gY29uY2VhbC5jICovCisgICAgdm9pZCBDb25jZWFsVGV4dHVyZV9JKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludDMyIHN0YXJ0Rmlyc3RQYXJ0aXRpb24sIGludCBtYl9zdGFydCwgaW50IG1iX3N0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZV9jb3VudGVyKTsKKyAgICB2b2lkIENvbmNlYWxUZXh0dXJlX1AoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IG1iX3N0YXJ0LCBpbnQgbWJfc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsaWNlX2NvdW50ZXIpOworICAgIHZvaWQgQ29uY2VhbFBhY2tldChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgbWJfc3RhcnQsIGludCBtYl9zdG9wLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xpY2VfY291bnRlcik7CisgICAgdm9pZCBDb3B5Vm9wTUIoVm9wICpjdXJyLCB1aW50OCAqcHJldiwgaW50IG1ibnVtLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgLyogZGVmaW5lIGluIHZsY19kZXF1YW50LmMgLCAgMDkvMTgvMjAwMCovCisjaWZkZWYgUFZfU1VQUE9SVF9NQUlOX1BST0ZJTEUKKyAgICBpbnQgVmxjRGVxdWFudE1wZWdJbnRyYUJsb2NrKHZvaWQgKnZpZGVvLCBpbnQgY29tcCwgaW50IHN3aXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKmJpdG1hcGNvbCwgdWludDggKmJpdG1hcHJvdyk7CisgICAgaW50IFZsY0RlcXVhbnRNcGVnSW50ZXJCbG9jayh2b2lkICp2aWRlbywgaW50IGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqYml0bWFwY29sLCB1aW50OCAqYml0bWFwcm93KTsKKyNlbmRpZgorICAgIGludCBWbGNEZXF1YW50SDI2M0ludHJhQmxvY2soVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGNvbXAsIGludCBzd2l0Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpiaXRtYXBjb2wsIHVpbnQ4ICpiaXRtYXByb3cpOworICAgIGludCBWbGNEZXF1YW50SDI2M0ludHJhQmxvY2tfU0goVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqYml0bWFwY29sLCB1aW50OCAqYml0bWFwcm93KTsKKyAgICBpbnQgVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKmJpdG1hcGNvbCwgdWludDggKmJpdG1hcHJvdyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFTkQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlZi5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0bGliX2ludC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0bGliX2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRsaWJfaW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGxpYl9pbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcGFja2V0X3V0aWwuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcGFja2V0X3V0aWwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wYWNrZXRfdXRpbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BhY2tldF91dGlsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTAzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAKQEAgLTAsMCArMSw0MzkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCisKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyNpbmNsdWRlICAgICJtb3Rpb25fY29tcC5oIgorI2luY2x1ZGUgIm1idHlwZV9tb2RlLmgiCitjb25zdCBzdGF0aWMgaW50IFNUUkVOR1RIX3RhYltdID0gezAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTJ9OworI2VuZGlmCisKKworCisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCit2b2lkIEgyNjNfRGVibG9jayh1aW50OCAqcmVjLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgIGludDE2ICpRUF9zdG9yZSwKKyAgICAgICAgICAgICAgICAgIHVpbnQ4ICptb2RlLAorICAgICAgICAgICAgICAgICAgaW50IGNociwgaW50IGFubmV4X1QpCit7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGludCBpLCBqLCBrOworICAgIHVpbnQ4ICpyZWNfeTsKKyAgICBpbnQgdG1wdmFyOworICAgIGludCBtYm51bSwgc3RyZW5ndGgsIEFfRCwgZDFfMiwgZDEsIGQyLCBBLCBCLCBDLCBELCBiX3NpemU7CisgICAgaW50IGQsIG9mZnNldCwgbk1CUGVyUm93LCBuTUJQZXJDb2wsIHdpZHRoMiA9ICh3aWR0aCA8PCAxKTsKKyAgICAvKiBNQUtFIFNVUkUgSS1WT1AgSU5UUkEgTUFDUk9CTE9DS1MgQVJFIFNFVCBUTyBOT04tU0tJUFBFRCBNT0RFKi8KKyAgICBtYm51bSA9IDA7CisKKyAgICBpZiAoY2hyKQorICAgIHsKKyAgICAgICAgbk1CUGVyUm93ID0gd2lkdGggPj4gMzsKKyAgICAgICAgbk1CUGVyQ29sID0gaGVpZ2h0ID4+IDM7CisgICAgICAgIGJfc2l6ZSA9IDg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5NQlBlclJvdyA9IHdpZHRoID4+IDQ7CisgICAgICAgIG5NQlBlckNvbCA9IGhlaWdodCA+PiA0OworICAgICAgICBiX3NpemUgPSAxNjsKKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkVSVElDQUwgRklMVEVSSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogdmVydGljYWwgZmlsdGVyaW5nIG9mIG1pZCBzZWN0aW9ucyBubyBuZWVkIHRvIGNoZWNrIG5laWdoYm9yaW5nIFFQJ3MgZXRjICovCisgICAgaWYgKCFjaHIpCisgICAgeworICAgICAgICByZWNfeSA9IHJlYyArICh3aWR0aCA8PCAzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChoZWlnaHQgPj4gNCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8ICh3aWR0aCA+PiA0KTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrID0gMTY7CisgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiW1FQX3N0b3JlW21ibnVtXV07CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEgPSAgKihyZWNfeSAtIHdpZHRoMik7CisgICAgICAgICAgICAgICAgICAgICAgICBEID0gKihyZWNfeSArIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFfRCA9IEEgLSBEOworICAgICAgICAgICAgICAgICAgICAgICAgQyA9ICpyZWNfeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEIgPSAqKHJlY195IC0gd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgoKEMgLSBCKSA8PCAyKSArIEFfRCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC0oLWQgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQxIDwgLShzdHJlbmd0aCA8PCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAtc3RyZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC1kMSAtIChzdHJlbmd0aCA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IC1kMSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gZCA+PiAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA+IChzdHJlbmd0aCA8PCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPiBzdHJlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gKHN0cmVuZ3RoIDw8IDEpIC0gZDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxXzIgPSBkMSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQV9EIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC0oLUFfRCA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPCAtZDFfMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLWQxXzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gQV9EID4+IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyID4gZDFfMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gZDFfMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgLSB3aWR0aDIpID0gQSAtIGQyOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gQiArIGQxOworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQorICAgICAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIHdpZHRoKSA9IHRtcHZhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEMgLSBkMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZWNfeSA9IHRtcHZhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgKyB3aWR0aCkgPSBEICsgZDI7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNfeSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlY195ICs9IGJfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWJudW0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlY195ICs9ICgxNSAqIHdpZHRoKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgLyogVkVSVElDQUwgYm91bmRhcnkgYmxvY2tzICovCisKKworICAgIHJlY195ID0gcmVjICsgd2lkdGggKiBiX3NpemU7CisKKyAgICBtYm51bSA9IG5NQlBlclJvdzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbk1CUGVyQ29sIC0gMTsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5NQlBlclJvdzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEIHx8IG1vZGVbbWJudW0gLSBuTUJQZXJSb3ddICE9IE1PREVfU0tJUFBFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrID0gYl9zaXplOworICAgICAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlbmd0aCA9IFNUUkVOR1RIX3RhYlsoYW5uZXhfVCA/ICBNUV9jaHJvbWFfUVBfdGFibGVbUVBfc3RvcmVbbWJudW1dXSA6IFFQX3N0b3JlW21ibnVtXSldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlbmd0aCA9IFNUUkVOR1RIX3RhYlsoYW5uZXhfVCA/ICBNUV9jaHJvbWFfUVBfdGFibGVbUVBfc3RvcmVbbWJudW0gLSBuTUJQZXJSb3ddXSA6IFFQX3N0b3JlW21ibnVtIC0gbk1CUGVyUm93XSldOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBID0gICoocmVjX3kgLSB3aWR0aDIpOworICAgICAgICAgICAgICAgICAgICBEID0gICoocmVjX3kgKyB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIEFfRCA9IEEgLSBEOworICAgICAgICAgICAgICAgICAgICBDID0gKnJlY195OworICAgICAgICAgICAgICAgICAgICBCID0gKihyZWNfeSAtIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZCA9ICgoKEMgLSBCKSA8PCAyKSArIEFfRCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC0oLWQgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPCAtKHN0cmVuZ3RoIDw8IDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQxIDwgLXN0cmVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLWQxIC0gKHN0cmVuZ3RoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IC1kMSA+PiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBkID4+IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPiAoc3RyZW5ndGggPDwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPiBzdHJlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IChzdHJlbmd0aCA8PCAxKSAtIGQxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IGQxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoQV9EIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSAtKC1BX0QgPj4gMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPCAtZDFfMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC1kMV8yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBBX0QgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA+IGQxXzIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBkMV8yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIHdpZHRoMikgPSBBIC0gZDI7CisgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEIgKyBkMTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQorICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gd2lkdGgpID0gdG1wdmFyOworICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBDIC0gZDE7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKKyAgICAgICAgICAgICAgICAgICAgKnJlY195ID0gdG1wdmFyOworICAgICAgICAgICAgICAgICAgICAqKHJlY195ICsgd2lkdGgpID0gRCArIGQyOworICAgICAgICAgICAgICAgICAgICByZWNfeSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWNfeSArPSBiX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYm51bSsrOworICAgICAgICB9CisgICAgICAgIHJlY195ICs9ICgoYl9zaXplIC0gMSkgKiB3aWR0aCk7CisKKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKipIT1JJWk9OVEFMIEZJTFRFUklORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBtYm51bSA9IDA7CisgICAgLyogSE9SSVpPTlRBTCBJTk5FUiAqLworICAgIGlmICghY2hyKQorICAgIHsKKyAgICAgICAgcmVjX3kgPSByZWMgKyA4OworICAgICAgICBvZmZzZXQgPSB3aWR0aCAqIGJfc2l6ZSAtIGJfc2l6ZTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbk1CUGVyQ29sOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuTUJQZXJSb3c7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgayA9IDE2OworICAgICAgICAgICAgICAgICAgICBzdHJlbmd0aCA9IFNUUkVOR1RIX3RhYltRUF9zdG9yZVttYm51bV1dOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoay0tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBID0gICoocmVjX3kgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEQgPSAgKihyZWNfeSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgQV9EID0gQSAtIEQ7CisgICAgICAgICAgICAgICAgICAgICAgICBDID0gKnJlY195OworICAgICAgICAgICAgICAgICAgICAgICAgQiA9ICoocmVjX3kgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKChDIC0gQikgPDwgMikgKyBBX0QpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAtKC1kID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA8IC0oc3RyZW5ndGggPDwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQxIDwgLXN0cmVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAtZDEgLSAoc3RyZW5ndGggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxXzIgPSAtZDEgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IGQgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPiAoc3RyZW5ndGggPDwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQxID4gc3RyZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IChzdHJlbmd0aCA8PCAxKSAtIGQxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gZDEgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFfRCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSAtKC1BX0QgPj4gMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyIDwgLWQxXzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC1kMV8yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IEFfRCA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA+IGQxXzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGQxXzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gMikgPSBBIC0gZDI7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBCICsgZDE7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXB2YXIpCisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gMSkgPSB0bXB2YXI7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBDIC0gZDE7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXB2YXIpCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVjX3kgPSB0bXB2YXI7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlY195ICsgMSkgPSBEICsgZDI7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNfeSArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZWNfeSAtPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlY195ICs9IGJfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWJudW0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlY195ICs9ICgxNSAqIHdpZHRoKTsKKworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qIEhPUklaT05UQUwgRURHRSAqLworICAgIHJlY195ID0gcmVjICsgYl9zaXplOworICAgIG9mZnNldCA9IHdpZHRoICogYl9zaXplIC0gYl9zaXplOworICAgIG1ibnVtID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbk1CUGVyQ29sOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbk1CUGVyUm93IC0gMTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEIHx8IG1vZGVbbWJudW0tMV0gIT0gTU9ERV9TS0lQUEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsgPSBiX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiWyhhbm5leF9UID8gIE1RX2Nocm9tYV9RUF90YWJsZVtRUF9zdG9yZVttYm51bV1dIDogUVBfc3RvcmVbbWJudW1dKV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiWyhhbm5leF9UID8gIE1RX2Nocm9tYV9RUF90YWJsZVtRUF9zdG9yZVttYm51bSAtIDFdXSA6IFFQX3N0b3JlW21ibnVtIC0gMV0pXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoay0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQSA9ICAqKHJlY195IC0gMik7CisgICAgICAgICAgICAgICAgICAgIEQgPSAgKihyZWNfeSArIDEpOworICAgICAgICAgICAgICAgICAgICBBX0QgPSBBIC0gRDsKKyAgICAgICAgICAgICAgICAgICAgQyA9ICpyZWNfeTsKKyAgICAgICAgICAgICAgICAgICAgQiA9ICoocmVjX3kgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgZCA9ICgoKEMgLSBCKSA8PCAyKSArIEFfRCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC0oLWQgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPCAtKHN0cmVuZ3RoIDw8IDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQxIDwgLXN0cmVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLWQxIC0gKHN0cmVuZ3RoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IC1kMSA+PiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBkID4+IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPiAoc3RyZW5ndGggPDwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPiBzdHJlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IChzdHJlbmd0aCA8PCAxKSAtIGQxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IGQxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoQV9EIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSAtKC1BX0QgPj4gMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPCAtZDFfMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC1kMV8yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBBX0QgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA+IGQxXzIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBkMV8yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIDIpID0gQSAtIGQyOworICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBCICsgZDE7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKKyAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIDEpID0gdG1wdmFyOworICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBDIC0gZDE7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKKyAgICAgICAgICAgICAgICAgICAgKnJlY195ID0gdG1wdmFyOworICAgICAgICAgICAgICAgICAgICAqKHJlY195ICsgMSkgPSBEICsgZDI7CisgICAgICAgICAgICAgICAgICAgIHJlY195ICs9IHdpZHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWNfeSAtPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVjX3kgKz0gYl9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWJudW0rKzsKKyAgICAgICAgfQorICAgICAgICByZWNfeSArPSAoKHdpZHRoICogKGJfc2l6ZSAtIDEpKSArIGJfc2l6ZSk7CisgICAgICAgIG1ibnVtKys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvYy5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X3Byb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4MjhlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKQEAgLTAsMCArMSwxNjg3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBMT0dfVEFHICJwdmRlY19hcGkiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgIm1wNGRlY19saWIuaCIKKyNpbmNsdWRlICJ2bGNfZGVjb2RlLmgiCisjaW5jbHVkZSAiYml0c3RyZWFtLmgiCisKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAweDdmZmZmZmZmCisjZW5kaWYKKworI2lmbmRlZiBTSVpFX01BWAorI2RlZmluZSBTSVpFX01BWCAoKHNpemVfdCkgLTEpCisjZW5kaWYKKworI2RlZmluZSBPU0NMX0RJU0FCTEVfV0FSTklOR19DT05ESVRJT05BTF9JU19DT05TVEFOVAorCisjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKKyNkZWZpbmUgUUNJRl9NQlMgOTkKKyNkZWZpbmUgUUNJRl9CUyAoNCpRQ0lGX01CUykKKyNkZWZpbmUgUUNJRl9NQl9ST1dTIDExCitleHRlcm4gdWludDggICAgICAgICAgICAgICAgSU1FTV9zbGljZU5vW1FDSUZfTUJTXTsKK2V4dGVybiB1aW50OCAgICAgICAgICAgICAgICBJTUVNX2FjUHJlZEZsYWdbUUNJRl9NQlNdOworZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1faGVhZGVySW5mb19Nb2RlW1FDSUZfTUJTXTsKK2V4dGVybiB1aW50OCAgICAgICAgICAgICAgICBJTUVNX2hlYWRlckluZm9fQ0JQW1FDSUZfTUJTXTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgICBJTUVNX2hlYWRlckluZm9fUVBNQltRQ0lGX01CU107CitleHRlcm4gTWFjcm9CbG9jayAgICAgICAgICAgSU1FTV9tYmxvY2s7CitleHRlcm4gTU9UICAgICAgICAgICAgICAgICAgSU1FTV9tb3RYW1FDSUZfQlNdOworZXh0ZXJuIE1PVCAgICAgICAgICAgICAgICAgIElNRU1fbW90WVtRQ0lGX0JTXTsKK2V4dGVybiBCaXRzdHJlYW1EZWNWaWRlbyAgICBJTUVNX0JpdHN0cmVhbURlY1ZpZGVvWzRdOworZXh0ZXJuIHR5cGVEQ1N0b3JlICAgICAgICAgIElNRU1fcHJlZERDW1FDSUZfTUJTXTsKK2V4dGVybiB0eXBlRENBQ1N0b3JlICAgICAgICBJTUVNX3ByZWREQ0FDX2NvbFtRQ0lGX01CX1JPV1MrMV07CisKK2V4dGVybiBWaWRlb0RlY0RhdGEgICAgICAgICBJTUVNX1ZpZGVvRGVjRGF0YVsxXTsKK2V4dGVybiBWb3AgICAgICAgICAgICAgICAgICBJTUVNX2N1cnJWb3BbMV07CitleHRlcm4gVm9wICAgICAgICAgICAgICAgICAgSU1FTV9wcmV2Vm9wWzFdOworZXh0ZXJuIFBJWEVMICAgICAgICAgICAgICAgIElNRU1fY3VyclZvcF95Q2hhbltRQ0lGX01CUyoxMjgqM107CitleHRlcm4gUElYRUwgICAgICAgICAgICAgICAgSU1FTV9wcmV2Vm9wX3lDaGFuW1FDSUZfTUJTKjEyOCozXTsKK2V4dGVybiB1aW50OCAgICAgICAgICAgICAgICBJTUVNX3BzdHByY1R5cEN1cls2KlFDSUZfTUJTXTsKK2V4dGVybiB1aW50OCAgICAgICAgICAgICAgICBJTUVNX3BzdHByY1R5cFBydls2KlFDSUZfTUJTXTsKKworCitleHRlcm4gVm9wICAgICAgICAgICAgICAgICAgSU1FTV92b3BIRUFERVJbMl07CitleHRlcm4gVm9sICAgICAgICAgICAgICAgICAgSU1FTV9WT0xbMl07CitleHRlcm4gVm9wICAgICAgICAgICAgICAgICAgSU1FTV92b3BIZWFkZXJbMl1bMV07CitleHRlcm4gVm9sICAgICAgICAgICAgICAgICAgSU1FTV92b2xbMl1bMV07CisKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWSW5pdFZpZGVvRGVjb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMTEvMjAwMCwgMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBJbml0aWFsaXphdGlvbiBvZiB0aGUgTVBFRy00IHZpZGVvIGRlY29kZXIgbGlicmFyeS4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIFRoZSByZXR1cm4gdHlwZSBpcyBCb29sIGluc3RlYWQgb2YgUFZfU1RBVFVTIGJlY2F1c2UgICAgICAgICAqLworLyogICAgICAgICAgICAgd2UgZG9uJ3Qgd2FudCB0byBleHBvc2UgUFZfU1RBVFVTIHRvIChvdXRzaWRlKSBwcm9ncmFtbWVycyAgICovCisvKiAgICAgICAgICAgICB0aGF0IHVzZSBvdXIgZGVjb2RlciBsaWJyYXJ5IFNESy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZJbml0VmlkZW9EZWNvZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICp2b2xidWZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiAqdm9sYnVmX3NpemUsIGludCBuTGF5ZXJzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIE1QNERlY29kaW5nTW9kZSBtb2RlKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgQm9vbCBzdGF0dXMgPSBQVl9UUlVFOworICAgIGludCBpZHg7CisgICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbTsKKworCisgICAgb3NjbF9tZW1zZXQoZGVjQ3RybCwgMCwgc2l6ZW9mKFZpZGVvRGVjQ29udHJvbHMpKTsgLyogZml4IGEgc2l6ZSBidWcuICAgMDMvMjgvMjAwMSAqLworICAgIGRlY0N0cmwtPm5MYXllcnMgPSBuTGF5ZXJzOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspCisgICAgeworICAgICAgICBkZWNDdHJsLT52b2xidWZbaWR4XSA9IHZvbGJ1ZltpZHhdOworICAgICAgICBkZWNDdHJsLT52b2xidWZfc2l6ZVtpZHhdID0gdm9sYnVmX3NpemVbaWR4XTsKKyAgICB9CisKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCisjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKKyAgICB2aWRlbyA9IElNRU1fVmlkZW9EZWNEYXRhOworI2Vsc2UKKyAgICB2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZpZGVvRGVjRGF0YSkpOworI2VuZGlmCisgICAgaWYgKHZpZGVvICE9IE5VTEwpCisgICAgeworICAgICAgICBvc2NsX21lbXNldCh2aWRlbywgMCwgc2l6ZW9mKFZpZGVvRGVjRGF0YSkpOworICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgPSBzaXplb2YoVmlkZW9EZWNEYXRhKTsKKyAgICAgICAgdmlkZW8tPm51bWJlck9mTGF5ZXJzID0gbkxheWVyczsKKyNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAorICAgICAgICB2aWRlby0+dm9sID0gKFZvbCAqKikgSU1FTV9WT0w7CisjZWxzZQorICAgICAgICBpZiAoKHNpemVfdCluTGF5ZXJzID4gU0laRV9NQVggLyBzaXplb2YoVm9sICopKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlbyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICB2aWRlby0+dm9sID0gKFZvbCAqKikgb3NjbF9tYWxsb2MobkxheWVycyAqIHNpemVvZihWb2wgKikpOworI2VuZGlmCisgICAgICAgIGlmICh2aWRlby0+dm9sID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gbkxheWVycyAqIHNpemVvZihWb2wgKik7CisKKyAgICAgICAgLyogYmUgc3VyZSBub3QgdG8gbGVhayBhbnkgcHJldmlvdXMgc3RhdGUgKi8KKyAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKGRlY0N0cmwpOworICAgICAgICAvKiB3ZSBuZWVkIHRvIHNldHVwIHRoaXMgcG9pbnRlciBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvICovCisgICAgICAgIC8qICAgIHBhc3MgaXQgYXJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSA9ICh2b2lkICopIHZpZGVvOworICAgICAgICB2aWRlby0+dmlkZW9EZWNDb250cm9scyA9IGRlY0N0cmw7ICAvKiB5ZXMuIHdlIGhhdmUgYSBjeWNsaWMgKi8KKyAgICAgICAgLyogcmVmZXJlbmNlcyBoZXJlIDopICAgICovCisKKyAgICAgICAgLyogQWxsb2NhdGluZyBWb3Agc3BhY2UsIHRoaXMgaGFzIHRvIGNoYW5nZSB3aGVuIHdlIGFkZCAqLworICAgICAgICAvKiAgICBzcGF0aWFsIHNjYWxhYmlsaXR5IHRvIHRoZSBkZWNvZGVyICAgICAgICAgICAgICAgICovCisjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSBJTUVNX2N1cnJWb3A7CisgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+Y3VyclZvcCwgMCwgc2l6ZW9mKFZvcCkpOworICAgICAgICB2aWRlby0+cHJldlZvcCA9IElNRU1fcHJldlZvcDsKKyAgICAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2Vm9wLCAwLCBzaXplb2YoVm9wKSk7CisgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKFZvcCkgKiAyKTsKKyAgICAgICAgdmlkZW8tPnZvcEhlYWRlciA9IChWb3AgKiopIElNRU1fdm9wSEVBREVSOworI2Vsc2UKKworICAgICAgICB2aWRlby0+Y3VyclZvcCA9IChWb3AgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvcCkpOworICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3AgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmN1cnJWb3AsIDAsIHNpemVvZihWb3ApKTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AgPSAoVm9wICopIG9zY2xfbWFsbG9jKHNpemVvZihWb3ApKTsKKyAgICAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2Vm9wLCAwLCBzaXplb2YoVm9wKSk7CisgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKFZvcCkgKiAyKTsKKworICAgICAgICBpZiAoKHNpemVfdCluTGF5ZXJzID4gU0laRV9NQVggLyBzaXplb2YoVm9wICopKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT52b3BIZWFkZXIgPSAoVm9wICoqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9wICopICogbkxheWVycyk7CisjZW5kaWYKKyAgICAgICAgaWYgKHZpZGVvLT52b3BIZWFkZXIgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnZvcEhlYWRlciwgMCwgc2l6ZW9mKFZvcCAqKSpuTGF5ZXJzKTsKKyAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoVm9wICopICogbkxheWVycyk7CisKKyAgICAgICAgdmlkZW8tPmluaXRpYWxpemVkID0gUFZfRkFMU0U7CisgICAgICAgIC8qIERlY29kZSB0aGUgaGVhZGVyIHRvIGdldCBhbGwgaW5mb3JtYXRpb24gdG8gYWxsb2NhdGUgZGF0YSAqLworICAgICAgICBpZiAoc3RhdHVzID09IFBWX1RSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGluaXRpYWxpemUgZGVjb2RlZCBmcmFtZSBjb3VudGVyLiAgIDA0LzI0LzIwMDEgKi8KKyAgICAgICAgICAgIHZpZGVvLT5mcmFtZV9pZHggPSAtMTsKKworCisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQorICAgICAgICAgICAgeworCisjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKKyAgICAgICAgICAgICAgICB2aWRlby0+dm9wSGVhZGVyW2lkeF0gPSBJTUVNX3ZvcEhlYWRlcltpZHhdOworI2Vsc2UKKyAgICAgICAgICAgICAgICB2aWRlby0+dm9wSGVhZGVyW2lkeF0gPSAoVm9wICopIG9zY2xfbWFsbG9jKHNpemVvZihWb3ApKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9wSGVhZGVyW2lkeF0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnZvcEhlYWRlcltpZHhdLCAwLCBzaXplb2YoVm9wKSk7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b3BIZWFkZXJbaWR4XS0+dGltZVN0YW1wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoVm9wKSk7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCisgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gSU1FTV92b2xbaWR4XTsKKyAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gc2l6ZW9mKFZvbCk7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOworICAgICAgICAgICAgICAgIHN0cmVhbSA9IElNRU1fQml0c3RyZWFtRGVjVmlkZW87CisjZWxzZQorICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IChWb2wgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvbCkpOworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihWb2wpOworICAgICAgICAgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSAoQml0c3RyZWFtRGVjVmlkZW8gKikgb3NjbF9tYWxsb2Moc2l6ZW9mKEJpdHN0cmVhbURlY1ZpZGVvKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gc2l6ZW9mKEJpdHN0cmVhbURlY1ZpZGVvKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludDMyIGJ1ZmZlcl9zaXplOworICAgICAgICAgICAgICAgICAgICBvc2NsX21lbXNldChzdHJlYW0sIDAsIHNpemVvZihCaXRzdHJlYW1EZWNWaWRlbykpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGJ1ZmZlcl9zaXplID0gQml0c3RyZWFtT3BlbihzdHJlYW0sIGlkeCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiSW5pdFZpZGVvRGVjb2RlcigpOiBDYW4ndCBhbGxvY2F0ZSBiaXRzdHJlYW0gYnVmZmVyLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5iaXRzdHJlYW0gPSBzdHJlYW07CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+dm9sSUQgPSBpZHg7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+dGltZUluY19vZmZzZXQgPSAwOyAgLyogIDExLzEyLzAxICovCisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludHJhID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXI7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXI7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09IE1QRUc0X01PREUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB1cCBWT0wgaGVhZGVyIGJpdHN0cmVhbSBmb3IgZnJhbWUtYmFzZWQgZGVjb2RpbmcuICAwOC8zMC8yMDAwICovCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZXNldChzdHJlYW0sIGRlY0N0cmwtPnZvbGJ1ZltpZHhdLCBkZWNDdHJsLT52b2xidWZfc2l6ZVtpZHhdKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChEZWNvZGVWT0xIZWFkZXIodmlkZW8sIGlkeCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQVl9TVUNDRVNTIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9UUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfVFJVRTsgICAvKiAgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBpZiBmaXJzdCBsYXllciBpcyBiYWQsIHNlY29uZCBsYXllciBpcyBnb29kIHJldHVybiBQVl9GQUlMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBQVl9UT0xFUkFURV9WT0xfRVJST1JTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQVl9CQURfVk9MSEVBREVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyID0gUFZfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+c2hvcnRWaWRlb0hlYWRlciA9PSBQVl9UUlVFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSDI2M19NT0RFOworICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IG1heCB3aWR0aCBhbmQgaGVpZ2h0LiAgSW4gSC4yNjMgbW9kZSwgd2UgdXNlICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgdm9sYnVmX3NpemVbMF0gdG8gcGFzcyBpbiB3aWR0aCBhbmQgdm9sYnVmX3NpemVbMV0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qICB0byBwYXNzIGluIGhlaWdodC4gICAgICAgICAgICAgICAgICAgIDA0LzIzLzIwMDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT50ZW1wb3JhbFJlZiA9IDA7IC8qICAxMS8xMi8wMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBzb21lIGNvbnZlbmllbmNlIHZhcmlhYmxlczogICAwNC8yMy8yMDAxICovCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPnF1YW50VHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPnF1YW50UHJlY2lzaW9uID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+ZXJyb3JSZXNEaXNhYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+ZGF0YVBhcnRpdGlvbmluZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPnVzZVJldmVyc2VWTEMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmludHJhX2FjZGNQcmVkRGlzYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPnNjYWxhYmlsaXR5ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+d2lkdGggPSAod2lkdGggKyAxNSkgJiAtMTY7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+aGVpZ2h0ID0gKGhlaWdodCArIDE1KSAmIC0xNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5zaXplID0gKGludDMyKXZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7CisKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tb2RpZmllZF9xdWFudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+YWR2YW5jZWRfSU5UUkEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRlYmxvY2tpbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlX3N0cnVjdHVyZSA9IDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9GQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gUFZBbGxvY1ZpZGVvRGF0YShkZWNDdHJsLCB3aWR0aCwgaGVpZ2h0LCBuTGF5ZXJzKTsKKyAgICAgICAgICAgIHZpZGVvLT5pbml0aWFsaXplZCA9IFBWX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgfQorCitmYWlsOgorICAgIGlmIChzdGF0dXMgPT0gUFZfRkFMU0UpIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihkZWNDdHJsKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Jvb2wgUFZBbGxvY1ZpZGVvRGF0YShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuTGF5ZXJzKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgQm9vbCBzdGF0dXMgPSBQVl9UUlVFOworICAgIGludCBuVG90YWxNQjsKKyAgICBpbnQgbk1CUGVyUm93OworICAgIGludDMyIHNpemU7CisKKyAgICBpZiAodmlkZW8tPnNob3J0VmlkZW9IZWFkZXIgPT0gUFZfVFJVRSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB3aWR0aDsKKyAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHZpZGVvLT53aWR0aCA9ICh3aWR0aCArIDE1KSAmIC0xNjsKKyAgICAgICAgdmlkZW8tPmhlaWdodCA9IChoZWlnaHQgKyAxNSkgJiAtMTY7CisKKyAgICAgICAgdmlkZW8tPm5NQlBlclJvdyA9CisgICAgICAgICAgICB2aWRlby0+bk1CaW5HT0IgID0gdmlkZW8tPndpZHRoIC8gTUJfU0laRTsKKyAgICAgICAgdmlkZW8tPm5NQlBlckNvbCA9CisgICAgICAgICAgICB2aWRlby0+bkdPQmluVm9wID0gdmlkZW8tPmhlaWdodCAvIE1CX1NJWkU7CisgICAgICAgIHZpZGVvLT5uVG90YWxNQiA9CisgICAgICAgICAgICB2aWRlby0+bk1CUGVyUm93ICogdmlkZW8tPm5NQlBlckNvbDsKKyAgICB9CisKKyAgICBpZiAoKCh1aW50NjRfdCl2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0KSA+ICh1aW50NjRfdClJTlQzMl9NQVggLyBzaXplb2YoUElYRUwpKSB7CisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICB9CisKKyAgICBzaXplID0gKGludDMyKXNpemVvZihQSVhFTCkgKiB2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0OworI2lmZGVmIFBWX01FTU9SWV9QT09MCisgICAgZGVjQ3RybC0+c2l6ZSA9IHNpemU7CisjZWxzZQorI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCisgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gSU1FTV9jdXJyVm9wX3lDaGFuOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KKyAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CisKKyAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSBJTUVNX3ByZXZWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLworICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KKyNlbHNlCisgICAgaWYgKHNpemUgPiBJTlQzMl9NQVggLyAzKSB7CisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICB9CisgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLworICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KKyAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCisgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQorI2VuZGlmCisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplICogMyk7CisjZW5kaWYgICAvLyBNRU1PUllfUE9PTAorICAgIC8qIE5vdGUgdGhhdCBiYXNlVm9wLCBlbmhjVm9wIGlzIG9ubHkgdXNlZCB0byBob2xkIGVuaGFuY2VtZW50ICovCisgICAgLyogICAgbGF5ZXIgaGVhZGVyIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgIDA1LzA0LzIwMDAgICovCisgICAgaWYgKG5MYXllcnMgPiAxKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wID0gKFZvcCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9wKSk7CisgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKFZvcCkpOworICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnByZXZFbmhjVm9wLCAwLCBzaXplb2YoVm9wKSk7CisjaWZuZGVmIFBWX01FTU9SWV9QT09MCisgICAgICAgICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAvIDMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCisgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgzICogc2l6ZSAvIDIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0aW5nIHNwYWNlIGZvciBzbGljZXMsIEFDIHByZWRpY3Rpb24gZmxhZywgYW5kICovCisgICAgLyogICAgQUMvREMgcHJlZGljdGlvbiBzdG9yYWdlICovCisgICAgblRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7CisgICAgbk1CUGVyUm93ID0gdmlkZW8tPm5NQlBlclJvdzsKKworI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCisgICAgdmlkZW8tPnNsaWNlTm8gPSAodWludDggKikoSU1FTV9zbGljZU5vKTsKKyAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COworICAgIHZpZGVvLT5hY1ByZWRGbGFnID0gKHVpbnQ4ICopKElNRU1fYWNQcmVkRmxhZyk7CisgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIpOworICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikoSU1FTV9wcmVkREMpOworICAgIGlmICh2aWRlby0+cHJlZERDID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKKyAgICB2aWRlby0+cHJlZERDQUNfY29sID0gKHR5cGVEQ0FDU3RvcmUgKikoSU1FTV9wcmVkRENBQ19jb2wpOworICAgIGlmICh2aWRlby0+cHJlZERDQUNfY29sID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKKyAgICB2aWRlby0+cHJlZERDQUNfcm93ID0gdmlkZW8tPnByZWREQ0FDX2NvbCArIDE7CisgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9ICh1aW50OCAqKShJTUVNX2hlYWRlckluZm9fTW9kZSk7CisgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COworICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9ICh1aW50OCAqKShJTUVNX2hlYWRlckluZm9fQ0JQKTsKKyAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKKyAgICB2aWRlby0+UVBNQiA9IChpbnQgKikoSU1FTV9oZWFkZXJJbmZvX1FQTUIpOworICAgIGlmICh2aWRlby0+UVBNQiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKGludCkpOworICAgIHZpZGVvLT5tYmxvY2sgPSAmSU1FTV9tYmxvY2s7CisgICAgaWYgKHZpZGVvLT5tYmxvY2sgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1ibG9jay0+YmxvY2ssIDAsIHNpemVvZihpbnQxNikqNipOQ09FRkZfQkxPQ0spOyAvLyAgQXVnIDIzLDIwMDUKKworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoTWFjcm9CbG9jayk7CisgICAgdmlkZW8tPm1vdFggPSAoTU9UICopKElNRU1fbW90WCk7CisgICAgaWYgKHZpZGVvLT5tb3RYID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIHZpZGVvLT5tb3RZID0gKE1PVCAqKShJTUVNX21vdFkpOworICAgIGlmICh2aWRlby0+bW90WSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihNT1QpICogOCAqIG5Ub3RhbE1CKTsKKyNlbHNlCisgICAgdmlkZW8tPnNsaWNlTm8gPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOworICAgIGlmICh2aWRlby0+c2xpY2VObyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5zbGljZU5vLCAwLCBuVG90YWxNQik7CisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COworCisgICAgdmlkZW8tPmFjUHJlZEZsYWcgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodWludDgpKTsKKyAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+YWNQcmVkRmxhZywgMCwgblRvdGFsTUIgKiBzaXplb2YodWludDgpKTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CKTsKKworICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YodHlwZURDU3RvcmUpKSB7CisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICB9CisgICAgdmlkZW8tPnByZWREQyA9ICh0eXBlRENTdG9yZSAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOworICAgIGlmICh2aWRlby0+cHJlZERDID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQywgMCwgblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CisKKyAgICBpZiAobk1CUGVyUm93ID4gSU5UMzJfTUFYIC0gMQorICAgICAgICAgICAgfHwgKHNpemVfdCkobk1CUGVyUm93ICsgMSkgPiBTSVpFX01BWCAvIHNpemVvZih0eXBlRENBQ1N0b3JlKSkgeworICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgfQorICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgPSAodHlwZURDQUNTdG9yZSAqKSBvc2NsX21hbGxvYygobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOworICAgIGlmICh2aWRlby0+cHJlZERDQUNfY29sID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQ0FDX2NvbCwgMCwgKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CisKKyAgICAvKiBlbGVtZW50IHplcm8gd2lsbCBiZSB1c2VkIGZvciBzdG9yaW5nIHZlcnRpY2FsIChjb2wpIEFDIGNvZWZmaWNpZW50cyAqLworICAgIC8qICB0aGUgcmVzdCB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgaG9yaXpvbnRhbCAocm93KSBBQyBjb2VmZmljaWVudHMgICovCisgICAgdmlkZW8tPnByZWREQ0FDX3JvdyA9IHZpZGVvLT5wcmVkRENBQ19jb2wgKyAxOyAgICAgICAgLyogIEFDREMgKi8KKworICAgIC8qIEFsbG9jYXRpbmcgSGVhZGVySW5mbyBzdHJ1Y3R1cmUgJiBRdWFudGl6ZXIgYXJyYXkgKi8KKyAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKKyAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUsIDAsIG5Ub3RhbE1CKTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CisgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKKyAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCwgMCwgblRvdGFsTUIpOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKKworICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YoaW50MTYpKSB7CisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICB9CisgICAgdmlkZW8tPlFQTUIgPSAoaW50MTYgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YoaW50MTYpKTsKKyAgICBpZiAodmlkZW8tPlFQTUIgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPlFQTUIsIDB4MCwgblRvdGFsTUIgKiBzaXplb2YoaW50MTYpKTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKGludCkpOworCisgICAgLyogQWxsb2NhdGluZyBtYWNyb2Jsb2NrIHNwYWNlICovCisgICAgdmlkZW8tPm1ibG9jayA9IChNYWNyb0Jsb2NrICopIG9zY2xfbWFsbG9jKHNpemVvZihNYWNyb0Jsb2NrKSk7CisgICAgaWYgKHZpZGVvLT5tYmxvY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+bWJsb2NrLT5ibG9jaywgMCwgc2l6ZW9mKGludDE2KSo2Kk5DT0VGRl9CTE9DSyk7IC8vICBBdWcgMjMsMjAwNQorCisgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoTWFjcm9CbG9jayk7CisgICAgfQorICAgIC8qIEFsbG9jYXRpbmcgbW90aW9uIHZlY3RvciBzcGFjZSAqLworICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyAoc2l6ZW9mKE1PVCkgKiA0KSkgeworICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgfQorICAgIHZpZGVvLT5tb3RYID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CisgICAgaWYgKHZpZGVvLT5tb3RYID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RYLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CisgICAgdmlkZW8tPm1vdFkgPSAoTU9UICopIG9zY2xfbWFsbG9jKHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKKyAgICBpZiAodmlkZW8tPm1vdFkgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPm1vdFksIDAsIHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihNT1QpICogOCAqIG5Ub3RhbE1CKTsKKyNlbmRpZgorCisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBkZWNvZGVyIGxpYnJhcnkgKi8KKyAgICB2aWRlby0+cHJldlZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKKyAgICB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wID0gMDsKKyNpZm5kZWYgUFZfTUVNT1JZX1BPT0wKKyAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldlZvcC0+eUNoYW4sIDE2LCBzaXplb2YodWludDgpKnNpemUpOyAgICAgLyogIDEwLzMxLzAxICovCisgICAgb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AtPnVDaGFuLCAxMjgsIHNpemVvZih1aW50OCkqc2l6ZSAvIDIpOworCisgICAgb3NjbF9tZW1zZXQodmlkZW8tPmN1cnJWb3AtPnlDaGFuLCAwLCBzaXplb2YodWludDgpKnNpemUqMyAvIDIpOworICAgIGlmIChuTGF5ZXJzID4gMSkKKyAgICB7CisgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4sIDAsIHNpemVvZih1aW50OCkqc2l6ZSozIC8gMik7CisgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dGltZVN0YW1wID0gMDsKKyAgICB9CisgICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsgICAgICAgICAgICAgICAvKiAgMDcvMDcvMjAwMSAqLworICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOyAgICAgICAgICAgICAgLyogIDA2LzE5LzIwMDIgKi8KKyNlbmRpZgorCisgICAgLyogYWx3YXlzIHN0YXJ0IGZyb20gYmFzZSBsYXllciAqLworICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSAwOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZSZXNldFZpZGVvRGVjb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwMS8xNC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFJlc2V0IHZpZGVvIHRpbWVzdGFtcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitCb29sIFBWUmVzZXRWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKK3sKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIGludCBpZHg7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGRlY0N0cmwtPm5MYXllcnM7IGlkeCsrKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnZvcEhlYWRlcltpZHhdLT50aW1lU3RhbXAgPSAwOworICAgIH0KKyAgICB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wID0gMDsKKyAgICBpZiAoZGVjQ3RybC0+bkxheWVycyA+IDEpCisgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dGltZVN0YW1wID0gMDsKKworICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tYmxvY2stPmJsb2NrLCAwLCBzaXplb2YoaW50MTYpKjYqTkNPRUZGX0JMT0NLKTsgLy8gIEF1ZyAyMywyMDA1CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQ2xlYW5VcFZpZGVvRGVjb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMTEvMjAwMCwgMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBDbGVhbnVwIG9mIHRoZSBNUEVHLTQgdmlkZW8gZGVjb2RlciBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZDbGVhblVwVmlkZW9EZWNvZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCit7CisgICAgaW50IGlkeDsKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCisgICAgaWYgKHZpZGVvKQorICAgIHsKKworICAgICAgICB2aWRlby0+YWNQcmVkRmxhZyAgICAgICA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5zbGljZU5vICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPm1vdFggICAgICAgICAgICAgPSBOVUxMOworICAgICAgICB2aWRlby0+bW90WSAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5tYmxvY2sgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPlFQTUIgICAgICAgICAgICAgPSBOVUxMOworICAgICAgICB2aWRlby0+cHJlZERDICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgICAgID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPnByZWREQ0FDX2NvbCAgICAgPSBOVUxMOworICAgICAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlICA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCAgID0gTlVMTDsKKyAgICAgICAgaWYgKHZpZGVvLT5udW1iZXJPZkxheWVycyA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4pIG9zY2xfZnJlZSh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuKTsKKyAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnByZXZFbmhjVm9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSBOVUxMOworICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbikKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSBOVUxMOworICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+cHJldlZvcCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gTlVMTDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuKQorICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICB2aWRlby0+cHJldlZvcCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlkZW8tPnZvbCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCB2aWRlby0+bnVtYmVyT2ZMYXllcnM7IGlkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1DbG9zZSh2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmlkZW8tPnZvcEhlYWRlcltpZHhdID0gTlVMTDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlkZW8tPnZvbCA9IE5VTEw7CisgICAgICAgICAgICB2aWRlby0+dm9wSGVhZGVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvID0gTlVMTDsKKyAgICAgICAgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSA9IE5VTEw7CisgICAgfQorCisjZWxzZQorCisgICAgaWYgKHZpZGVvKQorICAgIHsKKyAgICAgICAgaWYgKHZpZGVvLT5wcmVkREMpIG9zY2xfZnJlZSh2aWRlby0+cHJlZERDKTsKKyAgICAgICAgdmlkZW8tPnByZWREQ0FDX3JvdyA9IE5VTEw7CisgICAgICAgIGlmICh2aWRlby0+cHJlZERDQUNfY29sKSBvc2NsX2ZyZWUodmlkZW8tPnByZWREQ0FDX2NvbCk7CisgICAgICAgIGlmICh2aWRlby0+bW90WCkgb3NjbF9mcmVlKHZpZGVvLT5tb3RYKTsKKyAgICAgICAgaWYgKHZpZGVvLT5tb3RZKSBvc2NsX2ZyZWUodmlkZW8tPm1vdFkpOworICAgICAgICBpZiAodmlkZW8tPm1ibG9jaykgb3NjbF9mcmVlKHZpZGVvLT5tYmxvY2spOworICAgICAgICBpZiAodmlkZW8tPlFQTUIpIG9zY2xfZnJlZSh2aWRlby0+UVBNQik7CisgICAgICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlKSBvc2NsX2ZyZWUodmlkZW8tPmhlYWRlckluZm8uTW9kZSk7CisgICAgICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlApIG9zY2xfZnJlZSh2aWRlby0+aGVhZGVySW5mby5DQlApOworICAgICAgICBpZiAodmlkZW8tPnNsaWNlTm8pIG9zY2xfZnJlZSh2aWRlby0+c2xpY2VObyk7CisgICAgICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZykgb3NjbF9mcmVlKHZpZGVvLT5hY1ByZWRGbGFnKTsKKworICAgICAgICBpZiAodmlkZW8tPm51bWJlck9mTGF5ZXJzID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuID0gTlVMTDsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbikgb3NjbF9mcmVlKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4pOworICAgICAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+cHJldkVuaGNWb3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcCkKKyAgICAgICAgeworCisjaWZuZGVmIFBWX01FTU9SWV9QT09MCisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSBOVUxMOworICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gTlVMTDsKKyAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4pCisgICAgICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5jdXJyVm9wLT55Q2hhbik7CisjZW5kaWYKKyAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+Y3VyclZvcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wKQorICAgICAgICB7CisjaWZuZGVmIFBWX01FTU9SWV9QT09MCisgICAgICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSBOVUxMOworICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gTlVMTDsKKyAgICAgICAgICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4pCisgICAgICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbik7CisjZW5kaWYKKyAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+cHJldlZvcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlkZW8tPnZvbCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCB2aWRlby0+bnVtYmVyT2ZMYXllcnM7IGlkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdLT5iaXRzdHJlYW0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbUNsb3NlKHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT52b2xbaWR4XSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnZvbCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZpZGVvLT5udW1iZXJPZkxheWVyczsgaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+dm9wSGVhZGVyW2lkeF0pIG9zY2xfZnJlZSh2aWRlby0+dm9wSGVhZGVyW2lkeF0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZpZGVvLT52b3BIZWFkZXIpIG9zY2xfZnJlZSh2aWRlby0+dm9wSGVhZGVyKTsKKworICAgICAgICBvc2NsX2ZyZWUodmlkZW8pOworICAgICAgICBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRWaWRlb0RpbWVuc2lvbnMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNDA1MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiB0aGUgZGlzcGxheV93aWR0aCBhbmQgZGlzcGxheV9oZWlnaHQgb2YgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIHRoZSBmcmFtZSBpbiB0aGUgY3VycmVudCBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogVGhpcyBpcyBub3QgYSBtYWNybyBvciBpbmxpbmUgZnVuY3Rpb24gYmVjYXVzZSB3ZSBkbyAgICAgICAgICovCisvKiAgICAgICAgICAgICAgbm90IHdhbnQgdG8gZXhwb3NlIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZS4gICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgdm9pZCBQVkdldFZpZGVvRGltZW5zaW9ucyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQzMiAqZGlzcGxheV93aWR0aCwgaW50MzIgKmRpc3BsYXlfaGVpZ2h0KQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICAqZGlzcGxheV93aWR0aCA9IHZpZGVvLT5kaXNwbGF5V2lkdGg7CisgICAgKmRpc3BsYXlfaGVpZ2h0ID0gdmlkZW8tPmRpc3BsYXlIZWlnaHQ7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiB2b2lkIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQzMiAqd2lkdGgsIGludDMyICpoZWlnaHQpIHsKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgKndpZHRoID0gdmlkZW8tPndpZHRoOworICAgICpoZWlnaHQgPSB2aWRlby0+aGVpZ2h0OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0VmlkZW9UaW1lU3RhbXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMjcvMjAwMCwgMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogY3VycmVudCB0aW1lIHN0YW1wIGluIG1pbGxpc2Vjb25kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1aW50MzIgUFZHZXRWaWRlb1RpbWVTdGFtcChWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICByZXR1cm4gdmlkZW8tPmN1cnJUaW1lc3RhbXA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlNldFBvc3RQcm9jVHlwZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA3LzA3LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFNldCBwb3N0LXByb2Nlc3NpbmcgZmlsdGVyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAuIDA4LzI5LzIwMDAgY2hhbmdlcyB0aGUgbmFtZSBmb3IgY29uc2lzdGVuY3kuICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIHZvaWQgUFZTZXRQb3N0UHJvY1R5cGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50IG1vZGUpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIGlmIChtb2RlICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlBvc3QgcHJvY2Vzc2luZyBmaWx0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIHZpZGVvLT5wb3N0RmlsdGVyVHlwZSA9IDA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldERlY0JpdHJhdGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIzLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYXZlcmFnZSBiaXRzIHBlciBzZWNvbmQuICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFBWR2V0RGVjQml0cmF0ZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICBpbnQgICAgIGlkeDsKKyAgICBpbnQzMiAgIHN1bSA9IDA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IEJJVFJBVEVfQVZFUkFHRV9XSU5ET1c7IGlkeCsrKQorICAgIHsKKyAgICAgICAgc3VtICs9IHZpZGVvLT5uQml0c1BlclZvcFtpZHhdOworICAgIH0KKyAgICBzdW0gPSAoc3VtICogdmlkZW8tPmZyYW1lUmF0ZSkgLyAoMTAgKiBCSVRSQVRFX0FWRVJBR0VfV0lORE9XKTsKKyAgICByZXR1cm4gKGludCkgc3VtOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXREZWNGcmFtZXJhdGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGF2ZXJhZ2UgZnJhbWUgcGVyIDEwIHNlY29uZC4gICAgICAgKi8KKy8qICBOb3RlICAgICA6IFRoZSBmcHMgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgUFZHZXREZWNGcmFtZXJhdGUoKS8xMCAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBQVkdldERlY0ZyYW1lcmF0ZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKworICAgIHJldHVybiB2aWRlby0+ZnJhbWVSYXRlOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0T3V0cHV0RnJhbWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDUvMDcvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgZnJhbWUgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1aW50OCAqUFZHZXREZWNPdXRwdXRGcmFtZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQoreworICAgIHJldHVybiBkZWNDdHJsLT5vdXRwdXRGcmFtZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldExheWVySUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA3LzA5LzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBkZWNvZGVkIGZyYW1lIGxheWVyIGlkIChCQVNFL0VOSEFOQ0UpICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFBWR2V0TGF5ZXJJRChWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICByZXR1cm4gdmlkZW8tPmN1cnJMYXllcjsKK30KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXREZWNNZW1vcnlVc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZC4gICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludDMyIFBWR2V0RGVjTWVtb3J5VXNhZ2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKK3sKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgcmV0dXJuIHZpZGVvLT5tZW1vcnlVc2FnZTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0RGVjQml0c3RyZWFtTW9kZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBkZWNvZGluZyBtb2RlIG9mIHRoZSBiYXNlbGF5ZXIgICAgICovCisvKiAgICAgICAgICAgICAgYml0c3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBNUDREZWNvZGluZ01vZGUgUFZHZXREZWNCaXRzdHJlYW1Nb2RlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIGlmICh2aWRlby0+c2hvcnRWaWRlb0hlYWRlcikKKyAgICB7CisgICAgICAgIHJldHVybiBIMjYzX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBNUEVHNF9NT0RFOworICAgIH0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRXh0cmFjdFZvbEhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogRXh0cmFjdCB2b2wgaGVhZGVyIG9mIHRoZSBiaXRzdHJlYW0gZnJvbSBidWZmZXJbXS4gICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitCb29sIFBWRXh0cmFjdFZvbEhlYWRlcih1aW50OCAqdmlkZW9fYnVmZmVyLCB1aW50OCAqdm9sX2hlYWRlciwgaW50MzIgKnZvbF9oZWFkZXJfc2l6ZSkKK3sKKyAgICBpbnQgaWR4ID0gLTE7CisgICAgdWludDggc3RhcnRfY29kZV9wcmVmaXhbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMSB9OworICAgIHVpbnQ4IGgyNjNfcHJlZml4W10gPSB7IDB4MDAsIDB4MDAsIDB4ODAgfTsKKworICAgIGlmIChvc2NsX21lbWNtcChoMjYzX3ByZWZpeCwgdmlkZW9fYnVmZmVyLCAzKSA9PSAwKSAvKiB3ZSBoYXZlIHNob3J0IGhlYWRlciBzdHJlYW0gKi8KKyAgICB7CisgICAgICAgIG9zY2xfbWVtY3B5KHZvbF9oZWFkZXIsIHZpZGVvX2J1ZmZlciwgMzIpOworICAgICAgICAqdm9sX2hlYWRlcl9zaXplID0gMzI7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAob3NjbF9tZW1jbXAoc3RhcnRfY29kZV9wcmVmaXgsIHZpZGVvX2J1ZmZlciwgMykgfHwKKyAgICAgICAgICAgICAgICAodmlkZW9fYnVmZmVyWzNdICE9IDB4YjAgJiYgdmlkZW9fYnVmZmVyWzNdID49IDB4MjApKSByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICB3aGlsZSAob3NjbF9tZW1jbXAoc3RhcnRfY29kZV9wcmVmaXgsIHZpZGVvX2J1ZmZlciArIGlkeCwgMykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICAgICAgaWYgKGlkeCArIDMgPj0gKnZvbF9oZWFkZXJfc2l6ZSkgZ290byBxdWl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlICh2aWRlb19idWZmZXJbaWR4KzNdICE9IDB4YjMgJiYgdmlkZW9fYnVmZmVyW2lkeCszXSAhPSAweGI2KTsKKworICAgICAgICBvc2NsX21lbWNweSh2b2xfaGVhZGVyLCB2aWRlb19idWZmZXIsIGlkeCk7CisgICAgICAgICp2b2xfaGVhZGVyX3NpemUgPSBpZHg7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworcXVpdDoKKyAgICBvc2NsX21lbWNweSh2b2xfaGVhZGVyLCB2aWRlb19idWZmZXIsICp2b2xfaGVhZGVyX3NpemUpOworICAgIHJldHVybiBGQUxTRTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWTG9jYXRlRnJhbWVIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvOC8yMDA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUmV0dXJuIHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0IFNDIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQzMiBQVkxvY2F0ZUZyYW1lSGVhZGVyKHVpbnQ4ICpwdHIsIGludDMyIHNpemUpCit7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBpbnQzMiBpID0gc2l6ZTsKKworICAgIGlmIChzaXplIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgaWYgKChjb3VudCA+IDEpICYmICgqcHRyID09IDB4MDEpKQorICAgICAgICB7CisgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqcHRyKyspCisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIHJldHVybiAoc2l6ZSAtIChpICsgMSkpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZMb2NhdGVIMjYzRnJhbWVIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC84LzIwMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBSZXR1cm4gdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgU0MgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludDMyIFBWTG9jYXRlSDI2M0ZyYW1lSGVhZGVyKHVpbnQ4ICpwdHIsIGludDMyIHNpemUpCit7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBpbnQzMiBpID0gc2l6ZTsKKworICAgIGlmIChzaXplIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICBpZiAoKGNvdW50ID4gMSkgJiYgKCgqcHRyICYgMHhGQykgPT0gMHg4MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpwdHIrKykKKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgcmV0dXJuIChzaXplIC0gKGkgKyAxKSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkRlY29kZVZpZGVvRnJhbWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRGVjb2RlIG9uZSB2aWRlbyBmcmFtZSBhbmQgcmV0dXJuIGEgWVVWLTEyIGltYWdlLiAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAwNC8xNy8yMDAxIHJlbW92ZWQgUFZfRU9TLCBQVl9FTkRfT0ZfQlVGRkVSICAgICAgICAgICAgICAqLworLyogICAgICAgICAgIDogMDgvMjIvMjAwMiBicmVhayB1cCBpbnRvIDIgZnVuY3Rpb25zIFBWRGVjb2RlVm9wSGVhZGVyIGFuZCAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIFBWRGVjb2RlVm9wQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWRGVjb2RlVmlkZW9GcmFtZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqYnVmZmVyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRpbWVzdGFtcFtdLCBpbnQzMiBidWZmZXJfc2l6ZVtdLCB1aW50IHVzZV9leHRfdGltZXN0YW1wW10sIHVpbnQ4ICpjdXJyWVVWKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9GQUlMOworICAgIFZvcEhlYWRlckluZm8gaGVhZGVyX2luZm87CisKKyAgICBzdGF0dXMgPSAoUFZfU1RBVFVTKVBWRGVjb2RlVm9wSGVhZGVyKGRlY0N0cmwsIGJ1ZmZlciwgdGltZXN0YW1wLCBidWZmZXJfc2l6ZSwgJmhlYWRlcl9pbmZvLCB1c2VfZXh0X3RpbWVzdGFtcCwgY3VycllVVik7CisgICAgaWYgKHN0YXR1cyAhPSBQVl9UUlVFKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICBpZiAoUFZEZWNvZGVWb3BCb2R5KGRlY0N0cmwsIGJ1ZmZlcl9zaXplKSAhPSBQVl9UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRGVjb2RlVm9wSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZXRlcm1pbmUgdGFyZ2V0IGxheWVyIGFuZCBkZWNvZGUgdm9wIGhlYWRlciwgbW9kaWZpZWQgZnJvbSAgKi8KKy8qICAgICAgICAgICAgICBvcmlnaW5hbCBQVkRlY29kZVZpZGVvRnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0Jvb2wgUFZEZWNvZGVWb3BIZWFkZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKmJ1ZmZlcltdLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdGltZXN0YW1wW10sIGludDMyIGJ1ZmZlcl9zaXplW10sIFZvcEhlYWRlckluZm8gKmhlYWRlcl9pbmZvLCB1aW50IHVzZV9leHRfdGltZXN0YW1wIFtdLCB1aW50OCAqY3VycllVVikKK3sKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIFZvbCAqY3VyclZvbDsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWb3AgKip2b3BIZWFkZXIgPSB2aWRlby0+dm9wSGVhZGVyOworICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW07CisKKyAgICBpbnQgdGFyZ2V0X2xheWVyOworCisjaWZkZWYgUFZfU1VQUE9SVF9URU1QT1JBTF9TQ0FMQUJJTElUWQorICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9GQUlMOworICAgIGludCBpZHg7CisgICAgaW50MzIgZGlzcGxheV90aW1lOworCisgICAgLyogZGVjaWRlIHdoaWNoIGZyYW1lIHRvIGRlY29kZSBuZXh0ICovCisgICAgaWYgKGRlY0N0cmwtPm5MYXllcnMgPiAxKQorICAgIHsKKyAgICAgICAgZGlzcGxheV90aW1lID0gdGFyZ2V0X2xheWVyID0gLTE7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgZGVjQ3RybC0+bkxheWVyczsgaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRvIHdlIGhhdmUgZGF0YSBmb3IgdGhpcyBsYXllcj8gKi8KKyAgICAgICAgICAgIGlmIChidWZmZXJfc2l6ZVtpZHhdIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wW2lkeF0gPSAtMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZGlkIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlIGEgdGltZXN0YW1wIGZvciB0aGlzIHZvcD8gKi8KKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBbaWR4XSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZvcEhlYWRlcltpZHhdLT50aW1lU3RhbXAgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZGVjb2RlIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGJpdHN0cmVhbSAqLworICAgICAgICAgICAgICAgICAgICB2aWRlby0+Y3VyckxheWVyID0gaWR4OworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSB2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVzZXQoc3RyZWFtLCBidWZmZXJbaWR4XSwgYnVmZmVyX3NpemVbaWR4XSk7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBEZWNvZGVWT1BIZWFkZXIodmlkZW8sIHZvcEhlYWRlcltpZHhdLCBGQUxTRSkpICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmaW5kIGEgVk9QIGhlYWRlciBpbiB0aGUgYnVmZmVyLiAgIDA4LzMwLzIwMDAuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUFZTZWFyY2hOZXh0TTRWRnJhbWUoc3RyZWFtKSAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHdlIGRvbid0IGhhdmUgZGF0YSBmb3IgZW5oYW5jZW1lbnQgbGF5ZXIsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgZG9uJ3QganVzdCBzdG9wLiAgIDA5LzA3LzIwMDAuICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemVbaWR4XSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2b3BIZWFkZXJbaWR4XS0+dGltZVN0YW1wID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBbaWR4XSA9IENhbGNWb3BEaXNwbGF5VGltZSh2aWRlby0+dm9sW2lkeF0sIHZvcEhlYWRlcltpZHhdLCB2aWRlby0+c2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09IDApIHZvcEhlYWRlcltpZHhdLT5yZWZTZWxlY3RDb2RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSd2ZSBkZWNvZGVkIHRoaXMgdm9wIGhlYWRlciBpbiB0aGUgcHJldmlvdXMgcnVuIGFscmVhZHkuICovCisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFtpZHhdID0gdm9wSGVhZGVyW2lkeF0tPnRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFVzZSB0aW1lc3RhbXBzIHRvIHNlbGVjdCB0aGUgbmV4dCBWT1AgdG8gYmUgZGVjb2RlZCAqLworICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFtpZHhdID49IDAgJiYgKGRpc3BsYXlfdGltZSA8IDAgfHwgZGlzcGxheV90aW1lID4gdGltZXN0YW1wW2lkeF0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZSA9IHRpbWVzdGFtcFtpZHhdOworICAgICAgICAgICAgICAgIHRhcmdldF9sYXllciA9IGlkeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRpc3BsYXlfdGltZSA9PSB0aW1lc3RhbXBbaWR4XSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB3ZSBoYXZlIHRvIGhhbmRsZSBlaXRoZXIgU05SIG9yIHNwYXRpYWwgc2NhbGFiaWxpdHkgaGVyZS4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodGFyZ2V0X2xheWVyIDwgMCkgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgICAgIC8qIHNldCB1cCBmb3IgZGVjb2RpbmcgdGhlIHRhcmdldCBsYXllciAqLworICAgICAgICB2aWRlby0+Y3VyckxheWVyID0gdGFyZ2V0X2xheWVyOworICAgICAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFt0YXJnZXRfbGF5ZXJdOworICAgICAgICB2aWRlby0+Yml0c3RyZWFtID0gc3RyZWFtID0gY3VyclZvbC0+Yml0c3RyZWFtOworCisgICAgICAgIC8qIFdlIG5lZWQgdG8gZGVjb2RlIHRoZSB2b3AgaGVhZGVyIGlmIGV4dGVybmFsIHRpbWVzdGFtcCAgICovCisgICAgICAgIC8qICAgIGlzIHByb3ZpZGVkLiAgICAxMC8wNC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICh2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dGltZVN0YW1wIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtID0gdmlkZW8tPnZvbFt0YXJnZXRfbGF5ZXJdLT5iaXRzdHJlYW07CisgICAgICAgICAgICBCaXRzdHJlYW1SZXNldChzdHJlYW0sIGJ1ZmZlclt0YXJnZXRfbGF5ZXJdLCBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdKTsKKworICAgICAgICAgICAgd2hpbGUgKERlY29kZVZPUEhlYWRlcih2aWRlbywgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0sIFRSVUUpICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGZpbmQgYSBWT1AgaGVhZGVyIGluIHRoZSBidWZmZXIuICAgMDgvMzAvMjAwMC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoUFZTZWFyY2hOZXh0TTRWRnJhbWUoc3RyZWFtKSAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBkYXRhIGZvciBlbmhhbmNlbWVudCBsYXllciwgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogICAgZG9uJ3QganVzdCBzdG9wLiAgIDA5LzA3LzIwMDAuICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0gPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+dm9sW3RhcmdldF9sYXllcl0tPnRpbWVJbmNfb2Zmc2V0ID0gdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnRpbWVJbmM7CisgICAgICAgICAgICB2aWRlby0+dm9sW3RhcmdldF9sYXllcl0tPm1vZHVsb1RpbWVCYXNlID0gdGltZXN0YW1wW3RhcmdldF9sYXllcl07CisgICAgICAgICAgICB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dGltZVN0YW1wID0gdGltZXN0YW1wW3RhcmdldF9sYXllcl07CisgICAgICAgICAgICBpZiAodGFyZ2V0X2xheWVyID09IDApIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT5yZWZTZWxlY3RDb2RlID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGJhc2UgbGF5ZXIgb25seSBkZWNvZGluZyAqLworICAgIHsKKyNlbmRpZgorICAgICAgICB2aWRlby0+Y3VyckxheWVyID0gdGFyZ2V0X2xheWVyID0gMDsKKyAgICAgICAgY3VyclZvbCA9IHZpZGVvLT52b2xbMF07CisgICAgICAgIHZpZGVvLT5iaXRzdHJlYW0gPSBzdHJlYW0gPSBjdXJyVm9sLT5iaXRzdHJlYW07CisgICAgICAgIGlmIChidWZmZXJfc2l6ZVswXSA8PSAwKSByZXR1cm4gUFZfRkFMU0U7CisgICAgICAgIEJpdHN0cmVhbVJlc2V0KHN0cmVhbSwgYnVmZmVyWzBdLCBidWZmZXJfc2l6ZVswXSk7CisKKyAgICAgICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoRGVjb2RlU2hvcnRIZWFkZXIodmlkZW8sIHZvcEhlYWRlclswXSkgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoUFZTZWFyY2hOZXh0SDI2M0ZyYW1lKHN0cmVhbSkgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHZvcCBoZWFkZXIgaW4gdGhlIGJ1ZmZlciwgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogICBjbGVhbiBiaXRzdHJlYW0gYnVmZmVyLiAgICAgMi81LzIwMDEgICAqLworICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+aW5pdGlhbGl6ZWQgPT0gUFZfRkFMU0UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodXNlX2V4dF90aW1lc3RhbXBbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTVRCIGZvciBIMjYzIGlzIGFic29sdXRlIFRSICovCisgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nIGxpbmUgaXMgZXF1aXZhbGVudCB0byAgcm91bmQoKHRpbWVzdGFtcFswXSozMCkvMTAwMSk7ICAgMTEvMTMvMjAwMSAqLworICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbMF0tPm1vZHVsb1RpbWVCYXNlID0gMzAgKiAoKHRpbWVzdGFtcFswXSArIDE3KSAvIDEwMDEpICsgKDMwICogKCh0aW1lc3RhbXBbMF0gKyAxNykgJSAxMDAxKSAvIDEwMDEpOworICAgICAgICAgICAgICAgIHZvcEhlYWRlclswXS0+dGltZVN0YW1wID0gdGltZXN0YW1wWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZvcEhlYWRlclswXS0+dGltZVN0YW1wID0gQ2FsY1ZvcERpc3BsYXlUaW1lKGN1cnJWb2wsIHZvcEhlYWRlclswXSwgdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKERlY29kZVZPUEhlYWRlcih2aWRlbywgdm9wSGVhZGVyWzBdLCBGQUxTRSkgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZmluZCBhIFZPUCBoZWFkZXIgaW4gdGhlIGJ1ZmZlci4gICAwOC8zMC8yMDAwLiAqLworICAgICAgICAgICAgICAgIGlmIChQVlNlYXJjaE5leHRNNFZGcmFtZShzdHJlYW0pICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyBubyB2b3AgaGVhZGVyIGluIHRoZSBidWZmZXIsICAgICovCisgICAgICAgICAgICAgICAgICAgIC8qICAgY2xlYW4gYml0c3RyZWFtIGJ1ZmZlci4gICAgIDIvNS8yMDAxICAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemVbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodXNlX2V4dF90aW1lc3RhbXBbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFswXS0+dGltZUluY19vZmZzZXQgPSB2b3BIZWFkZXJbMF0tPnRpbWVJbmM7CisgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFswXS0+bW9kdWxvVGltZUJhc2UgPSB0aW1lc3RhbXBbMF07ICAvKiAgMTEvMTIvMjAwMSAqLworICAgICAgICAgICAgICAgIHZvcEhlYWRlclswXS0+dGltZVN0YW1wID0gdGltZXN0YW1wWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZvcEhlYWRlclswXS0+dGltZVN0YW1wID0gQ2FsY1ZvcERpc3BsYXlUaW1lKGN1cnJWb2wsIHZvcEhlYWRlclswXSwgdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IHVwIHNvbWUgYmFzZS1sYXllciBvbmx5IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgdm9wSGVhZGVyWzBdLT5yZWZTZWxlY3RDb2RlID0gMTsKKyNpZmRlZiBQVl9TVVBQT1JUX1RFTVBPUkFMX1NDQUxBQklMSVRZCisgICAgfQorI2VuZGlmCisgICAgdGltZXN0YW1wW3RhcmdldF9sYXllcl0gPSB2aWRlby0+Y3VyclRpbWVzdGFtcCA9IHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT50aW1lU3RhbXA7CisjaWZkZWYgUFZfTUVNT1JZX1BPT0wKKyAgICB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+eUNoYW4gPSAoUElYRUwgKiljdXJyWVVWOworICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT51Q2hhbiA9IChQSVhFTCAqKWN1cnJZVVYgKyBkZWNDdHJsLT5zaXplOworICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT52Q2hhbiA9IChQSVhFTCAqKSh2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dUNoYW4pICsgKGRlY0N0cmwtPnNpemUgPj4gMik7CisjZWxzZQorICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT55Q2hhbiA9IGN1cnJWb3AtPnlDaGFuOworICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT51Q2hhbiA9IGN1cnJWb3AtPnVDaGFuOworICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT52Q2hhbiA9IGN1cnJWb3AtPnZDaGFuOworI2VuZGlmCisgICAgb3NjbF9tZW1jcHkoY3VyclZvcCwgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0sIHNpemVvZihWb3ApKTsKKworI2lmZGVmIFBWX1NVUFBPUlRfVEVNUE9SQUxfU0NBTEFCSUxJVFkKKyAgICB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dGltZVN0YW1wID0gLTE7CisjZW5kaWYKKyAgICAvKiBwdXQgaGVhZGVyIGluZm8gaW50byB0aGUgc3RydWN0dXJlICovCisgICAgaGVhZGVyX2luZm8tPmN1cnJMYXllciA9IHRhcmdldF9sYXllcjsKKyAgICBoZWFkZXJfaW5mby0+dGltZXN0YW1wID0gdmlkZW8tPmN1cnJUaW1lc3RhbXA7CisgICAgaGVhZGVyX2luZm8tPmZyYW1lVHlwZSA9IChNUDRGcmFtZVR5cGUpY3VyclZvcC0+cHJlZGljdGlvblR5cGU7CisgICAgaGVhZGVyX2luZm8tPnJlZlNlbENvZGUgPSB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+cmVmU2VsZWN0Q29kZTsKKyAgICBoZWFkZXJfaW5mby0+cXVhbnRpemVyID0gY3VyclZvcC0+cXVhbnRpemVyOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRGVjb2RlVm9wQm9keSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWNvZGUgdm9wIGJvZHkgYWZ0ZXIgdGhlIGhlYWRlciBpcyBkZWNvZGVkLCBtb2RpZmllZCBmcm9tICAgKi8KKy8qICAgICAgICAgICAgICBvcmlnaW5hbCBQVkRlY29kZVZpZGVvRnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0Jvb2wgUFZEZWNvZGVWb3BCb2R5KFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyIGJ1ZmZlcl9zaXplW10pCit7CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICBpbnQgdGFyZ2V0X2xheWVyID0gdmlkZW8tPmN1cnJMYXllcjsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3RhcmdldF9sYXllcl07CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVm9wICpwcmV2Vm9wID0gdmlkZW8tPnByZXZWb3A7CisgICAgVm9wICp0ZW1wVm9wUHRyOworICAgIGludCBieXRlc19jb25zdW1lZCA9IDA7IC8qIFJlY29yZCBob3cgbWFueSBiaXRzIHdlIHVzZWQgaW4gdGhlIGJ1ZmZlci4gICAwNC8yNC8yMDAxICovCisKKyAgICBpbnQgaWR4OworCisgICAgaWYgKGN1cnJWb3AtPnZvcENvZGVkID09IDApICAgICAgICAgICAgICAgICAgLyogIDA3LzAzLzIwMDEgKi8KKyAgICB7CisgICAgICAgIFBWX0JpdHN0cmVhbUJ5dGVBbGlnbihjdXJyVm9sLT5iaXRzdHJlYW0pOworICAgICAgICAvKiBXZSBzaG91bGQgYWx3YXlzIGNsZWFyIHVwIGJpdHN0cmVhbSBidWZmZXIuICAgMTAvMTAvMjAwMCAqLworICAgICAgICBieXRlc19jb25zdW1lZCA9IChnZXRQb2ludGVyKGN1cnJWb2wtPmJpdHN0cmVhbSkgKyA3KSA+PiAzOworCisgICAgICAgIGlmIChieXRlc19jb25zdW1lZCA+IGN1cnJWb2wtPmJpdHN0cmVhbS0+ZGF0YV9lbmRfcG9zKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlc19jb25zdW1lZCA9IGN1cnJWb2wtPmJpdHN0cmVhbS0+ZGF0YV9lbmRfcG9zOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzX2NvbnN1bWVkIDwgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSWYgd2Ugb25seSBjb25zdW1lIHBhcnQgb2YgdGhlIGJpdHMgaW4gdGhlIGJ1ZmZlciwgdGFrZSB0aG9zZSAqLworICAgICAgICAgICAgLyogIG91dC4gICAgIDA0LzI0LzIwMDEgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgIG9zY2xfbWVtY3B5KGJ1ZmZlclt0YXJnZXRfbGF5ZXJdLCBidWZmZXJbdGFyZ2V0X2xheWVyXStieXRlc19jb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXS09Ynl0ZXNfY29uc3VtZWQpKTsgKi8KKyAgICAgICAgICAgIGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0gLT0gYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdID0gMDsKKyAgICAgICAgfQorI2lmZGVmIFBWX01FTU9SWV9QT09MCisKKyAgICAgICAgaWYgKHRhcmdldF9sYXllcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+dGltZVN0YW1wID4gdmlkZW8tPnByZXZWb3AtPnRpbWVTdGFtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlZvcCA9IHZpZGVvLT5wcmV2RW5oY1ZvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmlkZW8tPnByZXZWb3AtPnlDaGFuKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8zNTI2OTYzNSIpOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNTI2OTYzNSIpOworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIG9zY2xfbWVtY3B5KGN1cnJWb3AtPnlDaGFuLCB2aWRlby0+cHJldlZvcC0+eUNoYW4sIChkZWNDdHJsLT5zaXplKjMpIC8gMik7CisKKyAgICAgICAgdmlkZW8tPnByZXZWb3AgPSBwcmV2Vm9wOworCisgICAgICAgIHZpZGVvLT5jb25jZWFsRnJhbWUgPSBjdXJyVm9wLT55Q2hhbjsgICAgICAgLyogIDA3LzA3LzIwMDEgKi8KKworICAgICAgICB2aWRlby0+dm9wX2NvZGluZ190eXBlID0gY3VyclZvcC0+cHJlZGljdGlvblR5cGU7IC8qICAwNy8wOS8wMSAqLworCisgICAgICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gY3VyclZvcC0+eUNoYW47CisKKyAgICAgICAgLyogU3dhcCBWT1AgcG9pbnRlcnMuICBObyBlbmhjLiBmcmFtZSBvc2NsX21lbWNweSgpIGFueW1vcmUhICAgMDQvMjQvMjAwMSAqLworICAgICAgICBpZiAodGFyZ2V0X2xheWVyKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wVm9wUHRyID0gdmlkZW8tPnByZXZFbmhjVm9wOworICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcCA9IHRlbXBWb3BQdHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wVm9wUHRyID0gdmlkZW8tPnByZXZWb3A7CisgICAgICAgICAgICB2aWRlby0+cHJldlZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wVm9wUHRyOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAodGFyZ2V0X2xheWVyKSAgICAgICAvKiB0aGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBmbGFzaGJhY2sgcHJvYmxlbXMgICAwNi8yMS8yMDAyKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT50aW1lU3RhbXAgPSBjdXJyVm9wLT50aW1lU3RhbXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wID0gY3VyclZvcC0+dGltZVN0YW1wOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9IGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOyAvKiAgMDcvMDkvMDEgKi8KKyAgICAgICAgLyogdGhlIGZvbGxvd2luZyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGlzcGxheWluZyBhbiBub3RDb2RlZCBJLVZPUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2Vzc2lvbgorICAgICAgICBvciBhZnRlciByYW5kb20gcG9zaXRpb25pbmcgIDA3LzAzLzAyKi8KKyAgICAgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+dm9wX2NvZGluZ190eXBlID0gUF9WT1A7CisgICAgICAgIH0KKworCisgICAgICAgIHJldHVybiBQVl9UUlVFOworICAgIH0KKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgICAgLyogIERlY29kZSB2b3AgYm9keSAoaWYgdGhlcmUgaXMgbm8gZXJyb3IgaW4gdGhlIGhlYWRlciEpICAqLworICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIC8qIGZpcnN0LCB3ZSBuZWVkIHRvIHNlbGVjdCBhIHJlZmVyZW5jZSBmcmFtZSAqLworICAgIGlmIChkZWNDdHJsLT5uTGF5ZXJzID4gMSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZG8gbm90aGluZyBoZXJlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY3VyclZvcC0+cmVmU2VsZWN0Q29kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDAgOiAvKiBtb3N0IHJlY2VudGx5IGRlY29kZWQgZW5oYW5jZW1lbnQgdm9wICovCisgICAgICAgICAgICAgICAgICAgIC8qIFNldHVwIHZpZGVvLT5wcmV2Vm9wIGJlZm9yZSB3ZSBjYWxsIFBWX0RlY29kZVZvcCgpLiAgIDA0LzI0LzIwMDEgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+dGltZVN0YW1wID49IHZpZGVvLT5wcmV2Vm9wLT50aW1lU3RhbXApCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHJldlZvcCA9IHZpZGVvLT5wcmV2RW5oY1ZvcDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiAvKiBtb3N0IHJlY2VudGx5IGRpc3BsYXllZCBiYXNlLWxheWVyIHZvcCAqLworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X2xheWVyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT50aW1lU3RhbXAgPiB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gdmlkZW8tPnByZXZFbmhjVm9wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyIDogLyogbmV4dCBiYXNlLWxheWVyIHZvcCBpbiBkaXNwbGF5IG9yZGVyICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAzIDogLyogdGVtcG9yYWxseSBjb2luY2lkZW50IGJhc2UtbGF5ZXIgdm9wIChubyBNVidzKSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHdlIGhhdmUgYSBCLVZvcCAqLworICAgICAgICB7CisgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVWaWRlb0ZyYW1lKCk6IEItVk9QIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoaXMgaXMgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgZnJhbWUgcmF0ZSBhbmQgYml0cmF0ZS4gKi8KKyAgICBpZHggPSArK3ZpZGVvLT5mcmFtZV9pZHggJSBCSVRSQVRFX0FWRVJBR0VfV0lORE9XOworCisgICAgLyogQ2FsY3VsYXRlIGJpdHJhdGUgZm9yIHRoaXMgbGF5ZXIuICAgMDgvMjMvMjAwMCAqLworICAgIHN0YXR1cyA9IFBWX0RlY29kZVZvcCh2aWRlbyk7CisgICAgdmlkZW8tPm5CaXRzUGVyVm9wW2lkeF0gPSBnZXRQb2ludGVyKGN1cnJWb2wtPmJpdHN0cmVhbSk7CisgICAgdmlkZW8tPnByZXZUaW1lc3RhbXBbaWR4XSA9IGN1cnJWb3AtPnRpbWVTdGFtcDsKKworICAgIC8qIHJlc3RvcmUgdmlkZW8tPnByZXZWb3AgYWZ0ZXIgUFZfRGVjb2RlVm9wKCkuICAgMDQvMjQvMjAwMSAqLworLy8gIGlmIChjdXJyVm9wLT5yZWZTZWxlY3RDb2RlID09IDApIHZpZGVvLT5wcmV2Vm9wID0gcHJldlZvcDsKKyAgICB2aWRlby0+cHJldlZvcCA9IHByZXZWb3A7CisKKyAgICAvKiBFc3RpbWF0ZSB0aGUgZnJhbWUgcmF0ZS4gICAwOC8yMy8yMDAwICovCisgICAgdmlkZW8tPmR1cmF0aW9uID0gdmlkZW8tPnByZXZUaW1lc3RhbXBbaWR4XTsKKyAgICB2aWRlby0+ZHVyYXRpb24gLT0gdmlkZW8tPnByZXZUaW1lc3RhbXBbKCsraWR4KSVCSVRSQVRFX0FWRVJBR0VfV0lORE9XXTsKKyAgICBpZiAodmlkZW8tPmR1cmF0aW9uID4gMCkKKyAgICB7IC8qIE9ubHkgdXBkYXRlIGZyYW1lcmF0ZSB3aGVuIHRoZSB0aW1lc3RhbXAgaXMgcmlnaHQgKi8KKyAgICAgICAgdmlkZW8tPmZyYW1lUmF0ZSA9IChpbnQpKEZSQU1FUkFURV9TQ0FMRSkgLyB2aWRlby0+ZHVyYXRpb247CisgICAgfQorCisgICAgLyogV2Ugc2hvdWxkIGFsd2F5cyBjbGVhciB1cCBiaXRzdHJlYW0gYnVmZmVyLiAgIDEwLzEwLzIwMDAgKi8KKyAgICBieXRlc19jb25zdW1lZCA9IChnZXRQb2ludGVyKGN1cnJWb2wtPmJpdHN0cmVhbSkgKyA3KSA+PiAzOyAvKiAgMTEvNC8wMyAqLworCisgICAgaWYgKGJ5dGVzX2NvbnN1bWVkID4gY3VyclZvbC0+Yml0c3RyZWFtLT5kYXRhX2VuZF9wb3MpCisgICAgeworICAgICAgICBieXRlc19jb25zdW1lZCA9IGN1cnJWb2wtPmJpdHN0cmVhbS0+ZGF0YV9lbmRfcG9zOworICAgIH0KKworICAgIGlmIChieXRlc19jb25zdW1lZCA8IGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0pCisgICAgeworICAgICAgICAvKiBJZiB3ZSBvbmx5IGNvbnN1bWUgcGFydCBvZiB0aGUgYml0cyBpbiB0aGUgYnVmZmVyLCB0YWtlIHRob3NlICovCisgICAgICAgIC8qICBvdXQuICAgICAwNC8yNC8yMDAxICovCisgICAgICAgIC8qICAgICAgb3NjbF9tZW1jcHkoYnVmZmVyW3RhcmdldF9sYXllcl0sIGJ1ZmZlclt0YXJnZXRfbGF5ZXJdK2J5dGVzX2NvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAoYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXS09Ynl0ZXNfY29uc3VtZWQpKTsgKi8KKyAgICAgICAgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSAtPSBieXRlc19jb25zdW1lZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSA9IDA7CisgICAgfQorICAgIHN3aXRjaCAoc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBQVl9GQUlMIDoKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsgICAgICAgIC8qIHRoaXMgd2lsbCB0YWtlIGNhcmUgb2YgY29uY2VhbG1lbnQgaWYgd2UgbG9zZSB3aG9sZSBmcmFtZSAgKi8KKworICAgICAgICBjYXNlIFBWX0VORF9PRl9WT1AgOgorICAgICAgICAgICAgLyogd2UgbWF5IHdhbnQgdG8gZGlmZmVyZW5jaWF0ZSBQVl9FTkRfT0ZfVk9QIGFuZCBQVl9TVUNDRVNTICovCisgICAgICAgICAgICAvKiAgICBpbiB0aGUgZnV0dXJlLiAgICAgMDUvMTAvMjAwMCAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIGNhc2UgUFZfU1VDQ0VTUyA6CisgICAgICAgICAgICAvKiBOb2h0aW5nIGlzIHdyb25nIDopLiAqLworCisKKyAgICAgICAgICAgIHZpZGVvLT5jb25jZWFsRnJhbWUgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW47ICAgICAgIC8qICAwNy8wNy8yMDAxICovCisKKyAgICAgICAgICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7IC8qICAwNy8wOS8wMSAqLworCisgICAgICAgICAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbjsKKworICAgICAgICAgICAgLyogU3dhcCBWT1AgcG9pbnRlcnMuICBObyBlbmhjLiBmcmFtZSBvc2NsX21lbWNweSgpIGFueW1vcmUhICAgMDQvMjQvMjAwMSAqLworICAgICAgICAgICAgaWYgKHRhcmdldF9sYXllcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wVm9wUHRyID0gdmlkZW8tPnByZXZFbmhjVm9wOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcFZvcFB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wVm9wUHRyID0gdmlkZW8tPnByZXZWb3A7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclZvcCA9IHRlbXBWb3BQdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIC8qIFRoaXMgd2lsbCBuZXZlciBoYXBwZW4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisjaWZkZWYgUFZfTUVNT1JZX1BPT0wKK09TQ0xfRVhQT1JUX1JFRiB2b2lkIFBWU2V0UmVmZXJlbmNlWVVWKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpZVVYpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IChQSVhFTCAqKVlVVjsKKyAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSAoUElYRUwgKilZVVYgKyB2aWRlby0+c2l6ZTsKKyAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSAoUElYRUwgKil2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoZGVjQ3RybC0+c2l6ZSA+PiAyKTsKKyAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldlZvcC0+eUNoYW4sIDE2LCBzaXplb2YodWludDgpKmRlY0N0cmwtPnNpemUpOyAgICAgLyogIDEwLzMxLzAxICovCisgICAgb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AtPnVDaGFuLCAxMjgsIHNpemVvZih1aW50OCkqZGVjQ3RybC0+c2l6ZSAvIDIpOworICAgIHZpZGVvLT5jb25jZWFsRnJhbWUgPSB2aWRlby0+cHJldlZvcC0+eUNoYW47ICAgICAgICAgICAgICAgLyogIDA3LzA3LzIwMDEgKi8KKyAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsgICAgICAgICAgICAgIC8qICAwNi8xOS8yMDAyICovCit9CisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDYvMjAvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBldmVyeXRpbWUgYW4gZXJyb3IgaW50IHRoZSAgICAgICovCisvKiAgICAgICAgICAgICAgYml0c3RyZWFtIGlzIGRldGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VpbnQgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZChWaWRlb0RlY0RhdGEgKikKK3sKKyAgICAvKiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdHJhcHBpbmcgYml0c3RyZWFtIGVycm9yIGZvciBkZWJ1Z2luZyAqLworICAgIHJldHVybiAwOworfQorCisjaWZkZWYgRU5BQkxFX0xPRworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IG00dmRlY19kcHJpbnRmKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMTUvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUaGlzIGlzIGEgZnVuY3Rpb24gdGhhdCBsb2dzIG1lc3NhZ2VzIGluIHRoZSBtcGVnNCB2aWRlbyAgICAgKi8KKy8qICAgICAgICAgICAgIGRlY29kZXIuICBXZSBjYW4gY2FsbCB0aGUgc3RhbmRhcmQgUGFja2V0VmlkZW8gUFZNZXNzYWdlICAgICAqLworLyogICAgICAgICAgICAgZnJvbSBpbnNpZGUgdGhpcyBmdW5jdGlvbiBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogVG8gdHVybiBvbiB0aGUgbG9nZ2luZywgTE9HX01QNERFQ19NRVNTQUdFIG11c3QgYmUgZGVmaW5lZCAgICovCisvKiAgICAgICAgICAgICAgd2hlbiBjb21waWxpbmcgdGhpcyBmaWxlIChvbmx5IHRoaXMgZmlsZSkuICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit2b2lkIG00dmRlY19kcHJpbnRmKGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIEZJTEUgKmxvZ19mcDsKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKworICAgIC8qIG9wZW4gdGhlIGxvZyBmaWxlICovCisgICAgbG9nX2ZwID0gZm9wZW4oIlxcbXA0ZGVjX2xvZy50eHQiLCAiYSsiKTsKKyAgICBpZiAobG9nX2ZwID09IE5VTEwpIHJldHVybjsKKyAgICAvKiBvdXRwdXQgdGhlIG1lc3NhZ2UgKi8KKyAgICB2ZnByaW50Zihsb2dfZnAsIGZvcm1hdCwgYXJncyk7CisgICAgZmNsb3NlKGxvZ19mcCk7CisKKyAgICB2YV9lbmQoYXJncyk7Cit9CisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IElzSW50cmFGcmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDUvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogVGhlIG1vc3QgcmVjZW50bHkgZGVjb2RlZCBmcmFtZSBpcyBhbiBJbnRyYSBmcmFtZS4gICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitCb29sIElzSW50cmFGcmFtZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICByZXR1cm4gKHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPT0gSV9WT1ApOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRGVjUG9zdFByb2Nlc3MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDEvMDkvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBQb3N0UHJvY2VzcyBvbmUgdmlkZW8gZnJhbWUgYW5kIHJldHVybiBhIFlVVi0xMiBpbWFnZS4gICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit2b2lkIFBWRGVjUG9zdFByb2Nlc3MoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKm91dHB1dFlVVikKK3sKKyAgICB1aW50OCAqb3V0cHV0QnVmZmVyOworICAgIG91dHB1dEJ1ZmZlciA9IGRlY0N0cmwtPm91dHB1dEZyYW1lOworICAgIG91dHB1dFlVVjsKKyAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IG91dHB1dEJ1ZmZlcjsKKyAgICByZXR1cm47Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkRlY1NldFJlZmVyZW5jZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWLCAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgdGltZXN0YW1wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDcvMjIvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBHZXQgWVVWIHJlZmVyZW5jZSBmcmFtZSBmcm9tIGV4dGVybmFsIHNvdXJjZS4gICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IFlVViA0LTItMCBmcmFtZSBjb250YWluaW5nIG5ldyByZWZlcmVuY2UgZnJhbWUgaW4gdGhlIHNhbWUgICAqLworLyogICA6IGRpbWVuc2lvbiBhcyBvcmlnaW5hbCwgaS5lLiwgZG9lc24ndCBoYXZlIHRvIGJlIG11bHRpcGxlIG9mIDE2ICEhIS4gICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0Jvb2wgUFZEZWNTZXRSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgdWludDMyIHRpbWVzdGFtcCkKK3sKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIFZvcCAqcHJldlZvcCA9IHZpZGVvLT5wcmV2Vm9wOworICAgIGludCB3aWR0aCA9IHZpZGVvLT53aWR0aDsKKyAgICB1aW50OCAqZHN0UHRyLCAqb3JnUHRyLCAqZHN0UHRyMiwgKm9yZ1B0cjI7CisgICAgaW50MzIgc2l6ZSA9IChpbnQzMil3aWR0aCAqIHZpZGVvLT5oZWlnaHQ7CisKKworICAgIC8qIHNldCBuZXcgcGFyYW1ldGVycyAqLworICAgIHByZXZWb3AtPnRpbWVTdGFtcCA9IHRpbWVzdGFtcDsKKyAgICBwcmV2Vm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworCisgICAgZHN0UHRyID0gcHJldlZvcC0+eUNoYW47CisgICAgb3JnUHRyID0gcmVmWVVWOworICAgIG9zY2xfbWVtY3B5KGRzdFB0ciwgb3JnUHRyLCBzaXplKTsKKyAgICBkc3RQdHIgPSBwcmV2Vm9wLT51Q2hhbjsKKyAgICBkc3RQdHIyID0gcHJldlZvcC0+dkNoYW47CisgICAgb3JnUHRyID0gcmVmWVVWICsgc2l6ZTsKKyAgICBvcmdQdHIyID0gb3JnUHRyICsgKHNpemUgPj4gMik7CisgICAgb3NjbF9tZW1jcHkoZHN0UHRyLCBvcmdQdHIsIChzaXplID4+IDIpKTsKKyAgICBvc2NsX21lbWNweShkc3RQdHIyLCBvcmdQdHIyLCAoc2l6ZSA+PiAyKSk7CisKKyAgICB2aWRlby0+Y29uY2VhbEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOworICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBJX1ZPUDsKKyAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsKKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRGVjU2V0RW5oUmVmZXJlbmNlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYsICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgdGltZXN0YW1wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDcvMjMvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBHZXQgWVVWIGVuaGFuY2UgcmVmZXJlbmNlIGZyYW1lIGZyb20gZXh0ZXJuYWwgc291cmNlLiAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IFlVViA0LTItMCBmcmFtZSBjb250YWluaW5nIG5ldyByZWZlcmVuY2UgZnJhbWUgaW4gdGhlIHNhbWUgICAqLworLyogICA6IGRpbWVuc2lvbiBhcyBvcmlnaW5hbCwgaS5lLiwgZG9lc24ndCBoYXZlIHRvIGJlIG11bHRpcGxlIG9mIDE2ICEhIS4gICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0Jvb2wgUFZEZWNTZXRFbmhSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgdWludDMyIHRpbWVzdGFtcCkKK3sKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIFZvcCAqcHJldkVuaGNWb3AgPSB2aWRlby0+cHJldkVuaGNWb3A7CisgICAgdWludDggKmRzdFB0ciwgKm9yZ1B0ciwgKmRzdFB0cjIsICpvcmdQdHIyOworICAgIGludDMyIHNpemUgPSAoaW50MzIpIHZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7CisKKyAgICBpZiAodmlkZW8tPm51bWJlck9mTGF5ZXJzIDw9IDEpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworCisgICAgLyogc2V0IG5ldyBwYXJhbWV0ZXJzICovCisgICAgcHJldkVuaGNWb3AtPnRpbWVTdGFtcCA9IHRpbWVzdGFtcDsKKyAgICBwcmV2RW5oY1ZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKKworICAgIGRzdFB0ciA9IHByZXZFbmhjVm9wLT55Q2hhbjsKKyAgICBvcmdQdHIgPSByZWZZVVY7CisgICAgb3NjbF9tZW1jcHkoZHN0UHRyLCBvcmdQdHIsIHNpemUpOworICAgIGRzdFB0ciA9IHByZXZFbmhjVm9wLT51Q2hhbjsKKyAgICBkc3RQdHIyID0gcHJldkVuaGNWb3AtPnZDaGFuOworICAgIG9yZ1B0ciA9IHJlZllVViArIHNpemU7CisgICAgb3JnUHRyMiA9IG9yZ1B0ciArIChzaXplID4+IDIpOworICAgIG9zY2xfbWVtY3B5KGRzdFB0ciwgb3JnUHRyLCAoc2l6ZSA+PiAyKSk7CisgICAgb3NjbF9tZW1jcHkoZHN0UHRyMiwgb3JnUHRyMiwgKHNpemUgPj4gMikpOworICAgIHZpZGVvLT5jb25jZWFsRnJhbWUgPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuOworICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBJX1ZPUDsKKyAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW47CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0Vm9sSW5mbygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMDYvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBHZXQgdGhlIHZvbCBpbmZvKG9ubHkgYmFzZS1sYXllcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6IDA2LzI0LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitCb29sIFBWR2V0Vm9sSW5mbyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBWb2xJbmZvICpwVm9sSW5mbykKK3sKKyAgICBWb2wgKmN1cnJWb2w7CisKKyAgICBpZiAocFZvbEluZm8gPT0gTlVMTCB8fCBkZWNDdHJsID09IE5VTEwgfHwgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAoKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEpLT52b2xbMF0gPT0gTlVMTCkgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgY3VyclZvbCA9ICgoVmlkZW9EZWNEYXRhICopKGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEpKS0+dm9sWzBdOworCisgICAgLy8gZ2V0IHRoZSBWT0wgaW5mbworICAgIHBWb2xJbmZvLT5zaG9ydFZpZGVvSGVhZGVyID0gKGludDMyKSgoVmlkZW9EZWNEYXRhICopKGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEpKS0+c2hvcnRWaWRlb0hlYWRlcjsKKyAgICBwVm9sSW5mby0+ZGF0YVBhcnRpdGlvbmluZyA9IChpbnQzMiljdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nOworICAgIHBWb2xJbmZvLT5lcnJvclJlc0Rpc2FibGUgID0gKGludDMyKWN1cnJWb2wtPmVycm9yUmVzRGlzYWJsZTsKKyAgICBwVm9sSW5mby0+dXNlUmV2ZXJzZVZMQyAgICA9IChpbnQzMiljdXJyVm9sLT51c2VSZXZlcnNlVkxDOworICAgIHBWb2xJbmZvLT5zY2FsYWJpbGl0eSAgICAgID0gKGludDMyKWN1cnJWb2wtPnNjYWxhYmlsaXR5OworICAgIHBWb2xJbmZvLT5uYml0c1RpbWVJbmNSZXMgID0gKGludDMyKWN1cnJWb2wtPm5iaXRzVGltZUluY1JlczsKKyAgICBwVm9sSW5mby0+cHJvZmlsZV9sZXZlbF9pZCA9IChpbnQzMiljdXJyVm9sLT5wcm9maWxlX2xldmVsX2lkOworCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9zY2FsaW5nLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9zY2FsaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmcuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvc2NhbGluZy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9zY2FsaW5nX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9zY2FsaW5nX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmdfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvc2NhbGluZ190YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjX3RhYi5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY190YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY190YWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY190YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY29kZS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY29kZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY29kZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVxdWFudC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVxdWFudC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZXF1YW50LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlcXVhbnQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY190YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzI0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCkBAIC0wLDAgKzEsMTY3NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJsb2cvbG9nLmgiCisKKyNpbmNsdWRlICJtcDRkZWNfbGliLmgiCisjaW5jbHVkZSAiYml0c3RyZWFtLmgiCisjaW5jbHVkZSAidmxjX2RlY29kZS5oIgorI2luY2x1ZGUgInppZ3phZy5oIgorCisjZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTlZfUE9TU0lCTEVfTE9TU19PRl9EQVRBCisKKy8qIElOVFJBICovCitjb25zdCBzdGF0aWMgaW50IG1wZWdfaXFtYXRfZGVmW05DT0VGRl9CTE9DS10gPQoreworICAgIDgsIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI3LAorICAgIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI3LCAyOCwKKyAgICAyMCwgMjEsIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsCisgICAgMjEsIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLAorICAgIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLCAzNSwKKyAgICAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLCAzNSwgMzgsCisgICAgMjUsIDI2LCAyOCwgMzAsIDMyLCAzNSwgMzgsIDQxLAorICAgIDI3LCAyOCwgMzAsIDMyLCAzNSwgMzgsIDQxLCA0NQorfTsKKworLyogSU5URVIgKi8KK2NvbnN0IHN0YXRpYyBpbnQgbXBlZ19ucW1hdF9kZWZbNjRdICA9Cit7CisgICAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLAorICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKKyAgICAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCisgICAgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjYsIDI3LAorICAgIDIwLCAyMSwgMjIsIDIzLCAyNSwgMjYsIDI3LCAyOCwKKyAgICAyMSwgMjIsIDIzLCAyNCwgMjYsIDI3LCAyOCwgMzAsCisgICAgMjIsIDIzLCAyNCwgMjYsIDI3LCAyOCwgMzAsIDMxLAorICAgIDIzLCAyNCwgMjUsIDI3LCAyOCwgMzAsIDMxLCAzMworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBDYWxjTnVtQml0cygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBDYWxjdWxhdGUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICByZXByZXNlbnQgeC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogVGhpcyBpcyBhbiBlcXVpdmFsZW50IGltcGxlbWVudGF0aW9uIG9mICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAobG9uZyljZWlsKGxvZygoZG91YmxlKXgpL2xvZygyLjApKSAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgQ2FsY051bUJpdHModWludCB4KQoreworICAgIGludCBpID0gMTsKKyAgICB3aGlsZSAoeCA+Pj0gMSkgaSsrOworICAgIHJldHVybiBpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCisqCisqIC0tIERlY29kZVZvbEhlYWRlciAtLSBEZWNvZGUgdGhlIGhlYWRlciBvZiBhIFZPTAorKgorKiAgIDA0LzEwLzIwMDAgOiBpbml0aWFsIG1vZGlmaWNhdGlvbiB0byB0aGUgbmV3IFBWLURlY29kZXIgTGliIGZvcm1hdC4KKyogICAxMC8xMi8yMDAxIDogcmVqZWN0IG5vbiBjb21wbGlhbnQgYml0c3RyZWFtcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50RW5kKioqKioqKiovCitQVl9TVEFUVVMgRGVjb2RlVk9MSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBsYXllcikKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIFZvbCAqY3VyclZvbDsKKyAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtOworICAgIHVpbnQzMiB0bXB2YXIsIHZvbF9zaGFwZTsKKyAgICB1aW50MzIgc3RhcnRDb2RlOworICAgIGludCAqcW1hdCwgaSwgajsKKyAgICBpbnQgdmVyc2lvbl9pZCA9IDE7CisjaWZkZWYgUFZfVE9MRVJBVEVfVk9MX0VSUk9SUworICAgIHVpbnQzMiBwcm9maWxlID0gMHgwMTsKKyNlbmRpZgorICAgIC8qICBUaGVyZSdzIGEgImN1cnJMYXllciIgdmFyaWFibGUgaW5zaWRlIHZpZGVvRGVjRGF0YS4gICAgICAgICAgKi8KKyAgICAvKiAgIEhvd2V2ZXIsIHdlIGRvbid0IG1haW50YWluIGl0IHVudGlsIHdlIGRlY29kZSBmcmFtZSBkYXRhLiAgMDQvMDUvMjAwMCAqLworICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sW2xheWVyXTsKKyAgICBzdHJlYW0gID0gY3VyclZvbC0+Yml0c3RyZWFtOworICAgIGN1cnJWb2wtPm1vZHVsb1RpbWVCYXNlID0gMDsKKworICAgIC8qIERldGVybWluZSB3aGljaCBzdGFydCBjb2RlIGZvciB0aGUgZGVjb2RlciB0byBiZWdpbiB3aXRoICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMkhDKHN0cmVhbSwgJnN0YXJ0Q29kZSk7CisKKyAgICBpZiAoc3RhcnRDb2RlID09IFZJU1VBTF9PQkpFQ1RfU0VRVUVOQ0VfU1RBUlRfQ09ERSkKKyAgICB7ICAgLyogIEJpdHN0cmVhbSBFeGhjaGFuZ2UgRml4IDkvOTkgKi8KKyAgICAgICAgLyogQml0c3RyZWFtIEV4Y2hhbmdlIHJlcXVpcmVzIHdlIGFsbG93IHN0YXJ0IHdpdGggVmlkZW8gT2JqZWN0IFNlcXVlbmNlICovCisgICAgICAgIC8qIHZpc3VhbF9vYmplY3Rfc2VxdWVuY2Vfc3RhcnRfY29kZSAgICAgICAgICAgICovCisgICAgICAgICh2b2lkKSBCaXRzdHJlYW1SZWFkQml0czMySEMoc3RyZWFtKTsKKyAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sICA4KTsgLyogcHJvZmlsZSAqLworI2lmbmRlZiBQVl9UT0xFUkFURV9WT0xfRVJST1JTCisgICAgICAgIGlmIChsYXllcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBzdXBwb3J0IFNTUEwwLTIgICovCisgICAgICAgICAgICBpZiAodG1wdmFyICE9IDB4MTAgJiYgdG1wdmFyICE9IDB4MTEgJiYgdG1wdmFyICE9IDB4MTIgJiYKKyAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4QTEgJiYgdG1wdmFyICE9IDB4QTIgICYmIHRtcHZhciAhPSAweEEzLyogQ29yZSBTUEBMMS1MMyAqLykKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHN1cHBvcnQgU1BMMC0zICYgU1NQTDAtMiAgICovCisgICAgICAgICAgICBpZiAodG1wdmFyICE9IDB4MDEgJiYgdG1wdmFyICE9IDB4MDIgJiYgdG1wdmFyICE9IDB4MDMgJiYgdG1wdmFyICE9IDB4MDggJiYKKyAgICAgICAgICAgICAgICAgICAgLyogV2hpbGUgbm90IHRlY2huaWNhbGx5IHN1cHBvcnRlZCwgdHJ5IHRvIGRlY29kZSBTUEw0JlNQTDUgZmlsZXMgYXMgd2VsbC4gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogV2UnbGwgZmFpbCBsYXRlciBpZiB0aGUgc2l6ZSBpcyB0b28gbGFyZ2UuICBUaGlzIGlzIHRvIGFsbG93IHBsYXliYWNrIG9mICovCisgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgPD1DSUYgZmlsZXMgZ2VuZXJhdGVkIGJ5IG90aGVyIGVuY29kZXJzLiAqLworICAgICAgICAgICAgICAgICAgICB0bXB2YXIgIT0gMHgwNCAmJiB0bXB2YXIgIT0gMHgwNSAmJgorICAgICAgICAgICAgICAgICAgICB0bXB2YXIgIT0gMHgxMCAmJiB0bXB2YXIgIT0gMHgxMSAmJiB0bXB2YXIgIT0gMHgxMiAmJgorICAgICAgICAgICAgICAgICAgICB0bXB2YXIgIT0gMHgyMSAmJiB0bXB2YXIgIT0gMHgyMiAmJiAgLyogQ29yZSBQcm9maWxlIExldmVscyAqLworICAgICAgICAgICAgICAgICAgICB0bXB2YXIgIT0gMHhBMSAmJiB0bXB2YXIgIT0gMHhBMiAmJiB0bXB2YXIgIT0gMHhBMyAmJgorICAgICAgICAgICAgICAgICAgICB0bXB2YXIgIT0gMHhGMCAmJiB0bXB2YXIgIT0gMHhGMSAmJiAvKiBBZHZhbmNlZCBTaW1wbGUgUHJvZmlsZSBMZXZlbHMqLworICAgICAgICAgICAgICAgICAgICB0bXB2YXIgIT0gMHhGMiAmJiB0bXB2YXIgIT0gMHhGMyAmJgorICAgICAgICAgICAgICAgICAgICB0bXB2YXIgIT0gMHhGNCAmJiB0bXB2YXIgIT0gMHhGNSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcHJvZmlsZSA9IHRtcHZhcjsKKyNlbmRpZgorCisgICAgICAgIC8vIHNhdmUgdGhlIHByb2ZpbGUgYW5kIGxldmVsIGZvciB0aGUgcXVlcnkKKyAgICAgICAgY3VyclZvbC0+cHJvZmlsZV9sZXZlbF9pZCA9ICh1aW50KXRtcHZhcjsgLy8gIDYvMTAvMDQKKworCisKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMkhDKHN0cmVhbSwgJnRtcHZhcik7CisgICAgICAgIGlmICh0bXB2YXIgPT0gVVNFUl9EQVRBX1NUQVJUX0NPREUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNvbWV0aGluZyBoYXMgdG8gYmUgZG9uZSB3aXRoIHVzZXIgZGF0YSAgMTEvMTEvOTkgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVVzZXJEYXRhKHN0cmVhbSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisgICAgICAgIC8qIHZpc3VhbF9vYmplY3Rfc3RhcnRfY29kZSAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMzJIQyhzdHJlYW0sICZ0bXB2YXIpOworICAgICAgICBpZiAodG1wdmFyICE9IFZJU1VBTF9PQkpFQ1RfU1RBUlRfQ09ERSkKKyAgICAgICAgeworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTZWFyY2ggZm9yIFZPTF9IRUFERVIgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVlNlYXJjaE5leHRNNFZGcmFtZShzdHJlYW0pOyAvKiBzZWFyY2ggMHgwMCAweDAwIDB4MDEgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpIHJldHVybiBQVl9GQUlMOyAvKiBicmVha3MgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgVk9MX1NUQVJUX0NPREVfTEVOR1RILCAmdG1wdmFyKTsKKyAgICAgICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICh0bXB2YXIgIT0gVk9MX1NUQVJUX0NPREUpOworICAgICAgICAgICAgZ290byBkZWNvZGVfdm9sOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMzMkhDKHN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICAvKiAgaXNfdmlzdWFsX29iamVjdF9pZGVudGlmaWVyICAgICAgICAgICAgKi8KKyAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgICAgIGlmICh0bXB2YXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHZpc3VhbF9vYmplY3RfdmVyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKKyAgICAgICAgICAgIC8qIHZpc3VhbF9vYmplY3RfcHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAzKTsKKyAgICAgICAgfQorICAgICAgICAvKiB2aXN1YWxfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgNCwgJnRtcHZhcik7CisgICAgICAgIGlmICh0bXB2YXIgPT0gMSkKKyAgICAgICAgeyAvKiB2aWRlb19zaWduYWxfdHlwZSAqLworICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgNCk7CisgICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB2aWRlb19mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMyk7CisgICAgICAgICAgICAgICAgLyogdmlkZW9fcmFuZ2UgICovCisgICAgICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgLyogY29sb3JfZGVzY3JpcHRpb24gKi8KKyAgICAgICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjb2xvcl9wcmltYXJpZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOworICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOworICAgICAgICAgICAgICAgICAgICAvKiBtYXRyaXhfY29lZmZpY2llbnRzICovCisgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNlYXJjaCBmb3IgVk9MX0hFQURFUiAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWU2VhcmNoTmV4dE00VkZyYW1lKHN0cmVhbSk7IC8qIHNlYXJjaCAweDAwIDB4MDAgMHgwMSAqLworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykgcmV0dXJuIFBWX0ZBSUw7IC8qIGJyZWFrcyB0aGUgbG9vcCAqLworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMzIoc3RyZWFtLCBWT0xfU1RBUlRfQ09ERV9MRU5HVEgsICZ0bXB2YXIpOworICAgICAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHRtcHZhciAhPSBWT0xfU1RBUlRfQ09ERSk7CisgICAgICAgICAgICBnb3RvIGRlY29kZV92b2w7CisgICAgICAgIH0KKworICAgICAgICAvKiBuZXh0X3N0YXJ0X2NvZGUoKSAqLworICAgICAgICBzdGF0dXMgPSBQVl9CaXRzdHJlYW1CeXRlQWxpZ24oc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEwLzEyLzAxICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzJIQyhzdHJlYW0sICZ0bXB2YXIpOworCisgICAgICAgIGlmICh0bXB2YXIgPT0gVVNFUl9EQVRBX1NUQVJUX0NPREUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNvbWV0aGluZyBoYXMgdG8gYmUgZG9uZSB0byBkZWFsIHdpdGggdXNlciBkYXRhIChwYXJzZSBpdCkgIDExLzExLzk5ICovCisgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVVc2VyRGF0YShzdHJlYW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgMjcsICZ0bXB2YXIpOyAgIC8qICAxMC8xMi8wMSAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiAgICAgIHRtcHZhciA9IDA7ICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTAvMTIvMDEgKi8KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIDI3LCAmdG1wdmFyKTsgICAgIC8qIHVuY29tbWVudCB0aGlzIGxpbmUgaWYgeW91IHdhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YXJ0IGRlY29kaW5nIHdpdGggYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fb2JqZWN0X3N0YXJ0X2NvZGUgKi8KKyAgICB9CisKKyAgICBpZiAodG1wdmFyID09IFZPX1NUQVJUX0NPREUpCisgICAgeworICAgICAgICAvKioqKioKKyAgICAgICAgKgorICAgICAgICAqICAgUmVhZCB0aGUgVk9MIGhlYWRlciBlbnRyaWVzIGZyb20gdGhlIGJpdHN0cmVhbQorICAgICAgICAqCisgICAgICAgICoqKioqLworICAgICAgICAvKiB2aWRlb19vYmplY3Rfc3RhcnRfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czMyKHN0cmVhbSwgMjcpOworICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNSk7CisKKworICAgICAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfc3RhcnRfY29kZSAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgVk9MX1NUQVJUX0NPREVfTEVOR1RILCAmdG1wdmFyKTsKKyAgICAgICAgaWYgKHRtcHZhciAhPSBWT0xfU1RBUlRfQ09ERSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQ2hlY2tFbmRCdWZmZXIoc3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX1ZPUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+c2hvcnRWaWRlb0hlYWRlciA9IFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBWX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFNlYXJjaCBmb3IgVk9MX0hFQURFUiAqLworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVlNlYXJjaE5leHRNNFZGcmFtZShzdHJlYW0pOy8qIHNlYXJjaCAweDAwIDB4MDAgMHgwMSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpIHJldHVybiBQVl9GQUlMOyAvKiBicmVha3MgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCwgJnRtcHZhcik7CisgICAgICAgICAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDgpOyAvKiBhZHZhbmNlIHRoZSBieXRlIHB0ciAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAodG1wdmFyICE9IFZPTF9TVEFSVF9DT0RFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDgpOworICAgICAgICB9CisKK2RlY29kZV92b2w6CisgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCAtIDgpOworICAgICAgICB2aWRlby0+c2hvcnRWaWRlb0hlYWRlciA9IDA7CisKKyAgICAgICAgLyogdm9sX2lkICg0IGJpdHMpICovCisgICAgICAgIGN1cnJWb2wtPnZvbElEID0gKGludCkgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDQpOworCisgICAgICAgIC8qIFJhbmRvbUFjY2Vzc2libGUgZmxhZyAqLworICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKworICAgICAgICAvKiBvYmplY3QgdHlwZSAqLworICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7ICAgICAgICAgICAgICAgIC8qICAqLworCisjaWZkZWYgUFZfVE9MRVJBVEVfVk9MX0VSUk9SUworICAgICAgICBpZiAodG1wdmFyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsYXllcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgU1NQTDAtMiAgKi8KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAweDEwICYmIHByb2ZpbGUgIT0gMHgxMSAmJiBwcm9maWxlICE9IDB4MTIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgICAgIHRtcHZhciA9IDB4MDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBTUEwwLTMgJiBTU1BMMC0yICAgKi8KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAweDAxICYmIHByb2ZpbGUgIT0gMHgwMiAmJiBwcm9maWxlICE9IDB4MDMgJiYgcHJvZmlsZSAhPSAweDA4ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlICE9IDB4MTAgJiYgcHJvZmlsZSAhPSAweDExICYmIHByb2ZpbGUgIT0gMHgxMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgdG1wdmFyID0gMHgwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2ZpbGUgfD0gMHgwMTAwOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAobGF5ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0bXB2YXIgIT0gMHgwMikgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTaW1wbGUgYW5kIGFkdmFuY2VkIHNpbXBsZSAoZm9yIHF1YW50LXR5cGUgMSkKKyAgICAgICAgICAgIGlmICh0bXB2YXIgIT0gMHgwMSAmJiB0bXB2YXIgIT0gMHgxMSkgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICAvKiB2ZXJzaW9uIGlkIHNwZWNpZmllZD8gKi8KKyAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgICAgIGlmICh0bXB2YXIgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogdmVyc2lvbiBJRCAqLworICAgICAgICAgICAgdmVyc2lvbl9pZCA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKKyAgICAgICAgICAgIC8qIHByaW9yaXR5ICovCisgICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMyk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFzcGVjdCByYXRpbyBpbmZvICovCisgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKKyAgICAgICAgaWYgKHRtcHZhciA9PSAwKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgaWYgKHRtcHZhciA9PSAweGYgLyogZXh0ZW5kZWRfcGFyICovKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOworICAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIGNvbnRyb2wgcGFyYW1ldGVycyBwcmVzZW50PyAqLworICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKworICAgICAgICAvKiAgR2V0IHRoZSBwYXJhbWV0ZXJzIChza2lwcGVkKSAqLworICAgICAgICAvKiAgMDMvMTAvOTkgKi8KKyAgICAgICAgaWYgKHRtcHZhcikKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hyb21hX2Zvcm1hdCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKKyAgICAgICAgICAgIGlmICh0bXB2YXIgIT0gMSkgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAvKiBsb3dfZGVsYXkgICovCisgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKworICAgICAgICAgICAgLyogdmJ2X3BhcmFtZXRlcnMgcHJlc2VudD8gKi8KKyAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgICAgICAgICAgaWYgKHRtcHZhcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdF9oYWxmX2JpdF9yYXRlICAgICovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDE1KTsKKyAgICAgICAgICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICAvKiBsYXR0ZXJfaGFsZl9iaXRfcmF0ZSAgICovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDE1KTsKKyAgICAgICAgICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSAgICovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDE1KTsKKyAgICAgICAgICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICAvKiBsYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUgICAqLworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAgMyk7CisgICAgICAgICAgICAgICAgLyogZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5ICAgICAqLworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAxMSk7CisgICAgICAgICAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgLyogbGF0dGVyX2hhbGZfdmJ2X29jY3VwYW5jeSAgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMTUpOworICAgICAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlICgyIGJpdHMpLCBvbmx5IDAwIChyZWN0KSBpcyBzdXBwb3J0ZWQgZm9yIG5vdyAqLworICAgICAgICB2b2xfc2hhcGUgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7CisgICAgICAgIGlmICh2b2xfc2hhcGUpIHJldHVybiBQVl9GQUlMOworCisgICAgICAgIC8qIG1hcmtlciBiaXQsICAwMy8xMC85OSAqLworICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAvKiB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAgICovCisgICAgICAgIGN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDE2KTsKKyAgICAgICAgaWYgKGN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uID09IDApIHJldHVybiBQVl9GQUlMOworCisgICAgICAgIC8qIC4gc2luY2UgbmJpdHNUaW1lSW5jUmVzIHdpbGwgYmUgdXNlZCBvdmVyIGFuZCBvdmVyIGFnYWluLCAqLworICAgICAgICAvKiAgICB3ZSBzaG91bGQgcHV0IGl0IGluIFZvbCBzdHJ1Y3R1cmUuICAwNC8xMi8yMDAwLiAgICAgICAgICAqLworICAgICAgICBjdXJyVm9sLT5uYml0c1RpbWVJbmNSZXMgPSBDYWxjTnVtQml0cygodWludCljdXJyVm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiAtIDEpOworCisgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOworCisgICAgICAgIC8qIGZpeGVkX3ZvcF9yYXRlICovCisgICAgICAgIGN1cnJWb2wtPmZpeGVkVm9wUmF0ZSA9IChpbnQpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgICAgICBpZiAoY3VyclZvbC0+Zml4ZWRWb3BSYXRlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQgKi8KKyAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCBjdXJyVm9sLT5uYml0c1RpbWVJbmNSZXMpOworICAgICAgICB9CisKKyAgICAgICAgLyogbWFya2VyIGJpdCAqLworICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggKDEzIGJpdHMpICovCisgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAxMyk7CisgICAgICAgIGlmICghdG1wdmFyKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgdmlkZW8tPmRpc3BsYXlXaWR0aCA9IHZpZGVvLT53aWR0aCA9IHRtcHZhcjsKKworICAgICAgICAvKiByb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mIE1CX1NJWkUuICAgMDgvMDkvMjAwMCAqLworICAgICAgICB2aWRlby0+d2lkdGggPSAodmlkZW8tPndpZHRoICsgMTUpICYgLTE2OworLy8gICAgICB2aWRlby0+ZGlzcGxheVdpZHRoICs9ICh2aWRlby0+ZGlzcGxheVdpZHRoICYgMHgxKTsgIC8qIGRpc3BsYXllZCBpbWFnZSBzaG91bGQgYmUgZXZlbiBzaXplICovCisKKyAgICAgICAgLyogbWFya2VyIGJpdCAqLworICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ICgxMyBiaXRzKSAqLworICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMTMpOworICAgICAgICBpZiAoIXRtcHZhcikgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCA9IHRtcHZhcjsKKworICAgICAgICAvKiByb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mIE1CX1NJWkUuICAgMDgvMDkvMjAwMCAqLworICAgICAgICB2aWRlby0+aGVpZ2h0ID0gKHZpZGVvLT5oZWlnaHQgKyAxNSkgJiAtMTY7CisvLyAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ICs9ICh2aWRlby0+ZGlzcGxheUhlaWdodCAmIDB4MSk7IC8qIGRpc3BsYXllZCBpbWFnZSBzaG91bGQgYmUgZXZlbiBzaXplICovCisgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOworCisgICAgICAgIC8qICAwMy8xMC85OSAqLworICAgICAgICAvKiBpbnRlcmxhY2VkICovCisgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgICAgICBpZiAodG1wdmFyICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1wNGRlY19sb2coIkRlY29kZVZPTEhlYWRlcigpOiBJbnRlcmxhY2VkIHZpZGVvIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisKKyAgICAgICAgLyogb2JtY19kaXNhYmxlICovCisgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgICAgICBpZiAodG1wdmFyID09IDApIHJldHVybiBQVl9GQUlMOworCisgICAgICAgIGlmICh2ZXJzaW9uX2lkID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qICBzcHJpdGVfZW5hYmxlICgxIGJpdHMpICovCisgICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgIGlmICh0bXB2YXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlVk9MSGVhZGVyKCk6IFNwcml0ZSBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGb3IgdmVyc2lvbiAyLCB2b2xfc3ByaXRlX3VzYWdlIGhhcyB0d28gYml0cy4gKi8KKyAgICAgICAgICAgIC8qIHNwcml0ZV9lbmFibGUgKi8KKyAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKKyAgICAgICAgICAgIGlmICh0bXB2YXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlVk9MSGVhZGVyKCk6IFNwcml0ZSBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBub3RfOF9iaXQgKi8KKyAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBxdWFudF9wcmVjaXNpb24gKi8KKyAgICAgICAgICAgIGN1cnJWb2wtPnF1YW50UHJlY2lzaW9uID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDQpOworICAgICAgICAgICAgLyogYml0c19wZXJfcGl4ZWwgICovCisgICAgICAgICAgICBjdXJyVm9sLT5iaXRzUGVyUGl4ZWwgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNCk7CisgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVWT0xIZWFkZXIoKTogbm90IGFuIDgtYml0IHN0cmVhbS5cbiIpOyAgICAvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgZG8gbm90IHN1cHBvcnQgIT0gOCBiaXRzCisKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3VyclZvbC0+cXVhbnRQcmVjaXNpb24gPSA1OworICAgICAgICAgICAgY3VyclZvbC0+Yml0c1BlclBpeGVsID0gODsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHF1YW50X3R5cGUgKDEgYml0KSAqLworICAgICAgICBjdXJyVm9sLT5xdWFudFR5cGUgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgaWYgKGN1cnJWb2wtPnF1YW50VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbG9hZCBxdWFudGl6YXRpb24gbWF0cmljZXMuICAgNS8yMi8yMDAwICovCisgICAgICAgICAgICAvKiBsb2FkX2ludHJhX3F1YW50X21hdCAoMSBiaXQpICovCisgICAgICAgICAgICBxbWF0ID0gY3VyclZvbC0+aXFtYXQ7CisgICAgICAgICAgICBjdXJyVm9sLT5sb2FkSW50cmFRdWFudE1hdCA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmxvYWRJbnRyYVF1YW50TWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGludHJhX3F1YW50X21hdCAoOCo2NCBiaXRzKSAqLworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBxbWF0WyooemlnemFnX2luditpKV0gPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgocW1hdFsqKHppZ3phZ19pbnYraSldICE9IDApICYmICgrK2kgPCA2NCkpOworCisgICAgICAgICAgICAgICAgLyogcW1hdHJpeCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIHZhbHVlLCB3aGljaCBtZWFucworICAgICAgICAgICAgICAgICAgIGkgd291bGQgYmUgbm9uLXplcm8gaW4gdmFsaWQgY2FzZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHFtYXRbKih6aWd6YWdfaW52K2opXSA9IHFtYXRbKih6aWd6YWdfaW52K2ktMSldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9zY2xfbWVtY3B5KHFtYXQsIG1wZWdfaXFtYXRfZGVmLCA2NCpzaXplb2YoaW50KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHFtYXRbMF0gPSAwOyAgICAgICAgICAgICAvKiBuZWNlc3NhcnkgZm9yIHN3aXRjaGVkICYmIE1QRUcgcXVhbnQgIDA3LzA5LzAxICovCisKKyAgICAgICAgICAgIC8qIGxvYWRfbm9uaW50cmFfcXVhbnRfbWF0ICgxIGJpdCkgKi8KKyAgICAgICAgICAgIHFtYXQgPSBjdXJyVm9sLT5uaXFtYXQ7CisgICAgICAgICAgICBjdXJyVm9sLT5sb2FkTm9uSW50cmFRdWFudE1hdCA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmxvYWROb25JbnRyYVF1YW50TWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG5vbmludHJhX3F1YW50X21hdCAoOCo2NCBiaXRzKSAqLworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBxbWF0WyooemlnemFnX2luditpKV0gPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgocW1hdFsqKHppZ3phZ19pbnYraSldICE9IDApICYmICgrK2kgPCA2NCkpOworCisgICAgICAgICAgICAgICAgLyogcW1hdHJpeCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIHZhbHVlLCB3aGljaCBtZWFucworICAgICAgICAgICAgICAgICAgIGkgd291bGQgYmUgbm9uLXplcm8gaW4gdmFsaWQgY2FzZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHFtYXRbKih6aWd6YWdfaW52K2opXSA9IHFtYXRbKih6aWd6YWdfaW52K2ktMSldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9zY2xfbWVtY3B5KHFtYXQsIG1wZWdfbnFtYXRfZGVmLCA2NCpzaXplb2YoaW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyc2lvbl9pZCAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBxdWFydGVyX3NhbXBsZSBlbmFibGVkICovCisgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgIGlmICh0bXB2YXIpIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgKi8KKyAgICAgICAgY3VyclZvbC0+Y29tcGxleGl0eV9lc3REaXNhYmxlID0gQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgICAgIGlmIChjdXJyVm9sLT5jb21wbGV4aXR5X2VzdERpc2FibGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY3VyclZvbC0+Y29tcGxleGl0eV9lc3RNZXRob2QgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7CisKKyAgICAgICAgICAgIGlmIChjdXJyVm9sLT5jb21wbGV4aXR5X2VzdE1ldGhvZCA8IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2hhcGVfY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgKi8KKyAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVWT0xIZWFkZXIoKTogU2hhcGUgQ29tcGxleGl0eSBlc3RpbWF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIHRleHR1cmVfY29tcGxleGl0eV9lc3RpbWF0aW9uX3NldF8xX2Rpc2FibGUgKi8KKyAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5jb21wbGV4aXR5LnRleHRfMSA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgICAgIC8qIHRleHR1cmVfY29tcGxleGl0eV9lc3RpbWF0aW9uX3NldF8yX2Rpc2FibGUgKi8KKyAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5jb21wbGV4aXR5LnRleHRfMiA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogbW90aW9uX2NvbXBlbnNhdGlvbl9jb21wbGV4aXR5X2Rpc2FibGUgKi8KKyAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5jb21wbGV4aXR5Lm1jID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VyclZvbC0+Y29tcGxleGl0eV9lc3RNZXRob2QgPT0gMSkKKyAgICAgICAgICAgICAgICB7ICAgLyogdmVyc2lvbjJfY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlVk9MSGVhZGVyKCk6IHNhZGN0LCBxdWFydGVyIHBlbCBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qICAwMy8xMC85OSAqLworICAgICAgICAvKiByZXN5bmNfbWFya2VyX2Rpc2FibGUgKi8KKyAgICAgICAgY3VyclZvbC0+ZXJyb3JSZXNEaXNhYmxlID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgICAgIC8qIGRhdGFfcGFydGl0aXRpb25lZCAgICAqLworICAgICAgICBjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisKKyAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZJbnRyYTsKKyAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSAmVmxjRGVjVENPRUZJbnRlcjsKKworICAgICAgICBpZiAoY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxheWVyKSByZXR1cm4gUFZfRkFJTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKi8KKyAgICAgICAgICAgIC8qIHJldmVyc2libGVfdmxjICovCisgICAgICAgICAgICBjdXJyVm9sLT51c2VSZXZlcnNlVkxDID0gKGludClCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChjdXJyVm9sLT51c2VSZXZlcnNlVkxDKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludHJhID0gJlJ2bGNEZWNUQ09FRkludHJhOworICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gJlJ2bGNEZWNUQ09FRkludGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyclZvbC0+ZXJyb3JSZXNEaXNhYmxlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJWb2wtPnVzZVJldmVyc2VWTEMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb25faWQgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbmV3cHJlZF9lbmFibGUgKi8KKyAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgICAgICAgICAgaWYgKHRtcHZhcikgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgIC8qIHJlZHVjZWRfcmVzb2x1dGlvbl92b3AgKi8KKyAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgICAgICAgICAgaWYgKHRtcHZhcikgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEludHJhIEFDL0RDIHByZWRpY3Rpb24gaXMgYWx3YXlzIHRydWUgKi8KKyAgICAgICAgdmlkZW8tPmludHJhX2FjZGNQcmVkRGlzYWJsZSA9IDA7CisgICAgICAgIC8qIHNjYWxhYmlsaXR5ICovCisgICAgICAgIGN1cnJWb2wtPnNjYWxhYmlsaXR5ID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisKKyAgICAgICAgaWYgKGN1cnJWb2wtPnNjYWxhYmlsaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGF5ZXIgPT0gMCkgIHJldHVybiBQVl9GQUlMOyAgICAgICAgICAgICAgICAgICAgIC8qICAqLworICAgICAgICAgICAgLyogaGllcmFyY2h5X3R5cGU6IDEgOiB0ZW1wb3JhbCwgMCA6IHNwYXRpYWwgKi8KKyAgICAgICAgICAgIC8qICAwMy8xMC85OSAqLworICAgICAgICAgICAgY3VyclZvbC0+c2NhbFR5cGUgPSAoaW50KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsgICAgICAgICAgICAgIC8qICAqLworICAgICAgICAgICAgaWYgKCFjdXJyVm9sLT5zY2FsVHlwZSkgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgIC8qIHJlZl9sYXllcl9pZCAoNCBiaXRzKSAqLworICAgICAgICAgICAgY3VyclZvbC0+cmVmVm9sSUQgPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNCk7CisgICAgICAgICAgICBpZiAobGF5ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPnJlZlZvbElEICE9IHZpZGVvLT52b2xbMF0tPnZvbElEKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHJlZl9sYXllcl9zYW1wbGluZ19kaXJlYyAoMSBiaXRzKSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgMSA6IHJlZi4gbGF5ZXIgaGFzIGhpZ2hlciByZXNvbHV0aW9uICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgMCA6IHJlZi4gbGF5ZXIgaGFzIGVxdWFsIG9yIGxvd2VyIHJlc29sdXRpb24gKi8KKyAgICAgICAgICAgIGN1cnJWb2wtPnJlZlNhbXBEaXIgPSAoaW50KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChjdXJyVm9sLT5yZWZTYW1wRGlyKSByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAgICAgLyogaG9yX3NhbXBsaW5nX2ZhY3Rvcl9uICg1IGJpdHMpICovCisgICAgICAgICAgICBjdXJyVm9sLT5ob3JTYW1wX24gPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNSk7CisKKyAgICAgICAgICAgIC8qIGhvcl9zYW1wbGluZ19mYWN0b3JfbSAoNSBiaXRzKSAqLworICAgICAgICAgICAgY3VyclZvbC0+aG9yU2FtcF9tID0gKGludCkgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDUpOworCisgICAgICAgICAgICBpZiAoY3VyclZvbC0+aG9yU2FtcF9tID09IDApIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmhvclNhbXBfbiAhPSBjdXJyVm9sLT5ob3JTYW1wX20pIHJldHVybiBQVl9GQUlMOworCisgICAgICAgICAgICAvKiB2ZXJfc2FtcGxpbmdfZmFjdG9yX24gKDUgYml0cykgKi8KKyAgICAgICAgICAgIGN1cnJWb2wtPnZlclNhbXBfbiA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA1KTsKKworICAgICAgICAgICAgLyogdmVyX3NhbXBsaW5nX2ZhY3Rvcl9tICg1IGJpdHMpICovCisgICAgICAgICAgICBjdXJyVm9sLT52ZXJTYW1wX20gPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNSk7CisKKyAgICAgICAgICAgIGlmIChjdXJyVm9sLT52ZXJTYW1wX20gPT0gMCkgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICBpZiAoY3VyclZvbC0+dmVyU2FtcF9uICE9IGN1cnJWb2wtPnZlclNhbXBfbSkgcmV0dXJuIFBWX0ZBSUw7CisKKworICAgICAgICAgICAgLyogZW5oYW5jZW1lbnRfdHlwZTogMSA6IHBhcnRpYWwgcmVnaW9uLCAwIDogZnVsbCByZWdpb24gKi8KKyAgICAgICAgICAgIC8qIDA0LzEwLzIwMDA6IHdlIG9ubHkgc3VwcG9ydCBmdWxsIHJlZ2lvbiBlbmhhbmNlbWVudCBsYXllci4gKi8KKyAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICBQVl9CaXRzdHJlYW1CeXRlQWxpZ24oc3RyZWFtKTsKKworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMySEMoc3RyZWFtLCAmdG1wdmFyKTsKKworICAgICAgICAvKiBpZiB3ZSBoaXQgdGhlIGVuZCBvZiBidWZmZXIsIHRtcHZhciA9PSAwLiAgIDA4LzMwLzIwMDAgKi8KKyAgICAgICAgaWYgKHRtcHZhciA9PSBVU0VSX0RBVEFfU1RBUlRfQ09ERSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGEoc3RyZWFtKTsKKyAgICAgICAgICAgIC8qIHlvdSBzaG91bGQgbm90IGNoZWNrIGZvciBzdGF0dXMgaGVyZSAgMDMvMTkvMjAwMiAqLworICAgICAgICAgICAgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXB1dGUgc29tZSBjb252ZW5pZW5jZSB2YXJpYWJsZXM6ICAgMDQvMTMvMjAwMCAqLworICAgICAgICB2aWRlby0+bk1CUGVyUm93ID0gdmlkZW8tPndpZHRoIC8gTUJfU0laRTsKKyAgICAgICAgdmlkZW8tPm5NQlBlckNvbCA9IHZpZGVvLT5oZWlnaHQgLyBNQl9TSVpFOworICAgICAgICB2aWRlby0+blRvdGFsTUIgPSB2aWRlby0+bk1CUGVyUm93ICogdmlkZW8tPm5NQlBlckNvbDsKKyAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IENhbGNOdW1CaXRzKCh1aW50KXZpZGVvLT5uVG90YWxNQiAtIDEpOworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICB2aWRlby0+bW9kaWZpZWRfcXVhbnQgPSAwOworICAgICAgICB2aWRlby0+YWR2YW5jZWRfSU5UUkEgPSAwOworICAgICAgICB2aWRlby0+ZGVibG9ja2luZyA9IDA7CisgICAgICAgIHZpZGVvLT5zbGljZV9zdHJ1Y3R1cmUgPSAwOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNIT1JUX0hFQURFUiAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgU0hPUlRfVklERU9fU1RBUlRfTUFSS0VSX0xFTkdUSCwgJnRtcHZhcik7CisKKyAgICAgICAgaWYgKHRtcHZhciA9PSBTSE9SVF9WSURFT19TVEFSVF9NQVJLRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2VhcmNoIGZvciBWT0xfSEVBREVSICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZTZWFyY2hOZXh0TTRWRnJhbWUoc3RyZWFtKTsgLyogc2VhcmNoIDB4MDAgMHgwMCAweDAxICovCisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsgLyogYnJlYWtzIHRoZSBsb29wICovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCwgJnRtcHZhcik7CisgICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAodG1wdmFyICE9IFZPTF9TVEFSVF9DT0RFKTsKKyAgICAgICAgICAgIGdvdG8gZGVjb2RlX3ZvbDsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBQVl9UT0xFUkFURV9WT0xfRVJST1JTCisgICAgaWYgKHByb2ZpbGUgPiAweEZGIHx8IHByb2ZpbGUgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBQVl9CQURfVk9MSEVBREVSOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKKyoKKyogLS0gRGVjb2RlR09WIC0tIERlY29kZXMgdGhlIEdyb3VwIG9mIFZPUHMgZnJvbSBiaXRzdHJlYW0KKyoKKyogICAwNC8yMC8yMDAwICBpbml0aWFsIG1vZGlmaWNhdGlvbiB0byB0aGUgbmV3IFBWLURlY29kZXIgTGliIGZvcm1hdC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLworUFZfU1RBVFVTIERlY29kZUdPVkhlYWRlcihCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtLCB1aW50MzIgKnRpbWVfYmFzZSkKK3sKKyAgICB1aW50MzIgdG1wdmFyLCB0aW1lX3M7CisgICAgaW50IGNsb3NlZF9nb3YsIGJyb2tlbl9saW5rOworCisgICAgLyogZ3JvdXBfc3RhcnRfY29kZSAoMzIgYml0cykgKi8KKy8vICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZEJpdHMzMihzdHJlYW0sIDMyKTsKKworICAgIC8qIGhvdXJzICovCisgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDUpOworICAgIHRpbWVfcyA9IHRtcHZhciAqIDM2MDA7CisKKyAgICAvKiBtaW51dGVzICovCisgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDYpOworICAgIHRpbWVfcyArPSB0bXB2YXIgKiA2MDsKKworICAgIC8qIG1hcmtlciBiaXQgKi8KKyAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKworICAgIC8qIHNlY29uZHMgKi8KKyAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNik7CisgICAgdGltZV9zICs9IHRtcHZhcjsKKworICAgIC8qIFdlIGhhdmUgdG8gY2hlY2sgdGhlIHRpbWVzdGFtcCBoZXJlLiAgSWYgdGhlIHN5bmMgdGltZXN0YW1wIGlzICovCisgICAgLyogICAgZWFybGllciB0aGFuIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAgb3IgbG9uZ2VyIHRoYW4gNjAgc2VjLiAgKi8KKyAgICAvKiAgICBhZnRlciB0aGUgcHJldmlvdXMgdGltZXN0YW1wLCBhc3N1bWUgdGhlIEdPViBoZWFkZXIgaXMgICAgICAqLworICAgIC8qICAgIGNvcnJ1cHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNS8xMi8yMDAwICAgICAqLworICAgICp0aW1lX2Jhc2UgPSB0aW1lX3M7ICAgLyogIDAyLzI3LzIwMDIgKi8KKy8vICAqdGltZV9iYXNlID0gKnRpbWVfYmFzZS8xMDAwOworLy8gIHRtcHZhciA9IHRpbWVfcyAtICp0aW1lX2Jhc2U7CisvLyAgaWYgKHRtcHZhciA8PSA2MCkgKnRpbWVfYmFzZSA9IHRpbWVfczsKKy8vICBlbHNlIHJldHVybiBQVl9GQUlMOworCisgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgY2xvc2VkX2dvdiA9IHRtcHZhcjsKKyAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICBicm9rZW5fbGluayA9IHRtcHZhcjsKKworICAgIGlmICgoY2xvc2VkX2dvdiA9PSAwKSAmJiAoYnJva2VuX2xpbmsgPT0gMSkpCisgICAgeworICAgICAgICByZXR1cm4gUFZfU1VDQ0VTUzsgICAgICAgIC8qICAwMy8xNS8yMDAyICB5b3UgY2FuIGFsc28gcmV0dXJuIFBWX0ZBSUwgKi8KKyAgICB9CisKKyAgICBQVl9CaXRzdHJlYW1CeXRlQWxpZ24oc3RyZWFtKTsKKworICAgIEJpdHN0cmVhbVNob3dCaXRzMzJIQyhzdHJlYW0sICZ0bXB2YXIpOworCisgICAgd2hpbGUgKHRtcHZhciA9PSBVU0VSX0RBVEFfU1RBUlRfQ09ERSkgICAgICAgLyogIDAzLzE1LzIwMDIgKi8KKyAgICB7CisgICAgICAgIERlY29kZVVzZXJEYXRhKHN0cmVhbSk7CisgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMzJIQyhzdHJlYW0sICZ0bXB2YXIpOworICAgIH0KKworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKKyoKKyogLS0gRGVjb2RlVm9wSGVhZGVyIC0tIERlY29kZXMgdGhlIFZPUGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiaXRzdHJlYW0KKyoKKyogICAwNC8xMi8yMDAwICBJbml0aWFsIHBvcnQgdG8gdGhlIG5ldyBQViBkZWNvZGVyIGxpYnJhcnkgZm9ybWF0LgorKiAgIDA1LzEwLzIwMDAgIEVycm9yIHJlc2lsaWVudCBkZWNvZGluZyBvZiB2b3AgaGVhZGVyLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50RW5kKioqKioqKiovCitQVl9TVEFUVVMgRGVjb2RlVk9QSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIFZvcCAqY3VyclZvcCwgQm9vbCB1c2VfZXh0X3RpbWVzdGFtcCkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSBjdXJyVm9sLT5iaXRzdHJlYW07CisgICAgdWludDMyIHRtcHZhcjsKKyAgICBpbnQgdGltZV9iYXNlOworCisgICAgLyoqKioqCisgICAgKiAgIFJlYWQgdGhlIFZPUCBoZWFkZXIgZnJvbSB0aGUgYml0c3RyZWFtIChObyBzaG9ydFZpZGVvSGVhZGVyIE1vZGUgaGVyZSEpCisgICAgKioqKiovCisgICAgQml0c3RyZWFtU2hvd0JpdHMzMkhDKHN0cmVhbSwgJnRtcHZhcik7CisKKyAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIGEgR09WIGhlYWRlciBoZXJlLiAgIDA4LzMwLzIwMDAgKi8KKyAgICBpZiAodG1wdmFyID09IEdST1VQX1NUQVJUX0NPREUpCisgICAgeworICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czMySEMoc3RyZWFtKTsKKy8vICAgICAgcmV3aW5kQml0c3RyZWFtKHN0cmVhbSwgU1RBUlRfQ09ERV9MRU5HVEgpOyAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworICAgICAgICBzdGF0dXMgPSBEZWNvZGVHT1ZIZWFkZXIoc3RyZWFtLCAmdG1wdmFyKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisvLyAgICAgIHVzZV9leHRfdGltZXN0YW1wID0gVFJVRTsgICAvKiAgMDIvMDgvMjAwMiAqLworICAgICAgICAvKiBXZSBzaG91bGQgaGF2ZSBhIFZPUCBoZWFkZXIgZm9sbG93aW5nIHRoZSBHT1YgaGVhZGVyLiAgMDMvMTUvMjAwMSAqLworICAgICAgICBCaXRzdHJlYW1TaG93Qml0czMySEMoc3RyZWFtLCAmdG1wdmFyKTsKKyAgICB9CisjaWZkZWYgUFZfU1VQUE9SVF9URU1QT1JBTF9TQ0FMQUJJTElUWQorICAgIGN1cnJWb3AtPnRpbWVTdGFtcCA9IC0xOworI2VuZGlmCisgICAgaWYgKHRtcHZhciA9PSBWT1BfU1RBUlRfQ09ERSkKKyAgICB7CisgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMzJIQyhzdHJlYW0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCA4KTsgLy8gYWR2YW5jZSBieSBhIGJ5dGUKKyAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgfQorCisKKworICAgIC8qIHZvcF9wcmVkaWN0aW9uX3R5cGUgKDIgYml0cykgKi8KKyAgICBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKKworICAgIC8qIG1vZHVsb190aW1lX2Jhc2UgKD8gYml0cykgKi8KKyAgICB0aW1lX2Jhc2UgPSAtMTsKKyAgICBkbworICAgIHsKKyAgICAgICAgdGltZV9iYXNlKys7CisgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgIH0KKyAgICB3aGlsZSAodG1wdmFyID09IDEpOworCisKKworICAgIGlmICghdXNlX2V4dF90aW1lc3RhbXApCisgICAgeworICAgICAgICBjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSArPSAxMDAwICogdGltZV9iYXNlOyAvKiBtaWxsaXNlY29uZHMgYmFzZWQgTVRCICAxMS8xMi8wMSAqLworICAgIH0KKworICAgIC8qIG1hcmtlcl9iaXQgKDEgYml0KSAqLworICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCisgICAgeworICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICB9CisKKyAgICAvKiB2b3BfdGltZV9pbmNyZW1lbnQgKDEtMTUgYml0cykgaW4gTm92X0NvbXBsaWFudCAoMS0xNiBiaXRzKSAqLworICAgIC8qICAgIHdlIGFsd2F5cyBhc3N1bWVzIGZpeGVkIHZvcCByYXRlIGhlcmUgKi8KKyAgICBjdXJyVm9wLT50aW1lSW5jID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIGN1cnJWb2wtPm5iaXRzVGltZUluY1Jlcyk7CisKKworICAgIC8qIG1hcmtlcl9iaXQgKDEgYml0KSAqLworICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCisgICAgeworICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICB9CisKKyAgICAvKiB2b3BfY29kZWQgKi8KKyAgICBjdXJyVm9wLT52b3BDb2RlZCA9IChpbnQpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworCisKKyAgICBpZiAoY3VyclZvcC0+dm9wQ29kZWQgPT0gMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgIH0KKworCisgICAgLyogcmVhZCB2b3Bfcm91bmRpbmdfdHlwZSAqLworICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKKyAgICB7CisgICAgICAgIGN1cnJWb3AtPnJvdW5kaW5nVHlwZSA9IChpbnQpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjdXJyVm9wLT5yb3VuZGluZ1R5cGUgPSAwOworICAgIH0KKworICAgIGlmIChjdXJyVm9sLT5jb21wbGV4aXR5X2VzdERpc2FibGUgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChjdXJyVm9sLT5jb21wbGV4aXR5X2VzdE1ldGhvZCA8IDIpICAgLyogICBPQ1QgMjAwMiAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8xID4+IDMpICYgMHgxKSAgICAvKiBpbnRyYSAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICBpZiAoY3VyclZvbC0+Y29tcGxleGl0eS50ZXh0XzEgJiAweDEpICAgICAgICAgICAvKiBub3RfY29kZWQgICAgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8yID4+IDMpICYgMHgxKSAgICAvKiBkY3RfY29lZnMgICAgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8yID4+IDIpICYgMHgxKSAgICAvKiBkY3RfbGluZXMgICAgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8yID4+IDEpICYgMHgxKSAgICAvKiB2bGNfc3ltYm9scyAgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICBpZiAoY3VyclZvbC0+Y29tcGxleGl0eS50ZXh0XzIgJiAweDEpICAgICAgICAgICAvKiB2bGNfYml0cyAgICAgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNCk7CisKKyAgICAgICAgICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSAhPSBJX1ZPUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8xID4+IDIpICYgMHgxKSAgICAvKiBpbnRlciAgICAqLworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICAgICAgaWYgKChjdXJyVm9sLT5jb21wbGV4aXR5LnRleHRfMSA+PiAxKSAmIDB4MSkgICAgLyogaW50ZXJfNHYgKi8KKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOworICAgICAgICAgICAgICAgIGlmICgoY3VyclZvbC0+Y29tcGxleGl0eS5tYyA+PiA1KSAmIDB4MSkgICAgICAgIC8qIGFwbSAgICAgICovCisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKKyAgICAgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkubWMgPj4gNCkgJiAweDEpICAgICAgICAvKiBucG0gICAgICAqLworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICAgICAgLyogaW50ZXJwb2xhdGVfbWNfcSAqLworICAgICAgICAgICAgICAgIGlmICgoY3VyclZvbC0+Y29tcGxleGl0eS5tYyA+PiAyKSAmIDB4MSkgICAgICAgIC8qIGZvcndfYmFja19tY19xICovCisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKKyAgICAgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkubWMgPj4gMSkgJiAweDEpICAgICAgICAvKiBoYWxmcGVsMiAqLworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmNvbXBsZXhpdHkubWMgJiAweDEpICAgICAgICAgICAgICAgLyogaGFsZnBlbDQgKi8KKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IEJfVk9QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoY3VyclZvbC0+Y29tcGxleGl0eS5tYyA+PiAzKSAmIDB4MSkgICAgICAgIC8qIGludGVycG9sYXRlX21jX3EgKi8KKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVhZCBpbnRyYV9kY192bGNfdGhyICovCisgICAgY3VyclZvcC0+aW50cmFEQ1ZsY1RociA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAzKTsKKworICAgIC8qIHJlYWQgdm9wX3F1YW50IChjdXJyVm9sLT5xdWFudFByZWNpc2lvbiBiaXRzKSAqLworICAgIGN1cnJWb3AtPnF1YW50aXplciA9IChpbnQxNikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIGN1cnJWb2wtPnF1YW50UHJlY2lzaW9uKTsKKyAgICBpZiAoY3VyclZvcC0+cXVhbnRpemVyID09IDApCisgICAgeworICAgICAgICBjdXJyVm9wLT5xdWFudGl6ZXIgPSB2aWRlby0+cHJldlZvcC0+cXVhbnRpemVyOworICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICB9CisKKworICAgIC8qIHJlYWQgdm9wX2Zjb2RlX2ZvcndhcmQgKi8KKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgIT0gSV9WT1ApCisgICAgeworICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMyk7CisgICAgICAgIGlmICh0bXB2YXIgPCAxKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyVm9wLT5mY29kZUZvcndhcmQgPSAxOworICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICB9CisgICAgICAgIGN1cnJWb3AtPmZjb2RlRm9yd2FyZCA9IHRtcHZhcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3VyclZvcC0+ZmNvZGVGb3J3YXJkID0gMDsKKyAgICB9CisKKyAgICAvKiByZWFkIHZvcF9mY29kZV9iYWNrd2FyZCAqLworICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBCX1ZPUCkKKyAgICB7CisgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAzKTsKKyAgICAgICAgaWYgKHRtcHZhciA8IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJWb3AtPmZjb2RlQmFja3dhcmQgPSAxOworICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICB9CisgICAgICAgIGN1cnJWb3AtPmZjb2RlQmFja3dhcmQgPSB0bXB2YXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGN1cnJWb3AtPmZjb2RlQmFja3dhcmQgPSAwOworICAgIH0KKworICAgIGlmIChjdXJyVm9sLT5zY2FsYWJpbGl0eSkKKyAgICB7CisgICAgICAgIGN1cnJWb3AtPnJlZlNlbGVjdENvZGUgPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7CisgICAgfQorCityZXR1cm5fcG9pbnQ6CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKKyoKKyogLS0gVmlkZW9QbGFuZVdpdGhTaG9ydEhlYWRlciAtLSBEZWNvZGVzIHRoZSBzaG9ydF92aWRlb19oZWFkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgYml0c3RyZWFtCisqIE1vZGlmaWVkIDoKKyAgICAgICAgICAgICAwNC8yMy8yMDAxLiAgUmVtb3ZlIHRoZSBjb2RlcyByZWxhdGVkIHRvIHRoZQorICAgICAgICAgICAgICAgICAiZmlyc3QgcGFzcyIgZGVjb2RpbmcuICBXZSB1c2UgYSBkaWZmZXJlbnQgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgdG8gc2V0IHVwIHRoZSBkZWNvZGVyIG5vdy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLworUFZfU1RBVFVTIERlY29kZVNob3J0SGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIFZvcCAqY3VyclZvcCkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sWzBdOworICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSBjdXJyVm9sLT5iaXRzdHJlYW07CisgICAgdWludDMyIHRtcHZhcjsKKyAgICBpbnQzMiBzaXplOworCisgICAgaW50IGV4dGVuZGVkX1BUWVBFID0gRkFMU0U7CisgICAgaW50IFVGRVAgPSAwLCBjdXN0b21fUEZNVCA9IDAsIGN1c3RvbV9QQ0YgPSAwOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIFNIT1JUX1ZJREVPX1NUQVJUX01BUktFUl9MRU5HVEgsICZ0bXB2YXIpOworCisgICAgaWYgKHRtcHZhciAhPSAgU0hPUlRfVklERU9fU1RBUlRfTUFSS0VSKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgfQorCisKKyAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBTSE9SVF9WSURFT19TVEFSVF9NQVJLRVJfTEVOR1RIKTsKKworICAgIC8qIFRlbXBvcmFsIHJlZmVyZW5jZS4gVXNpbmcgdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPSAzMDAwMCAqLworICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKKyAgICBjdXJyVm9wLT50ZW1wb3JhbFJlZiA9IChpbnQpIHRtcHZhcjsKKworCisgICAgY3VyclZvcC0+dGltZUluYyA9IDB4ZmYgJiAoMjU2ICsgY3VyclZvcC0+dGVtcG9yYWxSZWYgLSB2aWRlby0+cHJldlZvcC0+dGVtcG9yYWxSZWYpOworICAgIGN1cnJWb2wtPm1vZHVsb1RpbWVCYXNlICs9IGN1cnJWb3AtPnRpbWVJbmM7IC8qIG1zZWNvbmRzICAgMTEvMTIvMDEgKi8KKyAgICAvKiBNYXJrZXIgQml0ICovCisgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKKyAgICB7CisgICAgICAgIG1wNGRlY19sb2coIkRlY29kZVNob3J0SGVhZGVyKCk6IE1hcmtlciBiaXQgd3JvbmcuXG4iKTsKKyAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgfQorCisgICAgLyogWmVybyBCaXQgKi8KKyAgICBpZiAoQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCisgICAgeworICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVTaG9ydEhlYWRlcigpOiBaZXJvIGJpdCB3cm9uZy5cbiIpOworICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICB9CisKKyAgICAvKnNwbGl0X3NjcmVlbl9pbmRpY2F0b3IqLworICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKKyAgICB7CisgICAgICAgIG1wNGRlY19sb2coIkRlY29kZVNob3J0SGVhZGVyKCk6IFNwbGl0IFNjcmVlbiBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgIH0KKworICAgIC8qZG9jdW1lbnRfZnJlZXplX2NhbWVyYSovCisgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgIHsKKyAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlU2hvcnRIZWFkZXIoKTogRnJlZXplIENhbWVyYSBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgIH0KKworICAgIC8qZnJlZXplX3BpY3R1cmVfcmVsZWFzZSovCisgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgIHsKKyAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlU2hvcnRIZWFkZXIoKTogRnJlZXplIFJlbGVhc2Ugbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICB9CisgICAgLyogc291cmNlIGZvcm1hdCAqLworICAgIHN3aXRjaCAoQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDMpKQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKHZpZGVvLT5zaXplIDwgMTI4Kjk2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gIDEyODsKKyAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCAgPSA5NjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmICh2aWRlby0+c2l6ZSA8IDE3NioxNDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggID0gMTc2OworICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ICA9IDE0NDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmICh2aWRlby0+c2l6ZSA8IDM1MioyODgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggPSAzNTI7CisgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHZpZGVvLT5oZWlnaHQgPSAyODg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiAodmlkZW8tPnNpemUgPCA3MDQqNTc2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gNzA0OworICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ID0gNTc2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgaWYgKHZpZGVvLT5zaXplIDwgMTQwOCoxMTUyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gMTQwODsKKyAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCA9IDExNTI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBleHRlbmRlZF9QVFlQRSA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogTXNnKCJILjI2MyBzb3VyY2UgZm9ybWF0IG5vdCBsZWdhbFxuIik7ICovCisgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgfQorCisKKyAgICBjdXJyVm9wLT5yb3VuZGluZ1R5cGUgPSAwOworCisgICAgaWYgKGV4dGVuZGVkX1BUWVBFID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSAoaW50KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKworICAgICAgICAvKiBmb3VyX3Jlc2VydmVkX3plcm9fYml0cyAqLworICAgICAgICBpZiAoQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDQpKQorICAgICAgICB7CisgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVTaG9ydEhlYWRlcigpOiBSZXNlcnZlZCBiaXRzIHdyb25nLlxuIik7CisgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVUZFUCA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAzKTsKKyAgICAgICAgaWYgKFVGRVAgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc291cmNlIGZvcm1hdCAqLworICAgICAgICAgICAgc3dpdGNoIChCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnNpemUgPCAxMjgqOTYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gIDEyODsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ICA9IDk2OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5zaXplIDwgMTc2KjE0NCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggID0gMTc2OworICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHZpZGVvLT5oZWlnaHQgID0gMTQ0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5zaXplIDwgMzUyKjI4OCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggPSAzNTI7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCA9IDI4ODsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+c2l6ZSA8IDcwNCo1NzYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gNzA0OworICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHZpZGVvLT5oZWlnaHQgPSA1NzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnNpemUgPCAxNDA4KjExNTIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gMTQwODsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ID0gMTE1MjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgIGN1c3RvbV9QRk1UID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvKiBNc2coIkguMjYzIHNvdXJjZSBmb3JtYXQgbm90IGxlZ2FsXG4iKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1c3RvbV9QQ0YgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgIC8qIHVucmVzdHJpY3RlZCBNViAqLworICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTQUMgKi8KKyAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBUCAqLworICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpZGVvLT5hZHZhbmNlZF9JTlRSQSA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworCisgICAgICAgICAgICB2aWRlby0+ZGVibG9ja2luZyA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworCisgICAgICAgICAgICB2aWRlby0+c2xpY2Vfc3RydWN0dXJlID0gQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisKKyAgICAgICAgICAgIC8qIFJQUywgSVNELCBBSVYgKi8KKyAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZGVvLT5tb2RpZmllZF9xdWFudCA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworCisgICAgICAgICAgICAvKiBNYXJrZXIgQml0IGFuZCByZXNlcnZlZCovCisgICAgICAgICAgICBpZiAoQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDQpICE9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmbmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICAgICAgaWYgKHZpZGVvLT5hZHZhbmNlZF9JTlRSQSB8IHZpZGVvLT5kZWJsb2NraW5nIHwgdmlkZW8tPm1vZGlmaWVkX3F1YW50IHwgdmlkZW8tPm1vZGlmaWVkX3F1YW50KQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmIChVRkVQID09IDAgfHwgVUZFUCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMyk7CisgICAgICAgICAgICBpZiAodG1wdmFyID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSB0bXB2YXI7CisgICAgICAgICAgICAvKiBSUFIgKi8KKyAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBSUlUgKi8KKyAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyclZvcC0+cm91bmRpbmdUeXBlID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisgICAgICAgICAgICBpZiAoQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDMpICE9IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgfQorICAgICAgICAvKiBDUE0gKi8KKyAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgIH0KKyAgICAgICAgLyogQ1BGTVQgKi8KKyAgICAgICAgaWYgKGN1c3RvbV9QRk1UID09IDEgJiYgVUZFUCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhc3BlY3QgcmF0aW8gKi8KKyAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKKyAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRXh0ZW5kZWQgUEFSICovCisgICAgICAgICAgICBpZiAodG1wdmFyID09IDB4RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSZWFkIHBhcl93aWR0aCBhbmQgcGFyX2hlaWdodCBidXQgZG8gbm90aGluZyAqLworICAgICAgICAgICAgICAgIC8qIHBhcl93aWR0aCAqLworICAgICAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKKworICAgICAgICAgICAgICAgIC8qIHBhcl9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOSk7CisKKyAgICAgICAgICAgIGludCB0bXBEaXNwbGF5V2lkdGggPSAodG1wdmFyICsgMSkgPDwgMjsKKyAgICAgICAgICAgIC8qIG1hcmtlciBiaXQgKi8KKyAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA5KTsKKyAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHRtcERpc3BsYXlIZWlnaHQgPSB0bXB2YXIgPDwgMjsKKyAgICAgICAgICAgIGludCB0bXBIZWlnaHQgPSAodG1wRGlzcGxheUhlaWdodCArIDE1KSAmIC0xNjsKKyAgICAgICAgICAgIGludCB0bXBXaWR0aCA9ICh0bXBEaXNwbGF5V2lkdGggKyAxNSkgJiAtMTY7CisKKyAgICAgICAgICAgIGlmICh0bXBXaWR0aCA+IHZpZGVvLT53aWR0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3aGlsZSBhbGxvd2VkIGJ5IHRoZSBzcGVjLCB0aGlzIGRlY29kZXIgZG9lcyBub3QgYWN0dWFsbHkKKyAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGFuIGluY3JlYXNlIGluIHNpemUuCisgICAgICAgICAgICAgICAgQUxPR0UoIndpZHRoIGluY3JlYXNlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRtcEhlaWdodCAqIHRtcFdpZHRoID4gdmlkZW8tPnNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IHBvc3NpYmx5ICJiLzM3MDc5Mjk2Ii4KKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNzA3OTI5NiIpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdG1wRGlzcGxheVdpZHRoOworICAgICAgICAgICAgdmlkZW8tPndpZHRoID0gdG1wV2lkdGg7CisgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHRtcERpc3BsYXlIZWlnaHQ7CisgICAgICAgICAgICB2aWRlby0+aGVpZ2h0ID0gdG1wSGVpZ2h0OworCisgICAgICAgICAgICB2aWRlby0+blRvdGFsTUIgPSB2aWRlby0+d2lkdGggLyBNQl9TSVpFICogdmlkZW8tPmhlaWdodCAvIE1CX1NJWkU7CisKKyAgICAgICAgICAgIGlmICh2aWRlby0+blRvdGFsTUIgPD0gNDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+blRvdGFsTUIgPD0gOTkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+blRvdGFsTUIgPD0gMzk2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5uQml0c0Zvck1CSUQgPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm5Ub3RhbE1CIDw9IDE1ODQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm5Ub3RhbE1CIDw9IDYzMzYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IDEzIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5uVG90YWxNQiA8PSA5MjE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5uQml0c0Zvck1CSUQgPSAxNCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoVUZFUCA9PSAxICYmIGN1c3RvbV9QQ0YgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7CisKKyAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA3KTsKKyAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1c3RvbV9QQ0YgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgY3VyclZvcC0+RVRSID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFVGRVAgPT0gMSAmJiB2aWRlby0+c2xpY2Vfc3RydWN0dXJlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNTUyAqLworICAgICAgICAgICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOworICAgICAgICAgICAgaWYgKHRtcHZhciAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWNhbGN1bGF0ZSBudW1iZXIgb2YgbWFjcm9ibG9ja3MgcGVyIHJvdyAmIGNvbCBzaW5jZSAqLworICAgIC8qICB0aGUgZnJhbWUgc2l6ZSBjYW4gY2hhbmdlLiAgICAgICAgICAgMDQvMjMvMjAwMS4gICAqLworICAgIHZpZGVvLT5uTUJpbkdPQiA9IHZpZGVvLT5uTUJQZXJSb3cgPSB2aWRlby0+d2lkdGggLyBNQl9TSVpFOworICAgIHZpZGVvLT5uR09CaW5Wb3AgPSB2aWRlby0+bk1CUGVyQ29sID0gdmlkZW8tPmhlaWdodCAvIE1CX1NJWkU7CisgICAgdmlkZW8tPm5Ub3RhbE1CID0gdmlkZW8tPm5NQlBlclJvdyAqIHZpZGVvLT5uTUJQZXJDb2w7CisgICAgaWYgKGN1c3RvbV9QRk1UID09IDAgIHx8IFVGRVAgPT0gMCkKKyAgICB7CisgICAgICAgIHZpZGVvLT5uQml0c0Zvck1CSUQgPSBDYWxjTnVtQml0cygodWludCl2aWRlby0+blRvdGFsTUIgLSAxKTsgLyogb3RoZXJ3aXNlIGNhbGN1bGF0ZSBhYm92ZSAqLworICAgIH0KKyAgICBzaXplID0gKGludDMyKXZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7CisgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IFBfVk9QICYmIHNpemUgPiB2aWRlby0+dmlkZW9EZWNDb250cm9scy0+c2l6ZSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OworICAgIH0KKyAgICB2aWRlby0+dmlkZW9EZWNDb250cm9scy0+c2l6ZSA9IHNpemU7CisgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOworICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworCisKKyAgICBjdXJyVm9wLT5xdWFudGl6ZXIgPSAoaW50MTYpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA1KTsKKworICAgIGlmIChjdXJyVm9wLT5xdWFudGl6ZXIgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwNC8wMy8wMSAqLworICAgIHsKKyAgICAgICAgY3VyclZvcC0+cXVhbnRpemVyID0gdmlkZW8tPnByZXZWb3AtPnF1YW50aXplcjsKKyAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgfQorCisKKyAgICAvKiBaZXJvIGJpdCAqLworICAgIGlmIChleHRlbmRlZF9QVFlQRSA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlU2hvcnRIZWFkZXIoKTogWmVybyBiaXQgd3JvbmcuXG4iKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBwZWkgKi8KKyAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKworICAgIHdoaWxlICh0bXB2YXIpCisgICAgeworICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7IC8qICJQU1BBUkUiICovCisgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOyAvKiAiUEVJIiAqLworICAgIH0KKworICAgIGlmICh2aWRlby0+c2xpY2Vfc3RydWN0dXJlKSAgLyogQU5ORVhfSyAqLworICAgIHsKKyAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgIC8qIFNFUEIxICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgfQorCisgICAgICAgIC8vICBpZiAoY3VyclZvbC0+bkJpdHNGb3JNQklEIC8vCisgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgdmlkZW8tPm5CaXRzRm9yTUJJRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7ICAgICAgICAgICAgIC8qIG5vIEFTTywgUlMgc3VwcG9ydCBmb3IgQW5uZXggSyAqLworICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSAgLypTRVBCMyAqLworICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CisgICAgICAgIH0KKworICAgIH0KKyAgICAvKiBTZXR0aW5nIG9mIG90aGVyIFZPUC1oZWFkZXIgcGFyYW1ldGVycyAqLworICAgIGN1cnJWb3AtPmdvYk51bWJlciA9IDA7CisgICAgY3VyclZvcC0+dm9wQ29kZWQgPSAxOworCisgICAgY3VyclZvcC0+aW50cmFEQ1ZsY1RociA9IDA7CisgICAgY3VyclZvcC0+Z29iRnJhbWVJRCA9IDA7IC8qIGluaXRpYWwgdmFsdWUsICAwNS8yMi8wMCAqLworICAgIGN1cnJWb2wtPmVycm9yUmVzRGlzYWJsZSA9IDA7CisgICAgLypQdXRWb3BJbnRlcmxhY2VkKDAsY3Vycl92b3ApOyBubyBpbXBsZW1lbnRlZCB5ZXQgKi8KKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgIT0gSV9WT1ApCisgICAgICAgIGN1cnJWb3AtPmZjb2RlRm9yd2FyZCA9IDE7CisgICAgZWxzZQorICAgICAgICBjdXJyVm9wLT5mY29kZUZvcndhcmQgPSAwOworCityZXR1cm5fcG9pbnQ6CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCisqCisqIC0tIFBWX0RlY29kZVZvcCAtLSBEZWNvZGVzIHRoZSBWT1AgaW5mb3JtYXRpb24gZnJvbSB0aGUgYml0c3RyZWFtCisqCisqICAgMDQvMTIvMjAwMAorKiAgICAgICAgICAgICAgICAgICBJbml0aWFsIHBvcnQgdG8gdGhlIG5ldyBQViBkZWNvZGVyIGxpYnJhcnkgZm9ybWF0LgorKiAgICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgaW4gTW9NdVN5cyBNUEVHLTQKKyogICAgICAgICAgICAgICAgICAgdmlzdWFsIGRlY29kZXIuICBXZSBoYW5kbGUgY29tYmluZWQgbW9kZSB3aXRoIG9yIHdpdGhwdXQKKyogICAgICAgICAgICAgICAgICAgZXJyb3IgcmVzaWxpZW5jZSBhbmQgSC4yNjMgbW9kZSB0aHJvdWdoIHRoZSBzYW0gcGF0aCBub3cuCisqCisqICAgMDUvMDQvMjAwMAorKiAgICAgICAgICAgICAgICAgICBBZGRlZCB0ZW1wb3JhbCBzY2FsYWJpbGl0eSB0byB0aGUgZGVjb2Rlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLworUFZfU1RBVFVTIFBWX0RlY29kZVZvcChWaWRlb0RlY0RhdGEgKnZpZGVvKQoreworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgUFZfU1RBVFVTIHN0YXR1czsKKyAgICB1aW50MzIgdG1wdmFyOworCisgICAgLyoqKioqCisgICAgKiAgIERvIHNjYWxhYmxlIG9yIG5vbi1zY2FsYWJsZSBkZWNvZGluZyBvZiB0aGUgY3VycmVudCBWT1AKKyAgICAqKioqKi8KKworICAgIGlmICghY3VyclZvbC0+c2NhbGFiaWxpdHkpCisgICAgeworICAgICAgICBpZiAoY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZykKKyAgICAgICAgeworICAgICAgICAgICAgLyogRGF0YSBwYXJ0aXRpb25pbmcgbW9kZSBjb21lcyBoZXJlICovCisgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGcmFtZURhdGFQYXJ0TW9kZSh2aWRlbyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb21iaW5lZCBtb2RlIHdpdGggb3Igd2l0aG91dCBlcnJvciByZXNpbGllbmNlICovCisgICAgICAgICAgICAvKiAgICBhbmQgc2hvcnQgdmlkZW8gaGVhZGVyIGNvbWVzIGhlcmUuICAgICAgICAgICovCisgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGcmFtZUNvbWJpbmVkTW9kZSh2aWRlbyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBET19OT1RfRk9MTE9XX1NUQU5EQVJECisgICAgICAgIC8qIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQsIG9ubHkgY29tYmluZWQgbW9kZSBpcyBhbGxvd2VkICovCisgICAgICAgIC8qICAgIGluIHRoZSBlbmhhbmNlbWVudCBsYXllci4gICAgICAgICAgMDYvMDEvMjAwMC4gICAgICAgICovCisgICAgICAgIGlmIChjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEYXRhIHBhcnRpdGlvbmluZyBtb2RlIGNvbWVzIGhlcmUgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZyYW1lRGF0YVBhcnRNb2RlKHZpZGVvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvbWJpbmVkIG1vZGUgd2l0aCBvciB3aXRob3V0IGVycm9yIHJlc2lsaWVuY2UgKi8KKyAgICAgICAgICAgIC8qICAgIGFuZCBzaG9ydCB2aWRlbyBoZWFkZXIgY29tZXMgaGVyZS4gICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZyYW1lQ29tYmluZWRNb2RlKHZpZGVvKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgc3RhdHVzID0gRGVjb2RlRnJhbWVDb21iaW5lZE1vZGUodmlkZW8pOworI2VuZGlmCisgICAgfQorCisgICAgLyogVGhpcyBwYXJ0IGlzIGZvciBjb25zdW1pbmcgVmlzdWFsX29iamVjdF9zZXF1ZW5jZV9lbmRfY29kZSBhbmQgRU9TIENvZGUgKi8gICAvKiAgMTAvMTUvMDEgKi8KKyAgICBpZiAoIXZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgIHsKKyAgICAgICAgLyogYXQgdGhpcyBwb2ludCBiaXRzdHJlYW0gaXMgZXhwZWN0ZWQgdG8gYmUgYnl0ZSBhbGlnbmVkICovCisgICAgICAgIEJpdHN0cmVhbUJ5dGVBbGlnbk5vRm9yY2VTdHVmZmluZyhjdXJyVm9sLT5iaXRzdHJlYW0pOworCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzJIQyhjdXJyVm9sLT5iaXRzdHJlYW0sICZ0bXB2YXIpOyAgLyogIDA3LzA3LzAxICovCisgICAgICAgIGlmICh0bXB2YXIgPT0gVklTVUFMX09CSkVDVF9TRVFVRU5DRV9FTkRfQ09ERSkvKiBWT1NfRU5EX0NPREUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKGN1cnJWb2wtPmJpdHN0cmVhbSwgMTYpOworICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKGN1cnJWb2wtPmJpdHN0cmVhbSwgMTYpOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICAgICAgaWYgKHZpZGVvLT5kZWJsb2NraW5nKQorICAgICAgICB7CisgICAgICAgICAgICBIMjYzX0RlYmxvY2sodmlkZW8tPmN1cnJWb3AtPnlDaGFuLCB2aWRlby0+d2lkdGgsIHZpZGVvLT5oZWlnaHQsIHZpZGVvLT5RUE1CLCB2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAwLCAwKTsKKyAgICAgICAgICAgIEgyNjNfRGVibG9jayh2aWRlby0+Y3VyclZvcC0+dUNoYW4sIHZpZGVvLT53aWR0aCA+PiAxLCB2aWRlby0+aGVpZ2h0ID4+IDEsIHZpZGVvLT5RUE1CLCB2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAxLCB2aWRlby0+bW9kaWZpZWRfcXVhbnQpOworICAgICAgICAgICAgSDI2M19EZWJsb2NrKHZpZGVvLT5jdXJyVm9wLT52Q2hhbiwgdmlkZW8tPndpZHRoID4+IDEsIHZpZGVvLT5oZWlnaHQgPj4gMSwgdmlkZW8tPlFQTUIsIHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUsIDEsIHZpZGVvLT5tb2RpZmllZF9xdWFudCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBSZWFkIEVPUyBjb2RlIGZvciBzaG9ydGhlYWRlciBiaXRzdHJlYW1zICAgICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzIoY3VyclZvbC0+Yml0c3RyZWFtLCAyMiwgJnRtcHZhcik7CisgICAgICAgIGlmICh0bXB2YXIgPT0gU0hPUlRfVklERU9fRU5EX01BUktFUikKKyAgICAgICAgeworICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKGN1cnJWb2wtPmJpdHN0cmVhbSwgMjIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gUFZfQml0c3RyZWFtU2hvd0JpdHNCeXRlQWxpZ24oY3VyclZvbC0+Yml0c3RyZWFtLCAyMiwgJnRtcHZhcik7CisgICAgICAgICAgICBpZiAodG1wdmFyID09IFNIT1JUX1ZJREVPX0VORF9NQVJLRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtQnl0ZUFsaWduKGN1cnJWb2wtPmJpdHN0cmVhbSk7CisgICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKGN1cnJWb2wtPmJpdHN0cmVhbSwgMjIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCisqCisqIC0tIENhbGNWb3BEaXNwbGF5VGltZSAtLSBjYWxjdWxhdGUgYWJzb2x1dGUgdGltZSB3aGVuIFZPUCBpcyB0byBiZSBkaXNwbGF5ZWQKKyoKKyogICAwNC8xMi8yMDAwIEluaXRpYWwgcG9ydCB0byB0aGUgbmV3IFBWIGRlY29kZXIgbGlicmFyeSBmb3JtYXQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRFbmQqKioqKioqKi8KK3VpbnQzMiBDYWxjVm9wRGlzcGxheVRpbWUoVm9sICpjdXJyVm9sLCBWb3AgKmN1cnJWb3AsIGludCBzaG9ydFZpZGVvSGVhZGVyKQoreworICAgIHVpbnQzMiBkaXNwbGF5X3RpbWU7CisKKworICAgIC8qKioqKgorICAgICogICBDYWxjdWxhdGUgdGhlIHRpbWUgd2hlbiB0aGUgVk9QIGlzIHRvIGJlIGRpc3BsYXllZCBuZXh0CisgICAgKioqKiovCisKKyAgICBpZiAoIXNob3J0VmlkZW9IZWFkZXIpCisgICAgeworICAgICAgICBkaXNwbGF5X3RpbWUgPSAodWludDMyKShjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSArICgoKGludDMyKWN1cnJWb3AtPnRpbWVJbmMgLSAoaW50MzIpY3VyclZvbC0+dGltZUluY19vZmZzZXQpICogMTAwMCkgLyAoKGludDMyKWN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKSk7ICAvKiAgMTEvMTIvMjAwMSAqLworICAgICAgICBpZiAoY3VyclZvcC0+dGltZVN0YW1wID49IGRpc3BsYXlfdGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzcGxheV90aW1lICs9IDEwMDA7ICAvKiB0aGlzIGNhc2UgaXMgdmFsaWQgaWYgR09WSGVhZGVyIHRpbWVzdGFtcCBpcyBpZ25vcmVkICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZGlzcGxheV90aW1lID0gKHVpbnQzMikoY3VyclZvbC0+bW9kdWxvVGltZUJhc2UgKiAzMyArIChjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSAqIDExKSAvIDMwKTsgLyogIDExLzEyLzIwMDEgKi8KKyAgICB9CisKKyAgICByZXR1cm4oZGlzcGxheV90aW1lKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy96aWd6YWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ppZ3phZy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy96aWd6YWdfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ppZ3phZ190YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy96aWd6YWdfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3NTNlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTXBlZzRIMjYzRGVjb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTcyYjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTXBlZzRIMjYzIERlY29kZXIgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wZWc0SDI2M0RlY29kZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wZWc0SDI2M0RlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyLTEuMS56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcGVnNEgyNjNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2Q2NmVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcApAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTXBlZzRIMjYzRGVjb2RlclRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlICJtcDRkZWNfYXBpLmgiCisKKyNpbmNsdWRlICJNcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisjZGVmaW5lIE9VVFBVVF9GSUxFX05BTUUgIi9kYXRhL2xvY2FsL3RtcC9PdXRwdXQueXV2IgorI2RlZmluZSBDT0RFQ19DT05GSUdfRkxBRyAzMgorI2RlZmluZSBTWU5DX0ZSQU1FIDEKKyNkZWZpbmUgTVBFRzRfTUFYX1dJRFRIIDE5MjAKKyNkZWZpbmUgTVBFRzRfTUFYX0hFSUdIVCAxMDgwCisjZGVmaW5lIEgyNjNfTUFYX1dJRFRIIDM1MgorI2RlZmluZSBIMjYzX01BWF9IRUlHSFQgMjg4CisKK2NvbnN0ZXhwciB1aW50MzJfdCBrTnVtT3V0cHV0QnVmZmVycyA9IDI7CisKK3N0cnVjdCBGcmFtZUluZm8geworICAgIGludDMyX3QgYnl0ZXNDb3VudDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKK307CisKK3N0cnVjdCB0YWd2aWRlb0RlY0NvbnRyb2xzOworCitzdGF0aWMgTXBlZzRIMjYzRGVjb2RlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIE1wZWc0SDI2M0RlY29kZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcsIHN0cmluZywgYm9vbD4+IHsKKyAgcHVibGljOgorICAgIE1wZWc0SDI2M0RlY29kZXJUZXN0KCkKKyAgICAgICAgOiBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICAgIG1JbnB1dEJ1ZmZlcihudWxscHRyKSwKKyAgICAgICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkKGZhbHNlKSwKKyAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKKyAgICAgICAgICBtV2lkdGgoMzUyKSwKKyAgICAgICAgICBtSGVpZ2h0KDI4OCkgeworICAgICAgICBtZW1zZXQobU91dHB1dEJ1ZmZlciwgMHgwLCBzaXplb2YobU91dHB1dEJ1ZmZlcikpOworICAgIH0KKworICAgIH5NcGVnNEgyNjNEZWNvZGVyVGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbGVTdHJlYW0uaXNfb3BlbigpKSBtRWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgICAgICBkZWxldGUgbURlY0hhbmRsZTsKKyAgICAgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIGZyZWUobUlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZnJlZU91dHB1dEJ1ZmZlcigpOworICAgIH0KKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgdm9pZCBhbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgdm9pZCBkdW1wT3V0cHV0KG9mc3RyZWFtICZvc3RybSk7CisgICAgdm9pZCBmcmVlT3V0cHV0QnVmZmVyKCk7CisgICAgdm9pZCBwcm9jZXNzTXBlZzRIMjYzRGVjb2Rlcih2ZWN0b3I8RnJhbWVJbmZvPiBJbmZvLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmc3RyZWFtICZtRWxlU3RyZWFtLCBvZnN0cmVhbSAmb3N0cm0sIE1QNERlY29kaW5nTW9kZSBpbnB1dE1vZGUpOworICAgIHZvaWQgZGVJbml0RGVjb2RlcigpOworCisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKKyAgICB0YWd2aWRlb0RlY0NvbnRyb2xzICptRGVjSGFuZGxlOworICAgIGNoYXIgKm1JbnB1dEJ1ZmZlcjsKKyAgICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBib29sIG1GcmFtZXNDb25maWd1cmVkOworICAgIHVpbnQzMl90IG1OdW1TYW1wbGVzT3V0cHV0OworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworfTsKKworc3RhdHVzX3QgTXBlZzRIMjYzRGVjb2RlclRlc3Q6OmluaXREZWNvZGVyKCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBtRGVjSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisgICAgfQorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQobURlY0hhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNcGVnNEgyNjNEZWNvZGVyVGVzdDo6YWxsb2NPdXRwdXRCdWZmZXIoc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9ICh1aW50OF90ICopbWFsbG9jKG91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgQVNTRVJUX05FKG1PdXRwdXRCdWZmZXJbaV0sIG51bGxwdHIpIDw8ICJPdXRwdXQgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNcGVnNEgyNjNEZWNvZGVyVGVzdDo6ZHVtcE91dHB1dChvZnN0cmVhbSAmb3N0cm0pIHsKKyAgICB1aW50OF90ICpzcmMgPSBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV07CisgICAgc2l6ZV90IHZTdHJpZGUgPSBhbGlnbihtSGVpZ2h0LCAxNik7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBhbGlnbihtV2lkdGgsIDE2KTsKKyAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSBzcmNZU3RyaWRlIC8gMjsKKyAgICB1aW50OF90ICpzcmNTdGFydCA9IHNyYzsKKworICAgIC8qIFkgYnVmZmVyICovCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgb3N0cm0ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KHNyYyksIG1XaWR0aCk7CisgICAgICAgIHNyYyArPSBzcmNZU3RyaWRlOworICAgIH0KKyAgICAvKiBVIGJ1ZmZlciAqLworICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgIG9zdHJtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihzcmMpLCBtV2lkdGggLyAyKTsKKyAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOworICAgIH0KKyAgICAvKiBWIGJ1ZmZlciAqLworICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGUgKiA1IC8gNDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgb3N0cm0ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KHNyYyksIG1XaWR0aCAvIDIpOworICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgfQorfQorCit2b2lkIE1wZWc0SDI2M0RlY29kZXJUZXN0OjpmcmVlT3V0cHV0QnVmZmVyKCkgeworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNcGVnNEgyNjNEZWNvZGVyVGVzdDo6cHJvY2Vzc01wZWc0SDI2M0RlY29kZXIodmVjdG9yPEZyYW1lSW5mbz4gSW5mbywgaW50MzJfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBpZnN0cmVhbSAmbUVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mc3RyZWFtICZvc3RybSwgTVA0RGVjb2RpbmdNb2RlIGlucHV0TW9kZSkgeworICAgIHNpemVfdCBtYXhXaWR0aCA9IChpbnB1dE1vZGUgPT0gTVBFRzRfTU9ERSkgPyBNUEVHNF9NQVhfV0lEVEggOiBIMjYzX01BWF9XSURUSDsKKyAgICBzaXplX3QgbWF4SGVpZ2h0ID0gKGlucHV0TW9kZSA9PSBNUEVHNF9NT0RFKSA/IE1QRUc0X01BWF9IRUlHSFQgOiBIMjYzX01BWF9IRUlHSFQ7CisgICAgc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUgPSBhbGlnbihtYXhXaWR0aCwgMTYpICogYWxpZ24obWF4SGVpZ2h0LCAxNikgKiAzIC8gMjsKKyAgICB1aW50MzJfdCBmcmFtZUluZGV4ID0gb2Zmc2V0OworICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKKyAgICBBU1NFUlRfR0UocmFuZ2UsIDApIDw8ICJJbnZhbGlkIHJhbmdlIjsKKyAgICBBU1NFUlRfVFJVRShvZmZzZXQgPj0gMCAmJiBvZmZzZXQgPD0gSW5mby5zaXplKCkgLSAxKSA8PCAiSW52YWxpZCBvZmZzZXQiOworICAgIEFTU0VSVF9MRShyYW5nZSArIG9mZnNldCwgSW5mby5zaXplKCkpIDw8ICJyYW5nZStvZmZzZXQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBubyBvZiBmcmFtZXMiOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZyYW1lSW5kZXggPT0gSW5mby5zaXplKCkgfHwgZnJhbWVJbmRleCA9PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKworICAgICAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSBJbmZvW2ZyYW1lSW5kZXhdLmJ5dGVzQ291bnQ7CisgICAgICAgIEFTU0VSVF9HVChieXRlc0NvdW50LCAwKSA8PCAiU2l6ZSBmb3IgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGlzIG5lZ2F0aXZlIjsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gKGNoYXIgKiltYWxsb2MoYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHJlYWQgZnJhbWUiOworICAgICAgICBtRWxlU3RyZWFtLnJlYWQobUlucHV0QnVmZmVyLCBieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpIDw8ICJtRWxlU3RyZWFtLmdjb3VudCgpICE9IGJ5dGVzQ291bnQiOworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCB2b2xJbmZvW10gPSB7MHgwMCwgMHgwMCwgMHgwMSwgMHhCMH07CisgICAgICAgIGJvb2wgdm9sSGVhZGVyID0gbWVtY21wKG1JbnB1dEJ1ZmZlciwgdm9sSW5mbywgNCkgPT0gMDsKKyAgICAgICAgaWYgKHZvbEhlYWRlcikgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgdWludDhfdCAqdm9sRGF0YVsxXXt9OworICAgICAgICAgICAgaW50MzJfdCB2b2xTaXplID0gMDsKKworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBJbmZvW2ZyYW1lSW5kZXhdLmZsYWdzOworICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID09IENPREVDX0NPTkZJR19GTEFHOworICAgICAgICAgICAgaWYgKGNvZGVjQ29uZmlnIHx8IHZvbEhlYWRlcikgeworICAgICAgICAgICAgICAgIHZvbERhdGFbMF0gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4obUlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICB2b2xTaXplID0gYnl0ZXNDb3VudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gUFZJbml0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUsIHZvbERhdGEsICZ2b2xTaXplLCAxLCBtYXhXaWR0aCwgbWF4SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0TW9kZSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJQVkluaXRWaWRlb0RlY29kZXIgZmFpbGVkLiBVbnN1cHBvcnRlZCBjb250ZW50IjsKKworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1EZWNIYW5kbGUpOworICAgICAgICAgICAgQVNTRVJUX0VRKGlucHV0TW9kZSwgYWN0dWFsTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkRlY29kZWQgbW9kZSBub3Qgc2FtZSBhcyBhY3R1YWwgbW9kZSBvZiB0aGUgZGVjb2RlciI7CisKKyAgICAgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKG1EZWNIYW5kbGUsIDApOworCisgICAgICAgICAgICBpbnQzMl90IGRpc3BXaWR0aCwgZGlzcEhlaWdodDsKKyAgICAgICAgICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1EZWNIYW5kbGUsICZkaXNwV2lkdGgsICZkaXNwSGVpZ2h0KTsKKworICAgICAgICAgICAgaW50MzJfdCBidWZXaWR0aCwgYnVmSGVpZ2h0OworICAgICAgICAgICAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsICZidWZXaWR0aCwgJmJ1ZkhlaWdodCk7CisKKyAgICAgICAgICAgIEFTU0VSVF9MRShkaXNwV2lkdGgsIGJ1ZldpZHRoKSA8PCAiRGlzcGxheSB3aWR0aCBpcyBncmVhdGVyIHRoYW4gYnVmZmVyIHdpZHRoIjsKKyAgICAgICAgICAgIEFTU0VSVF9MRShkaXNwSGVpZ2h0LCBidWZIZWlnaHQpIDw8ICJEaXNwbGF5IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gYnVmZmVyIGhlaWdodCI7CisKKyAgICAgICAgICAgIGlmIChkaXNwV2lkdGggIT0gbVdpZHRoIHx8IGRpc3BIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IGRpc3BXaWR0aDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gZGlzcEhlaWdodDsKKyAgICAgICAgICAgICAgICBmcmVlT3V0cHV0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0TW9kZSA9PSBIMjYzX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnZvbERhdGFbMV17fTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2b2xTaXplID0gMDsKKworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVkluaXRWaWRlb0RlY29kZXIobURlY0hhbmRsZSwgdm9sRGF0YSwgJnZvbFNpemUsIDEsIG1heFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0LCBIMjYzX01PREUpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJQVkluaXRWaWRlb0RlY29kZXIgZmFpbGVkIGZvciBIMjYzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgZnJhbWVJbmRleCsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICAgICAgICBBU1NFUlRfR0Uob3V0cHV0QnVmZmVyU2l6ZSwgeUZyYW1lU2l6ZSAqIDMgLyAyKQorICAgICAgICAgICAgICAgIDw8ICJUb28gc21hbGwgb3V0cHV0IGJ1ZmZlcjogIiA8PCBvdXRwdXRCdWZmZXJTaXplIDw8ICIgYnl0ZXMiOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhbGxvY091dHB1dEJ1ZmZlcihvdXRwdXRCdWZmZXJTaXplKSk7CisKKyAgICAgICAgaWYgKCFtRnJhbWVzQ29uZmlndXJlZCkgeworICAgICAgICAgICAgUFZTZXRSZWZlcmVuY2VZVVYobURlY0hhbmRsZSwgbU91dHB1dEJ1ZmZlclsxXSk7CisgICAgICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhlYWRlciBjb250YWlucyBuZXcgaW5mbywgZS5nLiwgd2lkdGgvaGVpZ2h0LCBldGMuCisgICAgICAgIFZvcEhlYWRlckluZm8gaGVhZGVySW5mbzsKKyAgICAgICAgdWludDMyX3QgdXNlRXh0VGltZXN0YW1wID0gMTsKKyAgICAgICAgaW50MzJfdCBpbnB1dFNpemUgPSAoSW5mbylbZnJhbWVJbmRleF0uYnl0ZXNDb3VudDsKKyAgICAgICAgdWludDMyX3QgdGltZXN0YW1wID0gZnJhbWVJbmRleDsKKworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW1UbXAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4obUlucHV0QnVmZmVyKTsKKworICAgICAgICBzdGF0dXMgPSBQVkRlY29kZVZvcEhlYWRlcihtRGVjSGFuZGxlLCAmYml0c3RyZWFtVG1wLCAmdGltZXN0YW1wLCAmaW5wdXRTaXplLCAmaGVhZGVySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZUV4dFRpbWVzdGFtcCwgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUFZfVFJVRSkgPDwgImZhaWxlZCB0byBkZWNvZGUgdm9wIGhlYWRlciI7CisKKyAgICAgICAgLy8gSDI2MyBkb2Vzbid0IGhhdmUgVk9MIGhlYWRlciwgdGhlIGZyYW1lIHNpemUgaW5mb3JtYXRpb24gaXMgaW4gc2hvcnQgaGVhZGVyLCBpLmUuIHRoZQorICAgICAgICAvLyBkZWNvZGVyIG1heSBkZXRlY3Qgc2l6ZSBjaGFuZ2UgYWZ0ZXIgUFZEZWNvZGVWb3BIZWFkZXIuCisgICAgICAgIGludDMyX3QgZGlzcFdpZHRoLCBkaXNwSGVpZ2h0OworICAgICAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAmZGlzcFdpZHRoLCAmZGlzcEhlaWdodCk7CisKKyAgICAgICAgaW50MzJfdCBidWZXaWR0aCwgYnVmSGVpZ2h0OworICAgICAgICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMobURlY0hhbmRsZSwgJmJ1ZldpZHRoLCAmYnVmSGVpZ2h0KTsKKworICAgICAgICBBU1NFUlRfTEUoZGlzcFdpZHRoLCBidWZXaWR0aCkgPDwgIkRpc3BsYXkgd2lkdGggaXMgZ3JlYXRlciB0aGFuIGJ1ZmZlciB3aWR0aCI7CisgICAgICAgIEFTU0VSVF9MRShkaXNwSGVpZ2h0LCBidWZIZWlnaHQpIDw8ICJEaXNwbGF5IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gYnVmZmVyIGhlaWdodCI7CisgICAgICAgIGlmIChkaXNwV2lkdGggIT0gbVdpZHRoIHx8IGRpc3BIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgbVdpZHRoID0gZGlzcFdpZHRoOworICAgICAgICAgICAgbUhlaWdodCA9IGRpc3BIZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBQVkRlY29kZVZvcEJvZHkobURlY0hhbmRsZSwgJmlucHV0U2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFBWX1RSVUUpIDw8ICJmYWlsZWQgdG8gZGVjb2RlIHZpZGVvIGZyYW1lIE5vID0gJWQiIDw8IGZyYW1lSW5kZXg7CisKKyAgICAgICAgZHVtcE91dHB1dChvc3RybSk7CisKKyAgICAgICAgKyttTnVtU2FtcGxlc091dHB1dDsKKyAgICAgICAgKytmcmFtZUluZGV4OworICAgIH0KKyAgICBmcmVlT3V0cHV0QnVmZmVyKCk7Cit9CisKK3ZvaWQgTXBlZzRIMjYzRGVjb2RlclRlc3Q6OmRlSW5pdERlY29kZXIoKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICAgICAgZGVsZXRlIG1EZWNIYW5kbGU7CisgICAgICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgZnJlZU91dHB1dEJ1ZmZlcigpOworfQorCit2b2lkIGdldEluZm8oc3RyaW5nIGluZm9GaWxlTmFtZSwgdmVjdG9yPEZyYW1lSW5mbz4gJkluZm8pIHsKKyAgICBpZnN0cmVhbSBlbGVJbmZvOworICAgIGVsZUluZm8ub3BlbihpbmZvRmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgaW5mb0ZpbGVOYW1lOworICAgIGludDMyX3QgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGlmIChlbGVJbmZvLmlzX29wZW4oKSkgZWxlSW5mby5jbG9zZSgpOworfQorCitURVNUX1AoTXBlZzRIMjYzRGVjb2RlclRlc3QsIERlY29kZVRlc3QpIHsKKyAgICB0dXBsZTxzdHJpbmcgLyogSW5wdXRGaWxlTmFtZSAqLywgc3RyaW5nIC8qIEluZm9GaWxlTmFtZSAqLywgYm9vbCAvKiBtb2RlICovPiBwYXJhbXMgPQorICAgICAgICAgICAgR2V0UGFyYW0oKTsKKworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gIiA8PCBnZXQ8MD4ocGFyYW1zKTsKKworICAgIHN0cmluZyBpbmZvRmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihwYXJhbXMpOworICAgIHZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5mbyhpbmZvRmlsZU5hbWUsIEluZm8pKTsKKyAgICBBU1NFUlRfTkUoSW5mby5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBJbmZvIGZpbGUiOworCisgICAgb2ZzdHJlYW0gb3N0cm07CisgICAgb3N0cm0ub3BlbihPVVRQVVRfRklMRV9OQU1FLCBzdGQ6Om9mc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShvc3RybS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgc3RyZWFtIGZvciAiIDw8IGdldDwwPihwYXJhbXMpOworCisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBPSykgPDwgImluaXREZWNvZGVyOiBmYWlsZWQgdG8gY3JlYXRlIGRlY29kZXIgIiA8PCBlcnI7CisKKyAgICBib29sIGlzTXBlZzQgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBNUDREZWNvZGluZ01vZGUgaW5wdXRNb2RlID0gaXNNcGVnNCA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBwcm9jZXNzTXBlZzRIMjYzRGVjb2RlcihJbmZvLCAwLCBJbmZvLnNpemUoKSwgbUVsZVN0cmVhbSwgb3N0cm0sIGlucHV0TW9kZSkpOworICAgIGRlSW5pdERlY29kZXIoKTsKKyAgICBvc3RybS5jbG9zZSgpOworICAgIEluZm8uY2xlYXIoKTsKK30KKworVEVTVF9QKE1wZWc0SDI2M0RlY29kZXJUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICB0dXBsZTxzdHJpbmcgLyogSW5wdXRGaWxlTmFtZSAqLywgc3RyaW5nIC8qIEluZm9GaWxlTmFtZSAqLywgYm9vbCAvKiBtb2RlICovPiBwYXJhbXMgPQorICAgICAgICAgICAgR2V0UGFyYW0oKTsKKworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gIiA8PCBnZXQ8MD4ocGFyYW1zKTsKKworICAgIHN0cmluZyBpbmZvRmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihwYXJhbXMpOworICAgIHZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5mbyhpbmZvRmlsZU5hbWUsIEluZm8pKTsKKyAgICBBU1NFUlRfTkUoSW5mby5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBJbmZvIGZpbGUiOworCisgICAgb2ZzdHJlYW0gb3N0cm07CisgICAgb3N0cm0ub3BlbihPVVRQVVRfRklMRV9OQU1FLCBzdGQ6Om9mc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShvc3RybS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgc3RyZWFtIGZvciAiIDw8IGdldDwwPihwYXJhbXMpOworCisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBPSykgPDwgImluaXREZWNvZGVyOiBmYWlsZWQgdG8gY3JlYXRlIGRlY29kZXIgIiA8PCBlcnI7CisKKyAgICBib29sIGlzTXBlZzQgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBNUDREZWNvZGluZ01vZGUgaW5wdXRNb2RlID0gaXNNcGVnNCA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CisgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyB0byBiZSBkZWNvZGVkIGJlZm9yZSBmbHVzaAorICAgIGludDMyX3QgbnVtRnJhbWVzID0gSW5mby5zaXplKCkgLyAzOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgcHJvY2Vzc01wZWc0SDI2M0RlY29kZXIoSW5mbywgMCwgbnVtRnJhbWVzLCBtRWxlU3RyZWFtLCBvc3RybSwgaW5wdXRNb2RlKSk7CisKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGludDMyX3Qgc3RhdHVzID0gUFZSZXNldFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUFZfVFJVRSk7CisgICAgfQorCisgICAgLy8gU2VlayB0byBuZXh0IGtleSBmcmFtZSBhbmQgc3RhcnQgZGVjb2RpbmcgdGlsbCB0aGUgZW5kCisgICAgaW50MzJfdCBpbmRleCA9IG51bUZyYW1lczsKKyAgICBib29sIGtleUZyYW1lID0gZmFsc2U7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHdoaWxlIChpbmRleCA8IChpbnQzMl90KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgbUVsZVN0cmVhbS5pZ25vcmUoSW5mb1tpbmRleF0uYnl0ZXNDb3VudCk7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorICAgIEFMT0dWKCJJbmRleD0gJWQiLCBpbmRleCk7CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocHJvY2Vzc01wZWc0SDI2M0RlY29kZXIoSW5mbywgaW5kZXgsIChpbnQzMl90KUluZm8uc2l6ZSgpIC0gaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbGVTdHJlYW0sIG9zdHJtLCBpbnB1dE1vZGUpKTsKKyAgICB9CisgICAgZGVJbml0RGVjb2RlcigpOworICAgIG9zdHJtLmNsb3NlKCk7CisgICAgSW5mby5jbGVhcigpOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIE1wZWc0SDI2M0RlY29kZXJUZXN0QWxsLCBNcGVnNEgyNjNEZWNvZGVyVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgic3dpcmxfMTI4eDk2X2gyNjMuaDI2MyIsICJzd2lybF8xMjh4OTZfaDI2My5pbmZvIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzd2lybF8xNzZ4MTQ0X2gyNjMuaDI2MyIsICJzd2lybF8xNzZ4MTQ0X2gyNjMuaW5mbyIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMzUyeDI4OF9oMjYzLmgyNjMiLCAic3dpcmxfMzUyeDI4OF9oMjYzLmluZm8iLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl8zNTJ4Mjg4X2gyNjMuaDI2MyIsICJiYmJfMzUyeDI4OF9oMjYzLmluZm8iLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl8zNTJ4Mjg4X21wZWc0Lm00diIsICJiYmJfMzUyeDI4OF9tcGVnNC5pbmZvIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInF0eXBlMF9tcGVnNC5tNHYiLCAicXR5cGUwX21wZWc0LmluZm8iLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgicXR5cGUxX21wZWc0Lm00diIsICJxdHlwZTFfbXBlZzQuaW5mbyIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJxdHlwZTFfcW1hdHJpeF9tcGVnNC5tNHYiLCAicXR5cGUxX3FtYXRyaXhfbXBlZzQuaW5mbyIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzd2lybF8xMjh4MTI4X21wZWc0Lm00diIsICJzd2lybF8xMjh4MTI4X21wZWc0LmluZm8iLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTMweDEzMl9tcGVnNC5tNHYiLCAic3dpcmxfMTMweDEzMl9tcGVnNC5pbmZvIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInN3aXJsXzEzMngxMzBfbXBlZzQubTR2IiwgInN3aXJsXzEzMngxMzBfbXBlZzQuaW5mbyIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzd2lybF8xMzZ4MTQ0X21wZWc0Lm00diIsICJzd2lybF8xMzZ4MTQ0X21wZWc0LmluZm8iLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTQ0eDEzNl9tcGVnNC5tNHYiLCAic3dpcmxfMTQ0eDEzNl9tcGVnNC5pbmZvIiwgdHJ1ZSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBNcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HRCgiRGVjb2RlciBUZXN0IFJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWM1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDAgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBNcGVnNEgyNjNEZWNvZGVyIDoKK1RoZSBNcGVnNEgyNjNEZWNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBNcGVnNCBhbmQgSDI2MyBkZWNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gTXBlZzRIMjYzRGVjb2RlclRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvTXBlZzRIMjYzRGVjb2RlclRlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyLTEuMS56aXApLgorRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIE1wZWc0SDI2M0RlY29kZXIgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBNcGVnNEgyNjNEZWNvZGVyVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9NcGVnNEgyNjNEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRGVjb2Rlci8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgTXBlZzRIMjYzRGVjb2RlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3ZjAwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icApAQCAtMCwwICsxLDc1IEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9iaXRzdHJlYW1faW8uY3BwIiwKKyAgICAgICAgInNyYy9jb21iaW5lZF9lbmNvZGUuY3BwIiwgInNyYy9kYXRhcGFydF9lbmNvZGUuY3BwIiwKKyAgICAgICAgInNyYy9kY3QuY3BwIiwKKyAgICAgICAgInNyYy9maW5kaGFsZnBlbC5jcHAiLAorICAgICAgICAic3JjL2Zhc3Rjb2RlbWIuY3BwIiwKKyAgICAgICAgInNyYy9mYXN0aWRjdC5jcHAiLAorICAgICAgICAic3JjL2Zhc3RxdWFudC5jcHAiLAorICAgICAgICAic3JjL21lX3V0aWxzLmNwcCIsCisgICAgICAgICJzcmMvbXA0ZW5jX2FwaS5jcHAiLAorICAgICAgICAic3JjL3JhdGVfY29udHJvbC5jcHAiLAorICAgICAgICAic3JjL21vdGlvbl9lc3QuY3BwIiwKKyAgICAgICAgInNyYy9tb3Rpb25fY29tcC5jcHAiLAorICAgICAgICAic3JjL3NhZC5jcHAiLAorICAgICAgICAic3JjL3NhZF9oYWxmcGVsLmNwcCIsCisgICAgICAgICJzcmMvdmxjX2VuY29kZS5jcHAiLAorICAgICAgICAic3JjL3ZvcC5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlhfUkMiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jX3Rlc3QiLAorICAgIGd0ZXN0OiBmYWxzZSwKKworICAgIHNyY3M6IFsidGVzdC9tNHZfaDI2M19lbmNfdGVzdC5jcHAiXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURCWF9SQyIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvY3ZlaS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2JpdHN0cmVhbV9pby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2NvbWJpbmVkX2VuY29kZS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kYXRhcGFydF9lbmNvZGUuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0X2lubGluZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0X2lubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3RfaW5saW5lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdF9pbmxpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RpZGN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGlkY3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnQuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50X2lubGluZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50X2lubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnRfaW5saW5lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudF9pbmxpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbTR2ZW5jX29zY2wuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL200dmVuY19vc2NsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL200dmVuY19vc2NsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL200dmVuY19vc2NsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21lX3V0aWxzLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21lX3V0aWxzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbWVfdXRpbHMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tZV91dGlscy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19saWIuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19saWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2xpYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfbGliLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGxpYl9pbnQuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGxpYl9pbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0bGliX2ludC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRsaWJfaW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX21iX29mZnNldC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfbWJfb2Zmc2V0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jX3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGVfaW5saW5lLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlX2lubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlX2lubGluZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlX2lubGluZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdm9wLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdm9wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdm9wLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk4MmRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNcGVnNEgyNjNFbmNvZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKKyAgICBzcmNzIDogWyAiTXBlZzRIMjYzRW5jb2RlclRlc3QuY3BwIiBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvTXBlZzRIMjYzRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvUkVBRE1FLm1kCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGRhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogIm1wZWc0X2gyNjNfZGVjX2Z1enpfZGVmYXVsdHMiLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCisKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcGVnNF9kZWNfZnV6emVyIiwKKworICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2RlY19mdXp6X2RlZmF1bHRzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1QRUc0IiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiaDI2M19kZWNfZnV6emVyIiwKKworICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2RlY19mdXp6X2RlZmF1bHRzIiwKKyAgICBdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogIm1wZWc0X2gyNjNfZW5jX2Z1enpfZGVmYXVsdHMiLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbIm1wZWc0X2gyNjNfZW5jX2Z1enplci5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcGVnNF9lbmNfZnV6emVyIiwKKworICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2VuY19mdXp6X2RlZmF1bHRzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1ETVBFRzQiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImgyNjNfZW5jX2Z1enplciIsCisKKyAgICBkZWZhdWx0czogWworICAgICAgICAibXBlZzRfaDI2M19lbmNfZnV6el9kZWZhdWx0cyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0ZmY5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTU4IEBACisjIEZ1enplciBmb3IgbGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyBkZWNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNUEVHNC9IMjYzIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorY29kZWMgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlcyAoZGljdGlvbmFyeSBmaWxlcykgYXJlIGNyZWF0ZWQgZm9yIE1QRUc0IGFuZCBIMjYzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXF1aXJlZCBzdGFydAorYnl0ZXMgYXJlIHByZXNlbnQgaW4gZXZlcnkgaW5wdXQgZmlsZSB0aGF0IGdvZXMgdG8gdGhlIGZ1enplci4KK1RoaXMgZW5zdXJlcyB0aGF0IGRlY29kZXIgZG9lcyBub3QgcmVqZWN0IGFueSBpbnB1dCBmaWxlIGluIHRoZSBmaXJzdCBjaGVjaworCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgY29kZWMgdXNpbmcgYSBsb29wLgorICogSWYgdGhlIGRlY29kZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCisgICBpbiB0aGUgZGVjb2RlIGNhbGwuCisgKiBJZiB0aGUgZGVjb2RlIG9wZXJhdGlvbiB3YXMgdW4tc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIGFkdmFuY2VkIGJ5IDEgYnl0ZSBzbyB0aGF0IHRoZSBmdXp6ZXIKKyAgIGNhbiBwcm9jZWVkIHRvIGZlZWQgdGhlIG5leHQgZnJhbWUuCisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwgbWFsZm9ybWVkLCBldGMpCithbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZSBjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyMjIyBPdGhlciBjb25zaWRlcmF0aW9ucworICogVHdvIGZ1enplciBiaW5hcmllcyAtIG1wZWc0X2RlY19mdXp6ZXIgYW5kIGgyNjNfZGVjX2Z1enplciBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBwcmVzZW5jZQorICAgb2YgYSBmbGFnIC0gJ01QRUc0JworICogVGhlIG51bWJlciBvZiBkZWNvZGUgY2FsbHMgYXJlIGtlcHQgdG8gYSBtYXhpbXVtIG9mIDEwMCBzbyB0aGF0IHRoZSBmdXp6ZXIgZG9lcyBub3QgdGltZW91dC4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgbXBlZzRfZGVjX2Z1enplciBhbmQgaDI2M19kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXBlZzRfZGVjX2Z1enplcgorICAkIG1tIC1qJChucHJvYykgaDI2M19kZWNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgTVBFRzQgb3IgSDI2MyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcGVnNF9kZWNfZnV6emVyL21wZWc0X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2gyNjNfZGVjX2Z1enplci9oMjYzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvbXBlZzRfZGVjX2Z1enplci9tcGVnNF9kZWNfZnV6emVyIENPUlBVU19ESVIKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9oMjYzX2RlY19mdXp6ZXIvaDI2M19kZWNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIEZ1enplciBmb3IgbGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyBlbmNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNUEVHNC9IMjYzIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorY29kZWMgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworTVBFRzQvSDI2MyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBGcmFtZSBXaWR0aCAocGFyYW1ldGVyIG5hbWU6IGBlbmNXaWR0aGApCisyLiBGcmFtZSBIZWlnaHQgKHBhcmFtZXRlciBuYW1lOiBgZW5jSGVpZ2h0YCkKKzMuIFJhdGUgY29udHJvbCBtb2RlIChwYXJhbWV0ZXIgbmFtZTogYHJjVHlwZWApCis0LiBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBhY2tldCAocGFyYW1ldGVyIG5hbWU6IGBwYWNrZXRTaXplYCkKKzUuIFFwIGZvciBJLVZvcChwYXJhbWV0ZXIgbmFtZTogYGlRdWFudGApCis2LiBRcCBmb3IgUC1Wb3AgKHBhcmFtZXRlciBuYW1lOiBgcFF1YW50YCkKKzcuIEVuYWJsZSBSVkxDIG1vZGUgKHBhcmFtZXRlciBuYW1lOiBgcnZsY0VuYWJsZWApCis4LiBRdWFudGl6YXRpb24gbW9kZSAocGFyYW1ldGVyIG5hbWU6IGBxdWFudFR5cGVgKQorOS4gRGlzYWJsZSBmcmFtZSBza2lwcGluZyAocGFyYW1ldGVyIG5hbWU6IGBub0ZyYW1lU2tpcHBlZGApCisxMC4gRW5hYmxlIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gKHBhcmFtZXRlciBuYW1lOiBgc2NlbmVEZXRlY3RgKQorMTEuIE51bWJlciBvZiBpbnRyYSBNQnMgaW4gUC1mcmFtZShwYXJhbWV0ZXIgbmFtZTogYG51bUludHJhTUJgKQorMTIuIFNlYXJjaCByYW5nZSBvZiBNRSAocGFyYW1ldGVyIG5hbWU6IGBzZWFyY2hSYW5nZWApCisxMy4gRW5hYmxlIDh4OCBNRSBhbmQgTUMgKHBhcmFtZXRlciBuYW1lOiBgbXY4eDhFbmFibGVgKQorMTQuIEVuYWJsZSBBQyBwcmVkaWN0aW9uIChwYXJhbWV0ZXIgbmFtZTogYHVzZUFDUHJlZGApCisxNS4gVGhyZXNob2xkIGZvciBpbnRyYSBEQyBWTEMgKHBhcmFtZXRlciBuYW1lOiBgaW50cmFEQ1ZsY1RoYCkKKzE2LiBFbmNvZGluZyBNb2RlIChwYXJhbWV0ZXIgbmFtZTogYGVuY01vZGVgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYHJjVHlwZWAgfCAwLiBgQ09OU1RBTlRfUWAgMS4gYENCUl8xYCAyLiBgVkJSXzFgIDMuIGBDQlJfMmAgNC4gYFZCUl8yYCA1LiBgQ0JSX0xPV0RFTEFZYCB8IEFsbCB0aGUgYml0cyBvZiA2dGggYnl0ZSBvZiBkYXRhIG1vZHVsdXMgNiB8Cit8IGBwYWNrZXRTaXplYCB8IEluIHRoZSByYW5nZSBgMCB0byAyNTVgIHwgQWxsIHRoZSBiaXRzIG9mIDd0aCBieXRlIG9mIGRhdGEgfAorfCBgaVF1YW50YCB8IEluIHRoZSByYW5nZSBgMSB0byAzMWAgfCBBbGwgdGhlIGJpdHMgb2YgOHRoIGJ5dGUgb2YgZGF0YSB8Cit8IGBwUXVhbnRgIHwgSW4gdGhlIHJhbmdlIGAxIHRvIDMxYCB8IEFsbCB0aGUgYml0cyBvZiA5dGggYnl0ZSBvZiBkYXRhIHwKK3wgYHJ2bGNFbmFibGVgIHwgMC4gYFBWX09GRmAgMS4gYFBWX09OYCB8IGJpdCAwIG9mIDEwdGggYnl0ZSBvZiBkYXRhIHwKK3wgYHF1YW50VHlwZWAgfCAwLiBgMGAgMS4gYDFgIHwgYml0IDAgb2YgMTF0aCBieXRlIG9mIGRhdGEgfAorfCBgbm9GcmFtZVNraXBwZWRgIHwgMC4gYFBWX09GRmAgMS4gYFBWX09OYCB8IGJpdCAwIG9mIDEydGggYnl0ZSBvZiBkYXRhIHwKK3wgYHNjZW5lRGV0ZWN0YCB8IDAuIGBQVl9PRkZgIDEuIGBQVl9PTmAgfCBiaXQgMCBvZiAxM3RoIGJ5dGUgb2YgZGF0YSB8Cit8IGBudW1JbnRyYU1CYCB8IEluIHRoZSByYW5nZSBgMCB0byA3YCB8IGJpdCAwLCAxIGFuZCAyIG9mIDE0dGggYnl0ZSBvZiBkYXRhIHwKK3wgYHNlYXJjaFJhbmdlYCB8IEluIHRoZSByYW5nZSBgMCB0byAzMWAgfCBiaXQgMCwgMSwgMiwgMyBhbmQgNCBvZiAxNXRoIGJ5dGUgb2YgZGF0YSB8Cit8IGBtdjh4OEVuYWJsZWAgfCAwLiBgUFZfT0ZGYCAxLiBgUFZfT05gIHwgYml0IDAgb2YgMTZ0aCBieXRlIG9mIGRhdGEgfAorfCBgdXNlQUNQcmVkYCB8IDAuIGBQVl9PRkZgIDEuIGBQVl9PTmAgfCBiaXQgMCBvZiAxN3RoIGJ5dGUgb2YgZGF0YSB8Cit8IGBpbnRyYURDVmxjVGhgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIDdgIHwgYml0IDAsIDEgYW5kIDIgb2YgMTh0aCBieXRlIG9mIGRhdGEgfAorCitGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgb25seSBmb3IgbXBlZzRfZW5jX2Z1enplcgorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYGVuY1dpZHRoYCB8IEluIHRoZSByYW5nZSBgMCB0byAxMDIzOWAgfCBBbGwgdGhlIGJpdHMgb2YgMXN0IGFuZCAybmQgYnl0ZSBvZiBkYXRhIHwKK3wgYGVuY0hlaWdodGAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gMTAyMzlgIHwgQWxsIHRoZSBiaXRzIG9mIDNyZCBhbmQgNHRoIGJ5dGUgb2YgZGF0YSB8Cit8IGBlbmNNb2RlYCB8IDAuIGBIMjYzX01PREVgIDEuIGBIMjYzX01PREVfV0lUSF9FUlJfUkVTYCAyLiBgREFUQV9QQVJUSVRJT05JTkdfTU9ERWAgMy4gYENPTUJJTkVfTU9ERV9OT19FUlJfUkVTYCA0LiBgQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFU2AgfCBBbGwgdGhlIGJpdHMgb2YgMTl0aCBieXRlIG9mIGRhdGEgbW9kdWx1cyA1IHwKKworRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG9ubHkgZm9yIGgyNjNfZW5jX2Z1enplcgorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYGVuY1dpZHRoYCB8IDAuIGAxMjhgIDEuIGAxNzZgIDIuIGAzNTJgIDMuIGA3MDRgIDQuIGAxNDA4YCB8IEFsbCB0aGUgYml0cyBvZiAxc3QgYnl0ZSBvZiBkYXRhIG1vZHVsdXMgNXwKK3wgYGVuY0hlaWdodGAgfCAwLiBgOTZgIDEuIGAxNDRgIDIuIGAyODhgIDMuIGA1NzZgIDQuIGAxMTUyIGAgfCBBbGwgdGhlIGJpdHMgb2YgM3JkIGJ5dGUgb2YgZGF0YSBtb2R1bHVzIDV8Cit8IGBlbmNNb2RlYCB8IDAuIGBTSE9SVF9IRUFERVJgIDEuIGBTSE9SVF9IRUFERVJfV0lUSF9FUlJfUkVTYCB8IEFsbCB0aGUgYml0cyBvZiAxOXRoIGJ5dGUgb2YgZGF0YSBtb2R1bHVzIDIgfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIHVzaW5nIGEgbG9vcC4KK0lmIHRoZSBlbmNvZGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgdGhlIGZyYW1lIHNpemUuCitJZiB0aGUgZW5jb2RlIG9wZXJhdGlvbiB3YXMgdW4tc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIHN0aWxsIGFkdmFuY2VkIGJ5IGZyYW1lIHNpemUgc28KK3RoYXQgdGhlIGZ1enplciBjYW4gcHJvY2VlZCB0byBmZWVkIHRoZSBuZXh0IGZyYW1lLgorCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wZWc0X2VuY19mdXp6ZXIgYW5kIGgyNjNfZW5jX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXBlZzRfZW5jX2Z1enplcgorICAkIG1tIC1qJChucHJvYykgaDI2M19lbmNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgeXV2IGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L200dl9oMjYzX2VuY19mdXp6ZXIvbTR2X2gyNjNfZW5jX2Z1enplciBDT1JQVVNfRElSCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvaDI2M19lbmNfZnV6emVyL2gyNjNfZW5jX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9tcGVnNF9lbmNfZnV6emVyL21wZWc0X2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2gyNjNfZW5jX2Z1enplci9oMjYzX2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9oMjYzX2RlY19mdXp6ZXIuZGljdCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxZDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGNvZGUgKGJ5dGVzIDAtMykKK2t3MT0iXHgwMFx4MDBceDgwXHgwMiIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0IGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9kZWNfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyNDFhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlIChieXRlcyAwLTMpCitrdzE9Ilx4MDBceDAwXHgwMVx4QjAiCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyYzgyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorI2RlZmluZSBNUEVHNF9NQVhfV0lEVEggMTkyMAorI2RlZmluZSBNUEVHNF9NQVhfSEVJR0hUIDEwODAKKyNkZWZpbmUgSDI2M19NQVhfV0lEVEggMzUyCisjZGVmaW5lIEgyNjNfTUFYX0hFSUdIVCAyODgKKyNkZWZpbmUgREVGQVVMVF9XSURUSCAzNTIKKyNkZWZpbmUgREVGQVVMVF9IRUlHSFQgMjg4CisKK2NvbnN0ZXhwciBzaXplX3Qga01heE51bURlY29kZUNhbGxzID0gMTAwOworY29uc3RleHByIHVpbnQ4X3Qga051bU91dHB1dEJ1ZmZlcnMgPSAyOworY29uc3RleHByIGludCBrTGF5ZXIgPSAxOworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworLyogPT0gY2VpbChudW0gLyBkZW4pICogZGVuLiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBhbGlnbm1lbnQgbXVzdCBiZSBwb3NpdGl2ZSBwb3dlciBvZiAyICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBzdGF0aWMgY29uc3QgVCBhbGlnbihjb25zdCBUICZudW0sIGNvbnN0IFUgJmRlbikgeworICByZXR1cm4gKG51bSArIChUKShkZW4gLSAxKSkgJiAoVCkgfihkZW4gLSAxKTsKK30KKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpIHsgZGVJbml0RGVjb2RlcigpOyB9CisgIGJvb2wgaW5pdERlY29kZXIoKTsKKyAgYm9vbCBhbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSk7CisgIHZvaWQgZnJlZU91dHB1dEJ1ZmZlcigpOworICB2b2lkIGhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworIHByaXZhdGU6CisgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGUgPSBudWxscHRyOworICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgYm9vbCBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworI2lmZGVmIE1QRUc0CisgIE1QNERlY29kaW5nTW9kZSBtSW5wdXRNb2RlID0gTVBFRzRfTU9ERTsKKyAgc2l6ZV90IG1NYXhXaWR0aCA9IE1QRUc0X01BWF9XSURUSDsKKyAgc2l6ZV90IG1NYXhIZWlnaHQgPSBNUEVHNF9NQVhfSEVJR0hUOworI2Vsc2UKKyAgTVA0RGVjb2RpbmdNb2RlIG1JbnB1dE1vZGUgPSBIMjYzX01PREU7CisgIHNpemVfdCBtTWF4V2lkdGggPSBIMjYzX01BWF9XSURUSDsKKyAgc2l6ZV90IG1NYXhIZWlnaHQgPSBIMjYzX01BWF9IRUlHSFQ7CisjZW5kaWYKKyAgdWludDMyX3QgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICB1aW50MzJfdCBtV2lkdGggPSBERUZBVUxUX1dJRFRIOworICB1aW50MzJfdCBtSGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7Cit9OworCitib29sIENvZGVjOjppbml0RGVjb2RlcigpIHsKKyAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOworICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1EZWNIYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVjOjphbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSkgeworICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYWxsb2Mob3V0cHV0QnVmZmVyU2l6ZSkpOworICAgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWM6OmZyZWVPdXRwdXRCdWZmZXIoKSB7CisgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgIH0KKyAgfQorfQorCit2b2lkIENvZGVjOjpoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCkgeworICBpbnQzMl90IGRpc3BXaWR0aCwgZGlzcEhlaWdodDsKKyAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgJmRpc3BXaWR0aCwgJmRpc3BIZWlnaHQpOworCisgIGludDMyX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKKyAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsICZidWZXaWR0aCwgJmJ1ZkhlaWdodCk7CisKKyAgaWYgKGRpc3BXaWR0aCAhPSBtV2lkdGggfHwgZGlzcEhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgbVdpZHRoID0gZGlzcFdpZHRoOworICAgIG1IZWlnaHQgPSBkaXNwSGVpZ2h0OworICB9Cit9CisKK3ZvaWQgQ29kZWM6OmRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSA9IGFsaWduKG1NYXhXaWR0aCwgMTYpICogYWxpZ24obU1heEhlaWdodCwgMTYpICogMyAvIDI7CisgIHVpbnQ4X3QgKnN0YXJ0X2NvZGUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSk7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IHZvbEluZm9bXSA9IHsweDAwLCAweDAwLCAweDAxLCAweEIwfTsKKyAgYm9vbCB2b2xIZWFkZXIgPSBtZW1jbXAoc3RhcnRfY29kZSwgdm9sSW5mbywgNCkgPT0gMDsKKyAgaWYgKHZvbEhlYWRlcikgeworICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgfQorCisgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgdWludDhfdCAqdm9sRGF0YVsxXXt9OworICAgIGludDMyX3Qgdm9sU2l6ZSA9IDA7CisKKyAgICBpZiAodm9sSGVhZGVyKSB7IC8qIHJlbW92ZWQgc29tZSBjb2RlYyBjb25maWcgcGFydCAqLworICAgICAgdm9sRGF0YVswXSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKTsKKyAgICAgIHZvbFNpemUgPSBzaXplOworICAgIH0KKworICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUsIHZvbERhdGEsICZ2b2xTaXplLCBrTGF5ZXIsIG1NYXhXaWR0aCwgbU1heEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb2RlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1EZWNIYW5kbGUpOworICAgIGlmIChtSW5wdXRNb2RlICE9IGFjdHVhbE1vZGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKKyAgfQorICBzaXplX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICBpZiAob3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWFsbG9jT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlclNpemUpKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCBudW1EZWNvZGVDYWxscyA9IDA7CisgIHdoaWxlICgoc2l6ZSA+IDApICYmIChudW1EZWNvZGVDYWxscyA8IGtNYXhOdW1EZWNvZGVDYWxscykpIHsKKyAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICBQVlNldFJlZmVyZW5jZVlVVihtRGVjSGFuZGxlLCBtT3V0cHV0QnVmZmVyWzFdKTsKKyAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhlYWRlciBjb250YWlucyBuZXcgaW5mbywgZS5nLiwgd2lkdGgvaGVpZ2h0LCBldGMuCisgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKyAgICB1aW50MzJfdCB1c2VFeHRUaW1lc3RhbXAgPSAobnVtRGVjb2RlQ2FsbHMgPT0gMCk7CisgICAgaW50MzJfdCB0ZW1wU2l6ZSA9IChpbnQzMl90KXNpemU7CisgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgaWYgKFBWRGVjb2RlVm9wSGVhZGVyKG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0ZW1wU2l6ZSwgJmhlYWRlcl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlRXh0VGltZXN0YW1wLCBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCk7CisKKyAgICBQVkRlY29kZVZvcEJvZHkobURlY0hhbmRsZSwgJnRlbXBTaXplKTsKKyAgICB1aW50MzJfdCBieXRlc0NvbnN1bWVkID0gMTsKKyAgICBpZiAoc2l6ZSA+IHRlbXBTaXplKSB7CisgICAgICBieXRlc0NvbnN1bWVkID0gc2l6ZSAtIHRlbXBTaXplOworICAgIH0KKyAgICBkYXRhICs9IGJ5dGVzQ29uc3VtZWQ7CisgICAgc2l6ZSAtPSBieXRlc0NvbnN1bWVkOworICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgKytudW1EZWNvZGVDYWxsczsKKyAgfQorICBmcmVlT3V0cHV0QnVmZmVyKCk7Cit9CisKK3ZvaWQgQ29kZWM6OmRlSW5pdERlY29kZXIoKSB7CisgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgZGVsZXRlIG1EZWNIYW5kbGU7CisgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgZnJlZU91dHB1dEJ1ZmZlcigpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgNCkgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGNvZGVjLT5pbml0RGVjb2RlcigpKSB7CisgICAgY29kZWMtPmRlY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2VuY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2VuY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzMyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZW5jX2Z1enplci5jcHAKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCisKK2NvbnN0ZXhwciBpbnQ4X3Qga0lEUkZyYW1lUmVmcmVzaEludGVydmFsSW5TZWMgPSAxOworY29uc3RleHByIE1QNFJhdGVDb250cm9sVHlwZSBrcmNUeXBlW10gPSB7Q09OU1RBTlRfUSwgQ0JSXzEsIFZCUl8xLCBDQlJfMiwgVkJSXzIsIENCUl9MT1dERUxBWX07CisjaWZkZWYgTVBFRzQKK2NvbnN0ZXhwciBNUDRFbmNvZGluZ01vZGUga0VuY29kaW5nTW9kZVtdID0ge1NIT1JUX0hFQURFUiwgU0hPUlRfSEVBREVSX1dJVEhfRVJSX1JFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfUEFSVElUSU9OSU5HX01PREUsIENPTUJJTkVfTU9ERV9OT19FUlJfUkVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFU307Citjb25zdGV4cHIgc2l6ZV90IGtNYXhXaWR0aCA9IDEwMjQwOworY29uc3RleHByIHNpemVfdCBrTWF4SGVpZ2h0ID0gMTAyNDA7CisjZWxzZQorY29uc3RleHByIE1QNEVuY29kaW5nTW9kZSBrRW5jb2RpbmdNb2RlW10gPSB7SDI2M19NT0RFLCBIMjYzX01PREVfV0lUSF9FUlJfUkVTfTsKK2NvbnN0ZXhwciBpbnQga1dpZHRoW10gPSB7MTI4LCAxNzYsIDM1MiwgNzA0LCAxNDA4fTsKK2NvbnN0ZXhwciBpbnQga0hlaWdodFtdID0gezk2LCAxNDQsIDI4OCwgNTc2LCAxMTUyfTsKK2NvbnN0ZXhwciBzaXplX3Qga1dpZHRoTnVtID0gc3RkOjpzaXplKGtXaWR0aCk7Citjb25zdGV4cHIgc2l6ZV90IGtIZWlnaHROdW0gPSBzdGQ6OnNpemUoa0hlaWdodCk7CisjZW5kaWYKKworY29uc3RleHByIHNpemVfdCBrcmNUeXBlTnVtID0gc3RkOjpzaXplKGtyY1R5cGUpOworY29uc3RleHByIHNpemVfdCBrRW5jb2RpbmdNb2RlTnVtID0gc3RkOjpzaXplKGtFbmNvZGluZ01vZGUpOworY29uc3RleHByIHNpemVfdCBrTWF4UVAgPSA1MTsKKworZW51bSB7CisgICAgSURYX1dEX0JZVEVfMSwKKyAgICBJRFhfV0RfQllURV8yLAorICAgIElEWF9IVF9CWVRFXzEsCisgICAgSURYX0hUX0JZVEVfMiwKKyAgICBJRFhfRlJBTUVfUkFURSwKKyAgICBJRFhfUkNfVFlQRSwKKyAgICBJRFhfUEFDS0VUX1NJWkUsCisgICAgSURYX0lfRlJBTUVfUVAsCisgICAgSURYX1BfRlJBTUVfUVAsCisgICAgSURYX0VOQUJMRV9SVkxDLAorICAgIElEWF9RVUFOVF9UWVBFLAorICAgIElEWF9OT19GUkFNRV9TS0lQUEVEX0ZMQUcsCisgICAgSURYX0VOQUJMRV9TQ0VORV9ERVRFQ1QsCisgICAgSURYX05VTV9JTlRSQV9NQiwKKyAgICBJRFhfU0VBUkNIX1JBTkdFLAorICAgIElEWF9FTkFCTEVfTVZfOHg4LAorICAgIElEWF9VU0VfQUNfUFJFRCwKKyAgICBJRFhfSU5UUkFfRENfVkxDX1RIUkVTSE9MRCwKKyAgICBJRFhfRU5DX01PREUsCisgICAgSURYX0xBU1QKK307CisKK2NsYXNzIENvZGVjIHsKKyAgIHB1YmxpYzoKKyAgICBDb2RlYygpID0gZGVmYXVsdDsKKyAgICB+Q29kZWMoKSB7IGRlSW5pdEVuY29kZXIoKTsgfQorICAgIGJvb2wgaW5pdEVuY29kZXIoY29uc3QgdWludDhfdCAqZGF0YSk7CisgICAgdm9pZCBlbmNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZGVJbml0RW5jb2RlcigpOworCisgICBwcml2YXRlOgorICAgIGludDMyX3QgbUZyYW1lV2lkdGggPSAzNTI7CisgICAgaW50MzJfdCBtRnJhbWVIZWlnaHQgPSAyODg7CisgICAgZmxvYXQgbUZyYW1lUmF0ZSA9IDI1LjBmOworICAgIFZpZGVvRW5jT3B0aW9ucyAqbUVuY29kZUhhbmRsZSA9IG51bGxwdHI7CisgICAgVmlkZW9FbmNDb250cm9scyAqbUVuY29kZUNvbnRyb2wgPSBudWxscHRyOworfTsKKworYm9vbCBDb2RlYzo6aW5pdEVuY29kZXIoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIG1FbmNvZGVIYW5kbGUgPSBuZXcgVmlkZW9FbmNPcHRpb25zOworICAgIGlmICghbUVuY29kZUhhbmRsZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbXNldChtRW5jb2RlSGFuZGxlLCAwLCBzaXplb2YoVmlkZW9FbmNPcHRpb25zKSk7CisgICAgbUVuY29kZUNvbnRyb2wgPSBuZXcgVmlkZW9FbmNDb250cm9sczsKKyAgICBpZiAoIW1FbmNvZGVDb250cm9sKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtc2V0KG1FbmNvZGVDb250cm9sLCAwLCBzaXplb2YoVmlkZW9FbmNDb250cm9scykpOworICAgIFBWR2V0RGVmYXVsdEVuY09wdGlvbihtRW5jb2RlSGFuZGxlLCAwKTsKKworI2lmZGVmIE1QRUc0CisgICAgbUZyYW1lV2lkdGggPSAoKGRhdGFbSURYX1dEX0JZVEVfMV0gPDwgOCkgfCBkYXRhW0lEWF9XRF9CWVRFXzJdKSAlIGtNYXhXaWR0aDsKKyAgICBtRnJhbWVIZWlnaHQgPSAoKGRhdGFbSURYX0hUX0JZVEVfMV0gPDwgOCkgfCBkYXRhW0lEWF9IVF9CWVRFXzJdKSAlIGtNYXhIZWlnaHQ7CisjZWxzZQorICAgIG1GcmFtZVdpZHRoID0ga1dpZHRoW2RhdGFbSURYX1dEX0JZVEVfMV0gJSBrV2lkdGhOdW1dOworICAgIG1GcmFtZUhlaWdodCA9IGtIZWlnaHRbZGF0YVtJRFhfSFRfQllURV8xXSAlIGtIZWlnaHROdW1dOworI2VuZGlmCisgICAgbUZyYW1lUmF0ZSA9IGRhdGFbSURYX0ZSQU1FX1JBVEVdOworICAgIG1FbmNvZGVIYW5kbGUtPnJjVHlwZSA9IGtyY1R5cGVbZGF0YVtJRFhfUkNfVFlQRV0gJSBrcmNUeXBlTnVtXTsKKyAgICBtRW5jb2RlSGFuZGxlLT5wcm9maWxlX2xldmVsID0gQ09SRV9QUk9GSUxFX0xFVkVMMjsKKyAgICBtRW5jb2RlSGFuZGxlLT5wYWNrZXRTaXplID0gZGF0YVtJRFhfUEFDS0VUX1NJWkVdOworICAgIG1FbmNvZGVIYW5kbGUtPmlRdWFudFswXSA9IChkYXRhW0lEWF9JX0ZSQU1FX1FQXSAlIGtNYXhRUCkgKyAxOworICAgIG1FbmNvZGVIYW5kbGUtPnBRdWFudFswXSA9IChkYXRhW0lEWF9QX0ZSQU1FX1FQXSAlIGtNYXhRUCkgKyAxOworICAgIG1FbmNvZGVIYW5kbGUtPnJ2bGNFbmFibGUgPSAoZGF0YVtJRFhfRU5BQkxFX1JWTENdICYgMHgwMSkgPyBQVl9PRkYgOiBQVl9PTjsKKyAgICBtRW5jb2RlSGFuZGxlLT5xdWFudFR5cGVbMF0gPSAoZGF0YVtJRFhfUVVBTlRfVFlQRV0gJiAweDAxKSA/IDAgOiAxOworICAgIG1FbmNvZGVIYW5kbGUtPm5vRnJhbWVTa2lwcGVkID0gKGRhdGFbSURYX05PX0ZSQU1FX1NLSVBQRURfRkxBR10gJiAweDAxKSA/IFBWX09GRiA6IFBWX09OOworICAgIG1FbmNvZGVIYW5kbGUtPnNjZW5lRGV0ZWN0ID0gKGRhdGFbSURYX0VOQUJMRV9TQ0VORV9ERVRFQ1RdICYgMHgwMSkgPyBQVl9PRkYgOiBQVl9PTjsKKyAgICBtRW5jb2RlSGFuZGxlLT5udW1JbnRyYU1CID0gZGF0YVtJRFhfTlVNX0lOVFJBX01CXSAmIDB4MDc7CisgICAgbUVuY29kZUhhbmRsZS0+c2VhcmNoUmFuZ2UgPSBkYXRhW0lEWF9TRUFSQ0hfUkFOR0VdICYgMHgxRjsKKyAgICBtRW5jb2RlSGFuZGxlLT5tdjh4OEVuYWJsZSA9IChkYXRhW0lEWF9FTkFCTEVfTVZfOHg4XSAmIDB4MDEpID8gUFZfT0ZGIDogUFZfT047CisgICAgbUVuY29kZUhhbmRsZS0+dXNlQUNQcmVkID0gKGRhdGFbSURYX1VTRV9BQ19QUkVEXSAmIDB4MDEpID8gUFZfT0ZGIDogUFZfT047CisgICAgbUVuY29kZUhhbmRsZS0+aW50cmFEQ1ZsY1RoID0gZGF0YVtJRFhfSU5UUkFfRENfVkxDX1RIUkVTSE9MRF0gJiAweDA3OworICAgIG1FbmNvZGVIYW5kbGUtPmVuY01vZGUgPSBrRW5jb2RpbmdNb2RlW2RhdGFbSURYX0VOQ19NT0RFXSAlIGtFbmNvZGluZ01vZGVOdW1dOworICAgIG1FbmNvZGVIYW5kbGUtPmVuY1dpZHRoWzBdID0gbUZyYW1lV2lkdGg7CisgICAgbUVuY29kZUhhbmRsZS0+ZW5jSGVpZ2h0WzBdID0gbUZyYW1lSGVpZ2h0OworICAgIG1FbmNvZGVIYW5kbGUtPmVuY0ZyYW1lUmF0ZVswXSA9IG1GcmFtZVJhdGU7CisgICAgbUVuY29kZUhhbmRsZS0+dGlja1BlclNyYyA9IG1FbmNvZGVIYW5kbGUtPnRpbWVJbmNSZXMgLyBtRnJhbWVSYXRlOworICAgIG1FbmNvZGVIYW5kbGUtPmludHJhUGVyaW9kID0gKGtJRFJGcmFtZVJlZnJlc2hJbnRlcnZhbEluU2VjICogbUZyYW1lUmF0ZSk7CisgICAgaWYgKCFQVkluaXRWaWRlb0VuY29kZXIobUVuY29kZUNvbnRyb2wsIG1FbmNvZGVIYW5kbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWM6OmRlSW5pdEVuY29kZXIoKSB7CisgICAgaWYgKG1FbmNvZGVDb250cm9sKSB7CisgICAgICAgIFBWQ2xlYW5VcFZpZGVvRW5jb2RlcihtRW5jb2RlQ29udHJvbCk7CisgICAgICAgIGRlbGV0ZSBtRW5jb2RlQ29udHJvbDsKKyAgICAgICAgbUVuY29kZUNvbnRyb2wgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUVuY29kZUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUVuY29kZUhhbmRsZTsKKyAgICAgICAgbUVuY29kZUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIENvZGVjOjplbmNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgaW5wdXRCdWZmZXJTaXplID0gKG1GcmFtZVdpZHRoICogbUZyYW1lSGVpZ2h0ICogMykgLyAyOworICAgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplID0gaW5wdXRCdWZmZXJTaXplICogMjsKKyAgICB1aW50OF90ICpvdXRwdXRCdWZmZXIgPSBuZXcgdWludDhfdFtvdXRwdXRCdWZmZXJTaXplXTsKKyAgICB1aW50OF90ICppbnB1dEJ1ZmZlciA9IG5ldyB1aW50OF90W2lucHV0QnVmZmVyU2l6ZV07CisKKyAgICAvLyBHZXQgVk9MIGhlYWRlci4KKyAgICBpbnQzMl90IHNpemVPdXRwdXRCdWZmZXIgPSBvdXRwdXRCdWZmZXJTaXplOworICAgIFBWR2V0Vm9sSGVhZGVyKG1FbmNvZGVDb250cm9sLCBvdXRwdXRCdWZmZXIsICZzaXplT3V0cHV0QnVmZmVyLCAwKTsKKworICAgIHNpemVfdCBudW1GcmFtZSA9IDA7CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIHNpemVfdCBieXRlc0NvbnN1bWVkID0gc3RkOjptaW4oc2l6ZSwgaW5wdXRCdWZmZXJTaXplKTsKKyAgICAgICAgbWVtY3B5KGlucHV0QnVmZmVyLCBkYXRhLCBieXRlc0NvbnN1bWVkKTsKKyAgICAgICAgaWYgKGJ5dGVzQ29uc3VtZWQgPCBpbnB1dEJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG1lbXNldChpbnB1dEJ1ZmZlciArIGJ5dGVzQ29uc3VtZWQsIGRhdGFbMF0sIGlucHV0QnVmZmVyU2l6ZSAtIGJ5dGVzQ29uc3VtZWQpOworICAgICAgICB9CisgICAgICAgIFZpZGVvRW5jRnJhbWVJTyB2aWRlb0lue30sIHZpZGVvT3V0e307CisgICAgICAgIHZpZGVvSW4uaGVpZ2h0ID0gbUZyYW1lSGVpZ2h0OworICAgICAgICB2aWRlb0luLnBpdGNoID0gbUZyYW1lV2lkdGg7CisgICAgICAgIHZpZGVvSW4udGltZXN0YW1wID0gKG51bUZyYW1lICogMTAwMCkgLyBtRnJhbWVSYXRlOworICAgICAgICB2aWRlb0luLnlDaGFuID0gaW5wdXRCdWZmZXI7CisgICAgICAgIHZpZGVvSW4udUNoYW4gPSB2aWRlb0luLnlDaGFuICsgdmlkZW9Jbi5oZWlnaHQgKiB2aWRlb0luLnBpdGNoOworICAgICAgICB2aWRlb0luLnZDaGFuID0gdmlkZW9Jbi51Q2hhbiArICgodmlkZW9Jbi5oZWlnaHQgKiB2aWRlb0luLnBpdGNoKSA+PiAyKTsKKyAgICAgICAgdWludDMyX3QgbW9kVGltZU1zID0gMDsKKyAgICAgICAgaW50MzJfdCBkYXRhTGVuZ3RoID0gb3V0cHV0QnVmZmVyU2l6ZTsKKyAgICAgICAgaW50MzJfdCBuTGF5ZXIgPSAwOworICAgICAgICBQVkVuY29kZVZpZGVvRnJhbWUobUVuY29kZUNvbnRyb2wsICZ2aWRlb0luLCAmdmlkZW9PdXQsICZtb2RUaW1lTXMsIG91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhTGVuZ3RoLCAmbkxheWVyKTsKKyAgICAgICAgTVA0SGludFRyYWNrIGhpbnRUcmFjazsKKyAgICAgICAgUFZHZXRIaW50VHJhY2sobUVuY29kZUNvbnRyb2wsICZoaW50VHJhY2spOworICAgICAgICBQVkdldE92ZXJydW5CdWZmZXIobUVuY29kZUNvbnRyb2wpOworICAgICAgICArK251bUZyYW1lOworICAgICAgICBkYXRhICs9IGJ5dGVzQ29uc3VtZWQ7CisgICAgICAgIHNpemUgLT0gYnl0ZXNDb25zdW1lZDsKKyAgICB9CisgICAgZGVsZXRlW10gaW5wdXRCdWZmZXI7CisgICAgZGVsZXRlW10gb3V0cHV0QnVmZmVyOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPCBJRFhfTEFTVCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGNvZGVjLT5pbml0RW5jb2RlcihkYXRhKSkgeworICAgICAgICBkYXRhICs9IElEWF9MQVNUOworICAgICAgICBzaXplIC09IElEWF9MQVNUOworICAgICAgICBjb2RlYy0+ZW5jb2RlRnJhbWVzKGRhdGEsIHNpemUpOworICAgIH0KKyAgICBkZWxldGUgY29kZWM7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2YwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMTUgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOnRydWUsCisgICAgc3JjczogWworICAgICAgICAic3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2NyYy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2dldGJpdHMuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2dldF9zaWRlX2luZm8uY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2h1ZmZtYW5fZGVjb2RpbmcuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM190YWJsZXMuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19pbWRjdF9zeW50aC5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX21kY3RfNi5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RjdF82LmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19lcXVhbGl6ZXIuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19zZWVrX3N5bmNoLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19yZW9yZGVyLmNwcCIsCisKKyAgICAgICAgInNyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX21kY3RfMTguY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19kY3RfOS5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RjdF8xNi5jcHAiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgZXhjbHVkZV9zcmNzOiBbCisgICAgICAgICAgICAgICAgInNyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5jcHAiLAorICAgICAgICAgICAgICAgICJzcmMvcHZtcDNfbWRjdF8xOC5jcHAiLAorICAgICAgICAgICAgICAgICJzcmMvcHZtcDNfZGN0XzkuY3BwIiwKKyAgICAgICAgICAgICAgICAic3JjL3B2bXAzX2RjdF8xNi5jcHAiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIHNyY3M6IFsKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vcHZtcDNfbWRjdF8xOF9nY2MucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vcHZtcDNfZGN0XzlfZ2NjLnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL3B2bXAzX2RjdF8xNl9nY2MucyIsCisgICAgICAgICAgICBdLAorCisgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIl0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICAgICAgInNyYyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcDNkZWNfdGVzdCIsCisgICAgZ3Rlc3Q6IGZhbHNlLAorCisgICAgc3JjczogWworICAgICAgICAidGVzdC9tcDNkZWNfdGVzdC5jcHAiLAorICAgICAgICAidGVzdC9tcDNyZWFkZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAic3JjIiwKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICAgICAgImxpYnNuZGZpbGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJhdWRpb3V0aWxzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL05PVElDRSBiL21lZGlhL2NvZGVjcy9tcDNkZWMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tcDNkZWMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWNzL21wM2RlYy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmNDMxNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsOSBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYworeworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIk1wM0RlY29kZXJUZXN0In0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmYTFlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDNfZGVjX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibXAzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGQ1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X21wM2RlYyBkZWNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBtcDMgZGVjb2RlciBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKKworVGhpcyBmdXp6ZXIgbWFrZXMgdXNlIG9mIHRoZSBmb2xsb3dpbmcgY29uZmlnIHBhcmFtZXRlcnM6CisxLiBFcXVhbGl6ZXIgdHlwZSAocGFyYW1ldGVyIG5hbWU6IGBlcXVhbGl6ZXJUeXBlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBlcXVhbGl6ZXJUeXBlYCB8IDAuIGBmbGF0IGAgMS4gYGJhc3NfYm9vc3QgYCAyLiBgcm9jayBgIDMuIGBwb3AgYCA0LiBgamF6eiBgIDUuIGBjbGFzc2ljYWwgYCA2LiBgdGFsayBgIDcuIGBmbGF0XyBgIHwgQml0cyAwLCAxIGFuZCAyIG9mIGZpcnN0IGJ5dGUgb2YgaW5wdXQgc3RyZWFtIHwKK3wgYGNyY0VuYWJsZWRgIHwgMC4gYGZhbHNlIGAgMS4gYHRydWUgYHwgQml0IDAgb2Ygc2Vjb25kIGJ5dGUgb2YgaW5wdXQgc3RyZWFtIHwKKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIHVzaW5nIGEgbG9vcC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgdGhlIG51bWJlcgorICAgb2YgYnl0ZXMgdXNlZCBieSB0aGUgZGVjb2Rlci4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgMSBieXRlCisgICB0aWxsIGl0IHJlYWNoZXMgYSB2YWxpZCBmcmFtZSBvciBlbmQgb2Ygc3RyZWFtLgorCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wM19kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcDNfZGVjX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1wMyBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXAzX2RlY19mdXp6ZXIvbXAzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvbXAzX2RlY19mdXp6ZXIvbXAzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvbXAzX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvbXAzX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0N2M4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9tcDNfZGVjX2Z1enplci5jcHAKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8cHZtcDNkZWNvZGVyX2FwaS5oPgorCitjb25zdGV4cHIgaW50IGtNYXhGcmFtZVNhbXBsZXMgPSA0NjA4OworY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSAyOworY29uc3RleHByIGVfZXF1YWxpemF0aW9uIGtFcXVhbGl6ZXJUeXBlc1tdID0ge2ZsYXQsIGJhc3NfYm9vc3QsIHJvY2ssIHBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXp6LCBjbGFzc2ljYWwsICB0YWxrLCBmbGF0X307CisKK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLCB1aW50MzJfdCAqb3V0X251bV9zYW1wbGVzID0gbnVsbHB0cikgeworICAqZnJhbWVfc2l6ZSA9IDA7CisgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgaWYgKG91dF9jaGFubmVscykgKm91dF9jaGFubmVscyA9IDA7CisgIGlmIChvdXRfYml0cmF0ZSkgKm91dF9iaXRyYXRlID0gMDsKKyAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDA7CisKKyAgaWYgKChoZWFkZXIgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgIGlmICh2ZXJzaW9uID09IDB4MDEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgIGlmIChsYXllciA9PSAweDAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHs0NDEwMCwgNDgwMDAsIDMyMDAwfTsKKyAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgIH0KKworICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7CisKKyAgaWYgKGxheWVyID09IDMpIHsgIC8vIGxheWVyIEkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9IHszMiwgIDY0LCAgOTYsICAxMjgsIDE2MCwgMTkyLCAyMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4fTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHszMiwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsICAxMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2fTsKKworICAgIGludCBiaXRyYXRlID0KKyAgICAgICAgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXSA6IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgIH0KKyAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OworICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAzODQ7CisgICAgfQorICB9IGVsc2UgeyAgLy8gbGF5ZXIgSUkgb3IgSUlJCisgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9IHszMiwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsICAxMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODR9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPSB7MzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjB9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0gezgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MH07CisgICAgaW50IGJpdHJhdGU7CisgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgYml0cmF0ZSA9CisgICAgICAgICAgKGxheWVyID09IDIgLyogTDIgKi8pID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXSA6IGtCaXRyYXRlVjFMM1tiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIFYyIChvciAyLjUpCisgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICB9CisKKyAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICB9IGVsc2UgeyAgLy8gVjIgb3IgVjIuNQorICAgICAgc2l6ZV90IHRtcCA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDcyMDAwIDogMTQ0MDAwOworICAgICAgKmZyYW1lX3NpemUgPSB0bXAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgfQorICB9CisKKyAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgfQorCisgIGlmIChvdXRfY2hhbm5lbHMpIHsKKyAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgVTMyX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBib29sIGNoZWNrSGVhZGVyKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUpIHsKKyAgc2l6ZV90IGZyYW1lU2l6ZTsKKyAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKyAgYm9vbCBpc1ZhbGlkQnVmZmVyID0gZmFsc2U7CisKKyAgd2hpbGUgKHRvdGFsSW5TaXplICsgNCA8IGluU2l6ZSkgeworICAgIGlzVmFsaWRCdWZmZXIgPSB0cnVlOworICAgIHVpbnQzMl90IHZhbCA9IFUzMl9BVChoZWFkZXIgKyB0b3RhbEluU2l6ZSk7CisgICAgaWYgKCFwYXJzZU1wM0hlYWRlcih2YWwsICZmcmFtZVNpemUsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRvdGFsSW5TaXplICs9IGZyYW1lU2l6ZTsKKyAgfQorCisgIHJldHVybiAoaXNWYWxpZEJ1ZmZlcik7Cit9CisKK2NsYXNzIENvZGVjIHsKKyBwdWJsaWM6CisgIENvZGVjKCkgPSBkZWZhdWx0OworICB+Q29kZWMoKSB7IGRlSW5pdERlY29kZXIoKTsgfQorCisgIGJvb2wgaW5pdERlY29kZXIoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXModWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworIHByaXZhdGU6CisgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZyA9IG51bGxwdHI7CisgIHZvaWQgKm1EZWNvZGVyQnVmID0gbnVsbHB0cjsKK307CisKK2Jvb2wgQ29kZWM6OmluaXREZWNvZGVyKCkgeworICBtQ29uZmlnID0gbmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbHt9OworICBpZiAoIW1Db25maWcpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc2l6ZV90IGRlY29kZXJCdWZTaXplID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhkZWNvZGVyQnVmU2l6ZSk7CisgIGlmICghbURlY29kZXJCdWYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1EZWNvZGVyQnVmLCAweDAsIGRlY29kZXJCdWZTaXplKTsKKyAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHVpbnQ4X3QgZXF1YWxpemVyVHlwZVZhbHVlID0gKGRhdGFbMF0gJiAweDcpOworICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0ga0VxdWFsaXplclR5cGVzW2VxdWFsaXplclR5cGVWYWx1ZV07CisgIG1Db25maWctPmNyY0VuYWJsZWQgPSBkYXRhWzFdICYgMHgxOworCisgIHdoaWxlIChzaXplID4gMCkgeworICAgIGJvb2wgc3RhdHVzID0gY2hlY2tIZWFkZXIoZGF0YSwgc2l6ZSk7CisgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgIHNpemUtLTsKKyAgICAgIGRhdGErKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBzaXplX3Qgb3V0QnVmU2l6ZSA9IGtNYXhGcmFtZVNhbXBsZXMgKiBrTWF4Q2hhbm5lbHM7CisgICAgc2l6ZV90IHVzZWRCeXRlcyA9IDA7CisgICAgaW50MTZfdCBvdXRwdXRCdWZbb3V0QnVmU2l6ZV07CisgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gc2l6ZTsKKyAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKyAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBkYXRhOworICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSBvdXRwdXRCdWY7CisgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gb3V0QnVmU2l6ZSAvIHNpemVvZihpbnQxNl90KTsKKworICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKKyAgICBkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBpZiAoZGVjb2RlckVyciAhPSBOT19ERUNPRElOR19FUlJPUikgeworICAgICAgc2l6ZS0tOworICAgICAgZGF0YSsrOworICAgIH0gZWxzZSB7CisgICAgICB1c2VkQnl0ZXMgPSBzdGQ6Om1pbigoaW50MzJfdClzaXplLCBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGgpOworICAgICAgc2l6ZSAtPSB1c2VkQnl0ZXM7CisgICAgICBkYXRhICs9IHVzZWRCeXRlczsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb2RlYzo6ZGVJbml0RGVjb2RlcigpIHsKKyAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICB9CisgIGRlbGV0ZSBtQ29uZmlnOworICBtQ29uZmlnID0gbnVsbHB0cjsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9pbmNsdWRlL21wM19kZWNvZGVyX3NlbGVjdGlvbi5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9pbmNsdWRlL21wM19kZWNvZGVyX3NlbGVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvbXAzX2RlY29kZXJfc2VsZWN0aW9uLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9tcDNfZGVjb2Rlcl9zZWxlY3Rpb24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzX2F1ZGlvX3R5cGVfZGVmcy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzX2F1ZGlvX3R5cGVfZGVmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvcHZtcDNfYXVkaW9fdHlwZV9kZWZzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM19hdWRpb190eXBlX2RlZnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM2RlY29kZXJfYXBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM2RlY29kZXJfYXBpLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM2RlY29kZXJfYXBpLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF8xNl9nY2MucyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfMTZfZ2NjLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfMTZfZ2NjLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfMTZfZ2NjLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfOV9nY2MucyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfOV9nY2MucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF85X2djYy5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfZ2NjLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2djYy5zIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX21kY3RfMThfZ2NjLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2djYy5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF9nY2MucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvbXAzX21lbV9mdW5jcy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvbXAzX21lbV9mdW5jcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9tcDNfbWVtX2Z1bmNzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL21wM19tZW1fZnVuY3MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzX2h1ZmZtYW4uaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM19odWZmbWFuLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM19odWZmbWFuLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM19odWZmbWFuLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3AuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybV9nY2MuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtX2djYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybV9nY2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9hcm1fZ2NjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfY19lcXVpdmFsZW50LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2NfZXF1aXZhbGVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2NfZXF1aXZhbGVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2NfZXF1aXZhbGVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX21zY19ldmMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfbXNjX2V2Yy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX21zY19ldmMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9tc2NfZXZjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfYWxpYXNfcmVkdWN0aW9uLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfY3JjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzE2LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF82LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF82LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfNi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF85LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF85LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzkuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfOS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY19kZWZzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNfZGVmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNfZGVmcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNfZGVmcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2h1ZmZfY3cuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZXF1YWxpemVyLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZXF1YWxpemVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19lcXVhbGl6ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkMmZlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKQEAgLTAsMCArMSw4MzUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFBhY2tldFZpZGVvIENvcnAuCisgICBNUDMgRGVjb2RlciBMaWJyYXJ5CisKKyAgIEZpbGVuYW1lOiBwdm1wM19mcmFtZWRlY29kZXIuY3BwCisKKyAgIEZ1bmN0aW9uczoKKyAgICBwdm1wM19mcmFtZWRlY29kZXIKKyAgICBwdm1wM19Jbml0RGVjb2RlcgorICAgIHB2bXAzX3Jlc2V0RGVjb2RlcgorCisgICAgRGF0ZTogMDkvMjEvMjAwNworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVZJU0lPTiBISVNUT1JZCisKKworIERlc2NyaXB0aW9uOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCisKK0lucHV0CisgICAgcEV4dCA9IHBvaW50ZXIgdG8gdGhlIGV4dGVybmFsIGludGVyZmFjZSBzdHJ1Y3R1cmUuIFNlZSB0aGUgZmlsZQorICAgICAgICAgICBwdm1wM2RlY29kZXJfYXBpLmggZm9yIGEgZGVzY3JpcHRpb24gb2YgZWFjaCBmaWVsZC4KKyAgICAgICAgICAgRGF0YSB0eXBlIG9mIHBvaW50ZXIgdG8gYSB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwKKyAgICAgICAgICAgc3RydWN0dXJlLgorCisgICAgcE1lbSA9IHZvaWQgcG9pbnRlciB0byBoaWRlIHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeQorICAgICAgICAgICBJdCBpcyBjYXN0IGJhY2sgdG8gYSB0bXAzZGVjX2ZpbGUgc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZQorICAgICAgICAgICBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIHBlcnNpc3QgYmV0d2VlbiBjYWxscyB0bworICAgICAgICAgICB0aGlzIGZ1bmN0aW9uLCBvciBpcyB0b28gYmlnIHRvIGJlIHBsYWNlZCBvbiB0aGUgc3RhY2ssIGV2ZW4KKyAgICAgICAgICAgdGhvdWdoIHRoZSBkYXRhIGlzIG9ubHkgbmVlZGVkIGR1cmluZyBleGVjdXRpb24gb2YgdGhpcyBmdW5jdGlvbgorICAgICAgICAgICBEYXRhIHR5cGUgdm9pZCBwb2ludGVyLCBpbnRlcm5hbGx5IHBvaW50ZXIgdG8gYSB0bXAzZGVjX2ZpbGUKKyAgICAgICAgICAgc3RydWN0dXJlLgorCisKKyBPdXRwdXRzOgorICAgICBzdGF0dXMgPSBFUlJPUiBjb25kaXRpb24uICBzZWUgc3RydWN0dXJlICBFUlJPUl9DT0RFCisKKyBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKKyAgICBwTWVtIGNvbnRlbnRzIGFyZSBtb2RpZmllZC4KKyAgICBwRXh0OiAobW9yZSBkZXRhaWwgaW4gdGhlIGZpbGUgcHZtcDNkZWNvZGVyX2FwaS5oKQorICAgIGlucHV0QnVmZmVyVXNlZExlbmd0aCAtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB1c2VkIHVwIGJ5IHRoZSBzdHJlYW0uCisgICAgc2FtcGxpbmdSYXRlIC0gc2FtcGxpbmcgcmF0ZSBpbiBzYW1wbGVzIHBlciBzZWMKKyAgICBiaXRSYXRlIC0gYml0IHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLCB2YXJpZXMgZnJhbWUgdG8gZnJhbWUuCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTlMgREVTQ1JJUFRJT04KKworICAgIHB2bXAzX2ZyYW1lZGVjb2RlcgorICAgICAgICBmcmFtZSBkZWNvZGVyIGxpYnJhcnkgZHJpdmVyCisgICAgcHZtcDNfSW5pdERlY29kZXIKKyAgICAgICAgRGVjb2RlciBJbml0aWFsaXphdGlvbgorICAgIHB2bXAzX3Jlc2V0RGVjb2RlcgorICAgICAgICBSZXNldCBEZWNvZGVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFUVVJUkVNRU5UUworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFRkVSRU5DRVMKKworIFsxXSBJU08gTVBFRyBBdWRpbyBTdWJncm91cCBTb2Z0d2FyZSBTaW11bGF0aW9uIEdyb3VwICgxOTk2KQorICAgICBJU08gMTM4MTgtMyBNUEVHLTIgQXVkaW8gRGVjb2RlciAtIExvd2VyIFNhbXBsaW5nIEZyZXF1ZW5jeSBFeHRlbnNpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUFNFVURPLUNPREUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJTkNMVURFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2luY2x1ZGUgInB2bXAzX2ZyYW1lZGVjb2Rlci5oIgorI2luY2x1ZGUgInB2bXAzX2RlY19kZWZzLmgiCisjaW5jbHVkZSAicHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuaCIKKyNpbmNsdWRlICJwdm1wM190YWJsZXMuaCIKKyNpbmNsdWRlICJwdm1wM19pbWRjdF9zeW50aC5oIgorI2luY2x1ZGUgInB2bXAzX2FsaWFzX3JlZHVjdGlvbi5oIgorI2luY2x1ZGUgInB2bXAzX3Jlb3JkZXIuaCIKKyNpbmNsdWRlICJwdm1wM19kZXF1YW50aXplX3NhbXBsZS5oIgorI2luY2x1ZGUgInB2bXAzX3N0ZXJlb19wcm9jLmgiCisjaW5jbHVkZSAicHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuaCIKKyNpbmNsdWRlICJwdm1wM19nZXRfc2lkZV9pbmZvLmgiCisjaW5jbHVkZSAicHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuaCIKKyNpbmNsdWRlICJwdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5oIgorI2luY2x1ZGUgInB2bXAzX2RlY29kZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJwdm1wM19nZXRfbWFpbl9kYXRhX3NpemUuaCIKKyNpbmNsdWRlICJzX3RtcDNkZWNfZmlsZS5oIgorI2luY2x1ZGUgInB2bXAzX2dldGJpdHMuaCIKKyNpbmNsdWRlICJtcDNfbWVtX2Z1bmNzLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1BQ1JPUworOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgREVGSU5FUworOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAorOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUworOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKKzsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCis7IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCis7IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFUlJPUl9DT0RFIHB2bXAzX2ZyYW1lZGVjb2Rlcih0UFZNUDNEZWNvZGVyRXh0ZXJuYWwgKnBFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcE1lbSkKK3sKKworICAgIEVSUk9SX0NPREUgICAgICAgIGVycm9yQ29kZSAgPSBOT19ERUNPRElOR19FUlJPUjsKKworICAgIGludDMyICAgY3JjX2Vycm9yX2NvdW50ID0gMDsKKyAgICB1aW50MzIgIHNlbnRfY3JjID0gMDsKKyAgICB1aW50MzIgIGNvbXB1dGVkX2NyYyA9IDA7CisKKyAgICB0bXAzZGVjX2NoYW4gICAqcENoVmFyc1tDSEFOXTsKKyAgICB0bXAzZGVjX2ZpbGUgICAqcFZhcnMgPSAodG1wM2RlY19maWxlICopcE1lbTsKKworICAgIG1wM0hlYWRlciBpbmZvX2RhdGE7CisgICAgbXAzSGVhZGVyICppbmZvID0gJmluZm9fZGF0YTsKKworICAgIHBWYXJzLT5pbnB1dFN0cmVhbS5wQnVmZmVyICA9IHBFeHQtPnBJbnB1dEJ1ZmZlcjsKKworCisgICAgcFZhcnMtPmlucHV0U3RyZWFtLnVzZWRCaXRzICA9IHBFeHQtPmlucHV0QnVmZmVyVXNlZExlbmd0aCA8PCAzOworICAgIHBWYXJzLT5pbnB1dFN0cmVhbS5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggID0gcEV4dC0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoOworCisKKyAgICBlcnJvckNvZGUgPSBwdm1wM19kZWNvZGVfaGVhZGVyKCZwVmFycy0+aW5wdXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXB1dGVkX2NyYyk7CisKKyAgICBpZiAoZXJyb3JDb2RlICE9IE5PX0RFQ09ESU5HX0VSUk9SKQorICAgIHsKKyAgICAgICAgcEV4dC0+b3V0cHV0RnJhbWVTaXplID0gMDsKKyAgICAgICAgcmV0dXJuIGVycm9yQ29kZTsKKyAgICB9CisKKyAgICBwVmFycy0+bnVtX2NoYW5uZWxzID0gKGluZm8tPm1vZGUgPT0gTVBHX01EX01PTk8pID8gMSA6IDI7CisgICAgcEV4dC0+bnVtX2NoYW5uZWxzID0gcFZhcnMtPm51bV9jaGFubmVsczsKKworICAgIGludDMyIG91dHB1dEZyYW1lU2l6ZSA9IChpbmZvLT52ZXJzaW9uX3ggPT0gTVBFR18xKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIFNVQkJBTkRTX05VTUJFUiAqIEZJTFRFUkJBTktfQkFORFMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQkJBTkRTX05VTUJFUiAqIEZJTFRFUkJBTktfQkFORFM7CisKKyAgICBvdXRwdXRGcmFtZVNpemUgPSAoaW5mby0+bW9kZSA9PSBNUEdfTURfTU9OTykgPyBvdXRwdXRGcmFtZVNpemUgOiBvdXRwdXRGcmFtZVNpemUgPDwgMTsKKworCisgICAgLyoKKyAgICAgKiAgQ2hlY2sgaWYgb3V0cHV0IGJ1ZmZlciBoYXMgZW5vdWdoIHJvb20gdG8gaG9sZCBvdXRwdXQgUENNCisgICAgICovCisgICAgaWYgKHBFeHQtPm91dHB1dEZyYW1lU2l6ZSA+PSBvdXRwdXRGcmFtZVNpemUpCisgICAgeworICAgICAgICBwRXh0LT5vdXRwdXRGcmFtZVNpemUgPSBvdXRwdXRGcmFtZVNpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBFeHQtPm91dHB1dEZyYW1lU2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBPVVRQVVRfQlVGRkVSX1RPT19TTUFMTDsKKyAgICB9CisKKworICAgIHBDaFZhcnNbIExFRlRdID0gJnBWYXJzLT5wZXJDaGFuWyBMRUZUXTsKKyAgICBwQ2hWYXJzW1JJR0hUXSA9ICZwVmFycy0+cGVyQ2hhbltSSUdIVF07CisKKworCisKKyAgICBpZiAoaW5mby0+ZXJyb3JfcHJvdGVjdGlvbikKKyAgICB7CisgICAgICAgIGlmICghYml0c0F2YWlsYWJsZSgmcFZhcnMtPmlucHV0U3RyZWFtLCAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTSURFX0lORk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAgR2V0IGNyYyBjb250ZW50CisgICAgICAgICAqLworICAgICAgICBzZW50X2NyYyA9IGdldFVwVG8xN2JpdHMoJnBWYXJzLT5pbnB1dFN0cmVhbSwgMTYpOworICAgIH0KKworCisgICAgaWYgKGluZm8tPmxheWVyX2Rlc2NyaXB0aW9uID09IDMpCisgICAgeworICAgICAgICBpbnQzMiBncjsKKyAgICAgICAgaW50MzIgY2g7CisgICAgICAgIHVpbnQzMiBtYWluX2RhdGFfZW5kOworICAgICAgICBpbnQzMiBieXRlc190b19kaXNjYXJkOworICAgICAgICBpbnQxNiAqcHRyT3V0QnVmZmVyID0gcEV4dC0+cE91dHB1dEJ1ZmZlcjsKKworICAgICAgICAvKgorICAgICAgICAgKiBTaWRlIEluZm9ybWF0aW9uIG11c3QgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGJpdHN0cmVhbSBhbmQgc3RvcmUgZm9yIHVzZQorICAgICAgICAgKiBkdXJpbmcgdGhlIGRlY29kZWQgb2YgdGhlIGFzc29jaWF0ZWQgZnJhbWUKKyAgICAgICAgICovCisKKyAgICAgICAgZXJyb3JDb2RlID0gcHZtcDNfZ2V0X3NpZGVfaW5mbygmcFZhcnMtPmlucHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHV0ZWRfY3JjKTsKKworICAgICAgICBpZiAoZXJyb3JDb2RlICE9IE5PX0RFQ09ESU5HX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgICBwRXh0LT5vdXRwdXRGcmFtZVNpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIGVycm9yQ29kZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBJZiBDUkMgd2FzIHNlbnQsIGNoZWNrIHRoYXQgbWF0Y2hlcyB0aGUgb25lIGdvdCB3aGlsZSBwYXJzaW5nIGRhdGEKKyAgICAgICAgICogIGRpc2FibGUgY3JjIGlmIHRoaXMgaXMgdGhlIGRlc2lyZWQgbW9kZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGluZm8tPmVycm9yX3Byb3RlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoY29tcHV0ZWRfY3JjICE9IHNlbnRfY3JjKSAmJiBwRXh0LT5jcmNFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNyY19lcnJvcl9jb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogbWFpbiBkYXRhIChzY2FsZWZhY3RvcnMsIEh1ZmZtYW4gY29kZWQsIGV0YywpIGFyZSBub3QgbmVjZXNzYXJpbHkgbG9jYXRlZAorICAgICAgICAgKiBhZGphY2VudCB0byB0aGUgc2lkZS1pbmZvLiBCZWdpbm5pbmcgb2YgbWFpbiBkYXRhIGlzIGxvY2F0ZWQgdXNpbmcKKyAgICAgICAgICogZmllbGQgIm1haW5fZGF0YV9iZWdpbiIgb2YgdGhlIGN1cnJlbnQgZnJhbWUuIFRoZSBsZW5ndGggZG9lcyBub3QgaW5jbHVkZQorICAgICAgICAgKiBoZWFkZXIgYW5kIHNpZGUgaW5mby4KKyAgICAgICAgICogIm1haW5fZGF0YV9iZWdpbiIgcG9pbnRzIHRvIHRoZSBmaXJzdCBiaXQgb2YgbWFpbiBkYXRhIG9mIGEgZnJhbWUuIEl0IGlzIGEgbmVnYXRpdmUKKyAgICAgICAgICogb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHN5bmMgd29yZAorICAgICAgICAgKiBtYWluX2RhdGFfYmVnaW4gPSAwICA8PT09PiBtYWluIGRhdGEgc3RhcnQgcmlndGggYWZ0ZXIgc2lkZSBpbmZvLgorICAgICAgICAgKi8KKworICAgICAgICBpbnQzMiB0ZW1wID0gcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplKGluZm8sIHBWYXJzKTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqICBDaGVjayBpZiBhdmFpbGFibGUgZGF0YSBob2xkcyBhIGZ1bGwgZnJhbWUsIGlmIG5vdCBmbGFnIGFuIGVycm9yCisgICAgICAgICAqLworCisgICAgICAgIGlmICgodWludDMyKXBWYXJzLT5wcmVkaWN0ZWRfZnJhbWVfc2l6ZSA+IHBWYXJzLT5pbnB1dFN0cmVhbS5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBFeHQtPm91dHB1dEZyYW1lU2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBGaWxsIGluIGludGVybmFsIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgZmlsbE1haW5EYXRhQnVmKHBWYXJzLCB0ZW1wKTsKKworCisgICAgICAgIG1haW5fZGF0YV9lbmQgPSBwVmFycy0+bWFpbkRhdGFTdHJlYW0udXNlZEJpdHMgPj4gMzsgLyogaW4gYnl0ZXMgKi8KKyAgICAgICAgaWYgKChtYWluX2RhdGFfZW5kIDw8IDMpIDwgcFZhcnMtPm1haW5EYXRhU3RyZWFtLnVzZWRCaXRzKQorICAgICAgICB7CisgICAgICAgICAgICBtYWluX2RhdGFfZW5kKys7CisgICAgICAgICAgICBwVmFycy0+bWFpbkRhdGFTdHJlYW0udXNlZEJpdHMgPSBtYWluX2RhdGFfZW5kIDw8IDM7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGZvcmNlIHNpZ25lZCBjb21wdXRhdGlvbjsgYnVmZmVyIHNpemVzIGFuZCBvZmZzZXRzIGFyZSBhbGwgZ29pbmcgdG8gYmUKKyAgICAgICAgLy8gd2VsbCB3aXRoaW4gdGhlIGNvbnN0cmFpbnRzIG9mIDMyLWJpdCBzaWduZWQgbWF0aC4KKyAgICAgICAgYnl0ZXNfdG9fZGlzY2FyZCA9IHBWYXJzLT5mcmFtZV9zdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKGludDMyKXBWYXJzLT5zaWRlSW5mby5tYWluX2RhdGFfYmVnaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoaW50MzIpbWFpbl9kYXRhX2VuZCk7CisKKworICAgICAgICBpZiAobWFpbl9kYXRhX2VuZCA+IEJVRlNJWkUpICAgLyogY2hlY2sgb3ZlcmZsb3cgb24gdGhlIGJ1ZmZlciAqLworICAgICAgICB7CisgICAgICAgICAgICBwVmFycy0+ZnJhbWVfc3RhcnQgLT0gQlVGU0laRTsKKworICAgICAgICAgICAgcFZhcnMtPm1haW5EYXRhU3RyZWFtLnVzZWRCaXRzIC09IChCVUZTSVpFIDw8IDMpOworICAgICAgICB9CisKKyAgICAgICAgcFZhcnMtPmZyYW1lX3N0YXJ0ICs9IHRlbXA7CisKKworICAgICAgICBpZiAoYnl0ZXNfdG9fZGlzY2FyZCA8IDAgfHwgY3JjX2Vycm9yX2NvdW50KQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIE5vdCBlbm91Z2ggZGF0YSB0byBkZWNvZGUsIHRoZW4gd2Ugc2hvdWxkIGF2b2lkIHJlYWRpbmcgdGhpcworICAgICAgICAgICAgICogIGRhdGEgKCBnZXR0aW5nL2lnbm9yaW5nIHNpZG8gaW5mbyBhbmQgc2NhbGUgZGF0YSkKKyAgICAgICAgICAgICAqICBNYWluIGRhdGEgY291bGQgYmUgbG9jYXRlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUsIHNvIGFuIHVuYWNjb3VudGVkCisgICAgICAgICAgICAgKiAgZnJhbWUgY2FuIGNhdXNlIGluY29ycmVjdCBwcm9jZXNzaW5nCisgICAgICAgICAgICAgKiAgSnVzdCBydW4gdGhlIHBvbHlwaGFzZSBmaWx0ZXIgdG8gImNsZWFuIiB0aGUgaGlzdG9yeSBidWZmZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZXJyb3JDb2RlID0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUjsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICBDbGVhciB0aGUgaW5wdXQgdG8gdGhlc2UgZmlsdGVycworICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHB2X21lbXNldCgodm9pZCopcENoVmFyc1tSSUdIVF0tPndvcmtfYnVmX2ludDMyLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgU1VCQkFORFNfTlVNQkVSKkZJTFRFUkJBTktfQkFORFMqc2l6ZW9mKHBDaFZhcnNbUklHSFRdLT53b3JrX2J1Zl9pbnQzMlswXSkpOworCisgICAgICAgICAgICBwdl9tZW1zZXQoKHZvaWQqKXBDaFZhcnNbTEVGVF0tPndvcmtfYnVmX2ludDMyLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgU1VCQkFORFNfTlVNQkVSKkZJTFRFUkJBTktfQkFORFMqc2l6ZW9mKHBDaFZhcnNbTEVGVF0tPndvcmtfYnVmX2ludDMyWzBdKSk7CisKKyAgICAgICAgICAgIC8qICBjbGVhciBjaXJjdWxhciBidWZmZXJzLCB0byBhdm9pZCBhbnkgZ2xpdGNoICovCisgICAgICAgICAgICBwdl9tZW1zZXQoKHZvaWQqKSZwQ2hWYXJzWyBMRUZUXS0+Y2lyY19idWZmZXJbNTc2XSwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIDQ4MCpzaXplb2YocENoVmFyc1sgTEVGVF0tPmNpcmNfYnVmZmVyWzBdKSk7CisgICAgICAgICAgICBwdl9tZW1zZXQoKHZvaWQqKSZwQ2hWYXJzW1JJR0hUXS0+Y2lyY19idWZmZXJbNTc2XSwKKyAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgIDQ4MCpzaXplb2YocENoVmFyc1tSSUdIVF0tPmNpcmNfYnVmZmVyWzBdKSk7CisKKyAgICAgICAgICAgIHBDaFZhcnNbIExFRlRdLT51c2VkX2ZyZXFfbGluZXMgPSA1NzU7CisgICAgICAgICAgICBwQ2hWYXJzW1JJR0hUXS0+dXNlZF9mcmVxX2xpbmVzID0gNTc1OworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwVmFycy0+bWFpbkRhdGFTdHJlYW0udXNlZEJpdHMgKz0gKGJ5dGVzX3RvX2Rpc2NhcmQgPDwgMyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAgaWYgKGZyX3BzLT5oZWFkZXItPnZlcnNpb25feCA9PSBNUEVHXzEpLCB1c2UgMiBncmFudWxlcywgb3RoZXJ3aXNlIGp1c3QgMQorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgKDEgKyAhKGluZm8tPnZlcnNpb25feCkpOyBncisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZXJyb3JDb2RlICE9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcFZhcnMtPm51bV9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludDMyIHBhcnQyX3N0YXJ0ID0gcFZhcnMtPm1haW5EYXRhU3RyZWFtLnVzZWRCaXRzOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT52ZXJzaW9uX3ggPT0gTVBFR18xKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2bXAzX2dldF9zY2FsZV9mYWN0b3JzKCZwVmFycy0+c2NhbGVGYWN0b3JzW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWYXJzLT5tYWluRGF0YVN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiAqIHRtcCA9IHBWYXJzLT5TY3JhdGNoX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzKCZwVmFycy0+c2NhbGVGYWN0b3JzW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzIgKil0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPm1haW5EYXRhU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBDaFZhcnNbY2hdLT51c2VkX2ZyZXFfbGluZXMgPSBwdm1wM19odWZmbWFuX3BhcnNpbmcocENoVmFyc1tjaF0tPndvcmtfYnVmX2ludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWYXJzLT5zaWRlSW5mby5jaFtjaF0uZ3Jhbltncl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQyX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7CisKKworICAgICAgICAgICAgICAgICAgICBwdm1wM19kZXF1YW50aXplX3NhbXBsZShwQ2hWYXJzW2NoXS0+d29ya19idWZfaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2NhbGVGYWN0b3JzW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWYXJzLT5zaWRlSW5mby5jaFtjaF0uZ3Jhbltncl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaFZhcnNbY2hdLT51c2VkX2ZyZXFfbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pOworCisKKworCisgICAgICAgICAgICAgICAgfSAgIC8qIGZvciAoY2g9MDsgY2g8c3RlcmVvOyBjaCsrKSAgKi8KKworICAgICAgICAgICAgICAgIGlmIChwVmFycy0+bnVtX2NoYW5uZWxzID09IDIpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGludDMyIHVzZWRfZnJlcV9saW5lcyA9IChwQ2hWYXJzWyBMRUZUXS0+dXNlZF9mcmVxX2xpbmVzICA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzW1JJR0hUXS0+dXNlZF9mcmVxX2xpbmVzKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaFZhcnNbIExFRlRdLT51c2VkX2ZyZXFfbGluZXMgIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoVmFyc1tSSUdIVF0tPnVzZWRfZnJlcV9saW5lczsKKworICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzWyBMRUZUXS0+dXNlZF9mcmVxX2xpbmVzID0gdXNlZF9mcmVxX2xpbmVzOworICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzW1JJR0hUXS0+dXNlZF9mcmVxX2xpbmVzID0gdXNlZF9mcmVxX2xpbmVzOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT52ZXJzaW9uX3ggPT0gTVBFR18xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdm1wM19zdGVyZW9fcHJvYyhwQ2hWYXJzWyBMRUZUXS0+d29ya19idWZfaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzW1JJR0hUXS0+d29ya19idWZfaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNjYWxlRmFjdG9yc1tSSUdIVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNpZGVJbmZvLmNoW0xFRlRdLmdyYW5bZ3JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZF9mcmVxX2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiAqIHRtcCA9IHBWYXJzLT5TY3JhdGNoX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2bXAzX21wZWcyX3N0ZXJlb19wcm9jKHBDaFZhcnNbIExFRlRdLT53b3JrX2J1Zl9pbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaFZhcnNbUklHSFRdLT53b3JrX2J1Zl9pbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2NhbGVGYWN0b3JzW1JJR0hUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8uY2hbIExFRlRdLmdyYW5bZ3JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWYXJzLT5zaWRlSW5mby5jaFtSSUdIVF0uZ3Jhbltncl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyICopdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZF9mcmVxX2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gLyogaWYgKCBlcnJvckNvZGUgIT0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUikgKi8KKworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcFZhcnMtPm51bV9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHB2bXAzX3Jlb3JkZXIocENoVmFyc1tjaF0tPndvcmtfYnVmX2ludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWYXJzLT5zaWRlSW5mby5jaFtjaF0uZ3Jhbltncl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENoVmFyc1sgY2hdLT51c2VkX2ZyZXFfbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhcnMtPlNjcmF0Y2hfbWVtKTsKKworICAgICAgICAgICAgICAgIHB2bXAzX2FsaWFzX3JlZHVjdGlvbihwQ2hWYXJzW2NoXS0+d29ya19idWZfaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8uY2hbY2hdLmdyYW5bZ3JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENoVmFyc1sgY2hdLT51c2VkX2ZyZXFfbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pOworCisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICAgSU1EQ1QKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBzZXQgbXhwb3NpdGlvbgorICAgICAgICAgICAgICAgICAqIEluIGNhc2Ugb2YgbWl4ZWQgYmxvY2tzLCAjIG9mIGJhbmRzIHdpdGggbG9uZworICAgICAgICAgICAgICAgICAqIGJsb2NrcyAoMiBvciA0KSBlbHNlIDAKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB1aW50MTYgbWl4ZWRCbG9ja3NMb25nQmxvY2tzID0gMDsgLyogIDAgPSBsb25nIG9yIHNob3J0LCAyPW1peGVkLCA0PW1peGVkIDIuNUA4MDAwICovCisgICAgICAgICAgICAgICAgaWYgKHBWYXJzLT5zaWRlSW5mby5jaFtjaF0uZ3Jhbltncl0ubWl4ZWRfYmxvY2tfZmxhZyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcFZhcnMtPnNpZGVJbmZvLmNoW2NoXS5ncmFuW2dyXS53aW5kb3dfc3dpdGNoaW5nX2ZsYWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGluZm8tPnZlcnNpb25feCA9PSBNUEVHXzJfNSkgJiYgKGluZm8tPnNhbXBsaW5nX2ZyZXF1ZW5jeSA9PSAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWRCbG9ja3NMb25nQmxvY2tzID0gNDsgLyogbXBlZzIuNSBAIDggS0h6ICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZEJsb2Nrc0xvbmdCbG9ja3MgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHZtcDNfaW1kY3Rfc3ludGgocENoVmFyc1tjaF0tPndvcmtfYnVmX2ludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaFZhcnNbY2hdLT5vdmVybGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYXJzLT5zaWRlSW5mby5jaFtjaF0uZ3Jhbltncl0uYmxvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZEJsb2Nrc0xvbmdCbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoVmFyc1sgY2hdLT51c2VkX2ZyZXFfbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhcnMtPlNjcmF0Y2hfbWVtKTsKKworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgIFBvbHlwaGFzZSBzeW50aGVzaXMKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHB2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzKHBDaFZhcnNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYXJzLT5udW1fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dC0+ZXF1YWxpemVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyT3V0QnVmZmVyW2NoXSk7CisKKworICAgICAgICAgICAgfS8qIGVuZCBjaCBsb29wICovCisKKyAgICAgICAgICAgIHB0ck91dEJ1ZmZlciArPSBwVmFycy0+bnVtX2NoYW5uZWxzICogU1VCQkFORFNfTlVNQkVSICogRklMVEVSQkFOS19CQU5EUzsKKyAgICAgICAgfSAgLyogICBmb3IgKGdyPTA7Z3I8TWF4X2dyO2dyKyspICAqLworCisgICAgICAgIC8qIHNraXAgYW5jaWxsYXJ5IGRhdGEgKi8KKyAgICAgICAgaWYgKGluZm8tPmJpdHJhdGVfaW5kZXggPiAwKQorICAgICAgICB7IC8qIGlmIG5vdCBmcmVlLWZvcm1hdCAqLworCisgICAgICAgICAgICBpbnQzMiBhbmNpbGxhcnlfZGF0YV9sZW5naHQgPSBwVmFycy0+cHJlZGljdGVkX2ZyYW1lX3NpemUgPDwgMzsKKworICAgICAgICAgICAgYW5jaWxsYXJ5X2RhdGFfbGVuZ2h0ICAtPSBwVmFycy0+aW5wdXRTdHJlYW0udXNlZEJpdHM7CisKKyAgICAgICAgICAgIC8qIHNraXAgYW5jaWxsYXJ5IGRhdGEgKi8KKyAgICAgICAgICAgIGlmIChhbmNpbGxhcnlfZGF0YV9sZW5naHQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBWYXJzLT5pbnB1dFN0cmVhbS51c2VkQml0cyArPSBhbmNpbGxhcnlfZGF0YV9sZW5naHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBUaGlzIG92ZXJyaWRlcyBhIHBvc3NpYmxlIE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IKKyAgICAgICAgICovCisgICAgICAgIGVycm9yQ29kZSA9IE5PX0RFQ09ESU5HX0VSUk9SOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBpbmZvIG9uIHRoZSBoZWFkZXIgbGVhZHMgdG8gYW4gdW5zdXBwb3J0ZWQgbGF5ZXIsIG1vcmUgZGF0YQorICAgICAgICAgKiB3aWxsIG5vdCBmaXggdGhpcywgc28gdGhpcyBpcyBhIGJhZCBmcmFtZSwKKyAgICAgICAgICovCisKKyAgICAgICAgcEV4dC0+b3V0cHV0RnJhbWVTaXplID0gMDsKKyAgICAgICAgcmV0dXJuIFVOU1VQUE9SVEVEX0xBWUVSOworICAgIH0KKworICAgIHBFeHQtPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IHBWYXJzLT5pbnB1dFN0cmVhbS51c2VkQml0cyA+PiAzOworICAgIHBFeHQtPnRvdGFsTnVtYmVyT2ZCaXRzVXNlZCArPSBwVmFycy0+aW5wdXRTdHJlYW0udXNlZEJpdHM7CisgICAgcEV4dC0+dmVyc2lvbiA9IGluZm8tPnZlcnNpb25feDsKKyAgICBwRXh0LT5zYW1wbGluZ1JhdGUgPSBtcDNfc19mcmVxW2luZm8tPnZlcnNpb25feF1baW5mby0+c2FtcGxpbmdfZnJlcXVlbmN5XTsKKyAgICBwRXh0LT5iaXRSYXRlID0gbXAzX2JpdHJhdGVbcEV4dC0+dmVyc2lvbl1baW5mby0+Yml0cmF0ZV9pbmRleF07CisKKworICAgIC8qCisgICAgICogIEFsd2F5cyB2ZXJpZnkgYnVmZmVyIG92ZXJydW4gY29uZGl0aW9uCisgICAgICovCisKKyAgICBpZiAocEV4dC0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID4gcEV4dC0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoKQorICAgIHsKKyAgICAgICAgcEV4dC0+b3V0cHV0RnJhbWVTaXplID0gMDsKKyAgICAgICAgZXJyb3JDb2RlID0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2lubGluZSB2b2lkIGZpbGxEYXRhQnVmKHRtcDNCaXRzICpwTWFpbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB2YWwpICAgICAgIC8qIHZhbCB0byB3cml0ZSBpbnRvIHRoZSBidWZmZXIgKi8KK3sKKyAgICBwTWFpbkRhdGEtPnBCdWZmZXJbbW9kdWxlKHBNYWluRGF0YS0+b2Zmc2V0KyssIEJVRlNJWkUpXSA9ICh1aW50OCl2YWw7Cit9CisKKwordm9pZCBmaWxsTWFpbkRhdGFCdWYodm9pZCAgKnBNZW0sIGludDMyIHRlbXApCit7CisgICAgdG1wM2RlY19maWxlICAgKnBWYXJzID0gKHRtcDNkZWNfZmlsZSAqKXBNZW07CisKKworICAgIGludDMyIG9mZnNldCA9IChwVmFycy0+aW5wdXRTdHJlYW0udXNlZEJpdHMpID4+IElOQlVGX0FSUkFZX0lOREVYX1NISUZUOworCisgICAgLyoKKyAgICAgKiAgQ2hlY2sgaWYgaW5wdXQgY2lyY3VsYXIgYnVmZmVyIGJvdW5kYXJpZXMgbmVlZCB0byBiZSBlbmZvcmNlZAorICAgICAqLworICAgIGlmICgob2Zmc2V0ICsgdGVtcCkgPCBCVUZTSVpFKQorICAgIHsKKyAgICAgICAgdWludDggKiBwdHIgPSBwVmFycy0+aW5wdXRTdHJlYW0ucEJ1ZmZlciArIG9mZnNldDsKKworICAgICAgICBvZmZzZXQgPSBwVmFycy0+bWFpbkRhdGFTdHJlYW0ub2Zmc2V0OworCisgICAgICAgIC8qCisgICAgICAgICAqICBDaGVjayBpZiBtYWluIGRhdGEgY2lyY3VsYXIgYnVmZmVyIGJvdW5kYXJpZXMgbmVlZCB0byBiZSBlbmZvcmNlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChvZmZzZXQgKyB0ZW1wKSA8IEJVRlNJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB2X21lbWNweSgocFZhcnMtPm1haW5EYXRhU3RyZWFtLnBCdWZmZXIgKyBvZmZzZXQpLCBwdHIsIHRlbXAqc2l6ZW9mKHVpbnQ4KSk7CisgICAgICAgICAgICBwVmFycy0+bWFpbkRhdGFTdHJlYW0ub2Zmc2V0ICs9IHRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMiB0bXAxID0gKihwdHIrKyk7CisgICAgICAgICAgICBmb3IgKGludDMyIG5CeXRlcyA9IHRlbXAgPj4gMTsgbkJ5dGVzICE9IDA7IG5CeXRlcy0tKSAgLyogcmVhZCBtYWluIGRhdGEuICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzIgdG1wMiA9ICoocHRyKyspOworICAgICAgICAgICAgICAgIGZpbGxEYXRhQnVmKCZwVmFycy0+bWFpbkRhdGFTdHJlYW0sIHRtcDEpOworICAgICAgICAgICAgICAgIGZpbGxEYXRhQnVmKCZwVmFycy0+bWFpbkRhdGFTdHJlYW0sIHRtcDIpOworICAgICAgICAgICAgICAgIHRtcDEgPSAqKHB0cisrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRlbXAmMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWxsRGF0YUJ1ZigmcFZhcnMtPm1haW5EYXRhU3RyZWFtLCB0bXAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWRqdXN0IGNpcmN1bGFyIGJ1ZmZlciBjb3VudGVyICovCisgICAgICAgICAgICBwVmFycy0+bWFpbkRhdGFTdHJlYW0ub2Zmc2V0ID0gbW9kdWxlKHBWYXJzLT5tYWluRGF0YVN0cmVhbS5vZmZzZXQsIEJVRlNJWkUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaW50MzIgbkJ5dGVzID0gdGVtcCA+PiAxOyBuQnl0ZXMgIT0gMDsgbkJ5dGVzLS0pICAvKiByZWFkIG1haW4gZGF0YS4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgZmlsbERhdGFCdWYoJnBWYXJzLT5tYWluRGF0YVN0cmVhbSwgKihwVmFycy0+aW5wdXRTdHJlYW0ucEJ1ZmZlciArIG1vZHVsZShvZmZzZXQrKyAgLCBCVUZTSVpFKSkpOworICAgICAgICAgICAgZmlsbERhdGFCdWYoJnBWYXJzLT5tYWluRGF0YVN0cmVhbSwgKihwVmFycy0+aW5wdXRTdHJlYW0ucEJ1ZmZlciArIG1vZHVsZShvZmZzZXQrKyAgLCBCVUZTSVpFKSkpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZW1wJjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGxEYXRhQnVmKCZwVmFycy0+bWFpbkRhdGFTdHJlYW0sICoocFZhcnMtPmlucHV0U3RyZWFtLnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICAsIEJVRlNJWkUpKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHBWYXJzLT5pbnB1dFN0cmVhbS51c2VkQml0cyArPSAodGVtcCkgPDwgSU5CVUZfQVJSQVlfSU5ERVhfU0hJRlQ7Cit9CisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBDT0RFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordWludDMyIHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHModm9pZCkKK3sKKyAgICB1aW50MzIgc2l6ZTsKKworICAgIHNpemUgPSAodWludDMyKSBzaXplb2YodG1wM2RlY19maWxlKTsKKyAgICByZXR1cm4gKHNpemUpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAicHZtcDNfZGVjb2RlX2h1ZmZfY3cuaCIKKwordm9pZCBwdm1wM19Jbml0RGVjb2Rlcih0UFZNUDNEZWNvZGVyRXh0ZXJuYWwgKnBFeHQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICpwTWVtKQoreworCisgICAgdG1wM2RlY19maWxlICAgICAgKnBWYXJzOworICAgIGh1ZmZjb2RldGFiICAgICAgICpwSHVmZjsKKworICAgIHBWYXJzID0gKHRtcDNkZWNfZmlsZSAqKXBNZW07CisgICAgbWVtc2V0KHBWYXJzLCAwLCBzaXplb2YoKnBWYXJzKSk7CisKKyAgICBwRXh0LT50b3RhbE51bWJlck9mQml0c1VzZWQgPSAwOworICAgIHBFeHQtPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IDA7CisgICAgcEV4dC0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoICAgID0gMDsKKworICAgIHBWYXJzLT5pbnB1dFN0cmVhbS5wQnVmZmVyID0gcEV4dC0+cElucHV0QnVmZmVyOworCisgICAgLyoKKyAgICAgKiAgSW5pdGlhbGl6ZSBodWZmbWFuIGRlY29kaW5nIHRhYmxlCisgICAgICovCisKKyAgICBwSHVmZiA9IHBWYXJzLT5odDsKKyAgICBwSHVmZlswXS5saW5iaXRzID0gMDsKKyAgICBwSHVmZlswXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMDsKKyAgICBwSHVmZlsxXS5saW5iaXRzID0gMDsKKyAgICBwSHVmZlsxXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTsKKyAgICBwSHVmZlsyXS5saW5iaXRzID0gMDsKKyAgICBwSHVmZlsyXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMjsKKyAgICBwSHVmZlszXS5saW5iaXRzID0gMDsKKyAgICBwSHVmZlszXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMzsKKyAgICBwSHVmZls0XS5saW5iaXRzID0gMDsKKyAgICBwSHVmZls0XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMDsgLyogdGJsIDQgaXMgbm90IHVzZWQgKi8KKyAgICBwSHVmZls1XS5saW5iaXRzID0gNDsKKyAgICBwSHVmZls1XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiNTsKKyAgICBwSHVmZls2XS5saW5iaXRzID0gMDsKKyAgICBwSHVmZls2XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiNjsKKyAgICBwSHVmZls3XS5saW5iaXRzID0gMDsKKyAgICBwSHVmZls3XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiNzsKKyAgICBwSHVmZls4XS5saW5iaXRzID0gMDsKKyAgICBwSHVmZls4XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiODsKKyAgICBwSHVmZls5XS5saW5iaXRzID0gMDsKKyAgICBwSHVmZls5XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiOTsKKyAgICBwSHVmZlsxMF0ubGluYml0cyA9IDA7CisgICAgcEh1ZmZbMTBdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxMDsKKyAgICBwSHVmZlsxMV0ubGluYml0cyA9IDA7CisgICAgcEh1ZmZbMTFdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxMTsKKyAgICBwSHVmZlsxMl0ubGluYml0cyA9IDA7CisgICAgcEh1ZmZbMTJdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxMjsKKyAgICBwSHVmZlsxM10ubGluYml0cyA9IDA7CisgICAgcEh1ZmZbMTNdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxMzsKKyAgICBwSHVmZlsxNF0ubGluYml0cyA9IDA7CisgICAgcEh1ZmZbMTRdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIwOyAvKiB0YmwgMTQgaXMgbm90IHVzZWQgKi8KKyAgICBwSHVmZlsxNV0ubGluYml0cyA9IDA7CisgICAgcEh1ZmZbMTVdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxNTsKKyAgICBwSHVmZlsxNl0ubGluYml0cyA9IDE7CisgICAgcEh1ZmZbMTZdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxNjsKKyAgICBwSHVmZlsxN10ubGluYml0cyA9IDI7CisgICAgcEh1ZmZbMTddLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxNjsKKyAgICBwSHVmZlsxOF0ubGluYml0cyA9IDM7CisgICAgcEh1ZmZbMThdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxNjsKKyAgICBwSHVmZlsxOV0ubGluYml0cyA9IDQ7CisgICAgcEh1ZmZbMTldLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxNjsKKyAgICBwSHVmZlsyMF0ubGluYml0cyA9IDY7CisgICAgcEh1ZmZbMjBdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxNjsKKyAgICBwSHVmZlsyMV0ubGluYml0cyA9IDg7CisgICAgcEh1ZmZbMjFdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxNjsKKyAgICBwSHVmZlsyMl0ubGluYml0cyA9IDEwOworICAgIHBIdWZmWzIyXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTY7CisgICAgcEh1ZmZbMjNdLmxpbmJpdHMgPSAxMzsKKyAgICBwSHVmZlsyM10ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjE2OworICAgIHBIdWZmWzI0XS5saW5iaXRzID0gNDsKKyAgICBwSHVmZlsyNF0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjI0OworICAgIHBIdWZmWzI1XS5saW5iaXRzID0gNTsKKyAgICBwSHVmZlsyNV0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjI0OworICAgIHBIdWZmWzI2XS5saW5iaXRzID0gNjsKKyAgICBwSHVmZlsyNl0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjI0OworICAgIHBIdWZmWzI3XS5saW5iaXRzID0gNzsKKyAgICBwSHVmZlsyN10ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjI0OworICAgIHBIdWZmWzI4XS5saW5iaXRzID0gODsKKyAgICBwSHVmZlsyOF0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjI0OworICAgIHBIdWZmWzI5XS5saW5iaXRzID0gOTsKKyAgICBwSHVmZlsyOV0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjI0OworICAgIHBIdWZmWzMwXS5saW5iaXRzID0gMTE7CisgICAgcEh1ZmZbMzBdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIyNDsKKyAgICBwSHVmZlszMV0ubGluYml0cyA9IDEzOworICAgIHBIdWZmWzMxXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMjQ7CisgICAgcEh1ZmZbMzJdLmxpbmJpdHMgPSAwOworICAgIHBIdWZmWzMyXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMzI7CisgICAgcEh1ZmZbMzNdLmxpbmJpdHMgPSAwOworICAgIHBIdWZmWzMzXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMzM7CisKKyAgICAvKgorICAgICAqICBJbml0aWFsaXplIHBvbHlzeW50aGVzaXMgY2lyY3VsYXIgYnVmZmVyIG1lY2hhbmlzbQorICAgICAqLworICAgIC8qIGNsZWFyIGJ1ZmZlcnMgKi8KKworICAgIHB2bXAzX3Jlc2V0RGVjb2RlcihwTWVtKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBDT0RFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCit2b2lkIHB2bXAzX3Jlc2V0RGVjb2Rlcih2b2lkICAqcE1lbSkKK3sKKworICAgIHRtcDNkZWNfZmlsZSAgICAgICpwVmFyczsKKyAgICB0bXAzZGVjX2NoYW4gICAgICAqcENoVmFyc1tDSEFOXTsKKworICAgIHBWYXJzID0gKHRtcDNkZWNfZmlsZSAqKXBNZW07CisgICAgcENoVmFyc1sgTEVGVF0gPSAmcFZhcnMtPnBlckNoYW5bIExFRlRdOworICAgIHBDaFZhcnNbUklHSFRdID0gJnBWYXJzLT5wZXJDaGFuW1JJR0hUXTsKKworICAgIHBWYXJzLT5mcmFtZV9zdGFydCA9IDA7CisKKyAgICBwVmFycy0+bWFpbkRhdGFTdHJlYW0ub2Zmc2V0ID0gMDsKKworICAgIHBWYXJzLT5tYWluRGF0YVN0cmVhbS5wQnVmZmVyID0gIHBWYXJzLT5tYWluRGF0YUJ1ZmZlcjsKKyAgICBwVmFycy0+bWFpbkRhdGFTdHJlYW0udXNlZEJpdHMgPSAwOworCisKKyAgICBwVmFycy0+aW5wdXRTdHJlYW0udXNlZEJpdHMgPSAwOyAvLyBpbiBiaXRzCisKKworICAgIHBDaFZhcnNbIExFRlRdLT51c2VkX2ZyZXFfbGluZXMgPSA1NzU7CisgICAgcENoVmFyc1tSSUdIVF0tPnVzZWRfZnJlcV9saW5lcyA9IDU3NTsKKworCisgICAgLyoKKyAgICAgKiAgSW5pdGlhbGl6ZSBwb2x5c3ludGhlc2lzIGNpcmN1bGFyIGJ1ZmZlciBtZWNoYW5pc20KKyAgICAgKi8KKworICAgIHB2X21lbXNldCgodm9pZCopJnBDaFZhcnNbIExFRlRdLT5jaXJjX2J1ZmZlcls1NzZdLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICA0ODAqc2l6ZW9mKHBDaFZhcnNbIExFRlRdLT5jaXJjX2J1ZmZlclswXSkpOworICAgIHB2X21lbXNldCgodm9pZCopJnBDaFZhcnNbUklHSFRdLT5jaXJjX2J1ZmZlcls1NzZdLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICA0ODAqc2l6ZW9mKHBDaFZhcnNbUklHSFRdLT5jaXJjX2J1ZmZlclswXSkpOworCisKKyAgICBwdl9tZW1zZXQoKHZvaWQqKXBDaFZhcnNbIExFRlRdLT5vdmVybGFwLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBTVUJCQU5EU19OVU1CRVIqRklMVEVSQkFOS19CQU5EUypzaXplb2YocENoVmFyc1sgTEVGVF0tPm92ZXJsYXBbMF0pKTsKKworCisgICAgcHZfbWVtc2V0KCh2b2lkKilwQ2hWYXJzWyBSSUdIVF0tPm92ZXJsYXAsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIFNVQkJBTkRTX05VTUJFUipGSUxURVJCQU5LX0JBTkRTKnNpemVvZihwQ2hWYXJzWyBSSUdIVF0tPm92ZXJsYXBbMF0pKTsKKworCisKKworCisgICAgLyoKKyAgICAgKiAgQ2xlYXIgYWxsIHRoZSBzdHJ1Y3R1cmVzCisgICAgICovCisKKworICAgIHB2X21lbXNldCgodm9pZCopJnBWYXJzLT5zY2FsZUZhY3RvcnNbUklHSFRdLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBzaXplb2YobXAzU2NhbGVGYWN0b3JzKSk7CisKKyAgICBwdl9tZW1zZXQoKHZvaWQqKSZwVmFycy0+c2NhbGVGYWN0b3JzW0xFRlRdLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBzaXplb2YobXAzU2NhbGVGYWN0b3JzKSk7CisKKyAgICBwdl9tZW1zZXQoKHZvaWQqKSZwVmFycy0+c2lkZUluZm8sCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIHNpemVvZihtcDNTaWRlSW5mbykpOworCisgICAgcHZfbWVtc2V0KCh2b2lkKikmcFZhcnMtPnNpZGVJbmZvLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBzaXplb2YobXAzU2lkZUluZm8pKTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19mcmFtZWRlY29kZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfbWFpbl9kYXRhX3NpemUuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfbWFpbl9kYXRhX3NpemUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNmY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAKQEAgLTAsMCArMSwzNDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFBhY2tldFZpZGVvIENvcnAuCisgICBNUDMgRGVjb2RlciBMaWJyYXJ5CisKKyAgIEZpbGVuYW1lOiBwdm1wM19nZXRfc2lkZV9pbmZvLmNwcAorCisgICAgIERhdGU6IDA5LzIxLzIwMDcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVWSVNJT04gSElTVE9SWQorCisKKyBEZXNjcmlwdGlvbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUworCitJbnB1dAorICAgIG1wM1NpZGVJbmZvICAgICAqc2ksCisgICAgbXAzSGVhZGVyICAgICAgICppbmZvLCAgICAgICAgICAgICBtcDMgaGVhZGVyIGluZm9ybWF0aW9uCisgICAgdWludDMyICAgICAgICAgICpjcmMgICAgICAgICAgICAgICBpbml0aWFsaXplZCBjcmMgdmFsdWUgKGlmIGVuYWJsZWQpCisKKworIFJldHVybnMKKworICAgIG1wM1NpZGVJbmZvICAgICAqc2ksICAgICAgICAgICAgICAgc2lkZSBpbmZvcm1hdGlvbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIERFU0NSSVBUSU9OCisKKyAgICBhY3F1aXJlcyBzaWRlIGluZm9ybWF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFUVVJUkVNRU5UUworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFRkVSRU5DRVMKKworIFsxXSBJU08gTVBFRyBBdWRpbyBTdWJncm91cCBTb2Z0d2FyZSBTaW11bGF0aW9uIEdyb3VwICgxOTk2KQorICAgICBJU08gMTM4MTgtMyBNUEVHLTIgQXVkaW8gRGVjb2RlciAtIExvd2VyIFNhbXBsaW5nIEZyZXF1ZW5jeSBFeHRlbnNpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUFNFVURPLUNPREUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJTkNMVURFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJwdm1wM19nZXRfc2lkZV9pbmZvLmgiCisjaW5jbHVkZSAicHZtcDNfY3JjLmgiCisjaW5jbHVkZSAicHZtcDNfZ2V0Yml0cy5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNQUNST1MKKzsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERFRklORVMKKzsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKKzsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKKzsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCis7IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUworOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUworOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBDT0RFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRVJST1JfQ09ERSBwdm1wM19nZXRfc2lkZV9pbmZvKHRtcDNCaXRzICAgICppbnB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDNTaWRlSW5mbyAqc2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAzSGVhZGVyICAgKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyICAgICAgKmNyYykKK3sKKyAgICBpbnQzMiBjaCwgZ3I7CisgICAgdWludDMyIHRtcDsKKworICAgIGludCBzdGVyZW8gID0gKGluZm8tPm1vZGUgPT0gTVBHX01EX01PTk8pID8gMSA6IDI7CisKKyAgICBpZiAoaW5mby0+dmVyc2lvbl94ID09IE1QRUdfMSkKKyAgICB7CisgICAgICAgIGlmIChzdGVyZW8gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCAxNCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDE0LCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOworICAgICAgICAgICAgc2ktPm1haW5fZGF0YV9iZWdpbiA9ICh0bXAgPDwgMTgpID4+IDIzOyAgICAvKiA5ICovCisgICAgICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzICAgID0gKHRtcCA8PCAyNykgPj4gMjc7ICAgIC8qIDUgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghYml0c0F2YWlsYWJsZShpbnB1dFN0cmVhbSwgMTIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBTSURFX0lORk9fRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAxMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIHNpLT5tYWluX2RhdGFfYmVnaW4gPSAodG1wIDw8IDIwKSA+PiAyMzsgICAgLyogOSAqLworICAgICAgICAgICAgc2ktPnByaXZhdGVfYml0cyAgICA9ICh0bXAgPDwgMjkpID4+IDI5OyAgICAvKiAzICovCisKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHN0ZXJlbzsgY2grKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCA0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0lERV9JTkZPX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgNCwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIHNpLT5jaFtjaF0uc2Nmc2lbMF0gPSAodG1wIDw8IDI4KSA+PiAzMTsgICAgLyogMSAqLworICAgICAgICAgICAgc2ktPmNoW2NoXS5zY2ZzaVsxXSA9ICh0bXAgPDwgMjkpID4+IDMxOyAgICAvKiAxICovCisgICAgICAgICAgICBzaS0+Y2hbY2hdLnNjZnNpWzJdID0gKHRtcCA8PCAzMCkgPj4gMzE7ICAgIC8qIDEgKi8KKyAgICAgICAgICAgIHNpLT5jaFtjaF0uc2Nmc2lbM10gPSAgdG1wICYgMTsgICAgICAgICAvKiAxICovCisgICAgICAgIH0KKworICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCAyIDsgZ3IrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3RlcmVvOyBjaCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYml0c0F2YWlsYWJsZShpbnB1dFN0cmVhbSwgMzQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnBhcnQyXzNfbGVuZ3RoICAgID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDEyLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOworICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKKworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0uYmlnX3ZhbHVlcyAgICAgICAgICAgID0gKHRtcCA8PCAxMCkgPj4gMjM7ICAgLyogOSAqLworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0uZ2xvYmFsX2dhaW4gICAgICAgID0gKGludDMyKSgodG1wIDw8IDE5KSA+PiAyNCkgLSAyMTA7IC8qIDggKi8KKyAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnNjYWxlZmFjX2NvbXByZXNzICAgICA9ICh0bXAgPDwgMjcpID4+IDI4OyAgIC8qIDQgKi8KKyAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLndpbmRvd19zd2l0Y2hpbmdfZmxhZyA9IHRtcCAmIDE7ICAgICAgICAgLyogMSAqLworCisgICAgICAgICAgICAgICAgaWYgKHNpLT5jaFtjaF0uZ3Jhbltncl0ud2luZG93X3N3aXRjaGluZ19mbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCAyMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTSURFX0lORk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMjIsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7CisKKyAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5ibG9ja190eXBlICAgICAgID0gKHRtcCA8PCAxMCkgPj4gMzA7ICAgLyogMiAqLzsKKyAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5taXhlZF9ibG9ja19mbGFnID0gKHRtcCA8PCAxMikgPj4gMzE7ICAgLyogMSAqLzsKKworICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnRhYmxlX3NlbGVjdFswXSAgPSAodG1wIDw8IDEzKSA+PiAyNzsgICAvKiA1ICovOworICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnRhYmxlX3NlbGVjdFsxXSAgPSAodG1wIDw8IDE4KSA+PiAyNzsgICAvKiA1ICovOworCisgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0uc3ViYmxvY2tfZ2FpblswXSA9ICh0bXAgPDwgMjMpID4+IDI5OyAgIC8qIDMgKi87CisgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0uc3ViYmxvY2tfZ2FpblsxXSA9ICh0bXAgPDwgMjYpID4+IDI5OyAgIC8qIDMgKi87CisgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0uc3ViYmxvY2tfZ2FpblsyXSA9ICh0bXAgPDwgMjkpID4+IDI5OyAgIC8qIDMgKi87CisKKyAgICAgICAgICAgICAgICAgICAgLyogU2V0IHJlZ2lvbl9jb3VudCBwYXJhbWV0ZXJzIHNpbmNlIHRoZXkgYXJlIGltcGxpY2l0IGluIHRoaXMgY2FzZS4gKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoc2ktPmNoW2NoXS5ncmFuW2dyXS5ibG9ja190eXBlID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihTSURFX0lORk9fRVJST1IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzaS0+Y2hbY2hdLmdyYW5bZ3JdLmJsb2NrX3R5cGUgICAgICAgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNpLT5jaFtjaF0uZ3Jhbltncl0ubWl4ZWRfYmxvY2tfZmxhZyA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5yZWdpb24wX2NvdW50ID0gODsgLyogTUkgOTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0ucmVnaW9uMV9jb3VudCA9IDEyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5yZWdpb24wX2NvdW50ID0gNzsgLyogTUkgODsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0ucmVnaW9uMV9jb3VudCA9IDEzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYml0c0F2YWlsYWJsZShpbnB1dFN0cmVhbSwgMjIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0lERV9JTkZPX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDIyLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOworCisgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0udGFibGVfc2VsZWN0WzBdID0gKHRtcCA8PCAxMCkgPj4gMjc7ICAgLyogNSAqLzsKKyAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS50YWJsZV9zZWxlY3RbMV0gPSAodG1wIDw8IDE1KSA+PiAyNzsgICAvKiA1ICovOworICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnRhYmxlX3NlbGVjdFsyXSA9ICh0bXAgPDwgMjApID4+IDI3OyAgIC8qIDUgKi87CisKKyAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5yZWdpb24wX2NvdW50ICAgPSAodG1wIDw8IDI1KSA+PiAyODsgICAvKiA0ICovOworICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnJlZ2lvbjFfY291bnQgICA9ICh0bXAgPDwgMjkpID4+IDI5OyAgIC8qIDMgKi87CisKKyAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5ibG9ja190eXBlICAgICAgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYml0c0F2YWlsYWJsZShpbnB1dFN0cmVhbSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0lERV9JTkZPX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAzLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0ucHJlZmxhZyAgICAgICAgICAgID0gKHRtcCA8PCAyOSkgPj4gMzE7ICAgIC8qIDEgKi8KKyAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnNjYWxlZmFjX3NjYWxlICAgICA9ICh0bXAgPDwgMzApID4+IDMxOyAgICAvKiAxICovCisgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5jb3VudDF0YWJsZV9zZWxlY3QgPSAgdG1wICYgMTsgICAgICAgICAvKiAxICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBMYXllciAzIExTRiAqLworICAgIHsKKyAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCA4ICsgc3RlcmVvKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHNpLT5tYWluX2RhdGFfYmVnaW4gPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgICAgICA4LCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOworICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzICAgID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIHN0ZXJlbywgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKKworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW87IGNoKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghYml0c0F2YWlsYWJsZShpbnB1dFN0cmVhbSwgMzkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBTSURFX0lORk9fRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMSwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5wYXJ0Ml8zX2xlbmd0aCAgICA9ICh0bXAgPDwgMTEpID4+IDIwOyAgLyogMTIgKi8KKyAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5iaWdfdmFsdWVzICAgICAgICA9ICh0bXAgPDwgMjMpID4+IDIzOyAgLyogIDkgKi8KKworICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDE4LCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOworICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLmdsb2JhbF9nYWluICAgICAgICAgICA9ICgodG1wIDw8IDE0KSA+PiAyNCkgLSAyMTA7ICAgLyogOCAqLworICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnNjYWxlZmFjX2NvbXByZXNzICAgICA9ICh0bXAgPDwgMjIpID4+IDIzOyAgIC8qIDkgKi8KKyAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS53aW5kb3dfc3dpdGNoaW5nX2ZsYWcgPSB0bXAgJiAxOyAgICAgICAgIC8qIDEgKi8KKworICAgICAgICAgICAgaWYgKHNpLT5jaFtjaF0uZ3JhblswXS53aW5kb3dfc3dpdGNoaW5nX2ZsYWcpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAoIWJpdHNBdmFpbGFibGUoaW5wdXRTdHJlYW0sIDIyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTSURFX0lORk9fRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDIyLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOworCisgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLmJsb2NrX3R5cGUgICAgICAgPSAodG1wIDw8IDEwKSA+PiAzMDsgICAvKiAyICovOworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5taXhlZF9ibG9ja19mbGFnID0gKHRtcCA8PCAxMikgPj4gMzE7ICAgLyogMSAqLzsKKworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS50YWJsZV9zZWxlY3RbMF0gID0gKHRtcCA8PCAxMykgPj4gMjc7ICAgLyogNSAqLzsKKyAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0udGFibGVfc2VsZWN0WzFdICA9ICh0bXAgPDwgMTgpID4+IDI3OyAgIC8qIDUgKi87CisKKyAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uc3ViYmxvY2tfZ2FpblswXSA9ICh0bXAgPDwgMjMpID4+IDI5OyAgIC8qIDMgKi87CisgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnN1YmJsb2NrX2dhaW5bMV0gPSAodG1wIDw8IDI2KSA+PiAyOTsgICAvKiAzICovOworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5zdWJibG9ja19nYWluWzJdID0gKHRtcCA8PCAyOSkgPj4gMjk7ICAgLyogMyAqLzsKKworICAgICAgICAgICAgICAgIC8qIFNldCByZWdpb25fY291bnQgcGFyYW1ldGVycyBzaW5jZSB0aGV5IGFyZSBpbXBsaWNpdCBpbiB0aGlzIGNhc2UuICovCisKKyAgICAgICAgICAgICAgICBpZiAoc2ktPmNoW2NoXS5ncmFuWzBdLmJsb2NrX3R5cGUgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihTSURFX0lORk9fRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoc2ktPmNoW2NoXS5ncmFuWzBdLmJsb2NrX3R5cGUgICAgICAgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc2ktPmNoW2NoXS5ncmFuWzBdLm1peGVkX2Jsb2NrX2ZsYWcgPT0gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0ucmVnaW9uMF9jb3VudCA9IDg7IC8qIE1JIDk7ICovCisgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5yZWdpb24xX2NvdW50ID0gMTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5yZWdpb24wX2NvdW50ID0gNzsgLyogTUkgODsgKi8KKyAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnJlZ2lvbjFfY291bnQgPSAxMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCAyMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0lERV9JTkZPX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKKworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS50YWJsZV9zZWxlY3RbMF0gPSAodG1wIDw8IDEwKSA+PiAyNzsgICAvKiA1ICovOworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS50YWJsZV9zZWxlY3RbMV0gPSAodG1wIDw8IDE1KSA+PiAyNzsgICAvKiA1ICovOworICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS50YWJsZV9zZWxlY3RbMl0gPSAodG1wIDw8IDIwKSA+PiAyNzsgICAvKiA1ICovOworCisgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnJlZ2lvbjBfY291bnQgICA9ICh0bXAgPDwgMjUpID4+IDI4OyAgIC8qIDQgKi87CisgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnJlZ2lvbjFfY291bnQgICA9ICh0bXAgPDwgMjkpID4+IDI5OyAgIC8qIDMgKi87CisKKyAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uYmxvY2tfdHlwZSAgICAgID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0lERV9JTkZPX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5zY2FsZWZhY19zY2FsZSAgICAgPSAgdG1wID4+IDE7ICAvKiAxICovCisgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uY291bnQxdGFibGVfc2VsZWN0ID0gIHRtcCAmIDE7ICAvKiAxICovCisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKE5PX0RFQ09ESU5HX0VSUk9SKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRiaXRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI1MmVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAKQEAgLTAsMCArMSwyOTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFBhY2tldFZpZGVvIENvcnAuCisgICBNUDMgRGVjb2RlciBMaWJyYXJ5CisKKyAgIEZpbGVuYW1lOiBwdm1wM19nZXRiaXRzLmNwcAorCisKKyAgICAgRGF0ZTogMDkvMjEvMjAwNworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVZJU0lPTiBISVNUT1JZCisKKworIERlc2NyaXB0aW9uOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCisKKyBJbnB1dHM6CisKKyAgICB0bXAzQml0cyAqaW5wdXRTdHJlYW0sICAgICBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcnMKKyAgICBpbnQzMiAgICAgbmVlZGVkQml0cyAgICAgICBudW1iZXIgb2YgYml0cyB0byByZWFkIGZyb20gdGhlIGJpdCBzdHJlYW0KKworIE91dHB1dHM6CisKKyAgICB3b3JkIHBhcnNlZCBmcm9tIHRlaCBiaXRzdHJlYW0sIHdpdGggc2l6ZSBuZWVkZWRCaXRzLWJpdHMsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIERFU0NSSVBUSU9OCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVRVUlSRU1FTlRTCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVGRVJFTkNFUworIFsxXSBJU08gTVBFRyBBdWRpbyBTdWJncm91cCBTb2Z0d2FyZSBTaW11bGF0aW9uIEdyb3VwICgxOTk2KQorICAgICBJU08gMTM4MTgtMyBNUEVHLTIgQXVkaW8gRGVjb2RlciAtIExvd2VyIFNhbXBsaW5nIEZyZXF1ZW5jeSBFeHRlbnNpb24KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQU0VVRE8tQ09ERQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJTkNMVURFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAicHZtcDNfZ2V0Yml0cy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTUFDUk9TCis7IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBERUZJTkVTCis7IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCis7IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKKzsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCis7IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUworOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUworOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1aW50MzIgZ2V0TmJpdHModG1wM0JpdHMgKnB0Qml0U3RyZWFtLAorICAgICAgICAgICAgICAgIGludDMyIG5lZWRlZEJpdHMpIC8qIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtICh1cCB0byAyNSkgKi8KK3sKKworICAgIHVpbnQzMiAgICBvZmZzZXQ7CisgICAgdWludDMyICAgIGJpdEluZGV4OworICAgIHVpbnQzMiAgICBieXRlc1RvRmV0Y2g7CisgICAgdWludDggICAgIEVsZW0gID0gMDsgICAgICAgICAvKiBOZWVkcyB0byBiZSBzYW1lIHR5cGUgYXMgcElucHV0LT5wQnVmZmVyICovCisgICAgdWludDggICAgIEVsZW0xID0gMDsKKyAgICB1aW50OCAgICAgRWxlbTIgPSAwOworICAgIHVpbnQ4ICAgICBFbGVtMyA9IDA7CisgICAgdWludDMyICAgcmV0dXJuVmFsdWUgPSAwOworCisgICAgaWYgKCFuZWVkZWRCaXRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChyZXR1cm5WYWx1ZSk7CisgICAgfQorCisgICAgb2Zmc2V0ID0gKHB0Qml0U3RyZWFtLT51c2VkQml0cykgPj4gSU5CVUZfQVJSQVlfSU5ERVhfU0hJRlQ7CisKKyAgICAvKiBSZW1vdmUgZXh0cmEgaGlnaCBiaXRzIGJ5IHNoaWZ0aW5nIHVwICovCisgICAgYml0SW5kZXggPSBtb2R1bGUocHRCaXRTdHJlYW0tPnVzZWRCaXRzLCBJTkJVRl9CSVRfV0lEVEgpOworCisgICAgYnl0ZXNUb0ZldGNoID0gKGJpdEluZGV4ICsgbmVlZGVkQml0cyArIDcgKSA+PiAzIDsKKworICAgIHN3aXRjaCAoYnl0ZXNUb0ZldGNoKQorICAgIHsKKyAgICBjYXNlIDQ6CisgICAgICAgIEVsZW0zID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAzLCBCVUZTSVpFKSk7CisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICBjYXNlIDM6CisgICAgICAgIEVsZW0yID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAyLCBCVUZTSVpFKSk7CisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICBjYXNlIDI6CisgICAgICAgIEVsZW0xID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAxLCBCVUZTSVpFKSk7CisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICBjYXNlIDE6CisgICAgICAgIEVsZW0gPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCwgQlVGU0laRSkpOworICAgIH0KKworCisgICAgcmV0dXJuVmFsdWUgPSAoKCh1aW50MzIpKEVsZW0pKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgKCgodWludDMyKShFbGVtMSkpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAoKCh1aW50MzIpKEVsZW0yKSkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgKCh1aW50MzIpKEVsZW0zKSk7CisKKyAgICAvKiBUaGlzIGxpbmUgaXMgZmFzdGVyIHRoYW4gdG8gbWFzayBvZmYgdGhlIGhpZ2ggYml0cy4gKi8KKyAgICByZXR1cm5WYWx1ZSA8PD0gYml0SW5kZXg7CisKKyAgICAvKiBNb3ZlIHRoZSBmaWVsZCBkb3duLiAqLworICAgIHJldHVyblZhbHVlID4+PSAoMzIgLSBuZWVkZWRCaXRzKTsKKworICAgIHB0Qml0U3RyZWFtLT51c2VkQml0cyArPSBuZWVkZWRCaXRzOworCisgICAgcmV0dXJuIChyZXR1cm5WYWx1ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBDT0RFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordWludDE2IGdldFVwVG85Yml0cyh0bXAzQml0cyAqcHRCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIGludDMyIG5lZWRlZEJpdHMpIC8qIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZnJvbSB0aGUgYml0IHN0cmVhbSAyIHRvIDkgKi8KK3sKKworICAgIHVpbnQzMiAgICBvZmZzZXQ7CisgICAgdWludDMyICAgIGJpdEluZGV4OworICAgIHVpbnQzMiAgICBieXRlc1RvRmV0Y2g7CisgICAgdWludDggICAgRWxlbSAgPSAwOyAgICAgICAgIC8qIE5lZWRzIHRvIGJlIHNhbWUgdHlwZSBhcyBwSW5wdXQtPnBCdWZmZXIgKi8KKyAgICB1aW50OCAgICBFbGVtMSA9IDA7CisgICAgdWludDE2ICAgcmV0dXJuVmFsdWU7CisKKyAgICBvZmZzZXQgPSAocHRCaXRTdHJlYW0tPnVzZWRCaXRzKSA+PiBJTkJVRl9BUlJBWV9JTkRFWF9TSElGVDsKKworICAgIC8qIFJlbW92ZSBleHRyYSBoaWdoIGJpdHMgYnkgc2hpZnRpbmcgdXAgKi8KKyAgICBiaXRJbmRleCA9IG1vZHVsZShwdEJpdFN0cmVhbS0+dXNlZEJpdHMsIElOQlVGX0JJVF9XSURUSCk7CisKKyAgICBieXRlc1RvRmV0Y2ggPSAoYml0SW5kZXggKyBuZWVkZWRCaXRzICsgNyApID4+IDMgOworCisgICAgaWYgKGJ5dGVzVG9GZXRjaCA+IDEpCisgICAgeworICAgICAgICBFbGVtID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQsIEJVRlNJWkUpKTsKKyAgICAgICAgRWxlbTEgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCArIDEsIEJVRlNJWkUpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNUb0ZldGNoID4gMCkKKyAgICB7CisgICAgICAgIEVsZW0gPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCwgQlVGU0laRSkpOworICAgIH0KKworCisgICAgcmV0dXJuVmFsdWUgPSAoKCh1aW50MTYpKEVsZW0pKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAoKHVpbnQxNikoRWxlbTEpKTsKKworICAgIHB0Qml0U3RyZWFtLT51c2VkQml0cyArPSBuZWVkZWRCaXRzOworICAgIC8qIFRoaXMgbGluZSBpcyBmYXN0ZXIgdGhhbiB0byBtYXNrIG9mZiB0aGUgaGlnaCBiaXRzLiAqLworICAgIHJldHVyblZhbHVlID0gKHJldHVyblZhbHVlIDw8IChiaXRJbmRleCkpOworCisgICAgLyogTW92ZSB0aGUgZmllbGQgZG93bi4gKi8KKworICAgIHJldHVybiAodWludDE2KShyZXR1cm5WYWx1ZSA+PiAoMTYgLSBuZWVkZWRCaXRzKSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1aW50MzIgZ2V0VXBUbzE3Yml0cyh0bXAzQml0cyAqcHRCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBpbnQzMiBuZWVkZWRCaXRzKSAvKiBudW1iZXIgb2YgYml0cyB0byByZWFkIGZyb20gdGhlIGJpdCBzdHJlYW0gMiB0byA4ICovCit7CisKKyAgICB1aW50MzIgICAgb2Zmc2V0OworICAgIHVpbnQzMiAgICBiaXRJbmRleDsKKyAgICB1aW50MzIgICAgYnl0ZXNUb0ZldGNoOworICAgIHVpbnQ4ICAgICBFbGVtICA9IDA7ICAgICAgICAgLyogTmVlZHMgdG8gYmUgc2FtZSB0eXBlIGFzIHBJbnB1dC0+cEJ1ZmZlciAqLworICAgIHVpbnQ4ICAgICBFbGVtMSA9IDA7CisgICAgdWludDggICAgIEVsZW0yID0gMDsKKyAgICB1aW50MzIgICByZXR1cm5WYWx1ZTsKKworICAgIG9mZnNldCA9IChwdEJpdFN0cmVhbS0+dXNlZEJpdHMpID4+IElOQlVGX0FSUkFZX0lOREVYX1NISUZUOworCisgICAgLyogUmVtb3ZlIGV4dHJhIGhpZ2ggYml0cyBieSBzaGlmdGluZyB1cCAqLworICAgIGJpdEluZGV4ID0gbW9kdWxlKHB0Qml0U3RyZWFtLT51c2VkQml0cywgSU5CVUZfQklUX1dJRFRIKTsKKworICAgIGJ5dGVzVG9GZXRjaCA9IChiaXRJbmRleCArIG5lZWRlZEJpdHMgKyA3ICkgPj4gMyA7CisKKyAgICBpZiAoYnl0ZXNUb0ZldGNoID4gMikKKyAgICB7CisgICAgICAgIEVsZW0gID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQsIEJVRlNJWkUpKTsKKyAgICAgICAgRWxlbTEgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCArIDEsIEJVRlNJWkUpKTsKKyAgICAgICAgRWxlbTIgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCArIDIsIEJVRlNJWkUpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNUb0ZldGNoID4gMSkKKyAgICB7CisgICAgICAgIEVsZW0gID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQsIEJVRlNJWkUpKTsKKyAgICAgICAgRWxlbTEgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCArIDEsIEJVRlNJWkUpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNUb0ZldGNoID4gMCkKKyAgICB7CisgICAgICAgIEVsZW0gPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCwgQlVGU0laRSkpOworICAgIH0KKworCisgICAgcmV0dXJuVmFsdWUgPSAoKCh1aW50MzIpKEVsZW0pKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgKCgodWludDMyKShFbGVtMSkpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICgodWludDMyKShFbGVtMikpOworCisgICAgcHRCaXRTdHJlYW0tPnVzZWRCaXRzICs9IG5lZWRlZEJpdHM7CisgICAgLyogVGhpcyBsaW5lIGlzIGZhc3RlciB0aGFuIHRvIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuICovCisgICAgcmV0dXJuVmFsdWUgPSAweEZGRkZGRiAmIChyZXR1cm5WYWx1ZSA8PCAoYml0SW5kZXgpKTsKKworICAgIC8qIE1vdmUgdGhlIGZpZWxkIGRvd24uICovCisKKyAgICByZXR1cm4gKHVpbnQzMikocmV0dXJuVmFsdWUgPj4gKDI0IC0gbmVlZGVkQml0cykpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBDT0RFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordWludDggZ2V0MWJpdCh0bXAzQml0cyAqcHRCaXRTdHJlYW0pICAvKiBudW1iZXIgb2YgYml0cyB0byByZWFkIGZyb20gdGhlIGJpdCBzdHJlYW0gKi8KK3sKKworICAgIHVpbnQzMiAgICBvZmZzZXQ7CisgICAgdWludDMyICAgIGJpdEluZGV4OworICAgIHVpbnQ4ICAgcmV0dXJuVmFsdWU7CisKKyAgICBvZmZzZXQgPSAocHRCaXRTdHJlYW0tPnVzZWRCaXRzKSA+PiBJTkJVRl9BUlJBWV9JTkRFWF9TSElGVDsKKworICAgIHJldHVyblZhbHVlICA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICAsIEJVRlNJWkUpKTsKKworICAgIC8qIFJlbW92ZSBleHRyYSBoaWdoIGJpdHMgYnkgc2hpZnRpbmcgdXAgKi8KKyAgICBiaXRJbmRleCA9IG1vZHVsZShwdEJpdFN0cmVhbS0+dXNlZEJpdHMsIElOQlVGX0JJVF9XSURUSCk7CisgICAgcHRCaXRTdHJlYW0tPnVzZWRCaXRzKys7CisKKyAgICAvKiBUaGlzIGxpbmUgaXMgZmFzdGVyIHRoYW4gdG8gbWFzayBvZmYgdGhlIGhpZ2ggYml0cy4gKi8KKyAgICByZXR1cm5WYWx1ZSA9IChyZXR1cm5WYWx1ZSA8PCAoYml0SW5kZXgpKTsKKworICAgIHJldHVybiAodWludDgpKHJldHVyblZhbHVlID4+IDcpOworCit9CisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRmZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5oCkBAIC0wLDAgKzEsMTE3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgUGFja2V0VmlkZW8gQ29ycC4KKyAgIE1QMyBEZWNvZGVyIExpYnJhcnkKKworICAgRmlsZW5hbWU6IHB2bXAzX2dldGJpdHMuaAorCisgICAgIERhdGU6IDA5LzIxLzIwMDcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVWSVNJT04gSElTVE9SWQorCisgRGVzY3JpcHRpb246CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOQ0xVREUgREVTQ1JJUFRJT04KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBDT05USU5VRSBPTkxZIElGIE5PVCBBTFJFQURZIERFRklORUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBQVk1QM19HRVRCSVRTX0gKKyNkZWZpbmUgUFZNUDNfR0VUQklUU19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJTkNMVURFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAicHZtcDNfZGVjX2RlZnMuaCIKKyNpbmNsdWRlICJzX21wM2JpdHMuaCIKKyNpbmNsdWRlICJwdm1wM19hdWRpb190eXBlX2RlZnMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1BQ1JPUworOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERFRklORVMKKzsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgSU5CVUZfQVJSQVlfSU5ERVhfU0hJRlQgICgzKQorI2RlZmluZSBJTkJVRl9CSVRfV0lEVEggICAgICAgICAoMTw8KElOQlVGX0FSUkFZX0lOREVYX1NISUZUKSkKKyNkZWZpbmUgSU5CVUZfQklUX01PRFVMT19NQVNLICAgKChJTkJVRl9CSVRfV0lEVEgpLTEpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVYVEVSTkFMIFZBUklBQkxFUyBSRUZFUkVOQ0VTCis7IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNJTVBMRSBUWVBFREVGJ1MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRU5VTUVSQVRFRCBUWVBFREVGJ1MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgU1RSVUNUVVJFUyBUWVBFREVGJ1MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworICAgIHVpbnQzMiBnZXROYml0cyh0bXAzQml0cyAqcE1haW5EYXRhLAorICAgIGludDMyIG5lZWRlZEJpdHMpOworCisgICAgdWludDE2IGdldFVwVG85Yml0cyh0bXAzQml0cyAqcE1haW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgbmVlZGVkQml0cyk7CisKKyAgICB1aW50MzIgZ2V0VXBUbzE3Yml0cyh0bXAzQml0cyAqcE1haW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIG5lZWRlZEJpdHMpOworCisgICAgdWludDggZ2V0MWJpdCh0bXAzQml0cyAqcE1haW5EYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEdMT0JBTCBGVU5DVElPTiBERUZJTklUSU9OUworOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIGJvb2wgYml0c0F2YWlsYWJsZSh0bXAzQml0cyAqaW5wdXRTdHJlYW0sIHVpbnQzMiBuZWVkZWRCaXRzKQoreworICAgIHJldHVybiAoaW5wdXRTdHJlYW0tPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA8PCAzKSA+PSAobmVlZGVkQml0cyArIGlucHV0U3RyZWFtLT51c2VkQml0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFTkQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaHVmZm1hbl9kZWNvZGluZy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX2RlY29kaW5nLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaHVmZm1hbl9kZWNvZGluZy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2h1ZmZtYW5fZGVjb2RpbmcuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaHVmZm1hbl9wYXJzaW5nLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaHVmZm1hbl9wYXJzaW5nLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaHVmZm1hbl9wYXJzaW5nLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19pbWRjdF9zeW50aC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ltZGN0X3N5bnRoLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ltZGN0X3N5bnRoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ltZGN0X3N5bnRoLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ltZGN0X3N5bnRoLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfMTguY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfMTguY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzE4LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzE4LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfMTguaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3NlZWtfc3luY2guY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc2Vla19zeW5jaC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3NlZWtfc3luY2guY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zZWVrX3N5bmNoLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc2Vla19zeW5jaC5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc2Vla19zeW5jaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zZWVrX3N5bmNoLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3NlZWtfc3luY2guaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3RhYmxlcy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM190YWJsZXMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM190YWJsZXMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM190YWJsZXMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM190YWJsZXMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3RhYmxlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM190YWJsZXMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfdGFibGVzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfaHVmZmNvZGV0YWIuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3NfaHVmZmNvZGV0YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc19odWZmY29kZXRhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9zX2h1ZmZjb2RldGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfbXAzYml0cy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvc19tcDNiaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfbXAzYml0cy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9zX21wM2JpdHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2NoYW4uaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19jaGFuLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19jaGFuLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19jaGFuLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19maWxlLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfZmlsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfZmlsZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfZmlsZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTJhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIk1wM0RlY29kZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1wM3JlYWRlci5jcHAiLAorICAgICAgICAiTXAzRGVjb2RlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wM2RlYyIsCisgICAgICAgICJsaWJzbmRmaWxlIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NTJlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1wMyBEZWNvZGVyIHVuaXQgdGVzdCI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LTEuMi56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcDNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTMyNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTXAzRGVjb2RlclRlc3QiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibXAzcmVhZGVyLmgiCisjaW5jbHVkZSAicHZtcDNkZWNvZGVyX2FwaS5oIgorCisjaW5jbHVkZSAiTXAzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oIgorCisjZGVmaW5lIE9VVFBVVF9GSUxFICIvZGF0YS9sb2NhbC90bXAvbXAzRGVjb2RlLm91dCIKKworY29uc3RleHByIGludDMyX3Qga0lucHV0QnVmZmVyU2l6ZSA9IDEwMjQgKiAxMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtPdXRwdXRCdWZmZXJTaXplID0gNDYwOCAqIDI7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4Q291bnQgPSAxMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtOdW1GcmFtZVJlc2V0ID0gMTUwOworCitzdGF0aWMgTXAzRGVjb2RlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIE1wM0RlY29kZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdHJpbmc+IHsKKyAgcHVibGljOgorICAgIE1wM0RlY29kZXJUZXN0KCkgOiBtQ29uZmlnKG51bGxwdHIpIHt9CisKKyAgICB+TXAzRGVjb2RlclRlc3QoKSB7CisgICAgICAgIGlmIChtQ29uZmlnKSB7CisgICAgICAgICAgICBkZWxldGUgbUNvbmZpZzsKKyAgICAgICAgICAgIG1Db25maWcgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBtQ29uZmlnID0gbmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbHt9OworICAgICAgICBBU1NFUlRfTkUobUNvbmZpZywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZy4gTm8gTWVtb3J5IGF2YWlsYWJsZSI7CisgICAgICAgIG1Db25maWctPmVxdWFsaXplclR5cGUgPSBmbGF0OworICAgICAgICBtQ29uZmlnLT5jcmNFbmFibGVkID0gZmFsc2U7CisgICAgfQorCisgICAgdFBWTVAzRGVjb2RlckV4dGVybmFsICptQ29uZmlnOworICAgIE1wM1JlYWRlciBtTXAzUmVhZGVyOworCisgICAgRVJST1JfQ09ERSBEZWNvZGVGcmFtZXModm9pZCAqZGVjb2RlcmJ1ZiwgU05ERklMRSAqb3V0RmlsZUhhbmRsZSwgU0ZfSU5GTyBzZkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZUNvdW50ID0gSU5UMzJfTUFYKTsKKyAgICBTTkRGSUxFICpvcGVuT3V0cHV0RmlsZShTRl9JTkZPICpzZkluZm8pOworfTsKKworRVJST1JfQ09ERSBNcDNEZWNvZGVyVGVzdDo6RGVjb2RlRnJhbWVzKHZvaWQgKmRlY29kZXJCdWYsIFNOREZJTEUgKm91dEZpbGVIYW5kbGUsIFNGX0lORk8gc2ZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCkgeworICAgIHVpbnQ4X3QgaW5wdXRCdWZba0lucHV0QnVmZmVyU2l6ZV07CisgICAgaW50MTZfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdOworICAgIHVpbnQzMl90IGJ5dGVzUmVhZDsKKyAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgd2hpbGUgKGZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1NcDNSZWFkZXIuZ2V0RnJhbWUoaW5wdXRCdWYsICZieXRlc1JlYWQpOworICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGJ5dGVzUmVhZDsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBpbnB1dEJ1ZjsKKyAgICAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IG91dHB1dEJ1ZjsKKyAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0ga091dHB1dEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGRlY29kZXJFcnIgPSBwdm1wM19mcmFtZWRlY29kZXIobUNvbmZpZywgZGVjb2RlckJ1Zik7CisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE5PX0RFQ09ESU5HX0VSUk9SKSBicmVhazsKKyAgICAgICAgc2Zfd3JpdGVmX3Nob3J0KG91dEZpbGVIYW5kbGUsIG91dHB1dEJ1ZiwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplIC8gc2ZJbmZvLmNoYW5uZWxzKTsKKyAgICAgICAgZnJhbWVDb3VudC0tOworICAgIH0KKyAgICByZXR1cm4gZGVjb2RlckVycjsKK30KKworU05ERklMRSAqTXAzRGVjb2RlclRlc3Q6Om9wZW5PdXRwdXRGaWxlKFNGX0lORk8gKnNmSW5mbykgeworICAgIG1lbXNldChzZkluZm8sIDAsIHNpemVvZihTRl9JTkZPKSk7CisgICAgc2ZJbmZvLT5jaGFubmVscyA9IG1NcDNSZWFkZXIuZ2V0TnVtQ2hhbm5lbHMoKTsKKyAgICBzZkluZm8tPmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCBTRl9GT1JNQVRfUENNXzE2OworICAgIHNmSW5mby0+c2FtcGxlcmF0ZSA9IG1NcDNSZWFkZXIuZ2V0U2FtcGxlUmF0ZSgpOworICAgIFNOREZJTEUgKm91dEZpbGVIYW5kbGUgPSBzZl9vcGVuKE9VVFBVVF9GSUxFLCBTRk1fV1JJVEUsIHNmSW5mbyk7CisgICAgcmV0dXJuIG91dEZpbGVIYW5kbGU7Cit9CisKK1RFU1RfRihNcDNEZWNvZGVyVGVzdCwgTXVsdGlDcmVhdGVNcDNEZWNvZGVyVGVzdCkgeworICAgIHNpemVfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgQVNTRVJUX05FKG1lbVJlcXVpcmVtZW50cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudCBzaXplIjsKKyAgICB2b2lkICpkZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgQVNTRVJUX05FKGRlY29kZXJCdWYsIG51bGxwdHIpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29kZXIgbWVtb3J5IG9mIHNpemUgIiA8PCBtZW1SZXF1aXJlbWVudHM7CisgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IGtNYXhDb3VudDsgY291bnQrKykgeworICAgICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBkZWNvZGVyQnVmKTsKKyAgICAgICAgQUxPR1YoIkRlY29kZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkiKTsKKyAgICB9CisgICAgaWYgKGRlY29kZXJCdWYpIHsKKyAgICAgICAgZnJlZShkZWNvZGVyQnVmKTsKKyAgICAgICAgZGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgICAgfQorfQorCitURVNUX1AoTXAzRGVjb2RlclRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBzaXplX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICAgIEFTU0VSVF9ORShtZW1SZXF1aXJlbWVudHMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnQgc2l6ZSI7CisgICAgdm9pZCAqZGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIEFTU0VSVF9ORShkZWNvZGVyQnVmLCBudWxscHRyKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvZGVyIG1lbW9yeSBvZiBzaXplICIgPDwgbWVtUmVxdWlyZW1lbnRzOworCisgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgZGVjb2RlckJ1Zik7CisgICAgQUxPR1YoIkRlY29kZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkiKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworICAgIGJvb2wgc3RhdHVzID0gbU1wM1JlYWRlci5pbml0KGlucHV0RmlsZS5jX3N0cigpKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJVbmFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgbXAzUmVhZGVyIjsKKworICAgIC8vIE9wZW4gdGhlIG91dHB1dCBmaWxlLgorICAgIFNGX0lORk8gc2ZJbmZvOworICAgIFNOREZJTEUgKm91dEZpbGVIYW5kbGUgPSBvcGVuT3V0cHV0RmlsZSgmc2ZJbmZvKTsKKyAgICBBU1NFUlRfTkUob3V0RmlsZUhhbmRsZSwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcgZGVjb2RlZCBvdXRwdXQiOworCisgICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyID0gRGVjb2RlRnJhbWVzKGRlY29kZXJCdWYsIG91dEZpbGVIYW5kbGUsIHNmSW5mbyk7CisgICAgQVNTRVJUX0VRKGRlY29kZXJFcnIsIE5PX0RFQ09ESU5HX0VSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29kZSB0aGUgZnJhbWVzIjsKKyAgICBBU1NFUlRfRVEoc2ZJbmZvLmNoYW5uZWxzLCBtQ29uZmlnLT5udW1fY2hhbm5lbHMpIDw8ICJOdW1iZXIgb2YgY2hhbm5lbHMgZG9lcyBub3QgbWF0Y2giOworICAgIEFTU0VSVF9FUShzZkluZm8uc2FtcGxlcmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKSA8PCAiU2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2giOworCisgICAgbU1wM1JlYWRlci5jbG9zZSgpOworICAgIHNmX2Nsb3NlKG91dEZpbGVIYW5kbGUpOworICAgIGlmIChkZWNvZGVyQnVmKSB7CisgICAgICAgIGZyZWUoZGVjb2RlckJ1Zik7CisgICAgICAgIGRlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KK30KKworVEVTVF9QKE1wM0RlY29kZXJUZXN0LCBSZXNldERlY29kZXJUZXN0KSB7CisgICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKKyAgICBBU1NFUlRfTkUobWVtUmVxdWlyZW1lbnRzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50IHNpemUiOworICAgIHZvaWQgKmRlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKyAgICBBU1NFUlRfTkUoZGVjb2RlckJ1ZiwgbnVsbHB0cikKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGVjb2RlciBtZW1vcnkgb2Ygc2l6ZSAiIDw8IG1lbVJlcXVpcmVtZW50czsKKworICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIGRlY29kZXJCdWYpOworICAgIEFMT0dWKCJEZWNvZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LiIpOworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCk7CisgICAgYm9vbCBzdGF0dXMgPSBtTXAzUmVhZGVyLmluaXQoaW5wdXRGaWxlLmNfc3RyKCkpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBtcDNSZWFkZXIiOworCisgICAgLy8gT3BlbiB0aGUgb3V0cHV0IGZpbGUuCisgICAgU0ZfSU5GTyBzZkluZm87CisgICAgU05ERklMRSAqb3V0RmlsZUhhbmRsZSA9IG9wZW5PdXRwdXRGaWxlKCZzZkluZm8pOworICAgIEFTU0VSVF9ORShvdXRGaWxlSGFuZGxlLCBudWxscHRyKSA8PCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZyBkZWNvZGVkIG91dHB1dCI7CisKKyAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgZGVjb2RlckVyciA9IERlY29kZUZyYW1lcyhkZWNvZGVyQnVmLCBvdXRGaWxlSGFuZGxlLCBzZkluZm8sIGtOdW1GcmFtZVJlc2V0KTsKKyAgICBBU1NFUlRfRVEoZGVjb2RlckVyciwgTk9fREVDT0RJTkdfRVJST1IpIDw8ICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBmcmFtZXMiOworICAgIEFTU0VSVF9FUShzZkluZm8uY2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscykgPDwgIk51bWJlciBvZiBjaGFubmVscyBkb2VzIG5vdCBtYXRjaCI7CisgICAgQVNTRVJUX0VRKHNmSW5mby5zYW1wbGVyYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpIDw8ICJTYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaCI7CisKKyAgICBwdm1wM19yZXNldERlY29kZXIoZGVjb2RlckJ1Zik7CisgICAgLy8gRGVjb2RlIHRoZSBzYW1lIGZpbGUuCisgICAgZGVjb2RlckVyciA9IERlY29kZUZyYW1lcyhkZWNvZGVyQnVmLCBvdXRGaWxlSGFuZGxlLCBzZkluZm8pOworICAgIEFTU0VSVF9FUShkZWNvZGVyRXJyLCBOT19ERUNPRElOR19FUlJPUikgPDwgIkZhaWxlZCB0byBkZWNvZGUgdGhlIGZyYW1lcyI7CisgICAgQVNTRVJUX0VRKHNmSW5mby5jaGFubmVscywgbUNvbmZpZy0+bnVtX2NoYW5uZWxzKSA8PCAiTnVtYmVyIG9mIGNoYW5uZWxzIGRvZXMgbm90IG1hdGNoIjsKKyAgICBBU1NFUlRfRVEoc2ZJbmZvLnNhbXBsZXJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSkgPDwgIlNhbXBsZSByYXRlIGRvZXMgbm90IG1hdGNoIjsKKworICAgIG1NcDNSZWFkZXIuY2xvc2UoKTsKKyAgICBzZl9jbG9zZShvdXRGaWxlSGFuZGxlKTsKKyAgICBpZiAoZGVjb2RlckJ1ZikgeworICAgICAgICBmcmVlKGRlY29kZXJCdWYpOworICAgICAgICBkZWNvZGVyQnVmID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChNcDNEZWNvZGVyVGVzdEFsbCwgTXAzRGVjb2RlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJidWdfMTM2MDUzODg1Lm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmJiXzJjaF80NGtIel9sYW1lX2NyYy5tcDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMiKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IE1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvUkVBRE1FLm1kCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzZGVjX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L21wM2RlY190ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L21wM2RlY190ZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L21wM2RlY190ZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L21wM3JlYWRlci5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzcmVhZGVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L21wM3JlYWRlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNyZWFkZXIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzcmVhZGVyLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzcmVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNyZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L21wM3JlYWRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKaW5kZXggN2M0ZTYyZi4uZjlhYmZlMyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icApAQCAtMjEsNyArMjEsNiBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYW5kayMyOSIsCiAgICAgXSwKIAogICAgIC8vIGV4dHJhY3RvcnMgYXJlIHN1cHBvc2VkIHRvIHdvcmsgb24gUSgyOSkKQEAgLTM5LDYgKzM4LDIxIEBACiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAorICAgIHRhcmdldDogeworICAgICAgICBhbmRyb2lkOiB7CisgICAgICAgICAgICBzaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgICJsaWJtZWRpYW5kayMyOSIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBob3N0OiB7CisgICAgICAgICAgICBzdGF0aWNfbGliczogWworICAgICAgICAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICAgICAgICAgImxpYm1lZGlhbmRrX2Zvcm1hdCIsCisgICAgICAgICAgICAgICAgImxpYm1lZGlhX25ka2Zvcm1hdHByaXYiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9URVNUX01BUFBJTkcgYi9tZWRpYS9leHRyYWN0b3JzL1RFU1RfTUFQUElORwppbmRleCBhYmVmYjBmLi40OTg0YjhmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9leHRyYWN0b3JzL1RFU1RfTUFQUElORwpAQCAtMSw1ICsxLDYgQEAKIHsKICAgInByZXN1Ym1pdCI6IFsKKwogICAgIC8vIFRPRE8oYi8xNTM2NjE1OTEpIGVuYWJsZSB0ZXN0IG9uY2UgdGhlIGJ1ZyBpcyBmaXhlZAogICAgIC8vIFRoaXMgdGVzdHMgdGhlIGV4dHJhY3RvciBwYXRoCiAgICAgLy8gewpAQCAtMTMsNSArMTQsMTQgQEAKICAgICAvLyAgICAgIH0KICAgICAvLyAgICBdCiAgICAgLy8gIH0KKyAgXSwKKworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIkV4dHJhY3RvclVuaXRUZXN0IiB9CiAgIF0KKworCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA2MGQzYWUxLi5jMDM2YmI1IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTEwLDQgKzEwLDExIEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCmluZGV4IDQ5Yzk1NjcuLjQ0MDA2NWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icApAQCAtOCw0ICs4LDEwIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAppbmRleCA4MjZjMWEwLi4yNTkzMDAwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtMjEsNCArMjEsMTIgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDBlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImV4dHJhY3Rvci1mdXp6ZXJiYXNlLWRlZmF1bHRzIiwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGtfZm9ybWF0IiwKKyAgICAgICAgImxpYm1lZGlhX25ka2Zvcm1hdHByaXYiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyYmFzZS1kZWZhdWx0cyJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmV4dHJhY3RvcmZ1enplcmJhc2UiLAorICAgIF0sCisKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibXBlZzItZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXBlZzIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgICAgICJsaWJtcGVnMmV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJleHRyYWN0b3JmdXp6ZXJiYXNlIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyYmFzZS1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiRXh0cmFjdG9yRnV6emVyQmFzZS5jcHAiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDRfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXA0IiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgICAgICAibGlibXA0ZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1wNF9leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAid2F2X2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIndhdl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3dhdiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJmaWZvIiwKKyAgICAgICAgImxpYndhdmV4dHJhY3RvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImFtcl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL2FtciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJta3ZfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbWt2IiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYndlYm0iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYm1rdmV4dHJhY3RvciIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1rdl9leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm9nZ19leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL29nZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnZvcmJpc2lkZWMiLAorICAgICAgICAibGlib2dnZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm9nZ19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXBlZzJwc19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJtcGVnMi1leHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnMl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURNUEVHMlBTIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1wZWcycHNfZXh0cmFjdG9yX2Z1enplci5kaWN0IiwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1wZWcydHNfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsibXBlZzItZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAibXBlZzJfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibXBlZzJ0c19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXAzX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1wM19leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL21wMyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJmaWZvIiwKKyAgICAgICAgImxpYm1wM2V4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhYWNfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvYWFjIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiZmxhY19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvZmxhYyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAibGliZmxhY2V4dHJhY3RvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogImZsYWNfZXh0cmFjdG9yX2Z1enplci5kaWN0IiwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1pZGlfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAibWlkaV9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL21pZGkiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic29uaXZveCIsCisgICAgICAgICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKKyAgICAgICAgImxpYm1pZGlleHRyYWN0b3IiLAorICAgICAgICAibGlid2F0Y2hkb2ciLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibWlkaV9leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvRXh0cmFjdG9yRnV6emVyQmFzZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvRXh0cmFjdG9yRnV6emVyQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlODQ2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9FeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRXh0cmFjdG9yRnV6emVyQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2Jvb2wgRXh0cmFjdG9yRnV6emVyQmFzZTo6c2V0RGF0YVNvdXJjZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtQnVmZmVyU291cmNlID0gbmV3IEJ1ZmZlclNvdXJjZShkYXRhLCBzaXplKTsKKyAgbURhdGFTb3VyY2UgPSByZWludGVycHJldF9jYXN0PERhdGFTb3VyY2UqPihtQnVmZmVyU291cmNlLmdldCgpKTsKKyAgaWYgKCFtRGF0YVNvdXJjZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpnZXRFeHRyYWN0b3JEZWYoKSB7CisgIGZsb2F0IGNvbmZpZGVuY2U7CisgIHZvaWQqIG1ldGEgPSBudWxscHRyOworICBGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOworCisgIEV4dHJhY3RvckRlZiBleHRyYWN0b3JEZWYgPSBHRVRFWFRSQUNUT1JERUYoKTsKKyAgaWYgKGV4dHJhY3RvckRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEpIHsKKyAgICBleHRyYWN0b3JEZWYudS52Mi5zbmlmZihtRGF0YVNvdXJjZS0+d3JhcCgpLCAmY29uZmlkZW5jZSwgJm1ldGEsICZmcmVlTWV0YSk7CisgIH0gZWxzZSBpZiAoZXh0cmFjdG9yRGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgIGV4dHJhY3RvckRlZi51LnYzLnNuaWZmKG1EYXRhU291cmNlLT53cmFwKCksICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhKTsKKyAgfQorCisgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgZnJlZU1ldGEgIT0gbnVsbHB0cikgeworICAgIGZyZWVNZXRhKG1ldGEpOworICB9Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6ZXh0cmFjdFRyYWNrcygpIHsKKyAgTWVkaWFCdWZmZXJHcm91cCogYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICBpZiAoIWJ1ZmZlckdyb3VwKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICBNZWRpYVRyYWNrSGVscGVyKiB0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrSW5kZXgpOworICAgIGlmICghdHJhY2spIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBleHRyYWN0VHJhY2sodHJhY2ssIGJ1ZmZlckdyb3VwKTsKKyAgICBkZWxldGUgdHJhY2s7CisgIH0KKyAgZGVsZXRlIGJ1ZmZlckdyb3VwOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OmV4dHJhY3RUcmFjayhNZWRpYVRyYWNrSGVscGVyKiB0cmFjaywgTWVkaWFCdWZmZXJHcm91cCogYnVmZmVyR3JvdXApIHsKKyAgQ01lZGlhVHJhY2sqIGNUcmFjayA9IHdyYXAodHJhY2spOworICBpZiAoIWNUcmFjaykgeworICAgIHJldHVybjsKKyAgfQorCisgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOworICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgIGZyZWUoY1RyYWNrKTsKKyAgICByZXR1cm47CisgIH0KKworICBkbyB7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIqIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlcik7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfQorICB9IHdoaWxlIChzdGF0dXMgPT0gQU1FRElBX09LKTsKKworICBjVHJhY2stPnN0b3AodHJhY2spOworICBmcmVlKGNUcmFjayk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6Z2V0VHJhY2tzTWV0YWRhdGEoKSB7CisgIEFNZWRpYUZvcm1hdCogZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICB1aW50MzJfdCBmbGFncyA9IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhOworCisgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGZvcm1hdCwgdHJhY2tJbmRleCwgZmxhZ3MpOworICB9CisKKyAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OmdldE1ldGFkYXRhKCkgeworICBBTWVkaWFGb3JtYXQqIGZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgbUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoZm9ybWF0KTsKKyAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OnNldERhdGFTb3VyY2VGbGFncyh1aW50MzJfdCBmbGFncykgeworICBtQnVmZmVyU291cmNlLT5zZXRGbGFncyhmbGFncyk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6c2Vla0FuZEV4dHJhY3RUcmFja3MoKSB7CisgIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgaWYgKCFidWZmZXJHcm91cCkgeworICAgIHJldHVybjsKKyAgfQorICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgdHJhY2tDb3VudDsgKyt0cmFja0luZGV4KSB7CisgICAgTWVkaWFUcmFja0hlbHBlciogdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayh0cmFja0luZGV4KTsKKyAgICBpZiAoIXRyYWNrKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBBTWVkaWFGb3JtYXQqIHRyYWNrTWV0YURhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgaW50NjRfdCB0cmFja0R1cmF0aW9uID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhOworICAgIG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodHJhY2tNZXRhRGF0YSwgdHJhY2tJbmRleCwgZmxhZ3MpOworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFja01ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmdHJhY2tEdXJhdGlvbik7CisKKyAgICBzZWVrQW5kRXh0cmFjdFRyYWNrKHRyYWNrLCBidWZmZXJHcm91cCwgdHJhY2tEdXJhdGlvbik7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja01ldGFEYXRhKTsKKyAgICBkZWxldGUgdHJhY2s7CisgIH0KKyAgZGVsZXRlIGJ1ZmZlckdyb3VwOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OnNlZWtBbmRFeHRyYWN0VHJhY2soTWVkaWFUcmFja0hlbHBlciogdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXJHcm91cCogYnVmZmVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0cmFja0R1cmF0aW9uKSB7CisgIENNZWRpYVRyYWNrKiBjVHJhY2sgPSB3cmFwKHRyYWNrKTsKKyAgaWYgKCFjVHJhY2spIHsKKyAgICByZXR1cm47CisgIH0KKworICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICBmcmVlKGNUcmFjayk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBzZWVrQ291bnQgPSAwOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBzZWVrVG9UaW1lU3RhbXA7CisgIHdoaWxlIChzZWVrQ291bnQgPD0ga0Z1enplck1heFNlZWtQb2ludHNDb3VudCkgeworICAgIC8qIFRoaXMgZW5zdXJlcyBrRnV6emVyTWF4U2Vla1BvaW50c0NvdW50IHNlZWsgcG9pbnRzIGFyZSB3aXRoaW4gdGhlIGNsaXBEdXJhdGlvbiBhbmQgMSBzZWVrCisgICAgICogcG9pbnQgaXMgb3V0c2lkZSBvZiB0aGUgY2xpcER1cmF0aW9uLgorICAgICAqLworICAgIGludDY0X3QgdGltZVN0YW1wID0gKHNlZWtDb3VudCAqIHRyYWNrRHVyYXRpb24pIC8gKGtGdXp6ZXJNYXhTZWVrUG9pbnRzQ291bnQgLSAxKTsKKyAgICBzZWVrVG9UaW1lU3RhbXAucHVzaF9iYWNrKHRpbWVTdGFtcCk7CisgICAgc2Vla0NvdW50Kys7CisgIH0KKworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gc2Vla09wdGlvbnM7CisgIHNlZWtPcHRpb25zLnB1c2hfYmFjayhDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLIHwgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKTsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQyk7CisgIHNlZWtPcHRpb25zLnB1c2hfYmFjayhDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLIHwgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyk7CisgIHNlZWtPcHRpb25zLnB1c2hfYmFjayhDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLIHwgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCk7CisKKyAgZm9yICh1aW50MzJfdCBzZWVrT3B0aW9uIDogc2Vla09wdGlvbnMpIHsKKyAgICBmb3IgKGludDY0X3Qgc2Vla1B0cyA6IHNlZWtUb1RpbWVTdGFtcCkgeworICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMqIG9wdGlvbnMgPQorICAgICAgICAgIG5ldyBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyhzZWVrT3B0aW9uLCBzZWVrUHRzKTsKKyAgICAgIE1lZGlhQnVmZmVySGVscGVyKiBidWZmZXIgPSBudWxscHRyOworICAgICAgdHJhY2stPnJlYWQoJmJ1ZmZlciwgb3B0aW9ucyk7CisgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgfQorICAgICAgZGVsZXRlIG9wdGlvbnM7CisgICAgfQorICB9CisKKyAgY1RyYWNrLT5zdG9wKHRyYWNrKTsKKyAgZnJlZShjVHJhY2spOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OnByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzZXREYXRhU291cmNlKGRhdGEsIHNpemUpKSB7CisgICAgaWYgKGNyZWF0ZUV4dHJhY3RvcigpKSB7CisgICAgICBnZXRFeHRyYWN0b3JEZWYoKTsKKyAgICAgIGdldE1ldGFkYXRhKCk7CisgICAgICBleHRyYWN0VHJhY2tzKCk7CisgICAgICBnZXRUcmFja3NNZXRhZGF0YSgpOworICAgICAgc2Vla0FuZEV4dHJhY3RUcmFja3MoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9SRUFETUUubWQgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWQ1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzYyIEBACisjIEZ1enplciBmb3IgZXh0cmFjdG9ycworCisjIyBUYWJsZSBvZiBjb250ZW50cworKyBbbGliZXh0cmFjdG9yZnV6emVyYmFzZV0oI0V4dHJhY3RvckZ1enplckJhc2UpCisrIFtsaWJtcDRleHRyYWN0b3JdKCNtcDRFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJ3YXZleHRyYWN0b3JdKCN3YXZFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJhbXJleHRyYWN0b3JdKCNhbXJFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJta3ZleHRyYWN0b3JdKCNta3ZFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJvZ2dleHRyYWN0b3JdKCNvZ2dFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJtcGVnMmV4dHJhY3Rvcl0oI21wZWcyRXh0cmFjdG9yRnV6emVyKQorKyBbbGlibXAzZXh0cmFjdG9yXSgjbXAzRXh0cmFjdG9yRnV6emVyKQorKyBbbGliYWFjZXh0cmFjdG9yXSgjYWFjRXh0cmFjdG9yRnV6emVyKQorKyBbbGliZmxhY2V4dHJhY3Rvcl0oI2ZsYWNFeHRyYWN0b3IpCisrIFtsaWJtaWRpZXh0cmFjdG9yXSgjbWlkaUV4dHJhY3RvckZ1enplcikKKworIyA8YSBuYW1lPSJFeHRyYWN0b3JGdXp6ZXJCYXNlIj48L2E+IEZ1enplciBmb3IgbGliZXh0cmFjdG9yZnV6emVyYmFzZQorQWxsIHRoZSBleHRyYWN0b3JzIGhhdmUgYSBjb21tb24gQVBJIC0gY3JlYXRpbmcgYSBkYXRhIHNvdXJjZSwgZXh0cmFjdGlvbgorb2YgYWxsIHRoZSB0cmFja3MsIGV0Yy4gVGhlc2UgY29tbW9uIEFQSXMgaGF2ZSBiZWVuIGFic3RyYWN0ZWQgaW4gYSBiYXNlIGNsYXNzCitjYWxsZWQgYEV4dHJhY3RvckZ1enplckJhc2VgIHRvIGVuc3VyZSBjb2RlIGlzIHJldXNlZCBiZXR3ZWVuIGZ1enplciBwbHVnaW5zLgorCitBZGRpdGlvbmFsbHksIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBhbHNvIGhhcyBzdXBwb3J0IGZvciBtZW1vcnkgYmFzZWQgYnVmZmVyCitgQnVmZmVyU291cmNlYCBzaW5jZSB0aGUgZnV6emluZyBlbmdpbmUgZmVlZHMgZGF0YSB1c2luZyBtZW1vcnkgYnVmZmVycyBhbmQKK3VzYWdlIG9mIHN0YW5kYXJkIGRhdGEgc291cmNlIG9iamVjdHMgbGlrZSBGaWxlU291cmNlLCBIVFRQU291cmNlLCBldGMuIGlzCitub3QgZmVhc2libGUuCisKKyMgPGEgbmFtZT0ibXA0RXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlibXA0ZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNUDQgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNUDQgZXh0cmFjdG9yIGNsYXNzLgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGUgKGRpY3Rpb25hcnkgZmlsZSkgaXMgY3JlYXRlZCBmb3IgTVA0IHRvIGVuc3VyZSB0aGF0IHRoZSByZXF1aXJlZCBNUDQKK2F0b21zIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQgYXMgYSByYW5nZSBvZiBNUDQgYXRvbXMgd2lsbCBiZQorcHJlc2VudCBpbiB0aGUgaW5wdXQgZGF0YS4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcDRfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXA0X2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBNUDQgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0id2F2RXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlid2F2ZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBXQVYgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBXQVYgZXh0cmFjdG9yIGNsYXNzLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIHdhdl9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSB3YXZfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIHdhdiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC93YXZfZXh0cmFjdG9yX2Z1enplci93YXZfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJhbXJFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJhbXJleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFNUiBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIEFNUiBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBBTVIgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGFtcl9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhbXJfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIEFNUiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hbXJfZXh0cmFjdG9yX2Z1enplci9hbXJfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJta3ZFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJta3ZleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1LViBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIE1LViBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBNS1YgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIGVsZW1lbnQKK0lEJ3MgYXJlIHByZXNlbnQgaW4gZXZlcnkgaW5wdXQgZmlsZSB0aGF0IGdvZXMgdG8gdGhlIGZ1enplci4KK1RoaXMgZW5zdXJlcyB0aGF0IGxhcmdlciBjb2RlIGdldHMgY292ZXJlZC4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBta3ZfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWt2X2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBta3YgZmlsZXMgdG8gdGhhdCBmb2xkZXIuCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21rdl9leHRyYWN0b3JfZnV6emVyL21rdl9leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im9nZ0V4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm9nZ2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgT0dHIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgT0dHIGV4dHJhY3RvciBvYmplY3QuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBPR0cgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG9nZ19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBvZ2dfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG9nZyBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0ibXBlZzJFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJtcGVnMmV4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbnMgZm9yIE1QRUcyLVBTIGFuZCBNUEVHMi1UUyBleHRyYWN0b3IgdXNlIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnQgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNUEVHMi1QUyBvciBNUEVHMi1UUyBleHRyYWN0b3IKK29iamVjdCByZXNwZWN0aXZlbHkuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZXMgKGRpY3Rpb25hcnkgZmlsZXMpIGFyZSBjcmVhdGVkIGZvciBNUEVHMi1QUyBhbmQgTVBFRzItVFMgdG8gZW5zdXJlIHRoYXQgdGhlCityZXF1aXJlZCBzdGFydCBieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisjIyMjIyBPdGhlciBjb25zaWRlcmF0aW9ucworVHdvIGZ1enplciBiaW5hcmllcyAtIG1wZWcycHNfZXh0cmFjdG9yX2Z1enplciBhbmQgbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIGFyZQorZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIGZsYWcgLSBgTVBFRzJQU2AKKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIgYW5kIG1wZWcydHNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXBlZzJwc19leHRyYWN0b3JfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBtcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBtcGVnMiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIvbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im1wM0V4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm1wM2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgTVAzIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgTVAzIGV4dHJhY3RvciBjbGFzcy4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcDNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXAzX2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBtcDMgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0iYWFjRXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGliYWFjZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBBQUMgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBBQUMgZXh0cmFjdG9yIGNsYXNzLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGFhY19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhYWNfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIGFhYyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hYWNfZXh0cmFjdG9yX2Z1enplci9hYWNfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJmbGFjRXh0cmFjdG9yIj48L2E+IEZ1enplciBmb3IgbGliZmxhY2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgRkxBQyBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIEZMQUMgZXh0cmFjdG9yIG9iamVjdC4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIEZMQUMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGZsYWNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgZmxhY19leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZmxhYyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIvZmxhY19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im1pZGlFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJtaWRpZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNSURJIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgTUlESSBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBNSURJIHRvIGVuc3VyZSB0aGF0IHRoZSByZXF1aXJlZCBNSURJCitoZWFkZXJzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQgYXMgYSByYW5nZSBvZiBNSURJIGhlYWRlcnMgd2lsbCBiZQorcHJlc2VudCBpbiB0aGUgaW5wdXQgZGF0YS4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtaWRpX2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1pZGlfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIE1JREkgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWlkaV9leHRyYWN0b3JfZnV6emVyL21pZGlfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2FhY19leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE2Y2M5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2FhY19leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkFBQ0V4dHJhY3Rvci5oIgorCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgQWFjRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgQWFjRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+QWFjRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIEFhY0V4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IEFBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSwgMCk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQWFjRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgQWFjRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2Ftcl9leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzllMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2Ftcl9leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgIkFNUkV4dHJhY3Rvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgQW1yRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgQW1yRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+QW1yRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIEFtckV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IEFNUkV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQW1yRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgQW1yRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTcyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDIgQEAKKyMgU3RhcnQgY29kZQora3cxPSIjIUFNUiIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczNGQ0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiRkxBQ0V4dHJhY3Rvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgRmxhY0V4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIEZsYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5GbGFjRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIEZsYWNFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBGTEFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGbGFjRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgRmxhY0V4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYWQ0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwzIEBACisjIFN0YXJ0IGNvZGUgKGJ5dGVzIDAtMykKKyMgVGhlIGJlbG93IDQgYnl0ZXMgY29ycmVzcG9uZCB0byAiZkxhQyIgaW4gQVNDSUkKK2t3MT0iXHg2Nlx4NENceDYxXHg0MyIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9pbmNsdWRlL0V4dHJhY3RvckZ1enplckJhc2UuaCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9pbmNsdWRlL0V4dHJhY3RvckZ1enplckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJhMWMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2luY2x1ZGUvRXh0cmFjdG9yRnV6emVyQmFzZS5oCkBAIC0wLDAgKzEsMTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2lmbmRlZiBfX0VYVFJBQ1RPUl9GVVpaRVJfQkFTRV9IX18KKyNkZWZpbmUgX19FWFRSQUNUT1JfRlVaWkVSX0JBU0VfSF9fCisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCitleHRlcm4gIkMiIHsKK2FuZHJvaWQ6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKTsKK30KKworY29uc3RleHByIGludDMyX3Qga0Z1enplck1heFNlZWtQb2ludHNDb3VudCA9IDU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBFeHRyYWN0b3JGdXp6ZXJCYXNlKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5FeHRyYWN0b3JGdXp6ZXJCYXNlKCkgeworICAgIGlmIChtRXh0cmFjdG9yKSB7CisgICAgICBkZWxldGUgbUV4dHJhY3RvcjsKKyAgICAgIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUJ1ZmZlclNvdXJjZSkgeworICAgICAgbUJ1ZmZlclNvdXJjZS5jbGVhcigpOworICAgICAgbUJ1ZmZlclNvdXJjZSA9IG51bGxwdHI7CisgICAgfQorICB9CisKKyAgLyoqIEZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgbWVkaWEgZXh0cmFjdG9yIGNvbXBvbmVudC4KKyAgICAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLgorICAgICovCisgIHZpcnR1YWwgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKSA9IDA7CisKKyAgLyoqIFBhcmVudCBjbGFzcyBmdW5jdGlvbnMgdG8gYmUgcmV1c2VkIGJ5IGRlcml2ZWQgY2xhc3MuCisgICAgKiBUaGVzZSBhcmUgY29tbW9uIGZvciBhbGwgbWVkaWEgZXh0cmFjdG9yIGNvbXBvbmVudHMuCisgICAgKi8KKyAgYm9vbCBzZXREYXRhU291cmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKKworICB2b2lkIGdldEV4dHJhY3RvckRlZigpOworCisgIHZvaWQgZXh0cmFjdFRyYWNrcygpOworCisgIHZvaWQgZ2V0TWV0YWRhdGEoKTsKKworICB2b2lkIGdldFRyYWNrc01ldGFkYXRhKCk7CisKKyAgdm9pZCBzZXREYXRhU291cmNlRmxhZ3ModWludDMyX3QgZmxhZ3MpOworCisgIHZvaWQgc2Vla0FuZEV4dHJhY3RUcmFja3MoKTsKKworICB2b2lkIHByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKKworIHByb3RlY3RlZDoKKyAgY2xhc3MgQnVmZmVyU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworICAgcHVibGljOgorICAgIEJ1ZmZlclNvdXJjZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSA6IG1EYXRhKGRhdGEpLCBtTGVuZ3RoKGxlbmd0aCkge30KKyAgICB2aXJ0dWFsIH5CdWZmZXJTb3VyY2UoKSB7IG1EYXRhID0gbnVsbHB0cjsgfQorCisgICAgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBmbGFncykgeyBtRmxhZ3MgPSBmbGFnczsgfQorCisgICAgdWludDMyX3QgZmxhZ3MoKSB7IHJldHVybiBtRmxhZ3M7IH0KKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIG1EYXRhICE9IG51bGxwdHIgPyBPSyA6IE5PX0lOSVQ7IH0KKworICAgIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgaWYgKCFtRGF0YSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgIH0KKworICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgIGlmICgob2Zmc2V0ID49IHN0YXRpY19jYXN0PG9mZjY0X3Q+KG1MZW5ndGgpKSB8fCAob2Zmc2V0IDwgMCkpIHsKKyAgICAgICAgcmV0dXJuIDA7ICAvLyByZWFkIGJleW9uZCBib3VuZHMuCisgICAgICB9CisgICAgICBzaXplX3QgbnVtQXZhaWxhYmxlID0gbUxlbmd0aCAtIHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0KTsKKyAgICAgIGlmIChzaXplID4gbnVtQXZhaWxhYmxlKSB7CisgICAgICAgIHNpemUgPSBudW1BdmFpbGFibGU7CisgICAgICB9CisgICAgICByZXR1cm4gcmVhZEF0X2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QqIHNpemUpIHsKKyAgICAgIGlmICghbURhdGEpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICB9CisKKyAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PG9mZjY0X3Q+KG1MZW5ndGgpOworICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgcHJvdGVjdGVkOgorICAgIHNzaXplX3QgcmVhZEF0X2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICB2b2lkKiByZXN1bHQgPSBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIHNpemUpOworICAgICAgcmV0dXJuIHJlc3VsdCAhPSBudWxscHRyID8gc2l6ZSA6IDA7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCogbURhdGEgPSBudWxscHRyOworICAgIHNpemVfdCBtTGVuZ3RoID0gMDsKKyAgICBNdXRleCBtTG9jazsKKyAgICB1aW50MzJfdCBtRmxhZ3MgPSAwOworCisgICBwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJ1ZmZlclNvdXJjZSk7CisgIH07CisKKyAgc3A8QnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICBEYXRhU291cmNlKiBtRGF0YVNvdXJjZSA9IG51bGxwdHI7CisgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKiBtRXh0cmFjdG9yID0gbnVsbHB0cjsKKworICB2aXJ0dWFsIHZvaWQgZXh0cmFjdFRyYWNrKE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrLCBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCk7CisgIHZpcnR1YWwgdm9pZCBzZWVrQW5kRXh0cmFjdFRyYWNrKE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrLCBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0cmFja0R1cmF0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX19FWFRSQUNUT1JfRlVaWkVSX0JBU0VfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWlkaV9leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9taWRpX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMmExMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWlkaV9leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgIk1pZGlFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1JRElFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBNSURJRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+TUlESUV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNSURJRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgTWlkaUV4dHJhY3RvcihtRGF0YVNvdXJjZS0+d3JhcCgpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNSURJRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTUlESUV4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21pZGlfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21pZGlfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNmJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWlkaV9leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwzIEBACisjIE1JREkgQ2h1bmtzCitrdzE9Ik1UaGQiCitrdzI9Ik1UcmsiCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21rdl9leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2ViOTNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21rdl9leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgIk1hdHJvc2thRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNS1ZFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBNS1ZFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NS1ZFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgTUtWRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgTWF0cm9za2FFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIE1LVkV4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IE1LVkV4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21rdl9leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzgxNWRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21rdl9leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyNDQgQEAKKyMgRWxlbWVudHMgSUQncwora3cxPSJceDQyXHg4NiIKK2t3Mj0iXHg0Mlx4RjciCitrdzM9Ilx4NDJceEYyIgora3c0PSJceDQyXHhGMyIKK2t3NT0iXHg0Mlx4ODciCitrdzY9Ilx4NDJceDg1Igora3c3PSJceDE4XHg1M1x4ODBceDY3Igora3c4PSJceDExXHg0RFx4OUJceDc0Igora3c5PSJceDREXHhCQiIKK2t3MTA9Ilx4NTNceEFCIgora3cxMT0iXHg1M1x4QUMiCitrdzEyPSJceDE1XHg0OVx4QTlceDY2Igora3cxMz0iXHg3M1x4QTQiCitrdzE0PSJceDczXHg4NCIKK2t3MTU9Ilx4M0NceEI5XHgyMyIKK2t3MTY9Ilx4M0NceDgzXHhBQiIKK2t3MTc9Ilx4M0NceEI5XHgyMyIKK2t3MTg9Ilx4M0VceDgzXHhCQiIKK2t3MTk9Ilx4NDRceDQ0Igora3cyMD0iXHg2OVx4MjQiCitrdzIxPSJceDY5XHhGQyIKK2t3MjI9Ilx4NjlceEJGIgora3cyMz0iXHg2OVx4QTUiCitrdzI0PSJceDJBXHhEN1x4QjEiCitrdzI1PSJceDQ0XHg4OSIKK2t3MjY9Ilx4NDRceDYxIgora3cyNz0iXHg3Qlx4QTkiCitrdzI4PSJceDREXHg4MCIKK2t3Mjk9Ilx4NTdceDQxIgora3czMD0iXHgxRlx4NDNceEI2XHg3NSIKK2t3MzE9Ilx4RTciCitrdzMyPSJceDU4XHg1NCIKK2t3MzM9Ilx4NThceEQ3Igora3czND0iXHhBNyIKK2t3MzU9Ilx4QUIiCitrdzM2PSJceEEzIgora3czNz0iXHhBMCIKK2t3Mzg9Ilx4QTEiCitrdzM5PSJceEEyIgora3c0MD0iXHg3NVx4QTEiCitrdzQxPSJceDJBXHhEN1x4QjEiCitrdzQyPSJceEE2Igora3c0Mz0iXHhFRSIKK2t3NDQ9Ilx4QTUiCitrdzQ1PSJceDlBIgora3c0Nj0iXHhGQSIKK2t3NDc9Ilx4RkIiCitrdzQ4PSJceEZEIgora3c0OT0iXHhBNCIKK2t3NTA9Ilx4NzVceEEyIgora3c1MT0iXHg4RSIKK2t3NTI9Ilx4RTgiCitrdzUzPSJceENDIgora3c1ND0iXHhDRCIKK2t3NTU9Ilx4Q0IiCitrdzU2PSJceENFIgora3c1Nz0iXHhDRiIKK2t3NTg9Ilx4QzgiCitrdzU5PSJceEM5Igora3c2MD0iXHhDQSIKK2t3NjE9Ilx4QUYiCitrdzYyPSJceDE2XHg1NFx4QUVceDZCIgora3c2Mz0iXHhBRSIKK2t3NjQ9Ilx4RDciCitrdzY1PSJceDczXHhDNSIKK2t3NjY9Ilx4ODMiCitrdzY3PSJceEI5Igora3c2OD0iXHg4OCIKK2t3Njk9Ilx4NTVceEFBIgora3c3MD0iXHg5QyIKK2t3NzE9Ilx4NkRceEU3Igora3c3Mj0iXHg2RFx4RjgiCitrdzczPSJceDIzXHhFM1x4ODMiCitrdzc0PSJceDIzXHg0RVx4N0EiCitrdzc1PSJceDIzXHgzMVx4NEYiCitrdzc2PSJceDUzXHg3RiIKK2t3Nzc9Ilx4NTVceEVFIgora3c3OD0iXHg1M1x4NkUiCitrdzc5PSJceDIyXHhCNVx4OUMiCitrdzgwPSJceDIyXHhCNVx4OUQiCitrdzgxPSJceDg2Igora3c4Mj0iXHg2M1x4QTIiCitrdzgzPSJceDI1XHg4Nlx4ODgiCitrdzg0PSJceDI2XHhCMlx4NDAiCitrdzg1PSJceEFBIgora3c4Nj0iXHg2Rlx4QUIiCitrdzg3PSJceDU2XHhBQSIKK2t3ODg9Ilx4NTZceEJCIgora3c4OT0iXHg2Nlx4MjQiCitrdzkwPSJceDY2XHhGQyIKK2t3OTE9Ilx4NjZceEJGIgora3c5Mj0iXHhFMCIKK2t3OTM9Ilx4OUEiCitrdzk0PSJceDlEIgora3c5NT0iXHg1M1x4QjgiCitrdzk2PSJceDUzXHhDMCIKK2t3OTc9Ilx4NTNceEI5Igora3c5OD0iXHhCMCIKK2t3OTk9Ilx4QkEiCitrdzEwMD0iXHg1NFx4QUEiCitrdzEwMT0iXHg1NFx4QkIiCitrdzEwMj0iXHg1NFx4Q0MiCitrdzEwMz0iXHg1NFx4REQiCitrdzEwND0iXHg1NFx4QjAiCitrdzEwNT0iXHg1NFx4QkEiCitrdzEwNj0iXHg1NFx4QjIiCitrdzEwNz0iXHg1NFx4QjMiCitrdzEwOD0iXHgyRVx4QjVceDI0Igora3cxMDk9Ilx4MkZceEI1XHgyMyIKK2t3MTEwPSJceDIzXHg4M1x4RTMiCitrdzExMT0iXHg1NVx4QjAiCitrdzExMj0iXHg1NVx4QjEiCitrdzExMz0iXHg1NVx4QjIiCitrdzExND0iXHg1NVx4QjMiCitrdzExNT0iXHg1NVx4QjQiCitrdzExNj0iXHg1NVx4QjUiCitrdzExNz0iXHg1NVx4QjYiCitrdzExOD0iXHg1NVx4QjciCitrdzExOT0iXHg1NVx4QjgiCitrdzEyMD0iXHg1NVx4QjkiCitrdzEyMT0iXHg1NVx4QkEiCitrdzEyMj0iXHg1NVx4QkIiCitrdzEyMz0iXHg1NVx4QkMiCitrdzEyND0iXHg1NVx4QkQiCitrdzEyNT0iXHg1NVx4RDAiCitrdzEyNj0iXHg1NVx4RDEiCitrdzEyNz0iXHg1NVx4RDIiCitrdzEyOD0iXHg1NVx4RDMiCitrdzEyOT0iXHg1NVx4RDQiCitrdzEzMD0iXHg1NVx4RDUiCitrdzEzMT0iXHg1NVx4RDYiCitrdzEzMj0iXHg1NVx4RDciCitrdzEzMz0iXHg1NVx4RDgiCitrdzEzND0iXHg1NVx4RDkiCitrdzEzNT0iXHg1NVx4REEiCitrdzEzNj0iXHg3Nlx4NzAiCitrdzEzNz0iXHg3Nlx4NzEiCitrdzEzOD0iXHg3Nlx4NzIiCitrdzEzOT0iXHg3Nlx4NzMiCitrdzE0MD0iXHg3Nlx4NzQiCitrdzE0MT0iXHg3Nlx4NzUiCitrdzE0Mj0iXHhFMSIKK2t3MTQzPSJceEI1Igora3cxNDQ9Ilx4NzhceEI1Igora3cxNDU9Ilx4OUYiCitrdzE0Nj0iXHg3RFx4N0IiCitrdzE0Nz0iXHg2Mlx4NjQiCitrdzE0OD0iXHhFMiIKK2t3MTQ5PSJceEUzIgora3cxNTA9Ilx4RTQiCitrdzE1MT0iXHhFNSIKK2t3MTUyPSJceEU2Igora3cxNTM9Ilx4RTkiCitrdzE1ND0iXHhFRCIKK2t3MTU1PSJceEMwIgora3cxNTY9Ilx4QzEiCitrdzE1Nz0iXHhDNiIKK2t3MTU4PSJceEM3Igora3cxNTk9Ilx4QzQiCitrdzE2MD0iXHg2RFx4ODAiCitrdzE2MT0iXHg2Mlx4NDAiCitrdzE2Mj0iXHg1MFx4MzEiCitrdzE2Mz0iXHg1MFx4MzIiCitrdzE2ND0iXHg1MFx4MzMiCitrdzE2NT0iXHg1MFx4MzQiCitrdzE2Nj0iXHg1MFx4MzUiCitrdzE2Nz0iXHg0Mlx4NTQiCitrdzE2OD0iXHg0Mlx4NTUiCitrdzE2OT0iXHg0N1x4RTEiCitrdzE3MD0iXHg0N1x4RTIiCitrdzE3MT0iXHg0N1x4RTciCitrdzE3Mj0iXHg0N1x4RTgiCitrdzE3Mz0iXHg0N1x4RTMiCitrdzE3ND0iXHg0N1x4RTQiCitrdzE3NT0iXHg0N1x4RTUiCitrdzE3Nj0iXHg0N1x4RTYiCitrdzE3Nz0iXHgxQ1x4NTNceEJCXHg2QiIKK2t3MTc4PSJceEJCIgora3cxNzk9Ilx4QjMiCitrdzE4MD0iXHhCNyIKK2t3MTgxPSJceEY3Igora3cxODI9Ilx4RjEiCitrdzE4Mz0iXHhGMCIKK2t3MTg0PSJceEIyIgora3cxODU9Ilx4NTNceDc4Igora3cxODY9Ilx4RUEiCitrdzE4Nz0iXHhEQiIKK2t3MTg4PSJceDk2Igora3cxODk9Ilx4OTciCitrdzE5MD0iXHg1M1x4NUYiCitrdzE5MT0iXHhFQiIKK2t3MTkyPSJceDE5XHg0MVx4QTRceDY5Igora3cxOTM9Ilx4NDZceDdFIgora3cxOTQ9Ilx4NDZceDZFIgora3cxOTU9Ilx4NDZceDYwIgora3cxOTY9Ilx4NDZceDVDIgora3cxOTc9Ilx4NDZceEFFIgora3cxOTg9Ilx4NDZceDc1Igora3cxOTk9Ilx4NDZceDYxIgora3cyMDA9Ilx4NDZceDYyIgora3cyMDE9Ilx4MTBceDQzXHhBN1x4NzAiCitrdzIwMj0iXHg0NVx4QjkiCitrdzIwMz0iXHg0NVx4QkMiCitrdzIwND0iXHg0NVx4QkQiCitrdzIwNT0iXHg0NVx4REIiCitrdzIwNj0iXHg0NVx4REQiCitrdzIwNz0iXHhCNiIKK2t3MjA4PSJceDczXHhDNCIKK2t3MjA5PSJceDU2XHg1NCIKK2t3MjEwPSJceDkxIgora3cyMTE9Ilx4OTIiCitrdzIxMj0iXHg5OCIKK2t3MjEzPSJceDQ1XHg5OCIKK2t3MjE0PSJceDZFXHg2NyIKK2t3MjE1PSJceDZFXHhCQyIKK2t3MjE2PSJceDYzXHhDMyIKK2t3MjE3PSJceDhGIgora3cyMTg9Ilx4ODkiCitrdzIxOT0iXHg4MCIKK2t3MjIwPSJceDg1Igora3cyMjE9Ilx4NDNceDdDIgora3cyMjI9Ilx4NDNceDdEIgora3cyMjM9Ilx4NDNceDdFIgora3cyMjQ9Ilx4NjlceDQ0Igora3cyMjU9Ilx4NjlceDU1Igora3cyMjY9Ilx4NDVceDBEIgora3cyMjc9Ilx4NjlceDExIgora3cyMjg9Ilx4NjlceDIyIgora3cyMjk9Ilx4NjlceDMzIgora3cyMzA9Ilx4MTJceDU0XHhDM1x4NjciCitrdzIzMT0iXHg3M1x4NzMiCitrdzIzMj0iXHg2M1x4QzAiCitrdzIzMz0iXHg2OFx4Q0EiCitrdzIzND0iXHg2M1x4Q0EiCitrdzIzNT0iXHg2M1x4QzUiCitrdzIzNj0iXHg2M1x4QzkiCitrdzIzNz0iXHg2N1x4QzgiCitrdzIzOD0iXHg0NVx4QTMiCitrdzIzOT0iXHg0NFx4N0EiCitrdzI0MD0iXHg0NFx4N0IiCitrdzI0MT0iXHg0NFx4ODQiCitrdzI0Mj0iXHg0NFx4ODciCitrdzI0Mz0iXHg0NFx4ODUiCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wM19leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ3YzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wM19leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgIk1QM0V4dHJhY3Rvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTXAzRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgTXAzRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+TXAzRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIE1wM0V4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IE1QM0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSwgbnVsbHB0cik7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTXAzRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTXAzRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wNF9leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTAzNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wNF9leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgIk1QRUc0RXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiU2FtcGxlVGFibGUuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1QNEV4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIE1QNEV4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfk1QNEV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNUDRFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBNUEVHNEV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHNldERhdGFTb3VyY2VGbGFncyhEYXRhU291cmNlQmFzZTo6a1dhbnRzUHJlZmV0Y2hpbmcgfCBEYXRhU291cmNlQmFzZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIE1QNEV4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IE1QNEV4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wNF9leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjgzNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wNF9leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyNDggQEAKKyMgTVA0IEF0b21zL0JveGVzCitrdzE9ImZ0eXAiCitrdzI9ImZyZWUiCitrdzM9Im1kYXQiCitrdzQ9Im1vb3YiCitrdzU9Im12aGQiCitrdzY9InRyYWsiCitrdzc9InRraGQiCitrdzg9ImVkdHMiCitrdzk9ImVsc3QiCitrdzEwPSJtZGlhIgora3cxMT0ibWRoZCIKK2t3MTI9ImhkbHIiCitrdzEzPSJtaW5mIgora3cxND0idm1oZCIKK2t3MTU9ImRpbmYiCitrdzE2PSJkcmVmIgora3cxNz0idXJsICIKK2t3MTg9InN0YmwiCitrdzE5PSJzdHNkIgora3cyMD0iYXZjMSIKK2t3MjE9ImF2Y0MiCitrdzIyPSJzdHRzIgora3cyMz0ic3RzcyIKK2t3MjQ9ImN0dHMiCitrdzI1PSJzdHNjIgora3cyNj0ic3RzeiIKK2t3Mjc9InN0Y28iCitrdzI4PSJtcDRhIgora3cyOT0iZXNkcyIKK2t3MzA9InVkdGEiCitrdzMxPSJtZXRhIgora3czMj0iaWxzdCIKK2t3MzM9InNhbXIiCitrdzM0PSJzYXdiIgora3czNT0iZWMtMyIKK2t3MzY9Im1wNHYiCitrdzM3PSJzMjYzIgora3czOD0iaDI2MyIKK2t3Mzk9IkgyNjMiCitrdzQwPSJhdmMxIgora3c0MT0iaHZjMSIKK2t3NDI9ImhldjEiCitrdzQzPSJhYy00Igora3c0ND0iT3B1cyIKK2t3NDU9InR3b3MiCitrdzQ2PSJzb3d0Igora3c0Nz0iYWxhYyIKK2t3NDg9ImZMYUMiCitrdzQ5PSJhdjAxIgora3c1MD0iLm1wMyIKK2t3NTE9ImtleXMiCitrdzUyPSJjcHJ0Igora3c1Mz0iY292ciIKK2t3NTQ9Im12ZXgiCitrdzU1PSJtb29mIgora3c1Nj0idHJhZiIKK2t3NTc9Im1mcmEiCitrdzU4PSJzaW5mIgora3c1OT0ic2NoaSIKK2t3NjA9IndhdmUiCitrdzYxPSJzY2htIgora3c2Mj0iY2JjMSIKK2t3NjM9ImNiY3MiCitrdzY0PSJjZW5jIgora3c2NT0iY2VucyIKK2t3NjY9ImZybWEiCitrdzY3PSJ0ZW5jIgora3c2OD0idHJlZiIKK2t3Njk9InRobWIiCitrdzcwPSJwc3NoIgora3c3MT0ibWV0dCIKK2t3NzI9ImVuY2EiCitrdzczPSJlbmN2Igora3c3ND0iY282NCIKK2t3NzU9InN0ejIiCitrdzc2PSJceEE5eHl6Igora3c3Nz0iYnRydCIKK2t3Nzg9Imh2Y0MiCitrdzc5PSJhdjFDIgora3c4MD0iZDI2MyIKK2t3ODE9Imlsb2MiCitrdzgyPSJpaW5mIgora3c4Mz0iaXBycCIKK2t3ODQ9InBpdG0iCitrdzg1PSJpZGF0Igora3c4Nj0iaXJlZiIKK2t3ODc9Imlwcm8iCitrdzg4PSJtZWFuIgora3c4OT0ibmFtZSIKK2t3OTA9ImRhdGEiCitrdzkxPSJtZWhkIgora3c5Mj0idGV4dCIKK2t3OTM9InNidGwiCitrdzk0PSJ0cmV4Igora3c5NT0idHgzZyIKK2t3OTY9ImNvbHIiCitrdzk3PSJ0aXRsIgora3c5OD0icGVyZiIKK2t3OTk9ImF1dGgiCitrdzEwMD0iZ25yZSIKK2t3MTAxPSJhbGJtIgora3cxMDI9InlycmMiCitrdzEwMz0iSUQzMiIKK2t3MTA0PSItLS0tIgora3cxMDU9InNpZHgiCitrdzEwNj0iYWMtMyIKK2t3MTA3PSJxdCAgIgora3cxMDg9Im1pZjEiCitrdzEwOT0iaGVpYyIKK2t3MTEwPSJkYWM0Igora3cxMTE9ImRlYzMiCitrdzExMj0iZGFjMyIKK2t3MTEzPSJceEE5YWxiIgora3cxMTQ9Ilx4QTlBUlQiCitrdzExNT0iYUFSVCIKK2t3MTE2PSJceEE5ZGF5Igora3cxMTc9Ilx4QTluYW0iCitrdzExOD0iXHhBOXdydCIKK2t3MTE5PSJceEE5Z2VuIgora3cxMjA9ImNwaWwiCitrdzEyMT0idHJrbiIKK2t3MTIyPSJkaXNrIgora3cxMjM9Im5jbHgiCitrdzEyND0ibmNsYyIKK2t3MTI1PSJ0ZmhkIgora3cxMjY9InRydW4iCitrdzEyNz0ic2FpeiIKK2t3MTI4PSJzYWlvIgora3cxMjk9InNlbmMiCitrdzEzMD0iaXNvbSIKK2t3MTMxPSJpc28yIgora3cxMzI9IjNncDQiCitrdzEzMz0ibXA0MSIKK2t3MTM0PSJtcDQyIgora3cxMzU9ImRhc2giCitrdzEzNj0ibnZyMSIKK2t3MTM3PSJNU05WIgora3cxMzg9IndtZiAiCitrdzEzOT0iM2cyYSIKK2t3MTQwPSIzZzJiIgora3cxNDE9Im1zZjEiCitrdzE0Mj0iaGV2YyIKK2t3MTQzPSJwZGluIgora3cxNDQ9InRyZ3IiCitrdzE0NT0ic21oZCIKK2t3MTQ2PSJobWhkIgora3cxNDc9Im5taGQiCitrdzE0OD0iY3NsZyIKK2t3MTQ5PSJzdHNoIgora3cxNTA9InBhZGIiCitrdzE1MT0ic3RkcCIKK2t3MTUyPSJzZHRwIgora3cxNTM9InNiZ3AiCitrdzE1ND0ic2dwZCIKK2t3MTU1PSJzdWJzIgora3cxNTY9ImxldmEiCitrdzE1Nz0ibWZoZCIKK2t3MTU4PSJ0ZmR0Igora3cxNTk9InRmcmEiCitrdzE2MD0ibWZybyIKK2t3MTYxPSJza2lwIgora3cxNjI9InRzZWwiCitrdzE2Mz0ic3RyayIKK2t3MTY0PSJzdHJpIgora3cxNjU9InN0cmQiCitrdzE2Nj0ieG1sICIKK2t3MTY3PSJieG1sIgora3cxNjg9ImZpaW4iCitrdzE2OT0icGFlbiIKK2t3MTcwPSJmaXJlIgora3cxNzE9ImZwYXIiCitrdzE3Mj0iZmVjciIKK2t3MTczPSJzZWdyIgora3cxNzQ9ImdpdG4iCitrdzE3NT0ibWVjbyIKK2t3MTc2PSJtZXJlIgora3cxNzc9InN0eXAiCitrdzE3OD0ic3NpeCIKK2t3MTc5PSJwcmZ0Igora3cxODA9ImhpbnQiCitrdzE4MT0iY2RzYyIKK2t3MTgyPSJoaW5kIgora3cxODM9InZkZXAiCitrdzE4ND0idnBseCIKK2t3MTg1PSJtc3JjIgora3cxODY9InVybiAiCitrdzE4Nz0iZW5jdCIKK2t3MTg4PSJlbmNzIgora3cxODk9InJpbmYiCitrdzE5MD0ic3JwcCIKK2t3MTkxPSJzdHNnIgora3cxOTI9InN0dmkiCitrdzE5Mz0idGltcyIKK2t3MTk0PSJ0c3JvIgora3cxOTU9InNucm8iCitrdzE5Nj0icnRwICIKK2t3MTk3PSJzcnRwIgora3cxOTg9InJ0cG8iCitrdzE5OT0iaG50aSIKK2t3MjAwPSJzZHAgIgora3cyMDE9InRycHkiCitrdzIwMj0ibnVtcCIKK2t3MjAzPSJ0cHlsIgora3cyMDQ9InRvdGwiCitrdzIwNT0ibnBjayIKK2t3MjA2PSJ0cGF5Igora3cyMDc9Im1heHIiCitrdzIwOD0iZG1lZCIKK2t3MjA5PSJkaW1tIgora3cyMTA9ImRyZXAiCitrdzIxMT0idG1pbiIKK2t3MjEyPSJ0bWF4Igora3cyMTM9InBtYXgiCitrdzIxND0iZG1heCIKK2t3MjE1PSJwYXl0Igora3cyMTY9ImZkcCAiCitrdzIxNz0iZmRzYSIKK2t3MjE4PSJmZHBhIgora3cyMTk9ImV4dHIiCitrdzIyMD0iZmVjaSIKK2t3MjIxPSJybTJ0Igora3cyMjI9InNtMnQiCitrdzIyMz0idFBBVCIKK2t3MjI0PSJ0UE1UIgora3cyMjU9InRPRCAiCitrdzIyNj0idHN0aSIKK2t3MjI3PSJpc3RtIgora3cyMjg9InBtMnQiCitrdzIyOT0icnJ0cCIKK2t3MjMwPSJyc3NyIgora3cyMzE9InJzY3IiCitrdzIzMj0icnNycCIKK2t3MjMzPSJyc3NyIgora3cyMzQ9ImNjaWQiCitrdzIzNT0ic3JvYyIKK2t3MjM2PSJwcnRwIgora3cyMzc9InJvbGwiCitrdzIzOD0icmFzaCIKK2t3MjM5PSJhbHN0Igora3cyNDA9InJhcCAiCitrdzI0MT0idGVsZSIKK2t3MjQyPSJtcDcxIgora3cyNDM9ImlzbzMiCitrdzI0ND0iaXNvNCIKK2t3MjQ1PSJpc281Igora3cyNDY9InJlc3YiCitrdzI0Nz0iaXNvNiIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMl9leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMl9leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBlZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaWZkZWYgTVBFRzJQUworI2luY2x1ZGUgIk1QRUcyUFNFeHRyYWN0b3IuaCIKKyNlbHNlCisjaW5jbHVkZSAiTVBFRzJUU0V4dHJhY3Rvci5oIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNUEVHMkV4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIE1QRUcyRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+TVBFRzJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgTVBFRzJFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyNpZmRlZiBNUEVHMlBTCisgIG1FeHRyYWN0b3IgPSBuZXcgTVBFRzJQU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisjZWxzZQorICBtRXh0cmFjdG9yID0gbmV3IE1QRUcyVFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworI2VuZGlmCisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTVBFRzJFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBNUEVHMkV4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcycHNfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcycHNfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDM5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGNvZGUgKGJ5dGVzIDAtMykKK2t3MT0iXHgwMFx4MDBceDAxXHhCQSIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZhMWViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcydHNfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBieXRlCitrdzE9Ilx4NDciCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL29nZ19leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDJmY2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL29nZ19leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgIk9nZ0V4dHJhY3Rvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgT0dHRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgT0dHRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+T0dHRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIE9HR0V4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IE9nZ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgT0dHRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgT0dHRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMmZjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDMgQEAKKyMgU3RhcnQgY29kZShieXRlcyAwLTMpCisjIFRoZSBiZWxvdyA0IGJ5dGVzIGNvcnJlc3BvbmQgdG8gIk9nZ1MiIGluIEFTQ0lJCitrdzE9Ilx4NEZceDY3XHg2N1x4NTMiCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvd2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL3dhdl9leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjExZWJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL3dhdl9leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgIldBVkV4dHJhY3Rvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3Mgd2F2RXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgd2F2RXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+d2F2RXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIHdhdkV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgd2F2RXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgd2F2RXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCmluZGV4IGI4MjU1ZmMuLjFjNjliYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCkBAIC01LDcgKzUsNyBAQAogICAgIHNyY3M6IFsiTWlkaUV4dHJhY3Rvci5jcHAiXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC0xOCw0ICsxOCwxMiBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKICAgICBdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKaW5kZXggN2FkOGNjMS4uMzMwZDRmZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCkBAIC0yMSw0ICsyMSwxMiBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCAyN2JkMzU3Li40ZmQzYTU2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC0xODg4LDEzICsxODg4LDEyIEBACiAKICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0NvdW50KCk7IGkrKykgewogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbnRlbnRFbmNvZGluZyAqZW5jb2RpbmcgPSB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQnlJbmRleChpKTsKLSAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQ291bnQoKTsgaisrKSB7CisgICAgICAgIGlmIChlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkNvdW50KCkgPiAwKSB7CiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbnRlbnRFbmNvZGluZzo6Q29udGVudEVuY3J5cHRpb24gKmVuY3J5cHRpb247Ci0gICAgICAgICAgICBlbmNyeXB0aW9uID0gZW5jb2RpbmctPkdldEVuY3J5cHRpb25CeUluZGV4KGopOworICAgICAgICAgICAgZW5jcnlwdGlvbiA9IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQnlJbmRleCgwKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2tJbmZvLT5tTWV0YSwKICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOwogICAgICAgICAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGVuY29kaW5nLT5HZXRDb21wcmVzc2lvbkNvdW50KCk7IGorKykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKaW5kZXggMTAyYWM4MS4uN2Q3MDU0OCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCkBAIC0xMyw0ICsxMywxMSBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IGU0OGUxYjcuLmFmYTA1NWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMTYsNCArMTYsMTIgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCmluZGV4IDA3NzMzODcuLmRlZDNkMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcApAQCAtNzYsNiArNzYsNyBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHNwPEFCdWZmZXI+IGh2Y2M7CiAgICAgc3A8QUJ1ZmZlcj4gaWNjOworICAgIHNwPEFCdWZmZXI+IGF2MWM7CiAKICAgICBWZWN0b3I8dWludDMyX3Q+IHRodW1ibmFpbHM7CiAgICAgVmVjdG9yPHVpbnQzMl90PiBkaW1nUmVmczsKQEAgLTU0NiwxMSArNTQ3LDExIEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiSW1hZ2UgaXRlbSBpZCAlZCB1c2VzIHRodW1ibmFpbCBpdGVtIGlkICVkIiwgbVJlZnNbaV0sIG1JdGVtSWQpOwotICAgICAgICAgICAgSW1hZ2VJdGVtICZtYXN0ZXJJbWFnZSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOwotICAgICAgICAgICAgaWYgKCFtYXN0ZXJJbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEltYWdlSXRlbSAmaW1hZ2VJdGVtID0gaXRlbUlkVG9JdGVtTWFwLmVkaXRWYWx1ZUF0KGl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAoIWltYWdlSXRlbS50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiYWxyZWFkeSBoYXMgdGh1bWJuYWlscyEiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hc3RlckltYWdlLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOworICAgICAgICAgICAgaW1hZ2VJdGVtLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTc2NCw2ICs3NjUsMzkgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0cnVjdCBBdjFjQm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7CisgICAgQXYxY0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCJhdjFDIikpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGltYWdlLmF2MWMgPSBtQXYxYzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QUJ1ZmZlcj4gbUF2MWM7Cit9OworCitzdGF0dXNfdCBBdjFjQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgbUF2MWMgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKworICAgIGlmIChtQXYxYy0+ZGF0YSgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlKCktPnJlYWRBdChvZmZzZXQsIG1BdjFjLT5kYXRhKCksIHNpemUpIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgQUxPR1YoInByb3BlcnR5IGF2MUMiKTsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKICAgICBJcm90Qm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImlyb3QiKSksIG1BbmdsZSgwKSB7fQpAQCAtOTI5LDcgKzk2Myw3IEBACiAKIHN0YXR1c190IElwY29Cb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewogICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0gICAgLy8gcHVzaCBkdW1teSBhcyB0aGUgaW5kZXggaXMgMS1iYXNlZAorICAgIC8vIHB1c2ggYSBwbGFjZWhvbGRlciBhcyB0aGUgaW5kZXggaXMgMS1iYXNlZAogICAgIG1JdGVtUHJvcGVydGllcy0+cHVzaF9iYWNrKG5ldyBJdGVtUHJvcGVydHkoKSk7CiAgICAgcmV0dXJuIHBhcnNlQ2h1bmtzKG9mZnNldCwgc2l6ZSk7CiB9CkBAIC05NTcsNiArOTkxLDExIEBACiAgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgQ29sckJveChzb3VyY2UoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgQXYxY0JveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICAvLyBwdXNoIGR1bW15IHRvIG1haW50YWluIGNvcnJlY3QgaXRlbSBwcm9wZXJ0eSBpbmRleApAQCAtMTIwMyw4ICsxMjQyLDkgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLUl0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKK0l0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCBpc0hlaWYpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUlzSGVpZihpc0hlaWYpLAogICAgICAgbVByaW1hcnlJdGVtSWQoMCksCiAgICAgICBtSWRhdE9mZnNldCgwKSwKICAgICAgIG1JZGF0U2l6ZSgwKSwKQEAgLTEzNjMsNyArMTQwMyw4IEBACiAgICAgICAgIC8vICAgJ0V4aWYnOiBFWElGIG1ldGFkYXRhCiAgICAgICAgIGlmIChpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygiZ3JpZCIpICYmCiAgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygiaHZjMSIpICYmCi0gICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygiRXhpZiIpKSB7CisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygiRXhpZiIpICYmCisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygiYXYwMSIpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC0xNTA5LDcgKzE1NTAsOSBAQAogICAgIH0KIAogICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKLSAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKAorICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgIG1Jc0hlaWYgPyBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMgOiBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGKTsKIAogICAgIGlmIChpbWFnZS0+aXRlbUlkID09IG1QcmltYXJ5SXRlbUlkKSB7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQsIDEpOwpAQCAtMTUzOSwxNSArMTU4MiwyNCBAQAogICAgICAgICBzc2l6ZV90IHRodW1iSXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGltYWdlLT50aHVtYm5haWxzWzBdKTsKICAgICAgICAgaWYgKHRodW1iSXRlbUluZGV4ID49IDApIHsKICAgICAgICAgICAgIGNvbnN0IEltYWdlSXRlbSAmdGh1bWJuYWlsID0gbUl0ZW1JZFRvSXRlbU1hcFt0aHVtYkl0ZW1JbmRleF07Ci0KLSAgICAgICAgICAgIGlmICh0aHVtYm5haWwuaHZjYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCB8fCB0aHVtYm5haWwuYXYxYyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCwgdGh1bWJuYWlsLndpZHRoKTsKICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCwgdGh1bWJuYWlsLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWwuaHZjYy0+ZGF0YSgpLCB0aHVtYm5haWwuaHZjYy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXNlIGEgaGFyZC1jb2RlZCBzdHJpbmcgaGVyZSBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgIC8vIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9BVjFDLiBUaGUga2V5IGlzIGF2YWlsYWJsZSBvbmx5IGZyb20gU0RLIDMxLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbXA0IGV4dHJhY3RvciBpcyBwYXJ0IG9mIG1haW5saW5lIGFuZCBidWlsZHMgYWdhaW5zdCBTREsgMjkgYXMgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGluZy4gVGhpcyBoYXJkLWNvZGVkIHN0cmluZyBjYW4gYmUgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZWQgY29uc3RhbnQgb25jZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbXA0IGV4dHJhY3RvciBpcyBidWlsdCBhZ2FpbnN0IFNESyA+PSAzMS4KKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHVtYm5haWwtY3NkLWF2MWMiLCB0aHVtYm5haWwuYXYxYy0+ZGF0YSgpLCB0aHVtYm5haWwuYXYxYy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImltYWdlWyV1XTogdGh1bWJuYWlsOiBzaXplICVkeCVkLCBpdGVtIGluZGV4ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LCB0aHVtYm5haWwud2lkdGgsIHRodW1ibmFpbC5oZWlnaHQsIHRodW1iSXRlbUluZGV4KTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNTc0LDEyICsxNjI2LDIxIEBACiAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDMgLyAyKTsKICAgICB9CiAKLSAgICBpZiAoaW1hZ2UtPmh2Y2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IGh2Y2MgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtSXNIZWlmKSB7CisgICAgICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGh2Y2MgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGltYWdlLT5hdjFjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogYXYxYyBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBpbWFnZS0+YXYxYy0+ZGF0YSgpLCBpbWFnZS0+YXYxYy0+c2l6ZSgpKTsKICAgICB9Ci0gICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAotICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CiAKICAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKQEAgLTE2MTQsMTcgKzE2NzUsMTcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBtYXN0ZXJJdGVtSW5kZXggPSBtRGlzcGxheWFibGVzW2ltYWdlSW5kZXhdOworICAgIHVpbnQzMl90IGltYWdlSXRlbUluZGV4ID0gbURpc3BsYXlhYmxlc1tpbWFnZUluZGV4XTsKIAotICAgIGNvbnN0IEltYWdlSXRlbSAmbWFzdGVySW1hZ2UgPSBtSXRlbUlkVG9JdGVtTWFwW21hc3Rlckl0ZW1JbmRleF07Ci0gICAgaWYgKG1hc3RlckltYWdlLnRodW1ibmFpbHMuZW1wdHkoKSkgewotICAgICAgICAqaXRlbUluZGV4ID0gbWFzdGVySXRlbUluZGV4OworICAgIGNvbnN0IEltYWdlSXRlbSAmaW1hZ2VJdGVtID0gbUl0ZW1JZFRvSXRlbU1hcFtpbWFnZUl0ZW1JbmRleF07CisgICAgaWYgKGltYWdlSXRlbS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgKml0ZW1JbmRleCA9IGltYWdlSXRlbUluZGV4OwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtYXN0ZXJJbWFnZS50aHVtYm5haWxzWzBdKTsKKyAgICBzc2l6ZV90IHRodW1iSXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGltYWdlSXRlbS50aHVtYm5haWxzWzBdKTsKICAgICBpZiAodGh1bWJJdGVtSW5kZXggPCAwKSB7Ci0gICAgICAgIC8vIERvIG5vdCByZXR1cm4gdGhlIG1hc3RlciBpbWFnZSBpbiB0aGlzIGNhc2UsIGZhaWwgaXQgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gRG8gbm90IHJldHVybiB0aGUgaW1hZ2UgaXRlbSBpbiB0aGlzIGNhc2UsIGZhaWwgaXQgc28gdGhhdCB0aGUKICAgICAgICAgLy8gdGh1bWJuYWlsIGV4dHJhY3Rpb24gY29kZSBrbm93cyB3ZSByZWFsbHkgZG9uJ3QgaGF2ZSBpdC4KICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKaW5kZXggYmU4MWI1OS4uYjE5ZGMxOCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKQEAgLTQyLDEyICs0MiwxMiBAQAogCiAvKgogICogSXRlbVRhYmxlIGtlZXBzIHRyYWNrIG9mIGFsbCBpbWFnZSBpdGVtcyAoaW5jbHVkaW5nIGNvZGVkIGltYWdlcywgZ3JpZHMgYW5kCi0gKiB0aWxlcykgaW5zaWRlIGEgSEVJRiBzdGlsbCBpbWFnZSAoSVNPL0lFQyBGRElTIDIzMDA4LTEyLjI6MjAxNyhFKSkuCisgKiB0aWxlcykgaW5zaWRlIGEgSEVJRi9BVklGIHN0aWxsIGltYWdlIChJU08vSUVDIEZESVMgMjMwMDgtMTIuMjoyMDE3KEUpKS4KICAqLwogCiBjbGFzcyBJdGVtVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CisgICAgSXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCBpc0hlaWYpOwogCiAgICAgc3RhdHVzX3QgcGFyc2UodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIApAQCAtNjUsNiArNjUsOCBAQAogCiBwcml2YXRlOgogICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIC8vIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0aGlzIGl0ZW0gdGFibGUgaXMgZm9yIGEgSEVJRiBpbWFnZS4gT3RoZXJ3aXNlIGl0IGlzIGZvciBhbiBBVklGIGltYWdlLgorICAgIGJvb2wgbUlzSGVpZjsKIAogICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiBtSXRlbUxvY3M7CiAgICAgVmVjdG9yPEl0ZW1JbmZvPiBtSXRlbUluZm9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTk3NmEyYi4uNzk4OWQ0YgotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0xNDksNiArMTQ5LDcgQEAKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCiAgICAgYm9vbCBtSXNIZWlmOworICAgIGJvb2wgbUlzQXZpZjsKICAgICBib29sIG1Jc0F1ZGlvOwogICAgIGJvb2wgbUlzVXNhYyA9IGZhbHNlOwogICAgIHNwPEl0ZW1UYWJsZT4gbUl0ZW1UYWJsZTsKQEAgLTIwMiw4ICsyMDMsOCBAQAogICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBjb21wb3NpdGlvbk9mZnNldDsKICAgICAgICAgdWludDhfdCBpdlsxNl07Ci0gICAgICAgIFZlY3RvcjxzaXplX3Q+IGNsZWFyc2l6ZXM7Ci0gICAgICAgIFZlY3RvcjxzaXplX3Q+IGVuY3J5cHRlZHNpemVzOworICAgICAgICBWZWN0b3I8dWludDMyX3Q+IGNsZWFyc2l6ZXM7CisgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gZW5jcnlwdGVkc2l6ZXM7CiAgICAgfTsKICAgICBWZWN0b3I8U2FtcGxlPiBtQ3VycmVudFNhbXBsZXM7CiAgICAgc3RkOjptYXA8b2ZmNjRfdCwgdWludDMyX3Q+IG1Ecm1PZmZzZXRzOwpAQCAtMzcyLDYgKzM3Myw4IEBACiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQzsKICAgICAgICAgY2FzZSBGT1VSQ0MoImF2MDEiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19BVjE7CisgICAgICAgIGNhc2UgRk9VUkNDKCJ2cDA5Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5OwogICAgICAgICBjYXNlIEZPVVJDQygiLm1wMyIpOgogICAgICAgICBjYXNlIDB4NkQ3MzAwNTU6IC8vICJtcyBVIiBtcDMgYXVkaW8KICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHOwpAQCAtNDEyLDYgKzQxNSw3IEBACiAgICAgICBtSXNIZWlmKGZhbHNlKSwKICAgICAgIG1IYXNNb292Qm94KGZhbHNlKSwKICAgICAgIG1QcmVmZXJIZWlmKG1pbWUgIT0gTlVMTCAmJiAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRikpLAorICAgICAgbUlzQXZpZihmYWxzZSksCiAgICAgICBtRmlyc3RUcmFjayhOVUxMKSwKICAgICAgIG1MYXN0VHJhY2soTlVMTCkgewogICAgIEFMT0dWKCJtaW1lPSVzLCBtUHJlZmVySGVpZj0lZCIsIG1pbWUsIG1QcmVmZXJIZWlmKTsKQEAgLTY2OCw3ICs2NzIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1Jc0hlaWYgJiYgKG1JdGVtVGFibGUgIT0gTlVMTCkgJiYgKG1JdGVtVGFibGUtPmNvdW50SW1hZ2VzKCkgPiAwKSkgeworICAgIGlmICgobUlzQXZpZiB8fCBtSXNIZWlmKSAmJiAobUl0ZW1UYWJsZSAhPSBOVUxMKSAmJiAobUl0ZW1UYWJsZS0+Y291bnRJbWFnZXMoKSA+IDApKSB7CiAgICAgICAgIG9mZjY0X3QgZXhpZk9mZnNldDsKICAgICAgICAgc2l6ZV90IGV4aWZTaXplOwogICAgICAgICBpZiAobUl0ZW1UYWJsZS0+Z2V0RXhpZk9mZnNldEFuZFNpemUoJmV4aWZPZmZzZXQsICZleGlmU2l6ZSkgPT0gT0spIHsKQEAgLTY5NCw3ICs2OTgsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOwogCi0gICAgICAgICAgICBBTE9HVigiYWRkaW5nIEhFSUYgaW1hZ2UgdHJhY2sgJXUiLCBpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIEFMT0dWKCJhZGRpbmcgJXMgaW1hZ2UgdHJhY2sgJXUiLCBtSXNIZWlmID8gIkhFSUYiIDogIkFWSUYiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIFRyYWNrICp0cmFjayA9IG5ldyBUcmFjazsKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5uZXh0ID0gdHJhY2s7CkBAIC03MjAsNiArNzI0LDEwIEBACiAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCiAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0hFSUYpOworICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCiAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwpAQCAtMTE0OSw3ICsxMTU3LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1vb3YiKSkgewogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKIAotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gUmV0dXJuIGEgZHVtbXkgZXJyb3IuCisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBSZXR1cm4gYSBnZW5lcmljIGVycm9yLgogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE3ODcsNyArMTc5NSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCBfX3VudXNlZCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBnZXQgZGF0YV9yZWZfaW5kZXggdmFsdWUgZnJvbSBVMTZfQVQoJmJ1ZmZlcls2XSkKICAgICAgICAgICAgIHVpbnQxNl90IHZlcnNpb24gPSBVMTZfQVQoJmJ1ZmZlcls4XSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSBVMTZfQVQoJmJ1ZmZlclsxNl0pOwogCkBAIC0xOTcyLDYgKzE5ODAsNyBAQAogICAgICAgICBjYXNlIEZPVVJDQygiZHZoMSIpOgogICAgICAgICBjYXNlIEZPVVJDQygiZGF2MSIpOgogICAgICAgICBjYXNlIEZPVVJDQygiYXYwMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygidnAwOSIpOgogICAgICAgICB7CiAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls3OF07CiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKQEAgLTE5ODQsNyArMTk5Myw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCBfX3VudXNlZCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBnZXQgZGF0YV9yZWZfaW5kZXggdmFsdWUgZnJvbSBVMTZfQVQoJmJ1ZmZlcls2XSkKICAgICAgICAgICAgIHVpbnQxNl90IHdpZHRoID0gVTE2X0FUKCZidWZmZXJbNiArIDE4XSk7CiAgICAgICAgICAgICB1aW50MTZfdCBoZWlnaHQgPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMjBdKTsKIApAQCAtMjQzNCw2ICsyNDQzLDggQEAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoInZwY0MiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImF2MUMiKToKICAgICAgICAgewogICAgICAgICAgICAgYXV0byBidWZmZXIgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0yNTcxLDkgKzI1ODIsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygiaXJlZiIpOgogICAgICAgICBjYXNlIEZPVVJDQygiaXBybyIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUlzSGVpZikgeworICAgICAgICAgICAgaWYgKG1Jc0hlaWYgfHwgbUlzQXZpZikgewogICAgICAgICAgICAgICAgIGlmIChtSXRlbVRhYmxlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUl0ZW1UYWJsZSA9IG5ldyBJdGVtVGFibGUobURhdGFTb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBtSXRlbVRhYmxlID0gbmV3IEl0ZW1UYWJsZShtRGF0YVNvdXJjZSwgbUlzSGVpZik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1JdGVtVGFibGUtPnBhcnNlKAogICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0yODc1LDYgKzI4ODYsMjEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBGT1VSQ0MoInBhc3AiKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGJlIGluIGEgVmlzdWFsU2FtcGxlRW50cnkgYm94IHVuZGVyIHRoZSBTYW1wbGUgRGVzY3JpcHRpb24gQm94ICgnc3RzZCcpCisgICAgICAgICAgICAvLyBpZ25vcmUgb3RoZXJ3aXNlCisgICAgICAgICAgICBpZiAoZGVwdGggPj0gMiAmJiBtUGF0aFtkZXB0aCAtIDJdID09IEZPVVJDQygic3RzZCIpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VQYXNwQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBGT1VSQ0MoInRpdGwiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInBlcmYiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImF1dGgiKToKQEAgLTI5OTksMTQgKzMwMjUsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgbUlzSGVpZiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyYW5kU2V0LmVyYXNlKEZPVVJDQygibWlmMSIpKTsKICAgICAgICAgICAgICAgICAgICAgYnJhbmRTZXQuZXJhc2UoRk9VUkNDKCJoZWljIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJhbmRTZXQuY291bnQoRk9VUkNDKCJhdmlmIikpID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICBicmFuZFNldC5jb3VudChGT1VSQ0MoImF2aXMiKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJpZGVudGlmaWVkIEFWSUYgaW1hZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzQXZpZiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyYW5kU2V0LmVyYXNlKEZPVVJDQygiYXZpZiIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJhbmRTZXQuZXJhc2UoRk9VUkNDKCJhdmlzIikpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmICghYnJhbmRTZXQuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUgbW9vdiBib3guCiAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGNvdWxkIGJlIGFueSBpc28gZmlsZXMgKG1wNCwgaGVpZnMsIGV0Yy4pCiAgICAgICAgICAgICAgICAgICAgIG1IYXNNb292Qm94ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0hlaWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJpZGVudGlmaWVkIEhFSUYgaW1hZ2Ugd2l0aCBvdGhlciB0cmFja3MiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0hlaWYgfHwgbUlzQXZpZikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImlkZW50aWZpZWQgJXMgaW1hZ2Ugd2l0aCBvdGhlciB0cmFja3MiLCBtSXNIZWlmID8gIkhFSUYiIDogIkFWSUYiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTM0MDcsNyArMzQzOSw3IEBACiAgICAgfQogCiAgICAgLy8gc2tpcAotICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKKyAgICBici5za2lwQml0cygzKTsgLy8gYnNtb2QKIAogICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKICAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7CkBAIC0zNzE4LDE5ICszNzUwLDE4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50NjRfdCBjdGltZSBfX3VudXNlZCwgbXRpbWUgX191bnVzZWQsIGR1cmF0aW9uIF9fdW51c2VkOwogICAgIGludDMyX3QgaWQ7CiAKICAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgIGN0aW1lID0gVTY0X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBtdGltZSA9IFU2NF9BVCgmYnVmZmVyWzEyXSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgY3RpbWUgdmFsdWUgZnJvbSBVNjRfQVQoJmJ1ZmZlcls0XSkKKyAgICAgICAgLy8gd2UgY2FuIGdldCBtdGltZSB2YWx1ZSBmcm9tIFU2NF9BVCgmYnVmZmVyWzEyXSkKICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOwotICAgICAgICBkdXJhdGlvbiA9IFU2NF9BVCgmYnVmZmVyWzI4XSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgZHVyYXRpb24gdmFsdWUgZnJvbSBVNjRfQVQoJmJ1ZmZlclsyOF0pCiAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgY3RpbWUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIG10aW1lID0gVTMyX0FUKCZidWZmZXJbOF0pOworICAgICAgICAvLyB3ZSBjYW4gZ2V0IGN0aW1lIHZhbHVlIGZyb20gVTMyX0FUKCZidWZmZXJbNF0pCisgICAgICAgIC8vIHdlIGNhbiBnZXQgbXRpbWUgdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlcls4XSkKICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsxMl0pOwotICAgICAgICBkdXJhdGlvbiA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgZHVyYXRpb24gdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlclsyMF0pCiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KQEAgLTQwNDgsNiArNDA3OSwyNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlUGFzcEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDggfHwgc2l6ZSA9PSBTSVpFX01BWCB8fCBtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBkYXRhWzJdOyAvLyBoU3BhY2luZywgdlNwYWNpbmcKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIDgpIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIHVpbnQzMl90IGhTcGFjaW5nID0gbnRvaGwoZGF0YVswXSk7CisgICAgdWludDMyX3QgdlNwYWNpbmcgPSBudG9obChkYXRhWzFdKTsKKworICAgIGlmIChoU3BhY2luZyAhPSAwICYmIHZTcGFjaW5nICE9IDApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRILCBoU3BhY2luZyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQsIHZTcGFjaW5nKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZTNHUFBNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBkZXB0aCkgewogICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC00MzI1LDcgKzQzNzYsOCBAQAogICAgICAgICBpZiAoc2l6ZSAhPSAyNCB8fCAoKHB0clswXSAhPSAxIHx8IHB0clsxXSAhPSAwKSAmJiAocHRyWzBdICE9IDIgfHwgcHRyWzFdICE9IDEpKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSkgeworICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpCisgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FWSUYpKSB7CiAgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwogICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKQEAgLTQzMzQsNyArNDM4NiwyMiBAQAogCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKIAotICAgICAgICBpZiAoc2l6ZSA8IDUgfHwgcHRyWzBdICE9IDB4ODEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgaWYgKHNpemUgPCA0IHx8IHB0clswXSAhPSAweDgxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikpIHsKKyAgICAgICAgICAgIGl0ZW1UYWJsZSA9IG1JdGVtVGFibGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSkpIHsKKyAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHNpemUgPCA1IHx8IHB0clswXSAhPSAweDAxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTQzOTEsNiArNDQ1OCwxMCBAQAogICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSkpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewpAQCAtNDYzOCwxOCArNDcwOSwxNyBAQAogICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGJsIDEuMTMKICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwotICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CiAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKICAgICAgICAgICAgIGlmIChjc2Rfc2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBici5nZXRCaXRzKDI0KTsKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDI0KTsgLy8gZXh0U2FtcGxlUmF0ZQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxMyB8fCBleHRGcmVxSW5kZXggPT0gMTQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZXh0RnJlcUluZGV4XTsKKyAgICAgICAgICAgIC8vZXh0U2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZXh0RnJlcUluZGV4XTsKICAgICAgICAgfQogICAgICAgICAvL1RPRE86IHNhdmUgdGhlIGV4dGVuc2lvbiBzYW1wbGluZyByYXRlIHZhbHVlIGluIG1ldGEgZGF0YSA9PgogICAgICAgICAvLyAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CkBAIC00NjkyLDEzICs0NzYyLDEzIEBACiAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0xEIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19TQ0FMIHx8CiAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQlNBQykgewogICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZUxlbmd0aEZsYWcgX191bnVzZWQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7IC8vIGZyYW1lTGVuZ3RoRmxhZwogCiAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlcGVuZHNPbkNvcmVDb2RlciA9IGJyLmdldEJpdHMoMSk7CiAKICAgICAgICAgICAgIGlmIChkZXBlbmRzT25Db3JlQ29kZXIgKSB7CiAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNvcmVDb2RlckRlbGF5IF9fdW51c2VkID0gYnIuZ2V0Qml0cygxNCk7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTQpOyAvLyBjb3JlQ29kZXJEZWxheQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IGV4dGVuc2lvbkZsYWcgPSAtMTsKQEAgLTQ3MzAsNjQgKzQ4MDAsNjQgQEAKICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRWxlbWVudEluc3RhbmNlVGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFByb2ZpbGUgX191bnVzZWQgPSBici5nZXRCaXRzKDIpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2FtcGxpbmdGcmVxdWVuY3lJbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIEVsZW1lbnRJbnN0YW5jZVRhZworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDIpOyAvLyBQcm9maWxlCisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIFNhbXBsaW5nRnJlcXVlbmN5SW5kZXgKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVNpZGVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQmFja0NoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1MZmVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDIpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQXNzb2NEYXRhRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDMpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtVmFsaWRDY0VsZW1lbnRzIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygzKTsgLy8gTnVtQXNzb2NEYXRhRWxlbWVudHMKKyAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gTnVtVmFsaWRDY0VsZW1lbnRzCiAKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CiAKICAgICAgICAgICAgICAgICBpZiAoTW9ub01peGRvd25QcmVzZW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duRWxlbWVudE51bWJlciBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXIKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CiAgICAgICAgICAgICAgICAgaWYgKFN0ZXJlb01peGRvd25QcmVzZW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CiAgICAgICAgICAgICAgICAgaWYgKE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDMpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4IF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQc2V1ZG9TdXJyb3VuZEVuYWJsZSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDIpOyAvLyBNYXRyaXhNaXhkb3duSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7IC8vIFBzZXVkb1N1cnJvdW5kRW5hYmxlCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIEZyb250RWxlbWVudFRhZ1NlbGVjdAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBGcm9udEVsZW1lbnRJc0NwZSA/IDIgOiAxOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBTaWRlRWxlbWVudFRhZ1NlbGVjdAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBTaWRlRWxlbWVudElzQ3BlID8gMiA6IDE7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIEJhY2tFbGVtZW50VGFnU2VsZWN0CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEJhY2tFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSBjaGFubmVsc051bTsKIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IExmZUVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gTGZlRWxlbWVudFRhZ1NlbGVjdAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbHNOdW0gPSAlZCIsIGNoYW5uZWxzTnVtKTsKQEAgLTQ4ODMsNyArNDk1Myw2IEBACiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtQnVmZmVyKE5VTEwpLAogICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKLSAgICAgIG1Jc0hlaWYoaXRlbVRhYmxlICE9IE5VTEwpLAogICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpLAogICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MoZWxzdFNoaWZ0U3RhcnRUaWNrcyksCiAgICAgICBtRWxzdEluaXRpYWxFbXB0eUVkaXRUaWNrcyhlbHN0SW5pdGlhbEVtcHR5RWRpdFRpY2tzKSB7CkBAIC00OTE4LDYgKzQ5ODcsOCBAQAogICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwogICAgIG1Jc0FDNCA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CiAgICAgbUlzRG9sYnlWaXNpb24gPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pOworICAgIG1Jc0hlaWYgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpICYmIG1JdGVtVGFibGUgIT0gTlVMTDsKKyAgICBtSXNBdmlmID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikgJiYgbUl0ZW1UYWJsZSAhPSBOVUxMOwogCiAgICAgaWYgKG1Jc0FWQykgewogICAgICAgICB2b2lkICpkYXRhOwpAQCAtNTc2Niw3ICs1ODM3LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gYXBwbHkgc29tZSBzYW5pdHkgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCisgICAgICAgIC8vIGFwcGx5IHNvbWUgcXVpY2sgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCiAgICAgICAgIC8vCiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heFRydW5TYW1wbGVDb3VudCA9IDEwMDAwOwogICAgICAgICBpZiAoc2FtcGxlQ291bnQgPiBrTWF4VHJ1blNhbXBsZUNvdW50KSB7CkBAIC01OTEyLDcgKzU5ODMsNyBAQAogCiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgQUxPR1YoInNlZWtUaW1lVXM6JSIgUFJJZDY0LCBzZWVrVGltZVVzKTsKLSAgICAgICAgaWYgKG1Jc0hlaWYpIHsKKyAgICAgICAgaWYgKG1Jc0hlaWYgfHwgbUlzQXZpZikgewogICAgICAgICAgICAgQ0hFQ0sobVNhbXBsZVRhYmxlID09IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0sobUl0ZW1UYWJsZSAhPSBOVUxMKTsKICAgICAgICAgICAgIGludDMyX3QgaW1hZ2VJbmRleDsKQEAgLTYwNTcsNyArNjEyOCw3IEBACiAgICAgICAgIG5ld0J1ZmZlciA9IHRydWU7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBpZiAoIW1Jc0hlaWYpIHsKKyAgICAgICAgaWYgKCFtSXNIZWlmICYmICFtSXNBdmlmKSB7CiAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCopJmN0cywgJmlzU3luY1NhbXBsZSwgJnN0dHMpOwogICAgICAgICAgICAgaWYoZXJyID09IE9LKSB7CkBAIC02NDg1LDkgKzY1NTYsOSBAQAogICAgIGlmIChzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkpIHsKICAgICAgICAgLy8gc3RvcmUgY2xlYXIvZW5jcnlwdGVkIGxlbmd0aHMgaW4gbWV0YWRhdGEKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKLSAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogNCk7CisgICAgICAgICAgICAgICAgc21wbC0+Y2xlYXJzaXplcy5hcnJheSgpLCBzbXBsLT5jbGVhcnNpemVzLnNpemUoKSAqIHNpemVvZih1aW50MzJfdCkpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKLSAgICAgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hcnJheSgpLCBzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkgKiA0KTsKKyAgICAgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hcnJheSgpLCBzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkgKiBzaXplb2YodWludDMyX3QpKTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgbURlZmF1bHRJVlNpemUpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgbUNyeXB0b01vZGUpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgbUNyeXB0b0tleSwgMTYpOwpAQCAtNjY5Niw3ICs2NzY3LDggQEAKICAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRBICIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGY0diAiLCA4KQogICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBrZGRpIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRWUCIsIDgpCiAgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cG1pZjEiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBoZWljIiwgOCkKLSAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwbXNmMSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGhldmMiLCA4KSkgeworICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBtc2YxIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwaGV2YyIsIDgpCisgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGF2aWYiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBhdmlzIiwgOCkpIHsKICAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjQ7CiAKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC02NzEzLDYgKzY3ODUsNyBAQAogICAgICAgICBGT1VSQ0MoImh2YzEiKSwKICAgICAgICAgRk9VUkNDKCJoZXYxIiksCiAgICAgICAgIEZPVVJDQygiYXYwMSIpLAorICAgICAgICBGT1VSQ0MoInZwMDkiKSwKICAgICAgICAgRk9VUkNDKCIzZ3A0IiksCiAgICAgICAgIEZPVVJDQygibXA0MSIpLAogICAgICAgICBGT1VSQ0MoIm1wNDIiKSwKQEAgLTY3MzEsNiArNjgwNCw4IEBACiAgICAgICAgIEZPVVJDQygiaGVpYyIpLCAgLy8gSEVJRiBpbWFnZQogICAgICAgICBGT1VSQ0MoIm1zZjEiKSwgIC8vIEhFSUYgaW1hZ2Ugc2VxdWVuY2UKICAgICAgICAgRk9VUkNDKCJoZXZjIiksICAvLyBIRUlGIGltYWdlIHNlcXVlbmNlCisgICAgICAgIEZPVVJDQygiYXZpZiIpLCAgLy8gQVZJRiBpbWFnZQorICAgICAgICBGT1VSQ0MoImF2aXMiKSwgIC8vIEFWSUYgaW1hZ2Ugc2VxdWVuY2UKICAgICB9OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAppbmRleCAxZTQ5ZDUwLi41NDJhM2U2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKQEAgLTE0NCw2ICsxNDQsNyBAQAogICAgIGJvb2wgbUlzSGVpZjsKICAgICBib29sIG1IYXNNb292Qm94OwogICAgIGJvb2wgbVByZWZlckhlaWY7CisgICAgYm9vbCBtSXNBdmlmOwogCiAgICAgVHJhY2sgKm1GaXJzdFRyYWNrLCAqbUxhc3RUcmFjazsKIApAQCAtMTYwLDYgKzE2MSw3IEBACiAgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQsIGludCBkZXB0aCk7CiAgICAgc3RhdHVzX3QgcGFyc2VJVHVuZXNNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlQ29sb3JJbmZvKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VQYXNwQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2UzR1BQTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGVwdGgpOwogICAgIHZvaWQgcGFyc2VJRDN2Mk1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZVFUTWV0YUtleShvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCBiYzg2MzJjLi40YzI1MzE0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsMTYgQEAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtcGVnMmV4dHJhY3RvciIsCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgYW5kcm9pZDogeworICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGlidm5ka3N1cHBvcnQjMjkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCkBAIC0xMiwxNCArMjIsMTMgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjZ3JvdXByYyMyOSIsCi0gICAgICAgICJsaWJ2bmRrc3VwcG9ydCMyOSIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTM3LDcgKzQ2LDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9ub2NyeXB0byIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggN2FlZDY4My4uNTc5MDY1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC0yMCw0ICsyMCwxMSBAQAogICAgICAgICAibGlidm9yYmlzaWRlYyIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCmluZGV4IGViMjI0NmQuLjYyZjA4MDggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcApAQCAtNDMsNiArNDMsOSBAQAogICAgIGxvbmcgdm9yYmlzX3BhY2tldF9ibG9ja3NpemUodm9yYmlzX2luZm8gKnZpLG9nZ19wYWNrZXQgKm9wKTsKIH0KIAorc3RhdGljIGNvbnN0ZXhwciBpbnQgT0dHX1BBR0VfRkxBR19DT05USU5VRURfUEFDS0VUID0gMTsKK3N0YXRpYyBjb25zdGV4cHIgaW50IE9HR19QQUdFX0ZMQUdfRU5EX09GX1NUUkVBTSA9IDQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE9nZ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKQEAgLTI5Nyw3ICszMDAsOCBAQAogICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgKm91dCA9IHBhY2tldDsKLSAgICBBTE9HVigicmV0dXJuaW5nIGJ1ZmZlciAlcCIsIHBhY2tldCk7CisgICAgQUxPR1YoInJldHVybmluZyBidWZmZXIgJXAsIHNpemUgJXp1LCBsZW5ndGggJXp1IiwKKyAgICAgICAgICBwYWNrZXQsIHBhY2tldC0+c2l6ZSgpLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCkBAIC0zNTgsMTAgKzM2MiwxMCBAQAogCiAgICAgICAgIGlmICghbWVtY21wKHNpZ25hdHVyZSwgIk9nZ1MiLCA0KSkgewogICAgICAgICAgICAgaWYgKCpwYWdlT2Zmc2V0ID4gc3RhcnRPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBlZCAlbGxkIGJ5dGVzIG9mIGp1bmsgdG8gcmVhY2ggbmV4dCBmcmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSgqcGFnZU9mZnNldCAtIHN0YXJ0T2Zmc2V0KSk7CisgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwZWQgJWxsZCBieXRlcyBvZiBqdW5rIGF0ICVsbGQgdG8gcmVhY2ggbmV4dCBmcmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSgqcGFnZU9mZnNldCAtIHN0YXJ0T2Zmc2V0KSwgKGxvbmcgbG9uZykoc3RhcnRPZmZzZXQpKTsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgQUxPR1YoImZvdW5kIGZyYW1lIGF0ICVsbGQiLCAobG9uZyBsb25nKSgqcGFnZU9mZnNldCkpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKQEAgLTYyOSw3ICs2MzMsOCBAQAogICAgIC8vIENhbGN1bGF0ZSB0aW1lc3RhbXBzIGJ5IGFjY3VtdWxhdGluZyBkdXJhdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgc2FtcGxlIG9mIGEgcGFnZTsKICAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBvbmx5IHNlZWsgdG8gcGFnZSBib3VuZGFyaWVzLgogICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9ICgqb3V0KS0+bWV0YV9kYXRhKCk7Ci0gICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsICZjdXJyZW50UGFnZVNhbXBsZXMpICYmCisgICAgICAgICAgICAobUN1cnJlbnRQYWdlLm1GbGFncyAmIE9HR19QQUdFX0ZMQUdfRU5EX09GX1NUUkVBTSkpIHsKICAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKICAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgewogICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKQEAgLTgxMiw2ICs4MTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnVmZmVyID0gdG1wOwogCisgICAgICAgICAgICBBTE9HVigicmVhZGluZyAlenUgYnl0ZXMgQCAlenUiLCBwYWNrZXRTaXplLCBzaXplX3QoZGF0YU9mZnNldCkpOwogICAgICAgICAgICAgc3NpemVfdCBuID0gbVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKQEAgLTgzMCw4ICs4MzYsOSBAQAogCiAgICAgICAgICAgICBpZiAoZ290RnVsbFBhY2tldCkgewogICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgcmVhZCB0aGUgZW50aXJlIHBhY2tldC4KKyAgICAgICAgICAgICAgICBBTE9HVigiZ290IGZ1bGwgcGFja2V0LCBzaXplICV6dSIsIGZ1bGxTaXplKTsKIAotICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQYWNrZXRJblBhZ2UpIHsKKyAgICAgICAgICAgICAgICBpZiAobUZpcnN0UGFja2V0SW5QYWdlICYmIChtQ3VycmVudFBhZ2UubUZsYWdzICYgT0dHX1BBR0VfRkxBR19FTkRfT0ZfU1RSRUFNKSkgewogICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOwogICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKQEAgLTg2NCw2ICs4NzEsOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gsIHRoZSBidWZmZXIgbm93IGNvbnRhaW5zIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LgorICAgICAgICAgICAgQUxPR1YoImhhdmUgc3RhcnQgb2YgcGFja2V0LCBnZXR0aW5nIHJlc3QiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJtb3ZpbmcgdG8gbmV4dCBwYWdlIik7CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDS19FUShtTmV4dExhY2VJbmRleCwgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyk7CkBAIC04OTksOSArOTA5LDEwIEBACiAgICAgICAgIG1OZXh0TGFjZUluZGV4ID0gMDsKIAogICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICgobUN1cnJlbnRQYWdlLm1GbGFncyAmIDEpID09IDApIHsKKyAgICAgICAgICAgIGlmICgobUN1cnJlbnRQYWdlLm1GbGFncyAmIE9HR19QQUdFX0ZMQUdfQ09OVElOVUVEX1BBQ0tFVCkgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgcGFnZSBkb2VzIG5vdCBjb250aW51ZSB0aGUgcGFja2V0LCBpLmUuIHRoZSBwYWNrZXQKICAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvbXBsZXRlLgorICAgICAgICAgICAgICAgIEFMT0dWKCJwYWNrZXQgd2FzIGFscmVhZHkgY29tcGxldGU/ISIpOwogCiAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CkBAIC05MDksOCArOTIwLDEwIEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFBhZ2UubUZsYWdzICYgT0dHX1BBR0VfRkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CkBAIC05MjksNiArOTQyLDcgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1IZWFkZXJzOyArK2kpIHsKICAgICAgICAgLy8gaWdub3JlIHRpbWVzdGFtcCBmb3IgY29uZmlndXJhdGlvbiBwYWNrZXRzCiAgICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR1YoInJlYWROZXh0UGFja2V0IGZhaWxlZCIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwpAQCAtMTAwOCw2ICsxMDIyLDEwIEBACiAKICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIG9nZ19idWZmZXIgYnVmOwogICAgIGJ1Zi5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOwogICAgIGJ1Zi5zaXplID0gc2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icAppbmRleCBiM2FmZTJmLi4wYmNhNmY1IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xNyw2ICsxNyw3IEBACiBjY190ZXN0IHsKICAgICBuYW1lOiAiRXh0cmFjdG9yVW5pdFRlc3QiLAogICAgIGd0ZXN0OiB0cnVlLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogCiAgICAgc3JjczogWyJFeHRyYWN0b3JVbml0VGVzdC5jcHAiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbAppbmRleCA2YmIyYzhhLi5mYzgxNTJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbApAQCAtMTksNyArMTksNyBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJFeHRyYWN0b3JVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0V4dHJhY3RvclVuaXRUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci0xLjQuemlwP3VuemlwPXRydWUiCiAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0V4dHJhY3RvclVuaXRUZXN0UmVzLyIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcAppbmRleCA1MTgxNjZlLi5kOTFmZmZhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcApAQCAtMjAsOCArMjAsMTAgQEAKIAogI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgogCiAjaW5jbHVkZSAiYWFjL0FBQ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImFtci9BTVJFeHRyYWN0b3IuaCIKQEAgLTQzLDExICs0NSw3NiBAQAogI2RlZmluZSBPVVRQVVRfRFVNUF9GSUxFICIvZGF0YS9sb2NhbC90bXAvZXh0cmFjdG9yT3V0cHV0IgogCiBjb25zdGV4cHIgaW50MzJfdCBrTWF4Q291bnQgPSAxMDsKLWNvbnN0ZXhwciBpbnQzMl90IGtPcHVzU2Vla1ByZVJvbGxVcyA9IDgwMDAwOyAgLy8gODAgbXM7Citjb25zdGV4cHIgaW50MzJfdCBrQXVkaW9EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSAyMDAwMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwbXMKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5kb21TZWVrVG9sZXJhbmNlVXMgPSAyICoga0F1ZGlvRGVmYXVsdFNhbXBsZUR1cmF0aW9uOyAgLy8gNDAgbXM7Citjb25zdGV4cHIgaW50MzJfdCBrUmFuZG9tU2VlZCA9IDcwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtVbmRlZmluZWQgPSAtMTsKKworZW51bSBpbnB1dElEIHsKKyAgICAvLyBhdWRpbyBzdHJlYW1zCisgICAgQUFDXzEsCisgICAgQU1SX05CXzEsCisgICAgQU1SX1dCXzEsCisgICAgRkxBQ18xLAorICAgIEdTTV8xLAorICAgIE1JRElfMSwKKyAgICBNUDNfMSwKKyAgICBPUFVTXzEsCisgICAgVk9SQklTXzEsCisgICAgLy8gdmlkZW8gc3RyZWFtcworICAgIEhFVkNfMSwKKyAgICBIRVZDXzIsCisgICAgTVBFRzJfUFNfMSwKKyAgICBNUEVHMl9UU18xLAorICAgIE1QRUc0XzEsCisgICAgVlA5XzEsCisgICAgVU5LTk9XTl9JRCwKK307CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgSW5wdXREYXRhIHsKKyAgICBpbnB1dElEIGlucElkOworICAgIHN0cmluZyBtaW1lOworICAgIHN0cmluZyBpbnB1dEZpbGU7CisgICAgaW50MzJfdCBmaXJzdFBhcmFtOworICAgIGludDMyX3Qgc2Vjb25kUGFyYW07CisgICAgaW50MzJfdCBwcm9maWxlOworICAgIGludDMyX3QgZnJhbWVSYXRlOworfSBrSW5wdXREYXRhW10gPSB7CisgICAgICAgIHtBQUNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAidGVzdF9tb25vXzQ0MTAwSHpfYWFjLmFhYyIsIDQ0MTAwLCAxLCBBQUNPYmplY3RMQywKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7QU1SX05CXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgImJiYl9tb25vXzhrSHpfYW1ybmIuYW1yIiwgODAwMCwgMSwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7QU1SX1dCXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgImJiYl9tb25vXzE2a0h6X2FtcndiLmFtciIsIDE2MDAwLCAxLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtGTEFDXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgImJiYl9zdGVyZW9fNDhrSHpfZmxhYy5mbGFjIiwgNDgwMDAsIDIsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge0dTTV8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSwgInRlc3RfbW9ub184a0h6X2dzbS53YXYiLCA4MDAwLCAxLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtNSURJXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgIm1pZGlfYS5taWQiLCAyMjA1MCwgMiwga1VuZGVmaW5lZCwga1VuZGVmaW5lZH0sCisgICAgICAgIHtNUDNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgImJiYl9zdGVyZW9fNDhrSHpfbXAzLm1wMyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtPUFVTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICJ0ZXN0X3N0ZXJlb180OGtIel9vcHVzLm9wdXMiLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7Vk9SQklTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgImJiYl9zdGVyZW9fNDhrSHpfdm9yYmlzLm9nZyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisKKyAgICAgICAgLy8gVGVzdCAoYi8xNTE2NzcyNjQpIGZvciBNUDQgZXh0cmFjdG9yCisgICAgICAgIHtIRVZDXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsICJjcm93ZF81MDh4MjQwXzI1ZnBzX2hldmMubXA0IiwgNTA4LCAyNDAsCisgICAgICAgICBIRVZDUHJvZmlsZU1haW4sIDI1fSwKKyAgICAgICAge0hFVkNfMiwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLCAidGVzdDMuaGVpYyIsIDgyMCwgNDYwLCBrVW5kZWZpbmVkLCBrVW5kZWZpbmVkfSwKKyAgICAgICAge01QRUcyX1BTXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCAic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciLCAxNDQsIDEzNiwKKyAgICAgICAgIE1QRUcyUHJvZmlsZU1haW4sIDEyfSwKKyAgICAgICAge01QRUcyX1RTXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCAiYmJiX2NpZl83NjhrYnBzXzMwZnBzX21wZWcyLnRzIiwgMzUyLCAyODgsCisgICAgICAgICBNUEVHMlByb2ZpbGVNYWluLCAzMH0sCisgICAgICAgIHtNUEVHNF8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnNC5ta3YiLCAzNTIsIDI4OCwKKyAgICAgICAgIE1QRUc0UHJvZmlsZVNpbXBsZSwgMzB9LAorICAgICAgICB7VlA5XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwgImJiYl8zNDB4MjgwXzMwZnBzX3ZwOS53ZWJtIiwgMzQwLCAyODAsIFZQOVByb2ZpbGUwLCAzMH0sCit9OwogCiBzdGF0aWMgRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CiAKLWNsYXNzIEV4dHJhY3RvclVuaXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgc3RyaW5nPj4geworY2xhc3MgRXh0cmFjdG9yVW5pdFRlc3QgewogICBwdWJsaWM6CiAgICAgRXh0cmFjdG9yVW5pdFRlc3QoKSA6IG1JbnB1dEZwKG51bGxwdHIpLCBtRGF0YVNvdXJjZShudWxscHRyKSwgbUV4dHJhY3RvcihudWxscHRyKSB7fQogCkBAIC02NiwxNiArMTMzLDI5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgdm9pZCBzZXR1cEV4dHJhY3RvcihzdHJpbmcgd3JpdGVyRm9ybWF0KSB7CiAgICAgICAgIG1FeHRyYWN0b3JOYW1lID0gdW5rbm93bl9jb21wOwogICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKIAogICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0YW5kYXJkRXh0cmFjdG9ycz4gbWFwRXh0cmFjdG9yID0gewotICAgICAgICAgICAgICAgIHsiYWFjIiwgQUFDfSwgICAgIHsiYW1yIiwgQU1SfSwgICAgICAgICB7Im1wMyIsIE1QM30sICAgICAgICB7Im9nZyIsIE9HR30sCi0gICAgICAgICAgICAgICAgeyJ3YXYiLCBXQVZ9LCAgICAgeyJta3YiLCBNS1Z9LCAgICAgICAgIHsiZmxhYyIsIEZMQUN9LCAgICAgIHsibWlkaSIsIE1JREl9LAotICAgICAgICAgICAgICAgIHsibXBlZzQiLCBNUEVHNH0sIHsibXBlZzJ0cyIsIE1QRUcyVFN9LCB7Im1wZWcycHMiLCBNUEVHMlBTfX07CisgICAgICAgICAgICAgICAgeyJhYWMiLCBBQUN9LAorICAgICAgICAgICAgICAgIHsiYW1yIiwgQU1SfSwKKyAgICAgICAgICAgICAgICB7ImZsYWMiLCBGTEFDfSwKKyAgICAgICAgICAgICAgICB7Im1pZCIsIE1JREl9LAorICAgICAgICAgICAgICAgIHsibWlkaSIsIE1JREl9LAorICAgICAgICAgICAgICAgIHsibWt2IiwgTUtWfSwKKyAgICAgICAgICAgICAgICB7Im1wMyIsIE1QM30sCisgICAgICAgICAgICAgICAgeyJtcDQiLCBNUEVHNH0sCisgICAgICAgICAgICAgICAgeyJtcGVnMnBzIiwgTVBFRzJQU30sCisgICAgICAgICAgICAgICAgeyJtcGVnMnRzIiwgTVBFRzJUU30sCisgICAgICAgICAgICAgICAgeyJtcGVnNCIsIE1QRUc0fSwKKyAgICAgICAgICAgICAgICB7Im1wZyIsIE1QRUcyUFN9LAorICAgICAgICAgICAgICAgIHsib2dnIiwgT0dHfSwKKyAgICAgICAgICAgICAgICB7Im9wdXMiLCBPR0d9LAorICAgICAgICAgICAgICAgIHsidHMiLCBNUEVHMlRTfSwKKyAgICAgICAgICAgICAgICB7IndhdiIsIFdBVn0sCisgICAgICAgICAgICAgICAgeyJ3ZWJtIiwgTUtWfX07CiAgICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAgICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OwogICAgICAgICBpZiAobWFwRXh0cmFjdG9yLmZpbmQod3JpdGVyRm9ybWF0KSAhPSBtYXBFeHRyYWN0b3IuZW5kKCkpIHsKICAgICAgICAgICAgIG1FeHRyYWN0b3JOYW1lID0gbWFwRXh0cmFjdG9yLmF0KHdyaXRlckZvcm1hdCk7CiAgICAgICAgIH0KQEAgLTExMiw2ICsxOTIsMzkgQEAKICAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAqbUV4dHJhY3RvcjsKIH07CiAKK2NsYXNzIEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0CisgICAgOiBwdWJsaWMgRXh0cmFjdG9yVW5pdFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHN0cmluZyAvKiBjb250YWluZXIgKi8sIHN0cmluZyAvKiBJbnB1dEZpbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLyogbnVtVHJhY2tzICovLCBib29sIC8qIHNlZWtTdXBwb3J0ZWQgKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHN0cmluZywgc3RyaW5nLCBpbnQzMl90LCBib29sPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBtQ29udGFpbmVyID0gZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1OdW1UcmFja3MgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgc2V0dXBFeHRyYWN0b3IobUNvbnRhaW5lcik7CisgICAgfQorICAgIHN0cmluZyBtQ29udGFpbmVyOworICAgIGludDMyX3QgbU51bVRyYWNrczsKK307CisKK2NsYXNzIENvbmZpZ1BhcmFtVGVzdCA6IHB1YmxpYyBFeHRyYWN0b3JVbml0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIGlucHV0SUQ+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwRXh0cmFjdG9yKEdldFBhcmFtKCkuZmlyc3QpOyB9CisKKyAgICBzdHJ1Y3QgY29uZmlnRm9ybWF0IHsKKyAgICAgICAgc3RyaW5nIG1pbWU7CisgICAgICAgIGludDMyX3Qgd2lkdGg7CisgICAgICAgIGludDMyX3QgaGVpZ2h0OworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OworICAgICAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgICAgIGludDMyX3QgZnJhbWVSYXRlOworICAgIH07CisKKyAgICB2b2lkIGdldEZpbGVQcm9wZXJ0aWVzKGlucHV0SUQgaW5wdXRJZCwgc3RyaW5nICZpbnB1dEZpbGUsIGNvbmZpZ0Zvcm1hdCAmY29uZmlnUGFyYW0pOworfTsKKwogaW50MzJfdCBFeHRyYWN0b3JVbml0VGVzdDo6c2V0RGF0YVNvdXJjZShzdHJpbmcgaW5wdXRGaWxlTmFtZSkgewogICAgIG1JbnB1dEZwID0gZm9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCAicmIiKTsKICAgICBpZiAoIW1JbnB1dEZwKSB7CkBAIC0xNjgsNiArMjgxLDc1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgQ29uZmlnUGFyYW1UZXN0OjpnZXRGaWxlUHJvcGVydGllcyhpbnB1dElEIGlucHV0SWQsIHN0cmluZyAmaW5wdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0Zvcm1hdCAmY29uZmlnUGFyYW0pIHsKKyAgICBpbnQzMl90IGlucHV0RGF0YVNpemUgPSBzaXplb2Yoa0lucHV0RGF0YSkgLyBzaXplb2Yoa0lucHV0RGF0YVswXSk7CisgICAgaW50MzJfdCBpbnB1dElkeCA9IDA7CisgICAgZm9yICg7IGlucHV0SWR4IDwgaW5wdXREYXRhU2l6ZTsgaW5wdXRJZHgrKykgeworICAgICAgICBpZiAoaW5wdXRJZCA9PSBrSW5wdXREYXRhW2lucHV0SWR4XS5pbnBJZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGlucHV0SWR4ID09IGlucHV0RGF0YVNpemUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnB1dEZpbGUgKz0ga0lucHV0RGF0YVtpbnB1dElkeF0uaW5wdXRGaWxlOworICAgIGNvbmZpZ1BhcmFtLm1pbWUgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5taW1lOworICAgIHNpemVfdCBmb3VuZCA9IGNvbmZpZ1BhcmFtLm1pbWUuZmluZCgiYXVkaW8vIik7CisgICAgLy8gQ2hlY2sgaWYgJ2F1ZGlvLycgaXMgcHJlc2VudCBpbiB0aGUgYmVnaW5pbmlnIG9mIHRoZSBtaW1lIHR5cGUKKyAgICBpZiAoZm91bmQgPT0gMCkgeworICAgICAgICBjb25maWdQYXJhbS5zYW1wbGVSYXRlID0ga0lucHV0RGF0YVtpbnB1dElkeF0uZmlyc3RQYXJhbTsKKyAgICAgICAgY29uZmlnUGFyYW0uY2hhbm5lbENvdW50ID0ga0lucHV0RGF0YVtpbnB1dElkeF0uc2Vjb25kUGFyYW07CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uZmlnUGFyYW0ud2lkdGggPSBrSW5wdXREYXRhW2lucHV0SWR4XS5maXJzdFBhcmFtOworICAgICAgICBjb25maWdQYXJhbS5oZWlnaHQgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5zZWNvbmRQYXJhbTsKKyAgICB9CisgICAgY29uZmlnUGFyYW0ucHJvZmlsZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLnByb2ZpbGU7CisgICAgY29uZmlnUGFyYW0uZnJhbWVSYXRlID0ga0lucHV0RGF0YVtpbnB1dElkeF0uZnJhbWVSYXRlOworICAgIHJldHVybjsKK30KKwordm9pZCByYW5kb21TZWVrVGVzdChNZWRpYVRyYWNrSGVscGVyICp0cmFjaywgaW50NjRfdCBjbGlwRHVyYXRpb24pIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgaW50MzJfdCBzZWVrQ291bnQgPSAwOworICAgIGJvb2wgaGFzVGltZXN0YW1wID0gZmFsc2U7CisgICAgdmVjdG9yPGludDY0X3Q+IHNlZWtUb1RpbWVTdGFtcDsKKyAgICBzdHJpbmcgc2Vla1B0c1N0cmluZzsKKworICAgIHNyYW5kKGtSYW5kb21TZWVkKTsKKyAgICB3aGlsZSAoc2Vla0NvdW50IDwga01heENvdW50KSB7CisgICAgICAgIGludDY0X3QgdGltZVN0YW1wID0gKChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVgpICogY2xpcER1cmF0aW9uOworICAgICAgICBzZWVrVG9UaW1lU3RhbXAucHVzaF9iYWNrKHRpbWVTdGFtcCk7CisgICAgICAgIHNlZWtQdHNTdHJpbmcuYXBwZW5kKHRvX3N0cmluZyh0aW1lU3RhbXApKTsKKyAgICAgICAgc2Vla1B0c1N0cmluZy5hcHBlbmQoIiwgIik7CisgICAgICAgIHNlZWtDb3VudCsrOworICAgIH0KKworICAgIGZvciAoaW50NjRfdCBzZWVrUHRzIDogc2Vla1RvVGltZVN0YW1wKSB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zICpvcHRpb25zID0gbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKAorICAgICAgICAgICAgICAgIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUssIHNlZWtQdHMpOworICAgICAgICBBU1NFUlRfTkUob3B0aW9ucywgbnVsbHB0cikgPDwgIkNhbm5vdCBjcmVhdGUgcmVhZCBvcHRpb24iOworCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyLCBvcHRpb25zKTsKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhRGF0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcCA9IDA7CisgICAgICAgICAgICBoYXNUaW1lc3RhbXAgPSBBTWVkaWFGb3JtYXRfZ2V0SW50NjQobWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgJnRpbWVTdGFtcCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShoYXNUaW1lc3RhbXApIDw8ICJFeHRyYWN0b3IgZGlkbid0IHNldCB0aW1lc3RhbXAgZm9yIHRoZSBnaXZlbiBzYW1wbGUiOworCisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIEVYUEVDVF9MRShhYnModGltZVN0YW1wIC0gc2Vla1B0cyksIGtSYW5kb21TZWVrVG9sZXJhbmNlVXMpCisgICAgICAgICAgICAgICAgICAgIDw8ICJTZWVrIHVuc3VjY2Vzc2Z1bC4gRXhwZWN0ZWQgdGltZXN0YW1wIHJhbmdlIFsiCisgICAgICAgICAgICAgICAgICAgIDw8IHNlZWtQdHMgLSBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzIDw8ICIsICIgPDwgc2Vla1B0cyArIGtSYW5kb21TZWVrVG9sZXJhbmNlVXMKKyAgICAgICAgICAgICAgICAgICAgPDwgIl0gIgorICAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgIiA8PCB0aW1lU3RhbXAgPDwgIiwgbGlzdCBvZiBpbnB1dCBzZWVrIHRpbWVzdGFtcHMgWyIKKyAgICAgICAgICAgICAgICAgICAgPDwgc2Vla1B0c1N0cmluZyA8PCAiXSI7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIG9wdGlvbnM7CisgICAgfQorfQorCiB2b2lkIGdldFNlZWthYmxlUG9pbnRzKHZlY3RvcjxpbnQ2NF90PiAmc2Vla2FibGVQb2ludHMsIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrKSB7CiAgICAgaW50MzJfdCBzdGF0dXMgPSAwOwogICAgIGlmICghc2Vla2FibGVQb2ludHMuZW1wdHkoKSkgewpAQCAtMTkwLDIwICszNzIsMjEgQEAKICAgICB9CiB9CiAKLVRFU1RfUChFeHRyYWN0b3JVbml0VGVzdCwgQ3JlYXRlRXh0cmFjdG9yVGVzdCkgeworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBDcmVhdGVFeHRyYWN0b3JUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogCiAgICAgQUxPR1YoIkNoZWNrcyBpZiBhIHZhbGlkIGV4dHJhY3RvciBpcyBjcmVhdGVkIGZvciBhIGdpdmVuIGlucHV0IGZpbGUiKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKIAotICAgIEFTU0VSVF9FUShzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpLCAwKQotICAgICAgICAgICAgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAotICAgIEFTU0VSVF9FUShjcmVhdGVFeHRyYWN0b3IoKSwgMCkKLSAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKLSAgICAvLyBBIHZhbGlkIGV4dHJhY3RvciBpbnN0YWNlIHNob3VsZCByZXR1cm4gc3VjY2VzcyBmb3IgZm9sbG93aW5nIGNhbGxzCi0gICAgQVNTRVJUX0dUKG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCksIDApOworICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKQEAgLTIxMiwyMCArMzk1LDIxIEBACiAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOwogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIEV4dHJhY3RvclRlc3QpIHsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgRXh0cmFjdG9yVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAotICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGZvciBhIGdpdmVuIGlucHV0IGZpbGUiLCBHZXRQYXJhbSgpLmZpcnN0LmNfc3RyKCkpOwotICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOwogCiAgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CiAgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaWR4KTsKQEAgLTI2MiwyMCArNDQ2LDIxIEBACiAgICAgfQogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIE1ldGFEYXRhQ29tcGFyaXNvblRlc3QpIHsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgTWV0YURhdGFDb21wYXJpc29uVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAogICAgIEFMT0dWKCJWYWxpZGF0ZXMgRXh0cmFjdG9yJ3MgbWV0YSBkYXRhIGZvciBhIGdpdmVuIGlucHV0IGZpbGUiKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKIAogICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CiAKICAgICBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBBU1NFUlRfTkUoZXh0cmFjdG9yRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CkBAIC0zMzcsMjAgKzUyMiwyMSBAQAogICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZXh0cmFjdG9yRm9ybWF0KTsKIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBNdWx0aXBsZVN0YXJ0U3RvcFRlc3QpIHsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgTXVsdGlwbGVTdGFydFN0b3BUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogCi0gICAgQUxPR1YoIlRlc3QgJXMgZXh0cmFjdG9yIGZvciBtdWx0aXBsZSBzdGFydCBhbmQgc3RvcCBjYWxscyIsIEdldFBhcmFtKCkuZmlyc3QuY19zdHIoKSk7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFMT0dWKCJUZXN0ICVzIGV4dHJhY3RvciBmb3IgbXVsdGlwbGUgc3RhcnQgYW5kIHN0b3AgY2FsbHMiLCBtQ29udGFpbmVyLmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CiAKICAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBmaW5kIGFueSB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOwogCiAgICAgLy8gc3RhcnQvc3RvcCB0aGUgdHJhY2tzIG11bHRpcGxlIHRpbWVzCiAgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKQEAgLTM3OSwyNyArNTY1LDI4IEBACiAgICAgfQogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIFNlZWtUZXN0KSB7Ci0gICAgLy8gQm90aCBGbGFjIGFuZCBXYXYgZXh0cmFjdG9yIGNhbiBnaXZlIHNhbXBsZXMgZnJvbSBhbnkgcHRzIGFuZCBtYXJrIHRoZSBnaXZlbiBzYW1wbGUgYXMKLSAgICAvLyBzeW5jIGZyYW1lLiBTbywgdGhpcyBzZWVrIHRlc3QgaXMgbm90IGFwcGxpY2FibGUgdG8gRkxBQyBhbmQgV0FWIGV4dHJhY3RvcnMKLSAgICBpZiAobURpc2FibGVUZXN0IHx8IG1FeHRyYWN0b3JOYW1lID09IEZMQUMgfHwgbUV4dHJhY3Rvck5hbWUgPT0gV0FWKSByZXR1cm47CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIFNlZWtUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogCi0gICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgYmVoYXZpb3VyIGZvciBkaWZmZXJlbnQgc2VlayBtb2RlcyIsIEdldFBhcmFtKCkuZmlyc3QuY19zdHIoKSk7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGJlaGF2aW91ciBmb3IgZGlmZmVyZW50IHNlZWsgbW9kZXMiLCBtQ29udGFpbmVyLmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CiAKICAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBmaW5kIGFueSB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOwogCiAgICAgdWludDMyX3Qgc2Vla0ZsYWcgPSBtRXh0cmFjdG9yLT5mbGFncygpOwotICAgIGlmICghKHNlZWtGbGFnICYgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OkNBTl9TRUVLKSkgewotICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkLiAiIDw8IEdldFBhcmFtKCkuZmlyc3QKLSAgICAgICAgICAgICA8PCAiIEV4dHJhY3RvciBkb2Vzbid0IHN1cHBvcnQgc2Vla1xuIjsKKyAgICBib29sIHNlZWtTdXBwb3J0ZWQgPSBnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgYm9vbCBzZWVrYWJsZSA9IHNlZWtGbGFnICYgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OkNBTl9TRUVLOworICAgIGlmICghc2Vla2FibGUpIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKHNlZWtTdXBwb3J0ZWQpIDw8IG1Db250YWluZXIgPDwgIkV4dHJhY3RvciBpcyBleHBlY3RlZCB0byBzdXBwb3J0IHNlZWsgIjsKKyAgICAgICAgY291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZC4gIiA8PCBtQ29udGFpbmVyIDw8ICIgRXh0cmFjdG9yIGRvZXNuJ3Qgc3VwcG9ydCBzZWVrXG4iOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC00MTUsMTkgKzYwMiw3MyBAQAogICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CiAgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOwogICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHRyYWNrIjsKLSAgICAgICAgZ2V0U2Vla2FibGVQb2ludHMoc2Vla2FibGVQb2ludHMsIHRyYWNrKTsKLSAgICAgICAgQVNTRVJUX0dUKHNlZWthYmxlUG9pbnRzLnNpemUoKSwgMCkKLSAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCBzZWVrYWJsZSBwb2ludHMgZm9yICIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiIGV4dHJhY3RvciI7CisKKyAgICAgICAgLy8gRm9yIEZsYWMsIFdhdiBhbmQgTWlkaSBleHRyYWN0b3IsIGFsbCBzYW1wbGVzIGFyZSBzZWVrIHBvaW50cy4KKyAgICAgICAgLy8gV2UgY2Fubm90IGNyZWF0ZSBsaXN0IG9mIGFsbCBzZWVrYWJsZSBwb2ludHMgZm9yIHRoZXNlLgorICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgd2UgcGFzcyBhIHNlZWtUb1RpbWVTdGFtcCBiZXR3ZWVuIHR3byBzZWVrIHBvaW50cywgd2UgbWF5CisgICAgICAgIC8vIGVuZCB1cCBnZXR0aW5nIHRoZSB0aW1lc3RhbXAgb2YgbmV4dCBzYW1wbGUgYXMgYSBzZWVrYWJsZSB0aW1lc3RhbXAuCisgICAgICAgIC8vIFRoaXMgdGltZXN0YW1wIG1heS9tYXkgbm90IGJlIGEgcGFydCBvZiB0aGUgc2Vla2FibGUgcG9pbnQgdmVjdG9yIHRoZXJlYnkgZmFpbGluZyB0aGUKKyAgICAgICAgLy8gdGVzdC4gU28gd2UgdGVzdCB0aGVzZSBleHRyYWN0b3JzIHVzaW5nIHJhbmRvbSBzZWVrIHRlc3QuCisgICAgICAgIGlmIChtRXh0cmFjdG9yTmFtZSA9PSBGTEFDIHx8IG1FeHRyYWN0b3JOYW1lID09IFdBViB8fCBtRXh0cmFjdG9yTmFtZSA9PSBNSURJKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh0cmFja01ldGEsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKKworICAgICAgICAgICAgc3RhdHVzID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0cmFja01ldGEsIGlkeCwgMSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrTWV0YURhdGEiOworCisgICAgICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmY2xpcER1cmF0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVF9HVChjbGlwRHVyYXRpb24sIDApIDw8ICJJbnZhbGlkIGNsaXAgZHVyYXRpb24gIjsKKyAgICAgICAgICAgIHJhbmRvbVNlZWtUZXN0KHRyYWNrLCBjbGlwRHVyYXRpb24pOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja01ldGEpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAogICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgICAgICBBU1NFUlRfTkUodHJhY2tGb3JtYXQsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgZm9ybWF0IjsKICAgICAgICAgc3RhdHVzID0gdHJhY2stPmdldEZvcm1hdCh0cmFja0Zvcm1hdCk7CiAgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgbWV0YSBkYXRhIjsKIAotICAgICAgICBib29sIGlzT3B1cyA9IGZhbHNlOwogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKLSAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgImF1ZGlvL29wdXMiKSkgaXNPcHVzID0gdHJ1ZTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgbWltZSI7CisKKyAgICAgICAgLy8gSW1hZ2UgZm9ybWF0cyBhcmUgbm90IGV4cGVjdGVkIHRvIGJlIHNlZWthYmxlCisgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAiaW1hZ2UvIiwgNikpIGNvbnRpbnVlOworCisgICAgICAgIC8vIFJlcXVlc3Qgc2Vla2FibGUgcG9pbnRzIGZvciByZW1haW5pbmcgZXh0cmFjdG9ycyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHNlZWsKKyAgICAgICAgLy8gYWNjdXJhY3kgZm9yIHRoZSBleHRyYWN0b3JzLiBEZXBlbmRpbmcgb24gU0VFSyBNb2RlLCB3ZSBleHBlY3QgdGhlIGV4dHJhY3RvcnMgdG8gcmV0dXJuCisgICAgICAgIC8vIHRoZSBleHBlY3RlZCBzeW5jIGZyYW1lLiBXZSBkb24ndCBwcmVmZXIgcmFuZG9tIHNlZWsgdGVzdCBmb3IgdGhlc2UgZXh0cmFjdG9ycyBiZWNhdXNlCisgICAgICAgIC8vIHRoZXkgYXJlbid0IGV4cGVjdGVkIHRvIHNlZWsgdG8gcmFuZG9tIHNhbXBsZXMuIE1QNCBmb3IgaW5zdGFuY2UgY2FuIHNlZWsgdG8KKyAgICAgICAgLy8gbmV4dC9wcmV2aW91cyBzeW5jIGZyYW1lcyBidXQgbm90IHRvIHNhbXBsZXMgYmV0d2VlbiB0d28gc3luYyBmcmFtZXMuCisgICAgICAgIGdldFNlZWthYmxlUG9pbnRzKHNlZWthYmxlUG9pbnRzLCB0cmFjayk7CisgICAgICAgIEFTU0VSVF9HVChzZWVrYWJsZVBvaW50cy5zaXplKCksIDApCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgc2Vla2FibGUgcG9pbnRzIGZvciAiIDw8IG1Db250YWluZXIgPDwgIiBleHRyYWN0b3IiOworCisgICAgICAgIGJvb2wgaXNPcHVzID0gZmFsc2U7CisgICAgICAgIGludDY0X3Qgb3B1c1NlZWtQcmVSb2xsVXMgPSAwOworICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCAiYXVkaW8vb3B1cyIpKSB7CisgICAgICAgICAgICBpc09wdXMgPSB0cnVlOworICAgICAgICAgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBudWxscHRyOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrRm9ybWF0LCAiY3NkLTIiLCAmc2Vla1ByZVJvbGxCdWYsICZzaXplKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgdm9pZCAqY3NkQnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFja0Zvcm1hdCwgImNzZC0wIiwgJmNzZEJ1ZmZlciwgJnNpemUpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShjc2RCdWZmZXIsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgR2V0T3B1c0hlYWRlckJ1ZmZlcnMoKHVpbnQ4X3QgKiljc2RCdWZmZXIsIHNpemUsICZvcHVzSGVhZEJ1ZiwgJm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNEZWxheUJ1ZiwgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfTkUoc2Vla1ByZVJvbGxCdWYsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIHRyYWNrIGZvcm1hdC4gU2Vla1ByZVJvbGwgaW5mbyBtaXNzaW5nIGZvciBPcHVzIGZpbGUiOworICAgICAgICAgICAgb3B1c1NlZWtQcmVSb2xsVXMgPSAqKChpbnQ2NF90ICopc2Vla1ByZVJvbGxCdWYpOworICAgICAgICB9CiAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tGb3JtYXQpOwogCiAgICAgICAgIGludDMyX3Qgc2Vla0lkeCA9IDA7CkBAIC00NDgsNyArNjg5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBleHRyYWN0b3IgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiAoc2Vla1B0cyAtIHNlZWtQcmVSb2xsVXMpLgogICAgICAgICAgICAgICAgIC8vIFNvIHdlIGFkZCB0aGUgcHJlUm9sbCB2YWx1ZSB0byB0aGUgdGltZVN0YW1wIHdlIHdhbnQgdG8gc2VlayB0by4KICAgICAgICAgICAgICAgICBpZiAoaXNPcHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlZWtUb1RpbWVTdGFtcCArPSBrT3B1c1NlZWtQcmVSb2xsVXM7CisgICAgICAgICAgICAgICAgICAgIHNlZWtUb1RpbWVTdGFtcCArPSBvcHVzU2Vla1ByZVJvbGxVczsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IG5ldyBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucygKQEAgLTQ5NiwyNCArNzM3LDUxNyBAQAogICAgIHNlZWthYmxlUG9pbnRzLmNsZWFyKCk7CiB9CiAKLS8vIFRPRE86IChiLzE0NTMzMjE4NSkKLS8vIEFkZCBNSURJIGlucHV0cwotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEV4dHJhY3RvclVuaXRUZXN0QWxsLCBFeHRyYWN0b3JVbml0VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImFhYyIsICJsb3Vkc29mdGFhYy5hYWMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtciIsICJ0ZXN0YW1yLmFtciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1yIiwgImFtcndiLndhdiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigib2dnIiwgImpvaG5fY2FnZS5vZ2ciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndhdiIsICJtb25vdGVzdGdzbS53YXYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcydHMiLCAic2VnbWVudDAwMDAwMS50cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiZmxhYyIsICJzaW5lc3dlZXBmbGFjLmZsYWMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsICJ0ZXN0b3B1cy5vcHVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCAic2luZXN3ZWVwdm9yYmlzLm1rdiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAic2luZXN3ZWVwb2dnbXA0Lm1wNCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXAzIiwgInNpbmVzd2VlcG1wM2xhbWUubXAzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCAic3dpcmxfMTQ0eDEzNl92cDkud2VibSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcycHMiLCAic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IikpKTsKKy8vIFRlc3RzIHRoZSBleHRyYWN0b3JzIGZvciBzZWVrIGJleW9uZCByYW5nZSA6ICgwLCBDbGlwRHVyYXRpb24pCitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIE1vbmtleVNlZWtUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIC8vIFRPRE8oYi8xNTU2MzA3NzgpOiBFbmFibGUgdGVzdCBmb3Igd2F2IGV4dHJhY3RvcnMKKyAgICBpZiAobUV4dHJhY3Rvck5hbWUgPT0gV0FWKSByZXR1cm47CisKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBiZWhhdmlvdXIgZm9yIGludmFsaWQgc2VlayBwb2ludHMiLCBtQ29udGFpbmVyLmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKKworICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKKworICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKworICAgIHVpbnQzMl90IHNlZWtGbGFnID0gbUV4dHJhY3Rvci0+ZmxhZ3MoKTsKKyAgICBib29sIHNlZWtTdXBwb3J0ZWQgPSBnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgYm9vbCBzZWVrYWJsZSA9IHNlZWtGbGFnICYgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OkNBTl9TRUVLOworICAgIGlmICghc2Vla2FibGUpIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKHNlZWtTdXBwb3J0ZWQpIDw8IG1Db250YWluZXIgPDwgIkV4dHJhY3RvciBpcyBleHBlY3RlZCB0byBzdXBwb3J0IHNlZWsgIjsKKyAgICAgICAgY291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZC4gIiA8PCBtQ29udGFpbmVyIDw8ICIgRXh0cmFjdG9yIGRvZXNuJ3Qgc3VwcG9ydCBzZWVrXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlciAqdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayhpZHgpOworICAgICAgICBBU1NFUlRfTkUodHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIGZvciBpbmRleCAiIDw8IGlkeDsKKworICAgICAgICBDTWVkaWFUcmFjayAqY1RyYWNrID0gd3JhcCh0cmFjayk7CisgICAgICAgIEFTU0VSVF9ORShjVHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIHdyYXBwZXIgZm9yIGluZGV4ICIgPDwgaWR4OworCisgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdGFydCh0cmFjaywgYnVmZmVyR3JvdXAtPndyYXAoKSk7CisgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBzdGFydCB0aGUgdHJhY2siOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBU1NFUlRfTkUodHJhY2tNZXRhLCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisKKyAgICAgICAgc3RhdHVzID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgICAgICB0cmFja01ldGEsIGlkeCwgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpOworICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrTWV0YURhdGEiOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCBtaW1lIjsKKworICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvbiA9IDA7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZjbGlwRHVyYXRpb24pOworICAgICAgICAvLyBJbWFnZSBmb3JtYXRzIGFyZSBub3QgZXhwZWN0ZWQgdG8gaGF2ZSBkdXJhdGlvbiBpbmZvcm1hdGlvbgorICAgICAgICBBU1NFUlRfVFJVRShjbGlwRHVyYXRpb24gPiAwIHx8ICFzdHJuY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgPDwgIkludmFsaWQgY2xpcCBkdXJhdGlvbiAiOworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrTWV0YSk7CisKKyAgICAgICAgaW50NjRfdCBzZWVrVG9UaW1lU3RhbXBVc1tdID0gey1jbGlwRHVyYXRpb24sIGNsaXBEdXJhdGlvbiAvIDIsIGNsaXBEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBEdXJhdGlvbiAqIDJ9OworICAgICAgICBmb3IgKGludDMyX3QgbW9kZSA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzsKKyAgICAgICAgICAgICBtb2RlIDw9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDsgbW9kZSsrKSB7CisgICAgICAgICAgICBmb3IgKGludDY0X3Qgc2Vla1RpbWVVcyA6IHNlZWtUb1RpbWVTdGFtcFVzKSB7CisgICAgICAgICAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBuZXcgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHwgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSywgc2Vla1RpbWVVcyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKG9wdGlvbnMsIG51bGxwdHIpIDw8ICJDYW5ub3QgY3JlYXRlIHJlYWQgb3B0aW9uIjsKKworICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5yZWFkKCZidWZmZXIsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YURhdGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KG1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZ0aW1lU3RhbXApOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2Vla2VkIHRvIHRpbWVzdGFtcCA6ICVsbGQsIHJlcXVlc3RlZCA6ICVsbGQiLCAobG9uZyBsb25nKXRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RvcCh0cmFjayk7CisgICAgICAgIEFTU0VSVF9FUShPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlckdyb3VwOworICAgICAgICBkZWxldGUgdHJhY2s7CisgICAgfQorfQorCisvLyBUZXN0cyBleHRyYWN0b3JzIGZvciBpbnZhbGlkIHRyYWNrcworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBTYW5pdHlUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIC8vIFRPRE8oYi8xNTU2MjY5NDYpOiBFbmFibGUgdGVzdCBmb3IgTVBFRzIgVFMvUFMgZXh0cmFjdG9ycworICAgIGlmIChtRXh0cmFjdG9yTmFtZSA9PSBNUEVHMlRTIHx8IG1FeHRyYWN0b3JOYW1lID09IE1QRUcyUFMpIHJldHVybjsKKworICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGJlaGF2aW91ciBmb3IgaW52YWxpZCB0cmFja3MiLCBtQ29udGFpbmVyLmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKKworICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKKworICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKworICAgIGludDMyX3QgdHJhY2tJZHhbXSA9IHstMSwgbnVtVHJhY2tzfTsKKyAgICBmb3IgKGludDMyX3QgaWR4IDogdHJhY2tJZHgpIHsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlciAqdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayhpZHgpOworICAgICAgICBBU1NFUlRfRVEodHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIGZvciBpbmRleCAiIDw8IGlkeCA8PCAiXG4iOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZXh0cmFjdG9yRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBU1NFUlRfTkUoZXh0cmFjdG9yRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisKKyAgICAgICAgc3RhdHVzID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgICAgICBleHRyYWN0b3JGb3JtYXQsIGlkeCwgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpOworICAgICAgICBBU1NFUlRfTkUoT0ssIHN0YXR1cykgPDwgImdldFRyYWNrTWV0YURhdGEgc2hvdWxkIHJldHVybiBlcnJvciBmb3IgaW52YWxpZCBpbmRleCAiIDw8IGlkeDsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShleHRyYWN0b3JGb3JtYXQpOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIEV4dHJhY3RvcidzIGdldFRyYWNrTWV0YURhdGEgZm9yIG51bGwgZm9ybWF0CisgICAgQU1lZGlhRm9ybWF0ICptZWRpYUZvcm1hdCA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShtZWRpYUZvcm1hdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKKyAgICBBU1NFUlRfTkUoT0ssIHN0YXR1cykgPDwgImdldFRyYWNrTWV0YURhdGEgc2hvdWxkIHJldHVybiBlcnJvciBmb3IgbnVsbCBNZWRpYSBmb3JtYXQiOworfQorCisvLyBUaGlzIHRlc3QgdmFsaWRhdGVzIGNvbmZpZyBwYXJhbXMgZm9yIGEgZ2l2ZW4gaW5wdXQgZmlsZS4KKy8vIEZvciB0aGlzIHRlc3Qgd2Ugb25seSB0YWtlIHNpbmdsZSB0cmFjayBmaWxlcyBzaW5jZSB0aGUgZm9jdXMgb2YgdGhpcyB0ZXN0IGlzCisvLyB0byB2YWxpZGF0ZSB0aGUgZmlsZSBwcm9wZXJ0aWVzIHJlcG9ydGVkIGJ5IEV4dHJhY3RvciBhbmQgbm90IG11bHRpLXRyYWNrIGJlaGF2aW9yCitURVNUX1AoQ29uZmlnUGFyYW1UZXN0LCBDb25maWdQYXJhbVZhbGlkYXRpb24pIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBzdHJpbmcgY29udGFpbmVyID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBmb3IgaW5wdXQncyBmaWxlIHByb3BlcnRpZXMiLCBjb250YWluZXIuY19zdHIoKSk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBpbnB1dElEIGlucHV0RmlsZUlkID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgY29uZmlnRm9ybWF0IGNvbmZpZ1BhcmFtOworICAgIGdldEZpbGVQcm9wZXJ0aWVzKGlucHV0RmlsZUlkLCBpbnB1dEZpbGVOYW1lLCBjb25maWdQYXJhbSk7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciAiIDw8IGNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKKworICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciAiIDw8IGNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKKworICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBmaW5kIGFueSB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworCisgICAgTWVkaWFUcmFja0hlbHBlciAqdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjaygwKTsKKyAgICBBU1NFUlRfTkUodHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIGZvciBpbmRleCAwIjsKKworICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tGb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIGZvcm1hdCI7CisKKyAgICBzdGF0dXMgPSB0cmFjay0+Z2V0Rm9ybWF0KHRyYWNrRm9ybWF0KTsKKyAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIG1ldGEgZGF0YSI7CisKKyAgICBjb25zdCBjaGFyICp0cmFja01pbWU7CisgICAgYm9vbCB2YWx1ZUZvdW5kID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmdHJhY2tNaW1lKTsKKyAgICBBU1NFUlRfVFJVRSh2YWx1ZUZvdW5kKSA8PCAiTWltZSB0eXBlIG5vdCBzZXQgYnkgZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfU1RSRVEoY29uZmlnUGFyYW0ubWltZS5jX3N0cigpLCB0cmFja01pbWUpIDw8ICJJbnZhbGlkIHRyYWNrIGZvcm1hdCI7CisKKyAgICBpZiAoIXN0cm5jbXAodHJhY2tNaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgaW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHRyYWNrQ2hhbm5lbENvdW50OworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0NoYW5uZWxDb3VudCkpOworICAgICAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZ0cmFja1NhbXBsZVJhdGUpKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLnNhbXBsZVJhdGUsIHRyYWNrU2FtcGxlUmF0ZSkgPDwgIlNhbXBsZVJhdGUgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLmNoYW5uZWxDb3VudCwgdHJhY2tDaGFubmVsQ291bnQpIDw8ICJDaGFubmVsQ291bnQgbm90IGFzIGV4cGVjdGVkIjsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHRyYWNrV2lkdGgsIHRyYWNrSGVpZ2h0OworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZ0cmFja1dpZHRoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZ0cmFja0hlaWdodCkpOworICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0ud2lkdGgsIHRyYWNrV2lkdGgpIDw8ICJXaWR0aCBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0uaGVpZ2h0LCB0cmFja0hlaWdodCkgPDwgIkhlaWdodCBub3QgYXMgZXhwZWN0ZWQiOworCisgICAgICAgIGlmIChjb25maWdQYXJhbS5mcmFtZVJhdGUgIT0ga1VuZGVmaW5lZCkgeworICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGU7CisgICAgICAgICAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsICZmcmFtZVJhdGUpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5mcmFtZVJhdGUsIGZyYW1lUmF0ZSkgPDwgImZyYW1lUmF0ZSBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICB9CisgICAgfQorICAgIC8vIHZhbGlkYXRlIHRoZSBwcm9maWxlIGZvciB0aGUgaW5wdXQgY2xpcAorICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICBpZiAoY29uZmlnUGFyYW0ucHJvZmlsZSAhPSBrVW5kZWZpbmVkKSB7CisgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgJnByb2ZpbGUpKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0ucHJvZmlsZSwgcHJvZmlsZSkgPDwgInByb2ZpbGUgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgfSBlbHNlIGlmIChtRXh0cmFjdG9yTmFtZSA9PSBBQUMgJiYKKyAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsICZwcm9maWxlKSkgeworICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLnByb2ZpbGUsIHByb2ZpbGUpIDw8ICJwcm9maWxlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgInByb2ZpbGUgbm90IHJldHVybmVkIGluIGV4dHJhY3RvciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgdHJhY2s7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7Cit9CisKK2NsYXNzIEV4dHJhY3RvckNvbXBhcmlzb24KKyAgICA6IHB1YmxpYyBFeHRyYWN0b3JVbml0VGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcgLyogSW5wdXRGaWxlMCAqLywgc3RyaW5nIC8qIElucHV0RmlsZTEgKi8+PiB7CisgIHB1YmxpYzoKKyAgICB+RXh0cmFjdG9yQ29tcGFyaXNvbigpIHsKKyAgICAgICAgZm9yIChpbnQ4X3QgKmV4dHJhY3Rvck9wIDogbUV4dHJhY3Rvck91dHB1dCkgeworICAgICAgICAgICAgaWYgKGV4dHJhY3Rvck9wICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBmcmVlKGV4dHJhY3Rvck9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludDhfdCAqbUV4dHJhY3Rvck91dHB1dFsyXXt9OworICAgIHNpemVfdCBtRXh0cmFjdG9yT3VwdXRTaXplWzJde307Cit9OworCitzaXplX3QgYWxsb2NhdGVPdXRwdXRCdWZmZXJzKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdCkgeworICAgIHNpemVfdCBidWZmZXJTaXplID0gMHU7CisgICAgLy8gYWxsb2NhdGluZyB0aGUgYnVmZmVyIHNpemUgYXMgc2FtcGxlUmF0ZSAqIGNoYW5uZWxDb3VudCAqIGNsaXBEdXJhdGlvbiBzaW5jZQorICAgIC8vIHNvbWUgZXh0cmFjdG9ycyBsaWtlIGZsYWMsIG1pZGkgYW5kIHdhdiBkZWNvZGVzIHRoZSBmaWxlLiBUaGVzZSBleHRyYWN0b3JzCisgICAgLy8gYWR2ZXJ0aXNlIHRoZSBtaW1lIHR5cGUgYXMgcmF3LgorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpIHsKKyAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb25VcyA9IC0xOworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IC0xOworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAtMTsKKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcHBsZSA9IC0xOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxDb3VudCkgfHwgY2hhbm5lbENvdW50IDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWxDb3VudCBmb3IgaW5wdXQgZmlsZSA6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICBzYW1wbGVSYXRlIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNhbXBsZVJhdGUgZm9yIGlucHV0IGZpbGUgOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQ2NChleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZjbGlwRHVyYXRpb25VcykgfHwKKyAgICAgICAgICAgIGNsaXBEdXJhdGlvblVzIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNsaXAgZHVyYXRpb24gZm9yIGlucHV0IGZpbGUgOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYml0c1BlclNhbXBwbGUpIHx8IGJpdHNQZXJTYW1wcGxlIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJpdHMgcGVyIHNhbXBsZSBmb3IgaW5wdXQgZmlsZSA6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlclNpemUgPSBiaXRzUGVyU2FtcHBsZSAqIGNoYW5uZWxDb3VudCAqIHNhbXBsZVJhdGUgKiAoY2xpcER1cmF0aW9uVXMgLyAxMDAwMDAwICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpbnQzMl90IHN0YXR1cyA9IHN0YXQoaW5wdXRGaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGdldCBmaWxlIHByb3BlcnRpZXMgZm9yOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJTaXplID0gYnVmLnN0X3NpemU7CisgICAgfQorICAgIHJldHVybiBidWZmZXJTaXplOworfQorCisvLyBDb21wYXJlIG91dHB1dCBvZiB0d28gZXh0cmFjdG9ycyBmb3IgaWRlbnRpY2FsIGNvbnRlbnQKK1RFU1RfUChFeHRyYWN0b3JDb21wYXJpc29uLCBFeHRyYWN0b3JDb21wYXJpc29uVGVzdCkgeworICAgIHZlY3RvcjxzdHJpbmc+IGlucHV0RmlsZU5hbWVzID0ge0dldFBhcmFtKCkuZmlyc3QsIEdldFBhcmFtKCkuc2Vjb25kfTsKKyAgICBzaXplX3QgZXh0cmFjdGVkT3V0cHV0U2l6ZVsyXXt9OworICAgIEFNZWRpYUZvcm1hdCAqZXh0cmFjdG9yRm9ybWF0WzJde307CisgICAgaW50MzJfdCBzdGF0dXMgPSBPSzsKKworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBpbnB1dEZpbGVOYW1lcy5zaXplKCk7IGlkeCsrKSB7CisgICAgICAgIHN0cmluZyBjb250YWluZXJGb3JtYXQgPSBpbnB1dEZpbGVOYW1lc1tpZHhdLnN1YnN0cihpbnB1dEZpbGVOYW1lc1tpZHhdLmZpbmQoIi4iKSArIDEpOworICAgICAgICBzZXR1cEV4dHJhY3Rvcihjb250YWluZXJGb3JtYXQpOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSB7CisgICAgICAgICAgICBBTE9HVigiVW5rbm93biBleHRyYWN0b3IgJXMuIFNraXBwaW5nIHRoZSB0ZXN0IiwgY29udGFpbmVyRm9ybWF0LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgZm9yICVzIiwgY29udGFpbmVyRm9ybWF0LmNfc3RyKCksCisgICAgICAgICAgICAgIGlucHV0RmlsZU5hbWVzW2lkeF0uY19zdHIoKSk7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBpbnB1dEZpbGVOYW1lc1tpZHhdOworCisgICAgICAgIHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IGNvbnRhaW5lckZvcm1hdCA8PCAiZXh0cmFjdG9yIjsKKworICAgICAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yICIgPDwgY29udGFpbmVyRm9ybWF0IDw8ICIgZXh0cmFjdG9yIjsKKworICAgICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgICAgIEFTU0VSVF9FUShudW1UcmFja3MsIDEpIDw8ICJUaGlzIHRlc3QgZXhwZWN0cyBpbnB1dHMgd2l0aCBvbmUgdHJhY2sgb25seSI7CisKKyAgICAgICAgaW50MzJfdCB0cmFja0lkeCA9IDA7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2sodHJhY2tJZHgpOworICAgICAgICBBU1NFUlRfTkUodHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIGZvciBpbmRleCAiIDw8IHRyYWNrSWR4OworCisgICAgICAgIGV4dHJhY3RvckZvcm1hdFtpZHhdID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBU1NFUlRfTkUoZXh0cmFjdG9yRm9ybWF0W2lkeF0sIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKKworICAgICAgICBzdGF0dXMgPSB0cmFjay0+Z2V0Rm9ybWF0KGV4dHJhY3RvckZvcm1hdFtpZHhdKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBtZXRhIGRhdGEiOworCisgICAgICAgIENNZWRpYVRyYWNrICpjVHJhY2sgPSB3cmFwKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX05FKGNUcmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgd3JhcHBlciBmb3IgaW5kZXggIiA8PCB0cmFja0lkeDsKKworICAgICAgICBtRXh0cmFjdG9yT3VwdXRTaXplW2lkeF0gPSBhbGxvY2F0ZU91dHB1dEJ1ZmZlcnMoaW5wdXRGaWxlTmFtZSwgZXh0cmFjdG9yRm9ybWF0W2lkeF0pOworICAgICAgICBBU1NFUlRfR1QobUV4dHJhY3Rvck91cHV0U2l6ZVtpZHhdLCAwdSkgPDwgIiBJbnZhbGlkIHNpemUgZm9yIG91dHB1dCBidWZmZXJzIjsKKworICAgICAgICBtRXh0cmFjdG9yT3V0cHV0W2lkeF0gPSAoaW50OF90ICopY2FsbG9jKDEsIG1FeHRyYWN0b3JPdXB1dFNpemVbaWR4XSk7CisgICAgICAgIEFTU0VSVF9ORShtRXh0cmFjdG9yT3V0cHV0W2lkeF0sIG51bGxwdHIpCisgICAgICAgICAgICAgICAgPDwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdyaXRpbmcgZXh0cmFjdG9yJ3Mgb3V0cHV0IjsKKworICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOworICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHRyYWNrIjsKKworICAgICAgICBpbnQzMl90IG9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChzdGF0dXMgIT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgICAgICBBTE9HVigidHJhY2stPnJlYWQgU3RhdHVzID0gJWQgYnVmZmVyICVwIiwgc3RhdHVzLCBidWZmZXIpOworICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIEFTU0VSVF9MRShvZmZzZXQgKyBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCBtRXh0cmFjdG9yT3VwdXRTaXplW2lkeF0pCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiTWVtb3J5IG92ZXJmbG93LiBFeHRyYWN0ZWQgb3V0cHV0IHNpemUgbW9yZSB0aGFuIGV4cGVjdGVkIjsKKworICAgICAgICAgICAgICAgIG1lbWNweShtRXh0cmFjdG9yT3V0cHV0W2lkeF0gKyBvZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBleHRyYWN0ZWRPdXRwdXRTaXplW2lkeF0gKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0b3AodHJhY2spOworICAgICAgICBBU1NFUlRfRVEoT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisKKyAgICAgICAgZmNsb3NlKG1JbnB1dEZwKTsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlckdyb3VwOworICAgICAgICBkZWxldGUgdHJhY2s7CisgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgICAgIGRlbGV0ZSBtRXh0cmFjdG9yOworICAgICAgICBtSW5wdXRGcCA9IG51bGxwdHI7CisgICAgICAgIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIENvbXBhcmUgdGhlIG1ldGEgZGF0YSBmcm9tIGJvdGggdGhlIGV4dHJhY3RvcnMKKyAgICBjb25zdCBjaGFyICptaW1lWzJdOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZXh0cmFjdG9yRm9ybWF0WzBdLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lWzBdKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGV4dHJhY3RvckZvcm1hdFsxXSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVsxXSk7CisgICAgQVNTRVJUX1NUUkVRKG1pbWVbMF0sIG1pbWVbMV0pIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGV4dHJhY3RvcidzIGZvcm1hdCI7CisKKyAgICBpZiAoIXN0cm5jbXAobWltZVswXSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50MCwgY2hhbm5lbENvdW50MTsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlMCwgc2FtcGxlUmF0ZTE7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMF0sIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsQ291bnQwKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMF0sIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlUmF0ZTApKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFsxXSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxDb3VudDEpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFsxXSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlMSkpOworICAgICAgICBBU1NFUlRfRVEoY2hhbm5lbENvdW50MCwgY2hhbm5lbENvdW50MSkgPDwgIk1pc21hdGNoIGJldHdlZW4gZXh0cmFjdG9yJ3MgY2hhbm5lbENvdW50IjsKKyAgICAgICAgQVNTRVJUX0VRKHNhbXBsZVJhdGUwLCBzYW1wbGVSYXRlMSkgPDwgIk1pc21hdGNoIGJldHdlZW4gZXh0cmFjdG9yJ3Mgc2FtcGxlUmF0ZSI7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChtaW1lWzBdLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aDAsIGhlaWdodDA7CisgICAgICAgIGludDMyX3Qgd2lkdGgxLCBoZWlnaHQxOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzBdLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmd2lkdGgwKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMF0sIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmaGVpZ2h0MCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmd2lkdGgxKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmaGVpZ2h0MSkpOworICAgICAgICBBU1NFUlRfRVEod2lkdGgwLCB3aWR0aDEpIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGV4dHJhY3RvcidzIHdpZHRoIjsKKyAgICAgICAgQVNTRVJUX0VRKGhlaWdodDAsIGhlaWdodDEpIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGV4dHJhY3RvcidzIGhlaWdodCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJJbnZhbGlkIG1pbWUgdHlwZSAiIDw8IG1pbWVbMF07CisgICAgfQorCisgICAgZm9yIChBTWVkaWFGb3JtYXQgKmV4Rm9ybWF0IDogZXh0cmFjdG9yRm9ybWF0KSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZXhGb3JtYXQpOworICAgIH0KKworICAgIC8vIENvbXBhcmUgdGhlIGV4dHJhY3RlZCBvdXRwdXRzIG9mIGJvdGggZXh0cmFjdG9yCisgICAgQVNTRVJUX0VRKGV4dHJhY3RlZE91dHB1dFNpemVbMF0sIGV4dHJhY3RlZE91dHB1dFNpemVbMV0pCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yJ3Mgb3V0cHV0IHNpemUgZG9lc24ndCBtYXRjaCBiZXR3ZWVuICIgPDwgaW5wdXRGaWxlTmFtZXNbMF0gPDwgImFuZCAiCisgICAgICAgICAgICA8PCBpbnB1dEZpbGVOYW1lc1sxXSA8PCAiIGV4dHJhY3RvcnMiOworICAgIHN0YXR1cyA9IG1lbWNtcChtRXh0cmFjdG9yT3V0cHV0WzBdLCBtRXh0cmFjdG9yT3V0cHV0WzFdLCBleHRyYWN0ZWRPdXRwdXRTaXplWzBdKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdGVkIGNvbnRlbnQgbWlzbWF0Y2ggYmV0d2VlbiAiIDw8IGlucHV0RmlsZU5hbWVzWzBdIDw8ICJhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGlucHV0RmlsZU5hbWVzWzFdIDw8ICIgZXh0cmFjdG9ycyI7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgRXh0cmFjdG9yQ29tcGFyaXNvbkFsbCwgRXh0cmFjdG9yQ29tcGFyaXNvbiwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X3ZwOS5tcDQiLCAic3dpcmxfMTQ0eDEzNl92cDkud2VibSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInZpZGVvXzQ4MHgzNjBfbXA0X3ZwOV8zMzNrYnBzXzI1ZnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fNDgweDM2MF93ZWJtX3ZwOV8zMzNrYnBzXzI1ZnBzLndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ2aWRlb18xMjgweDcyMF9hdjFfaGRyX3N0YXRpY18zbWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzEyODB4NzIwX2F2MV9oZHJfc3RhdGljXzNtYnBzLndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xMzJ4MTMwX21wZWc0LjNncCIsICJzd2lybF8xMzJ4MTMwX21wZWc0Lm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzE0NHgxMzZfYXZjLm1rdiIsICJzd2lybF8xNDR4MTM2X2F2Yy5tcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xMzJ4MTMwX21wZWc0Lm1wNCIsICJzd2lybF8xMzJ4MTMwX21wZWc0Lm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImNyb3dkXzUwOHgyNDBfMjVmcHNfaGV2Yy5tcDQiLCJjcm93ZF81MDh4MjQwXzI1ZnBzX2hldmMubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiX2NpZl83NjhrYnBzXzMwZnBzX21wZWcyLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiX2NpZl83NjhrYnBzXzMwZnBzX21wZWcyLnRzIiksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJsb3Vkc29mdGFhYy5hYWMiLCAibG91ZHNvZnRhYWMubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwZmxhY21rdi5ta3YiLCAic2luZXN3ZWVwZmxhY21wNC5tcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBtcDNsYW1lLm1wMyIsICJzaW5lc3dlZXBtcDNsYW1lLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcG9nZ21wNC5tcDQiLCAic2luZXN3ZWVwb2dnLm9nZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcHZvcmJpcy5tcDQiLCAic2luZXN3ZWVwdm9yYmlzLm9nZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcHZvcmJpcy5ta3YiLCAic2luZXN3ZWVwdm9yYmlzLm9nZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInRlc3RvcHVzLm1rdiIsICJ0ZXN0b3B1cy5tcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0b3B1cy5tcDQiLCAidGVzdG9wdXMub3B1cyIpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibG91ZHNvZnRhYWMuYWFjIiwgImxvdWRzb2Z0YWFjLmFhYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInRlc3RhbXIuYW1yIiwgInRlc3RhbXIuYW1yIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwZmxhYy5mbGFjIiwgInNpbmVzd2VlcGZsYWMuZmxhYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1pZGlfYS5taWQiLCAibWlkaV9hLm1pZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcHZvcmJpcy5ta3YiLCAic2luZXN3ZWVwdm9yYmlzLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcG1wM2xhbWUubXAzIiwgInNpbmVzd2VlcG1wM2xhbWUubXAzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwb2dnbXA0Lm1wNCIsICJzaW5lc3dlZXBvZ2dtcDQubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidGVzdG9wdXMub3B1cyIsICJ0ZXN0b3B1cy5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiam9obl9jYWdlLm9nZyIsICJqb2huX2NhZ2Uub2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibW9ub3Rlc3Rnc20ud2F2IiwgIm1vbm90ZXN0Z3NtLndhdiIpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciLCAic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xMzJ4MTMwX21wZWc0Lm1wNCIsICJzd2lybF8xMzJ4MTMwX21wZWc0Lm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iLCAic3dpcmxfMTQ0eDEzNl92cDkud2VibSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iLCAic3dpcmxfMTQ0eDEzNl92cDgud2VibSIpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb25maWdQYXJhbVRlc3RBbGwsIENvbmZpZ1BhcmFtVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImFhYyIsIEFBQ18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtciIsIEFNUl9OQl8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtciIsIEFNUl9XQl8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImZsYWMiLCBGTEFDXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigid2F2IiwgR1NNXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWlkaSIsIE1JRElfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcDMiLCBNUDNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJvZ2ciLCBPUFVTXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigib2dnIiwgVk9SQklTXzEpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsIEhFVkNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsIEhFVkNfMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMnBzIiwgTVBFRzJfUFNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMnRzIiwgTVBFRzJfVFNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCBNUEVHNF8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1rdiIsIFZQOV8xKSkpOworCisvLyBWYWxpZGF0ZSBleHRyYWN0b3JzIGZvciBjb250YWluZXIgZm9ybWF0LCBpbnB1dCBmaWxlLCBuby4gb2YgdHJhY2tzIGFuZCBzdXBwb3J0cyBzZWVrIGZsYWcKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgRXh0cmFjdG9yVW5pdFRlc3RBbGwsIEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhYWMiLCAibG91ZHNvZnRhYWMuYWFjIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1yIiwgInRlc3RhbXIuYW1yIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1yIiwgImFtcndiLndhdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImZsYWMiLCAic2luZXN3ZWVwZmxhYy5mbGFjIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWlkaSIsICJtaWRpX2EubWlkIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgInNpbmVzd2VlcHZvcmJpcy5ta3YiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAic2luZXN3ZWVwbXAzbGFtZS5ta3YiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAibG91ZHNvZnRhYWMubWt2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXAzIiwgInNpbmVzd2VlcG1wM2xhbWUubXAzIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXAzIiwgImlkM3Rlc3QxMC5tcDMiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnRzIiwgInNlZ21lbnQwMDAwMDEudHMiLCAyLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJ0cyIsICJ0ZXN0YWMzdHMudHMiLCAxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJ0cyIsICJ0ZXN0YWM0dHMudHMiLCAxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJ0cyIsICJ0ZXN0ZWFjM3RzLnRzIiwgMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgImF1ZGlvX2FhY19tb25vXzcwa2JzXzQ0MTAwaHoubXA0IiwgMiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAibXVsdGkwX2FjNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJub2lzZV82Y2hfNDRraHpfYW90NV9kcl9zYnJfc2lnMl9tcDQubTRhIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic2luZXN3ZWVwYWxhYy5tb3YiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzaW5lc3dlZXBmbGFjbXA0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcG00YS5tNGEiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzaW5lc3dlZXBvZ2dtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic2luZXN3ZWVwb3B1c21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJ0ZXN0YWMzbXA0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInRlc3RlYWMzbXA0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsICJqb2huX2NhZ2Uub2dnIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgInRlc3RvcHVzLm9wdXMiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCAic2luZXN3ZWVwb2dnYWxidW1hcnQub2dnIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgImxvdWRzb2Z0d2F2LndhdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJtb25vdGVzdGdzbS53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAibm9pc2VfNWNoXzQ0a2h6X2FvdDJfd2F2ZS53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAic2luZTFraHptNDBkYl9hbGF3LndhdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJzaW5lMWtoem00MGRiX2YzMmxlLndhdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJzaW5lMWtoem00MGRiX211bGF3LndhdiIsIDEsIHRydWUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgInN3aXJsXzE0NHgxMzZfYXZjLm1rdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJ3aXRob3V0Y3Vlcy5ta3YiLCAyLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAic3dpcmxfMTQ0eDEzNl92cDkud2VibSIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzd2lybF8xNDR4MTM2X3ZwOC53ZWJtIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJwcyIsICJzd2lybF8xNDR4MTM2X21wZWcyLm1wZyIsIDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnBzIiwgInByb2dyYW1zdHJlYW0ubXBlZyIsIDIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJjb2xvcl8xNzZ4MTQ0X2J0NjAxXzUyNV9scl9zZHJfaDI2NC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJoZWlmd3JpdGVyX2lucHV0LmhlaWMiLCA0LCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAicHNzaHRlc3QubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJ0ZXN0dmlkZW8uM2dwIiwgNCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAidGVzdHZpZGVvX3dpdGhfMl90aW1lZHRleHRfdHJhY2tzLjNncCIsIDQsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzMwMGticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzExMDI1aHpfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFkYXRhX2d5cm9fY29tcGxpYW50LjNncCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1wZWc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xOTIweDEwODBfbXA0X21wZWcyXzEyMDAwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzQ4MHgzNjBfbXA0X2hldmNfNjUwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5tcDQiLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJtcGVnNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fNDgweDM2MF9tcDRfaDI2NF8xMzUwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoel9kYXNoLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAyLCB0cnVlKSkpOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgICBnRW52ID0gbmV3IEV4dHJhY3RvclVuaXRUZXN0RW52aXJvbm1lbnQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9SRUFETUUubWQKaW5kZXggNjk1MzhiNi4uY2ZmMDljYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9SRUFETUUubWQKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9SRUFETUUubWQKQEAgLTIyLDcgKzIyLDcgQEAKIGFkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvRXh0cmFjdG9yVW5pdFRlc3QvRXh0cmFjdG9yVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLwogYGBgCiAKLVRoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9leHRyYWN0b3ItMS40LnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KIAogYGBgCiBhZGIgcHVzaCBleHRyYWN0b3IgL2RhdGEvbG9jYWwvdG1wLwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKaW5kZXggNWQzOGE4MS4uODVkNGNjZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCkBAIC0xOSw0ICsxOSwxMSBAQAogICAgICAgICAibGliZmlmbyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phbml0b3JzL09XTkVSUy1jb2RlY3MgYi9tZWRpYS9qYW5pdG9ycy9PV05FUlMtY29kZWNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDEzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYW5pdG9ycy9PV05FUlMtY29kZWNzCkBAIC0wLDAgKzEsNSBAQAorIyBnZXJyaXQgb3duZXIvYXBwcm92ZXJzIGZvciB0aGUgYWN0dWFsIHNvZnR3YXJlIGNvZGVjIGxpYnJhcmllcworIyBkaWZmZXJlbnRpYXRlZCBmcm9tIHBsdWdpbnMgY29ubmVjdGluZyB0aG9zZSBjb2RlY3MgdG8gZWl0aGVyIG9teCBvciBjb2RlYzIgaW5mcmFzdHJ1Y3R1cmUKK2Vzc2lja0Bnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2phbml0b3JzL1JFQURNRSBiL21lZGlhL2phbml0b3JzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI4ZTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamFuaXRvcnMvUkVBRE1FCkBAIC0wLDAgKzEsNCBAQAorQSBjb2xsZWN0aW9uIG9mIE9XTkVSUyBmaWxlcyB0aGF0IHdlIHJlZmVyZW5jZSBmcm9tIG90aGVyIHByb2plY3RzLAorc3VjaCBhcyB0aGUgc29mdHdhcmUgY29kZWNzIGluIGRpcmVjdG9yaWVzIGxpa2UgZXh0ZXJuYWwvbGliYXZjLgorVGhpcyBpcyB0byBzaW1wbGlmeSBvdXIgb3duZXIvYXBwcm92ZXIgbWFuYWdlbWVudCBhY3Jvc3MgdGhlIG11bHRpcGxlCitwcm9qZWN0cyByZWxhdGVkIHRvIG1lZGlhLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAppbmRleCAxNDAwNTJmLi5lODFhYjA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icApAQCAtMzIsNSArMzIsNiBAQAogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGliYWF1ZGlvX2hlYWRlcnMiLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsiYWF1ZGlvLWFpZGwtY3BwIl0sCisgICAgaGVhZGVyX2xpYnM6IFsiYWF1ZGlvLWFpZGwtY3BwIl0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9Eb3h5ZmlsZS5vcmlnIGIvbWVkaWEvbGliYWF1ZGlvL0RveHlmaWxlLm9yaWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzN2ZhY2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL0RveHlmaWxlLm9yaWcKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAzICswLDAgQEAKLSMgRG94eWZpbGUgMS44LjYKLQotIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQotIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCi0jCi0jIEFsbCB0ZXh0IGFmdGVyIGEgZG91YmxlIGhhc2ggKCMjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgcGxhY2VkIGluCi0jIGZyb250IG9mIHRoZSBUQUcgaXQgaXMgcHJlY2VkaW5nLgotIwotIyBBbGwgdGV4dCBhZnRlciBhIHNpbmdsZSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgotIyBUaGUgZm9ybWF0IGlzOgotIyBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KLSMgRm9yIGxpc3RzLCBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKLSMgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQotIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzIChcIiBcIikuCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCi0jIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgdGV4dAotIyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252Ci0jIGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udgotIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCi0KLURPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAotCi0jIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCBieQotIyBkb3VibGUtcXVvdGVzLCB1bmxlc3MgeW91IGFyZSB1c2luZyBEb3h5d2l6YXJkKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUKLSMgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUKLSMgdGl0bGUgb2YgbW9zdCBnZW5lcmF0ZWQgcGFnZXMgYW5kIGluIGEgZmV3IG90aGVyIHBsYWNlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE15IFByb2plY3QuCi0KLVBST0pFQ1RfTkFNRSAgICAgICAgICAgPSAiTXkgUHJvamVjdCIKLQotIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKLSMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCi0jIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCi0KLVBST0pFQ1RfTlVNQkVSICAgICAgICAgPQotCi0jIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KLSMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlciBhCi0jIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgotCi1QUk9KRUNUX0JSSUVGICAgICAgICAgID0KLQotIyBXaXRoIHRoZSBQUk9KRUNUX0xPR08gdGFnIG9uZSBjYW4gc3BlY2lmeSBhbiBsb2dvIG9yIGljb24gdGhhdCBpcyBpbmNsdWRlZCBpbgotIyB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1IHBpeGVscwotIyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkgdGhlIGxvZ28KLSMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCi0KLVBST0pFQ1RfTE9HTyAgICAgICAgICAgPQotCi0jIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkgcGF0aAotIyBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHdyaXR0ZW4uIElmIGEgcmVsYXRpdmUgcGF0aCBpcwotIyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZgotIyBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCi0KLU9VVFBVVF9ESVJFQ1RPUlkgICAgICAgPQotCi0jIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgY3JlYXRlIDQwOTYgc3ViLQotIyBkaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0IGZvcm1hdCBhbmQKLSMgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4gRW5hYmxpbmcgdGhpcwotIyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mIHNvdXJjZSBmaWxlcywgd2hlcmUKLSMgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZCBvdGhlcndpc2UgY2F1c2VzCi0jIHBlcmZvcm1hbmNlIHByb2JsZW1zIGZvciB0aGUgZmlsZSBzeXN0ZW0uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCi0KLSMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKLSMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKLSMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgotIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKLSMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKLSMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAotIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCi0jIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKLSMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCi0jIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKLSMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KLQotT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKLQotIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGluY2x1ZGUgYnJpZWYgbWVtYmVyCi0jIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIGZpbGUgYW5kIGNsYXNzCi0jIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YWRvYykuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUJSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKLQotIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBicmllZgotIyBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uCi0jCi0jIE5vdGU6IElmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUKLSMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1SRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCi0KLSMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yIHRoYXQgaXMKLSMgdXNlZCB0byBmb3JtIHRoZSB0ZXh0IGluIHZhcmlvdXMgbGlzdGluZ3MuIEVhY2ggc3RyaW5nIGluIHRoaXMgbGlzdCwgaWYgZm91bmQKLSMgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dAotIyBhbmQgdGhlIHJlc3VsdCwgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkCi0jIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuIElmIGxlZnQgYmxhbmssIHRoZQotIyBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgkbmFtZSBpcyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YKLSMgdGhlIGVudGl0eSk6VGhlICRuYW1lIGNsYXNzLCBUaGUgJG5hbWUgd2lkZ2V0LCBUaGUgJG5hbWUgZmlsZSwgaXMsIHByb3ZpZGVzLAotIyBzcGVjaWZpZXMsIGNvbnRhaW5zLCByZXByZXNlbnRzLCBhLCBhbiBhbmQgdGhlLgotCi1BQkJSRVZJQVRFX0JSSUVGICAgICAgID0KLQotIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCi0jIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKLSMgZGVzY3JpcHRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCi0KLSMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCi0jIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQotIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAotIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1JTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KLQotIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsIHBhdGgKLSMgYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZQotIyBzaG9ydGVzdCBwYXRoIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUgd2lsbCBiZSB1c2VkCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKLQotIyBUaGUgU1RSSVBfRlJPTV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLgotIyBTdHJpcHBpbmcgaXMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kCi0jIHBhcnQgb2YgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgotIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZSBwYXRoIHRvCi0jIHN0cmlwLgotIwotIyBOb3RlIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvIHJlbGF0aXZlIHBhdGhzLCB3aGljaAotIyB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzIHN0YXJ0ZWQuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBGVUxMX1BBVEhfTkFNRVMgaXMgc2V0IHRvIFlFUy4KLQotU1RSSVBfRlJPTV9QQVRIICAgICAgICA9Ci0KLSMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlCi0jIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzIHRoZSByZWFkZXIgd2hpY2gKLSMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgYSBjbGFzcy4gSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mCi0jIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkCi0jIHNwZWNpZnkgdGhlIGxpc3Qgb2YgaW5jbHVkZSBwYXRocyB0aGF0IGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCi0jIHVzaW5nIHRoZSAtSSBmbGFnLgotCi1TVFJJUF9GUk9NX0lOQ19QQVRIICAgID0KLQotIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAotIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAotIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVNIT1JUX05BTUVTICAgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCi0jIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgotIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KLSMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCi0jIGRlc2NyaXB0aW9uLikKLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1KQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8KLQotIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKLSMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKLSMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKLSMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1RVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8KLQotIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IGEKLSMgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLyBjb21tZW50cykgYXMKLSMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBUaGUgbmV3IGRlZmF1bHQgaXMKLSMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24uIFNldCB0aGlzCi0jIHRhZyB0byBZRVMgaWYgeW91IHByZWZlciB0aGUgb2xkIGJlaGF2aW9yIGluc3RlYWQuCi0jCi0jIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyBhbHNvIG1lYW5zIHRoYXQgcmF0aW9uYWwgcm9zZSBjb21tZW50cyBhcmUKLSMgbm90IHJlY29nbml6ZWQgYW55IG1vcmUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCi0KLSMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGFuIHVuZG9jdW1lbnRlZCBtZW1iZXIgaW5oZXJpdHMgdGhlCi0jIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdCByZS1pbXBsZW1lbnRzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1JTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhCi0jIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlCi0jIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCi0KLSMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIERveHlnZW4KLSMgdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCi0jIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDE2LCBkZWZhdWx0IHZhbHVlOiA0LgotCi1UQUJfU0laRSAgICAgICAgICAgICAgID0gNAotCi0jIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdCBhcyBjb21tYW5kcyBpbgotIyB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtOgotIyBuYW1lPXZhbHVlCi0jIEZvciBleGFtcGxlIGFkZGluZwotIyAic2lkZWVmZmVjdD1AcGFyIFNpZGUgRWZmZWN0czpcbiIKLSMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlCi0jIGRvY3VtZW50YXRpb24sIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcKLSMgIlNpZGUgRWZmZWN0czoiLiBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydAotIyBuZXdsaW5lcy4KLQotQUxJQVNFUyAgICAgICAgICAgICAgICA9Ci0KLSMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiB3b3JkLWtleXdvcmQgbWFwcGluZ3MgKFRDTCBvbmx5KS4KLSMgQSBtYXBwaW5nIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuIEZvciBleGFtcGxlIGFkZGluZyAiY2xhc3M9aXRjbDo6Y2xhc3MiCi0jIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aGUgY29tbWFuZCBjbGFzcyBpbiB0aGUgaXRjbDo6Y2xhc3MgbWVhbmluZy4KLQotVENMX1NVQlNUICAgICAgICAgICAgICA9Ci0KLSMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCi0jIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgotIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCi0jIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCi0KLSMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCi0jIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKLSMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKLSMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCi0KLSMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCi0jIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLU9QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTwotCi0jIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAotIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1PUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KLQotIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0Ci0jIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCi0jIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKLSMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCi0jIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAotIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwuIEZvciBpbnN0YW5jZSB0byBtYWtlCi0jIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDCi0jIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4KLSMKLSMgTm90ZSBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCi0jCi0jIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKLSMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgotCi1FWFRFTlNJT05fTUFQUElORyAgICAgID0KLQotIyBJZiB0aGUgTUFSS0RPV05fU1VQUE9SVCB0YWcgaXMgZW5hYmxlZCB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwgY29tbWVudHMKLSMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQotIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCi0jIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UgY2FuCi0jIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4gRGlzYWJsZSBvbmx5IGluCi0jIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUwotCi0jIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQKLSMgY2xhc3Nlcywgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbgotIyBiZSBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkCi0jIG9yIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUwotCi0jIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKLSMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkIHNldCB0aGlzCi0jIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKLSMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7Ci0jIHZlcnN1cyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgotIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PCi0KLSMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8KLSMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1DUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KLQotIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCAoc2VlOgotIyBodHRwOi8vd3d3LnJpdmVyYmFua2NvbXB1dGluZy5jby51ay9zb2Z0d2FyZS9zaXAvaW50cm8pIHNvdXJjZXMgb25seS4gRG94eWdlbgotIyB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljIGluc3RlYWQKLSMgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVNJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTwotCi0jIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZQotIyBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyB3aWxsIG1ha2UKLSMgZG94eWdlbiB0byByZXBsYWNlIHRoZSBnZXQgYW5kIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yIHNldHRpbmcgYSBzaW1wbGUKLSMgdHlwZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIG1ldGhvZHMgYW55d2F5LCB5b3UKLSMgc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotSURMX1BST1BFUlRZX1NVUFBPUlQgICA9IFlFUwotCi0jIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MKLSMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAotIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKLSMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1ESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KLQotIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgdG8gYWxsb3cgY2xhc3MgbWVtYmVyIGdyb3VwcyBvZiB0aGUgc2FtZSB0eXBlCi0jIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYSBzdWJncm91cCBvZiB0aGF0Ci0jIHR5cGUgKGUuZy4gdW5kZXIgdGhlIFB1YmxpYyBGdW5jdGlvbnMgc2VjdGlvbikuIFNldCBpdCB0byBOTyB0byBwcmV2ZW50Ci0jIHN1Ymdyb3VwaW5nLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSBkb25lIHBlciBjbGFzcyB1c2luZyB0aGUKLSMgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUwotCi0jIFdoZW4gdGhlIElOTElORV9HUk9VUEVEX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGNsYXNzZXMsIHN0cnVjdHMgYW5kIHVuaW9ucwotIyBhcmUgc2hvd24gaW5zaWRlIHRoZSBncm91cCBpbiB3aGljaCB0aGV5IGFyZSBpbmNsdWRlZCAoZS5nLiB1c2luZyBcaW5ncm91cCkKLSMgaW5zdGVhZCBvZiBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWAotIyBhbmQgUlRGKS4KLSMKLSMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBkb2VzIG5vdCB3b3JrIGluIGNvbWJpbmF0aW9uIHdpdGgKLSMgU0VQQVJBVEVfTUVNQkVSX1BBR0VTLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUlOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTwotCi0jIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucwotIyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIG9yIHNpbXBsZSB0eXBlZGVmIGZpZWxkcyB3aWxsIGJlIHNob3duIGlubGluZSBpbgotIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCAoaS5lLiBmaWxlLAotIyBuYW1lc3BhY2UsIG9yIGdyb3VwIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldAotIyB0byBOTywgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucyBhcmUgc2hvd24gb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQKLSMgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSU5MSU5FX1NJTVBMRV9TVFJVQ1RTICA9IE5PCi0KLSMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCB0YWcgaXMgZW5hYmxlZCwgYSB0eXBlZGVmIG9mIGEgc3RydWN0LCB1bmlvbiwgb3IKLSMgZW51bSBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28KLSMgdHlwZWRlZiBzdHJ1Y3QgVHlwZVMge30gVHlwZVQsIHdpbGwgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgc3RydWN0Ci0jIHdpdGggbmFtZSBUeXBlVC4gV2hlbiBkaXNhYmxlZCB0aGUgdHlwZWRlZiB3aWxsIGFwcGVhciBhcyBhIG1lbWJlciBvZiBhIGZpbGUsCi0jIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseSBiZQotIyB1c2VmdWwgZm9yIEMgY29kZSBpbiBjYXNlIHRoZSBjb2RpbmcgY29udmVudGlvbiBkaWN0YXRlcyB0aGF0IGFsbCBjb21wb3VuZAotIyB0eXBlcyBhcmUgdHlwZWRlZidlZCBhbmQgb25seSB0aGUgdHlwZWRlZiBpcyByZWZlcmVuY2VkLCBuZXZlciB0aGUgdGFnIG5hbWUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCi0KLSMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcwotIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKLSMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQotIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKLSMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQotIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKLSMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgotIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0Ci0jIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCi0KLUxPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KLSMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKLSMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCi0jIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KLSMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKLSMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIHdpbGwKLSMgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKLSMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1FWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gTk8KLQotIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZSB3aWxsIGJlCi0jIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIGRlZmluZWQKLSMgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PCi0jIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuIERvZXMgbm90IGhhdmUgYW55IGVmZmVjdAotIyBmb3IgSmF2YSBzb3VyY2VzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1FWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCi0KLSMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwgbWV0aG9kcywKLSMgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbiB0aGUgaW50ZXJmYWNlIGFyZQotIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZQotIyBpbmNsdWRlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1FWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KLQotIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQotIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKLSMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZSBuYW1lIG9mCi0jIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgYW5vbnltb3VzIG5hbWVzcGFjZQotIyBhcmUgaGlkZGVuLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTwotCi0jIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAotIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBpbnNpZGUgZG9jdW1lbnRlZCBjbGFzc2VzIG9yIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlc2UKLSMgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24KLSMgc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1ISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KLQotIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKLSMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJZiBzZXQKLSMgdG8gTk8gdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzCi0jIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUhJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBOTwotCi0jIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbCBmcmllbmQKLSMgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLiBJZiBzZXQgdG8gTk8gdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUKLSMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCi0KLSMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbnkKLSMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIElmIHNldCB0byBOTyB0aGVzZQotIyBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUhJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTwotCi0jIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24gdGhhdCBpcyB0eXBlZCBhZnRlciBhCi0jIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCB0byBOTyB0aGVuIHRoZSBkb2N1bWVudGF0aW9uCi0jIHdpbGwgYmUgZXhjbHVkZWQuIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1JTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUgZmlsZQotIyBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCi0jIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKLSMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCi0jIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KLQotQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUwotCi0jIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyBtZW1iZXJzIHdpdGgKLSMgdGhlaXIgZnVsbCBjbGFzcyBhbmQgbmFtZXNwYWNlIHNjb3BlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIFlFUyB0aGUKLSMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCi0jIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1TSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCi0KLSMgSWYgdGhlIFNIT1dfR1JPVVBFRF9NRU1CX0lOQyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBhZGQgZm9yIGVhY2gKLSMgZ3JvdXBlZCBtZW1iZXIgYW4gaW5jbHVkZSBzdGF0ZW1lbnQgdG8gdGhlIGRvY3VtZW50YXRpb24sIHRlbGxpbmcgdGhlIHJlYWRlcgotIyB3aGljaCBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIHRoZSBtZW1iZXIuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCi0KLSMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQotIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1GT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KLQotIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIHRhZyBbaW5saW5lXSBpcyBpbnNlcnRlZCBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUlOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQotIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKLSMgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1TT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBicmllZgotIyBkZXNjcmlwdGlvbnMgb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgotIyBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAotIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVNPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTwotCi0jIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCi0jIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQKLSMgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlCi0jIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgU09SVF9CUklFRl9ET0NTIGFuZCBTT1JUX01FTUJFUl9ET0NTLgotIyBOb3RlOiBJZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcgYnJpZWYKLSMgbWVtYmVyIGRvY3VtZW50YXRpb24uCi0jIE5vdGU6IElmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcKLSMgZGV0YWlsZWQgbWVtYmVyIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCi0KLSMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5Ci0jIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKLSMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgYnkKLSMgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIE5PLCB0aGUgY2xhc3MgbGlzdCB3aWxsCi0jIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgotIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLgotIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgYWxwaGFiZXRpY2FsCi0jIGxpc3QuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCi0KLSMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0byBkbyBwcm9wZXIKLSMgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYSBtYXRjaCBiZXR3ZWVuCi0jIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuIGlmIHRoZXJlIGlzCi0jIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UgYnkgZG9pbmcgYQotIyBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4gd2lsbCBzdGlsbAotIyBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KLQotIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUKLSMgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIGNvbW1hbmRzIGluIHRoZQotIyBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1HRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCi0KLSMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlCi0jIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdCBjb21tYW5kcyBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUwotCi0jIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlIGJ1ZwotIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUdFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKLQotIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKQotIyB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluCi0jIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1HRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCi0KLSMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCi0jIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KLSMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KLQotRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9Ci0KLSMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdGhhdCB0aGUKLSMgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIC8gZGVmaW5lIGNhbiBoYXZlIGZvciBpdCB0byBhcHBlYXIgaW4gdGhlCi0jIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkIGhlcmUKLSMgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4gVGhlCi0jIGFwcGVhcmFuY2Ugb2YgdGhlIHZhbHVlIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgLyBkZWZpbmVzIGNhbiBiZQotIyBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplciBjb21tYW5kIGluIHRoZQotIyBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogMzAuCi0KLU1BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAotCi0jIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBhdAotIyB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlIGxpc3QKLSMgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUwotCi0jIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4gVGhpcwotIyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcKLSMgKGlmIHNwZWNpZmllZCkuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVNIT1dfRklMRVMgICAgICAgICAgICAgPSBZRVMKLQotIyBTZXQgdGhlIFNIT1dfTkFNRVNQQUNFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgTmFtZXNwYWNlcwotIyBwYWdlLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZQotIyBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1TSE9XX05BTUVTUEFDRVMgICAgICAgID0gWUVTCi0KLSMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0Ci0jIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbQotIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWEKLSMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgY29tbWFuZCBpbnB1dC1maWxlLCB3aGVyZSBjb21tYW5kIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLSMgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCBpbnB1dC1maWxlIGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUgcHJvdmlkZWQKLSMgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dCBpcyB1c2VkIGFzIHRoZSBmaWxlCi0jIHZlcnNpb24uIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KLQotRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9Ci0KLSMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKLSMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLSMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCi0jIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgotIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAotIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgotIwotIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCi0jIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQotIyB0YWcgaXMgbGVmdCBlbXB0eS4KLQotTEFZT1VUX0ZJTEUgICAgICAgICAgICA9Ci0KLSMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcyBjb250YWluaW5nCi0jIHRoZSByZWZlcmVuY2UgZGVmaW5pdGlvbnMuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlIC5iaWIKLSMgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVGhpcyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wKLSMgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgotIyBGb3IgTGFUZVggdGhlIHN0eWxlIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcKLSMgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlCi0jIHNlYXJjaCBwYXRoLiBEbyBub3QgdXNlIGZpbGUgbmFtZXMgd2l0aCBzcGFjZXMsIGJpYnRleCBjYW5ub3QgaGFuZGxlIHRoZW0uIFNlZQotIyBhbHNvIFxjaXRlIGZvciBpbmZvIGhvdyB0byBjcmVhdGUgcmVmZXJlbmNlcy4KLQotQ0lURV9CSUJfRklMRVMgICAgICAgICA9Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KLSMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCi0jIG1lc3NhZ2VzIGFyZSBvZmYuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCi0KLSMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQotIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKCBzdGRlcnIpIGJ5IGRveHlnZW4uIElmIFdBUk5JTkdTIGlzIHNldCB0byBZRVMKLSMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIHdhcm5pbmdzIGFyZSBvbi4KLSMKLSMgVGlwOiBUdXJuIHdhcm5pbmdzIG9uIHdoaWxlIHdyaXRpbmcgdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVdBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgV0FSTl9JRl9VTkRPQ1VNRU5URUQgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlCi0jIHdhcm5pbmdzIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZwotIyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVdBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKLQotIyBJZiB0aGUgV0FSTl9JRl9ET0NfRVJST1IgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3IKLSMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSBwYXJhbWV0ZXJzCi0jIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0IGRvbid0IGV4aXN0IG9yIHVzaW5nCi0jIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1XQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCi0KLSMgVGhpcyBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIGZ1bmN0aW9ucyB0aGF0Ci0jIGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzIG9yIHJldHVybgotIyB2YWx1ZS4gSWYgc2V0IHRvIE5PIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQgd3Jvbmcgb3IgaW5jb21wbGV0ZSBwYXJhbWV0ZXIKLSMgZG9jdW1lbnRhdGlvbiwgYnV0IG5vdCBhYm91dCB0aGUgYWJzZW5jZSBvZiBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVdBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTwotCi0jIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgZG94eWdlbgotIyBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgdGFncywgd2hpY2gKLSMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgd2FybmluZyBvcmlnaW5hdGVkCi0jIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4gJHZlcnNpb24sIHdoaWNoIHdpbGwKLSMgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIGJlIG9idGFpbmVkIHZpYQotIyBGSUxFX1ZFUlNJT05fRklMVEVSKQotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogJGZpbGU6JGxpbmU6ICR0ZXh0LgotCi1XQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKLQotIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nIGFuZCBlcnJvcgotIyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKLSMgZXJyb3IgKHN0ZGVycikuCi0KLVdBUk5fTE9HRklMRSAgICAgICAgICAgPQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFRoZSBJTlBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCi0jIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSBteWZpbGUuY3BwIG9yCi0jIGRpcmVjdG9yaWVzIGxpa2UgL3Vzci9zcmMvbXlwcm9qZWN0LiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgd2l0aAotIyBzcGFjZXMuCi0jIE5vdGU6IElmIHRoaXMgdGFnIGlzIGVtcHR5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZC4KLQotSU5QVVQgICAgICAgICAgICAgICAgICA9Ci0KLSMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKLSMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKLSMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSB0aGUgbGliaWNvbnYKLSMgZG9jdW1lbnRhdGlvbiAoc2VlOiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYpIGZvciB0aGUgbGlzdCBvZgotIyBwb3NzaWJsZSBlbmNvZGluZ3MuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KLQotSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04Ci0KLSMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQotIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIChsaWtlICouY3BwIGFuZAotIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgdGhlCi0jIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOiouYywgKi5jYywgKi5jeHgsICouY3BwLCAqLmMrKywgKi5qYXZhLCAqLmlpLAotIyAqLml4eCwgKi5pcHAsICouaSsrLCAqLmlubCwgKi5pZGwsICouZGRsLCAqLm9kbCwgKi5oLCAqLmhoLCAqLmh4eCwgKi5ocHAsCi0jICouaCsrLCAqLmNzLCAqLmQsICoucGhwLCAqLnBocDQsICoucGhwNSwgKi5waHRtbCwgKi5pbmMsICoubSwgKi5tYXJrZG93biwKLSMgKi5tZCwgKi5tbSwgKi5kb3gsICoucHksICouZjkwLCAqLmYsICouZm9yLCAqLnRjbCwgKi52aGQsICoudmhkbCwgKi51Y2YsCi0jICoucXNmLCAqLmFzIGFuZCAqLmpzLgotCi1GSUxFX1BBVFRFUk5TICAgICAgICAgID0KLQotIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzIHNob3VsZAotIyBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1SRUNVUlNJVkUgICAgICAgICAgICAgID0gTk8KLQotIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKLSMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKLSMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCi0jCi0jIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKLSMgcnVuLgotCi1FWENMVURFICAgICAgICAgICAgICAgID0KLQotIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCi0jIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCi0jIGZyb20gdGhlIGlucHV0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTwotCi0jIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKLSMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCi0jIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KLSMKLSMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCi0jIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCi0KLUVYQ0xVREVfUEFUVEVSTlMgICAgICAgPQotCi0jIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCi0jIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCi0jIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQotIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAotIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0Ci0jCi0jIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bwotIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgotCi1FWENMVURFX1NZTUJPTFMgICAgICAgID0KLQotIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCi0jIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCi0jIGNvbW1hbmQpLgotCi1FWEFNUExFX1BBVEggICAgICAgICAgID0KLQotIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQotIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCi0jICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKLSMgZmlsZXMgYXJlIGluY2x1ZGVkLgotCi1FWEFNUExFX1BBVFRFUk5TICAgICAgID0KLQotIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCi0jIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcwotIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTwotCi0jIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCi0jIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKLSMgXGltYWdlIGNvbW1hbmQpLgotCi1JTUFHRV9QQVRIICAgICAgICAgICAgID0KLQotIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCi0jIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KLSMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6Ci0jCi0jIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgotIwotIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCi0jIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCi0jIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKLSMgd2lsbCBiZSBpZ25vcmVkLgotIwotIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKLSMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCi0jIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCi0KLUlOUFVUX0ZJTFRFUiAgICAgICAgICAgPQotCi0jIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KLSMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQotIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKLSMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93Ci0jIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCi0jIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgotCi1GSUxURVJfUEFUVEVSTlMgICAgICAgID0KLQotIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCi0jIElOUFVUX0ZJTFRFUiApIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKLSMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCi0KLSMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKLSMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAotIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCi0jICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgotCi1GSUxURVJfU09VUkNFX1BBVFRFUk5TID0KLQotIyBJZiB0aGUgVVNFX01ERklMRV9BU19NQUlOUEFHRSB0YWcgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIGEgbWFya2Rvd24gZmlsZSB0aGF0Ci0jIGlzIHBhcnQgb2YgdGhlIGlucHV0LCBpdHMgY29udGVudHMgd2lsbCBiZSBwbGFjZWQgb24gdGhlIG1haW4gcGFnZQotIyAoaW5kZXguaHRtbCkuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2plY3Qgb24gZm9yIGluc3RhbmNlIEdpdEh1YgotIyBhbmQgd2FudCB0byByZXVzZSB0aGUgaW50cm9kdWN0aW9uIHBhZ2UgYWxzbyBmb3IgdGhlIGRveHlnZW4gb3V0cHV0LgotCi1VU0VfTURGSUxFX0FTX01BSU5QQUdFID0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKLSMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCi0jCi0jIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAotIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVNPVVJDRV9CUk9XU0VSICAgICAgICAgPSBOTwotCi0jIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IG9mIGZ1bmN0aW9ucywKLSMgY2xhc3NlcyBhbmQgZW51bXMgZGlyZWN0bHkgaW50byB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1JTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KLQotIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgd2lsbCBpbnN0cnVjdCBkb3h5Z2VuIHRvIGhpZGUgYW55Ci0jIHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZAotIyBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1TVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCi0KLSMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkCi0jIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1SRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gTk8KLQotIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24KLSMgYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMgY2FsbGVkL3VzZWQgYnkgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGxpc3RlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1SRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gTk8KLQotIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldAotIyB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbSBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQKLSMgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLiBPdGhlcndpc2UgdGhleSB3aWxsCi0jIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVJFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKLQotIyBJZiBTT1VSQ0VfVE9PTFRJUFMgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoZW4gaG92ZXJpbmcgYSBoeXBlcmxpbmsgaW4gdGhlCi0jIHNvdXJjZSBjb2RlIHdpbGwgc2hvdyBhIHRvb2x0aXAgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgcHJvdG90eXBlLAotIyBicmllZiBkZXNjcmlwdGlvbiBhbmQgbGlua3MgdG8gdGhlIGRlZmluaXRpb24gYW5kIGRvY3VtZW50YXRpb24uIFNpbmNlIHRoaXMKLSMgd2lsbCBtYWtlIHRoZSBIVE1MIGZpbGUgbGFyZ2VyIGFuZCBsb2FkaW5nIG9mIGxhcmdlIGZpbGVzIGEgYml0IHNsb3dlciwgeW91Ci0jIGNhbiBvcHQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgotCi1TT1VSQ0VfVE9PTFRJUFMgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlIHdpbGwKLSMgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbiBidWlsdC1pbgotIyBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlIHRhZ2dpbmcgc3lzdGVtCi0jIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdSB3aWxsIG5lZWQgdmVyc2lvbgotIyA0LjguNiBvciBoaWdoZXIuCi0jCi0jIFRvIHVzZSBpdCBkbyB0aGUgZm9sbG93aW5nOgotIyAtIEluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGdsb2JhbAotIyAtIEVuYWJsZSBTT1VSQ0VfQlJPV1NFUiBhbmQgVVNFX0hUQUdTIGluIHRoZSBjb25maWcgZmlsZQotIyAtIE1ha2Ugc3VyZSB0aGUgSU5QVVQgcG9pbnRzIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZQotIyAtIFJ1biBkb3h5Z2VuIGFzIG5vcm1hbAotIwotIyBEb3h5Z2VuIHdpbGwgaW52b2tlIGh0YWdzIChhbmQgdGhhdCB3aWxsIGluIHR1cm4gaW52b2tlIGd0YWdzKSwgc28gdGhlc2UKLSMgdG9vbHMgbXVzdCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lIChpLmUuIGluIHRoZSBzZWFyY2ggcGF0aCkuCi0jCi0jIFRoZSByZXN1bHQ6IGluc3RlYWQgb2YgdGhlIHNvdXJjZSBicm93c2VyIGdlbmVyYXRlZCBieSBkb3h5Z2VuLCB0aGUgbGlua3MgdG8KLSMgc291cmNlIGNvZGUgd2lsbCBub3cgcG9pbnQgdG8gdGhlIG91dHB1dCBvZiBodGFncy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KLQotVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0aGUgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKLSMgdmVyYmF0aW0gY29weSBvZiB0aGUgaGVhZGVyIGZpbGUgZm9yIGVhY2ggY2xhc3MgZm9yIHdoaWNoIGFuIGluY2x1ZGUgaXMKLSMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgotIyBTZWUgYWxzbzogU2VjdGlvbiBcY2xhc3MuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4IG9mIGFsbAotIyBjb21wb3VuZHMgd2lsbCBiZSBnZW5lcmF0ZWQuIEVuYWJsZSB0aGlzIGlmIHRoZSBwcm9qZWN0IGNvbnRhaW5zIGEgbG90IG9mCi0jIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucyBvciBpbnRlcmZhY2VzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1BTFBIQUJFVElDQUxfSU5ERVggICAgID0gWUVTCi0KLSMgVGhlIENPTFNfSU5fQUxQSEFfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluCi0jIHdoaWNoIHRoZSBhbHBoYWJldGljYWwgaW5kZXggbGlzdCB3aWxsIGJlIHNwbGl0LgotIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAyMCwgZGVmYXVsdCB2YWx1ZTogNS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgotCi1DT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQotCi0jIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwgY2xhc3NlcyB3aWxsCi0jIGJlIHB1dCB1bmRlciB0aGUgc2FtZSBoZWFkZXIgaW4gdGhlIGFscGhhYmV0aWNhbCBpbmRleC4gVGhlIElHTk9SRV9QUkVGSVggdGFnCi0jIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcmVmaXggKG9yIGEgbGlzdCBvZiBwcmVmaXhlcykgdGhhdCBzaG91bGQgYmUgaWdub3JlZAotIyB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCi0KLUlHTk9SRV9QUkVGSVggICAgICAgICAgPQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1HRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCi0KLSMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQotIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKLSMgaXQuCi0jIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKLQotIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKLSMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAotCi0jIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgotIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQotIyBzdGFuZGFyZCBoZWFkZXIuCi0jCi0jIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKLSMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCi0jIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQotIyBkZWZhdWx0IGhlYWRlciB1c2luZwotIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKLSMgWW91ckNvbmZpZ0ZpbGUKLSMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKLSMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5Ci0jIHVzZXMuCi0jIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCi0jIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgotIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0hFQURFUiAgICAgICAgICAgID0KLQotIyBUaGUgSFRNTF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBmb290ZXIgZm9yIGVhY2gKLSMgZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkCi0jIGZvb3Rlci4gU2VlIEhUTUxfSEVBREVSIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSBhIGRlZmF1bHQKLSMgZm9vdGVyIGFuZCB3aGF0IHNwZWNpYWwgY29tbWFuZHMgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBmb290ZXIuIFNlZSBhbHNvCi0jIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgZm9vdGVyCi0jIHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0ZPT1RFUiAgICAgICAgICAgID0KLQotIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZQotIyBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgbG9vayBvZgotIyB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4KLSMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgc3R5bGUKLSMgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCi0jIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIHRhZywgYXMKLSMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMgdGFnIChIVE1MX1NUWUxFU0hFRVQpIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUKLSMgb2Jzb2xldGUuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfU1RZTEVTSEVFVCAgICAgICAgPQotCi0jIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCB1c2VyLQotIyBkZWZpbmVkIGNhc2NhZGluZyBzdHlsZSBzaGVldCB0aGF0IGlzIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMKLSMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4KLSMgVGhpcyBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBIVE1MX1NUWUxFU0hFRVQgc2luY2UgaXQgZG9lcyBub3QgcmVwbGFjZSB0aGUKLSMgc3RhbmRhcmQgc3R5bGUgc2hlZXQgYW5kIGlzIHRoZXJlZm9yIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCi0jIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBGb3IgYW4gZXhhbXBsZQotIyBzZWUgdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfRVhUUkFfU1RZTEVTSEVFVCAgPQotCi0jIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgotIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlCi0jIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlCi0jICRyZWxwYXRoXiBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlCi0jIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0IHRoZQotIyBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0VYVFJBX0ZJTEVTICAgICAgID0KLQotIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4gRG94eWdlbgotIyB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZXNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcyBhY2NvcmRpbmcgdG8KLSMgdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsIHNlZQotIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gRm9yIGluc3RhbmNlIHRoZSB2YWx1ZQotIyAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAKLSMgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzU5LCBkZWZhdWx0IHZhbHVlOiAyMjAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjAKLQotIyBUaGUgSFRNTF9DT0xPUlNUWUxFX1NBVCB0YWcgY29udHJvbHMgdGhlIHB1cml0eSAob3Igc2F0dXJhdGlvbikgb2YgdGhlIGNvbG9ycwotIyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZSBncmF5c2NhbGVzIG9ubHkuIEEKLSMgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDI1NSwgZGVmYXVsdCB2YWx1ZTogMTAwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0NPTE9SU1RZTEVfU0FUICAgID0gMTAwCi0KLSMgVGhlIEhUTUxfQ09MT1JTVFlMRV9HQU1NQSB0YWcgY29udHJvbHMgdGhlIGdhbW1hIGNvcnJlY3Rpb24gYXBwbGllZCB0byB0aGUKLSMgbHVtaW5hbmNlIGNvbXBvbmVudCBvZiB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gVmFsdWVzIGJlbG93IDEwMAotIyBncmFkdWFsbHkgbWFrZSB0aGUgb3V0cHV0IGxpZ2h0ZXIsIHdoZXJlYXMgdmFsdWVzIGFib3ZlIDEwMCBtYWtlIHRoZSBvdXRwdXQKLSMgZGFya2VyLiBUaGUgdmFsdWUgZGl2aWRlZCBieSAxMDAgaXMgdGhlIGFjdHVhbCBnYW1tYSBhcHBsaWVkLCBzbyA4MCByZXByZXNlbnRzCi0jIGEgZ2FtbWEgb2YgMC44LCBUaGUgdmFsdWUgMjIwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAyLjIsIGFuZCAxMDAgZG9lcyBub3QKLSMgY2hhbmdlIHRoZSBnYW1tYS4KLSMgTWluaW11bSB2YWx1ZTogNDAsIG1heGltdW0gdmFsdWU6IDI0MCwgZGVmYXVsdCB2YWx1ZTogODAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfQ09MT1JTVFlMRV9HQU1NQSAgPSA4MAotCi0jIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTAotIyBwYWdlIHdpbGwgY29udGFpbiB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBwYWdlIHdhcyBnZW5lcmF0ZWQuIFNldHRpbmcgdGhpcwotIyB0byBOTyBjYW4gaGVscCB3aGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIG11bHRpcGxlIHJ1bnMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfVElNRVNUQU1QICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCi0jIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCi0jIHBhZ2UgaGFzIGxvYWRlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gTk8KLQotIyBXaXRoIEhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgb25lIGNhbiBjb250cm9sIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mIGVudHJpZXMKLSMgc2hvd24gaW4gdGhlIHZhcmlvdXMgdHJlZSBzdHJ1Y3R1cmVkIGluZGljZXMgaW5pdGlhbGx5OyB0aGUgdXNlciBjYW4gZXhwYW5kCi0jIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kIHRoZSB0cmVlIHRvCi0jIHN1Y2ggYSBsZXZlbCB0aGF0IGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBhcmUgdmlzaWJsZSAodW5sZXNzCi0jIGEgZnVsbHkgY29sbGFwc2VkIHRyZWUgYWxyZWFkeSBleGNlZWRzIHRoaXMgYW1vdW50KS4gU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mCi0jIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5IGRlZmF1bHQuIDAgaXMgYSBzcGVjaWFsIHZhbHVlCi0jIHJlcHJlc2VudGluZyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgZW50cmllcyBhbmQgd2lsbCByZXN1bHQgaW4gYSBmdWxsIGV4cGFuZGVkCi0jIHRyZWUgYnkgZGVmYXVsdC4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOTk5OSwgZGVmYXVsdCB2YWx1ZTogMTAwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCi0KLSMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCi0jIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudAotIyBlbnZpcm9ubWVudCAoc2VlOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy94Y29kZS8pLCBpbnRyb2R1Y2VkIHdpdGgKLSMgT1NYIDEwLjUgKExlb3BhcmQpLiBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKLSMgTWFrZWZpbGUgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluCi0jIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nIG1ha2UgaW5zdGFsbCB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgotIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQgaXQgYXQKLSMgc3RhcnR1cC4gU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKLSMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCi0KLSMgVGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZG9jc2V0IGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzCi0jIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyCi0jIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKSBjYW4gYmUgZ3JvdXBlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IERveHlnZW4gZ2VuZXJhdGVkIGRvY3MuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KLQotRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIgotCi0jIFRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbgotIyBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUgc3RyaW5nLCBlLmcuCi0jIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuIERveHlnZW4gd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KLQotRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKLQotIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5Ci0jIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlCi0jIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5QdWJsaXNoZXIuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KLQotRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgotCi0jIFRoZSBET0NTRVRfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogUHVibGlzaGVyLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCi0KLURPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKLQotIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIGdlbmVyYXRlcyB0aHJlZQotIyBhZGRpdGlvbmFsIEhUTUwgaW5kZXggZmlsZXM6IGluZGV4LmhocCwgaW5kZXguaGhjLCBhbmQgaW5kZXguaGhrLiBUaGUKLSMgaW5kZXguaGhwIGlzIGEgcHJvamVjdCBmaWxlIHRoYXQgY2FuIGJlIHJlYWQgYnkgTWljcm9zb2Z0J3MgSFRNTCBIZWxwIFdvcmtzaG9wCi0jIChzZWU6IGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9MjExMzgpIG9uCi0jIFdpbmRvd3MuCi0jCi0jIFRoZSBIVE1MIEhlbHAgV29ya3Nob3AgY29udGFpbnMgYSBjb21waWxlciB0aGF0IGNhbiBjb252ZXJ0IGFsbCBIVE1MIG91dHB1dAotIyBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpbnRvIGEgc2luZ2xlIGNvbXBpbGVkIEhUTUwgZmlsZSAoLmNobSkuIENvbXBpbGVkIEhUTUwKLSMgZmlsZXMgYXJlIG5vdyB1c2VkIGFzIHRoZSBXaW5kb3dzIDk4IGhlbHAgZm9ybWF0LCBhbmQgd2lsbCByZXBsYWNlIHRoZSBvbGQKLSMgV2luZG93cyBoZWxwIGZvcm1hdCAoLmhscCkgb24gYWxsIFdpbmRvd3MgcGxhdGZvcm1zIGluIHRoZSBmdXR1cmUuIENvbXByZXNzZWQKLSMgSFRNTCBmaWxlcyBhbHNvIGNvbnRhaW4gYW4gaW5kZXgsIGEgdGFibGUgb2YgY29udGVudHMsIGFuZCB5b3UgY2FuIHNlYXJjaCBmb3IKLSMgd29yZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBIVE1MIHdvcmtzaG9wIGFsc28gY29udGFpbnMgYSB2aWV3ZXIgZm9yCi0jIGNvbXByZXNzZWQgSFRNTCBmaWxlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1HRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KLQotIyBUaGUgQ0hNX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0KLSMgZmlsZS4gWW91IGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQotIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgotCi1DSE1fRklMRSAgICAgICAgICAgICAgID0KLQotIyBUaGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aAotIyBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZiB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyICggaGhjLmV4ZSkuIElmIG5vbi1lbXB0eQotIyBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLgotIyBUaGUgZmlsZSBoYXMgdG8gYmUgc3BlY2lmaWVkIHdpdGggZnVsbCBwYXRoLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KLQotSEhDX0xPQ0FUSU9OICAgICAgICAgICA9Ci0KLSMgVGhlIEdFTkVSQVRFX0NISSBmbGFnIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoCi0jIFlFUykgb3IgdGhhdCBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKCBOTykuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCi0KLUdFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTwotCi0jIFRoZSBDSE1fSU5ERVhfRU5DT0RJTkcgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKCBoaGspLCBjb250ZW50ICggaGhjKQotIyBhbmQgcHJvamVjdCBmaWxlIGNvbnRlbnQuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgotCi1DSE1fSU5ERVhfRU5DT0RJTkcgICAgID0KLQotIyBUaGUgQklOQVJZX1RPQyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkICgKLSMgWUVTKSBvciBhIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoIE5PKSBpbiB0aGUgLmNobSBmaWxlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgotCi1CSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KLQotIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycyB0bwotIyB0aGUgdGFibGUgb2YgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgotCi1UT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCi0jIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdAotIyBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhIFF0IENvbXByZXNzZWQgSGVscAotIyAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKLSMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4gVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvCi0jIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KLQotUUNIX0ZJTEUgICAgICAgICAgICAgICA9Ci0KLSMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQgSGVscAotIyBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBOYW1lc3BhY2UKLSMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZSkuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCi0KLVFIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0Ci0KLSMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdAotIyBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIFZpcnR1YWwKLSMgRm9sZGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC0KLSMgZm9sZGVycykuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBkb2MuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KLQotUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYwotCi0jIElmIHRoZSBRSFBfQ1VTVF9GSUxURVJfTkFNRSB0YWcgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20KLSMgZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KLSMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQotIyBmaWx0ZXJzKS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgotCi1RSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0KLQotIyBUaGUgUUhQX0NVU1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCi0jIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQotIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCi0jIGZpbHRlcnMpLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCi0KLVFIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPQotCi0jIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzCi0jIHByb2plY3QncyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLiBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlcyAoc2VlOgotIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMpLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCi0KLVFIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPQotCi0jIFRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MKLSMgcWhlbHBnZW5lcmF0b3IuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUKLSMgZ2VuZXJhdGVkIC5xaHAgZmlsZS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgotCi1RSEdfTE9DQVRJT04gICAgICAgICAgID0KLQotIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQotIyBnZW5lcmF0ZWQsIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIHRoZXkgZm9ybSBhbiBFY2xpcHNlIGhlbHAgcGx1Z2luLiBUbwotIyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyBtZW51IGluCi0jIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBuZWVkcwotIyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQotIyB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuCi0jIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlIHRoZSBoZWxwIGFwcGVhcnMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCi0KLSMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCi0jIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCi0jIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCi0KLUVDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0Ci0KLSMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKLSMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQotIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKLSMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKLSMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCi0jIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLURJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTwotCi0jIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKLSMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIElmIHRoZSB0YWcKLSMgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UKLSMgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMKLSMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQKLSMgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUKLSMgSFRNTCBoZWxwIGZlYXR1cmUuIFZpYSBjdXN0b20gc3R5bGVzaGVldHMgKHNlZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQpIG9uZSBjYW4KLSMgZnVydGhlciBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIGluZGV4LiBBcyBhbiBleGFtcGxlLCB0aGUgZGVmYXVsdCBzdHlsZQotIyBzaGVldCBnZW5lcmF0ZWQgYnkgZG94eWdlbiBoYXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIGhvdyB0byBwdXQgYW4gaW1hZ2UgYXQKLSMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW5zdGVhZCBvZiB0aGUgUFJPSkVDVF9OQU1FLiBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzCi0jIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXgsIHlvdSBjb3VsZCBjb25zaWRlciBzZXR0aW5nCi0jIERJU0FCTEVfSU5ERVggdG8gWUVTIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IE5PCi0KLSMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcyB0aGF0Ci0jIGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KLSMKLSMgTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0gdmFsdWVzIGZyb20gYXBwZWFyaW5nCi0jIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyMCwgZGVmYXVsdCB2YWx1ZTogNC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKLQotIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZSB1c2VkCi0jIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUgaXMgc2hvd24uCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDE1MDAsIGRlZmF1bHQgdmFsdWU6IDI1MC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAotCi0jIFdoZW4gdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIG9wZW4gbGlua3MgdG8KLSMgZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUVYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTwotCi0jIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYVRlWCBmb3JtdWxhcyBpbmNsdWRlZCBhcyBpbWFnZXMgaW4KLSMgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gV2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsCi0jIGRveHlnZW4gcnVuIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTAotIyBvdXRwdXQgZGlyZWN0b3J5IHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCi0jIE1pbmltdW0gdmFsdWU6IDgsIG1heGltdW0gdmFsdWU6IDUwLCBkZWZhdWx0IHZhbHVlOiAxMC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCi0KLSMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCi0jIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIG5vdAotIyBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KLSMKLSMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzIGluCi0jIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1GT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCi0KLSMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXggKHNlZQotIyBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZSByZW5kZXJpbmcKLSMgaW5zdGVhZCBvZiB1c2luZyBwcmVyZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90IGhhdmUgTGFUZVgKLSMgaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwgb3V0cHV0LiBXaGVuCi0jIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kIGNvbmZpZ3VyZSB0aGUgcGF0aAotIyB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1VU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8KLQotIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgY2FuIHNldCB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCi0jIHRoZSBNYXRoSmF4IG91dHB1dC4gU2VlIHRoZSBNYXRoSmF4IHNpdGUgKHNlZToKLSMgaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgotIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBIVE1MLUNTUyAod2hpY2ggaXMgc2xvd2VyLCBidXQgaGFzIHRoZSBiZXN0Ci0jIGNvbXBhdGliaWxpdHkpLCBOYXRpdmVNTUwgKGkuZS4gTWF0aE1MKSBhbmQgU1ZHLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSFRNTC1DU1MuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgotCi1NQVRISkFYX0ZPUk1BVCAgICAgICAgID0gSFRNTC1DU1MKLQotIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgSFRNTAotIyBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5Ci0jIHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheCBkaXJlY3RvcnkKLSMgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuCi0jIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvIHRoZSBNYXRoSmF4Ci0jIENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dCBpbnN0YWxsaW5nCi0jIE1hdGhKYXguIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbCBjb3B5IG9mCi0jIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCi0KLU1BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0Ci0KLSMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBNYXRoSmF4Ci0jIGV4dGVuc2lvbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4gRm9yIGV4YW1wbGUKLSMgTUFUSEpBWF9FWFRFTlNJT05TID0gVGVYL0FNU21hdGggVGVYL0FNU3N5bWJvbHMKLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCi0KLU1BVEhKQVhfRVhURU5TSU9OUyAgICAgPQotCi0jIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCi0jIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQotIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgotIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCi0KLU1BVEhKQVhfQ09ERUZJTEUgICAgICAgPQotCi0jIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgotIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKLSMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKLSMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQotIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCi0jIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCi0jIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCi0jIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKLSMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQotIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCi0jIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKLSMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCi0jIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKLSMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KLSMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCi0jIG9wdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUwotCi0jIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQotIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKLSMgYXJlIHR3byBmbGF2b3VycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlCi0jIEVYVEVSTkFMX1NFQVJDSCBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvcgotIyBzZWFyY2hpbmcgYW5kIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcwotIyBlbmFibGVkIHRoZSBpbmRleGluZyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUKLSMgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCi0KLSMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCi0jIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQotIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgotIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKLSMgc2VhcmNoIHJlc3VsdHMuCi0jCi0jIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKCBkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKLSMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQotIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4KLSMKLSMgU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCi0KLUVYVEVSTkFMX1NFQVJDSCAgICAgICAgPSBOTwotCi0jIFRoZSBTRUFSQ0hFTkdJTkVfVVJMIHNob3VsZCBwb2ludCB0byBhIHNlYXJjaCBlbmdpbmUgaG9zdGVkIGJ5IGEgd2ViIHNlcnZlcgotIyB3aGljaCB3aWxsIHJldHVybiB0aGUgc2VhcmNoIHJlc3VsdHMgd2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMgZW5hYmxlZC4KLSMKLSMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoIGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQotIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5Ci0jIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAotIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCi0KLVNFQVJDSEVOR0lORV9VUkwgICAgICAgPQotCi0jIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlIHVuaW5kZXhlZAotIyBzZWFyY2ggZGF0YSBpcyB3cml0dGVuIHRvIGEgZmlsZSBmb3IgaW5kZXhpbmcgYnkgYW4gZXh0ZXJuYWwgdG9vbC4gV2l0aCB0aGUKLSMgU0VBUkNIREFUQV9GSUxFIHRhZyB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgY2FuIGJlIHNwZWNpZmllZC4KLSMgVGhlIGRlZmF1bHQgZmlsZSBpczogc2VhcmNoZGF0YS54bWwuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotU0VBUkNIREFUQV9GSUxFICAgICAgICA9IHNlYXJjaGRhdGEueG1sCi0KLSMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUKLSMgRVhURVJOQUxfU0VBUkNIX0lEIHRhZyBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdC4gVGhpcyBpcwotIyB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdG8gc2VhcmNoIHRocm91Z2ggbXVsdGlwbGUKLSMgcHJvamVjdHMgYW5kIHJlZGlyZWN0IHRoZSByZXN1bHRzIGJhY2sgdG8gdGhlIHJpZ2h0IHByb2plY3QuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotRVhURVJOQUxfU0VBUkNIX0lEICAgICA9Ci0KLSMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KLSMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQotIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCi0jIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKLSMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6Ci0jIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgotCi1FWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBMYVRlWCBvdXRwdXQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUdFTkVSQVRFX0xBVEVYICAgICAgICAgPSBZRVMKLQotIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKLSMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCi0jIGl0LgotIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4Ci0KLSMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKLSMgaW52b2tlZC4KLSMKLSMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZwotIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKLSMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KLSMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKLQotIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKLSMgaW5kZXggZm9yIExhVGVYLgotIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1NQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4Ci0KLSMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IExhVGVYCi0jIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCi0jIHRyZWVzIGluIGdlbmVyYWwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUNPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTwotCi0jIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkIGJ5IHRoZQotIyBwcmludGVyLgotIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCAoMjEwIHggMjk3IG1tKSwgbGV0dGVyICg4LjUgeCAxMSBpbmNoZXMpLCBsZWdhbCAoOC41IHgKLSMgMTQgaW5jaGVzKSBhbmQgZXhlY3V0aXZlICg3LjI1IHggMTAuNSBpbmNoZXMpLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogYTQuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1QQVBFUl9UWVBFICAgICAgICAgICAgID0gYTQKLQotIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTGFUZVggcGFja2FnZSBuYW1lcwotIyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LiBUbyBnZXQgdGhlIHRpbWVzIGZvbnQgZm9yCi0jIGluc3RhbmNlIHlvdSBjYW4gc3BlY2lmeQotIyBFWFRSQV9QQUNLQUdFUz10aW1lcwotIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1FWFRSQV9QQUNLQUdFUyAgICAgICAgID0KLQotIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvciB0aGUKLSMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGZpcnN0Ci0jIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgaGVhZGVyLiBTZWUKLSMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBsZXQgZG94eWdlbiB3cml0ZSB0aGUKLSMgZGVmYXVsdCBoZWFkZXIgdG8gYSBzZXBhcmF0ZSBmaWxlLgotIwotIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBoZWFkZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISBUaGUKLSMgZm9sbG93aW5nIGNvbW1hbmRzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgaW5zaWRlIHRoZSBoZWFkZXI6ICR0aXRsZSwKLSMgJGRhdGV0aW1lLCAkZGF0ZSwgJGRveHlnZW52ZXJzaW9uLCAkcHJvamVjdG5hbWUsICRwcm9qZWN0bnVtYmVyLiBEb3h5Z2VuIHdpbGwKLSMgcmVwbGFjZSB0aGVtIGJ5IHJlc3BlY3RpdmVseSB0aGUgdGl0bGUgb2YgdGhlIHBhZ2UsIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUsCi0jIG9ubHkgdGhlIGN1cnJlbnQgZGF0ZSwgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGRveHlnZW4sIHRoZSBwcm9qZWN0IG5hbWUgKHNlZQotIyBQUk9KRUNUX05BTUUpLCBvciB0aGUgcHJvamVjdCBudW1iZXIgKHNlZSBQUk9KRUNUX05VTUJFUikuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9IRUFERVIgICAgICAgICAgID0KLQotIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvciB0aGUKLSMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgZm9vdGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QKLSMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBmb290ZXIuCi0jCi0jIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGZvb3RlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9GT09URVIgICAgICAgICAgID0KLQotIyBUaGUgTEFURVhfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCi0jIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBMQVRFWF9PVVRQVVQgb3V0cHV0Ci0jIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yCi0jIG1hcmtlcnMgYXZhaWxhYmxlLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotTEFURVhfRVhUUkFfRklMRVMgICAgICA9Ci0KLSMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQgaXMKLSMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gUERGICh1c2luZyBwczJwZGYgb3IgcGRmbGF0ZXgpLiBUaGUgUERGIGZpbGUgd2lsbAotIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gVGhpcwotIyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBQREYgdmlld2VyLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBMQVRFWF9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHVzZSBwZGZsYXRleCB0byBnZW5lcmF0ZQotIyB0aGUgUERGIGZpbGUgZGlyZWN0bHkgZnJvbSB0aGUgTGFUZVggZmlsZXMuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGEKLSMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1VU0VfUERGTEFURVggICAgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXGJhdGNobW9kZQotIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwIHJ1bm5pbmcKLSMgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4gVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkCi0jIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KLQotIyBJZiB0aGUgTEFURVhfSElERV9JTkRJQ0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdCBpbmNsdWRlIHRoZQotIyBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikgaW4gdGhlIG91dHB1dC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCi0KLSMgSWYgdGhlIExBVEVYX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlCi0jIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCi0jCi0jIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3Mgc3VjaCBhcwotIyBTT1VSQ0VfQlJPV1NFUi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCi0KLSMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKLSMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFNlZQotIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBhbmQgXGNpdGUgZm9yIG1vcmUgaW5mby4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBsYWluLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotTEFURVhfQklCX1NUWUxFICAgICAgICA9IHBsYWluCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0LiBUaGUKLSMgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB0b28gcHJldHR5IHdpdGggb3RoZXIgUlRGCi0jIHJlYWRlcnMvZWRpdG9ycy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1HRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KLQotIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQotIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKLSMgaXQuCi0jIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogcnRmLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCi0KLVJURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKLQotIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IFJURgotIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQotIyB0cmVlcyBpbiBnZW5lcmFsLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KLQotQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkIHdpbGwKLSMgY29udGFpbiBoeXBlcmxpbmsgZmllbGRzLiBUaGUgUlRGIGZpbGUgd2lsbCBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwKLSMgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUKLSMgYnJvd3NpbmcgdXNpbmcgV29yZCBvciBzb21lIG90aGVyIFdvcmQgY29tcGF0aWJsZSByZWFkZXJzIHRoYXQgc3VwcG9ydCB0aG9zZQotIyBmaWVsZHMuCi0jCi0jIE5vdGU6IFdvcmRQYWQgKHdyaXRlKSBhbmQgb3RoZXJzIGRvIG5vdCBzdXBwb3J0IGxpbmtzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KLQotUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCi0KLSMgTG9hZCBzdHlsZXNoZWV0IGRlZmluaXRpb25zIGZyb20gZmlsZS4gU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZwotIyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUgcmVwbGFjZW1lbnRzLAotIyBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KLSMKLSMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUKLSMgZGVmYXVsdCBzdHlsZSBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgotCi1SVEZfU1RZTEVTSEVFVF9GSUxFICAgID0KLQotIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKLSMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKLSMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgotCi1SVEZfRVhURU5TSU9OU19GSUxFICAgID0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbWFuIHBhZ2VzIGZvcgotIyBjbGFzc2VzIGFuZCBmaWxlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1HRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8KLQotIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKLSMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCi0jIGl0LiBBIGRpcmVjdG9yeSBtYW4zIHdpbGwgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKLSMgTUFOX09VVFBVVC4KLSMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBtYW4uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KLQotTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgotCi0jIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkCi0jIG1hbiBwYWdlcy4gSW4gY2FzZSB0aGUgbWFudWFsIHNlY3Rpb24gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlIG51bWJlcgotIyAzIGlzIHByZXBlbmRlZC4gVGhlIGRvdCAoLikgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFOX0VYVEVOU0lPTiB0YWcgaXMKLSMgb3B0aW9uYWwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuMy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgotCi1NQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKLQotIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0Ci0jIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKLSMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0Ci0jIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgotCi1NQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQKLSMgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCi0KLSMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCi0jIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgotIyBpdC4KLSMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiB4bWwuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KLQotWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAotCi0jIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgWE1MIHNjaGVtYSwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYQotIyB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCi0KLVhNTF9TQ0hFTUEgICAgICAgICAgICAgPQotCi0jIFRoZSBYTUxfRFREIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgWE1MIERURCwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYQotIyB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCi0KLVhNTF9EVEQgICAgICAgICAgICAgICAgPQotCi0jIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGR1bXAgdGhlIHByb2dyYW0KLSMgbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8KLSMgdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZQotIyBvZiB0aGUgWE1MIG91dHB1dC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgotCi1YTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIERPQ0JPT0sgb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX0RPQ0JPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKLSMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCi0KLSMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCi0jIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCi0jIGZyb250IG9mIGl0LgotIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCi0KLURPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIEF1dG9HZW4KLSMgRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCi0jIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbAotIyBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1HRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUKLSMgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgotIwotIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUdFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTwotCi0jIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5Ci0jIE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBQREYgYW5kIERWSQotIyBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCi0KLVBFUkxNT0RfTEFURVggICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5Ci0jIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bwotIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8gdGhlCi0jIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0Ci0jIGp1c3QgdGhlIHNhbWUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCi0KLVBFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKLQotIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZSBhcmUKLSMgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiBUaGlzIGlzIHVzZWZ1bAotIyBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUgZG9uJ3QKLSMgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCi0KLVBFUkxNT0RfTUFLRVZBUl9QUkVGSVggPQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAotIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1FTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCi0KLSMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcwotIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyBvbmx5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpbGwgYmUKLSMgcGVyZm9ybWVkLiBNYWNybyBleHBhbnNpb24gY2FuIGJlIGRvbmUgaW4gYSBjb250cm9sbGVkIHdheSBieSBzZXR0aW5nCi0jIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCi0KLU1BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgotIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKLSMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotRVhQQU5EX09OTFlfUFJFREVGICAgICA9IE5PCi0KLSMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgaW5jbHVkZXMgZmlsZXMgaW4gdGhlCi0jIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgotCi1TRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCi0KLSMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0Ci0jIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCi0jIHByZXByb2Nlc3Nvci4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgotCi1JTkNMVURFX1BBVEggICAgICAgICAgID0KLQotIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCi0jIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKLSMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgYmUKLSMgdXNlZC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCi0KLUlOQ0xVREVfRklMRV9QQVRURVJOUyAgPQotCi0jIFRoZSBQUkVERUZJTkVEIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hY3JvIG5hbWVzIHRoYXQgYXJlCi0jIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mIGUuZy4KLSMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZSBvcgotIyBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgIj0iIGFyZSBvbWl0dGVkLCAiPTEiCi0jIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IKLSMgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvciBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotUFJFREVGSU5FRCAgICAgICAgICAgICA9Ci0KLSMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCi0jIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCi0jIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAotIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCi0jIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotRVhQQU5EX0FTX0RFRklORUQgICAgICA9Ci0KLSMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsCi0jIHJlbW92ZSBhbGwgcmVmcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbgotIyBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zIGFyZQotIyB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKLSMgcmVtb3ZlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCi0KLVNLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCi0jIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgotIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgotIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgotIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgotIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCi0jIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKLSMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCi0jIG9mIHRhZyBmaWxlcy4KLSMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYW4gdW5pcXVlIG5hbWUgKHdoZXJlIHRoZSBuYW1lIGRvZXMgTk9UIGluY2x1ZGUKLSMgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggZG94eWdlbiBpcwotIyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLgotCi1UQUdGSUxFUyAgICAgICAgICAgICAgID0KLQotIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKLSMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCi0jIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCi0KLUdFTkVSQVRFX1RBR0ZJTEUgICAgICAgPQotCi0jIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzIHdpbGwgYmUgbGlzdGVkIGluIHRoZQotIyBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUFMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZCBpbgotIyB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQotIyBsaXN0ZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUVYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIHBhZ2VzIHdpbGwgYmUgbGlzdGVkIGluCi0jIHRoZSByZWxhdGVkIHBhZ2VzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIHBhZ2VzIHdpbGwKLSMgYmUgbGlzdGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1FWFRFUk5BTF9QQUdFUyAgICAgICAgID0gWUVTCi0KLSMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0Ci0jIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgJ3doaWNoIHBlcmwnKS4KLSMgVGhlIGRlZmF1bHQgZmlsZSAod2l0aCBhYnNvbHV0ZSBwYXRoKSBpczogL3Vzci9iaW4vcGVybC4KLQotUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbQotIyAoaW4gSFRNTCBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8KLSMgTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVAotIyBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCi0jIHBvd2VyZnVsIGdyYXBocy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUwotCi0jIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCi0jIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZToKLSMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSkgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQotIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQotIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgotCi1NU0NHRU5fUEFUSCAgICAgICAgICAgID0KLQotIyBZb3UgY2FuIGluY2x1ZGUgZGlhZ3JhbXMgbWFkZSB3aXRoIGRpYSBpbiBkb3h5Z2VuIGRvY3VtZW50YXRpb24uIERveHlnZW4gd2lsbAotIyB0aGVuIHJ1biBkaWEgdG8gcHJvZHVjZSB0aGUgZGlhZ3JhbSBhbmQgaW5zZXJ0IGl0IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUKLSMgRElBX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBkaWEgYmluYXJ5IHJlc2lkZXMuCi0jIElmIGxlZnQgZW1wdHkgZGlhIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGguCi0KLURJQV9QQVRIICAgICAgICAgICAgICAgPQotCi0jIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCi0jIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUhJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKLQotIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKLSMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6Ci0jIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50Ci0jIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCi0jIHNldCB0byBOTwotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUhBVkVfRE9UICAgICAgICAgICAgICAgPSBOTwotCi0jIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAotIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCi0jIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQotIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZwotIyBzcGVlZC4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAotCi0jIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgbiB0aGUgZG90IGZpbGVzIHRoYXQgZG94eWdlbgotIyBnZW5lcmF0ZXMgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlCi0jIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZCB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhCi0jIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5Ci0jIHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhlbHZldGljYS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2EKLQotIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgKGluIHBvaW50cykgb2YgdGhlIGZvbnQgb2YKLSMgZG90IGdyYXBocy4KLSMgTWluaW11bSB2YWx1ZTogNCwgbWF4aW11bSB2YWx1ZTogMjQsIGRlZmF1bHQgdmFsdWU6IDEwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwCi0KLSMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBkZWZhdWx0IGZvbnQgYXMgc3BlY2lmaWVkIHdpdGgKLSMgRE9UX0ZPTlROQU1FLiBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHNldAotIyB0aGUgcGF0aCB3aGVyZSBkb3QgY2FuIGZpbmQgaXQgdXNpbmcgdGhpcyB0YWcuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfRk9OVFBBVEggICAgICAgICAgID0KLQotIyBJZiB0aGUgQ0xBU1NfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKLSMgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLgotIyBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1DTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQotIyBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24KLSMgZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZCBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlCi0jIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUwotCi0jIElmIHRoZSBHUk9VUF9HUkFQSFMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKLSMgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUdST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAotIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZwotIyBMYW5ndWFnZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUgdGhlCi0jIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZSBncmFwaCBtYXkKLSMgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMgdGhyZXNob2xkIGxpbWl0cyB0aGUKLSMgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAKLSMgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQKLSMgaXMgZW5mb3JjZWQuIFNvIHdoZW4geW91IHNldCB0aGUgdGhyZXNob2xkIHRvIDEwLCB1cCB0byAxNSBmaWVsZHMgbWF5IGFwcGVhciwKLSMgYnV0IGlmIHRoZSBudW1iZXIgZXhjZWVkcyAxNSwgdGhlIHRvdGFsIGFtb3VudCBvZiBmaWVsZHMgc2hvd24gaXMgbGltaXRlZCB0bwotIyAxMC4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwLCBkZWZhdWx0IHZhbHVlOiAxMC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLVVNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMAotCi0jIElmIHRoZSBURU1QTEFURV9SRUxBVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgaW5oZXJpdGFuY2UgYW5kCi0jIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpcgotIyBpbnN0YW5jZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLVRFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTwotCi0jIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bwotIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKLSMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKLSMgZmlsZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1JTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCi0jIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZwotIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKLSMgZmlsZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1JTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCi0KLSMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCi0jIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCi0jCi0jIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCi0jIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAotIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1DQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCi0jIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCi0jCi0jIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCi0jIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCi0jIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCi0jIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1HUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCi0KLSMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQotIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCi0jIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKLSMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUwotCi0jIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCi0jIGdlbmVyYXRlZCBieSBkb3QuCi0jIE5vdGU6IElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyCi0jIHRvIG1ha2UgdGhlIFNWRyBmaWxlcyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzCi0jIHJlcXVpcmVtZW50KS4KLSMgUG9zc2libGUgdmFsdWVzIGFyZTogcG5nLCBqcGcsIGdpZiBhbmQgc3ZnLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcG5nLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZwotCi0jIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bwotIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KLSMKLSMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLiBUZXN0ZWQKLSMgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuCi0jIE5vdGU6IEZvciBJRSA5KyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlCi0jIHRoZSBTVkcgZmlsZXMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUlOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTwotCi0jIFRoZSBET1RfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCi0jIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfUEFUSCAgICAgICAgICAgICAgID0KLQotIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKLSMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKLSMgY29tbWFuZCkuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RGSUxFX0RJUlMgICAgICAgICAgID0KLQotIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKLSMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKLSMgY29tbWFuZCkuCi0KLU1TQ0ZJTEVfRElSUyAgICAgICAgICAgPQotCi0jIFRoZSBESUFGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAotIyBjb250YWluIGRpYSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZGlhZmlsZQotIyBjb21tYW5kKS4KLQotRElBRklMRV9ESVJTICAgICAgICAgICA9Ci0KLSMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygbm9kZXMKLSMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoIGJlY29tZXMKLSMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMgdmlzdWFsaXplZAotIyBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlIG51bWJlciBvZiBkaXJlY3QKLSMgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KLSMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZSB0aGF0Ci0jIHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogNTAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTAKLQotIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSBncmFwaHMKLSMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUgZnJvbSB0aGUKLSMgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMgdGhhdCBsYXkKLSMgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIG9wdGlvbiB0byAxCi0jIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UgY29kZSBiYXNlcy4gQWxzbwotIyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5Ci0jIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMCwgZGVmYXVsdCB2YWx1ZTogMC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLU1BWF9ET1RfR1JBUEhfREVQVEggICAgPSAwCi0KLSMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50Ci0jIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdCBzZWVtCi0jIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4KLSMKLSMgV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLCBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0bwotIyBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZiBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8KLSMgcmVhZCkuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTwotCi0jIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0Ci0jIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMKLSMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkgc3VwcG9ydAotIyB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IFlFUwotCi0jIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UKLSMgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkCi0jIGdyYXBocy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUdFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGRvdAotIyBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSB2YXJpb3VzIGdyYXBocy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKaW5kZXggNWI3ZDk1Ni4uNGRlNjMyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKQEAgLTQsOSArNCwxMSBAQAogICAgIHNyY3M6IFsic3JjL2xvb3BiYWNrLmNwcCJdLAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiAgICAgc3RhdGljX2xpYnM6IFsibGlic25kZmlsZSJdLAorICAgIGluY2x1ZGVfZGlyczogWyJleHRlcm5hbC9vYm9lL2FwcHMvT2JvZVRlc3Rlci9hcHAvc3JjL21haW4vY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmFhdWRpbyIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIKICAgICAgICAgXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9HbGl0Y2hBbmFseXplci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9HbGl0Y2hBbmFseXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDQzNWQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvR2xpdGNoQW5hbHl6ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkFMWVpFUl9HTElUQ0hfQU5BTFlaRVJfSAotI2RlZmluZSBBTkFMWVpFUl9HTElUQ0hfQU5BTFlaRVJfSAotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNjdHlwZT4KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiTGF0ZW5jeUFuYWx5emVyLmgiCi0jaW5jbHVkZSAiUHNldWRvUmFuZG9tLmgiCi0KLS8qKgotICogT3V0cHV0IGEgc3RlYWR5IHNpbmUgd2F2ZSBhbmQgYW5hbHl6ZSB0aGUgcmV0dXJuIHNpZ25hbC4KLSAqCi0gKiBVc2UgYSBjb3NpbmUgdHJhbnNmb3JtIHRvIG1lYXN1cmUgdGhlIHByZWRpY3RlZCBtYWduaXR1ZGUgYW5kIHJlbGF0aXZlIHBoYXNlIG9mIHRoZQotICogbG9vcGVkIGJhY2sgc2luZSB3YXZlLiBUaGVuIGdlbmVyYXRlIGEgcHJlZGljdGVkIHNpZ25hbCBhbmQgY29tcGFyZSB3aXRoIHRoZSBhY3R1YWwgc2lnbmFsLgotICovCi1jbGFzcyBHbGl0Y2hBbmFseXplciA6IHB1YmxpYyBMb29wYmFja1Byb2Nlc3NvciB7Ci1wdWJsaWM6Ci0KLSAgICBpbnQzMl90IGdldFN0YXRlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0YXRlOwotICAgIH0KLQotICAgIGRvdWJsZSBnZXRQZWFrQW1wbGl0dWRlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVBlYWtGb2xsb3dlci5nZXRMZXZlbCgpOwotICAgIH0KLQotICAgIGRvdWJsZSBnZXRUb2xlcmFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtVG9sZXJhbmNlOwotICAgIH0KLQotICAgIHZvaWQgc2V0VG9sZXJhbmNlKGRvdWJsZSB0b2xlcmFuY2UpIHsKLSAgICAgICAgbVRvbGVyYW5jZSA9IHRvbGVyYW5jZTsKLSAgICAgICAgbVNjYWxlZFRvbGVyYW5jZSA9IG1NYWduaXR1ZGUgKiBtVG9sZXJhbmNlOwotICAgIH0KLQotICAgIHZvaWQgc2V0TWFnbml0dWRlKGRvdWJsZSBtYWduaXR1ZGUpIHsKLSAgICAgICAgbU1hZ25pdHVkZSA9IG1hZ25pdHVkZTsKLSAgICAgICAgbVNjYWxlZFRvbGVyYW5jZSA9IG1NYWduaXR1ZGUgKiBtVG9sZXJhbmNlOwotICAgIH0KLQotICAgIGludDMyX3QgZ2V0R2xpdGNoQ291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtR2xpdGNoQ291bnQ7Ci0gICAgfQotCi0gICAgaW50MzJfdCBnZXRTdGF0ZUZyYW1lQ291bnQoaW50IHN0YXRlKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3RhdGVGcmFtZUNvdW50ZXJzW3N0YXRlXTsKLSAgICB9Ci0KLSAgICBkb3VibGUgZ2V0U2lnbmFsVG9Ob2lzZURCKCkgewotICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIHRocmVzaG9sZCA9IDEuMGUtMTQ7Ci0gICAgICAgIGlmIChtTWVhblNxdWFyZVNpZ25hbCA8IHRocmVzaG9sZCB8fCBtTWVhblNxdWFyZU5vaXNlIDwgdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICByZXR1cm4gMC4wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG91YmxlIHNpZ25hbFRvTm9pc2UgPSBtTWVhblNxdWFyZVNpZ25hbCAvIG1NZWFuU3F1YXJlTm9pc2U7IC8vIHBvd2VyIHJhdGlvCi0gICAgICAgICAgICBkb3VibGUgc2lnbmFsVG9Ob2lzZURCID0gMTAuMCAqIGxvZyhzaWduYWxUb05vaXNlKTsKLSAgICAgICAgICAgIGlmIChzaWduYWxUb05vaXNlREIgPCBNSU5fU05SX0RCKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoIkVSUk9SIC0gc2lnbmFsIHRvIG5vaXNlIHJhdGlvIGlzIHRvbyBsb3chIDwgJWQgZEIuIEFkanVzdCB2b2x1bWUuIiwKLSAgICAgICAgICAgICAgICAgICAgIE1JTl9TTlJfREIpOwotICAgICAgICAgICAgICAgIHNldFJlc3VsdChFUlJPUl9WT0xVTUVfVE9PX0xPVyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2lnbmFsVG9Ob2lzZURCOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgYW5hbHl6ZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVwb3J0OwotICAgICAgICByZXBvcnQgPDwgIkdsaXRjaEFuYWx5emVyIC0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgInBlYWsuYW1wbGl0dWRlICAgICA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICA8PCBnZXRQZWFrQW1wbGl0dWRlKCkgPDwgIlxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgInNpbmUubWFnbml0dWRlICAgICA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICA8PCBtTWFnbml0dWRlIDw8ICJcbiI7Ci0gICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJybXMubm9pc2UgICAgICAgICAgPSAiIDw8IHN0ZDo6c2V0dyg4KQotICAgICAgICAgICAgICAgPDwgbU1lYW5TcXVhcmVOb2lzZSA8PCAiXG4iOwotICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAic2lnbmFsLnRvLm5vaXNlLmRiID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgIDw8IGdldFNpZ25hbFRvTm9pc2VEQigpIDw8ICJcbiI7Ci0gICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJmcmFtZXMuYWNjdW11bGF0ZWQgPSAiIDw8IHN0ZDo6c2V0dyg4KQotICAgICAgICAgICAgICAgPDwgbUZyYW1lc0FjY3VtdWxhdGVkIDw8ICJcbiI7Ci0gICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJzaW5lLnBlcmlvZCAgICAgICAgPSAiIDw8IHN0ZDo6c2V0dyg4KQotICAgICAgICAgICAgICAgPDwgbVNpbmVQZXJpb2QgPDwgIlxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgInRlc3Quc3RhdGUgICAgICAgICA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICA8PCBtU3RhdGUgPDwgIlxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lLmNvdW50ICAgICAgICA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICA8PCBtRnJhbWVDb3VudGVyIDw8ICJcbiI7Ci0gICAgICAgIC8vIERpZCB3ZSBldmVyIGdldCBhIGxvY2s/Ci0gICAgICAgIGJvb2wgZ290TG9jayA9IChtU3RhdGUgPT0gU1RBVEVfTE9DS0VEKSB8fCAobUdsaXRjaENvdW50ID4gMCk7Ci0gICAgICAgIGlmICghZ290TG9jaykgewotICAgICAgICAgICAgcmVwb3J0IDw8ICJFUlJPUiAtIGZhaWxlZCB0byBsb2NrIG9uIHJlZmVyZW5jZSBzaW5lIHRvbmUuXG4iOwotICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX05PX0xPQ0spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gT25seSBwcmludCBpZiBtZWFuaW5nZnVsLgotICAgICAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgImdsaXRjaC5jb3VudCAgICAgICA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICAgICAgPDwgbUdsaXRjaENvdW50IDw8ICJcbiI7Ci0gICAgICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAibWF4LmdsaXRjaCAgICAgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgICAgICA8PCBtTWF4R2xpdGNoRGVsdGEgPDwgIlxuIjsKLSAgICAgICAgICAgIGlmIChtR2xpdGNoQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmVwb3J0IDw8ICJFUlJPUiAtIG51bWJlciBvZiBnbGl0Y2hlcyA+IDBcbiI7Ci0gICAgICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX0dMSVRDSEVTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVwb3J0LnN0cigpOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRTdGF0dXMoKSBvdmVycmlkZSB7Ci0gICAgICAgIEFMT0dEKCJzdCA9ICVkLCAjZ2wgPSAlM2QsIiwgbVN0YXRlLCBtR2xpdGNoQ291bnQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDYWxjdWxhdGUgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29tcG9uZW50IG9mIHRoZSBpbnB1dCBzaWduYWwKLSAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIGFuYWx5c2lzIGZyZXF1ZW5jeS4KLSAgICAgKiBBbHNvIGNhbGN1bGF0ZSB0aGUgcGhhc2UgdGhhdCB3ZSBjYW4gdXNlIHRvIGNyZWF0ZSBhCi0gICAgICogc2lnbmFsIHRoYXQgbWF0Y2hlcyB0aGF0IGNvbXBvbmVudC4KLSAgICAgKiBUaGUgcGhhc2Ugd2lsbCBiZSBiZXR3ZWVuIC1QSSBhbmQgK1BJLgotICAgICAqLwotICAgIGRvdWJsZSBjYWxjdWxhdGVNYWduaXR1ZGUoZG91YmxlICpwaGFzZVB0ciA9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKG1GcmFtZXNBY2N1bXVsYXRlZCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMC4wOwotICAgICAgICB9Ci0gICAgICAgIGRvdWJsZSBzaW5NZWFuID0gbVNpbkFjY3VtdWxhdG9yIC8gbUZyYW1lc0FjY3VtdWxhdGVkOwotICAgICAgICBkb3VibGUgY29zTWVhbiA9IG1Db3NBY2N1bXVsYXRvciAvIG1GcmFtZXNBY2N1bXVsYXRlZDsKLSAgICAgICAgZG91YmxlIG1hZ25pdHVkZSA9IDIuMCAqIHNxcnQoKHNpbk1lYW4gKiBzaW5NZWFuKSArIChjb3NNZWFuICogY29zTWVhbikpOwotICAgICAgICBpZiAocGhhc2VQdHIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZG91YmxlIHBoYXNlID0gTV9QSV8yIC0gYXRhbjIoc2luTWVhbiwgY29zTWVhbik7Ci0gICAgICAgICAgICAqcGhhc2VQdHIgPSBwaGFzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFnbml0dWRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmcmFtZURhdGEgY29udGFpbnMgbWljcm9waG9uZSBkYXRhIHdpdGggc2luZSBzaWduYWwgZmVlZGJhY2sKLSAgICAgKiBAcGFyYW0gY2hhbm5lbENvdW50Ci0gICAgICovCi0gICAgcmVzdWx0X2NvZGUgcHJvY2Vzc0lucHV0RnJhbWUoZmxvYXQgKmZyYW1lRGF0YSwgaW50IC8qIGNoYW5uZWxDb3VudCAqLykgb3ZlcnJpZGUgewotICAgICAgICByZXN1bHRfY29kZSByZXN1bHQgPSBSRVNVTFRfT0s7Ci0KLSAgICAgICAgZmxvYXQgc2FtcGxlID0gZnJhbWVEYXRhWzBdOwotICAgICAgICBmbG9hdCBwZWFrID0gbVBlYWtGb2xsb3dlci5wcm9jZXNzKHNhbXBsZSk7Ci0KLSAgICAgICAgLy8gRm9yY2UgYSBwZXJpb2RpYyBnbGl0Y2ggdG8gdGVzdCB0aGUgZGV0ZWN0b3IhCi0gICAgICAgIGlmIChtRm9yY2VHbGl0Y2hEdXJhdGlvbiA+IDApIHsKLSAgICAgICAgICAgIGlmIChtRm9yY2VHbGl0Y2hDb3VudGVyID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZvcmNlIGEgZ2xpdGNoISEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgbUZvcmNlR2xpdGNoQ291bnRlciA9IGdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUZvcmNlR2xpdGNoQ291bnRlciA8PSBtRm9yY2VHbGl0Y2hEdXJhdGlvbikgewotICAgICAgICAgICAgICAgIC8vIEZvcmNlIGFuIGFicnVwdCBvZmZzZXQuCi0gICAgICAgICAgICAgICAgc2FtcGxlICs9IChzYW1wbGUgPiAwLjApID8gLTAuNWYgOiAwLjVmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLS1tRm9yY2VHbGl0Y2hDb3VudGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXRlRnJhbWVDb3VudGVyc1ttU3RhdGVdKys7IC8vIGNvdW50IGhvdyBtYW55IGZyYW1lcyB3ZSBhcmUgaW4gZWFjaCBzdGF0ZQotCi0gICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0lETEU6Ci0gICAgICAgICAgICAgICAgbURvd25Db3VudGVyLS07Ci0gICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lNTVVORTsKLSAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gSU1NVU5FX0ZSQU1FX0NPVU5UOwotICAgICAgICAgICAgICAgICAgICBtSW5wdXRQaGFzZSA9IDAuMDsgLy8gcHJldmVudCBzcGlrZSBhdCBzdGFydAotICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UGhhc2UgPSAwLjA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVRFX0lNTVVORToKLSAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXItLTsKLSAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw6Ci0gICAgICAgICAgICAgICAgaWYgKHBlYWsgPiBtVGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0s7Ci0gICAgICAgICAgICAgICAgICAgIC8vQUxPR0QoIiU1ZDogc3dpdGNoIHRvIFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0siLCBtRnJhbWVDb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLOgotICAgICAgICAgICAgICAgIG1TaW5BY2N1bXVsYXRvciArPSBzYW1wbGUgKiBzaW5mKG1JbnB1dFBoYXNlKTsKLSAgICAgICAgICAgICAgICBtQ29zQWNjdW11bGF0b3IgKz0gc2FtcGxlICogY29zZihtSW5wdXRQaGFzZSk7Ci0gICAgICAgICAgICAgICAgbUZyYW1lc0FjY3VtdWxhdGVkKys7Ci0gICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBwZXJpb2Qgb3IgdGhlIGNhbGN1bGF0aW9uIHdpbGwgbm90IGJlIGFjY3VyYXRlLgotICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzQWNjdW11bGF0ZWQgPT0gbVNpbmVQZXJpb2QgKiBQRVJJT0RTX05FRURFRF9GT1JfTE9DSykgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGhhc2VPZmZzZXQgPSAwLjA7Ci0gICAgICAgICAgICAgICAgICAgIHNldE1hZ25pdHVkZShjYWxjdWxhdGVNYWduaXR1ZGUoJnBoYXNlT2Zmc2V0KSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCkgbWFnID0gJWYsIG9mZnNldCA9ICVmLCBwcmV2ID0gJWYiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1NYWduaXR1ZGUsIG1QaGFzZU9mZnNldCwgbVByZXZpb3VzUGhhc2VPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU1hZ25pdHVkZSA+IG1UaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYnMocGhhc2VPZmZzZXQpIDwga01heFBoYXNlRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9MT0NLRUQ7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfTE9DS0VEIiwgbUZyYW1lQ291bnRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGp1c3QgbUlucHV0UGhhc2UgdG8gbWF0Y2ggbWVhc3VyZWQgcGhhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dFBoYXNlICs9IHBoYXNlT2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc2V0QWNjdW11bGF0b3IoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5jcmVtZW50SW5wdXRQaGFzZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVRFX0xPQ0tFRDogewotICAgICAgICAgICAgICAgIC8vIFByZWRpY3QgbmV4dCBzaW5lIHZhbHVlCi0gICAgICAgICAgICAgICAgZG91YmxlIHByZWRpY3RlZCA9IHNpbmYobUlucHV0UGhhc2UpICogbU1hZ25pdHVkZTsKLSAgICAgICAgICAgICAgICBkb3VibGUgZGlmZiA9IHByZWRpY3RlZCAtIHNhbXBsZTsKLSAgICAgICAgICAgICAgICBkb3VibGUgYWJzRGlmZiA9IGZhYnMoZGlmZik7Ci0gICAgICAgICAgICAgICAgbU1heEdsaXRjaERlbHRhID0gc3RkOjptYXgobU1heEdsaXRjaERlbHRhLCBhYnNEaWZmKTsKLSAgICAgICAgICAgICAgICBpZiAoYWJzRGlmZiA+IG1TY2FsZWRUb2xlcmFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRVJST1JfR0xJVENIRVM7Ci0gICAgICAgICAgICAgICAgICAgIG9uR2xpdGNoU3RhcnQoKTsKLS8vICAgICAgICAgICAgICAgICAgICBMT0dJKCJkaWZmIGdsaXRjaCBkZXRlY3RlZCwgYWJzRGlmZiA9ICVnIiwgYWJzRGlmZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1bVNxdWFyZVNpZ25hbCArPSBwcmVkaWN0ZWQgKiBwcmVkaWN0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIG1TdW1TcXVhcmVOb2lzZSArPSBkaWZmICogZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgaW5jb21pbmcgc2lnbmFsIGFuZCBzbG93bHkgYWRqdXN0IG1hZ25pdHVkZSB0byBhY2NvdW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBkcmlmdCBpbiB0aGUgRFJDIG9yIEFHQy4KLSAgICAgICAgICAgICAgICAgICAgbVNpbkFjY3VtdWxhdG9yICs9IHNhbXBsZSAqIHNpbmYobUlucHV0UGhhc2UpOwotICAgICAgICAgICAgICAgICAgICBtQ29zQWNjdW11bGF0b3IgKz0gc2FtcGxlICogY29zZihtSW5wdXRQaGFzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1GcmFtZXNBY2N1bXVsYXRlZCsrOwotICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBlcmlvZCBvciB0aGUgY2FsY3VsYXRpb24gd2lsbCBub3QgYmUgYWNjdXJhdGUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzQWNjdW11bGF0ZWQgPT0gbVNpbmVQZXJpb2QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBjb2VmZmljaWVudCA9IDAuMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwaGFzZU9mZnNldCA9IDAuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYWduaXR1ZGUgPSBjYWxjdWxhdGVNYWduaXR1ZGUoJnBoYXNlT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBwb2xlIGF2ZXJhZ2luZyBmaWx0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRNYWduaXR1ZGUoKG1NYWduaXR1ZGUgKiAoMS4wIC0gY29lZmZpY2llbnQpKSArIChtYWduaXR1ZGUgKiBjb2VmZmljaWVudCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVhblNxdWFyZU5vaXNlID0gbVN1bVNxdWFyZU5vaXNlICogbUludmVyc2VTaW5lUGVyaW9kOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lYW5TcXVhcmVTaWduYWwgPSBtU3VtU3F1YXJlU2lnbmFsICogbUludmVyc2VTaW5lUGVyaW9kOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJzKHBoYXNlT2Zmc2V0KSA+IGtNYXhQaGFzZUVycm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRVJST1JfR0xJVENIRVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25HbGl0Y2hTdGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwaGFzZSBnbGl0Y2ggZGV0ZWN0ZWQsIHBoYXNlT2Zmc2V0ID0gJWciLCBwaGFzZU9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1NYWduaXR1ZGUgPCBtVGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRVJST1JfR0xJVENIRVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25HbGl0Y2hTdGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJtYWduaXR1ZGUgZ2xpdGNoIGRldGVjdGVkLCBtTWFnbml0dWRlID0gJWciLCBtTWFnbml0dWRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbnB1dFBoYXNlKCk7Ci0gICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVRFX0dMSVRDSElORzogewotICAgICAgICAgICAgICAgIC8vIFByZWRpY3QgbmV4dCBzaW5lIHZhbHVlCi0gICAgICAgICAgICAgICAgbUdsaXRjaExlbmd0aCsrOwotICAgICAgICAgICAgICAgIGRvdWJsZSBwcmVkaWN0ZWQgPSBzaW5mKG1JbnB1dFBoYXNlKSAqIG1NYWduaXR1ZGU7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGRpZmYgPSBwcmVkaWN0ZWQgLSBzYW1wbGU7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGFic0RpZmYgPSBmYWJzKGRpZmYpOwotICAgICAgICAgICAgICAgIG1NYXhHbGl0Y2hEZWx0YSA9IHN0ZDo6bWF4KG1NYXhHbGl0Y2hEZWx0YSwgYWJzRGlmZik7Ci0gICAgICAgICAgICAgICAgaWYgKGFic0RpZmYgPCBtU2NhbGVkVG9sZXJhbmNlKSB7IC8vIGNsb3NlIGVub3VnaD8KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGEgZnVsbCBzaW5lIHBlcmlvZCBvZiBub24tZ2xpdGNoIHNhbXBsZXMgaW4gYSByb3cgdGhlbiBjb25zaWRlciB0aGUgZ2xpdGNoIG92ZXIuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ganVzdCBjb25zaWRlciBhIHplcm8gY3Jvc3NpbmcgdGhlIGVuZCBvZiBhIGdsaXRjaC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Ob25HbGl0Y2hDb3VudCsrID4gbVNpbmVQZXJpb2QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uR2xpdGNoRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTm9uR2xpdGNoQ291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAobUdsaXRjaExlbmd0aCA+ICg0ICogbVNpbmVQZXJpb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbnB1dFBoYXNlKCk7Ci0gICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5VTV9TVEFURVM6IC8vIG5vdCBhIHJlYWwgc3RhdGUKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG1GcmFtZUNvdW50ZXIrKzsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIGFkdmFuY2UgYW5kIHdyYXAgcGhhc2UKLSAgICB2b2lkIGluY3JlbWVudElucHV0UGhhc2UoKSB7Ci0gICAgICAgIG1JbnB1dFBoYXNlICs9IG1QaGFzZUluY3JlbWVudDsKLSAgICAgICAgaWYgKG1JbnB1dFBoYXNlID4gTV9QSSkgewotICAgICAgICAgICAgbUlucHV0UGhhc2UgLT0gKDIuMCAqIE1fUEkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWR2YW5jZSBhbmQgd3JhcCBwaGFzZQotICAgIHZvaWQgaW5jcmVtZW50T3V0cHV0UGhhc2UoKSB7Ci0gICAgICAgIG1PdXRwdXRQaGFzZSArPSBtUGhhc2VJbmNyZW1lbnQ7Ci0gICAgICAgIGlmIChtT3V0cHV0UGhhc2UgPiBNX1BJKSB7Ci0gICAgICAgICAgICBtT3V0cHV0UGhhc2UgLT0gKDIuMCAqIE1fUEkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZyYW1lRGF0YSB1cG9uIHJldHVybiwgY29udGFpbnMgdGhlIHJlZmVyZW5jZSBzaW5lIHdhdmUKLSAgICAgKiBAcGFyYW0gY2hhbm5lbENvdW50Ci0gICAgICovCi0gICAgcmVzdWx0X2NvZGUgcHJvY2Vzc091dHB1dEZyYW1lKGZsb2F0ICpmcmFtZURhdGEsIGludCBjaGFubmVsQ291bnQpIG92ZXJyaWRlIHsKLSAgICAgICAgZmxvYXQgb3V0cHV0ID0gMC4wZjsKLSAgICAgICAgLy8gT3V0cHV0IHNpbmUgd2F2ZSBzbyB3ZSBjYW4gbWVhc3VyZSBpdC4KLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7Ci0gICAgICAgICAgICBmbG9hdCBzaW5PdXQgPSBzaW5mKG1PdXRwdXRQaGFzZSk7Ci0gICAgICAgICAgICBpbmNyZW1lbnRPdXRwdXRQaGFzZSgpOwotICAgICAgICAgICAgb3V0cHV0ID0gKHNpbk91dCAqIG1PdXRwdXRBbXBsaXR1ZGUpCi0gICAgICAgICAgICAgICAgICAgICArIChtV2hpdGVOb2lzZS5uZXh0UmFuZG9tRG91YmxlKCkgKiBrTm9pc2VBbXBsaXR1ZGUpOwotICAgICAgICAgICAgLy8gQUxPR0QoInNpbiglZikgPSAlZiwgJWZcbiIsIG1PdXRwdXRQaGFzZSwgc2luT3V0LCAgbVBoYXNlSW5jcmVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBmcmFtZURhdGFbMF0gPSBvdXRwdXQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZyYW1lRGF0YVtpXSA9IDAuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFJFU1VMVF9PSzsKLSAgICB9Ci0KLSAgICB2b2lkIG9uR2xpdGNoU3RhcnQoKSB7Ci0gICAgICAgIG1HbGl0Y2hDb3VudCsrOwotLy8gICAgICAgIEFMT0dEKCIlNWQ6IFNUQVJURUQgYSBnbGl0Y2ggIyAlZCIsIG1GcmFtZUNvdW50ZXIsIG1HbGl0Y2hDb3VudCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0dMSVRDSElORzsKLSAgICAgICAgbUdsaXRjaExlbmd0aCA9IDE7Ci0gICAgICAgIG1Ob25HbGl0Y2hDb3VudCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCBvbkdsaXRjaEVuZCgpIHsKLS8vICAgICAgICBBTE9HRCgiJTVkOiBFTkRFRCBhIGdsaXRjaCAjICVkLCBsZW5ndGggPSAlZCIsIG1GcmFtZUNvdW50ZXIsIG1HbGl0Y2hDb3VudCwgbUdsaXRjaExlbmd0aCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0xPQ0tFRDsKLSAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOwotICAgIH0KLQotICAgIC8vIHJlc2V0IHRoZSBzaW5lIHdhdmUgZGV0ZWN0b3IKLSAgICB2b2lkIHJlc2V0QWNjdW11bGF0b3IoKSB7Ci0gICAgICAgIG1GcmFtZXNBY2N1bXVsYXRlZCA9IDA7Ci0gICAgICAgIG1TaW5BY2N1bXVsYXRvciA9IDAuMDsKLSAgICAgICAgbUNvc0FjY3VtdWxhdG9yID0gMC4wOwotICAgICAgICBtU3VtU3F1YXJlU2lnbmFsID0gMC4wOwotICAgICAgICBtU3VtU3F1YXJlTm9pc2UgPSAwLjA7Ci0gICAgfQotCi0gICAgdm9pZCByZWxvY2soKSB7Ci0vLyAgICAgICAgQUxPR0QoInJlbG9jazogJWQgYmVjYXVzZSBvZiBhIHZlcnkgbG9uZyAlZCBnbGl0Y2giLCBtRnJhbWVDb3VudGVyLCBtR2xpdGNoTGVuZ3RoKTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfV0FJVElOR19GT1JfTE9DSzsKLSAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOwotICAgIH0KLQotICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7Ci0gICAgICAgIExvb3BiYWNrUHJvY2Vzc29yOjpyZXNldCgpOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICBtRG93bkNvdW50ZXIgPSBJRExFX0ZSQU1FX0NPVU5UOwotICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmVwYXJlVG9UZXN0KCkgb3ZlcnJpZGUgewotICAgICAgICBMb29wYmFja1Byb2Nlc3Nvcjo6cHJlcGFyZVRvVGVzdCgpOwotICAgICAgICBtU2luZVBlcmlvZCA9IGdldFNhbXBsZVJhdGUoKSAvIGtUYXJnZXRHbGl0Y2hGcmVxdWVuY3k7Ci0gICAgICAgIG1PdXRwdXRQaGFzZSA9IDAuMGY7Ci0gICAgICAgIG1JbnZlcnNlU2luZVBlcmlvZCA9IDEuMCAvIG1TaW5lUGVyaW9kOwotICAgICAgICBtUGhhc2VJbmNyZW1lbnQgPSAyLjAgKiBNX1BJICogbUludmVyc2VTaW5lUGVyaW9kOwotICAgICAgICBtR2xpdGNoQ291bnQgPSAwOwotICAgICAgICBtTWF4R2xpdGNoRGVsdGEgPSAwLjA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUQVRFUzsgaSsrKSB7Ci0gICAgICAgICAgICBtU3RhdGVGcmFtZUNvdW50ZXJzW2ldID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIC8vIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBHbGl0Y2hBY3Rpdml0eS5qYXZhCi0gICAgZW51bSBzaW5lX3N0YXRlX3QgewotICAgICAgICBTVEFURV9JRExFLCAgICAgICAgICAgICAgIC8vIGJlZ2lubmluZwotICAgICAgICBTVEFURV9JTU1VTkUsICAgICAgICAgICAgIC8vIGlnbm9yaW5nIGlucHV0LCB3YWl0aW5nIGZvIEhXIHRvIHNldHRsZQotICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUwsIC8vIGxvb2tpbmcgZm9yIGEgbG91ZCBzaWduYWwKLSAgICAgICAgU1RBVEVfV0FJVElOR19GT1JfTE9DSywgICAvLyB0cnlpbmcgdG8gbG9jayBvbnRvIHRoZSBwaGFzZSBvZiB0aGUgc2luZQotICAgICAgICBTVEFURV9MT0NLRUQsICAgICAgICAgICAgIC8vIGxvY2tlZCBvbiB0aGUgc2luZSB3YXZlLCBsb29raW5nIGZvciBnbGl0Y2hlcwotICAgICAgICBTVEFURV9HTElUQ0hJTkcsICAgICAgICAgICAvLyBsb2NrZWQgb24gdGhlIHNpbmUgd2F2ZSBidXQgZ2xpdGNoaW5nCi0gICAgICAgIE5VTV9TVEFURVMKLSAgICB9OwotCi0gICAgZW51bSBjb25zdGFudHMgewotICAgICAgICAvLyBBcmJpdHJhcnkgZHVyYXRpb25zLCBhc3N1bWluZyA0ODAwMCBIegotICAgICAgICBJRExFX0ZSQU1FX0NPVU5UID0gNDggKiAxMDAsCi0gICAgICAgIElNTVVORV9GUkFNRV9DT1VOVCA9IDQ4ICogMTAwLAotICAgICAgICBQRVJJT0RTX05FRURFRF9GT1JfTE9DSyA9IDgsCi0gICAgICAgIE1JTl9TTlJfREIgPSA2NQotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtOb2lzZUFtcGxpdHVkZSA9IDAuMDA7IC8vIFVzZWQgdG8gZXhwZXJpbWVudCB3aXRoIHdhcmJsaW5nIGNhdXNlZCBieSBEUkMuCi0gICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1RhcmdldEdsaXRjaEZyZXF1ZW5jeSA9IDYwNzsKLSAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrTWF4UGhhc2VFcnJvciA9IE1fUEkgKiAwLjA1OwotCi0gICAgZmxvYXQgICBtVG9sZXJhbmNlID0gMC4xMDsgLy8gc2NhbGVkIGZyb20gMC4wIHRvIDEuMAotICAgIGRvdWJsZSAgbVRocmVzaG9sZCA9IDAuMDA1OwotICAgIGludCAgICAgbVNpbmVQZXJpb2QgPSAxOyAvLyB0aGlzIHdpbGwgYmUgc2V0IGJlZm9yZSB1c2UKLSAgICBkb3VibGUgIG1JbnZlcnNlU2luZVBlcmlvZCA9IDEuMDsKLQotICAgIGludDMyX3QgbVN0YXRlRnJhbWVDb3VudGVyc1tOVU1fU1RBVEVTXTsKLQotICAgIGRvdWJsZSAgbVBoYXNlSW5jcmVtZW50ID0gMC4wOwotICAgIGRvdWJsZSAgbUlucHV0UGhhc2UgPSAwLjA7Ci0gICAgZG91YmxlICBtT3V0cHV0UGhhc2UgPSAwLjA7Ci0gICAgZG91YmxlICBtTWFnbml0dWRlID0gMC4wOwotICAgIGludDMyX3QgbUZyYW1lc0FjY3VtdWxhdGVkID0gMDsKLSAgICBkb3VibGUgIG1TaW5BY2N1bXVsYXRvciA9IDAuMDsKLSAgICBkb3VibGUgIG1Db3NBY2N1bXVsYXRvciA9IDAuMDsKLSAgICBkb3VibGUgIG1NYXhHbGl0Y2hEZWx0YSA9IDAuMDsKLSAgICBpbnQzMl90IG1HbGl0Y2hDb3VudCA9IDA7Ci0gICAgaW50MzJfdCBtTm9uR2xpdGNoQ291bnQgPSAwOwotICAgIGludDMyX3QgbUdsaXRjaExlbmd0aCA9IDA7Ci0gICAgLy8gVGhpcyBpcyB1c2VkIGZvciBwcm9jZXNzaW5nIGV2ZXJ5IGZyYW1lIHNvIHdlIGNhY2hlIGl0IGhlcmUuCi0gICAgZG91YmxlICBtU2NhbGVkVG9sZXJhbmNlID0gMC4wOwotICAgIGludCAgICAgbURvd25Db3VudGVyID0gSURMRV9GUkFNRV9DT1VOVDsKLSAgICBpbnQzMl90IG1GcmFtZUNvdW50ZXIgPSAwOwotICAgIGRvdWJsZSAgbU91dHB1dEFtcGxpdHVkZSA9IDAuNzU7Ci0KLSAgICBpbnQzMl90IG1Gb3JjZUdsaXRjaER1cmF0aW9uID0gMDsgLy8gaWYgPiAwIHRoZW4gZm9yY2UgYSBnbGl0Y2ggZm9yIGRlYnVnZ2luZwotICAgIGludDMyX3QgbUZvcmNlR2xpdGNoQ291bnRlciA9IDQgKiA0ODAwMDsgLy8gY291bnQgZG93biBhbmQgdHJpZ2dlciBhdCB6ZXJvCi0KLSAgICAvLyBtZWFzdXJlIGJhY2tncm91bmQgbm9pc2UgY29udGludW91c2x5IGFzIGEgZGV2aWF0aW9uIGZyb20gdGhlIGV4cGVjdGVkIHNpZ25hbAotICAgIGRvdWJsZSAgbVN1bVNxdWFyZVNpZ25hbCA9IDAuMDsKLSAgICBkb3VibGUgIG1TdW1TcXVhcmVOb2lzZSA9IDAuMDsKLSAgICBkb3VibGUgIG1NZWFuU3F1YXJlU2lnbmFsID0gMC4wOwotICAgIGRvdWJsZSAgbU1lYW5TcXVhcmVOb2lzZSA9IDAuMDsKLQotICAgIFBlYWtEZXRlY3RvciAgbVBlYWtGb2xsb3dlcjsKLQotICAgIFBzZXVkb1JhbmRvbSAgbVdoaXRlTm9pc2U7Ci0KLSAgICBzaW5lX3N0YXRlX3QgIG1TdGF0ZSA9IFNUQVRFX0lETEU7Ci19OwotCi0KLSNlbmRpZiAvL0FOQUxZWkVSX0dMSVRDSF9BTkFMWVpFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL0xhdGVuY3lBbmFseXplci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9MYXRlbmN5QW5hbHl6ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwNjc5MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL0xhdGVuY3lBbmFseXplci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRvb2xzIGZvciBtZWFzdXJpbmcgbGF0ZW5jeSBhbmQgZm9yIGRldGVjdGluZyBnbGl0Y2hlcy4KLSAqIFRoZXNlIGNsYXNzZXMgYXJlIHB1cmUgbWF0aCBhbmQgY2FuIGJlIHVzZWQgd2l0aCBhbnkgYXVkaW8gc3lzdGVtLgotICovCi0KLSNpZm5kZWYgQU5BTFlaRVJfTEFURU5DWV9BTkFMWVpFUl9ICi0jZGVmaW5lIEFOQUxZWkVSX0xBVEVOQ1lfQU5BTFlaRVJfSAotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGNjdHlwZT4KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIlBlYWtEZXRlY3Rvci5oIgotI2luY2x1ZGUgIlBzZXVkb1JhbmRvbS5oIgotI2luY2x1ZGUgIlJhbmRvbVB1bHNlR2VuZXJhdG9yLmgiCi0KLS8vIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBjb2RlIGlzIGluIE9ib2UuCi0jaWZuZGVmIEFMT0dECi0jZGVmaW5lIEFMT0dEIHByaW50ZgotI2RlZmluZSBBTE9HRSBwcmludGYKLSNkZWZpbmUgQUxPR1cgcHJpbnRmCi0jZW5kaWYKLQotI2RlZmluZSBMT09QQkFDS19SRVNVTFRfVEFHICAiUkVTVUxUOiAiCi0KLXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdFNhbXBsZVJhdGUgPSA0ODAwMDsKLXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrTWlsbGlzUGVyU2Vjb25kICAgPSAxMDAwOwotc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtNYXhMYXRlbmN5TWlsbGlzICA9IDcwMDsgIC8vIGFyYml0cmFyeSBhbmQgZ2VuZXJvdXMKLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlICBrTWluaW11bUNvbmZpZGVuY2UgPSAwLjI7Ci0KLXN0cnVjdCBMYXRlbmN5UmVwb3J0IHsKLSAgICBpbnQzMl90IGxhdGVuY3lJbkZyYW1lcyA9IDAuMDsKLSAgICBkb3VibGUgY29uZmlkZW5jZSA9IDAuMDsKLQotICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGxhdGVuY3lJbkZyYW1lcyA9IDA7Ci0gICAgICAgIGNvbmZpZGVuY2UgPSAwLjA7Ci0gICAgfQotfTsKLQotLy8gQ2FsY3VsYXRlIGEgbm9ybWFsaXplZCBjcm9zcyBjb3JyZWxhdGlvbi4KLXN0YXRpYyBkb3VibGUgY2FsY3VsYXRlTm9ybWFsaXplZENvcnJlbGF0aW9uKGNvbnN0IGZsb2F0ICphLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93U2l6ZSkgewotICAgIGRvdWJsZSBjb3JyZWxhdGlvbiA9IDAuMDsKLSAgICBkb3VibGUgc3VtUHJvZHVjdHMgPSAwLjA7Ci0gICAgZG91YmxlIHN1bVNxdWFyZXMgPSAwLjA7Ci0KLSAgICAvLyBDb3JyZWxhdGUgYSBhZ2FpbnN0IGIuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgZmxvYXQgczEgPSBhW2ldOwotICAgICAgICBmbG9hdCBzMiA9IGJbaV07Ci0gICAgICAgIC8vIFVzZSBhIG5vcm1hbGl6ZWQgY3Jvc3MtY29ycmVsYXRpb24uCi0gICAgICAgIHN1bVByb2R1Y3RzICs9IHMxICogczI7Ci0gICAgICAgIHN1bVNxdWFyZXMgKz0gKChzMSAqIHMxKSArIChzMiAqIHMyKSk7Ci0gICAgfQotCi0gICAgaWYgKHN1bVNxdWFyZXMgPj0gMS4wZS05KSB7Ci0gICAgICAgIGNvcnJlbGF0aW9uID0gMi4wICogc3VtUHJvZHVjdHMgLyBzdW1TcXVhcmVzOwotICAgIH0KLSAgICByZXR1cm4gY29ycmVsYXRpb247Ci19Ci0KLXN0YXRpYyBkb3VibGUgY2FsY3VsYXRlUm9vdE1lYW5TcXVhcmUoZmxvYXQgKmRhdGEsIGludDMyX3QgbnVtU2FtcGxlcykgewotICAgIGRvdWJsZSBzdW0gPSAwLjA7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IGRhdGFbaV07Ci0gICAgICAgIHN1bSArPSBzYW1wbGUgKiBzYW1wbGU7Ci0gICAgfQotICAgIHJldHVybiBzcXJ0KHN1bSAvIG51bVNhbXBsZXMpOwotfQotCi0vKioKLSAqIE1vbm9waG9uaWMgcmVjb3JkaW5nIHdpdGggcHJvY2Vzc2luZy4KLSAqLwotY2xhc3MgQXVkaW9SZWNvcmRpbmcKLXsKLXB1YmxpYzoKLQotICAgIHZvaWQgYWxsb2NhdGUoaW50IG1heEZyYW1lcykgewotICAgICAgICBtRGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4obWF4RnJhbWVzKTsKLSAgICAgICAgbU1heEZyYW1lcyA9IG1heEZyYW1lczsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSBTSE9SVCBkYXRhIGZyb20gdGhlIGZpcnN0IGNoYW5uZWwuCi0gICAgaW50MzJfdCB3cml0ZShpbnQxNl90ICppbnB1dERhdGEsIGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQsIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgICAgIC8vIHN0b3AgYXQgZW5kIG9mIGJ1ZmZlcgotICAgICAgICBpZiAoKG1GcmFtZUNvdW50ZXIgKyBudW1GcmFtZXMpID4gbU1heEZyYW1lcykgewotICAgICAgICAgICAgbnVtRnJhbWVzID0gbU1heEZyYW1lcyAtIG1GcmFtZUNvdW50ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICAgICAgbURhdGFbbUZyYW1lQ291bnRlcisrXSA9IGlucHV0RGF0YVtpICogaW5wdXRDaGFubmVsQ291bnRdICogKDEuMGYgLyAzMjc2OCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bUZyYW1lczsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSBGTE9BVCBkYXRhIGZyb20gdGhlIGZpcnN0IGNoYW5uZWwuCi0gICAgaW50MzJfdCB3cml0ZShmbG9hdCAqaW5wdXREYXRhLCBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LCBpbnQzMl90IG51bUZyYW1lcykgewotICAgICAgICAvLyBzdG9wIGF0IGVuZCBvZiBidWZmZXIKLSAgICAgICAgaWYgKChtRnJhbWVDb3VudGVyICsgbnVtRnJhbWVzKSA+IG1NYXhGcmFtZXMpIHsKLSAgICAgICAgICAgIG51bUZyYW1lcyA9IG1NYXhGcmFtZXMgLSBtRnJhbWVDb3VudGVyOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgICAgIG1EYXRhW21GcmFtZUNvdW50ZXIrK10gPSBpbnB1dERhdGFbaSAqIGlucHV0Q2hhbm5lbENvdW50XTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVtRnJhbWVzOwotICAgIH0KLQotICAgIC8vIFdyaXRlIEZMT0FUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQzMl90IHdyaXRlKGZsb2F0IHNhbXBsZSkgewotICAgICAgICAvLyBzdG9wIGF0IGVuZCBvZiBidWZmZXIKLSAgICAgICAgaWYgKG1GcmFtZUNvdW50ZXIgPCBtTWF4RnJhbWVzKSB7Ci0gICAgICAgICAgICBtRGF0YVttRnJhbWVDb3VudGVyKytdID0gc2FtcGxlOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUZyYW1lQ291bnRlciA9IDA7Ci0gICAgfQotICAgIGludDMyX3Qgc2l6ZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50ZXI7Ci0gICAgfQotCi0gICAgYm9vbCBpc0Z1bGwoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtRnJhbWVDb3VudGVyID49IG1NYXhGcmFtZXM7Ci0gICAgfQotCi0gICAgZmxvYXQgKmdldERhdGEoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtRGF0YS5nZXQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBzYW1wbGVSYXRlKSB7Ci0gICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcXVhcmUgdGhlIHNhbXBsZXMgc28gdGhleSBhcmUgYWxsIHBvc2l0aXZlIGFuZCBzbyB0aGUgcGVha3MgYXJlIGVtcGhhc2l6ZWQuCi0gICAgICovCi0gICAgdm9pZCBzcXVhcmUoKSB7Ci0gICAgICAgIGZsb2F0ICp4ID0gbURhdGEuZ2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUZyYW1lQ291bnRlcjsgaSsrKSB7Ci0gICAgICAgICAgICB4W2ldICo9IHhbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbXBsaWZ5IGEgc2lnbmFsIHNvIHRoYXQgdGhlIHBlYWsgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgZmluYWwgbWF4IHZhbHVlCi0gICAgICogQHJldHVybiBnYWluIGFwcGxpZWQgdG8gc2lnbmFsCi0gICAgICovCi0gICAgZmxvYXQgbm9ybWFsaXplKGZsb2F0IHRhcmdldCkgewotICAgICAgICBmbG9hdCBtYXhWYWx1ZSA9IDEuMGUtOWY7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUZyYW1lQ291bnRlcjsgaSsrKSB7Ci0gICAgICAgICAgICBtYXhWYWx1ZSA9IHN0ZDo6bWF4KG1heFZhbHVlLCBhYnMobURhdGFbaV0pKTsKLSAgICAgICAgfQotICAgICAgICBmbG9hdCBnYWluID0gdGFyZ2V0IC8gbWF4VmFsdWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUZyYW1lQ291bnRlcjsgaSsrKSB7Ci0gICAgICAgICAgICBtRGF0YVtpXSAqPSBnYWluOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnYWluOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gbURhdGE7Ci0gICAgaW50MzJfdCAgICAgICBtRnJhbWVDb3VudGVyID0gMDsKLSAgICBpbnQzMl90ICAgICAgIG1NYXhGcmFtZXMgPSAwOwotICAgIGludDMyX3QgICAgICAgbVNhbXBsZVJhdGUgPSBrRGVmYXVsdFNhbXBsZVJhdGU7IC8vIGNvbW1vbiBkZWZhdWx0Ci19OwotCi1zdGF0aWMgaW50IG1lYXN1cmVMYXRlbmN5RnJvbVB1bHNlKEF1ZGlvUmVjb3JkaW5nICZyZWNvcmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRpbmcgJnB1bHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRlbmN5UmVwb3J0ICpyZXBvcnQpIHsKLQotICAgIHJlcG9ydC0+bGF0ZW5jeUluRnJhbWVzID0gMDsKLSAgICByZXBvcnQtPmNvbmZpZGVuY2UgPSAwLjA7Ci0KLSAgICBpbnQgbnVtQ29ycmVsYXRpb25zID0gcmVjb3JkZWQuc2l6ZSgpIC0gcHVsc2Uuc2l6ZSgpOwotICAgIGlmIChudW1Db3JyZWxhdGlvbnMgPCAxMCkgewotICAgICAgICBBTE9HRSgiJXMoKSByZWNvcmRpbmcgdG9vIHNtYWxsID0gJWQgZnJhbWVzXG4iLCBfX2Z1bmNfXywgcmVjb3JkZWQuc2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gY29ycmVsYXRpb25zPSBzdGQ6Om1ha2VfdW5pcXVlPGZsb2F0W10+KG51bUNvcnJlbGF0aW9ucyk7Ci0KLSAgICAvLyBDb3JyZWxhdGUgcHVsc2UgYWdhaW5zdCB0aGUgcmVjb3JkZWQgZGF0YS4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvcnJlbGF0aW9uczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IGNvcnJlbGF0aW9uID0gKGZsb2F0KSBjYWxjdWxhdGVOb3JtYWxpemVkQ29ycmVsYXRpb24oJnJlY29yZGVkLmdldERhdGEoKVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHVsc2UuZ2V0RGF0YSgpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1bHNlLnNpemUoKSk7Ci0gICAgICAgIGNvcnJlbGF0aW9uc1tpXSA9IGNvcnJlbGF0aW9uOwotICAgIH0KLQotICAgIC8vIEZpbmQgaGlnaGVzdCBwZWFrIGluIGNvcnJlbGF0aW9uIGFycmF5LgotICAgIGZsb2F0IHBlYWtDb3JyZWxhdGlvbiA9IDAuMDsKLSAgICBpbnQgcGVha0luZGV4ID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db3JyZWxhdGlvbnM7IGkrKykgewotICAgICAgICBmbG9hdCB2YWx1ZSA9IGFicyhjb3JyZWxhdGlvbnNbaV0pOwotICAgICAgICBpZiAodmFsdWUgPiBwZWFrQ29ycmVsYXRpb24pIHsKLSAgICAgICAgICAgIHBlYWtDb3JyZWxhdGlvbiA9IHZhbHVlOwotICAgICAgICAgICAgcGVha0luZGV4ID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGVha0luZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiJXMoKSBubyBzaWduYWwgZm9yIGNvcnJlbGF0aW9uXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0KLSAgICByZXBvcnQtPmxhdGVuY3lJbkZyYW1lcyA9IHBlYWtJbmRleDsKLSAgICByZXBvcnQtPmNvbmZpZGVuY2UgPSBwZWFrQ29ycmVsYXRpb247Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1jbGFzcyBMb29wYmFja1Byb2Nlc3NvciB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+TG9vcGJhY2tQcm9jZXNzb3IoKSA9IGRlZmF1bHQ7Ci0KLSAgICBlbnVtIHJlc3VsdF9jb2RlIHsKLSAgICAgICAgUkVTVUxUX09LID0gMCwKLSAgICAgICAgRVJST1JfTk9JU1kgPSAtOTksCi0gICAgICAgIEVSUk9SX1ZPTFVNRV9UT09fTE9XLAotICAgICAgICBFUlJPUl9WT0xVTUVfVE9PX0hJR0gsCi0gICAgICAgIEVSUk9SX0NPTkZJREVOQ0UsCi0gICAgICAgIEVSUk9SX0lOVkFMSURfU1RBVEUsCi0gICAgICAgIEVSUk9SX0dMSVRDSEVTLAotICAgICAgICBFUlJPUl9OT19MT0NLCi0gICAgfTsKLQotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlVG9UZXN0KCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbVJlc3VsdCA9IDA7Ci0gICAgICAgIG1SZXNldENvdW50Kys7Ci0gICAgfQotCi0gICAgdmlydHVhbCByZXN1bHRfY29kZSBwcm9jZXNzSW5wdXRGcmFtZShmbG9hdCAqZnJhbWVEYXRhLCBpbnQgY2hhbm5lbENvdW50KSA9IDA7Ci0gICAgdmlydHVhbCByZXN1bHRfY29kZSBwcm9jZXNzT3V0cHV0RnJhbWUoZmxvYXQgKmZyYW1lRGF0YSwgaW50IGNoYW5uZWxDb3VudCkgPSAwOwotCi0gICAgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwgaW50IG51bUlucHV0RnJhbWVzLAotICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwgaW50IG51bU91dHB1dEZyYW1lcykgewotICAgICAgICBpbnQgbnVtQm90aCA9IHN0ZDo6bWluKG51bUlucHV0RnJhbWVzLCBudW1PdXRwdXRGcmFtZXMpOwotICAgICAgICAvLyBQcm9jZXNzIG9uZSBmcmFtZSBhdCBhIHRpbWUuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQm90aDsgaSsrKSB7Ci0gICAgICAgICAgICBwcm9jZXNzSW5wdXRGcmFtZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIGlucHV0RGF0YSArPSBpbnB1dENoYW5uZWxDb3VudDsKLSAgICAgICAgICAgIHByb2Nlc3NPdXRwdXRGcmFtZShvdXRwdXREYXRhLCBvdXRwdXRDaGFubmVsQ291bnQpOwotICAgICAgICAgICAgb3V0cHV0RGF0YSArPSBvdXRwdXRDaGFubmVsQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSBpbnB1dCB0aGFuIG91dHB1dC4KLSAgICAgICAgZm9yIChpbnQgaSA9IG51bUJvdGg7IGkgPCBudW1JbnB1dEZyYW1lczsgaSsrKSB7Ci0gICAgICAgICAgICBwcm9jZXNzSW5wdXRGcmFtZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIGlucHV0RGF0YSArPSBpbnB1dENoYW5uZWxDb3VudDsKLSAgICAgICAgfQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIG91dHB1dCB0aGFuIGlucHV0LgotICAgICAgICBmb3IgKGludCBpID0gbnVtQm90aDsgaSA8IG51bU91dHB1dEZyYW1lczsgaSsrKSB7Ci0gICAgICAgICAgICBwcm9jZXNzT3V0cHV0RnJhbWUob3V0cHV0RGF0YSwgb3V0cHV0Q2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIG91dHB1dERhdGEgKz0gb3V0cHV0Q2hhbm5lbENvdW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGQ6OnN0cmluZyBhbmFseXplKCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHByaW50U3RhdHVzKCkge307Ci0KLSAgICBpbnQzMl90IGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRSZXN1bHQoaW50MzJfdCByZXN1bHQpIHsKLSAgICAgICAgbVJlc3VsdCA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNEb25lKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQgc2F2ZShjb25zdCBjaGFyICpmaWxlTmFtZSkgewotICAgICAgICAodm9pZCkgZmlsZU5hbWU7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCBsb2FkKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7Ci0gICAgICAgICh2b2lkKSBmaWxlTmFtZTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRTYW1wbGVSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSkgewotICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgfQotCi0gICAgaW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNhbXBsZVJhdGU7Ci0gICAgfQotCi0gICAgaW50MzJfdCBnZXRSZXNldENvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVJlc2V0Q291bnQ7Ci0gICAgfQotCi0gICAgLyoqIENhbGxlZCB3aGVuIG5vdCBlbm91Z2ggaW5wdXQgZnJhbWVzIGNvdWxkIGJlIHJlYWQgYWZ0ZXIgc3luY2hyb25pemF0aW9uLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBvbkluc3VmZmljaWVudFJlYWQoKSB7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50MzJfdCAgIG1SZXNldENvdW50ID0gMDsKLQotcHJpdmF0ZToKLSAgICBpbnQzMl90IG1TYW1wbGVSYXRlID0ga0RlZmF1bHRTYW1wbGVSYXRlOwotICAgIGludDMyX3QgbVJlc3VsdCA9IDA7Ci19OwotCi1jbGFzcyBMYXRlbmN5QW5hbHl6ZXIgOiBwdWJsaWMgTG9vcGJhY2tQcm9jZXNzb3IgewotcHVibGljOgotCi0gICAgTGF0ZW5jeUFuYWx5emVyKCkgOiBMb29wYmFja1Byb2Nlc3NvcigpIHt9Ci0gICAgdmlydHVhbCB+TGF0ZW5jeUFuYWx5emVyKCkgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCBpbnQzMl90IGdldFByb2dyZXNzKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBpbnQgZ2V0U3RhdGUoKSA9IDA7Ci0KLSAgICAvLyBAcmV0dXJuIGxhdGVuY3kgaW4gZnJhbWVzCi0gICAgdmlydHVhbCBpbnQzMl90IGdldE1lYXN1cmVkTGF0ZW5jeSgpID0gMDsKLQotICAgIHZpcnR1YWwgZG91YmxlIGdldE1lYXN1cmVkQ29uZmlkZW5jZSgpID0gMDsKLQotICAgIHZpcnR1YWwgZG91YmxlIGdldEJhY2tncm91bmRSTVMoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGRvdWJsZSBnZXRTaWduYWxSTVMoKSA9IDA7Ci0KLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLyoqCi0gKiBNZWFzdXJlIGxhdGVuY3kgZ2l2ZW4gYSBsb29wYmFjayBzdHJlYW0gZGF0YS4KLSAqIFVzZSBhbiBlbmNvZGVkIGJpdCB0cmFpbiBhcyB0aGUgc291bmQgc291cmNlIGJlY2F1c2UgaXQKLSAqIGhhcyBhbiB1bmFtYmlndW91cyBjb3JyZWxhdGlvbiB2YWx1ZS4KLSAqIFVzZXMgYSBzdGF0ZSBtYWNoaW5lIHRvIGN5Y2xlIHRocm91Z2ggdmFyaW91cyBzdGFnZXMuCi0gKgotICovCi1jbGFzcyBQdWxzZUxhdGVuY3lBbmFseXplciA6IHB1YmxpYyBMYXRlbmN5QW5hbHl6ZXIgewotcHVibGljOgotCi0gICAgUHVsc2VMYXRlbmN5QW5hbHl6ZXIoKSA6IExhdGVuY3lBbmFseXplcigpIHsKLSAgICAgICAgaW50MzJfdCBtYXhMYXRlbmN5RnJhbWVzID0gZ2V0U2FtcGxlUmF0ZSgpICoga01heExhdGVuY3lNaWxsaXMgLyBrTWlsbGlzUGVyU2Vjb25kOwotICAgICAgICBpbnQzMl90IG51bVB1bHNlQml0cyA9IGdldFNhbXBsZVJhdGUoKSAqIGtQdWxzZUxlbmd0aE1pbGxpcwotICAgICAgICAgICAgICAgIC8gKGtGcmFtZXNQZXJFbmNvZGVkQml0ICoga01pbGxpc1BlclNlY29uZCk7Ci0gICAgICAgIGludDMyX3QgIHB1bHNlTGVuZ3RoID0gbnVtUHVsc2VCaXRzICoga0ZyYW1lc1BlckVuY29kZWRCaXQ7Ci0gICAgICAgIG1GcmFtZXNUb1JlY29yZCA9IHB1bHNlTGVuZ3RoICsgbWF4TGF0ZW5jeUZyYW1lczsKLSAgICAgICAgbUF1ZGlvUmVjb3JkaW5nLmFsbG9jYXRlKG1GcmFtZXNUb1JlY29yZCk7Ci0gICAgICAgIG1BdWRpb1JlY29yZGluZy5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgIGdlbmVyYXRlUmFuZG9tUHVsc2UocHVsc2VMZW5ndGgpOwotICAgIH0KLQotICAgIHZvaWQgZ2VuZXJhdGVSYW5kb21QdWxzZShpbnQzMl90IHB1bHNlTGVuZ3RoKSB7Ci0gICAgICAgIG1QdWxzZS5hbGxvY2F0ZShwdWxzZUxlbmd0aCk7Ci0gICAgICAgIFJhbmRvbVB1bHNlR2VuZXJhdG9yIHB1bHNlcihrRnJhbWVzUGVyRW5jb2RlZEJpdCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVsc2VMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbVB1bHNlLndyaXRlKHB1bHNlci5uZXh0RmxvYXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgZ2V0U3RhdGUoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRTYW1wbGVSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSkgb3ZlcnJpZGUgewotICAgICAgICBMb29wYmFja1Byb2Nlc3Nvcjo6c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKLSAgICAgICAgbUF1ZGlvUmVjb3JkaW5nLnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKLSAgICAgICAgTG9vcGJhY2tQcm9jZXNzb3I6OnJlc2V0KCk7Ci0gICAgICAgIG1Eb3duQ291bnRlciA9IGdldFNhbXBsZVJhdGUoKSAvIDI7Ci0gICAgICAgIG1Mb29wQ291bnRlciA9IDA7Ci0KLSAgICAgICAgbVB1bHNlQ3Vyc29yID0gMDsKLSAgICAgICAgbUJhY2tncm91bmRTdW1TcXVhcmUgPSAwLjBmOwotICAgICAgICBtQmFja2dyb3VuZFN1bUNvdW50ID0gMDsKLSAgICAgICAgbUJhY2tncm91bmRSTVMgPSAwLjBmOwotICAgICAgICBtU2lnbmFsUk1TID0gMC4wZjsKLQotICAgICAgICBtU3RhdGUgPSBTVEFURV9NRUFTVVJFX0JBQ0tHUk9VTkQ7Ci0gICAgICAgIG1BdWRpb1JlY29yZGluZy5jbGVhcigpOwotICAgICAgICBtTGF0ZW5jeVJlcG9ydC5yZXNldCgpOwotICAgIH0KLQotICAgIGJvb2wgaGFzRW5vdWdoRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1BdWRpb1JlY29yZGluZy5pc0Z1bGwoKTsKLSAgICB9Ci0KLSAgICBib29sIGlzRG9uZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9ET05FOwotICAgIH0KLQotICAgIGludDMyX3QgZ2V0UHJvZ3Jlc3MoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9SZWNvcmRpbmcuc2l6ZSgpOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGFuYWx5emUoKSBvdmVycmlkZSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlcG9ydDsKLSAgICAgICAgcmVwb3J0IDw8ICJQdWxzZUxhdGVuY3lBbmFseXplciAtLS0tLS0tLS0tLS0tLS1cbiI7Ci0gICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJ0ZXN0LnN0YXRlICAgICAgICAgICAgID0gIgotICAgICAgICAgICAgICAgIDw8IHN0ZDo6c2V0dyg4KSA8PCBtU3RhdGUgPDwgIlxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgInRlc3Quc3RhdGUubmFtZSAgICAgICAgPSAiCi0gICAgICAgICAgICAgICAgPDwgY29udmVydFN0YXRlVG9UZXh0KG1TdGF0ZSkgPDwgIlxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgImJhY2tncm91bmQucm1zICAgICAgICAgPSAiCi0gICAgICAgICAgICAgICAgPDwgc3RkOjpzZXR3KDgpIDw8IG1CYWNrZ3JvdW5kUk1TIDw8ICJcbiI7Ci0KLSAgICAgICAgaW50MzJfdCBuZXdSZXN1bHQgPSBSRVNVTFRfT0s7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfR09UX0RBVEEpIHsKLSAgICAgICAgICAgIHJlcG9ydCA8PCAiV0FSTklORyAtIEJhZCBzdGF0ZS4gQ2hlY2sgdm9sdW1lIG9uIGRldmljZS5cbiI7Ci0gICAgICAgICAgICAvLyBzZXRSZXN1bHQoRVJST1JfSU5WQUxJRF9TVEFURSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbG9hdCBnYWluID0gbUF1ZGlvUmVjb3JkaW5nLm5vcm1hbGl6ZSgxLjBmKTsKLSAgICAgICAgICAgIG1lYXN1cmVMYXRlbmN5RnJvbVB1bHNlKG1BdWRpb1JlY29yZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QdWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGF0ZW5jeVJlcG9ydCk7Ci0KLSAgICAgICAgICAgIGlmIChtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlIDwga01pbmltdW1Db25maWRlbmNlKSB7Ci0gICAgICAgICAgICAgICAgcmVwb3J0IDw8ICIgICBFUlJPUiAtIGNvbmZpZGVuY2UgdG9vIGxvdyEiOwotICAgICAgICAgICAgICAgIG5ld1Jlc3VsdCA9IEVSUk9SX0NPTkZJREVOQ0U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TaWduYWxSTVMgPSBjYWxjdWxhdGVSb290TWVhblNxdWFyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICZtQXVkaW9SZWNvcmRpbmcuZ2V0RGF0YSgpW21MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lc10sIG1QdWxzZS5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gZ2FpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5TWlsbGlzID0ga01pbGxpc1BlclNlY29uZCAqIChkb3VibGUpIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5LmZyYW1lcyAgICAgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgICAgICA8PCBtTGF0ZW5jeVJlcG9ydC5sYXRlbmN5SW5GcmFtZXMgPDwgIlxuIjsKLSAgICAgICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5Lm1zZWMgICAgICAgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgICAgICA8PCBsYXRlbmN5TWlsbGlzIDw8ICJcbiI7Ci0gICAgICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5jb25maWRlbmNlICAgICA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICAgICAgPDwgbUxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSA8PCAiXG4iOwotICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0RPTkU7Ci0gICAgICAgIGlmIChnZXRSZXN1bHQoKSA9PSBSRVNVTFRfT0spIHsKLSAgICAgICAgICAgIHNldFJlc3VsdChuZXdSZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlcG9ydC5zdHIoKTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdldE1lYXN1cmVkTGF0ZW5jeSgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lczsKLSAgICB9Ci0KLSAgICBkb3VibGUgZ2V0TWVhc3VyZWRDb25maWRlbmNlKCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbUxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZTsKLSAgICB9Ci0KLSAgICBkb3VibGUgZ2V0QmFja2dyb3VuZFJNUygpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1CYWNrZ3JvdW5kUk1TOwotICAgIH0KLQotICAgIGRvdWJsZSBnZXRTaWduYWxSTVMoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU2lnbmFsUk1TOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRTdGF0dXMoKSBvdmVycmlkZSB7Ci0gICAgICAgIEFMT0dEKCJzdCA9ICVkIiwgbVN0YXRlKTsKLSAgICB9Ci0KLSAgICByZXN1bHRfY29kZSBwcm9jZXNzSW5wdXRGcmFtZShmbG9hdCAqZnJhbWVEYXRhLCBpbnQgY2hhbm5lbENvdW50KSBvdmVycmlkZSB7Ci0gICAgICAgIGVjaG9fc3RhdGUgbmV4dFN0YXRlID0gbVN0YXRlOwotICAgICAgICBtTG9vcENvdW50ZXIrKzsKLQotICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFURV9NRUFTVVJFX0JBQ0tHUk9VTkQ6Ci0gICAgICAgICAgICAgICAgLy8gTWVhc3VyZSBiYWNrZ3JvdW5kIFJNUyBvbiBjaGFubmVsIDAKLSAgICAgICAgICAgICAgICBtQmFja2dyb3VuZFN1bVNxdWFyZSArPSBmcmFtZURhdGFbMF0gKiBmcmFtZURhdGFbMF07Ci0gICAgICAgICAgICAgICAgbUJhY2tncm91bmRTdW1Db3VudCsrOwotICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlci0tOwotICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXIgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQmFja2dyb3VuZFJNUyA9IHNxcnRmKG1CYWNrZ3JvdW5kU3VtU3F1YXJlIC8gbUJhY2tncm91bmRTdW1Db3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX0lOX1BVTFNFOwotICAgICAgICAgICAgICAgICAgICBtUHVsc2VDdXJzb3IgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVEFURV9JTl9QVUxTRToKLSAgICAgICAgICAgICAgICAvLyBSZWNvcmQgaW5wdXQgdW50aWwgdGhlIG1BdWRpb1JlY29yZGluZyBpcyBmdWxsLgotICAgICAgICAgICAgICAgIG1BdWRpb1JlY29yZGluZy53cml0ZShmcmFtZURhdGEsIGNoYW5uZWxDb3VudCwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc0Vub3VnaERhdGEoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSBTVEFURV9HT1RfREFUQTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU1RBVEVfR09UX0RBVEE6Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0RPTkU6Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXRlID0gbmV4dFN0YXRlOwotICAgICAgICByZXR1cm4gUkVTVUxUX09LOwotICAgIH0KLQotICAgIHJlc3VsdF9jb2RlIHByb2Nlc3NPdXRwdXRGcmFtZShmbG9hdCAqZnJhbWVEYXRhLCBpbnQgY2hhbm5lbENvdW50KSBvdmVycmlkZSB7Ci0gICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0lOX1BVTFNFOgotICAgICAgICAgICAgICAgIGlmIChtUHVsc2VDdXJzb3IgPCBtUHVsc2Uuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHB1bHNlU2FtcGxlID0gbVB1bHNlLmdldERhdGEoKVttUHVsc2VDdXJzb3IrK107Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGF0YVtpXSA9IHB1bHNlU2FtcGxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEYXRhW2ldID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVEFURV9NRUFTVVJFX0JBQ0tHUk9VTkQ6Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0dPVF9EQVRBOgotICAgICAgICAgICAgY2FzZSBTVEFURV9ET05FOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1lRGF0YVtpXSA9IDAuMGY7IC8vIHNpbGVuY2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gUkVTVUxUX09LOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIGVudW0gZWNob19zdGF0ZSB7Ci0gICAgICAgIFNUQVRFX01FQVNVUkVfQkFDS0dST1VORCwKLSAgICAgICAgU1RBVEVfSU5fUFVMU0UsCi0gICAgICAgIFNUQVRFX0dPVF9EQVRBLCAvLyBtdXN0IG1hdGNoIFJvdW5kVHJpcExhdGVuY3lBY3Rpdml0eS5qYXZhCi0gICAgICAgIFNUQVRFX0RPTkUsCi0gICAgfTsKLQotICAgIGNvbnN0IGNoYXIgKmNvbnZlcnRTdGF0ZVRvVGV4dChlY2hvX3N0YXRlIHN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfTUVBU1VSRV9CQUNLR1JPVU5EOgotICAgICAgICAgICAgICAgIHJldHVybiAiSU5JVCI7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0lOX1BVTFNFOgotICAgICAgICAgICAgICAgIHJldHVybiAiUFVMU0UiOwotICAgICAgICAgICAgY2FzZSBTVEFURV9HT1RfREFUQToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkdPVF9EQVRBIjsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfRE9ORToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkRPTkUiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiVU5LTk9XTiI7Ci0gICAgfQotCi0gICAgaW50MzJfdCAgICAgICAgIG1Eb3duQ291bnRlciA9IDUwMDsKLSAgICBpbnQzMl90ICAgICAgICAgbUxvb3BDb3VudGVyID0gMDsKLSAgICBlY2hvX3N0YXRlICAgICAgbVN0YXRlID0gU1RBVEVfTUVBU1VSRV9CQUNLR1JPVU5EOwotCi0gICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtGcmFtZXNQZXJFbmNvZGVkQml0ID0gODsgLy8gbXVsdGlwbGUgb2YgMgotICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrUHVsc2VMZW5ndGhNaWxsaXMgPSA1MDA7Ci0KLSAgICBBdWRpb1JlY29yZGluZyAgICAgbVB1bHNlOwotICAgIGludDMyX3QgICAgICAgICAgICBtUHVsc2VDdXJzb3IgPSAwOwotCi0gICAgZG91YmxlICAgICAgICAgICAgIG1CYWNrZ3JvdW5kU3VtU3F1YXJlID0gMC4wOwotICAgIGludDMyX3QgICAgICAgICAgICBtQmFja2dyb3VuZFN1bUNvdW50ID0gMDsKLSAgICBkb3VibGUgICAgICAgICAgICAgbUJhY2tncm91bmRSTVMgPSAwLjA7Ci0gICAgZG91YmxlICAgICAgICAgICAgIG1TaWduYWxSTVMgPSAwLjA7Ci0gICAgaW50MzJfdCAgICAgICAgICAgIG1GcmFtZXNUb1JlY29yZCA9IDA7Ci0KLSAgICBBdWRpb1JlY29yZGluZyAgICAgbUF1ZGlvUmVjb3JkaW5nOyAvLyBjb250YWlucyBvbmx5IHRoZSBpbnB1dCBhZnRlciBzdGFydGluZyB0aGUgcHVsc2UKLSAgICBMYXRlbmN5UmVwb3J0ICAgICAgbUxhdGVuY3lSZXBvcnQ7Ci19OwotCi0jZW5kaWYgLy8gQU5BTFlaRVJfTEFURU5DWV9BTkFMWVpFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL01hbmNoZXN0ZXJFbmNvZGVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL01hbmNoZXN0ZXJFbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNGJkNWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9NYW5jaGVzdGVyRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFOQUxZWkVSX01BTkNIRVNURVJfRU5DT0RFUl9ICi0jZGVmaW5lIEFOQUxZWkVSX01BTkNIRVNURVJfRU5DT0RFUl9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0vKioKLSAqIEVuY29kZSBieXRlcyB1c2luZyBNYW5jaGVzdGVyIENvZGluZyBzY2hlbWUuCi0gKgotICogTWFuY2hlc3RlciBDb2RlIGlzIHNlbGYgY2xvY2tpbmcuCi0gKiBUaGVyZSBpcyBhIHRyYW5zaXRpb24gaW4gdGhlIG1pZGRsZSBvZiBldmVyeSBiaXQuCi0gKiBaZXJvIGlzIGhpZ2ggdGhlbiBsb3cuCi0gKiBPbmUgaXMgbG93IHRoZW4gaGlnaC4KLSAqCi0gKiBUaGlzIGF2b2lkcyBoYXZpbmcgbG9uZyBEQyBzZWN0aW9ucyB0aGF0IHdvdWxkIGRyb29wIHdoZW4KLSAqIHBhc3NlZCB0aG91Z2ggYW5hbG9nIGNpcmN1aXRzIHdpdGggQUMgY291cGxpbmcuCi0gKgotICogSUVFRSA4MDIuMyBjb21wYXRpYmxlLgotICovCi0KLWNsYXNzIE1hbmNoZXN0ZXJFbmNvZGVyIHsKLXB1YmxpYzoKLSAgICBNYW5jaGVzdGVyRW5jb2RlcihpbnQgc2FtcGxlc1BlclB1bHNlKQotICAgICAgICAgICAgOiBtU2FtcGxlc1BlclB1bHNlKHNhbXBsZXNQZXJQdWxzZSkKLSAgICAgICAgICAgICwgbVNhbXBsZXNQZXJQdWxzZUhhbGYoc2FtcGxlc1BlclB1bHNlIC8gMikKLSAgICAgICAgICAgICwgbUN1cnNvcihzYW1wbGVzUGVyUHVsc2UpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5NYW5jaGVzdGVyRW5jb2RlcigpID0gZGVmYXVsdDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbmV4dCBieXRlIGlzIG5lZWRlZC4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgdmlydHVhbCB1aW50OF90IG9uTmV4dEJ5dGUoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSB0aGUgbmV4dCBmbG9hdGluZyBwb2ludCBzYW1wbGUuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHZpcnR1YWwgZmxvYXQgbmV4dEZsb2F0KCkgewotICAgICAgICBhZHZhbmNlU2FtcGxlKCk7Ci0gICAgICAgIGlmIChtQ3VycmVudEJpdCkgewotICAgICAgICAgICAgcmV0dXJuIChtQ3Vyc29yIDwgbVNhbXBsZXNQZXJQdWxzZUhhbGYpID8gLTEuMGYgOiAxLjBmOyAvLyBvbmUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobUN1cnNvciA8IG1TYW1wbGVzUGVyUHVsc2VIYWxmKSA/IDEuMGYgOiAtMS4wZjsgLy8gemVybwotICAgICAgICB9Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgbmV3IGJpdCBpcyByZWFkeSB0byBiZSBlbmNvZGVkLgotICAgICAqIEl0IGNhbiBiZSB1c2VkIHRvIHByZXBhcmUgdGhlIGVuY29kZWQgc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gY3VycmVudAotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBvbk5leHRCaXQoYm9vbCAvKiBjdXJyZW50ICovKSB7fTsKLQotICAgIHZvaWQgYWR2YW5jZVNhbXBsZSgpIHsKLSAgICAgICAgLy8gQXJlIHdlIHJlYWR5IGZvciBhIG5ldyBiaXQ/Ci0gICAgICAgIGlmICgrK21DdXJzb3IgPj0gbVNhbXBsZXNQZXJQdWxzZSkgewotICAgICAgICAgICAgbUN1cnNvciA9IDA7Ci0gICAgICAgICAgICBpZiAobUJpdHNMZWZ0ID09IDApIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEJ5dGUgPSBvbk5leHRCeXRlKCk7Ci0gICAgICAgICAgICAgICAgbUJpdHNMZWZ0ID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC0tbUJpdHNMZWZ0OwotICAgICAgICAgICAgbUN1cnJlbnRCaXQgPSAobUN1cnJlbnRCeXRlID4+IG1CaXRzTGVmdCkgJiAxOwotICAgICAgICAgICAgb25OZXh0Qml0KG1DdXJyZW50Qml0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgZ2V0Q3VycmVudEJpdCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50Qml0OwotICAgIH0KLQotICAgIGNvbnN0IGludCBtU2FtcGxlc1BlclB1bHNlOwotICAgIGNvbnN0IGludCBtU2FtcGxlc1BlclB1bHNlSGFsZjsKLSAgICBpbnQgICAgICAgbUN1cnNvcjsKLSAgICBpbnQgICAgICAgbUJpdHNMZWZ0ID0gMDsKLSAgICB1aW50OF90ICAgbUN1cnJlbnRCeXRlID0gMDsKLSAgICBib29sICAgICAgbUN1cnJlbnRCaXQgPSBmYWxzZTsKLX07Ci0jZW5kaWYgLy9BTkFMWVpFUl9NQU5DSEVTVEVSX0VOQ09ERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9QZWFrRGV0ZWN0b3IuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUGVha0RldGVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2I0ZTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9QZWFrRGV0ZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5BTFlaRVJfUEVBS19ERVRFQ1RPUl9ICi0jZGVmaW5lIEFOQUxZWkVSX1BFQUtfREVURUNUT1JfSAotCi0jaW5jbHVkZSA8bWF0aC5oPgotCi0vKioKLSAqIE1lYXN1cmUgYSBwZWFrIGVudmVsb3BlIGJ5IHJpc2luZyB3aXRoIHRoZSBwZWFrcywKLSAqIGFuZCBkZWNheWluZyBleHBvbmVudGlhbGx5IGFmdGVyIGVhY2ggcGVhay4KLSAqIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc2lnbmFsIGlzIHVzZWQuCi0gKi8KLWNsYXNzIFBlYWtEZXRlY3RvciB7Ci1wdWJsaWM6Ci0KLSAgICB2b2lkIHJlc2V0KCkgewotICAgICAgICBtTGV2ZWwgPSAwLjA7Ci0gICAgfQotCi0gICAgZG91YmxlIHByb2Nlc3MoZG91YmxlIGlucHV0KSB7Ci0gICAgICAgIG1MZXZlbCAqPSBtRGVjYXk7IC8vIGV4cG9uZW50aWFsIGRlY2F5Ci0gICAgICAgIGlucHV0ID0gZmFicyhpbnB1dCk7Ci0gICAgICAgIC8vIG5ldmVyIGZhbGwgYmVsb3cgdGhlIGlucHV0IHNpZ25hbAotICAgICAgICBpZiAoaW5wdXQgPiBtTGV2ZWwpIHsKLSAgICAgICAgICAgIG1MZXZlbCA9IGlucHV0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTGV2ZWw7Ci0gICAgfQotCi0gICAgZG91YmxlIGdldExldmVsKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUxldmVsOwotICAgIH0KLQotICAgIGRvdWJsZSBnZXREZWNheSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1EZWNheTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdWx0aXBseSB0aGUgbGV2ZWwgYnkgdGhpcyBhbW91bnQgb24gZXZlcnkgaXRlcmF0aW9uLgotICAgICAqIFRoaXMgcHJvdmlkZXMgYW4gZXhwb25lbnRpYWwgZGVjYXkgY3VydmUuCi0gICAgICogQSB2YWx1ZSBqdXN0IHVuZGVyIDEuMCBpcyBiZXN0LCBmb3IgZXhhbXBsZSwgMC45OTsKLSAgICAgKiBAcGFyYW0gZGVjYXkgc2NhbGUgbGV2ZWwgZm9yIGVhY2ggaW5wdXQKLSAgICAgKi8KLSAgICB2b2lkIHNldERlY2F5KGRvdWJsZSBkZWNheSkgewotICAgICAgICBtRGVjYXkgPSBkZWNheTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHREZWNheSA9IDAuOTlmOwotCi0gICAgZG91YmxlIG1MZXZlbCA9IDAuMDsKLSAgICBkb3VibGUgbURlY2F5ID0ga0RlZmF1bHREZWNheTsKLX07Ci0jZW5kaWYgLy9BTkFMWVpFUl9QRUFLX0RFVEVDVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUHNldWRvUmFuZG9tLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL1BzZXVkb1JhbmRvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQ5MzhjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUHNldWRvUmFuZG9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFOQUxZWkVSX1BTRVVET1JBTkRPTV9ICi0jZGVmaW5lIEFOQUxZWkVSX1BTRVVET1JBTkRPTV9ICi0KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLWNsYXNzIFBzZXVkb1JhbmRvbSB7Ci1wdWJsaWM6Ci0gICAgUHNldWRvUmFuZG9tKGludDY0X3Qgc2VlZCA9IDk5ODg3NzY2KQotICAgICAgICAgICAgOiAgICBtU2VlZChzZWVkKQotICAgIHt9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHJhbmRvbSBkb3VibGUgZnJvbSAtMS4wIHRvIDEuMAotICAgICAqCi0gICAgICogQHJldHVybiB2YWx1ZSBmcm9tIC0xLjAgdG8gMS4wCi0gICAgICovCi0gICAgZG91YmxlIG5leHRSYW5kb21Eb3VibGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXh0UmFuZG9tSW50ZWdlcigpICogKDAuNSAvICgoKGludDMyX3QpMSkgPDwgMzApKTsKLSAgICB9Ci0KLSAgICAvKiogQ2FsY3VsYXRlIHJhbmRvbSAzMiBiaXQgbnVtYmVyIHVzaW5nIGxpbmVhci1jb25ncnVlbnRpYWwgbWV0aG9kCi0gICAgICogd2l0aCBrbm93biByZWFsLXRpbWUgcGVyZm9ybWFuY2UuCi0gICAgICovCi0gICAgaW50MzJfdCBuZXh0UmFuZG9tSW50ZWdlcigpIHsKLSNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cpICYmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX2FkZF9vdmVyZmxvdykKLSAgICAgICAgaW50NjRfdCBwcm9kOwotICAgICAgICAvLyBVc2UgdmFsdWVzIGZvciA2NC1iaXQgc2VxdWVuY2UgZnJvbSBNTUlYIGJ5IERvbmFsZCBLbnV0aC4KLSAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtU2VlZCwgKGludDY0X3QpNjM2NDEzNjIyMzg0Njc5MzAwNSwgJnByb2QpOwotICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHByb2QsIChpbnQ2NF90KTE0NDI2OTUwNDA4ODg5NjM0MDcsICZtU2VlZCk7Ci0jZWxzZQotICAgICAgICBtU2VlZCA9IChtU2VlZCAqIChpbnQ2NF90KTYzNjQxMzYyMjM4NDY3OTMwMDUpICsgKGludDY0X3QpMTQ0MjY5NTA0MDg4ODk2MzQwNzsKLSNlbmRpZgotICAgICAgICByZXR1cm4gKGludDMyX3QpIChtU2VlZCA+PiAzMik7IC8vIFRoZSBoaWdoZXIgYml0cyBoYXZlIGEgbG9uZ2VyIHNlcXVlbmNlLgotICAgIH0KLQotcHJpdmF0ZToKLSAgICBpbnQ2NF90IG1TZWVkOwotfTsKLQotI2VuZGlmIC8vQU5BTFlaRVJfUFNFVURPUkFORE9NX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUmFuZG9tUHVsc2VHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUmFuZG9tUHVsc2VHZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMDUwYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL1JhbmRvbVB1bHNlR2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFOQUxZWkVSX1JBTkRPTV9QVUxTRV9HRU5FUkFUT1JfSAotI2RlZmluZSBBTkFMWVpFUl9SQU5ET01fUFVMU0VfR0VORVJBVE9SX0gKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgIlJvdW5kZWRNYW5jaGVzdGVyRW5jb2Rlci5oIgotCi0vKioKLSAqIEVuY29kZSByYW5kb20gb25lcyBhbmQgemVyb3MgdXNpbmcgTWFuY2hlc3RlciBDb2RlIHBlciBJRUVFIDgwMi4zLgotICovCi1jbGFzcyBSYW5kb21QdWxzZUdlbmVyYXRvciA6IHB1YmxpYyBSb3VuZGVkTWFuY2hlc3RlckVuY29kZXIgewotcHVibGljOgotICAgIFJhbmRvbVB1bHNlR2VuZXJhdG9yKGludCBzYW1wbGVzUGVyUHVsc2UpCi0gICAgOiBSb3VuZGVkTWFuY2hlc3RlckVuY29kZXIoc2FtcGxlc1BlclB1bHNlKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+UmFuZG9tUHVsc2VHZW5lcmF0b3IoKSA9IGRlZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG5leHQgYnl0ZSBpcyBuZWVkZWQuCi0gICAgICogQHJldHVybiByYW5kb20gYnl0ZQotICAgICAqLwotICAgIHVpbnQ4X3Qgb25OZXh0Qnl0ZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJhbmQoKSk7Ci0gICAgfQotfTsKLQotI2VuZGlmIC8vQU5BTFlaRVJfUkFORE9NX1BVTFNFX0dFTkVSQVRPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL1JvdW5kZWRNYW5jaGVzdGVyRW5jb2Rlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9Sb3VuZGVkTWFuY2hlc3RlckVuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlYmE4NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL1JvdW5kZWRNYW5jaGVzdGVyRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFOQUxZWkVSX1JPVU5ERURfTUFOQ0hFU1RFUl9FTkNPREVSX0gKLSNkZWZpbmUgQU5BTFlaRVJfUk9VTkRFRF9NQU5DSEVTVEVSX0VOQ09ERVJfSAotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgIk1hbmNoZXN0ZXJFbmNvZGVyLmgiCi0KLS8qKgotICogRW5jb2RlIGJ5dGVzIHVzaW5nIE1hbmNoZXN0ZXIgQ29kZS4KLSAqIFJvdW5kIHRoZSBlZGdlcyB1c2luZyBhIGhhbGYgY29zaW5lIHRvIHJlZHVjZSByaW5naW5nIGNhdXNlZCBieSBhIGhhcmQgZWRnZS4KLSAqLwotCi1jbGFzcyBSb3VuZGVkTWFuY2hlc3RlckVuY29kZXIgOiBwdWJsaWMgTWFuY2hlc3RlckVuY29kZXIgewotcHVibGljOgotICAgIFJvdW5kZWRNYW5jaGVzdGVyRW5jb2RlcihpbnQgc2FtcGxlc1BlclB1bHNlKQotICAgICAgICAgICAgOiBNYW5jaGVzdGVyRW5jb2RlcihzYW1wbGVzUGVyUHVsc2UpIHsKLSAgICAgICAgaW50IHJhbXBTaXplID0gc2FtcGxlc1BlclB1bHNlIC8gNDsKLSAgICAgICAgbVplcm9BZnRlclplcm8gPSBzdGQ6Om1ha2VfdW5pcXVlPGZsb2F0W10+KHNhbXBsZXNQZXJQdWxzZSk7Ci0gICAgICAgIG1aZXJvQWZ0ZXJPbmUgPSBzdGQ6Om1ha2VfdW5pcXVlPGZsb2F0W10+KHNhbXBsZXNQZXJQdWxzZSk7Ci0KLSAgICAgICAgaW50IHNhbXBsZUluZGV4ID0gMDsKLSAgICAgICAgZm9yIChpbnQgcmFtcEluZGV4ID0gMDsgcmFtcEluZGV4IDwgcmFtcFNpemU7IHJhbXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBwaGFzZSA9IChyYW1wSW5kZXggKyAxKSAqIE1fUEkgLyByYW1wU2l6ZTsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9IC1jb3NmKHBoYXNlKTsKLSAgICAgICAgICAgIG1aZXJvQWZ0ZXJaZXJvW3NhbXBsZUluZGV4XSA9IHNhbXBsZTsKLSAgICAgICAgICAgIG1aZXJvQWZ0ZXJPbmVbc2FtcGxlSW5kZXhdID0gMS4wZjsKLSAgICAgICAgICAgIHNhbXBsZUluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgcmFtcEluZGV4ID0gMDsgcmFtcEluZGV4IDwgcmFtcFNpemU7IHJhbXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBtWmVyb0FmdGVyWmVyb1tzYW1wbGVJbmRleF0gPSAxLjBmOwotICAgICAgICAgICAgbVplcm9BZnRlck9uZVtzYW1wbGVJbmRleF0gPSAxLjBmOwotICAgICAgICAgICAgc2FtcGxlSW5kZXgrKzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByYW1wSW5kZXggPSAwOyByYW1wSW5kZXggPCByYW1wU2l6ZTsgcmFtcEluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHBoYXNlID0gKHJhbXBJbmRleCArIDEpICogTV9QSSAvIHJhbXBTaXplOwotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gY29zZihwaGFzZSk7Ci0gICAgICAgICAgICBtWmVyb0FmdGVyWmVyb1tzYW1wbGVJbmRleF0gPSBzYW1wbGU7Ci0gICAgICAgICAgICBtWmVyb0FmdGVyT25lW3NhbXBsZUluZGV4XSA9IHNhbXBsZTsKLSAgICAgICAgICAgIHNhbXBsZUluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgcmFtcEluZGV4ID0gMDsgcmFtcEluZGV4IDwgcmFtcFNpemU7IHJhbXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBtWmVyb0FmdGVyWmVyb1tzYW1wbGVJbmRleF0gPSAtMS4wZjsKLSAgICAgICAgICAgIG1aZXJvQWZ0ZXJPbmVbc2FtcGxlSW5kZXhdID0gLTEuMGY7Ci0gICAgICAgICAgICBzYW1wbGVJbmRleCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbk5leHRCaXQoYm9vbCBjdXJyZW50KSBvdmVycmlkZSB7Ci0gICAgICAgIC8vIERvIHdlIG5lZWQgdG8gdXNlIHRoZSByb3VuZGVkIGVkZ2U/Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlcyA9IChjdXJyZW50IF4gbVByZXZpb3VzQml0KQotICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1aZXJvQWZ0ZXJPbmUuZ2V0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWmVyb0FmdGVyWmVyby5nZXQoKTsKLSAgICAgICAgbVByZXZpb3VzQml0ID0gY3VycmVudDsKLSAgICB9Ci0KLSAgICBmbG9hdCBuZXh0RmxvYXQoKSBvdmVycmlkZSB7Ci0gICAgICAgIGFkdmFuY2VTYW1wbGUoKTsKLSAgICAgICAgZmxvYXQgb3V0cHV0ID0gbUN1cnJlbnRTYW1wbGVzW21DdXJzb3JdOwotICAgICAgICBpZiAoZ2V0Q3VycmVudEJpdCgpKSBvdXRwdXQgPSAtb3V0cHV0OwotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIGJvb2wgbVByZXZpb3VzQml0ID0gZmFsc2U7Ci0gICAgZmxvYXQgKm1DdXJyZW50U2FtcGxlcyA9IG51bGxwdHI7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IG1aZXJvQWZ0ZXJaZXJvOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiBtWmVyb0FmdGVyT25lOwotfTsKLQotI2VuZGlmIC8vQU5BTFlaRVJfUk9VTkRFRF9NQU5DSEVTVEVSX0VOQ09ERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAppbmRleCAwZDJlYzcwLi42ZmZmNTY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcApAQCAtMzYsOCArMzYsMTIgQEAKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVSZWNvcmRlci5oIgogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogCisvLyBHZXQgbG9nZ2luZyBtYWNyb3MgZnJvbSBPYm9lVGVzdGVyCisjaW5jbHVkZSAiYW5kcm9pZF9kZWJ1Zy5oIgorLy8gR2V0IHNpZ25hbCBhbmFseXplcnMgZnJvbSBPYm9lVGVzdGVyCiAjaW5jbHVkZSAiYW5hbHl6ZXIvR2xpdGNoQW5hbHl6ZXIuaCIKICNpbmNsdWRlICJhbmFseXplci9MYXRlbmN5QW5hbHl6ZXIuaCIKKwogI2luY2x1ZGUgIi4uLy4uL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oIgogCiAvLyBWMC40LjAwID0gcmVjdGlmeSBhbmQgbG93LXBhc3MgZmlsdGVyIHRoZSBlY2hvcywgYXV0by1jb3JyZWxhdGUgZW50aXJlIGVjaG8KQEAgLTQ1LDggKzQ5LDkgQEAKIC8vICAgICAgICAgICBmaXggLW4gb3B0aW9uIHRvIHNldCBvdXRwdXQgYnVmZmVyIGZvciAtdG0KIC8vICAgICAgICAgICBwbG90IGZpcnN0IGdsaXRjaAogLy8gVjAuNC4wMiA9IGFsbG93IC1uMCBmb3IgbWluaW1hbCBidWZmZXIgc2l6ZQotLy8gVjAuNS4wMCA9IHVzZSBsYXRlbmN5IGFuYWx5emVyIGZyb20gT2JvZVRlc3RlciwgdXNlcyByYW5kb20gbm9pc2UgZm9yIGxhdGVuY3kKLSNkZWZpbmUgQVBQX1ZFUlNJT04gICAgICAgICAgICAgIjAuNS4wMCIKKy8vIFYwLjUuMDAgPSB1c2UgbGF0ZW5jeSBhbmFseXplciBjb3BpZWQgZnJvbSBPYm9lVGVzdGVyLCB1c2VzIHJhbmRvbSBub2lzZSBmb3IgbGF0ZW5jeQorLy8gVjAuNS4wMSA9IHVzZSBsYXRlbmN5IGFuYWx5emVyIGRpcmVjdGx5IGZyb20gT2JvZVRlc3RlciBpbiBleHRlcm5hbC9vYm9lCisjZGVmaW5lIEFQUF9WRVJTSU9OICAgICAgICAgICAgICIwLjUuMDEiCiAKIC8vIFRhZyBmb3IgbWFjaGluZSByZWFkYWJsZSByZXN1bHRzIGFzIHByb3BlcnR5ID0gdmFsdWUgcGFpcnMKICNkZWZpbmUgUkVTVUxUX1RBRyAgICAgICAgICAgICAgIlJFU1VMVDogIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKaW5kZXggNGJiYTQzNi4uZTY3MDY0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCkBAIC00MjEsNyArNDIxLDkgQEAKICAgICAgICAgcHJpbnRmKCIgICAgICAtZnswfDF8Mn0gc2V0IGZvcm1hdFxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIDAgPSBVTlNQRUNJRklFRFxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIDEgPSBQQ01fSTE2XG4iKTsKLSAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMiA9IEZMT0FUXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMiA9IFBDTV9GTE9BVFxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIDMgPSBQQ01fSTI0X1BBQ0tFRFxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIDQgPSBQQ01fSTMyXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtaXtpbnB1dFByZXNldH0gZWcuIDUgZm9yIEFBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtbXswfDF8MnwzfSBzZXQgTU1BUCBwb2xpY3lcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICAwID0gX1VOU1BFQ0lGSUVELCB1c2UgYWF1ZGlvLm1tYXBfcG9saWN5IHN5c3RlbSBwcm9wZXJ0eSwgZGVmYXVsdFxuIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgKaW5kZXggNDZiODg5NS4uNTgxOWRmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaApAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBOQU5PU19QRVJfTUlMTElTRUNPTkQgKE5BTk9TX1BFUl9NSUNST1NFQ09ORCAqIDEwMDApCiAjZGVmaW5lIE5BTk9TX1BFUl9TRUNPTkQgICAgICAoTkFOT1NfUEVSX01JTExJU0VDT05EICogMTAwMCkKIAorLy8gVXNlIHRlbXBsYXRlIGZ1bmN0aW9ucyB0byBhdm9pZCB3YXJuaW5nIG9mIHVudXNlZCBzdGF0aWMgZnVuY3Rpb25zLgogdGVtcGxhdGUgPGNsYXNzIFQgPSBhYXVkaW9fc2hhcmluZ19tb2RlX3Q+CiBjb25zdCBjaGFyICpnZXRTaGFyaW5nTW9kZVRleHQoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpIHsKICAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOwpAQCAtNDgsNiArNDksNyBAQAogICAgIHJldHVybiB0ZXh0OwogfQogCit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3Q+CiBjb25zdCBjaGFyICpnZXRQZXJmb3JtYW5jZU1vZGVUZXh0KGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgbW9kZSkgewogICAgIGNvbnN0IGNoYXIgKnRleHQgPSAidW5rbm93biI7CiAgICAgc3dpdGNoIChtb2RlKSB7CkBAIC02Niw2ICs2OCw3IEBACiAgICAgcmV0dXJuIHRleHQ7CiB9CiAKK3RlbXBsYXRlIDxjbGFzcyBUID0gYWF1ZGlvX2RpcmVjdGlvbl90PgogY29uc3QgY2hhciAqZ2V0RGlyZWN0aW9uVGV4dChhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CiAgICAgY29uc3QgY2hhciAqdGV4dCA9ICJ1bmtub3duIjsKICAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewpAQCAtODEsNiArODQsMjkgQEAKICAgICByZXR1cm4gdGV4dDsKIH0KIAordGVtcGxhdGUgPGNsYXNzIFQgPSBhYXVkaW9fZGlyZWN0aW9uX3Q+Citjb25zdGV4cHIgaW50MzJfdCBnZXRCeXRlc1BlclNhbXBsZShhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQ6CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMzI6CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIENQVSBpcyBuYXRpdmUgTGl0dGxlIEVuZGlhbgoraW5saW5lIGJvb2wgaXNOYXRpdmVMaXR0bGVFbmRpYW4oKSB7CisgICAgLy8gSWYgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGRhdGEgd29yZCBpbiBtZW1vcnkgaXMgMSB0aGVuIExpdHRsZSBFbmRpYW4uCisgICAgY29uc3RleHByIHVuaW9uIHsgdW5zaWduZWQgdTsgdW5zaWduZWQgY2hhciBjW3NpemVvZih1bnNpZ25lZCldOyB9IG9uZSA9IHsxfTsKKyAgICByZXR1cm4gb25lLmNbMF0gIT0gMDsKK30KKwogdGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ2NF90Pgogdm9pZCBjb252ZXJ0TmFub3NlY29uZHNUb1RpbWVzcGVjKGludDY0X3QgbmFub3NlY29uZHMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgewogICAgIHRpbWUtPnR2X3NlYyA9IG5hbm9zZWNvbmRzIC8gTkFOT1NfUEVSX1NFQ09ORDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAppbmRleCBmZDFmYzQ1Li43ZGFhYzIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCkBAIC0zNTksMjIgKzM1OSwzOCBAQAogCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KHN0cmVhbSk7CiAKLQotICAgIGludCBudW1BY3RpdmVPc2NpbGF0b3JzID0gKHNhbXBsZXNQZXJGcmFtZSA+IE1BWF9DSEFOTkVMUykgPyBNQVhfQ0hBTk5FTFMgOiBzYW1wbGVzUGVyRnJhbWU7CisgICAgaW50IG51bUFjdGl2ZU9zY2lsbGF0b3JzID0gc3RkOjptaW4oc2FtcGxlc1BlckZyYW1lLCBNQVhfQ0hBTk5FTFMpOwogICAgIHN3aXRjaCAoQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChzdHJlYW0pKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OiB7CiAgICAgICAgICAgICBpbnQxNl90ICphdWRpb0J1ZmZlciA9IChpbnQxNl90ICopIGF1ZGlvRGF0YTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxhdG9yczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc2luZURhdGEtPnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmF1ZGlvQnVmZmVyW2ldLCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZhdWRpb0J1ZmZlcltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG51bUZyYW1lcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOiB7CiAgICAgICAgICAgICBmbG9hdCAqYXVkaW9CdWZmZXIgPSAoZmxvYXQgKikgYXVkaW9EYXRhOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGF0b3JzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzaW5lRGF0YS0+c2luZU9zY2lsbGF0b3JzW2ldLnJlbmRlcigmYXVkaW9CdWZmZXJbaV0sIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgc2luZURhdGEtPnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmF1ZGlvQnVmZmVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRDogeworICAgICAgICAgICAgdWludDhfdCAqYXVkaW9CdWZmZXIgPSAodWludDhfdCAqKSBhdWRpb0RhdGE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsbGF0b3JzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyU2FtcGxlID0gZ2V0Qnl0ZXNQZXJTYW1wbGUoQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRCk7CisgICAgICAgICAgICAgICAgc2luZURhdGEtPnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIyNCgmYXVkaW9CdWZmZXJbaSAqIGJ5dGVzUGVyU2FtcGxlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTMyOiB7CisgICAgICAgICAgICBpbnQzMl90ICphdWRpb0J1ZmZlciA9IChpbnQzMl90ICopIGF1ZGlvRGF0YTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZhdWRpb0J1ZmZlcltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG51bUZyYW1lcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmgKaW5kZXggOWU2ZDQ2ZC4uNjZhMDhmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oCkBAIC00MSwyMCArNDEsNTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGZsb2F0IG5leHQoKSB7CisgICAgICAgIGZsb2F0IHZhbHVlID0gc2luZihtUGhhc2UpICogbUFtcGxpdHVkZTsKKyAgICAgICAgYWR2YW5jZVBoYXNlKCk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKICAgICB2b2lkIHJlbmRlcihpbnQxNl90ICpidWZmZXIsIGludDMyX3QgY2hhbm5lbFN0cmlkZSwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICAgICAgaW50IHNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4XSA9IChpbnQxNl90KSAoSU5UMTZfTUFYICogc2luKG1QaGFzZSkgKiBtQW1wbGl0dWRlKTsKKyAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleF0gPSAoaW50MTZfdCkgKElOVDE2X01BWCAqIG5leHQoKSk7CiAgICAgICAgICAgICBzYW1wbGVJbmRleCArPSBjaGFubmVsU3RyaWRlOwotICAgICAgICAgICAgYWR2YW5jZVBoYXNlKCk7CiAgICAgICAgIH0KICAgICB9CisKICAgICB2b2lkIHJlbmRlcihmbG9hdCAqYnVmZmVyLCBpbnQzMl90IGNoYW5uZWxTdHJpZGUsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGludCBzYW1wbGVJbmRleCA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleF0gPSBzaW4obVBoYXNlKSAqIG1BbXBsaXR1ZGU7CisgICAgICAgICAgICBidWZmZXJbc2FtcGxlSW5kZXhdID0gbmV4dCgpOwogICAgICAgICAgICAgc2FtcGxlSW5kZXggKz0gY2hhbm5lbFN0cmlkZTsKLSAgICAgICAgICAgIGFkdmFuY2VQaGFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZW5kZXIoaW50MzJfdCAqYnVmZmVyLCBpbnQzMl90IGNoYW5uZWxTdHJpZGUsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIGludCBzYW1wbGVJbmRleCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleF0gPSAoaW50MzJfdCkgKElOVDMyX01BWCAqIG5leHQoKSk7CisgICAgICAgICAgICBzYW1wbGVJbmRleCArPSBjaGFubmVsU3RyaWRlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZW5kZXIyNCh1aW50OF90ICpidWZmZXIsIGludDMyX3QgY2hhbm5lbFN0cmlkZSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgaW50IHNhbXBsZUluZGV4ID0gMDsKKyAgICAgICAgY29uc3RleHByIGludDMyX3QgSU5UMjRfTUFYID0gKDEgPDwgMjMpIC0gMTsKKyAgICAgICAgY29uc3RleHByIGludCBieXRlc1BlclNhbXBsZSA9IGdldEJ5dGVzUGVyU2FtcGxlKEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQpOworICAgICAgICBjb25zdCBib29sIGlzTGl0dGxlRW5kaWFuID0gaXNOYXRpdmVMaXR0bGVFbmRpYW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGUgPSAoaW50MzJfdCkgKElOVDI0X01BWCAqIG5leHQoKSk7CisgICAgICAgICAgICB1aW50MzJfdCB1c2FtcGxlID0gKHVpbnQzMl90KSBzYW1wbGU7CisgICAgICAgICAgICBpZiAoaXNMaXR0bGVFbmRpYW4pIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbc2FtcGxlSW5kZXhdID0gdXNhbXBsZTsgLy8gbGl0dGxlIGVuZCBmaXJzdAorICAgICAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleCArIDFdID0gdXNhbXBsZSA+PiA4OworICAgICAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleCArIDJdID0gdXNhbXBsZSA+PiAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4XSA9IHVzYW1wbGUgPj4gMTY7IC8vIGJpZyBlbmQgZmlyc3QKKyAgICAgICAgICAgICAgICBidWZmZXJbc2FtcGxlSW5kZXggKyAxXSA9IHVzYW1wbGUgPj4gODsKKyAgICAgICAgICAgICAgICBidWZmZXJbc2FtcGxlSW5kZXggKyAyXSA9IHVzYW1wbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYW1wbGVJbmRleCArPSBjaGFubmVsU3RyaWRlICogYnl0ZXNQZXJTYW1wbGU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwMCw0ICsxMzQsMyBAQAogfTsKIAogI2VuZGlmIC8qIFNJTkVfR0VORVJBVE9SX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL2R1bW15LmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9kdW1teS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjdlMzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL2R1bW15LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotLyoqCi0gKiBEdW1teSBmaWxlIG5lZWRlZCB0byBnZXQgQW5kcm9pZCBTdHVkaW8gdG8gc2NhbiB0aGlzIGZvbGRlci4KLSAqLwotCi1pbnQgZ19Eb05vdFVzZVRoaXNWYXJpYWJsZSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvdW51c2VkLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy91bnVzZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTIwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvdW51c2VkLmNwcApAQCAtMCwwICsxLDUgQEAKKy8qKgorICogVW51c2VkIGZpbGUgcmVxdWlyZWQgdG8gZ2V0IEFuZHJvaWQgU3R1ZGlvIHRvIHNjYW4gdGhpcyBmb2xkZXIuCisgKi8KKworaW50IGdfRG9Ob3RVc2VUaGlzVmFyaWFibGUgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwCmluZGV4IDhlMzNhMzEuLjMzZDA3ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAKQEAgLTQ3LDkgKzQ3LDExIEBACiAgICAgaW50MzJfdCAgZnJhbWVzVG9QbGF5ID0gMDsKICAgICBpbnQzMl90ICBmcmFtZXNMZWZ0ID0gMDsKICAgICBpbnQzMl90ICB4UnVuQ291bnQgPSAwOwotICAgIGludCAgICAgIG51bUFjdGl2ZU9zY2lsYXRvcnMgPSAwOworICAgIGludCAgICAgIG51bUFjdGl2ZU9zY2lsbGF0b3JzID0gMDsKICAgICBmbG9hdCAgICpmbG9hdERhdGEgPSBudWxscHRyOwogICAgIGludDE2X3QgKnNob3J0RGF0YSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAqaW50MzJEYXRhID0gbnVsbHB0cjsKKyAgICB1aW50OF90ICpieXRlRGF0YSA9IG51bGxwdHI7CiAKICAgICBpbnQgICAgICB0ZXN0RmQgPSAtMTsKIApAQCAtNTcsNyArNTksNyBAQAogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCiAgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CiAKLSAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgd2F2ZSB1c2luZyBBQXVkaW8gVjAuMS4zXG4iLCBhcmd2WzBdKTsKKyAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgd2F2ZSB1c2luZyBBQXVkaW8gVjAuMS40XG4iLCBhcmd2WzBdKTsKIAogICAgIGlmIChhcmdQYXJzZXIucGFyc2VBcmdzKGFyZ2MsIGFyZ3YpKSB7CiAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CkBAIC05MSwxMyArOTMsMjMgQEAKICAgICBwcmludGYoIkJ1ZmZlcjogZnJhbWVzUGVyV3JpdGUgPSAlZFxuIixmcmFtZXNQZXJXcml0ZSk7CiAKICAgICAvLyBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGF1ZGlvIGRhdGEuCi0gICAgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgZmxvYXREYXRhID0gbmV3IGZsb2F0W2ZyYW1lc1BlcldyaXRlICogYWN0dWFsQ2hhbm5lbENvdW50XTsKLSAgICB9IGVsc2UgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIHNob3J0RGF0YSA9IG5ldyBpbnQxNl90W2ZyYW1lc1BlcldyaXRlICogYWN0dWFsQ2hhbm5lbENvdW50XTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIkVSUk9SIFVuc3VwcG9ydGVkIGRhdGEgZm9ybWF0IVxuIik7Ci0gICAgICAgIGdvdG8gZmluaXNoOworICAgIHN3aXRjaCAoYWN0dWFsRGF0YUZvcm1hdCkgeworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgZmxvYXREYXRhID0gbmV3IGZsb2F0W2ZyYW1lc1BlcldyaXRlICogYWN0dWFsQ2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKKyAgICAgICAgICAgIHNob3J0RGF0YSA9IG5ldyBpbnQxNl90W2ZyYW1lc1BlcldyaXRlICogYWN0dWFsQ2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQ6CisgICAgICAgICAgICBieXRlRGF0YSA9IG5ldyB1aW50OF90W2ZyYW1lc1BlcldyaXRlICogYWN0dWFsQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZ2V0Qnl0ZXNQZXJTYW1wbGUoQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRCldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTMyOgorICAgICAgICAgICAgaW50MzJEYXRhID0gbmV3IGludDMyX3RbZnJhbWVzUGVyV3JpdGUgKiBhY3R1YWxDaGFubmVsQ291bnRdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIFVuc3VwcG9ydGVkIGRhdGEgZm9ybWF0IVxuIik7CisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9CiAKICAgICB0ZXN0RmQgPSBvcGVuKCIvZGF0YS9hYXVkaW9fdGVtcC5yYXciLCBPX0NSRUFUIHwgT19SRFdSLCBTX0lSV1hVKTsKQEAgLTExNywyOSArMTI5LDU2IEBACiAgICAgLy8gUGxheSBmb3IgYSB3aGlsZS4KICAgICBmcmFtZXNUb1BsYXkgPSBhY3R1YWxTYW1wbGVSYXRlICogYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpOwogICAgIGZyYW1lc0xlZnQgPSBmcmFtZXNUb1BsYXk7Ci0gICAgbnVtQWN0aXZlT3NjaWxhdG9ycyA9IChhY3R1YWxDaGFubmVsQ291bnQgPiBNQVhfQ0hBTk5FTFMpID8gTUFYX0NIQU5ORUxTIDogYWN0dWFsQ2hhbm5lbENvdW50OworICAgIG51bUFjdGl2ZU9zY2lsbGF0b3JzID0gKGFjdHVhbENoYW5uZWxDb3VudCA+IE1BWF9DSEFOTkVMUykgPyBNQVhfQ0hBTk5FTFMgOiBhY3R1YWxDaGFubmVsQ291bnQ7CiAgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CiAgICAgICAgIC8vIFJlbmRlciBhcyBGTE9BVCBvciBQQ00KLSAgICAgICAgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxhdG9yczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmZsb2F0RGF0YVtpXSwgYWN0dWFsQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJXcml0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsRGF0YUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxhdG9yczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJnNob3J0RGF0YVtpXSwgYWN0dWFsQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJXcml0ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWN0dWFsRGF0YUZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsbGF0b3JzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmZsb2F0RGF0YVtpXSwgYWN0dWFsQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJXcml0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZzaG9ydERhdGFbaV0sIGFjdHVhbENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyV3JpdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTMyOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBteURhdGEuc2luZU9zY2lsbGF0b3JzW2ldLnJlbmRlcigmaW50MzJEYXRhW2ldLCBhY3R1YWxDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlcldyaXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2FtcGxlID0gZ2V0Qnl0ZXNQZXJTYW1wbGUoQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRCk7CisgICAgICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyMjQoJmJ5dGVEYXRhW2kgKiBieXRlc1BlclNhbXBsZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlcldyaXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBXcml0ZSBhdWRpbyBkYXRhIHRvIHRoZSBzdHJlYW0uCiAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gMTAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKICAgICAgICAgaW50MzJfdCBtaW5GcmFtZXMgPSAoZnJhbWVzVG9QbGF5IDwgZnJhbWVzUGVyV3JpdGUpID8gZnJhbWVzVG9QbGF5IDogZnJhbWVzUGVyV3JpdGU7CiAgICAgICAgIGludDMyX3QgYWN0dWFsID0gMDsKLSAgICAgICAgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGFjdHVhbCA9IEFBdWRpb1N0cmVhbV93cml0ZShhYXVkaW9TdHJlYW0sIGZsb2F0RGF0YSwgbWluRnJhbWVzLCB0aW1lb3V0TmFub3MpOwotICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBhY3R1YWwgPSBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtLCBzaG9ydERhdGEsIG1pbkZyYW1lcywgdGltZW91dE5hbm9zKTsKKyAgICAgICAgc3dpdGNoIChhY3R1YWxEYXRhRm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgICAgIGFjdHVhbCA9IEFBdWRpb1N0cmVhbV93cml0ZShhYXVkaW9TdHJlYW0sIGZsb2F0RGF0YSwgbWluRnJhbWVzLCB0aW1lb3V0TmFub3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6CisgICAgICAgICAgICAgICAgYWN0dWFsID0gQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbSwgc2hvcnREYXRhLCBtaW5GcmFtZXMsIHRpbWVvdXROYW5vcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kzMjoKKyAgICAgICAgICAgICAgICBhY3R1YWwgPSBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtLCBpbnQzMkRhdGEsIG1pbkZyYW1lcywgdGltZW91dE5hbm9zKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRDoKKyAgICAgICAgICAgICAgICBhY3R1YWwgPSBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtLCBieXRlRGF0YSwgbWluRnJhbWVzLCB0aW1lb3V0TmFub3MpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChhY3R1YWwgPCAwKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3dyaXRlKCkgcmV0dXJuZWQgJWRcbiIsIGFjdHVhbCk7CkBAIC0xOTYsNiArMjM1LDggQEAKIAogICAgIGRlbGV0ZVtdIGZsb2F0RGF0YTsKICAgICBkZWxldGVbXSBzaG9ydERhdGE7CisgICAgZGVsZXRlW10gaW50MzJEYXRhOworICAgIGRlbGV0ZVtdIGJ5dGVEYXRhOwogICAgIHByaW50ZigiZXhpdGluZyAtIEFBdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgIHJldHVybiAocmVzdWx0ICE9IEFBVURJT19PSykgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKaW5kZXggY2E2MDIzMy4uY2RjOTg3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcApAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgogI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKIAotI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS43IgorI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS44IgogCiBjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdEhhbmdUaW1lTVNlYyA9IDEwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggYTQ3ZjE4OS4uZWE0ZmUwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMjksNiArMjksOCBAQAogI2lmbmRlZiBBQVVESU9fQUFVRElPX0gKICNkZWZpbmUgQUFVRElPX0FBVURJT19ICiAKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCiAjaWZkZWYgX19jcGx1c3BsdXMKQEAgLTYzLDcgKzY1LDcgQEAKIAogICAgIC8qKgogICAgICAqIFRoaXMgZm9ybWF0IHVzZXMgdGhlIGludDE2X3QgZGF0YSB0eXBlLgotICAgICAqIFRoZSBtYXhpbXVtIHJhbmdlIG9mIHRoZSBkYXRhIGlzIC0zMjc2OCB0byAzMjc2Ny4KKyAgICAgKiBUaGUgbWF4aW11bSByYW5nZSBvZiB0aGUgZGF0YSBpcyAtMzI3NjggKDB4ODAwMCkgdG8gMzI3NjcgKDB4N0ZGRikuCiAgICAgICovCiAgICAgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LAogCkBAIC03NSw3ICs3NywzMSBAQAogICAgICAqIFNlZSBhbHNvICdmbG9hdERhdGEnIGF0CiAgICAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayN3cml0ZShmbG9hdFtdLCUyMGludCwlMjBpbnQsJTIwaW50KQogICAgICAqLwotICAgIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZvcm1hdCB1c2VzIDI0LWJpdCBzYW1wbGVzIHBhY2tlZCBpbnRvIDMgYnl0ZXMuCisgICAgICogVGhlIGJ5dGVzIGFyZSBpbiB0aGUgbmF0aXZlIGVuZGlhbiBvcmRlci4KKyAgICAgKiBUaGUgbWF4aW11bSByYW5nZSBvZiB0aGUgZGF0YSBpcyAtODM4ODYwOCAoMHg4MDAwMDApCisgICAgICogdG8gODM4ODYwNyAoMHg3RkZGRkYpLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBsb3dlciBwcmVjaXNpb24gYml0cyBtYXkgYmUgaWdub3JlZCBieSB0aGUgZGV2aWNlLgorICAgICAqCisgICAgICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMS4KKyAgICAgKi8KKyAgICBBQVVESU9fRk9STUFUX1BDTV9JMjRfUEFDS0VELAorCisgICAgLyoqCisgICAgICogVGhpcyBmb3JtYXQgdXNlcyAzMi1iaXQgc2FtcGxlcyBzdG9yZWQgaW4gYW4gaW50MzJfdCBkYXRhIHR5cGUuCisgICAgICogVGhlIG1heGltdW0gcmFuZ2Ugb2YgdGhlIGRhdGEgaXMgLTIxNDc0ODM2NDggKDB4ODAwMDAwMDApCisgICAgICogdG8gMjE0NzQ4MzY0NyAoMHg3RkZGRkZGRikuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIGxvd2VyIHByZWNpc2lvbiBiaXRzIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgorICAgICAqLworICAgIEFBVURJT19GT1JNQVRfUENNX0kzMgorCiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19mb3JtYXRfdDsKIApAQCAtNjg3LDcgKzcxMyw3IEBACiAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgbW9kZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCi0gKiBTZXQgdGhlIGludGVuZGVkIHVzZSBjYXNlIGZvciB0aGUgc3RyZWFtLgorICogU2V0IHRoZSBpbnRlbmRlZCB1c2UgY2FzZSBmb3IgdGhlIG91dHB1dCBzdHJlYW0uCiAgKgogICogVGhlIEFBdWRpbyBzeXN0ZW0gd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSB0aGUKICAqIGJlaGF2aW9yIG9mIHRoZSBzdHJlYW0uCkBAIC03MDQsNyArNzMwLDcgQEAKICAgICAgICAgYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgotICogU2V0IHRoZSB0eXBlIG9mIGF1ZGlvIGRhdGEgdGhhdCB0aGUgc3RyZWFtIHdpbGwgY2FycnkuCisgKiBTZXQgdGhlIHR5cGUgb2YgYXVkaW8gZGF0YSB0aGF0IHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgY2FycnkuCiAgKgogICogVGhlIEFBdWRpbyBzeXN0ZW0gd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSB0aGUKICAqIGJlaGF2aW9yIG9mIHRoZSBzdHJlYW0uCkBAIC04OTQsOCArOTIwLDkgQEAKICAqIEl0IHdpbGwgc3RvcCBiZWluZyBjYWxsZWQgYWZ0ZXIgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSgpIG9yCiAgKiBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKSBpcyBjYWxsZWQuCiAgKgotICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBhIHJlYWwtdGltZSB0aHJlYWQgb3duZWQgYnkgQUF1ZGlvLiBTZWUKLSAqIHtAbGluayAjQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFja30gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGEgcmVhbC10aW1lIHRocmVhZCBvd25lZCBieSBBQXVkaW8uCisgKiBUaGUgbG93IGxhdGVuY3kgc3RyZWFtcyBtYXkgaGF2ZSBjYWxsYmFjayB0aHJlYWRzIHdpdGggaGlnaGVyIHByaW9yaXR5IHRoYW4gbm9ybWFsIHN0cmVhbXMuCisgKiBTZWUge0BsaW5rICNBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAqCiAgKiBOb3RlIHRoYXQgdGhlIEFBdWRpbyBjYWxsYmFja3Mgd2lsbCBuZXZlciBiZSBjYWxsZWQgc2ltdWx0YW5lb3VzbHkgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgogICoKQEAgLTEwMzUsNiArMTA2MiwxMSBAQAogICogYnV0IHN0aWxsIGFsbG93IHF1ZXJpZXMgdG8gdGhlIHN0cmVhbSB0byBvY2N1ciBmcm9tIG90aGVyIHRocmVhZHMuIFRoaXMgb2Z0ZW4KICAqIGhhcHBlbnMgaWYgeW91IGFyZSBtb25pdG9yaW5nIHN0cmVhbSBwcm9ncmVzcyBmcm9tIGEgVUkgdGhyZWFkLgogICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBmdWxseSBpbXBsZW1lbnRlZCBmb3IgTU1BUCBzdHJlYW1zLAorICogd2hpY2ggYXJlIGxvdyBsYXRlbmN5IHN0cmVhbXMgc3VwcG9ydGVkIGJ5IHNvbWUgZGV2aWNlcy4KKyAqIE9uIG90aGVyICJMZWdhY3kiIHN0cmVhbXMgc29tZSBhdWRpbyByZXNvdXJjZXMgd2lsbCBzdGlsbCBiZSBpbiB1c2UKKyAqIGFuZCBzb21lIGNhbGxiYWNrcyBtYXkgc3RpbGwgYmUgaW4gcHJvY2VzcyBhZnRlciB0aGlzIGNhbGwuCisgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAppbmRleCA3MTdmMzFhLi5kMDJkMWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCkBAIC0yMSw2ICsyMSw3IEBACiAgICAgXSwKIAogICAgIGNmbGFnczogWworICAgICAgICAiLVd0aHJlYWQtc2FmZXR5IiwKICAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTg1LDYgKzg2LDcgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAiYWF1ZGlvLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0xMTQsMTEgKzExNiwxMCBAQAogICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCIsCiAgICAgICAgICJjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuY3BwIiwKICAgICAgICAgImJpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcCIsCiAgICAgICAgICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIiwKICAgICAgICAgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAiLAotICAgICAgICAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmNwcCIsCi0gICAgICAgICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLApAQCAtMTI5LDEyICsxMzAsNDQgQEAKICAgICAgICAgImZsb3dncmFwaC9TaW5rRmxvYXQuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9TaW5rSTE2LmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvU2lua0kyNC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMzIuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkzMi5jcHAiLAogICAgIF0sCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsiYm91bmRzIl0sCiAgICAgfSwKIH0KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJhYXVkaW8tYWlkbCIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJiaW5kaW5nL2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vRW5kcG9pbnQuYWlkbCIsCisgICAgICAgICJiaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbCIsCisgICAgICAgICJiaW5kaW5nL2FpZGwvYWF1ZGlvL1NoYXJlZFJlZ2lvbi5haWRsIiwKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUGFyYW1ldGVycy5haWRsIiwKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUmVxdWVzdC5haWRsIiwKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb0NsaWVudC5haWRsIiwKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbCIsCisgICAgXSwKKyAgICBiYWNrZW5kOgorICAgIHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgICAgICBqYXZhOiB7CisgICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGhhdmUgYXVkaW9fY29tbW9uLWFpZGwgYXZhaWxhYmxlIGluIEphdmEgdG8gZW5hYmxlCisgICAgICAgICAgICAvLyAgICAgICB0aGlzLgorICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjJmZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuY3BwCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oPgorI2luY2x1ZGUgPHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmg+CisKK25hbWVzcGFjZSBhYXVkaW8geworCit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKKworQUF1ZGlvQmluZGVyQWRhcHRlcjo6QUF1ZGlvQmluZGVyQWRhcHRlcihJQUF1ZGlvU2VydmljZSogZGVsZWdhdGUpCisgICAgICAgIDogbURlbGVnYXRlKGRlbGVnYXRlKSB7fQorCit2b2lkIEFBdWRpb0JpbmRlckFkYXB0ZXI6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IGFuZHJvaWQ6OnNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpIHsKKyAgICBtRGVsZWdhdGUtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7Cit9CisKK2FhdWRpb19oYW5kbGVfdCBBQXVkaW9CaW5kZXJBZGFwdGVyOjpvcGVuU3RyZWFtKGNvbnN0IEFBdWRpb1N0cmVhbVJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWcpIHsKKyAgICBhYXVkaW9faGFuZGxlX3QgcmVzdWx0OworICAgIFN0cmVhbVBhcmFtZXRlcnMgcGFyYW1zOworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPm9wZW5TdHJlYW0ocmVxdWVzdC5wYXJjZWxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCkpOworICAgIH0KKyAgICBjb25maWcgPSBwYXJhbXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckFkYXB0ZXI6OmNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPmNsb3NlU3RyZWFtKHN0cmVhbUhhbmRsZSwgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQWRhcHRlcjo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSYgZW5kcG9pbnRPdXQpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIEVuZHBvaW50IGVuZHBvaW50OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPmdldFN0cmVhbURlc2NyaXB0aW9uKHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCkpOworICAgIH0KKyAgICBlbmRwb2ludE91dCA9IHN0ZDo6bW92ZShlbmRwb2ludCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckFkYXB0ZXI6OnN0YXJ0U3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPnN0YXJ0U3RyZWFtKHN0cmVhbUhhbmRsZSwgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQWRhcHRlcjo6cGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CisgICAgU3RhdHVzIHN0YXR1cyA9IG1EZWxlZ2F0ZS0+cGF1c2VTdHJlYW0oc3RyZWFtSGFuZGxlLCAmcmVzdWx0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJBZGFwdGVyOjpzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPnN0b3BTdHJlYW0oc3RyZWFtSGFuZGxlLCAmcmVzdWx0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJBZGFwdGVyOjpmbHVzaFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBTdGF0dXMgc3RhdHVzID0gbURlbGVnYXRlLT5mbHVzaFN0cmVhbShzdHJlYW1IYW5kbGUsICZyZXN1bHQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckFkYXB0ZXI6OnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CisgICAgU3RhdHVzIHN0YXR1cyA9IG1EZWxlZ2F0ZS0+cmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsIGNsaWVudFRocmVhZElkLCBwZXJpb2ROYW5vc2Vjb25kcywgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQWRhcHRlcjo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBTdGF0dXMgc3RhdHVzID0gbURlbGVnYXRlLT51bnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCwgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYWF1ZGlvCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTlhYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhYXVkaW8vSUFBdWRpb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFhdWRpbyB7CisKKy8qKgorICogQW4gYWRhcHRlciB0aGF0IHRha2VzIGluIGFuIHVuZGVybHlpbmcgSUFBdWRpb1NlcnZpY2UgYW5kIGV4cG9zZXMgYW4KKyAqIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UuCisgKgorICogVGhpcyBjbGFzcyBpcyBhYnN0cmFjdDogdGhlIGNsaWVudCBpcyBleHBlY3RlZCB0byBpbmhlcml0IGZyb20gdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHRob3NlCisgKiBtZXRob2RzIGZyb20gQUF1ZGlvU2VydmljZUludGVyZmFjZSB0aGF0IGRvbid0IGhhdmUgY291bnRlcnBhcnRzIGluIElBQXVkaW9TZXJ2aWNlLgorICovCitjbGFzcyBBQXVkaW9CaW5kZXJBZGFwdGVyIDogcHVibGljIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEFBdWRpb0JpbmRlckFkYXB0ZXIoSUFBdWRpb1NlcnZpY2UqIGRlbGVnYXRlKTsKKworICAgIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3QgYW5kcm9pZDo6c3A8SUFBdWRpb0NsaWVudD4mIGNsaWVudCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBBQXVkaW9TdHJlYW1SZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFN0cmVhbURlc2NyaXB0aW9uKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlJiBlbmRwb2ludCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgSUFBdWRpb1NlcnZpY2UqIGNvbnN0IG1EZWxlZ2F0ZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhYXVkaW8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKaW5kZXggN2IwZDMxZi4uZmE1YTJkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKQEAgLTE5LDM1ICsxOSwzMCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+Ci0KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgotI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgiCi0vLyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKLS8vI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgotLy8jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgotLy8jaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogCi0vLyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaCIKKworI2RlZmluZSBBQVVESU9fU0VSVklDRV9OQU1FICAibWVkaWEuYWF1ZGlvIgogCiB1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKIHVzaW5nIGFuZHJvaWQ6OklTZXJ2aWNlTWFuYWdlcjsKIHVzaW5nIGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKIHVzaW5nIGFuZHJvaWQ6OmludGVyZmFjZV9jYXN0OwogdXNpbmcgYW5kcm9pZDo6SUludGVyZmFjZTsKLXVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwogdXNpbmcgYW5kcm9pZDo6TXV0ZXg7CiB1c2luZyBhbmRyb2lkOjpQcm9jZXNzU3RhdGU7CiB1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwogdXNpbmcgYW5kcm9pZDo6d3A7Cit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIApAQCAtNjcsMjAgKzYyLDE4IEBACiBBQXVkaW9CaW5kZXJDbGllbnQ6On5BQXVkaW9CaW5kZXJDbGllbnQoKSB7CiAgICAgQUxPR1YoIiVzIC0gZGVzdHJveWluZyAlcCIsIF9fZnVuY19fLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlcnZpY2VMb2NrKTsKLSAgICBpZiAobUFBdWRpb1NlcnZpY2UgIT0gMCkgewotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQUF1ZGlvU2VydmljZSktPnVubGlua1RvRGVhdGgobUFBdWRpb0NsaWVudCk7Ci0gICAgfQogfQogCiAvLyBUT0RPIFNoYXJlIGNvZGUgd2l0aCBvdGhlciBzZXJ2aWNlIGNsaWVudHMuCiAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGFjY2VzcyB0byB0aGUgIkFBdWRpb1NlcnZpY2UiIHNlcnZpY2UuCiAvLyBUaGlzIGNvZGUgd2FzIG1vZGVsZWQgYWZ0ZXIgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKLWNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBBQXVkaW9CaW5kZXJDbGllbnQ6OmdldEFBdWRpb1NlcnZpY2UoKSB7CitzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvU2VydmljZUludGVyZmFjZT4gQUF1ZGlvQmluZGVyQ2xpZW50OjpnZXRBQXVkaW9TZXJ2aWNlKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlPiByZXN1bHQ7CiAgICAgc3A8SUFBdWRpb1NlcnZpY2U+IGFhdWRpb1NlcnZpY2U7CiAgICAgYm9vbCBuZWVkVG9SZWdpc3RlciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIGlmIChtQUF1ZGlvU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICAvLyBUcnkgc2V2ZXJhbCB0aW1lcyB0byBnZXQgdGhlIHNlcnZpY2UuCkBAIC05OSw3ICs5Miw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSAtIGxpbmtUb0RlYXRoKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFBdWRpb1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQUF1ZGlvU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgICAgICAgICBhYXVkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUFBdWRpb1NlcnZpY2U+KGJpbmRlcik7CisgICAgICAgICAgICAgICAgbUFkYXB0ZXIucmVzZXQobmV3IEFkYXB0ZXIoYWF1ZGlvU2VydmljZSwgbUFBdWRpb0NsaWVudCkpOwogICAgICAgICAgICAgICAgIG5lZWRUb1JlZ2lzdGVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgY2FsbGJhY2tzIGNhbiBiZSByZWNlaXZlZCBieSBtQUF1ZGlvQ2xpZW50CiAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwpAQCAtMTA3LDE4ICsxMDEsMTggQEAKICAgICAgICAgICAgICAgICBBTE9HRSgiQUF1ZGlvQmluZGVyQ2xpZW50IGNvdWxkIG5vdCBjb25uZWN0IHRvICVzIiwgQUFVRElPX1NFUlZJQ0VfTkFNRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYWF1ZGlvU2VydmljZSA9IG1BQXVkaW9TZXJ2aWNlOworICAgICAgICByZXN1bHQgPSBtQWRhcHRlcjsKICAgICB9CiAgICAgLy8gRG8gdGhpcyBvdXRzaWRlIHRoZSBtdXRleCBsb2NrLgogICAgIGlmIChuZWVkVG9SZWdpc3RlciAmJiBhYXVkaW9TZXJ2aWNlLmdldCgpICE9IG51bGxwdHIpIHsgLy8gbmV3IGNsaWVudD8KICAgICAgICAgYWF1ZGlvU2VydmljZS0+cmVnaXN0ZXJDbGllbnQobUFBdWRpb0NsaWVudCk7CiAgICAgfQotICAgIHJldHVybiBhYXVkaW9TZXJ2aWNlOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQgQUF1ZGlvQmluZGVyQ2xpZW50Ojpkcm9wQUF1ZGlvU2VydmljZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlcnZpY2VMb2NrKTsKLSAgICBtQUF1ZGlvU2VydmljZS5jbGVhcigpOyAvLyBmb3JjZSBhIHJlY29ubmVjdAorICAgIG1BZGFwdGVyLnJlc2V0KCk7CiB9CiAKIC8qKgpAQCAtMTI3LDEzICsxMjEsMTMgQEAKICogQHJldHVybiBoYW5kbGUgdG8gdGhlIHN0cmVhbSBvciBhIG5lZ2F0aXZlIGVycm9yCiAqLwogYWF1ZGlvX2hhbmRsZV90IEFBdWRpb0JpbmRlckNsaWVudDo6b3BlblN0cmVhbShjb25zdCBBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CiAgICAgICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKIAotICAgICAgICBzdHJlYW0gPSBzZXJ2aWNlLT5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOworICAgICAgICBzdHJlYW0gPSBzZXJ2aWNlLT5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb24pOwogCiAgICAgICAgIGlmIChzdHJlYW0gPT0gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0UpIHsKICAgICAgICAgICAgIEFMT0dFKCJvcGVuU3RyZWFtIGxvc3QgY29ubmVjdGlvbiB0byBBQXVkaW9TZXJ2aWNlLiIpOwpAQCAtMTQ2LDggKzE0MCw5IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OmNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvU2VydmljZUludGVyZmFjZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKICAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisKICAgICByZXR1cm4gc2VydmljZS0+Y2xvc2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIApAQCAtMTU1LDMzICsxNTAsMzggQEAKICogdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgogKi8KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OmdldFN0cmVhbURlc2NyaXB0aW9uKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUmIGVuZHBvaW50T3V0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwotICAgIHJldHVybiBzZXJ2aWNlLT5nZXRTdHJlYW1EZXNjcmlwdGlvbihzdHJlYW1IYW5kbGUsIHBhcmNlbGFibGUpOworCisgICAgcmV0dXJuIHNlcnZpY2UtPmdldFN0cmVhbURlc2NyaXB0aW9uKHN0cmVhbUhhbmRsZSwgZW5kcG9pbnRPdXQpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworCiAgICAgcmV0dXJuIHNlcnZpY2UtPnN0YXJ0U3RyZWFtKHN0cmVhbUhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OnBhdXNlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvU2VydmljZUludGVyZmFjZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKICAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisKICAgICByZXR1cm4gc2VydmljZS0+cGF1c2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6c3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworCiAgICAgcmV0dXJuIHNlcnZpY2UtPnN0b3BTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6Zmx1c2hTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKwogICAgIHJldHVybiBzZXJ2aWNlLT5mbHVzaFN0cmVhbShzdHJlYW1IYW5kbGUpOwogfQogCkBAIC0xOTEsMTcgKzE5MSwxNiBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6cmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKLSAgICByZXR1cm4gc2VydmljZS0+cmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kTmFub3NlY29uZHMpOworCisgICAgcmV0dXJuIHNlcnZpY2UtPnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCwgcGVyaW9kTmFub3NlY29uZHMpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50Ojp1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKLSAgICByZXR1cm4gc2VydmljZS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZElkKTsKKworICAgIHJldHVybiBzZXJ2aWNlLT51bnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgKaW5kZXggZThjOTFmYy4uNmE3YjYzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaApAQCAtMjEsMTIgKzIxLDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSAiQUF1ZGlvU2VydmljZURlZmluaXRpb25zLmgiCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgImFhdWRpby9CbkFBdWRpb0NsaWVudC5oIgorI2luY2x1ZGUgImFhdWRpby9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgorI2luY2x1ZGUgImNvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oIgogCiAvKioKICAqIEltcGxlbWVudHMgdGhlIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgYnkgdGFsa2luZyB0byB0aGUgc2VydmljZSB0aHJvdWdoIEJpbmRlci4KQEAgLTQ0LDExICs0Nyw3IEBACiAKICAgICB2aXJ0dWFsIH5BQXVkaW9CaW5kZXJDbGllbnQoKTsKIAotICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlPiBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0KLSAgICB2b2lkIGRyb3BBQXVkaW9TZXJ2aWNlKCk7Ci0KLSAgICB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklBQXVkaW9DbGllbnQ+JiBjbGllbnQgX191bnVzZWQpIG92ZXJyaWRlIHt9CisgICAgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50IF9fdW51c2VkKSBvdmVycmlkZSB7fQogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHJlcXVlc3QgaW5mbyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBzdHJlYW0KQEAgLTY0LDcgKzYzLDcgQEAKICAgICAqIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KICAgICAqLwogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRTdHJlYW1EZXNjcmlwdGlvbihhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50T3V0KSBvdmVycmlkZTsKIAogICAgIC8qKgogICAgICAqIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCkBAIC0xMTUsOCArMTE0LDcgQEAKICAgICAgICAgQUxPR1coIm9uU3RyZWFtQ2hhbmdlIGNhbGxlZCEiKTsKICAgICB9CiAKLSAgICBjbGFzcyBBQXVkaW9DbGllbnQgOiBwdWJsaWMgYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgLCBwdWJsaWMgYW5kcm9pZDo6Qm5BQXVkaW9DbGllbnQKLSAgICB7CisgICAgY2xhc3MgQUF1ZGlvQ2xpZW50IDogcHVibGljIGFuZHJvaWQ6OklCaW5kZXI6OkRlYXRoUmVjaXBpZW50LCBwdWJsaWMgQm5BQXVkaW9DbGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgQUF1ZGlvQ2xpZW50KGFuZHJvaWQ6OndwPEFBdWRpb0JpbmRlckNsaWVudD4gYWF1ZGlvQmluZGVyQ2xpZW50KQogICAgICAgICAgICAgICAgIDogbUJpbmRlckNsaWVudChhYXVkaW9CaW5kZXJDbGllbnQpIHsKQEAgLTEzMiwyMSArMTMwLDY2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBpbXBsZW1lbnQgQm5BQXVkaW9DbGllbnQKLSAgICAgICAgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkgeworICAgICAgICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblN0cmVhbUNoYW5nZShpbnQzMl90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lX3Y8YWF1ZGlvX2hhbmRsZV90LCBpbnQzMl90Pik7CiAgICAgICAgICAgICBhbmRyb2lkOjpzcDxBQXVkaW9CaW5kZXJDbGllbnQ+IGNsaWVudCA9IG1CaW5kZXJDbGllbnQucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgY2xpZW50LT5vblN0cmVhbUNoYW5nZShoYW5kbGUsIG9wY29kZSwgdmFsdWUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgICAgICB9CiAgICAgcHJpdmF0ZToKICAgICAgICAgYW5kcm9pZDo6d3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBtQmluZGVyQ2xpZW50OwogICAgIH07CiAKLXByaXZhdGU6CisgICAgLy8gVGhpcyBhZGFwdGVyIGlzIHVzZWQgdG8gY29udmVydCB0aGUgYmluZGVyIGludGVyZmFjZSAoZGVsZWdhdGUpIHRvIHRoZSBBdWRpb1NlcnZpY2VJbnRlcmZhY2UKKyAgICAvLyBjb252ZW50aW9ucyAodHJhbnNsYXRpbmcgYmV0d2VlbiBkYXRhIHR5cGVzIGFuZCByZXNwZWN0aXZlIHBhcmNlbGFibGVzLCB0cmFuc2xhdGluZyBlcnJvcgorICAgIC8vIGNvZGVzIGFuZCBjYWxsaW5nIGNvbnZlbnRpb25zKS4KKyAgICAvLyBUaGUgYWRhcHRlciBhbHNvIG93bnMgdGhlIHVuZGVybHlpbmcgc2VydmljZSBvYmplY3QgYW5kIGlzIHJlc3BvbnNpYmxlIHRvIHVubGluayBpdHMgZGVhdGgKKyAgICAvLyBsaXN0ZW5lciB3aGVuIGRlc3Ryb3llZC4KKyAgICBjbGFzcyBBZGFwdGVyIDogcHVibGljIEFBdWRpb0JpbmRlckFkYXB0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgQWRhcHRlcihjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvU2VydmljZT4mIGRlbGVnYXRlLAorICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4mIGFhdWRpb0NsaWVudCkKKyAgICAgICAgICAgICAgICA6IEFBdWRpb0JpbmRlckFkYXB0ZXIoZGVsZWdhdGUuZ2V0KCkpLAorICAgICAgICAgICAgICAgICAgbURlbGVnYXRlKGRlbGVnYXRlKSwKKyAgICAgICAgICAgICAgICAgIG1BQXVkaW9DbGllbnQoYWF1ZGlvQ2xpZW50KSB7fQogCi0gICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICAgICAgICAgICBtU2VydmljZUxvY2s7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U+ICBtQUF1ZGlvU2VydmljZTsKLSAgICBhbmRyb2lkOjpzcDxBQXVkaW9DbGllbnQ+ICAgICAgIG1BQXVkaW9DbGllbnQ7CisgICAgICAgIHZpcnR1YWwgfkFkYXB0ZXIoKSB7CisgICAgICAgICAgICBpZiAobURlbGVnYXRlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpJSW50ZXJmYWNlOjphc0JpbmRlcihtRGVsZWdhdGUpLT51bmxpbmtUb0RlYXRoKG1BQXVkaW9DbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIChjYWxsIGlzIHJlamVjdGVkIGF0IHRoZSBBdWRpb0JpbmRlckNsaWVudCBsZXZlbCkuCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGNsaWVudEhhbmRsZSBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIChjYWxsIGlzIHJlamVjdGVkIGF0IHRoZSBBdWRpb0JpbmRlckNsaWVudCBsZXZlbCkuCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGFuZHJvaWQ6OnNwPElBQXVkaW9TZXJ2aWNlPiBtRGVsZWdhdGU7CisgICAgICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4gbUFBdWRpb0NsaWVudDsKKyAgICB9OworCitwcml2YXRlOgorICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IG1BZGFwdGVyOworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4gICAgICAgICAgICAgICBtQUF1ZGlvQ2xpZW50OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IGdldEFBdWRpb1NlcnZpY2UoKTsKKworICAgIHZvaWQgZHJvcEFBdWRpb1NlcnZpY2UoKTsKIAogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgKaW5kZXggOWMyOGNjNy4uNWQxMTUxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oCkBAIC0yMCwxMSArMjAsMTEgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9DbGllbnQuaD4KIAorI2luY2x1ZGUgImFhdWRpby9JQUF1ZGlvQ2xpZW50LmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlRGVmaW5pdGlvbnMuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgiCiAKIC8qKgogICogVGhpcyBoYXMgdGhlIHNhbWUgbWV0aG9kcyBhcyBJQUF1ZGlvU2VydmljZSBidXQgd2l0aG91dCB0aGUgQmluZGVyIGZlYXR1cmVzLgpAQCAtNDAsNyArNDAsNyBAQAogICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKSB7fTsKICAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwogCi0gICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklBQXVkaW9DbGllbnQ+JiBjbGllbnQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3QgYW5kcm9pZDo6c3A8SUFBdWRpb0NsaWVudD4mIGNsaWVudCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHJlcXVlc3QgaW5mbyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBzdHJlYW0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAppbmRleCBiNzg1Zjg4Li4yZDUwMWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCkBAIC0yMywxMDEgKzIzLDY2IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KLQogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgogCi11c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLQogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAotQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbigpIHt9Ci1BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjp+QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbigpIHt9Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ7CiAKLXN0YXR1c190IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0RGV2aWNlSWQoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTYW1wbGVzUGVyRnJhbWUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldFNoYXJpbmdNb2RlKCkpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRGb3JtYXQoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0RGlyZWN0aW9uKCkpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRVc2FnZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldElucHV0UHJlc2V0KCkpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTZXNzaW9uSWQoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoaXNQcml2YWN5U2Vuc2l0aXZlKCkgPyAxIDogMCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci1lcnJvcjoKLSAgICBBTE9HRSgiJXMoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOworQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbihjb25zdCBTdHJlYW1QYXJhbWV0ZXJzJiBwYXJjZWxhYmxlKSB7CisgICAgc2V0U2FtcGxlc1BlckZyYW1lKHBhcmNlbGFibGUuc2FtcGxlc1BlckZyYW1lKTsKKyAgICBzZXRTYW1wbGVSYXRlKHBhcmNlbGFibGUuc2FtcGxlUmF0ZSk7CisgICAgc2V0RGV2aWNlSWQocGFyY2VsYWJsZS5kZXZpY2VJZCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX3NoYXJpbmdfbW9kZV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5zaGFyaW5nTW9kZSkpOworICAgIHNldFNoYXJpbmdNb2RlKHBhcmNlbGFibGUuc2hhcmluZ01vZGUpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGF1ZGlvX2Zvcm1hdF90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5hdWRpb0Zvcm1hdCkpOworICAgIHNldEZvcm1hdChzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4ocGFyY2VsYWJsZS5hdWRpb0Zvcm1hdCkpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19kaXJlY3Rpb25fdCkgPT0gc2l6ZW9mKHBhcmNlbGFibGUuZGlyZWN0aW9uKSk7CisgICAgc2V0RGlyZWN0aW9uKHBhcmNlbGFibGUuZGlyZWN0aW9uKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhdWRpb191c2FnZV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS51c2FnZSkpOworICAgIHNldFVzYWdlKHBhcmNlbGFibGUudXNhZ2UpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19jb250ZW50X3R5cGVfdCkgPT0gc2l6ZW9mKHBhcmNlbGFibGUuY29udGVudFR5cGUpKTsKKyAgICBzZXRDb250ZW50VHlwZShwYXJjZWxhYmxlLmNvbnRlbnRUeXBlKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhYXVkaW9faW5wdXRfcHJlc2V0X3QpID09IHNpemVvZihwYXJjZWxhYmxlLmlucHV0UHJlc2V0KSk7CisgICAgc2V0SW5wdXRQcmVzZXQocGFyY2VsYWJsZS5pbnB1dFByZXNldCk7CisgICAgc2V0QnVmZmVyQ2FwYWNpdHkocGFyY2VsYWJsZS5idWZmZXJDYXBhY2l0eSk7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgICAgIHNpemVvZihhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5hbGxvd2VkQ2FwdHVyZVBvbGljeSkpOworICAgIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHBhcmNlbGFibGUuYWxsb3dlZENhcHR1cmVQb2xpY3kpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19zZXNzaW9uX2lkX3QpID09IHNpemVvZihwYXJjZWxhYmxlLnNlc3Npb25JZCkpOworICAgIHNldFNlc3Npb25JZChwYXJjZWxhYmxlLnNlc3Npb25JZCk7CisgICAgc2V0UHJpdmFjeVNlbnNpdGl2ZShwYXJjZWxhYmxlLmlzUHJpdmFjeVNlbnNpdGl2ZSk7CiB9CiAKLXN0YXR1c190IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgaW50MzJfdCB2YWx1ZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0RGV2aWNlSWQodmFsdWUpOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRTYW1wbGVSYXRlKHZhbHVlKTsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0U2FtcGxlc1BlckZyYW1lKHZhbHVlKTsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0U2hhcmluZ01vZGUoKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgdmFsdWUpOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRGb3JtYXQoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSk7CitBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJgorQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6b3BlcmF0b3I9KGNvbnN0IFN0cmVhbVBhcmFtZXRlcnMmIHBhcmNlbGFibGUpIHsKKyAgICB0aGlzLT5+QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbigpOworICAgIG5ldyAodGhpcykgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbihwYXJjZWxhYmxlKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CiAKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0QnVmZmVyQ2FwYWNpdHkodmFsdWUpOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRVc2FnZSgoYWF1ZGlvX3VzYWdlX3QpIHZhbHVlKTsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0Q29udGVudFR5cGUoKGFhdWRpb19jb250ZW50X3R5cGVfdCkgdmFsdWUpOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRJbnB1dFByZXNldCgoYWF1ZGlvX2lucHV0X3ByZXNldF90KSB2YWx1ZSk7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KChhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90KSB2YWx1ZSk7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldFNlc3Npb25JZCh2YWx1ZSk7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldFByaXZhY3lTZW5zaXRpdmUodmFsdWUgPT0gMSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotZXJyb3I6Ci0gICAgQUxPR0UoIiVzKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOworU3RyZWFtUGFyYW1ldGVycyBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjpwYXJjZWxhYmxlKCkgY29uc3QgeworICAgIFN0cmVhbVBhcmFtZXRlcnMgcmVzdWx0OworICAgIHJlc3VsdC5zYW1wbGVzUGVyRnJhbWUgPSBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICByZXN1bHQuc2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoKTsKKyAgICByZXN1bHQuZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgPT0gc2l6ZW9mKHJlc3VsdC5zaGFyaW5nTW9kZSkpOworICAgIHJlc3VsdC5zaGFyaW5nTW9kZSA9IGdldFNoYXJpbmdNb2RlKCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fZm9ybWF0X3QpID09IHNpemVvZihyZXN1bHQuYXVkaW9Gb3JtYXQpKTsKKyAgICByZXN1bHQuYXVkaW9Gb3JtYXQgPSBzdGF0aWNfY2FzdDxBdWRpb0Zvcm1hdD4oZ2V0Rm9ybWF0KCkpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19kaXJlY3Rpb25fdCkgPT0gc2l6ZW9mKHJlc3VsdC5kaXJlY3Rpb24pKTsKKyAgICByZXN1bHQuZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fdXNhZ2VfdCkgPT0gc2l6ZW9mKHJlc3VsdC51c2FnZSkpOworICAgIHJlc3VsdC51c2FnZSA9IGdldFVzYWdlKCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX2NvbnRlbnRfdHlwZV90KSA9PSBzaXplb2YocmVzdWx0LmNvbnRlbnRUeXBlKSk7CisgICAgcmVzdWx0LmNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhYXVkaW9faW5wdXRfcHJlc2V0X3QpID09IHNpemVvZihyZXN1bHQuaW5wdXRQcmVzZXQpKTsKKyAgICByZXN1bHQuaW5wdXRQcmVzZXQgPSBnZXRJbnB1dFByZXNldCgpOworICAgIHJlc3VsdC5idWZmZXJDYXBhY2l0eSA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCkgPT0gc2l6ZW9mKHJlc3VsdC5hbGxvd2VkQ2FwdHVyZVBvbGljeSkpOworICAgIHJlc3VsdC5hbGxvd2VkQ2FwdHVyZVBvbGljeSA9IGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX3Nlc3Npb25faWRfdCkgPT0gc2l6ZW9mKHJlc3VsdC5zZXNzaW9uSWQpKTsKKyAgICByZXN1bHQuc2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkKCk7CisgICAgcmVzdWx0LmlzUHJpdmFjeVNlbnNpdGl2ZSA9IGlzUHJpdmFjeVNlbnNpdGl2ZSgpOworICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaAppbmRleCBiMzI0ODk2Li5mNDI4ZWIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmgKQEAgLTIwLDI0ICsyMCwyNCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGFhdWRpby9TdHJlYW1QYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSAiY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgiCiAKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLQogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLWNsYXNzIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gOiBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycywgcHVibGljIFBhcmNlbGFibGUgeworLy8gVGhpcyBpcyBhIGhvbGRlciBmb3IgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycywgd2hpY2ggYWxsb3dzIGNvbnZlcnNpb24gdG8vZnJvbSBpdCBwYXJjZWxhYmxlCisvLyByZXByZXNlbnRhdGlvbiwgU3RyZWFtUGFyYW1ldGVycy4KK2NsYXNzIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gOiBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyB7CiBwdWJsaWM6Ci0gICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbigpOwotICAgIHZpcnR1YWwgfkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24oKTsKKyAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uKCkgPSBkZWZhdWx0OwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKyAgICBleHBsaWNpdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uKGNvbnN0IFN0cmVhbVBhcmFtZXRlcnMmIHBhcmNlbGFibGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFN0cmVhbVBhcmFtZXRlcnMmIHBhcmNlbGFibGUpOworCisgICAgU3RyZWFtUGFyYW1ldGVycyBwYXJjZWxhYmxlKCkgY29uc3Q7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAppbmRleCBjMzBjNWI5Li41MzYzOTVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCkBAIC0yMSw2NyArMjEsMzIgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKIAotdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Ci0KIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKLUFBdWRpb1N0cmVhbVJlcXVlc3Q6OkFBdWRpb1N0cmVhbVJlcXVlc3QoKQotICAgIDogbUNvbmZpZ3VyYXRpb24oKQotICAgIHt9Ci0KLUFBdWRpb1N0cmVhbVJlcXVlc3Q6On5BQXVkaW9TdHJlYW1SZXF1ZXN0KCkge30KLQotc3RhdHVzX3QgQUF1ZGlvU3RyZWFtUmVxdWVzdDo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgbVVzZXJJZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtSW5TZXJ2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgc3RhdHVzID0gbUNvbmZpZ3VyYXRpb24ud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci0KLWVycm9yOgotICAgIEFMT0dFKCJ3cml0ZVRvUGFyY2VsKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOworQUF1ZGlvU3RyZWFtUmVxdWVzdDo6QUF1ZGlvU3RyZWFtUmVxdWVzdChjb25zdCBTdHJlYW1SZXF1ZXN0JiBwYXJjZWxhYmxlKSA6CisgICAgICAgIG1Db25maWd1cmF0aW9uKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnBhcmFtcykpLAorICAgICAgICBtVXNlcklkKHBhcmNlbGFibGUudXNlcklkKSwKKyAgICAgICAgbVByb2Nlc3NJZChwYXJjZWxhYmxlLnByb2Nlc3NJZCksCisgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQocGFyY2VsYWJsZS5zaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpLAorICAgICAgICBtSW5TZXJ2aWNlKHBhcmNlbGFibGUuaW5TZXJ2aWNlKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobVVzZXJJZCkgPT0gc2l6ZW9mKHBhcmNlbGFibGUudXNlcklkKSk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobVByb2Nlc3NJZCkgPT0gc2l6ZW9mKHBhcmNlbGFibGUucHJvY2Vzc0lkKSk7CiB9CiAKLXN0YXR1c190IEFBdWRpb1N0cmVhbVJlcXVlc3Q6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgaW50MzJfdCB0ZW1wOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0ZW1wKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIG1Vc2VySWQgPSAodWlkX3QpIHRlbXA7Ci0KLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRCb29sKCZtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbUluU2VydmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IG1Db25maWd1cmF0aW9uLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLQotZXJyb3I6Ci0gICAgQUxPR0UoInJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7CitTdHJlYW1SZXF1ZXN0IEFBdWRpb1N0cmVhbVJlcXVlc3Q6OnBhcmNlbGFibGUoKSBjb25zdCB7CisgICAgU3RyZWFtUmVxdWVzdCByZXN1bHQ7CisgICAgcmVzdWx0LnBhcmFtcyA9IHN0ZDo6bW92ZShtQ29uZmlndXJhdGlvbikucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC51c2VySWQgPSBtVXNlcklkOworICAgIHJlc3VsdC5wcm9jZXNzSWQgPSBtUHJvY2Vzc0lkOworICAgIHJlc3VsdC5zaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkOworICAgIHJlc3VsdC5pblNlcnZpY2UgPSBtSW5TZXJ2aWNlOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1SZXF1ZXN0Ojp2YWxpZGF0ZSgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5oCmluZGV4IDQ5MmY2OWQuLjMxZDNlYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaApAQCAtMjAsMjEgKzIwLDE4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8YWF1ZGlvL1N0cmVhbVJlcXVlc3QuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgogCi11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Ci0KIG5hbWVzcGFjZSBhYXVkaW8gewogCi1jbGFzcyBBQXVkaW9TdHJlYW1SZXF1ZXN0IDogcHVibGljIFBhcmNlbGFibGUgeworY2xhc3MgQUF1ZGlvU3RyZWFtUmVxdWVzdCB7CiBwdWJsaWM6Ci0gICAgQUF1ZGlvU3RyZWFtUmVxdWVzdCgpOwotICAgIHZpcnR1YWwgfkFBdWRpb1N0cmVhbVJlcXVlc3QoKTsKKyAgICBBQXVkaW9TdHJlYW1SZXF1ZXN0KCkgPSBkZWZhdWx0OworCisgICAgLy8gQ29uc3RydWN0IGJhc2VkIG9uIGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbi4KKyAgICBleHBsaWNpdCBBQXVkaW9TdHJlYW1SZXF1ZXN0KGNvbnN0IFN0cmVhbVJlcXVlc3QmIHBhcmNlbGFibGUpOwogCiAgICAgdWlkX3QgZ2V0VXNlcklkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVVzZXJJZDsKQEAgLTc2LDE1ICs3MywxNCBAQAogICAgICAgICBtSW5TZXJ2aWNlID0gaW5TZXJ2aWNlOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLQogICAgIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wKCkgY29uc3Q7CiAKLXByb3RlY3RlZDoKKyAgICAvLyBFeHRyYWN0IGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICBTdHJlYW1SZXF1ZXN0IHBhcmNlbGFibGUoKSBjb25zdDsKKworcHJpdmF0ZToKICAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICBtQ29uZmlndXJhdGlvbjsKICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICBtVXNlcklkID0gKHVpZF90KSAtMTsKICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc0lkID0gKHBpZF90KSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwCmluZGV4IDYxZDdkMjcuLmFhNGFjMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcApAQCAtMjksMjIgKzI5LDQzIEBACiAjaW5jbHVkZSAiYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbjsKIHVzaW5nIGFuZHJvaWQ6Ok5PX0VSUk9SOwogdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi0vKioKLSAqIENvbnRhaW5lciBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lc3NhZ2UgcXVldWVzIHBsdXMKLSAqIGdlbmVyYWwgc3RyZWFtIGluZm9ybWF0aW9uIG5lZWRlZCBieSBBQXVkaW8gY2xpZW50cy4KLSAqIEl0IGNvbnRhaW5zIG5vIGFkZHJlc3NlcywganVzdCBzaXplcywgb2Zmc2V0cyBhbmQgZmlsZSBkZXNjcmlwdG9ycyBmb3IKLSAqIHNoYXJlZCBtZW1vcnkgdGhhdCBjYW4gYmUgcGFzc2VkIHRocm91Z2ggQmluZGVyLgotICovCi1BdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUoKSB7fQorQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKEVuZHBvaW50JiYgcGFyY2VsYWJsZSkKKyAgICAgICAgOiBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkpLAorICAgICAgICAgIG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZS5kb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkpLAorICAgICAgICAgIG1VcERhdGFRdWV1ZVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUudXBEYXRhUXVldWVQYXJjZWxhYmxlKSksCisgICAgICAgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLmRvd25EYXRhUXVldWVQYXJjZWxhYmxlKSksCisgICAgICAgICAgbU51bVNoYXJlZE1lbW9yaWVzKHBhcmNlbGFibGUuc2hhcmVkTWVtb3JpZXMuc2l6ZSgpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJjZWxhYmxlLnNoYXJlZE1lbW9yaWVzLnNpemUoKSAmJiBpIDwgTUFYX1NIQVJFRF9NRU1PUklFUzsgKytpKSB7CisgICAgICAgIC8vIFJlLWNvbnN0cnVjdC4KKyAgICAgICAgbVNoYXJlZE1lbW9yaWVzW2ldLn5TaGFyZWRNZW1vcnlQYXJjZWxhYmxlKCk7CisgICAgICAgIG5ldygmbVNoYXJlZE1lbW9yaWVzW2ldKSBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnNoYXJlZE1lbW9yaWVzW2ldKSk7CisgICAgfQorfQogCi1BdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6fkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKCkge30KK0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlJiBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6b3BlcmF0b3I9KEVuZHBvaW50JiYgcGFyY2VsYWJsZSkgeworICAgIHRoaXMtPn5BdWRpb0VuZHBvaW50UGFyY2VsYWJsZSgpOworICAgIG5ldyh0aGlzKSBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZSkpOworICAgIHJldHVybiAqdGhpczsKK30KKworRW5kcG9pbnQgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnBhcmNlbGFibGUoKSYmIHsKKyAgICBFbmRwb2ludCByZXN1bHQ7CisgICAgcmVzdWx0LnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC51cERhdGFRdWV1ZVBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobVVwRGF0YVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5kb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQuc2hhcmVkTWVtb3JpZXMucmVzZXJ2ZShzdGQ6Om1pbihtTnVtU2hhcmVkTWVtb3JpZXMsIE1BWF9TSEFSRURfTUVNT1JJRVMpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllcyAmJiBpIDwgTUFYX1NIQVJFRF9NRU1PUklFUzsgKytpKSB7CisgICAgICAgIHJlc3VsdC5zaGFyZWRNZW1vcmllcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG1TaGFyZWRNZW1vcmllc1tpXSkucGFyY2VsYWJsZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KIAogLyoqCiAgKiBBZGQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgdGFibGUuCkBAIC02MCw2MCArODEsNiBAQAogICAgIHJldHVybiBpbmRleDsKIH0KIAotLyoqCi0gKiBUaGUgcmVhZCBhbmQgd3JpdGUgbXVzdCBiZSBzeW1tZXRyaWMuCi0gKi8KLXN0YXR1c190IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtTnVtU2hhcmVkTWVtb3JpZXMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllczsgaSsrKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1TaGFyZWRNZW1vcmllc1tpXS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHN0YXR1cyA9IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IG1VcERhdGFRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotCi1lcnJvcjoKLSAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1OdW1TaGFyZWRNZW1vcmllcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVNoYXJlZE1lbW9yaWVzOyBpKyspIHsKLSAgICAgICAgbVNoYXJlZE1lbW9yaWVzW2ldLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHN0YXR1cyA9IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKLQotZXJyb3I6Ci0gICAgQUxPR0UoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6cmVzb2x2ZShFbmRwb2ludERlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZXNvbHZlKG1TaGFyZWRNZW1vcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3ItPnVwTWVzc2FnZVF1ZXVlRGVzY3JpcHRvcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCmluZGV4IGU0ZjhiOWUuLjUyMzdhMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCkBAIC0yMCwxNiArMjAsMTMgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogLy8jaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxhYXVkaW8vRW5kcG9pbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgogI2luY2x1ZGUgImJpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIApAQCAtMzksMTAgKzM2LDE1IEBACiAgKiBJdCBjb250YWlucyBubyBhZGRyZXNzZXMsIGp1c3Qgc2l6ZXMsIG9mZnNldHMgYW5kIGZpbGUgZGVzY3JpcHRvcnMgZm9yCiAgKiBzaGFyZWQgbWVtb3J5IHRoYXQgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIEJpbmRlci4KICAqLwotY2xhc3MgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CitjbGFzcyBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSB7CiBwdWJsaWM6Ci0gICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUoKTsKLSAgICB2aXJ0dWFsIH5BdWRpb0VuZHBvaW50UGFyY2VsYWJsZSgpOworICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKCkgPSBkZWZhdWx0OworCisgICAgLy8gQ3Rvci9hc3NpZ25tZW50IGZyb20gYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uLgorICAgIC8vIFNpbmNlIHRoZSBwYXJjZWxhYmxlIG9iamVjdCBvd25zIHVuaXF1ZSBGRHMgKGZvciBzaGFyZWQgbWVtb3J5IGJsb2NrcyksIG1vdmUgc2VtYW50aWNzIGFyZQorICAgIC8vIHByb3ZpZGVkIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGR1cGUuCisgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUoRW5kcG9pbnQmJiBwYXJjZWxhYmxlKTsKKyAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSYgb3BlcmF0b3I9KEVuZHBvaW50JiYgcGFyY2VsYWJsZSk7CiAKICAgICAvKioKICAgICAgKiBBZGQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgdGFibGUuCkBAIC01MCwxNiArNTIsMTcgQEAKICAgICAgKi8KICAgICBpbnQzMl90IGFkZEZpbGVEZXNjcmlwdG9yKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoRW5kcG9pbnREZXNjcmlwdG9yICpkZXNjcmlwdG9yKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpOwogCiAgICAgdm9pZCBkdW1wKCk7CiAKKyAgICAvLyBFeHRyYWN0IGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAvLyBTaW5jZSBvdXIgc2hhcmVkIG1lbW9yeSBvYmplY3RzIG93biBhIHVuaXF1ZSBGRCwgbW92ZSBzZW1hbnRpY3MgYXJlIHByb3ZpZGVkIHRvIGF2b2lkIHRoZQorICAgIC8vIG5lZWQgdG8gZHVwZS4KKyAgICBFbmRwb2ludCBwYXJjZWxhYmxlKCkmJjsKKwogcHVibGljOiAvLyBUT0RPIGFkZCBnZXR0ZXJzCiAgICAgLy8gU2V0IGNhcGFjaXR5SW5GcmFtZXMgdG8gemVybyBpZiBRdWV1ZSBpcyB1bnVzZWQuCiAgICAgUmluZ0J1ZmZlclBhcmNlbGFibGUgICAgbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZTsgICAvLyBzZXJ2ZXIgdG8gY2xpZW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OWM0ZTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotCi0jaW5jbHVkZSAiYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5oIgotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Q7Ci0KLS8qKgotICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBBQXVkaW8gU2VydmljZSB0byB0YWxrIHRvIGFuIEFBdWRpbyBDbGllbnQuCi0gKgotICogVGhlIG9yZGVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIFBhcmNlbHMgbXVzdCBtYXRjaCB3aXRoIGNvZGUgaW4gQUF1ZGlvQ2xpZW50LmNwcC4KLSAqLwotY2xhc3MgQnBBQXVkaW9DbGllbnQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUFBdWRpb0NsaWVudD4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcEFBdWRpb0NsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQUF1ZGlvQ2xpZW50PihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIG9uU3RyZWFtQ2hhbmdlKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUsIGludDMyX3Qgb3Bjb2RlLCBpbnQzMl90IHZhbHVlKSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBQXVkaW9DbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3Bjb2RlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHZhbHVlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX1NUUkVBTV9DSEFOR0UsIGRhdGEsICAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KLX07Ci0KLS8vIEltcGxlbWVudCBhbiBpbnRlcmZhY2UgdG8gdGhlIHNlcnZpY2UuCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQUF1ZGlvQ2xpZW50LCAiSUFBdWRpb0NsaWVudCIpOwotCi0vLyBUaGUgb3JkZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgUGFyY2VscyBtdXN0IG1hdGNoIHdpdGggY29kZSBpbiBCcEFBdWRpb0NsaWVudAotCi1zdGF0dXNfdCBCbkFBdWRpb0NsaWVudDo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlOwotICAgIGludDMyX3Qgb3Bjb2RlID0gMDsKLSAgICBpbnQzMl90IHZhbHVlID0gMDsKLSAgICBBTE9HVigiQm5BQXVkaW9DbGllbnQ6Om9uVHJhbnNhY3QoJXUpICV1IiwgY29kZSwgZmxhZ3MpOwotCi0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBPTl9TVFJFQU1fQ0hBTkdFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUFBdWRpb0NsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBkYXRhLnJlYWRJbnQzMigmb3Bjb2RlKTsKLSAgICAgICAgICAgIGRhdGEucmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgICAgICAgICBvblN0cmVhbUNoYW5nZShzdHJlYW1IYW5kbGUsIG9wY29kZSwgdmFsdWUpOwotICAgICAgICAgICAgQUxPR0QoIkJuQUF1ZGlvQ2xpZW50IG9uU3RyZWFtQ2hhbmdlKCV4LCAlZCwgJWQpIiwgc3RyZWFtSGFuZGxlLCBvcGNvZGUsIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gQUxPR1coIkJuQUF1ZGlvQ2xpZW50OjpvblRyYW5zYWN0IG5vdCBoYW5kbGVkICV1IiwgY29kZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMWZkOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQUFVRElPX0lBQVVESU9fQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9BQVVESU9fSUFBVURJT19DTElFTlRfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLQotI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi0vLyBJbnRlcmZhY2UgKG91ciBBSURMKSAtIGNsaWVudCBtZXRob2RzIGNhbGxlZCBieSBzZXJ2aWNlCi1jbGFzcyBJQUF1ZGlvQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UgewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBQXVkaW9DbGllbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uU3RyZWFtQ2hhbmdlKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpID0gMDsKLQotfTsKLQotY2xhc3MgQm5BQXVkaW9DbGllbnQgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUFBdWRpb0NsaWVudD4gewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCi0KLSNlbmRpZiAvL0FORFJPSURfQUFVRElPX0lBQVVESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxN2IzYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLQotI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgotI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90OwotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgQUF1ZGlvIENsaWVudCB0byB0YWxrIHRvIHRoZSBBQXVkaW8gU2VydmljZS4KLSAqCi0gKiBUaGUgb3JkZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgUGFyY2VscyBtdXN0IG1hdGNoIHdpdGggY29kZSBpbiBBQXVkaW9TZXJ2aWNlLmNwcC4KLSAqLwotY2xhc3MgQnBBQXVkaW9TZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElBQXVkaW9TZXJ2aWNlPgotewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwQUF1ZGlvU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQUF1ZGlvU2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9DTElFTlQsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgYWF1ZGlvX2hhbmRsZV90IG9wZW5TdHJlYW0oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIC8vIHNlbmQgY29tbWFuZAotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIC8vIHJlcXVlc3QuZHVtcCgpOwotICAgICAgICByZXF1ZXN0LndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCBvcGVuU3RyZWFtIHRyYW5zYWN0IGZhaWxlZCAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtOwotICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoJnN0cmVhbSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChPUEVOX1NUUkVBTSkgcmVhZEludCAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGNvbmZpZ3VyYXRpb25PdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IG9wZW5TdHJlYW0gcmVhZEZyb21QYXJjZWwgZmFpbGVkICVkIiwgZXJyKTsKLSAgICAgICAgICAgIGNsb3NlU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KENMT1NFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IGNsb3NlU3RyZWFtIHRyYW5zYWN0IGZhaWxlZCAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzOwotICAgICAgICByZXBseS5yZWFkSW50MzIoJnJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgLy8gc2VuZCBjb21tYW5kCi0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQUF1ZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSRUFNX0RFU0NSSVBUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgdHJhbnNhY3QoR0VUX1NUUkVBTV9ERVNDUklQVElPTikgcmV0dXJucyAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OwotICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoJnJlc3VsdCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChHRVRfU1RSRUFNX0RFU0NSSVBUSU9OKSByZWFkSW50ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCBHRVRfU1RSRUFNX0RFU0NSSVBUSU9OIHBhc3NlZCByZXN1bHQgJWQiLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChHRVRfU1RSRUFNX0RFU0NSSVBUSU9OKSByZWFkIGVuZHBvaW50ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gVE9ETyBzaG91bGQgd2Ugd2FpdCBmb3IgYSByZXBseT8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgLy8gc2VuZCBjb21tYW5kCi0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQUF1ZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhcnNlIHJlcGx5Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXM7Ci0gICAgICAgIHJlcGx5LnJlYWRJbnQzMigmcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgLy8gc2VuZCBjb21tYW5kCi0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQUF1ZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChQQVVTRV9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhcnNlIHJlcGx5Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXM7Ci0gICAgICAgIHJlcGx5LnJlYWRJbnQzMigmcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzOwotICAgICAgICByZXBseS5yZWFkSW50MzIoJnJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZmx1c2hTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIC8vIHNlbmQgY29tbWFuZAotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1IYW5kbGUpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoRkxVU0hfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzOwotICAgICAgICByZXBseS5yZWFkSW50MzIoJnJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzKQotICAgIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRUaHJlYWRJZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChwZXJpb2ROYW5vc2Vjb25kcyk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9BVURJT19USFJFQUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhcnNlIHJlcGx5Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXM7Ci0gICAgICAgIHJlcGx5LnJlYWRJbnQzMigmcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpCi0gICAgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIC8vIHNlbmQgY29tbWFuZAotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1IYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudFRocmVhZElkKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFVOUkVHSVNURVJfQVVESU9fVEhSRUFELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzOwotICAgICAgICByZXBseS5yZWFkSW50MzIoJnJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi19OwotCi0vLyBJbXBsZW1lbnQgYW4gaW50ZXJmYWNlIHRvIHRoZSBzZXJ2aWNlLgotLy8gVGhpcyBpcyBoZXJlIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gbGluayB3aXRoIGxpYmFhdWRpbyBzdGF0aWMgbGlicmFyeS4KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBQXVkaW9TZXJ2aWNlLCAiSUFBdWRpb1NlcnZpY2UiKTsKLQotLy8gVGhlIG9yZGVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIFBhcmNlbHMgbXVzdCBtYXRjaCB3aXRoIGNvZGUgaW4gQnBBQXVkaW9TZXJ2aWNlCi0KLXN0YXR1c190IEJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlID0gMDsKLSAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgcmVxdWVzdDsKLSAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLSAgICBwaWRfdCB0aWQgPSAwOwotICAgIGludDY0X3QgbmFub3NlY29uZHMgPSAwOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgQUxPR1YoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCglaSkgJWkiLCBjb2RlLCBmbGFncyk7Ci0KLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIFJFR0lTVEVSX0NMSUVOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBQXVkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJQUF1ZGlvQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQUF1ZGlvQ2xpZW50PigKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgLy8gcmVhZFN0cm9uZ0JpbmRlcigpIGNhbiByZXR1cm4gbnVsbAotICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoUkVHSVNURVJfQ0xJRU5UKSBjbGllbnQgaXMgTlVMTCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTYyMzA0NTMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgT1BFTl9TVFJFQU06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVxdWVzdC5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXF1ZXN0LnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSA9IHJlc3VsdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HRCgiQm5BQXVkaW9TZXJ2aWNlOjpjbGllbnQgb3BlblN0cmVhbSByZXF1ZXN0IGR1bXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICAgICAgICAvL3JlcXVlc3QuZHVtcCgpOwotICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIHRoZSB1aWQgYW5kIHBpZCBmcm9tIHRoZSBjbGllbnQgaW4gY2FzZSB0aGV5IGFyZSBpbmNvcnJlY3QuCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRVc2VySWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFByb2Nlc3NJZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSA9IG9wZW5TdHJlYW0ocmVxdWVzdCwgY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgLy9BTE9HRCgiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IE9QRU5fU1RSRUFNIHNlcnZlciBoYW5kbGUgPSAweCUwOFgiLAotICAgICAgICAgICAgICAgIC8vICAgICAgICBzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ud3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDTE9TRV9TVFJFQU06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoQ0xPU0VfU1RSRUFNKSBzdHJlYW1IYW5kbGUgZmFpbGVkISIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gY2xvc2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgIC8vQUxPR0QoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCBDTE9TRV9TVFJFQU0gMHglMDhYLCByZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICAvLyAgICAgIHN0cmVhbUhhbmRsZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfU1RSRUFNX0RFU0NSSVBUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUFBdWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJCbkFBdWRpb1NlcnZpY2U6OiVzKEdFVF9TVFJFQU1fREVTQ1JJUFRJT04pIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhYXVkaW86OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIHBhcmNlbGFibGU7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1EZXNjcmlwdGlvbihzdHJlYW1IYW5kbGUsIHBhcmNlbGFibGUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RBUlRfU1RSRUFNOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUFBdWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJCbkFBdWRpb1NlcnZpY2U6OiVzKFNUQVJUX1NUUkVBTSkgc3RyZWFtSGFuZGxlIGZhaWxlZCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IHN0YXJ0U3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBBTE9HVigiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IFNUQVJUX1NUUkVBTSAweCUwOFgsIHJlc3VsdCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlLCByZXN1bHQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFBBVVNFX1NUUkVBTTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBQXVkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhQQVVTRV9TVFJFQU0pIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBwYXVzZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgQUxPR1YoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCBQQVVTRV9TVFJFQU0gMHglMDhYLCByZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICBzdHJlYW1IYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RPUF9TVFJFQU06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoU1RPUF9TVFJFQU0pIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBzdG9wU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBBTE9HVigiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IFNUT1BfU1RSRUFNIDB4JTA4WCwgcmVzdWx0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlLCByZXN1bHQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEZMVVNIX1NUUkVBTTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBQXVkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhGTFVTSF9TVFJFQU0pIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBmbHVzaFN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgQUxPR1YoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCBGTFVTSF9TVFJFQU0gMHglMDhYLCByZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSRUdJU1RFUl9BVURJT19USFJFQUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoUkVHSVNURVJfQVVESU9fVEhSRUFEKSBzdHJlYW1IYW5kbGUgZmFpbGVkISIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnRpZCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoUkVHSVNURVJfQVVESU9fVEhSRUFEKSB0aWQgZmFpbGVkISIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50NjQoJm5hbm9zZWNvbmRzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhSRUdJU1RFUl9BVURJT19USFJFQUQpIG5hbm9zZWNvbmRzIGZhaWxlZCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCB0aWQsIG5hbm9zZWNvbmRzKTsKLSAgICAgICAgICAgIEFMT0dWKCJCbkFBdWRpb1NlcnZpY2U6OiVzKFJFR0lTVEVSX0FVRElPX1RIUkVBRCkgMHglMDhYLCByZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgVU5SRUdJU1RFUl9BVURJT19USFJFQUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoVU5SRUdJU1RFUl9BVURJT19USFJFQUQpIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmdGlkKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhVTlJFR0lTVEVSX0FVRElPX1RIUkVBRCkgdGlkIGZhaWxlZCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IHVucmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsIHRpZCk7Ci0gICAgICAgICAgICBBTE9HVigiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IFVOUkVHSVNURVJfQVVESU9fVEhSRUFEIDB4JTA4WCwgcmVzdWx0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1IYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBBTE9HVygiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IG5vdCBoYW5kbGVkICV1IiwgY29kZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkYjgyNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0FBVURJT19JQUFVRElPX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0FBVURJT19JQUFVRElPX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9UZXh0T3V0cHV0Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLQotI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCi0jaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlRGVmaW5pdGlvbnMuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBBQVVESU9fU0VSVklDRV9OQU1FICAibWVkaWEuYWF1ZGlvIgotCi0vLyBJbnRlcmZhY2UgKG91ciBBSURMKSAtIHNlcnZpY2UgbWV0aG9kcyBjYWxsZWQgYnkgY2xpZW50Ci1jbGFzcyBJQUF1ZGlvU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQUF1ZGlvU2VydmljZSk7Ci0KLSAgICAvLyBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBhdWRpbyBpbnB1dC9vdXRwdXQgY2hhbmdlIGFuZCB0cmFjayBub3RpZmljYXRpb25zLgotICAgIC8vIEZvciBhIGdpdmVuIGNhbGxpbmcgcGlkLCBBQXVkaW8gc2VydmljZSBkaXNyZWdhcmRzIGFueSByZWdpc3RyYXRpb25zIGFmdGVyIHRoZSBmaXJzdC4KLSAgICAvLyBUaHVzIHRoZSBJQUF1ZGlvQ2xpZW50IG11c3QgYmUgYSBzaW5nbGV0b24gcGVyIHByb2Nlc3MuCi0gICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpID0gMDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IGluZm8gbmVlZGVkIHRvIGNyZWF0ZSB0aGUgc3RyZWFtCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNyZWF0ZWQgc3RyZWFtCi0gICAgICogQHJldHVybiBoYW5kbGUgdG8gdGhlIHN0cmVhbSBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICovCi0gICAgdmlydHVhbCBhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBvcGVuU3RyZWFtKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpID0gMDsKLQotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgPSAwOwotCi0gICAgLyogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW4tbWVtb3J5IHF1ZXVlcwotICAgICogdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgotICAgICovCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCB0aGUgZmxvdyBvZiBkYXRhLgotICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBTVEFSVEVEIGV2ZW50LgotICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHN1Y2ggdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aG91dCBsb3NzIG9mIGRhdGEuCi0gICAgICogVGhpcyBpcyBhc3luY2hyb25vdXMuIFdoZW4gY29tcGxldGUsIHRoZSBzZXJ2aWNlIHdpbGwgc2VuZCBhIFBBVVNFRCBldmVudC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZVN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpID0gMDsKLQotICAgIC8qKgotICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzdWNoIHRoYXQgdGhlIGRhdGEgY3VycmVudGx5IGluIHRoZSBidWZmZXIgaXMgcGxheWVkLgotICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBTVE9QUEVEIGV2ZW50LgotICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiAgRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgotICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBGTFVTSEVEIGV2ZW50LgotICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogTWFuYWdlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGFzIGEgbG93IGxhdGVuY3kgYXVkaW8gdGhyZWFkLgotICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpID0gMDsKLQotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgPSAwOwotfTsKLQotY2xhc3MgQm5BQXVkaW9TZXJ2aWNlIDogcHVibGljIEJuSW50ZXJmYWNlPElBQXVkaW9TZXJ2aWNlPiB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotfTsKLQotfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwotCi0jZW5kaWYgLy9BTkRST0lEX0FBVURJT19JQUFVRElPX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAKaW5kZXggNDk5NmIzZi4uYTRiM2NlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwCkBAIC0yOSw4ICsyOSwyOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi1SaW5nQnVmZmVyUGFyY2VsYWJsZTo6UmluZ0J1ZmZlclBhcmNlbGFibGUoKSB7fQotUmluZ0J1ZmZlclBhcmNlbGFibGU6On5SaW5nQnVmZmVyUGFyY2VsYWJsZSgpIHt9CitSaW5nQnVmZmVyUGFyY2VsYWJsZTo6UmluZ0J1ZmZlclBhcmNlbGFibGUoY29uc3QgUmluZ0J1ZmZlciYgcGFyY2VsYWJsZSkKKyAgICAgICAgOiBtUmVhZENvdW50ZXJQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnJlYWRDb3VudGVyUGFyY2VsYWJsZSkpLAorICAgICAgICAgIG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLndyaXRlQ291bnRlclBhcmNlbGFibGUpKSwKKyAgICAgICAgICBtRGF0YVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUuZGF0YVBhcmNlbGFibGUpKSwKKyAgICAgICAgICBtQnl0ZXNQZXJGcmFtZShwYXJjZWxhYmxlLmJ5dGVzUGVyRnJhbWUpLAorICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdChwYXJjZWxhYmxlLmZyYW1lc1BlckJ1cnN0KSwKKyAgICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyhwYXJjZWxhYmxlLmNhcGFjaXR5SW5GcmFtZXMpLAorICAgICAgICAgIG1GbGFncyhzdGF0aWNfY2FzdDxSaW5nYnVmZmVyRmxhZ3M+KHBhcmNlbGFibGUuZmxhZ3MpKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobUZsYWdzKSA9PSBzaXplb2YocGFyY2VsYWJsZS5mbGFncykpOworfQorCitSaW5nQnVmZmVyIFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpwYXJjZWxhYmxlKCkgY29uc3QgeworICAgIFJpbmdCdWZmZXIgcmVzdWx0OworICAgIHJlc3VsdC5yZWFkQ291bnRlclBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobVJlYWRDb3VudGVyUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC53cml0ZUNvdW50ZXJQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRhdGFQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1EYXRhUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5ieXRlc1BlckZyYW1lID0gbUJ5dGVzUGVyRnJhbWU7CisgICAgcmVzdWx0LmZyYW1lc1BlckJ1cnN0ID0gbUZyYW1lc1BlckJ1cnN0OworICAgIHJlc3VsdC5jYXBhY2l0eUluRnJhbWVzID0gbUNhcGFjaXR5SW5GcmFtZXM7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobUZsYWdzKSA9PSBzaXplb2YocmVzdWx0LmZsYWdzKSk7CisgICAgcmVzdWx0LmZsYWdzID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUZsYWdzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQogCiAvLyBUT0RPIFRoaXMgYXNzdW1lcyB0aGF0IGFsbCB0aHJlZSB1c2UgdGhlIHNhbWUgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZQogdm9pZCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6c2V0dXBNZW1vcnkoaW50MzJfdCBzaGFyZWRNZW1vcnlJbmRleCwKQEAgLTc2LDU4ICs5Nyw2IEBACiAgICAgbUNhcGFjaXR5SW5GcmFtZXMgPSBjYXBhY2l0eUluRnJhbWVzOwogfQogCi0vKioKLSAqIFRoZSByZWFkIGFuZCB3cml0ZSBtdXN0IGJlIHN5bW1ldHJpYy4KLSAqLwotc3RhdHVzX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1DYXBhY2l0eUluRnJhbWVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIGlmIChtQ2FwYWNpdHlJbkZyYW1lcyA+IDApIHsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1CeXRlc1BlckZyYW1lKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtRmxhZ3MpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgICAgICBzdGF0dXMgPSBtUmVhZENvdW50ZXJQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gbVdyaXRlQ291bnRlclBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgICAgICBzdGF0dXMgPSBtRGF0YVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci1lcnJvcjoKLSAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1DYXBhY2l0eUluRnJhbWVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIGlmIChtQ2FwYWNpdHlJbkZyYW1lcyA+IDApIHsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1CeXRlc1BlckZyYW1lKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90ICopJm1GbGFncyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgICAgIHN0YXR1cyA9IG1SZWFkQ291bnRlclBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gbVdyaXRlQ291bnRlclBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gbURhdGFQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKLWVycm9yOgotICAgIEFMT0dFKCIlcyByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VscywgUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCmluZGV4IDFkYmNmMDcuLjI1MDhjZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgPGFhdWRpby9SaW5nQnVmZmVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZURlZmluaXRpb25zLmgiCkBAIC0yNiwxMCArMjcsMTIgQEAKIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLWNsYXNzIFJpbmdCdWZmZXJQYXJjZWxhYmxlIDogcHVibGljIFBhcmNlbGFibGUgeworY2xhc3MgUmluZ0J1ZmZlclBhcmNlbGFibGUgIHsKIHB1YmxpYzoKLSAgICBSaW5nQnVmZmVyUGFyY2VsYWJsZSgpOwotICAgIHZpcnR1YWwgflJpbmdCdWZmZXJQYXJjZWxhYmxlKCk7CisgICAgUmluZ0J1ZmZlclBhcmNlbGFibGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBDb25zdHJ1Y3QgYmFzZWQgb24gYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uLgorICAgIGV4cGxpY2l0IFJpbmdCdWZmZXJQYXJjZWxhYmxlKGNvbnN0IFJpbmdCdWZmZXImIHBhcmNlbGFibGUpOwogCiAgICAgLy8gVE9ETyBUaGlzIGFzc3VtZXMgdGhhdCBhbGwgdGhyZWUgdXNlIHRoZSBzYW1lIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUKICAgICB2b2lkIHNldHVwTWVtb3J5KGludDMyX3Qgc2hhcmVkTWVtb3J5SW5kZXgsCkBAIC01NywyMSArNjAsMTQgQEAKIAogICAgIGJvb2wgaXNGaWxlRGVzY3JpcHRvclNhZmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2Vscyk7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgcmVhZCBhbmQgd3JpdGUgbXVzdCBiZSBzeW1tZXRyaWMuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VscywgUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpOwogCiAgICAgdm9pZCBkdW1wKCk7CiAKKyAgICAvLyBFeHRyYWN0IGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICBSaW5nQnVmZmVyIHBhcmNlbGFibGUoKSBjb25zdDsKKwogcHJpdmF0ZToKLQotICAgIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpIGNvbnN0OwotCiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSAgbVJlYWRDb3VudGVyUGFyY2VsYWJsZTsKICAgICBTaGFyZWRSZWdpb25QYXJjZWxhYmxlICBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZTsKICAgICBTaGFyZWRSZWdpb25QYXJjZWxhYmxlICBtRGF0YVBhcmNlbGFibGU7CkBAIC03OSw2ICs3NSw4IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gMDsgICAgLy8gZm9yIElTT0NIUk9OT1VTIHF1ZXVlcwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYXBhY2l0eUluRnJhbWVzID0gMDsgIC8vIHplcm8gaWYgdW51c2VkCiAgICAgUmluZ2J1ZmZlckZsYWdzICAgICAgICAgbUZsYWdzID0gUmluZ2J1ZmZlckZsYWdzOjpOT05FOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAppbmRleCBiNmU4NDcyLi42ODViNzc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKQEAgLTMzLDYxICszNCwzNiBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbjsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAotU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6U2hhcmVkTWVtb3J5UGFyY2VsYWJsZSgpIHt9Ci1TaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjp+U2hhcmVkTWVtb3J5UGFyY2VsYWJsZSgpIHt9OworU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6U2hhcmVkTWVtb3J5UGFyY2VsYWJsZShTaGFyZWRGaWxlUmVnaW9uJiYgcGFyY2VsYWJsZSkgeworICAgIG1GZCA9IHBhcmNlbGFibGUuZmQucmVsZWFzZSgpOworICAgIG1TaXplSW5CeXRlcyA9IHBhcmNlbGFibGUuc2l6ZTsKKyAgICBtT2Zmc2V0SW5CeXRlcyA9IHBhcmNlbGFibGUub2Zmc2V0OworfQorCitTaGFyZWRGaWxlUmVnaW9uIFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnBhcmNlbGFibGUoKSAmJiB7CisgICAgU2hhcmVkRmlsZVJlZ2lvbiByZXN1bHQ7CisgICAgcmVzdWx0LmZkLnJlc2V0KHN0ZDo6bW92ZShtRmQpKTsKKyAgICByZXN1bHQuc2l6ZSA9IG1TaXplSW5CeXRlczsKKyAgICByZXN1bHQub2Zmc2V0ID0gbU9mZnNldEluQnl0ZXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpkdXAoKSBjb25zdCB7CisgICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSByZXN1bHQ7CisgICAgcmVzdWx0LnNldHVwKG1GZCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obVNpemVJbkJ5dGVzKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cChjb25zdCB1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKSB7Ci0gICAgbUZkLnJlc2V0KGR1cChmZC5nZXQoKSkpOyAvLyBzdG9yZSBhIGR1cGxpY2F0ZSBmZAorICAgIG1GZC5yZXNldCg6OmR1cChmZC5nZXQoKSkpOyAvLyBzdG9yZSBhIGR1cGxpY2F0ZSBmZAogICAgIEFMT0dWKCJzZXR1cChmZCA9ICVkIC0+ICVkLCBzaXplID0gJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOwogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCi1zdGF0dXNfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLQotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2l6ZUluQnl0ZXMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKG1TaXplSW5CeXRlcyA+IDApIHsKLSAgICAgICAgQUxPR1YoIndyaXRlVG9QYXJjZWwoKSBtRmQgPSAlZCwgdGhpcyA9ICVwXG4iLCBtRmQuZ2V0KCksIHRoaXMpOwotICAgICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlVW5pcXVlRmlsZURlc2NyaXB0b3IobUZkKTsKLSAgICAgICAgQUxPR0VfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSB3cml0ZUR1cEZpbGVEZXNjcmlwdG9yIGZhaWxlZCA6ICVkIiwKLSAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbVNpemVJbkJ5dGVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgaWYgKG1TaXplSW5CeXRlcyA+IDApIHsKLSAgICAgICAgLy8gVGhlIFBhcmNlbCBvd25zIHRoZSBmaWxlIGRlc2NyaXB0b3IgYW5kIHdpbGwgY2xvc2UgaXQgbGF0ZXIuCi0gICAgICAgIHVuaXF1ZV9mZCBtbWFwRmQ7Ci0gICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVuaXF1ZUZpbGVEZXNjcmlwdG9yKCZtbWFwRmQpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVhZEZyb21QYXJjZWwoKSByZWFkVW5pcXVlRmlsZURlc2NyaXB0b3IoKSBmYWlsZWQgOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSB0aGUgbWVtb3J5IG5vdyB3aGlsZSB3ZSBzdGlsbCBoYXZlIHRoZSBGRCBmcm9tIHRoZSBQYXJjZWwuCi0gICAgICAgIC8vIENsb3NpbmcgdGhlIEZEIHdpbGwgbm90IGFmZmVjdCB0aGUgc2hhcmVkIG1lbW9yeSBvbmNlIG1tYXAoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSByZXNvbHZlU2hhcmVkTWVtb3J5KG1tYXBGZCk7Ci0gICAgICAgIHN0YXR1cyA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHJlc3VsdCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHZhbGlkYXRlKCkpOwotCi1lcnJvcjoKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6Y2xvc2UoKSB7CiAgICAgaWYgKG1SZXNvbHZlZEFkZHJlc3MgIT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKICAgICAgICAgaW50IGVyciA9IG11bm1hcChtUmVzb2x2ZWRBZGRyZXNzLCBtU2l6ZUluQnl0ZXMpOwpAQCAtMTA0LDcgKzgwLDcgQEAKICAgICBtUmVzb2x2ZWRBZGRyZXNzID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2l6ZUluQnl0ZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmQuZ2V0KCksIDApOwogICAgIGlmIChtUmVzb2x2ZWRBZGRyZXNzID09IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBuQnl0ZXMgPSAlZCwgZXJybm8gPSAlcyIsCisgICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBuQnl0ZXMgPSAlIiBQUklkNjQgIiwgZXJybm8gPSAlcyIsCiAgICAgICAgICAgICAgIGZkLmdldCgpLCBtU2l6ZUluQnl0ZXMsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQpAQCAtMTE4LDcgKzk0LDcgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfSBlbHNlIGlmICgob2Zmc2V0SW5CeXRlcyArIHNpemVJbkJ5dGVzKSA+IG1TaXplSW5CeXRlcykgewogICAgICAgICBBTE9HRSgib3V0IG9mIHJhbmdlLCBvZmZzZXRJbkJ5dGVzID0gJWQsICIKLSAgICAgICAgICAgICAgICAgICAgICAic2l6ZUluQnl0ZXMgPSAlZCwgbVNpemVJbkJ5dGVzID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICJzaXplSW5CeXRlcyA9ICVkLCBtU2l6ZUluQnl0ZXMgPSAlIiBQUklkNjQsCiAgICAgICAgICAgICAgIG9mZnNldEluQnl0ZXMsIHNpemVJbkJ5dGVzLCBtU2l6ZUluQnl0ZXMpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0xNDgsNyArMTI0LDExIEBACiAKIGFhdWRpb19yZXN1bHRfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNpemVJbkJ5dGVzIDwgMCB8fCBtU2l6ZUluQnl0ZXMgPj0gTUFYX01NQVBfU0laRV9CWVRFUykgewotICAgICAgICBBTE9HRSgiaW52YWxpZCBtU2l6ZUluQnl0ZXMgPSAlZCIsIG1TaXplSW5CeXRlcyk7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1TaXplSW5CeXRlcyA9ICUiIFBSSWQ2NCwgbVNpemVJbkJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorICAgIGlmIChtT2Zmc2V0SW5CeXRlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1PZmZzZXRJbkJ5dGVzID0gJSIgUFJJZDY0LCBtT2Zmc2V0SW5CeXRlcyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMTU2LDUgKzEzNiw1IEBACiAKIHZvaWQgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6ZHVtcCgpIHsKICAgICBBTE9HRCgibUZkID0gJWQiLCBtRmQuZ2V0KCkpOwotICAgIEFMT0dEKCJtU2l6ZUluQnl0ZXMgPSAlZCIsIG1TaXplSW5CeXRlcyk7CisgICAgQUxPR0QoIm1TaXplSW5CeXRlcyA9ICUiIFBSSWQ2NCwgbVNpemVJbkJ5dGVzKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCmluZGV4IDRlYzM4YzUuLjFmMmMzMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaApAQCAtMjEsMTIgKzIxLDExIEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1NoYXJlZEZpbGVSZWdpb24uaD4KIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLS8vIEFyYml0cmFyeSBsaW1pdHMgZm9yIHNhbml0eSBjaGVja3MuIFRPRE8gcmVtb3ZlIGFmdGVyIGRlYnVnZ2luZy4KKy8vIEFyYml0cmFyeSBsaW1pdHMgZm9yIHJhbmdlIGNoZWNrcy4KICNkZWZpbmUgTUFYX1NIQVJFRF9NRU1PUklFUyAoMzIpCiAjZGVmaW5lIE1BWF9NTUFQX09GRlNFVF9CWVRFUyAoMzIgKiAxMDI0ICogOCkKICNkZWZpbmUgTUFYX01NQVBfU0laRV9CWVRFUyAoMzIgKiAxMDI0ICogOCkKQEAgLTM2LDEwICszNSwxNCBAQAogICogSXQgbWF5IGJlIGRpdmlkZWQgaW50byBzZXZlcmFsIHJlZ2lvbnMuCiAgKiBUaGUgbWVtb3J5IGNhbiBiZSBzaGFyZWQgdXNpbmcgQmluZGVyIG9yIHNpbXBseSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzLgogICovCi1jbGFzcyBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworY2xhc3MgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSB7CiBwdWJsaWM6Ci0gICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSgpOwotICAgIHZpcnR1YWwgflNoYXJlZE1lbW9yeVBhcmNlbGFibGUoKTsKKyAgICBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlKCkgPSBkZWZhdWx0OworCisgICAgLy8gQ3RvciBmcm9tIGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbi4KKyAgICAvLyBTaW5jZSB0aGUgcGFyY2VsYWJsZSBvYmplY3Qgb3ducyBhIHVuaXF1ZSBGRCwgbW92ZSBzZW1hbnRpY3MgYXJlIHByb3ZpZGVkIHRvIGF2b2lkIHRoZSBuZWVkCisgICAgLy8gdG8gZHVwZS4KKyAgICBleHBsaWNpdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlKGFuZHJvaWQ6Om1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uJiYgcGFyY2VsYWJsZSk7CiAKICAgICAvKioKICAgICAgKiBNYWtlIGEgZHVwKCkgb2YgdGhlIGZkIGFuZCBzdG9yZSBpdCBmb3IgbGF0ZXIgdXNlLgpAQCAtNDksMTAgKzUyLDYgQEAKICAgICAgKi8KICAgICB2b2lkIHNldHVwKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpOwogCi0gICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgLy8gbW1hcCgpIHNoYXJlZCBtZW1vcnkKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZShpbnQzMl90IG9mZnNldEluQnl0ZXMsIGludDMyX3Qgc2l6ZUluQnl0ZXMsIHZvaWQgKipyZWdpb25BZGRyZXNzUHRyKTsKIApAQCAtNjMsMjAgKzYyLDIzIEBACiAKICAgICB2b2lkIGR1bXAoKTsKIAotcHJvdGVjdGVkOgorICAgIC8vIEV4dHJhY3QgYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgIC8vIFNpbmNlIHdlIG93biBhIHVuaXF1ZSBGRCwgbW92ZSBzZW1hbnRpY3MgYXJlIHByb3ZpZGVkIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGR1cGUuCisgICAgYW5kcm9pZDo6bWVkaWE6OlNoYXJlZEZpbGVSZWdpb24gcGFyY2VsYWJsZSgpICYmOwogCi0jZGVmaW5lIE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KE1BUF9GQUlMRUQpCi0KLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZVNoYXJlZE1lbW9yeShjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkKTsKLQotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAgIG1GZDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2l6ZUluQnl0ZXMgPSAwOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKKyAgICAvLyBDb3B5IHRoaXMgaW5zdGFuY2UuIER1cGxpY2F0ZXMgdGhlIHVuZGVybHlpbmcgRkQuCisgICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBkdXAoKSBjb25zdDsKIAogcHJpdmF0ZToKKyNkZWZpbmUgTU1BUF9VTlJFU09MVkVEX0FERFJFU1MgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oTUFQX0ZBSUxFRCkKIAorICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAgIG1GZDsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBtU2l6ZUluQnl0ZXMgPSAwOworICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgIG1PZmZzZXRJbkJ5dGVzID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICptUmVzb2x2ZWRBZGRyZXNzID0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1M7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZVNoYXJlZE1lbW9yeShjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKSBjb25zdDsKLQogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKaW5kZXggYzc3NjExNi4uNTZiOTljMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcApAQCAtMzYsOCArMzYsMTggQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAotU2hhcmVkUmVnaW9uUGFyY2VsYWJsZTo6U2hhcmVkUmVnaW9uUGFyY2VsYWJsZSgpIHt9Ci1TaGFyZWRSZWdpb25QYXJjZWxhYmxlOjp+U2hhcmVkUmVnaW9uUGFyY2VsYWJsZSgpIHt9CitTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjpTaGFyZWRSZWdpb25QYXJjZWxhYmxlKGNvbnN0IFNoYXJlZFJlZ2lvbiYgcGFyY2VsYWJsZSkKKyAgICAgICAgOiBtU2hhcmVkTWVtb3J5SW5kZXgocGFyY2VsYWJsZS5zaGFyZWRNZW1vcnlJbmRleCksCisgICAgICAgICAgbU9mZnNldEluQnl0ZXMocGFyY2VsYWJsZS5vZmZzZXRJbkJ5dGVzKSwKKyAgICAgICAgICBtU2l6ZUluQnl0ZXMocGFyY2VsYWJsZS5zaXplSW5CeXRlcykge30KKworU2hhcmVkUmVnaW9uIFNoYXJlZFJlZ2lvblBhcmNlbGFibGU6OnBhcmNlbGFibGUoKSBjb25zdCB7CisgICAgU2hhcmVkUmVnaW9uIHJlc3VsdDsKKyAgICByZXN1bHQuc2hhcmVkTWVtb3J5SW5kZXggPSBtU2hhcmVkTWVtb3J5SW5kZXg7CisgICAgcmVzdWx0Lm9mZnNldEluQnl0ZXMgPSBtT2Zmc2V0SW5CeXRlczsKKyAgICByZXN1bHQuc2l6ZUluQnl0ZXMgPSBtU2l6ZUluQnl0ZXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KIAogdm9pZCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjpzZXR1cChpbnQzMl90IHNoYXJlZE1lbW9yeUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldEluQnl0ZXMsCkBAIC00Nyw0MSArNTcsNiBAQAogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCi1zdGF0dXNfdCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2l6ZUluQnl0ZXMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgaWYgKG1TaXplSW5CeXRlcyA+IDApIHsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1TaGFyZWRNZW1vcnlJbmRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtT2Zmc2V0SW5CeXRlcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLQotZXJyb3I6Ci0gICAgQUxPR0UoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFNoYXJlZFJlZ2lvblBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1TaXplSW5CeXRlcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBpZiAobVNpemVJbkJ5dGVzID4gMCkgewotICAgICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbVNoYXJlZE1lbW9yeUluZGV4KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1PZmZzZXRJbkJ5dGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHZhbGlkYXRlKCkpOwotCi1lcnJvcjoKLSAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogYWF1ZGlvX3Jlc3VsdF90IFNoYXJlZFJlZ2lvblBhcmNlbGFibGU6OnJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqcmVnaW9uQWRkcmVzc1B0cikgewogICAgIGlmIChtU2l6ZUluQnl0ZXMgPT0gMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmgKaW5kZXggMGNkOGMwNC4uYzE1ZmMzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5oCkBAIC0yMCw0MSArMjAsMzkgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhYXVkaW8vU2hhcmVkUmVnaW9uLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAotY2xhc3MgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK2NsYXNzIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgewogcHVibGljOgotICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUoKTsKLSAgICB2aXJ0dWFsIH5TaGFyZWRSZWdpb25QYXJjZWxhYmxlKCk7CisgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSgpID0gZGVmYXVsdDsKKworICAgIC8vIENvbnN0cnVjdCBiYXNlZCBvbiBhIHBhcmNlbGFibGUgcmVwcmVzZW50YXRpb24uCisgICAgZXhwbGljaXQgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZShjb25zdCBTaGFyZWRSZWdpb24mIHBhcmNlbGFibGUpOwogCiAgICAgdm9pZCBzZXR1cChpbnQzMl90IHNoYXJlZE1lbW9yeUluZGV4LCBpbnQzMl90IG9mZnNldEluQnl0ZXMsIGludDMyX3Qgc2l6ZUluQnl0ZXMpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2Vscywgdm9pZCAqKnJlZ2lvbkFkZHJlc3NQdHIpOwogCiAgICAgYm9vbCBpc0ZpbGVEZXNjcmlwdG9yU2FmZShTaGFyZWRNZW1vcnlQYXJjZWxhYmxlICptZW1vcnlQYXJjZWxzKTsKIAogICAgIHZvaWQgZHVtcCgpOwogCi1wcm90ZWN0ZWQ6CisgICAgLy8gRXh0cmFjdCBhIHBhcmNlbGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgU2hhcmVkUmVnaW9uIHBhcmNlbGFibGUoKSBjb25zdDsKKworcHJpdmF0ZToKICAgICBpbnQzMl90IG1TaGFyZWRNZW1vcnlJbmRleCA9IC0xOwogICAgIGludDMyX3QgbU9mZnNldEluQnl0ZXMgICAgID0gMDsKICAgICBpbnQzMl90IG1TaXplSW5CeXRlcyAgICAgICA9IDA7CiAKLXByaXZhdGU6CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vRW5kcG9pbnQuYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9FbmRwb2ludC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MDBiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vRW5kcG9pbnQuYWlkbApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhYXVkaW87CisKK2ltcG9ydCBhYXVkaW8uUmluZ0J1ZmZlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNoYXJlZEZpbGVSZWdpb247CisKK3BhcmNlbGFibGUgRW5kcG9pbnQgeworICAgIC8vIFNldCBjYXBhY2l0eUluRnJhbWVzIHRvIHplcm8gaWYgUXVldWUgaXMgdW51c2VkLgorICAgIFJpbmdCdWZmZXIgdXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlOyAgIC8vIHNlcnZlciB0byBjbGllbnQKKyAgICBSaW5nQnVmZmVyIGRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlOyAvLyB0byBzZXJ2ZXIKKyAgICBSaW5nQnVmZmVyIHVwRGF0YVF1ZXVlUGFyY2VsYWJsZTsgICAgICAvLyBlZy4gcmVjb3JkLCBjb3VsZCBzaGFyZSBzYW1lIHF1ZXVlCisgICAgUmluZ0J1ZmZlciBkb3duRGF0YVF1ZXVlUGFyY2VsYWJsZTsgICAgLy8gZWcuIHBsYXliYWNrCisgICAgU2hhcmVkRmlsZVJlZ2lvbltdIHNoYXJlZE1lbW9yaWVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9DbGllbnQuYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9JQUF1ZGlvQ2xpZW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxMGRiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9JQUF1ZGlvQ2xpZW50LmFpZGwKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYWF1ZGlvOworCitpbnRlcmZhY2UgSUFBdWRpb0NsaWVudCB7CisgICAgb25ld2F5IHZvaWQgb25TdHJlYW1DaGFuZ2UoaW50IGhhbmRsZSwgaW50IG9wY29kZSwgaW50IHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9JQUF1ZGlvU2VydmljZS5haWRsIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkMjIxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9JQUF1ZGlvU2VydmljZS5haWRsCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFhdWRpbzsKKworaW1wb3J0IGFhdWRpby5FbmRwb2ludDsKK2ltcG9ydCBhYXVkaW8uSUFBdWRpb0NsaWVudDsKK2ltcG9ydCBhYXVkaW8uU3RyZWFtUGFyYW1ldGVyczsKK2ltcG9ydCBhYXVkaW8uU3RyZWFtUmVxdWVzdDsKKworaW50ZXJmYWNlIElBQXVkaW9TZXJ2aWNlIHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBhdWRpbyBpbnB1dC9vdXRwdXQgY2hhbmdlIGFuZCB0cmFjayBub3RpZmljYXRpb25zLgorICAgICAqIEZvciBhIGdpdmVuIGNhbGxpbmcgcGlkLCBBQXVkaW8gc2VydmljZSBkaXNyZWdhcmRzIGFueSByZWdpc3RyYXRpb25zIGFmdGVyIHRoZSBmaXJzdC4KKyAgICAgKiBUaHVzIHRoZSBJQUF1ZGlvQ2xpZW50IG11c3QgYmUgYSBzaW5nbGV0b24gcGVyIHByb2Nlc3MuCisgICAgICovCisgICAgdm9pZCByZWdpc3RlckNsaWVudChJQUF1ZGlvQ2xpZW50IGNsaWVudCk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBpbmZvIG5lZWRlZCB0byBjcmVhdGUgdGhlIHN0cmVhbQorICAgICAqIEBwYXJhbSBwYXJhbXNPdXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNyZWF0ZWQgc3RyZWFtCisgICAgICogQHJldHVybiBoYW5kbGUgdG8gdGhlIHN0cmVhbSBvciBhIG5lZ2F0aXZlIGVycm9yCisgICAgICovCisgICAgaW50IG9wZW5TdHJlYW0oaW4gU3RyZWFtUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgIG91dCBTdHJlYW1QYXJhbWV0ZXJzIHBhcmFtc091dCk7CisKKyAgICBpbnQgY2xvc2VTdHJlYW0oaW50IHN0cmVhbUhhbmRsZSk7CisKKyAgICAvKgorICAgICAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGluLW1lbW9yeSBxdWV1ZXMKKyAgICAgKiB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCisgICAgICovCisgICAgaW50IGdldFN0cmVhbURlc2NyaXB0aW9uKGludCBzdHJlYW1IYW5kbGUsIG91dCBFbmRwb2ludCBlbmRwb2ludCk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgZmxvdyBvZiBkYXRhLgorICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBTVEFSVEVEIGV2ZW50LgorICAgICAqLworICAgIGludCBzdGFydFN0cmVhbShpbnQgc3RyZWFtSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzdWNoIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGhvdXQgbG9zcyBvZiBkYXRhLgorICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBQQVVTRUQgZXZlbnQuCisgICAgICovCisgICAgaW50IHBhdXNlU3RyZWFtKGludCBzdHJlYW1IYW5kbGUpOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHN1Y2ggdGhhdCB0aGUgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciBpcyBwbGF5ZWQuCisgICAgICogVGhpcyBpcyBhc3luY2hyb25vdXMuIFdoZW4gY29tcGxldGUsIHRoZSBzZXJ2aWNlIHdpbGwgc2VuZCBhIFNUT1BQRUQgZXZlbnQuCisgICAgICovCisgICAgaW50IHN0b3BTdHJlYW0oaW50IHN0cmVhbUhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiAgRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgorICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBGTFVTSEVEIGV2ZW50LgorICAgICAqLworICAgIGludCBmbHVzaFN0cmVhbShpbnQgc3RyZWFtSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE1hbmFnZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBhcyBhIGxvdyBsYXRlbmN5IGF1ZGlvIHRocmVhZC4KKyAgICAgKi8KKyAgICBpbnQgcmVnaXN0ZXJBdWRpb1RocmVhZChpbnQgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRUaHJlYWRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHBlcmlvZE5hbm9zZWNvbmRzKTsKKworICAgIGludCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoaW50IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRUaHJlYWRJZCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vUmluZ0J1ZmZlci5haWRsIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNThiMzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhYXVkaW87CisKK2ltcG9ydCBhYXVkaW8uU2hhcmVkUmVnaW9uOworCitwYXJjZWxhYmxlIFJpbmdCdWZmZXIgeworICAgIFNoYXJlZFJlZ2lvbiAgICAgICAgcmVhZENvdW50ZXJQYXJjZWxhYmxlOworICAgIFNoYXJlZFJlZ2lvbiAgICAgICAgd3JpdGVDb3VudGVyUGFyY2VsYWJsZTsKKyAgICBTaGFyZWRSZWdpb24gICAgICAgIGRhdGFQYXJjZWxhYmxlOworICAgIGludCAgICAgICAgICAgICAgICAgYnl0ZXNQZXJGcmFtZTsgICAgIC8vIGluZGV4IGlzIGluIGZyYW1lcworICAgIGludCAgICAgICAgICAgICAgICAgZnJhbWVzUGVyQnVyc3Q7ICAgIC8vIGZvciBJU09DSFJPTk9VUyBxdWV1ZXMKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXM7ICAvLyB6ZXJvIGlmIHVudXNlZAorICAgIGludCAvKiBSaW5nYnVmZmVyRmxhZ3MgKi8gZmxhZ3M7ICAvLyA9IFJpbmdidWZmZXJGbGFnczo6Tk9ORTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vU2hhcmVkUmVnaW9uLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vU2hhcmVkUmVnaW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxNTNlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TaGFyZWRSZWdpb24uYWlkbApAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhYXVkaW87CisKK3BhcmNlbGFibGUgU2hhcmVkUmVnaW9uIHsKKyAgICBpbnQgc2hhcmVkTWVtb3J5SW5kZXg7CisgICAgaW50IG9mZnNldEluQnl0ZXM7CisgICAgaW50IHNpemVJbkJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVBhcmFtZXRlcnMuYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1QYXJhbWV0ZXJzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNGY3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1QYXJhbWV0ZXJzLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYWF1ZGlvOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7CisKK3BhcmNlbGFibGUgU3RyZWFtUGFyYW1ldGVycyB7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lOyAgLy8gICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOyAgLy8gICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkOyAgLy8gICAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50IC8qIGFhdWRpb19zaGFyaW5nX21vZGVfdCAqLyAgICAgICAgICAgc2hhcmluZ01vZGU7ICAvLyAgICAgICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOworICAgIEF1ZGlvRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0OyAgLy8gICAgICAgICAgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBpbnQgLyogYWF1ZGlvX2RpcmVjdGlvbl90ICovICAgICAgICAgICAgICBkaXJlY3Rpb247ICAvLyAgICAgICAgICAgID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgaW50IC8qIGFhdWRpb191c2FnZV90ICovICAgICAgICAgICAgICAgICAgdXNhZ2U7ICAvLyAgICAgICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQgLyogYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICovICAgICAgICAgICBjb250ZW50VHlwZTsgIC8vICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludCAvKiBhYXVkaW9faW5wdXRfcHJlc2V0X3QgKi8gICAgICAgICAgIGlucHV0UHJlc2V0OyAgLy8gICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyQ2FwYWNpdHk7ICAvLyAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQgLyogYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCAqLyBhbGxvd2VkQ2FwdHVyZVBvbGljeTsgIC8vID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludCAvKiBhYXVkaW9fc2Vzc2lvbl9pZF90ICovICAgICAgICAgICAgIHNlc3Npb25JZDsgIC8vICAgICAgICAgICAgPSBBQVVESU9fU0VTU0lPTl9JRF9OT05FOworICAgIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpdmFjeVNlbnNpdGl2ZTsgIC8vICAgPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1SZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUmVxdWVzdC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjQwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUmVxdWVzdC5haWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFhdWRpbzsKKworaW1wb3J0IGFhdWRpby5TdHJlYW1QYXJhbWV0ZXJzOworCitwYXJjZWxhYmxlIFN0cmVhbVJlcXVlc3QgeworICAgIFN0cmVhbVBhcmFtZXRlcnMgICAgcGFyYW1zOworICAgIGludCAgICAgICAgICAgICAgICAgdXNlcklkOyAvLyA9ICh1aWRfdCkgLTE7CisgICAgaW50ICAgICAgICAgICAgICAgICBwcm9jZXNzSWQ7IC8vID0gKHBpZF90KSAtMTsKKyAgICBib29sZWFuICAgICAgICAgICAgIHNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZDsgLy8gPSBmYWxzZTsKKyAgICBib29sZWFuICAgICAgICAgICAgIGluU2VydmljZTsgLy8gPSBmYWxzZTsgLy8gU3RyZWFtIG9wZW5lZCBieSBBQXVkaW9zZXJ2aWNlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKaW5kZXggOGYyYzQ4OC4uNjFiNTBmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCkBAIC0yNiw5ICsyNiwxMSBAQAogI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rRmxvYXQuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kxNi5oPgogI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rSTI0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMzIuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlRmxvYXQuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTE2Lmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkyNC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMzIuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKIApAQCAtMzgsNyArNDAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpIHsKICAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbGFzdE91dHB1dCA9IG51bGxwdHI7CiAKLSAgICBBTE9HVigiJXMoKSBzb3VyY2UgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkLCBzaW5rIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCIsCisgICAgLy8gVE9ETyBjaGFuZ2UgYmFjayB0byBBTE9HRAorICAgIEFMT0dJKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkIiwKICAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBzb3VyY2VDaGFubmVsQ291bnQsIHNpbmtGb3JtYXQsIHNpbmtDaGFubmVsQ291bnQpOwogCiAgICAgc3dpdGNoIChzb3VyY2VGb3JtYXQpIHsKQEAgLTUxLDcgKzU0LDEwIEBACiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgogICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTI0Pihzb3VyY2VDaGFubmVsQ291bnQpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vIFRPRE8gYWRkIEkzMgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTMyPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzb3VyY2UgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc291cmNlRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CkBAIC05MCw3ICs5NiwxMCBAQAogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKICAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTI0PihzaW5rQ2hhbm5lbENvdW50KTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTMyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzKCkgVW5zdXBwb3J0ZWQgc2luayBmb3JtYXQgPSAlZCIsIF9fZnVuY19fLCBzaW5rRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IDA2ZjY2ZDMuLjBhMTlkMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAKLSAgICBtVXBDb21tYW5kUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9CdWZmZXI+KAorICAgIG1VcENvbW1hbmRRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0J1ZmZlckluZGlyZWN0PigKICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmJ5dGVzUGVyRnJhbWUsCiAgICAgICAgICAgICBkZXNjcmlwdG9yLT5jYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzLApAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmbURhdGFXcml0ZUNvdW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3ItPndyaXRlQ291bnRlckFkZHJlc3M7CiAKLSAgICBtRGF0YVF1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQnVmZmVyPigKKyAgICBtRGF0YVF1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQnVmZmVySW5kaXJlY3Q+KAogICAgICAgICAgICAgZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSwKICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICByZWFkQ291bnRlckFkZHJlc3MsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmgKaW5kZXggNDg0ZDkxNy4uNGM4ZDYwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaApAQCAtOTMsOCArOTMsOCBAQAogICAgIHZvaWQgZHVtcCgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpGaWZvQnVmZmVyPiBtVXBDb21tYW5kUXVldWU7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OkZpZm9CdWZmZXI+IG1EYXRhUXVldWU7CisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OkZpZm9CdWZmZXJJbmRpcmVjdD4gbVVwQ29tbWFuZFF1ZXVlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpGaWZvQnVmZmVySW5kaXJlY3Q+IG1EYXRhUXVldWU7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUZyZWVSdW5uaW5nOwogICAgIGFuZHJvaWQ6OmZpZm9fY291bnRlcl90IG1EYXRhUmVhZENvdW50ZXI7IC8vIG9ubHkgdXNlZCBpZiBmcmVlLXJ1bm5pbmcKICAgICBhbmRyb2lkOjpmaWZvX2NvdW50ZXJfdCBtRGF0YVdyaXRlQ291bnRlcjsgLy8gb25seSB1c2VkIGlmIGZyZWUtcnVubmluZwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAppbmRleCA0NTIwODIzLi4yODE1YzZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcApAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKICNpbmNsdWRlICJjb3JlL0F1ZGlvR2xvYmFsLmgiCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCIKQEAgLTc2LDYgKzc1LDcgQEAKIH0KIAogQXVkaW9TdHJlYW1JbnRlcm5hbDo6fkF1ZGlvU3RyZWFtSW50ZXJuYWwoKSB7CisgICAgQUxPR0QoIiVzKCkgJXAgY2FsbGVkIiwgX19mdW5jX18sIHRoaXMpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIHsKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQotICAgIC8vIFJlcXVlc3QgRkxPQVQgZm9yIHRoZSBzaGFyZWQgbWl4ZXIuCisgICAgLy8gUmVxdWVzdCBGTE9BVCBmb3IgdGhlIHNoYXJlZCBtaXhlciBvciB0aGUgZGV2aWNlLgogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKIAogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KQEAgLTIxMSwxMCArMjExLDEwIEBACiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIG1GcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckJ1cnN0OyAvLyBvbmx5IHNhdmUgZ29vZCB2YWx1ZQorICAgIHNldEZyYW1lc1BlckJ1cnN0KGZyYW1lc1BlckJ1cnN0KTsgLy8gb25seSBzYXZlIGdvb2QgdmFsdWUKIAogICAgIG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmNhcGFjaXR5SW5GcmFtZXM7Ci0gICAgaWYgKG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzIDwgbUZyYW1lc1BlckJ1cnN0CisgICAgaWYgKG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzIDwgZ2V0RnJhbWVzUGVyQnVyc3QoKQogICAgICAgICAgICAgfHwgbUJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMgPiBNQVhfQlVGRkVSX0NBUEFDSVRZX0lOX0ZSQU1FUykgewogICAgICAgICBBTE9HRSgiJXMgLSBidWZmZXJDYXBhY2l0eSBvdXQgb2YgcmFuZ2UgPSAlZCIsIF9fZnVuY19fLCBtQnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CkBAIC0yMzksNyArMjM5LDcgQEAKIAogICAgICAgICB9CiAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBtRnJhbWVzUGVyQnVyc3Q7CisgICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBnZXRGcmFtZXNQZXJCdXJzdCgpOwogICAgICAgICB9CiAKICAgICAgICAgY29uc3QgaW50MzJfdCBjYWxsYmFja0J1ZmZlclNpemUgPSBtQ2FsbGJhY2tGcmFtZXMgKiBnZXRCeXRlc1BlckZyYW1lKCk7CkBAIC0yNzEsMjEgKzI3MSwyMSBAQAogICAgIHJldHVybiByZXN1bHQ7CiAKIGVycm9yOgotICAgIHJlbGVhc2VDbG9zZUZpbmFsKCk7CisgICAgc2FmZVJlbGVhc2VDbG9zZSgpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVsZWFzZV9sKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgQUxPR1YoIiVzKCk6IG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gMHglMDhYIiwgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKKyAgICBBTE9HRCgiJXMoKTogbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSAweCUwOFgiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSAhPSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGN1cnJlbnRTdGF0ZSA9IGdldFN0YXRlKCk7CiAgICAgICAgIC8vIERvbid0IHJlbGVhc2UgYSBzdHJlYW0gd2hpbGUgaXQgaXMgcnVubmluZy4gU3RvcCBpdCBmaXJzdC4KICAgICAgICAgLy8gSWYgRElTQ09OTkVDVEVEIHRoZW4gd2Ugc2hvdWxkIHN0aWxsIHRyeSB0byBzdG9wIGluIGNhc2UgdGhlCiAgICAgICAgIC8vIGVycm9yIGNhbGxiYWNrIGlzIHN0aWxsIHJ1bm5pbmcuCiAgICAgICAgIGlmIChpc0FjdGl2ZSgpIHx8IGN1cnJlbnRTdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgcmVxdWVzdFN0b3AoKTsKKyAgICAgICAgICAgIHJlcXVlc3RTdG9wX2woKTsKICAgICAgICAgfQogCiAgICAgICAgIGxvZ1JlbGVhc2VCdWZmZXJTdGF0ZSgpOwpAQCAtMzMxLDcgKzMzMSw3IEBACiAgKiBUaGUgcHJvY2Vzc2luZyBjb2RlIHdpbGwgdGhlbiBzYXZlIHRoZSBjdXJyZW50IG9mZnNldAogICogYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBhbmQgYXBwbHkgdGhhdCB0byBhbnkgcG9zaXRpb24gZ2l2ZW4gdG8gdGhlIGFwcC4KICAqLwotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdGFydCgpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0YXJ0X2woKQogewogICAgIGludDY0X3Qgc3RhcnRUaW1lOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKQEAgLTM1Myw2ICszNTMsOCBAQAogICAgIC8vIENsZWFyIGFueSBzdGFsZSB0aW1lc3RhbXBzIGZyb20gdGhlIHByZXZpb3VzIHJ1bi4KICAgICBkcmFpblRpbWVzdGFtcHNGcm9tU2VydmljZSgpOwogCisgICAgcHJlcGFyZUJ1ZmZlcnNGb3JTdGFydCgpOyAvLyB0ZWxsIHN1YmNsYXNzZXMgdG8gZ2V0IHJlYWR5CisKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2Uuc3RhcnRTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKSB7CiAgICAgICAgIEFMT0dEKCIlcygpIElOVkFMSURfSEFORExFLCBzdHJlYW0gd2FzIHByb2JhYmx5IHN0b2xlbiIsIF9fZnVuY19fKTsKQEAgLTM3Miw3ICszNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBnZXRTYW1wbGVSYXRlKCk7CiAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUodHJ1ZSk7Ci0gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRocmVhZChwZXJpb2ROYW5vcywgYWF1ZGlvX2NhbGxiYWNrX3RocmVhZF9wcm9jLCB0aGlzKTsKKyAgICAgICAgcmVzdWx0ID0gY3JlYXRlVGhyZWFkX2wocGVyaW9kTmFub3MsIGFhdWRpb19jYWxsYmFja190aHJlYWRfcHJvYywgdGhpcyk7CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHNldFN0YXRlKG9yaWdpbmFsU3RhdGUpOwpAQCAtMzk4LDMzICs0MDAsMzYgQEAKIH0KIAogLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpzdG9wQ2FsbGJhY2soKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnN0b3BDYWxsYmFja19sKCkKIHsKICAgICBpZiAoaXNEYXRhQ2FsbGJhY2tTZXQoKQogICAgICAgICAgICAgJiYgKGlzQWN0aXZlKCkgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBqb2luVGhyZWFkKE5VTEwpOyAvLyBtYXkgdGVtcG9yYXJpbHkgdW5sb2NrIG1TdHJlYW1Mb2NrCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBqb2luVGhyZWFkX2woTlVMTCk7IC8vIG1heSB0ZW1wb3JhcmlseSB1bmxvY2sgbVN0cmVhbUxvY2sKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpIHsKICAgICAgICAgICAgIEFMT0dEKCIlcygpIElOVkFMSURfSEFORExFLCBzdHJlYW0gd2FzIHByb2JhYmx5IHN0b2xlbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCIlcygpIHNraXBwZWQsIGlzRGF0YUNhbGxiYWNrU2V0KCkgPSAlZCwgaXNBY3RpdmUoKSA9ICVkLCBnZXRTdGF0ZSgpICA9ICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICBpc0RhdGFDYWxsYmFja1NldCgpLCBpc0FjdGl2ZSgpLCBnZXRTdGF0ZSgpKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiB9CiAKLS8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3AoKSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0b3BDYWxsYmFjaygpOworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wX2woKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0b3BDYWxsYmFja19sKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR1coIiVzKCkgc3RvcCBjYWxsYmFjayByZXR1cm5lZCAlZCwgcmV0dXJuaW5nIGVhcmx5IiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIC8vIFRoZSBzdHJlYW0gbWF5IGhhdmUgYmVlbiB1bmxvY2tlZCB0ZW1wb3JhcmlseSB0byBsZXQgYSBjYWxsYmFjayBmaW5pc2gKICAgICAvLyBhbmQgdGhlIGNhbGxiYWNrIG1heSBoYXZlIHN0b3BwZWQgdGhlIHN0cmVhbS4KICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0cmVhbSBzdGlsbCBuZWVkcyB0byBiZSBzdG9wcGVkLgotICAgIC8vIFNlZSBhbHNvIEF1ZGlvU3RyZWFtOjpzYWZlU3RvcCgpLgorICAgIC8vIFNlZSBhbHNvIEF1ZGlvU3RyZWFtOjpzYWZlU3RvcF9sKCkuCiAgICAgaWYgKCEoaXNBY3RpdmUoKSB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSkgeworICAgICAgICBBTE9HRCgiJXMoKSByZXR1cm5pbmcgZWFybHksIG5vdCBhY3RpdmUgb3IgZGlzY29ubmVjdGVkIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KIApAQCAtNzU1LDkgKzc2MCw5IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpzZXRCdWZmZXJTaXplKGludDMyX3QgcmVxdWVzdGVkRnJhbWVzKSB7CiAgICAgaW50MzJfdCBhZGp1c3RlZEZyYW1lcyA9IHJlcXVlc3RlZEZyYW1lczsKLSAgICBjb25zdCBpbnQzMl90IG1heGltdW1TaXplID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAtIG1GcmFtZXNQZXJCdXJzdDsKKyAgICBjb25zdCBpbnQzMl90IG1heGltdW1TaXplID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAtIGdldEZyYW1lc1BlckJ1cnN0KCk7CiAgICAgLy8gTWluaW11bSBzaXplIHNob3VsZCBiZSBhIG11bHRpcGxlIG51bWJlciBvZiBidXJzdHMuCi0gICAgY29uc3QgaW50MzJfdCBtaW5pbXVtU2l6ZSA9IDEgKiBtRnJhbWVzUGVyQnVyc3Q7CisgICAgY29uc3QgaW50MzJfdCBtaW5pbXVtU2l6ZSA9IDEgKiBnZXRGcmFtZXNQZXJCdXJzdCgpOwogCiAgICAgLy8gQ2xpcCB0byBtaW5pbXVtIHNpemUgc28gdGhhdCByb3VuZGluZyB1cCB3aWxsIHdvcmsgYmV0dGVyLgogICAgIGFkanVzdGVkRnJhbWVzID0gc3RkOjptYXgobWluaW11bVNpemUsIGFkanVzdGVkRnJhbWVzKTsKQEAgLTc2Nyw5ICs3NzIsOSBAQAogICAgICAgICBhZGp1c3RlZEZyYW1lcyA9IG1heGltdW1TaXplOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFJvdW5kIHRvIHRoZSBuZXh0IGhpZ2hlc3QgYnVyc3Qgc2l6ZS4KLSAgICAgICAgaW50MzJfdCBudW1CdXJzdHMgPSAoYWRqdXN0ZWRGcmFtZXMgKyBtRnJhbWVzUGVyQnVyc3QgLSAxKSAvIG1GcmFtZXNQZXJCdXJzdDsKLSAgICAgICAgYWRqdXN0ZWRGcmFtZXMgPSBudW1CdXJzdHMgKiBtRnJhbWVzUGVyQnVyc3Q7Ci0gICAgICAgIC8vIENsaXAganVzdCBpbiBjYXNlIG1heGltdW1TaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIG1GcmFtZXNQZXJCdXJzdC4KKyAgICAgICAgaW50MzJfdCBudW1CdXJzdHMgPSAoYWRqdXN0ZWRGcmFtZXMgKyBnZXRGcmFtZXNQZXJCdXJzdCgpIC0gMSkgLyBnZXRGcmFtZXNQZXJCdXJzdCgpOworICAgICAgICBhZGp1c3RlZEZyYW1lcyA9IG51bUJ1cnN0cyAqIGdldEZyYW1lc1BlckJ1cnN0KCk7CisgICAgICAgIC8vIENsaXAganVzdCBpbiBjYXNlIG1heGltdW1TaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIGdldEZyYW1lc1BlckJ1cnN0KCkuCiAgICAgICAgIGFkanVzdGVkRnJhbWVzID0gc3RkOjptaW4obWF4aW11bVNpemUsIGFkanVzdGVkRnJhbWVzKTsKICAgICB9CiAKQEAgLTgwNCwxNSArODA5LDYgQEAKICAgICByZXR1cm4gbUJ1ZmZlckNhcGFjaXR5SW5GcmFtZXM7CiB9CiAKLWludDMyX3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6Z2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1GcmFtZXNQZXJCdXJzdDsKLX0KLQotLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcpIHsKLSAgICByZXR1cm4gQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQocmV0dXJuQXJnLCBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dChnZXRGcmFtZXNQZXJCdXJzdCgpKSk7Ci19Ci0KIGJvb2wgQXVkaW9TdHJlYW1JbnRlcm5hbDo6aXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3QgewogICAgIHJldHVybiBpc0FjdGl2ZSgpICYmIG1BdWRpb0VuZHBvaW50LT5pc0ZyZWVSdW5uaW5nKCkgJiYgbUNsb2NrTW9kZWwuaXNSdW5uaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggNjE1OTFiMy4uZmJlNGMxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oIgpAQCAtMjksNyArMjgsNiBAQAogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKLXVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIApAQCAtNDYsMTAgKzQ0LDYgQEAKICAgICBBdWRpb1N0cmVhbUludGVybmFsKEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgICZzZXJ2aWNlSW50ZXJmYWNlLCBib29sIGluU2VydmljZSk7CiAgICAgdmlydHVhbCB+QXVkaW9TdHJlYW1JbnRlcm5hbCgpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdGFydCgpIG92ZXJyaWRlOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wKCkgb3ZlcnJpZGU7Ci0KICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgb3ZlcnJpZGU7CkBAIC01OCwxNiArNTIsMTIgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVsZWFzZV9sKCkgb3ZlcnJpZGU7Ci0KICAgICBhYXVkaW9fcmVzdWx0X3Qgc2V0QnVmZmVyU2l6ZShpbnQzMl90IHJlcXVlc3RlZEZyYW1lcykgb3ZlcnJpZGU7CiAKICAgICBpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCBvdmVycmlkZTsKIAogICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdCBvdmVycmlkZTsKIAotICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCBvdmVycmlkZTsKLQogICAgIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gbVhSdW5Db3VudDsKICAgICB9CkBAIC03NiwxMiArNjYsOSBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJUaHJlYWQoKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcpOwotCiAgICAgLy8gQ2FsbGVkIGludGVybmFsbHkgZnJvbSAnQycKICAgICB2aXJ0dWFsIHZvaWQgKmNhbGxiYWNrTG9vcCgpID0gMDsKIAotCiAgICAgYm9vbCBpc01NYXAoKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTEwMCw2ICs4NywxMCBAQAogICAgIH0KIAogcHJvdGVjdGVkOgorICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnRfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0b3BfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZWxlYXNlX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcHJvY2Vzc0RhdGEodm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLApAQCAtMTIxLDkgKzExMiwxMSBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHByb2Nlc3NDb21tYW5kcygpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDYWxsYmFjaygpOworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2FsbGJhY2tfbCgpOwogCi0gICAgdmlydHVhbCB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVCdWZmZXJzRm9yU3RhcnQoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4gPSAwKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaEZyb21TZXJ2ZXIoKSB7fQogCkBAIC0xNTksNyArMTUyLDYgQEAKIAogICAgIGFhdWRpb19oYW5kbGVfdCAgICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZTsgLy8gb3BhcXVlIGhhbmRsZSByZXR1cm5lZCBmcm9tIHNlcnZpY2UKIAotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSBNSU5fRlJBTUVTX1BFUl9CVVJTVDsgLy8gZnJhbWVzIHBlciBIQUwgdHJhbnNmZXIKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbVhSdW5Db3VudCA9IDA7ICAgICAgLy8gaG93IG1hbnkgdW5kZXJydW4gZXZlbnRzPwogCiAgICAgLy8gT2Zmc2V0IGZyb20gdW5kZXJseWluZyBmcmFtZSBwb3NpdGlvbi4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCA5ZmEyZTQwLi41ZDMxMWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC0xNCw4ICsxNCw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgKG1JblNlcnZpY2UgPyAiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmVfU2VydmljZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZV9DbGllbnQiKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yOSw2ICsyNywxNCBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCisvLyBXZSBkbyB0aGlzIGFmdGVyIHRoZSAjaW5jbHVkZXMgYmVjYXVzZSBpZiBhIGhlYWRlciB1c2VzIEFMT0cuCisvLyBpdCB3b3VsZCBmYWlsIG9uIHRoZSByZWZlcmVuY2UgdG8gbUluU2VydmljZS4KKyN1bmRlZiBMT0dfVEFHCisvLyBUaGlzIGZpbGUgaXMgdXNlZCBpbiBib3RoIGNsaWVudCBhbmQgc2VydmVyIHByb2Nlc3Nlcy4KKy8vIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIGxvZ3MgbW9yZSBlYXNpbHkuCisjZGVmaW5lIExPR19UQUcgKG1JblNlcnZpY2UgPyAiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmVfU2VydmljZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZV9DbGllbnQiKQorCiB1c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKQEAgLTQxLDkgKzQ3LDkgQEAKIAogQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6On5BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSgpIHt9CiAKLXZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSB7Cit2b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjphZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luKSB7CiAgICAgaW50NjRfdCByZWFkQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhUmVhZENvdW50ZXIoKTsKLSAgICBpbnQ2NF90IHdyaXRlQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhV3JpdGVDb3VudGVyKCk7CisgICAgaW50NjRfdCB3cml0ZUNvdW50ZXIgPSBtQXVkaW9FbmRwb2ludC0+Z2V0RGF0YVdyaXRlQ291bnRlcigpICsgc2VydmVyTWFyZ2luOwogCiAgICAgLy8gQnVtcCBvZmZzZXQgc28gY2FsbGVyIGRvZXMgbm90IHNlZSB0aGUgcmV0cm9ncmFkZSBtb3Rpb24gaW4gZ2V0RnJhbWVzUmVhZCgpLgogICAgIGludDY0X3Qgb2Zmc2V0ID0gcmVhZENvdW50ZXIgLSB3cml0ZUNvdW50ZXI7CkBAIC0xNDMsNyArMTQ5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZnJhbWUgcG9zaXRpb24gYmFzZWQgb2ZmIG9mIHRoZSByZWFkQ291bnRlciBiZWNhdXNlCiAgICAgICAgICAgICAgICAgLy8gdGhlIHdyaXRlQ291bnRlciBtaWdodCBoYXZlIGp1c3QgYWR2YW5jZWQgaW4gdGhlIGJhY2tncm91bmQsCiAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyB1cyB0byBzbGVlcCB1bnRpbCBhIGxhdGVyIGJ1cnN0LgotICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpICsgbUZyYW1lc1BlckJ1cnN0OworICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpICsgZ2V0RnJhbWVzUGVyQnVyc3QoKTsKICAgICAgICAgICAgICAgICB3YWtlVGltZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRQb3NpdGlvblRvTGF0ZXN0VGltZShuZXh0UG9zaXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgKaW5kZXggNjQzNmE1My4uMjUxYTdmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3A7Ci11c2luZyBhbmRyb2lkOjpJQUF1ZGlvU2VydmljZTsKIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKQEAgLTQ2LDcgKzQ1LDcgQEAKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSBvdmVycmlkZTsKKyAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJPZmZzZXQgPSAwKSBvdmVycmlkZTsKIAogLyoqCiAgKiBMb3cgbGV2ZWwgZGF0YSBwcm9jZXNzaW5nIHRoYXQgd2lsbCBub3QgYmxvY2suIEl0IHdpbGwganVzdCByZWFkIG9yIHdyaXRlIGFzIG11Y2ggYXMgaXQgY2FuLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDEzMDNkYWYuLmI4MWU1ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTE0LDggKzE0LDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAobUluU2VydmljZSA/ICJBdWRpb1N0cmVhbUludGVybmFsUGxheV9TZXJ2aWNlIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogIkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5X0NsaWVudCIpCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTI2LDYgKzI0LDE1IEBACiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCiAKKy8vIFdlIGRvIHRoaXMgYWZ0ZXIgdGhlICNpbmNsdWRlcyBiZWNhdXNlIGlmIGEgaGVhZGVyIHVzZXMgQUxPRy4KKy8vIGl0IHdvdWxkIGZhaWwgb24gdGhlIHJlZmVyZW5jZSB0byBtSW5TZXJ2aWNlLgorI3VuZGVmIExPR19UQUcKKy8vIFRoaXMgZmlsZSBpcyB1c2VkIGluIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgcHJvY2Vzc2VzLgorLy8gVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBzZW5zZSBvZiB0aGUgbG9ncyBtb3JlIGVhc2lseS4KKyNkZWZpbmUgTE9HX1RBRyAobUluU2VydmljZSA/ICJBdWRpb1N0cmVhbUludGVybmFsUGxheV9TZXJ2aWNlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXlfQ2xpZW50IikKKwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7CiB1c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKQEAgLTQ5LDcgKzU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOwogCiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICByZWxlYXNlQ2xvc2VGaW5hbCgpOworICAgICAgICAgICAgc2FmZVJlbGVhc2VDbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIC8vIFNhbXBsZSByYXRlIGlzIGNvbnN0cmFpbmVkIHRvIGNvbW1vbiB2YWx1ZXMgYnkgbm93IGFuZCBzaG91bGQgbm90IG92ZXJmbG93LgogICAgICAgICBpbnQzMl90IG51bUZyYW1lcyA9IGtSYW1wTVNlYyAqIGdldFNhbXBsZVJhdGUoKSAvIEFBVURJT19NSUxMSVNfUEVSX1NFQ09ORDsKQEAgLTU5LDkgKzY2LDkgQEAKIH0KIAogLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cmVxdWVzdFBhdXNlKCkKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cmVxdWVzdFBhdXNlX2woKQogewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2soKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RvcENhbGxiYWNrX2woKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTc2LDcgKzgzLDcgQEAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UucGF1c2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnJlcXVlc3RGbHVzaCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cmVxdWVzdEZsdXNoX2woKSB7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewogICAgICAgICBBTE9HVygiJXMoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC04Niw4ICs5MywxMyBAQAogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5mbHVzaFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKLXZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSB7Ci0gICAgaW50NjRfdCByZWFkQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhUmVhZENvdW50ZXIoKTsKK3ZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnByZXBhcmVCdWZmZXJzRm9yU3RhcnQoKSB7CisgICAgLy8gUHJldmVudCBzdGFsZSBkYXRhIGZyb20gYmVpbmcgcGxheWVkLgorICAgIG1BdWRpb0VuZHBvaW50LT5lcmFzZURhdGFNZW1vcnkoKTsKK30KKwordm9pZCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6YWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbihpbnQzMl90IHNlcnZlck1hcmdpbikgeworICAgIGludDY0X3QgcmVhZENvdW50ZXIgPSBtQXVkaW9FbmRwb2ludC0+Z2V0RGF0YVJlYWRDb3VudGVyKCkgKyBzZXJ2ZXJNYXJnaW47CiAgICAgaW50NjRfdCB3cml0ZUNvdW50ZXIgPSBtQXVkaW9FbmRwb2ludC0+Z2V0RGF0YVdyaXRlQ291bnRlcigpOwogCiAgICAgLy8gQnVtcCBvZmZzZXQgc28gY2FsbGVyIGRvZXMgbm90IHNlZSB0aGUgcmV0cm9ncmFkZSBtb3Rpb24gaW4gZ2V0RnJhbWVzUmVhZCgpLgpAQCAtMTQ1LDcgKzE1Nyw5IEBACiAgICAgaWYgKG1OZWVkQ2F0Y2hVcC5pc1JlcXVlc3RlZCgpKSB7CiAgICAgICAgIC8vIENhdGNoIGFuIE1NQVAgcG9pbnRlciB0aGF0IGlzIGFscmVhZHkgYWR2YW5jaW5nLgogICAgICAgICAvLyBUaGlzIHdpbGwgYXZvaWQgaW5pdGlhbCB1bmRlcnJ1bnMgY2F1c2VkIGJ5IGEgc2xvdyBjb2xkIHN0YXJ0LgotICAgICAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCk7CisgICAgICAgIC8vIFdlIGFkZCBhIG9uZSBidXJzdCBtYXJnaW4gaW4gY2FzZSB0aGUgRFNQIGFkdmFuY2VzIGJlZm9yZSB3ZSBjYW4gd3JpdGUgdGhlIGRhdGEuCisgICAgICAgIC8vIFRoaXMgY2FuIGhlbHAgcHJldmVudCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0gZnJvbSBiZWluZyBza2lwcGVkLgorICAgICAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGdldEZyYW1lc1BlckJ1cnN0KCkpOwogICAgICAgICBtTmVlZENhdGNoVXAuYWNrbm93bGVkZ2UoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCmluZGV4IDJlOTMxNTcuLjAzYzk1N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwotdXNpbmcgYW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U7CiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCkBAIC0zNiw5ICszNSw5IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RQYXVzZSgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0UGF1c2VfbCgpIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RGbHVzaCgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0Rmx1c2hfbCgpIG92ZXJyaWRlOwogCiAgICAgYm9vbCBpc0ZsdXNoU3VwcG9ydGVkKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICAvLyBPbmx5IGltcGxlbWVudCBGTFVTSCBmb3IgT1VUUFVUIHN0cmVhbXMuCkBAIC02NSw3ICs2NCw5IEBACiAKIHByb3RlY3RlZDoKIAotICAgIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIG92ZXJyaWRlOworICAgIHZvaWQgcHJlcGFyZUJ1ZmZlcnNGb3JTdGFydCgpIG92ZXJyaWRlOworCisgICAgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luID0gMCkgb3ZlcnJpZGU7CiAKICAgICB2b2lkIG9uRmx1c2hGcm9tU2VydmVyKCkgb3ZlcnJpZGU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCmluZGV4IDg5NjU4NzUuLmNmYTcyMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcApAQCAtMjU1LDE3ICsyNTUsMTYgQEAKICAgICBpZiAoYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICBhYXVkaW9fc3RyZWFtX2lkX3QgaWQgPSBhdWRpb1N0cmVhbS0+Z2V0SWQoKTsKICAgICAgICAgQUxPR0QoIiVzKHMjJXUpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXywgaWQpOwotICAgICAgICByZXN1bHQgPSBhdWRpb1N0cmVhbS0+c2FmZVJlbGVhc2UoKTsKLSAgICAgICAgLy8gc2FmZVJlbGVhc2Ugd2lsbCBvbmx5IGZhaWwgaWYgY2FsbGVkIGlsbGVnYWxseSwgZm9yIGV4YW1wbGUsIGZyb20gYSBjYWxsYmFjay4KKyAgICAgICAgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnNhZmVSZWxlYXNlQ2xvc2UoKTsKKyAgICAgICAgLy8gc2FmZVJlbGVhc2VDbG9zZSB3aWxsIG9ubHkgZmFpbCBpZiBjYWxsZWQgaWxsZWdhbGx5LCBmb3IgZXhhbXBsZSwgZnJvbSBhIGNhbGxiYWNrLgogICAgICAgICAvLyBUaGF0IHdvdWxkIHJlc3VsdCBpbiBkZWxldGluZyBhbiBhY3RpdmUgc3RyZWFtLCB3aGljaCB3b3VsZCBjYXVzZSBhIGNyYXNoLgogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgQUxPR1coIiVzKHMjJXUpIGZhaWxlZC4gQ2xvc2UgaXQgZnJvbSBhbm90aGVyIHRocmVhZC4iLAogICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGlkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF1ZGlvU3RyZWFtLT51bnJlZ2lzdGVyUGxheWVyQmFzZSgpOwotICAgICAgICAgICAgIC8vIE1hcmsgQ0xPU0VEIHRvIGtlZXAgZGVzdHJ1Y3RvcnMgZnJvbSBhc3NlcnRpbmcuCi0gICAgICAgICAgICBhdWRpb1N0cmVhbS0+Y2xvc2VGaW5hbCgpOwotICAgICAgICAgICAgZGVsZXRlIGF1ZGlvU3RyZWFtOworICAgICAgICAgICAgLy8gQWxsb3cgdGhlIHN0cmVhbSB0byBiZSBkZWxldGVkLgorICAgICAgICAgICAgQXVkaW9TdHJlYW1CdWlsZGVyOjpzdG9wVXNpbmdTdHJlYW0oYXVkaW9TdHJlYW0pOwogICAgICAgICB9CiAgICAgICAgIEFMT0dEKCIlcyhzIyV1KSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBfX2Z1bmNfXywgaWQsIHJlc3VsdCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCmluZGV4IDVmNDUyNjEuLjJjODFjOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKQEAgLTU0LDcgKzU0LDkgQEAKICAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRCgiYXVkaW9Gb3JtYXQgbm90IHZhbGlkLCBhdWRpb19mb3JtYXRfdCA9IDB4JTA4eCIsIGZvcm1hdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmNwcAppbmRleCA3ZjVkOGQ1Li4wZTViOGJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb0dsb2JhbC5jcHAKQEAgLTgwLDYgKzgwLDggQEAKICAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRk9STUFUX0lOVkFMSUQpOwogICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19GT1JNQVRfUENNX0kxNik7CiAgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19GT1JNQVRfUENNX0kzMik7CiAgICAgfQogICAgIHJldHVybiAiVW5yZWNvZ25pemVkIjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IGY1Yzc1Y2EuLjU3YzRjMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtMzksMTUgKzM5LDIzIEBACiB9CiAKIEF1ZGlvU3RyZWFtOjpBdWRpb1N0cmVhbSgpCi0gICAgICAgIDogbVBsYXllckJhc2UobmV3IE15UGxheWVyQmFzZSh0aGlzKSkKKyAgICAgICAgOiBtUGxheWVyQmFzZShuZXcgTXlQbGF5ZXJCYXNlKCkpCiAgICAgICAgICwgbVN0cmVhbUlkKEFBdWRpb19nZXROZXh0U3RyZWFtSWQoKSkKICAgICAgICAgewotICAgIC8vIG1UaHJlYWQgaXMgYSBwdGhyZWFkX3Qgb2YgdW5rbm93biBzaXplIHNvIHdlIG5lZWQgbWVtc2V0LgotICAgIG1lbXNldCgmbVRocmVhZCwgMCwgc2l6ZW9mKG1UaHJlYWQpKTsKICAgICBzZXRQZXJpb2ROYW5vc2Vjb25kcygwKTsKIH0KIAogQXVkaW9TdHJlYW06On5BdWRpb1N0cmVhbSgpIHsKKyAgICAvLyBQbGVhc2UgcHJlc2VydmUgdGhlc2UgbG9ncyBiZWNhdXNlIHRoZXJlIGhhdmUgYmVlbiBzZXZlcmFsIGJ1Z3MgcmVsYXRlZCB0bworICAgIC8vIEF1ZGlvU3RyZWFtIGRlbGV0aW9uIGFuZCBsYXRlIGNhbGxiYWNrcy4KKyAgICBBTE9HRCgiJXMocyMldSkgbVBsYXllckJhc2Ugc3Ryb25nQ291bnQgPSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0SWQoKSwgbVBsYXllckJhc2UtPmdldFN0cm9uZ0NvdW50KCkpOworCisgICAgQUxPR0VfSUYocHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgbVRocmVhZCksCisgICAgICAgICAgICAiJXMoKSBkZXN0cnVjdG9yIHJ1bm5pbmcgaW4gY2FsbGJhY2siLCBfX2Z1bmNfXyk7CisKKyAgICBBTE9HRV9JRihtSGFzVGhyZWFkLCAiJXMoKSBjYWxsYmFjayB0aHJlYWQgbmV2ZXIgam9pbigpZWQiLCBfX2Z1bmNfXyk7CisKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApAQCAtNTUsOCArNjMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJ+QXVkaW9TdHJlYW0oKSAtIHN0aWxsIGluIHVzZSwgc3RhdGUgPSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0dsb2JhbF9jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwotCi0gICAgbVBsYXllckJhc2UtPmNsZWFyUGFyZW50UmVmZXJlbmNlKCk7IC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdGhpcyBBdWRpb1N0cmVhbQogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyJiBidWlsZGVyKQpAQCAtMTYyLDcgKzE2OCw3IEBACiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RTdGFydCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSByZXF1ZXN0U3RhcnRfbCgpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgogICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0YXJ0KCk7CkBAIC0yMTIsNyArMjE4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gcmVxdWVzdFBhdXNlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RQYXVzZV9sKCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCiAgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+cGF1c2UoKTsKQEAgLTIzNywxMiArMjQzLDEyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgcmV0dXJuIHJlcXVlc3RGbHVzaCgpOworICAgIHJldHVybiByZXF1ZXN0Rmx1c2hfbCgpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcF9sKCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCiAgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RvcCgpOwpAQCAtMjU2LDcgKzI2Miw3IEBACiAgICAgICAgIEFMT0dFKCJzdHJlYW0gY2Fubm90IGJlIHN0b3BwZWQgYnkgY2FsbGluZyBmcm9tIGEgY2FsbGJhY2shIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNhZmVTdG9wKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNhZmVTdG9wX2woKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KICAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5zdG9wKCk7CkBAIC0yNjQsOCArMjcwLDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0vLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RvcCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3BfbCgpIHsKIAogICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgewogICAgICAgICAvLyBQcm9jZWVkIHdpdGggc3RvcHBpbmcuCkBAIC0yOTcsMjYgKzMwMiw0NyBAQAogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAotICAgIHJldHVybiByZXF1ZXN0U3RvcCgpOworICAgIHJldHVybiByZXF1ZXN0U3RvcF9sKCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVJlbGVhc2UoKSB7Ci0gICAgLy8gVGhpcyBnZXQgdGVtcG9yYXJpbHkgdW5sb2NrZWQgaW4gdGhlIHJlbGVhc2UoKSB3aGVuIGpvaW5pbmcgY2FsbGJhY2sgdGhyZWFkcy4KKyAgICAvLyBUaGlzIG1heSBnZXQgdGVtcG9yYXJpbHkgdW5sb2NrZWQgaW4gdGhlIE1NQVAgcmVsZWFzZSgpIHdoZW4gam9pbmluZyBjYWxsYmFjayB0aHJlYWRzLgogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKICAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgewogICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORykgeworICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORykgeyAvLyBhbHJlYWR5IHJlbGVhc2VkPwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KICAgICByZXR1cm4gcmVsZWFzZV9sKCk7CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVJlbGVhc2VDbG9zZSgpIHsKKyAgICAvLyBUaGlzIGdldCB0ZW1wb3JhcmlseSB1bmxvY2tlZCBpbiB0aGUgTU1BUCByZWxlYXNlKCkgd2hlbiBqb2luaW5nIGNhbGxiYWNrIHRocmVhZHMuCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgcmVsZWFzZUNsb3NlRmluYWxfbCgpOworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVJlbGVhc2VDbG9zZUZyb21DYWxsYmFjaygpIHsKKyAgICAvLyBUaGlzIGdldCB0ZW1wb3JhcmlseSB1bmxvY2tlZCBpbiB0aGUgTU1BUCByZWxlYXNlKCkgd2hlbiBqb2luaW5nIGNhbGxiYWNrIHRocmVhZHMuCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIHJlbGVhc2VDbG9zZUZpbmFsX2woKTsKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCiB2b2lkIEF1ZGlvU3RyZWFtOjpzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKICAgICBBTE9HRCgiJXMocyMlZCkgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLCBnZXRJZCgpLCBtU3RhdGUsIHN0YXRlKTsKKyAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7CisgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCisgICAgfQogICAgIC8vIFRyYWNrIHRyYW5zaXRpb24gdG8gRElTQ09OTkVDVEVEIHN0YXRlLgotICAgIGlmIChzdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCAmJiBtU3RhdGUgIT0gc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCiAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9ESVNDT05ORUNUKQogICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRFLCBBdWRpb0dsb2JhbF9jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpCkBAIC0zMjQsMTggKzM1MCwxOCBAQAogICAgIH0KICAgICAvLyBDTE9TRUQgaXMgYSBmaW5hbCBzdGF0ZQogICAgIGlmIChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKLSAgICAgICAgQUxPR0UoIiVzKCVkKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgQ0xPU0VEIiwgX19mdW5jX18sIGdldElkKCksIHN0YXRlKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgQ0xPU0VEIiwgX19mdW5jX18sIGdldElkKCksIHN0YXRlKTsKIAogICAgIC8vIE9uY2UgQ0xPU0lORywgd2UgY2FuIG9ubHkgbW92ZSB0byBDTE9TRUQgc3RhdGUuCiAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HCiAgICAgICAgICAgICAgICAmJiBzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBDTE9TSU5HIiwgX19mdW5jX18sIGdldElkKCksIHN0YXRlKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgQ0xPU0lORyIsIF9fZnVuY19fLCBnZXRJZCgpLCBzdGF0ZSk7CiAKICAgICAvLyBPbmNlIERJU0NPTk5FQ1RFRCwgd2UgY2FuIG9ubHkgbW92ZSB0byBDTE9TSU5HIG9yIENMT1NFRCBzdGF0ZS4KICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRAogICAgICAgICAgICAgICAgJiYgIShzdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcKICAgICAgICAgICAgICAgICAgICB8fCBzdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkpIHsKLSAgICAgICAgQUxPR0UoIiVzKCVkKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgRElTQ09OTkVDVEVEIiwgX19mdW5jX18sIGdldElkKCksIHN0YXRlKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgRElTQ09OTkVDVEVEIiwgX19mdW5jX18sIGdldElkKCksIHN0YXRlKTsKIAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOwpAQCAtMzg3LDIxICs0MTMsMjggQEAKICAgICByZXR1cm4gcHJvY1Jlc3VsdDsKIH0KIAotLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBuZXcgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlVGhyZWFkKCkuCisKKy8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgbmV3IHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZVRocmVhZF9sKCkuCiAvLyBJdCBjb252ZXJ0cyB0aGUgJ0MnIGZ1bmN0aW9uIGNhbGwgdG8gYSBDKysgbWV0aG9kIGNhbGwuCiBzdGF0aWMgdm9pZCogQXVkaW9TdHJlYW1faW50ZXJuYWxUaHJlYWRQcm9jKHZvaWQqIHRocmVhZEFyZykgewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IChBdWRpb1N0cmVhbSAqKSB0aHJlYWRBcmc7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT53cmFwVXNlclRocmVhZCgpOworICAgIC8vIFByZXZlbnQgdGhlIHN0cmVhbSBmcm9tIGJlaW5nIGRlbGV0ZWQgd2hpbGUgYmVpbmcgdXNlZC4KKyAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGV4dHJhIHNhZmV0eS4gSXQgaXMgcHJvYmFibHkgbm90IG5lZWRlZCBiZWNhdXNlCisgICAgLy8gdGhpcyBjYWxsYmFjayBzaG91bGQgYmUgam9pbmVkIGJlZm9yZSB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KKyAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gcHJvdGVjdGVkU3RyZWFtKGF1ZGlvU3RyZWFtKTsKKyAgICAvLyBCYWxhbmNlIHRoZSBpbmNTdHJvbmcoKSBpbiBjcmVhdGVUaHJlYWRfbCgpLgorICAgIHByb3RlY3RlZFN0cmVhbS0+ZGVjU3Ryb25nKG51bGxwdHIpOworICAgIHJldHVybiBwcm90ZWN0ZWRTdHJlYW0tPndyYXBVc2VyVGhyZWFkKCk7CiB9CiAKIC8vIFRoaXMgaXMgbm90IGV4cG9zZWQgaW4gdGhlIEFQSS4KIC8vIEJ1dCBpdCBpcyBzdGlsbCB1c2VkIGludGVybmFsbHkgdG8gaW1wbGVtZW50IGNhbGxiYWNrcyBmb3IgTU1BUCBtb2RlLgotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpjcmVhdGVUaHJlYWQoaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fYXVkaW9fdGhyZWFkX3Byb2NfdCB0aHJlYWRQcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRocmVhZEFyZykKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6Y3JlYXRlVGhyZWFkX2woaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QgdGhyZWFkUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdGhyZWFkQXJnKQogewogICAgIGlmIChtSGFzVGhyZWFkKSB7Ci0gICAgICAgIEFMT0dFKCJjcmVhdGVUaHJlYWQoKSAtIG1IYXNUaHJlYWQgYWxyZWFkeSB0cnVlIik7CisgICAgICAgIEFMT0dFKCIlcygpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgaWYgKHRocmVhZFByb2MgPT0gbnVsbHB0cikgewpAQCAtNDExLDEwICs0NDQsMTQgQEAKICAgICBtVGhyZWFkUHJvYyA9IHRocmVhZFByb2M7CiAgICAgbVRocmVhZEFyZyA9IHRocmVhZEFyZzsKICAgICBzZXRQZXJpb2ROYW5vc2Vjb25kcyhwZXJpb2ROYW5vc2Vjb25kcyk7CisgICAgLy8gUHJldmVudCB0aGlzIG9iamVjdCBmcm9tIGdldHRpbmcgZGVsZXRlZCBiZWZvcmUgdGhlIHRocmVhZCBoYXMgYSBjaGFuY2UgdG8gY3JlYXRlCisgICAgLy8gaXRzIHN0cm9uZyBwb2ludGVyLiBBc3N1bWUgdGhlIHRocmVhZCB3aWxsIGNhbGwgZGVjU3Ryb25nKCkuCisgICAgdGhpcy0+aW5jU3Ryb25nKG51bGxwdHIpOwogICAgIGludCBlcnIgPSBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgbnVsbHB0ciwgQXVkaW9TdHJlYW1faW50ZXJuYWxUaHJlYWRQcm9jLCB0aGlzKTsKICAgICBpZiAoZXJyICE9IDApIHsKICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gLWVycm5vOwotICAgICAgICBBTE9HRSgiY3JlYXRlVGhyZWFkKCkgLSBwdGhyZWFkX2NyZWF0ZSgpIGZhaWxlZCwgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKSAtIHB0aHJlYWRfY3JlYXRlKCkgZmFpbGVkLCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICB0aGlzLT5kZWNTdHJvbmcobnVsbHB0cik7IC8vIEJlY2F1c2UgdGhlIHRocmVhZCB3b24ndCBkbyBpdC4KICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVE9ETyBVc2UgQUF1ZGlvVGhyZWFkIG9yIG1heWJlIEFuZHJvaWRUaHJlYWQKQEAgLTQzNCwzNiArNDcxLDM5IEBACiAgICAgfQogfQogCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZykgeworICAgIC8vIFRoaXMgbWF5IGdldCB0ZW1wb3JhcmlseSB1bmxvY2tlZCBpbiB0aGUgTU1BUCByZWxlYXNlKCkgd2hlbiBqb2luaW5nIGNhbGxiYWNrIHRocmVhZHMuCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIHJldHVybiBqb2luVGhyZWFkX2wocmV0dXJuQXJnKTsKK30KKwogLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyBfX3VudXNlZCkKLXsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZF9sKHZvaWQqKiByZXR1cm5BcmcpIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKLSAgICAgICAgQUxPR0UoImpvaW5UaHJlYWQoKSAtIGJ1dCBoYXMgbm8gdGhyZWFkIik7CisgICAgICAgIEFMT0dEKCJqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgLy8gSWYgdGhlIGNhbGxiYWNrIGlzIHN0b3BwaW5nIHRoZSBzdHJlYW0gYmVjYXVzZSB0aGUgYXBwIHBhc3NlZCBiYWNrIFNUT1AKICAgICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gam9pbigpLiBUaGUgdGhyZWFkIGlzIGFscmVhZHkgYWJvdXQgdG8gZXhpdC4KLSAgICBpZiAocHRocmVhZF9zZWxmKCkgIT0gbVRocmVhZCkgeworICAgIGlmICghcHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgbVRocmVhZCkpIHsKICAgICAgICAgLy8gQ2FsbGVkIGZyb20gYW4gYXBwIHRocmVhZC4gTm90IHRoZSBjYWxsYmFjay4KICAgICAgICAgLy8gVW5sb2NrIGJlY2F1c2UgdGhlIGNhbGxiYWNrIG1heSBiZSB0cnlpbmcgdG8gc3RvcCB0aGUgc3RyZWFtIGJ1dCBpcyBibG9ja2VkLgogICAgICAgICBtU3RyZWFtTG9jay51bmxvY2soKTsKLSNpZiAwCi0gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGVxdWl2YWxlbnQgb2YgcHRocmVhZF90aW1lZGpvaW5fbnAoKQotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKLSAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfdGltZWRqb2luX25wKG1UaHJlYWQsIHJldHVybkFyZywgJmFic3RpbWUpOwotI2Vsc2UKICAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfam9pbihtVGhyZWFkLCByZXR1cm5BcmcpOwotI2VuZGlmCiAgICAgICAgIG1TdHJlYW1Mb2NrLmxvY2soKTsKICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgQUxPR0UoIiVzKCkgcHRocmVhZF9qb2luKCkgcmV0dXJucyBlcnIgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiJXMoKSBwdGhyZWFkX2pvaW4gc3VjY2VlZGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgLy8gVGhpcyBtdXN0IGJlIHNldCBmYWxzZSBzbyB0aGF0IHRoZSBjYWxsYmFjayB0aHJlYWQgY2FuIGJlIGNyZWF0ZWQKKyAgICAgICAgICAgIC8vIHdoZW4gdGhlIHN0cmVhbSBpcyByZXN0YXJ0ZWQuCisgICAgICAgICAgICBtSGFzVGhyZWFkID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiJXMoKSBwdGhyZWFkX2pvaW4oKSBjYWxsZWQgb24gaXRzZWxmISIsIF9fZnVuY19fKTsKICAgICB9Ci0gICAgLy8gVGhpcyBtdXN0IGJlIHNldCBmYWxzZSBzbyB0aGF0IHRoZSBjYWxsYmFjayB0aHJlYWQgY2FuIGJlIGNyZWF0ZWQKLSAgICAvLyB3aGVuIHRoZSBzdHJlYW0gaXMgcmVzdGFydGVkLgotICAgIG1IYXNUaHJlYWQgPSBmYWxzZTsKICAgICByZXR1cm4gKHJlc3VsdCAhPSBBQVVESU9fT0spID8gcmVzdWx0IDogbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdDsKIH0KIApAQCAtNTIwLDExICs1NjAsMTggQEAKIH0KIAogI2lmIEFBVURJT19VU0VfVk9MVU1FX1NIQVBFUgotYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvU3RyZWFtOjphcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiBfX3VudXNlZCwKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24gX191bnVzZWQpIHsKLSAgICBBTE9HVygiYXBwbHlWb2x1bWVTaGFwZXIoKSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgcmV0dXJuIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1czo6b2soKTsKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQXVkaW9TdHJlYW06Ok15UGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgeworICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiBhdWRpb1N0cmVhbTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1QYXJlbnRMb2NrKTsKKyAgICAgICAgYXVkaW9TdHJlYW0gPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICB9CisgICAgaWYgKGF1ZGlvU3RyZWFtKSB7CisgICAgICAgIHJldHVybiBhdWRpb1N0cmVhbS0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogfQogI2VuZGlmCiAKQEAgLTUzNCwyNiArNTgxLDM2IEBACiAgICAgZG9TZXRWb2x1bWUoKTsgLy8gYXBwbHkgdGhpcyBjaGFuZ2UKIH0KIAotQXVkaW9TdHJlYW06Ok15UGxheWVyQmFzZTo6TXlQbGF5ZXJCYXNlKEF1ZGlvU3RyZWFtICpwYXJlbnQpIDogbVBhcmVudChwYXJlbnQpIHsKLX0KLQotQXVkaW9TdHJlYW06Ok15UGxheWVyQmFzZTo6fk15UGxheWVyQmFzZSgpIHsKLX0KLQotdm9pZCBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpyZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKSB7Cit2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OnJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcihjb25zdCBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4mIHBhcmVudCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1QYXJlbnRMb2NrKTsKKyAgICBtUGFyZW50ID0gcGFyZW50OwogICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKLSAgICAgICAgaW5pdChhbmRyb2lkOjpQTEFZRVJfVFlQRV9BQVVESU8sIEFBdWRpb0NvbnZlcnRfdXNhZ2VUb0ludGVybmFsKG1QYXJlbnQtPmdldFVzYWdlKCkpKTsKKyAgICAgICAgaW5pdChhbmRyb2lkOjpQTEFZRVJfVFlQRV9BQVVESU8sIEFBdWRpb0NvbnZlcnRfdXNhZ2VUb0ludGVybmFsKHBhcmVudC0+Z2V0VXNhZ2UoKSkpOwogICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1QYXJlbnRMb2NrKTsKICAgICBpZiAobVJlZ2lzdGVyZWQpIHsKICAgICAgICAgYmFzZURlc3Ryb3koKTsKICAgICAgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKICAgICB9CiB9CiAKK2FuZHJvaWQ6OnN0YXR1c190IEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OnBsYXllclNldFZvbHVtZSgpIHsKKyAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gYXVkaW9TdHJlYW07CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUGFyZW50TG9jayk7CisgICAgICAgIGF1ZGlvU3RyZWFtID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgfQorICAgIGlmIChhdWRpb1N0cmVhbSkgeworICAgICAgICAvLyBObyBwYW4gYW5kIG9ubHkgbGVmdCB2b2x1bWUgaXMgdGFrZW4gaW50byBhY2NvdW50IGZyb20gSVBMYXllciBpbnRlcmZhY2UKKyAgICAgICAgYXVkaW9TdHJlYW0tPnNldER1Y2tBbmRNdXRlVm9sdW1lKG1Wb2x1bWVNdWx0aXBsaWVyTCAgLyogbVBhbk11bHRpcGxpZXJMICovKTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOworfQorCiB2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OmRlc3Ryb3koKSB7CiAgICAgdW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggZmI3MWMzNi4uNTEwZWFkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTIwLDEzICsyMCwxNyBAQAogI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKLSNpbmNsdWRlICJtZWRpYS9Wb2x1bWVTaGFwZXIuaCIKLSNpbmNsdWRlICJtZWRpYS9QbGF5ZXJCYXNlLmgiCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvUGxheWVyQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgorCiAjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKICNpbmNsdWRlICJ1dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCIKIApAQCAtNDUsNyArNDksOCBAQAogLyoqCiAgKiBBQXVkaW8gYXVkaW8gc3RyZWFtLgogICovCi1jbGFzcyBBdWRpb1N0cmVhbSB7CisvLyBCeSBleHRlbmRpbmcgQXVkaW9EZXZpY2VDYWxsYmFjaywgd2UgYWxzbyBpbmhlcml0IGZyb20gUmVmQmFzZS4KK2NsYXNzIEF1ZGlvU3RyZWFtIDogcHVibGljIGFuZHJvaWQ6OkF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrIHsKIHB1YmxpYzoKIAogICAgIEF1ZGlvU3RyZWFtKCk7CkBAIC01NCwxMSArNTksNiBAQAogCiBwcm90ZWN0ZWQ6CiAKLSAgICAvKiBBc3luY2hyb25vdXMgcmVxdWVzdHMuCi0gICAgICogVXNlIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCi0gICAgICovCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0KCkgPSAwOwotCiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhlIHN0YXRlIHRvIHNlZSBpZiBQYXVzZSBpcyBjdXJyZW50bHkgbGVnYWwuCiAgICAgICoKQEAgLTc3LDE4ICs3NywyMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFBhdXNlKCkKLSAgICB7CisgICAgLyogQXN5bmNocm9ub3VzIHJlcXVlc3RzLgorICAgICAqIFVzZSB3YWl0Rm9yU3RhdGVDaGFuZ2UoKSB0byB3YWl0IGZvciBjb21wbGV0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdGFydF9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spID0gMDsKKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RQYXVzZV9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spIHsKICAgICAgICAgLy8gT25seSBpbXBsZW1lbnQgdGhpcyBmb3IgT1VUUFVUIHN0cmVhbXMuCiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0Rmx1c2goKSB7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdEZsdXNoX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgewogICAgICAgICAvLyBPbmx5IGltcGxlbWVudCB0aGlzIGZvciBPVVRQVVQgc3RyZWFtcy4KICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOwogICAgIH0KIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wKCkgPSAwOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgPSAwOwogCiBwdWJsaWM6CiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLApAQCAtMTE3LDMzICsxMjEsNDAgQEAKICAgICB2aXJ0dWFsIHZvaWQgbG9nT3BlbigpOwogICAgIHZvaWQgbG9nUmVsZWFzZUJ1ZmZlclN0YXRlKCk7CiAKKyAgICAvKiBOb3RlIGFib3V0IG5hbWluZyBmb3IgInJlbGVhc2UiICBhbmQgImNsb3NlIiByZWxhdGVkIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBUaGVzZSBuYW1lcyBhcmUgaW50ZW5kZWQgdG8gbWF0Y2ggdGhlIHB1YmxpYyBBQXVkaW8gQVBJLgorICAgICAqIFRoZSBvcmlnaW5hbCBBQXVkaW8gQVBJIGhhZCBhbiBBQXVkaW9TdHJlYW1fY2xvc2UoKSBmdW5jdGlvbiB0aGF0CisgICAgICogcmVsZWFzZWQgdGhlIGhhcmR3YXJlIGFuZCBkZWxldGVkIHRoZSBzdHJlYW0uIFRoYXQgbWFkZSBpdCBkaWZmaWN1bHQKKyAgICAgKiBiZWNhdXNlIGFwcHMgd2FudCB0byByZWxlYXNlIHRoZSBIVyBBU0FQIGJ1dCBhcmUgbm90IGluIGEgcnVzaCB0byBkZWxldGUKKyAgICAgKiB0aGUgc3RyZWFtIG9iamVjdC4gU28gaW4gUiB3ZSBhZGRlZCBhbiBBQXVkaW9TdHJlYW1fcmVsZWFzZSgpIGZ1bmN0aW9uCisgICAgICogdGhhdCBqdXN0IHJlbGVhc2VkIHRoZSBoYXJkd2FyZS4KKyAgICAgKiBUaGUgQUF1ZGlvU3RyZWFtX2Nsb3NlKCkgbWV0aG9kIHJlbGVhc2VzIGlmIG5lZWRlZCBhbmQgdGhlbiBjbG9zZXMuCisgICAgICovCisKK3Byb3RlY3RlZDoKICAgICAvKioKICAgICAgKiBGcmVlIGFueSBoYXJkd2FyZSBvciBzeXN0ZW0gcmVzb3VyY2VzIGZyb20gdGhlIG9wZW4oKSBjYWxsLgogICAgICAqIEl0IGlzIHNhZmUgdG8gY2FsbCByZWxlYXNlX2woKSBtdWx0aXBsZSB0aW1lcy4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZWxlYXNlX2woKSB7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVsZWFzZV9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spIHsKICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2VGaW5hbCgpIHsKKyAgICAvKioKKyAgICAgKiBGcmVlIGFueSByZXNvdXJjZXMgbm90IGFscmVhZHkgZnJlZWQgYnkgcmVsZWFzZV9sKCkuCisgICAgICogQXNzdW1lIHJlbGVhc2VfbCgpIGFscmVhZHkgY2FsbGVkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBjbG9zZV9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spIHsKKyAgICAgICAgLy8gUmVsZWFzaW5nIHRoZSBzdHJlYW0gd2lsbCBzZXQgdGhlIHN0YXRlIHRvIENMT1NJTkcuCisgICAgICAgIGFzc2VydChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORyk7CisgICAgICAgIC8vIHNldFN0YXRlKCkgcHJldmVudHMgYSB0cmFuc2l0aW9uIGZyb20gQ0xPU0lORyB0byBhbnkgc3RhdGUgb3RoZXIgdGhhbiBDTE9TRUQuCiAgICAgICAgIC8vIFN0YXRlIGlzIGNoZWNrZWQgYnkgZGVzdHJ1Y3Rvci4KICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOwotICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJlbGVhc2UgdGhlbiBjbG9zZSB0aGUgc3RyZWFtLgotICAgICAqIEByZXR1cm4gQUFVRElPX09LIG9yIG5lZ2F0aXZlIGVycm9yLgotICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCByZWxlYXNlQ2xvc2VGaW5hbCgpIHsKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlbGVhc2VfbCgpOyAvLyBUT0RPIHJldmlldyBsb2NraW5nCi0gICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gY2xvc2VGaW5hbCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCitwdWJsaWM6CiAgICAgLy8gVGhpcyBpcyBvbmx5IHVzZWQgdG8gaWRlbnRpZnkgYSBzdHJlYW0gaW4gdGhlIGxvZ3Mgd2l0aG91dAogICAgIC8vIHJldmVhbGluZyBhbnkgcG9pbnRlcnMuCiAgICAgYWF1ZGlvX3N0cmVhbV9pZF90IGdldElkKCkgewpAQCAtMTUyLDExICsxNjMsMTEgQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHNldEJ1ZmZlclNpemUoaW50MzJfdCByZXF1ZXN0ZWRGcmFtZXMpID0gMDsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNyZWF0ZVRocmVhZChpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QgdGhyZWFkUHJvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRocmVhZEFyZyk7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY3JlYXRlVGhyZWFkX2woaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fYXVkaW9fdGhyZWFkX3Byb2NfdCB0aHJlYWRQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRocmVhZEFyZyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgam9pblRocmVhZCh2b2lkICoqcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGpvaW5UaHJlYWQodm9pZCAqKnJldHVybkFyZyk7CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlclRocmVhZCgpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKQEAgLTE4MywxMSArMTk0LDExIEBACiAgICAgfQogCiAgICAgdmlydHVhbCBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgICAgIHJldHVybiBtQnVmZmVyQ2FwYWNpdHk7CiAgICAgfQogCiAgICAgdmlydHVhbCBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7CiAgICAgfQogCiAgICAgdmlydHVhbCBpbnQzMl90IGdldFhSdW5Db3VudCgpIGNvbnN0IHsKQEAgLTMyOCw2ICszMzksMTAgQEAKICAgICAgKi8KICAgICBib29sIGNvbGxpZGVzV2l0aENhbGxiYWNrKCkgY29uc3Q7CiAKKyAgICAvLyBJbXBsZW1lbnQgQXVkaW9EZXZpY2VDYWxsYmFjaworICAgIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGUge307CisKICAgICAvLyA9PT09PT09PT09PT09PSBJL08gPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgLy8gQSBTdHJlYW0gd2lsbCBvbmx5IGltcGxlbWVudCByZWFkKCkgb3Igd3JpdGUoKSBkZXBlbmRpbmcgb24gaXRzIGRpcmVjdGlvbi4KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIgX191bnVzZWQsCkBAIC0zNjYsNyArMzgxLDcgQEAKICAgICAgKi8KICAgICB2b2lkIHJlZ2lzdGVyUGxheWVyQmFzZSgpIHsKICAgICAgICAgaWYgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7Ci0gICAgICAgICAgICBtUGxheWVyQmFzZS0+cmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CisgICAgICAgICAgICBtUGxheWVyQmFzZS0+cmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKHRoaXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zOTUsMjEgKzQxMCwzNSBAQAogICAgICAqLwogICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCk7CiAKKyAgICAvKioKKyAgICAgKiBTYWZlbHkgUkVMRUFTRSBhIHN0cmVhbSBhZnRlciB0YWtpbmcgbVN0cmVhbUxvY2sgYW5kIGNoZWNraW5nCisgICAgICogdG8gbWFrZSBzdXJlIHdlIGFyZSBub3QgYmVpbmcgY2FsbGVkIGZyb20gYSBjYWxsYmFjay4KKyAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yCisgICAgICovCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVSZWxlYXNlKCk7CiAKKyAgICAvKioKKyAgICAgKiBTYWZlbHkgUkVMRUFTRSBhbmQgQ0xPU0UgYSBzdHJlYW0gYWZ0ZXIgdGFraW5nIG1TdHJlYW1Mb2NrIGFuZCBjaGVja2luZworICAgICAqIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGJlaW5nIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2suCisgICAgICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvcgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlUmVsZWFzZUNsb3NlKCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVJlbGVhc2VDbG9zZUZyb21DYWxsYmFjaygpOworCiBwcm90ZWN0ZWQ6CiAKICAgICAvLyBQbGF5ZXJCYXNlIGFsbG93cyB0aGUgc3lzdGVtIHRvIGNvbnRyb2wgdGhlIHN0cmVhbSB2b2x1bWUuCiAgICAgY2xhc3MgTXlQbGF5ZXJCYXNlIDogcHVibGljIGFuZHJvaWQ6OlBsYXllckJhc2UgewogICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgTXlQbGF5ZXJCYXNlKEF1ZGlvU3RyZWFtICpwYXJlbnQpOworICAgICAgICBNeVBsYXllckJhc2UoKSB7fTsKIAotICAgICAgICB2aXJ0dWFsIH5NeVBsYXllckJhc2UoKTsKKyAgICAgICAgdmlydHVhbCB+TXlQbGF5ZXJCYXNlKCkgPSBkZWZhdWx0OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZWdpc3RlciBmb3Igdm9sdW1lIGNoYW5nZXMgYW5kIHJlbW90ZSBjb250cm9sLgogICAgICAgICAgKi8KLSAgICAgICAgdm9pZCByZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKKyAgICAgICAgdm9pZCByZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoY29uc3QgYW5kcm9pZDo6c3A8QXVkaW9TdHJlYW0+JiBwYXJlbnQpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBVblJlZ2lzdGVyLgpAQCAtNDIxLDggKzQ1MCw2IEBACiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGRlc3Ryb3koKSBvdmVycmlkZTsKIAotICAgICAgICB2b2lkIGNsZWFyUGFyZW50UmVmZXJlbmNlKCkgeyBtUGFyZW50ID0gbnVsbHB0cjsgfQotCiAgICAgICAgIC8vIEp1c3QgYSBzdHViLiBUaGUgYWJpbGl0eSB0byBzdGFydCBhdWRpbyB0aHJvdWdoIFBsYXllckJhc2UgaXMgYmVpbmcgZGVwcmVjYXRlZC4KICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RhcnQoKSBvdmVycmlkZSB7CiAgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CkBAIC00MzgsMTggKzQ2NSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU2V0Vm9sdW1lKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgLy8gTm8gcGFuIGFuZCBvbmx5IGxlZnQgdm9sdW1lIGlzIHRha2VuIGludG8gYWNjb3VudCBmcm9tIElQTGF5ZXIgaW50ZXJmYWNlCi0gICAgICAgICAgICBtUGFyZW50LT5zZXREdWNrQW5kTXV0ZVZvbHVtZShtVm9sdW1lTXVsdGlwbGllckwgIC8qICogbVBhbk11bHRpcGxpZXJMICovKTsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTZXRWb2x1bWUoKSBvdmVycmlkZTsKIAogI2lmIEFBVURJT19VU0VfVk9MVU1FX1NIQVBFUgotICAgICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhcmVudC0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKLSAgICAgICAgfQorICAgICAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKCk7CiAjZW5kaWYKIAogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0UmVzdWx0KCkgewpAQCAtNDU3LDkgKzQ3NiwxMSBAQAogICAgICAgICB9CiAKICAgICBwcml2YXRlOgotICAgICAgICBBdWRpb1N0cmVhbSAgICAgICAgICAqbVBhcmVudDsKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgIG1SZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICAvLyBVc2UgYSB3ZWFrIHBvaW50ZXIgc28gdGhlIEF1ZGlvU3RyZWFtIGNhbiBiZSBkZWxldGVkLgorICAgICAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgbVBhcmVudExvY2s7CisgICAgICAgIGFuZHJvaWQ6OndwPEF1ZGlvU3RyZWFtPiBtUGFyZW50IEdVQVJERURfQlkobVBhcmVudExvY2spOworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgbVJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CiAgICAgfTsKIAogICAgIC8qKgpAQCAtNDcwLDMwICs0OTEsMzIgQEAKICAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgotICAgICAqLworICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgIHZvaWQgc2V0U2FtcGxlc1BlckZyYW1lKGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKSB7CiAgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBzYW1wbGVzUGVyRnJhbWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCi0gICAgICovCisgICAgLy8gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCisgICAgdm9pZCBzZXRGcmFtZXNQZXJCdXJzdChpbnQzMl90IGZyYW1lc1BlckJ1cnN0KSB7CisgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckJ1cnN0OworICAgIH0KKworICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgIHZvaWQgc2V0QnVmZmVyQ2FwYWNpdHkoaW50MzJfdCBidWZmZXJDYXBhY2l0eSkgeworICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgPSBidWZmZXJDYXBhY2l0eTsKKyAgICB9CisKKyAgICAvLyBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICB2b2lkIHNldFNoYXJpbmdNb2RlKGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewogICAgICAgICBtU2hhcmluZ01vZGUgPSBzaGFyaW5nTW9kZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KLSAgICAgKi8KKyAgICAvLyBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KLSAgICAgKi8KKyAgICAvLyBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICB2b2lkIHNldERldmljZUZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbURldmljZUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CkBAIC01MDgsMTAgKzUzMSwxMyBAQAogICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICB9CiAKKyAgICAvLyBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICB2b2lkIHNldFNlc3Npb25JZChpbnQzMl90IHNlc3Npb25JZCkgewogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KIAorICAgIGFhdWRpb19yZXN1bHRfdCBqb2luVGhyZWFkX2wodm9pZCAqKnJldHVybkFyZykgUkVRVUlSRVMobVN0cmVhbUxvY2spOworCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgbUNhbGxiYWNrRW5hYmxlZHtmYWxzZX07CiAKICAgICBmbG9hdCAgICAgICAgICAgICAgICBtRHVja0FuZE11dGVWb2x1bWUgPSAxLjBmOwpAQCAtNTc4LDExICs2MDQsMjIgQEAKIAogICAgIHN0ZDo6c3RyaW5nIG1NZXRyaWNzSWQ7IC8vIHNldCBvbmNlIGR1cmluZyBvcGVuKCkKIAorICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgIG1TdHJlYW1Mb2NrOworCiBwcml2YXRlOgogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdG9wKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdG9wX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jayk7CiAKLSAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICBtU3RyZWFtTG9jazsKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZW4gY2xvc2UgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2b2lkIHJlbGVhc2VDbG9zZUZpbmFsX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgeworICAgICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcpIHsgLy8gbm90IGFscmVhZHkgcmVsZWFzZWQ/CisgICAgICAgICAgICAvLyBJZ25vcmUgcmVzdWx0IGFuZCBrZWVwIGNsb3NpbmcuCisgICAgICAgICAgICAodm9pZCkgcmVsZWFzZV9sKCk7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2VfbCgpOworICAgIH0KIAogICAgIGNvbnN0IGFuZHJvaWQ6OnNwPE15UGxheWVyQmFzZT4gICBtUGxheWVyQmFzZTsKIApAQCAtNTk1LDYgKzYzMiw4IEBACiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgICAgICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNhcGFjaXR5ID0gMDsKIAogICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwpAQCAtNjIwLDggKzY1OSw4IEBACiAgICAgc3RkOjphdG9taWM8cGlkX3Q+ICAgICAgICAgIG1FcnJvckNhbGxiYWNrVGhyZWFke0NBTExCQUNLX1RIUkVBRF9OT05FfTsKIAogICAgIC8vIGJhY2tncm91bmQgdGhyZWFkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHB0aHJlYWRfdCAgICAgICAgICAgICAgICAgICBtVGhyZWFkOyAvLyBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSGFzVGhyZWFkIEdVQVJERURfQlkobVN0cmVhbUxvY2spID0gZmFsc2U7CisgICAgcHRocmVhZF90ICAgICAgICAgICAgICAgICAgIG1UaHJlYWQgIEdVQVJERURfQlkobVN0cmVhbUxvY2spID0ge307CiAKICAgICAvLyBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgYW5kIHRoZW4gcmVhZCBieSB0aGUgYXVkaW8gcHRocmVhZC4KICAgICBzdGQ6OmF0b21pYzxpbnQ2NF90PiAgICAgICAgbVBlcmlvZE5hbm9zZWNvbmRzOyAvLyBmb3IgdHVuaW5nIFNDSEVEX0ZJRk8gdGhyZWFkcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcAppbmRleCA2MGRhZDg0Li42MzBiMjg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcApAQCAtNjMsMjcgKzYzLDI2IEBACiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IGJ1aWxkZXJfY3JlYXRlU3RyZWFtKGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0cnlNTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbSAqKmF1ZGlvU3RyZWFtUHRyKSB7Ci0gICAgKmF1ZGlvU3RyZWFtUHRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8QXVkaW9TdHJlYW0+ICZzdHJlYW0pIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCiAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKIAogICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fSU5QVVQ6CiAgICAgICAgICAgICBpZiAodHJ5TU1hcCkgewotICAgICAgICAgICAgICAgICphdWRpb1N0cmVhbVB0ciA9IG5ldyBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZShBQXVkaW9CaW5kZXJDbGllbnQ6OmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlKEFBdWRpb0JpbmRlckNsaWVudDo6Z2V0SW5zdGFuY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqYXVkaW9TdHJlYW1QdHIgPSBuZXcgQXVkaW9TdHJlYW1SZWNvcmQoKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1SZWNvcmQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6CiAgICAgICAgICAgICBpZiAodHJ5TU1hcCkgewotICAgICAgICAgICAgICAgICphdWRpb1N0cmVhbVB0ciA9IG5ldyBBdWRpb1N0cmVhbUludGVybmFsUGxheShBQXVkaW9CaW5kZXJDbGllbnQ6OmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KEFBdWRpb0JpbmRlckNsaWVudDo6Z2V0SW5zdGFuY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqYXVkaW9TdHJlYW1QdHIgPSBuZXcgQXVkaW9TdHJlYW1UcmFjaygpOworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBBdWRpb1N0cmVhbVRyYWNrKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIApAQCAtOTgsNyArOTcsNyBAQAogLy8gRmFsbCBiYWNrIHRvIExlZ2FjeSBwYXRoIGlmIE1NQVAgbm90IGF2YWlsYWJsZS4KIC8vIEV4YWN0IGJlaGF2aW9yIGlzIGNvbnRyb2xsZWQgYnkgTU1hcFBvbGljeS4KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUJ1aWxkZXI6OmJ1aWxkKEF1ZGlvU3RyZWFtKiogc3RyZWFtUHRyKSB7Ci0gICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKwogICAgIGlmIChzdHJlYW1QdHIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXMoKSBzdHJlYW1QdHIgaXMgbnVsbCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwpAQCAtMTcxLDQxICsxNzAsNDggQEAKICAgICAgICAgc2V0UHJpdmFjeVNlbnNpdGl2ZSh0cnVlKTsKICAgICB9CiAKLSAgICByZXN1bHQgPSBidWlsZGVyX2NyZWF0ZVN0cmVhbShnZXREaXJlY3Rpb24oKSwgc2hhcmluZ01vZGUsIGFsbG93TU1hcCwgJmF1ZGlvU3RyZWFtKTsKKyAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gYXVkaW9TdHJlYW07CisgICAgcmVzdWx0ID0gYnVpbGRlcl9jcmVhdGVTdHJlYW0oZ2V0RGlyZWN0aW9uKCksIHNoYXJpbmdNb2RlLCBhbGxvd01NYXAsIGF1ZGlvU3RyZWFtKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICAvLyBPcGVuIHRoZSBzdHJlYW0gdXNpbmcgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgYnVpbGRlci4KICAgICAgICAgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPm9wZW4oKnRoaXMpOwotICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICAgICAgKnN0cmVhbVB0ciA9IGF1ZGlvU3RyZWFtOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgYm9vbCBpc01NYXAgPSBhdWRpb1N0cmVhbS0+aXNNTWFwKCk7Ci0gICAgICAgICAgICBkZWxldGUgYXVkaW9TdHJlYW07Ci0gICAgICAgICAgICBhdWRpb1N0cmVhbSA9IG51bGxwdHI7Ci0KICAgICAgICAgICAgIGlmIChpc01NYXAgJiYgYWxsb3dMZWdhY3kpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXMoKSBNTUFQIHN0cmVhbSBkaWQgbm90IG9wZW4gc28gdHJ5IExlZ2FjeSBwYXRoIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgIC8vIElmIE1NQVAgc3RyZWFtIGZhaWxlZCB0byBvcGVuIHRoZW4gVFJZIHVzaW5nIGEgbGVnYWN5IHN0cmVhbS4KICAgICAgICAgICAgICAgICByZXN1bHQgPSBidWlsZGVyX2NyZWF0ZVN0cmVhbShnZXREaXJlY3Rpb24oKSwgc2hhcmluZ01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZhdWRpb1N0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGF1ZGlvU3RyZWFtKTsKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhdWRpb1N0cmVhbS0+b3BlbigqdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqc3RyZWFtUHRyID0gYXVkaW9TdHJlYW07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXVkaW9TdHJlYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1N0cmVhbSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGF1ZGlvU3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIGF1ZGlvU3RyZWFtLT5sb2dPcGVuKCk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICpzdHJlYW1QdHIgPSBzdGFydFVzaW5nU3RyZWFtKGF1ZGlvU3RyZWFtKTsKKyAgICAgICAgfSAvLyBlbHNlIGF1ZGlvU3RyZWFtIHdpbGwgZ28gb3V0IG9mIHNjb3BlIGFuZCBiZSBkZWxldGVkCiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorQXVkaW9TdHJlYW0gKkF1ZGlvU3RyZWFtQnVpbGRlcjo6c3RhcnRVc2luZ1N0cmVhbShhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gJmF1ZGlvU3RyZWFtKSB7CisgICAgLy8gSW5jcmVtZW50IHRoZSBzbWFydCBwb2ludGVyIHNvIGl0IHdpbGwgbm90IGdldCBkZWxldGVkIHdoZW4KKyAgICAvLyB3ZSBwYXNzIGl0IHRvIHRoZSBDIGNhbGxlciBhbmQgaXQgZ29lcyBvdXQgb2Ygc2NvcGUuCisgICAgLy8gVGhlIEMgY29kZSBjYW5ub3QgaG9sZCBhIHNtYXJ0IHBvaW50ZXIgc28gd2UgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UKKyAgICAvLyBjb3VudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBDIGFwcCBvd25zIGEgcmVmZXJlbmNlLgorICAgIGF1ZGlvU3RyZWFtLT5pbmNTdHJvbmcobnVsbHB0cik7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLmdldCgpOworfQorCit2b2lkIEF1ZGlvU3RyZWFtQnVpbGRlcjo6c3RvcFVzaW5nU3RyZWFtKEF1ZGlvU3RyZWFtICpzdHJlYW0pIHsKKyAgICAvLyBVbmRvIHRoZSBlZmZlY3Qgb2Ygc3RhcnRVc2luZ1N0cmVhbSgpCisgICAgYW5kcm9pZDo6c3A8QXVkaW9TdHJlYW0+IHNwQXVkaW9TdHJlYW0oc3RyZWFtKTsKKyAgICBBTE9HVigiJXMoKSBzdHJvbmdDb3VudCA9ICVkIiwgX19mdW5jX18sIHNwQXVkaW9TdHJlYW0tPmdldFN0cm9uZ0NvdW50KCkpOworICAgIHNwQXVkaW9TdHJlYW0tPmRlY1N0cm9uZyhudWxscHRyKTsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtQnVpbGRlcjo6dmFsaWRhdGUoKSBjb25zdCB7CiAKICAgICAvLyBDaGVjayBmb3IgdmFsdWVzIHRoYXQgYXJlIHJpZGljdWxvdXNseSBvdXQgb2YgcmFuZ2UgdG8gcHJldmVudCBtYXRoIG92ZXJmbG93IGV4cGxvaXRzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCmluZGV4IGQ1ZmI4MGQuLjlmOTMzNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKQEAgLTEwOCw5ICsxMDgsMTYgQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKKwogICAgIHZvaWQgbG9nUGFyYW1ldGVycygpIGNvbnN0OwogCisgICAgLy8gTWFyayB0aGUgc3RyZWFtIHNvIGl0IGNhbiBiZSBkZWxldGVkLgorICAgIHN0YXRpYyB2b2lkIHN0b3BVc2luZ1N0cmVhbShBdWRpb1N0cmVhbSAqc3RyZWFtKTsKKwogcHJpdmF0ZToKKyAgICAvLyBFeHRyYWN0IGEgcmF3IHBvaW50ZXIgdGhhdCB3ZSBjYW4gcGFzcyB0byBhICdDJyBhcHAuCisgICAgc3RhdGljIEF1ZGlvU3RyZWFtICpzdGFydFVzaW5nU3RyZWFtKGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiAmc3BBdWRpb1N0cmVhbSk7CisKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gZmFsc2U7IC8vIG11c3QgbWF0Y2ggc2hhcmluZyBtb2RlIHJlcXVlc3RlZAogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgIG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKaW5kZXggZjUxMTNmMi4uNWMxMTg4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcApAQCAtMzEsNDAgKzMxLDM3IEBACiAjaW5jbHVkZSAiRmlmb0J1ZmZlci5oIgogCiB1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6Rmlmb0J1ZmZlckFsbG9jYXRlZDsKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXJJbmRpcmVjdDsKIHVzaW5nIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3Q7CiAKLUZpZm9CdWZmZXI6OkZpZm9CdWZmZXIoaW50MzJfdCBieXRlc1BlckZyYW1lLCBmaWZvX2ZyYW1lc190IGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKK0ZpZm9CdWZmZXI6OkZpZm9CdWZmZXIoaW50MzJfdCBieXRlc1BlckZyYW1lKQorICAgICAgICA6IG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpIHt9CisKK0ZpZm9CdWZmZXJBbGxvY2F0ZWQ6OkZpZm9CdWZmZXJBbGxvY2F0ZWQoaW50MzJfdCBieXRlc1BlckZyYW1lLCBmaWZvX2ZyYW1lc190IGNhcGFjaXR5SW5GcmFtZXMpCisgICAgICAgIDogRmlmb0J1ZmZlcihieXRlc1BlckZyYW1lKQogewogICAgIG1GaWZvID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQ29udHJvbGxlcj4oY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCiAgICAgaW50MzJfdCBieXRlc1BlckJ1ZmZlciA9IGJ5dGVzUGVyRnJhbWUgKiBjYXBhY2l0eUluRnJhbWVzOwotICAgIG1TdG9yYWdlID0gbmV3IHVpbnQ4X3RbYnl0ZXNQZXJCdWZmZXJdOwotICAgIG1TdG9yYWdlT3duZWQgPSB0cnVlOworICAgIG1JbnRlcm5hbFN0b3JhZ2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oYnl0ZXNQZXJCdWZmZXIpOwogICAgIEFMT0dWKCIlcygpIGNhcGFjaXR5SW5GcmFtZXMgPSAlZCwgYnl0ZXNQZXJGcmFtZSA9ICVkIiwKICAgICAgICAgICBfX2Z1bmNfXywgY2FwYWNpdHlJbkZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CiB9CiAKLUZpZm9CdWZmZXI6OkZpZm9CdWZmZXIoIGludDMyX3QgICBieXRlc1BlckZyYW1lLAorRmlmb0J1ZmZlckluZGlyZWN0OjpGaWZvQnVmZmVySW5kaXJlY3QoIGludDMyX3QgICBieXRlc1BlckZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19mcmFtZXNfdCAgIGNhcGFjaXR5SW5GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWZvX2NvdW50ZXJfdCAqICByZWFkSW5kZXhBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKiAgd3JpdGVJbmRleEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWZvX2NvdW50ZXJfdCAqcmVhZEluZGV4QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90ICp3cml0ZUluZGV4QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgZGF0YVN0b3JhZ2VBZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKLSAgICAgICAgLCBtU3RvcmFnZShzdGF0aWNfY2FzdDx1aW50OF90ICo+KGRhdGFTdG9yYWdlQWRkcmVzcykpCisgICAgICAgIDogRmlmb0J1ZmZlcihieXRlc1BlckZyYW1lKQorICAgICAgICAsIG1FeHRlcm5hbFN0b3JhZ2Uoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihkYXRhU3RvcmFnZUFkZHJlc3MpKQogewogICAgIG1GaWZvID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQ29udHJvbGxlckluZGlyZWN0PihjYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRJbmRleEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUluZGV4QWRkcmVzcyk7Ci0gICAgbVN0b3JhZ2VPd25lZCA9IGZhbHNlOwotfQotCi1GaWZvQnVmZmVyOjp+Rmlmb0J1ZmZlcigpIHsKLSAgICBpZiAobVN0b3JhZ2VPd25lZCkgewotICAgICAgICBkZWxldGVbXSBtU3RvcmFnZTsKLSAgICB9CiB9CiAKIGludDMyX3QgRmlmb0J1ZmZlcjo6Y29udmVydEZyYW1lc1RvQnl0ZXMoZmlmb19mcmFtZXNfdCBmcmFtZXMpIHsKQEAgLTc2LDE1ICs3MywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydEluZGV4KSB7CiAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSBudWxscHRyOwogICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSAwOworICAgIHVpbnQ4X3QgKnN0b3JhZ2UgPSBnZXRTdG9yYWdlKCk7CiAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA+IDApIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBjYXBhY2l0eSA9IG1GaWZvLT5nZXRDYXBhY2l0eSgpOwotICAgICAgICB1aW50OF90ICpzb3VyY2UgPSAmbVN0b3JhZ2VbY29udmVydEZyYW1lc1RvQnl0ZXMoc3RhcnRJbmRleCldOworICAgICAgICB1aW50OF90ICpzb3VyY2UgPSAmc3RvcmFnZVtjb252ZXJ0RnJhbWVzVG9CeXRlcyhzdGFydEluZGV4KV07CiAgICAgICAgIC8vIERvZXMgdGhlIGF2YWlsYWJsZSBkYXRhIGNyb3NzIHRoZSBlbmQgb2YgdGhlIEZJRk8/CiAgICAgICAgIGlmICgoc3RhcnRJbmRleCArIGZyYW1lc0F2YWlsYWJsZSkgPiBjYXBhY2l0eSkgewogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMF0gPSBzb3VyY2U7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gY2FwYWNpdHkgLSBzdGFydEluZGV4OwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IGZpcnN0RnJhbWVzOwotICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSAmbVN0b3JhZ2VbMF07CisgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVsxXSA9ICZzdG9yYWdlWzBdOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IGZyYW1lc0F2YWlsYWJsZSAtIGZpcnN0RnJhbWVzOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMF0gPSBzb3VyY2U7CkBAIC0xOTEsNiArMTg5LDYgQEAKIHZvaWQgRmlmb0J1ZmZlcjo6ZXJhc2VNZW1vcnkoKSB7CiAgICAgaW50MzJfdCBudW1CeXRlcyA9IGNvbnZlcnRGcmFtZXNUb0J5dGVzKGdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKSk7CiAgICAgaWYgKG51bUJ5dGVzID4gMCkgewotICAgICAgICBtZW1zZXQobVN0b3JhZ2UsIDAsIChzaXplX3QpIG51bUJ5dGVzKTsKKyAgICAgICAgbWVtc2V0KGdldFN0b3JhZ2UoKSwgMCwgKHNpemVfdCkgbnVtQnl0ZXMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCmluZGV4IDBkMTg4YzQuLjM3NTQ4ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaApAQCAtMzgsMTUgKzM4LDkgQEAKIAogY2xhc3MgRmlmb0J1ZmZlciB7CiBwdWJsaWM6Ci0gICAgRmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUsIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHlJbkZyYW1lcyk7CisgICAgRmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUpOwogCi0gICAgRmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGNhcGFjaXR5SW5GcmFtZXMsCi0gICAgICAgICAgICAgICBmaWZvX2NvdW50ZXJfdCAqcmVhZENvdW50ZXJBZGRyZXNzLAotICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKndyaXRlQ291bnRlckFkZHJlc3MsCi0gICAgICAgICAgICAgICB2b2lkICpkYXRhU3RvcmFnZUFkZHJlc3MpOwotCi0gICAgfkZpZm9CdWZmZXIoKTsKKyAgICB2aXJ0dWFsIH5GaWZvQnVmZmVyKCkgPSBkZWZhdWx0OwogCiAgICAgaW50MzJfdCBjb252ZXJ0RnJhbWVzVG9CeXRlcyhmaWZvX2ZyYW1lc190IGZyYW1lcyk7CiAKQEAgLTEyMSwxOSArMTE1LDUzIEBACiAgICAgICovCiAgICAgdm9pZCBlcmFzZU1lbW9yeSgpOwogCi1wcml2YXRlOgorcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB1aW50OF90ICpnZXRTdG9yYWdlKCkgY29uc3QgPSAwOwogCiAgICAgdm9pZCBmaWxsV3JhcHBpbmdCdWZmZXIoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlLCBpbnQzMl90IHN0YXJ0SW5kZXgpOwogCiAgICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgICBtQnl0ZXNQZXJGcmFtZTsKLSAgICAvLyBXZSBkbyBub3QgdXNlIGEgc3RkOjp1bmlxdWVfcHRyIGZvciBtU3RvcmFnZSBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgcG9pbnRlciB0bwotICAgIC8vIG1lbW9yeSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgYW5kIGNhbm5vdCBiZSBkZWxldGVkIHRyaXZpYWxseS4KLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgKm1TdG9yYWdlID0gbnVsbHB0cjsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgIG1TdG9yYWdlT3duZWQgPSBmYWxzZTsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPwogICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWZvQ29udHJvbGxlckJhc2U+IG1GaWZve307CiB9OwogCisvLyBEZWZpbmUgdHdvIHN1YmNsYXNzZXMgdG8gaGFuZGxlIHRoZSB0d28gd2F5cyB0aGF0IHN0b3JhZ2UgaXMgYWxsb2NhdGVkLgorCisvLyBBbGxvY2F0ZSBzdG9yYWdlIGludGVybmFsbHkuCitjbGFzcyBGaWZvQnVmZmVyQWxsb2NhdGVkIDogcHVibGljIEZpZm9CdWZmZXIgeworcHVibGljOgorICAgIEZpZm9CdWZmZXJBbGxvY2F0ZWQoaW50MzJfdCBieXRlc1BlckZyYW1lLCBmaWZvX2ZyYW1lc190IGNhcGFjaXR5SW5GcmFtZXMpOworCitwcml2YXRlOgorCisgICAgdWludDhfdCAqZ2V0U3RvcmFnZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlcm5hbFN0b3JhZ2UuZ2V0KCk7CisgICAgfTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG1JbnRlcm5hbFN0b3JhZ2U7Cit9OworCisvLyBBbGxvY2F0ZSBzdG9yYWdlIGV4dGVybmFsbHkgYW5kIHBhc3MgaXQgaW4uCitjbGFzcyBGaWZvQnVmZmVySW5kaXJlY3QgOiBwdWJsaWMgRmlmb0J1ZmZlciB7CitwdWJsaWM6CisgICAgLy8gV2UgdXNlIHJhdyBwb2ludGVycyBiZWNhdXNlIHRoZSBtZW1vcnkgbWF5IGJlCisgICAgLy8gaW4gdGhlIG1pZGRsZSBvZiBhbiBhbGxvY2F0ZWQgYmxvY2sgYW5kIGNhbm5vdCBiZSBkZWxldGVkIGRpcmVjdGx5LgorICAgIEZpZm9CdWZmZXJJbmRpcmVjdChpbnQzMl90IGJ5dGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHlJbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QqIHJlYWRDb3VudGVyQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QqIHdyaXRlQ291bnRlckFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGFTdG9yYWdlQWRkcmVzcyk7CisKK3ByaXZhdGU6CisKKyAgICB1aW50OF90ICpnZXRTdG9yYWdlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUV4dGVybmFsU3RvcmFnZTsKKyAgICB9OworCisgICAgdWludDhfdCAqbUV4dGVybmFsU3RvcmFnZSA9IG51bGxwdHI7Cit9OworCiB9ICAvLyBhbmRyb2lkCiAKICNlbmRpZiAvL0ZJRk9fRklGT19CVUZGRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVySW5kaXJlY3QuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckluZGlyZWN0LmgKaW5kZXggNTgzMmQ5Yy4uZWM0OGU1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVySW5kaXJlY3QuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oCkBAIC0yNyw3ICsyNyw3IEBACiAvKioKICAqIEEgRmlmb0NvbnRyb2xsZXJCYXNlIHdpdGggY291bnRlcnMgZXh0ZXJuYWwgdG8gdGhlIGNsYXNzLgogICoKLSAqIFRoZSBhY3R1YWwgY29wdW50ZXJzIG1heSBiZSBzdG9yZWQgaW4gc2VwYXJhdGUgcmVnaW9ucyBvZiBzaGFyZWQgbWVtb3J5CisgKiBUaGUgYWN0dWFsIGNvdW50ZXJzIG1heSBiZSBzdG9yZWQgaW4gc2VwYXJhdGUgcmVnaW9ucyBvZiBzaGFyZWQgbWVtb3J5CiAgKiB3aXRoIGRpZmZlcmVudCBhY2Nlc3MgcmlnaHRzLgogICovCiBjbGFzcyBGaWZvQ29udHJvbGxlckluZGlyZWN0IDogcHVibGljIEZpZm9Db250cm9sbGVyQmFzZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCmluZGV4IGVkYTQ2YWUuLjk3MjkzMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OwogCiAgICAgLyoqCi0gICAgICogRHVtbXkgcHJvY2Vzc29yLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgorICAgICAqIERvIG5vdGhpbmcuIFRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSBtZXRob2QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKICAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dncmFwaFV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NTA0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9VVElMSVRJRVNfSAorI2RlZmluZSBGTE9XR1JBUEhfVVRJTElUSUVTX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitjbGFzcyBGbG93Z3JhcGhVdGlsaXRpZXMgeworcHVibGljOgorLy8gVGhpcyB3YXMgY29waWVkIGZyb20gYXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oCisvKioKKyAqIENvbnZlcnQgYSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGEgUTAuMzEgaW50ZWdlciB2YWx1ZS4KKyAqIFJvdW5kcyB0byBuZWFyZXN0LCB0aWVzIGF3YXkgZnJvbSAwLgorICoKKyAqIFZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZSBbLTEuMCwgMS4wKSBhcmUgcHJvcGVybHkgY2xhbXBlZCB0byAtMjE0NzQ4MzY0OCBhbmQgMjE0NzQ4MzY0NywKKyAqIGluY2x1ZGluZyAtSW5mIGFuZCArSW5mLiBOYU4gdmFsdWVzIGFyZSBjb25zaWRlcmVkIHVuZGVmaW5lZCwgYW5kIGJlaGF2aW9yIG1heSBjaGFuZ2UKKyAqIGRlcGVuZGluZyBvbiBoYXJkd2FyZSBhbmQgZnV0dXJlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQzMl90IGNsYW1wMzJGcm9tRmxvYXQoZmxvYXQgZikKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAoZmxvYXQpKDFVTCA8PCAzMSk7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGxpbXBvcyA9IDEuOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBsaW1uZWcgPSAtMS47CisKKyAgICBpZiAoZiA8PSBsaW1uZWcpIHsKKyAgICAgICAgcmV0dXJuIC0weDgwMDAwMDAwOyAvKiBvciAweDgwMDAwMDAwICovCisgICAgfSBlbHNlIGlmIChmID49IGxpbXBvcykgeworICAgICAgICByZXR1cm4gMHg3ZmZmZmZmZjsKKyAgICB9CisgICAgZiAqPSBzY2FsZTsKKyAgICAvKiBpbnRlZ2VyIGNvbnZlcnNpb24gaXMgdGhyb3VnaCB0cnVuY2F0aW9uICh0aG91Z2ggaW50IHRvIGZsb2F0IGlzIG5vdCkuCisgICAgICogZW5zdXJlIHRoYXQgd2Ugcm91bmQgdG8gbmVhcmVzdCwgdGllcyBhd2F5IGZyb20gMC4KKyAgICAgKi8KKyAgICByZXR1cm4gZiA+IDAgPyBmICsgMC41IDogZiAtIDAuNTsKK30KKworfTsKKworI2VuZGlmIC8vIEZMT1dHUkFQSF9VVElMSVRJRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcAppbmRleCA2NTkyODI4Li4wY2IwNzdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpZmRlZiBfX0FORFJPSURfXwogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KQEAgLTI2LDcgKzI2LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKIAotCiBTaW5rSTI0OjpTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQogICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kzMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiODYzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd2dyYXBoVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU2lua0kzMi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTaW5rSTMyOjpTaW5rSTMyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisKK2ludDMyX3QgU2lua0kzMjo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgKmludERhdGEgPSAoaW50MzJfdCAqKSBkYXRhOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyNpZmRlZiBfX0FORFJPSURfXworICAgICAgICBtZW1jcHlfdG9faTMyX2Zyb21fZmxvYXQoaW50RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzKTsKKyAgICAgICAgaW50RGF0YSArPSBudW1TYW1wbGVzOworICAgICAgICBzaWduYWwgKz0gbnVtU2FtcGxlczsKKyNlbHNlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAqaW50RGF0YSsrID0gRmxvd2dyYXBoVXRpbGl0aWVzOjpjbGFtcDMyRnJvbUZsb2F0KCpzaWduYWwrKyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kzMi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDIzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19JMzJfSAorI2RlZmluZSBGTE9XR1JBUEhfU0lOS19JMzJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtJMzIgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rSTMyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKyAgICB+U2lua0kzMigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTMyX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCmluZGV4IGYzMTk4ODAuLjA5Nzk1NGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpZmRlZiBfX0FORFJPSURfXwogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKaW5kZXggMzlmMTRkYS4uMmVkNmYxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKQEAgLTE3LDggKzE3LDcgQEAKICNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9JMjRfSAogI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICiAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODE3N2FkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkzMi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VJMzI6OlNvdXJjZUkzMihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VJMzI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCBpbnQzMl90ICppbnRCYXNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MzJfdCAqPihtRGF0YSk7CisgICAgY29uc3QgaW50MzJfdCAqaW50RGF0YSA9ICZpbnRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTMyKGZsb2F0RGF0YSwgaW50RGF0YSwgbnVtU2FtcGxlcyk7CisjZWxzZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICpmbG9hdERhdGErKyA9ICppbnREYXRhKysgKiBrU2NhbGU7CisgICAgfQorI2VuZGlmCisKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwZjliZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9JMzJfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0kzMl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlSTMyIDogcHVibGljIEF1ZGlvU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTb3VyY2VJMzIoaW50MzJfdCBjaGFubmVsQ291bnQpOworICAgIH5Tb3VyY2VJMzIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtTY2FsZSA9IDEuMCAvICgxVUwgPDwgMzEpOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTMyX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcAppbmRleCBjMDYyODgyLi5mZGFhMmFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCkBAIC0zNCw4ICszNCw3IEBACiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBBdWRpb1N0cmVhbUxlZ2FjeTo6QXVkaW9TdHJlYW1MZWdhY3koKQotICAgICAgICA6IEF1ZGlvU3RyZWFtKCkKLSAgICAgICAgLCBtRGV2aWNlQ2FsbGJhY2sobmV3IFN0cmVhbURldmljZUNhbGxiYWNrKHRoaXMpKSB7CisgICAgICAgIDogQXVkaW9TdHJlYW0oKSB7CiB9CiAKIEF1ZGlvU3RyZWFtTGVnYWN5Ojp+QXVkaW9TdHJlYW1MZWdhY3koKSB7CkBAIC0xNjMsNyArMTYyLDExIEBACiB9CiAKIHZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OmZvcmNlRGlzY29ubmVjdChib29sIGVycm9yQ2FsbGJhY2tFbmFibGVkKSB7Ci0gICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGRpc2Nvbm5lY3QgaWYgYWxyZWFkeSBpbiB0aGVzZSBzdGF0ZXMuCisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQKKyAgICAgICAgICAgICYmIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HCisgICAgICAgICAgICAmJiBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECisgICAgICAgICAgICApIHsKICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwogICAgICAgICBpZiAoZXJyb3JDYWxsYmFja0VuYWJsZWQpIHsKICAgICAgICAgICAgIG1heWJlQ2FsbEVycm9yQ2FsbGJhY2soQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CkBAIC0yMDUsMjQgKzIwOCwzMCBAQAogICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwogfQogCi12b2lkIEF1ZGlvU3RyZWFtTGVnYWN5OjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCi17Cit2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5OjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IC8qIGF1ZGlvSW8gKi8sCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CiAgICAgLy8gRGV2aWNlIHJvdXRpbmcgaXMgYSBjb21tb24gc291cmNlIG9mIGVycm9ycyBhbmQgRElTQ09OTkVDVFMuCi0gICAgLy8gUGxlYXNlIGxlYXZlIHRoaXMgbG9nIGluIHBsYWNlLgotICAgIEFMT0dEKCIlcygpIGRldklkICVkID0+ICVkIiwgX19mdW5jX18sIChpbnQpIGdldERldmljZUlkKCksIChpbnQpZGV2aWNlSWQpOwotICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCAmJiBnZXREZXZpY2VJZCgpICE9IGRldmljZUlkICYmCi0gICAgICAgICAgICBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgLy8gUGxlYXNlIGxlYXZlIHRoaXMgbG9nIGluIHBsYWNlLiBJZiB0aGVyZSBpcyBhIGJ1ZyB0aGVuIHRoaXMgbWlnaHQKKyAgICAvLyBnZXQgY2FsbGVkIGFmdGVyIHRoZSBzdHJlYW0gaGFzIGJlZW4gZGVsZXRlZCBzbyBsb2cgYmVmb3JlIHdlCisgICAgLy8gdG91Y2ggdGhlIHN0cmVhbSBvYmplY3QuCisgICAgQUxPR0QoIiVzKGRldmljZUlkID0gJWQpIiwgX19mdW5jX18sIChpbnQpZGV2aWNlSWQpOworICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRAorICAgICAgICAgICAgJiYgZ2V0RGV2aWNlSWQoKSAhPSBkZXZpY2VJZAorICAgICAgICAgICAgJiYgZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRAorICAgICAgICAgICAgKSB7CiAgICAgICAgIC8vIE5vdGUgdGhhdCBpc0RhdGFDYWxsYmFja0FjdGl2ZSgpIGlzIGFmZmVjdGVkIGJ5IHN0YXRlIHNvIGNhbGwgaXQgYmVmb3JlIERJU0NPTk5FQ1RJTkcuCiAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBkYXRhIGNhbGxiYWNrIGFuZCB0aGUgc3RyZWFtIGlzIGFjdGl2ZSwgdGhlbiBhc2sgdGhlIGRhdGEgY2FsbGJhY2sKICAgICAgICAgLy8gdG8gRElTQ09OTkVDVCBhbmQgY2FsbCB0aGUgZXJyb3IgY2FsbGJhY2suCiAgICAgICAgIGlmIChpc0RhdGFDYWxsYmFja0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRCgib25BdWRpb0RldmljZVVwZGF0ZSgpIHJlcXVlc3QgRElTQ09OTkVDVCBpbiBkYXRhIGNhbGxiYWNrIGR1ZSB0byBkZXZpY2UgY2hhbmdlIik7CisgICAgICAgICAgICBBTE9HRCgiJXMoKSByZXF1ZXN0IERJU0NPTk5FQ1QgaW4gZGF0YSBjYWxsYmFjaywgZGV2aWNlICVkID0+ICVkIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAoaW50KSBnZXREZXZpY2VJZCgpLCAoaW50KSBkZXZpY2VJZCk7CiAgICAgICAgICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSBkYXRhIGNhbGxiYWNrIGhhcyBhIGNoYW5jZSB0byBoYW5kbGUgdGhlCi0gICAgICAgICAgICAvLyByZXF1ZXN0IHRoZW4gdGhlIHJlcXVlc3RTdG9wKCkgYW5kIHJlcXVlc3RQYXVzZSgpIG1ldGhvZHMgd2lsbCBoYW5kbGUgaXQgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHJlcXVlc3QgdGhlbiB0aGUgcmVxdWVzdFN0b3BfbCgpIGFuZCByZXF1ZXN0UGF1c2UoKSBtZXRob2RzIHdpbGwgaGFuZGxlIGl0IGFmdGVyCiAgICAgICAgICAgICAvLyB0aGUgY2FsbGJhY2sgaGFzIHN0b3BwZWQuCiAgICAgICAgICAgICBtUmVxdWVzdERpc2Nvbm5lY3QucmVxdWVzdCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoIm9uQXVkaW9EZXZpY2VVcGRhdGUoKSBESVNDT05ORUNUIHRoZSBzdHJlYW0gbm93Iik7CisgICAgICAgICAgICBBTE9HRCgiJXMoKSBESVNDT05ORUNUIHRoZSBzdHJlYW0gbm93LCBkZXZpY2UgJWQgPT4gJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIChpbnQpIGdldERldmljZUlkKCksIChpbnQpIGRldmljZUlkKTsKICAgICAgICAgICAgIGZvcmNlRGlzY29ubmVjdCgpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKaW5kZXggOWMyNGIyYi4uODhlZjI3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCkBAIC04NywyOSArODcsMTMgQEAKIAogcHJvdGVjdGVkOgogCi0gICAgY2xhc3MgU3RyZWFtRGV2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgYW5kcm9pZDo6QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sKLSAgICB7Ci0gICAgcHVibGljOgotCi0gICAgICAgIFN0cmVhbURldmljZUNhbGxiYWNrKEF1ZGlvU3RyZWFtTGVnYWN5ICpwYXJlbnQpIDogbVBhcmVudChwYXJlbnQpIHt9Ci0gICAgICAgIHZpcnR1YWwgflN0cmVhbURldmljZUNhbGxiYWNrKCkge30KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7Ci0gICAgICAgICAgICBpZiAobVBhcmVudCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgbVBhcmVudC0+b25BdWRpb0RldmljZVVwZGF0ZShkZXZpY2VJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBdWRpb1N0cmVhbUxlZ2FjeSAqbVBhcmVudDsKLSAgICB9OwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEJlc3RUaW1lc3RhbXAoY2xvY2tpZF90IGNsb2NrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6RXh0ZW5kZWRUaW1lc3RhbXAgKmV4dGVuZGVkVGltZXN0YW1wKTsKIAotICAgIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICB2b2lkIG9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayB0byBzZWUgd2hldGhlciBhIGNhbGxiYWNrIHRocmVhZCBoYXMgcmVxdWVzdGVkIGEgZGlzY29ubmVjdGVkLgpAQCAtMTI4LDYgKzExMiwxOCBAQAogICAgICAgICByZXR1cm4gbUZyYW1lc1JlYWQuaW5jcmVtZW50KGZyYW1lcyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmcmFtZXNQZXJCdXJzdCBmcm9tIHRoZSB1bmRlcmx5aW5nIEFQSS4KKyAgICAgKiBAcmV0dXJuIGZyYW1lc1BlckJ1cnN0CisgICAgICovCisgICAgdmlydHVhbCBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYnVmZmVyQ2FwYWNpdHkgZnJvbSB0aGUgdW5kZXJseWluZyBBUEkuCisgICAgICogQHJldHVybiBidWZmZXJDYXBhY2l0eSBpbiBmcmFtZXMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkgY29uc3QgPSAwOworCiAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBleGFjdCBtYXRjaGluZyBieSBNZWRpYU1ldHJpY3MuIFNvIGRvIG5vdCBjaGFuZ2UgaXQuCiAgICAgLy8gTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmg6IEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FX1ZBTFVFX0FBVURJTwogICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciAgICAga0NhbGxlck5hbWVbXSA9ICJhYXVkaW8iOwpAQCAtMTQwLDcgKzEzNiw2IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUJsb2NrQWRhcHRlckJ5dGVzUGVyRnJhbWUgPSAwOwogICAgIGFhdWRpb193cmFwcGluZ19mcmFtZXNfdCAgIG1Qb3NpdGlvbldoZW5TdGFydGluZyA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQnVmZmVyU2l6ZSA9IDA7Ci0gICAgY29uc3QgYW5kcm9pZDo6c3A8U3RyZWFtRGV2aWNlQ2FsbGJhY2s+ICAgbURldmljZUNhbGxiYWNrOwogCiAgICAgQXRvbWljUmVxdWVzdG9yICAgICAgICAgICAgbVJlcXVlc3REaXNjb25uZWN0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKaW5kZXggYjBkYzU5ZS4uNDViMjI1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcApAQCAtMTE4LDYgKzExOCw3IEBACiAgICAgICAgIHNldERldmljZUZvcm1hdChnZXRGb3JtYXQoKSk7CiAgICAgfQogCisgICAgLy8gVG8gYXZvaWQgZ2xpdGNoaW5nLCBsZXQgQXVkaW9GbGluZ2VyIHBpY2sgdGhlIG9wdGltYWwgYnVyc3Qgc2l6ZS4KICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwOwogCiAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZS4KQEAgLTEyOCw3ICsxMjksNiBAQAogICAgICAgICBzdHJlYW1UcmFuc2ZlclR5cGUgPSBBdWRpb1JlY29yZDo6dHJhbnNmZXJfdHlwZTo6VFJBTlNGRVJfQ0FMTEJBQ0s7CiAgICAgICAgIGNhbGxiYWNrID0gZ2V0TGVnYWN5Q2FsbGJhY2soKTsKICAgICAgICAgY2FsbGJhY2tEYXRhID0gdGhpczsKLSAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKICAgICB9CiAgICAgbUNhbGxiYWNrQnVmZmVyU2l6ZSA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CiAKQEAgLTE4NSw3ICsxODUsNyBAQAogICAgICAgICAvLyBEaWQgd2UgZ2V0IGEgdmFsaWQgdHJhY2s/CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1JlY29yZC0+aW5pdENoZWNrKCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJlbGVhc2VDbG9zZUZpbmFsKCk7CisgICAgICAgICAgICBzYWZlUmVsZWFzZUNsb3NlKCk7CiAgICAgICAgICAgICBBTE9HRSgib3BlbigpLCBpbml0Q2hlY2soKSByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICAgICAgfQpAQCAtMjEwLDEyICsyMTAsOSBAQAogCiAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIEF1ZGlvUmVjb3JkLgogICAgIHNldFNhbXBsZXNQZXJGcmFtZShtQXVkaW9SZWNvcmQtPmNoYW5uZWxDb3VudCgpKTsKLQotICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IG1BdWRpb1JlY29yZC0+Z2V0U2FtcGxlUmF0ZSgpOwotICAgIEFMT0dXX0lGKGFjdHVhbFNhbXBsZVJhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpLAotICAgICAgICAgICAgICJvcGVuKCkgc2FtcGxlUmF0ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAotICAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgYWN0dWFsU2FtcGxlUmF0ZSk7Ci0gICAgc2V0U2FtcGxlUmF0ZShhY3R1YWxTYW1wbGVSYXRlKTsKKyAgICBzZXRTYW1wbGVSYXRlKG1BdWRpb1JlY29yZC0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBzZXRCdWZmZXJDYXBhY2l0eShnZXRCdWZmZXJDYXBhY2l0eUZyb21EZXZpY2UoKSk7CisgICAgc2V0RnJhbWVzUGVyQnVyc3QoZ2V0RnJhbWVzUGVyQnVyc3RGcm9tRGV2aWNlKCkpOwogCiAgICAgLy8gV2UgbWF5IG5lZWQgdG8gcGFzcyB0aGUgZGF0YSB0aHJvdWdoIGEgYmxvY2sgc2l6ZSBhZGFwdGVyIHRvIGd1YXJhbnRlZSBjb25zdGFudCBzaXplLgogICAgIGlmIChtQ2FsbGJhY2tCdWZmZXJTaXplICE9IEFBVURJT19VTlNQRUNJRklFRCkgewpAQCAtMjgyLDcgKzI3OSw3IEBACiAgICAgICAgICAgICA6IChhYXVkaW9fc2Vzc2lvbl9pZF90KSBtQXVkaW9SZWNvcmQtPmdldFNlc3Npb25JZCgpOwogICAgIHNldFNlc3Npb25JZChhY3R1YWxTZXNzaW9uSWQpOwogCi0gICAgbUF1ZGlvUmVjb3JkLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjayk7CisgICAgbUF1ZGlvUmVjb3JkLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMpOwogCiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KQEAgLTI5MSwxNiArMjg4LDI0IEBACiAgICAgLy8gVE9ETyBhZGQgY2xvc2UoKSBvciByZWxlYXNlKCkgdG8gQXVkaW9GbGluZ2VyJ3MgQXVkaW9SZWNvcmQgQVBJLgogICAgIC8vICBUaGVuIGNhbGwgaXQgZnJvbSBoZXJlCiAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZC0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2spOworICAgICAgICBtQXVkaW9SZWNvcmQtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgIGxvZ1JlbGVhc2VCdWZmZXJTdGF0ZSgpOwotICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKLSAgICAgICAgbUZpeGVkQmxvY2tXcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgLy8gRGF0YSBjYWxsYmFja3MgbWF5IHN0aWxsIGJlIHJ1bm5pbmchCiAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbTo6cmVsZWFzZV9sKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsgLy8gYWxyZWFkeSByZWxlYXNlZAogICAgIH0KIH0KIAordm9pZCBBdWRpb1N0cmVhbVJlY29yZDo6Y2xvc2VfbCgpIHsKKyAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKKyAgICAvLyBEbyBub3QgY2xvc2UgbUZpeGVkQmxvY2tXcml0ZXIgYmVjYXVzZSBhIGRhdGEgY2FsbGJhY2sKKyAgICAvLyB0aHJlYWQgbWlnaHQgc3RpbGwgYmUgcnVubmluZyBpZiBzb21lb25lIGVsc2UgaGFzIGEgcmVmZXJlbmNlCisgICAgLy8gdG8gbUF1ZGlvUmVjb3JkLgorICAgIC8vIEl0IGhhcyBhIHVuaXF1ZV9wdHIgdG8gaXRzIGJ1ZmZlciBzbyBpdCB3aWxsIGNsZWFuIHVwIGJ5IGl0c2VsZi4KKyAgICBBdWRpb1N0cmVhbTo6Y2xvc2VfbCgpOworfQorCiBjb25zdCB2b2lkICogQXVkaW9TdHJlYW1SZWNvcmQ6Om1heWJlQ29udmVydERldmljZURhdGEoY29uc3Qgdm9pZCAqYXVkaW9EYXRhLCBpbnQzMl90IG51bUZyYW1lcykgewogICAgIGlmIChtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlckZsb2F0LmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihudW1GcmFtZXMgPiBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlclNpemVJbkZyYW1lcywKQEAgLTMzNiw3ICszNDEsNyBAQAogICAgIHJldHVybjsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjpyZXF1ZXN0U3RhcnQoKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjpyZXF1ZXN0U3RhcnRfbCgpCiB7CiAgICAgaWYgKG1BdWRpb1JlY29yZC5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTM2MCw3ICszNjUsNyBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6cmVxdWVzdFN0b3AoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1SZWNvcmQ6OnJlcXVlc3RTdG9wX2woKSB7CiAgICAgaWYgKG1BdWRpb1JlY29yZC5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CkBAIC00ODMsNyArNDg4LDcgQEAKICAgICByZXR1cm4gZ2V0QnVmZmVyQ2FwYWNpdHkoKTsgLy8gVE9ETyBpbXBsZW1lbnQgaW4gQXVkaW9SZWNvcmQ/CiB9CiAKLWludDMyX3QgQXVkaW9TdHJlYW1SZWNvcmQ6OmdldEJ1ZmZlckNhcGFjaXR5KCkgY29uc3QKK2ludDMyX3QgQXVkaW9TdHJlYW1SZWNvcmQ6OmdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdWRpb1JlY29yZC0+ZnJhbWVDb3VudCgpKTsKIH0KQEAgLTQ5Myw4ICs0OTgsNyBAQAogICAgIHJldHVybiAwOyAvLyBUT0RPIGltcGxlbWVudCB3aGVuIEF1ZGlvUmVjb3JkIHN1cHBvcnRzIGl0CiB9CiAKLWludDMyX3QgQXVkaW9TdHJlYW1SZWNvcmQ6OmdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QKLXsKK2ludDMyX3QgQXVkaW9TdHJlYW1SZWNvcmQ6OmdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF1ZGlvUmVjb3JkLT5nZXROb3RpZmljYXRpb25QZXJpb2RJbkZyYW1lcygpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKaW5kZXggYzU5NDRjNy4uYjJmOGJhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCkBAIC0zOSw5ICszOSw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJiBidWlsZGVyKSBvdmVycmlkZTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVsZWFzZV9sKCkgb3ZlcnJpZGU7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBjbG9zZV9sKCkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoY2xvY2tpZF90IGNsb2NrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCkBAIC01NSwxNCArNTMsMTAgQEAKIAogICAgIGludDMyX3QgZ2V0QnVmZmVyU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgaW50MzJfdCBnZXRCdWZmZXJDYXBhY2l0eSgpIGNvbnN0IG92ZXJyaWRlOwotCiAgICAgaW50MzJfdCBnZXRYUnVuQ291bnQoKSBjb25zdCBvdmVycmlkZTsKIAogICAgIGludDY0X3QgZ2V0RnJhbWVzV3JpdHRlbigpIG92ZXJyaWRlOwogCi0gICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdCgpIGNvbnN0IG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHVwZGF0ZVN0YXRlTWFjaGluZSgpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGdldERpcmVjdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsKQEAgLTc4LDYgKzcyLDE0IEBACiAKICAgICBjb25zdCB2b2lkICogbWF5YmVDb252ZXJ0RGV2aWNlRGF0YShjb25zdCB2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKIAorcHJvdGVjdGVkOgorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdGFydF9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcF9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spIG92ZXJyaWRlOworCisgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdEZyb21EZXZpY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpIGNvbnN0IG92ZXJyaWRlOworCiBwcml2YXRlOgogICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkF1ZGlvUmVjb3JkPiBtQXVkaW9SZWNvcmQ7CiAgICAgLy8gYWRhcHRzIGJldHdlZW4gdmFyaWFibGUgc2l6ZWQgYmxvY2tzIGFuZCBmaXhlZCBzaXplIGJsb2NrcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAppbmRleCA0ODY5NDgwLi4xZDAzNmQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcApAQCAtOTYsNiArOTYsNyBAQAogCiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAoc2l6ZV90KWJ1aWxkZXIuZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKIAorICAgIC8vIFRvIGF2b2lkIGdsaXRjaGluZywgbGV0IEF1ZGlvRmxpbmdlciBwaWNrIHRoZSBvcHRpbWFsIGJ1cnN0IHNpemUuCiAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwOwogCiAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKQpAQCAtMTE4LDggKzExOSw2IEBACiAgICAgICAgICAgICAvLyBUYWtlIGFkdmFudGFnZSBvZiBhIHNwZWNpYWwgdHJpY2sgdGhhdCBhbGxvd3MgdXMgdG8gY3JlYXRlIGEgYnVmZmVyCiAgICAgICAgICAgICAvLyB0aGF0IGlzIHNvbWUgbXVsdGlwbGUgb2YgdGhlIGJ1cnN0IHNpemUuCiAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMgPSAwIC0gREVGQVVMVF9CVVJTVFNfUEVSX0JVRkZFUl9DQVBBQ0lUWTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcyA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgbUNhbGxiYWNrQnVmZmVyU2l6ZSA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CkBAIC0xNzksNyArMTc4LDcgQEAKICAgICAvLyBEaWQgd2UgZ2V0IGEgdmFsaWQgdHJhY2s/CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvVHJhY2stPmluaXRDaGVjaygpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmVsZWFzZUNsb3NlRmluYWwoKTsKKyAgICAgICAgc2FmZVJlbGVhc2VDbG9zZSgpOwogICAgICAgICBBTE9HRSgib3BlbigpLCBpbml0Q2hlY2soKSByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwogICAgIH0KQEAgLTE5MywxMiArMTkyLDkgQEAKICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobUF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpKTsKICAgICBzZXRGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKICAgICBzZXREZXZpY2VGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKLQotICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgQUxPR1dfSUYoYWN0dWFsU2FtcGxlUmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCksCi0gICAgICAgICAgICAgIm9wZW4oKSBzYW1wbGVSYXRlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCi0gICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBhY3R1YWxTYW1wbGVSYXRlKTsKLSAgICBzZXRTYW1wbGVSYXRlKGFjdHVhbFNhbXBsZVJhdGUpOworICAgIHNldFNhbXBsZVJhdGUobUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKSk7CisgICAgc2V0QnVmZmVyQ2FwYWNpdHkoZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkpOworICAgIHNldEZyYW1lc1BlckJ1cnN0KGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpKTsKIAogICAgIC8vIFdlIG1heSBuZWVkIHRvIHBhc3MgdGhlIGRhdGEgdGhyb3VnaCBhIGJsb2NrIHNpemUgYWRhcHRlciB0byBndWFyYW50ZWUgY29uc3RhbnQgc2l6ZS4KICAgICBpZiAobUNhbGxiYWNrQnVmZmVyU2l6ZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKQEAgLTIyMSwxMCArMjE3LDcgQEAKICAgICAgICAgICAgIDogKGFhdWRpb19zZXNzaW9uX2lkX3QpIG1BdWRpb1RyYWNrLT5nZXRTZXNzaW9uSWQoKTsKICAgICBzZXRTZXNzaW9uSWQoYWN0dWFsU2Vzc2lvbklkKTsKIAotICAgIG1Jbml0aWFsQnVmZmVyQ2FwYWNpdHkgPSBnZXRCdWZmZXJDYXBhY2l0eSgpOwotICAgIG1Jbml0aWFsRnJhbWVzUGVyQnVyc3QgPSBnZXRGcmFtZXNQZXJCdXJzdCgpOwotCi0gICAgbUF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrKTsKKyAgICBtQXVkaW9UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzKTsKIAogICAgIC8vIFVwZGF0ZSBwZXJmb3JtYW5jZSBtb2RlIGJhc2VkIG9uIHRoZSBhY3R1YWwgc3RyZWFtIGZsYWdzLgogICAgIC8vIEZvciBleGFtcGxlLCBpZiB0aGUgc2FtcGxlIHJhdGUgaXMgbm90IGFsbG93ZWQgdGhlbiB5b3Ugd29uJ3QgZ2V0IGEgRkFTVCB0cmFjay4KQEAgLTI0MCwxMSArMjMzLDExIEBACiAKICAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7IC8vIEVYQ0xVU0lWRSBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gbGVnYWN5CiAKLSAgICAvLyBMb2cgd2FybmluZyBpZiB3ZSBkaWQgbm90IGdldCB3aGF0IHdlIGFza2VkIGZvci4KLSAgICBBTE9HV19JRihhY3R1YWxGbGFncyAhPSBmbGFncywKKyAgICAvLyBMb2cgaWYgd2UgZGlkIG5vdCBnZXQgd2hhdCB3ZSBhc2tlZCBmb3IuCisgICAgQUxPR0RfSUYoYWN0dWFsRmxhZ3MgIT0gZmxhZ3MsCiAgICAgICAgICAgICAgIm9wZW4oKSBmbGFncyBjaGFuZ2VkIGZyb20gMHglMDhYIHRvIDB4JTA4WCIsCiAgICAgICAgICAgICAgZmxhZ3MsIGFjdHVhbEZsYWdzKTsKLSAgICBBTE9HV19JRihhY3R1YWxQZXJmb3JtYW5jZU1vZGUgIT0gcGVyZk1vZGUsCisgICAgQUxPR0RfSUYoYWN0dWFsUGVyZm9ybWFuY2VNb2RlICE9IHBlcmZNb2RlLAogICAgICAgICAgICAgICJvcGVuKCkgcGVyZk1vZGUgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKICAgICAgICAgICAgICBwZXJmTW9kZSwgYWN0dWFsUGVyZm9ybWFuY2VNb2RlKTsKIApAQCAtMjUzLDE5ICsyNDYsMjYgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlbGVhc2VfbCgpIHsKICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcpIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIEFMT0dFX0lGKGVyciwgIiVzKCkgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBlcnIpOwogICAgICAgICBsb2dSZWxlYXNlQnVmZmVyU3RhdGUoKTsKLSAgICAgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB3aHkgY2xlYXIoKSBjYXVzZXMgYSBoYW5nIGluIHRlc3RfdmFyaW91cy5jcHAKLSAgICAgICAgLy8gaWYgSSBjYWxsIGNsb3NlKCkgZnJvbSBhIGRhdGEgY2FsbGJhY2suCi0gICAgICAgIC8vIEJ1dCB0aGUgc2FtZSB0aGluZyBpbiBBdWRpb1JlY29yZCBpcyBPSyEKLSAgICAgICAgLy8gbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICAgICAgbUZpeGVkQmxvY2tSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgLy8gRGF0YSBjYWxsYmFja3MgbWF5IHN0aWxsIGJlIHJ1bm5pbmchCiAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbTo6cmVsZWFzZV9sKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsgLy8gYWxyZWFkeSByZWxlYXNlZAogICAgIH0KIH0KIAordm9pZCBBdWRpb1N0cmVhbVRyYWNrOjpjbG9zZV9sKCkgeworICAgIC8vIFN0b3AgY2FsbGJhY2tzIGJlZm9yZSBkZWxldGluZyBtRml4ZWRCbG9ja1JlYWRlciBtZW1vcnkuCisgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKKyAgICAvLyBEbyBub3QgY2xvc2UgbUZpeGVkQmxvY2tSZWFkZXIgYmVjYXVzZSBhIGRhdGEgY2FsbGJhY2sKKyAgICAvLyB0aHJlYWQgbWlnaHQgc3RpbGwgYmUgcnVubmluZyBpZiBzb21lb25lIGVsc2UgaGFzIGEgcmVmZXJlbmNlCisgICAgLy8gdG8gbUF1ZGlvUmVjb3JkLgorICAgIC8vIEl0IGhhcyBhIHVuaXF1ZV9wdHIgdG8gaXRzIGJ1ZmZlciBzbyBpdCB3aWxsIGNsZWFuIHVwIGJ5IGl0c2VsZi4KKyAgICBBdWRpb1N0cmVhbTo6Y2xvc2VfbCgpOworfQorCiB2b2lkIEF1ZGlvU3RyZWFtVHJhY2s6OnByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKQEAgLTI4MSw4ICsyODEsOCBAQAogICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9UcmFjay0+Zm9ybWF0KCkgIT0gZ2V0Rm9ybWF0KCkKICAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKSAhPSBnZXRTYW1wbGVSYXRlKCkKICAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmdldFJvdXRlZERldmljZUlkKCkgIT0gZ2V0RGV2aWNlSWQoKQotICAgICAgICAgICAgICAgICAgICB8fCBnZXRCdWZmZXJDYXBhY2l0eSgpICE9IG1Jbml0aWFsQnVmZmVyQ2FwYWNpdHkKLSAgICAgICAgICAgICAgICAgICAgfHwgZ2V0RnJhbWVzUGVyQnVyc3QoKSAhPSBtSW5pdGlhbEZyYW1lc1BlckJ1cnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHx8IGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpICE9IGdldEJ1ZmZlckNhcGFjaXR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgZ2V0RnJhbWVzUGVyQnVyc3RGcm9tRGV2aWNlKCkgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgICAgIHByb2Nlc3NDYWxsYmFja0NvbW1vbihBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX0RJU0NPTk5FQ1RFRCwgaW5mbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgIHJldHVybjsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdGFydCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RhcnRfbCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgicmVxdWVzdFN0YXJ0KCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFBhdXNlKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZV9sKCkgewogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlcygpIG5vIEF1ZGlvVHJhY2siLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTMzNiw3ICszMzYsNyBAQAogICAgIHJldHVybiBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGZhbHNlKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0Rmx1c2hfbCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC0zNTAsNyArMzUwLDcgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0b3AoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0b3BfbCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC00NzEsNyArNDcxLDcgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF1ZGlvVHJhY2stPmdldEJ1ZmZlclNpemVJbkZyYW1lcygpKTsKIH0KIAotaW50MzJfdCBBdWRpb1N0cmVhbVRyYWNrOjpnZXRCdWZmZXJDYXBhY2l0eSgpIGNvbnN0CitpbnQzMl90IEF1ZGlvU3RyZWFtVHJhY2s6OmdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdWRpb1RyYWNrLT5mcmFtZUNvdW50KCkpOwogfQpAQCAtNDgxLDggKzQ4MSw3IEBACiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdWRpb1RyYWNrLT5nZXRVbmRlcnJ1bkNvdW50KCkpOwogfQogCi1pbnQzMl90IEF1ZGlvU3RyZWFtVHJhY2s6OmdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QKLXsKK2ludDMyX3QgQXVkaW9TdHJlYW1UcmFjazo6Z2V0RnJhbWVzUGVyQnVyc3RGcm9tRGV2aWNlKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQXVkaW9UcmFjay0+Z2V0Tm90aWZpY2F0aW9uUGVyaW9kSW5GcmFtZXMoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaAppbmRleCA5M2ExZmY0Li5mNjA0ODcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCkBAIC00MiwxMiArNDIsMTUgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmIGJ1aWxkZXIpIG92ZXJyaWRlOwogICAgIGFhdWRpb19yZXN1bHRfdCByZWxlYXNlX2woKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsb3NlX2woKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnQoKSBvdmVycmlkZTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFBhdXNlKCkgb3ZlcnJpZGU7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RGbHVzaCgpIG92ZXJyaWRlOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcCgpIG92ZXJyaWRlOworcHJvdGVjdGVkOgorICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnRfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSAgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RQYXVzZV9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0Rmx1c2hfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0b3BfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSBvdmVycmlkZTsKIAorcHVibGljOgogICAgIGJvb2wgaXNGbHVzaFN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgLy8gT25seSBpbXBsZW1lbnQgRkxVU0ggZm9yIE9VVFBVVCBzdHJlYW1zLgogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTY4LDggKzcxLDYgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzZXRCdWZmZXJTaXplKGludDMyX3QgcmVxdWVzdGVkRnJhbWVzKSBvdmVycmlkZTsKICAgICBpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdCgpY29uc3QgIG92ZXJyaWRlOwogICAgIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBpbnQ2NF90IGdldEZyYW1lc1JlYWQoKSBvdmVycmlkZTsKQEAgLTk1LDYgKzk2LDExIEBACiAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CiAjZW5kaWYKIAorcHJvdGVjdGVkOgorCisgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdEZyb21EZXZpY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpIGNvbnN0IG92ZXJyaWRlOworCiBwcml2YXRlOgogCiAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CkBAIC0xMDQsMTAgKzExMCw2IEBACiAKICAgICAvLyBUT0RPIGFkZCA2NC1iaXQgcG9zaXRpb24gcmVwb3J0aW5nIHRvIEF1ZGlvVHJhY2sgYW5kIHVzZSBpdC4KICAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgICAgICAgICBtUG9zaXRpb25XaGVuUGF1c2luZyA9IDA7Ci0KLSAgICAvLyBpbml0aWFsIEF1ZGlvVHJhY2sgZnJhbWUgY291bnQgYW5kIG5vdGlmaWNhdGlvbiBwZXJpb2QKLSAgICBpbnQzMl90IG1Jbml0aWFsQnVmZmVyQ2FwYWNpdHkgPSAwOwotICAgIGludDMyX3QgbUluaXRpYWxGcmFtZXNQZXJCdXJzdCA9IDA7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggOTAwN2IxMC4uZDc5NTcyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJjb3JlL0F1ZGlvR2xvYmFsLmgiCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KICNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KIAogI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCkBAIC0xMzQsNiArMTM0LDEyIEBACiAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRDoKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMzI6CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFhdWRpb0Zvcm1hdCk7CkBAIC0xNTQsNiArMTYwLDEyIEBACiAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kzMjsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFuZHJvaWRGb3JtYXQpOwpAQCAtMjMxLDcgKzI0Myw4IEBACiAgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTjsKICAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTiB8IEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OIHwgQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRSk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIHBvbGljeSk7CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT05FOyAvLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IGQyZTQ4MDUuLjgyZWI3N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDg5MzVkNTcuLjk1ZDY1NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMSwxMCArMTEsMTIgQEAKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfbWFyc2hhbGxpbmcuY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFhdWRpby1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhYXVkaW9faW50ZXJuYWwiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbC11bnN0YWJsZS1jcHAiLAogICAgIF0sCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2FhdWRpb19tb25rZXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYWF1ZGlvX21vbmtleS5jcHAKaW5kZXggYmU1NDgzNS4uY2MyOTY3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYWF1ZGlvX21vbmtleS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYWF1ZGlvX21vbmtleS5jcHAKQEAgLTQ2LDExICs0NiwxMCBAQAogICAgICAgICBpbnQzMl90IG51bUZyYW1lcyk7CiAKIHZvaWQgQUF1ZGlvTW9ua2V5RXJyb3JDYWxsYmFja1Byb2MoCi0gICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAotICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7Ci0gICAgcHJpbnRmKCJFcnJvciBDYWxsYmFjaywgZXJyb3I6ICVkXG4iLChpbnQpZXJyb3IpOwotfQorICAgICAgICBBQXVkaW9TdHJlYW0gKiAvKiBzdHJlYW0gKi8sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOworCiAKIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLiBPbmx5IHVzZSB0aGlzIGZyb20gYSBzaW5nbGUgdGhyZWFkLgogZG91YmxlIG5leHRSYW5kb21Eb3VibGUoKSB7CkBAIC05OSw2ICs5OCwxMCBAQAogICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV047CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKGdldFN0cmVhbSgpLAogICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOLCAmc3RhdGUsIDApOworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAtIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UgcmV0dXJuZWQgRElTQ09OTkVDVEVEXG4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBPSworICAgICAgICB9CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTExNCw3ICsxMTcsNyBAQAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZnJhbWVzUmVhZCwKICAgICAgICAgICAgICAgIHhSdW5zKTsKIAotICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA8IGZyYW1lc1JlYWQpIHsKKyAgICAgICAgaWYgKHN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcgJiYgZnJhbWVzV3JpdHRlbiA8IGZyYW1lc1JlYWQpIHsKICAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAtIFVOREVSRkxPVyAtIGRpZmYgPSAlZCAhISEhISEhISEhISFcbiIsCiAgICAgICAgICAgICAgICAgICAgKGludCkgKGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkKSk7CiAgICAgICAgIH0KQEAgLTEzMiw4ICsxMzUsMjMgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHVwZGF0ZSBhbmQgcXVlcnkgc3RyZWFtIHN0YXRlCisgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgc3RhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoZ2V0U3RyZWFtKCkpOworICAgICAgICBpZiAoc3RhdGUgPCAwKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX2dldFN0YXRlIHJldHVybmVkICVkXG4iLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIHByaW50ZigiIyVkLCBDbG9zaW5nIGRpc2Nvbm5lY3RlZCBzdHJlYW0uXG4iLCBnZXRJbmRleCgpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKICAgICAgICAgZG91YmxlIGRpY2UgPSBuZXh0UmFuZG9tRG91YmxlKCk7CiAgICAgICAgIC8vIFNlbGVjdCBhbiBhY3Rpb24gYmFzZWQgb24gYSB3ZWlnaHRlZCBwcm9iYWJpbGl0eS4KKyAgICAgICAgcHJpbnRmKCIgICAgIik7IC8vIGluZGVudCBhY3Rpb24KICAgICAgICAgaWYgKGRpY2UgPCBQUk9CX1NUQVJUKSB7CiAgICAgICAgICAgICBwcmludGYoInN0YXJ0XG4iKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoZ2V0U3RyZWFtKCkpOwpAQCAtMjAwLDYgKzIxOCwxMCBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKICAgICB9CiAKKyAgICBpbnQgZ2V0SW5kZXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5kZXg7CisgICAgfQorCiBwcml2YXRlOgogICAgIGNvbnN0IEFBdWRpb0FyZ3NQYXJzZXIgICptQXJnUGFyc2VyOwogICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICBtSW5kZXg7CkBAIC0yMjMsNiArMjQ1LDEzIEBACiAgICAgcmV0dXJuIG1vbmtleS0+cmVuZGVyQXVkaW8oc3RyZWFtLCBhdWRpb0RhdGEsIG51bUZyYW1lcyk7CiB9CiAKK3ZvaWQgQUF1ZGlvTW9ua2V5RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqIC8qIHN0cmVhbSAqLywKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcikgeworICAgIEFBdWRpb01vbmtleSAqbW9ua2V5ID0gKEFBdWRpb01vbmtleSAqKSB1c2VyRGF0YTsKKyAgICBwcmludGYoIiMlZCwgRXJyb3IgQ2FsbGJhY2ssIGVycm9yOiAlZFxuIiwgbW9ua2V5LT5nZXRJbmRleCgpLCAoaW50KWVycm9yKTsKK30KIAogc3RhdGljIHZvaWQgdXNhZ2UoKSB7CiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcAppbmRleCAxMzBlZjQzLi40ZGJiMjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCkBAIC0yNiw2ICsyNiw3IEBACiB1c2luZyBhbmRyb2lkOjpmaWZvX2NvdW50ZXJfdDsKIHVzaW5nIGFuZHJvaWQ6OkZpZm9Db250cm9sbGVyOwogdXNpbmcgYW5kcm9pZDo6Rmlmb0J1ZmZlcjsKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXJJbmRpcmVjdDsKIHVzaW5nIGFuZHJvaWQ6OldyYXBwaW5nQnVmZmVyOwogCiBURVNUKHRlc3RfZmlmb19jb250cm9sbGVyLCBmaWZvX2luZGljZXMpIHsKQEAgLTMyNSw3ICszMjYsNyBAQAogICAgICAgICB2ZXJpZnlTdG9yYWdlSW50ZWdyaXR5KCk7CiAgICAgfQogCi0gICAgRmlmb0J1ZmZlciAgICAgbUZpZm9CdWZmZXI7CisgICAgRmlmb0J1ZmZlckluZGlyZWN0ICAgICBtRmlmb0J1ZmZlcjsKICAgICBmaWZvX2ZyYW1lc190ICBtTmV4dFdyaXRlSW5kZXggPSAwOwogICAgIGZpZm9fZnJhbWVzX3QgIG1OZXh0VmVyaWZ5SW5kZXggPSAwOwogICAgIGZpZm9fZnJhbWVzX3QgIG1UaHJlc2hvbGQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9tYXJzaGFsbGluZy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9tYXJzaGFsbGluZy5jcHAKaW5kZXggYzUxZmJjZS4uNDkyMTNkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbWFyc2hhbGxpbmcuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X21hcnNoYWxsaW5nLmNwcApAQCAtMzMsNiArMzMsMjkgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgY29weShjb25zdCBUJiBvYmplY3QpIHsKKyAgICByZXR1cm4gVChvYmplY3QpOworfQorCit0ZW1wbGF0ZTw+CitTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIGNvcHk8U2hhcmVkTWVtb3J5UGFyY2VsYWJsZT4oY29uc3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSYgb2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVjdC5kdXAoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgd3JpdGVUb1BhcmNlbChjb25zdCBUJiBvYmplY3QsIFBhcmNlbCogcGFyY2VsKSB7CisgICAgY29weShvYmplY3QpLnBhcmNlbGFibGUoKS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgcGFyY2VsKSB7CisgICAgdXNpbmcgUGFyY2VsVHlwZSA9IHN0ZDo6ZGVjYXlfdDxkZWNsdHlwZShzdGQ6OmRlY2x2YWw8VD4oKS5wYXJjZWxhYmxlKCkpPjsKKyAgICBQYXJjZWxUeXBlIHBhcmNlbGFibGU7CisgICAgcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbCgmcGFyY2VsKTsKKyAgICByZXR1cm4gVChzdGQ6Om1vdmUocGFyY2VsYWJsZSkpOworfQorCiAvLyBUZXN0IGFkZGluZyBvbmUgdmFsdWUuCiBURVNUKHRlc3RfbWFyc2hhbGxpbmcsIGFhdWRpb19vbmVfcmVhZF93cml0ZSkgewogICAgIFBhcmNlbCBwYXJjZWw7CkBAIC00OCw3ICs3MSw2IEBACiAvLyBUZXN0IFNoYXJlZE1lbW9yeVBhcmNlbC4KIFRFU1QodGVzdF9tYXJzaGFsbGluZywgYWF1ZGlvX3NoYXJlZF9tZW1vcnkpIHsKICAgICBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIHNoYXJlZE1lbW9yeUE7Ci0gICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBzaGFyZWRNZW1vcnlCOwogICAgIGNvbnN0IHNpemVfdCBtZW1TaXplQnl0ZXMgPSA4NDA7CiAgICAgdW5pcXVlX2ZkIGZkKGFzaG1lbV9jcmVhdGVfcmVnaW9uKCJUZXN0TWFyc2hhbGxpbmciLCBtZW1TaXplQnl0ZXMpKTsKICAgICBBU1NFUlRfTEUoMCwgZmQpOwpAQCAtNjMsMTAgKzg1LDEwIEBACiAKICAgICBQYXJjZWwgcGFyY2VsOwogICAgIHNpemVfdCBwb3MgPSBwYXJjZWwuZGF0YVBvc2l0aW9uKCk7Ci0gICAgc2hhcmVkTWVtb3J5QS53cml0ZVRvUGFyY2VsKCZwYXJjZWwpOworICAgIHdyaXRlVG9QYXJjZWwoc2hhcmVkTWVtb3J5QSwgJnBhcmNlbCk7CiAKICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKHBvcyk7Ci0gICAgc2hhcmVkTWVtb3J5Qi5yZWFkRnJvbVBhcmNlbCgmcGFyY2VsKTsKKyAgICBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIHNoYXJlZE1lbW9yeUIgPSByZWFkRnJvbVBhcmNlbDxTaGFyZWRNZW1vcnlQYXJjZWxhYmxlPihwYXJjZWwpOwogICAgIEVYUEVDVF9FUShzaGFyZWRNZW1vcnlBLmdldFNpemVJbkJ5dGVzKCksIHNoYXJlZE1lbW9yeUIuZ2V0U2l6ZUluQnl0ZXMoKSk7CiAKICAgICAvLyBzaG91bGQgc2VlIHNhbWUgdmFsdWUgYXQgdHdvIGRpZmZlcmVudCBhZGRyZXNzZXMKQEAgLTgxLDcgKzEwMyw2IEBACiBURVNUKHRlc3RfbWFyc2hhbGxpbmcsIGFhdWRpb19zaGFyZWRfcmVnaW9uKSB7CiAgICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBzaGFyZWRNZW1vcmllc1syXTsKICAgICBTaGFyZWRSZWdpb25QYXJjZWxhYmxlIHNoYXJlZFJlZ2lvbkE7Ci0gICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSBzaGFyZWRSZWdpb25COwogICAgIGNvbnN0IHNpemVfdCBtZW1TaXplQnl0ZXMgPSA4NDA7CiAgICAgdW5pcXVlX2ZkIGZkKGFzaG1lbV9jcmVhdGVfcmVnaW9uKCJUZXN0TWFyc2hhbGxpbmciLCBtZW1TaXplQnl0ZXMpKTsKICAgICBBU1NFUlRfTEUoMCwgZmQpOwpAQCAtOTcsMTAgKzExOCwxMCBAQAogCiAgICAgUGFyY2VsIHBhcmNlbDsKICAgICBzaXplX3QgcG9zID0gcGFyY2VsLmRhdGFQb3NpdGlvbigpOwotICAgIHNoYXJlZFJlZ2lvbkEud3JpdGVUb1BhcmNlbCgmcGFyY2VsKTsKKyAgICB3cml0ZVRvUGFyY2VsKHNoYXJlZFJlZ2lvbkEsICZwYXJjZWwpOwogCiAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbihwb3MpOwotICAgIHNoYXJlZFJlZ2lvbkIucmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSBzaGFyZWRSZWdpb25CID0gcmVhZEZyb21QYXJjZWw8U2hhcmVkUmVnaW9uUGFyY2VsYWJsZT4ocGFyY2VsKTsKIAogICAgIC8vIHNob3VsZCBzZWUgc2FtZSB2YWx1ZQogICAgIHZvaWQgKnJlZ2lvbjI7CkBAIC0xMTMsNyArMTM0LDYgQEAKIFRFU1QodGVzdF9tYXJzaGFsbGluZywgYWF1ZGlvX3JpbmdfYnVmZmVyX3BhcmNlbGFibGUpIHsKICAgICBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIHNoYXJlZE1lbW9yaWVzWzJdOwogICAgIFJpbmdCdWZmZXJQYXJjZWxhYmxlIHJpbmdCdWZmZXJBOwotICAgIFJpbmdCdWZmZXJQYXJjZWxhYmxlIHJpbmdCdWZmZXJCOwogCiAgICAgY29uc3Qgc2l6ZV90IGJ5dGVzUGVyRnJhbWUgPSA4OwogICAgIGNvbnN0IHNpemVfdCBmcmFtZXNQZXJCdXJzdCA9IDMyOwpAQCAtMTQ3LDExICsxNjcsMTEgQEAKICAgICAvLyB3cml0ZSBBIHRvIHBhcmNlbAogICAgIFBhcmNlbCBwYXJjZWw7CiAgICAgc2l6ZV90IHBvcyA9IHBhcmNlbC5kYXRhUG9zaXRpb24oKTsKLSAgICByaW5nQnVmZmVyQS53cml0ZVRvUGFyY2VsKCZwYXJjZWwpOworICAgIHdyaXRlVG9QYXJjZWwocmluZ0J1ZmZlckEsICZwYXJjZWwpOwogCiAgICAgLy8gcmVhZCBCIGZyb20gcGFyY2VsCiAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbihwb3MpOwotICAgIHJpbmdCdWZmZXJCLnJlYWRGcm9tUGFyY2VsKCZwYXJjZWwpOworICAgIFJpbmdCdWZmZXJQYXJjZWxhYmxlIHJpbmdCdWZmZXJCID0gcmVhZEZyb21QYXJjZWw8UmluZ0J1ZmZlclBhcmNlbGFibGU+KHBhcmNlbCk7CiAKICAgICBSaW5nQnVmZmVyRGVzY3JpcHRvciBkZXNjcmlwdG9yQjsKICAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCByaW5nQnVmZmVyQi5yZXNvbHZlKHNoYXJlZE1lbW9yaWVzLCAmZGVzY3JpcHRvckIpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0b3BfaGFuZy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zdG9wX2hhbmcuY3BwCmluZGV4IDIzOTdiNmMuLjk4MmZmNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0b3BfaGFuZy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc3RvcF9oYW5nLmNwcApAQCAtNDUsNyArNDUsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2lsbCBibG9jayBpZiB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcuCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbXV0ZXggaXMgdXNlZCB0byBjbG9zZSgpIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjYWxsYmFjayByZXR1cm5zCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBiZWZvcmUgdGhlIHJlcXVlc3RTdG9wKCkgaXMgY2FsbGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVmb3JlIHRoZSByZXF1ZXN0U3RvcF9sKCkgaXMgY2FsbGVkLgogICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhkb25lTG9jayk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSBicmVhazsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF92YXJpb3VzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCmluZGV4IGEyMGM3OTkuLmNiZjg2M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCkBAIC0zMyw2ICszMywxMSBAQAogICAgICAgICB2b2lkICphdWRpb0RhdGEsCiAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzCiApIHsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbihzdHJlYW0pOworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKKyAgICB9CisgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgdG8gYWxsIHplcm9zLgogICAgIGludCBjaGFubmVscyA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKTsKICAgICBpbnQgbnVtU2FtcGxlcyA9IGNoYW5uZWxzICogbnVtRnJhbWVzOwogICAgIGJvb2wgYWxsWmVyb3MgPSB0cnVlOwpAQCAtNDgsNyArNTMsOCBAQAogY29uc3RleHByIGludDY0X3QgTkFOT1NfUEVSX01JTExJU0VDT05EID0gMTAwMCAqIDEwMDA7CiAKIHZvaWQgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUsCi0gICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGFhdWRpb0J1aWxkZXIgPSBudWxscHRyOwogICAgIEFBdWRpb1N0cmVhbSogYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKIApAQCAtNjEsNiArNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKGFhdWRpb0J1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihhYXVkaW9CdWlsZGVyLCBkaXJlY3Rpb24pOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KGFhdWRpb0J1aWxkZXIsIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKIAogICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCkBAIC04OCwxNCArOTUsMjggQEAKICAgICAvLyBXZSBzaG91bGQgTk9UIGJlIGFibGUgdG8gc3RhcnQgb3IgY2hhbmdlIGEgc3RyZWFtIGFmdGVyIGl0IGhhcyBiZWVuIHJlbGVhc2VkLgogICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0pKTsKICAgICBFWFBFQ1RfRVEoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HLCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoYWF1ZGlvU3RyZWFtKSk7Ci0gICAgRVhQRUNUX0VRKEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKGFhdWRpb1N0cmVhbSkpOworICAgIC8vIFBhdXNlIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIE9VVFBVVC4KKyAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwKKyAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoYWF1ZGlvU3RyZWFtKSk7CisgICAgfQogICAgIEVYUEVDVF9FUShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcsIEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShhYXVkaW9TdHJlYW0pKTsKICAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0pKTsKICAgICBFWFBFQ1RfRVEoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HLCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoYWF1ZGlvU3RyZWFtKSk7CiAKICAgICAvLyBEb2VzIHRoaXMgY3Jhc2g/Ci0gICAgRVhQRUNUX0xUKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGFhdWRpb1N0cmVhbSkpOwotICAgIEVYUEVDVF9MVCgwLCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihhYXVkaW9TdHJlYW0pKTsKKyAgICBFWFBFQ1RfR1QoQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoYWF1ZGlvU3RyZWFtKSwgMCk7CisgICAgRVhQRUNUX0dUKEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGFhdWRpb1N0cmVhbSksIDApOworICAgIEVYUEVDVF9HVChBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QoYWF1ZGlvU3RyZWFtKSwgMCk7CisgICAgRVhQRUNUX0dFKEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoYWF1ZGlvU3RyZWFtKSwgMCk7CisgICAgRVhQRUNUX0dUKEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGFhdWRpb1N0cmVhbSksIDApOworICAgIEVYUEVDVF9HVChBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSksIDApOworCisgICAgaW50NjRfdCB0aW1lc3RhbXBGcmFtZXMgPSAwOworICAgIGludDY0X3QgdGltZXN0YW1wTmFub3MgPSAwOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKGFhdWRpb1N0cmVhbSwgQ0xPQ0tfTU9OT1RPTklDLAorICAgICAgICAgICAgJnRpbWVzdGFtcEZyYW1lcywgJnRpbWVzdGFtcE5hbm9zKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUgfHwgcmVzdWx0ID09IEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEKTsKIAogICAgIC8vIFZlcmlmeSBDbG9zaW5nIFN0YXRlLiBEb2VzIHRoaXMgY3Jhc2g/CiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOOwpAQCAtMTA3LDIwICsxMjgsNDIgQEAKICAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7CiB9CiAKLVRFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fcmVsZWFzZV9jbG9zZV9ub25lKSB7CitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3JlbGVhc2VfY2xvc2Vfbm9uZV9vdXRwdXQpIHsKICAgICBjaGVja1JlbGVhc2VUaGVuQ2xvc2UoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKLSAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOwogICAgIC8vIE5vIEVYQ0xVU0lWRSBzdHJlYW1zIHdpdGggTU9ERV9OT05FLgogfQogCi1URVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3JlbGVhc2VfY2xvc2VfbG93X3NoYXJlZCkgewotICAgIGNoZWNrUmVsZWFzZVRoZW5DbG9zZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKLSAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fcmVsZWFzZV9jbG9zZV9ub25lX2lucHV0KSB7CisgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIC8vIE5vIEVYQ0xVU0lWRSBzdHJlYW1zIHdpdGggTU9ERV9OT05FLgogfQogCi1URVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3JlbGVhc2VfY2xvc2VfbG93X2V4Y2x1c2l2ZSkgeworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19yZWxlYXNlX2Nsb3NlX2xvd19zaGFyZWRfb3V0cHV0KSB7CiAgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOworICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fcmVsZWFzZV9jbG9zZV9sb3dfc2hhcmVkX2lucHV0KSB7CisgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19yZWxlYXNlX2Nsb3NlX2xvd19leGNsdXNpdmVfb3V0cHV0KSB7CisgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fcmVsZWFzZV9jbG9zZV9sb3dfZXhjbHVzaXZlX2lucHV0KSB7CisgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKIH0KIAogZW51bSBGdW5jdGlvblRvQ2FsbCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BaWRsQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BaWRsQ29udmVyc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2ZGZjNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FpZGxDb252ZXJzaW9uLmNwcApAQCAtMCwwICsxLDIxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFpZGxDb252ZXJzaW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAibWVkaWEvQWlkbENvbnZlcnNpb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFV0aWxpdGllcworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGJhc2U6OnVuZXhwZWN0ZWQ7CisKK25hbWVzcGFjZSB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoZSBjb2RlIGJlbG93IGVzdGFibGlzaGVzOgorLy8gSW50ZWdyYWxUeXBlT2Y8VD4sIHdoaWNoIHdvcmtzIGZvciBlaXRoZXIgaW50ZWdyYWwgdHlwZXMgKGluIHdoaWNoIGNhc2UgaXQgZXZhbHVhdGVzIHRvIFQpLCBvcgorLy8gZW51bSB0eXBlcyAoaW4gd2hpY2ggY2FzZSBpdCBldmFsdWF0ZXMgdG8gc3RkOjp1bmRlcmx5aW5nX3R5cGVfVDxUPikuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX2ludGVncmFsX3Y8VD4gfHwgc3RkOjppc19lbnVtX3Y8VD4+Pgorc3RydWN0IEludGVncmFsVHlwZU9mU3RydWN0IHsKKyAgICB1c2luZyBUeXBlID0gVDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW50ZWdyYWxUeXBlT2ZTdHJ1Y3Q8VCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX2VudW1fdjxUPj4+IHsKKyAgICB1c2luZyBUeXBlID0gc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxUPjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1c2luZyBJbnRlZ3JhbFR5cGVPZiA9IHR5cGVuYW1lIEludGVncmFsVHlwZU9mU3RydWN0PFQ+OjpUeXBlOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVdGlsaXRpZXMgZm9yIGhhbmRsaW5nIGJpdG1hc2tzLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbnVtPgorRW51bSBpbmRleDJlbnVtX2luZGV4KGludCBpbmRleCkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19lbnVtX3Y8RW51bT4gfHwgc3RkOjppc19pbnRlZ3JhbF92PEVudW0+KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RW51bT4oaW5kZXgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbnVtPgorRW51bSBpbmRleDJlbnVtX2JpdG1hc2soaW50IGluZGV4KSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2VudW1fdjxFbnVtPiB8fCBzdGQ6OmlzX2ludGVncmFsX3Y8RW51bT4pOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbnVtPigxIDw8IGluZGV4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWFzaywgdHlwZW5hbWUgRW51bT4KK01hc2sgZW51bVRvTWFza19iaXRtYXNrKEVudW0gZSkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19lbnVtX3Y8RW51bT4gfHwgc3RkOjppc19pbnRlZ3JhbF92PEVudW0+KTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZW51bV92PE1hc2s+IHx8IHN0ZDo6aXNfaW50ZWdyYWxfdjxNYXNrPik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1hc2s+KGUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXNrLCB0eXBlbmFtZSBFbnVtPgorTWFzayBlbnVtVG9NYXNrX2luZGV4KEVudW0gZSkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19lbnVtX3Y8RW51bT4gfHwgc3RkOjppc19pbnRlZ3JhbF92PEVudW0+KTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZW51bV92PE1hc2s+IHx8IHN0ZDo6aXNfaW50ZWdyYWxfdjxNYXNrPik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1hc2s+KHN0YXRpY19jYXN0PHN0ZDo6bWFrZV91bnNpZ25lZF90PEludGVncmFsVHlwZU9mPE1hc2s+Pj4oMSkKKyAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oZSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0TWFzaywgdHlwZW5hbWUgU3JjTWFzaywgdHlwZW5hbWUgRGVzdEVudW0sIHR5cGVuYW1lIFNyY0VudW0+CitDb252ZXJzaW9uUmVzdWx0PERlc3RNYXNrPiBjb252ZXJ0Qml0bWFzaygKKyAgICAgICAgU3JjTWFzayBzcmMsIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Q29udmVyc2lvblJlc3VsdDxEZXN0RW51bT4oU3JjRW51bSk+JiBlbnVtQ29udmVyc2lvbiwKKyAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxTcmNFbnVtKGludCk+JiBzcmNJbmRleFRvRW51bSwKKyAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxEZXN0TWFzayhEZXN0RW51bSk+JiBkZXN0RW51bVRvTWFzaykgeworICAgIHVzaW5nIFVuc2lnbmVkRGVzdE1hc2sgPSBzdGQ6Om1ha2VfdW5zaWduZWRfdDxJbnRlZ3JhbFR5cGVPZjxEZXN0TWFzaz4+OworICAgIHVzaW5nIFVuc2lnbmVkU3JjTWFzayA9IHN0ZDo6bWFrZV91bnNpZ25lZF90PEludGVncmFsVHlwZU9mPFNyY01hc2s+PjsKKworICAgIFVuc2lnbmVkRGVzdE1hc2sgZGVzdCA9IHN0YXRpY19jYXN0PFVuc2lnbmVkRGVzdE1hc2s+KDApOworICAgIFVuc2lnbmVkU3JjTWFzayB1c3JjID0gc3RhdGljX2Nhc3Q8VW5zaWduZWRTcmNNYXNrPihzcmMpOworCisgICAgaW50IHNyY0JpdEluZGV4ID0gMDsKKyAgICB3aGlsZSAodXNyYyAhPSAwKSB7CisgICAgICAgIGlmICh1c3JjICYgMSkgeworICAgICAgICAgICAgU3JjRW51bSBzcmNFbnVtID0gc3JjSW5kZXhUb0VudW0oc3JjQml0SW5kZXgpOworICAgICAgICAgICAgRGVzdEVudW0gZGVzdEVudW0gPSBWQUxVRV9PUl9SRVRVUk4oZW51bUNvbnZlcnNpb24oc3JjRW51bSkpOworICAgICAgICAgICAgRGVzdE1hc2sgZGVzdE1hc2sgPSBkZXN0RW51bVRvTWFzayhkZXN0RW51bSk7CisgICAgICAgICAgICBkZXN0IHw9IGRlc3RNYXNrOworICAgICAgICB9CisgICAgICAgICsrc3JjQml0SW5kZXg7CisgICAgICAgIHVzcmMgPj49IDE7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXN0TWFzaz4oZGVzdCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hc2ssIHR5cGVuYW1lIEVudW0+Citib29sIGJpdG1hc2tJc1NldChNYXNrIG1hc2ssIEVudW0gaW5kZXgpIHsKKyAgICByZXR1cm4gKG1hc2sgJiBlbnVtVG9NYXNrX2luZGV4PE1hc2ssIEVudW0+KGluZGV4KSkgIT0gMDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitlbnVtIGNsYXNzIERpcmVjdGlvbiB7CisgICAgSU5QVVQsIE9VVFBVVAorfTsKKworQ29udmVyc2lvblJlc3VsdDxEaXJlY3Rpb24+IGRpcmVjdGlvbihtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNPVVJDRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6SU5QVVQ7CisgICAgICAgICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Um9sZTo6U0lOSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6T1VUUFVUOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDoKKyAgICAgICAgICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNPVVJDRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6T1VUUFVUOworICAgICAgICAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNJTks6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb246OklOUFVUOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxEaXJlY3Rpb24+IGRpcmVjdGlvbihhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX1NPVVJDRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6SU5QVVQ7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT1JUX1JPTEVfU0lOSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6T1VUUFVUOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDoKKyAgICAgICAgICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX1NPVVJDRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6T1VUUFVUOworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX1NJTks6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb246OklOUFVUOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnZlcnRlcnMKKworc3RhdHVzX3QgYWlkbDJsZWdhY3lfc3RyaW5nKHN0ZDo6c3RyaW5nX3ZpZXcgYWlkbCwgY2hhciogZGVzdCwgc2l6ZV90IG1heFNpemUpIHsKKyAgICBpZiAoYWlkbC5zaXplKCkgPiBtYXhTaXplIC0gMSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhaWRsLmNvcHkoZGVzdCwgYWlkbC5zaXplKCkpOworICAgIGRlc3RbYWlkbC5zaXplKCldID0gJ1wwJzsKKyAgICByZXR1cm4gT0s7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpzdHJpbmc+IGxlZ2FjeTJhaWRsX3N0cmluZyhjb25zdCBjaGFyKiBsZWdhY3ksIHNpemVfdCBtYXhTaXplKSB7CisgICAgaWYgKGxlZ2FjeSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGlmIChzdHJubGVuKGxlZ2FjeSwgbWF4U2l6ZSkgPT0gbWF4U2l6ZSkgeworICAgICAgICAvLyBObyBudWxsLXRlcm1pbmF0b3IuCisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnN0cmluZyhsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21vZHVsZV9oYW5kbGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19tb2R1bGVfaGFuZGxlX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9faGFuZGxlX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19pb19oYW5kbGVfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChhdWRpb19pb19oYW5kbGVfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9oYW5kbGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fcG9ydF9oYW5kbGVfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGF1ZGlvX3BvcnRfaGFuZGxlX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BhdGNoX2hhbmRsZV90KGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX2hhbmRsZV90X2ludDMyX3QoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3VuaXF1ZV9pZF90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3VuaXF1ZV9pZF90KGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fdW5pcXVlX2lkX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3VuaXF1ZV9pZF90X2ludDMyX3QoYXVkaW9fdW5pcXVlX2lkX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2h3X3N5bmNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19od19zeW5jX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19od19zeW5jX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2h3X3N5bmNfdF9pbnQzMl90KGF1ZGlvX2h3X3N5bmNfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8cGlkX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxwaWRfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChwaWRfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8dWlkX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDx1aWRfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWRfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8U3RyaW5nMTY+IGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KHN0ZDo6c3RyaW5nX3ZpZXcgYWlkbCkgeworICAgIHJldHVybiBTdHJpbmcxNihhaWRsLmRhdGEoKSwgYWlkbC5zaXplKCkpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6c3RyaW5nPiBsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcoY29uc3QgU3RyaW5nMTYmIGxlZ2FjeSkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZyhTdHJpbmc4KGxlZ2FjeSkuY19zdHIoKSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8U3RyaW5nOD4gYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nOChzdGQ6OnN0cmluZ192aWV3IGFpZGwpIHsKKyAgICByZXR1cm4gU3RyaW5nOChhaWRsLmRhdGEoKSwgYWlkbC5zaXplKCkpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6c3RyaW5nPiBsZWdhY3kyYWlkbF9TdHJpbmc4X3N0cmluZyhjb25zdCBTdHJpbmc4JiBsZWdhY3kpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcobGVnYWN5LmNfc3RyKCkpOworfQorCisvLyBUaGUgbGVnYWN5IGVudW0gaXMgdW5uYW1lZC4gVGh1cywgd2UgdXNlIGludC4KK0NvbnZlcnNpb25SZXN1bHQ8aW50PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdUeXBlKG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6U0FNUExFX1JBVEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkNIQU5ORUxfTUFTSzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0s7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkdBSU46CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6RkxBR1M6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKKy8vIFRoZSBsZWdhY3kgZW51bSBpcyB1bm5hbWVkLiBUaHVzLCB3ZSB1c2UgaW50LgorQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4gbGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnVHlwZShpbnQgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6U0FNUExFX1JBVEU7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpDSEFOTkVMX01BU0s7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGT1JNQVQ7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9DT05GSUdfR0FJTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6R0FJTjsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6RkxBR1M7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8dW5zaWduZWQgaW50PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2NvbmZpZ19tYXNrKGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazx1bnNpZ25lZCBpbnQsIGludDMyX3QsIGludCwgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU+KAorICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnVHlwZSwKKyAgICAgICAgICAgIC8vIEF1ZGlvUG9ydENvbmZpZ1R5cGUgZW51bSBpcyBpbmRleC1iYXNlZC4KKyAgICAgICAgICAgIGluZGV4MmVudW1faW5kZXg8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU+LAorICAgICAgICAgICAgLy8gQVVESU9fUE9SVF9DT05GSUdfKiBmbGFncyBhcmUgbWFzay1iYXNlZC4KKyAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazx1bnNpZ25lZCBpbnQsIGludD4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2NvbmZpZ19tYXNrX2ludDMyX3QodW5zaWduZWQgaW50IGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCB1bnNpZ25lZCBpbnQsIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlLCBpbnQ+KAorICAgICAgICAgICAgbGVnYWN5LCBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdUeXBlLAorICAgICAgICAgICAgLy8gQVVESU9fUE9SVF9DT05GSUdfKiBmbGFncyBhcmUgbWFzay1iYXNlZC4KKyAgICAgICAgICAgIGluZGV4MmVudW1fYml0bWFzazx1bnNpZ25lZD4sCisgICAgICAgICAgICAvLyBBdWRpb1BvcnRDb25maWdUeXBlIGVudW0gaXMgaW5kZXgtYmFzZWQuCisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlPik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoaW50MzJfdCBhaWRsKSB7CisgICAgLy8gVE9ETyh5dGFpKTogc2hvdWxkIHdlIGNvbnZlcnQgYml0LWJ5LWJpdD8KKyAgICAvLyBPbmUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhlIHJlcHJlc2VudGF0aW9uIGlzIGJvdGggb3BhcXVlIGFuZCBpcyBkaWZmZXJlbnQgYmFzZWQgb24gdGhlCisgICAgLy8gY29udGV4dCAoaW5wdXQgdnMuIG91dHB1dCkuIENhbiBkZXRlcm1pbmUgYmFzZWQgb24gdHlwZSBhbmQgcm9sZSwgYXMgcGVyIHVzZUluQ2hhbm5lbE1hc2soKS4KKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGF1ZGlvX2NoYW5uZWxfbWFza190PihhaWRsKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSkgeworICAgIC8vIFRPRE8oeXRhaSk6IHNob3VsZCB3ZSBjb252ZXJ0IGJpdC1ieS1iaXQ/CisgICAgLy8gT25lIHByb2JsZW0gaGVyZSBpcyB0aGF0IHRoZSByZXByZXNlbnRhdGlvbiBpcyBib3RoIG9wYXF1ZSBhbmQgaXMgZGlmZmVyZW50IGJhc2VkIG9uIHRoZQorICAgIC8vIGNvbnRleHQgKGlucHV0IHZzLiBvdXRwdXQpLiBDYW4gZGV0ZXJtaW5lIGJhc2VkIG9uIHR5cGUgYW5kIHJvbGUsIGFzIHBlciB1c2VJbkNoYW5uZWxNYXNrKCkuCisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2NvbmZpZ19ldmVudD4gYWlkbDJsZWdhY3lfQXVkaW9Jb0NvbmZpZ0V2ZW50X2F1ZGlvX2lvX2NvbmZpZ19ldmVudCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudCBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6T1VUUFVUX1JFR0lTVEVSRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6T1VUUFVUX09QRU5FRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfT1BFTkVEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6Ok9VVFBVVF9DTE9TRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0NMT1NFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpPVVRQVVRfQ09ORklHX0NIQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OklOUFVUX1JFR0lTVEVSRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfUkVHSVNURVJFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpJTlBVVF9PUEVORUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfT1BFTkVEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OklOUFVUX0NMT1NFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9DTE9TRUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6SU5QVVRfQ09ORklHX0NIQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6Q0xJRU5UX1NUQVJURUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0xJRU5UX1NUQVJURUQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50PiBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfQXVkaW9Jb0NvbmZpZ0V2ZW50KAorICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnQgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfUkVHSVNURVJFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpPVVRQVVRfUkVHSVNURVJFRDsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6Ok9VVFBVVF9PUEVORUQ7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NMT1NFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpPVVRQVVRfQ0xPU0VEOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpPVVRQVVRfQ09ORklHX0NIQU5HRUQ7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfUkVHSVNURVJFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpJTlBVVF9SRUdJU1RFUkVEOworICAgICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpJTlBVVF9PUEVORUQ7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfQ0xPU0VEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OklOUFVUX0NMT1NFRDsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpJTlBVVF9DT05GSUdfQ0hBTkdFRDsKKyAgICAgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpDTElFTlRfU1RBUlRFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfcm9sZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0Um9sZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6Ok5PTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9ST0xFX05PTkU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNPVVJDRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRSb2xlOjpTSU5LOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFJvbGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUoCisgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX05PTkU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydFJvbGU6Ok5PTkU7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX1NPVVJDRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Um9sZTo6U09VUkNFOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9TSU5LOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRSb2xlOjpTSU5LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF90eXBlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydFR5cGVfYXVkaW9fcG9ydF90eXBlX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb1BvcnRUeXBlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX1RZUEVfTk9ORTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX1RZUEVfTUlYOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpTRVNTSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfVFlQRV9TRVNTSU9OOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUoCisgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX05PTkU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok5PTkU7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfU0VTU0lPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6U0VTU0lPTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2Zvcm1hdF90PiBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdCgKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGFpZGwpIHsKKyAgICAvLyBUaGlzIHJlbGllcyBvbiBBdWRpb0Zvcm1hdCBiZWluZyBrZXB0IGluIHN5bmMgd2l0aCBhdWRpb19mb3JtYXRfdC4KKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQpID09IHNpemVvZihhdWRpb19mb3JtYXRfdCkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdCgKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbGVnYWN5KSB7CisgICAgLy8gVGhpcyByZWxpZXMgb24gQXVkaW9Gb3JtYXQgYmVpbmcga2VwdCBpbiBzeW5jIHdpdGggYXVkaW9fZm9ybWF0X3QuCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KSA9PSBzaXplb2YoYXVkaW9fZm9ybWF0X3QpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Nb2RlX2F1ZGlvX2dhaW5fbW9kZV90KG1lZGlhOjpBdWRpb0dhaW5Nb2RlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9HYWluTW9kZTo6Sk9JTlQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fR0FJTl9NT0RFX0pPSU5UOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpDSEFOTkVMUzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19HQUlOX01PREVfQ0hBTk5FTFM7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OlJBTVA6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fR0FJTl9NT0RFX1JBTVA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluTW9kZT4gbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfQXVkaW9HYWluTW9kZShhdWRpb19nYWluX21vZGVfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX0dBSU5fTU9ERV9KT0lOVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9HYWluTW9kZTo6Sk9JTlQ7CisgICAgICAgIGNhc2UgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpDSEFOTkVMUzsKKyAgICAgICAgY2FzZSBBVURJT19HQUlOX01PREVfUkFNUDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9HYWluTW9kZTo6UkFNUDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGF1ZGlvX2dhaW5fbW9kZV90LCBpbnQzMl90LCBhdWRpb19nYWluX21vZGVfdCwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU+KAorICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9HYWluTW9kZV9hdWRpb19nYWluX21vZGVfdCwKKyAgICAgICAgICAgIC8vIEF1ZGlvR2Fpbk1vZGUgaXMgaW5kZXgtYmFzZWQuCisgICAgICAgICAgICBpbmRleDJlbnVtX2luZGV4PG1lZGlhOjpBdWRpb0dhaW5Nb2RlPiwKKyAgICAgICAgICAgIC8vIEFVRElPX0dBSU5fTU9ERV8qIGNvbnN0YW50cyBhcmUgbWFzay1iYXNlZC4KKyAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazxhdWRpb19nYWluX21vZGVfdCwgYXVkaW9fZ2Fpbl9tb2RlX3Q+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9tYXNrX2ludDMyX3QoYXVkaW9fZ2Fpbl9tb2RlX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIGF1ZGlvX2dhaW5fbW9kZV90LCBtZWRpYTo6QXVkaW9HYWluTW9kZSwgYXVkaW9fZ2Fpbl9tb2RlX3Q+KAorICAgICAgICAgICAgbGVnYWN5LCBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlLAorICAgICAgICAgICAgLy8gQVVESU9fR0FJTl9NT0RFXyogY29uc3RhbnRzIGFyZSBtYXNrLWJhc2VkLgorICAgICAgICAgICAgaW5kZXgyZW51bV9iaXRtYXNrPGF1ZGlvX2dhaW5fbW9kZV90PiwKKyAgICAgICAgICAgIC8vIEF1ZGlvR2Fpbk1vZGUgaXMgaW5kZXgtYmFzZWQuCisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIG1lZGlhOjpBdWRpb0dhaW5Nb2RlPik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGV2aWNlc190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChpbnQzMl90IGFpZGwpIHsKKyAgICAvLyBUT0RPKHl0YWkpOiBiaXRmaWVsZD8KKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGF1ZGlvX2RldmljZXNfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoYXVkaW9fZGV2aWNlc190IGxlZ2FjeSkgeworICAgIC8vIFRPRE8oeXRhaSk6IGJpdGZpZWxkPworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX2NvbmZpZz4gYWlkbDJsZWdhY3lfQXVkaW9HYWluQ29uZmlnX2F1ZGlvX2dhaW5fY29uZmlnKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9HYWluQ29uZmlnJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKSB7CisgICAgYXVkaW9fZ2Fpbl9jb25maWcgbGVnYWN5OworICAgIGxlZ2FjeS5pbmRleCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50PihhaWRsLmluZGV4KSk7CisgICAgbGVnYWN5Lm1vZGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKGFpZGwubW9kZSkpOworICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPQorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24ocm9sZSwgdHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7CisgICAgY29uc3QgYm9vbCBpc0pvaW50ID0gYml0bWFza0lzU2V0KGFpZGwubW9kZSwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkpPSU5UKTsKKyAgICBzaXplX3QgbnVtVmFsdWVzID0gaXNKb2ludCA/IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzSW5wdXQgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhsZWdhY3kuY2hhbm5lbF9tYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhsZWdhY3kuY2hhbm5lbF9tYXNrKTsKKyAgICBpZiAoYWlkbC52YWx1ZXMuc2l6ZSgpICE9IG51bVZhbHVlcyB8fCBhaWRsLnZhbHVlcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LnZhbHVlcykpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICBsZWdhY3kudmFsdWVzW2ldID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGFpZGwudmFsdWVzW2ldKSk7CisgICAgfQorICAgIGxlZ2FjeS5yYW1wX2R1cmF0aW9uX21zID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGFpZGwucmFtcER1cmF0aW9uTXMpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Db25maWc+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZygKKyAgICAgICAgY29uc3QgYXVkaW9fZ2Fpbl9jb25maWcmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgeworICAgIG1lZGlhOjpBdWRpb0dhaW5Db25maWcgYWlkbDsKKyAgICBhaWRsLmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuaW5kZXgpKTsKKyAgICBhaWRsLm1vZGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfbWFza19pbnQzMl90KGxlZ2FjeS5tb2RlKSk7CisgICAgYWlkbC5jaGFubmVsTWFzayA9CisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihyb2xlLCB0eXBlKSkgPT0gRGlyZWN0aW9uOjpJTlBVVDsKKyAgICBjb25zdCBib29sIGlzSm9pbnQgPSAobGVnYWN5Lm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpICE9IDA7CisgICAgc2l6ZV90IG51bVZhbHVlcyA9IGlzSm9pbnQgPyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0lucHV0ID8gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobGVnYWN5LmNoYW5uZWxfbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobGVnYWN5LmNoYW5uZWxfbWFzayk7CisgICAgYWlkbC52YWx1ZXMucmVzaXplKG51bVZhbHVlcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICBhaWRsLnZhbHVlc1tpXSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnZhbHVlc1tpXSkpOworICAgIH0KKyAgICBhaWRsLnJhbXBEdXJhdGlvbk1zID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kucmFtcF9kdXJhdGlvbl9tcykpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvSW5wdXRGbGFnc19hdWRpb19pbnB1dF9mbGFnc190KAorICAgICAgICBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpGQVNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfRkFTVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpIV19IT1RXT1JEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpSQVc6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19SQVc7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6U1lOQzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX1NZTkM7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6TU1BUF9OT0lSUToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlE7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6Vk9JUF9UWDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFg7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfQVZfU1lOQzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9BdWRpb0lucHV0RmxhZ3MoCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0ZBU1Q6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RkFTVDsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfSE9UV09SRDsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX1JBVzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpSQVc7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19TWU5DOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlNZTkM7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJROgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6Ok1NQVBfTk9JUlE7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlZPSVBfVFg7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkhXX0FWX1NZTkM7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1Q6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RElSRUNUOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UFJJTUFSWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpGQVNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0ZBU1Q7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRFRVBfQlVGRkVSOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpDT01QUkVTU19PRkZMT0FEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok5PTl9CTE9DS0lORzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkc7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkhXX0FWX1NZTkM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6VFRTOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1RUUzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UkFXOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1JBVzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6U1lOQzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19TWU5DOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU86CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpESVJFQ1RfUENNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ007CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok1NQVBfTk9JUlE6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Vk9JUF9SWDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJTkNBTExfTVVTSUM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X0F1ZGlvT3V0cHV0RmxhZ3MoCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpESVJFQ1Q7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UFJJTUFSWTsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19GQVNUOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpGQVNUOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpERUVQX0JVRkZFUjsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpDT01QUkVTU19PRkZMT0FEOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Tk9OX0JMT0NLSU5HOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkhXX0FWX1NZTkM7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfVFRTOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpUVFM7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfUkFXOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpSQVc7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfU1lOQzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6U1lOQzsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19JRUM5NThfTk9OQVVESU86CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OklFQzk1OF9OT05BVURJTzsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1RfUENNOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpESVJFQ1RfUENNOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlE6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok1NQVBfTk9JUlE7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Vk9JUF9SWDsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OklOQ0FMTF9NVVNJQzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X2F1ZGlvX2lucHV0X2ZsYWdzX21hc2soaW50MzJfdCBhaWRsKSB7CisgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD47CisKKyAgICBMZWdhY3lNYXNrIGNvbnZlcnRlZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIChjb252ZXJ0Qml0bWFzazxMZWdhY3lNYXNrLCBpbnQzMl90LCBhdWRpb19pbnB1dF9mbGFnc190LCBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzPigKKyAgICAgICAgICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9JbnB1dEZsYWdzX2F1ZGlvX2lucHV0X2ZsYWdzX3QsCisgICAgICAgICAgICAgICAgICAgIGluZGV4MmVudW1faW5kZXg8bWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4sCisgICAgICAgICAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazxMZWdhY3lNYXNrLCBhdWRpb19pbnB1dF9mbGFnc190PikpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oY29udmVydGVkKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc19tYXNrKGF1ZGlvX2lucHV0X2ZsYWdzX3QgbGVnYWN5KSB7CisgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD47CisKKyAgICBMZWdhY3lNYXNrIGxlZ2FjeU1hc2sgPSBzdGF0aWNfY2FzdDxMZWdhY3lNYXNrPihsZWdhY3kpOworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBMZWdhY3lNYXNrLCBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzLCBhdWRpb19pbnB1dF9mbGFnc190PigKKyAgICAgICAgICAgIGxlZ2FjeU1hc2ssIGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzLAorICAgICAgICAgICAgaW5kZXgyZW51bV9iaXRtYXNrPGF1ZGlvX2lucHV0X2ZsYWdzX3Q+LAorICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzPik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X2F1ZGlvX291dHB1dF9mbGFnc19tYXNrKGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxhdWRpb19vdXRwdXRfZmxhZ3NfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzPigKKyAgICAgICAgICAgIGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QsCisgICAgICAgICAgICBpbmRleDJlbnVtX2luZGV4PG1lZGlhOjpBdWRpb091dHB1dEZsYWdzPiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazxhdWRpb19vdXRwdXRfZmxhZ3NfdCwgYXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfbWFzayhhdWRpb19vdXRwdXRfZmxhZ3NfdCBsZWdhY3kpIHsKKyAgICB1c2luZyBMZWdhY3lNYXNrID0gc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD47CisKKyAgICBMZWdhY3lNYXNrIGxlZ2FjeU1hc2sgPSBzdGF0aWNfY2FzdDxMZWdhY3lNYXNrPihsZWdhY3kpOworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBMZWdhY3lNYXNrLCBtZWRpYTo6QXVkaW9PdXRwdXRGbGFncywgYXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgbGVnYWN5TWFzaywgbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncywKKyAgICAgICAgICAgIGluZGV4MmVudW1fYml0bWFzazxhdWRpb19vdXRwdXRfZmxhZ3NfdD4sCisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzPik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fZmxhZ3M+IGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncygKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvSW9GbGFncyYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSkgeworICAgIGF1ZGlvX2lvX2ZsYWdzIGxlZ2FjeTsKKyAgICBEaXJlY3Rpb24gZGlyID0gVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihyb2xlLCB0eXBlKSk7CisgICAgc3dpdGNoIChkaXIpIHsKKyAgICAgICAgY2FzZSBEaXJlY3Rpb246OklOUFVUOiB7CisgICAgICAgICAgICBsZWdhY3kuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2F1ZGlvX2lucHV0X2ZsYWdzX21hc2soVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBpbnB1dCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRGlyZWN0aW9uOjpPVVRQVVQ6IHsKKyAgICAgICAgICAgIGxlZ2FjeS5vdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2F1ZGlvX291dHB1dF9mbGFnc19tYXNrKFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgb3V0cHV0KSkpKTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0ZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MoCisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2ZsYWdzJiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUpIHsKKyAgICBtZWRpYTo6QXVkaW9Jb0ZsYWdzIGFpZGw7CisKKyAgICBEaXJlY3Rpb24gZGlyID0gVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihyb2xlLCB0eXBlKSk7CisgICAgc3dpdGNoIChkaXIpIHsKKyAgICAgICAgY2FzZSBEaXJlY3Rpb246OklOUFVUOgorICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc19tYXNrKGxlZ2FjeS5pbnB1dCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERpcmVjdGlvbjo6T1VUUFVUOgorICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX21hc2sobGVnYWN5Lm91dHB1dCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQmIGFpZGwpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0IGxlZ2FjeTsKKyAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGwuaHdNb2R1bGUpKTsKKyAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChhaWRsLnR5cGUpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwuYWRkcmVzcywgbGVnYWN5LmFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCBhaWRsOworICAgIGFpZGwuaHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOworICAgIGFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChsZWdhY3kudHlwZSkpOworICAgIGFpZGwuYWRkcmVzcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kuYWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpERUZBVUxUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlZPSUNFX0NBTEw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6U1lTVEVNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UklORzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpNVVNJQzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QUxBUk06CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok5PVElGSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkJMVUVUT09USF9TQ086CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpEVE1GOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlRUUzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVFRTOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFDQ0VTU0lCSUxJVFk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QVNTSVNUQU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BU1NJU1RBTlQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UkVST1VUSU5HOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SRVJPVVRJTkc7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UEFUQ0g6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1BBVENIOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkNBTExfQVNTSVNUQU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9DQUxMX0FTU0lTVEFOVDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0RFRkFVTFQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6REVGQVVMVDsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpWT0lDRV9DQUxMOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6U1lTVEVNOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlJJTkc7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok1VU0lDOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpBTEFSTTsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok5PVElGSUNBVElPTjsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpCTFVFVE9PVEhfU0NPOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkVORk9SQ0VEX0FVRElCTEU7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RFRNRjsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlRUUzsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpBQ0NFU1NJQklMSVRZOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BU1NJU1RBTlQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QVNTSVNUQU5UOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9SRVJPVVRJTkc6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UkVST1VUSU5HOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9QQVRDSDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpQQVRDSDsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Q0FMTF9BU1NJU1RBTlQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zb3VyY2VfdD4gYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpJTlZBTElEOgorICAgICAgICAgICAgLy8gVGhpcyB2YWx1ZSBkb2VzIG5vdCBoYXZlIGFuIGVudW0KKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfSU5WQUxJRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpERUZBVUxUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9ERUZBVUxUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6Ok1JQzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfTUlDOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1VQTElOSzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX0RPV05MSU5LOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9DQUxMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkNBTUNPUkRFUjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1JFQ09HTklUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlJFTU9URV9TVUJNSVg6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6VU5QUk9DRVNTRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1BFUkZPUk1BTkNFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpFQ0hPX1JFRkVSRU5DRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Rk1fVFVORVI6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0ZNX1RVTkVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkhPVFdPUkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0hPVFdPUkQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0lOVkFMSUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6SU5WQUxJRDsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpERUZBVUxUOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6TUlDOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfVVBMSU5LOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9ET1dOTElOSzsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9DQUxMOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Q0FNQ09SREVSOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlJFTU9URV9TVUJNSVg7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlVOUFJPQ0VTU0VEOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9QRVJGT1JNQU5DRTsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6RUNIT19SRUZFUkVOQ0U7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkZNX1RVTkVSOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkhPVFdPUkQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zZXNzaW9uX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fc2Vzc2lvbl90PihhaWRsKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChhdWRpb19zZXNzaW9uX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCisvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCit1c2luZyBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0X3VzZWNhc2UgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0Ojp1c2VjYXNlKTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0X3VzZWNhc2U+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKSB7CisgICAgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dF91c2VjYXNlIGxlZ2FjeTsKKworICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRSb2xlOjpOT05FOgorICAgICAgICAgICAgLy8gSnVzdCB2ZXJpZnkgdGhhdCB0aGUgdW5pb24gaXMgZW1wdHkuCisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIHVuc3BlY2lmaWVkKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRSb2xlOjpTT1VSQ0U6CisgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJ1Zy4gQSBTT1VSQ0Ugcm9sZSBjb3JyZXNwb25kcyB0byB0aGUgc3RyZWFtIGZpZWxkLgorICAgICAgICAgICAgbGVnYWN5LnN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdCgKKyAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBzdHJlYW0pKSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Um9sZTo6U0lOSzoKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgYnVnLiBBIFNJTksgcm9sZSBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIGZpZWxkLgorICAgICAgICAgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgc291cmNlKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsKKyAgICB9CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZT4gbGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dF91c2VjYXNlJiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSBhaWRsOworCisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX05PTkU6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U6CisgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJ1Zy4gQSBTT1VSQ0Ugcm9sZSBjb3JyZXNwb25kcyB0byB0aGUgc3RyZWFtIGZpZWxkLgorICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIHN0cmVhbSwgVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShsZWdhY3kuc3RyZWFtKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX1NJTks6CisgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJ1Zy4gQSBTSU5LIHJvbGUgY29ycmVzcG9uZHMgdG8gdGhlIHNvdXJjZSBmaWVsZC4KKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShsZWdhY3kuc291cmNlKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsKKyAgICB9CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0KAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKSB7CisgICAgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dCBsZWdhY3k7CisgICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7CisgICAgbGVnYWN5LmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGwuaGFuZGxlKSk7CisgICAgbGVnYWN5LnVzZWNhc2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZShhaWRsLnVzZWNhc2UsIHJvbGUpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ01peEV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dCBhaWRsOworICAgIGFpZGwuaHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOworICAgIGFpZGwuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOworICAgIGFpZGwudXNlY2FzZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlKGxlZ2FjeS51c2VjYXNlLCByb2xlKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0JiBhaWRsKSB7CisgICAgYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQgbGVnYWN5OworICAgIGxlZ2FjeS5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGFpZGwuc2Vzc2lvbikpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCBhaWRsOworICAgIGFpZGwuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChsZWdhY3kuc2Vzc2lvbikpOworICAgIHJldHVybiBhaWRsOworfQorCisvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCit1c2luZyBhdWRpb19wb3J0X2NvbmZpZ19leHQgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZzo6ZXh0KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0V4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0V4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSwKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSkgeworICAgIGF1ZGlvX3BvcnRfY29uZmlnX2V4dCBsZWdhY3k7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok5PTkU6CisgICAgICAgICAgICAvLyBKdXN0IHZlcmlmeSB0aGF0IHRoZSB1bmlvbiBpcyBlbXB0eS4KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgdW5zcGVjaWZpZWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpERVZJQ0U6CisgICAgICAgICAgICBsZWdhY3kuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQoVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBkZXZpY2UpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDoKKyAgICAgICAgICAgIGxlZ2FjeS5taXggPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dChWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG1peCkpLCByb2xlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6U0VTU0lPTjoKKyAgICAgICAgICAgIGxlZ2FjeS5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgc2Vzc2lvbikpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlNob3VsZG4ndCBnZXQgaGVyZSIpOworICAgIH0KKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ0V4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZXh0JiBsZWdhY3ksIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRXh0IGFpZGw7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTk9ORToKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRToKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dChsZWdhY3kuZGV2aWNlKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDoKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBtaXgsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ01peEV4dChsZWdhY3kubWl4LCByb2xlKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX1NFU1NJT046CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dChsZWdhY3kuc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7CisgICAgfQorICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIGFpZGwpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBsZWdhY3k7CisgICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLmlkKSk7CisgICAgbGVnYWN5LnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChhaWRsLnJvbGUpKTsKKyAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwudHlwZSkpOworICAgIGxlZ2FjeS5jb25maWdfbWFzayA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2NvbmZpZ19tYXNrKGFpZGwuY29uZmlnTWFzaykpOworICAgIGlmIChiaXRtYXNrSXNTZXQoYWlkbC5jb25maWdNYXNrLCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6U0FNUExFX1JBVEUpKSB7CisgICAgICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihhaWRsLnNhbXBsZVJhdGUpKTsKKyAgICB9CisgICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpDSEFOTkVMX01BU0spKSB7CisgICAgICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPQorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKKyAgICB9CisgICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGT1JNQVQpKSB7CisgICAgICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICB9CisgICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpHQUlOKSkgeworICAgICAgICBsZWdhY3kuZ2FpbiA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Db25maWdfYXVkaW9fZ2Fpbl9jb25maWcoYWlkbC5nYWluLCBhaWRsLnJvbGUsIGFpZGwudHlwZSkpOworICAgIH0KKyAgICBpZiAoYml0bWFza0lzU2V0KGFpZGwuY29uZmlnTWFzaywgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZMQUdTKSkgeworICAgICAgICBsZWdhY3kuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKGFpZGwuZmxhZ3MsIGFpZGwucm9sZSwgYWlkbC50eXBlKSk7CisgICAgfQorICAgIGxlZ2FjeS5leHQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnRXh0KGFpZGwuZXh0LCBhaWRsLnR5cGUsIGFpZGwucm9sZSkpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZz4gbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyBhaWRsOworICAgIGFpZGwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5pZCkpOworICAgIGFpZGwucm9sZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKGxlZ2FjeS5yb2xlKSk7CisgICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLmNvbmZpZ01hc2sgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfY29uZmlnX21hc2tfaW50MzJfdChsZWdhY3kuY29uZmlnX21hc2spKTsKKyAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICB9CisgICAgaWYgKGxlZ2FjeS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBhaWRsLmNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgfQorICAgIGlmIChsZWdhY3kuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgIH0KKyAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICBhaWRsLmdhaW4gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9jb25maWdfQXVkaW9HYWluQ29uZmlnKAorICAgICAgICAgICAgICAgIGxlZ2FjeS5nYWluLCBsZWdhY3kucm9sZSwgbGVnYWN5LnR5cGUpKTsKKyAgICB9CisgICAgaWYgKGxlZ2FjeS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgIGFpZGwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKGxlZ2FjeS5mbGFncywgbGVnYWN5LnJvbGUsIGxlZ2FjeS50eXBlKSk7CisgICAgfQorICAgIGFpZGwuZXh0ID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdFeHQobGVnYWN5LmV4dCwgbGVnYWN5LnR5cGUsIGxlZ2FjeS5yb2xlKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RydWN0IGF1ZGlvX3BhdGNoPiBhaWRsMmxlZ2FjeV9BdWRpb1BhdGNoX2F1ZGlvX3BhdGNoKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9QYXRjaCYgYWlkbCkgeworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBsZWdhY3k7CisgICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcGF0Y2hfaGFuZGxlX3QoYWlkbC5pZCkpOworICAgIGxlZ2FjeS5udW1fc2lua3MgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5zaW5rcy5zaXplKCkpKTsKKyAgICBpZiAobGVnYWN5Lm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlZ2FjeS5udW1fc2lua3M7ICsraSkgeworICAgICAgICBsZWdhY3kuc2lua3NbaV0gPQorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoYWlkbC5zaW5rc1tpXSkpOworICAgIH0KKyAgICBsZWdhY3kubnVtX3NvdXJjZXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5zb3VyY2VzLnNpemUoKSkpOworICAgIGlmIChsZWdhY3kubnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZWdhY3kubnVtX3NvdXJjZXM7ICsraSkgeworICAgICAgICBsZWdhY3kuc291cmNlc1tpXSA9CisgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ19hdWRpb19wb3J0X2NvbmZpZyhhaWRsLnNvdXJjZXNbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9QYXRjaD4gbGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfQXVkaW9QYXRjaCgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9QYXRjaCBhaWRsOworICAgIGFpZGwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKKworICAgIGlmIChsZWdhY3kubnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVnYWN5Lm51bV9zaW5rczsgKytpKSB7CisgICAgICAgIGFpZGwuc2lua3MucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19BdWRpb1BvcnRDb25maWcobGVnYWN5LnNpbmtzW2ldKSkpOworICAgIH0KKyAgICBpZiAobGVnYWN5Lm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVnYWN5Lm51bV9zb3VyY2VzOyArK2kpIHsKKyAgICAgICAgYWlkbC5zb3VyY2VzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfQXVkaW9Qb3J0Q29uZmlnKGxlZ2FjeS5zb3VyY2VzW2ldKSkpOworICAgIH0KKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0lvRGVzY3JpcHRvcj4+IGFpZGwybGVnYWN5X0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIGFpZGwpIHsKKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5KG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpKTsKKyAgICBsZWdhY3ktPm1Jb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGwuaW9IYW5kbGUpKTsKKyAgICBsZWdhY3ktPm1QYXRjaCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BhdGNoX2F1ZGlvX3BhdGNoKGFpZGwucGF0Y2gpKTsKKyAgICBsZWdhY3ktPm1TYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnNhbXBsaW5nUmF0ZSkpOworICAgIGxlZ2FjeS0+bUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChhaWRsLmZvcm1hdCkpOworICAgIGxlZ2FjeS0+bUNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKKyAgICBsZWdhY3ktPm1GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuZnJhbWVDb3VudCkpOworICAgIGxlZ2FjeS0+bUZyYW1lQ291bnRIQUwgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50SEFMKSk7CisgICAgbGVnYWN5LT5tTGF0ZW5jeSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwubGF0ZW5jeSkpOworICAgIGxlZ2FjeS0+bVBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5wb3J0SWQpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5MmFpZGxfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yIGFpZGw7CisgICAgYWlkbC5pb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+bUlvSGFuZGxlKSk7CisgICAgYWlkbC5wYXRjaCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9BdWRpb1BhdGNoKGxlZ2FjeS0+bVBhdGNoKSk7CisgICAgYWlkbC5zYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+bVNhbXBsaW5nUmF0ZSkpOworICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS0+bUZvcm1hdCkpOworICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS0+bUNoYW5uZWxNYXNrKSk7CisgICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPm1GcmFtZUNvdW50KSk7CisgICAgYWlkbC5mcmFtZUNvdW50SEFMID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPm1GcmFtZUNvdW50SEFMKSk7CisgICAgYWlkbC5sYXRlbmN5ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3ktPm1MYXRlbmN5KSk7CisgICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+bVBvcnRJZCkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ2xpZW50PiBhaWRsMmxlZ2FjeV9BdWRpb0NsaWVudChjb25zdCBtZWRpYTo6QXVkaW9DbGllbnQmIGFpZGwpIHsKKyAgICBBdWRpb0NsaWVudCBsZWdhY3k7CisgICAgbGVnYWN5LmNsaWVudFVpZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGFpZGwuY2xpZW50VWlkKSk7CisgICAgbGVnYWN5LmNsaWVudFBpZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGFpZGwuY2xpZW50UGlkKSk7CisgICAgbGVnYWN5LmNsaWVudFRpZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGFpZGwuY2xpZW50VGlkKSk7CisgICAgbGVnYWN5LnBhY2thZ2VOYW1lID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KGFpZGwucGFja2FnZU5hbWUpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NsaWVudD4gbGVnYWN5MmFpZGxfQXVkaW9DbGllbnQoY29uc3QgQXVkaW9DbGllbnQmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb0NsaWVudCBhaWRsOworICAgIGFpZGwuY2xpZW50VWlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QobGVnYWN5LmNsaWVudFVpZCkpOworICAgIGFpZGwuY2xpZW50UGlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QobGVnYWN5LmNsaWVudFBpZCkpOworICAgIGFpZGwuY2xpZW50VGlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QobGVnYWN5LmNsaWVudFRpZCkpOworICAgIGFpZGwucGFja2FnZU5hbWUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfU3RyaW5nMTZfc3RyaW5nKGxlZ2FjeS5wYWNrYWdlTmFtZSkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbnRlbnRfdHlwZV90PgorYWlkbDJsZWdhY3lfQXVkaW9Db250ZW50VHlwZV9hdWRpb19jb250ZW50X3R5cGVfdChtZWRpYTo6QXVkaW9Db250ZW50VHlwZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV047CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlNQRUVDSDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpNVVNJQzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6Ok1PVklFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6U09OSUZJQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29udGVudFR5cGU+CitsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGF1ZGlvX2NvbnRlbnRfdHlwZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlVOS05PV047CisgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6U1BFRUNIOworICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6TVVTSUM7CisgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX01PVklFOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpNT1ZJRTsKKyAgICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpTT05JRklDQVRJT047CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXNhZ2VfdD4KK2FpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChtZWRpYTo6QXVkaW9Vc2FnZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVU5LTk9XTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6TUVESUE6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTUVESUE7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QUxBUk06CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQUxBUk07CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT047CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT047CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkdBTUU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfR0FNRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6VklSVFVBTF9TT1VSQ0U6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0U7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BU1NJU1RBTlQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkNBTExfQVNTSVNUQU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5UOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpFTUVSR0VOQ1k6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfRU1FUkdFTkNZOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpTQUZFVFk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfU0FGRVRZOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpWRUhJQ0xFX1NUQVRVUzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9WRUhJQ0xFX1NUQVRVUzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QU5OT1VOQ0VNRU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FOTk9VTkNFTUVOVDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Vc2FnZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZShhdWRpb191c2FnZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6VU5LTk9XTjsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6TUVESUE7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QUxBUk07CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT047CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9FVkVOVDsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9TT05JRklDQVRJT047CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6R0FNRTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6VklSVFVBTF9TT1VSQ0U7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTlQ7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkNBTExfQVNTSVNUQU5UOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0VNRVJHRU5DWToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6RU1FUkdFTkNZOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1NBRkVUWToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6U0FGRVRZOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZFSElDTEVfU1RBVFVTOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpWRUhJQ0xFX1NUQVRVUzsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BTk5PVU5DRU1FTlQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFOTk9VTkNFTUVOVDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19mbGFnc19tYXNrX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0ZsYWdfYXVkaW9fZmxhZ3NfbWFza190KG1lZGlhOjpBdWRpb0ZsYWcgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkFVRElCSUxJVFlfRU5GT1JDRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OlNFQ1VSRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX1NFQ1VSRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpTQ086CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19TQ087CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRmxhZzo6QkVBQ09OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQkVBQ09OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkhXX0FWX1NZTkM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19IV19BVl9TWU5DOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkhXX0hPVFdPUkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19IV19IT1RXT1JEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkJZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1k7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRmxhZzo6QllQQVNTX01VVEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19CWVBBU1NfTVVURTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpMT1dfTEFURU5DWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX0xPV19MQVRFTkNZOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkRFRVBfQlVGRkVSOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRmxhZzo6Tk9fTUVESUFfUFJPSkVDVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT047CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRmxhZzo6TVVURV9IQVBUSUM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19NVVRFX0hBUFRJQzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpOT19TWVNURU1fQ0FQVFVSRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkNBUFRVUkVfUFJJVkFURToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURTsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9GbGFnPgorbGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X0F1ZGlvRmxhZyhhdWRpb19mbGFnc19tYXNrX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX05PTkU6CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpBVURJQklMSVRZX0VORk9SQ0VEOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfU0VDVVJFOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6OlNFQ1VSRTsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX1NDTzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpTQ087CisgICAgICAgIGNhc2UgQVVESU9fRkxBR19CRUFDT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6QkVBQ09OOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfSFdfQVZfU1lOQzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpIV19BVl9TWU5DOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfSFdfSE9UV09SRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpIV19IT1RXT1JEOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1k6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6QllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1k7CisgICAgICAgIGNhc2UgQVVESU9fRkxBR19CWVBBU1NfTVVURToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpCWVBBU1NfTVVURTsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0xPV19MQVRFTkNZOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6OkxPV19MQVRFTkNZOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfREVFUF9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6REVFUF9CVUZGRVI7CisgICAgICAgIGNhc2UgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6Ok5PX01FRElBX1BST0pFQ1RJT047CisgICAgICAgIGNhc2UgQVVESU9fRkxBR19NVVRFX0hBUFRJQzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpNVVRFX0hBUFRJQzsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6Ok5PX1NZU1RFTV9DQVBUVVJFOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6OkNBUFRVUkVfUFJJVkFURTsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19mbGFnc19tYXNrX3Q+CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2ZsYWdzX21hc2tfdF9tYXNrKGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxhdWRpb19mbGFnc19tYXNrX3QsIGludDMyX3QsIGF1ZGlvX2ZsYWdzX21hc2tfdCwgbWVkaWE6OkF1ZGlvRmxhZz4oCisgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0ZsYWdfYXVkaW9fZmxhZ3NfbWFza190LCBpbmRleDJlbnVtX2luZGV4PG1lZGlhOjpBdWRpb0ZsYWc+LAorICAgICAgICAgICAgZW51bVRvTWFza19iaXRtYXNrPGF1ZGlvX2ZsYWdzX21hc2tfdCwgYXVkaW9fZmxhZ3NfbWFza190Pik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2ZsYWdzX21hc2tfdF9pbnQzMl90X21hc2soYXVkaW9fZmxhZ3NfbWFza190IGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBhdWRpb19mbGFnc19tYXNrX3QsIG1lZGlhOjpBdWRpb0ZsYWcsIGF1ZGlvX2ZsYWdzX21hc2tfdD4oCisgICAgICAgICAgICBsZWdhY3ksIGxlZ2FjeTJhaWRsX2F1ZGlvX2ZsYWdzX21hc2tfdF9BdWRpb0ZsYWcsCisgICAgICAgICAgICBpbmRleDJlbnVtX2JpdG1hc2s8YXVkaW9fZmxhZ3NfbWFza190PiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRmxhZz4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2F0dHJpYnV0ZXNfdD4KK2FpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGFpZGwpIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgbGVnYWN5OworICAgIGxlZ2FjeS5jb250ZW50X3R5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbnRlbnRUeXBlX2F1ZGlvX2NvbnRlbnRfdHlwZV90KGFpZGwuY29udGVudFR5cGUpKTsKKyAgICBsZWdhY3kudXNhZ2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Vc2FnZV9hdWRpb191c2FnZV90KGFpZGwudXNhZ2UpKTsKKyAgICBsZWdhY3kuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhaWRsLnNvdXJjZSkpOworICAgIGxlZ2FjeS5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2ZsYWdzX21hc2tfdF9tYXNrKGFpZGwuZmxhZ3MpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwudGFncywgbGVnYWN5LnRhZ3MsIHNpemVvZihsZWdhY3kudGFncykpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhaWRsOworICAgIGFpZGwuY29udGVudFR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGxlZ2FjeS5jb250ZW50X3R5cGUpKTsKKyAgICBhaWRsLnVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZShsZWdhY3kudXNhZ2UpKTsKKyAgICBhaWRsLnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUobGVnYWN5LnNvdXJjZSkpOworICAgIGFpZGwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X2ludDMyX3RfbWFzayhsZWdhY3kuZmxhZ3MpKTsKKyAgICBhaWRsLnRhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS50YWdzLCBzaXplb2YobGVnYWN5LnRhZ3MpKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90KG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfTk9ORTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6RUxFTUVOVEFSWV9TVFJFQU06CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0VMRU1FTlRBUllfU1RSRUFNOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpIQU5ETEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0hBTkRMRTsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUoYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfTk9ORToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6Tk9ORTsKKyAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfRUxFTUVOVEFSWV9TVFJFQU06CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkVMRU1FTlRBUllfU1RSRUFNOworICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9IQU5ETEU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkhBTkRMRTsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19vZmZsb2FkX2luZm9fdD4KK2FpZGwybGVnYWN5X0F1ZGlvT2ZmbG9hZEluZm9fYXVkaW9fb2ZmbG9hZF9pbmZvX3QoY29uc3QgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8mIGFpZGwpIHsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBsZWdhY3k7CisgICAgbGVnYWN5LnZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQxNl90PihhaWRsLnZlcnNpb24pKTsKKyAgICBsZWdhY3kuc2l6ZSA9IHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCk7CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLmNvbmZpZykpOworICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICBsZWdhY3kuZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICBsZWdhY3kuc3RyZWFtX3R5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChhaWRsLnN0cmVhbVR5cGUpKTsKKyAgICBsZWdhY3kuYml0X3JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLmJpdFJhdGUpKTsKKyAgICBsZWdhY3kuZHVyYXRpb25fdXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGFpZGwuZHVyYXRpb25VcykpOworICAgIGxlZ2FjeS5oYXNfdmlkZW8gPSBhaWRsLmhhc1ZpZGVvOworICAgIGxlZ2FjeS5pc19zdHJlYW1pbmcgPSBhaWRsLmlzU3RyZWFtaW5nOworICAgIGxlZ2FjeS5iaXRfd2lkdGggPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLmJpdFdpZHRoKSk7CisgICAgbGVnYWN5Lm9mZmxvYWRfYnVmZmVyX3NpemUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLm9mZmxvYWRCdWZmZXJTaXplKSk7CisgICAgbGVnYWN5LnVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChhaWRsLnVzYWdlKSk7CisgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fbW9kZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QoYWlkbC5lbmNhcHN1bGF0aW9uTW9kZSkpOworICAgIGxlZ2FjeS5jb250ZW50X2lkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihhaWRsLmNvbnRlbnRJZCkpOworICAgIGxlZ2FjeS5zeW5jX2lkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihhaWRsLnN5bmNJZCkpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8+CitsZWdhY3kyYWlkbF9hdWRpb19vZmZsb2FkX2luZm9fdF9BdWRpb09mZmxvYWRJbmZvKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyBhaWRsOworICAgIC8vIFZlcnNpb24gMC4xIGZpZWxkcy4KKyAgICBpZiAobGVnYWN5LnNpemUgPCBvZmZzZXRvZihhdWRpb19vZmZsb2FkX2luZm9fdCwgdXNhZ2UpICsgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190Ojp1c2FnZSkpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYWlkbC52ZXJzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kudmVyc2lvbikpOworICAgIGFpZGwuY29uZmlnLnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5zYW1wbGVfcmF0ZSkpOworICAgIGFpZGwuY29uZmlnLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgYWlkbC5jb25maWcuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS5mb3JtYXQpKTsKKyAgICBhaWRsLnN0cmVhbVR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShsZWdhY3kuc3RyZWFtX3R5cGUpKTsKKyAgICBhaWRsLmJpdFJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5iaXRfcmF0ZSkpOworICAgIGFpZGwuZHVyYXRpb25VcyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obGVnYWN5LmR1cmF0aW9uX3VzKSk7CisgICAgYWlkbC5oYXNWaWRlbyA9IGxlZ2FjeS5oYXNfdmlkZW87CisgICAgYWlkbC5pc1N0cmVhbWluZyA9IGxlZ2FjeS5pc19zdHJlYW1pbmc7CisgICAgYWlkbC5iaXRXaWR0aCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LmJpdF93aWR0aCkpOworICAgIGFpZGwub2ZmbG9hZEJ1ZmZlclNpemUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5vZmZsb2FkX2J1ZmZlcl9zaXplKSk7CisgICAgYWlkbC51c2FnZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UobGVnYWN5LnVzYWdlKSk7CisKKyAgICAvLyBWZXJzaW9uIDAuMiBmaWVsZHMuCisgICAgaWYgKGxlZ2FjeS52ZXJzaW9uID49IEFVRElPX09GRkxPQURfSU5GT19WRVJTSU9OXzBfMikgeworICAgICAgICBpZiAobGVnYWN5LnNpemUgPAorICAgICAgICAgICAgb2Zmc2V0b2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QsIHN5bmNfaWQpICsgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190OjpzeW5jX2lkKSkgeworICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgfQorICAgICAgICBhaWRsLmVuY2Fwc3VsYXRpb25Nb2RlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZW5jYXBzdWxhdGlvbl9tb2RlKSk7CisgICAgICAgIGFpZGwuY29udGVudElkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kuY29udGVudF9pZCkpOworICAgICAgICBhaWRsLnN5bmNJZCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5LnN5bmNfaWQpKTsKKyAgICB9CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29uZmlnX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWcmIGFpZGwpIHsKKyAgICBhdWRpb19jb25maWdfdCBsZWdhY3k7CisgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7CisgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOworICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICBsZWdhY3kub2ZmbG9hZF9pbmZvID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChhaWRsLm9mZmxvYWRJbmZvKSk7CisgICAgbGVnYWN5LmZyYW1lX2NvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5mcmFtZUNvdW50KSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db25maWc+CitsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25zdCBhdWRpb19jb25maWdfdCYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvQ29uZmlnIGFpZGw7CisgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgIGFpZGwub2ZmbG9hZEluZm8gPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19vZmZsb2FkX2luZm9fdF9BdWRpb09mZmxvYWRJbmZvKGxlZ2FjeS5vZmZsb2FkX2luZm8pKTsKKyAgICBhaWRsLmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGxlZ2FjeS5mcmFtZV9jb3VudCkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbmZpZ19iYXNlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBhaWRsKSB7CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBsZWdhY3k7CisgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7CisgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOworICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2U+CitsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGFpZGw7CisgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PHNwPElNZW1vcnk+PgorYWlkbDJsZWdhY3lfU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGNvbnN0IG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uJiBhaWRsKSB7CisgICAgc3A8SU1lbW9yeT4gbGVnYWN5OworICAgIGlmICghY29udmVydFNoYXJlZEZpbGVSZWdpb25Ub0lNZW1vcnkoYWlkbCwgJmxlZ2FjeSkpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4KK2xlZ2FjeTJhaWRsX0lNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbGVnYWN5KSB7CisgICAgbWVkaWE6OlNoYXJlZEZpbGVSZWdpb24gYWlkbDsKKyAgICBpZiAoIWNvbnZlcnRJTWVtb3J5VG9TaGFyZWRGaWxlUmVnaW9uKGxlZ2FjeSwgJmFpZGwpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PHNwPElNZW1vcnk+PgorYWlkbDJsZWdhY3lfTnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoY29uc3Qgc3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4mIGFpZGwpIHsKKyAgICBzcDxJTWVtb3J5PiBsZWdhY3k7CisgICAgaWYgKCFjb252ZXJ0TnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KGFpZGwsICZsZWdhY3kpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4+CitsZWdhY3kyYWlkbF9OdWxsYWJsZUlNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbGVnYWN5KSB7CisgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4gYWlkbDsKKyAgICBpZiAoIWNvbnZlcnROdWxsYWJsZUlNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24obGVnYWN5LCAmYWlkbCkpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9UaW1lc3RhbXA+CithaWRsMmxlZ2FjeV9BdWRpb1RpbWVzdGFtcChjb25zdCBtZWRpYTo6QXVkaW9UaW1lc3RhbXBJbnRlcm5hbCYgYWlkbCkgeworICAgIEF1ZGlvVGltZXN0YW1wIGxlZ2FjeTsKKyAgICBsZWdhY3kubVBvc2l0aW9uID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5wb3NpdGlvbikpOworICAgIGxlZ2FjeS5tVGltZS50dl9zZWMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnNlYykpOworICAgIGxlZ2FjeS5tVGltZS50dl9uc2VjID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5uc2VjKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9UaW1lc3RhbXBJbnRlcm5hbD4KK2xlZ2FjeTJhaWRsX0F1ZGlvVGltZXN0YW1wKGNvbnN0IEF1ZGlvVGltZXN0YW1wJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9UaW1lc3RhbXBJbnRlcm5hbCBhaWRsOworICAgIGFpZGwucG9zaXRpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5tUG9zaXRpb24pKTsKKyAgICBhaWRsLnNlYyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obGVnYWN5Lm1UaW1lLnR2X3NlYykpOworICAgIGFpZGwubnNlYyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5Lm1UaW1lLnR2X25zZWMpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb191dWlkX3Q+CithaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIGFpZGwpIHsKKyAgICBhdWRpb191dWlkX3QgbGVnYWN5OworICAgIGxlZ2FjeS50aW1lTG93ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDx1aW50MzJfdD4oYWlkbC50aW1lTG93KSk7CisgICAgbGVnYWN5LnRpbWVNaWQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQxNl90PihhaWRsLnRpbWVNaWQpKTsKKyAgICBsZWdhY3kudGltZUhpQW5kVmVyc2lvbiA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDE2X3Q+KGFpZGwudGltZUhpQW5kVmVyc2lvbikpOworICAgIGxlZ2FjeS5jbG9ja1NlcSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDE2X3Q+KGFpZGwuY2xvY2tTZXEpKTsKKyAgICBpZiAoYWlkbC5ub2RlLnNpemUoKSAhPSBzdGQ6OnNpemUobGVnYWN5Lm5vZGUpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHN0ZDo6Y29weShhaWRsLm5vZGUuYmVnaW4oKSwgYWlkbC5ub2RlLmVuZCgpLCBsZWdhY3kubm9kZSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9VdWlkPgorbGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZChjb25zdCBhdWRpb191dWlkX3QmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb1V1aWQgYWlkbDsKKyAgICBhaWRsLnRpbWVMb3cgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeS50aW1lTG93KSk7CisgICAgYWlkbC50aW1lTWlkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kudGltZU1pZCkpOworICAgIGFpZGwudGltZUhpQW5kVmVyc2lvbiA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnRpbWVIaUFuZFZlcnNpb24pKTsKKyAgICBhaWRsLmNsb2NrU2VxID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuY2xvY2tTZXEpKTsKKyAgICBzdGQ6OmNvcHkobGVnYWN5Lm5vZGUsIGxlZ2FjeS5ub2RlICsgc3RkOjpzaXplKGxlZ2FjeS5ub2RlKSwgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwubm9kZSkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGVmZmVjdF9kZXNjcmlwdG9yX3Q+CithaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QoY29uc3QgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3ImIGFpZGwpIHsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGxlZ2FjeTsKKyAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGFpZGwudHlwZSkpOworICAgIGxlZ2FjeS51dWlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QoYWlkbC51dWlkKSk7CisgICAgbGVnYWN5LmFwaVZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydFJlaW50ZXJwcmV0PHVpbnQzMl90PihhaWRsLmFwaVZlcnNpb24pKTsKKyAgICBsZWdhY3kuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydFJlaW50ZXJwcmV0PHVpbnQzMl90PihhaWRsLmZsYWdzKSk7CisgICAgbGVnYWN5LmNwdUxvYWQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQxNl90PihhaWRsLmNwdUxvYWQpKTsKKyAgICBsZWdhY3kubWVtb3J5VXNhZ2UgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQxNl90PihhaWRsLm1lbW9yeVVzYWdlKSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLm5hbWUsIGxlZ2FjeS5uYW1lLCBzaXplb2YobGVnYWN5Lm5hbWUpKSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwuaW1wbGVtZW50b3IsIGxlZ2FjeS5pbXBsZW1lbnRvciwgc2l6ZW9mKGxlZ2FjeS5pbXBsZW1lbnRvcikpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPgorbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yIGFpZGw7CisgICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQobGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLnV1aWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZChsZWdhY3kudXVpZCkpOworICAgIGFpZGwuYXBpVmVyc2lvbiA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5LmFwaVZlcnNpb24pKTsKKyAgICBhaWRsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kuZmxhZ3MpKTsKKyAgICBhaWRsLmNwdUxvYWQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5jcHVMb2FkKSk7CisgICAgYWlkbC5tZW1vcnlVc2FnZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5Lm1lbW9yeVVzYWdlKSk7CisgICAgYWlkbC5uYW1lID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kubmFtZSwgc2l6ZW9mKGxlZ2FjeS5uYW1lKSkpOworICAgIGFpZGwuaW1wbGVtZW50b3IgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9zdHJpbmcobGVnYWN5LmltcGxlbWVudG9yLCBzaXplb2YobGVnYWN5LmltcGxlbWVudG9yKSkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90PgorYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpOT05FOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9OT05FOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRlJBTUVXT1JLX1RVTkVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkRWQl9BRF9ERVNDUklQVE9SOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9EVkJfQURfREVTQ1JJUFRPUjsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPgorbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlKAorICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9OT05FOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6Ok5PTkU7CisgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFX0ZSQU1FV09SS19UVU5FUjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpGUkFNRVdPUktfVFVORVI7CisgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFX0RWQl9BRF9ERVNDUklQVE9SOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkRWQl9BRF9ERVNDUklQVE9SOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PgorYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazx1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPigKKyAgICAgICAgICAgIGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QsCisgICAgICAgICAgICBpbmRleDJlbnVtX2luZGV4PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8dWludDMyX3QsIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90Pik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayh1aW50MzJfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdD4oCisgICAgICAgICAgICBsZWdhY3ksIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUsCisgICAgICAgICAgICBpbmRleDJlbnVtX2luZGV4PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazx1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+KAorICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90LAorICAgICAgICAgICAgaW5kZXgyZW51bV9pbmRleDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8dWludDMyX3QsIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90Pik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKHVpbnQzMl90IGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3Q+KAorICAgICAgICAgICAgbGVnYWN5LCBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUsCisgICAgICAgICAgICBpbmRleDJlbnVtX2luZGV4PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90PiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3Q+CithaWRsMmxlZ2FjeV9BdWRpb01peExhdGVuY3lDbGFzc19hdWRpb19taXhfbGF0ZW5jeV9jbGFzc190KAorICAgICAgICBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3MgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6TE9XOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0xBVEVOQ1lfTE9XOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6Tk9STUFMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0xBVEVOQ1lfTk9STUFMOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3RfQXVkaW9NaXhMYXRlbmN5Q2xhc3MoCisgICAgICAgIGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19MQVRFTkNZX0xPVzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3M6OkxPVzsKKyAgICAgICAgY2FzZSBBVURJT19MQVRFTkNZX05PUk1BTDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3M6Ok5PUk1BTDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2RldmljZV9leHQ+CithaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9kZXZpY2VfZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwpIHsKKyAgICBhdWRpb19wb3J0X2RldmljZV9leHQgbGVnYWN5OworICAgIGxlZ2FjeS5od19tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbC5od01vZHVsZSkpOworICAgIGxlZ2FjeS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGFpZGwuZGV2aWNlLnR5cGUpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9zdHJpbmcoYWlkbC5kZXZpY2UuYWRkcmVzcywgbGVnYWN5LmFkZHJlc3MsIHNpemVvZihsZWdhY3kuYWRkcmVzcykpKTsKKyAgICBsZWdhY3kuZW5jYXBzdWxhdGlvbl9tb2RlcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhhaWRsLmVuY2Fwc3VsYXRpb25Nb2RlcykpOworICAgIGxlZ2FjeS5lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2soYWlkbC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQoY29uc3QgYXVkaW9fcG9ydF9kZXZpY2VfZXh0JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0IGFpZGw7CisgICAgYWlkbC5od01vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaHdfbW9kdWxlKSk7CisgICAgYWlkbC5kZXZpY2UudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChsZWdhY3kudHlwZSkpOworICAgIGFpZGwuZGV2aWNlLmFkZHJlc3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9zdHJpbmcobGVnYWN5LmFkZHJlc3MsIHNpemVvZihsZWdhY3kuYWRkcmVzcykpKTsKKyAgICBhaWRsLmVuY2Fwc3VsYXRpb25Nb2RlcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhsZWdhY3kuZW5jYXBzdWxhdGlvbl9tb2RlcykpOworICAgIGFpZGwuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhsZWdhY3kuZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlcykpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfbWl4X2V4dD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dF9hdWRpb19wb3J0X21peF9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dCYgYWlkbCkgeworICAgIGF1ZGlvX3BvcnRfbWl4X2V4dCBsZWdhY3k7CisgICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7CisgICAgbGVnYWN5LmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGwuaGFuZGxlKSk7CisgICAgbGVnYWN5LmxhdGVuY3lfY2xhc3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb01peExhdGVuY3lDbGFzc19hdWRpb19taXhfbGF0ZW5jeV9jbGFzc190KGFpZGwubGF0ZW5jeUNsYXNzKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9taXhfZXh0X0F1ZGlvUG9ydE1peEV4dChjb25zdCBhdWRpb19wb3J0X21peF9leHQmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb1BvcnRNaXhFeHQgYWlkbDsKKyAgICBhaWRsLmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5oYW5kbGUpKTsKKyAgICBhaWRsLmxhdGVuY3lDbGFzcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3RfQXVkaW9NaXhMYXRlbmN5Q2xhc3MobGVnYWN5LmxhdGVuY3lfY2xhc3MpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Nlc3Npb25fZXh0PgorYWlkbDJsZWdhY3lfQXVkaW9Qb3J0U2Vzc2lvbkV4dF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRTZXNzaW9uRXh0JiBhaWRsKSB7CisgICAgYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCBsZWdhY3k7CisgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbC5zZXNzaW9uKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0U2Vzc2lvbkV4dD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0U2Vzc2lvbkV4dChjb25zdCBhdWRpb19wb3J0X3Nlc3Npb25fZXh0JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0U2Vzc2lvbkV4dCBhaWRsOworICAgIGFpZGwuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChsZWdhY3kuc2Vzc2lvbikpOworICAgIHJldHVybiBhaWRsOworfQorCisvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCit1c2luZyBhdWRpb19wb3J0X3Y3X2V4dCA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfdjc6OmV4dCk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF92N19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSkgeworICAgIGF1ZGlvX3BvcnRfdjdfZXh0IGxlZ2FjeTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6Tk9ORToKKyAgICAgICAgICAgIC8vIEp1c3QgdmVyaWZ5IHRoYXQgdGhlIHVuaW9uIGlzIGVtcHR5LgorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCB1bnNwZWNpZmllZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRToKKyAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2RldmljZV9leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBkZXZpY2UpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDoKKyAgICAgICAgICAgIGxlZ2FjeS5taXggPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dF9hdWRpb19wb3J0X21peF9leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBtaXgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OlNFU1NJT046CisgICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRTZXNzaW9uRXh0X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgc2Vzc2lvbikpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlNob3VsZG4ndCBnZXQgaGVyZSIpOworICAgIH0KKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF92N19leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgeworICAgIG1lZGlhOjpBdWRpb1BvcnRFeHQgYWlkbDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTk9ORToKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRToKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dChsZWdhY3kuZGV2aWNlKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDoKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBtaXgsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQobGVnYWN5Lm1peCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9TRVNTSU9OOgorICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0U2Vzc2lvbkV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5zZXNzaW9uKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsKKyAgICB9CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcHJvZmlsZT4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9hdWRpb19wcm9maWxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIGFpZGwpIHsKKyAgICBhdWRpb19wcm9maWxlIGxlZ2FjeTsKKyAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CisKKyAgICBpZiAoYWlkbC5zYW1wbGluZ1JhdGVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuc2FtcGxlX3JhdGVzKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2UoYWlkbC5zYW1wbGluZ1JhdGVzLmJlZ2luKCksIGFpZGwuc2FtcGxpbmdSYXRlcy5lbmQoKSwgbGVnYWN5LnNhbXBsZV9yYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdCwgdW5zaWduZWQgaW50PikpOworICAgIGxlZ2FjeS5udW1fc2FtcGxlX3JhdGVzID0gYWlkbC5zYW1wbGluZ1JhdGVzLnNpemUoKTsKKworICAgIGlmIChhaWRsLmNoYW5uZWxNYXNrcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmNoYW5uZWxfbWFza3MpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShhaWRsLmNoYW5uZWxNYXNrcy5iZWdpbigpLCBhaWRsLmNoYW5uZWxNYXNrcy5lbmQoKSwgbGVnYWN5LmNoYW5uZWxfbWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdCkpOworICAgIGxlZ2FjeS5udW1fY2hhbm5lbF9tYXNrcyA9IGFpZGwuY2hhbm5lbE1hc2tzLnNpemUoKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+CitsZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShjb25zdCBhdWRpb19wcm9maWxlJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Qcm9maWxlIGFpZGw7CisgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworCisgICAgaWYgKGxlZ2FjeS5udW1fc2FtcGxlX3JhdGVzID4gc3RkOjpzaXplKGxlZ2FjeS5zYW1wbGVfcmF0ZXMpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuc2FtcGxlX3JhdGVzLCBsZWdhY3kuc2FtcGxlX3JhdGVzICsgbGVnYWN5Lm51bV9zYW1wbGVfcmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuc2FtcGxpbmdSYXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludCwgaW50MzJfdD4pKTsKKworICAgIGlmIChsZWdhY3kubnVtX2NoYW5uZWxfbWFza3MgPiBzdGQ6OnNpemUobGVnYWN5LmNoYW5uZWxfbWFza3MpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuY2hhbm5lbF9tYXNrcywgbGVnYWN5LmNoYW5uZWxfbWFza3MgKyBsZWdhY3kubnVtX2NoYW5uZWxfbWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuY2hhbm5lbE1hc2tzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbj4KK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIGFpZGwpIHsKKyAgICBhdWRpb19nYWluIGxlZ2FjeTsKKyAgICBsZWdhY3kubW9kZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soYWlkbC5tb2RlKSk7CisgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOworICAgIGxlZ2FjeS5taW5fdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC5taW5WYWx1ZSkpOworICAgIGxlZ2FjeS5tYXhfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC5tYXhWYWx1ZSkpOworICAgIGxlZ2FjeS5kZWZhdWx0X3ZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGFpZGwuZGVmYXVsdFZhbHVlKSk7CisgICAgbGVnYWN5LnN0ZXBfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5zdGVwVmFsdWUpKTsKKyAgICBsZWdhY3kubWluX3JhbXBfbXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5taW5SYW1wTXMpKTsKKyAgICBsZWdhY3kubWF4X3JhbXBfbXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5tYXhSYW1wTXMpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW4+CitsZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2Fpbihjb25zdCBhdWRpb19nYWluJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9HYWluIGFpZGw7CisgICAgYWlkbC5tb2RlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X21hc2tfaW50MzJfdChsZWdhY3kubW9kZSkpOworICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS5jaGFubmVsX21hc2spKTsKKyAgICBhaWRsLm1pblZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kubWluX3ZhbHVlKSk7CisgICAgYWlkbC5tYXhWYWx1ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5Lm1heF92YWx1ZSkpOworICAgIGFpZGwuZGVmYXVsdFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuZGVmYXVsdF92YWx1ZSkpOworICAgIGFpZGwuc3RlcFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc3RlcF92YWx1ZSkpOworICAgIGFpZGwubWluUmFtcE1zID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kubWluX3JhbXBfbXMpKTsKKyAgICBhaWRsLm1heFJhbXBNcyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5Lm1heF9yYW1wX21zKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF92Nz4KK2FpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIGFpZGwpIHsKKyAgICBhdWRpb19wb3J0X3Y3IGxlZ2FjeTsKKyAgICBsZWdhY3kuaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwuaWQpKTsKKyAgICBsZWdhY3kucm9sZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KGFpZGwucm9sZSkpOworICAgIGxlZ2FjeS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFR5cGVfYXVkaW9fcG9ydF90eXBlX3QoYWlkbC50eXBlKSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLm5hbWUsIGxlZ2FjeS5uYW1lLCBzaXplb2YobGVnYWN5Lm5hbWUpKSk7CisKKyAgICBpZiAoYWlkbC5wcm9maWxlcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmF1ZGlvX3Byb2ZpbGVzKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBSRVRVUk5fSUZfRVJST1IoY29udmVydFJhbmdlKGFpZGwucHJvZmlsZXMuYmVnaW4oKSwgYWlkbC5wcm9maWxlcy5lbmQoKSwgbGVnYWN5LmF1ZGlvX3Byb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUpKTsKKyAgICBsZWdhY3kubnVtX2F1ZGlvX3Byb2ZpbGVzID0gYWlkbC5wcm9maWxlcy5zaXplKCk7CisKKyAgICBpZiAoYWlkbC5nYWlucy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmdhaW5zKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBSRVRVUk5fSUZfRVJST1IoY29udmVydFJhbmdlKGFpZGwuZ2FpbnMuYmVnaW4oKSwgYWlkbC5nYWlucy5lbmQoKSwgbGVnYWN5LmdhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4pKTsKKyAgICBsZWdhY3kubnVtX2dhaW5zID0gYWlkbC5nYWlucy5zaXplKCk7CisKKyAgICBsZWdhY3kuYWN0aXZlX2NvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ19hdWRpb19wb3J0X2NvbmZpZyhhaWRsLmFjdGl2ZUNvbmZpZykpOworICAgIGxlZ2FjeS5leHQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0KGFpZGwuZXh0LCBhaWRsLnR5cGUpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnQ+CitsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydChjb25zdCBhdWRpb19wb3J0X3Y3JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IGFpZGw7CisgICAgYWlkbC5pZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmlkKSk7CisgICAgYWlkbC5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobGVnYWN5LnJvbGUpKTsKKyAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZShsZWdhY3kudHlwZSkpOworICAgIGFpZGwubmFtZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9zdHJpbmcobGVnYWN5Lm5hbWUsIHNpemVvZihsZWdhY3kubmFtZSkpKTsKKworICAgIGlmIChsZWdhY3kubnVtX2F1ZGlvX3Byb2ZpbGVzID4gc3RkOjpzaXplKGxlZ2FjeS5hdWRpb19wcm9maWxlcykpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgY29udmVydFJhbmdlKGxlZ2FjeS5hdWRpb19wcm9maWxlcywgbGVnYWN5LmF1ZGlvX3Byb2ZpbGVzICsgbGVnYWN5Lm51bV9hdWRpb19wcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5wcm9maWxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcHJvZmlsZV9BdWRpb1Byb2ZpbGUpKTsKKworICAgIGlmIChsZWdhY3kubnVtX2dhaW5zID4gc3RkOjpzaXplKGxlZ2FjeS5nYWlucykpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgY29udmVydFJhbmdlKGxlZ2FjeS5nYWlucywgbGVnYWN5LmdhaW5zICsgbGVnYWN5Lm51bV9nYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5nYWlucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4pKTsKKworICAgIGFpZGwuYWN0aXZlQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfQXVkaW9Qb3J0Q29uZmlnKGxlZ2FjeS5hY3RpdmVfY29uZmlnKSk7CisgICAgYWlkbC5leHQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0RXh0KGxlZ2FjeS5leHQsIGxlZ2FjeS50eXBlKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbW9kZV90PgorYWlkbDJsZWdhY3lfQXVkaW9Nb2RlX2F1ZGlvX21vZGVfdChtZWRpYTo6QXVkaW9Nb2RlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpJTlZBTElEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpDVVJSRU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfQ1VSUkVOVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpOT1JNQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9OT1JNQUw7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTW9kZTo6UklOR1RPTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9SSU5HVE9ORTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DQUxMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5fQ0FMTDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpDQUxMX1NDUkVFTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX0NBTExfU0NSRUVOOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01vZGU+CitsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKGF1ZGlvX21vZGVfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX01PREVfSU5WQUxJRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpJTlZBTElEOworICAgICAgICBjYXNlIEFVRElPX01PREVfQ1VSUkVOVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpDVVJSRU5UOworICAgICAgICBjYXNlIEFVRElPX01PREVfTk9STUFMOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01vZGU6Ok5PUk1BTDsKKyAgICAgICAgY2FzZSBBVURJT19NT0RFX1JJTkdUT05FOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01vZGU6OlJJTkdUT05FOworICAgICAgICBjYXNlIEFVRElPX01PREVfSU5fQ0FMTDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DQUxMOworICAgICAgICBjYXNlIEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DT01NVU5JQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX01PREVfQ0FMTF9TQ1JFRU46CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6Q0FMTF9TQ1JFRU47CisgICAgICAgIGNhc2UgQVVESU9fTU9ERV9DTlQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb191bmlxdWVfaWRfdXNlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb1VuaXF1ZUlkVXNlX2F1ZGlvX3VuaXF1ZV9pZF91c2VfdChtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OlVOU1BFQ0lGSUVEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VOSVFVRV9JRF9VU0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OlNFU1NJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpNT0RVTEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OkVGRkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZTo6UEFUQ0g6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5JUVVFX0lEX1VTRV9QQVRDSDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZTo6T1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VOSVFVRV9JRF9VU0VfT1VUUFVUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpJTlBVVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VTklRVUVfSURfVVNFX0lOUFVUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpDTElFTlQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5JUVVFX0lEX1VTRV9DTElFTlQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U+CitsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdXNlX3RfQXVkaW9VbmlxdWVJZFVzZShhdWRpb191bmlxdWVfaWRfdXNlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19VTklRVUVfSURfVVNFX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpVTlNQRUNJRklFRDsKKyAgICAgICAgY2FzZSBBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OlNFU1NJT047CisgICAgICAgIGNhc2UgQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6Ok1PRFVMRTsKKyAgICAgICAgY2FzZSBBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZTo6RUZGRUNUOworICAgICAgICBjYXNlIEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0g6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OlBBVENIOworICAgICAgICBjYXNlIEFVRElPX1VOSVFVRV9JRF9VU0VfT1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpPVVRQVVQ7CisgICAgICAgIGNhc2UgQVVESU9fVU5JUVVFX0lEX1VTRV9JTlBVVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZTo6SU5QVVQ7CisgICAgICAgIGNhc2UgQVVESU9fVU5JUVVFX0lEX1VTRV9DTElFTlQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OkNMSUVOVDsKKyAgICAgICAgY2FzZSBBVURJT19VTklRVUVfSURfVVNFX01BWDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKaW5kZXggMGM0MGNiYi4uNjRlYzE0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCkBAIC0yLDYgKzIsNyBAQAogICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCkBAIC0xMiw2ICsxMywxOSBAQAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC11bnN0YWJsZS1jcHAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC11bnN0YWJsZS1jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWworICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICAgICAgImF2LXR5cGVzLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICBdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTIzLDYgKzM3LDcgQEAKICAgICAgICAgIkF1ZGlvVm9sdW1lR3JvdXAuY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC11bnN0YWJsZS1jcHAiLAogICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAogICAgICAgICAibGliYXVkaW91dGlscyIsCkBAIC0zOCw2ICs1Myw3IEBACiAgICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtdW5zdGFibGUtY3BwIiwKICAgICAgICAgImNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbC1jcHAiLAogICAgIF0sCiB9CkBAIC00OSw3ICs2NSw3IEBACiAgICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCiAgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCiAgICAgICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbCIsCisgICAgICAgICAgICAiZnJhbWV3b3Jrcy9hdi9haWRsIiwKICAgICAgICAgXSwKICAgICB9LAogCkBAIC01Nyw4ICs3Myw2IEBACiAgICAgICAgIC8vIEFJREwgZmlsZXMgZm9yIGF1ZGlvY2xpZW50IGludGVyZmFjZXMKICAgICAgICAgLy8gVGhlIGhlYWRlcnMgZm9yIHRoZXNlIGludGVyZmFjZXMgd2lsbCBiZSBhdmFpbGFibGUgdG8gYW55IG1vZHVsZXMgdGhhdAogICAgICAgICAvLyBpbmNsdWRlIGxpYmF1ZGlvY2xpZW50LCBhdCB0aGUgcGF0aCAiYWlkbC9wYWNrYWdlL3BhdGgvQm5Gb28uaCIKLSAgICAgICAgIjpsaWJhdWRpb2NsaWVudF9haWRsX2NhbGxiYWNrIiwKLSAgICAgICAgIjpsaWJhdWRpb2NsaWVudF9haWRsX3ByaXZhdGUiLAogICAgICAgICAiOmxpYmF1ZGlvY2xpZW50X2FpZGwiLAogCiAgICAgICAgICJBdWRpb0VmZmVjdC5jcHAiLApAQCAtNjcsMTkgKzgxLDE5IEBACiAgICAgICAgICJBdWRpb1RyYWNrLmNwcCIsCiAgICAgICAgICJBdWRpb1RyYWNrU2hhcmVkLmNwcCIsCiAgICAgICAgICJJQXVkaW9GbGluZ2VyLmNwcCIsCi0gICAgICAgICJJQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCIsCiAgICAgICAgICJJQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCIsCi0gICAgICAgICJJQXVkaW9UcmFjay5jcHAiLAotICAgICAgICAiSUVmZmVjdC5jcHAiLAotICAgICAgICAiSUVmZmVjdENsaWVudC5jcHAiLAogICAgICAgICAiVG9uZUdlbmVyYXRvci5jcHAiLAogICAgICAgICAiUGxheWVyQmFzZS5jcHAiLAogICAgICAgICAiUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmNwcCIsCiAgICAgICAgICJUcmFja1BsYXllckJhc2UuY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLXVuc3RhYmxlLWNwcCIsCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC11bnN0YWJsZS1jcHAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC11bnN0YWJsZS1jcHAiLAogICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAogICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYXVkaW9wb2xpY3kiLApAQCAtOTMsMTYgKzEwNywyMSBAQAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJuYmxvZyIsCiAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlic2htZW1jb21wYXQiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlidmlicmF0b3IiLAogICAgIF0sCi0gICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJiaW5kZXIiXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC11bnN0YWJsZS1jcHAiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby8iLAogICAgIF0sCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlL21lZGlhIiwgImFpZGwiCisgICAgICAgICJpbmNsdWRlL21lZGlhIiwKKyAgICAgICAgImFpZGwiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLApAQCAtMTEwLDEwICsxMjksMTYgQEAKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIl0sCisgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWworICAgICAgICAiZWZmZWN0LWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLXVuc3RhYmxlLWNwcCIsCisgICAgXSwKIAotICAgIC8vIGZvciBtZW1vcnkgaGVhcCBhbmFseXNpcwogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJlZmZlY3QtYWlkbC11bnN0YWJsZS1jcHAiLAorICAgICAgICAvLyBmb3IgbWVtb3J5IGhlYXAgYW5hbHlzaXMKICAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbC11bnN0YWJsZS1jcHAiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCkBAIC0xMjEsMTMgKzE0Niw5MCBAQAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCiAgICAgXSwKICAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZCA6IFsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgfSwKIH0KIAorLy8gVGhpcyBpcyBpbnRlbmRlZCBmb3IgY2xpZW50cyBuZWVkaW5nIHRvIGluY2x1ZGUgQWlkbENvbnZlcnNpb25VdGlsLmgsIHdpdGhvdXQgZHJhZ2dpbmcgaW4gYSBsb3Qgb2YgZXh0cmEKKy8vIGRlcGVuZGVuY2llcy4KK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgc3JjczogWyJBaWRsQ29udmVyc2lvbi5jcHAiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLXVuc3RhYmxlLWNwcCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic2htZW1jb21wYXQiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICBdLAorICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKwogLy8gQUlETCBpbnRlcmZhY2UgYmV0d2VlbiBsaWJhdWRpb2NsaWVudCBhbmQgZnJhbWV3b3JrLmphcgogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibGliYXVkaW9jbGllbnRfYWlkbCIsCkBAIC0xMzcsMjUgKzIzOSw2IEBACiAgICAgcGF0aDogImFpZGwiLAogfQogCi0vLyBVc2VkIHRvIHN0cmlwIHRoZSAiYWlkbC8iIGZyb20gdGhlIHBhdGgsIHNvIHRoZSBidWlsZCBzeXN0ZW0gY2FuIHByZWRpY3QgdGhlCi0vLyBvdXRwdXQgZmlsZW5hbWUuCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF9haWRsX3ByaXZhdGUiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbCIsCi0gICAgXSwKLSAgICBwYXRoOiAiYWlkbCIsCi19Ci0KLS8vIEFJREwgaW50ZXJmYWNlIGZvciBhdWRpbyB0cmFjayBjYWxsYmFjawotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAibGliYXVkaW9jbGllbnRfYWlkbF9jYWxsYmFjayIsCi0gICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrQ2FsbGJhY2suYWlkbCIsCi0gICAgXSwKLSAgICBwYXRoOiAiYWlkbCIsCi19Ci0KIGFpZGxfaW50ZXJmYWNlIHsKICAgICBuYW1lOiAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsIiwKICAgICB1bnN0YWJsZTogdHJ1ZSwKQEAgLTE2NCwzICsyNDcsMTI5IEBACiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUNhcHR1cmVTdGF0ZUxpc3RlbmVyLmFpZGwiLAogICAgIF0sCiB9CisKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAiZWZmZWN0LWFpZGwiLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3QuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdENsaWVudC5haWRsIiwKKyAgICBdLAorICAgIGltcG9ydHM6IFsKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsIiwKKyAgICBdLAorfQorCithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwiLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ2xpZW50LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbnRlbnRUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9JbnB1dEZsYWdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9Db25maWdFdmVudC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRmxhZ3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BhdGNoLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Um9sZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU291cmNlVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0cmVhbVR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXBJbnRlcm5hbC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VuaXF1ZUlkVXNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXNhZ2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VdWlkLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0VmZmVjdERlc2NyaXB0b3IuYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgXSwKKyAgICBiYWNrZW5kOiB7CisgICAgICAgIGNwcDogeworICAgICAgICAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgICAgICAgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJhdWRpb2ZsaW5nZXItYWlkbCIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVzcG9uc2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXF1ZXN0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVzcG9uc2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVxdWVzdC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXNwb25zZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVxdWVzdC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVzcG9uc2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvUmVuZGVyUG9zaXRpb24uYWlkbCIsCisKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFjay5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFja0NhbGxiYWNrLmFpZGwiLAorICAgIF0sCisgICAgaW1wb3J0czogWworICAgICAgICAiYXVkaW9fY29tbW9uLWFpZGwiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbCIsCisgICAgICAgICJhdi10eXBlcy1haWRsIiwKKyAgICAgICAgImVmZmVjdC1haWRsIiwKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsIiwKKyAgICBdLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBiYWNrZW5kOiB7CisgICAgICAgIGNwcDogeworICAgICAgICAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgICAgICAgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCmluZGV4IDFlZTY5MzAuLmZmNGJhMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcApAQCAtNTcsNyArNTcsNyBAQAogICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDEpOwotICAgICAgICBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobUF0dHJpYnV0ZXMudGFncyk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihzdGQ6OnN0cmluZyhtQXR0cmlidXRlcy50YWdzKSk7CiAgICAgfQogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtU3RyZWFtVHlwZSkpOwogICAgIHBhcmNlbC0+d3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1Hcm91cElkKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKaW5kZXggM2VhZDZjYi4uYWU4OTljMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcApAQCAtMjMsNzcgKzIzLDM1IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKLSNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotCi0KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGJpbmRlcjo6U3RhdHVzOworCituYW1lc3BhY2UgeworCisvLyBDb3B5IGZyb20gYSByYXcgcG9pbnRlciArIHNpemUgaW50byBhIHZlY3RvciBvZiBieXRlcy4KK3ZvaWQgYXBwZW5kVG9CdWZmZXIoY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBidWZmZXIpIHsKKyAgICBjb25zdCB1aW50OF90KiBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSk7CisgICAgYnVmZmVyLT5pbnNlcnQoYnVmZmVyLT5lbmQoKSwgcCwgcCArIHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1Qcm9iZShmYWxzZSksIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCisgICAgOiBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQogewogfQogCi0KLUF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKLSAgICAgICAgICAgICAgICBib29sIHByb2JlCi0gICAgICAgICAgICAgICAgKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVByb2JlKGZhbHNlKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKLXsKLSAgICBBdXRvTXV0ZXggbG9jayhtQ29uc3RydWN0TG9jayk7Ci0gICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlKTsKLX0KLQotQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKLSAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAotICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUKLSAgICAgICAgICAgICAgICApCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtUHJvYmUoZmFsc2UpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQotewotICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKLSAgICBlZmZlY3RfdXVpZF90ICpwVHlwZSA9IE5VTEw7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGVmZmVjdF91dWlkX3QgKnBVdWlkID0gTlVMTDsKLQotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciBzdHJpbmdcbiAtIHR5cGU6ICVzXG4gLSB1dWlkOiAlcyIsIHR5cGVTdHIsIHV1aWRTdHIpOwotCi0gICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcFR5cGUgPSAmdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHBVdWlkID0gJnV1aWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtQ29uc3RydWN0TG9jayk7Ci0gICAgbVN0YXR1cyA9IHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSwgcHJvYmUpOwotfQotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCiAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LApAQCAtMTA0LDcgKzYyLDcgQEAKICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSkKIHsKLSAgICBzcDxJRWZmZWN0PiBpRWZmZWN0OworICAgIHNwPG1lZGlhOjpJRWZmZWN0PiBpRWZmZWN0OwogICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgaW50IGVuYWJsZWQ7CiAKQEAgLTE0Myw5ICsxMDEsMjkgQEAKICAgICBtQ2xpZW50UGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIG1DbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAKLSAgICBpRWZmZWN0ID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVFZmZlY3QoKGVmZmVjdF9kZXNjcmlwdG9yX3QgKikmbURlc2NyaXB0b3IsCi0gICAgICAgICAgICBtSUVmZmVjdENsaWVudCwgcHJpb3JpdHksIGlvLCBtU2Vzc2lvbklkLCBkZXZpY2UsIG1PcFBhY2thZ2VOYW1lLCBtQ2xpZW50UGlkLAotICAgICAgICAgICAgcHJvYmUsICZtU3RhdHVzLCAmbUlkLCAmZW5hYmxlZCk7CisgICAgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QgcmVxdWVzdDsKKyAgICByZXF1ZXN0LmRlc2MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKG1EZXNjcmlwdG9yKSk7CisgICAgcmVxdWVzdC5jbGllbnQgPSBtSUVmZmVjdENsaWVudDsKKyAgICByZXF1ZXN0LnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmVxdWVzdC5vdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW8pKTsKKyAgICByZXF1ZXN0LnNlc3Npb25JZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobVNlc3Npb25JZCkpOworICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGRldmljZSkpOworICAgIHJlcXVlc3Qub3BQYWNrYWdlTmFtZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfU3RyaW5nMTZfc3RyaW5nKG1PcFBhY2thZ2VOYW1lKSk7CisgICAgcmVxdWVzdC5waWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QobUNsaWVudFBpZCkpOworICAgIHJlcXVlc3QucHJvYmUgPSBwcm9iZTsKKworICAgIG1lZGlhOjpDcmVhdGVFZmZlY3RSZXNwb25zZSByZXNwb25zZTsKKworICAgIG1TdGF0dXMgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZUVmZmVjdChyZXF1ZXN0LCAmcmVzcG9uc2UpOworCisgICAgaWYgKG1TdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUlkID0gcmVzcG9uc2UuaWQ7CisgICAgICAgIGVuYWJsZWQgPSByZXNwb25zZS5lbmFibGVkOworICAgICAgICBpRWZmZWN0ID0gcmVzcG9uc2UuZWZmZWN0OworICAgICAgICBtRGVzY3JpcHRvciA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfRWZmZWN0RGVzY3JpcHRvcl9lZmZlY3RfZGVzY3JpcHRvcl90KHJlc3BvbnNlLmRlc2MpKTsKKyAgICB9CiAKICAgICAvLyBJbiBwcm9iZSBtb2RlLCB3ZSBzdG9wIGhlcmUgYW5kIHJldHVybiB0aGUgc3RhdHVzOiB0aGUgSUVmZmVjdCBpbnRlcmZhY2UgdG8KICAgICAvLyBhdWRpbyBmbGluZ2VyIHdpbGwgbm90IGJlIHJldGFpbmVkLiBpbml0Q2hlY2soKSB3aWxsIHJldHVybiB0aGUgY3JlYXRpb24gc3RhdHVzCkBAIC0xNjYsOCArMTQ0LDEwIEBACiAKICAgICBtRW5hYmxlZCA9ICh2b2xhdGlsZSBpbnQzMl90KWVuYWJsZWQ7CiAKLSAgICBjYmxrID0gaUVmZmVjdC0+Z2V0Q2JsaygpOwotICAgIGlmIChjYmxrID09IDApIHsKKyAgICBpZiAobWVkaWE6OlNoYXJlZEZpbGVSZWdpb24gc2htZW07CisgICAgICAgICAgICAhaUVmZmVjdC0+Z2V0Q2Jsaygmc2htZW0pLmlzT2soKQorICAgICAgICAgICAgfHwgIWNvbnZlcnRTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KHNobWVtLCAmY2JsaykKKyAgICAgICAgICAgIHx8IGNibGsgPT0gMCkgewogICAgICAgICBtU3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOwogICAgICAgICByZXR1cm4gbVN0YXR1czsKQEAgLTE5NCw2ICsxNzQsMzQgQEAKICAgICByZXR1cm4gbVN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKKyAgICAgICAgICAgICAgICBib29sIHByb2JlKQoreworICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICBlZmZlY3RfdXVpZF90ICpwVHlwZSA9IG51bGxwdHI7CisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGVmZmVjdF91dWlkX3QgKnBVdWlkID0gbnVsbHB0cjsKKworICAgIEFMT0dWKCJBdWRpb0VmZmVjdDo6c2V0IHN0cmluZ1xuIC0gdHlwZTogJXNcbiAtIHV1aWQ6ICVzIiwKKyAgICAgICAgICAgIHR5cGVTdHIgPyB0eXBlU3RyIDogIm51bGxwdHIiLCB1dWlkU3RyID8gdXVpZFN0ciA6ICJudWxscHRyIik7CisKKyAgICBpZiAoc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKSA9PSBOT19FUlJPUikgeworICAgICAgICBwVHlwZSA9ICZ0eXBlOworICAgIH0KKyAgICBpZiAoc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKSA9PSBOT19FUlJPUikgeworICAgICAgICBwVXVpZCA9ICZ1dWlkOworICAgIH0KKworICAgIHJldHVybiBzZXQocFR5cGUsIHBVdWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlKTsKK30KKwogCiBBdWRpb0VmZmVjdDo6fkF1ZGlvRWZmZWN0KCkKIHsKQEAgLTI0MiwxNSArMjUwLDE5IEBACiAgICAgfQogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKGVuYWJsZWQgIT0gbUVuYWJsZWQpIHsKKyAgICAgICAgU3RhdHVzIGJzOworCiAgICAgICAgIGlmIChlbmFibGVkKSB7CiAgICAgICAgICAgICBBTE9HVigiZW5hYmxlICVwIiwgdGhpcyk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtSUVmZmVjdC0+ZW5hYmxlKCk7CisgICAgICAgICAgICBicyA9IG1JRWZmZWN0LT5lbmFibGUoJnN0YXR1cyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiZGlzYWJsZSAlcCIsIHRoaXMpOwotICAgICAgICAgICAgc3RhdHVzID0gbUlFZmZlY3QtPmRpc2FibGUoKTsKKyAgICAgICAgICAgIGJzID0gbUlFZmZlY3QtPmRpc2FibGUoJnN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFicy5pc09rKCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGJzLnRyYW5zYWN0aW9uRXJyb3IoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7CkBAIC0yODMsNyArMjk1LDIwIEBACiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBjbWRTaXplLCBjbWREYXRhLCByZXBseVNpemUsIHJlcGx5RGF0YSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTsKKyAgICBhcHBlbmRUb0J1ZmZlcihjbWREYXRhLCBjbWRTaXplLCAmZGF0YSk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzcG9uc2U7CisKKyAgICBTdGF0dXMgYnMgPSBtSUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBkYXRhLCAqcmVwbHlTaXplLCAmcmVzcG9uc2UsICZzdGF0dXMpOworICAgIGlmICghYnMuaXNPaygpKSB7CisgICAgICAgIHN0YXR1cyA9IGJzLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtZW1jcHkocmVwbHlEYXRhLCByZXNwb25zZS5kYXRhKCksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgICAgICpyZXBseVNpemUgPSByZXNwb25zZS5zaXplKCk7CisgICAgfQogCiAgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9FTkFCTEUgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0RJU0FCTEUpIHsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtMjk4LDcgKzMyMyw2IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSkKIHsKICAgICBpZiAobVByb2JlKSB7CkBAIC0zMTIsMTQgKzMzNiwyNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoaW50KTsKICAgICB1aW50MzJfdCBwc2l6ZSA9ICgocGFyYW0tPnBzaXplIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCkgKyBwYXJhbS0+dnNpemU7CiAKICAgICBBTE9HVigic2V0UGFyYW1ldGVyOiBwYXJhbTogJWQsIHBhcmFtMjogJWQiLCAqKGludCAqKXBhcmFtLT5kYXRhLAogICAgICAgICAgICAgKHBhcmFtLT5wc2l6ZSA9PSA4KSA/ICooKGludCAqKXBhcmFtLT5kYXRhICsgMSk6IC0xKTsKIAotICAgIHJldHVybiBtSUVmZmVjdC0+Y29tbWFuZChFRkZFQ1RfQ01EX1NFVF9QQVJBTSwgc2l6ZW9mIChlZmZlY3RfcGFyYW1fdCkgKyBwc2l6ZSwgcGFyYW0sICZzaXplLAotICAgICAgICAgICAgJnBhcmFtLT5zdGF0dXMpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNtZDsKKyAgICBhcHBlbmRUb0J1ZmZlcihwYXJhbSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBzaXplLCAmY21kKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgU3RhdHVzIGJzID0gbUlFZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICBpZiAoIWJzLmlzT2soKSkgeworICAgICAgICBzdGF0dXMgPSBicy50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGFzc2VydChyZXNwb25zZS5zaXplKCkgPT0gc2l6ZW9mKGludCkpOworICAgIG1lbWNweSgmcGFyYW0tPnN0YXR1cywgcmVzcG9uc2UuZGF0YSgpLCByZXNwb25zZS5zaXplKCkpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXRQYXJhbWV0ZXJEZWZlcnJlZChlZmZlY3RfcGFyYW1fdCAqcGFyYW0pCkBAIC0zNjQsOCArNDAxLDE4IEBACiAgICAgaWYgKG1DYmxrLT5jbGllbnRJbmRleCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gICAgcmV0dXJuIG1JRWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCwgMCwgTlVMTCwgJnNpemUsIE5VTEwpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNtZDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgU3RhdHVzIGJzID0gbUlFZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICBpZiAoIWJzLmlzT2soKSkgeworICAgICAgICBzdGF0dXMgPSBicy50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpnZXRQYXJhbWV0ZXIoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKQpAQCAtMzg3LDggKzQzNCwxOCBAQAogICAgIHVpbnQzMl90IHBzaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArICgocGFyYW0tPnBzaXplIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCkgKwogICAgICAgICAgICAgcGFyYW0tPnZzaXplOwogCi0gICAgcmV0dXJuIG1JRWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfR0VUX1BBUkFNLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcGFyYW0tPnBzaXplLCBwYXJhbSwKLSAgICAgICAgICAgICZwc2l6ZSwgcGFyYW0pOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjbWQ7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzcG9uc2U7CisgICAgYXBwZW5kVG9CdWZmZXIocGFyYW0sIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwYXJhbS0+cHNpemUsICZjbWQpOworCisgICAgU3RhdHVzIGJzID0gbUlFZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9HRVRfUEFSQU0sIGNtZCwgcHNpemUsICZyZXNwb25zZSwgJnN0YXR1cyk7CisgICAgaWYgKCFicy5pc09rKCkpIHsKKyAgICAgICAgc3RhdHVzID0gYnMudHJhbnNhY3Rpb25FcnJvcigpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBtZW1jcHkocGFyYW0sIHJlc3BvbnNlLmRhdGEoKSwgcmVzcG9uc2Uuc2l6ZSgpKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiAKQEAgLTQzNiwxOSArNDkzLDE4IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRWZmZWN0Ojpjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlcGx5RGF0YSkKK3ZvaWQgQXVkaW9FZmZlY3Q6OmNvbW1hbmRFeGVjdXRlZChpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlcGx5RGF0YSkKIHsKLSAgICBpZiAoY21kRGF0YSA9PSBOVUxMIHx8IHJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgaWYgKGNtZERhdGEuZW1wdHkoKSB8fCByZXBseURhdGEuZW1wdHkoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYgKG1DYmYgIT0gTlVMTCAmJiBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX1BBUkFNKSB7Ci0gICAgICAgIGVmZmVjdF9wYXJhbV90ICpjbWQgPSAoZWZmZWN0X3BhcmFtX3QgKiljbWREYXRhOwotICAgICAgICBjbWQtPnN0YXR1cyA9ICooaW50MzJfdCAqKXJlcGx5RGF0YTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY21kRGF0YUNvcHkoY21kRGF0YSk7CisgICAgICAgIGVmZmVjdF9wYXJhbV90KiBjbWQgPSByZWludGVycHJldF9jYXN0PGVmZmVjdF9wYXJhbV90ICo+KGNtZERhdGFDb3B5LmRhdGEoKSk7CisgICAgICAgIGNtZC0+c3RhdHVzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCAqPihyZXBseURhdGEuZGF0YSgpKTsKICAgICAgICAgbUNiZihFVkVOVF9QQVJBTUVURVJfQ0hBTkdFRCwgbVVzZXJEYXRhLCBjbWQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAppbmRleCBkZjQ3ZGVmLi5mMDFiMWQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCkBAIC0zNSw2ICszNSwxNSBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKKyNkZWZpbmUgVkFMVUVfT1JfRkFUQUwocmVzdWx0KSAgICAgICAgICAgICAgICAgICBcCisgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGF1dG8gX3RtcCA9IChyZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFfdG1wLm9rKCksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHJlc3VsdCAoJWQpIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RtcC5lcnJvcigpKTsgICAgICAgIFwKKyAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICBcCisgICAgIH0pCisKICNkZWZpbmUgV0FJVF9QRVJJT0RfTVMgICAgICAgICAgMTAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjc5LDcgKzI4OCw4IEBACiAgICAgICAgIG1BdHRyaWJ1dGVzLnNvdXJjZSA9IGlucHV0U291cmNlOwogICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04KICAgICAgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSKSB7Ci0gICAgICAgICAgICBtQXR0cmlidXRlcy5mbGFncyB8PSBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURTsKKyAgICAgICAgICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgfCBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBzdHJlYW0gdHlwZSBzaG91bGRuJ3QgYmUgbG9va2VkIGF0LCB0aGlzIHRyYWNrIGhhcyBhdWRpbyBhdHRyaWJ1dGVzCkBAIC03MzgsMTAgKzc0OCwxMSBAQAogICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0IGlucHV0OwogICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZE91dHB1dCBvdXRwdXQ7CiAgICAgYXVkaW9fc2Vzc2lvbl90IG9yaWdpbmFsU2Vzc2lvbklkOwotICAgIHNwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IHJlY29yZDsKICAgICB2b2lkICppTWVtUG9pbnRlcjsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGs7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtNYXhDcmVhdGVBdHRlbXB0cyA9IDM7CisgICAgaW50MzJfdCByZW1haW5pbmdBdHRlbXB0cyA9IGtNYXhDcmVhdGVBdHRlbXB0czsKIAogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewogICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKQEAgLTgwMywxNSArODE0LDI2IEBACiAgICAgaW5wdXQuc2Vzc2lvbklkID0gbVNlc3Npb25JZDsKICAgICBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CiAKLSAgICByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICBkbyB7CisgICAgICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVSZWNvcmQoVkFMVUVfT1JfRkFUQUwoaW5wdXQudG9BaWRsKCkpLCByZXNwb25zZSk7CisgICAgICAgIG91dHB1dCA9IFZBTFVFX09SX0ZBVEFMKElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZE91dHB1dDo6ZnJvbUFpZGwocmVzcG9uc2UpKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyAhPSBGQUlMRURfVFJBTlNBQ1RJT04gfHwgLS1yZW1haW5pbmdBdHRlbXB0cyA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gRkFJTEVEX1RSQU5TQUNUSU9OIGhhcHBlbnMgdW5kZXIgdmVyeSBzcGVjaWZpYyBjb25kaXRpb25zIGNhdXNpbmcgYSBzdGF0ZSBtaXNtYXRjaAorICAgICAgICAvLyBiZXR3ZWVuIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBhdWRpbyBmbGluZ2VyIGR1cmluZyB0aGUgaW5wdXQgc3RyZWFtIG9wZW4gc2VxdWVuY2UKKyAgICAgICAgLy8gYW5kIGNhbiBiZSByZWNvdmVyZWQgYnkgcmV0cnlpbmcuCisgICAgICAgIC8vIExlYXZlIHRpbWUgZm9yIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZyBhbmQgcmFuZG9taXplIGRlbGF5CisgICAgICAgIC8vIHRvIHJlZHVjZSB0aGUgcHJvYmFiaWxpdHkgb2YgY29uY3VycmVudCByZXRyaWVzIGluIGxvY2tlZCBzdGVwcy4KKyAgICAgICAgdXNsZWVwKCgyMCArIHJhbmQoKSAlIDMwKSAqIDEwMDAwKTsKKyAgICB9IHdoaWxlICgxKTsKIAotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9CiAgICAgQUxPR19BU1NFUlQocmVjb3JkICE9IDApOwogCiAgICAgLy8gQXVkaW9GbGluZ2VyIG5vdyBvd25zIHRoZSByZWZlcmVuY2UgdG8gdGhlIEkvTyBoYW5kbGUsCkBAIC04NzAsNyArODkyLDcgQEAKICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvUmVjb3JkKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQotICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKKyAgICBtQXVkaW9SZWNvcmQgPSBvdXRwdXQuYXVkaW9SZWNvcmQ7CiAgICAgbUNibGtNZW1vcnkgPSBvdXRwdXQuY2JsazsKICAgICBtQnVmZmVyTWVtb3J5ID0gb3V0cHV0LmJ1ZmZlcnM7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwpAQCAtMTA5Miw3ICsxMTE0LDcgQEAKICAgICB9CiAKICAgICBpZiAoc3NpemVfdCh1c2VyU2l6ZSkgPCAwIHx8IChidWZmZXIgPT0gTlVMTCAmJiB1c2VyU2l6ZSAhPSAwKSkgewotICAgICAgICAvLyBzYW5pdHktY2hlY2suIHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKKyAgICAgICAgLy8gVmFsaWRhdGlvbi4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KICAgICAgICAgQUxPR0UoIiVzKCVkKSAoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKQEAgLTEzMTksNyArMTM0MSw3IEBACiAgICAgICAgIG1DYmYoRVZFTlRfTU9SRV9EQVRBLCBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCByZWFkU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKKyAgICAgICAgLy8gVmFsaWRhdGUgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogIEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdChyZWFkU2l6ZSkpOwpAQCAtMTUwOCw3ICsxNTMwLDEzIEBACiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9SZWNvcmQtPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKS50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YT4gbWljczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9SZWNvcmQtPmdldEFjdGl2ZU1pY3JvcGhvbmVzKCZtaWNzKS50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgYWN0aXZlTWljcm9waG9uZXMtPnJlc2l6ZShtaWNzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IHN0YXR1cyA9PSBPSyAmJiBpIDwgbWljcy5zaXplKCk7ICsraSkgeworICAgICAgICBzdGF0dXMgPSBhY3RpdmVNaWNyb3Bob25lcy0+YXQoaSkucmVhZEZyb21QYXJjZWxhYmxlKG1pY3NbaV0pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCA2MzU3ZGE0Li43MmM2NWMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CkBAIC0zMiwxMCArMzMsMTcgQEAKIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCisjZGVmaW5lIFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKHgpIFwKKyAgICAoeyBhdXRvIF90bXAgPSAoeCk7IFwKKyAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoX3RtcC5lcnJvcigpKTsgXAorICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyB9KQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgYmluZGVyOjpTdGF0dXM7CisKIC8vIGNsaWVudCBzaW5nbGV0b24gZm9yIEF1ZGlvRmxpbmdlciBiaW5kZXIgaW50ZXJmYWNlCiBNdXRleCBBdWRpb1N5c3RlbTo6Z0xvY2s7CiBNdXRleCBBdWRpb1N5c3RlbTo6Z0xvY2tFcnJvckNhbGxiYWNrczsKQEAgLTQ3LDggKzU1LDkgQEAKIHJlY29yZF9jb25maWdfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdSZWNvcmRDb25maWdDYWxsYmFjayA9IE5VTEw7CiAKIC8vIFJlcXVpcmVkIHRvIGJlIGhlbGQgd2hpbGUgY2FsbGluZyBpbnRvIGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lci4KK2NsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVySW1wbDsKIE11dGV4IGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lckxvY2s7Ci1zcDxBdWRpb1N5c3RlbTo6Q2FwdHVyZVN0YXRlTGlzdGVuZXI+IGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lciA9IG51bGxwdHI7CitzcDxDYXB0dXJlU3RhdGVMaXN0ZW5lckltcGw+IGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lciA9IG51bGxwdHI7CiAKIC8vIGVzdGFibGlzaCBiaW5kZXIgaW50ZXJmYWNlIHRvIEF1ZGlvRmxpbmdlciBzZXJ2aWNlCiBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKQpAQCAtNjIsNyArNzEsNyBAQAogICAgICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5hdWRpb19mbGluZ2VyIikpOworICAgICAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KElBdWRpb0ZsaW5nZXI6OkRFRkFVTFRfU0VSVklDRV9OQU1FKSk7CiAgICAgICAgICAgICAgICAgaWYgKGJpbmRlciAhPSAwKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9GbGluZ2VyIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKQEAgLTc0LDcgKzgzLDggQEAKICAgICAgICAgICAgICAgICByZXBvcnROb0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0F1ZGlvRmxpbmdlckNsaWVudCk7Ci0gICAgICAgICAgICBnQXVkaW9GbGluZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvRmxpbmdlcj4oYmluZGVyKTsKKyAgICAgICAgICAgIGdBdWRpb0ZsaW5nZXIgPSBuZXcgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcigKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8bWVkaWE6OklBdWRpb0ZsaW5nZXJTZXJ2aWNlPihiaW5kZXIpKTsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ0F1ZGlvRmxpbmdlciA9PSAwKTsKICAgICAgICAgICAgIGFmYyA9IGdBdWRpb0ZsaW5nZXJDbGllbnQ7CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgY2FsbGJhY2tzIGNhbiBiZSByZWNlaXZlZCBieSBnQXVkaW9GbGluZ2VyQ2xpZW50CkBAIC01MjAsMTEgKzUzMCwxNyBAQAogICAgIEFMT0dXKCJBdWRpb0ZsaW5nZXIgc2VydmVyIGRpZWQhIik7CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgaW9EZXNjKSB7CitTdGF0dXMgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6aW9Db25maWdDaGFuZ2VkKAorICAgICAgICBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50IF9ldmVudCwKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yJiBfaW9EZXNjKSB7CisgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0lvQ29uZmlnRXZlbnRfYXVkaW9faW9fY29uZmlnX2V2ZW50KF9ldmVudCkpOworICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MoCisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb0lvRGVzY3JpcHRvcl9BdWRpb0lvRGVzY3JpcHRvcihfaW9EZXNjKSkpOworCiAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIGV2ZW50ICVkIiwgZXZlbnQpOwogCi0gICAgaWYgKGlvRGVzYyA9PSAwIHx8IGlvRGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CisgICAgaWYgKGlvRGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm4gU3RhdHVzOjpvaygpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgc3RkOjp2ZWN0b3I8c3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4+IGNhbGxiYWNrc1RvQ2FsbDsKQEAgLTU4MSw3ICs1OTcsOCBAQAogICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOiB7CiAgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgbW9kaWZ5aW5nIHVua25vd24gb3V0cHV0ISAlZCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgbW9kaWZ5aW5nIHVua25vd24gJXMhICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTYzOCw2ICs2NTUsOCBAQAogICAgICAgICAvLyBJZiBjYWxsYmFja3NUb0NhbGwgaXMgbm90IGVtcHR5LCBpdCBpbXBsaWVzIGlvRGVzYy0+bUlvSGFuZGxlIGFuZCBkZXZpY2VJZCBhcmUgdmFsaWQKICAgICAgICAgY2ItPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKICAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpnZXRJbnB1dEJ1ZmZlclNpemUoCkBAIC0xMzYxLDcgKzEzODAsNyBAQAogICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMsIHJlZ2lzdHJhdGlvbik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CkBAIC0xMzc1LDcgKzEzOTQsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtMTYwMiw3NCArMTYyMSwxNDEgQEAKICAgICByZXR1cm4gYXBzLT5pc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIHJldHVybiBhcHMtPnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHJldHVybiBhcHMtPnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICByZXR1cm4gYXBzLT5yZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7CisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICByZXR1cm4gYXBzLT5nZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZGV2aWNlKTsKKyAgICByZXR1cm4gYXBzLT5nZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFwcy0+YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhcHMtPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXBzLT5jbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhcHMtPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7CiB9CiAKIGNsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVySW1wbCA6IHB1YmxpYyBtZWRpYTo6Qm5DYXB0dXJlU3RhdGVMaXN0ZW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiBwdWJsaWM6CisgICAgQ2FwdHVyZVN0YXRlTGlzdGVuZXJJbXBsKAorICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcywKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpDYXB0dXJlU3RhdGVMaXN0ZW5lcj4mIGxpc3RlbmVyKQorICAgICAgICAgICAgOiBtQXBzKGFwcyksIG1MaXN0ZW5lcihsaXN0ZW5lcikge30KKworICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgYm9vbCBhY3RpdmU7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BcHMtPnJlZ2lzdGVyU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIodGhpcywgJmFjdGl2ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci0+b25TZXJ2aWNlRGllZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lci0+b25TdGF0ZUNoYW5nZWQoYWN0aXZlKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUFwcyktPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIH0KKwogICAgIGJpbmRlcjo6U3RhdHVzIHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkgb3ZlcnJpZGUgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ1NvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyTG9jayk7Ci0gICAgICAgIGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lci0+b25TdGF0ZUNoYW5nZWQoYWN0aXZlKTsKKyAgICAgICAgbUxpc3RlbmVyLT5vblN0YXRlQ2hhbmdlZChhY3RpdmUpOwogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfQogCiAgICAgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+Jikgb3ZlcnJpZGUgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ1NvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyTG9jayk7Ci0gICAgICAgIGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lci0+b25TZXJ2aWNlRGllZCgpOworICAgICAgICBtTGlzdGVuZXItPm9uU2VydmljZURpZWQoKTsKICAgICAgICAgZ1NvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyID0gbnVsbHB0cjsKICAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gTmVlZCB0aGlzIGluIG9yZGVyIHRvIGtlZXAgdGhlIGRlYXRoIHJlY2VpcGVudCBhbGl2ZS4KKyAgICBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBtQXBzOworICAgIHNwPEF1ZGlvU3lzdGVtOjpDYXB0dXJlU3RhdGVMaXN0ZW5lcj4gbUxpc3RlbmVyOwogfTsKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlZ2lzdGVyU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIoCiAgICAgY29uc3Qgc3A8Q2FwdHVyZVN0YXRlTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobGlzdGVuZXIgPT0gbnVsbHB0cik7CisKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0KICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIHNwPENhcHR1cmVTdGF0ZUxpc3RlbmVySW1wbD4gd3JhcHBlciA9IG5ldyBDYXB0dXJlU3RhdGVMaXN0ZW5lckltcGwoKTsKLQogICAgIE11dGV4OjpBdXRvbG9jayBfbChnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXJMb2NrKTsKKyAgICBnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIgPSBuZXcgQ2FwdHVyZVN0YXRlTGlzdGVuZXJJbXBsKGFwcywgbGlzdGVuZXIpOworICAgIGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lci0+aW5pdCgpOwogCi0gICAgYm9vbCBhY3RpdmU7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgYXBzLT5yZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKHdyYXBwZXIsICZhY3RpdmUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbGlzdGVuZXItPm9uU2VydmljZURpZWQoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICBsaXN0ZW5lci0+b25TdGF0ZUNoYW5nZWQoYWN0aXZlKTsKLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihhcHMpOwotICAgIGJpbmRlci0+bGlua1RvRGVhdGgod3JhcHBlcik7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IDMyMTI5ZjAuLjhjNTNjNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0zOCw2ICszOCwxNSBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKKyNkZWZpbmUgVkFMVUVfT1JfRkFUQUwocmVzdWx0KSAgICAgICAgICAgICAgICAgICBcCisgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGF1dG8gX3RtcCA9IChyZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFfdG1wLm9rKCksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHJlc3VsdCAoJWQpIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RtcC5lcnJvcigpKTsgICAgICAgIFwKKyAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICBcCisgICAgIH0pCisKICNkZWZpbmUgV0FJVF9QRVJJT0RfTVMgICAgICAgICAgICAgICAgICAxMAogI2RlZmluZSBXQUlUX1NUUkVBTV9FTkRfVElNRU9VVF9TRUMgICAgIDEyMAogc3RhdGljIGNvbnN0IGludCBrTWF4TG9vcENvdW50Tm90aWZpY2F0aW9ucyA9IDMyOwpAQCAtMjEwLDcgKzIxOSwxMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotQXVkaW9UcmFjazo6QXVkaW9UcmFjaygpCitBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKCkgOiBBdWRpb1RyYWNrKCIiIC8qb3BQYWNrYWdlTmFtZSovKQoreworfQorCitBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1TdGF0ZShTVEFURV9TVE9QUEVEKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKQEAgLTIxOCwxMSArMjMxLDEyIEBACiAgICAgICBtUGF1c2VkUG9zaXRpb24oMCksCiAgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKICAgICAgIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAogICAgICAgbUF1ZGlvVHJhY2tDYWxsYmFjayhuZXcgQXVkaW9UcmFja0NhbGxiYWNrKCkpCiB7CiAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV047CiAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9VTktOT1dOOwotICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gMHgwOworICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gQVVESU9fRkxBR19OT05FOwogICAgIHN0cmNweShtQXR0cmlidXRlcy50YWdzLCAiIik7CiB9CiAKQEAgLTI0NCwxMiArMjU4LDE0IEBACiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCiAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZSkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtU3RhdGUoU1RBVEVfU1RPUFBFRCksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCiAgICAgICBtUGF1c2VkUG9zaXRpb24oMCksCisgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKICAgICAgIG1BdWRpb1RyYWNrQ2FsbGJhY2sobmV3IEF1ZGlvVHJhY2tDYWxsYmFjaygpKQogewogICAgIG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKQEAgLTI3NywxMyArMjkzLDE1IEBACiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKLSAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCkKKyAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpLAogICAgICAgbVN0YXRlKFNUQVRFX1NUT1BQRUQpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLAogICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAogICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAogICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKICAgICAgIG1BdWRpb1RyYWNrQ2FsbGJhY2sobmV3IEF1ZGlvVHJhY2tDYWxsYmFjaygpKQogewogICAgIG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKQEAgLTQ1OCw3ICs0NzYsNyBAQAogICAgIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX0lFQzYxOTM3KSB7IC8vIEhETUkgcGFzcy10aHJvdWdoPwotICAgICAgICBtQXR0cmlidXRlcy5mbGFncyB8PSBBVURJT19PVVRQVVRfRkxBR19JRUM5NThfTk9OQVVESU87CisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPKTsKICAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCkBAIC01MjksNiArNTQ3LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtT2ZmbG9hZEluZm8gPSBOVUxMOwogICAgICAgICBtZW1zZXQoJm1PZmZsb2FkSW5mb0NvcHksIDAsIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5ID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKICAgICB9CiAKICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0gPSAxLjBmOwpAQCAtNjM1LDYgKzY1NCwzNiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKKworc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0KAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY2FsbGJhY2tfdCBjYmYsCisgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAorICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCwKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQoreworICAgIHJldHVybiBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KGNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgdGhyZWFkQ2FuQ2FsbEphdmEsIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgdWlkLCBwaWQsCisgICAgICAgICAgICBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQsIHNlbGVjdGVkRGV2aWNlSWQpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnN0YXJ0KCkKQEAgLTczNSw3ICs3ODQsNyBAQAogICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hbmQofihDQkxLX1NUUkVBTV9FTkRfRE9ORSB8IENCTEtfRElTQUJMRUQpLCAmbUNibGstPm1GbGFncyk7CiAKICAgICBpZiAoIShmbGFncyAmIENCTEtfSU5WQUxJRCkpIHsKLSAgICAgICAgc3RhdHVzID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CisgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgmc3RhdHVzKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgZmxhZ3MgfD0gQ0JMS19JTlZBTElEOwogICAgICAgICB9CkBAIC0xNDI4LDcgKzE0NzcsOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIG1BdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQsICZzdGF0dXMpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgbUF1eEVmZmVjdElkID0gZWZmZWN0SWQ7CiAgICAgfQpAQCAtMTU1NSwxMiArMTYwNSwxMyBAQAogICAgIGlucHV0LnNlbGVjdGVkRGV2aWNlSWQgPSBtU2VsZWN0ZWREZXZpY2VJZDsKICAgICBpbnB1dC5zZXNzaW9uSWQgPSBtU2Vzc2lvbklkOwogICAgIGlucHV0LmF1ZGlvVHJhY2tDYWxsYmFjayA9IG1BdWRpb1RyYWNrQ2FsbGJhY2s7CisgICAgaW5wdXQub3BQYWNrYWdlTmFtZSA9IG1PcFBhY2thZ2VOYW1lOwogCi0gICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tPdXRwdXQgb3V0cHV0OwotCi0gICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICAgIG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlIHJlc3BvbnNlOworICAgIHN0YXR1cyA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlVHJhY2soVkFMVUVfT1JfRkFUQUwoaW5wdXQudG9BaWRsKCkpLCByZXNwb25zZSk7CisgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tPdXRwdXQgb3V0cHV0ID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja091dHB1dDo6ZnJvbUFpZGwoCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKSk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLApAQCAtMTU3MCw3ICsxNjIxLDcgQEAKICAgICAgICAgfQogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQotICAgIEFMT0dfQVNTRVJUKHRyYWNrICE9IDApOworICAgIEFMT0dfQVNTRVJUKG91dHB1dC5hdWRpb1RyYWNrICE9IDApOwogCiAgICAgbUZyYW1lQ291bnQgPSBvdXRwdXQuZnJhbWVDb3VudDsKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gKHVpbnQzMl90KW91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50OwpAQCAtMTU5Miw3ICsxNjQzLDkgQEAKICAgICAvLyBzbyB3ZSBhcmUgbm8gbG9uZ2VyIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQuCiAKICAgICAvLyBGSVhNRSBjb21wYXJlIHRvIEF1ZGlvUmVjb3JkCi0gICAgc3A8SU1lbW9yeT4gaU1lbSA9IHRyYWNrLT5nZXRDYmxrKCk7CisgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4gc2ZyOworICAgIG91dHB1dC5hdWRpb1RyYWNrLT5nZXRDYmxrKCZzZnIpOworICAgIHNwPElNZW1vcnk+IGlNZW0gPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9OdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25fSU1lbW9yeShzZnIpKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKQEAgLTE2MTMsNyArMTY2Niw3IEBACiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1RyYWNrKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQotICAgIG1BdWRpb1RyYWNrID0gdHJhY2s7CisgICAgbUF1ZGlvVHJhY2sgPSBvdXRwdXQuYXVkaW9UcmFjazsKICAgICBtQ2Jsa01lbW9yeSA9IGlNZW07CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCkBAIC0xNjY5LDcgKzE3MjIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOworICAgIG1BdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkLCAmc3RhdHVzKTsKIAogICAgIC8vIElmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQsIGRvbid0IGxldCB0aGUgcmVxdWVzdGVkIGZyYW1lQ291bnQKICAgICAvLyBkZWNyZWFzZS4gIFRoaXMgY2FuIGNvbmZ1c2UgY2xpZW50cyB0aGF0IGNhY2hlIGZyYW1lQ291bnQoKS4KQEAgLTE5MTMsNyArMTk2Niw4IEBACiAgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aGlzKTsKICAgICAgICAgLy8gRklYTUUgaWdub3Jpbmcgc3RhdHVzCi0gICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgmc3RhdHVzKTsKICAgICB9CiB9CiAKQEAgLTE5MzYsNyArMTk5MCw3IEBACiAgICAgfQogCiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKLSAgICAgICAgLy8gU2FuaXR5LWNoZWNrOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCisgICAgICAgIC8vIFZhbGlkYXRpb246IHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCiAgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CkBAIC0yMzI2LDcgKzIzODAsNyBAQAogICAgICAgICAgICAgICAgIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKICAgICAgICAgc2l6ZV90IHdyaXR0ZW5TaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKIAotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQorICAgICAgICAvLyBWYWxpZGF0ZSBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHdyaXR0ZW5TaXplKSA8IDAgfHwgd3JpdHRlblNpemUgPiByZXFTaXplKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKQEAgLTI1MjEsMTEgKzI1NzUsMTcgQEAKICAgICAgICAgICAgIGlmIChzaGFwZXIuaXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgICAgICBvcGVyYXRpb25Ub0VuZC0+c2V0Tm9ybWFsaXplZFRpbWUoMS5mKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoc2hhcGVyLm1Db25maWd1cmF0aW9uLCBvcGVyYXRpb25Ub0VuZCk7CisgICAgICAgICAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgICAgICBzaGFwZXIubUNvbmZpZ3VyYXRpb24tPndyaXRlVG9QYXJjZWxhYmxlKCZjb25maWcpOworICAgICAgICAgICAgbWVkaWE6OlZvbHVtZVNoYXBlck9wZXJhdGlvbiBvcGVyYXRpb247CisgICAgICAgICAgICBvcGVyYXRpb25Ub0VuZC0+d3JpdGVUb1BhcmNlbGFibGUoJm9wZXJhdGlvbik7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlnLCBvcGVyYXRpb24sICZzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfSk7CiAKICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOworICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCZyZXN1bHQpOwogICAgICAgICB9CiAgICAgICAgIC8vIHNlcnZlciByZXNldHMgdG8gemVybyBzbyB3ZSBvZmZzZXQKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQgPQpAQCAtMjU5NSw3ICsyNjU1LDkgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzLmNfc3RyKCksICZzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpCkBAIC0yNjA3LDcgKzI2NjksOSBAQAogICAgIEFMT0dWKCIlcyglZCk6IFByZXNlbnRhdGlvbklkL1Byb2dyYW1JZFslc10iLAogICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogCi0gICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpLmNfc3RyKCksICZzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIFZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvVHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKApAQCAtMjYxNiwxMSArMjY4MCwxNiBAQAogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBtVm9sdW1lSGFuZGxlci0+c2V0SWRJZk5lY2Vzc2FyeShjb25maWd1cmF0aW9uKTsKLSAgICBWb2x1bWVTaGFwZXI6OlN0YXR1cyBzdGF0dXMgPSBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKKyAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgY29uZmlndXJhdGlvbi0+d3JpdGVUb1BhcmNlbGFibGUoJmNvbmZpZyk7CisgICAgbWVkaWE6OlZvbHVtZVNoYXBlck9wZXJhdGlvbiBvcDsKKyAgICBvcGVyYXRpb24tPndyaXRlVG9QYXJjZWxhYmxlKCZvcCk7CisgICAgVm9sdW1lU2hhcGVyOjpTdGF0dXMgc3RhdHVzOworICAgIG1BdWRpb1RyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWcsIG9wLCAmc3RhdHVzKTsKIAogICAgIGlmIChzdGF0dXMgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgaWYgKHJlc3RvcmVUcmFja19sKCJhcHBseVZvbHVtZVNoYXBlciIpID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWcsIG9wLCAmc3RhdHVzKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoc3RhdHVzID49IDApIHsKQEAgLTI2NDAsMTAgKzI3MDksMjAgQEAKIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IEF1ZGlvVHJhY2s6OmdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gc3RhdGUgPSBtQXVkaW9UcmFjay0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQpOworICAgIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OlZvbHVtZVNoYXBlclN0YXRlPiB2c3M7CisgICAgbUF1ZGlvVHJhY2stPmdldFZvbHVtZVNoYXBlclN0YXRlKGlkLCAmdnNzKTsKKyAgICBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBzdGF0ZTsKKyAgICBpZiAodnNzLmhhc192YWx1ZSgpKSB7CisgICAgICAgIHN0YXRlID0gbmV3IFZvbHVtZVNoYXBlcjo6U3RhdGUoKTsKKyAgICAgICAgc3RhdGUtPnJlYWRGcm9tUGFyY2VsYWJsZSh2c3MudmFsdWUoKSk7CisgICAgfQogICAgIGlmIChzdGF0ZS5nZXQoKSA9PSBudWxscHRyICYmIChtQ2Jsay0+bUZsYWdzICYgQ0JMS19JTlZBTElEKSAhPSAwKSB7CiAgICAgICAgIGlmIChyZXN0b3JlVHJhY2tfbCgiZ2V0Vm9sdW1lU2hhcGVyU3RhdGUiKSA9PSBPSykgewotICAgICAgICAgICAgc3RhdGUgPSBtQXVkaW9UcmFjay0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQpOworICAgICAgICAgICAgbUF1ZGlvVHJhY2stPmdldFZvbHVtZVNoYXBlclN0YXRlKGlkLCAmdnNzKTsKKyAgICAgICAgICAgIGlmICh2c3MuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ldyBWb2x1bWVTaGFwZXI6OlN0YXRlKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPnJlYWRGcm9tUGFyY2VsYWJsZSh2c3MudmFsdWUoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXRlOwpAQCAtMjczNyw3ICsyODE2LDExIEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICAvLyB1c2UgQmluZGVyIHRvIGdldCB0aW1lc3RhbXAKLSAgICAgICAgc3RhdHVzID0gbUF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOworICAgICAgICBtZWRpYTo6QXVkaW9UaW1lc3RhbXBJbnRlcm5hbCB0czsKKyAgICAgICAgbUF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCgmdHMsICZzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICB0aW1lc3RhbXAgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9BdWRpb1RpbWVzdGFtcCh0cykpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gcmVhZCB0aW1lc3RhbXAgZnJvbSBzaGFyZWQgbWVtb3J5CiAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIGV0czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggZjFmOGY5Yy4uZTJjOTY5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTkwMCwxMSArOTAwLDggQEAKICAgICB9CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAKLSAgICBpbnQzMl90IGZsdXNoID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaDsKLSAgICBpZiAoZmx1c2ggIT0gbUZsdXNoKSB7Ci0gICAgICAgIC8vIEZJWE1FIHNob3VsZCByZXR1cm4gYW4gYWNjdXJhdGUgdmFsdWUsIGJ1dCBvdmVyLWVzdGltYXRlIGlzIGJldHRlciB0aGFuIHVuZGVyLWVzdGltYXRlCi0gICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKLSAgICB9CisgICAgZmx1c2hCdWZmZXJJZk5lZWRlZCgpOworCiAgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwogICAgIHNzaXplX3QgZmlsbGVkID0gYXVkaW9fdXRpbHM6OnNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDE2ZDIyMzIuLmE3Y2NhNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0yNCwxNTg4ICsyNCwxMTQyIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KICNpbmNsdWRlICJJQXVkaW9GbGluZ2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZW51bSB7Ci0gICAgQ1JFQVRFX1RSQUNLID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBDUkVBVEVfUkVDT1JELAotICAgIFNBTVBMRV9SQVRFLAotICAgIFJFU0VSVkVELCAgIC8vIG9ic29sZXRlLCB3YXMgQ0hBTk5FTF9DT1VOVAotICAgIEZPUk1BVCwKLSAgICBGUkFNRV9DT1VOVCwKLSAgICBMQVRFTkNZLAotICAgIFNFVF9NQVNURVJfVk9MVU1FLAotICAgIFNFVF9NQVNURVJfTVVURSwKLSAgICBNQVNURVJfVk9MVU1FLAotICAgIE1BU1RFUl9NVVRFLAotICAgIFNFVF9TVFJFQU1fVk9MVU1FLAotICAgIFNFVF9TVFJFQU1fTVVURSwKLSAgICBTVFJFQU1fVk9MVU1FLAotICAgIFNUUkVBTV9NVVRFLAotICAgIFNFVF9NT0RFLAotICAgIFNFVF9NSUNfTVVURSwKLSAgICBHRVRfTUlDX01VVEUsCi0gICAgU0VUX1JFQ09SRF9TSUxFTkNFRCwKLSAgICBTRVRfUEFSQU1FVEVSUywKLSAgICBHRVRfUEFSQU1FVEVSUywKLSAgICBSRUdJU1RFUl9DTElFTlQsCi0gICAgR0VUX0lOUFVUQlVGRkVSU0laRSwKLSAgICBPUEVOX09VVFBVVCwKLSAgICBPUEVOX0RVUExJQ0FURV9PVVRQVVQsCi0gICAgQ0xPU0VfT1VUUFVULAotICAgIFNVU1BFTkRfT1VUUFVULAotICAgIFJFU1RPUkVfT1VUUFVULAotICAgIE9QRU5fSU5QVVQsCi0gICAgQ0xPU0VfSU5QVVQsCi0gICAgSU5WQUxJREFURV9TVFJFQU0sCi0gICAgU0VUX1ZPSUNFX1ZPTFVNRSwKLSAgICBHRVRfUkVOREVSX1BPU0lUSU9OLAotICAgIEdFVF9JTlBVVF9GUkFNRVNfTE9TVCwKLSAgICBORVdfQVVESU9fVU5JUVVFX0lELAotICAgIEFDUVVJUkVfQVVESU9fU0VTU0lPTl9JRCwKLSAgICBSRUxFQVNFX0FVRElPX1NFU1NJT05fSUQsCi0gICAgUVVFUllfTlVNX0VGRkVDVFMsCi0gICAgUVVFUllfRUZGRUNULAotICAgIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwKLSAgICBDUkVBVEVfRUZGRUNULAotICAgIE1PVkVfRUZGRUNUUywKLSAgICBMT0FEX0hXX01PRFVMRSwKLSAgICBHRVRfUFJJTUFSWV9PVVRQVVRfU0FNUExJTkdfUkFURSwKLSAgICBHRVRfUFJJTUFSWV9PVVRQVVRfRlJBTUVfQ09VTlQsCi0gICAgU0VUX0xPV19SQU1fREVWSUNFLAotICAgIExJU1RfQVVESU9fUE9SVFMsCi0gICAgR0VUX0FVRElPX1BPUlQsCi0gICAgQ1JFQVRFX0FVRElPX1BBVENILAotICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCi0gICAgTElTVF9BVURJT19QQVRDSEVTLAotICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRywKLSAgICBHRVRfQVVESU9fSFdfU1lOQ19GT1JfU0VTU0lPTiwKLSAgICBTWVNURU1fUkVBRFksCi0gICAgRlJBTUVfQ09VTlRfSEFMLAotICAgIEdFVF9NSUNST1BIT05FUywKLSAgICBTRVRfTUFTVEVSX0JBTEFOQ0UsCi0gICAgR0VUX01BU1RFUl9CQUxBTkNFLAotICAgIFNFVF9FRkZFQ1RfU1VTUEVOREVELAotICAgIFNFVF9BVURJT19IQUxfUElEUwotfTsKK3VzaW5nIGJpbmRlcjo6U3RhdHVzOwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CiAKKyNkZWZpbmUgVkFMVUVfT1JfUkVUVVJOX0JJTkRFUih4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdXRvIF90bXAgPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoX3RtcC5lcnJvcigpKTsgIFwKKyAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgXAorICAgICB9KQogCi1jbGFzcyBCcEF1ZGlvRmxpbmdlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyPgotewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwQXVkaW9GbGluZ2VyKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElBdWRpb0ZsaW5nZXI+KGltcGwpCi0gICAgeworI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICAgXAorICAgICAgIGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgIFwKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjayhjb25zdCBDcmVhdGVUcmFja0lucHV0JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUcmFja091dHB1dCYgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjazsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnB1dC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKLQotICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9UUkFDSywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayB0cmFuc2FjdGlvbiBlcnJvciAlZCIsIGxTdGF0dXMpOwotICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwotICAgICAgICB9Ci0gICAgICAgICpzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKCpzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayByZXR1cm5lZCBlcnJvciAlZCIsICpzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvVHJhY2s+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgIGlmICh0cmFjayA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgcmV0dXJuZWQgYW4gTlVMTCBJQXVkaW9UcmFjayB3aXRoIHN0YXR1cyBPSyIpOwotICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwotICAgICAgICByZXR1cm4gdHJhY2s7CisjZGVmaW5lIFJFVFVSTl9CSU5ERVJfSUZfRVJST1IoeCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdXRvIF90bXAgPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKF90bXAgIT0gT0spIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKF90bXApOyAgXAogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gY3JlYXRlUmVjb3JkKGNvbnN0IENyZWF0ZVJlY29yZElucHV0JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZWNvcmRPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiByZWNvcmQ7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIGlucHV0LndyaXRlVG9QYXJjZWwoJmRhdGEpOwotCi0gICAgICAgIHN0YXR1c190IGxTdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1JFQ09SRCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQgdHJhbnNhY3Rpb24gZXJyb3IgJWQiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICpzdGF0dXMgPSBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgICAgIH0KLSAgICAgICAgKnN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoKnN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZCByZXR1cm5lZCBlcnJvciAlZCIsICpzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlY29yZCA9IGludGVyZmFjZV9jYXN0PG1lZGlhOjpJQXVkaW9SZWNvcmQ+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgIGlmIChyZWNvcmQgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZCByZXR1cm5lZCBhIE5VTEwgSUF1ZGlvUmVjb3JkIHdpdGggc3RhdHVzIE9LIik7Ci0gICAgICAgICAgICAqc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICByZXR1cm4gcmVjb3JkOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVjb3JkOwotICAgIH0KLQotICAgIHZpcnR1YWwgdWludDMyX3Qgc2FtcGxlUmF0ZShhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0FNUExFX1JBVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICAvLyBSRVNFUlZFRCBmb3IgY2hhbm5lbENvdW50KCkKLQotICAgIHZpcnR1YWwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZPUk1BVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIChhdWRpb19mb3JtYXRfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzaXplX3QgZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRlJBTUVfQ09VTlQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTEFURU5DWSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUZsb2F0KHZhbHVlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NQVNURVJfVk9MVU1FLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobXV0ZWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BU1RFUl9NVVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBmbG9hdCBtYXN0ZXJWb2x1bWUoKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1BU1RFUl9WT0xVTUUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkRmxvYXQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFzdGVyTXV0ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUFTVEVSX01VVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlRmxvYXQoYmFsYW5jZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFTVEVSX0JBTEFOQ0UsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHN0YXR1c190IGdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0IG92ZXJyaWRlCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9CQUxBTkNFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICAqYmFsYW5jZSA9IHJlcGx5LnJlYWRGbG9hdCgpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlLAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlRmxvYXQodmFsdWUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfU1RSRUFNX1ZPTFVNRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG11dGVkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9TVFJFQU1fTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgZmxvYXQgc3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUUkVBTV9WT0xVTUUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkRmxvYXQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUUkVBTV9NVVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG1vZGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01PREUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0ZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUlDX01VVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0TWljTXV0ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01JQ19NVVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFJlY29yZFNpbGVuY2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBib29sIHNpbGVuY2VkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaWxlbmNlZCA/IDEgOiAwKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9SRUNPUkRfU0lMRU5DRUQsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBpb0hhbmRsZSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGtleVZhbHVlUGFpcnMpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BBUkFNRVRFUlMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChrZXlzKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QQVJBTUVURVJTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZFN0cmluZzgoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9DTElFTlQsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVEJVRkZFUlNJWkUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQotICAgIHsKLSAgICAgICAgaWYgKG91dHB1dCA9PSBudWxscHRyIHx8IGNvbmZpZyA9PSBudWxscHRyIHx8IGRldmljZSA9PSBudWxscHRyIHx8IGxhdGVuY3lNcyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2R1bGUpOwotICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgIGRhdGEud3JpdGVQYXJjZWxhYmxlKCpkZXZpY2UpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGZsYWdzKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fT1VUUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICAqb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBBTE9HVigib3Blbk91dHB1dCgpIHJldHVybmVkIG91dHB1dCwgJWQiLCAqb3V0cHV0KTsKLSAgICAgICAgcmVwbHkucmVhZChjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOwotICAgICAgICAqbGF0ZW5jeU1zID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dDEpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dDIpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9EVVBMSUNBVEVfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gKGF1ZGlvX2lvX2hhbmRsZV90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENMT1NFX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVVNQRU5EX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRVNUT1JFX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKLSAgICB7Ci0gICAgICAgIGlmIChpbnB1dCA9PSBOVUxMIHx8IGNvbmZpZyA9PSBOVUxMIHx8IGRldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2R1bGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKmlucHV0KTsKLSAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKmRldmljZSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGFkZHJlc3MpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc291cmNlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fSU5QVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICAqaW5wdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJlcGx5LnJlYWQoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKLSAgICAgICAgKmRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlSW5wdXQoaW50IGlucHV0KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGlucHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENMT1NFX0lOUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU5WQUxJREFURV9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVGbG9hdCh2b2x1bWUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZPSUNFX1ZPTFVNRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9SRU5ERVJfUE9TSVRJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChoYWxGcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpoYWxGcmFtZXMgPSB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChkc3BGcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVUX0ZSQU1FU19MT1NULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdXNlKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE5FV19BVURJT19VTklRVUVfSUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcGlkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXVpZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLCBpbnQgcGlkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19TRVNTSU9OX0lELCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFFVRVJZX05VTV9FRkZFQ1RTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudW1FZmZlY3RzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpudW1FZmZlY3RzID0gKHVpbnQzMl90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChRVUVSWV9FRkZFQ1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmVwbHkucmVhZChwRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKHBVdWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOwotICAgICAgICBkYXRhLndyaXRlKHBUeXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKHByZWZlcnJlZFR5cGVGbGFnKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXBseS5yZWFkKHBEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzcDxJRWZmZWN0PiBlZmZlY3Q7Ci0gICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShwRGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKGRhdGEud3JpdGVQYXJjZWxhYmxlKGRldmljZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpzdGF0dXMgPSBOT19JTklUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHBpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwcm9iZSA/IDEgOiAwKTsKLQotICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9FRkZFQ1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlRWZmZWN0IGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaWQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICppZCA9IHRtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGVuYWJsZWQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICplbmFibGVkID0gdG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWZmZWN0ID0gaW50ZXJmYWNlX2Nhc3Q8SUVmZmVjdD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJlcGx5LnJlYWQocERlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlZmZlY3Q7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNyY091dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgZHN0T3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1PVkVfRUZGRUNUUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGVmZmVjdElkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb25JZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdXNwZW5kZWQgPyAxIDogMCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfRUZGRUNUX1NVU1BFTkRFRCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG5hbWUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTE9BRF9IV19NT0RVTEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fbW9kdWxlX2hhbmRsZV90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUklNQVJZX09VVFBVVF9TQU1QTElOR19SQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0UHJpbWFyeU91dHB1dEZyYW1lQ291bnQoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpIG92ZXJyaWRlCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0KLSAgICAgICAgc3RhdGljX2Fzc2VydChOT19FUlJPUiA9PSAwLCAiTk9fRVJST1IgbXVzdCBiZSAwIik7Ci0gICAgICAgIHJldHVybiBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKQotICAgICAgICAgICAgICAgID86IGRhdGEud3JpdGVJbnQzMigoaW50KSBpc0xvd1JhbURldmljZSkKLSAgICAgICAgICAgICAgICA/OiBkYXRhLndyaXRlSW50NjQodG90YWxNZW1vcnkpCi0gICAgICAgICAgICAgICAgPzogcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9MT1dfUkFNX0RFVklDRSwgZGF0YSwgJnJlcGx5KQotICAgICAgICAgICAgICAgID86IHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpCi0gICAgewotICAgICAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKm51bV9wb3J0cyA9PSAwIHx8IHBvcnRzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpudW1fcG9ydHMpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QT1JUUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAotICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgICpudW1fcG9ydHMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXBseS5yZWFkKHBvcnRzLCAqbnVtX3BvcnRzICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQotICAgIHsKLSAgICAgICAgaWYgKHBvcnQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX1BPUlQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKLSAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXBseS5yZWFkKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCi0gICAgewotICAgICAgICBpZiAocGF0Y2ggPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKHBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAotICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJlcGx5LnJlYWQoaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpCi0gICAgewotICAgICAgICBpZiAobnVtX3BhdGNoZXMgPT0gTlVMTCB8fCAqbnVtX3BhdGNoZXMgPT0gMCB8fCBwYXRjaGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpudW1fcGF0Y2hlcyk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BBVENIRVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKLSAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICAqbnVtX3BhdGNoZXMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXBseS5yZWFkKHBhdGNoZXMsICpudW1fcGF0Y2hlcyAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCi0gICAgewotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19QT1JUX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb25JZCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVESU9fSFdfU1lOQ19GT1JfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0hXX1NZTkNfSU5WQUxJRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGF1ZGlvX2h3X3N5bmNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZXR1cm4gcmVtb3RlKCktPnRyYW5zYWN0KFNZU1RFTV9SRUFEWSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgfQotICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lQ291bnRIQUwoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlvSGFuZGxlKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEZSQU1FX0NPVU5UX0hBTCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NSUNST1BIT05FUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAotICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRQYXJjZWxhYmxlVmVjdG9yKG1pY3JvcGhvbmVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChhdXRvIHBpZCA6IHBpZHMpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fSEFMX1BJRFMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9GbGluZ2VyLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9GbGluZ2VyIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5BdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvLyBtYWtlIHN1cmUgdHJhbnNhY3Rpb25zIHJlc2VydmVkIHRvIEF1ZGlvUG9saWN5TWFuYWdlciBkbyBub3QgY29tZSBmcm9tIG90aGVyIHByb2Nlc3NlcwotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOgotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fTVVURToKLSAgICAgICAgY2FzZSBPUEVOX09VVFBVVDoKLSAgICAgICAgY2FzZSBPUEVOX0RVUExJQ0FURV9PVVRQVVQ6Ci0gICAgICAgIGNhc2UgQ0xPU0VfT1VUUFVUOgotICAgICAgICBjYXNlIFNVU1BFTkRfT1VUUFVUOgotICAgICAgICBjYXNlIFJFU1RPUkVfT1VUUFVUOgotICAgICAgICBjYXNlIE9QRU5fSU5QVVQ6Ci0gICAgICAgIGNhc2UgQ0xPU0VfSU5QVVQ6Ci0gICAgICAgIGNhc2UgSU5WQUxJREFURV9TVFJFQU06Ci0gICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRToKLSAgICAgICAgY2FzZSBNT1ZFX0VGRkVDVFM6Ci0gICAgICAgIGNhc2UgU0VUX0VGRkVDVF9TVVNQRU5ERUQ6Ci0gICAgICAgIGNhc2UgTE9BRF9IV19NT0RVTEU6Ci0gICAgICAgIGNhc2UgTElTVF9BVURJT19QT1JUUzoKLSAgICAgICAgY2FzZSBHRVRfQVVESU9fUE9SVDoKLSAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6Ci0gICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDoKLSAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BBVENIRVM6Ci0gICAgICAgIGNhc2UgU0VUX0FVRElPX1BPUlRfQ09ORklHOgotICAgICAgICBjYXNlIFNFVF9SRUNPUkRfU0lMRU5DRUQ6Ci0gICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCi0gICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9SRUNPUkRfU0lMRU5DRUQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfRUZGRUNUX1NVU1BFTkRFRDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb25zIGNvbWUgZnJvbSBzeXN0ZW0gY29tcG9uZW50cwotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIFNFVF9NQVNURVJfVk9MVU1FOgotICAgICAgICBjYXNlIFNFVF9NQVNURVJfTVVURToKLSAgICAgICAgY2FzZSBTRVRfTU9ERToKLSAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6Ci0gICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOgotICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWToKLSAgICAgICAgY2FzZSBTRVRfQVVESU9fSEFMX1BJRFM6IHsKLSAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTWVNURU1fUkVBRFk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+IChJTlZBTElEX09QRVJBVElPTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIFdoaXRlbGlzdCBvZiByZWxldmFudCBldmVudHMgdG8gdHJpZ2dlciBsb2cgbWVyZ2luZy4KLSAgICAvLyBMb2cgbWVyZ2luZyBzaG91bGQgYWN0aXZhdGUgZHVyaW5nIGF1ZGlvIGFjdGl2aXR5IG9mIGFueSBraW5kLiBUaGlzIGFyZSBjb25zaWRlcmVkIHRoZQotICAgIC8vIG1vc3QgcmVsZXZhbnQgZXZlbnRzLgotICAgIC8vIFRPRE8gc2hvdWxkIHNlbGVjdCBtb3JlIHdpc2VseSB0aGUgaXRlbXMgZnJvbSB0aGUgbGlzdAotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIENSRUFURV9UUkFDSzoKLSAgICAgICAgY2FzZSBDUkVBVEVfUkVDT1JEOgotICAgICAgICBjYXNlIFNFVF9NQVNURVJfVk9MVU1FOgotICAgICAgICBjYXNlIFNFVF9NQVNURVJfTVVURToKLSAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6Ci0gICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6Ci0gICAgICAgIGNhc2UgQ1JFQVRFX0VGRkVDVDoKLSAgICAgICAgY2FzZSBTWVNURU1fUkVBRFk6IHsKLSAgICAgICAgICAgIHJlcXVlc3RMb2dNZXJnZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvRmxpbmdlciBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7Ci0gICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKLQotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIENSRUFURV9UUkFDSzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgQ3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKLSAgICAgICAgICAgIGlmIChpbnB1dC5yZWFkRnJvbVBhcmNlbCgoUGFyY2VsKikmZGF0YSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihERUFEX09CSkVDVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgICAgICBDcmVhdGVUcmFja091dHB1dCBvdXRwdXQ7Ci0KLSAgICAgICAgICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjaz0gY3JlYXRlVHJhY2soaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0KLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHRyYWNrICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHRyYWNrKSk7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1JFQVRFX1JFQ09SRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgQ3JlYXRlUmVjb3JkSW5wdXQgaW5wdXQ7Ci0gICAgICAgICAgICBpZiAoaW5wdXQucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoREVBRF9PQkpFQ1QpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICAgICAgQ3JlYXRlUmVjb3JkT3V0cHV0IG91dHB1dDsKLQotICAgICAgICAgICAgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gcmVjb3JkID0gY3JlYXRlUmVjb3JkKGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLQotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigocmVjb3JkICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHJlY29yZCkpOwotICAgICAgICAgICAgb3V0cHV0LndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNBTVBMRV9SQVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNhbXBsZVJhdGUoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIC8vIFJFU0VSVkVEIGZvciBjaGFubmVsQ291bnQoKQotCi0gICAgICAgIGNhc2UgRk9STUFUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGZvcm1hdCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRlJBTUVfQ09VTlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NCggZnJhbWVDb3VudCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgTEFURU5DWTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBsYXRlbmN5KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX1ZPTFVNRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXRNYXN0ZXJWb2x1bWUoZGF0YS5yZWFkRmxvYXQoKSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX01VVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0TWFzdGVyTXV0ZShkYXRhLnJlYWRJbnQzMigpKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIE1BU1RFUl9WT0xVTUU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVGbG9hdCggbWFzdGVyVm9sdW1lKCkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBNQVNURVJfTVVURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBtYXN0ZXJNdXRlKCkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX0JBTEFOQ0U6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0TWFzdGVyQmFsYW5jZShkYXRhLnJlYWRGbG9hdCgpKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9NQVNURVJfQkFMQU5DRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGZsb2F0IGY7Ci0gICAgICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNYXN0ZXJCYWxhbmNlKCZmKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpcmVwbHktPndyaXRlRmxvYXQoZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGZsb2F0IHZvbHVtZSA9IGRhdGEucmVhZEZsb2F0KCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0U3RyZWFtVm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIHZvbHVtZSwgb3V0cHV0KSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fTVVURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNldFN0cmVhbU11dGUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgZGF0YS5yZWFkSW50MzIoKSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fVk9MVU1FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgb3V0cHV0ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUZsb2F0KCBzdHJlYW1Wb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgb3V0cHV0KSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc3RyZWFtTXV0ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9NT0RFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fbW9kZV90IG1vZGUgPSAoYXVkaW9fbW9kZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNldE1vZGUobW9kZSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgc3RhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNldE1pY011dGUoc3RhdGUpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX01JQ19NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGdldE1pY011dGUoKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9SRUNPUkRfU0lMRU5DRUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIHNpbGVuY2VkID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQocG9ydElkLCBzaWxlbmNlZCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyhkYXRhLnJlYWRTdHJpbmc4KCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UGFyYW1ldGVycyhpb0hhbmRsZSwga2V5VmFsdWVQYWlycykpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9QQVJBTUVURVJTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBTdHJpbmc4IGtleXMoZGF0YS5yZWFkU3RyaW5nOCgpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZ2V0UGFyYW1ldGVycyhpb0hhbmRsZSwga2V5cykpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgUkVHSVNURVJfQ0xJRU5UOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvRmxpbmdlckNsaWVudD4oCi0gICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX0lOUFVUQlVGRkVSU0laRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoIGdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIE9QRU5fT1VUUFVUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTA1OTUxIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4gZGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3JCYXNlKEFVRElPX0RFVklDRV9OT05FKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBkYXRhLnJlYWRQYXJjZWxhYmxlKGRldmljZS5nZXQoKSkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpc3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3lNcyA9IDA7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1cyA9IG9wZW5PdXRwdXQobW9kdWxlLCAmb3V0cHV0LCAmY29uZmlnLCBkZXZpY2UsICZsYXRlbmN5TXMsIGZsYWdzKTsKLSAgICAgICAgICAgIEFMT0dWKCJPUEVOX09VVFBVVCBvdXRwdXQsICVkIiwgb3V0cHV0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpb3V0cHV0KTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGF0ZW5jeU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBPUEVOX0RVUExJQ0FURV9PVVRQVVQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MiA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBvcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDEsIG91dHB1dDIpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDTE9TRV9PVVRQVVQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjbG9zZU91dHB1dCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTVVNQRU5EX09VVFBVVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN1c3BlbmRPdXRwdXQoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVTVE9SRV9PVVRQVVQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN0b3JlT3V0cHV0KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIE9QRU5fSU5QVVQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlID0gKGF1ZGlvX21vZHVsZV9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTA1OTUxIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzKGRhdGEucmVhZFN0cmluZzgoKSk7Ci0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlbklucHV0KG1vZHVsZSwgJmlucHV0LCAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGlucHV0KTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDTE9TRV9JTlBVVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNsb3NlSW5wdXQoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5WQUxJREFURV9TVFJFQU06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZmxvYXQgdm9sdW1lID0gZGF0YS5yZWFkRmxvYXQoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXRWb2ljZVZvbHVtZSh2b2x1bWUpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX1JFTkRFUl9QT1NJVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lcyA9IDA7Ci0gICAgICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UmVuZGVyUG9zaXRpb24oJmhhbEZyYW1lcywgJmRzcEZyYW1lcywgb3V0cHV0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFsRnJhbWVzKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkc3BGcmFtZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgR0VUX0lOUFVUX0ZSQU1FU19MT1NUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0SW5wdXRGcmFtZXNMb3N0KGlvSGFuZGxlKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgTkVXX0FVRElPX1VOSVFVRV9JRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG5ld0F1ZGlvVW5pcXVlSWQoKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCkgZGF0YS5yZWFkSW50MzIoKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEFDUVVJUkVfQVVESU9fU0VTU0lPTl9JRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgY29uc3QgcGlkX3QgcGlkID0gKHBpZF90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSAodWlkX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCwgdWlkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1NFU1NJT05fSUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGludCBwaWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBRVUVSWV9OVU1fRUZGRUNUUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpbnVtRWZmZWN0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBRVUVSWV9FRkZFQ1Q6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSB7fTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHF1ZXJ5RWZmZWN0KGRhdGEucmVhZEludDMyKCksICZkZXNjKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgR0VUX0VGRkVDVF9ERVNDUklQVE9SOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkID0ge307Ci0gICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMzk0MTcxODkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZSA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTM5NDE3MTg5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZyA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0ge307Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZ1dWlkLCAmdHlwZSwgcHJlZmVycmVkVHlwZUZsYWcsICZkZXNjKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1JFQVRFX0VGRkVDVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTA1OTUxIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxJRWZmZWN0Q2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJRWZmZWN0Q2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgIGlmICgoc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZSgmZGV2aWNlKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZSA9IGRhdGEucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgICAgICBwaWRfdCBwaWQgPSAocGlkX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7Ci0KLSAgICAgICAgICAgIGludCBpZCA9IDA7Ci0gICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7Ci0KLSAgICAgICAgICAgIHNwPElFZmZlY3Q+IGVmZmVjdCA9IGNyZWF0ZUVmZmVjdCgmZGVzYywgY2xpZW50LCBwcmlvcml0eSwgb3V0cHV0LCBzZXNzaW9uSWQsIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwgcGlkLCBwcm9iZSwgJnN0YXR1cywgJmlkLCAmZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZWZmZWN0KSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGUoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgTU9WRV9FRkZFQ1RTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobW92ZUVmZmVjdHMoc2Vzc2lvbiwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfRUZGRUNUX1NVU1BFTkRFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBlZmZlY3RJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkKGVmZmVjdElkLCBzZXNzaW9uSWQsIHN1c3BlbmRlZCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgTE9BRF9IV19NT0RVTEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihsb2FkSHdNb2R1bGUoZGF0YS5yZWFkQ1N0cmluZygpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX1BSSU1BUllfT1VUUFVUX1NBTVBMSU5HX1JBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9MT1dfUkFNX0RFVklDRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludDMyX3QgaXNMb3dSYW1EZXZpY2U7Ci0gICAgICAgICAgICBpbnQ2NF90IHRvdGFsTWVtb3J5OwotICAgICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkSW50MzIoJmlzTG93UmFtRGV2aWNlKSA/OgotICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRJbnQ2NCgmdG90YWxNZW1vcnkpID86Ci0gICAgICAgICAgICAgICAgICAgIHNldExvd1JhbURldmljZShpc0xvd1JhbURldmljZSAhPSAwLCB0b3RhbE1lbW9yeSk7Ci0gICAgICAgICAgICAodm9pZClyZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7Ci0gICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHMgPSBudW1Qb3J0c1JlcTsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyA9Ci0gICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcG9ydCAqKWNhbGxvYyhudW1Qb3J0c1JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7Ci0gICAgICAgICAgICBpZiAocG9ydHMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUG9ydHMoJm51bVBvcnRzLCBwb3J0cyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUG9ydHMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IG51bVBvcnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gbnVtUG9ydHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwb3J0cywgbnVtUG9ydHNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocG9ydHMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb3J0KCZwb3J0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgICAgICBkYXRhLnJlYWQoJnBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIExJU1RfQVVESU9fUEFUQ0hFUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChudW1QYXRjaGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7Ci0gICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzID0gbnVtUGF0Y2hlc1JlcTsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyA9Ci0gICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcGF0Y2ggKiljYWxsb2MobnVtUGF0Y2hlc1JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7Ci0gICAgICAgICAgICBpZiAocGF0Y2hlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9QYXRjaGVzKCZudW1QYXRjaGVzLCBwYXRjaGVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1QYXRjaGVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IG51bVBhdGNoZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IG51bVBhdGNoZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwYXRjaGVzLCBudW1QYXRjaGVzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShwYXRjaGVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DT05GSUc6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnOwotICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldEF1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX0FVRElPX0hXX1NZTkNfRk9SX1NFU1NJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN5c3RlbVJlYWR5KCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRlJBTUVfQ09VTlRfSEFMOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoIGZyYW1lQ291bnRIQUwoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9NSUNST1BIT05FUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gbWljcm9waG9uZXM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNaWNyb3Bob25lcygmbWljcm9waG9uZXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKG1pY3JvcGhvbmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNFVF9BVURJT19IQUxfUElEUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBpZF90PiBwaWRzOwotICAgICAgICAgICAgaW50MzJfdCBzaXplOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnNpemUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBwaWQ7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZwaWQpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGlkcy5wdXNoX2JhY2socGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldEF1ZGlvSGFsUGlkcyhwaWRzKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQorQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0PiBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja0lucHV0Ojp0b0FpZGwoKSBjb25zdCB7CisgICAgbWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdCBhaWRsOworICAgIGFpZGwuYXR0ciA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoYXR0cikpOworICAgIGFpZGwuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZykpOworICAgIGFpZGwuY2xpZW50SW5mbyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb0NsaWVudChjbGllbnRJbmZvKSk7CisgICAgYWlkbC5zaGFyZWRCdWZmZXIgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfTnVsbGFibGVJTWVtb3J5X1NoYXJlZEZpbGVSZWdpb24oc2hhcmVkQnVmZmVyKSk7CisgICAgYWlkbC5ub3RpZmljYXRpb25zUGVyQnVmZmVyID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90Pihub3RpZmljYXRpb25zUGVyQnVmZmVyKSk7CisgICAgYWlkbC5zcGVlZCA9IHNwZWVkOworICAgIGFpZGwuYXVkaW9UcmFja0NhbGxiYWNrID0gYXVkaW9UcmFja0NhbGxiYWNrOworICAgIGFpZGwub3BQYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7CisgICAgYWlkbC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfbWFzayhmbGFncykpOworICAgIGFpZGwuZnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4oZnJhbWVDb3VudCkpOworICAgIGFpZGwubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obm90aWZpY2F0aW9uRnJhbWVDb3VudCkpOworICAgIGFpZGwuc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChzZWxlY3RlZERldmljZUlkKSk7CisgICAgYWlkbC5zZXNzaW9uSWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbklkKSk7CisgICAgcmV0dXJuIGFpZGw7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnZlcnNpb25SZXN1bHQ8SUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dD4KK0lBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrSW5wdXQ6OmZyb21BaWRsKGNvbnN0IG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QmIGFpZGwpIHsKKyAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja0lucHV0IGxlZ2FjeTsKKyAgICBsZWdhY3kuYXR0ciA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYWlkbC5hdHRyKSk7CisgICAgbGVnYWN5LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChhaWRsLmNvbmZpZykpOworICAgIGxlZ2FjeS5jbGllbnRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ2xpZW50KGFpZGwuY2xpZW50SW5mbykpOworICAgIGxlZ2FjeS5zaGFyZWRCdWZmZXIgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfTnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoYWlkbC5zaGFyZWRCdWZmZXIpKTsKKyAgICBsZWdhY3kubm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5ub3RpZmljYXRpb25zUGVyQnVmZmVyKSk7CisgICAgbGVnYWN5LnNwZWVkID0gYWlkbC5zcGVlZDsKKyAgICBsZWdhY3kuYXVkaW9UcmFja0NhbGxiYWNrID0gYWlkbC5hdWRpb1RyYWNrQ2FsbGJhY2s7CisgICAgbGVnYWN5Lm9wUGFja2FnZU5hbWUgPSBhaWRsLm9wUGFja2FnZU5hbWU7CisgICAgbGVnYWN5LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2F1ZGlvX291dHB1dF9mbGFnc19tYXNrKGFpZGwuZmxhZ3MpKTsKKyAgICBsZWdhY3kuZnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLmZyYW1lQ291bnQpKTsKKyAgICBsZWdhY3kubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwubm90aWZpY2F0aW9uRnJhbWVDb3VudCkpOworICAgIGxlZ2FjeS5zZWxlY3RlZERldmljZUlkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwuc2VsZWN0ZWREZXZpY2VJZCkpOworICAgIGxlZ2FjeS5zZXNzaW9uSWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbC5zZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlPgorSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tPdXRwdXQ6OnRvQWlkbCgpIGNvbnN0IHsKKyAgICBtZWRpYTo6Q3JlYXRlVHJhY2tSZXNwb25zZSBhaWRsOworICAgIGFpZGwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX21hc2soZmxhZ3MpKTsKKyAgICBhaWRsLmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGZyYW1lQ291bnQpKTsKKyAgICBhaWRsLm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KG5vdGlmaWNhdGlvbkZyYW1lQ291bnQpKTsKKyAgICBhaWRsLnNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3Qoc2VsZWN0ZWREZXZpY2VJZCkpOworICAgIGFpZGwuc2Vzc2lvbklkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb25JZCkpOworICAgIGFpZGwuc2FtcGxlUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oc2FtcGxlUmF0ZSkpOworICAgIGFpZGwuYWZGcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihhZkZyYW1lQ291bnQpKTsKKyAgICBhaWRsLmFmU2FtcGxlUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oYWZTYW1wbGVSYXRlKSk7CisgICAgYWlkbC5hZkxhdGVuY3lNcyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oYWZMYXRlbmN5TXMpKTsKKyAgICBhaWRsLm91dHB1dElkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0SWQpKTsKKyAgICBhaWRsLnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QocG9ydElkKSk7CisgICAgYWlkbC5hdWRpb1RyYWNrID0gYXVkaW9UcmFjazsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja091dHB1dD4KK0lBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrT3V0cHV0Ojpmcm9tQWlkbCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2UmIGFpZGwpIHsKKyAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja091dHB1dCBsZWdhY3k7CisgICAgbGVnYWN5LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2F1ZGlvX291dHB1dF9mbGFnc19tYXNrKGFpZGwuZmxhZ3MpKTsKKyAgICBsZWdhY3kuZnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLmZyYW1lQ291bnQpKTsKKyAgICBsZWdhY3kubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwubm90aWZpY2F0aW9uRnJhbWVDb3VudCkpOworICAgIGxlZ2FjeS5zZWxlY3RlZERldmljZUlkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwuc2VsZWN0ZWREZXZpY2VJZCkpOworICAgIGxlZ2FjeS5zZXNzaW9uSWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbC5zZXNzaW9uSWQpKTsKKyAgICBsZWdhY3kuc2FtcGxlUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuc2FtcGxlUmF0ZSkpOworICAgIGxlZ2FjeS5hZkZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5hZkZyYW1lQ291bnQpKTsKKyAgICBsZWdhY3kuYWZTYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5hZlNhbXBsZVJhdGUpKTsKKyAgICBsZWdhY3kuYWZMYXRlbmN5TXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLmFmTGF0ZW5jeU1zKSk7CisgICAgbGVnYWN5Lm91dHB1dElkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5vdXRwdXRJZCkpOworICAgIGxlZ2FjeS5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwucG9ydElkKSk7CisgICAgbGVnYWN5LmF1ZGlvVHJhY2sgPSBhaWRsLmF1ZGlvVHJhY2s7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdD4KK0lBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0Ojp0b0FpZGwoKSBjb25zdCB7CisgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlcXVlc3QgYWlkbDsKKyAgICBhaWRsLmF0dHIgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHIpKTsKKyAgICBhaWRsLmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25maWcpKTsKKyAgICBhaWRsLmNsaWVudEluZm8gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9DbGllbnQoY2xpZW50SW5mbykpOworICAgIGFpZGwub3BQYWNrYWdlTmFtZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcob3BQYWNrYWdlTmFtZSkpOworICAgIGFpZGwucmlpZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdF9pbnQzMl90KHJpaWQpKTsKKyAgICBhaWRsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX21hc2soZmxhZ3MpKTsKKyAgICBhaWRsLmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGZyYW1lQ291bnQpKTsKKyAgICBhaWRsLm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KG5vdGlmaWNhdGlvbkZyYW1lQ291bnQpKTsKKyAgICBhaWRsLnNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3Qoc2VsZWN0ZWREZXZpY2VJZCkpOworICAgIGFpZGwuc2Vzc2lvbklkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb25JZCkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0PgorSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkSW5wdXQ6OmZyb21BaWRsKAorICAgICAgICBjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgYWlkbCkgeworICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0IGxlZ2FjeTsKKyAgICBsZWdhY3kuYXR0ciA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYWlkbC5hdHRyKSk7CisgICAgbGVnYWN5LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLmNvbmZpZykpOworICAgIGxlZ2FjeS5jbGllbnRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ2xpZW50KGFpZGwuY2xpZW50SW5mbykpOworICAgIGxlZ2FjeS5vcFBhY2thZ2VOYW1lID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KGFpZGwub3BQYWNrYWdlTmFtZSkpOworICAgIGxlZ2FjeS5yaWlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdW5pcXVlX2lkX3QoYWlkbC5yaWlkKSk7CisgICAgbGVnYWN5LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2F1ZGlvX2lucHV0X2ZsYWdzX21hc2soYWlkbC5mbGFncykpOworICAgIGxlZ2FjeS5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuZnJhbWVDb3VudCkpOworICAgIGxlZ2FjeS5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5ub3RpZmljYXRpb25GcmFtZUNvdW50KSk7CisgICAgbGVnYWN5LnNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5zZWxlY3RlZERldmljZUlkKSk7CisgICAgbGVnYWN5LnNlc3Npb25JZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsLnNlc3Npb25JZCkpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlPgorSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0Ojp0b0FpZGwoKSBjb25zdCB7CisgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlIGFpZGw7CisgICAgYWlkbC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc19tYXNrKGZsYWdzKSk7CisgICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihmcmFtZUNvdW50KSk7CisgICAgYWlkbC5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90Pihub3RpZmljYXRpb25GcmFtZUNvdW50KSk7CisgICAgYWlkbC5zZWxlY3RlZERldmljZUlkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHNlbGVjdGVkRGV2aWNlSWQpKTsKKyAgICBhaWRsLnNlc3Npb25JZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChzZXNzaW9uSWQpKTsKKyAgICBhaWRsLnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KHNhbXBsZVJhdGUpKTsKKyAgICBhaWRsLmlucHV0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpbnB1dElkKSk7CisgICAgYWlkbC5jYmxrID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX051bGxhYmxlSU1lbW9yeV9TaGFyZWRGaWxlUmVnaW9uKGNibGspKTsKKyAgICBhaWRsLmJ1ZmZlcnMgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfTnVsbGFibGVJTWVtb3J5X1NoYXJlZEZpbGVSZWdpb24oYnVmZmVycykpOworICAgIGFpZGwucG9ydElkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChwb3J0SWQpKTsKKyAgICBhaWRsLmF1ZGlvUmVjb3JkID0gYXVkaW9SZWNvcmQ7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8SUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0PgorSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0Ojpmcm9tQWlkbCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlJiBhaWRsKSB7CisgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0IGxlZ2FjeTsKKyAgICBsZWdhY3kuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfYXVkaW9faW5wdXRfZmxhZ3NfbWFzayhhaWRsLmZsYWdzKSk7CisgICAgbGVnYWN5LmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50KSk7CisgICAgbGVnYWN5Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLm5vdGlmaWNhdGlvbkZyYW1lQ291bnQpKTsKKyAgICBsZWdhY3kuc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLnNlbGVjdGVkRGV2aWNlSWQpKTsKKyAgICBsZWdhY3kuc2Vzc2lvbklkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGFpZGwuc2Vzc2lvbklkKSk7CisgICAgbGVnYWN5LnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnNhbXBsZVJhdGUpKTsKKyAgICBsZWdhY3kuaW5wdXRJZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGwuaW5wdXRJZCkpOworICAgIGxlZ2FjeS5jYmxrID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X051bGxhYmxlU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGFpZGwuY2JsaykpOworICAgIGxlZ2FjeS5idWZmZXJzID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X051bGxhYmxlU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGFpZGwuYnVmZmVycykpOworICAgIGxlZ2FjeS5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwucG9ydElkKSk7CisgICAgbGVnYWN5LmF1ZGlvUmVjb3JkID0gYWlkbC5hdWRpb1JlY29yZDsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyCisKK0F1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OkF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXIoCisgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyU2VydmljZT4gZGVsZWdhdGUpIDogbURlbGVnYXRlKGRlbGVnYXRlKSB7fQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpjcmVhdGVUcmFjayhjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlJiBvdXRwdXQpIHsKKyAgICByZXR1cm4gbURlbGVnYXRlLT5jcmVhdGVUcmFjayhpbnB1dCwgJm91dHB1dCkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpjcmVhdGVSZWNvcmQoY29uc3QgbWVkaWE6OkNyZWF0ZVJlY29yZFJlcXVlc3QmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZSYgb3V0cHV0KSB7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+Y3JlYXRlUmVjb3JkKGlucHV0LCAmb3V0cHV0KS50cmFuc2FjdGlvbkVycm9yKCk7Cit9CisKK3VpbnQzMl90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNhbXBsZVJhdGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+IHsKKyAgICAgICAgaW50MzJfdCBpb0hhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpb0hhbmRsZSkpOworICAgICAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihtRGVsZWdhdGUtPnNhbXBsZVJhdGUoaW9IYW5kbGVBaWRsLCAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCithdWRpb19mb3JtYXRfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpmb3JtYXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2Zvcm1hdF90PiB7CisgICAgICAgIGludDMyX3Qgb3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOworICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+Zm9ybWF0KG91dHB1dEFpZGwsICZhaWRsUmV0KS50cmFuc2FjdGlvbkVycm9yKCkpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbFJldCk7CisgICAgfSgpOworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoQVVESU9fRk9STUFUX0lOVkFMSUQpOworfQorCitzaXplX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6ZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxzaXplX3Q+IHsKKyAgICAgICAgaW50MzJfdCBpb0hhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpb0hhbmRsZSkpOworICAgICAgICBpbnQ2NF90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihtRGVsZWdhdGUtPmZyYW1lQ291bnQoaW9IYW5kbGVBaWRsLCAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwKTsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6bGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+IHsKKyAgICAgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CisgICAgICAgIGludDMyX3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+bGF0ZW5jeShvdXRwdXRBaWRsLCAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpIHsKKyAgICByZXR1cm4gbURlbGVnYXRlLT5zZXRNYXN0ZXJWb2x1bWUodmFsdWUpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0TWFzdGVyTXV0ZShib29sIG11dGVkKSB7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+c2V0TWFzdGVyTXV0ZShtdXRlZCkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitmbG9hdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjptYXN0ZXJWb2x1bWUoKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGZsb2F0PiB7CisgICAgICAgIGZsb2F0IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihtRGVsZWdhdGUtPm1hc3RlclZvbHVtZSgmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGFpZGxSZXQ7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDAuZik7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6bWFzdGVyTXV0ZSgpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8Ym9vbD4geworICAgICAgICBib29sIGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihtRGVsZWdhdGUtPm1hc3Rlck11dGUoJmFpZGxSZXQpLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgICAgIHJldHVybiBhaWRsUmV0OworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgeworICAgIHJldHVybiBtRGVsZWdhdGUtPnNldE1hc3RlckJhbGFuY2UoYmFsYW5jZSkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0KiBiYWxhbmNlKSBjb25zdHsKKyAgICByZXR1cm4gbURlbGVnYXRlLT5nZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKKyAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOworICAgIHJldHVybiBtRGVsZWdhdGUtPnNldFN0cmVhbVZvbHVtZShzdHJlYW1BaWRsLCB2YWx1ZSwgb3V0cHV0QWlkbCkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIG11dGVkKSB7CisgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOworICAgIHJldHVybiBtRGVsZWdhdGUtPnNldFN0cmVhbU11dGUoc3RyZWFtQWlkbCwgbXV0ZWQpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworZmxvYXQgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxmbG9hdD4geworICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOworICAgICAgICBpbnQzMl90IG91dHB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CisgICAgICAgIGZsb2F0IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPnN0cmVhbVZvbHVtZShzdHJlYW1BaWRsLCBvdXRwdXRBaWRsLCAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGFpZGxSZXQ7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDAuZik7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxib29sPiB7CisgICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgICAgIGJvb2wgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+c3RyZWFtTXV0ZShzdHJlYW1BaWRsLCAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGFpZGxSZXQ7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKGZhbHNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIG1lZGlhOjpBdWRpb01vZGUgbW9kZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZGVfdF9BdWRpb01vZGUobW9kZSkpOworICAgIHJldHVybiBtRGVsZWdhdGUtPnNldE1vZGUobW9kZUFpZGwpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+c2V0TWljTXV0ZShzdGF0ZSkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitib29sIEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldE1pY011dGUoKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGJvb2w+IHsKKyAgICAgICAgYm9vbCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5nZXRNaWNNdXRlKCZhaWRsUmV0KS50cmFuc2FjdGlvbkVycm9yKCkpOworICAgICAgICByZXR1cm4gYWlkbFJldDsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoZmFsc2UpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldFJlY29yZFNpbGVuY2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBib29sIHNpbGVuY2VkKSB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBzdGF0dXNfdCB7CisgICAgICAgIGludDMyX3QgcG9ydElkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHBvcnRJZCkpOworICAgICAgICByZXR1cm4gbURlbGVnYXRlLT5zZXRSZWNvcmRTaWxlbmNlZChwb3J0SWRBaWRsLCBzaWxlbmNlZCkudHJhbnNhY3Rpb25FcnJvcigpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgKHZvaWQpIHJlc3VsdDsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgeworICAgIGludDMyX3QgaW9IYW5kbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlvSGFuZGxlKSk7CisgICAgc3RkOjpzdHJpbmcga2V5VmFsdWVQYWlyc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfU3RyaW5nOF9zdHJpbmcoa2V5VmFsdWVQYWlycykpOworICAgIHJldHVybiBtRGVsZWdhdGUtPnNldFBhcmFtZXRlcnMoaW9IYW5kbGVBaWRsLCBrZXlWYWx1ZVBhaXJzQWlkbCkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitTdHJpbmc4IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpCitjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PFN0cmluZzg+IHsKKyAgICAgICAgaW50MzJfdCBpb0hhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpb0hhbmRsZSkpOworICAgICAgICBzdGQ6OnN0cmluZyBrZXlzQWlkbCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9TdHJpbmc4X3N0cmluZyhrZXlzKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPmdldFBhcmFtZXRlcnMoaW9IYW5kbGVBaWRsLCBrZXlzQWlkbCwgJmFpZGxSZXQpLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmc4KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihTdHJpbmc4KCkpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KSB7CisgICAgbURlbGVnYXRlLT5yZWdpc3RlckNsaWVudChjbGllbnQpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHNpemVfdD4geworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihzYW1wbGVSYXRlKSk7CisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBmb3JtYXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGZvcm1hdCkpOworICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGNoYW5uZWxNYXNrKSk7CisgICAgICAgIGludDY0X3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGVBaWRsLCBmb3JtYXRBaWRsLCBjaGFubmVsTWFza0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpZGxSZXQpLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsUmV0KTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoMCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6Om9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlKiByZXNwb25zZSkgeworICAgIHJldHVybiBtRGVsZWdhdGUtPm9wZW5PdXRwdXQocmVxdWVzdCwgcmVzcG9uc2UpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6b3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKSB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2hhbmRsZV90PiB7CisgICAgICAgIGludDMyX3Qgb3V0cHV0MUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQxKSk7CisgICAgICAgIGludDMyX3Qgb3V0cHV0MkFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQyKSk7CisgICAgICAgIGludDMyX3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQxQWlkbCwgb3V0cHV0MkFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpZGxSZXQpLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7CisgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOworICAgIHJldHVybiBtRGVsZWdhdGUtPmNsb3NlT3V0cHV0KG91dHB1dEFpZGwpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKKyAgICBpbnQzMl90IG91dHB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+c3VzcGVuZE91dHB1dChvdXRwdXRBaWRsKS50cmFuc2FjdGlvbkVycm9yKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7CisgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOworICAgIHJldHVybiBtRGVsZWdhdGUtPnJlc3RvcmVPdXRwdXQob3V0cHV0QWlkbCkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpvcGVuSW5wdXQoY29uc3QgbWVkaWE6Ok9wZW5JbnB1dFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlKiByZXNwb25zZSkgeworICAgIHJldHVybiBtRGVsZWdhdGUtPm9wZW5JbnB1dChyZXF1ZXN0LCByZXNwb25zZSkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSB7CisgICAgaW50MzJfdCBpbnB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW5wdXQpKTsKKyAgICByZXR1cm4gbURlbGVnYXRlLT5jbG9zZUlucHV0KGlucHV0QWlkbCkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjppbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOworICAgIHJldHVybiBtRGVsZWdhdGUtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtQWlkbCkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gbURlbGVnYXRlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QqIGhhbEZyYW1lcywgdWludDMyX3QqIGRzcEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgeworICAgIGludDMyX3Qgb3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKKyAgICBtZWRpYTo6UmVuZGVyUG9zaXRpb24gYWlkbFJldDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+Z2V0UmVuZGVyUG9zaXRpb24ob3V0cHV0QWlkbCwgJmFpZGxSZXQpLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgaWYgKGhhbEZyYW1lcyAhPSBudWxscHRyKSB7CisgICAgICAgICpoYWxGcmFtZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbFJldC5oYWxGcmFtZXMpKTsKKyAgICB9CisgICAgaWYgKGRzcEZyYW1lcyAhPSBudWxscHRyKSB7CisgICAgICAgICpkc3BGcmFtZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbFJldC5kc3BGcmFtZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+IHsKKyAgICAgICAgaW50MzJfdCBpb0hhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpb0hhbmRsZSkpOworICAgICAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihtRGVsZWdhdGUtPmdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZUFpZGwsICZhaWRsUmV0KS50cmFuc2FjdGlvbkVycm9yKCkpOworICAgICAgICByZXR1cm4gY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsUmV0KTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoMCk7Cit9CisKK2F1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6Om5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb191bmlxdWVfaWRfdD4geworICAgICAgICBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZSB1c2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3VuaXF1ZV9pZF91c2VfdF9BdWRpb1VuaXF1ZUlkVXNlKHVzZSkpOworICAgICAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihtRGVsZWdhdGUtPm5ld0F1ZGlvVW5pcXVlSWQodXNlQWlkbCwgJmFpZGxSZXQpLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3VuaXF1ZV9pZF90KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgeworICAgIFsmXSgpIC0+IHN0YXR1c190IHsKKyAgICAgICAgaW50MzJfdCBhdWRpb1Nlc3Npb25BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChhdWRpb1Nlc3Npb24pKTsKKyAgICAgICAgaW50MzJfdCBwaWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KHBpZCkpOworICAgICAgICBpbnQzMl90IHVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QodWlkKSk7CisgICAgICAgIHJldHVybiBtRGVsZWdhdGUtPmFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb25BaWRsLCBwaWRBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkQWlkbCkudHJhbnNhY3Rpb25FcnJvcigpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkgeworICAgIFsmXSgpIC0+IHN0YXR1c190IHsKKyAgICAgICAgaW50MzJfdCBhdWRpb1Nlc3Npb25BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChhdWRpb1Nlc3Npb24pKTsKKyAgICAgICAgaW50MzJfdCBwaWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KHBpZCkpOworICAgICAgICByZXR1cm4gbURlbGVnYXRlLT5yZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uQWlkbCwgcGlkQWlkbCkudHJhbnNhY3Rpb25FcnJvcigpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCogbnVtRWZmZWN0cykgY29uc3QgeworICAgIGludDMyX3QgYWlkbFJldDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+cXVlcnlOdW1iZXJFZmZlY3RzKCZhaWRsUmV0KS50cmFuc2FjdGlvbkVycm9yKCkpOworICAgIGlmIChudW1FZmZlY3RzICE9IG51bGxwdHIpIHsKKyAgICAgICAgKm51bUVmZmVjdHMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbFJldCkpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190CitBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIGNvbnN0IHsKKyAgICBpbnQzMl90IGluZGV4QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4KSk7CisgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IgYWlkbFJldDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+cXVlcnlFZmZlY3QoaW5kZXhBaWRsLCAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICBpZiAocERlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAqcERlc2NyaXB0b3IgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0VmZmVjdERlc2NyaXB0b3JfZWZmZWN0X2Rlc2NyaXB0b3JfdChhaWRsUmV0KSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90KiBwRWZmZWN0VVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogcFR5cGVVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIGNvbnN0IHsKKyAgICBtZWRpYTo6QXVkaW9VdWlkIGVmZmVjdFV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoKnBFZmZlY3RVVUlEKSk7CisgICAgbWVkaWE6OkF1ZGlvVXVpZCB0eXBlVXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCgqcFR5cGVVVUlEKSk7CisgICAgaW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KHByZWZlcnJlZFR5cGVGbGFnKSk7CisgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IgYWlkbFJldDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgbURlbGVnYXRlLT5nZXRFZmZlY3REZXNjcmlwdG9yKGVmZmVjdFV1aWRBaWRsLCB0eXBlVXVpZEFpZGwsIHByZWZlcnJlZFR5cGVGbGFnQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICBpZiAocERlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAqcERlc2NyaXB0b3IgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0VmZmVjdERlc2NyaXB0b3JfZWZmZWN0X2Rlc2NyaXB0b3JfdChhaWRsUmV0KSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Y3JlYXRlRWZmZWN0KGNvbnN0IG1lZGlhOjpDcmVhdGVFZmZlY3RSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVFZmZlY3RSZXNwb25zZSogcmVzcG9uc2UpIHsKKyAgICByZXR1cm4gbURlbGVnYXRlLT5jcmVhdGVFZmZlY3QocmVxdWVzdCwgcmVzcG9uc2UpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QKK0F1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6Om1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpIHsKKyAgICBpbnQzMl90IHNlc3Npb25BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChzZXNzaW9uKSk7CisgICAgaW50MzJfdCBzcmNPdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qoc3JjT3V0cHV0KSk7CisgICAgaW50MzJfdCBkc3RPdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoZHN0T3V0cHV0KSk7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+bW92ZUVmZmVjdHMoc2Vzc2lvbkFpZGwsIHNyY091dHB1dEFpZGwsIGRzdE91dHB1dEFpZGwpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSB7CisgICAgWyZdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBpbnQzMl90IGVmZmVjdElkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGVmZmVjdElkKSk7CisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbklkKSk7CisgICAgICAgIHJldHVybiBtRGVsZWdhdGUtPnNldEVmZmVjdFN1c3BlbmRlZChlZmZlY3RJZEFpZGwsIHNlc3Npb25JZEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kZWQpLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorfQorCithdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6bG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbW9kdWxlX2hhbmRsZV90PiB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWVBaWRsKG5hbWUpOworICAgICAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihtRGVsZWdhdGUtPmxvYWRId01vZHVsZShuYW1lQWlkbCwgJmFpZGxSZXQpLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsUmV0KTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoMCk7Cit9CisKK3VpbnQzMl90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKSB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PiB7CisgICAgICAgIGludDMyX3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+Z2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitzaXplX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0UHJpbWFyeU91dHB1dEZyYW1lQ291bnQoKSB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHNpemVfdD4geworICAgICAgICBpbnQ2NF90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihtRGVsZWdhdGUtPmdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCZhaWRsUmV0KS50cmFuc2FjdGlvbkVycm9yKCkpOworICAgICAgICByZXR1cm4gY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkgeworICAgIHJldHVybiBtRGVsZWdhdGUtPnNldExvd1JhbURldmljZShpc0xvd1JhbURldmljZSwgdG90YWxNZW1vcnkpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3KiBwb3J0KSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBwb3J0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF92N19BdWRpb1BvcnQoKnBvcnQpKTsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IGFpZGxSZXQ7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihtRGVsZWdhdGUtPmdldEF1ZGlvUG9ydChwb3J0QWlkbCwgJmFpZGxSZXQpLnRyYW5zYWN0aW9uRXJyb3IoKSk7CisgICAgKnBvcnQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KGFpZGxSZXQpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QqIGhhbmRsZSkgeworICAgIG1lZGlhOjpBdWRpb1BhdGNoIHBhdGNoQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfQXVkaW9QYXRjaCgqcGF0Y2gpKTsKKyAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihtRGVsZWdhdGUtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2hBaWRsLCAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICBpZiAoaGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wYXRjaF9oYW5kbGVfdChhaWRsUmV0KSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgaW50MzJfdCBoYW5kbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9oYW5kbGVfdF9pbnQzMl90KGhhbmRsZSkpOworICAgIHJldHVybiBtRGVsZWdhdGUtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZUFpZGwpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQqIG51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoZXMpIHsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9QYXRjaD4gYWlkbFJldDsKKyAgICBpbnQzMl90IG1heFBhdGNoZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqbnVtX3BhdGNoZXMpKTsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+bGlzdEF1ZGlvUGF0Y2hlcyhtYXhQYXRjaGVzLCAmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICAqbnVtX3BhdGNoZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGFpZGxSZXQuc2l6ZSgpKSk7CisgICAgcmV0dXJuIGNvbnZlcnRSYW5nZShhaWRsUmV0LmJlZ2luKCksIGFpZGxSZXQuZW5kKCksIHBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BhdGNoX2F1ZGlvX3BhdGNoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyogY29uZmlnKSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX0F1ZGlvUG9ydENvbmZpZygqY29uZmlnKSk7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZ0FpZGwpLnRyYW5zYWN0aW9uRXJyb3IoKTsKK30KKworYXVkaW9faHdfc3luY190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2h3X3N5bmNfdD4geworICAgICAgICBpbnQzMl90IHNlc3Npb25JZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbklkKSk7CisgICAgICAgIGludDMyX3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKHNlc3Npb25JZEFpZGwsICZhaWRsUmV0KS50cmFuc2FjdGlvbkVycm9yKCkpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19od19zeW5jX3QoYWlkbFJldCk7CisgICAgfSgpOworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoQVVESU9fSFdfU1lOQ19JTlZBTElEKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c3lzdGVtUmVhZHkoKSB7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+c3lzdGVtUmVhZHkoKS50cmFuc2FjdGlvbkVycm9yKCk7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpmcmFtZUNvdW50SEFMKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHNpemVfdD4geworICAgICAgICBpbnQzMl90IGlvSGFuZGxlQWlkbCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlvSGFuZGxlKSk7CisgICAgICAgIGludDY0X3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+ZnJhbWVDb3VudEhBTChpb0hhbmRsZUFpZGwsICZhaWRsUmV0KS50cmFuc2FjdGlvbkVycm9yKCkpOworICAgICAgICByZXR1cm4gY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitzdGF0dXNfdAorQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogbWljcm9waG9uZXMpIHsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm9EYXRhPiBhaWRsUmV0OworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IobURlbGVnYXRlLT5nZXRNaWNyb3Bob25lcygmYWlkbFJldCkudHJhbnNhY3Rpb25FcnJvcigpKTsKKyAgICBpZiAobWljcm9waG9uZXMgIT0gbnVsbHB0cikgeworICAgICAgICAqbWljcm9waG9uZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPj4oYWlkbFJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6YWlkbDJsZWdhY3lfTWljcm9waG9uZUluZm8pKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcGlkc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4ocGlkcywgbGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdCkpOworICAgIHJldHVybiBtRGVsZWdhdGUtPnNldEF1ZGlvSGFsUGlkcyhwaWRzQWlkbCkudHJhbnNhY3Rpb25FcnJvcigpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXIKK0F1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OkF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXIoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OkRlbGVnYXRlPiYgZGVsZWdhdGUpIDogbURlbGVnYXRlKGRlbGVnYXRlKSB7fQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICByZXR1cm4gbURlbGVnYXRlLT5vblByZVRyYW5zYWN0KHN0YXRpY19jYXN0PERlbGVnYXRlOjpUcmFuc2FjdGlvbkNvZGU+KGNvZGUpLCBkYXRhLCBmbGFncykKKyAgICAgICAgICAgPzogQm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+ZHVtcChmZCwgYXJncyk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpjcmVhdGVUcmFjayhjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmNyZWF0ZVRyYWNrKHJlcXVlc3QsICpfYWlkbF9yZXR1cm4pKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmNyZWF0ZVJlY29yZChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmNyZWF0ZVJlY29yZChyZXF1ZXN0LCAqX2FpZGxfcmV0dXJuKSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzYW1wbGVSYXRlKGludDMyX3QgaW9IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW9IYW5kbGUpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtRGVsZWdhdGUtPnNhbXBsZVJhdGUoaW9IYW5kbGVMZWdhY3kpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmZvcm1hdChpbnQzMl90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KG1EZWxlZ2F0ZS0+Zm9ybWF0KG91dHB1dExlZ2FjeSkpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6ZnJhbWVDb3VudChpbnQzMl90IGlvSGFuZGxlLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGlvSGFuZGxlKSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obURlbGVnYXRlLT5mcmFtZUNvdW50KGlvSGFuZGxlTGVnYWN5KSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpsYXRlbmN5KGludDMyX3Qgb3V0cHV0LCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtRGVsZWdhdGUtPmxhdGVuY3kob3V0cHV0TGVnYWN5KSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnNldE1hc3RlclZvbHVtZSh2YWx1ZSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0TWFzdGVyTXV0ZShib29sIG11dGVkKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRNYXN0ZXJNdXRlKG11dGVkKSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjptYXN0ZXJWb2x1bWUoZmxvYXQqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBtRGVsZWdhdGUtPm1hc3RlclZvbHVtZSgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjptYXN0ZXJNdXRlKGJvb2wqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBtRGVsZWdhdGUtPm1hc3Rlck11dGUoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldE1hc3RlckJhbGFuY2UoZmxvYXQqIF9haWRsX3JldHVybikgeworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+Z2V0TWFzdGVyQmFsYW5jZShfYWlkbF9yZXR1cm4pKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldFN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgZmxvYXQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0KSB7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3Qob3V0cHV0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtTGVnYWN5LCB2YWx1ZSwgb3V0cHV0TGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRTdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSB7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRTdHJlYW1NdXRlKHN0cmVhbUxlZ2FjeSwgbXV0ZWQpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbURlbGVnYXRlLT5zdHJlYW1Wb2x1bWUoc3RyZWFtTGVnYWN5LCBvdXRwdXRMZWdhY3kpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbURlbGVnYXRlLT5zdHJlYW1NdXRlKHN0cmVhbUxlZ2FjeSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldE1vZGUobWVkaWE6OkF1ZGlvTW9kZSBtb2RlKSB7CisgICAgYXVkaW9fbW9kZV90IG1vZGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobW9kZSkpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0TW9kZShtb2RlTGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnNldE1pY011dGUoc3RhdGUpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldE1pY011dGUoYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IG1EZWxlZ2F0ZS0+Z2V0TWljTXV0ZSgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRSZWNvcmRTaWxlbmNlZChpbnQzMl90IHBvcnRJZCwgYm9vbCBzaWxlbmNlZCkgeworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwb3J0SWQpKTsKKyAgICBtRGVsZWdhdGUtPnNldFJlY29yZFNpbGVuY2VkKHBvcnRJZExlZ2FjeSwgc2lsZW5jZWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cworQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0UGFyYW1ldGVycyhpbnQzMl90IGlvSGFuZGxlLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5VmFsdWVQYWlycykgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW9IYW5kbGUpKTsKKyAgICBTdHJpbmc4IGtleVZhbHVlUGFpcnNMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nOChrZXlWYWx1ZVBhaXJzKSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRQYXJhbWV0ZXJzKGlvSGFuZGxlTGVnYWN5LCBrZXlWYWx1ZVBhaXJzTGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRQYXJhbWV0ZXJzKGludDMyX3QgaW9IYW5kbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW9IYW5kbGUpKTsKKyAgICBTdHJpbmc4IGtleXNMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzgoa2V5cykpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfU3RyaW5nOF9zdHJpbmcobURlbGVnYXRlLT5nZXRQYXJhbWV0ZXJzKGlvSGFuZGxlTGVnYWN5LCBrZXlzTGVnYWN5KSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCkgeworICAgIG1EZWxlZ2F0ZS0+cmVnaXN0ZXJDbGllbnQoY2xpZW50KTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0SW5wdXRCdWZmZXJTaXplKGludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzaywgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoY29udmVydEludGVncmFsPHVpbnQzMl90PihzYW1wbGVSYXRlKSk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGZvcm1hdCkpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoY2hhbm5lbE1hc2spKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1EZWxlZ2F0ZS0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGVMZWdhY3ksIGZvcm1hdExlZ2FjeSwgY2hhbm5lbE1hc2tMZWdhY3kpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihzaXplKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6Om9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5vcGVuT3V0cHV0KHJlcXVlc3QsIF9haWRsX3JldHVybikpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6b3BlbkR1cGxpY2F0ZU91dHB1dChpbnQzMl90IG91dHB1dDEsIGludDMyX3Qgb3V0cHV0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDFMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQxKSk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MkxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KG91dHB1dDIpKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCByZXN1bHQgPSBtRGVsZWdhdGUtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MUxlZ2FjeSwgb3V0cHV0MkxlZ2FjeSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Y2xvc2VPdXRwdXQoaW50MzJfdCBvdXRwdXQpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmNsb3NlT3V0cHV0KG91dHB1dExlZ2FjeSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c3VzcGVuZE91dHB1dChpbnQzMl90IG91dHB1dCkgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KG91dHB1dCkpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c3VzcGVuZE91dHB1dChvdXRwdXRMZWdhY3kpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnJlc3RvcmVPdXRwdXQoaW50MzJfdCBvdXRwdXQpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnJlc3RvcmVPdXRwdXQob3V0cHV0TGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpvcGVuSW5wdXQoY29uc3QgbWVkaWE6Ok9wZW5JbnB1dFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5vcGVuSW5wdXQocmVxdWVzdCwgX2FpZGxfcmV0dXJuKSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpjbG9zZUlucHV0KGludDMyX3QgaW5wdXQpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGlucHV0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5jbG9zZUlucHV0KGlucHV0TGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjppbnZhbGlkYXRlU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbUxlZ2FjeSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworU3RhdHVzCitBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRSZW5kZXJQb3NpdGlvbihpbnQzMl90IG91dHB1dCwgbWVkaWE6OlJlbmRlclBvc2l0aW9uKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICB1aW50MzJfdCBoYWxGcmFtZXNMZWdhY3k7CisgICAgdWludDMyX3QgZHNwRnJhbWVzTGVnYWN5OworICAgIFJFVFVSTl9CSU5ERVJfSUZfRVJST1IoCisgICAgICAgICAgICBtRGVsZWdhdGUtPmdldFJlbmRlclBvc2l0aW9uKCZoYWxGcmFtZXNMZWdhY3ksICZkc3BGcmFtZXNMZWdhY3ksIG91dHB1dExlZ2FjeSkpOworICAgIF9haWRsX3JldHVybi0+aGFsRnJhbWVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaGFsRnJhbWVzTGVnYWN5KSk7CisgICAgX2FpZGxfcmV0dXJuLT5kc3BGcmFtZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90Pihkc3BGcmFtZXNMZWdhY3kpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0SW5wdXRGcmFtZXNMb3N0KGludDMyX3QgaW9IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW9IYW5kbGUpKTsKKyAgICB1aW50MzJfdCByZXN1bHQgPSBtRGVsZWdhdGUtPmdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZUxlZ2FjeSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoY29udmVydEludGVncmFsPGludDMyX3Q+KHJlc3VsdCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cworQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6bmV3QXVkaW9VbmlxdWVJZChtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZSB1c2UsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2VMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9VbmlxdWVJZFVzZV9hdWRpb191bmlxdWVfaWRfdXNlX3QodXNlKSk7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmVzdWx0ID0gbURlbGVnYXRlLT5uZXdBdWRpb1VuaXF1ZUlkKHVzZUxlZ2FjeSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIobGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMKK0F1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQzMl90IGF1ZGlvU2Vzc2lvbiwgaW50MzJfdCBwaWQsIGludDMyX3QgdWlkKSB7CisgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbkxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhdWRpb1Nlc3Npb24pKTsKKyAgICBwaWRfdCBwaWRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QocGlkKSk7CisgICAgdWlkX3QgdWlkTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KHVpZCkpOworICAgIG1EZWxlZ2F0ZS0+YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbkxlZ2FjeSwgcGlkTGVnYWN5LCB1aWRMZWdhY3kpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50MzJfdCBhdWRpb1Nlc3Npb24sIGludDMyX3QgcGlkKSB7CisgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbkxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhdWRpb1Nlc3Npb24pKTsKKyAgICBwaWRfdCBwaWRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QocGlkKSk7CisgICAgbURlbGVnYXRlLT5yZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uTGVnYWN5LCBwaWRMZWdhY3kpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpxdWVyeU51bWJlckVmZmVjdHMoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgdWludDMyX3QgcmVzdWx0OworICAgIFJFVFVSTl9CSU5ERVJfSUZfRVJST1IobURlbGVnYXRlLT5xdWVyeU51bWJlckVmZmVjdHMoJnJlc3VsdCkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4ocmVzdWx0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzCitBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpxdWVyeUVmZmVjdChpbnQzMl90IGluZGV4LCBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciogX2FpZGxfcmV0dXJuKSB7CisgICAgdWludDMyX3QgaW5kZXhMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oaW5kZXgpKTsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IHJlc3VsdDsKKyAgICBSRVRVUk5fQklOREVSX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+cXVlcnlFZmZlY3QoaW5kZXhMZWdhY3ksICZyZXN1bHQpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2VmZmVjdF9kZXNjcmlwdG9yX3RfRWZmZWN0RGVzY3JpcHRvcihyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBlZmZlY3RVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IqIF9haWRsX3JldHVybikgeworICAgIGVmZmVjdF91dWlkX3QgZWZmZWN0VXVpZExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGVmZmVjdFVVSUQpKTsKKyAgICBlZmZlY3RfdXVpZF90IHR5cGVVdWlkTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QodHlwZVVVSUQpKTsKKyAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZ0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBjb252ZXJ0UmVpbnRlcnByZXQ8dWludDMyX3Q+KHByZWZlcnJlZFR5cGVGbGFnKSk7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCByZXN1bHQ7CisgICAgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUihtRGVsZWdhdGUtPmdldEVmZmVjdERlc2NyaXB0b3IoJmVmZmVjdFV1aWRMZWdhY3ksICZ0eXBlVXVpZExlZ2FjeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRUeXBlRmxhZ0xlZ2FjeSwgJnJlc3VsdCkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKHJlc3VsdCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpjcmVhdGVFZmZlY3QoY29uc3QgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVFZmZlY3RSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5jcmVhdGVFZmZlY3QocmVxdWVzdCwgX2FpZGxfcmV0dXJuKSk7Cit9CisKK1N0YXR1cworQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6bW92ZUVmZmVjdHMoaW50MzJfdCBzZXNzaW9uLCBpbnQzMl90IHNyY091dHB1dCwgaW50MzJfdCBkc3RPdXRwdXQpIHsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbkxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChzZXNzaW9uKSk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3Qoc3JjT3V0cHV0KSk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoZHN0T3V0cHV0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtRGVsZWdhdGUtPm1vdmVFZmZlY3RzKHNlc3Npb25MZWdhY3ksIHNyY091dHB1dExlZ2FjeSwgZHN0T3V0cHV0TGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50MzJfdCBlZmZlY3RJZCwgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSB7CisgICAgaW50IGVmZmVjdElkTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihjb252ZXJ0UmVpbnRlcnByZXQ8aW50PihlZmZlY3RJZCkpOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3Qoc2Vzc2lvbklkKSk7CisgICAgbURlbGVnYXRlLT5zZXRFZmZlY3RTdXNwZW5kZWQoZWZmZWN0SWRMZWdhY3ksIHNlc3Npb25JZExlZ2FjeSwgc3VzcGVuZGVkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6bG9hZEh3TW9kdWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcmVzdWx0ID0gbURlbGVnYXRlLT5sb2FkSHdNb2R1bGUobmFtZS5jX3N0cigpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtRGVsZWdhdGUtPmdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihtRGVsZWdhdGUtPmdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCkpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkgeworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0TG93UmFtRGV2aWNlKGlzTG93UmFtRGV2aWNlLCB0b3RhbE1lbW9yeSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0QXVkaW9Qb3J0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnQqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3BvcnRfdjcgcG9ydExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcocG9ydCkpOworICAgIFJFVFVSTl9CSU5ERVJfSUZfRVJST1IobURlbGVnYXRlLT5nZXRBdWRpb1BvcnQoJnBvcnRMZWdhY3kpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydChwb3J0TGVnYWN5KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3QgbWVkaWE6OkF1ZGlvUGF0Y2gmIHBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fcGF0Y2ggcGF0Y2hMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X0F1ZGlvUGF0Y2hfYXVkaW9fcGF0Y2gocGF0Y2gpKTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGVMZWdhY3k7CisgICAgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUihtRGVsZWdhdGUtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoTGVnYWN5LCAmaGFuZGxlTGVnYWN5KSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIobGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfaGFuZGxlX3RfaW50MzJfdChoYW5kbGVMZWdhY3kpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goaW50MzJfdCBoYW5kbGUpIHsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wYXRjaF9oYW5kbGVfdChoYW5kbGUpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZUxlZ2FjeSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6bGlzdEF1ZGlvUGF0Y2hlcyhpbnQzMl90IG1heENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BhdGNoPiogX2FpZGxfcmV0dXJuKSB7CisgICAgdW5zaWduZWQgaW50IGNvdW50ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihtYXhDb3VudCkpOworICAgIGNvdW50ID0gc3RkOjptaW4oY291bnQsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oTUFYX0lURU1TX1BFUl9MSVNUKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3BhdGNoW10+IHBhdGNoZXNMZWdhY3kobmV3IGF1ZGlvX3BhdGNoW2NvdW50XSk7CisgICAgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUihtRGVsZWdhdGUtPmxpc3RBdWRpb1BhdGNoZXMoJmNvdW50LCBwYXRjaGVzTGVnYWN5LmdldCgpKSk7CisgICAgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUihjb252ZXJ0UmFuZ2UoJnBhdGNoZXNMZWdhY3lbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2hlc0xlZ2FjeVtjb3VudF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKl9haWRsX3JldHVybiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9BdWRpb1BhdGNoKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBjb25maWcpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBjb25maWdMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnX2F1ZGlvX3BvcnRfY29uZmlnKGNvbmZpZykpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWdMZWdhY3kpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihpbnQzMl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChzZXNzaW9uSWQpKTsKKyAgICBhdWRpb19od19zeW5jX3QgcmVzdWx0ID0gbURlbGVnYXRlLT5nZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oc2Vzc2lvbklkTGVnYWN5KTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihsZWdhY3kyYWlkbF9hdWRpb19od19zeW5jX3RfaW50MzJfdChyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c3lzdGVtUmVhZHkoKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zeXN0ZW1SZWFkeSgpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmZyYW1lQ291bnRIQUwoaW50MzJfdCBpb0hhbmRsZSwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChpb0hhbmRsZSkpOworICAgIHNpemVfdCByZXN1bHQgPSBtRGVsZWdhdGUtPmZyYW1lQ291bnRIQUwoaW9IYW5kbGVMZWdhY3kpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mb0RhdGE+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+IHJlc3VsdExlZ2FjeTsKKyAgICBSRVRVUk5fQklOREVSX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+Z2V0TWljcm9waG9uZXMoJnJlc3VsdExlZ2FjeSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YT4+KAorICAgICAgICAgICAgcmVzdWx0TGVnYWN5LCBtZWRpYTo6bGVnYWN5MmFpZGxfTWljcm9waG9uZUluZm8pKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBwaWRzKSB7CisgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHNMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxwaWRfdD4+KHBpZHMsIGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QpKTsKKyAgICBSRVRVUk5fQklOREVSX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+c2V0QXVkaW9IYWxQaWRzKHBpZHNMZWdhY3kpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2ViN2RjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiSUF1ZGlvRmxpbmdlckNsaWVudCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgSU9fQ09ORklHX0NIQU5HRUQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OCi19OwotCi1jbGFzcyBCcEF1ZGlvRmxpbmdlckNsaWVudCA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyQ2xpZW50PgotewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwQXVkaW9GbGluZ2VyQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElBdWRpb0ZsaW5nZXJDbGllbnQ+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpaW9EZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlKCZpb0Rlc2MtPm1QYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tU2FtcGxpbmdSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGlvRGVzYy0+bUZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpb0Rlc2MtPm1DaGFubmVsTWFzayk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChpb0Rlc2MtPm1GcmFtZUNvdW50KTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KGlvRGVzYy0+bUZyYW1lQ291bnRIQUwpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tTGF0ZW5jeSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpb0Rlc2MtPm1Qb3J0SWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU9fQ09ORklHX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb0ZsaW5nZXJDbGllbnQsICJhbmRyb2lkLm1lZGlhLklBdWRpb0ZsaW5nZXJDbGllbnQiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCbkF1ZGlvRmxpbmdlckNsaWVudDo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaCAoY29kZSkgewotICAgIGNhc2UgSU9fQ09ORklHX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQgPSAoYXVkaW9faW9fY29uZmlnX2V2ZW50KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmaW9EZXNjLT5tUGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKLSAgICAgICAgICAgIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpb0Rlc2MtPm1Gb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpb0Rlc2MtPm1DaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgaW9EZXNjLT5tRnJhbWVDb3VudEhBTCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBpb0Rlc2MtPm1MYXRlbmN5ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlvRGVzYy0+bVBvcnRJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGlvRGVzYyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDYwYWY4NGIuLjdhYzBiMTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9WYWxpZGF0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KQEAgLTExMiwxMyArMTEzLDE4IEBACiAgICAgTU9WRV9FRkZFQ1RTX1RPX0lPLAogICAgIFNFVF9SVFRfRU5BQkxFRCwKICAgICBJU19DQUxMX1NDUkVFTl9NT0RFX1NVUFBPUlRFRCwKLSAgICBTRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKLSAgICBSRU1PVkVfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKLSAgICBHRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKKyAgICBTRVRfREVWSUNFU19ST0xFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAorICAgIFJFTU9WRV9ERVZJQ0VTX1JPTEVfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCisgICAgR0VUX0RFVklDRVNfRk9SX1JPTEVfQU5EX1BST0RVQ1RfU1RSQVRFR1ksCiAgICAgR0VUX0RFVklDRVNfRk9SX0FUVFJJQlVURVMsCiAgICAgQVVESU9fTU9EVUxFU19VUERBVEVELCAgLy8gb25ld2F5CiAgICAgU0VUX0NVUlJFTlRfSU1FX1VJRCwKICAgICBSRUdJU1RFUl9TT1VORFRSSUdHRVJfQ0FQVFVSRV9TVEFURV9MSVNURU5FUiwKKyAgICBTRVRfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwKKyAgICBBRERfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwKKyAgICBSRU1PVkVfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwKKyAgICBDTEVBUl9ERVZJQ0VTX1JPTEVfRk9SX0NBUFRVUkVfUFJFU0VULAorICAgIEdFVF9ERVZJQ0VTX0ZPUl9ST0xFX0FORF9DQVBUVVJFX1BSRVNFVCwKIH07CiAKICNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKQEAgLTUyMyw3ICs1MjksMTEgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZShkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09VVFBVVF9GT1JfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09VVFBVVF9GT1JfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIApAQCAtMTE3MywzMSArMTE4MywxOCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEJvb2woKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1aWQpOwotICAgICAgICBzaXplX3Qgc2l6ZSA9IGRldmljZXMuc2l6ZSgpOwotICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzaXplKTsKLSAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOwotICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ud3JpdGVUb1BhcmNlbCgmZGF0YSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgZmluYWxTaXplLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7Ci0gICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOwotICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmaW5hbFNpemUpOwotICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLndyaXRlUGFyY2VsYWJsZVZlY3RvcihkZXZpY2VzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVUlEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9VSURfREVWSUNFX0FGRklOSVRZLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0KQEAgLTEyMTgsNTEgKzEyMTUsMzcgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdXNlcklkKTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGV2aWNlcy5zaXplKCk7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2l6ZSk7Ci0gICAgICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlc1tpXS53cml0ZVRvUGFyY2VsKCZkYXRhKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsU2l6ZS0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgewotICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZmluYWxTaXplKTsKLSAgICAgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVVNFUklEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdXNlcklkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS53cml0ZVBhcmNlbGFibGVWZWN0b3IoZGV2aWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCkgewotICAgICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdXNlcklkKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVVNFUklEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzZXJJZCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfVVNFUklEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCiAgICAgewpAQCAtMTM4NCwxNyArMTM2NywzMSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEJvb2woKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyYXRlZ3kpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pihyb2xlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEud3JpdGVQYXJjZWxhYmxlVmVjdG9yKGRldmljZXMpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9ERVZJQ0VTX1JPTEVfRk9SX1BST0RVQ1RfU1RSQVRFR1ksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHJhdGVneSkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pihyb2xlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfREVWSUNFU19ST0xFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAogICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTE0MDIsMzEgKzEzOTksMTA4IEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHJhdGVneSkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCi0gICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyYXRlZ3kpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAorICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pihyb2xlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfREVWSUNFU19GT1JfUk9MRV9BTkRfUFJPRFVDVF9TVFJBVEVHWSwKICAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IGRldmljZS5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOworICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGV2aWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXVkaW9Tb3VyY2UpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocm9sZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLndyaXRlUGFyY2VsYWJsZVZlY3RvcihkZXZpY2VzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdWRpb1NvdXJjZSkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pihyb2xlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEud3JpdGVQYXJjZWxhYmxlVmVjdG9yKGRldmljZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdWRpb1NvdXJjZSkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pihyb2xlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEud3JpdGVQYXJjZWxhYmxlVmVjdG9yKGRldmljZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwKKyAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdWRpb1NvdXJjZSkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pihyb2xlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDTEVBUl9ERVZJQ0VTX1JPTEVfRk9SX0NBUFRVUkVfUFJFU0VULAorICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF1ZGlvU291cmNlKSk7CisgICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJvbGUpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9ERVZJQ0VTX0ZPUl9ST0xFX0FORF9DQVBUVVJFX1BSRVNFVCwKKyAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZkZXZpY2VzKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQpAQCAtMTUxNyw2ICsxNTkxLDcgQEAKICAgICAgICAgY2FzZSBSRUdJU1RFUl9FRkZFQ1Q6CiAgICAgICAgIGNhc2UgVU5SRUdJU1RFUl9FRkZFQ1Q6CiAgICAgICAgIGNhc2UgU0VUX0VGRkVDVF9FTkFCTEVEOgorICAgICAgICBjYXNlIEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNOgogICAgICAgICBjYXNlIEdFVF9PVVRQVVRfRk9SX0FUVFI6CiAgICAgICAgIGNhc2UgTU9WRV9FRkZFQ1RTX1RPX0lPOgogICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCIsCkBAIC0xNTQ0LDYgKzE2MTksMTUgQEAKIC8vICAgICAgY2FzZSBTRVRfRk9SQ0VfVVNFOgogICAgICAgICBjYXNlIElOSVRfU1RSRUFNX1ZPTFVNRToKICAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRToKKyAgICAgICAgY2FzZSBTRVRfVk9MVU1FX0FUVFJJQlVURVM6CisgICAgICAgIGNhc2UgR0VUX1NUUkVBTV9WT0xVTUU6CisgICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9BVFRSSUJVVEVTOgorICAgICAgICBjYXNlIEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTOgorICAgICAgICBjYXNlIEdFVF9NQVhfVk9MVU1FX0ZPUl9BVFRSSUJVVEVTOgorICAgICAgICBjYXNlIElTX1NUUkVBTV9BQ1RJVkU6CisgICAgICAgIGNhc2UgSVNfU1RSRUFNX0FDVElWRV9SRU1PVEVMWToKKyAgICAgICAgY2FzZSBJU19TT1VSQ0VfQUNUSVZFOgorICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9TVFJFQU06CiAgICAgICAgIGNhc2UgUkVHSVNURVJfUE9MSUNZX01JWEVTOgogICAgICAgICBjYXNlIFNFVF9NQVNURVJfTU9OTzoKICAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzoKQEAgLTE1NjEsMTUgKzE2NDUsMjAgQEAKICAgICAgICAgY2FzZSBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOgogICAgICAgICBjYXNlIFNFVF9SVFRfRU5BQkxFRDoKICAgICAgICAgY2FzZSBJU19DQUxMX1NDUkVFTl9NT0RFX1NVUFBPUlRFRDoKLSAgICAgICAgY2FzZSBTRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWToKKyAgICAgICAgY2FzZSBTRVRfREVWSUNFU19ST0xFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgogICAgICAgICBjYXNlIFNFVF9TVVBQT1JURURfU1lTVEVNX1VTQUdFUzoKLSAgICAgICAgY2FzZSBSRU1PVkVfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWToKLSAgICAgICAgY2FzZSBHRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWToKKyAgICAgICAgY2FzZSBSRU1PVkVfREVWSUNFU19ST0xFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgorICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9ST0xFX0FORF9QUk9EVUNUX1NUUkFURUdZOgogICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9BVFRSSUJVVEVTOgogICAgICAgICBjYXNlIFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZOgogICAgICAgICBjYXNlIEFVRElPX01PRFVMRVNfVVBEQVRFRDoKICAgICAgICAgY2FzZSBTRVRfQ1VSUkVOVF9JTUVfVUlEOgotICAgICAgICBjYXNlIFJFR0lTVEVSX1NPVU5EVFJJR0dFUl9DQVBUVVJFX1NUQVRFX0xJU1RFTkVSOiB7CisgICAgICAgIGNhc2UgUkVHSVNURVJfU09VTkRUUklHR0VSX0NBUFRVUkVfU1RBVEVfTElTVEVORVI6CisgICAgICAgIGNhc2UgU0VUX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQ6CisgICAgICAgIGNhc2UgQUREX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQ6CisgICAgICAgIGNhc2UgUkVNT1ZFX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQ6CisgICAgICAgIGNhc2UgQ0xFQVJfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVDoKKyAgICAgICAgY2FzZSBHRVRfREVWSUNFU19GT1JfUk9MRV9BTkRfQ0FQVFVSRV9QUkVTRVQ6IHsKICAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCkBAIC0xNjg1LDcgKzE3NzQsNiBAQAogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcygmYXR0cik7CiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CiAgICAgICAgICAgICBib29sIGhhc1N0cmVhbSA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKQEAgLTE3MDMsMTAgKzE3OTEsMTYgQEAKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IDA7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKKworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHIsICI2ODk1Mzk1MCIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0cigmYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwgc2Vzc2lvbiwgJnN0cmVhbSwgcGlkLCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LCBzZXNzaW9uLCAmc3RyZWFtLCBwaWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgc3RhdHVzID0gcmVwbHktPndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0xNzQ1LDggKzE4MzksMTEgQEAKICAgICAgICAgY2FzZSBHRVRfSU5QVVRfRk9SX0FUVFI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHt9OwotICAgICAgICAgICAgZGF0YS5yZWFkKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcygmYXR0cik7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCA9IChhdWRpb191bmlxdWVfaWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7CkBAIC0xNzU5LDkgKzE4NTYsMTMgQEAKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0SW5wdXRGb3JBdHRyKCZhdHRyLCAmaW5wdXQsIHJpaWQsIHNlc3Npb24sIHBpZCwgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKKworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHIsICI2ODk1Mzk1MCIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldElucHV0Rm9yQXR0cigmYXR0ciwgJmlucHV0LCByaWlkLCBzZXNzaW9uLCBwaWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5wdXQpOwpAQCAtMTg0MiwxMSArMTk0MywxNSBAQAogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgZGV2aWNlKSkpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsICIxNjk1NzI2NDEiKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTE4NjAsOCArMTk2NSwxMSBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOwogCiAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgc3RhdHVzID0gZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4LCBkZXZpY2UpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAiMTY5NTcyNjQxIik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4LCBkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHN0YXR1cykpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKICAgICAgICAgICAgIH0KQEAgLTE4NzcsOCArMTk4NSwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgc3RhdHVzID0gZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgIjE2OTU3MjY0MSIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOwogICAgICAgICAgICAgfQpAQCAtMTg5NCw4ICsyMDA1LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICBzdGF0dXMgPSBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAiMTY5NTcyNjQxIik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihzdGF0dXMpKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CiAgICAgICAgICAgICB9CkBAIC0xOTEzLDMxICsyMDI3LDM3IEBACiAgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfRUZGRUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0ge307Ci0gICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZkZXNjLCBzaXplb2YoZGVzYykpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmRlc2MsIHNpemVvZihkZXNjKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MzEyNjEwNiIpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAodm9pZClzYW5pdGl6ZUVmZmVjdERlc2NyaXB0b3IoJmRlc2MpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCZkZXNjKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KG91dHB1dCkpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlRWZmZWN0RGVzY3JpcHRvcihkZXNjLCAiNzMxMjYxMDYiKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCZkZXNjKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4ob3V0cHV0KSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBSRUdJU1RFUl9FRkZFQ1Q6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSB7fTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmRlc2MsIHNpemVvZihkZXNjKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmZGVzYywgc2l6ZW9mKGRlc2MpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjczMTI2MTA2Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICh2b2lkKXNhbml0aXplRWZmZWN0RGVzY3JpcHRvcigmZGVzYyk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgaWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlZ2lzdGVyRWZmZWN0KCZkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVFZmZlY3REZXNjcmlwdG9yKGRlc2MsICI3MzEyNjEwNiIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlZ2lzdGVyRWZmZWN0KCZkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihzdGF0dXMpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMjA0Niw3ICsyMTY2LDExIEBACiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgIjE2OTU3MjY0MSIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMjA4NSwxMCArMjIwOSwxNSBAQAogICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MTIyMDIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb3J0KCZwb3J0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydChwb3J0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRBdWRpb1BvcnQoJnBvcnQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJnBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOwpAQCAtMjA5OSwxMiArMjIyOCwyMCBAQAogICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCA9IHt9OwotICAgICAgICAgICAgZGF0YS5yZWFkKCZwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MTIyMDIiKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmcGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MTIyMDIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9QYXRjaChwYXRjaCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CkBAIC0yMTU0LDkgKzIyOTEsMTQgQEAKICAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DT05GSUc6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnID0ge307Ci0gICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOwotICAgICAgICAgICAgKHZvaWQpc2FuaXRpemVBdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZXRBdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC0yMjMyLDEzICsyMzc0LDI1IEBACiAgICAgICAgIGNhc2UgU1RBUlRfQVVESU9fU09VUkNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZSA9IHt9OwotICAgICAgICAgICAgZGF0YS5yZWFkKCZzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKLSAgICAgICAgICAgICh2b2lkKXNhbml0aXplQXVkaW9Qb3J0Q29uZmlnKCZzb3VyY2UpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydENvbmZpZyhzb3VyY2UpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIC8vIE9LIHRvIG5vdCBhbHdheXMgc2FuaXRpemUgYXR0cmlidXRlcyBhcyBzdGFydEF1ZGlvU291cmNlKCkgaXMgbm90IGNhbGxlZCBpZgorICAgICAgICAgICAgICAgIC8vIHRoZSBwb3J0IGNvbmZpZyBpcyBpbnZhbGlkLgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAiNjg5NTM5NTAiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZwb3J0SWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZwb3J0SWQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0yNDYwLDE1ICsyNjE0LDEyIEBACiAgICAgICAgIGNhc2UgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSAodWlkX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZFBhcmNlbGFibGVWZWN0b3IoJmRldmljZXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC0yNDg0LDE1ICsyNjM1LDEyIEBACiAgICAgICAgIGNhc2UgU0VUX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBjb25zdCBpbnQgdXNlcklkID0gKGludCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiBkZXZpY2VzOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGV2aWNlcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkLCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldFVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkLCBkZXZpY2VzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTI2MjgsNyArMjc3Niw3IEBACiAgICAgICAgIGNhc2UgU0VUX0FMTE9XRURfQ0FQVFVSRV9QT0xJQ1k6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICB1aWRfdCB1aWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWQsIGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0yNjQ5LDMzICsyNzk3LDM2IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIFNFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOiB7CisgICAgICAgIGNhc2UgU0VUX0RFVklDRVNfUk9MRV9GT1JfUFJPRFVDVF9TVFJBVEVHWTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IChwcm9kdWN0X3N0cmF0ZWd5X3QpIGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2UucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpOworICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gKGRldmljZV9yb2xlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGV2aWNlcyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSwgZGV2aWNlcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBSRU1PVkVfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWTogeworICAgICAgICBjYXNlIFJFTU9WRV9ERVZJQ0VTX1JPTEVfRk9SX1BST0RVQ1RfU1RSQVRFR1k6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSAocHJvZHVjdF9zdHJhdGVneV90KSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IChkZXZpY2Vfcm9sZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgR0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1k6IHsKKyAgICAgICAgY2FzZSBHRVRfREVWSUNFU19GT1JfUk9MRV9BTkRfUFJPRFVDVF9TVFJBVEVHWTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IChwcm9kdWN0X3N0cmF0ZWd5X3QpIGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZGV2aWNlKTsKLSAgICAgICAgICAgIHN0YXR1c190IG1hcnNoYWxsX3N0YXR1cyA9IGRldmljZS53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IChkZXZpY2Vfcm9sZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOworICAgICAgICAgICAgc3RhdHVzX3QgbWFyc2hhbGxfc3RhdHVzID0gcmVwbHktPndyaXRlUGFyY2VsYWJsZVZlY3RvcihkZXZpY2VzKTsKICAgICAgICAgICAgIGlmIChtYXJzaGFsbF9zdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbWFyc2hhbGxfc3RhdHVzOwogICAgICAgICAgICAgfQpAQCAtMjc1Nyw0OSArMjkwOCw3NiBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgU0VUX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkVWludDMyKCk7CisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSAoZGV2aWNlX3JvbGVfdCkgZGF0YS5yZWFkVWludDMyKCk7CisgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZkZXZpY2VzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFERF9ERVZJQ0VTX1JPTEVfRk9SX0NBUFRVUkVfUFJFU0VUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gKGRldmljZV9yb2xlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGV2aWNlcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IChkZXZpY2Vfcm9sZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZFBhcmNlbGFibGVWZWN0b3IoJmRldmljZXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQ0xFQVJfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IChkZXZpY2Vfcm9sZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9ST0xFX0FORF9DQVBUVVJFX1BSRVNFVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IChkZXZpY2Vfcm9sZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7CisgICAgICAgICAgICBzdGF0dXNfdCBtYXJzaGFsbF9zdGF0dXMgPSByZXBseS0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKGRldmljZXMpOworICAgICAgICAgICAgaWYgKG1hcnNoYWxsX3N0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBtYXJzaGFsbF9zdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQogfQogCi0vKiogcmV0dXJucyB0cnVlIGlmIHN0cmluZyBvdmVyZmxvdyB3YXMgcHJldmVudGVkIGJ5IHplcm8gdGVybWluYXRpb24gKi8KLXRlbXBsYXRlIDxzaXplX3Qgc2l6ZT4KLXN0YXRpYyBib29sIHByZXZlbnRTdHJpbmdPdmVyZmxvdyhjaGFyICgmcylbc2l6ZV0pIHsKLSAgICBpZiAoc3RybmxlbihzLCBzaXplKSA8IHNpemUpIHJldHVybiBmYWxzZTsKLSAgICBzW3NpemUgLSAxXSA9ICdcMCc7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQm5BdWRpb1BvbGljeVNlcnZpY2U6OnNhbmV0aXplQXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cikKLXsKLSAgICBjb25zdCBzaXplX3QgdGFnc01heFNpemUgPSBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkU7Ci0gICAgaWYgKHN0cm5sZW4oYXR0ci0+dGFncywgdGFnc01heFNpemUpID49IHRhZ3NNYXhTaXplKSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjg5NTM5NTAiKTsgLy8gU2FmZXR5TmV0IGxvZ2dpbmcKLSAgICB9Ci0gICAgYXR0ci0+dGFnc1t0YWdzTWF4U2l6ZSAtIDFdID0gJ1wwJzsKLX0KLQotLyoqIHJldHVybnMgQkFEX1ZBTFVFIGlmIHNhbml0aXphdGlvbiB3YXMgcmVxdWlyZWQuICovCi1zdGF0dXNfdCBCbkF1ZGlvUG9saWN5U2VydmljZTo6c2FuaXRpemVFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2MpCi17Ci0gICAgaWYgKHByZXZlbnRTdHJpbmdPdmVyZmxvdyhkZXNjLT5uYW1lKQotICAgICAgICB8IC8qIGFsd2F5cyAqLyBwcmV2ZW50U3RyaW5nT3ZlcmZsb3coZGVzYy0+aW1wbGVtZW50b3IpKSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzMxMjYxMDYiKTsgLy8gU2FmZXR5TmV0IGxvZ2dpbmcKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKiogcmV0dXJucyBCQURfVkFMVUUgaWYgc2FuaXRpemF0aW9uIHdhcyByZXF1aXJlZC4gKi8KLXN0YXR1c190IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzYW5pdGl6ZUF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIGNvbmZpZykKLXsKLSAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKLSAgICAgICAgcHJldmVudFN0cmluZ092ZXJmbG93KGNvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE5ZTdhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklBdWRpb1RyYWNrIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9UcmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXI7Ci0KLWVudW0gewotICAgIEdFVF9DQkxLID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBTVEFSVCwKLSAgICBTVE9QLAotICAgIEZMVVNILAotICAgIFJFU0VSVkVELCAvLyB3YXMgTVVURQotICAgIFBBVVNFLAotICAgIEFUVEFDSF9BVVhfRUZGRUNULAotICAgIFNFVF9QQVJBTUVURVJTLAotICAgIFNFTEVDVF9QUkVTRU5UQVRJT04sCi0gICAgR0VUX1RJTUVTVEFNUCwKLSAgICBTSUdOQUwsCi0gICAgQVBQTFlfVk9MVU1FX1NIQVBFUiwKLSAgICBHRVRfVk9MVU1FX1NIQVBFUl9TVEFURSwKLX07Ci0KLWNsYXNzIEJwQXVkaW9UcmFjayA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9UcmFjaz4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcEF1ZGlvVHJhY2soY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvVHJhY2s+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0Q2JsaygpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHNwPElNZW1vcnk+IGNibGs7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DQkxLLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChjYmxrICE9IDAgJiYgY2Jsay0+dW5zZWN1cmVQb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2JsazsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coInN0YXJ0KCkgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLXN0YXR1cykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHN0b3AoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9QLCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZMVVNILCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBBVVNFLCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZWZmZWN0SWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQVRUQUNIX0FVWF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImF0dGFjaEF1eEVmZmVjdCgpIGVycm9yOiAlcyIsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChrZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QQVJBTUVURVJTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHByZXNlbnRhdGlvbklkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHByb2dyYW1JZCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRUxFQ1RfUFJFU0VOVEFUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfVElNRVNUQU1QLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lLnR2X3NlYyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZS50dl9uc2VjID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsKCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNJR05BTCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbmZpZ3VyYXRpb24uZ2V0KCkgPT0gbnVsbHB0cgotICAgICAgICAgICAgICAgID8gZGF0YS53cml0ZUludDMyKDApCi0gICAgICAgICAgICAgICAgOiAgZGF0YS53cml0ZUludDMyKDEpCi0gICAgICAgICAgICAgICAgICAgID86IGNvbmZpZ3VyYXRpb24tPndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gVm9sdW1lU2hhcGVyOjpTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1cyA9IG9wZXJhdGlvbi5nZXQoKSA9PSBudWxscHRyCi0gICAgICAgICAgICAgICAgPyBzdGF0dXMgPSBkYXRhLndyaXRlSW50MzIoMCkKLSAgICAgICAgICAgICAgICA6IGRhdGEud3JpdGVJbnQzMigxKQotICAgICAgICAgICAgICAgICAgICA/OiBvcGVyYXRpb24tPndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gVm9sdW1lU2hhcGVyOjpTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgcmVtb3RlVm9sdW1lU2hhcGVyU3RhdHVzOwotICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQVBQTFlfVk9MVU1FX1NIQVBFUiwgZGF0YSwgJnJlcGx5KQotICAgICAgICAgICAgICAgICA/OiByZXBseS5yZWFkSW50MzIoJnJlbW90ZVZvbHVtZVNoYXBlclN0YXR1cyk7Ci0KLSAgICAgICAgcmV0dXJuIFZvbHVtZVNoYXBlcjo6U3RhdHVzKHN0YXR1cyA/OiByZW1vdGVWb2x1bWVTaGFwZXJTdGF0dXMpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfVk9MVU1FX1NIQVBFUl9TVEFURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gc3RhdGUgPSBuZXcgVm9sdW1lU2hhcGVyOjpTdGF0ZTsKLSAgICAgICAgc3RhdHVzID0gc3RhdGUtPnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0ZTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9UcmFjaywgImFuZHJvaWQubWVkaWEuSUF1ZGlvVHJhY2siKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCbkF1ZGlvVHJhY2s6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfQ0JMSzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0Q2JsaygpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBUlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhcnQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRkxVU0g6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZmx1c2goKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBQQVVTRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBwYXVzZSgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQVRUQUNIX0FVWF9FRkZFQ1Q6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYXR0YWNoQXV4RWZmZWN0KGRhdGEucmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpcnMoZGF0YS5yZWFkU3RyaW5nOCgpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycykpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFTEVDVF9QUkVTRU5UQVRJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0UHJlc2VudGF0aW9uKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfVElNRVNUQU1QOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0aW1lc3RhbXAubVBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0aW1lc3RhbXAubVRpbWUudHZfc2VjKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0aW1lc3RhbXAubVRpbWUudHZfbnNlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0lHTkFMOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNpZ25hbCgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEFQUExZX1ZPTFVNRV9TSEFQRVI6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9uOwotICAgICAgICAgICAgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+IG9wZXJhdGlvbjsKLQotICAgICAgICAgICAgaW50MzJfdCBwcmVzZW50OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnByZXNlbnQpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBwcmVzZW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbmZpZ3VyYXRpb24tPnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1cyA/OiBkYXRhLnJlYWRJbnQzMigmcHJlc2VudCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHByZXNlbnQgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9wZXJhdGlvbi0+cmVhZEZyb21QYXJjZWwoJmRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClhcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfVk9MVU1FX1NIQVBFUl9TVEFURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgaWQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmaWQpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IHN0YXRlID0gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0ZS0+d3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lFZmZlY3QuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUVmZmVjdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDdkZmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUVmZmVjdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJJRWZmZWN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gTWF4aW11bSBjb21tYW5kL3JlcGx5IHNpemUgZXhwZWN0ZWQKLSNkZWZpbmUgRUZGRUNUX1BBUkFNX1NJWkVfTUFYICAgICAgIDY1NTM2Ci0KLWVudW0gewotICAgIEVOQUJMRSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgRElTQUJMRSwKLSAgICBDT01NQU5ELAotICAgIERJU0NPTk5FQ1QsCi0gICAgR0VUX0NCTEsKLX07Ci0KLWNsYXNzIEJwRWZmZWN0OiBwdWJsaWMgQnBJbnRlcmZhY2U8SUVmZmVjdD4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcEVmZmVjdChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJRWZmZWN0PihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlbmFibGUoKQotICAgIHsKLSAgICAgICAgQUxPR1YoImVuYWJsZSIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRU5BQkxFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZGlzYWJsZSgpCi0gICAgewotICAgICAgICBBTE9HVigiZGlzYWJsZSIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRElTQUJMRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwUmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJjb21tYW5kIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjbWRDb2RlKTsKLSAgICAgICAgaW50IHNpemUgPSBjbWRTaXplOwotICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOwotICAgICAgICBpZiAoc2l6ZSkgewotICAgICAgICAgICAgZGF0YS53cml0ZShwQ21kRGF0YSwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBSZXBseVNpemUgPT0gTlVMTCkgewotICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplID0gKnBSZXBseVNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDT01NQU5ELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAocFJlcGx5U2l6ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICpwUmVwbHlTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChzaXplICE9IDAgJiYgcFJlcGx5RGF0YSAhPSBOVUxMICYmIHBSZXBseVNpemUgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVwbHkucmVhZChwUmVwbHlEYXRhLCBzaXplKTsKLSAgICAgICAgICAgICpwUmVwbHlTaXplID0gc2l6ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZvaWQgZGlzY29ubmVjdCgpCi0gICAgewotICAgICAgICBBTE9HVigiZGlzY29ubmVjdCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRElTQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0Q2JsaygpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHNwPElNZW1vcnk+IGNibGs7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NCTEssIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGNibGsgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKGNibGsgIT0gMCAmJiBjYmxrLT51bnNlY3VyZVBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYmxrOwotICAgIH0KLSB9OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0LCAiYW5kcm9pZC5tZWRpYS5JRWZmZWN0Iik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5FZmZlY3Q6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBFTkFCTEU6IHsKLSAgICAgICAgICAgIEFMT0dWKCJFTkFCTEUiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmFibGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBESVNBQkxFOiB7Ci0gICAgICAgICAgICBBTE9HVigiRElTQUJMRSIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3QsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRpc2FibGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDT01NQU5EOiB7Ci0gICAgICAgICAgICBBTE9HVigiQ09NTUFORCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3QsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjaGFyICpjbWQgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGNtZFNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY21kU2l6ZSA+IEVGRkVDVF9QQVJBTV9TSVpFX01BWCkgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNtZCA9IChjaGFyICopY2FsbG9jKGNtZFNpemUsIDEpOwotICAgICAgICAgICAgICAgIGlmIChjbWQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRhdGEucmVhZChjbWQsIGNtZFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U3ogPSByZXBseVNpemU7Ci0gICAgICAgICAgICBjaGFyICpyZXNwID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChyZXBseVNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVwbHlTaXplID4gRUZGRUNUX1BBUkFNX1NJWkVfTUFYKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoY21kKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNwID0gKGNoYXIgKiljYWxsb2MocmVwbHlTaXplLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoY21kKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbW1hbmQoY21kQ29kZSwgY21kU2l6ZSwgY21kLCAmcmVwbHlTeiwgcmVzcCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChyZXBseVN6IDwgcmVwbHlTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9IHJlcGx5U3o7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcGx5U2l6ZSkgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocmVzcCwgcmVwbHlTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY21kKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShjbWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc3ApIHsKLSAgICAgICAgICAgICAgICBmcmVlKHJlc3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgRElTQ09OTkVDVDogewotICAgICAgICAgICAgQUxPR1YoIkRJU0NPTk5FQ1QiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfQ0JMSzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3QsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRDYmxrKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUVmZmVjdENsaWVudC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JRWZmZWN0Q2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyYzY3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JRWZmZWN0Q2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIklFZmZlY3RDbGllbnQiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUVmZmVjdENsaWVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIENPTlRST0xfU1RBVFVTX0NIQU5HRUQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIEVOQUJMRV9TVEFUVVNfQ0hBTkdFRCwKLSAgICBDT01NQU5EX0VYRUNVVEVECi19OwotCi1jbGFzcyBCcEVmZmVjdENsaWVudDogcHVibGljIEJwSW50ZXJmYWNlPElFZmZlY3RDbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBFZmZlY3RDbGllbnQoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUVmZmVjdENsaWVudD4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKQotICAgIHsKLSAgICAgICAgQUxPR1YoImNvbnRyb2xTdGF0dXNDaGFuZ2VkIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3RDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpY29udHJvbEdyYW50ZWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OVFJPTF9TVEFUVVNfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgfQotCi0gICAgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJlbmFibGVTdGF0dXNDaGFuZ2VkIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3RDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpZW5hYmxlZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFTkFCTEVfU1RBVFVTX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLQotICAgIHZvaWQgY29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJjb21tYW5kRXhlY3V0ZWQiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdENsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNtZENvZGUpOwotICAgICAgICBpbnQgc2l6ZSA9IGNtZFNpemU7Ci0gICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7Ci0gICAgICAgIGlmIChzaXplKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlKHBDbWREYXRhLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICBzaXplID0gcmVwbHlTaXplOwotICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7Ci0gICAgICAgIGlmIChzaXplKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlKHBSZXBseURhdGEsIHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT01NQU5EX0VYRUNVVEVELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShFZmZlY3RDbGllbnQsICJhbmRyb2lkLm1lZGlhLklFZmZlY3RDbGllbnQiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCbkVmZmVjdENsaWVudDo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIENPTlRST0xfU1RBVFVTX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgIEFMT0dWKCJDT05UUk9MX1NUQVRVU19DSEFOR0VEIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdENsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBoYXNDb250cm9sID0gKGJvb2wpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGhhc0NvbnRyb2wpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEVOQUJMRV9TVEFUVVNfQ0hBTkdFRDogewotICAgICAgICAgICAgQUxPR1YoIkVOQUJMRV9TVEFUVVNfQ0hBTkdFRCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3RDbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgZW5hYmxlZCA9IChib29sKWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBlbmFibGVTdGF0dXNDaGFuZ2VkKGVuYWJsZWQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENPTU1BTkRfRVhFQ1VURUQ6IHsKLSAgICAgICAgICAgIEFMT0dWKCJDT01NQU5EX0VYRUNVVEVEIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdENsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGNoYXIgKmNtZCA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoY21kU2l6ZSkgewotICAgICAgICAgICAgICAgIGNtZCA9IChjaGFyICopbWFsbG9jKGNtZFNpemUpOwotICAgICAgICAgICAgICAgIGRhdGEucmVhZChjbWQsIGNtZFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGNoYXIgKnJlc3AgPSBOVUxMOwotICAgICAgICAgICAgaWYgKHJlcGx5U2l6ZSkgewotICAgICAgICAgICAgICAgIHJlc3AgPSAoY2hhciAqKW1hbGxvYyhyZXBseVNpemUpOwotICAgICAgICAgICAgICAgIGRhdGEucmVhZChyZXNwLCByZXBseVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZFNpemUsIGNtZCwgcmVwbHlTaXplLCByZXNwKTsKLSAgICAgICAgICAgIGlmIChjbWQpIHsKLSAgICAgICAgICAgICAgICBmcmVlKGNtZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzcCkgewotICAgICAgICAgICAgICAgIGZyZWUocmVzcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKaW5kZXggNDgyYjlmYi4uMDM0ZDE2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUwpAQCAtMSwzICsxLDQgQEAKIGdrYXN0ZW5AZ29vZ2xlLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9QbGF5ZXJCYXNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BsYXllckJhc2UuY3BwCmluZGV4IGIwYzY4ZTUuLmM0NDM4NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BsYXllckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BsYXllckJhc2UuY3BwCkBAIC0yMiw3ICsyMiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKK3VzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uOwordXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlck9wZXJhdGlvbjsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogUGxheWVyQmFzZTo6UGxheWVyQmFzZSgpIDogQm5QbGF5ZXIoKSwKQEAgLTE3OCw4ICsxNzksOCBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBQbGF5ZXJCYXNlOjphcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiBfX3VudXNlZCwKLSAgICAgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24gX191bnVzZWQpIHsKKyAgICAgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24gX191bnVzZWQsCisgICAgICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXJPcGVyYXRpb24mIG9wZXJhdGlvbiBfX3VudXNlZCkgewogICAgIEFMT0dXKCJhcHBseVZvbHVtZVNoYXBlcigpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IDA1MGFkNjUuLmVlNzhhMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCkBAIC04NTMsNiArODUzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKICAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCiAgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSU5ESUFfUklOR1RPTkUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyA0NDAsIDQ4MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9UV19SSU5HVE9ORQogfTsKIAogLy8gVXNlZCBieSBUb25lR2VuZXJhdG9yOjpnZXRUb25lRm9yUmVnaW9uKCkgdG8gY29udmVydCB1c2VyIHNwZWNpZmllZCBzdXBlcnZpc29yeSB0b25lIHR5cGUKQEAgLTkzNyw2ICs5NDIsMTYgQEAKICAgICAgICAgICAgIFRPTkVfU1VQX0VSUk9SLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKICAgICAgICAgICAgIFRPTkVfSU5ESUFfQ0FMTF9XQUlUSU5HLCAgICAgLy8gVE9ORV9TVVBfQ0FMTF9XQUlUSU5HCiAgICAgICAgICAgICBUT05FX0lORElBX1JJTkdUT05FICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCisgICAgICAgIH0sCisgICAgICAgIHsgICAvLyBUQUlXQU4KKyAgICAgICAgICAgIFRPTkVfU1VQX0RJQUwsICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRElBTAorICAgICAgICAgICAgVE9ORV9TVVBfQlVTWSwgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9CVVNZCisgICAgICAgICAgICBUT05FX1NVUF9DT05HRVNUSU9OLCAgICAgICAgIC8vIFRPTkVfU1VQX0NPTkdFU1RJT04KKyAgICAgICAgICAgIFRPTkVfU1VQX1JBRElPX0FDSywgICAgICAgICAgLy8gVE9ORV9TVVBfUkFESU9fQUNLCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19OT1RBVkFJTCwgICAgIC8vIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMCisgICAgICAgICAgICBUT05FX1NVUF9FUlJPUiwgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0VSUk9SCisgICAgICAgICAgICBUT05FX1NVUF9DQUxMX1dBSVRJTkcsICAgICAgIC8vIFRPTkVfU1VQX0NBTExfV0FJVElORworICAgICAgICAgICAgVE9ORV9UV19SSU5HVE9ORSAgICAgICAgICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQogICAgICAgICB9CiB9OwogCkBAIC0xMDEwLDYgKzEwMjUsOCBAQAogICAgICAgICBtUmVnaW9uID0gSVJFTEFORDsKICAgICB9IGVsc2UgaWYgKHN0cnN0cih2YWx1ZSwgImluIikgIT0gTlVMTCkgewogICAgICAgICBtUmVnaW9uID0gSU5ESUE7CisgICAgfSBlbHNlIGlmIChzdHJzdHIodmFsdWUsICJ0dyIpICE9IE5VTEwpIHsKKyAgICAgICAgbVJlZ2lvbiA9IFRBSVdBTjsKICAgICB9IGVsc2UgewogICAgICAgICBtUmVnaW9uID0gQ0VQVDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcAppbmRleCAwYTkxNGZjLi5lNTcxODM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAKQEAgLTEwNiwxMSArMTA2LDE3IEBACiAKIAogYmluZGVyOjpTdGF0dXMgVHJhY2tQbGF5ZXJCYXNlOjphcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAotICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyT3BlcmF0aW9uJiBvcGVyYXRpb24pIHsKIAotICAgIHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4gc3BDb25maWd1cmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLSAgICBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4gc3BPcGVyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24ob3BlcmF0aW9uKTsKKyAgICBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+IHNwQ29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKTsKKyAgICBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4gc3BPcGVyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24oKTsKKworICAgIHN0YXR1c190IHMgPSBzcENvbmZpZ3VyYXRpb24tPnJlYWRGcm9tUGFyY2VsYWJsZShjb25maWd1cmF0aW9uKQorICAgICAgICAgICAgPzogc3BPcGVyYXRpb24tPnJlYWRGcm9tUGFyY2VsYWJsZShvcGVyYXRpb24pOworICAgIGlmIChzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1Qocyk7CisgICAgfQogCiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgQUxPR0QoIlRyYWNrUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoKSBmcm9tIElQbGF5ZXIiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5ZGYwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29udGVudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1VzYWdlOworCisvKioKKyAqIFRoZSAiSW50ZXJuYWwiIHN1ZmZpeCBvZiB0aGlzIHR5cGUgbmFtZSBpcyB0byBkaXNhbWJpZ3VhdGUgaXQgZnJvbSB0aGUKKyAqIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzIFNESyB0eXBlLgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIHsKKyAgICBBdWRpb0NvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOworICAgIEF1ZGlvVXNhZ2UgdXNhZ2U7CisgICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZTsKKyAgICAvLyBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvRmxhZy4KKyAgICBpbnQgZmxhZ3M7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgdGFnczsgLyogVVRGOCAqLworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ2xpZW50LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9DbGllbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZmMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ2xpZW50LmFpZGwKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9DbGllbnQgeworICAgIC8qKiBJbnRlcnByZXRlZCBhcyB1aWRfdC4gKi8KKyAgICBpbnQgY2xpZW50VWlkOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBwaWRfdC4gKi8KKyAgICBpbnQgY2xpZW50UGlkOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBwaWRfdC4gKi8KKyAgICBpbnQgY2xpZW50VGlkOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIHBhY2thZ2VOYW1lOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGM5N2QzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9PZmZsb2FkSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Db25maWcgeworICAgIGludCBzYW1wbGVSYXRlOworICAgIC8qKgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LgorICAgICAqIFRPRE8oeXRhaSk6IENyZWF0ZSBhIGRlc2lnbmF0ZWQgdHlwZS4KKyAgICAgKi8KKyAgICBpbnQgY2hhbm5lbE1hc2s7CisgICAgQXVkaW9Gb3JtYXQgZm9ybWF0OworICAgIEF1ZGlvT2ZmbG9hZEluZm8gb2ZmbG9hZEluZm87CisgICAgbG9uZyBmcmFtZUNvdW50OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTNjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWdCYXNlLmFpZGwKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb0NvbmZpZ0Jhc2UgeworICAgIGludCBzYW1wbGVSYXRlOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4gKi8KKyAgICBpbnQgY2hhbm5lbE1hc2s7CisgICAgQXVkaW9Gb3JtYXQgZm9ybWF0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29udGVudFR5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbnRlbnRUeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNGZiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbnRlbnRUeXBlLmFpZGwKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvQ29udGVudFR5cGUgeworICAgIFVOS05PV04gPSAwLAorICAgIFNQRUVDSCA9IDEsCisgICAgTVVTSUMgPSAyLAorICAgIE1PVklFID0gMywKKyAgICBTT05JRklDQVRJT04gPSA0LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjAwNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9EZXZpY2UgeworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19kZXZpY2VzX3QuICovCisgICAgaW50IHR5cGU7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgYWRkcmVzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNhZGZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlIHsKKyAgICBOT05FID0gMCwKKyAgICBGUkFNRVdPUktfVFVORVIgPSAxLAorICAgIERWQl9BRF9ERVNDUklQVE9SID0gMiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDRlODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSB7CisgICAgIE5PTkUgPSAwLAorICAgICBFTEVNRU5UQVJZX1NUUkVBTSA9IDEsCisgICAgIEhBTkRMRSA9IDIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiNDkzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0ZsYWcuYWlkbApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvRmxhZyB7CisgICAgQVVESUJJTElUWV9FTkZPUkNFRCA9IDAsCisgICAgU0VDVVJFID0gMSwKKyAgICBTQ08gPSAyLAorICAgIEJFQUNPTiA9IDMsCisgICAgSFdfQVZfU1lOQyA9IDQsCisgICAgSFdfSE9UV09SRCA9IDUsCisgICAgQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1kgPSA2LAorICAgIEJZUEFTU19NVVRFID0gNywKKyAgICBMT1dfTEFURU5DWSA9IDgsCisgICAgREVFUF9CVUZGRVIgPSA5LAorICAgIE5PX01FRElBX1BST0pFQ1RJT04gPSAxMCwKKyAgICBNVVRFX0hBUFRJQyA9IDExLAorICAgIE5PX1NZU1RFTV9DQVBUVVJFID0gMTIsCisgICAgQ0FQVFVSRV9QUklWQVRFID0gMTMsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4YjI5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uYWlkbApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb0dhaW4geworICAgIGludCBpbmRleDsKKyAgICBib29sZWFuIHVzZUluQ2hhbm5lbE1hc2s7CisgICAgYm9vbGVhbiB1c2VGb3JWb2x1bWU7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9HYWluTW9kZS4gKi8KKyAgICBpbnQgbW9kZTsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QuICovCisgICAgaW50IGNoYW5uZWxNYXNrOworICAgIGludCBtaW5WYWx1ZTsKKyAgICBpbnQgbWF4VmFsdWU7CisgICAgaW50IGRlZmF1bHRWYWx1ZTsKKyAgICBpbnQgc3RlcFZhbHVlOworICAgIGludCBtaW5SYW1wTXM7CisgICAgaW50IG1heFJhbXBNczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Db25maWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Db25maWcuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTNjMmRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpbkNvbmZpZy5haWRsCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvR2FpbkNvbmZpZyB7CisgICAgLyoqIEluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvX2dhaW4gaW4gdGhlIGF1ZGlvX3BvcnQgZ2FpbnNbXSB0YWJsZS4gKi8KKyAgICBpbnQgaW5kZXg7CisKKyAgICAvKiogTW9kZSByZXF1ZXN0ZWQgZm9yIHRoaXMgY29tbWFuZC4gQml0ZmllbGQgaW5kZXhlZCBieSBBdWRpb0dhaW5Nb2RlLiAqLworICAgIGludCBtb2RlOworCisgICAgLyoqCisgICAgICogQ2hhbm5lbHMgd2hpY2ggZ2FpbiB2YWx1ZSBmb2xsb3dzLiBOL0EgaW4gam9pbnQgbW9kZS4KKyAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4KKyAgICAgKi8KKyAgICBpbnQgY2hhbm5lbE1hc2s7CisKKyAgICAvKioKKyAgICAgKiBHYWluIHZhbHVlcyBpbiBtaWxsaWJlbHMuCisgICAgICogRm9yIGVhY2ggY2hhbm5lbCBvcmRlcmVkIGZyb20gTFNiIHRvIE1TYiBpbiBjaGFubmVsIG1hc2suIFRoZSBudW1iZXIgb2YgdmFsdWVzIGlzIDEgaW4gam9pbnQKKyAgICAgKiBtb2RlLCBvdGhlcndpc2UgZXF1YWxzIHRoZSBudW1iZXIgb2YgYml0cyBpbXBsaWVkIGJ5IGNoYW5uZWxNYXNrLgorICAgICAqLworICAgIGludFtdICB2YWx1ZXM7CisKKyAgICAvKiogUmFtcCBkdXJhdGlvbiBpbiBtcy4gKi8KKyAgICBpbnQgcmFtcER1cmF0aW9uTXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluTW9kZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWI5ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuYWlkbApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvR2Fpbk1vZGUgeworICAgIEpPSU5UICAgID0gMCwKKyAgICBDSEFOTkVMUyA9IDEsCisgICAgUkFNUCAgICAgPSAyLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYzBlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9JbnB1dEZsYWdzLmFpZGwKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb0lucHV0RmxhZ3MgeworICAgIEZBU1QgICAgICAgPSAwLAorICAgIEhXX0hPVFdPUkQgPSAxLAorICAgIFJBVyAgICAgICAgPSAyLAorICAgIFNZTkMgICAgICAgPSAzLAorICAgIE1NQVBfTk9JUlEgPSA0LAorICAgIFZPSVBfVFggICAgPSA1LAorICAgIEhXX0FWX1NZTkMgPSA2LAorICAgIERJUkVDVCAgICAgPSA3LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9Db25maWdFdmVudC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9Db25maWdFdmVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjIzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0NvbmZpZ0V2ZW50LmFpZGwKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvSW9Db25maWdFdmVudCB7CisgICAgT1VUUFVUX1JFR0lTVEVSRUQgPSAwLAorICAgIE9VVFBVVF9PUEVORUQgPSAxLAorICAgIE9VVFBVVF9DTE9TRUQgPSAyLAorICAgIE9VVFBVVF9DT05GSUdfQ0hBTkdFRCA9IDMsCisgICAgSU5QVVRfUkVHSVNURVJFRCA9IDQsCisgICAgSU5QVVRfT1BFTkVEID0gNSwKKyAgICBJTlBVVF9DTE9TRUQgPSA2LAorICAgIElOUFVUX0NPTkZJR19DSEFOR0VEID0gNywKKyAgICBDTElFTlRfU1RBUlRFRCA9IDgsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NmVmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuYWlkbApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BhdGNoOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb0lvRGVzY3JpcHRvciB7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBpb0hhbmRsZTsKKyAgICBBdWRpb1BhdGNoIHBhdGNoOworICAgIGludCBzYW1wbGluZ1JhdGU7CisgICAgQXVkaW9Gb3JtYXQgZm9ybWF0OworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4gKi8KKyAgICBpbnQgY2hhbm5lbE1hc2s7CisgICAgbG9uZyBmcmFtZUNvdW50OworICAgIGxvbmcgZnJhbWVDb3VudEhBTDsKKyAgICAvKiogT25seSB2YWxpZCBmb3Igb3V0cHV0LiAqLworICAgIGludCBsYXRlbmN5OworICAgIC8qKgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuCisgICAgICogdmFsaWQgZm9yIGV2ZW50IEFVRElPX0NMSUVOVF9TVEFSVEVELgorICAgICAqLworICAgIGludCBwb3J0SWQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0ZsYWdzLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0ZsYWdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliMjViZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRmxhZ3MuYWlkbApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLwordW5pb24gQXVkaW9Jb0ZsYWdzIHsKKyAgICAvKiogQml0bWFzayBpbmRleGVkIGJ5IEF1ZGlvSW5wdXRGbGFncy4gKi8KKyAgICBpbnQgaW5wdXQ7CisgICAgLyoqIEJpdG1hc2sgaW5kZXhlZCBieSBBdWRpb091dHB1dEZsYWdzLiAqLworICAgIGludCBvdXRwdXQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peExhdGVuY3lDbGFzcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MGIzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvTWl4TGF0ZW5jeUNsYXNzIHsKKyAgICBMT1cgPSAwLAorICAgIE5PUk1BTCA9IDEsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2N2RkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuYWlkbApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvTW9kZSB7CisgICAgSU5WQUxJRCA9IC0yLAorICAgIENVUlJFTlQgPSAtMSwKKyAgICBOT1JNQUwgPSAwLAorICAgIFJJTkdUT05FID0gMSwKKyAgICBJTl9DQUxMID0gMiwKKyAgICBJTl9DT01NVU5JQ0FUSU9OID0gMywKKyAgICBDQUxMX1NDUkVFTiA9IDQsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkSW5mby5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODZiM2YwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZ0Jhc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Vc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9PZmZsb2FkSW5mbyB7CisgICAgLyoqIFZlcnNpb24gb2YgdGhlIGluZm8gc3RydWN0dXJlLiBJbnRlcnByZXRlZCBhcyBhIHVpbnQxNl90IHZlcnNpb24gY29uc3RhbnQuICovCisgICAgaW50IHZlcnNpb247CisgICAgLyoqIEF1ZGlvIGNvbmZpZ3VyYXRpb24uICovCisgICAgQXVkaW9Db25maWdCYXNlIGNvbmZpZzsKKyAgICAvKiogU3RyZWFtIHR5cGUuICovCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgLyoqIEJpdCByYXRlIGluIGJpdHMgcGVyIHNlY29uZC4gKi8KKyAgICBpbnQgYml0UmF0ZTsKKyAgICAvKiogRHVyYXRpb24gaW4gbWljcm9zZWNvbmRzLCAtMSBpZiB1bmtub3duLiAqLworICAgIGxvbmcgZHVyYXRpb25VczsKKyAgICAvKiogdHJ1ZSBpZiBzdHJlYW0gaXMgdGllZCB0byBhIHZpZGVvIHN0cmVhbS4gKi8KKyAgICBib29sZWFuIGhhc1ZpZGVvOworICAgIC8qKiB0cnVlIGlmIHN0cmVhbWluZywgZmFsc2UgaWYgbG9jYWwgcGxheWJhY2suICovCisgICAgYm9vbGVhbiBpc1N0cmVhbWluZzsKKyAgICBpbnQgYml0V2lkdGg7CisgICAgLyoqIE9mZmxvYWQgZnJhZ21lbnQgc2l6ZS4gKi8KKyAgICBpbnQgb2ZmbG9hZEJ1ZmZlclNpemU7CisgICAgQXVkaW9Vc2FnZSB1c2FnZTsKKyAgICBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIGVuY2Fwc3VsYXRpb25Nb2RlOworICAgIC8qKiBDb250ZW50IGlkIGZyb20gdHVuZXIgSEFMICgwIGlmIG5vbmUpLiAqLworICAgIGludCBjb250ZW50SWQ7CisgICAgLyoqIFN5bmMgaWQgZnJvbSB0dW5lciBIQUwgKDAgaWYgbm9uZSkuICovCisgICAgaW50IHN5bmNJZDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb091dHB1dEZsYWdzLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTE1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9PdXRwdXRGbGFncyB7CisgICAgRElSRUNUICAgICAgICAgICA9IDAsCisgICAgUFJJTUFSWSAgICAgICAgICA9IDEsCisgICAgRkFTVCAgICAgICAgICAgICA9IDIsCisgICAgREVFUF9CVUZGRVIgICAgICA9IDMsCisgICAgQ09NUFJFU1NfT0ZGTE9BRCA9IDQsCisgICAgTk9OX0JMT0NLSU5HICAgICA9IDUsCisgICAgSFdfQVZfU1lOQyAgICAgICA9IDYsCisgICAgVFRTICAgICAgICAgICAgICA9IDcsCisgICAgUkFXICAgICAgICAgICAgICA9IDgsCisgICAgU1lOQyAgICAgICAgICAgICA9IDksCisgICAgSUVDOTU4X05PTkFVRElPICA9IDEwLAorICAgIERJUkVDVF9QQ00gICAgICAgPSAxMSwKKyAgICBNTUFQX05PSVJRICAgICAgID0gMTIsCisgICAgVk9JUF9SWCAgICAgICAgICA9IDEzLAorICAgIElOQ0FMTF9NVVNJQyAgICAgPSAxNCwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BhdGNoLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9QYXRjaC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MTlmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9QYXRjaC5haWRsCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9QYXRjaCB7CisgICAgLyoqCisgICAgICogUGF0Y2ggdW5pcXVlIElELgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX3BhdGNoX2hhbmRsZV90LgorICAgICAqLworICAgIGludCBpZDsKKyAgICBBdWRpb1BvcnRDb25maWdbXSBzb3VyY2VzOworICAgIEF1ZGlvUG9ydENvbmZpZ1tdIHNpbmtzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyM2FlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0LmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9HYWluOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0RXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Um9sZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1Byb2ZpbGU7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvUG9ydCB7CisgICAgLyoqIFBvcnQgdW5pcXVlIElELiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLworICAgIGludCBpZDsKKyAgICAvKiogU2luayBvciBzb3VyY2UuICovCisgICAgQXVkaW9Qb3J0Um9sZSByb2xlOworICAgIC8qKiBEZXZpY2UsIG1peCAuLi4gKi8KKyAgICBBdWRpb1BvcnRUeXBlIHR5cGU7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgbmFtZTsKKyAgICAvKiogQXVkaW9Qcm9maWxlcyBzdXBwb3J0ZWQgYnkgdGhpcyBwb3J0IChmb3JtYXQsIFJhdGVzLCBDaGFubmVscykuICovCisgICAgQXVkaW9Qcm9maWxlW10gcHJvZmlsZXM7CisgICAgLyoqIEdhaW4gY29udHJvbGxlcnMuICovCisgICAgQXVkaW9HYWluW10gZ2FpbnM7CisgICAgLyoqIEN1cnJlbnQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLiAqLworICAgIEF1ZGlvUG9ydENvbmZpZyBhY3RpdmVDb25maWc7CisgICAgQXVkaW9Qb3J0RXh0IGV4dDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQzMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5haWRsCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvR2FpbkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvSW9GbGFnczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ0V4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ1R5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRSb2xlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0VHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Qb3J0Q29uZmlnIHsKKyAgICAvKioKKyAgICAgKiBQb3J0IHVuaXF1ZSBJRC4KKyAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LgorICAgICAqLworICAgIGludCBpZDsKKyAgICAvKiogU2luayBvciBzb3VyY2UuICovCisgICAgQXVkaW9Qb3J0Um9sZSByb2xlOworICAgIC8qKiBEZXZpY2UsIG1peCAuLi4gKi8KKyAgICBBdWRpb1BvcnRUeXBlIHR5cGU7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9Qb3J0Q29uZmlnVHlwZS4gKi8KKyAgICBpbnQgY29uZmlnTWFzazsKKyAgICAvKiogU2FtcGxpbmcgcmF0ZSBpbiBIei4gKi8KKyAgICBpbnQgc2FtcGxlUmF0ZTsKKyAgICAvKioKKyAgICAgKiBDaGFubmVsIG1hc2ssIGlmIGFwcGxpY2FibGUuCisgICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QuCisgICAgICogVE9ETzogYml0bWFzaz8KKyAgICAgKi8KKyAgICBpbnQgY2hhbm5lbE1hc2s7CisgICAgLyoqCisgICAgICogRm9ybWF0LCBpZiBhcHBsaWNhYmxlLgorICAgICAqLworICAgIEF1ZGlvRm9ybWF0IGZvcm1hdDsKKyAgICAvKiogR2FpbiB0byBhcHBseSwgaWYgYXBwbGljYWJsZS4gKi8KKyAgICBBdWRpb0dhaW5Db25maWcgZ2FpbjsKKyAgICAvKiogRnJhbWV3b3JrIG9ubHk6IEhXX0FWX1NZTkMsIERJUkVDVCwgLi4uICovCisgICAgQXVkaW9Jb0ZsYWdzIGZsYWdzOworICAgIEF1ZGlvUG9ydENvbmZpZ0V4dCBleHQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5YWE5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQuYWlkbApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQgeworICAgIC8qKgorICAgICAqIE1vZHVsZSB0aGUgZGV2aWNlIGlzIGF0dGFjaGVkIHRvLgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4KKyAgICAgKi8KKyAgICBpbnQgaHdNb2R1bGU7CisgICAgLyoqCisgICAgICogRGV2aWNlIHR5cGUgKGUuZyBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2RldmljZXNfdC4KKyAgICAgKiBUT0RPOiBDb252ZXJ0IHRvIGEgc3RhbmRhbG9uZSBBSURMIHJlcHJlc2VudGF0aW9uLgorICAgICAqLworICAgIGludCB0eXBlOworICAgIC8qKiBEZXZpY2UgYWRkcmVzcy4gIiIgaWYgTi9BLiAqLworICAgIEB1dGY4SW5DcHAgU3RyaW5nIGFkZHJlc3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2MzViNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdFeHQuYWlkbApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdNaXhFeHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0OworCisvKioKKyAqIHtAaGlkZX0KKyAqLwordW5pb24gQXVkaW9Qb3J0Q29uZmlnRXh0IHsKKyAgICAvKioKKyAgICAgKiBUaGlzIHJlcHJlc2VudHMgYW4gZW1wdHkgdW5pb24uIFZhbHVlIGlzIGlnbm9yZWQuCisgICAgICogVE9ETyh5dGFpKTogcmVwbGFjZSB3aXRoIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gZm9yIGFuIGVtcHR5IHVuaW9uLCBhcyBzb29uIGFzIGl0IGlzCisgICAgICogICAgICAgICAgICAgZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgYm9vbGVhbiB1bnNwZWNpZmllZDsKKyAgICAvKiogRGV2aWNlIHNwZWNpZmljIGluZm8uICovCisgICAgQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0IGRldmljZTsKKyAgICAvKiogTWl4IHNwZWNpZmljIGluZm8uICovCisgICAgQXVkaW9Qb3J0Q29uZmlnTWl4RXh0IG1peDsKKyAgICAvKiogU2Vzc2lvbiBzcGVjaWZpYyBpbmZvLiAqLworICAgIEF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQgc2Vzc2lvbjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzIyNmYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dC5haWRsCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2U7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvUG9ydENvbmZpZ01peEV4dCB7CisgICAgLyoqCisgICAgICogTW9kdWxlIHRoZSBzdHJlYW0gaXMgYXR0YWNoZWQgdG8uCisgICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LgorICAgICAqLworICAgIGludCBod01vZHVsZTsKKyAgICAvKioKKyAgICAgKiBJL08gaGFuZGxlIG9mIHRoZSBpbnB1dC9vdXRwdXQgc3RyZWFtLgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LgorICAgICAqLworICAgIGludCBoYW5kbGU7CisgICAgQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSB1c2VjYXNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxZjA0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlLmFpZGwKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLwordW5pb24gQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSB7CisgICAgLyoqCisgICAgICogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6Tk9ORSByb2xlLgorICAgICAqIFRoaXMgcmVwcmVzZW50cyBhbiBlbXB0eSB2YWx1ZSAodmFsdWUgaXMgaWdub3JlZCkuCisgICAgICogVE9ETyh5dGFpKTogcmVwbGFjZSB3aXRoIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gZm9yIGFuIGVtcHR5IHVuaW9uLCBhcyBzb29uIGFzIGl0IGlzCisgICAgICogICAgICAgICAgICAgZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgYm9vbGVhbiB1bnNwZWNpZmllZDsKKyAgICAvKiogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6U09VUkNFIHJvbGUuICovCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbTsKKyAgICAvKiogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6U0lOSyByb2xlLiAqLworICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNiZjYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQuYWlkbApAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0IHsKKyAgICBpbnQgc2Vzc2lvbjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdUeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjJiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5haWRsCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9Qb3J0Q29uZmlnVHlwZSB7CisgICAgU0FNUExFX1JBVEUgID0gMCwKKyAgICBDSEFOTkVMX01BU0sgPSAxLAorICAgIEZPUk1BVCAgICAgICA9IDIsCisgICAgR0FJTiAgICAgICAgID0gMywKKyAgICBGTEFHUyAgICAgICAgPSA0LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NThmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0LmFpZGwKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvUG9ydERldmljZUV4dCB7CisgICAgLyoqIE1vZHVsZSB0aGUgZGV2aWNlIGlzIGF0dGFjaGVkIHRvLiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuICovCisgICAgaW50IGh3TW9kdWxlOworICAgIEF1ZGlvRGV2aWNlIGRldmljZTsKKyAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLiAqLworICAgIGludCBlbmNhcHN1bGF0aW9uTW9kZXM7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLiAqLworICAgIGludCBlbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTM3ODRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5haWRsCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydERldmljZUV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydE1peEV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFNlc3Npb25FeHQ7CisKKy8qKgorICoge0BoaWRlfQorICovCit1bmlvbiBBdWRpb1BvcnRFeHQgeworICAgIC8qKgorICAgICAqIFRoaXMgcmVwcmVzZW50cyBhbiBlbXB0eSB1bmlvbi4gVmFsdWUgaXMgaWdub3JlZC4KKyAgICAgKiBUT0RPKHl0YWkpOiByZXBsYWNlIHdpdGggdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBmb3IgYW4gZW1wdHkgdW5pb24sIGFzIHNvb24gYXMgaXQgaXMKKyAgICAgKiAgICAgICAgICAgICBlc3RhYmxpc2hlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIHVuc3BlY2lmaWVkOworICAgIC8qKiBEZXZpY2Ugc3BlY2lmaWMgaW5mby4gKi8KKyAgICBBdWRpb1BvcnREZXZpY2VFeHQgZGV2aWNlOworICAgIC8qKiBNaXggc3BlY2lmaWMgaW5mby4gKi8KKyAgICBBdWRpb1BvcnRNaXhFeHQgbWl4OworICAgIC8qKiBTZXNzaW9uIHNwZWNpZmljIGluZm8uICovCisgICAgQXVkaW9Qb3J0U2Vzc2lvbkV4dCBzZXNzaW9uOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2RiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0LmFpZGwKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhMYXRlbmN5Q2xhc3M7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvUG9ydE1peEV4dCB7CisgICAgLyoqIE1vZHVsZSB0aGUgc3RyZWFtIGlzIGF0dGFjaGVkIHRvLiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuICovCisgICAgaW50IGh3TW9kdWxlOworICAgIC8qKiBJL08gaGFuZGxlIG9mIHRoZSBpbnB1dC9vdXRwdXQgc3RyZWFtLiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KKyAgICBpbnQgaGFuZGxlOworICAgIC8qKiBMYXRlbmN5IGNsYXNzICovCisgICAgQXVkaW9NaXhMYXRlbmN5Q2xhc3MgbGF0ZW5jeUNsYXNzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFJvbGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRSb2xlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyZWYzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRSb2xlLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb1BvcnRSb2xlIHsKKyAgICBOT05FID0gMCwKKyAgICBTT1VSQ0UgPSAxLAorICAgIFNJTksgPSAyLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFNlc3Npb25FeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjYTE2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0LmFpZGwKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Qb3J0U2Vzc2lvbkV4dCB7CisgICAgLyoqIEF1ZGlvIHNlc3Npb24uIEludGVycHJldGVkIGFzIGF1ZGlvX3Nlc3Npb25fdC4gKi8KKyAgICBpbnQgc2Vzc2lvbjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRUeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0VHlwZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNmFmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0VHlwZS5haWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9Qb3J0VHlwZSB7CisgICAgTk9ORSA9IDAsCisgICAgREVWSUNFID0gMSwKKyAgICBNSVggPSAyLAorICAgIFNFU1NJT04gPSAzLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTg4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmFpZGwKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1Byb2ZpbGUgeworICAgIEB1dGY4SW5DcHAgU3RyaW5nIG5hbWU7CisgICAgLyoqIFRoZSBmb3JtYXQgZm9yIGFuIGF1ZGlvIHByb2ZpbGUgc2hvdWxkIG9ubHkgYmUgc2V0IHdoZW4gaW5pdGlhbGl6ZWQuICovCisgICAgQXVkaW9Gb3JtYXQgZm9ybWF0OworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4gKi8KKyAgICBpbnRbXSBjaGFubmVsTWFza3M7CisgICAgaW50W10gc2FtcGxpbmdSYXRlczsKKyAgICBib29sZWFuIGlzRHluYW1pY0Zvcm1hdDsKKyAgICBib29sZWFuIGlzRHluYW1pY0NoYW5uZWxzOworICAgIGJvb2xlYW4gaXNEeW5hbWljUmF0ZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1NvdXJjZVR5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1NvdXJjZVR5cGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjczYjkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU291cmNlVHlwZS5haWRsCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9Tb3VyY2VUeXBlIHsKKyAgICBJTlZBTElEID0gLTEsCisgICAgREVGQVVMVCA9IDAsCisgICAgTUlDID0gMSwKKyAgICBWT0lDRV9VUExJTksgPSAyLAorICAgIFZPSUNFX0RPV05MSU5LID0gMywKKyAgICBWT0lDRV9DQUxMID0gNCwKKyAgICBDQU1DT1JERVIgPSA1LAorICAgIFZPSUNFX1JFQ09HTklUSU9OID0gNiwKKyAgICBWT0lDRV9DT01NVU5JQ0FUSU9OID0gNywKKyAgICBSRU1PVEVfU1VCTUlYID0gOCwKKyAgICBVTlBST0NFU1NFRCA9IDksCisgICAgVk9JQ0VfUEVSRk9STUFOQ0UgPSAxMCwKKyAgICBFQ0hPX1JFRkVSRU5DRSA9IDE5OTcsCisgICAgRk1fVFVORVIgPSAxOTk4LAorICAgIC8qKgorICAgICAqIEEgbG93LXByaW9yaXR5LCBwcmVlbXB0aWJsZSBhdWRpbyBzb3VyY2UgZm9yIGZvciBiYWNrZ3JvdW5kIHNvZnR3YXJlCisgICAgICogaG90d29yZCBkZXRlY3Rpb24uIFNhbWUgdHVuaW5nIGFzIFZPSUNFX1JFQ09HTklUSU9OLgorICAgICAqIFVzZWQgb25seSBpbnRlcm5hbGx5IGJ5IHRoZSBmcmFtZXdvcmsuCisgICAgICovCisgICAgSE9UV09SRCA9IDE5OTksCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdHJlYW1UeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdHJlYW1UeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3Nzg4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0cmVhbVR5cGUuYWlkbApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvU3RyZWFtVHlwZSB7CisgICAgREVGQVVMVCA9IC0xLAorICAgIFZPSUNFX0NBTEwgPSAwLAorICAgIFNZU1RFTSA9IDEsCisgICAgUklORyA9IDIsCisgICAgTVVTSUMgPSAzLAorICAgIEFMQVJNID0gNCwKKyAgICBOT1RJRklDQVRJT04gPSA1LAorICAgIEJMVUVUT09USF9TQ08gPSA2LAorICAgIEVORk9SQ0VEX0FVRElCTEUgPSA3LAorICAgIERUTUYgPSA4LAorICAgIFRUUyA9IDksCisgICAgQUNDRVNTSUJJTElUWSA9IDEwLAorICAgIEFTU0lTVEFOVCA9IDExLAorICAgIC8qKiBGb3IgZHluYW1pYyBwb2xpY3kgb3V0cHV0IG1peGVzLiBPbmx5IHVzZWQgYnkgdGhlIGF1ZGlvIHBvbGljeSAqLworICAgIFJFUk9VVElORyA9IDEyLAorICAgIC8qKiBGb3IgYXVkaW8gZmxpbmdlciB0cmFja3Mgdm9sdW1lLiBPbmx5IHVzZWQgYnkgdGhlIGF1ZGlvZmxpbmdlciAqLworICAgIFBBVENIID0gMTMsCisgICAgLyoqIHN0cmVhbSBmb3IgY29ycmVzcG9uZGluZyB0byBBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVCAqLworICAgIENBTExfQVNTSVNUQU5UID0gMTQsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXBJbnRlcm5hbC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wSW50ZXJuYWwuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJmYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wSW50ZXJuYWwuYWlkbApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFRoZSAiSW50ZXJuYWwiIHRpbWVzdGFtcCBpcyBpbnRlbmRlZCB0byBkaXNhbWJpZ3VhdGUgZnJvbSB0aGUgYW5kcm9pZC5tZWRpYS5BdWRpb1RpbWVzdGFtcCB0eXBlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1RpbWVzdGFtcEludGVybmFsIHsKKyAgICAvKiogQSBmcmFtZSBwb3NpdGlvbiBpbiBBdWRpb1RyYWNrOjpnZXRQb3NpdGlvbigpIHVuaXRzLiAqLworICAgIGludCBwb3NpdGlvbjsKKyAgICAvKiogY29ycmVzcG9uZGluZyBDTE9DS19NT05PVE9OSUMgd2hlbiBmcmFtZSBpcyBleHBlY3RlZCB0byBwcmVzZW50LiAqLworICAgIGxvbmcgc2VjOworICAgIGludCBuc2VjOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVW5pcXVlSWRVc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VuaXF1ZUlkVXNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiNmQyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VuaXF1ZUlkVXNlLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb1VuaXF1ZUlkVXNlIHsKKyAgICBVTlNQRUNJRklFRCA9IDAsCisgICAgU0VTU0lPTiA9IDEsIC8vIGF1ZGlvX3Nlc3Npb25fdAorICAgICAgICAgICAgICAgICAvLyBmb3IgYWxsb2NhdGVkIHNlc3Npb25zLCBub3Qgc3BlY2lhbCBBVURJT19TRVNTSU9OXyoKKyAgICBNT0RVTEUgPSAyLCAgLy8gYXVkaW9fbW9kdWxlX2hhbmRsZV90CisgICAgRUZGRUNUID0gMywgIC8vIGF1ZGlvX2VmZmVjdF9oYW5kbGVfdAorICAgIFBBVENIID0gNCwgICAvLyBhdWRpb19wYXRjaF9oYW5kbGVfdAorICAgIE9VVFBVVCA9IDUsICAvLyBhdWRpb19pb19oYW5kbGVfdAorICAgIElOUFVUID0gNiwgICAvLyBhdWRpb19pb19oYW5kbGVfdAorICAgIENMSUVOVCA9IDcsICAvLyBjbGllbnQtc2lkZSBwbGF5ZXJzIGFuZCByZWNvcmRlcnMKKyAgICAgICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG1vdmUgdG8gYSBzZXBhcmF0ZSBuYW1lc3BhY2U7CisgICAgICAgICAgICAgICAgIC8vIHRoZXNlIElEcyBhcmUgYWxsb2NhdGVkIGJ5IEF1ZGlvRmxpbmdlciBvbiBjbGllbnQgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgLy8gYnV0IGFyZSBuZXZlciB1c2VkIGJ5IEF1ZGlvRmxpbmdlcgorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXNhZ2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VzYWdlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjNWMzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VzYWdlLmFpZGwKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb1VzYWdlIHsKKyAgICBVTktOT1dOID0gMCwKKyAgICBNRURJQSA9IDEsCisgICAgVk9JQ0VfQ09NTVVOSUNBVElPTiA9IDIsCisgICAgVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HID0gMywKKyAgICBBTEFSTSA9IDQsCisgICAgTk9USUZJQ0FUSU9OID0gNSwKKyAgICBOT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FID0gNiwKKyAgICBOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUID0gNywKKyAgICBOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UID0gOCwKKyAgICBOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEID0gOSwKKyAgICBOT1RJRklDQVRJT05fRVZFTlQgPSAxMCwKKyAgICBBU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkgPSAxMSwKKyAgICBBU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UgPSAxMiwKKyAgICBBU1NJU1RBTkNFX1NPTklGSUNBVElPTiA9IDEzLAorICAgIEdBTUUgPSAxNCwKKyAgICBWSVJUVUFMX1NPVVJDRSA9IDE1LAorICAgIEFTU0lTVEFOVCA9IDE2LAorICAgIENBTExfQVNTSVNUQU5UID0gMTcsCisgICAgRU1FUkdFTkNZID0gMTAwMCwKKyAgICBTQUZFVFkgPSAxMDAxLAorICAgIFZFSElDTEVfU1RBVFVTID0gMTAwMiwKKyAgICBBTk5PVU5DRU1FTlQgPSAxMDAzLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXVpZC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXVpZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYTkwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VdWlkLmFpZGwKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvVXVpZCB7CisgICAgaW50IHRpbWVMb3c7CisgICAgaW50IHRpbWVNaWQ7CisgICAgaW50IHRpbWVIaUFuZFZlcnNpb247CisgICAgaW50IGNsb2NrU2VxOworICAgIGJ5dGVbXSBub2RlOyAgLy8gTGVuZ3RoID0gNgorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2ODg1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmFpZGwKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5FZmZlY3REZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSUVmZmVjdENsaWVudDsKKworLyoqCisgKiBJbnB1dCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZUVmZmVjdCgpIG1ldGhvZC4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQ3JlYXRlRWZmZWN0UmVxdWVzdCB7CisgICAgRWZmZWN0RGVzY3JpcHRvciBkZXNjOworICAgIEBudWxsYWJsZSBJRWZmZWN0Q2xpZW50IGNsaWVudDsKKyAgICBpbnQgcHJpb3JpdHk7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBvdXRwdXQ7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX3Nlc3Npb25fdC4gKi8KKyAgICBpbnQgc2Vzc2lvbklkOworICAgIEF1ZGlvRGV2aWNlIGRldmljZTsKKyAgICBAdXRmOEluQ3BwIFN0cmluZyBvcFBhY2thZ2VOYW1lOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBwaWRfdC4gKi8KKyAgICBpbnQgcGlkOworICAgIGJvb2xlYW4gcHJvYmU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXNwb25zZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYTY0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVzcG9uc2UuYWlkbApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5FZmZlY3REZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSUVmZmVjdDsKKworLyoqCisgKiBPdXRwdXQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVFZmZlY3QoKSBtZXRob2QuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIENyZWF0ZUVmZmVjdFJlc3BvbnNlIHsKKyAgICBpbnQgaWQ7CisgICAgYm9vbGVhbiBlbmFibGVkOworICAgIEBudWxsYWJsZSBJRWZmZWN0IGVmZmVjdDsKKyAgICBFZmZlY3REZXNjcmlwdG9yIGRlc2M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVxdWVzdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE3NDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ2xpZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWdCYXNlOworCisvKioKKyAqIENyZWF0ZVJlY29yZFJlcXVlc3QgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvUmVjb3JkIHRvIEF1ZGlvRmxpbmdlcgorICogd2hlbiBjYWxsaW5nIGNyZWF0ZVJlY29yZCgpIGluY2x1ZGluZyBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYnkgQXVkaW9GbGluZ2VyCisgKiBhbmQgcmV0dXJuZWQgaW4gQ3JlYXRlUmVjb3JkUmVzcG9uc2Ugb2JqZWN0LgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBDcmVhdGVSZWNvcmRSZXF1ZXN0IHsKKyAgICBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyOworICAgIEF1ZGlvQ29uZmlnQmFzZSBjb25maWc7CisgICAgQXVkaW9DbGllbnQgY2xpZW50SW5mbzsKKyAgICBAdXRmOEluQ3BwIFN0cmluZyBvcFBhY2thZ2VOYW1lOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb191bmlxdWVfaWRfdC4gKi8KKyAgICBpbnQgcmlpZDsKKyAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb0lucHV0RmxhZ3MuICovCisgICAgaW50IGZsYWdzOworICAgIGxvbmcgZnJhbWVDb3VudDsKKyAgICBsb25nIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuICovCisgICAgaW50IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgaW50IHNlc3Npb25JZDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlc3BvbnNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4YjNmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1JlY29yZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNoYXJlZEZpbGVSZWdpb247CisKKy8qKgorICogQ3JlYXRlUmVjb3JkUmVzcG9uc2UgY29udGFpbnMgYWxsIG91dHB1dCBhcmd1bWVudHMgcmV0dXJuZWQgYnkgQXVkaW9GbGluZ2VyIHRvIEF1ZGlvUmVjb3JkCisgKiB3aGVuIGNhbGxpbmcgY3JlYXRlUmVjb3JkKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIEkvTyBmb3IgdXBkYXRlIGJ5CisgKiBDcmVhdGVSZWNvcmRSZXF1ZXN0LgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBDcmVhdGVSZWNvcmRSZXNwb25zZSB7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9JbnB1dEZsYWdzLiAqLworICAgIGludCBmbGFnczsKKyAgICBsb25nIGZyYW1lQ291bnQ7CisgICAgbG9uZyBub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLworICAgIGludCBzZWxlY3RlZERldmljZUlkOworICAgIGludCBzZXNzaW9uSWQ7CisgICAgaW50IHNhbXBsZVJhdGU7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBpbnB1dElkOworICAgIEBudWxsYWJsZSBTaGFyZWRGaWxlUmVnaW9uIGNibGs7CisgICAgQG51bGxhYmxlIFNoYXJlZEZpbGVSZWdpb24gYnVmZmVyczsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KKyAgICBpbnQgcG9ydElkOworICAgIC8qKiBUaGUgbmV3bHkgY3JlYXRlZCByZWNvcmQuICovCisgICAgQG51bGxhYmxlIElBdWRpb1JlY29yZCBhdWRpb1JlY29yZDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1JlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1JlcXVlc3QuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRiM2NhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVxdWVzdC5haWRsCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0ludGVybmFsOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9DbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TaGFyZWRGaWxlUmVnaW9uOworCisvKioKKyAqIENyZWF0ZVRyYWNrSW5wdXQgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvVHJhY2sgdG8gQXVkaW9GbGluZ2VyCisgKiB3aGVuIGNhbGxpbmcgY3JlYXRlVHJhY2soKSBpbmNsdWRpbmcgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGJ5IEF1ZGlvRmxpbmdlcgorICogYW5kIHJldHVybmVkIGluIENyZWF0ZVRyYWNrUmVzcG9uc2Ugb2JqZWN0LgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBDcmVhdGVUcmFja1JlcXVlc3QgeworICAgIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHI7CisgICAgQXVkaW9Db25maWcgY29uZmlnOworICAgIEF1ZGlvQ2xpZW50IGNsaWVudEluZm87CisgICAgQG51bGxhYmxlIFNoYXJlZEZpbGVSZWdpb24gc2hhcmVkQnVmZmVyOworICAgIGludCBub3RpZmljYXRpb25zUGVyQnVmZmVyOworICAgIGZsb2F0IHNwZWVkOworICAgIElBdWRpb1RyYWNrQ2FsbGJhY2sgYXVkaW9UcmFja0NhbGxiYWNrOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIG9wUGFja2FnZU5hbWU7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9PdXRwdXRGbGFncy4gKi8KKyAgICBpbnQgZmxhZ3M7CisgICAgbG9uZyBmcmFtZUNvdW50OworICAgIGxvbmcgbm90aWZpY2F0aW9uRnJhbWVDb3VudDsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KKyAgICBpbnQgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBpbnQgc2Vzc2lvbklkOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkZDhlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmFpZGwKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuSUF1ZGlvVHJhY2s7CisKKy8qKgorICogQ3JlYXRlVHJhY2tPdXRwdXQgY29udGFpbnMgYWxsIG91dHB1dCBhcmd1bWVudHMgcmV0dXJuZWQgYnkgQXVkaW9GbGluZ2VyIHRvIEF1ZGlvVHJhY2sKKyAqIHdoZW4gY2FsbGluZyBjcmVhdGVUcmFjaygpIGluY2x1ZGluZyBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCBhcyBJL08gZm9yIHVwZGF0ZSBieQorICogQ3JlYXRlVHJhY2tSZXF1ZXN0LgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBDcmVhdGVUcmFja1Jlc3BvbnNlIHsKKyAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb091dHB1dEZsYWdzLiAqLworICAgIGludCBmbGFnczsKKyAgICBsb25nIGZyYW1lQ291bnQ7CisgICAgbG9uZyBub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLworICAgIGludCBzZWxlY3RlZERldmljZUlkOworICAgIGludCBzZXNzaW9uSWQ7CisgICAgaW50IHNhbXBsZVJhdGU7CisgICAgbG9uZyBhZkZyYW1lQ291bnQ7CisgICAgaW50IGFmU2FtcGxlUmF0ZTsKKyAgICBpbnQgYWZMYXRlbmN5TXM7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBvdXRwdXRJZDsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KKyAgICBpbnQgcG9ydElkOworICAgIC8qKiBUaGUgbmV3bHkgY3JlYXRlZCB0cmFjay4gKi8KKyAgICBAbnVsbGFibGUgSUF1ZGlvVHJhY2sgYXVkaW9UcmFjazsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTNkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXVpZDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgRWZmZWN0RGVzY3JpcHRvciB7CisgICAgLyoqIFVVSUQgb2YgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QuICovCisgICAgQXVkaW9VdWlkIHR5cGU7CisgICAgLyoqIFVVSUQgZm9yIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi4gKi8KKyAgICBBdWRpb1V1aWQgdXVpZDsKKyAgICAvKiogVmVyc2lvbiBvZiB0aGUgZWZmZWN0IGNvbnRyb2wgQVBJIGltcGxlbWVudGVkLiAqLworICAgIGludCBhcGlWZXJzaW9uOworICAgIC8qKiBFZmZlY3QgZW5naW5lIGNhcGFiaWxpdGllcy9yZXF1aXJlbWVudHMgZmxhZ3MuICovCisgICAgaW50IGZsYWdzOworICAgIC8qKiBDUFUgbG9hZCBpbmRpY2F0aW9uLi4gKi8KKyAgICBpbnQgY3B1TG9hZDsKKyAgICAvKiogRGF0YSBNZW1vcnkgdXNhZ2UuLiAqLworICAgIGludCBtZW1vcnlVc2FnZTsKKyAgICAvKiogSHVtYW4gcmVhZGFibGUgZWZmZWN0IG5hbWUuICovCisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgbmFtZTsKKyAgICAvKiogSHVtYW4gcmVhZGFibGUgZWZmZWN0IGltcGxlbWVudG9yIG5hbWUuICovCisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgaW1wbGVtZW50b3I7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFjMzFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuYWlkbApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0lvQ29uZmlnRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0lvRGVzY3JpcHRvcjsKKworLyoqCisgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgQXVkaW9GbGluZ2VyLgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElBdWRpb0ZsaW5nZXJDbGllbnQgeworICAgIG9uZXdheSB2b2lkIGlvQ29uZmlnQ2hhbmdlZChBdWRpb0lvQ29uZmlnRXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvSW9EZXNjcmlwdG9yIGlvRGVzYyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2M2YzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuYWlkbApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Nb2RlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QYXRjaDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVW5pcXVlSWRVc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1V1aWQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVFZmZlY3RSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQ3JlYXRlRWZmZWN0UmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVSZWNvcmRSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQ3JlYXRlUmVjb3JkUmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVUcmFja1JlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVUcmFja1Jlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuT3BlbklucHV0UmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk9wZW5JbnB1dFJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuT3Blbk91dHB1dFJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5PcGVuT3V0cHV0UmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5FZmZlY3REZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSUF1ZGlvRmxpbmdlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1JlY29yZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWljcm9waG9uZUluZm9EYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmVuZGVyUG9zaXRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7CisKKy8qKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUF1ZGlvRmxpbmdlclNlcnZpY2UgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlciwgb3IgbnVsbCBpZiB0aGUgdHJhY2sgY2Fubm90IGJlCisgICAgICogY3JlYXRlZC4KKyAgICAgKi8KKyAgICBDcmVhdGVUcmFja1Jlc3BvbnNlIGNyZWF0ZVRyYWNrKGluIENyZWF0ZVRyYWNrUmVxdWVzdCByZXF1ZXN0KTsKKworICAgIENyZWF0ZVJlY29yZFJlc3BvbnNlIGNyZWF0ZVJlY29yZChpbiBDcmVhdGVSZWNvcmRSZXF1ZXN0IHJlcXVlc3QpOworCisgICAgLy8gRklYTUUgU3VycHJpc2luZ2x5LCBmb3JtYXQvbGF0ZW5jeSBkb24ndCB3b3JrIGZvciBpbnB1dCBoYW5kbGVzCisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIHRoZSBhdWRpbyBoYXJkd2FyZSBzdGF0ZS4gVGhpcyBzdGF0ZSBuZXZlciBjaGFuZ2VzLCBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjYWNoZWQuCisgICAgICovCisgICAgaW50IHNhbXBsZVJhdGUoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvSGFuZGxlKTsKKworICAgIEF1ZGlvRm9ybWF0IGZvcm1hdChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKKworICAgIGxvbmcgZnJhbWVDb3VudChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgaW50IGxhdGVuY3koaW50ICAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQpOworCisgICAgLyoKKyAgICAgKiBTZXRzL2dldHMgdGhlIGF1ZGlvIGhhcmR3YXJlIHN0YXRlLiBUaGlzIHdpbGwgcHJvYmFibHkgYmUgdXNlZCBieQorICAgICAqIHRoZSBwcmVmZXJlbmNlIHBhbmVsLCBtb3N0bHkuCisgICAgICovCisgICAgdm9pZCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpOworICAgIHZvaWQgc2V0TWFzdGVyTXV0ZShib29sZWFuIG11dGVkKTsKKworICAgIGZsb2F0IG1hc3RlclZvbHVtZSgpOworICAgIGJvb2xlYW4gbWFzdGVyTXV0ZSgpOworCisgICAgdm9pZCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpOworICAgIGZsb2F0IGdldE1hc3RlckJhbGFuY2UoKTsKKworICAgIC8qCisgICAgICogU2V0L2dldHMgc3RyZWFtIHR5cGUgc3RhdGUuIFRoaXMgd2lsbCBwcm9iYWJseSBiZSB1c2VkIGJ5CisgICAgICogdGhlIHByZWZlcmVuY2UgcGFuZWwsIG1vc3RseS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFN0cmVhbVZvbHVtZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBmbG9hdCB2YWx1ZSwgaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIG91dHB1dCk7CisgICAgdm9pZCBzZXRTdHJlYW1NdXRlKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2xlYW4gbXV0ZWQpOworICAgIGZsb2F0IHN0cmVhbVZvbHVtZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKKyAgICBib29sZWFuIHN0cmVhbU11dGUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSk7CisKKyAgICAvLyBzZXQgYXVkaW8gbW9kZS4KKyAgICB2b2lkIHNldE1vZGUoQXVkaW9Nb2RlIG1vZGUpOworCisgICAgLy8gbWljIG11dGUvc3RhdGUKKyAgICB2b2lkIHNldE1pY011dGUoYm9vbGVhbiBzdGF0ZSk7CisgICAgYm9vbGVhbiBnZXRNaWNNdXRlKCk7CisgICAgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZChpbnQgLyogYXVkaW9fcG9ydF9oYW5kbGVfdCAqLyBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNpbGVuY2VkKTsKKworICAgIHZvaWQgc2V0UGFyYW1ldGVycyhpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIGtleVZhbHVlUGFpcnMpOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIGdldFBhcmFtZXRlcnMoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcga2V5cyk7CisKKyAgICAvLyBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBhdWRpbyBpbnB1dC9vdXRwdXQgY2hhbmdlIGFuZCB0cmFjayBub3RpZmljYXRpb25zLgorICAgIC8vIEZvciBhIGdpdmVuIGNhbGxpbmcgcGlkLCBBdWRpb0ZsaW5nZXIgZGlzcmVnYXJkcyBhbnkgcmVnaXN0cmF0aW9ucyBhZnRlciB0aGUgZmlyc3QuCisgICAgLy8gVGh1cyB0aGUgSUF1ZGlvRmxpbmdlckNsaWVudCBtdXN0IGJlIGEgc2luZ2xldG9uIHBlciBwcm9jZXNzLgorICAgIHZvaWQgcmVnaXN0ZXJDbGllbnQoSUF1ZGlvRmxpbmdlckNsaWVudCBjbGllbnQpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGF1ZGlvIHJlY29yZGluZyBidWZmZXIgc2l6ZSBpbiBieXRlcy4KKyAgICAvLyBGSVhNRSBUaGlzIEFQSSBhc3N1bWVzIGEgcm91dGUsIGFuZCBzbyBzaG91bGQgYmUgZGVwcmVjYXRlZC4KKyAgICBsb25nIGdldElucHV0QnVmZmVyU2l6ZShpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2NoYW5uZWxfbWFza190ICovIGNoYW5uZWxNYXNrKTsKKworICAgIE9wZW5PdXRwdXRSZXNwb25zZSBvcGVuT3V0cHV0KGluIE9wZW5PdXRwdXRSZXF1ZXN0IHJlcXVlc3QpOworICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvcGVuRHVwbGljYXRlT3V0cHV0KGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQyKTsKKyAgICB2b2lkIGNsb3NlT3V0cHV0KGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQpOworICAgIHZvaWQgc3VzcGVuZE91dHB1dChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKKyAgICB2b2lkIHJlc3RvcmVPdXRwdXQoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIG91dHB1dCk7CisKKyAgICBPcGVuSW5wdXRSZXNwb25zZSBvcGVuSW5wdXQoaW4gT3BlbklucHV0UmVxdWVzdCByZXF1ZXN0KTsKKyAgICB2b2lkIGNsb3NlSW5wdXQoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlucHV0KTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVN0cmVhbShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKTsKKworICAgIHZvaWQgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIFJlbmRlclBvc2l0aW9uIGdldFJlbmRlclBvc2l0aW9uKGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQpOworCisgICAgaW50IGdldElucHV0RnJhbWVzTG9zdChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOworCisgICAgaW50IC8qIGF1ZGlvX3VuaXF1ZV9pZF90ICovIG5ld0F1ZGlvVW5pcXVlSWQoQXVkaW9VbmlxdWVJZFVzZSB1c2UpOworCisgICAgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IC8qIGF1ZGlvX3Nlc3Npb25fdCAqLyBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBpZF90ICovIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogdWlkX3QgKi8gdWlkKTsKKyAgICB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgLyogYXVkaW9fc2Vzc2lvbl90ICovIGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGlkX3QgKi8gcGlkKTsKKworICAgIGludCBxdWVyeU51bWJlckVmZmVjdHMoKTsKKworICAgIEVmZmVjdERlc2NyaXB0b3IgcXVlcnlFZmZlY3QoaW50IGluZGV4KTsKKworICAgIC8qKiBwcmVmZXJyZWRUeXBlRmxhZyBpcyBpbnRlcnByZXRlZCBhcyBhIHVpbnQzMl90IHdpdGggdGhlICJlZmZlY3QgZmxhZyIgZm9ybWF0LiAqLworICAgIEVmZmVjdERlc2NyaXB0b3IgZ2V0RWZmZWN0RGVzY3JpcHRvcihpbiBBdWRpb1V1aWQgZWZmZWN0VVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9VdWlkIHR5cGVVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZmVycmVkVHlwZUZsYWcpOworCisgICAgQ3JlYXRlRWZmZWN0UmVzcG9uc2UgY3JlYXRlRWZmZWN0KGluIENyZWF0ZUVmZmVjdFJlcXVlc3QgcmVxdWVzdCk7CisKKyAgICB2b2lkIG1vdmVFZmZlY3RzKGludCAvKiBhdWRpb19zZXNzaW9uX3QgKi8gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gZHN0T3V0cHV0KTsKKworICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fc2Vzc2lvbl90ICovIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1c3BlbmRlZCk7CisKKyAgICBpbnQgLyogYXVkaW9fbW9kdWxlX2hhbmRsZV90ICovIGxvYWRId01vZHVsZShAdXRmOEluQ3BwIFN0cmluZyBuYW1lKTsKKworICAgIC8vIGhlbHBlcnMgZm9yIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyLmdldFByb3BlcnR5KCksIHNlZSBkZXNjcmlwdGlvbiB0aGVyZSBmb3IgbWVhbmluZworICAgIC8vIEZJWE1FIG1vdmUgdGhlc2UgQVBJcyB0byBBdWRpb1BvbGljeSB0byBwZXJtaXQgYSBtb3JlIGFjY3VyYXRlIGltcGxlbWVudGF0aW9uCisgICAgLy8gdGhhdCBsb29rcyBvbiBwcmltYXJ5IGRldmljZSBmb3IgYSBzdHJlYW0gd2l0aCBmYXN0IGZsYWcsIHByaW1hcnkgZmxhZywgb3IgZmlyc3Qgb25lLgorICAgIGludCBnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCk7CisgICAgbG9uZyBnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpOworCisgICAgLy8gSW50ZW5kZWQgZm9yIEF1ZGlvU2VydmljZSB0byBpbmZvcm0gQXVkaW9GbGluZ2VyIG9mIGRldmljZSdzIGxvdyBSQU0gYXR0cmlidXRlLAorICAgIC8vIGFuZCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS4gIEZvciBhIGRlZmluaXRpb24gb2Ygd2hhdCAibG93IFJBTSIgbWVhbnMsIHNlZQorICAgIC8vIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpLiAgVGhlIHRvdGFsTWVtb3J5IHBhcmFtZXRlcgorICAgIC8vIGlzIG9idGFpbmVkIGZyb20gYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLk1lbW9yeUluZm8udG90YWxNZW0uCisgICAgdm9pZCBzZXRMb3dSYW1EZXZpY2UoYm9vbGVhbiBpc0xvd1JhbURldmljZSwgbG9uZyB0b3RhbE1lbW9yeSk7CisKKyAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCisgICAgQXVkaW9Qb3J0IGdldEF1ZGlvUG9ydChpbiBBdWRpb1BvcnQgcG9ydCk7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIGludCAvKiBhdWRpb19wYXRjaF9oYW5kbGVfdCAqLyBjcmVhdGVBdWRpb1BhdGNoKGluIEF1ZGlvUGF0Y2ggcGF0Y2gpOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZvaWQgcmVsZWFzZUF1ZGlvUGF0Y2goaW50IC8qIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICovIGhhbmRsZSk7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICBBdWRpb1BhdGNoW10gbGlzdEF1ZGlvUGF0Y2hlcyhpbnQgbWF4Q291bnQpOworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2b2lkIHNldEF1ZGlvUG9ydENvbmZpZyhpbiBBdWRpb1BvcnRDb25maWcgY29uZmlnKTsKKworICAgIC8qIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uICovCisgICAgaW50IC8qIGF1ZGlvX2h3X3N5bmNfdCAqLyBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oaW50IC8qIGF1ZGlvX3Nlc3Npb25fdCAqLyBzZXNzaW9uSWQpOworCisgICAgLyogSW5kaWNhdGUgSkFWQSBzZXJ2aWNlcyBhcmUgcmVhZHkgKHNjaGVkdWxpbmcsIHBvd2VyIG1hbmFnZW1lbnQgLi4uKSAqLworICAgIG9uZXdheSB2b2lkIHN5c3RlbVJlYWR5KCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgYnVmZmVyLgorICAgIGxvbmcgZnJhbWVDb3VudEhBTChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgbWljcm9waG9uZXMgYW5kIHRoZWlyIGNoYXJhY3RlcmlzdGljcyAqLworICAgIE1pY3JvcGhvbmVJbmZvRGF0YVtdIGdldE1pY3JvcGhvbmVzKCk7CisKKyAgICB2b2lkIHNldEF1ZGlvSGFsUGlkcyhpbiBpbnRbXSAvKiBwaWRfdFtdICovIHBpZHMpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCmluZGV4IGVjZjU4YjYuLjE3NzI2NTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKQEAgLTE2LDkgKzE2LDEzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWljcm9waG9uZUluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NaWNyb3Bob25lSW5mb0RhdGE7CiAKLS8qIE5hdGl2ZSBjb2RlIG11c3Qgc3BlY2lmeSBuYW1lc3BhY2UgbWVkaWEgKG1lZGlhOjpJQXVkaW9SZWNvcmQpIHdoZW4gcmVmZXJyaW5nIHRvIHRoaXMgY2xhc3MgKi8KKy8qKgorICogTmF0aXZlIGNvZGUgbXVzdCBzcGVjaWZ5IG5hbWVzcGFjZSBtZWRpYSAobWVkaWE6OklBdWRpb1JlY29yZCkgd2hlbiByZWZlcnJpbmcgdG8gdGhpcyBjbGFzcy4KKyAqCisgKiB7QGhpZGV9CisgKi8KIGludGVyZmFjZSBJQXVkaW9SZWNvcmQgewogCiAgIC8qIEFmdGVyIGl0J3MgY3JlYXRlZCB0aGUgdHJhY2sgaXMgbm90IGFjdGl2ZS4gQ2FsbCBzdGFydCgpIHRvCkBAIC0zNSw3ICszOSw3IEBACiAKICAgLyogR2V0IGEgbGlzdCBvZiBjdXJyZW50IGFjdGl2ZSBtaWNyb3Bob25lcy4KICAgICovCi0gIHZvaWQgZ2V0QWN0aXZlTWljcm9waG9uZXMob3V0IE1pY3JvcGhvbmVJbmZvW10gYWN0aXZlTWljcm9waG9uZXMpOworICB2b2lkIGdldEFjdGl2ZU1pY3JvcGhvbmVzKG91dCBNaWNyb3Bob25lSW5mb0RhdGFbXSBhY3RpdmVNaWNyb3Bob25lcyk7CiAKICAgLyogU2V0IHRoZSBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpLgogICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFjay5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2YzM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFjay5haWRsCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVGltZXN0YW1wSW50ZXJuYWw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TaGFyZWRGaWxlUmVnaW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlck9wZXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlclN0YXRlOworCisvKioKKyAqIFVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIG1ldGhvZHMgcmV0dXJuaW5nIGludCBleHBlY3QgaXQgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzdGF0dXNfdC4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJQXVkaW9UcmFjayB7CisgICAgLyoqIEdldCB0aGlzIHRyYWNrJ3MgY29udHJvbCBibG9jayAqLworICAgIEBudWxsYWJsZSBTaGFyZWRGaWxlUmVnaW9uIGdldENibGsoKTsKKworICAgIC8qKgorICAgICAqIEFmdGVyIGl0J3MgY3JlYXRlZCB0aGUgdHJhY2sgaXMgbm90IGFjdGl2ZS4gQ2FsbCBzdGFydCgpIHRvCisgICAgICogbWFrZSBpdCBhY3RpdmUuCisgICAgICovCisgICAgaW50IHN0YXJ0KCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGEgdHJhY2suIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkIGFuZAorICAgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkCisgICAgICogd2lsbCBjb250aW51ZSB0byBiZSBwcm9jZXNzZWQsIHVubGVzcy91bnRpbCBmbHVzaCgpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoKTsKKworICAgIC8qKgorICAgICAqIEZsdXNoIGEgc3RvcHBlZCBvciBwYXVzZWQgdHJhY2suIEFsbCBwZW5kaW5nL3JlbGVhc2VkIGJ1ZmZlcnMgYXJlIGRpc2NhcmRlZC4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QgaWYgdGhlIHRyYWNrIGlzIG5vdCBzdG9wcGVkIG9yIHBhdXNlZC4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBQYXVzZSBhIHRyYWNrLiBJZiBzZXQsIHRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZCBhbmQKKyAgICAgKiBvYnRhaW5CdWZmZXIgd2lsbCByZXR1cm4gYW4gZXJyb3IuIEJ1ZmZlcnMgdGhhdCBhcmUgYWxyZWFkeSByZWxlYXNlZAorICAgICAqIHdpbGwgY29udGludWUgdG8gYmUgcHJvY2Vzc2VkLCB1bmxlc3MvdW50aWwgZmx1c2goKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgdm9pZCBwYXVzZSgpOworCisgICAgLyoqCisgICAgICogQXR0YWNoIHRyYWNrIGF1eGlsaWFyeSBvdXRwdXQgdG8gc3BlY2lmaWVkIGVmZmVjdC4gVXNlIGVmZmVjdElkID0gMAorICAgICAqIHRvIGRldGFjaCB0cmFjayBmcm9tIGVmZmVjdC4KKyAgICAgKi8KKyAgICBpbnQgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CisKKyAgICAvKiogU2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSBhdWRpbyBoYXJkd2FyZS4gKi8KKyAgICBpbnQgc2V0UGFyYW1ldGVycyhAdXRmOEluQ3BwIFN0cmluZyBrZXlWYWx1ZVBhaXJzKTsKKworICAgIC8qKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuICovCisgICAgaW50IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLyoqIFJldHVybiBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuICovCisgICAgaW50IGdldFRpbWVzdGFtcChvdXQgQXVkaW9UaW1lc3RhbXBJbnRlcm5hbCB0aW1lc3RhbXApOworCisgICAgLyoqIFNpZ25hbCB0aGUgcGxheWJhY2sgdGhyZWFkIGZvciBhIGNoYW5nZSBpbiBjb250cm9sIGJsb2NrLiAqLworICAgIHZvaWQgc2lnbmFsKCk7CisKKyAgICAvKiogU2V0cyB0aGUgdm9sdW1lIHNoYXBlci4gUmV0dXJucyB0aGUgdm9sdW1lIHNoYXBlciBzdGF0dXMuICovCisgICAgaW50IGFwcGx5Vm9sdW1lU2hhcGVyKGluIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gVm9sdW1lU2hhcGVyT3BlcmF0aW9uIG9wZXJhdGlvbik7CisKKyAgICAvKiogR2V0cyB0aGUgdm9sdW1lIHNoYXBlciBzdGF0ZS4gKi8KKyAgICBAbnVsbGFibGUgVm9sdW1lU2hhcGVyU3RhdGUgZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFja0NhbGxiYWNrLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvVHJhY2tDYWxsYmFjay5haWRsCmluZGV4IDIxNTUzYjUuLmY1OTNlMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFja0NhbGxiYWNrLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrQ2FsbGJhY2suYWlkbApAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCiAvKioKLSAqIEBoaWRlCisgKiB7QGhpZGV9CiAgKi8KIGludGVyZmFjZSBJQXVkaW9UcmFja0NhbGxiYWNrIHsKICAgICBvbmV3YXkgdm9pZCBvbkNvZGVjRm9ybWF0Q2hhbmdlZChpbiBieXRlW10gYXVkaW9NZXRhZGF0YSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcHR1cmVTdGF0ZUxpc3RlbmVyLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcHR1cmVTdGF0ZUxpc3RlbmVyLmFpZGwKaW5kZXggODUwMjI4Mi4uM2IyMjA2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lDYXB0dXJlU3RhdGVMaXN0ZW5lci5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FwdHVyZVN0YXRlTGlzdGVuZXIuYWlkbApAQCAtMTYsNiArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKKy8qKgorICoge0BoaWRlfQorICovCiBpbnRlcmZhY2UgSUNhcHR1cmVTdGF0ZUxpc3RlbmVyIHsKICAgICB2b2lkIHNldENhcHR1cmVTdGF0ZShib29sZWFuIGFjdGl2ZSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3QuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNjZDVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3QuYWlkbApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TaGFyZWRGaWxlUmVnaW9uOworCisvKioKKyAqIFRoZSBJRWZmZWN0IGludGVyZmFjZSBlbmFibGVzIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBtb2R1bGUgYWN0aXZpdHkgYW5kIHBhcmFtZXRlcnMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUVmZmVjdCB7CisgICAgLyoqCisgICAgICogQWN0aXZhdGVzIHRoZSBlZmZlY3QgbW9kdWxlIGJ5IGNvbm5lY3RpbmcgaXQgdG8gdGhlIGF1ZGlvIHBhdGguCisgICAgICogQHJldHVybiBhIHN0YXR1c190IGNvZGUuCisgICAgICovCisgICAgaW50IGVuYWJsZSgpOworCisgICAgLyoqCisgICAgICogRGVhY3RpdmF0ZXMgdGhlIGVmZmVjdCBtb2R1bGUgYnkgZGlzY29ubmVjdGluZyBpdCBmcm9tIHRoZSBhdWRpbyBwYXRoLgorICAgICAqIEByZXR1cm4gYSBzdGF0dXNfdCBjb2RlLgorICAgICAqLworICAgIGludCBkaXNhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBjb250cm9sLCByZWFkcyBvciB3cml0ZXMgcGFyYW1ldGVycy4gU2FtZSBiZWhhdmlvciBhcyB0aGUgY29tbWFuZCgpIG1ldGhvZCBpbiB0aGUKKyAgICAgKiBlZmZlY3QgY29udHJvbCBpbnRlcmZhY2UuCisgICAgICogUmVmZXIgdG8gc3lzdGVtL2F1ZGlvX2VmZmVjdC5oIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWxpZCBjb21tYW5kIGNvZGVzIGFuZCB0aGVpcgorICAgICAqIGFzc29jaWF0ZWQgcGFyYW1ldGVyIGFuZCByZXR1cm4gbWVzc2FnZXMuIFRoZSBjbWREYXRhIGFuZCByZXNwb25zZSBwYXJhbWV0ZXJzIGFyZSBleHBlY3RlZCB0bworICAgICAqIGNvbnRhaW4gdGhlIHJlc3BlY3RpdmUgdHlwZXMgaW4gYSBzdGFuZGFyZCBDIG1lbW9yeSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBUT0RPKHl0YWkpOiByZXBsYWNlIG9wYXF1ZSBieXRlIGFycmF5cyB3aXRoIHN0cm9uZ2x5IHR5cGVkIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgaW50IGNvbW1hbmQoaW50IGNtZENvZGUsIGluIGJ5dGVbXSBjbWREYXRhLCBpbnQgbWF4UmVzcG9uc2VTaXplLCBvdXQgYnl0ZVtdIHJlc3BvbnNlKTsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3RzIHRoZSBJRWZmZWN0IGludGVyZmFjZSBmcm9tIHRoZSBlZmZlY3QgbW9kdWxlLgorICAgICAqIFRoaXMgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgZWZmZWN0IG1vZHVsZSBhbmQgcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSBpbiB0aGUgbGlicmFyeSBpZiB0aGlzCisgICAgICogaXMgdGhlIGxhc3QgY2xpZW50IGRpc2Nvbm5lY3RlZC4gVG8gcmVsZWFzZSBjb250cm9sIG9mIHRoZSBlZmZlY3QgbW9kdWxlLCB0aGUgYXBwbGljYXRpb24gY2FuCisgICAgICogZGlzY29ubmVjdCBvciBkZWxldGUgdGhlIElFZmZlY3QgaW50ZXJmYWNlLgorICAgICAqLworICAgIHZvaWQgZGlzY29ubmVjdCgpOworCisgICAgLyoqCisgICAgICogcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzaGFyZWQgbWVtb3J5IGFyZWEgdXNlZCB0byBwYXNzIG11bHRpcGxlIHBhcmFtZXRlcnMgdG8gdGhlIGVmZmVjdAorICAgICAqIG1vZHVsZSB3aXRob3V0IG11bHRpcGx5aW5nIHRoZSBiaW5kZXIgY2FsbHMuCisgICAgICoKKyAgICAgKiBUT0RPKHl0YWkpOiBFeHBsYWluIGhvdyB0aGlzIHNob3VsZCBiZSB1c2VkIGV4YWN0bHkuCisgICAgICovCisgICAgU2hhcmVkRmlsZVJlZ2lvbiBnZXRDYmxrKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdENsaWVudC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3RDbGllbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjZiY2YxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3RDbGllbnQuYWlkbApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIEEgY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBnZXR0aW5nIGVmZmVjdC1yZWxhdGVkIG5vdGlmaWNhdGlvbnMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUVmZmVjdENsaWVudCB7CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgZ3JhbnRpbmcgY29udHJvbCBvdmVyIHRoZSBlZmZlY3QgdG8gdGhlIGFwcGxpY2F0aW9uCisgICAgICogaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIGNvbnRyb2xHcmFudGVkIHRydWUgaWZmIHRoZSBhcHBsaWNhdGlvbiBoYXMgdGhlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBtb2R1bGUuCisgICAgICovCisgICAgb25ld2F5IHZvaWQgY29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbGVhbiBjb250cm9sR3JhbnRlZCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGVmZmVjdCBoYXMgYmVlbiBlbmFibGVkIG9yIGRpc2FibGVkLiBSZWNlaXZlZCBvbmx5IGlmIHRoZSBjbGllbnQgaXMgbm90CisgICAgICogY3VycmVudGx5IGNvbnRyb2xsaW5nIHRoZSBlZmZlY3QuCisgICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiB0aGUgZWZmZWN0IG1vZHVsZSBoYXMgYmVlbiBhY3RpdmF0ZWQsIGZhbHNlIGlmIGRlYWN0aXZhdGVkLgorICAgICAqLworICAgIG9uZXdheSB2b2lkIGVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbGVhbiBlbmFibGVkKTsKKworICAgIC8qKgorICAgICAqIEEgY29tbWFuZCBoYXMgYmVlbiBzZW5kIHRvIHRoZSBlZmZlY3QgZW5naW5lLiBSZWNlaXZlZCBvbmx5IGlmIHRoZSBjbGllbnQgaXMgbm90IGN1cnJlbnRseQorICAgICAqIGNvbnRyb2xsaW5nIHRoZSBlZmZlY3QuIFNlZSBJRWZmZWN0LmNvbW1hbmQoKSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBidWZmZXIgY29udGVudHMuCisgICAgICoKKyAgICAgKiBUT0RPKHl0YWkpOiByZXBsYWNlIG9wYXF1ZSBieXRlIGFycmF5cyB3aXRoIHN0cm9uZ2x5IHR5cGVkIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgb25ld2F5IHZvaWQgY29tbWFuZEV4ZWN1dGVkKGludCBjbWRDb2RlLCBpbiBieXRlW10gY21kRGF0YSwgaW4gYnl0ZVtdIHJlcGx5RGF0YSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVBsYXllci5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lQbGF5ZXIuYWlkbAppbmRleCBhOTBmY2RkLi40M2JiN2YzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVBsYXllci5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JUGxheWVyLmFpZGwKQEAgLTE2LDExICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlci5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyLk9wZXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVTaGFwZXJPcGVyYXRpb247CiAKIC8qKgotICogQGhpZGUKKyAqIHtAaGlkZX0KICAqLwogaW50ZXJmYWNlIElQbGF5ZXIgewogICAgIG9uZXdheSB2b2lkIHN0YXJ0KCk7CkBAIC0yOSw2ICsyOSw2IEBACiAgICAgb25ld2F5IHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbCk7CiAgICAgb25ld2F5IHZvaWQgc2V0UGFuKGZsb2F0IHBhbik7CiAgICAgb25ld2F5IHZvaWQgc2V0U3RhcnREZWxheU1zKGludCBkZWxheU1zKTsKLSAgICBvbmV3YXkgdm9pZCBhcHBseVZvbHVtZVNoYXBlcihpbiBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gT3BlcmF0aW9uIG9wZXJhdGlvbik7CisgICAgb25ld2F5IHZvaWQgYXBwbHlWb2x1bWVTaGFwZXIoaW4gVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFZvbHVtZVNoYXBlck9wZXJhdGlvbiBvcGVyYXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL01pY3JvcGhvbmVJbmZvLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlNDZjYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm8uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotcGFyY2VsYWJsZSBNaWNyb3Bob25lSW5mbyBjcHBfaGVhZGVyICJtZWRpYS9NaWNyb3Bob25lSW5mby5oIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVxdWVzdC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTU1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVxdWVzdC5haWRsCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIE9wZW5JbnB1dFJlcXVlc3QgeworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuICovCisgICAgaW50IG1vZHVsZTsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuICovCisgICAgaW50IGlucHV0OworICAgIEF1ZGlvQ29uZmlnIGNvbmZpZzsKKyAgICBBdWRpb0RldmljZSBkZXZpY2U7CisgICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZTsKKyAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb0lucHV0RmxhZy4gKi8KKyAgICBpbnQgZmxhZ3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXNwb25zZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTNiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBPcGVuSW5wdXRSZXNwb25zZSB7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBpbnB1dDsKKyAgICBBdWRpb0NvbmZpZyBjb25maWc7CisgICAgQXVkaW9EZXZpY2UgZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlcXVlc3QuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmIxMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnQ7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIE9wZW5PdXRwdXRSZXF1ZXN0IHsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LiAqLworICAgIGludCBtb2R1bGU7CisgICAgQXVkaW9Db25maWcgY29uZmlnOworICAgIC8qKiBUeXBlIG11c3QgYmUgREVWSUNFLiAqLworICAgIEF1ZGlvUG9ydCBkZXZpY2U7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9PdXRwdXRGbGFnLiAqLworICAgIGludCBmbGFnczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVzcG9uc2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDUxOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXNwb25zZS5haWRsCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBPcGVuT3V0cHV0UmVzcG9uc2UgeworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KKyAgICBpbnQgb3V0cHV0OworICAgIEF1ZGlvQ29uZmlnIGNvbmZpZzsKKyAgICBpbnQgbGF0ZW5jeU1zOworICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvT3V0cHV0RmxhZy4gKi8KKyAgICBpbnQgZmxhZ3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvUmVuZGVyUG9zaXRpb24uYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZW5kZXJQb3NpdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZGMxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvUmVuZGVyUG9zaXRpb24uYWlkbApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBSZW5kZXJQb3NpdGlvbiB7CisgICAgaW50IGhhbEZyYW1lczsKKyAgICBpbnQgZHNwRnJhbWVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9Db25maWd1cmF0aW9uLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL0NvbmZpZ3VyYXRpb24uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwZTYwZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL0NvbmZpZ3VyYXRpb24uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyOwotCi1wYXJjZWxhYmxlIENvbmZpZ3VyYXRpb24gY3BwX2hlYWRlciAibWVkaWEvVm9sdW1lU2hhcGVyLmgiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9PcGVyYXRpb24uYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvT3BlcmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTBkOWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9PcGVyYXRpb24uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyOwotCi1wYXJjZWxhYmxlIE9wZXJhdGlvbiBjcHBfaGVhZGVyICJtZWRpYS9Wb2x1bWVTaGFwZXIuaCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL1N0YXRlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL1N0YXRlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTIyYjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9TdGF0ZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS5Wb2x1bWVTaGFwZXI7Ci0KLXBhcmNlbGFibGUgU3RhdGUgY3BwX2hlYWRlciAibWVkaWEvVm9sdW1lU2hhcGVyLmgiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvbi5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTVlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uLmgKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9DbGllbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Jb0NvbmZpZ0V2ZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTW9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdUeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvVW5pcXVlSWRVc2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0VmZmVjdERlc2NyaXB0b3IuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvU2hhcmVkRmlsZVJlZ2lvbi5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIG1heFNpemUgaXMgdGhlIHNpemUgb2YgdGhlIEMtc3RyaW5nIGJ1ZmZlciAoaW5jbHVkaW5nIHRoZSAwLXRlcm1pbmF0b3IpLCBOT1QgdGhlIG1heCBsZW5ndGggb2YKKy8vIHRoZSBzdHJpbmcuCitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9zdHJpbmcoc3RkOjpzdHJpbmdfdmlldyBhaWRsLCBjaGFyKiBkZXN0LCBzaXplX3QgbWF4U2l6ZSk7CitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6c3RyaW5nPiBsZWdhY3kyYWlkbF9zdHJpbmcoY29uc3QgY2hhciogbGVnYWN5LCBzaXplX3QgbWF4U2l6ZSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbW9kdWxlX2hhbmRsZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19oYW5kbGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGF1ZGlvX2lvX2hhbmRsZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9oYW5kbGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChhdWRpb19wb3J0X2hhbmRsZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcGF0Y2hfaGFuZGxlX3QoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfaGFuZGxlX3RfaW50MzJfdChhdWRpb19wYXRjaF9oYW5kbGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3VuaXF1ZV9pZF90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3VuaXF1ZV9pZF90KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3VuaXF1ZV9pZF90X2ludDMyX3QoYXVkaW9fdW5pcXVlX2lkX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19od19zeW5jX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faHdfc3luY190KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2h3X3N5bmNfdF9pbnQzMl90KGF1ZGlvX2h3X3N5bmNfdCBsZWdhY3kpOworCisvLyBUaGUgbGVnYWN5IGVudW0gaXMgdW5uYW1lZC4gVGh1cywgd2UgdXNlIGludC4KK0NvbnZlcnNpb25SZXN1bHQ8aW50PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdUeXBlKG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlIGFpZGwpOworLy8gVGhlIGxlZ2FjeSBlbnVtIGlzIHVubmFtZWQuIFRodXMsIHdlIHVzZSBpbnQuCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlPiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdUeXBlKGludCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PHVuc2lnbmVkIGludD4gYWlkbDJsZWdhY3lfaW50MzJfdF9jb25maWdfbWFzayhpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9jb25maWdfbWFza19pbnQzMl90KHVuc2lnbmVkIGludCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QoYXVkaW9fY2hhbm5lbF9tYXNrX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxwaWRfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KHBpZF90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8dWlkX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWRfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PFN0cmluZzg+IGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzgoc3RkOjpzdHJpbmdfdmlldyBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpzdHJpbmc+IGxlZ2FjeTJhaWRsX1N0cmluZzhfc3RyaW5nKGNvbnN0IFN0cmluZzgmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8U3RyaW5nMTY+IGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KHN0ZDo6c3RyaW5nX3ZpZXcgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6c3RyaW5nPiBsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcoY29uc3QgU3RyaW5nMTYmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fY29uZmlnX2V2ZW50PiBhaWRsMmxlZ2FjeV9BdWRpb0lvQ29uZmlnRXZlbnRfYXVkaW9faW9fY29uZmlnX2V2ZW50KAorICAgICAgICBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50PiBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfQXVkaW9Jb0NvbmZpZ0V2ZW50KAorICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnQgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3JvbGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRSb2xlPiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKAorICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfdHlwZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0VHlwZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUoCisgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZm9ybWF0X3Q+IGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9tb2RlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0dhaW5Nb2RlX2F1ZGlvX2dhaW5fbW9kZV90KG1lZGlhOjpBdWRpb0dhaW5Nb2RlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluTW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X0F1ZGlvR2Fpbk1vZGUoYXVkaW9fZ2Fpbl9tb2RlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX21vZGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X21hc2tfaW50MzJfdChhdWRpb19nYWluX21vZGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RldmljZXNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoYXVkaW9fZGV2aWNlc190IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9jb25maWc+IGFpZGwybGVnYWN5X0F1ZGlvR2FpbkNvbmZpZ19hdWRpb19nYWluX2NvbmZpZygKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvR2FpbkNvbmZpZyYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Db25maWc+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZygKKyAgICAgICAgY29uc3QgYXVkaW9fZ2Fpbl9jb25maWcmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW5wdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfQXVkaW9JbnB1dEZsYWdzX2F1ZGlvX2lucHV0X2ZsYWdzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3MgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzKAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncygKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19pbnB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9hdWRpb19pbnB1dF9mbGFnc19tYXNrKGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX21hc2soYXVkaW9faW5wdXRfZmxhZ3NfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX291dHB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9hdWRpb19vdXRwdXRfZmxhZ3NfbWFzayhpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfbWFzayhhdWRpb19vdXRwdXRfZmxhZ3NfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2ZsYWdzPiBhaWRsMmxlZ2FjeV9BdWRpb0lvRmxhZ3NfYXVkaW9faW9fZmxhZ3MoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0lvRmxhZ3MmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0ZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MoCisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2ZsYWdzJiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zdHJlYW1fdHlwZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RyZWFtVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zb3VyY2VfdD4gYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc2Vzc2lvbl90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChhdWRpb19zZXNzaW9uX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdNaXhFeHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0JiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnPiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19BdWRpb1BvcnRDb25maWcoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnJiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PHN0cnVjdCBhdWRpb19wYXRjaD4gYWlkbDJsZWdhY3lfQXVkaW9QYXRjaF9hdWRpb19wYXRjaCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUGF0Y2gmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9QYXRjaD4gbGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfQXVkaW9QYXRjaCgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoJiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvSW9EZXNjcmlwdG9yPj4gYWlkbDJsZWdhY3lfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvciYgYWlkbCk7CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yPiBsZWdhY3kyYWlkbF9BdWRpb0lvRGVzY3JpcHRvcl9BdWRpb0lvRGVzY3JpcHRvcigKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ2xpZW50PiBhaWRsMmxlZ2FjeV9BdWRpb0NsaWVudChjb25zdCBtZWRpYTo6QXVkaW9DbGllbnQmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9DbGllbnQ+IGxlZ2FjeTJhaWRsX0F1ZGlvQ2xpZW50KGNvbnN0IEF1ZGlvQ2xpZW50JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbnRlbnRfdHlwZV90PgorYWlkbDJsZWdhY3lfQXVkaW9Db250ZW50VHlwZV9hdWRpb19jb250ZW50X3R5cGVfdChtZWRpYTo6QXVkaW9Db250ZW50VHlwZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29udGVudFR5cGU+CitsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGF1ZGlvX2NvbnRlbnRfdHlwZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXNhZ2VfdD4KK2FpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChtZWRpYTo6QXVkaW9Vc2FnZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXNhZ2U+CitsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UoYXVkaW9fdXNhZ2VfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2ZsYWdzX21hc2tfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRmxhZ19hdWRpb19mbGFnc19tYXNrX3QobWVkaWE6OkF1ZGlvRmxhZyBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRmxhZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2ZsYWdzX21hc2tfdF9BdWRpb0ZsYWcoYXVkaW9fZmxhZ3NfbWFza190IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZmxhZ3NfbWFza190PgorYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19mbGFnc19tYXNrX3RfbWFzayhpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X2ludDMyX3RfbWFzayhhdWRpb19mbGFnc19tYXNrX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19hdHRyaWJ1dGVzX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsPgorbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QobWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPgorbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZShhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX29mZmxvYWRfaW5mb190PgorYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChjb25zdCBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvPgorbGVnYWN5MmFpZGxfYXVkaW9fb2ZmbG9hZF9pbmZvX3RfQXVkaW9PZmZsb2FkSW5mbyhjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19jb25maWdfdD4KK2FpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZyYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbmZpZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbnN0IGF1ZGlvX2NvbmZpZ190JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbmZpZ19iYXNlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29uZmlnQmFzZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8c3A8SU1lbW9yeT4+CithaWRsMmxlZ2FjeV9TaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoY29uc3QgbWVkaWE6OlNoYXJlZEZpbGVSZWdpb24mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4KK2xlZ2FjeTJhaWRsX0lNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxzcDxJTWVtb3J5Pj4KK2FpZGwybGVnYWN5X051bGxhYmxlU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OlNoYXJlZEZpbGVSZWdpb24+JiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4+CitsZWdhY3kyYWlkbF9OdWxsYWJsZUlNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxBdWRpb1RpbWVzdGFtcD4KK2FpZGwybGVnYWN5X0F1ZGlvVGltZXN0YW1wKGNvbnN0IG1lZGlhOjpBdWRpb1RpbWVzdGFtcEludGVybmFsJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVGltZXN0YW1wSW50ZXJuYWw+CitsZWdhY3kyYWlkbF9BdWRpb1RpbWVzdGFtcChjb25zdCBBdWRpb1RpbWVzdGFtcCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb191dWlkX3Q+CithaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9VdWlkPgorbGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZChjb25zdCBhdWRpb191dWlkX3QmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4KK2FpZGwybGVnYWN5X0VmZmVjdERlc2NyaXB0b3JfZWZmZWN0X2Rlc2NyaXB0b3JfdChjb25zdCBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPgorbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+CitsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUoCisgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2soaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayh1aW50MzJfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PgorYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2soaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKHVpbnQzMl90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdD4KK2FpZGwybGVnYWN5X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcyBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzPgorbGVnYWN5MmFpZGxfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdF9BdWRpb01peExhdGVuY3lDbGFzcygKKyAgICAgICAgYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfZGV2aWNlX2V4dD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2RldmljZV9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQ+CitsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KGNvbnN0IGF1ZGlvX3BvcnRfZGV2aWNlX2V4dCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X21peF9leHQ+CithaWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHRfYXVkaW9fcG9ydF9taXhfZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRNaXhFeHQmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9taXhfZXh0X0F1ZGlvUG9ydE1peEV4dChjb25zdCBhdWRpb19wb3J0X21peF9leHQmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9zZXNzaW9uX2V4dD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9ydFNlc3Npb25FeHRfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0U2Vzc2lvbkV4dCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRTZXNzaW9uRXh0PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dF9BdWRpb1BvcnRTZXNzaW9uRXh0KGNvbnN0IGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcHJvZmlsZT4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9hdWRpb19wcm9maWxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPgorbGVnYWN5MmFpZGxfYXVkaW9fcHJvZmlsZV9BdWRpb1Byb2ZpbGUoY29uc3QgYXVkaW9fcHJvZmlsZSYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluPgorYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4oY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW4+CitsZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2Fpbihjb25zdCBhdWRpb19nYWluJiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfdjc+CithaWRsMmxlZ2FjeV9BdWRpb1BvcnRfYXVkaW9fcG9ydF92Nyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdjdfQXVkaW9Qb3J0KGNvbnN0IGF1ZGlvX3BvcnRfdjcmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbW9kZV90PgorYWlkbDJsZWdhY3lfQXVkaW9Nb2RlX2F1ZGlvX21vZGVfdChtZWRpYTo6QXVkaW9Nb2RlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Nb2RlPgorbGVnYWN5MmFpZGxfYXVkaW9fbW9kZV90X0F1ZGlvTW9kZShhdWRpb19tb2RlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb191bmlxdWVfaWRfdXNlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb1VuaXF1ZUlkVXNlX2F1ZGlvX3VuaXF1ZV9pZF91c2VfdChtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U+CitsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdXNlX3RfQXVkaW9VbmlxdWVJZFVzZShhdWRpb191bmlxdWVfaWRfdXNlX3QgbGVnYWN5KTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZmI3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9leHBlY3RlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordXNpbmcgQ29udmVyc2lvblJlc3VsdCA9IGJhc2U6OmV4cGVjdGVkPFQsIHN0YXR1c190PjsKKworLy8gQ29udmVuaWVuY2UgbWFjcm9zIGZvciB3b3JraW5nIHdpdGggQ29udmVyc2lvblJlc3VsdCwgdXNlZnVsIGZvciB3cml0aW5nIGNvbnZlcnRlZCBmb3IgYWdncmVnYXRlCisvLyB0eXBlcy4KKworI2RlZmluZSBWQUxVRV9PUl9SRVRVUk4ocmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdXRvIF90bXAgPSAocmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoX3RtcC5lcnJvcigpKTsgXAorICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0pCisKKyNkZWZpbmUgUkVUVVJOX0lGX0VSUk9SKHJlc3VsdCkgXAorICAgIGlmIChzdGF0dXNfdCBfdG1wID0gKHJlc3VsdCk7IF90bXAgIT0gT0spIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKF90bXApOworCisjZGVmaW5lIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoeCkgICAgICAgICAgIFwKKyAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGF1dG8gX3RtcCA9ICh4KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiBfdG1wLmVycm9yKCk7IFwKKyAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgXAorICAgICB9KQorCisvKioKKyAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0byBzYWZlbHkgY2FzdCBiZXR3ZWVuIGludGVncmFsIHR5cGVzLCByZXNwZWN0aW5nIGxpbWl0cyBvZiB0aGUgZGVzdGluYXRpb24KKyAqIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgorQ29udmVyc2lvblJlc3VsdDxUbz4gY29udmVydEludGVncmFsKEZyb20gZnJvbSkgeworICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgaXMgcmVxdWlyZWQgZm9yIHNpZ25lZCAvIHZzLiB1bnNpZ25lZCBjb21wYXJpc29ucywgc2luY2Ugb3RoZXJ3aXNlIHdlIG1heQorICAgIC8vIGhhdmUgdGhlIHNpZ25lZCBjb252ZXJ0ZWQgdG8gdW5zaWduZWQgYW5kIHByb2R1Y2Ugd3JvbmcgcmVzdWx0cy4KKyAgICBpZiAoc3RkOjppc19zaWduZWRfdjxGcm9tPiAmJiAhc3RkOjppc19zaWduZWRfdjxUbz4pIHsKKyAgICAgICAgaWYgKGZyb20gPCAwIHx8IGZyb20gPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRvPjo6bWF4KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0ZDo6aXNfc2lnbmVkX3Y8VG8+ICYmICFzdGQ6OmlzX3NpZ25lZF92PEZyb20+KSB7CisgICAgICAgIGlmIChmcm9tID4gc3RkOjpudW1lcmljX2xpbWl0czxUbz46Om1heCgpKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyb20gPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRvPjo6bWluKCkgfHwgZnJvbSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VG8+OjptYXgoKSkgeworICAgICAgICAgICAgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VG8+KGZyb20pOworfQorCisvKioKKyAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0byBzYWZlbHkgY2FzdCBiZXR3ZWVuIHR5cGVzLCB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB0aGUgc2FtZSBzaXplLCBidXQKKyAqIGludGVycHJldGVkIGRpZmZlcmVudGx5LgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KK0NvbnZlcnNpb25SZXN1bHQ8VG8+IGNvbnZlcnRSZWludGVycHJldChGcm9tIGZyb20pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VG8+KGZyb20pOworfQorCisvKioKKyAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0aGF0IGhlbHBzIGNvbnZlcnQgY29udGFpbmVycyBvZiBjb252ZXJ0aWJsZSB0eXBlcywgdXNpbmcgaXRlcmF0b3JzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBPdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgRnVuYz4KK3N0YXR1c190IGNvbnZlcnRSYW5nZShJbnB1dEl0ZXJhdG9yIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEl0ZXJhdG9yIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jJiBpdGVtQ29udmVyc2lvbikgeworICAgIGZvciAoSW5wdXRJdGVyYXRvciBpdGVyID0gc3RhcnQ7IGl0ZXIgIT0gZW5kOyArK2l0ZXIsICsrb3V0KSB7CisgICAgICAgICpvdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGl0ZW1Db252ZXJzaW9uKCppdGVyKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoqCisgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdGhhdCBoZWxwcyBjb252ZXJ0IGNvbnRhaW5lcnMgb2YgY29udmVydGlibGUgdHlwZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE91dHB1dENvbnRhaW5lciwgdHlwZW5hbWUgSW5wdXRDb250YWluZXIsIHR5cGVuYW1lIEZ1bmM+CitDb252ZXJzaW9uUmVzdWx0PE91dHB1dENvbnRhaW5lcj4KK2NvbnZlcnRDb250YWluZXIoY29uc3QgSW5wdXRDb250YWluZXImIGlucHV0LCBjb25zdCBGdW5jJiBpdGVtQ29udmVyc2lvbikgeworICAgIE91dHB1dENvbnRhaW5lciBvdXRwdXQ7CisgICAgYXV0byBpbnMgPSBzdGQ6Omluc2VydGVyKG91dHB1dCwgb3V0cHV0LmJlZ2luKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGlucHV0KSB7CisgICAgICAgICppbnMgPSBWQUxVRV9PUl9SRVRVUk4oaXRlbUNvbnZlcnNpb24oaXRlbSkpOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVdGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBBSURMIHVuaW9ucy4KKy8vIFVOSU9OX0dFVChvYmosIGZpZWxkbmFtZSkgcmV0dXJucyBhIENvbnZlcnNpb25SZXN1bHQ8VD4gY29udGFpbmluZyBlaXRoZXIgdGhlIHN0cm9uZ2x5LXR5cGVkCisvLyAgIHZhbHVlIG9mIHRoZSByZXNwZWN0aXZlIGZpZWxkLCBvciBCQURfVkFMVUUgaWYgdGhlIHVuaW9uIGlzIG5vdCBzZXQgdG8gdGhlIHJlcXVlc3RlZCBmaWVsZC4KKy8vIFVOSU9OX1NFVChvYmosIGZpZWxkbmFtZSwgdmFsdWUpIHNldHMgdGhlIHJlcXVlc3RlZCBmaWVsZCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQ6OlRhZyB0YWc+Cit1c2luZyBVbmlvbkZpZWxkVHlwZSA9IHN0ZDo6ZGVjYXlfdDxkZWNsdHlwZShzdGQ6OmRlY2x2YWw8VD4oKS50ZW1wbGF0ZSBnZXQ8dGFnPigpKT47CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQ6OlRhZyB0YWc+CitDb252ZXJzaW9uUmVzdWx0PFVuaW9uRmllbGRUeXBlPFQsIHRhZz4+IHVuaW9uR2V0RmllbGQoY29uc3QgVCYgdSkgeworICAgIGlmICh1LmdldFRhZygpICE9IHRhZykgeworICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICByZXR1cm4gdS50ZW1wbGF0ZSBnZXQ8dGFnPigpOworfQorCisjZGVmaW5lIFVOSU9OX0dFVCh1LCBmaWVsZCkgXAorICAgIHVuaW9uR2V0RmllbGQ8c3RkOjpkZWNheV90PGRlY2x0eXBlKHUpPiwgc3RkOjpkZWNheV90PGRlY2x0eXBlKHUpPjo6VGFnOjpmaWVsZD4odSkKKworI2RlZmluZSBVTklPTl9TRVQodSwgZmllbGQsIHZhbHVlKSBcCisgICAgKHUpLnNldDxzdGQ6OmRlY2F5X3Q8ZGVjbHR5cGUodSk+OjpUYWc6OmZpZWxkPih2YWx1ZSkKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaAppbmRleCAyNDdhZjllLi4wYjg5ZDE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCkBAIC0xOCwxNCArMTgsMTIgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19DTElFTlRfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0NMSUVOVF9ICiAKLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEF1ZGlvQ2xpZW50IDogcHVibGljIFBhcmNlbGFibGUgeworY2xhc3MgQXVkaW9DbGllbnQgewogIHB1YmxpYzoKICAgICBBdWRpb0NsaWVudCgpIDoKICAgICAgICAgY2xpZW50VWlkKC0xKSwgY2xpZW50UGlkKC0xKSwgY2xpZW50VGlkKC0xKSwgcGFja2FnZU5hbWUoIiIpIHt9CkBAIC0zNCwyMiArMzIsNiBAQAogICAgIHBpZF90IGNsaWVudFBpZDsKICAgICBwaWRfdCBjbGllbnRUaWQ7CiAgICAgU3RyaW5nMTYgcGFja2FnZU5hbWU7Ci0KLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgewotICAgICAgICBjbGllbnRVaWQgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgICAgICBjbGllbnRQaWQgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgICAgICBjbGllbnRUaWQgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgICAgICBwYWNrYWdlTmFtZSA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihjbGllbnRVaWQpOwotICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoY2xpZW50UGlkKTsKLSAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGNsaWVudFRpZCk7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihwYWNrYWdlTmFtZSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCmluZGV4IGNiNzYyNTIuLjgzNzE3MTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKQEAgLTIyLDggKzIyLDYgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KIApAQCAtMzEsNiArMjksOSBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lFZmZlY3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuRWZmZWN0Q2xpZW50LmgiCisKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMzksMTYgKzM0MCwyMSBAQAogICAgICAqCiAgICAgICogb3BQYWNrYWdlTmFtZTogICAgICBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCiAgICAgICovCi0gICAgQXVkaW9FZmZlY3QoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOworICAgIGV4cGxpY2l0IEF1ZGlvRWZmZWN0KGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKIAorICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvRWZmZWN0IGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KKyAgICAgKiBUaGUgZWZmZWN0IGVuZ2luZSBpcyBhbHNvIGRlc3Ryb3llZCBpZiB0aGlzIEF1ZGlvRWZmZWN0IHdhcyB0aGUgbGFzdCBjb250cm9sbGluZworICAgICAqIHRoZSBlbmdpbmUuCisgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICB+QXVkaW9FZmZlY3QoKTsKIAotICAgIC8qIENvbnN0cnVjdG9yLgorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYW4gdW5pbml0aWFsaXplZCBBdWRpb0VmZmVjdC4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICoKICAgICAgKiB0eXBlOiAgdHlwZSBvZiBlZmZlY3QgY3JlYXRlZDogY2FuIGJlIG51bGwgaWYgdXVpZCBpcyBzcGVjaWZpZWQuIFRoaXMgY29ycmVzcG9uZHMgdG8KICAgICAgKiAgICAgICAgdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QuCi0gICAgICogb3BQYWNrYWdlTmFtZTogIFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KICAgICAgKiB1dWlkOiAgVXVpZCBvZiBlZmZlY3QgY3JlYXRlZDogY2FuIGJlIG51bGwgaWYgdHlwZSBpcyBzcGVjaWZpZWQuIFRoaXMgdXVpZCBjb3JyZXNwb25kcyB0bwogICAgICAqICAgICAgICBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuCiAgICAgICogcHJpb3JpdHk6ICAgIHJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKQEAgLTM1Niw3ICszNjIsNyBAQAogICAgICAqICAgICAgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KICAgICAgKiBjYmY6ICAgICAgICAgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBlZmZlY3RfY2FsbGJhY2tfdCkKICAgICAgKiB1c2VyOiAgICAgICAgcG9pbnRlciB0byBjb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgotICAgICAqIHNlc3Npb25JRDogICBhdWRpbyBzZXNzaW9uIHRoaXMgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8uCisgICAgICogc2Vzc2lvbklkOiAgIGF1ZGlvIHNlc3Npb24gdGhpcyBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0by4KICAgICAgKiAgICAgIElmIGVxdWFsIHRvIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgdGhlIGVmZmVjdCB3aWxsIGJlIGdsb2JhbCB0bwogICAgICAqICAgICAgdGhlIG91dHB1dCBtaXguICBPdGhlcndpc2UsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCiAgICAgICogICAgICAoQXVkaW9UcmFjayBvciBNZWRpYVBMYXllcikgd2l0aGluIHRoZSBzYW1lIGF1ZGlvIHNlc3Npb24uCkBAIC0zNjksNDYgKzM3NSwxMyBAQAogICAgICAqICAgICAgICBJbiB0aGlzIG1vZGUsIG5vIElFZmZlY3QgaW50ZXJmYWNlIHRvIEF1ZGlvRmxpbmdlciBpcyBjcmVhdGVkIGFuZCBhbGwgYWN0aW9ucwogICAgICAqICAgICAgICBiZXNpZGVzIGdldHRlcnMgaW1wbGVtZW50ZWQgaW4gY2xpZW50IEF1ZGlvRWZmZWN0IG9iamVjdCBhcmUgbm8gb3BzCiAgICAgICogICAgICAgIGFmdGVyIGVmZmVjdCBjcmVhdGlvbi4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAtIE5PX0VSUk9SIG9yIEFMUkVBRFlfRVhJU1RTOiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IEF1ZGlvRWZmZWN0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICAgKiAgLSBCQURfVkFMVUU6IGludmFsaWQgcGFyYW1ldGVyCisgICAgICogIC0gTk9fSU5JVDogYXVkaW8gZmxpbmdlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKi8KLQotICAgIEF1ZGlvRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCA9IE5VTEwsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCi0gICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKLSAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlID0ge30sCi0gICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlKTsKLQotICAgIC8qIENvbnN0cnVjdG9yLgotICAgICAqICAgICAgU2FtZSBhcyBhYm92ZSBidXQgd2l0aCB0eXBlIGFuZCB1dWlkIHNwZWNpZmllZCBieSBjaGFyYWN0ZXIgc3RyaW5ncwotICAgICAqLwotICAgIEF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCi0gICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlKTsKLQotICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvRWZmZWN0IGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KLSAgICAgKiBUaGUgZWZmZWN0IGVuZ2luZSBpcyBhbHNvIGRlc3Ryb3llZCBpZiB0aGlzIEF1ZGlvRWZmZWN0IHdhcyB0aGUgbGFzdCBjb250cm9sbGluZwotICAgICAqIHRoZSBlbmdpbmUuCi0gICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICB+QXVkaW9FZmZlY3QoKTsKLQotICAgIC8qIEluaXRpYWxpemUgYW4gdW5pbml0aWFsaXplZCBBdWRpb0VmZmVjdC4KLSAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgotICAgICogIC0gTk9fRVJST1Igb3IgQUxSRUFEWV9FWElTVFM6IHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KLSAgICAqICAtIElOVkFMSURfT1BFUkFUSU9OOiBBdWRpb0VmZmVjdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkCi0gICAgKiAgLSBCQURfVkFMVUU6IGludmFsaWQgcGFyYW1ldGVyCi0gICAgKiAgLSBOT19JTklUOiBhdWRpbyBmbGluZ2VyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAotICAgICogKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLApAQCAtNDE4LDYgKzM5MSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlID0ge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlKTsKKyAgICAvKgorICAgICAqIFNhbWUgYXMgYWJvdmUgYnV0IHdpdGggdHlwZSBhbmQgdXVpZCBzcGVjaWZpZWQgYnkgY2hhcmFjdGVyIHN0cmluZ3MuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UpOwogCiAgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9FZmZlY3QuIFRoaXMgbXVzdCBiZSBjaGVja2VkCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb0VmZmVjdCBBUEkuCkBAIC01NDcsOTAgKzUzMiw2NyBAQAogICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heFByZVByb2Nlc3NpbmcgPSAxMDsKIAogcHJvdGVjdGVkOgotICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZDsgICAgICAgICAgIC8vIGVuYWJsZSBzdGF0ZQotICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOyAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKLSAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVByaW9yaXR5OyAgICAgICAgICAvLyBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2wKLSAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1czsgICAgICAgICAgICAvLyBlZmZlY3Qgc3RhdHVzCi0gICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Qcm9iZTsgICAgICAgICAgICAgLy8gZWZmZWN0IGNyZWF0ZWQgaW4gcHJvYmUgbW9kZTogYWxsIGNvbW1hbmRzCisgICAgIGNvbnN0IFN0cmluZzE2ICAgICAgICAgIG1PcFBhY2thZ2VOYW1lOyAgICAgLy8gVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgorICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOyAgIC8vIGVuYWJsZSBzdGF0ZQorICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYOyAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1Qcmlvcml0eSA9IDA7ICAgICAgLy8gcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sCisgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXMgPSBOT19JTklUOyAgLy8gZWZmZWN0IHN0YXR1cworICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUHJvYmUgPSBmYWxzZTsgICAgIC8vIGVmZmVjdCBjcmVhdGVkIGluIHByb2JlIG1vZGU6IGFsbCBjb21tYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBubyBvcHMgYmVjYXVzZSBtSUVmZmVjdCBpcyBOVUxMCi0gICAgIGVmZmVjdF9jYWxsYmFja190ICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0YXR1cywgY29udHJvbCBhbmQKKyAgICAgZWZmZWN0X2NhbGxiYWNrX3QgICAgICAgbUNiZiA9IG51bGxwdHI7ICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3Igc3RhdHVzLCBjb250cm9sIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciBjaGFuZ2VzIG5vdGlmaWNhdGlvbnMKLSAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOyAgICAgICAgICAvLyBjbGllbnQgY29udGV4dCBmb3IgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAgICAgbURlc2NyaXB0b3I7ICAgICAgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgotICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtSWQ7ICAgICAgICAgICAgICAgIC8vIHN5c3RlbSB3aWRlIHVuaXF1ZSBlZmZlY3QgZW5naW5lIGluc3RhbmNlIElECisgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YSA9IG51bGxwdHI7Ly8gY2xpZW50IGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgICAgIG1EZXNjcmlwdG9yID0ge307ICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUlkID0gLTE7ICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAogICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgICAgIC8vIE11dGV4IGZvciBtRW5hYmxlZCBhY2Nlc3MKLSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUNvbnN0cnVjdExvY2s7ICAgICAvLyBNdXRleCBmb3IgaW50ZWdyYWxpdHkgY29uc3RydWN0aW9uCiAKLSAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7ICAgICAvLyBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCiAKICAgICAgLy8gSUVmZmVjdENsaWVudAogICAgICB2aXJ0dWFsIHZvaWQgY29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCk7CiAgICAgIHZpcnR1YWwgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7Ci0gICAgIHZpcnR1YWwgdm9pZCBjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSwKLSAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZChpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlcGx5RGF0YSk7CiAKIHByaXZhdGU6CiAKICAgICAgLy8gSW1wbGVtZW50cyB0aGUgSUVmZmVjdENsaWVudCBpbnRlcmZhY2UKICAgICBjbGFzcyBFZmZlY3RDbGllbnQgOgotICAgICAgICBwdWJsaWMgYW5kcm9pZDo6Qm5FZmZlY3RDbGllbnQsIHB1YmxpYyBhbmRyb2lkOjpJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICBwdWJsaWMgbWVkaWE6OkJuRWZmZWN0Q2xpZW50LCBwdWJsaWMgYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKICAgICB7CiAgICAgcHVibGljOgogCiAgICAgICAgIEVmZmVjdENsaWVudChBdWRpb0VmZmVjdCAqZWZmZWN0KSA6IG1FZmZlY3QoZWZmZWN0KXt9CiAKICAgICAgICAgLy8gSUVmZmVjdENsaWVudAotICAgICAgICB2aXJ0dWFsIHZvaWQgY29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCkgeworICAgICAgICBiaW5kZXI6OlN0YXR1cyBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSBvdmVycmlkZSB7CiAgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEdvdCB0aGUgbUNvbnN0cnVjdExvY2sgbWVhbnMgdGhlIGNvbnN0cnVjdGlvbiBvZiBBdWRpb0VmZmVjdAotICAgICAgICAgICAgICAgICAgICAvLyBoYXMgZmluaXNoZWQsIHdlIHNob3VsZCByZWxlYXNlIHRoZSBtQ29uc3RydWN0TG9jayBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2soZWZmZWN0LT5tQ29uc3RydWN0TG9jayk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29udHJvbFN0YXR1c0NoYW5nZWQoY29udHJvbEdyYW50ZWQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgeworICAgICAgICBiaW5kZXI6OlN0YXR1cyBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGUgewogICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBHb3QgdGhlIG1Db25zdHJ1Y3RMb2NrIG1lYW5zIHRoZSBjb25zdHJ1Y3Rpb24gb2YgQXVkaW9FZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGZpbmlzaGVkLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUgbUNvbnN0cnVjdExvY2sgaW1tZWRpYXRlbHkuCi0gICAgICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKGVmZmVjdC0+bUNvbnN0cnVjdExvY2spOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3QtPmVuYWJsZVN0YXR1c0NoYW5nZWQoZW5hYmxlZCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KLSAgICAgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgY29tbWFuZEV4ZWN1dGVkKGludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXBseURhdGEpIG92ZXJyaWRlIHsKICAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gR290IHRoZSBtQ29uc3RydWN0TG9jayBtZWFucyB0aGUgY29uc3RydWN0aW9uIG9mIEF1ZGlvRWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhcyBmaW5pc2hlZCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIG1Db25zdHJ1Y3RMb2NrIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhlZmZlY3QtPm1Db25zdHJ1Y3RMb2NrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWZmZWN0LT5jb21tYW5kRXhlY3V0ZWQoCi0gICAgICAgICAgICAgICAgICAgIGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZERhdGEsIHJlcGx5RGF0YSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgewogICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBHb3QgdGhlIG1Db25zdHJ1Y3RMb2NrIG1lYW5zIHRoZSBjb25zdHJ1Y3Rpb24gb2YgQXVkaW9FZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGZpbmlzaGVkLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUgbUNvbnN0cnVjdExvY2sgaW1tZWRpYXRlbHkuCi0gICAgICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKGVmZmVjdC0+bUNvbnN0cnVjdExvY2spOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3QtPmJpbmRlckRpZWQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjQxLDEwICs2MDMsMTAgQEAKIAogICAgIHZvaWQgYmluZGVyRGllZCgpOwogCi0gICAgc3A8SUVmZmVjdD4gICAgICAgICAgICAgbUlFZmZlY3Q7ICAgICAgICAgICAvLyBJRWZmZWN0IGJpbmRlciBpbnRlcmZhY2UKKyAgICBzcDxtZWRpYTo6SUVmZmVjdD4gICAgICBtSUVmZmVjdDsgICAgICAgICAgIC8vIElFZmZlY3QgYmluZGVyIGludGVyZmFjZQogICAgIHNwPEVmZmVjdENsaWVudD4gICAgICAgIG1JRWZmZWN0Q2xpZW50OyAgICAgLy8gSUVmZmVjdENsaWVudCBpbXBsZW1lbnRhdGlvbgogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKLSAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nCisgICAgZWZmZWN0X3BhcmFtX2NibGtfdCogICAgbUNibGsgPSBudWxscHRyOyAgICAvLyBjb250cm9sIGJsb2NrIGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZwogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQgPSAocGlkX3QpLTE7CiAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCA9ICh1aWRfdCktMTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMTljMmNiZC4uZGZjMTk4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMTksMTIgKzE5LDEyIEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5BdWRpb0ZsaW5nZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KICNpbmNsdWRlIDxzZXQ+CkBAIC0zNjEsMTEgKzM2MSwxMSBAQAogCiAgICAgc3RhdGljIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOwogCiAgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgc3RhdGljIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKTsKIApAQCAtNDI1LDEzICs0MjUsMjkgQEAKICAgICAgKi8KICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcyk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSk7CisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUpOwogCi0gICAgc3RhdGljIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CisgICAgc3RhdGljIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOwpAQCAtNTE1LDcgKzUzMSw3IEBACiAKIHByaXZhdGU6CiAKLSAgICBjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIEJuQXVkaW9GbGluZ2VyQ2xpZW50CisgICAgY2xhc3MgQXVkaW9GbGluZ2VyQ2xpZW50OiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsIHB1YmxpYyBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJDbGllbnQKICAgICB7CiAgICAgcHVibGljOgogICAgICAgICBBdWRpb0ZsaW5nZXJDbGllbnQoKSA6CkBAIC01MzUsOSArNTUxLDkgQEAKIAogICAgICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiB0aGUgY29uZmlndXJhdGlvbiBvZiBhbiBvdXRwdXQgb3IgaW5wdXQ6IGtlZXBzIHRoZSBjYWNoZWQKICAgICAgICAgLy8gdmFsdWVzIGZvciBvdXRwdXQvaW5wdXQgcGFyYW1ldGVycyB1cC10by1kYXRlIGluIGNsaWVudCBwcm9jZXNzCi0gICAgICAgIHZpcnR1YWwgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgaW9EZXNjKTsKLQorICAgICAgICBiaW5kZXI6OlN0YXR1cyBpb0NvbmZpZ0NoYW5nZWQoCisgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIGlvRGVzYykgb3ZlcnJpZGU7CiAKICAgICAgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IDBkYmQ4NDIuLjM3MjhhMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC0xNywxNiArMTcsMjAgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT1RSQUNLX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT1RSQUNLX0gKIAorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01vZHVsby5oPgorI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAorI2luY2x1ZGUgPHN0cmluZz4KKwogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQm5BdWRpb1RyYWNrQ2FsbGJhY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrLmgiCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFja0NhbGxiYWNrLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTE3Nyw2ICsxODEsOCBAQAogICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjaygpOwogCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lKTsKKwogICAgIC8qIENyZWF0ZXMgYW4gQXVkaW9UcmFjayBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBPbmNlIGNyZWF0ZWQsIHRoZSB0cmFjayBuZWVkcyB0byBiZSBzdGFydGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KICAgICAgKiBVbnNwZWNpZmllZCB2YWx1ZXMgYXJlIHNldCB0byBhcHByb3ByaWF0ZSBkZWZhdWx0IHZhbHVlcy4KQEAgLTI1OCw3ICsyNjQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lID0gIiIpOwogCiAgICAgLyogQ3JlYXRlcyBhbiBhdWRpbyB0cmFjayBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggQXVkaW9GbGluZ2VyLgogICAgICAqIFdpdGggdGhpcyBjb25zdHJ1Y3RvciwgdGhlIHRyYWNrIGlzIGNvbmZpZ3VyZWQgZm9yIHN0YXRpYyBidWZmZXIgbW9kZS4KQEAgLTI4OCw3ICsyOTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUgPSAiIik7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb1RyYWNrIGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KICAgICAgKiBBbHNvIGRlc3Ryb3lzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBdWRpb1RyYWNrLgpAQCAtMzM4LDYgKzM0NiwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAvLyBGSVhNRShiLzE2OTg4OTcxNCk6IFZlbmRvciBjb2RlIGRlcGVuZHMgb24gdGhlIG9sZCBtZXRob2Qgc2lnbmF0dXJlIGF0IGxpbmsgdGltZQorICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogCiAgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9UcmFjay4gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZm9yIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvVHJhY2sgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwpAQCAtMTA0NCw3ICsxMDczLDcgQEAKICAgICAgICAgICAgIHZvaWQgICAgIHVwZGF0ZVJvdXRlZERldmljZUlkX2woKTsKIAogICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCi0gICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CisgICAgc3A8bWVkaWE6OklBdWRpb1RyYWNrPiAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQogICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gZnJvbSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigpCkBAIC0xMjM2LDYgKzEyNjUsOCBAQAogCiAgICAgc3A8bWVkaWE6OlZvbHVtZUhhbmRsZXI+ICAgICAgIG1Wb2x1bWVIYW5kbGVyOwogCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgICAgICBtT3BQYWNrYWdlTmFtZTsKKwogcHJpdmF0ZToKICAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IDYxMmNlN2EuLjlhODAxNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC0yNCwxMDEgKzI0LDUyIEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUVmZmVjdENsaWVudC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQXVkaW9GbGluZ2VyU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQnBBdWRpb0ZsaW5nZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXNwb25zZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVxdWVzdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVzcG9uc2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVxdWVzdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXNwb25zZS5oIgogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFjay5oIgogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvSUF1ZGlvVHJhY2tDYWxsYmFjay5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvSUVmZmVjdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvSUVmZmVjdENsaWVudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVxdWVzdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVzcG9uc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIElBdWRpb0ZsaW5nZXIgOiBwdWJsaWMgSUludGVyZmFjZQoteworY2xhc3MgSUF1ZGlvRmxpbmdlciA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlcik7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIERFRkFVTFRfU0VSVklDRV9OQU1FW10gPSAibWVkaWEuYXVkaW9fZmxpbmdlciI7CisKKyAgICB2aXJ0dWFsIH5JQXVkaW9GbGluZ2VyKCkgPSBkZWZhdWx0OwogCiAgICAgLyogQ3JlYXRlVHJhY2tJbnB1dCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9UcmFjayB0byBBdWRpb0ZsaW5nZXIKICAgICAgKiB3aGVuIGNhbGxpbmcgY3JlYXRlVHJhY2soKSBpbmNsdWRpbmcgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGJ5IEF1ZGlvRmxpbmdlcgogICAgICAqIGFuZCByZXR1cm5lZCBpbiBDcmVhdGVUcmFja091dHB1dCBvYmplY3QKICAgICAgKi8KLSAgICBjbGFzcyBDcmVhdGVUcmFja0lucHV0IDogcHVibGljIFBhcmNlbGFibGUgeworICAgIGNsYXNzIENyZWF0ZVRyYWNrSW5wdXQgewogICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8qIGlucHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICBtZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dHIudGFnc1tBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLTFdID0gJ1wwJzsKLSAgICAgICAgICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKLSAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2xpZW50SW5mby5yZWFkRnJvbVBhcmNlbChwYXJjZWwpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZEludDMyKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzaW5nIHVuc2VjdXJlUG9pbnRlcigpIGhhcyBzb21lIGFzc29jaWF0ZWQgc2VjdXJpdHkKLSAgICAgICAgICAgICAgICAvLyAgICAgICBwaXRmYWxscyAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KLSAgICAgICAgICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAvLyAgICAgICB0aGUgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCi0gICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCB8fCBzaGFyZWRCdWZmZXItPnVuc2VjdXJlUG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZmljYXRpb25zUGVyQnVmZmVyID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwZWVkID0gcGFyY2VsLT5yZWFkRmxvYXQoKTsKLSAgICAgICAgICAgIGF1ZGlvVHJhY2tDYWxsYmFjayA9IGludGVyZmFjZV9jYXN0PG1lZGlhOjpJQXVkaW9UcmFja0NhbGxiYWNrPigKLSAgICAgICAgICAgICAgICAgICAgcGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCkpOwotCi0gICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmZmxhZ3MsIHNpemVvZihhdWRpb19vdXRwdXRfZmxhZ3NfdCkpOwotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7Ci0gICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvKiBpbnB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKLSAgICAgICAgICAgICh2b2lkKWNsaWVudEluZm8ud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc2hhcmVkQnVmZmVyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMihub3RpZmljYXRpb25zUGVyQnVmZmVyKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVGbG9hdChzcGVlZCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGF1ZGlvVHJhY2tDYWxsYmFjaykpOwotCi0gICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmZsYWdzLCBzaXplb2YoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCiAgICAgICAgIC8qIGlucHV0ICovCiAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOwogICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWc7CkBAIC0xMjcsNiArNzgsNyBAQAogICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25zUGVyQnVmZmVyOwogICAgICAgICBmbG9hdCBzcGVlZDsKICAgICAgICAgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+IGF1ZGlvVHJhY2tDYWxsYmFjazsKKyAgICAgICAgc3RkOjpzdHJpbmcgb3BQYWNrYWdlTmFtZTsKIAogICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CkBAIC0xMzQsNTAgKzg2LDE3IEBACiAgICAgICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50OwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQ7CisKKyAgICAgICAgQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0PiB0b0FpZGwoKSBjb25zdDsKKyAgICAgICAgc3RhdGljIENvbnZlcnNpb25SZXN1bHQ8Q3JlYXRlVHJhY2tJbnB1dD4gZnJvbUFpZGwoY29uc3QgbWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdCYgYWlkbCk7CiAgICAgfTsKIAogICAgIC8qIENyZWF0ZVRyYWNrT3V0cHV0IGNvbnRhaW5zIGFsbCBvdXRwdXQgYXJndW1lbnRzIHJldHVybmVkIGJ5IEF1ZGlvRmxpbmdlciB0byBBdWRpb1RyYWNrCiAgICAgICogd2hlbiBjYWxsaW5nIGNyZWF0ZVRyYWNrKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIEkvTyBmb3IgdXBkYXRlIGJ5CiAgICAgICogQ3JlYXRlVHJhY2tJbnB1dC4KICAgICAgKi8KLSAgICBjbGFzcyBDcmVhdGVUcmFja091dHB1dCA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKKyAgICBjbGFzcyBDcmVhdGVUcmFja091dHB1dCB7CiAgICAgcHVibGljOgotICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJmZsYWdzLCBzaXplb2YoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKTsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOwotCi0gICAgICAgICAgICAvKiBvdXRwdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBwYXJjZWwtPnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIGFmRnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7Ci0gICAgICAgICAgICBhZlNhbXBsZVJhdGUgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgYWZMYXRlbmN5TXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZvdXRwdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmZmxhZ3MsIHNpemVvZihhdWRpb19vdXRwdXRfZmxhZ3NfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGZyYW1lQ291bnQpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lQ291bnQpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOwotCi0gICAgICAgICAgICAvKiBvdXRwdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVVaW50MzIoc2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoYWZGcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChhZlNhbXBsZVJhdGUpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKGFmTGF0ZW5jeU1zKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCiAgICAgICAgIC8qIGlucHV0L291dHB1dCAqLwogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CkBAIC0xOTIsNTkgKzExMSwxOCBAQAogICAgICAgICB1aW50MzJfdCBhZkxhdGVuY3lNczsKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0SWQ7CiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOworICAgICAgICBzcDxtZWRpYTo6SUF1ZGlvVHJhY2s+IGF1ZGlvVHJhY2s7CisKKyAgICAgICAgQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlVHJhY2tSZXNwb25zZT4gdG9BaWRsKCkgY29uc3Q7CisgICAgICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PENyZWF0ZVRyYWNrT3V0cHV0PiBmcm9tQWlkbChjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXNwb25zZSYgYWlkbCk7CiAgICAgfTsKIAogICAgIC8qIENyZWF0ZVJlY29yZElucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1JlY29yZCB0byBBdWRpb0ZsaW5nZXIKICAgICAgKiB3aGVuIGNhbGxpbmcgY3JlYXRlUmVjb3JkKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgdXBkYXRlZCBieSBBdWRpb0ZsaW5nZXIKICAgICAgKiBhbmQgcmV0dXJuZWQgaW4gQ3JlYXRlUmVjb3JkT3V0cHV0IG9iamVjdAogICAgICAqLwotICAgIGNsYXNzIENyZWF0ZVJlY29yZElucHV0IDogcHVibGljIFBhcmNlbGFibGUgeworICAgIGNsYXNzIENyZWF0ZVJlY29yZElucHV0IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvKiBpbnB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdHRyLnRhZ3NbQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0xXSA9ICdcMCc7Ci0gICAgICAgICAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKTsKLSAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbGllbnRJbmZvLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcFBhY2thZ2VOYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWQoJnJpaWQsIHNpemVvZihhdWRpb191bmlxdWVfaWRfdCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmZmxhZ3MsIHNpemVvZihhdWRpb19pbnB1dF9mbGFnc190KSk7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8qIGlucHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7Ci0gICAgICAgICAgICAodm9pZCljbGllbnRJbmZvLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnJpaWQsIHNpemVvZihhdWRpb191bmlxdWVfaWRfdCkpOwotCi0gICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmZsYWdzLCBzaXplb2YoYXVkaW9faW5wdXRfZmxhZ3NfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGZyYW1lQ291bnQpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lQ291bnQpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KICAgICAgICAgLyogaW5wdXQgKi8KICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHI7CiAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOwpAQCAtMjU4LDc3ICsxMzYsMTcgQEAKICAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZDsKKworICAgICAgICBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpDcmVhdGVSZWNvcmRSZXF1ZXN0PiB0b0FpZGwoKSBjb25zdDsKKyAgICAgICAgc3RhdGljIENvbnZlcnNpb25SZXN1bHQ8Q3JlYXRlUmVjb3JkSW5wdXQ+IGZyb21BaWRsKGNvbnN0IG1lZGlhOjpDcmVhdGVSZWNvcmRSZXF1ZXN0JiBhaWRsKTsKICAgICB9OwogCiAgICAgLyogQ3JlYXRlUmVjb3JkT3V0cHV0IGNvbnRhaW5zIGFsbCBvdXRwdXQgYXJndW1lbnRzIHJldHVybmVkIGJ5IEF1ZGlvRmxpbmdlciB0byBBdWRpb1JlY29yZAogICAgICAqIHdoZW4gY2FsbGluZyBjcmVhdGVSZWNvcmQoKSBpbmNsdWRpbmcgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgYXMgSS9PIGZvciB1cGRhdGUgYnkKICAgICAgKiBDcmVhdGVSZWNvcmRJbnB1dC4KICAgICAgKi8KLSAgICBjbGFzcyBDcmVhdGVSZWNvcmRPdXRwdXQgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CisgICAgY2xhc3MgQ3JlYXRlUmVjb3JkT3V0cHV0IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmZmxhZ3MsIHNpemVvZihhdWRpb19pbnB1dF9mbGFnc190KSk7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKLQotICAgICAgICAgICAgLyogb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICBzYW1wbGVSYXRlID0gcGFyY2VsLT5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJmlucHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOwotICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZEludDMyKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGNibGsgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eQotICAgICAgICAgICAgICAgIC8vICAgICAgIHBpdGZhbGxzIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAgICAgICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcwotICAgICAgICAgICAgICAgIC8vICAgICAgIHRoZSBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KLSAgICAgICAgICAgICAgICBpZiAoY2JsayA9PSAwIHx8IGNibGstPnVuc2VjdXJlUG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkSW50MzIoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVycyA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgcGl0ZmFsbHMgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgRWl0aGVyIGRvY3VtZW50IHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgY2FzZSBvciBhZGRyZXNzCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdGhlIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgotICAgICAgICAgICAgICAgIGlmIChidWZmZXJzID09IDAgfHwgYnVmZmVycy0+dW5zZWN1cmVQb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKLQotICAgICAgICAgICAgLyogb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlVWludDMyKHNhbXBsZVJhdGUpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmaW5wdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7Ci0gICAgICAgICAgICBpZiAoY2JsayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2JsaykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnVmZmVycyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVycykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCiAgICAgICAgIC8qIGlucHV0L291dHB1dCAqLwogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOwogICAgICAgICBzaXplX3QgZnJhbWVDb3VudDsKQEAgLTM0MiwyMSArMTYwLDI2IEBACiAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7CiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOworICAgICAgICBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBhdWRpb1JlY29yZDsKKworICAgICAgICBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZT4gdG9BaWRsKCkgY29uc3Q7CisgICAgICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PENyZWF0ZVJlY29yZE91dHB1dD4KKyAgICAgICAgZnJvbUFpZGwoY29uc3QgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlJiBhaWRsKTsKICAgICB9OwogCi0gICAgLy8gaW52YXJpYW50IG9uIGV4aXQgZm9yIGFsbCBBUElzIHRoYXQgcmV0dXJuIGFuIHNwPD46Ci0gICAgLy8gICAocmV0dXJuIHZhbHVlICE9IDApID09ICgqc3RhdHVzID09IE5PX0VSUk9SKQotCiAgICAgLyogY3JlYXRlIGFuIGF1ZGlvIHRyYWNrIGFuZCByZWdpc3RlcnMgaXQgd2l0aCBBdWRpb0ZsaW5nZXIuCi0gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqIFRoZSBhdWRpb1RyYWNrIGZpZWxkIHdpbGwgYmUgbnVsbCBpZiB0aGUgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQgYW5kIHRoZSBzdGF0dXMgd2lsbCByZWZsZWN0CisgICAgICogZmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjayhjb25zdCBDcmVhdGVUcmFja0lucHV0JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUcmFja091dHB1dCYgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVRyYWNrKGNvbnN0IG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2UmIG91dHB1dCkgPSAwOwogCi0gICAgdmlydHVhbCBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBjcmVhdGVSZWNvcmQoY29uc3QgQ3JlYXRlUmVjb3JkSW5wdXQmIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVJlY29yZE91dHB1dCYgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpID0gMDsKKyAgICAvKiBjcmVhdGUgYW4gYXVkaW8gcmVjb3JkIGFuZCByZWdpc3RlcnMgaXQgd2l0aCBBdWRpb0ZsaW5nZXIuCisgICAgICogVGhlIGF1ZGlvUmVjb3JkIGZpZWxkIHdpbGwgYmUgbnVsbCBpZiB0aGUgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQgYW5kIHRoZSBzdGF0dXMgd2lsbCByZWZsZWN0CisgICAgICogZmFpbHVyZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVJlY29yZChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlJiBvdXRwdXQpID0gMDsKIAogICAgIC8vIEZJWE1FIFN1cnByaXNpbmdseSwgZm9ybWF0L2xhdGVuY3kgZG9uJ3Qgd29yayBmb3IgaW5wdXQgaGFuZGxlcwogCkBAIC00MTIsMzIgKzIzNSwyNCBAQAogICAgIC8vIFJlZ2lzdGVyIGFuIG9iamVjdCB0byByZWNlaXZlIGF1ZGlvIGlucHV0L291dHB1dCBjaGFuZ2UgYW5kIHRyYWNrIG5vdGlmaWNhdGlvbnMuCiAgICAgLy8gRm9yIGEgZ2l2ZW4gY2FsbGluZyBwaWQsIEF1ZGlvRmxpbmdlciBkaXNyZWdhcmRzIGFueSByZWdpc3RyYXRpb25zIGFmdGVyIHRoZSBmaXJzdC4KICAgICAvLyBUaHVzIHRoZSBJQXVkaW9GbGluZ2VyQ2xpZW50IG11c3QgYmUgYSBzaW5nbGV0b24gcGVyIHByb2Nlc3MuCi0gICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8bWVkaWE6OklBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpID0gMDsKIAogICAgIC8vIHJldHJpZXZlIHRoZSBhdWRpbyByZWNvcmRpbmcgYnVmZmVyIHNpemUgaW4gYnl0ZXMKICAgICAvLyBGSVhNRSBUaGlzIEFQSSBhc3N1bWVzIGEgcm91dGUsIGFuZCBzbyBzaG91bGQgYmUgZGVwcmVjYXRlZC4KICAgICB2aXJ0dWFsIHNpemVfdCBnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlKiByZXNwb25zZSkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0KGNvbnN0IG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSogcmVzcG9uc2UpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CkBAIC00NjMsMjAgKzI3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIGRvZXNuJ3QgdGFrZSBvdmVyIGhhbmRsZSByZWZlcmVuY2UgZnJvbSBjbGllbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FsbGluZ1BhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVzcG9uc2UqIHJlc3BvbnNlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpID0gMDsKQEAgLTQ5OSwxMiArMzAyLDggQEAKICAgICAvLyBpcyBvYnRhaW5lZCBmcm9tIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5NZW1vcnlJbmZvLnRvdGFsTWVtLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpID0gMDsKIAotICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykgPSAwOwotCiAgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpID0gMDsKIAogICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC01MzQsMjIgKzMzMywyODIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpID0gMDsKIH07CiAKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkF1ZGlvRmxpbmdlciA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9GbGluZ2VyPgoteworLyoqCisgKiBBIGNsaWVudC1zaWRlIGFkYXB0ZXIsIHdyYXBwaW5nIGFuIElBdWRpb0ZsaW5nZXJTZXJ2aWNlIGluc3RhbmNlIGFuZCBwcmVzZW50aW5nIGl0IGFzIGFuCisgKiBJQXVkaW9GbGluZ2VyLiBJbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGxlZ2FjeSBjbGllbnQgY29kZSB0aGF0IHdhcyB3cml0dGVuIGFnYWluc3QgSUF1ZGlvRmxpbmdlciwKKyAqIGJlZm9yZSBJQXVkaW9GbGluZ2VyU2VydmljZSB3YXMgaW50cm9kdWNlZCBhcyBhbiBBSURMIHNlcnZpY2UuCisgKiBOZXcgY2xpZW50cyBzaG91bGQgbm90IHVzZSB0aGlzIGFkYXB0ZXIsIGJ1dCByYXRoZXIgSUF1ZGlvRmxpbmdlclNlcnZpY2UgZGlyZWN0bHksIHZpYQorICogQnBBdWRpb0ZsaW5nZXJTZXJ2aWNlLgorICovCitjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyIDogcHVibGljIElBdWRpb0ZsaW5nZXIgewogcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworICAgIGV4cGxpY2l0IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXIoY29uc3Qgc3A8bWVkaWE6OklBdWRpb0ZsaW5nZXJTZXJ2aWNlPiBkZWxlZ2F0ZSk7CiAKLSAgICAvLyBSZXF1ZXN0cyBtZWRpYS5sb2cgdG8gc3RhcnQgbWVyZ2luZyBsb2cgYnVmZmVycwotICAgIHZpcnR1YWwgdm9pZCByZXF1ZXN0TG9nTWVyZ2UoKSA9IDA7CisgICAgc3RhdHVzX3QgY3JlYXRlVHJhY2soY29uc3QgbWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdCYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2UmIG91dHB1dCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY3JlYXRlUmVjb3JkKGNvbnN0IG1lZGlhOjpDcmVhdGVSZWNvcmRSZXF1ZXN0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlJiBvdXRwdXQpIG92ZXJyaWRlOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0IG92ZXJyaWRlOworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0IG92ZXJyaWRlOworICAgIHNpemVfdCBmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCBvdmVycmlkZTsKKyAgICB1aW50MzJfdCBsYXRlbmN5KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpIG92ZXJyaWRlOworICAgIGZsb2F0IG1hc3RlclZvbHVtZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgbWFzdGVyTXV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCogYmFsYW5jZSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIG11dGVkKSBvdmVycmlkZTsKKyAgICBmbG9hdCBzdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBzdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIG92ZXJyaWRlOworICAgIGJvb2wgZ2V0TWljTXV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UmVjb3JkU2lsZW5jZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSBvdmVycmlkZTsKKyAgICBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpCisgICAgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCkgb3ZlcnJpZGU7CisgICAgc2l6ZV90IGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgb3Blbk91dHB1dChjb25zdCBtZWRpYTo6T3Blbk91dHB1dFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlKiByZXNwb25zZSkgb3ZlcnJpZGU7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IG9wZW5JbnB1dChjb25zdCBtZWRpYTo6T3BlbklucHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlKiByZXNwb25zZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCogaGFsRnJhbWVzLCB1aW50MzJfdCogZHNwRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdWludDMyX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpIG92ZXJyaWRlOworICAgIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCwgdWlkX3QgdWlkKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCogbnVtRWZmZWN0cykgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QqIHBFZmZlY3RVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogcFR5cGVVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90KiBwRGVzY3JpcHRvcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IG1lZGlhOjpDcmVhdGVFZmZlY3RSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVzcG9uc2UqIHJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpIG92ZXJyaWRlOworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGUoY29uc3QgY2hhciogbmFtZSkgb3ZlcnJpZGU7CisgICAgdWludDMyX3QgZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpIG92ZXJyaWRlOworICAgIHNpemVfdCBnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcqIHBvcnQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiBoYW5kbGUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQqIG51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaGVzKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKiBjb25maWcpIG92ZXJyaWRlOworICAgIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc3lzdGVtUmVhZHkoKSBvdmVycmlkZTsKKyAgICBzaXplX3QgZnJhbWVDb3VudEhBTChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogbWljcm9waG9uZXMpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyU2VydmljZT4gbURlbGVnYXRlOwogfTsKIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBBIHNlcnZlci1zaWRlIGFkYXB0ZXIsIHdyYXBwaW5nIGFuIElBdWRpb0ZsaW5nZXIgaW5zdGFuY2UgYW5kIHByZXNlbnRpbmcgaXQgYXMgYW4KKyAqIElBdWRpb0ZsaW5nZXJTZXJ2aWNlLiBJbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGxlZ2FjeSBzZXJ2ZXIgY29kZSB0aGF0IHdhcyB3cml0dGVuIGFnYWluc3QKKyAqIElBdWRpb0ZsaW5nZXIsIGJlZm9yZSBJQXVkaW9GbGluZ2VyU2VydmljZSB3YXMgaW50cm9kdWNlZCBhcyBhbiBBSURMIHNlcnZpY2UuCisgKiBOZXcgc2VydmVycyBzaG91bGQgbm90IHVzZSB0aGlzIGFkYXB0ZXIsIGJ1dCByYXRoZXIgaW1wbGVtZW50IElBdWRpb0ZsaW5nZXJTZXJ2aWNlIGRpcmVjdGx5LCB2aWEKKyAqIEJuQXVkaW9GbGluZ2VyU2VydmljZS4KKyAqLworY2xhc3MgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlciA6IHB1YmxpYyBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgICB1c2luZyBTdGF0dXMgPSBiaW5kZXI6OlN0YXR1czsKKworICAgIC8qKgorICAgICAqIExlZ2FjeSBzZXJ2ZXIgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBiZSB3cmFwcGVkLgorICAgICAqLworICAgIGNsYXNzIERlbGVnYXRlIDogcHVibGljIElBdWRpb0ZsaW5nZXIgeworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI7CisKKyAgICAgICAgZW51bSBjbGFzcyBUcmFuc2FjdGlvbkNvZGUgeworICAgICAgICAgICAgQ1JFQVRFX1RSQUNLID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlVHJhY2ssCisgICAgICAgICAgICBDUkVBVEVfUkVDT1JEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlUmVjb3JkLAorICAgICAgICAgICAgU0FNUExFX1JBVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zYW1wbGVSYXRlLAorICAgICAgICAgICAgRk9STUFUID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZm9ybWF0LAorICAgICAgICAgICAgRlJBTUVfQ09VTlQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9mcmFtZUNvdW50LAorICAgICAgICAgICAgTEFURU5DWSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2xhdGVuY3ksCisgICAgICAgICAgICBTRVRfTUFTVEVSX1ZPTFVNRSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldE1hc3RlclZvbHVtZSwKKyAgICAgICAgICAgIFNFVF9NQVNURVJfTVVURSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldE1hc3Rlck11dGUsCisgICAgICAgICAgICBNQVNURVJfVk9MVU1FID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fbWFzdGVyVm9sdW1lLAorICAgICAgICAgICAgTUFTVEVSX01VVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9tYXN0ZXJNdXRlLAorICAgICAgICAgICAgU0VUX1NUUkVBTV9WT0xVTUUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRTdHJlYW1Wb2x1bWUsCisgICAgICAgICAgICBTRVRfU1RSRUFNX01VVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRTdHJlYW1NdXRlLAorICAgICAgICAgICAgU1RSRUFNX1ZPTFVNRSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3N0cmVhbVZvbHVtZSwKKyAgICAgICAgICAgIFNUUkVBTV9NVVRFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc3RyZWFtTXV0ZSwKKyAgICAgICAgICAgIFNFVF9NT0RFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0TW9kZSwKKyAgICAgICAgICAgIFNFVF9NSUNfTVVURSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldE1pY011dGUsCisgICAgICAgICAgICBHRVRfTUlDX01VVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRNaWNNdXRlLAorICAgICAgICAgICAgU0VUX1JFQ09SRF9TSUxFTkNFRCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldFJlY29yZFNpbGVuY2VkLAorICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRQYXJhbWV0ZXJzLAorICAgICAgICAgICAgR0VUX1BBUkFNRVRFUlMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRQYXJhbWV0ZXJzLAorICAgICAgICAgICAgUkVHSVNURVJfQ0xJRU5UID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fcmVnaXN0ZXJDbGllbnQsCisgICAgICAgICAgICBHRVRfSU5QVVRCVUZGRVJTSVpFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0SW5wdXRCdWZmZXJTaXplLAorICAgICAgICAgICAgT1BFTl9PVVRQVVQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9vcGVuT3V0cHV0LAorICAgICAgICAgICAgT1BFTl9EVVBMSUNBVEVfT1VUUFVUID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fb3BlbkR1cGxpY2F0ZU91dHB1dCwKKyAgICAgICAgICAgIENMT1NFX09VVFBVVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2Nsb3NlT3V0cHV0LAorICAgICAgICAgICAgU1VTUEVORF9PVVRQVVQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zdXNwZW5kT3V0cHV0LAorICAgICAgICAgICAgUkVTVE9SRV9PVVRQVVQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9yZXN0b3JlT3V0cHV0LAorICAgICAgICAgICAgT1BFTl9JTlBVVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX29wZW5JbnB1dCwKKyAgICAgICAgICAgIENMT1NFX0lOUFVUID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY2xvc2VJbnB1dCwKKyAgICAgICAgICAgIElOVkFMSURBVEVfU1RSRUFNID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05faW52YWxpZGF0ZVN0cmVhbSwKKyAgICAgICAgICAgIFNFVF9WT0lDRV9WT0xVTUUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRWb2ljZVZvbHVtZSwKKyAgICAgICAgICAgIEdFVF9SRU5ERVJfUE9TSVRJT04gPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRSZW5kZXJQb3NpdGlvbiwKKyAgICAgICAgICAgIEdFVF9JTlBVVF9GUkFNRVNfTE9TVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldElucHV0RnJhbWVzTG9zdCwKKyAgICAgICAgICAgIE5FV19BVURJT19VTklRVUVfSUQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9uZXdBdWRpb1VuaXF1ZUlkLAorICAgICAgICAgICAgQUNRVUlSRV9BVURJT19TRVNTSU9OX0lEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fYWNxdWlyZUF1ZGlvU2Vzc2lvbklkLAorICAgICAgICAgICAgUkVMRUFTRV9BVURJT19TRVNTSU9OX0lEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fcmVsZWFzZUF1ZGlvU2Vzc2lvbklkLAorICAgICAgICAgICAgUVVFUllfTlVNX0VGRkVDVFMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9xdWVyeU51bWJlckVmZmVjdHMsCisgICAgICAgICAgICBRVUVSWV9FRkZFQ1QgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9xdWVyeUVmZmVjdCwKKyAgICAgICAgICAgIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldEVmZmVjdERlc2NyaXB0b3IsCisgICAgICAgICAgICBDUkVBVEVfRUZGRUNUID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlRWZmZWN0LAorICAgICAgICAgICAgTU9WRV9FRkZFQ1RTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fbW92ZUVmZmVjdHMsCisgICAgICAgICAgICBMT0FEX0hXX01PRFVMRSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2xvYWRId01vZHVsZSwKKyAgICAgICAgICAgIEdFVF9QUklNQVJZX09VVFBVVF9TQU1QTElOR19SQVRFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50LAorICAgICAgICAgICAgU0VUX0xPV19SQU1fREVWSUNFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0TG93UmFtRGV2aWNlLAorICAgICAgICAgICAgR0VUX0FVRElPX1BPUlQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRBdWRpb1BvcnQsCisgICAgICAgICAgICBDUkVBVEVfQVVESU9fUEFUQ0ggPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9jcmVhdGVBdWRpb1BhdGNoLAorICAgICAgICAgICAgUkVMRUFTRV9BVURJT19QQVRDSCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3JlbGVhc2VBdWRpb1BhdGNoLAorICAgICAgICAgICAgTElTVF9BVURJT19QQVRDSEVTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fbGlzdEF1ZGlvUGF0Y2hlcywKKyAgICAgICAgICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldEF1ZGlvUG9ydENvbmZpZywKKyAgICAgICAgICAgIEdFVF9BVURJT19IV19TWU5DX0ZPUl9TRVNTSU9OID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uLAorICAgICAgICAgICAgU1lTVEVNX1JFQURZID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc3lzdGVtUmVhZHksCisgICAgICAgICAgICBGUkFNRV9DT1VOVF9IQUwgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9mcmFtZUNvdW50SEFMLAorICAgICAgICAgICAgR0VUX01JQ1JPUEhPTkVTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0TWljcm9waG9uZXMsCisgICAgICAgICAgICBTRVRfTUFTVEVSX0JBTEFOQ0UgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRNYXN0ZXJCYWxhbmNlLAorICAgICAgICAgICAgR0VUX01BU1RFUl9CQUxBTkNFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0TWFzdGVyQmFsYW5jZSwKKyAgICAgICAgICAgIFNFVF9FRkZFQ1RfU1VTUEVOREVEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0RWZmZWN0U3VzcGVuZGVkLAorICAgICAgICAgICAgU0VUX0FVRElPX0hBTF9QSURTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0QXVkaW9IYWxQaWRzLAorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbmQgb3B0aW9uYWwgaG9vaywgY2FsbGVkIG9uIGV2ZXJ5IHRyYW5zYWN0aW9uLCBiZWZvcmUgdW5wYXJjZWxpbmcgdGhlIGRhdGEgYW5kCisgICAgICAgICAqIGRpc3BhdGNoaW5nIHRvIHRoZSByZXNwZWN0aXZlIG1ldGhvZC4gVXNlZnVsIGZvciBidWxrIG9wZXJhdGlvbnMsIHN1Y2ggYXMgbG9nZ2luZyBvcgorICAgICAgICAgKiBwZXJtaXNzaW9uIGNoZWNrcy4KKyAgICAgICAgICogSWYgYW4gZXJyb3Igc3RhdHVzIGlzIHJldHVybmVkLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgYW5kIHdpbGwgbm90IGJlCisgICAgICAgICAqIHByb2Nlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25QcmVUcmFuc2FjdChUcmFuc2FjdGlvbkNvZGUgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCB1aW50MzJfdCBmbGFncykgeworICAgICAgICAgICAgKHZvaWQpIGNvZGU7CisgICAgICAgICAgICAodm9pZCkgZGF0YTsKKyAgICAgICAgICAgICh2b2lkKSBmbGFnczsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gb3B0aW9uYWwgaG9vayBmb3IgaW1wbGVtZW50aW5nIGRpYWdub3N0aWNzIGR1bXBpbmcuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgICAgICAgICAodm9pZCkgZmQ7CisgICAgICAgICAgICAodm9pZCkgYXJnczsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBleHBsaWNpdCBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6RGVsZWdhdGU+JiBkZWxlZ2F0ZSk7CisKKyAgICBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyBjcmVhdGVUcmFjayhjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlVHJhY2tSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgY3JlYXRlUmVjb3JkKGNvbnN0IG1lZGlhOjpDcmVhdGVSZWNvcmRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzYW1wbGVSYXRlKGludDMyX3QgaW9IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGZvcm1hdChpbnQzMl90IG91dHB1dCwgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBmcmFtZUNvdW50KGludDMyX3QgaW9IYW5kbGUsIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGxhdGVuY3koaW50MzJfdCBvdXRwdXQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG1hc3RlclZvbHVtZShmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgbWFzdGVyTXV0ZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRTdHJlYW1Wb2x1bWUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGZsb2F0IHZhbHVlLCBpbnQzMl90IG91dHB1dCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldFN0cmVhbU11dGUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2wgbXV0ZWQpIG92ZXJyaWRlOworICAgIFN0YXR1cworICAgIHN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBvdXRwdXQsIGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRNb2RlKG1lZGlhOjpBdWRpb01vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldE1pY011dGUoYm9vbCBzdGF0ZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldE1pY011dGUoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0UmVjb3JkU2lsZW5jZWQoaW50MzJfdCBwb3J0SWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRQYXJhbWV0ZXJzKGludDMyX3QgaW9IYW5kbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlWYWx1ZVBhaXJzKSBvdmVycmlkZTsKKyAgICBTdGF0dXMKKyAgICBnZXRQYXJhbWV0ZXJzKGludDMyX3QgaW9IYW5kbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlzLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8bWVkaWE6OklBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRJbnB1dEJ1ZmZlclNpemUoaW50MzJfdCBzYW1wbGVSYXRlLCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzaywgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgb3Blbk91dHB1dChjb25zdCBtZWRpYTo6T3Blbk91dHB1dFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgb3BlbkR1cGxpY2F0ZU91dHB1dChpbnQzMl90IG91dHB1dDEsIGludDMyX3Qgb3V0cHV0MiwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgY2xvc2VPdXRwdXQoaW50MzJfdCBvdXRwdXQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzdXNwZW5kT3V0cHV0KGludDMyX3Qgb3V0cHV0KSBvdmVycmlkZTsKKyAgICBTdGF0dXMgcmVzdG9yZU91dHB1dChpbnQzMl90IG91dHB1dCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG9wZW5JbnB1dChjb25zdCBtZWRpYTo6T3BlbklucHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgY2xvc2VJbnB1dChpbnQzMl90IGlucHV0KSBvdmVycmlkZTsKKyAgICBTdGF0dXMgaW52YWxpZGF0ZVN0cmVhbShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldFJlbmRlclBvc2l0aW9uKGludDMyX3Qgb3V0cHV0LCBtZWRpYTo6UmVuZGVyUG9zaXRpb24qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldElucHV0RnJhbWVzTG9zdChpbnQzMl90IGlvSGFuZGxlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBuZXdBdWRpb1VuaXF1ZUlkKG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlIHVzZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludDMyX3QgYXVkaW9TZXNzaW9uLCBpbnQzMl90IHBpZCwgaW50MzJfdCB1aWQpIG92ZXJyaWRlOworICAgIFN0YXR1cyByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50MzJfdCBhdWRpb1Nlc3Npb24sIGludDMyX3QgcGlkKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgcXVlcnlOdW1iZXJFZmZlY3RzKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHF1ZXJ5RWZmZWN0KGludDMyX3QgaW5kZXgsIG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIGVmZmVjdFVVSUQsIGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHR5cGVVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNyZWF0ZUVmZmVjdChjb25zdCBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVFZmZlY3RSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgbW92ZUVmZmVjdHMoaW50MzJfdCBzZXNzaW9uLCBpbnQzMl90IHNyY091dHB1dCwgaW50MzJfdCBkc3RPdXRwdXQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRFZmZlY3RTdXNwZW5kZWQoaW50MzJfdCBlZmZlY3RJZCwgaW50MzJfdCBzZXNzaW9uSWQsIGJvb2wgc3VzcGVuZGVkKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgbG9hZEh3TW9kdWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0QXVkaW9Qb3J0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBvcnQsIG1lZGlhOjpBdWRpb1BvcnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3QgbWVkaWE6OkF1ZGlvUGF0Y2gmIHBhdGNoLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyByZWxlYXNlQXVkaW9QYXRjaChpbnQzMl90IGhhbmRsZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGxpc3RBdWRpb1BhdGNoZXMoaW50MzJfdCBtYXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9QYXRjaD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBjb25maWcpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHN5c3RlbVJlYWR5KCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGZyYW1lQ291bnRIQUwoaW50MzJfdCBpb0hhbmRsZSwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgcGlkcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6RGVsZWdhdGU+IG1EZWxlZ2F0ZTsKK307CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODBiYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lBVURJT0ZMSU5HRVJDTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0lBVURJT0ZMSU5HRVJDTElFTlRfSAotCi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJQXVkaW9GbGluZ2VyQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlckNsaWVudCk7Ci0KLSAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBpbnB1dC9vdXRwdXQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgaW9EZXNjKSA9IDA7Ci0KLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkF1ZGlvRmxpbmdlckNsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9GbGluZ2VyQ2xpZW50PgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9JQVVESU9GTElOR0VSQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggYmIxYzA3Zi4uODM3Mzc1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTE5NiwxMyArMTk2LDEzIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykKICAgICAgICAgICAgID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSA9IDA7CisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCkgPSAwOwogCkBAIC0yNDEsMTMgKzI0MSwzNSBAQAogCiAgICAgdmlydHVhbCBib29sICAgICBpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOwogCiAgICAgLy8gVGhlIHJldHVybiBjb2RlIGhlcmUgaXMgb25seSBpbnRlbmRlZCB0byByZXByZXNlbnQgdHJhbnNwb3J0IGVycm9ycy4gVGhlCiAgICAgLy8gYWN0dWFsIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBOT19FUlJPUi4KQEAgLTI2NiwxMCArMjg4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotcHJpdmF0ZToKLSAgICB2b2lkIHNhbmV0aXplQXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cik7Ci0gICAgc3RhdHVzX3Qgc2FuaXRpemVFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2MpOwotICAgIHN0YXR1c190IHNhbml0aXplQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyogY29uZmlnKTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNzg2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JQVVESU9UUkFDS19ICi0jZGVmaW5lIEFORFJPSURfSUFVRElPVFJBQ0tfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSUF1ZGlvVHJhY2sgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9UcmFjayk7Ci0KLSAgICAvKiBHZXQgdGhpcyB0cmFjaydzIGNvbnRyb2wgYmxvY2sgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdCA9IDA7Ci0KLSAgICAvKiBBZnRlciBpdCdzIGNyZWF0ZWQgdGhlIHRyYWNrIGlzIG5vdCBhY3RpdmUuIENhbGwgc3RhcnQoKSB0bwotICAgICAqIG1ha2UgaXQgYWN0aXZlLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSA9IDA7Ci0KLSAgICAvKiBTdG9wIGEgdHJhY2suIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkIGFuZAotICAgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkCi0gICAgICogd2lsbCBjb250aW51ZSB0byBiZSBwcm9jZXNzZWQsIHVubGVzcy91bnRpbCBmbHVzaCgpIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKSA9IDA7Ci0KLSAgICAvKiBGbHVzaCBhIHN0b3BwZWQgb3IgcGF1c2VkIHRyYWNrLiBBbGwgcGVuZGluZy9yZWxlYXNlZCBidWZmZXJzIGFyZSBkaXNjYXJkZWQuCi0gICAgICogVGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IGlmIHRoZSB0cmFjayBpcyBub3Qgc3RvcHBlZCBvciBwYXVzZWQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBmbHVzaCgpID0gMDsKLQotICAgIC8qIFBhdXNlIGEgdHJhY2suIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkIGFuZAotICAgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkCi0gICAgICogd2lsbCBjb250aW51ZSB0byBiZSBwcm9jZXNzZWQsIHVubGVzcy91bnRpbCBmbHVzaCgpIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHBhdXNlKCkgPSAwOwotCi0gICAgLyogQXR0YWNoIHRyYWNrIGF1eGlsaWFyeSBvdXRwdXQgdG8gc3BlY2lmaWVkIGVmZmVjdC4gVXNlIGVmZmVjdElkID0gMAotICAgICAqIHRvIGRldGFjaCB0cmFjayBmcm9tIGVmZmVjdC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpID0gMDsKLQotICAgIC8qIFNlbmQgcGFyYW1ldGVycyB0byB0aGUgYXVkaW8gaGFyZHdhcmUgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgPSAwOwotCi0gICAgLyogU2VsZWN0cyB0aGUgcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSA9IDA7Ci0KLSAgICAvKiBSZXR1cm4gTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLiAgdGltZXN0YW1wIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgPSAwOwotCi0gICAgLyogU2lnbmFsIHRoZSBwbGF5YmFjayB0aHJlYWQgZm9yIGEgY2hhbmdlIGluIGNvbnRyb2wgYmxvY2sgKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNpZ25hbCgpID0gMDsKLQotICAgIC8qIFNldHMgdGhlIHZvbHVtZSBzaGFwZXIgKi8KLSAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSA9IDA7Ci0KLSAgICAvKiBnZXRzIHRoZSB2b2x1bWUgc2hhcGVyIHN0YXRlICovCi0gICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuQXVkaW9UcmFjayA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9UcmFjaz4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSUFVRElPVFJBQ0tfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JRWZmZWN0LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwNDg2OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSUVGRkVDVF9ICi0jZGVmaW5lIEFORFJPSURfSUVGRkVDVF9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJRWZmZWN0OiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkaXNhYmxlKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdCA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuRWZmZWN0OiBwdWJsaWMgQm5JbnRlcmZhY2U8SUVmZmVjdD4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0lFRkZFQ1RfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JRWZmZWN0Q2xpZW50LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lFZmZlY3RDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3OGM5OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lFZmZlY3RDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSUVGRkVDVENMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfSUVGRkVDVENMSUVOVF9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJRWZmZWN0Q2xpZW50OiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0Q2xpZW50KTsKLQotICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkVmZmVjdENsaWVudDogcHVibGljIEJuSW50ZXJmYWNlPElFZmZlY3RDbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9JRUZGRUNUQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUGxheWVyQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9QbGF5ZXJCYXNlLmgKaW5kZXggZTdhOGFiYy4uNGFhZDliNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9QbGF5ZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9QbGF5ZXJCYXNlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvSUF1ZGlvTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuUGxheWVyLmgiCiAKQEAgLTQwLDggKzQxLDggQEAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIHNldFBhbihmbG9hdCBwYW4pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgc2V0U3RhcnREZWxheU1zKGludDMyX3QgZGVsYXlNcykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CisgICAgICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJPcGVyYXRpb24mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CiAKICAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0V2l0aFN0YXR1cygpOwogICAgICAgICAgICAgc3RhdHVzX3QgcGF1c2VXaXRoU3RhdHVzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCmluZGV4IDViMDY4OWEuLjA0MzU3YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCkBAIC0yMTgsNiArMjE4LDcgQEAKICAgICAgICAgVE9ORV9JTkRJQV9DT05HRVNUSU9OLCAgICAgIC8vIENvbmdlc3Rpb24gdG9uZTogNDAwIEh6LCAyNTBtcyBPTiwgMjUwbXMgT0ZGLi4uCiAgICAgICAgIFRPTkVfSU5ESUFfQ0FMTF9XQUlUSU5HLCAgICAvLyBDYWxsIHdhaXRpbmcgdG9uZTogNDAwIEh6LCB0b25lIHJlcGVhdGVkIGluIGEgMC4ycyBvbiwgMC4xcyBvZmYsIDAuMnMgb24sIDcuNXMgb2ZmIHBhdHRlcm4uCiAgICAgICAgIFRPTkVfSU5ESUFfUklOR1RPTkUsICAgICAgICAvLyBSaW5nIHRvbmU6IDQwMCBIeiB0b25lIG1vZHVsYXRlZCB3aXRoIDI1SHosIDAuNCBvbiAwLjIgb2ZmIDAuNCBvbiAyLi4wIG9mZgorICAgICAgICBUT05FX1RXX1JJTkdUT05FLCAgICAgICAgICAgLy8gUmluZyBUb25lOiA0NDAgSHogKyA0ODAgSHogcmVwZWF0ZWQgd2l0aCBwYXR0ZXJuIDFzIG9uLCAzcyBvZmYuCiAgICAgICAgIE5VTV9BTFRFUk5BVEVfVE9ORVMKICAgICB9OwogCkBAIC0yMzAsNiArMjMxLDcgQEAKICAgICAgICAgSE9OR0tPTkcsCiAgICAgICAgIElSRUxBTkQsCiAgICAgICAgIElORElBLAorICAgICAgICBUQUlXQU4sCiAgICAgICAgIENFUFQsCiAgICAgICAgIE5VTV9SRUdJT05TCiAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oCmluZGV4IDY2ZTliM2IuLjZkMjZlNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaApAQCAtMzMsOCArMzMsOCBAQAogCiAgICAgLy9JUGxheWVyIGltcGxlbWVudGF0aW9uCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbik7CisgICAgICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJPcGVyYXRpb24mIG9wZXJhdGlvbik7CiAKICAgICAvL0ZJWE1FIG1vdmUgdG8gcHJvdGVjdGVkIGZpZWxkLCBzbyBmYXIgbWFkZSBwdWJsaWMgdG8gbWluaW1pemUgY2hhbmdlcyB0byBBdWRpb1RyYWNrIGxvZ2ljCiAgICAgc3A8QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDU0OGIwODAuLjkyOTZkMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC01LDEzICs1LDI3IEBACiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uX3V0aWwiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uX3V0aWwiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMjksNiArNDMsOCBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC11bnN0YWJsZS1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLApAQCAtMzcsNiArNTMsMTEgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC11bnN0YWJsZS1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICBdLAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwCmluZGV4IGI0NDA0M2EuLjhmMWUxMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0RldmljZVR5cGVBZGRyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAKQEAgLTE2LDEyICsxNiw1NyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cmVnZXg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorbmFtZXNwYWNlIHsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIFNVUFBSRVNTRUQgPSAiU1VQUFJFU1NFRCI7CitzdGF0aWMgY29uc3Qgc3RkOjpyZWdleCBNQUNfQUREUkVTU19SRUdFWCgiKFswLTlhLWZBLUZdezJ9Oil7NX1bMC05YS1mQS1GXXsyfSIpOworCitib29sIGlzU2Vuc3RpdmVBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSB7CisgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goYWRkcmVzcywgTUFDX0FERFJFU1NfUkVHRVgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNvY2thZGRyX3N0b3JhZ2Ugc3M0OworICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVCwgYWRkcmVzcy5jX3N0cigpLCAmc3M0KSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc29ja2FkZHJfc3RvcmFnZSBzczY7CisgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgYWRkcmVzcy5jX3N0cigpLCAmc3M2KSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZQorCitBdWRpb0RldmljZVR5cGVBZGRyOjpBdWRpb0RldmljZVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgOgorICAgICAgICBtVHlwZSh0eXBlKSwgbUFkZHJlc3MoYWRkcmVzcykgeworICAgIG1Jc0FkZHJlc3NTZW5zaXRpdmUgPSBpc1NlbnN0aXZlQWRkcmVzcyhtQWRkcmVzcyk7Cit9CisKIGNvbnN0IGNoYXIqIEF1ZGlvRGV2aWNlVHlwZUFkZHI6OmdldEFkZHJlc3MoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1BZGRyZXNzLmNfc3RyKCk7CiB9CiAKK2NvbnN0IHN0ZDo6c3RyaW5nJiBBdWRpb0RldmljZVR5cGVBZGRyOjphZGRyZXNzKCkgY29uc3QgeworICAgIHJldHVybiBtQWRkcmVzczsKK30KKwordm9pZCBBdWRpb0RldmljZVR5cGVBZGRyOjpzZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKSB7CisgICAgbUFkZHJlc3MgPSBhZGRyZXNzOworICAgIG1Jc0FkZHJlc3NTZW5zaXRpdmUgPSBpc1NlbnN0aXZlQWRkcmVzcyhtQWRkcmVzcyk7Cit9CisKIGJvb2wgQXVkaW9EZXZpY2VUeXBlQWRkcjo6ZXF1YWxzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIG90aGVyKSBjb25zdCB7CiAgICAgcmV0dXJuIG1UeXBlID09IG90aGVyLm1UeXBlICYmIG1BZGRyZXNzID09IG90aGVyLm1BZGRyZXNzOwogfQpAQCAtMzYsMTQgKzgxLDM0IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIEF1ZGlvRGV2aWNlVHlwZUFkZHI6Om9wZXJhdG9yPT0oY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGVxdWFscyhyaHMpOworfQorCitib29sIEF1ZGlvRGV2aWNlVHlwZUFkZHI6Om9wZXJhdG9yIT0oY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmcmhzKSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KHJocyk7Cit9CisKIHZvaWQgQXVkaW9EZXZpY2VUeXBlQWRkcjo6cmVzZXQoKSB7CiAgICAgbVR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBtQWRkcmVzcyA9ICIiOworICAgIHNldEFkZHJlc3MoIiIpOworfQorCitzdGQ6OnN0cmluZyBBdWRpb0RldmljZVR5cGVBZGRyOjp0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cmVhbTsKKyAgICBzc3RyZWFtIDw8ICJ0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCBtVHlwZTsKKyAgICAvLyBJUCBhbmQgTUFDIGFkZHJlc3MgYXJlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gVGhlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHN1cHByZXNzZWQKKyAgICAvLyBpcyBgaW5jbHVkZVNlbnNpdGl2ZUluZm9gIGlzIGZhbHNlLgorICAgIHNzdHJlYW0gPDwgIixAOiIKKyAgICAgICAgICAgIDw8ICghaW5jbHVkZVNlbnNpdGl2ZUluZm8gJiYgbUlzQWRkcmVzc1NlbnNpdGl2ZSA/IFNVUFBSRVNTRUQgOiBtQWRkcmVzcyk7CisgICAgcmV0dXJuIHNzdHJlYW0uc3RyKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtVHlwZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIHVpbnQzMl90IHJhd0RldmljZVR5cGU7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJnJhd0RldmljZVR5cGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBtVHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4ocmF3RGV2aWNlVHlwZSk7CiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmbUFkZHJlc3MpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC02NCw0ICsxMjksNDQgQEAKICAgICByZXR1cm4gZGV2aWNlVHlwZXM7CiB9CiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGV4Y2x1ZGVEZXZpY2VUeXBlQWRkcnNGcm9tKAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzVG9FeGNsdWRlKSB7CisgICAgc3RkOjpzZXQ8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlc1RvRXhjbHVkZVNldCgKKyAgICAgICAgICAgIGRldmljZXNUb0V4Y2x1ZGUuYmVnaW4oKSwgZGV2aWNlc1RvRXhjbHVkZS5lbmQoKSk7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciByZW1haW5lZERldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIGlmIChkZXZpY2VzVG9FeGNsdWRlU2V0LmNvdW50KGRldmljZSkgPT0gMCkgeworICAgICAgICAgICAgcmVtYWluZWREZXZpY2VzLnB1c2hfYmFjayhkZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZW1haW5lZERldmljZXM7Cit9CisKK3N0ZDo6c3RyaW5nIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZVR5cGVBZGRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8pIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlVHlwZUFkZHJzLmJlZ2luKCk7IGl0ICE9IGRldmljZVR5cGVBZGRycy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQgIT0gZGV2aWNlVHlwZUFkZHJzLmJlZ2luKCkpIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiICI7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtIDw8IGl0LT50b1N0cmluZyhpbmNsdWRlU2Vuc2l0aXZlSW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9EZXZpY2VUeXBlQWRkcj4KK2FpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBhaWRsKSB7CisgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC50eXBlKSk7CisgICAgcmV0dXJuIEF1ZGlvRGV2aWNlVHlwZUFkZHIodHlwZSwgYWlkbC5hZGRyZXNzKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9EZXZpY2U+CitsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb0RldmljZSBhaWRsOworICAgIGFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChsZWdhY3kubVR5cGUpKTsKKyAgICBhaWRsLmFkZHJlc3MgPSBsZWdhY3kuZ2V0QWRkcmVzcygpOworICAgIHJldHVybiBhaWRsOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0dhaW4uY3BwCmluZGV4IDBkMjgzMzUuLjU2MzQzZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0dhaW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0dhaW4uY3BwCkBAIC0xMjksMzggKzEyOSw1MSBAQAogICAgICAgICAgICBtR2Fpbi5tYXhfcmFtcF9tcyA9PSBvdGhlci0+bUdhaW4ubWF4X3JhbXBfbXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvR2Fpbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwgKnBhcmNlbCkgY29uc3QKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5kZXgpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKG1Vc2VJbkNoYW5uZWxNYXNrKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtVXNlRm9yVm9sdW1lKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLm1vZGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUdhaW4uY2hhbm5lbF9tYXNrKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUdhaW4ubWluX3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUdhaW4ubWF4X3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUdhaW4uZGVmYXVsdF92YWx1ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5zdGVwX3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLm1pbl9yYW1wX21zKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5tYXhfcmFtcF9tcyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKK3N0YXR1c190IEF1ZGlvR2Fpbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIG1lZGlhOjpBdWRpb0dhaW4gcGFyY2VsYWJsZTsKKyAgICByZXR1cm4gd3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUpCisgICAgICAgID86IHBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogfQogCi1zdGF0dXNfdCBBdWRpb0dhaW46OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1JbmRleCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbVVzZUluQ2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJm1Vc2VGb3JWb2x1bWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4ubW9kZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5jaGFubmVsX21hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtR2Fpbi5taW5fdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtR2Fpbi5tYXhfdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtR2Fpbi5kZWZhdWx0X3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLnN0ZXBfdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4ubWluX3JhbXBfbXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLm1heF9yYW1wX21zKTsKLSAgICByZXR1cm4gc3RhdHVzOworc3RhdHVzX3QgQXVkaW9HYWluOjp3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9HYWluKiBwYXJjZWxhYmxlKSBjb25zdCB7CisgICAgcGFyY2VsYWJsZS0+aW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtSW5kZXgpKTsKKyAgICBwYXJjZWxhYmxlLT51c2VJbkNoYW5uZWxNYXNrID0gbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgcGFyY2VsYWJsZS0+dXNlRm9yVm9sdW1lID0gbVVzZUZvclZvbHVtZTsKKyAgICBwYXJjZWxhYmxlLT5tb2RlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X21hc2tfaW50MzJfdChtR2Fpbi5tb2RlKSk7CisgICAgcGFyY2VsYWJsZS0+Y2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChtR2Fpbi5jaGFubmVsX21hc2spKTsKKyAgICBwYXJjZWxhYmxlLT5taW5WYWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLm1pbl92YWx1ZSkpOworICAgIHBhcmNlbGFibGUtPm1heFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4ubWF4X3ZhbHVlKSk7CisgICAgcGFyY2VsYWJsZS0+ZGVmYXVsdFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5kZWZhdWx0X3ZhbHVlKSk7CisgICAgcGFyY2VsYWJsZS0+c3RlcFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4uc3RlcF92YWx1ZSkpOworICAgIHBhcmNlbGFibGUtPm1pblJhbXBNcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLm1pbl9yYW1wX21zKSk7CisgICAgcGFyY2VsYWJsZS0+bWF4UmFtcE1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4ubWF4X3JhbXBfbXMpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvR2Fpbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIHsKKyAgICBtZWRpYTo6QXVkaW9HYWluIHBhcmNlbGFibGU7CisgICAgcmV0dXJuIHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICA/OiByZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvR2Fpbjo6cmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIHBhcmNlbGFibGUpIHsKKyAgICBtSW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUuaW5kZXgpKTsKKyAgICBtVXNlSW5DaGFubmVsTWFzayA9IHBhcmNlbGFibGUudXNlSW5DaGFubmVsTWFzazsKKyAgICBtVXNlRm9yVm9sdW1lID0gcGFyY2VsYWJsZS51c2VGb3JWb2x1bWU7CisgICAgbUdhaW4ubW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2socGFyY2VsYWJsZS5tb2RlKSk7CisgICAgbUdhaW4uY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QocGFyY2VsYWJsZS5jaGFubmVsTWFzaykpOworICAgIG1HYWluLm1pbl92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5taW5WYWx1ZSkpOworICAgIG1HYWluLm1heF92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5tYXhWYWx1ZSkpOworICAgIG1HYWluLmRlZmF1bHRfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUuZGVmYXVsdFZhbHVlKSk7CisgICAgbUdhaW4uc3RlcF92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5zdGVwVmFsdWUpKTsKKyAgICBtR2Fpbi5taW5fcmFtcF9tcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5taW5SYW1wTXMpKTsKKyAgICBtR2Fpbi5tYXhfcmFtcF9tcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5tYXhSYW1wTXMpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIGJvb2wgQXVkaW9HYWluczo6ZXF1YWxzKGNvbnN0IEF1ZGlvR2FpbnMgJm90aGVyKSBjb25zdApAQCAtMTk2LDQgKzIwOSwzNCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9HYWluPj4KK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbihjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBhaWRsKSB7CisgICAgc3A8QXVkaW9HYWluPiBsZWdhY3kgPSBuZXcgQXVkaW9HYWluKDAsIGZhbHNlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBsZWdhY3ktPnJlYWRGcm9tUGFyY2VsYWJsZShhaWRsKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2Fpbj4KK2xlZ2FjeTJhaWRsX0F1ZGlvR2Fpbihjb25zdCBzcDxBdWRpb0dhaW4+JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9HYWluIGFpZGw7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGVnYWN5LT53cml0ZVRvUGFyY2VsYWJsZSgmYWlkbCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5zPgorYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPiYgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvR2FpbnM+KGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvR2Fpbik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2Fpbj4+CitsZWdhY3kyYWlkbF9BdWRpb0dhaW5zKGNvbnN0IEF1ZGlvR2FpbnMmIGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW4+PihsZWdhY3ksIGxlZ2FjeTJhaWRsX0F1ZGlvR2Fpbik7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKaW5kZXggZjk4ODY5MC4uNmI2MzY3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKQEAgLTM4LDYgKzM4LDIxIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IGF1ZGlvX3BvcnRfdjcgJnBvcnQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQubnVtX2F1ZGlvX3Byb2ZpbGVzOyArK2kpIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLmZvcm1hdCwKKyAgICAgICAgICAgICAgICBDaGFubmVsTWFza1NldChwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLmNoYW5uZWxfbWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLmNoYW5uZWxfbWFza3MgKworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5hdWRpb19wcm9maWxlcy0+bnVtX2NoYW5uZWxfbWFza3MpLAorICAgICAgICAgICAgICAgIFNhbXBsZVJhdGVTZXQocG9ydC5hdWRpb19wcm9maWxlc1tpXS5zYW1wbGVfcmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLnNhbXBsZV9yYXRlcyArCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLm51bV9zYW1wbGVfcmF0ZXMpKTsKKyAgICAgICAgaWYgKCFtUHJvZmlsZXMuY29udGFpbnMocHJvZmlsZSkpIHsKKyAgICAgICAgICAgIGFkZEF1ZGlvUHJvZmlsZShwcm9maWxlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdCB7CiAgICAgLy8gVE9ETzogdXBkYXRlIHRoaXMgZnVuY3Rpb24gb25jZSBhdWRpb19wb3J0IHN0cnVjdHVyZSByZWZsZWN0cyB0aGUgbmV3IHByb2ZpbGUgZGVmaW5pdGlvbi4KICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSByZWFzb246IGZsYXRlbmluZyB0aGUgQXVkaW9Qcm9maWxlIGludG8gYXVkaW9fcG9ydCBzdHJ1Y3R1cmUuCkBAIC02MiwyMSArNzcsMzkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBwb3J0LT5yb2xlID0gbVJvbGU7Ci0gICAgcG9ydC0+dHlwZSA9IG1UeXBlOwotICAgIHN0cmxjcHkocG9ydC0+bmFtZSwgbU5hbWUuY19zdHIoKSwgQVVESU9fUE9SVF9NQVhfTkFNRV9MRU4pOworICAgIHRvQXVkaW9Qb3J0QmFzZShwb3J0KTsKICAgICBwb3J0LT5udW1fc2FtcGxlX3JhdGVzID0gZmxhdGVuZWRSYXRlcy5zaXplKCk7CiAgICAgcG9ydC0+bnVtX2NoYW5uZWxfbWFza3MgPSBmbGF0ZW5lZENoYW5uZWxzLnNpemUoKTsKICAgICBwb3J0LT5udW1fZm9ybWF0cyA9IGZsYXRlbmVkRm9ybWF0cy5zaXplKCk7CiAgICAgc3RkOjpjb3B5KGZsYXRlbmVkUmF0ZXMuYmVnaW4oKSwgZmxhdGVuZWRSYXRlcy5lbmQoKSwgcG9ydC0+c2FtcGxlX3JhdGVzKTsKICAgICBzdGQ6OmNvcHkoZmxhdGVuZWRDaGFubmVscy5iZWdpbigpLCBmbGF0ZW5lZENoYW5uZWxzLmVuZCgpLCBwb3J0LT5jaGFubmVsX21hc2tzKTsKICAgICBzdGQ6OmNvcHkoZmxhdGVuZWRGb3JtYXRzLmJlZ2luKCksIGZsYXRlbmVkRm9ybWF0cy5lbmQoKSwgcG9ydC0+Zm9ybWF0cyk7Cit9CiAKLSAgICBBTE9HVigiQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydCgpIG51bSBnYWlucyAlenUiLCBtR2FpbnMuc2l6ZSgpKTsKK3ZvaWQgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3QgeworICAgIHRvQXVkaW9Qb3J0QmFzZShwb3J0KTsKKyAgICBwb3J0LT5udW1fYXVkaW9fcHJvZmlsZXMgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IG1Qcm9maWxlcykgeworICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlU2V0ICZzYW1wbGVSYXRlcyA9IHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCk7CisgICAgICAgICAgICBjb25zdCBDaGFubmVsTWFza1NldCAmY2hhbm5lbE1hc2tzID0gcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKTsKIAotICAgIHBvcnQtPm51bV9nYWlucyA9IHN0ZDo6bWluKG1HYWlucy5zaXplKCksIChzaXplX3QpIEFVRElPX1BPUlRfTUFYX0dBSU5TKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQtPm51bV9nYWluczsgaSsrKSB7Ci0gICAgICAgIHBvcnQtPmdhaW5zW2ldID0gbUdhaW5zW2ldLT5nZXRHYWluKCk7CisgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZXMuc2l6ZSgpID4gQVVESU9fUE9SVF9NQVhfU0FNUExJTkdfUkFURVMgfHwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzLnNpemUoKSA+IEFVRElPX1BPUlRfTUFYX0NIQU5ORUxfTUFTS1MgfHwKKyAgICAgICAgICAgICAgICAgICAgcG9ydC0+bnVtX2F1ZGlvX3Byb2ZpbGVzID49IEFVRElPX1BPUlRfTUFYX0FVRElPX1BST0ZJTEVTKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBiYWlsaW5nIG91dDogY2Fubm90IGV4cG9ydCBwcm9maWxlcyB0byBwb3J0IGNvbmZpZyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8mIGRzdFByb2ZpbGUgPSBwb3J0LT5hdWRpb19wcm9maWxlc1twb3J0LT5udW1fYXVkaW9fcHJvZmlsZXMrK107CisgICAgICAgICAgICBkc3RQcm9maWxlLmZvcm1hdCA9IHByb2ZpbGUtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgZHN0UHJvZmlsZS5udW1fc2FtcGxlX3JhdGVzID0gc2FtcGxlUmF0ZXMuc2l6ZSgpOworICAgICAgICAgICAgc3RkOjpjb3B5KHNhbXBsZVJhdGVzLmJlZ2luKCksIHNhbXBsZVJhdGVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJlZ2luKGRzdFByb2ZpbGUuc2FtcGxlX3JhdGVzKSk7CisgICAgICAgICAgICBkc3RQcm9maWxlLm51bV9jaGFubmVsX21hc2tzID0gY2hhbm5lbE1hc2tzLnNpemUoKTsKKyAgICAgICAgICAgIHN0ZDo6Y29weShjaGFubmVsTWFza3MuYmVnaW4oKSwgY2hhbm5lbE1hc2tzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJlZ2luKGRzdFByb2ZpbGUuY2hhbm5lbF9tYXNrcykpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xMTcsMzIgKzE1MCwzMyBAQAogCiBzdGF0dXNfdCBBdWRpb1BvcnQ6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0CiB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobU5hbWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobVR5cGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobVJvbGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKG1Qcm9maWxlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGUobUdhaW5zKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IHBhcmNlbGFibGU7CisgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQorICAgICAgICA/OiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJm1OYW1lKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YobVR5cGUpID09IHNpemVvZih1aW50MzJfdCkpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmbVR5cGUpKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YobVJvbGUpID09IHNpemVvZih1aW50MzJfdCkpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmbVJvbGUpKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgbVByb2ZpbGVzLmNsZWFyKCk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZtUHJvZmlsZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBtR2FpbnMuY2xlYXIoKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGUoJm1HYWlucykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBzdGF0dXM7CitzdGF0dXNfdCBBdWRpb1BvcnQ6OndyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnQqIHBhcmNlbGFibGUpIGNvbnN0IHsKKyAgICBwYXJjZWxhYmxlLT5uYW1lID0gbU5hbWU7CisgICAgcGFyY2VsYWJsZS0+dHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZShtVHlwZSkpOworICAgIHBhcmNlbGFibGUtPnJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobVJvbGUpKTsKKyAgICBwYXJjZWxhYmxlLT5wcm9maWxlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKG1Qcm9maWxlcykpOworICAgIHBhcmNlbGFibGUtPmdhaW5zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0dhaW5zKG1HYWlucykpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgeworICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKKyAgICByZXR1cm4gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCisgICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcGFyY2VsYWJsZSkgeworICAgIG1OYW1lID0gcGFyY2VsYWJsZS5uYW1lOworICAgIG1UeXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KHBhcmNlbGFibGUudHlwZSkpOworICAgIG1Sb2xlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KHBhcmNlbGFibGUucm9sZSkpOworICAgIG1Qcm9maWxlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKHBhcmNlbGFibGUucHJvZmlsZXMpKTsKKyAgICBtR2FpbnMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvR2FpbnMocGFyY2VsYWJsZS5nYWlucykpOworICAgIHJldHVybiBPSzsKIH0KIAogLy8gLS0tIEF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgpAQCAtMjQzLDQ1ICsyNzcsNTYgQEAKICAgICAgICAgICAgbUdhaW4ucmFtcF9kdXJhdGlvbl9tcyA9PSBvdGhlci0+bUdhaW4ucmFtcF9kdXJhdGlvbl9tczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtU2FtcGxpbmdSYXRlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1Gb3JtYXQpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUNoYW5uZWxNYXNrKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUlkKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgLy8gV3JpdGUgbUdhaW4gdG8gcGFyY2VsLgotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1HYWluLmluZGV4KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLm1vZGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUdhaW4uY2hhbm5lbF9tYXNrKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLnJhbXBfZHVyYXRpb25fbXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZhbHVlcyhzdGQ6OmJlZ2luKG1HYWluLnZhbHVlcyksIHN0ZDo6ZW5kKG1HYWluLnZhbHVlcykpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyVmVjdG9yKHZhbHVlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBzdGF0dXM7CitzdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnIHBhcmNlbGFibGU7CisgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQorICAgICAgICA/OiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbVNhbXBsaW5nUmF0ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKG1Gb3JtYXQpID09IHNpemVvZih1aW50MzJfdCkpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmbUZvcm1hdCkpKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUNoYW5uZWxNYXNrKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbUlkKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgLy8gUmVhZCBtR2FpbiBmcm9tIHBhcmNlbC4KLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtR2Fpbi5pbmRleCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5tb2RlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLmNoYW5uZWxfbWFzaykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5yYW1wX2R1cmF0aW9uX21zKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMlZlY3RvcigmdmFsdWVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKHZhbHVlcy5zaXplKCkgIT0gc3RkOjpzaXplKG1HYWluLnZhbHVlcykpIHsKK3N0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydENvbmZpZyogcGFyY2VsYWJsZSkgY29uc3QgeworICAgIHBhcmNlbGFibGUtPnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtU2FtcGxpbmdSYXRlKSk7CisgICAgcGFyY2VsYWJsZS0+Zm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChtRm9ybWF0KSk7CisgICAgcGFyY2VsYWJsZS0+Y2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChtQ2hhbm5lbE1hc2spKTsKKyAgICBwYXJjZWxhYmxlLT5pZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KG1JZCkpOworICAgIHBhcmNlbGFibGUtPmdhaW4uaW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5pbmRleCkpOworICAgIHBhcmNlbGFibGUtPmdhaW4ubW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9tYXNrX2ludDMyX3QobUdhaW4ubW9kZSkpOworICAgIHBhcmNlbGFibGUtPmdhaW4uY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChtR2Fpbi5jaGFubmVsX21hc2spKTsKKyAgICBwYXJjZWxhYmxlLT5nYWluLnJhbXBEdXJhdGlvbk1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5yYW1wX2R1cmF0aW9uX21zKSk7CisgICAgcGFyY2VsYWJsZS0+Z2Fpbi52YWx1ZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KAorICAgICAgICAgICAgbUdhaW4udmFsdWVzLCBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdCwgaW50PikpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgeworICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWcgcGFyY2VsYWJsZTsKKyAgICByZXR1cm4gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCisgICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgcGFyY2VsYWJsZSkgeworICAgIG1TYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUuc2FtcGxlUmF0ZSkpOworICAgIG1Gb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KHBhcmNlbGFibGUuZm9ybWF0KSk7CisgICAgbUNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QocGFyY2VsYWJsZS5jaGFubmVsTWFzaykpOworICAgIG1JZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KHBhcmNlbGFibGUuaWQpKTsKKyAgICBtR2Fpbi5pbmRleCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5nYWluLmluZGV4KSk7CisgICAgbUdhaW4ubW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2socGFyY2VsYWJsZS5nYWluLm1vZGUpKTsKKyAgICBtR2Fpbi5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChwYXJjZWxhYmxlLmdhaW4uY2hhbm5lbE1hc2spKTsKKyAgICBtR2Fpbi5yYW1wX2R1cmF0aW9uX21zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUuZ2Fpbi5yYW1wRHVyYXRpb25NcykpOworICAgIGlmIChwYXJjZWxhYmxlLmdhaW4udmFsdWVzLnNpemUoKSA+IHN0ZDo6c2l6ZShtR2Fpbi52YWx1ZXMpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHN0ZDo6Y29weSh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBtR2Fpbi52YWx1ZXMpOwotICAgIHJldHVybiBzdGF0dXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJjZWxhYmxlLmdhaW4udmFsdWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG1HYWluLnZhbHVlc1tpXSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5nYWluLnZhbHVlc1tpXSkpOworICAgIH0KKyAgICByZXR1cm4gT0s7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUHJvZmlsZS5jcHAKaW5kZXggOTFiZTM0Ni4uM2I0N2ZlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUHJvZmlsZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUHJvZmlsZS5jcHAKQEAgLTEzMCw0MiArMTMwLDczIEBACiAgICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID09IG90aGVyLT5pc0R5bmFtaWNSYXRlKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUHJvZmlsZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtTmFtZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtRm9ybWF0KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXMobUNoYW5uZWxNYXNrcy5iZWdpbigpLCBtQ2hhbm5lbE1hc2tzLmVuZCgpKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMlZlY3Rvcih2YWx1ZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICB2YWx1ZXMuY2xlYXIoKTsKLSAgICB2YWx1ZXMuYXNzaWduKG1TYW1wbGluZ1JhdGVzLmJlZ2luKCksIG1TYW1wbGluZ1JhdGVzLmVuZCgpKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMlZlY3Rvcih2YWx1ZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKG1Jc0R5bmFtaWNGb3JtYXQpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKG1Jc0R5bmFtaWNDaGFubmVscykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUJvb2wobUlzRHluYW1pY1JhdGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gc3RhdHVzOworQXVkaW9Qcm9maWxlJiBBdWRpb1Byb2ZpbGU6Om9wZXJhdG9yPShjb25zdCBBdWRpb1Byb2ZpbGUmIG90aGVyKSB7CisgICAgbU5hbWUgPSBvdGhlci5tTmFtZTsKKyAgICBtRm9ybWF0ID0gb3RoZXIubUZvcm1hdDsKKyAgICBtQ2hhbm5lbE1hc2tzID0gb3RoZXIubUNoYW5uZWxNYXNrczsKKyAgICBtU2FtcGxpbmdSYXRlcyA9IG90aGVyLm1TYW1wbGluZ1JhdGVzOworICAgIG1Jc0R5bmFtaWNGb3JtYXQgPSBvdGhlci5tSXNEeW5hbWljRm9ybWF0OworICAgIG1Jc0R5bmFtaWNDaGFubmVscyA9IG90aGVyLm1Jc0R5bmFtaWNDaGFubmVsczsKKyAgICBtSXNEeW5hbWljUmF0ZSA9IG90aGVyLm1Jc0R5bmFtaWNSYXRlOworICAgIHJldHVybiAqdGhpczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJm1OYW1lKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YobUZvcm1hdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZtRm9ybWF0KSkpICE9IE5PX0VSUk9SKSB7CitzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBtZWRpYTo6QXVkaW9Qcm9maWxlIHBhcmNlbGFibGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKHRvUGFyY2VsYWJsZSgpKTsKKyAgICByZXR1cm4gcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+CitBdWRpb1Byb2ZpbGU6OnRvUGFyY2VsYWJsZSgpIGNvbnN0IHsKKyAgICBtZWRpYTo6QXVkaW9Qcm9maWxlIHBhcmNlbGFibGU7CisgICAgcGFyY2VsYWJsZS5uYW1lID0gbU5hbWU7CisgICAgcGFyY2VsYWJsZS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobUZvcm1hdCkpOworICAgIHBhcmNlbGFibGUuY2hhbm5lbE1hc2tzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4obUNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QpKTsKKyAgICBwYXJjZWxhYmxlLnNhbXBsaW5nUmF0ZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PihtU2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90LCB1aW50MzJfdD4pKTsKKyAgICBwYXJjZWxhYmxlLmlzRHluYW1pY0Zvcm1hdCA9IG1Jc0R5bmFtaWNGb3JtYXQ7CisgICAgcGFyY2VsYWJsZS5pc0R5bmFtaWNDaGFubmVscyA9IG1Jc0R5bmFtaWNDaGFubmVsczsKKyAgICBwYXJjZWxhYmxlLmlzRHluYW1pY1JhdGUgPSBtSXNEeW5hbWljUmF0ZTsKKyAgICByZXR1cm4gcGFyY2VsYWJsZTsKK30KKworc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgeworICAgIG1lZGlhOjpBdWRpb1Byb2ZpbGUgcGFyY2VsYWJsZTsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOyBzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMlZlY3RvcigmdmFsdWVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOwotICAgIG1DaGFubmVsTWFza3MuaW5zZXJ0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOwotICAgIHZhbHVlcy5jbGVhcigpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzJWZWN0b3IoJnZhbHVlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgbVNhbXBsaW5nUmF0ZXMuaW5zZXJ0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbUlzRHluYW1pY0Zvcm1hdCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbUlzRHluYW1pY0NoYW5uZWxzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRCb29sKCZtSXNEeW5hbWljUmF0ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBzdGF0dXM7CisgICAgKnRoaXMgPSAqVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhmcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKSk7CisgICAgcmV0dXJuIE9LOworfQorCitDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+CitBdWRpb1Byb2ZpbGU6OmZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIHBhcmNlbGFibGUpIHsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGxlZ2FjeSA9IG5ldyBBdWRpb1Byb2ZpbGUoKTsKKyAgICBsZWdhY3ktPm1OYW1lID0gcGFyY2VsYWJsZS5uYW1lOworICAgIGxlZ2FjeS0+bUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChwYXJjZWxhYmxlLmZvcm1hdCkpOworICAgIGxlZ2FjeS0+bUNoYW5uZWxNYXNrcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8Q2hhbm5lbE1hc2tTZXQ+KHBhcmNlbGFibGUuY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdCkpOworICAgIGxlZ2FjeS0+bVNhbXBsaW5nUmF0ZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPFNhbXBsZVJhdGVTZXQ+KHBhcmNlbGFibGUuc2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPHVpbnQzMl90LCBpbnQzMl90PikpOworICAgIGxlZ2FjeS0+bUlzRHluYW1pY0Zvcm1hdCA9IHBhcmNlbGFibGUuaXNEeW5hbWljRm9ybWF0OworICAgIGxlZ2FjeS0+bUlzRHluYW1pY0NoYW5uZWxzID0gcGFyY2VsYWJsZS5pc0R5bmFtaWNDaGFubmVsczsKKyAgICBsZWdhY3ktPm1Jc0R5bmFtaWNSYXRlID0gcGFyY2VsYWJsZS5pc0R5bmFtaWNSYXRlOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBhaWRsKSB7CisgICAgcmV0dXJuIEF1ZGlvUHJvZmlsZTo6ZnJvbVBhcmNlbGFibGUoYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBsZWdhY3kpIHsKKyAgICByZXR1cm4gbGVnYWN5LT50b1BhcmNlbGFibGUoKTsKIH0KIAogc3NpemVfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQpAQCAtMjU4LDYgKzI4OSwxNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNvbnRhaW5zKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIHByb2ZpbGUpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvJiBhdWRpb1Byb2ZpbGUgOiAqdGhpcykgeworICAgICAgICBpZiAoYXVkaW9Qcm9maWxlLT5lcXVhbHMocHJvZmlsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKSk7CkBAIC0zMDQsNCArMzQ1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgfSk7CiB9CiAKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlVmVjdG9yPgorYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGU+JiBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXI8QXVkaW9Qcm9maWxlVmVjdG9yPihhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGU+PgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4+KGxlZ2FjeSwgbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAKaW5kZXggM2RiZTM3ZC4uYTNlOTU4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIApAQCAtNDAsMTEgKzQxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpLAogICAgICAgICBtRGV2aWNlVHlwZUFkZHIoZGV2aWNlVHlwZUFkZHIpCiB7Ci0gICAgaWYgKG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzcy5lbXB0eSgpICYmIGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG1EZXZpY2VUeXBlQWRkci5tVHlwZSkpIHsKLSAgICAgICAgbURldmljZVR5cGVBZGRyLm1BZGRyZXNzID0gIjAiOworICAgIGlmIChtRGV2aWNlVHlwZUFkZHIuYWRkcmVzcygpLmVtcHR5KCkgJiYgYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobURldmljZVR5cGVBZGRyLm1UeXBlKSkgeworICAgICAgICBtRGV2aWNlVHlwZUFkZHIuc2V0QWRkcmVzcygiMCIpOwogICAgIH0KIH0KIAordm9pZCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6c2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgeworICAgIG1EZXZpY2VUeXBlQWRkci5zZXRBZGRyZXNzKGFkZHJlc3MpOworfQorCiB2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewpAQCAtNzYsMTMgKzgxLDEyIEBACiB2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKIHsKICAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJTA4eCIsIG1JZCwgbURldmljZVR5cGVBZGRyLm1UeXBlKTsKLSAgICBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHBvcnQpOwotICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKLSAgICBwb3J0LT5pZCA9IG1JZDsKLSAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZUFkZHIubVR5cGU7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS5lbmNhcHN1bGF0aW9uX21vZGVzID0gbUVuY2Fwc3VsYXRpb25Nb2RlczsKLSAgICBwb3J0LT5leHQuZGV2aWNlLmVuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZXMgPSBtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXM7Ci0gICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1EZXZpY2VUeXBlQWRkci5nZXRBZGRyZXNzKCkpOworICAgIHRvQXVkaW9Qb3J0SW50ZXJuYWwocG9ydCk7Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdCB7CisgICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydCgpIHY3IGhhbmRsZSAlZCB0eXBlICUwOHgiLCBtSWQsIG1EZXZpY2VUeXBlQWRkci5tVHlwZSk7CisgICAgdG9BdWRpb1BvcnRJbnRlcm5hbChwb3J0KTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnNldEVuY2Fwc3VsYXRpb25Nb2Rlcyh1aW50MzJfdCBlbmNhcHN1bGF0aW9uTW9kZXMpIHsKQEAgLTEyMywxOCArMTI3LDE2IEBACiAgICAgICAgICAgICAiJSpzLSBzdXBwb3J0ZWQgZW5jYXBzdWxhdGlvbiBtZXRhZGF0YSB0eXBlczogJXUiLAogICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7CiAKLSAgICBpZiAobURldmljZVR5cGVBZGRyLm1BZGRyZXNzLnNpemUoKSAhPSAwKSB7CisgICAgaWYgKG1EZXZpY2VUeXBlQWRkci5hZGRyZXNzKCkuc2l6ZSgpICE9IDApIHsKICAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtRGV2aWNlVHlwZUFkZHIuZ2V0QWRkcmVzcygpKSk7CiAgICAgfQogICAgIEF1ZGlvUG9ydDo6ZHVtcChkc3QsIHNwYWNlcywgdmVyYm9zZSk7CiB9CiAKLXN0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3JCYXNlOjp0b1N0cmluZygpIGNvbnN0CitzdGQ6OnN0cmluZyBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbykgY29uc3QKIHsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOwotICAgIHNzdHJlYW0gPDwgInR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8IHR5cGUoKSA8PCAiLEA6IiA8PCBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3M7Ci0gICAgcmV0dXJuIHNzdHJlYW0uc3RyKCk7CisgICAgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci50b1N0cmluZyhpbmNsdWRlU2Vuc2l0aXZlSW5mbyk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmxvZygpIGNvbnN0CkBAIC0xNTQsMjYgKzE1Niw1MyBAQAogICAgICAgICAgICBtRGV2aWNlVHlwZUFkZHIuZXF1YWxzKG90aGVyLT5tRGV2aWNlVHlwZUFkZHIpOwogfQogCisKIHN0YXR1c190IERldmljZURlc2NyaXB0b3JCYXNlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAogewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmICgoc3RhdHVzID0gQXVkaW9Qb3J0Ojp3cml0ZVRvUGFyY2VsKHBhcmNlbCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsKHBhcmNlbCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGUobURldmljZVR5cGVBZGRyKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1FbmNhcHN1bGF0aW9uTW9kZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IHBhcmNlbGFibGU7CisgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQorICAgICAgICA/OiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKIH0KIAotc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmICgoc3RhdHVzID0gQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbChwYXJjZWwpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWwocGFyY2VsKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZtRGV2aWNlVHlwZUFkZHIpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUVuY2Fwc3VsYXRpb25Nb2RlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gc3RhdHVzOworc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OndyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnQqIHBhcmNlbGFibGUpIGNvbnN0IHsKKyAgICBBdWRpb1BvcnQ6OndyaXRlVG9QYXJjZWxhYmxlKHBhcmNlbGFibGUpOworICAgIEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUtPmFjdGl2ZUNvbmZpZyk7CisgICAgcGFyY2VsYWJsZS0+aWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChtSWQpKTsKKworICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQgZXh0OworICAgIGV4dC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MobURldmljZVR5cGVBZGRyKSk7CisgICAgZXh0LmVuY2Fwc3VsYXRpb25Nb2RlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2sobUVuY2Fwc3VsYXRpb25Nb2RlcykpOworICAgIGV4dC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKKyAgICBVTklPTl9TRVQocGFyY2VsYWJsZS0+ZXh0LCBkZXZpY2UsIHN0ZDo6bW92ZShleHQpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZURlc2NyaXB0b3JCYXNlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgeworICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKKyAgICByZXR1cm4gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCisgICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwYXJjZWxhYmxlKSB7CisgICAgaWYgKHBhcmNlbGFibGUudHlwZSAhPSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvUG9ydDo6cmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgPzogQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZS5hY3RpdmVDb25maWcpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0IGV4dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoVU5JT05fR0VUKHBhcmNlbGFibGUuZXh0LCBkZXZpY2UpKTsKKyAgICBtRGV2aWNlVHlwZUFkZHIgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhleHQuZGV2aWNlKSk7CisgICAgbUVuY2Fwc3VsYXRpb25Nb2RlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2soZXh0LmVuY2Fwc3VsYXRpb25Nb2RlcykpOworICAgIG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhleHQuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBkZXZpY2VzKQpAQCAtMTk3LDQgKzIyNiwyNCBAQAogICAgIHJldHVybiBkZXZpY2VUeXBlQWRkcnM7CiB9CiAKK0NvbnZlcnNpb25SZXN1bHQ8c3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+PgorYWlkbDJsZWdhY3lfRGV2aWNlRGVzY3JpcHRvckJhc2UoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgYWlkbCkgeworICAgIHNwPERldmljZURlc2NyaXB0b3JCYXNlPiByZXN1bHQgPSBuZXcgRGV2aWNlRGVzY3JpcHRvckJhc2UoQVVESU9fREVWSUNFX05PTkUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHJlc3VsdC0+cmVhZEZyb21QYXJjZWxhYmxlKGFpZGwpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0PgorbGVnYWN5MmFpZGxfRGV2aWNlRGVzY3JpcHRvckJhc2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IGFpZGw7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGVnYWN5LT53cml0ZVRvUGFyY2VsYWJsZSgmYWlkbCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gYWlkbDsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaAppbmRleCA3MmZkYTQ5Li5hYTdjYTY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaApAQCAtOTYsNyArOTYsNyBAQAogc3RhdGljIGlubGluZSBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZXNUb0JpdE1hc2soY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIHsKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICBmb3IgKGF1dG8gZGV2aWNlVHlwZSA6IGRldmljZVR5cGVzKSB7Ci0gICAgICAgIHR5cGVzIHw9IGRldmljZVR5cGU7CisgICAgICAgIHR5cGVzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190Pih0eXBlcyB8IGRldmljZVR5cGUpOwogICAgIH0KICAgICByZXR1cm4gdHlwZXM7CiB9CkBAIC0xMzEsNCArMTMxLDQgQEAKIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKTsKIAogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oCmluZGV4IDYwZWE3OGUuLjM0ZGEyMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmgKQEAgLTE5LDM2ICsxOSw1MyBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQXVkaW9EZXZpY2VUeXBlQWRkciA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK2NsYXNzIEF1ZGlvRGV2aWNlVHlwZUFkZHIgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CitwdWJsaWM6CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkcigpID0gZGVmYXVsdDsKIAotICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKSA6Ci0gICAgICAgICAgICBtVHlwZSh0eXBlKSwgbUFkZHJlc3MoYWRkcmVzcykge30KKyAgICBBdWRpb0RldmljZVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcyk7CiAKICAgICBjb25zdCBjaGFyKiBnZXRBZGRyZXNzKCkgY29uc3Q7CiAKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcygpIGNvbnN0OworCisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKTsKKworICAgIGJvb2wgaXNBZGRyZXNzU2Vuc2l0aXZlKCk7CisKICAgICBib29sIGVxdWFscyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBvdGhlcikgY29uc3Q7CiAKICAgICBBdWRpb0RldmljZVR5cGVBZGRyJiBvcGVyYXRvcj0gKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImKSA9IGRlZmF1bHQ7CiAKICAgICBib29sIG9wZXJhdG9yPChjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBvdGhlcikgY29uc3Q7CiAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgcmhzKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiByaHMpIGNvbnN0OworCiAgICAgdm9pZCByZXNldCgpOwogCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbz1mYWxzZSkgY29uc3Q7CisKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKIAogICAgIGF1ZGlvX2RldmljZXNfdCBtVHlwZSA9IEFVRElPX0RFVklDRV9OT05FOworCitwcml2YXRlOgogICAgIHN0ZDo6c3RyaW5nIG1BZGRyZXNzOworICAgIGJvb2wgbUlzQWRkcmVzc1NlbnNpdGl2ZTsKIH07CiAKIHVzaW5nIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPjsKQEAgLTU4LDQgKzc1LDIxIEBACiAgKi8KIERldmljZVR5cGVTZXQgZ2V0QXVkaW9EZXZpY2VUeXBlcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VUeXBlQWRkcnMpOwogCi19CisvKioKKyAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgQXVkaW9EZXZpY2VUeXBlQWRkcnMgdGhhdCBhcmUgc2hvd24gaW4gYGRldmljZXNgIGJ1dCBub3QKKyAqIGluIGBkZXZpY2VzVG9FeGNsdWRlYAorICovCitBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGV4Y2x1ZGVEZXZpY2VUeXBlQWRkcnNGcm9tKAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzVG9FeGNsdWRlKTsKKworc3RkOjpzdHJpbmcgZHVtcEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlVHlwZUFkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbz1mYWxzZSk7CisKKy8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0RldmljZVR5cGVBZGRyPgorYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9EZXZpY2U+CitsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGxlZ2FjeSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvR2Fpbi5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmgKaW5kZXggODU5ZjFlNy4uYTA2YjY4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmgKQEAgLTE2LDggKzE2LDEwIEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTcyLDYgKzc0LDkgQEAKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CiAKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9HYWluKiBwYXJjZWxhYmxlKSBjb25zdDsKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgcGFyY2VsYWJsZSk7CisKIHByaXZhdGU6CiAgICAgaW50ICAgICAgICAgICAgICAgbUluZGV4OwogICAgIHN0cnVjdCBhdWRpb19nYWluIG1HYWluOwpAQCAtNzksNiArODQsMTIgQEAKICAgICBib29sICAgICAgICAgICAgICBtVXNlRm9yVm9sdW1lID0gZmFsc2U7CiB9OwogCisvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9HYWluPj4KK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbihjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2Fpbj4KK2xlZ2FjeTJhaWRsX0F1ZGlvR2Fpbihjb25zdCBzcDxBdWRpb0dhaW4+JiBsZWdhY3kpOworCiBjbGFzcyBBdWRpb0dhaW5zIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvR2Fpbj4gPiwgcHVibGljIFBhcmNlbGFibGUKIHsKIHB1YmxpYzoKQEAgLTEwNCw0ICsxMTUsMTAgQEAKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CiB9OwogCisvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWlucz4KK2FpZGwybGVnYWN5X0F1ZGlvR2FpbnMoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2Fpbj4mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPj4KK2xlZ2FjeTJhaWRsX0F1ZGlvR2FpbnMoY29uc3QgQXVkaW9HYWlucyYgbGVnYWN5KTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb3J0LmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaAppbmRleCAzYzAxM2NiLi42MzNlNGUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaApAQCAtMTcsNyArMTcsMTAgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvR2Fpbi5oPgpAQCAtNDgsNiArNTEsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3Q7CisKICAgICB2aXJ0dWFsIHZvaWQgYWRkQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpIHsKICAgICAgICAgbVByb2ZpbGVzLmFkZChwcm9maWxlKTsKICAgICB9CkBAIC02NCw2ICs2OSw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IGF1ZGlvX3BvcnRfdjcmIHBvcnQpOworCiAgICAgc3RhdHVzX3QgY2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywgaW50IGluZGV4KSBjb25zdCB7CiAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgKHNpemVfdClpbmRleCA+PSBtR2FpbnMuc2l6ZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtODYsMTIgKzkzLDI3IEBACiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwogCisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydCogcGFyY2VsYWJsZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBhcmNlbGFibGUpOworCiAgICAgQXVkaW9HYWlucyBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKIHByb3RlY3RlZDoKICAgICBzdGQ6OnN0cmluZyAgbU5hbWU7CiAgICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7CiAgICAgYXVkaW9fcG9ydF9yb2xlX3QgbVJvbGU7CiAgICAgQXVkaW9Qcm9maWxlVmVjdG9yIG1Qcm9maWxlczsgLy8gQXVkaW9Qcm9maWxlcyBzdXBwb3J0ZWQgYnkgdGhpcyBwb3J0IChmb3JtYXQsIFJhdGVzLCBDaGFubmVscykKK3ByaXZhdGU6CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIHN0cnVjdCBhdWRpb19wb3J0Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgc3RydWN0IGF1ZGlvX3BvcnRfdjc+Ojp2YWx1ZSwgaW50PiA9IDA+CisgICAgdm9pZCB0b0F1ZGlvUG9ydEJhc2UoVCogcG9ydCkgY29uc3QgeworICAgICAgICBwb3J0LT5yb2xlID0gbVJvbGU7CisgICAgICAgIHBvcnQtPnR5cGUgPSBtVHlwZTsKKyAgICAgICAgc3RybGNweShwb3J0LT5uYW1lLCBtTmFtZS5jX3N0cigpLCBBVURJT19QT1JUX01BWF9OQU1FX0xFTik7CisgICAgICAgIHBvcnQtPm51bV9nYWlucyA9IHN0ZDo6bWluKG1HYWlucy5zaXplKCksIChzaXplX3QpIEFVRElPX1BPUlRfTUFYX0dBSU5TKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3J0LT5udW1fZ2FpbnM7IGkrKykgeworICAgICAgICAgICAgcG9ydC0+Z2FpbnNbaV0gPSBtR2FpbnNbaV0tPmdldEdhaW4oKTsKKyAgICAgICAgfQorICAgIH0KIH07CiAKIApAQCAtMTE5LDYgKzE0MSw4IEBACiAKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydENvbmZpZyogcGFyY2VsYWJsZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIHBhcmNlbGFibGUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdW5zaWduZWQgaW50IG1TYW1wbGluZ1JhdGUgPSAwdTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZmlsZS5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmgKaW5kZXggNzMwMTM4YS4uNTc1OTJiYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmgKQEAgLTE5LDggKzE5LDEwIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC03Myw2ICs3NSw5IEBACiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwogCisgICAgQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPiB0b1BhcmNlbGFibGUoKSBjb25zdDsKKyAgICBzdGF0aWMgQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PiBmcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBwYXJjZWxhYmxlKTsKKwogcHJpdmF0ZToKICAgICBzdGQ6OnN0cmluZyAgbU5hbWU7CiAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsgLy8gVGhlIGZvcm1hdCBmb3IgYW4gYXVkaW8gcHJvZmlsZSBzaG91bGQgb25seSBiZSBzZXQgd2hlbiBpbml0aWFsaXplZC4KQEAgLTgyLDggKzg3LDE3IEBACiAgICAgYm9vbCBtSXNEeW5hbWljRm9ybWF0ID0gZmFsc2U7CiAgICAgYm9vbCBtSXNEeW5hbWljQ2hhbm5lbHMgPSBmYWxzZTsKICAgICBib29sIG1Jc0R5bmFtaWNSYXRlID0gZmFsc2U7CisKKyAgICBBdWRpb1Byb2ZpbGUoKSA9IGRlZmF1bHQ7CisgICAgQXVkaW9Qcm9maWxlJiBvcGVyYXRvcj0oY29uc3QgQXVkaW9Qcm9maWxlJiBvdGhlcik7CiB9OwogCisvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBsZWdhY3kpOworCiBjbGFzcyBBdWRpb1Byb2ZpbGVWZWN0b3IgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8c3A8QXVkaW9Qcm9maWxlPj4sIHB1YmxpYyBQYXJjZWxhYmxlCiB7CiBwdWJsaWM6CkBAIC0xMDUsNiArMTE5LDggQEAKICAgICBib29sIGhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwogCisgICAgYm9vbCBjb250YWlucyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBwcm9maWxlKSBjb25zdDsKKwogICAgIHZpcnR1YWwgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiAgICAgYm9vbCBlcXVhbHMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdGhlcikgY29uc3Q7CkBAIC0xMTUsNCArMTMxLDExIEBACiAKIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZyaWdodCk7CiAKKy8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgorQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGVWZWN0b3I+CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlPj4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGxlZ2FjeSk7CisKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmgKaW5kZXggYWYwNDcyMS4uMTQwY2UzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgpAQCAtNDEsOCArNDIsOCBAQAogICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3JCYXNlKCkge30KIAogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyLm1UeXBlOyB9Ci0gICAgc3RkOjpzdHJpbmcgYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzczsgfQotICAgIHZvaWQgc2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgeyBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MgPSBhZGRyZXNzOyB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHIuYWRkcmVzcygpOyB9CisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKTsKICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBnZXREZXZpY2VUeXBlQWRkcigpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkcjsgfQogCiAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCkBAIC01NCw2ICs1NSw3IEBACiAKICAgICAvLyBBdWRpb1BvcnQKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBzZXRFbmNhcHN1bGF0aW9uTW9kZXModWludDMyX3QgZW5jYXBzdWxhdGlvbk1vZGVzKTsKICAgICBzdGF0dXNfdCBzZXRFbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyh1aW50MzJfdCBlbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyk7CkBAIC02MSwxNyArNjMsMzkgQEAKICAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LAogICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKICAgICB2b2lkIGxvZygpIGNvbnN0OwotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgdG8gZGVzY3JpYmUgdGhlIERldmljZURlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZVNlbnNpdGl2ZUluZm8gc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgd2hlbiBpdCBpcyB0cnVlLgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXNjcmliZSB0aGUgRGV2aWNlRGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvID0gZmFsc2UpIGNvbnN0OwogCiAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBvdGhlcikgY29uc3Q7CiAKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CiAKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0KiBwYXJjZWxhYmxlKSBjb25zdDsKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcGFyY2VsYWJsZSk7CisKIHByb3RlY3RlZDoKICAgICBBdWRpb0RldmljZVR5cGVBZGRyIG1EZXZpY2VUeXBlQWRkcjsKICAgICB1aW50MzJfdCBtRW5jYXBzdWxhdGlvbk1vZGVzID0gMDsKICAgICB1aW50MzJfdCBtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSAwOworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgc3RydWN0IGF1ZGlvX3BvcnQ+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydF92Nz46OnZhbHVlLCBpbnQ+ID0gMD4KKyAgICB2b2lkIHRvQXVkaW9Qb3J0SW50ZXJuYWwoVCogcG9ydCkgY29uc3QgeworICAgICAgICBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHBvcnQpOworICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgICAgIHBvcnQtPmlkID0gbUlkOworICAgICAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZUFkZHIubVR5cGU7CisgICAgICAgIHBvcnQtPmV4dC5kZXZpY2UuZW5jYXBzdWxhdGlvbl9tb2RlcyA9IG1FbmNhcHN1bGF0aW9uTW9kZXM7CisgICAgICAgIHBvcnQtPmV4dC5kZXZpY2UuZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlcyA9IG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlczsKKyAgICAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1EZXZpY2VUeXBlQWRkci5nZXRBZGRyZXNzKCkpOworICAgIH0KIH07CiAKIHVzaW5nIERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yID0gc3RkOjp2ZWN0b3I8c3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+PjsKQEAgLTg3LDQgKzExMSwxMCBAQAogICovCiBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZVR5cGVBZGRyc0Zyb21EZXNjcmlwdG9ycyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgZGV2aWNlcyk7CiAKKy8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgorQ29udmVyc2lvblJlc3VsdDxzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4+CithaWRsMmxlZ2FjeV9EZXZpY2VEZXNjcmlwdG9yQmFzZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydD4KK2xlZ2FjeTJhaWRsX0RldmljZURlc2NyaXB0b3JCYXNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgbGVnYWN5KTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKaW5kZXggMTcwOWQxZS4uNDgyZjQwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgICJsaWJhdWRpb2hhbEA0LjAiLAogICAgICAgICAibGliYXVkaW9oYWxANS4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDYuMCIsCisvLyAgICAgICAgImxpYmF1ZGlvaGFsQDcuMCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC02Miw4ICs2Myw2IEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBzdHJlYW0gaW50ZXJmYWNlIGluY2x1ZGVzIG1lZGlhL01pY3JvcGhvbmVJbmZvLmgKLSAgICAvLyB3aGljaCBpcyBub3QgaW4gYW55IGxpYnJhcnkgYnV0IGhhcyBhIGRlcGVuZGVuY3kgb24gaGVhZGVycyBmcm9tIGxpYmJpbmRlci4KLSAgICBoZWFkZXJfbGliczogWyJsaWJiaW5kZXJfaGVhZGVycyJdLAotCi0gICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJiaW5kZXJfaGVhZGVycyJdLAorICAgIGhlYWRlcl9saWJzOiBbImF2LWhlYWRlcnMiXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImF2LWhlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcAppbmRleCA1OTg1ZWYwLi43MjI4YjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0zMSw2ICszMSw3IEBACiAvKiogU3VwcG9ydGVkIEhBTCB2ZXJzaW9ucywgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KICAqLwogY29uc3QgY2hhciogc0F1ZGlvSEFMVmVyc2lvbnNbXSA9IHsKKyAgICAiNy4wIiwKICAgICAiNi4wIiwKICAgICAiNS4wIiwKICAgICAiNC4wIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUyBiL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUwppbmRleCAxNDU2YWI2Li43MWIxN2U2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTCkBAIC0xLDIgKzEgQEAKLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCmluZGV4IDk2N2ZiYTEuLmZlNDc4ODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKQEAgLTI2LDYgKzI2LDcgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC11bnN0YWJsZS1jcHAiLAogICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKQEAgLTExNiwzICsxMTcsMjAgQEAKICAgICBdCiB9CiAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBlbmFibGVkOiBmYWxzZSwKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANy4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A3LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NyIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCmluZGV4IDdkMGQ4M2QuLjc3YzI1NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcApAQCAtNDgsNiArNDgsOSBAQAogCiBuYW1lc3BhY2UgewogCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6QXVkaW9Qb3J0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OkF1ZGlvUG9ydENvbmZpZzsKKwogc3RhdHVzX3QgZGV2aWNlQWRkcmVzc0Zyb21IYWwoCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIqIGhhbEFkZHJlc3MsIERldmljZUFkZHJlc3MqIGFkZHJlc3MpIHsKICAgICBhZGRyZXNzLT5kZXZpY2UgPSBBdWRpb0RldmljZShkZXZpY2UpOwpAQCAtMzg4LDYgKzM5MSwzMyBAQAogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7CiB9CiAKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNworICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAorICAgICAgICAgICAgaGlkbFBvcnQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOworI2Vsc2UKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQgPSB7fTsKKyAgICBhdWRpb19wb3B1bGF0ZV9hdWRpb19wb3J0KHBvcnQsICZhdWRpb1BvcnQpOworICAgIHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX3BvcHVsYXRlX2F1ZGlvX3BvcnRfdjcoJmF1ZGlvUG9ydCwgcG9ydCk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oCmluZGV4IGQzNDJkNGEuLmFiZDRhZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oCkBAIC0xMDcsNiArMTA3LDkgQEAKICAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKIAorICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOworCiAgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKaW5kZXggODAyMWQ5Mi4uYWE5ZTQ3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKQEAgLTE4MCw2ICsxODAsMTYgQEAKICAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7CiB9CiAKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIHsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQgPSB7fTsKKyAgICBhdWRpb19wb3B1bGF0ZV9hdWRpb19wb3J0KHBvcnQsICZhdWRpb1BvcnQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX3BvcHVsYXRlX2F1ZGlvX3BvcnRfdjcoJmF1ZGlvUG9ydCwgcG9ydCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKICAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCiAgICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaAppbmRleCBkODVlMmE3Li4xOTUyMDRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCkBAIC0xMDAsNiArMTAwLDkgQEAKICAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKIAorICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOworCiAgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCmluZGV4IGNhZjU3NWMuLjUwNmZlYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcApAQCAtMjUsOSArMjUsOSBAQAogCiAjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgogI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJVdWlkVXRpbHMuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OlV1aWRVdGlsczsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7CkBAIC01OCw4ICs1OCw4IEBACiAvLyBzdGF0aWMKIHZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAogICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7CisgICAgVXVpZFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7CisgICAgVXVpZFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7CiAgICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7CiAgICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKICAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKaW5kZXggOTE5MmEzMS4uMzVhYzMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMjMsOSArMjMsOSBAQAogI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisjaW5jbHVkZSAiVXVpZFV0aWxzLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpVdWlkVXRpbHM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM3LDcgKzM3LDcgQEAKIAogRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoc3A8SUVmZmVjdHNGYWN0b3J5PiBlZmZlY3RzRmFjdG9yeSkKICAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7Ci0gICAgQUxPR19BU1NFUlQoZWZmZWN0c0ZhY3RvcnkgIT0gbnVsbHB0ciwgIlByb3ZpZGVkIElEZXZpY2VzRmFjdG9yeSBzZXJ2aWNlIGlzIE5VTEwiKTsKKyAgICBBTE9HX0FTU0VSVChlZmZlY3RzRmFjdG9yeSAhPSBudWxscHRyLCAiUHJvdmlkZWQgSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UgaXMgTlVMTCIpOwogICAgIG1FZmZlY3RzRmFjdG9yeSA9IGVmZmVjdHNGYWN0b3J5OwogfQogCkBAIC04NSw3ICs4NSw3IEBACiAgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKICAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwogICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgVXVpZFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CiAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewpAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICAgIGludDMyX3QgZGV2aWNlSWQgX191bnVzZWQsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewogICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBVdWlkVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CiAgICAgUmV0dXJuPHZvaWQ+IHJldDsKICNpZiBNQUpPUl9WRVJTSU9OID49IDYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmluZGV4IGRlY2UxYmIuLjVmYTg1ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApAQCAtNTQsNiArNTQsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwogCisgICAgdmlydHVhbCBmbG9hdCBnZXRIYWxWZXJzaW9uKCkgeyByZXR1cm4gTUFKT1JfVkVSU0lPTiArIChmbG9hdClNSU5PUl9WRVJTSU9OIC8gMTA7IH0KKwogICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKaW5kZXggNWZkMzkxMi4uZjZhNTU0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAppbmRleCAxZTA0YjIxLi4yOWVmMDExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKQEAgLTEwNiw2ICsxMDYsOSBAQAogICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpID0gMDsKIAorICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpID0gMDsKKwogICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCmluZGV4IDNhNzZmOWYuLjlmYjU2YWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKQEAgLTQ2LDYgKzQ2LDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKSA9IDA7CiAKKyAgICB2aXJ0dWFsIGZsb2F0IGdldEhhbFZlcnNpb24oKSA9IDA7CisKICAgICBzdGF0aWMgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZSgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKaW5kZXggMWEzMTQyMC4uZDg1ZTJlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcApAQCAtNzksMTAgKzc5LDE0IEBACiAgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxNYXNrID09ICh0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCiAgICAgfQotICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0gdHJhY2tDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKLSAgICB0cmFja0NoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7Ci0gICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7Ci0gICAgbWl4ZXJDaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih0cmFja0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICB0cmFja0NoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgdHJhY2tDaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oCisgICAgICAgICAgICBtaXhlckNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICBtaXhlckNoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwogICAgIC8vIGFsd2F5cyByZWNvbXB1dGUgZm9yIGJvdGggY2hhbm5lbCBtYXNrcyBldmVuIGlmIG9ubHkgb25lIGhhcyBjaGFuZ2VkLgogICAgIGNvbnN0IHVpbnQzMl90IHRyYWNrQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHRyYWNrQ2hhbm5lbE1hc2spOwogICAgIGNvbnN0IHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVyQ2hhbm5lbE1hc2spOwpAQCAtMzYyLDcgKzM2Niw4IEBACiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwogICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAodHJhY2stPm1NaXhlckNoYW5uZWxNYXNrIHwgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCB0cmFja0NoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CkBAIC00MDcsNyArNDEyLDggQEAKICAgICAgICAgY2FzZSBNSVhFUl9DSEFOTkVMX01BU0s6IHsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2sgPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay0+Y2hhbm5lbE1hc2sgfCB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y2hhbm5lbE1hc2sgfCB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrKSwKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CkBAIC00MjMsNyArNDI5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgSEFQVElDX0lOVEVOU0lUWTogewotICAgICAgICAgICAgY29uc3QgaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSA9IHN0YXRpY19jYXN0PGhhcHRpY19pbnRlbnNpdHlfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgY29uc3Qgb3M6OkhhcHRpY1NjYWxlIGhhcHRpY0ludGVuc2l0eSA9IHN0YXRpY19jYXN0PG9zOjpIYXB0aWNTY2FsZT4odmFsdWVJbnQpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ICE9IGhhcHRpY0ludGVuc2l0eSkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gaGFwdGljSW50ZW5zaXR5OwogICAgICAgICAgICAgfQpAQCAtNTMzLDkgKzUzOSwxMCBAQAogICAgIFRyYWNrKiB0ID0gc3RhdGljX2Nhc3Q8VHJhY2sqPih0cmFjayk7CiAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHQtPmNoYW5uZWxNYXNrOwotICAgIHQtPm1IYXB0aWNDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIHQtPm1IYXB0aWNDaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICB0LT5tSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHQtPm1IYXB0aWNDaGFubmVsTWFzayk7Ci0gICAgY2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBjaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihjaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwogICAgIHQtPmNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgQUxPR1ZfSUYoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCiAgICAgICAgICAgICAiTm9uLXN0ZXJlbyBjaGFubmVsIG1hc2s6ICVkXG4iLCBjaGFubmVsTWFzayk7CkBAIC01NDUsNyArNTUyLDcgQEAKICAgICB0LT5tUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwogICAgIC8vIGhhcHRpYwogICAgIHQtPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsKLSAgICB0LT5tSGFwdGljSW50ZW5zaXR5ID0gSEFQVElDX1NDQUxFX05PTkU7CisgICAgdC0+bUhhcHRpY0ludGVuc2l0eSA9IG9zOjpIYXB0aWNTY2FsZTo6Tk9ORTsKICAgICB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPSAwOwogICAgIHQtPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudCArIHQtPm1IYXB0aWNDaGFubmVsQ291bnQ7CkBAIC01OTAsMTkgKzU5NywxMiBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IGdldFRyYWNrKG5hbWUpOwogICAgICAgICAgICAgaWYgKHQtPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQgPSBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKLSAgICAgICAgICAgICAgICBmbG9hdCBnYW1tYSA9IHQtPmdldEhhcHRpY1NjYWxlR2FtbWEoKTsKLSAgICAgICAgICAgICAgICBmbG9hdCBtYXhBbXBsaXR1ZGVSYXRpbyA9IHQtPmdldEhhcHRpY01heEFtcGxpdHVkZVJhdGlvKCk7CiAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyID0gKHVpbnQ4X3QqKXBhaXIuZmlyc3QgKyBtRnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQtPm1NaXhlckZvcm1hdCkgewogICAgICAgICAgICAgICAgIC8vIE1peGVyIGZvcm1hdCBzaG91bGQgYmUgQVVESU9fRk9STUFUX1BDTV9GTE9BVC4KICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZvdXQgPSAoZmxvYXQqKSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbXVsID0gZm91dFtpXSA+PSAwID8gMS4wIDogLTEuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdXRbaV0gPSBwb3dmKGZhYnNmKGZvdXRbaV0gLyBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCksIGdhbW1hKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1heEFtcGxpdHVkZVJhdGlvICogSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgKiBtdWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3M6OnNjYWxlSGFwdGljRGF0YSgoZmxvYXQqKSBidWZmZXIsIHNhbXBsZUNvdW50LCB0LT5tSGFwdGljSW50ZW5zaXR5KTsKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtTWl4ZXJGb3JtYXQ6ICUjeCIsIHQtPm1NaXhlckZvcm1hdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaAppbmRleCA4MGJkMDkzLi44ZDM3NGM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyT3BzLmgKQEAgLTIzNCwxNyArMjM0LDIwIEBACiAgICAgc3RhdGljX2Fzc2VydChOQ0hBTiA+IDAgJiYgTkNIQU4gPD0gOCk7CiAgICAgc3RhdGljX2Fzc2VydChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MCiAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfU1RFUkVPVk9MCi0gICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5EKTsKKyAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQKKyAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKTsKICAgICBhdXRvIHByb2MgPSBbXShhdXRvJiBhLCBjb25zdCBhdXRvJiBiKSB7CiAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTAotICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQpIHsKKyAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5ECisgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpIHsKICAgICAgICAgICAgIGEgKz0gYjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGEgPSBiOwogICAgICAgICB9CiAgICAgfTsKICAgICBhdXRvIGlucCA9IFsmaW5dKCkgLT4gY29uc3QgVEkmIHsKLSAgICAgICAgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5EKSB7CisgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORAorICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSB7CiAgICAgICAgICAgICByZXR1cm4gKmluOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuICppbisrOwpAQCAtMzEyLDYgKzMxNSw4IEBACiAgKiAgIFRWL1RBVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAogICogICBJbnB1dCBjaGFubmVsIGNvdW50IGlzIDEuCiAgKiAgIHZvbDogcmVwcmVzZW50cyB2b2x1bWUgYXJyYXkuCisgKiAgIFRoaXMgdXNlcyBzdGVyZW8gYmFsYW5jZWQgdm9sdW1lIHZvbFswXSBhbmQgdm9sWzFdLgorICogICBCZWZvcmUgUiwgdGhpcyB3YXMgYSBmdWxsIHZvbHVtZSBhcnJheSBidXQgd2FzIGNhbGxlZCBvbmx5IGZvciBjaGFubmVscyA8PSAyLgogICoKICAqICAgVGhpcyBhY2N1bXVsYXRlcyBpbnRvIHRoZSBvdXQgcG9pbnRlci4KICAqCkBAIC0zNTYsMTcgKzM2MSwxMyBAQAogICAgICAgICBkbyB7CiAgICAgICAgICAgICBUQSBhdXhhY2N1bSA9IDA7CiAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSSkgeworICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoTkNIQU4gPD0gMik7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CiAgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluLCB2b2xbaV0sICZhdXhhY2N1bSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluKys7CiAgICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFkpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOIDw9IDIpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgewogICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CiAgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CkBAIC0zODMsMTEgKzM4NCwxMyBAQAogICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CiAgICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MCiAgICAgICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wKKyAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQKICAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgewogICAgICAgICAgICAgICAgIHN0ZXJlb1ZvbHVtZUhlbHBlcjxNSVhUWVBFLCBOQ0hBTj4oCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsIGluLCB2b2wsIFsmYXV4YWNjdW1dIChhdXRvICZhLCBjb25zdCBhdXRvICZiKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KGEsIGIsICZhdXhhY2N1bSk7CiAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgaW4gKz0gMTsKICAgICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQpIGluICs9IDI7CiAgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKICAgICAgICAgICAgICAgICB2b2xbMV0gKz0gdm9saW5jWzFdOwpAQCAtNDAxLDE3ICs0MDQsMTMgQEAKICAgICB9IGVsc2UgewogICAgICAgICBkbyB7CiAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSSkgeworICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoTkNIQU4gPD0gMik7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4sIHZvbFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluKys7CiAgICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFkpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOIDw9IDIpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgewogICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CkBAIC00MjgsMTAgKzQyNywxMiBAQAogICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CiAgICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MCiAgICAgICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wKKyAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQKICAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgewogICAgICAgICAgICAgICAgIHN0ZXJlb1ZvbHVtZUhlbHBlcjxNSVhUWVBFLCBOQ0hBTj4ob3V0LCBpbiwgdm9sLCBbXSAoYXV0byAmYSwgY29uc3QgYXV0byAmYikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWl4TXVsPFRPLCBUSSwgVFY+KGEsIGIpOwogICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpIGluICs9IDE7CiAgICAgICAgICAgICAgICAgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5EKSBpbiArPSAyOwogICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CiAgICAgICAgICAgICAgICAgdm9sWzFdICs9IHZvbGluY1sxXTsKQEAgLTQ1NCwxNSArNDU1LDEyIEBACiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIFRBIGF1eGFjY3VtID0gMDsKICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJKSB7CisgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChOQ0hBTiA8PSAyKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgewotICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4sIHZvbFtpXSwgJmF1eGFjY3VtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW4rKzsKICAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWSkgeworICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoTkNIQU4gPD0gMik7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NzYsMTEgKzQ3NCwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wKICAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX1NURVJFT1ZPTAorICAgICAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORAogICAgICAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5EKSB7CiAgICAgICAgICAgICAgICAgc3RlcmVvVm9sdW1lSGVscGVyPE1JWFRZUEUsIE5DSEFOPigKICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwgaW4sIHZvbCwgWyZhdXhhY2N1bV0gKGF1dG8gJmEsIGNvbnN0IGF1dG8gJmIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oYSwgYiwgJmF1eGFjY3VtKTsKICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSBpbiArPSAxOwogICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgaW4gKz0gMjsKICAgICAgICAgICAgIH0gZWxzZSAvKiBjb25zdGV4cHIgKi8gewogICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoZGVwZW5kZW50X2ZhbHNlPE1JWFRZUEU+LCAiaW52YWxpZCBtaXh0eXBlIik7CkBAIC00OTAsMTYgKzQ5MCwxNCBAQAogICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIEFMT0dEKCJNaXh0eXBlOiVkIE5DSEFOOiVkIiwgTUlYVFlQRSwgTkNIQU4pOwogICAgICAgICAgICAgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVEkpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOIDw9IDIpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgewogICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluLCB2b2xbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbisrOwogICAgICAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZKSB7CisgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChOQ0hBTiA8PSAyKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOwogICAgICAgICAgICAgICAgIH0KQEAgLTUxMywxMCArNTExLDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTAogICAgICAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfU1RFUkVPVk9MCisgICAgICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5ECiAgICAgICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQpIHsKICAgICAgICAgICAgICAgICBzdGVyZW9Wb2x1bWVIZWxwZXI8TUlYVFlQRSwgTkNIQU4+KG91dCwgaW4sIHZvbCwgW10gKGF1dG8gJmEsIGNvbnN0IGF1dG8gJmIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1peE11bDxUTywgVEksIFRWPihhLCBiKTsKICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSBpbiArPSAxOwogICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgaW4gKz0gMjsKICAgICAgICAgICAgIH0gZWxzZSAvKiBjb25zdGV4cHIgKi8gewogICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoZGVwZW5kZW50X2ZhbHNlPE1JWFRZUEU+LCAiaW52YWxpZCBtaXh0eXBlIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAppbmRleCBlYzU2YjAwLi4xYWFjZmQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKQEAgLTYzNiw3ICs2MzUsNyBAQAogICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0ID0gYy5tTCA8PCBjLm1TaGlmdDsKICAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKHBoYXNlSW5jcmVtZW50ICogKHVpbnQ2NF90KW91dEZyYW1lQ291bnQgKyBwaGFzZUZyYWN0aW9uKQogICAgICAgICAgICAgLyBwaGFzZVdyYXBMaW1pdDsKLSAgICAvLyBzYW5pdHkgY2hlY2sgdGhhdCBpbkZyYW1lQ291bnQgaXMgaW4gc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIHJhbmdlLgorICAgIC8vIHZhbGlkYXRlIHRoYXQgaW5GcmFtZUNvdW50IGlzIGluIHNpZ25lZCAzMiBiaXQgaW50ZWdlciByYW5nZS4KICAgICBBTE9HX0FTU0VSVCgwIDw9IGluRnJhbWVDb3VudCAmJiBpbkZyYW1lQ291bnQgPCAoMVUgPDwgMzEpKTsKIAogICAgIC8vQUxPR1YoImluRnJhbWVDb3VudDolZCAgb3V0RnJhbWVDb3VudDolZCIKQEAgLTY0Niw3ICs2NDUsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgLy8gdGhlIGZvbGxvd2luZyBsb2dpYyBpcyBhIGJpdCBjb252b2x1dGVkIHRvIGtlZXAgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wCiAgICAgLy8gYXMgdGlnaHQgYXMgcG9zc2libGUgd2l0aCByZWdpc3RlciBhbGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCmluZGV4IDliNzBhMWMuLjFmY2ZmY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTM4MSw3ICszODEsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgaWYgKExPQ0tFRCkgewogICAgICAgICAvLyBsb2NrZWQgcG9seXBoYXNlIChubyBpbnRlcnBvbGF0aW9uKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCA1YTAzYTBkLi5mMmMzODZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCiAgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKICAgICAvLyB0byBnZW5lcmF0ZSBmYXIgbGVzcyBlZmZpY2llbnQgY29kZS4KLSAgICAvLyBBbHdheXMgc2FuaXR5IGNoZWNrIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCisgICAgLy8gQWx3YXlzIHZhbGlkYXRlIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCiAKICAgICAvLyBjb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgY29lZmZpY2llbnQgb24gdGhlIHBvc2l0aXZlIHNpZGUgYW5kCiAgICAgLy8gbmVnYXRpdmUgc2lkZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCmluZGV4IDNmN2NkNDguLjcwZWFmZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKQEAgLTIyLDEwICsyMiwxMCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9vcy9JRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlclByb3ZpZGVycy5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx2aWJyYXRvci9FeHRlcm5hbFZpYnJhdGlvblV0aWxzLmg+CiAKIC8vIEZJWE1FIFRoaXMgaXMgYWN0dWFsbHkgdW5pdHkgZ2Fpbiwgd2hpY2ggbWlnaHQgbm90IGJlIG1heCBpbiBmdXR1cmUsIGV4cHJlc3NlZCBpbiBVLjEyCiAjZGVmaW5lIE1BWF9HQUlOX0lOVCBBdWRpb01peGVyQmFzZTo6VU5JVFlfR0FJTl9JTlQKQEAgLTU1LDMyICs1NSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXcgcGxheWJhY2sgcmF0ZS4KICAgICB9OwogCi0gICAgdHlwZWRlZiBlbnVtIHsgLy8gSGFwdGljIGludGVuc2l0eSwgc2hvdWxkIGtlZXAgY29uc2lzdGVudCB3aXRoIFZpYnJhdG9yU2VydmljZQotICAgICAgICBIQVBUSUNfU0NBTEVfTVVURSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX01VVEUsCi0gICAgICAgIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVyA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfTE9XLAotICAgICAgICBIQVBUSUNfU0NBTEVfTE9XID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTE9XLAotICAgICAgICBIQVBUSUNfU0NBTEVfTk9ORSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX05PTkUsCi0gICAgICAgIEhBUFRJQ19TQ0FMRV9ISUdIID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfSElHSCwKLSAgICAgICAgSEFQVElDX1NDQUxFX1ZFUllfSElHSCA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfSElHSCwKLSAgICB9IGhhcHRpY19pbnRlbnNpdHlfdDsKLSAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IEhBUFRJQ19TQ0FMRV9WRVJZX0xPV19SQVRJTyA9IDIuMGYgLyAzLjBmOwotICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgSEFQVElDX1NDQUxFX0xPV19SQVRJTyA9IDMuMGYgLyA0LjBmOwotICAgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgZmxvYXQgSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgPSAxLjBmOwotCi0gICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRIYXB0aWNJbnRlbnNpdHkoaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSkgewotICAgICAgICBzd2l0Y2ggKGhhcHRpY0ludGVuc2l0eSkgewotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9NVVRFOgotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKLSAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9OT05FOgotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEF1ZGlvTWl4ZXIoc2l6ZV90IGZyYW1lQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCiAgICAgICAgICAgICA6IEF1ZGlvTWl4ZXJCYXNlKGZyYW1lQ291bnQsIHNhbXBsZVJhdGUpIHsKICAgICAgICAgcHRocmVhZF9vbmNlKCZzT25jZUNvbnRyb2wsICZzSW5pdFJvdXRpbmUpOwpAQCAtMTcwLDcgKzE0NCw3IEBACiAKICAgICAgICAgLy8gSGFwdGljCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7Ci0gICAgICAgIGhhcHRpY19pbnRlbnNpdHlfdCAgIG1IYXB0aWNJbnRlbnNpdHk7CisgICAgICAgIG9zOjpIYXB0aWNTY2FsZSAgICAgIG1IYXB0aWNJbnRlbnNpdHk7CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1IYXB0aWNDaGFubmVsTWFzazsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudDsKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVySGFwdGljQ2hhbm5lbE1hc2s7CkBAIC0xODAsMzggKzE1NCw2IEBACiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQ7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzOwotCi0gICAgICAgIGZsb2F0IGdldEhhcHRpY1NjYWxlR2FtbWEoKSBjb25zdCB7Ci0gICAgICAgIC8vIE5lZWQgdG8ga2VlcCBjb25zaXN0ZW50IHdpdGggdGhlIHZhbHVlIGluIFZpYnJhdG9yU2VydmljZS4KLSAgICAgICAgc3dpdGNoIChtSGFwdGljSW50ZW5zaXR5KSB7Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfTE9XOgotICAgICAgICAgICAgcmV0dXJuIDIuMGY7Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0xPVzoKLSAgICAgICAgICAgIHJldHVybiAxLjVmOwotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgotICAgICAgICAgICAgcmV0dXJuIDAuNWY7Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfSElHSDoKLSAgICAgICAgICAgIHJldHVybiAwLjI1ZjsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBnZXRIYXB0aWNNYXhBbXBsaXR1ZGVSYXRpbygpIGNvbnN0IHsKLSAgICAgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWUgaW4gVmlicmF0b3JTZXJ2aWNlLgotICAgICAgICBzd2l0Y2ggKG1IYXB0aWNJbnRlbnNpdHkpIHsKLSAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9MT1c6Ci0gICAgICAgICAgICByZXR1cm4gSEFQVElDX1NDQUxFX1ZFUllfTE9XX1JBVElPOwotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9MT1c6Ci0gICAgICAgICAgICByZXR1cm4gSEFQVElDX1NDQUxFX0xPV19SQVRJTzsKLSAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTk9ORToKLSAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfSElHSDoKLSAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIOgotICAgICAgICAgICAgcmV0dXJuIDEuMGY7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMC4wZjsKLSAgICAgICAgfQotICAgICAgICB9CiAgICAgfTsKIAogICAgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+IGdldFRyYWNrKGludCBuYW1lKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAppbmRleCAxYjM5MDY3Li4yMDBhNGM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTU5LDcgKzU5LDcgQEAKIAogc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZChjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7CiAgICAgaWYgKHBsYXliYWNrUmF0ZS5tRmFsbGJhY2tNb2RlID09IEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0ZBSUwgJiYKLSAgICAgICAgICAgIChwbGF5YmFja1JhdGUubVN0cmV0Y2hNb2RlID09IEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfU1BFRUNIIHx8CisgICAgICAgICAgICAocGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSA9PSBBVURJT19USU1FU1RSRVRDSF9TVFJFVENIX1ZPSUNFIHx8CiAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUgPT0gQVVESU9fVElNRVNUUkVUQ0hfU1RSRVRDSF9ERUZBVUxUKSkgewogICAgICAgICAvL3Rlc3Qgc29uaWMgc3BlY2lmaWMgY29uc3RyYWludHMKICAgICAgICAgcmV0dXJuIHBsYXliYWNrUmF0ZS5tU3BlZWQgPj0gVElNRVNUUkVUQ0hfU09OSUNfU1BFRURfTUlOICYmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggMWRmNDdiNy4uMmEwZGVjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtOCwzICs4LDE0IEBACiAgICAgImxpYnNuZGZpbGUiLAogICBdLAogfQorCitjY19mdXp6IHsKKyAgbmFtZTogImxpYmF1ZGlvcHJvY2Vzc2luZ19yZWNvcmRfYnVmZmVyX2NvbnZlcnRlcl9mdXp6ZXIiLAorICBzcmNzOiBbCisgICAgImxpYmF1ZGlvcHJvY2Vzc2luZ19yZWNvcmRfYnVmZmVyX2NvbnZlcnRlcl9mdXp6ZXIuY3BwIiwKKyAgXSwKKyAgZGVmYXVsdHM6IFsibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiXSwKKyAgc3RhdGljX2xpYnM6IFsKKyAgICAibGlic25kZmlsZSIsCisgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19mdXp6X3V0aWxzLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19mdXp6X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2NTkyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX2Z1enpfdXRpbHMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0xJQkFVRElPUFJPQ0VTU0lOR19GVVpaX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9MSUJBVURJT1BST0NFU1NJTkdfRlVaWl9VVElMU19ICisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7CisgIGNvbnN0IHZvaWQqIG1BZGRyOyAgICAgICAgLy8gYmFzZSBhZGRyZXNzCisgIGNvbnN0IHNpemVfdCBtTnVtRnJhbWVzOyAgLy8gdG90YWwgZnJhbWVzCisgIGNvbnN0IHNpemVfdCBtRnJhbWVTaXplOyAgLy8gc2l6ZSBvZiBlYWNoIGZyYW1lIGluIGJ5dGVzCisgIHNpemVfdCBtTmV4dEZyYW1lOyAgICAgICAgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBwcm92aWRlCisgIHNpemVfdCBtVW5yZWw7ICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBub3QgeWV0IHJlbGVhc2VkCisgcHVibGljOgorICBQcm92aWRlcihjb25zdCB2b2lkKiBhZGRyLCBzaXplX3QgZnJhbWVzLCBzaXplX3QgZnJhbWVTaXplKQorICAgICAgOiBtQWRkcihhZGRyKSwKKyAgICAgICAgbU51bUZyYW1lcyhmcmFtZXMpLAorICAgICAgICBtRnJhbWVTaXplKGZyYW1lU2l6ZSksCisgICAgICAgIG1OZXh0RnJhbWUoMCksCisgICAgICAgIG1VbnJlbCgwKSB7fQorICBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyKSBvdmVycmlkZSB7CisgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lKSB7CisgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZTsKKyAgICB9CisgICAgbVVucmVsID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiAwKSB7CisgICAgICBidWZmZXItPnJhdyA9IChjaGFyKiltQWRkciArIG1GcmFtZVNpemUgKiBtTmV4dEZyYW1lOworICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICBidWZmZXItPnJhdyA9IG51bGxwdHI7CisgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKyAgfQorICB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlIHsKKyAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbVVucmVsKSB7CisgICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKKyAgICAgIG1VbnJlbCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgbVVucmVsIC09IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICB9CisgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICBidWZmZXItPnJhdyA9IG51bGxwdHI7CisgIH0KKyAgdm9pZCByZXNldCgpIHsgbU5leHRGcmFtZSA9IDA7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTElCQVVESU9QUk9DRVNTSU5HX0ZVWlpfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9saWJhdWRpb3Byb2Nlc3NpbmdfcmVjb3JkX2J1ZmZlcl9jb252ZXJ0ZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3JlY29yZF9idWZmZXJfY29udmVydGVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NTk4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3JlY29yZF9idWZmZXJfY29udmVydGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliYXVkaW9wcm9jZXNzaW5nX2Z1enpfdXRpbHMuaCIKKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NvbnN0ZXhwciBpbnQgTUFYX0ZSQU1FUyA9IDEwMjQ7CisKKyNkZWZpbmUgQVVESU9fRk9STUFUX1BDTV9NQUlOIDAKKworLy8gQ29waWVkIGFuZCBzaW1wbGlmaWVkIGZyb20gYXVkaW8taGFsLWVudW1zLmg/bD01NzEKK2NvbnN0ZXhwciB1aW50MzJfdCBGVVpaX0FVRElPX0ZPUk1BVFNbXSA9IHsKKyAgQVVESU9fRk9STUFUX1BDTV9NQUlOIHwgQVVESU9fRk9STUFUX1BDTV9TVUJfMTZfQklULAorICBBVURJT19GT1JNQVRfUENNX01BSU4gfCBBVURJT19GT1JNQVRfUENNX1NVQl84X0JJVCwKKyAgQVVESU9fRk9STUFUX1BDTV9NQUlOIHwgQVVESU9fRk9STUFUX1BDTV9TVUJfMzJfQklULAorICBBVURJT19GT1JNQVRfUENNX01BSU4gfCBBVURJT19GT1JNQVRfUENNX1NVQl84XzI0X0JJVCwKKyAgQVVESU9fRk9STUFUX1BDTV9NQUlOIHwgQVVESU9fRk9STUFUX1BDTV9TVUJfRkxPQVQsCisgIEFVRElPX0ZPUk1BVF9QQ01fTUFJTiB8IEFVRElPX0ZPUk1BVF9QQ01fU1VCXzI0X0JJVF9QQUNLRUQsCisgIDB4MDEwMDAwMDB1LAorICAweDAyMDAwMDAwdSwKKyAgMHgwMzAwMDAwMHUsCisgIDB4MDQwMDAwMDB1LAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTUFJTiwKKyAgQVVESU9fRk9STUFUX0FBQyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0xDLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfU1NSLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTFRQLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfSEVfVjEsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9TQ0FMQUJMRSwKKyAgQVVESU9fRk9STUFUX0FBQyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0VSTEMsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9MRCwKKyAgQVVESU9fRk9STUFUX0FBQyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0hFX1YyLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfRUxELAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfWEhFLAorICAweDA1MDAwMDAwdSwKKyAgMHgwNjAwMDAwMHUsCisgIDB4MDcwMDAwMDB1LAorICAweDA4MDAwMDAwdSwKKyAgMHgwOTAwMDAwMHUsCisgIDB4MEEwMDAwMDB1LAorICBBVURJT19GT1JNQVRfRV9BQzMgfCBBVURJT19GT1JNQVRfRV9BQzNfU1VCX0pPQywKKyAgMHgwQjAwMDAwMHUsCisgIDB4MEMwMDAwMDB1LAorICAweDBEMDAwMDAwdSwKKyAgMHgwRTAwMDAwMHUsCisgIDB4MTAwMDAwMDB1LAorICAweDExMDAwMDAwdSwKKyAgMHgxMjAwMDAwMHUsCisgIDB4MTMwMDAwMDB1LAorICAweDE0MDAwMDAwdSwKKyAgMHgxNTAwMDAwMHUsCisgIDB4MTYwMDAwMDB1LAorICAweDE3MDAwMDAwdSwKKyAgMHgxODAwMDAwMHUsCisgIDB4MTkwMDAwMDB1LAorICAweDFBMDAwMDAwdSwKKyAgMHgxQjAwMDAwMHUsCisgIDB4MUMwMDAwMDB1LAorICAweDFEMDAwMDAwdSwKKyAgMHgxRTAwMDAwMHUsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX01BSU4sCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0xDLAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9TU1IsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0xUUCwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfSEVfVjEsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX1NDQUxBQkxFLAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9FUkxDLAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9MRCwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfSEVfVjIsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0VMRCwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfWEhFLAorICAweDFGMDAwMDAwdSwKKyAgMHgyMDAwMDAwMHUsCisgIDB4MjEwMDAwMDB1LAorICAweDIyMDAwMDAwdSwKKyAgMHgyMzAwMDAwMHUsCisgIDB4MjQwMDAwMDB1LAorICBBVURJT19GT1JNQVRfTUFUIHwgQVVESU9fRk9STUFUX01BVF9TVUJfMV8wLAorICBBVURJT19GT1JNQVRfTUFUIHwgQVVESU9fRk9STUFUX01BVF9TVUJfMl8wLAorICBBVURJT19GT1JNQVRfTUFUIHwgQVVESU9fRk9STUFUX01BVF9TVUJfMl8xLAorICAweDI1MDAwMDAwdSwKKyAgQVVESU9fRk9STUFUX0FBQ19MQVRNIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTEMsCisgIEFVRElPX0ZPUk1BVF9BQUNfTEFUTSB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0hFX1YxLAorICBBVURJT19GT1JNQVRfQUFDX0xBVE0gfCBBVURJT19GT1JNQVRfQUFDX1NVQl9IRV9WMiwKKyAgMHgyNjAwMDAwMHUsCisgIDB4MjcwMDAwMDB1LAorICAweDI4MDAwMDAwdSwKKyAgMHgyOTAwMDAwMHUsCisgIDB4MkEwMDAwMDB1LAorICAweDJCMDAwMDAwdSwKKyAgMHhGRkZGRkZGRnUsCisgIEFVRElPX0ZPUk1BVF9QQ01fTUFJTiwKKyAgQVVESU9fRk9STUFUX1BDTSwKK307Citjb25zdGV4cHIgc2l6ZV90IE5VTV9BVURJT19GT1JNQVRTID0gc3RkOjpzaXplKEZVWlpfQVVESU9fRk9STUFUUyk7CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKKyAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisKKyAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3JjQ2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNyY0Zvcm1hdCA9CisgICAgICAoYXVkaW9fZm9ybWF0X3QpRlVaWl9BVURJT19GT1JNQVRTW2ZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMCwgTlVNX0FVRElPX0ZPUk1BVFMgLSAxKV07CisgIGNvbnN0IHVpbnQzMl90IHNyY1NhbXBsZVJhdGUgPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ+KDEsIDB4N2ZmZmZmZmYpOworICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBkc3RDaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKyAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZHN0Rm9ybWF0ID0KKyAgICAgIChhdWRpb19mb3JtYXRfdClGVVpaX0FVRElPX0ZPUk1BVFNbZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50PigwLCBOVU1fQVVESU9fRk9STUFUUyAtIDEpXTsKKyAgY29uc3QgdWludDMyX3QgZHN0U2FtcGxlUmF0ZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMSwgMHg3ZmZmZmZmZik7CisKKyAgLy8gQ2VydGFpbiBmb3JtYXRzIHdpbGwgcmVzdWx0IGluIExPR19BTFdBWVNfRkFUQUwgZXJyb3JzIHRoYXQgYXJlbid0IGludGVyZXN0aW5nIGNyYXNoZXMKKyAgLy8gZm9yIGZ1enppbmcuICBEb24ndCB1c2UgdGhvc2Ugb25lcy4KKyAgY29uc3QgdWludDMyX3QgZHN0Q2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soZHN0Q2hhbm5lbE1hc2spOworICBjb25zdGV4cHIgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHkgPQorICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKKyAgY29uc3QgaW50IG1heENoYW5uZWxzID0KKyAgICAgIHF1YWxpdHkgPCBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZID8gMiA6IDg7CisgIGlmIChkc3RDaGFubmVsQ291bnQgPCAxIHx8IGRzdENoYW5uZWxDb3VudCA+IG1heENoYW5uZWxzKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjb25zdCB1aW50MzJfdCBzcmNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhzcmNDaGFubmVsTWFzayk7CisgIGlmIChzcmNDaGFubmVsQ291bnQgPCAxIHx8IHNyY0NoYW5uZWxDb3VudCA+IG1heENoYW5uZWxzKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29udmVydGVyKHNyY0NoYW5uZWxNYXNrLCBzcmNGb3JtYXQsIHNyY1NhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2hhbm5lbE1hc2ssIGRzdEZvcm1hdCwgZHN0U2FtcGxlUmF0ZSk7CisgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNvbnN0IHVpbnQzMl90IHNyY0ZyYW1lU2l6ZSA9IHNyY0NoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoc3JjRm9ybWF0KTsKKyAgY29uc3QgaW50IHNyY051bUZyYW1lcyA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMCwgTUFYX0ZSQU1FUyk7CisgIGNvbnN0ZXhwciBzaXplX3QgbWV0YWRhdGFTaXplID0gMiArIDMgKiBzaXplb2YoaW50KSArIDIgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnB1dERhdGEgPSBmZHAuQ29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KAorICAgICAgbWV0YWRhdGFTaXplICsgKHNyY0ZyYW1lU2l6ZSAqIHNyY051bUZyYW1lcykpOworICBQcm92aWRlciBwcm92aWRlcihpbnB1dERhdGEuZGF0YSgpLCBzcmNOdW1GcmFtZXMsIHNyY0ZyYW1lU2l6ZSk7CisKKyAgY29uc3QgdWludDMyX3QgZHN0RnJhbWVTaXplID0gZHN0Q2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShkc3RGb3JtYXQpOworICBjb25zdCBzaXplX3QgZnJhbWVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfRlJBTUVTICsgMSk7CisgIGludDhfdCBkc3RbZHN0RnJhbWVTaXplICogZnJhbWVzXTsKKyAgbWVtc2V0KGRzdCwgMCwgc2l6ZW9mKGludDhfdCkgKiBkc3RGcmFtZVNpemUgKiBmcmFtZXMpOworCisgIC8vIEFkZCBhIHNtYWxsIG51bWJlciBvZiBsb29wcyB0byBzZWUgaWYgcmVwZWF0ZWQgY2FsbHMgdG8gY29udmVydCBjYXVzZQorICAvLyBhbnkgY2hhbmdlIGluIGJlaGF2aW9yLgorICBjb25zdCBpbnQgbnVtTG9vcHMgPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ+KDEsIDMpOworICBmb3IgKGludCBsb29wID0gMDsgbG9vcCA8IG51bUxvb3BzOyArK2xvb3ApIHsKKyAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMCwgMSkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgY29udmVydGVyLnJlc2V0KCk7CisgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgY2FzZSAxOgorICAgICAgICBjb252ZXJ0ZXIuY29udmVydChkc3QsICZwcm92aWRlciwgZnJhbWVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19yZXNhbXBsZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwCmluZGV4IDkzOGM2MTAuLjY1YzlhM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJsaWJhdWRpb3Byb2Nlc3NpbmdfZnV6el91dGlscy5oIgorCiAjaW5jbHVkZSA8bWVtb3J5PgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTUzLDQ2ICs1NSw2IEBACiAgICAgQXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCiB9OwogCi1jbGFzcyBQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLSAgY29uc3Qgdm9pZCogbUFkZHI7ICAgICAgICAvLyBiYXNlIGFkZHJlc3MKLSAgY29uc3Qgc2l6ZV90IG1OdW1GcmFtZXM7ICAvLyB0b3RhbCBmcmFtZXMKLSAgY29uc3Qgc2l6ZV90IG1GcmFtZVNpemU7ICAvLyBzaXplIG9mIGVhY2ggZnJhbWUgaW4gYnl0ZXMKLSAgc2l6ZV90IG1OZXh0RnJhbWU7ICAgICAgICAvLyBpbmRleCBvZiBuZXh0IGZyYW1lIHRvIHByb3ZpZGUKLSAgc2l6ZV90IG1VbnJlbDsgICAgICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIG5vdCB5ZXQgcmVsZWFzZWQKLSBwdWJsaWM6Ci0gIFByb3ZpZGVyKGNvbnN0IHZvaWQqIGFkZHIsIHNpemVfdCBmcmFtZXMsIHNpemVfdCBmcmFtZVNpemUpCi0gICAgICA6IG1BZGRyKGFkZHIpLAotICAgICAgICBtTnVtRnJhbWVzKGZyYW1lcyksCi0gICAgICAgIG1GcmFtZVNpemUoZnJhbWVTaXplKSwKLSAgICAgICAgbU5leHRGcmFtZSgwKSwKLSAgICAgICAgbVVucmVsKDApIHt9Ci0gIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlIHsKLSAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWUpIHsKLSAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lOwotICAgIH0KLSAgICBtVW5yZWwgPSBidWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IDApIHsKLSAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIqKW1BZGRyICsgbUZyYW1lU2l6ZSAqIG1OZXh0RnJhbWU7Ci0gICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1ZmZlci0+cmF3ID0gbnVsbHB0cjsKLSAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgfQotICB9Ci0gIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKSB7Ci0gICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1VbnJlbCkgewotICAgICAgbU5leHRGcmFtZSArPSBtVW5yZWw7Ci0gICAgICBtVW5yZWwgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBtTmV4dEZyYW1lICs9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgIG1VbnJlbCAtPSBidWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgfQotICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgYnVmZmVyLT5yYXcgPSBudWxscHRyOwotICB9Ci0gIHZvaWQgcmVzZXQoKSB7IG1OZXh0RnJhbWUgPSAwOyB9Ci19OwotCiBhdWRpb19mb3JtYXRfdCBjaG9vc2VGb3JtYXQoQXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnB1dF9ieXRlKSB7CiAgIHN3aXRjaCAocXVhbGl0eSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL21peGVyb3BzX2JlbmNobWFyay5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvbWl4ZXJvcHNfYmVuY2htYXJrLmNwcAppbmRleCA4NmY1NDI5Li43YTRjNWM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvbWl4ZXJvcHNfYmVuY2htYXJrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvbWl4ZXJvcHNfYmVuY2htYXJrLmNwcApAQCAtNzQsMjggKzc0LDMyIEBACiAgICAgfQogfQogCi1CRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJLCAyKTsKLUJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIDIpOworLy8gTVVMVEkgbW9kZSBhbmQgTVVMVElfU0FWRU9OTFkgbW9kZSBhcmUgbm90IHVzZWQgYnkgQXVkaW9NaXhlciBmb3IgY2hhbm5lbHMgPiAyLAorLy8gd2hpY2ggaXMgZW5zdXJlZCBieSBhIHN0YXRpY19hc3NlcnQgKHdvbid0IGNvbXBpbGUgZm9yIHRob3NlIGNvbmZpZ3VyYXRpb25zKS4KKy8vIFNvIHdlIGJlbmNobWFyayBNSVhUWVBFX01VTFRJX01PTk9WT0wgYW5kIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTCBjb21wYXJlZAorLy8gd2l0aCBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCBhbmQgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wuCitCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX01PTk9WT0wsIDIpOworQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MLCAyKTsKIEJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCAyKTsKIEJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfU1RFUkVPVk9MLCAyKTsKIAotQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSSwgNCk7Ci1CRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCA0KTsKK0JFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfTU9OT1ZPTCwgNCk7CitCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0wsIDQpOwogQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDQpOwogQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wsIDQpOwogCi1CRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJLCA1KTsKLUJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIDUpOworQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9NT05PVk9MLCA1KTsKK0JFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTCwgNSk7CiBCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgNSk7CiBCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX1NURVJFT1ZPTCwgNSk7CiAKLUJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVEksIDgpOwotQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgOCk7CitCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX01PTk9WT0wsIDgpOworQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MLCA4KTsKIEJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCA4KTsKIEJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfU1RFUkVPVk9MLCA4KTsKIAotQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZU11bHRpLCBNSVhUWVBFX01VTFRJLCA4KTsKLUJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgOCk7CitCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lTXVsdGksIE1JWFRZUEVfTVVMVElfTU9OT1ZPTCwgOCk7CitCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTCwgOCk7CiBCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lTXVsdGksIE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCA4KTsKIEJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wsIDgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1taXhlci5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1taXhlci5jcHAKaW5kZXggYmM5ZDJhNi4uMWJiYjg2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LW1peGVyLmNwcApAQCAtMjQxLDcgKzI0MSw4IEBACiAgICAgLy8gc2V0IHVwIHRoZSB0cmFja3MuCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcm92aWRlcnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgLy9wcmludGYoInRyYWNrICVkIG91dCBvZiAlZFxuIiwgaSwgcHJvdmlkZXJzLnNpemUoKSk7Ci0gICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHByb3ZpZGVyc1tpXS5nZXROdW1DaGFubmVscygpKTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChwcm92aWRlcnNbaV0uZ2V0TnVtQ2hhbm5lbHMoKSk7CiAgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gbWl4ZXItPmNyZWF0ZSgKICAgICAgICAgICAgICAgICBuYW1lLCBjaGFubmVsTWFzaywgZm9ybWF0c1tpXSwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcCBiL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAppbmRleCA0Yjc1NDlmLi5lNzFhN2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKKysrIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTIGIvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKaW5kZXggN2Y5YWU4MS4uYjc4MzJlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKQEAgLTEsNCArMSwzIEBACiBodW5nYUBnb29nbGUuY29tCi1rcm9jYXJkQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KIHJhZ29AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCmluZGV4IDI2ZWFhZjguLjE2OTYyMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiB0ZW1wbGF0ZSA8PgogYm9vbCBzdHJpbmdUb1N0cmVhbVR5cGUoY29uc3QgY2hhciAqc3RyZWFtTmFtZSwgYXVkaW9fZGV2aWNlc190KiB0eXBlKSB7Ci0gICAgcmV0dXJuIGRldmljZUZyb21TdHJpbmcoc3RyZWFtTmFtZSwgKnR5cGUpOworICAgIHJldHVybiBEZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyZWFtTmFtZSwgKnR5cGUpOwogfQogCiAvKiogUGFyc2UgYSBsaWJyYXJ5IHhtbCBub3RlIGFuZCBwdXNoIHRoZSByZXN1bHQgaW4gbGlicmFyaWVzIG9yIHJldHVybiBmYWxzZSBvbiBmYWlsdXJlLiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMueG1sIGIvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMueG1sCmluZGV4IDJlNWY1MjkuLjkzYTIxODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLnhtbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy54bWwKQEAgLTIxLDYgKzIxLDcgQEAKICAgICAgICAgPGxpYnJhcnkgbmFtZT0iZG93bm1peCIgcGF0aD0ibGliZG93bm1peC5zbyIvPgogICAgICAgICA8bGlicmFyeSBuYW1lPSJsb3VkbmVzc19lbmhhbmNlciIgcGF0aD0ibGlibGRuaG5jci5zbyIvPgogICAgICAgICA8bGlicmFyeSBuYW1lPSJkeW5hbWljc19wcm9jZXNzaW5nIiBwYXRoPSJsaWJkeW5wcm9jLnNvIi8+CisgICAgICAgIDxsaWJyYXJ5IG5hbWU9ImhhcHRpY19nZW5lcmF0b3IiIHBhdGg9ImxpYmhhcHRpY2dlbmVyYXRvci5zbyIvPgogICAgIDwvbGlicmFyaWVzPgogCiAgICAgPCEtLSBsaXN0IG9mIGVmZmVjdHMgdG8gbG9hZC4KQEAgLTU4LDYgKzU5LDcgQEAKICAgICAgICAgPGVmZmVjdCBuYW1lPSJkb3dubWl4IiBsaWJyYXJ5PSJkb3dubWl4IiB1dWlkPSI5M2YwNDQ1Mi1lNGZlLTQxY2MtOTFmOS1lNDc1YjZkMWQ2OWYiLz4KICAgICAgICAgPGVmZmVjdCBuYW1lPSJsb3VkbmVzc19lbmhhbmNlciIgbGlicmFyeT0ibG91ZG5lc3NfZW5oYW5jZXIiIHV1aWQ9ImZhNDE1MzI5LTIwMzQtNGJlYS1iNWRjLTViMzgxYzhkMWUyYyIvPgogICAgICAgICA8ZWZmZWN0IG5hbWU9ImR5bmFtaWNzX3Byb2Nlc3NpbmciIGxpYnJhcnk9ImR5bmFtaWNzX3Byb2Nlc3NpbmciIHV1aWQ9ImUwZTY1MzliLTE3ODEtNzI2MS02NzZmLTZkNzU3MzY5NjM0MCIvPgorICAgICAgICA8ZWZmZWN0IG5hbWU9ImhhcHRpY19nZW5lcmF0b3IiIGxpYnJhcnk9ImhhcHRpY19nZW5lcmF0b3IiIHV1aWQ9Ijk3YzRhY2QxLThiODItNGYyZi04MzJlLWMyZmU1ZDdhOTkzMSIvPgogICAgIDwvZWZmZWN0cz4KIAogICAgIDwhLS0gQXVkaW8gcHJlIHByb2Nlc3NvciBjb25maWd1cmF0aW9ucy4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCmluZGV4IGZjZWYzNmYuLmUyMzUzMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYwpAQCAtMzk0LDcgKzM5NCw3IEBACiAgICAgICAgfQogICAgICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViRW50cnkgPSAoc3ViX2VmZmVjdF9lbnRyeV90KilnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0tPm9iamVjdDsKICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpzdWJFZmZlY3REZXNjID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QqKShzdWJFbnRyeS0+b2JqZWN0KTsKLSAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCisgICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgc3R1YiBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCiAgICAgICAgLy8gZ2V0X2Rlc2NyaXB0b3IgY2FsbCx3ZSByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlc3BvZGluZwogICAgICAgIC8vIHN3IGVmZmVjdCBkZXNjcmlwdG9yLCBidXQgd2l0aCBQcm94eSBVVUlECiAgICAgICAgLy8gY2hlY2sgZm9yIFN3IGRlc2MKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcAppbmRleCA1MDViZTdjLi4zMGE5MDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCkBAIC0yODMsNyArMjgzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxpc3RQdXNoKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSwgc3ViRWZmZWN0TGlzdCk7CiAKLSAgICAgICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKKyAgICAgICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIHN0dWIgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZwogICAgICAgICAgICAgLy8gZ2V0X2Rlc2NyaXB0b3IgY2FsbCwgd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IGtlZXAgdGhlIFByb3h5IFVVSUQKICAgICAgICAgICAgICplZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MgPSAqc3dFZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQ3MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gSGFwdGljR2VuZXJhdG9yIGxpYnJhcnkKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliaGFwdGljZ2VuZXJhdG9yIiwKKworICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdEhhcHRpY0dlbmVyYXRvci5jcHAiLAorICAgICAgICAiUHJvY2Vzc29ycy5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1PMiIsIC8vIFR1cm5pbmcgb24gdGhlIG9wdGltaXphdGlvbiBpbiBvcmRlciB0byByZWR1Y2UgZWZmZWN0IHByb2Nlc3NpbmcgdGltZS4KKyAgICAgICAgICAgICAgIC8vIFRoZSBsYXRlbmN5IGlzIGFyb3VuZCAxLzUgbGVzcyB0aGFuIHdpdGhvdXQgdGhlIG9wdGltaXphdGlvbi4KKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLWZmYXN0LW1hdGgiLCAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBvcHRpbWl6YXRpb24gZm9yCisgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpcXVhZEZpbHRlci4gVHJ5IHRoZSBiaXF1YWRfZmlsdGVyX2JlbmNobWFyayB0ZXN0IGluIGF1ZGlvX3V0aWxzCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGgvd2l0aG91dCBgLWZmYXN0LW1hdGhgIGZvciBtb3JlIGNvbnRleHQuCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvRWZmZWN0SGFwdGljR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5MzY1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5jcHAKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEhHIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0SGFwdGljR2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9oYXB0aWNnZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICAgICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICAgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAgICAgLm5hbWUgPSAiSGFwdGljR2VuZXJhdG9yIExpYnJhcnkiLAorICAgICAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgIC5jcmVhdGVfZWZmZWN0ID0gYW5kcm9pZDo6YXVkaW9fZWZmZWN0OjpoYXB0aWNfZ2VuZXJhdG9yOjpIYXB0aWNHZW5lcmF0b3JMaWJfQ3JlYXRlLAorICAgICAgICAucmVsZWFzZV9lZmZlY3QgPSBhbmRyb2lkOjphdWRpb19lZmZlY3Q6OmhhcHRpY19nZW5lcmF0b3I6OkhhcHRpY0dlbmVyYXRvckxpYl9SZWxlYXNlLAorICAgICAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBhbmRyb2lkOjphdWRpb19lZmZlY3Q6OmhhcHRpY19nZW5lcmF0b3I6OkhhcHRpY0dlbmVyYXRvckxpYl9HZXREZXNjcmlwdG9yLAorfTsKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvX2VmZmVjdDo6aGFwdGljX2dlbmVyYXRvciB7CisKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGhhcHRpYyBnZW5lcmF0b3IgZWZmZWN0Citjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdIYXB0aWNHZW5lcmF0b3JJbnRlcmZhY2UgPSB7CisgICAgICAgIEhhcHRpY0dlbmVyYXRvcl9Qcm9jZXNzLAorICAgICAgICBIYXB0aWNHZW5lcmF0b3JfQ29tbWFuZCwKKyAgICAgICAgSGFwdGljR2VuZXJhdG9yX0dldERlc2NyaXB0b3IsCisgICAgICAgIG51bGxwdHIgLyogbm8gcHJvY2Vzc19yZXZlcnNlIGZ1bmN0aW9uLCBubyByZWZlcmVuY2Ugc3RyZWFtIG5lZWRlZCAqLworfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRWZmZWN0IERlc2NyaXB0b3IKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVVVJRHMgZm9yIGVmZmVjdCB0eXBlcyBoYXZlIGJlZW4gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3d3dy5pdHUuaW50L0lUVS1UL2FzbjEvdXVpZC5odG1sCisvLyBIYXB0aWMgR2VuZXJhdG9yCitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSGdEZXNjcmlwdG9yID0geworICAgICAgICBGWF9JSURfSEFQVElDR0VORVJBVE9SXywgLy8gdHlwZQorICAgICAgICB7MHg5N2M0YWNkMSwgMHg4YjgyLCAweDRmMmYsIDB4ODMyZSwgezB4YzIsIDB4ZmUsIDB4NWQsIDB4N2EsIDB4OTksIDB4MzF9fSwgLy8gdXVpZAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QsCisgICAgICAgIDAsIC8vIEZJWE1FIHdoYXQgdmFsdWUgc2hvdWxkIGJlIHJlcG9ydGVkPyAvLyBjcHUgbG9hZAorICAgICAgICAwLCAvLyBGSVhNRSB3aGF0IHZhbHVlIHNob3VsZCBiZSByZXBvcnRlZD8gLy8gbWVtb3J5IHVzYWdlCisgICAgICAgICJIYXB0aWMgR2VuZXJhdG9yIiwKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlcm5hbCBmdW5jdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIHsKKworaW50IEhhcHRpY0dlbmVyYXRvcl9Jbml0KHN0cnVjdCBIYXB0aWNHZW5lcmF0b3JDb250ZXh0ICpjb250ZXh0KSB7CisgICAgY29udGV4dC0+aXRmZSA9ICZnSGFwdGljR2VuZXJhdG9ySW50ZXJmYWNlOworCisgICAgY29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIGNvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBjb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICBjb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gMDsKKyAgICBjb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBjb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgY29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IG51bGxwdHI7CisgICAgY29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBjb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIGNvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgY29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGNvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gMDsKKyAgICBjb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IG51bGxwdHI7CisgICAgY29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gbnVsbHB0cjsKKyAgICBjb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IG51bGxwdHI7CisgICAgY29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgICBtZW1zZXQoY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbFNvdXJjZSwgMCwgc2l6ZW9mKGNvbnRleHQtPnBhcmFtLmhhcHRpY0NoYW5uZWxTb3VyY2UpKTsKKyAgICBjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsQ291bnQgPSAwOworICAgIGNvbnRleHQtPnBhcmFtLmF1ZGlvQ2hhbm5lbENvdW50ID0gMDsKKyAgICBjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNJbnRlbnNpdHkgPSBvczo6SGFwdGljU2NhbGU6Ok1VVEU7CisKKyAgICBjb250ZXh0LT5zdGF0ZSA9IEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9JTklUSUFMSVpFRDsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhZGRCaXF1YWRGaWx0ZXIoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChmbG9hdCAqLCBjb25zdCBmbG9hdCAqLCBzaXplX3QpPj4gJnByb2Nlc3NpbmdDaGFpbiwKKyAgICAgICAgc3RydWN0IEhhcHRpY0dlbmVyYXRvclByb2Nlc3NvcnNSZWNvcmQgJnByb2Nlc3NvcnNSZWNvcmQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGZpbHRlcikgeworICAgIC8vIFRoZSBwcm9jZXNzIGNoYWluIGNhcHR1cmVzIHRoZSBzaGFyZWQgcG9pbnRlciBvZiB0aGUgZmlsdGVyIGluIGxhbWJkYS4KKyAgICAvLyBUaGUgcHJvY2VzcyByZWNvcmQgd2lsbCBrZWVwIGEgc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGFjY2VzcworICAgIC8vIHRoZSBmaWx0ZXIgb3V0c2lkZSBvZiB0aGUgcHJvY2VzcyBjaGFpbi4KKyAgICBwcm9jZXNzb3JzUmVjb3JkLmZpbHRlcnMucHVzaF9iYWNrKGZpbHRlcik7CisgICAgcHJvY2Vzc2luZ0NoYWluLnB1c2hfYmFjayhbZmlsdGVyXShmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBmaWx0ZXItPnByb2Nlc3Mob3V0LCBpbiwgZnJhbWVDb3VudCk7CisgICAgfSk7Cit9CisKKy8qKgorICogXGJyaWVmIGJ1aWxkIGhhcHRpYyBnZW5lcmF0b3IgcHJvY2Vzc2luZyBjaGFpbi4KKyAqCisgKiBccGFyYW0gcHJvY2Vzc2luZ0NoYWluCisgKiBccGFyYW0gcHJvY2Vzc29yc1JlY29yZCBhIHN0cnVjdHVyZSB0byBjYWNoZSBhbGwgdGhlIHNoYXJlZCBwb2ludGVycyBmb3IgcHJvY2Vzc29ycworICogXHBhcmFtIHNhbXBsZVJhdGUgdGhlIGF1ZGlvIHNhbXBsaW5nIHJhdGUuIFVzZSBhIGZsb2F0IGhlcmUgYXMgaXQgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGZpbHRlcnMKKyAqIFxwYXJhbSBjaGFubmVsQ291bnQgaGFwdGljIGNoYW5uZWwgY291bnQKKyAqLwordm9pZCBIYXB0aWNHZW5lcmF0b3JfYnVpbGRQcm9jZXNzaW5nQ2hhaW4oCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChmbG9hdCosIGNvbnN0IGZsb2F0Kiwgc2l6ZV90KT4+JiBwcm9jZXNzaW5nQ2hhaW4sCisgICAgICAgIHN0cnVjdCBIYXB0aWNHZW5lcmF0b3JQcm9jZXNzb3JzUmVjb3JkJiBwcm9jZXNzb3JzUmVjb3JkLAorICAgICAgICBmbG9hdCBzYW1wbGVSYXRlLCBzaXplX3QgY2hhbm5lbENvdW50KSB7CisgICAgZmxvYXQgaGlnaFBhc3NDb3JuZXJGcmVxdWVuY3kgPSAxMDAuMGY7CisgICAgYXV0byBocGYgPSBjcmVhdGVIUEYyKGhpZ2hQYXNzQ29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgIGFkZEJpcXVhZEZpbHRlcihwcm9jZXNzaW5nQ2hhaW4sIHByb2Nlc3NvcnNSZWNvcmQsIGhwZik7CisgICAgZmxvYXQgbG93UGFzc0Nvcm5lckZyZXF1ZW5jeSA9IDMwMDAuMGY7CisgICAgYXV0byBscGYgPSBjcmVhdGVMUEYyKGxvd1Bhc3NDb3JuZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgYWRkQmlxdWFkRmlsdGVyKHByb2Nlc3NpbmdDaGFpbiwgcHJvY2Vzc29yc1JlY29yZCwgbHBmKTsKKworICAgIGF1dG8gcmFtcCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmFtcD4oY2hhbm5lbENvdW50KTsKKyAgICAvLyBUaGUgcHJvY2VzcyBjaGFpbiBjYXB0dXJlcyB0aGUgc2hhcmVkIHBvaW50ZXIgb2YgdGhlIHJhbXAgaW4gbGFtYmRhLiBJdCB3aWxsIGJlIHRoZSBvbmx5CisgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSByYW1wLgorICAgIC8vIFRoZSBwcm9jZXNzIHJlY29yZCB3aWxsIGtlZXAgYSB3ZWFrIHBvaW50ZXIgdG8gdGhlIHJhbXAgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MKKyAgICAvLyB0aGUgcmFtcCBvdXRzaWRlIG9mIHRoZSBwcm9jZXNzIGNoYWluLgorICAgIHByb2Nlc3NvcnNSZWNvcmQucmFtcHMucHVzaF9iYWNrKHJhbXApOworICAgIHByb2Nlc3NpbmdDaGFpbi5wdXNoX2JhY2soW3JhbXBdKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIHJhbXAtPnByb2Nlc3Mob3V0LCBpbiwgZnJhbWVDb3VudCk7CisgICAgfSk7CisKKyAgICBoaWdoUGFzc0Nvcm5lckZyZXF1ZW5jeSA9IDYwLjBmOworICAgIGhwZiA9IGNyZWF0ZUhQRjIoaGlnaFBhc3NDb3JuZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgYWRkQmlxdWFkRmlsdGVyKHByb2Nlc3NpbmdDaGFpbiwgcHJvY2Vzc29yc1JlY29yZCwgaHBmKTsKKyAgICBsb3dQYXNzQ29ybmVyRnJlcXVlbmN5ID0gNzAwLjBmOworICAgIGxwZiA9IGNyZWF0ZUxQRjIobG93UGFzc0Nvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBhZGRCaXF1YWRGaWx0ZXIocHJvY2Vzc2luZ0NoYWluLCBwcm9jZXNzb3JzUmVjb3JkLCBscGYpOworCisgICAgbG93UGFzc0Nvcm5lckZyZXF1ZW5jeSA9IDUuMGY7CisgICAgZmxvYXQgbm9ybWFsaXphdGlvblBvd2VyID0gLTAuM2Y7CisgICAgLy8gVGhlIHByb2Nlc3MgY2hhaW4gY2FwdHVyZXMgdGhlIHNoYXJlZCBwb2ludGVyIG9mIHRoZSBzbG93IGVudmVsb3BlIGluIGxhbWJkYS4gSXQgd2lsbAorICAgIC8vIGJlIHRoZSBvbmx5IHJlZmVyZW5jZSB0byB0aGUgc2xvdyBlbnZlbG9wZS4KKyAgICAvLyBUaGUgcHJvY2VzcyByZWNvcmQgd2lsbCBrZWVwIGEgd2VhayBwb2ludGVyIHRvIHRoZSBzbG93IGVudmVsb3BlIHNvIHRoYXQgaXQgaXMgcG9zc2libGUKKyAgICAvLyB0byBhY2Nlc3MgdGhlIHNsb3cgZW52ZWxvcGUgb3V0c2lkZSBvZiB0aGUgcHJvY2VzcyBjaGFpbi4KKyAgICBhdXRvIHNsb3dFbnYgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNsb3dFbnZlbG9wZT4oCisgICAgICAgICAgICBsb3dQYXNzQ29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlLCBub3JtYWxpemF0aW9uUG93ZXIsIGNoYW5uZWxDb3VudCk7CisgICAgcHJvY2Vzc29yc1JlY29yZC5zbG93RW52cy5wdXNoX2JhY2soc2xvd0Vudik7CisgICAgcHJvY2Vzc2luZ0NoYWluLnB1c2hfYmFjayhbc2xvd0Vudl0oZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLCBzaXplX3QgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgc2xvd0Vudi0+cHJvY2VzcyhvdXQsIGluLCBmcmFtZUNvdW50KTsKKyAgICB9KTsKKworICAgIGxvd1Bhc3NDb3JuZXJGcmVxdWVuY3kgPSA0MDAuMGY7CisgICAgbHBmID0gY3JlYXRlTFBGMihsb3dQYXNzQ29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgIGFkZEJpcXVhZEZpbHRlcihwcm9jZXNzaW5nQ2hhaW4sIHByb2Nlc3NvcnNSZWNvcmQsIGxwZik7CisgICAgbG93UGFzc0Nvcm5lckZyZXF1ZW5jeSA9IDUwMC4wZjsKKyAgICBscGYgPSBjcmVhdGVMUEYyKGxvd1Bhc3NDb3JuZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgYWRkQmlxdWFkRmlsdGVyKHByb2Nlc3NpbmdDaGFpbiwgcHJvY2Vzc29yc1JlY29yZCwgbHBmKTsKKworICAgIGF1dG8gYXBmID0gY3JlYXRlQVBGMig0MDAuMGYsIDIwMC4wZiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBhZGRCaXF1YWRGaWx0ZXIocHJvY2Vzc2luZ0NoYWluLCBwcm9jZXNzb3JzUmVjb3JkLCBhcGYpOworICAgIGFwZiA9IGNyZWF0ZUFQRjIoMTAwLjBmLCA1MC4wZiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBhZGRCaXF1YWRGaWx0ZXIocHJvY2Vzc2luZ0NoYWluLCBwcm9jZXNzb3JzUmVjb3JkLCBhcGYpOworICAgIGZsb2F0IGFsbFBhc3NDb3JuZXJGcmVxdWVuY3kgPSAyNS4wZjsKKyAgICBhcGYgPSBjcmVhdGVBUEYoYWxsUGFzc0Nvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBhZGRCaXF1YWRGaWx0ZXIocHJvY2Vzc2luZ0NoYWluLCBwcm9jZXNzb3JzUmVjb3JkLCBhcGYpOworCisgICAgZmxvYXQgcmVzb25hbnRGcmVxdWVuY3kgPSAxNTAuMGY7CisgICAgZmxvYXQgYmFuZHBhc3NRID0gMS4wZjsKKyAgICBhdXRvIGJwZiA9IGNyZWF0ZUJQRihyZXNvbmFudEZyZXF1ZW5jeSwgYmFuZHBhc3NRLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgIGFkZEJpcXVhZEZpbHRlcihwcm9jZXNzaW5nQ2hhaW4sIHByb2Nlc3NvcnNSZWNvcmQsIGJwZik7CisKKyAgICBmbG9hdCB6ZXJvUSA9IDguMGY7CisgICAgZmxvYXQgcG9sZVEgPSA0LjBmOworICAgIGF1dG8gYnNmID0gY3JlYXRlQlNGKHJlc29uYW50RnJlcXVlbmN5LCB6ZXJvUSwgcG9sZVEsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgYWRkQmlxdWFkRmlsdGVyKHByb2Nlc3NpbmdDaGFpbiwgcHJvY2Vzc29yc1JlY29yZCwgYnNmKTsKK30KKworaW50IEhhcHRpY0dlbmVyYXRvcl9Db25maWd1cmUoc3RydWN0IEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqY29uZmlnKSB7CisgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSB8fAorICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBjb25maWctPm91dHB1dENmZy5mb3JtYXQgfHwKKyAgICAgICAgY29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCB8fAorICAgICAgICBjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzIHx8CisgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgIT0gY29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmICgmY29udGV4dC0+Y29uZmlnICE9IGNvbmZpZykgeworICAgICAgICBjb250ZXh0LT5wcm9jZXNzaW5nQ2hhaW4uY2xlYXIoKTsKKyAgICAgICAgY29udGV4dC0+cHJvY2Vzc29yc1JlY29yZC5maWx0ZXJzLmNsZWFyKCk7CisgICAgICAgIGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQucmFtcHMuY2xlYXIoKTsKKyAgICAgICAgY29udGV4dC0+cHJvY2Vzc29yc1JlY29yZC5zbG93RW52cy5jbGVhcigpOworICAgICAgICBtZW1jcHkoJmNvbnRleHQtPmNvbmZpZywgY29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisgICAgICAgIGNvbnRleHQtPnBhcmFtLmF1ZGlvQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICgoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgICAgIGNvbnRleHQtPnBhcmFtLmhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgICAgICAoKGF1ZGlvX2NoYW5uZWxfbWFza190KSBjb25maWctPm91dHB1dENmZy5jaGFubmVscykgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgICAgICBBTE9HX0FTU0VSVChjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsQ291bnQgPD0gMiwKKyAgICAgICAgICAgICAgICAgICAgImhhcHRpYyBjaGFubmVsIGNvdW50KCV6dSkgaXMgdG9vIGxhcmdlIiwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgY29udGV4dC0+YXVkaW9EYXRhQnl0ZXNQZXJGcmFtZSA9IGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5hdWRpb0NoYW5uZWxDb3VudCwgKGF1ZGlvX2Zvcm1hdF90KSBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHVzZSB0aGUgZmlyc3QgYXVkaW8gY2hhbm5lbCB0byBnZW5lcmF0ZSBoYXB0aWMgY2hhbm5lbHMuCisgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsU291cmNlW2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEhhcHRpY0dlbmVyYXRvcl9idWlsZFByb2Nlc3NpbmdDaGFpbihjb250ZXh0LT5wcm9jZXNzaW5nQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5wcm9jZXNzb3JzUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsQ291bnQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IEhhcHRpY0dlbmVyYXRvcl9SZXNldChzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqY29udGV4dCkgeworICAgIGZvciAoYXV0byYgZmlsdGVyIDogY29udGV4dC0+cHJvY2Vzc29yc1JlY29yZC5maWx0ZXJzKSB7CisgICAgICAgIGZpbHRlci0+Y2xlYXIoKTsKKyAgICB9CisgICAgZm9yIChhdXRvJiBzbG93RW52IDogY29udGV4dC0+cHJvY2Vzc29yc1JlY29yZC5zbG93RW52cykgeworICAgICAgICBzbG93RW52LT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IEhhcHRpY0dlbmVyYXRvcl9TZXRQYXJhbWV0ZXIoc3RydWN0IEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbHVlKSB7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgSEdfUEFSQU1fSEFQVElDX0lOVEVOU0lUWTogeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbHB0ciB8fCBzaXplICE9ICh1aW50MzJfdCkgKDIgKiBzaXplb2YoaW50KSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGludCBpZCA9ICooaW50ICopIHZhbHVlOworICAgICAgICBvczo6SGFwdGljU2NhbGUgaGFwdGljSW50ZW5zaXR5ID0gc3RhdGljX2Nhc3Q8b3M6OkhhcHRpY1NjYWxlPigqKChpbnQgKikgdmFsdWUgKyAxKSk7CisgICAgICAgIGlmIChoYXB0aWNJbnRlbnNpdHkgPT0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFKSB7CisgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5pZDJJbnRlbnNpdHkuZXJhc2UoaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC0+cGFyYW0uaWQySW50ZW5zaXR5LmVtcGxhY2UoaWQsIGhhcHRpY0ludGVuc2l0eSk7CisgICAgICAgIH0KKyAgICAgICAgY29udGV4dC0+cGFyYW0ubWF4SGFwdGljSW50ZW5zaXR5ID0gaGFwdGljSW50ZW5zaXR5OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mW2lkLCBpbnRlbnNpdHldIDogY29udGV4dC0+cGFyYW0uaWQySW50ZW5zaXR5KSB7CisgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNJbnRlbnNpdHkgPSBzdGQ6Om1heCgKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cGFyYW0ubWF4SGFwdGljSW50ZW5zaXR5LCBpbnRlbnNpdHkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJVbmtub3duIHBhcmFtOiAlZCIsIHBhcmFtKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogXGJyaWVmIHJ1biB0aGUgcHJvY2Vzc2luZyBjaGFpbiB0byBnZW5lcmF0ZSBoYXB0aWMgZGF0YSBmcm9tIGF1ZGlvIGRhdGEKKyAqCisgKiBccGFyYW0gcHJvY2Vzc2luZ0NoYWluIHRoZSBwcm9jZXNzaW5nIGNoYWluIGZvciBnZW5lcmF0aW5nIGhhcHRpYyBkYXRhCisgKiBccGFyYW0gYnVmMSBhIGJ1ZmZlciBjb250YWlucyByYXcgYXVkaW8gZGF0YQorICogXHBhcmFtIGJ1ZjIgYSBidWZmZXIgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8ga2VlcCBhbGwgdGhlIGRhdGEKKyAqIFxwYXJhbSBmcmFtZUNvdW50IGZyYW1lIGNvdW50IG9mIHRoZSBkYXRhCisgKiBccmV0dXJuIGEgcG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcgorICovCitmbG9hdCogSGFwdGljR2VuZXJhdG9yX3J1blByb2Nlc3NpbmdDaGFpbigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKGZsb2F0KiwgY29uc3QgZmxvYXQqLCBzaXplX3QpPj4mIHByb2Nlc3NpbmdDaGFpbiwKKyAgICAgICAgZmxvYXQqIGJ1ZjEsIGZsb2F0KiBidWYyLCBzaXplX3QgZnJhbWVDb3VudCkgeworICAgIGZsb2F0ICppbiA9IGJ1ZjE7CisgICAgZmxvYXQgKm91dCA9IGJ1ZjI7CisgICAgZm9yIChjb25zdCBhdXRvIHByb2Nlc3NpbmdGdW5jIDogcHJvY2Vzc2luZ0NoYWluKSB7CisgICAgICAgIHByb2Nlc3NpbmdGdW5jKG91dCwgaW4sIGZyYW1lQ291bnQpOworICAgICAgICBzdGQ6OnN3YXAoaW4sIG91dCk7CisgICAgfQorICAgIHJldHVybiBpbjsKK30KKworfSAvLyBuYW1lc3BhY2UgKGFub255bW91cykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRWZmZWN0IEFQSSBJbXBsZW1lbnRhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKi0tLSBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyIHx8IHV1aWQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKHV1aWQsICZnSGdEZXNjcmlwdG9yLnV1aWQsIHNpemVvZigqdXVpZCkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqY29udGV4dCA9IG5ldyBIYXB0aWNHZW5lcmF0b3JDb250ZXh0OworICAgIEhhcHRpY0dlbmVyYXRvcl9Jbml0KGNvbnRleHQpOworCisgICAgKmhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpIGNvbnRleHQ7CisgICAgQUxPR1YoIiVzIGNvbnRleHQgaXMgJXAiLCBfX2Z1bmNfXywgY29udGV4dCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yTGliX1JlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQgPSAoSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqKSBoYW5kbGU7CisgICAgZGVsZXRlIGNvbnRleHQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yTGliX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgeworCisgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbHB0ciB8fCB1dWlkID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKHV1aWQsICZnSGdEZXNjcmlwdG9yLnV1aWQsIHNpemVvZigqdXVpZCkpID09IDApIHsKKyAgICAgICAgKmRlc2NyaXB0b3IgPSBnSGdEZXNjcmlwdG9yOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworLyotLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yX1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikgeworICAgIEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQgPSAoSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqKSBzZWxmOworCisgICAgaWYgKGluQnVmZmVyID09IG51bGxwdHIgfHwgaW5CdWZmZXItPnJhdyA9PSBudWxscHRyCisgICAgICAgICAgICB8fCBvdXRCdWZmZXIgPT0gbnVsbHB0ciB8fCBvdXRCdWZmZXItPnJhdyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFRoZSBhdWRpbyBkYXRhIG11c3Qgbm90IGJlIG1vZGlmaWVkIGJ1dCBqdXN0IHdyaXR0ZW4gdG8KKyAgICAvLyBvdXRwdXQgYnVmZmVyIGFjY29yZGluZyB0aGUgYWNjZXNzIG1vZGUuCisgICAgc2l6ZV90IGF1ZGlvQnl0ZXMgPSBjb250ZXh0LT5hdWRpb0RhdGFCeXRlc1BlckZyYW1lICogaW5CdWZmZXItPmZyYW1lQ291bnQ7CisgICAgc2l6ZV90IGF1ZGlvU2FtcGxlQ291bnQgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIGNvbnRleHQtPnBhcmFtLmF1ZGlvQ2hhbm5lbENvdW50OworICAgIGlmIChpbkJ1ZmZlci0+cmF3ICE9IG91dEJ1ZmZlci0+cmF3KSB7CisgICAgICAgIGlmIChjb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdWRpb1NhbXBsZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBhdWRpb0J5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb250ZXh0LT5zdGF0ZSAhPSBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgIEFMT0dFKCJTdGF0ZSglZCkgaXMgbm90IEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9BQ1RJVkUgd2hlbiBjYWxsaW5nICVzIiwKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5zdGF0ZSwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorCisgICAgaWYgKGNvbnRleHQtPnBhcmFtLm1heEhhcHRpY0ludGVuc2l0eSA9PSBvczo6SGFwdGljU2NhbGU6Ok1VVEUpIHsKKyAgICAgICAgLy8gSGFwdGljIGNoYW5uZWxzIGFyZSBtdXRlZCwgbm90IG5lZWQgdG8gZ2VuZXJhdGUgaGFwdGljIGRhdGEuCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFJlc2l6ZSBidWZmZXIgaWYgdGhlIGhhcHRpYyBzYW1wbGUgY291bnQgaXMgZ3JlYXRlciB0aGFuIGJ1ZmZlciBzaXplLgorICAgIHNpemVfdCBoYXB0aWNTYW1wbGVDb3VudCA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbENvdW50OworICAgIGlmIChoYXB0aWNTYW1wbGVDb3VudCA+IGNvbnRleHQtPmlucHV0QnVmZmVyLnNpemUoKSkgeworICAgICAgICAvLyBUaGUgY29udGV4dC0+aW5wdXRCdWZmZXIgYW5kIGNvbnRleHQtPm91dHB1dEJ1ZmZlciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSwKKyAgICAgICAgLy8gd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgaGFwdGljIHNhbXBsZSBjb3VudC4KKyAgICAgICAgY29udGV4dC0+aW5wdXRCdWZmZXIucmVzaXplKGhhcHRpY1NhbXBsZUNvdW50KTsKKyAgICAgICAgY29udGV4dC0+b3V0cHV0QnVmZmVyLnJlc2l6ZShoYXB0aWNTYW1wbGVDb3VudCk7CisgICAgfQorCisgICAgLy8gQ29uc3RydWN0IGlucHV0IGJ1ZmZlciBhY2NvcmRpbmcgdG8gaGFwdGljIGNoYW5uZWwgc291cmNlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbENvdW50OyArK2opIHsKKyAgICAgICAgICAgIGNvbnRleHQtPmlucHV0QnVmZmVyW2kgKiBjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsQ291bnQgKyBqXSA9CisgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5mMzJbaSAqIGNvbnRleHQtPnBhcmFtLmF1ZGlvQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsU291cmNlW2pdXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0KiBoYXB0aWNPdXRCdWZmZXIgPSBIYXB0aWNHZW5lcmF0b3JfcnVuUHJvY2Vzc2luZ0NoYWluKAorICAgICAgICAgICAgY29udGV4dC0+cHJvY2Vzc2luZ0NoYWluLCBjb250ZXh0LT5pbnB1dEJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICBjb250ZXh0LT5vdXRwdXRCdWZmZXIuZGF0YSgpLCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgb3M6OnNjYWxlSGFwdGljRGF0YShoYXB0aWNPdXRCdWZmZXIsIGhhcHRpY1NhbXBsZUNvdW50LCBjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNJbnRlbnNpdHkpOworCisgICAgLy8gRm9yIGhhcHRpYyBkYXRhLCB0aGUgaGFwdGljIHBsYXliYWNrIHRocmVhZCB3aWxsIGNvcHkgdGhlIGRhdGEgZnJvbSBlZmZlY3QgaW5wdXQgYnVmZmVyLAorICAgIC8vIHdoaWNoIGNvbnRhaW5zIGhhcHRpYyBkYXRhIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgZGlyZWN0bHkgdG8gc2luayBidWZmZXIuCisgICAgLy8gSW4gdGhhdCBjYXNlLCBjb3B5IGhhcHRpYyBkYXRhIHRvIGlucHV0IGJ1ZmZlciBpbnN0ZWFkIG9mIG91dHB1dCBidWZmZXIuCisgICAgLy8gTm90ZTogdGhpcyBtYXkgbm90IHdvcmsgd2l0aCBycGMvYmluZGVyIGNhbGxzCisgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChzdGF0aWNfY2FzdDxjaGFyKj4oaW5CdWZmZXItPnJhdykgKyBhdWRpb0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGNvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHRpY091dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXB0aWNTYW1wbGVDb3VudCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcmVwbHlEYXRhKSB7CisgICAgSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqY29udGV4dCA9IChIYXB0aWNHZW5lcmF0b3JDb250ZXh0ICopIHNlbGY7CisKKyAgICBpZiAoY29udGV4dCA9PSBudWxscHRyIHx8IGNvbnRleHQtPnN0YXRlID09IEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIEFMT0dWKCJIYXB0aWNHZW5lcmF0b3JfQ29tbWFuZCBjb21tYW5kICV1IGNtZFNpemUgJXUiLCBjbWRDb2RlLCBjbWRTaXplKTsKKworICAgIHN3aXRjaCAoY21kQ29kZSkgeworICAgICAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKKyAgICAgICAgICAgIGlmIChyZXBseURhdGEgPT0gbnVsbHB0ciB8fCByZXBseVNpemUgPT0gbnVsbHB0ciB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKSByZXBseURhdGEgPSBIYXB0aWNHZW5lcmF0b3JfSW5pdChjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHOgorICAgICAgICAgICAgaWYgKGNtZERhdGEgPT0gbnVsbHB0ciB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCisgICAgICAgICAgICAgICAgfHwgcmVwbHlEYXRhID09IG51bGxwdHIgfHwgcmVwbHlTaXplID09IG51bGxwdHIgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQgKikgcmVwbHlEYXRhID0gSGFwdGljR2VuZXJhdG9yX0NvbmZpZ3VyZSgKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgKGVmZmVjdF9jb25maWdfdCAqKSBjbWREYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKKyAgICAgICAgICAgIEhhcHRpY0dlbmVyYXRvcl9SZXNldChjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06CisgICAgICAgICAgICBBTE9HVigiSGFwdGljR2VuZXJhdG9yX0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gY21kRGF0YSAlcCwiCisgICAgICAgICAgICAgICAgICAiKnJlcGx5U2l6ZSAldSwgcmVwbHlEYXRhOiAlcCIsCisgICAgICAgICAgICAgICAgICBjbWREYXRhLCAqcmVwbHlTaXplLCByZXBseURhdGEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTogeworICAgICAgICAgICAgQUxPR1YoIkhhcHRpY0dlbmVyYXRvcl9Db21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgY21kRGF0YSAlcCwgIgorICAgICAgICAgICAgICAgICAgIipyZXBseVNpemUgJXUsIHJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICByZXBseVNpemUgPyAqcmVwbHlTaXplIDogMCwgcmVwbHlEYXRhKTsKKyAgICAgICAgICAgIGlmIChjbWREYXRhID09IG51bGxwdHIgfHwgKGNtZFNpemUgPCAoaW50KSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpCisgICAgICAgICAgICAgICAgfHwgcmVwbHlEYXRhID09IG51bGxwdHIgfHwgcmVwbHlTaXplID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IChpbnQpIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKmNtZCA9IChlZmZlY3RfcGFyYW1fdCAqKSBjbWREYXRhOworICAgICAgICAgICAgKihpbnQgKikgcmVwbHlEYXRhID0gSGFwdGljR2VuZXJhdG9yX1NldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgKihpbnQzMl90ICopIGNtZC0+ZGF0YSwgY21kLT52c2l6ZSwgY21kLT5kYXRhICsgc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKKyAgICAgICAgICAgIGlmIChyZXBseURhdGEgPT0gbnVsbHB0ciB8fCByZXBseVNpemUgPT0gbnVsbHB0ciB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udGV4dC0+c3RhdGUgIT0gSEFQVElDR0VORVJBVE9SX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZXh0LT5zdGF0ZSA9IEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9BQ1RJVkU7CisgICAgICAgICAgICBBTE9HVigiRUZGRUNUX0NNRF9FTkFCTEUoKSBPSyIpOworICAgICAgICAgICAgKihpbnQgKikgcmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9ESVNBQkxFOgorICAgICAgICAgICAgaWYgKHJlcGx5RGF0YSA9PSBudWxscHRyIHx8IHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb250ZXh0LT5zdGF0ZSAhPSBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZXh0LT5zdGF0ZSA9IEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIEFMT0dWKCJFRkZFQ1RfQ01EX0RJU0FCTEUoKSBPSyIpOworICAgICAgICAgICAgKihpbnQgKikgcmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfVk9MVU1FOgorICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJIYXB0aWNHZW5lcmF0b3JfQ29tbWFuZCBpbnZhbGlkIGNvbW1hbmQgJXUiLCBjbWRDb2RlKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQzMl90IEhhcHRpY0dlbmVyYXRvcl9HZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSB7CisgICAgSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqY29udGV4dCA9IChIYXB0aWNHZW5lcmF0b3JDb250ZXh0ICopIHNlbGY7CisKKyAgICBpZiAoY29udGV4dCA9PSBudWxscHRyIHx8CisgICAgICAgIGNvbnRleHQtPnN0YXRlID09IEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1lbWNweShkZXNjcmlwdG9yLCAmZ0hnRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKworICAgIHJldHVybiAwOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjphdWRpb19lZmZlY3Q6OmhhcHRpY19nZW5lcmF0b3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvRWZmZWN0SGFwdGljR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiNDMzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVEhBUFRJQ0dFTkVSQVRPUl9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVEhBUFRJQ0dFTkVSQVRPUl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPHZpYnJhdG9yL0V4dGVybmFsVmlicmF0aW9uVXRpbHMuaD4KKworI2luY2x1ZGUgIlByb2Nlc3NvcnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvX2VmZmVjdDo6aGFwdGljX2dlbmVyYXRvciB7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluaXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZW51bSBoYXB0aWNnZW5lcmF0b3Jfc3RhdGVfdCB7CisgICAgSEFQVElDR0VORVJBVE9SX1NUQVRFX1VOSU5JVElBTElaRUQsCisgICAgSEFQVElDR0VORVJBVE9SX1NUQVRFX0lOSVRJQUxJWkVELAorICAgIEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9BQ1RJVkUsCit9OworCisvLyBwYXJhbWV0ZXJzIGZvciBlYWNoIGhhcHRpYyBnZW5lcmF0b3IKK3N0cnVjdCBIYXB0aWNHZW5lcmF0b3JQYXJhbSB7CisgICAgdWludDMyX3QgaGFwdGljQ2hhbm5lbFNvdXJjZVsyXTsgLy8gVGhlIGF1ZGlvIGNoYW5uZWxzIHVzZWQgdG8gZ2VuZXJhdGUgaGFwdGljIGNoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBjaGFubmVsIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBIQVBUSUNfQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2Vjb25kIGNoYW5uZWwgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIEhBUFRJQ19CCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIHdpbGwgYmUgb2Zmc2V0IG9mIGF1ZGlvIGNoYW5uZWwKKyAgICB1aW50MzJfdCBhdWRpb0NoYW5uZWxDb3VudDsKKyAgICB1aW50MzJfdCBoYXB0aWNDaGFubmVsQ291bnQ7CisKKyAgICAvLyBBIG1hcCBmcm9tIHRyYWNrIGlkIHRvIGhhcHRpYyBpbnRlbnNpdHkuCisgICAgc3RkOjptYXA8aW50LCBvczo6SGFwdGljU2NhbGU+IGlkMkludGVuc2l0eTsKKyAgICBvczo6SGFwdGljU2NhbGUgbWF4SGFwdGljSW50ZW5zaXR5OyAvLyBtYXggaW50ZW5zaXR5IHdpbGwgYmUgdXNlZCB0byBzY2FsZSBoYXB0aWMgZGF0YS4KK307CisKKy8vIEEgc3RydWN0dXJlIHRvIGtlZXAgYWxsIHNoYXJlZCBwb2ludGVycyBmb3IgYWxsIHByb2Nlc3NvcnMgaW4gSGFwdGljR2VuZXJhdG9yLgorc3RydWN0IEhhcHRpY0dlbmVyYXRvclByb2Nlc3NvcnNSZWNvcmQgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+PiBmaWx0ZXJzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxSYW1wPj4gcmFtcHM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFNsb3dFbnZlbG9wZT4+IHNsb3dFbnZzOworfTsKKworLy8gQSBzdHJ1Y3R1cmUgdG8ga2VlcCBhbGwgdGhlIGNvbnRleHQgZm9yIEhhcHRpY0dlbmVyYXRvci4KK3N0cnVjdCBIYXB0aWNHZW5lcmF0b3JDb250ZXh0IHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgaGFwdGljZ2VuZXJhdG9yX3N0YXRlX3Qgc3RhdGU7CisgICAgc3RydWN0IEhhcHRpY0dlbmVyYXRvclBhcmFtIHBhcmFtOworICAgIHNpemVfdCBhdWRpb0RhdGFCeXRlc1BlckZyYW1lOworCisgICAgLy8gQSBjYWNoZSBmb3IgYWxsIHNoYXJlZCBwb2ludGVycyBvZiB0aGUgSGFwdGljR2VuZXJhdG9yCisgICAgc3RydWN0IEhhcHRpY0dlbmVyYXRvclByb2Nlc3NvcnNSZWNvcmQgcHJvY2Vzc29yc1JlY29yZDsKKworICAgIC8vIFVzaW5nIGEgdmVjdG9yIG9mIGZ1bmN0aW9ucyB0byByZWNvcmQgdGhlIHByb2Nlc3NpbmcgY2hhaW4gZm9yIGhhcHRpYy1nZW5lcmF0aW5nIGFsZ29yaXRobS4KKyAgICAvLyBUaGUgdGhyZWUgcGFyYW1ldGVycyBvZiB0aGUgcHJvY2Vzc2luZyBmdW5jdGlvbnMgYXJlIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciwgcG9pbnRlciB0bworICAgIC8vIGlucHV0IGJ1ZmZlciBhbmQgZnJhbWUgY291bnQuCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKGZsb2F0KiwgY29uc3QgZmxvYXQqLCBzaXplX3QpPj4gcHJvY2Vzc2luZ0NoYWluOworCisgICAgLy8gaW5wdXRCdWZmZXIgaXMgd2hlcmUgdG8ga2VlcCBpbnB1dCBidWZmZXIgZm9yIHRoZSBnZW5lcmF0aW5nIGFsZ29yaXRobS4gSXQgd2lsbCBiZQorICAgIC8vIGNvbnN0cnVjdGVkIGFjY29yZGluZyB0byBIYXB0aWNHZW5lcmF0b3JQYXJhbS5oYXB0aWNDaGFubmVsU291cmNlLgorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dEJ1ZmZlcjsKKworICAgIC8vIG91dHB1dEJ1ZmZlciBpcyBhIGJ1ZmZlciBoYXZpbmcgdGhlIHNhbWUgbGVuZ3RoIGFzIGlucHV0QnVmZmVyLiBJdCBjYW4gYmUgdXNlZCBhcworICAgIC8vIGludGVybWVkaWF0ZSBidWZmZXIgaW4gdGhlIGdlbmVyYXRpbmcgYWxnb3JpdGhtLgorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRwdXRCdWZmZXI7Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZmZlY3QgQVBJCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yTGliX0NyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKmhhbmRsZSk7CisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yTGliX1JlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSk7CisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yTGliX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yX1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcik7CisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yX0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlcGx5RGF0YSk7CisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yX0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjphdWRpb19lZmZlY3Q6OmhhcHRpY19nZW5lcmF0b3IKKworI2VuZGlmIC8vIEFORFJPSURfRUZGRUNUSEFQVElDR0VORVJBVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9Qcm9jZXNzb3JzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL1Byb2Nlc3NvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTdiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9Qcm9jZXNzb3JzLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SEdfUHJvY2Vzc29ycyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJQcm9jZXNzb3JzLmgiCisKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fQVJNX05FT05fXykKKyNpZm5kZWYgVVNFX05FT04KKyNkZWZpbmUgVVNFX05FT04gKHRydWUpCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFVTRV9ORU9OIChmYWxzZSkKKyNlbmRpZgorI2lmIFVTRV9ORU9OCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZDo6YXVkaW9fZWZmZWN0OjpoYXB0aWNfZ2VuZXJhdG9yIHsKKworZmxvYXQgZ2V0UmVhbFBvbGVaKGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwgZmxvYXQgc2FtcGxlUmF0ZSkgeworICAgIC8vIFRoaXMgd2lsbCBiZSBhIHBvbGUgb2YgYSBmaXJzdCBvcmRlciBmaWx0ZXIuCisgICAgZmxvYXQgcmVhbFBvbGVTID0gLTIgKiBNX1BJICogY29ybmVyRnJlcXVlbmN5OworICAgIHJldHVybiBleHAocmVhbFBvbGVTIC8gc2FtcGxlUmF0ZSk7IC8vIHplcm8tcG9sZSBtYXRjaGluZworfQorCitzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBnZXRDb21wbGV4UG9sZVooZmxvYXQgcmluZ2luZ0ZyZXF1ZW5jeSwgZmxvYXQgcSwgZmxvYXQgc2FtcGxlUmF0ZSkgeworICAgIC8vIFRoaXMgaXMgdGhlIHBvbGUgZm9yIDEvKHNeMiArIHMvcSArIDEpIGluIG5vcm1hbGl6ZWQgZnJlcXVlbmN5LiBUaGUgb3RoZXIgcG9sZSBpcworICAgIC8vIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiB0aGlzLgorICAgIGZsb2F0IHBvbGVJbWFnUyA9IDIgKiBNX1BJICogcmluZ2luZ0ZyZXF1ZW5jeTsKKyAgICBmbG9hdCBwb2xlUmVhbFMgPSAtcG9sZUltYWdTIC8gKDIgKiBxKTsKKyAgICBmbG9hdCBwb2xlUmFkaXVzID0gZXhwKHBvbGVSZWFsUyAvIHNhbXBsZVJhdGUpOworICAgIGZsb2F0IHBvbGVJbWFnWiA9IHBvbGVSYWRpdXMgKiBzaW4ocG9sZUltYWdTIC8gc2FtcGxlUmF0ZSk7CisgICAgZmxvYXQgcG9sZVJlYWxaID0gcG9sZVJhZGl1cyAqIGNvcyhwb2xlSW1hZ1MgLyBzYW1wbGVSYXRlKTsKKyAgICByZXR1cm4ge3BvbGVSZWFsWiwgcG9sZUltYWdafTsKK30KKworLy8gSW1wbGVtZW50YXRpb24gb2YgUmFtcAorCitSYW1wOjpSYW1wKHNpemVfdCBjaGFubmVsQ291bnQpIDogbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpIHt9CisKK3ZvaWQgUmFtcDo6cHJvY2VzcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgc2l6ZV90IGkgPSAwOworI2lmIFVTRV9ORU9OCisgICAgc2l6ZV90IHNhbXBsZUNvdW50ID0gZnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgZmxvYXQzMngyX3QgYWxsWmVybyA9IHZkdXBfbl9mMzIoMC4wZik7CisgICAgd2hpbGUgKGkgKyAxIDwgc2FtcGxlQ291bnQpIHsKKyAgICAgICAgdnN0MV9mMzIob3V0LCB2bWF4X2YzMih2bGQxX2YzMihpbiksIGFsbFplcm8pKTsKKyAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgb3V0ICs9IDI7CisgICAgICAgIGkgKz0gMjsKKyAgICB9CisjZW5kaWYgLy8gVVNFX05FT04KKyAgICBmb3IgKDsgaSA8IGZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OyArK2kpIHsKKyAgICAgICAgKm91dCA9ICppbiA+PSAwLjBmID8gKmluIDogMC4wZjsKKyAgICAgICAgb3V0Kys7CisgICAgICAgIGluKys7CisgICAgfQorfQorCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBTbG93RW52ZWxvcGUKKworU2xvd0VudmVsb3BlOjpTbG93RW52ZWxvcGUoCisgICAgICAgIGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgZmxvYXQgbm9ybWFsaXphdGlvblBvd2VyLAorICAgICAgICBzaXplX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IG1McGYoY3JlYXRlTFBGKGNvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KSksCisgICAgICAgICAgbU5vcm1hbGl6YXRpb25Qb3dlcihub3JtYWxpemF0aW9uUG93ZXIpLAorICAgICAgICAgIG1DaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSwKKyAgICAgICAgICBtRW52KDAuMjUgKiAoc2FtcGxlUmF0ZSAvICgyICogTV9QSSAqIGNvcm5lckZyZXF1ZW5jeSkpKSB7fQorCit2b2lkIFNsb3dFbnZlbG9wZTo6cHJvY2VzcyhmbG9hdCogb3V0LCBjb25zdCBmbG9hdCogaW4sIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgc2l6ZV90IHNhbXBsZUNvdW50ID0gZnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgaWYgKHNhbXBsZUNvdW50ID4gbUxwZkluQnVmZmVyLnNpemUoKSkgeworICAgICAgICBtTHBmSW5CdWZmZXIucmVzaXplKHNhbXBsZUNvdW50LCBtRW52KTsKKyAgICAgICAgbUxwZk91dEJ1ZmZlci5yZXNpemUoc2FtcGxlQ291bnQpOworICAgIH0KKyAgICBtTHBmLT5wcm9jZXNzKG1McGZPdXRCdWZmZXIuZGF0YSgpLCBtTHBmSW5CdWZmZXIuZGF0YSgpLCBmcmFtZUNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyArK2kpIHsKKyAgICAgICAgKm91dCA9ICppbiAqIHBvdyhtTHBmT3V0QnVmZmVyW2ldLCBtTm9ybWFsaXphdGlvblBvd2VyKTsKKyAgICAgICAgb3V0Kys7CisgICAgICAgIGluKys7CisgICAgfQorfQorCit2b2lkIFNsb3dFbnZlbG9wZTo6Y2xlYXIoKSB7CisgICAgbUxwZi0+Y2xlYXIoKTsKK30KKworLy8gSW1wbGVtZW50YXRpb24gb2YgaGVscGVyIGZ1bmN0aW9ucworCitCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY2FzY2FkZUZpcnN0T3JkZXJGaWx0ZXJzKGNvbnN0IEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyAmY29lZnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzICZjb2VmczIpIHsKKyAgICBhc3NlcnQoY29lZnMxWzJdID09IDAuMGYpOworICAgIGFzc2VydChjb2VmczJbMl0gPT0gMC4wZik7CisgICAgYXNzZXJ0KGNvZWZzMVs0XSA9PSAwLjBmKTsKKyAgICBhc3NlcnQoY29lZnMyWzRdID09IDAuMGYpOworICAgIHJldHVybiB7Y29lZnMxWzBdICogY29lZnMyWzBdLAorICAgICAgICAgICAgY29lZnMxWzBdICogY29lZnMyWzFdICsgY29lZnMxWzFdICogY29lZnMyWzBdLAorICAgICAgICAgICAgY29lZnMxWzFdICogY29lZnMyWzFdLAorICAgICAgICAgICAgY29lZnMxWzNdICsgY29lZnMyWzNdLAorICAgICAgICAgICAgY29lZnMxWzNdICogY29lZnMyWzNdfTsKK30KKworQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGxwZkNvZWZzKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSkgeworICAgIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBjb2VmZmljaWVudDsKKyAgICBmbG9hdCByZWFsUG9sZVogPSBnZXRSZWFsUG9sZVooY29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlKTsKKyAgICAvLyBUaGlzIGlzIGEgemVybyBhdCBueXF1aXN0CisgICAgY29lZmZpY2llbnRbMF0gPSAwLjVmICogKDEgLSByZWFsUG9sZVopOworICAgIGNvZWZmaWNpZW50WzFdID0gY29lZmZpY2llbnRbMF07CisgICAgY29lZmZpY2llbnRbMl0gPSAwLjBmOworICAgIGNvZWZmaWNpZW50WzNdID0gLXJlYWxQb2xlWjsgLy8gVGhpcyBpcyB0cmFkaXRpb25hbCAxLyhzKzEpIGZpbHRlcgorICAgIGNvZWZmaWNpZW50WzRdID0gMC4wZjsKKyAgICByZXR1cm4gY29lZmZpY2llbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGNyZWF0ZUxQRihjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50KSB7CisgICAgQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGNvZWZmaWNpZW50ID0gbHBmQ29lZnMoY29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIYXB0aWNCaXF1YWRGaWx0ZXI+KGNoYW5uZWxDb3VudCwgY29lZmZpY2llbnQpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVMUEYyKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCkgeworICAgIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBjb2VmZmljaWVudCA9IGxwZkNvZWZzKGNvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SGFwdGljQmlxdWFkRmlsdGVyPigKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgY2FzY2FkZUZpcnN0T3JkZXJGaWx0ZXJzKGNvZWZmaWNpZW50LCBjb2VmZmljaWVudCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVIUEYyKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCkgeworICAgIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBjb2VmZmljaWVudDsKKyAgICAvLyBOb3RlOiB0aGlzIGlzIHZhbGlkIG9ubHkgd2hlbiBjb3JuZXIgZnJlcXVlbmN5IGlzIGxlc3MgdGhhbiBueXF1aXN0IC8gMi4KKyAgICBmbG9hdCByZWFsUG9sZVogPSBnZXRSZWFsUG9sZVooY29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlKTsKKworICAgIC8vIE5vdGU6IHRoaXMgaXMgYSB6ZXJvIGF0IERDCisgICAgY29lZmZpY2llbnRbMF0gPSAwLjVmICogKDEgKyByZWFsUG9sZVopOworICAgIGNvZWZmaWNpZW50WzFdID0gLWNvZWZmaWNpZW50WzBdOworICAgIGNvZWZmaWNpZW50WzJdID0gMC4wZjsKKyAgICBjb2VmZmljaWVudFszXSA9IC1yZWFsUG9sZVo7CisgICAgY29lZmZpY2llbnRbNF0gPSAwLjBmOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEhhcHRpY0JpcXVhZEZpbHRlcj4oCisgICAgICAgICAgICBjaGFubmVsQ291bnQsIGNhc2NhZGVGaXJzdE9yZGVyRmlsdGVycyhjb2VmZmljaWVudCwgY29lZmZpY2llbnQpKTsKK30KKworQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGFwZkNvZWZzKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSkgeworICAgIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBjb2VmZmljaWVudDsKKyAgICBmbG9hdCByZWFsUG9sZVogPSBnZXRSZWFsUG9sZVooY29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlKTsKKyAgICBmbG9hdCB6ZXJvWiA9IDEuMGYgLyByZWFsUG9sZVo7CisgICAgY29lZmZpY2llbnRbMF0gPSAoMS4wZiAtIHJlYWxQb2xlWikgLyAoMS4wZiAtIHplcm9aKTsKKyAgICBjb2VmZmljaWVudFsxXSA9IC1jb2VmZmljaWVudFswXSAqIHplcm9aOworICAgIGNvZWZmaWNpZW50WzJdID0gMC4wZjsKKyAgICBjb2VmZmljaWVudFszXSA9IC1yZWFsUG9sZVo7CisgICAgY29lZmZpY2llbnRbNF0gPSAwLjBmOworICAgIHJldHVybiBjb2VmZmljaWVudDsKK30KKworc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gY3JlYXRlQVBGKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQpIHsKKyAgICBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY29lZmZpY2llbnQgPSBhcGZDb2Vmcyhjb3JuZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUpOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEhhcHRpY0JpcXVhZEZpbHRlcj4oY2hhbm5lbENvdW50LCBjb2VmZmljaWVudCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGNyZWF0ZUFQRjIoY29uc3QgZmxvYXQgY29ybmVyRnJlcXVlbmN5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgY29ybmVyRnJlcXVlbmN5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCkgeworICAgIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBjb2VmczEgPSBhcGZDb2Vmcyhjb3JuZXJGcmVxdWVuY3kxLCBzYW1wbGVSYXRlKTsKKyAgICBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY29lZnMyID0gYXBmQ29lZnMoY29ybmVyRnJlcXVlbmN5Miwgc2FtcGxlUmF0ZSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SGFwdGljQmlxdWFkRmlsdGVyPigKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgY2FzY2FkZUZpcnN0T3JkZXJGaWx0ZXJzKGNvZWZzMSwgY29lZnMyKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGNyZWF0ZUJQRihjb25zdCBmbG9hdCByaW5naW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50KSB7CisgICAgQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGNvZWZmaWNpZW50OworICAgIGNvbnN0IGF1dG8gW3JlYWwsIGltZ10gPSBnZXRDb21wbGV4UG9sZVoocmluZ2luZ0ZyZXF1ZW5jeSwgcSwgc2FtcGxlUmF0ZSk7CisgICAgLy8gTm90ZTogdGhpcyBpcyBub3QgYSBzdGFuZGFyZCBjb29rYm9vayBCUEYsIGJ1dCBhIGxvdyBwYXNzIGZpbHRlciB3aXRoIHplcm8gYXQgREMKKyAgICBjb2VmZmljaWVudFswXSA9IDEuMGY7CisgICAgY29lZmZpY2llbnRbMV0gPSAtMS4wZjsKKyAgICBjb2VmZmljaWVudFsyXSA9IDAuMGY7CisgICAgY29lZmZpY2llbnRbM10gPSAtMiAqIHJlYWw7CisgICAgY29lZmZpY2llbnRbNF0gPSByZWFsICogcmVhbCArIGltZyAqIGltZzsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIYXB0aWNCaXF1YWRGaWx0ZXI+KGNoYW5uZWxDb3VudCwgY29lZmZpY2llbnQpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVCU0YoY29uc3QgZmxvYXQgcmluZ2luZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB6cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBwcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQpIHsKKyAgICBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY29lZmZpY2llbnQ7CisgICAgY29uc3QgYXV0byBbemVyb1JlYWwsIHplcm9JbWddID0gZ2V0Q29tcGxleFBvbGVaKHJpbmdpbmdGcmVxdWVuY3ksIHpxLCBzYW1wbGVSYXRlKTsKKyAgICBmbG9hdCB6ZXJvQ29lZmYxID0gLTIgKiB6ZXJvUmVhbDsKKyAgICBmbG9hdCB6ZXJvQ29lZmYyID0gemVyb1JlYWwqIHplcm9SZWFsICsgemVyb0ltZyAqIHplcm9JbWc7CisgICAgY29uc3QgYXV0byBbcG9sZVJlYWwsIHBvbGVJbWddID0gZ2V0Q29tcGxleFBvbGVaKHJpbmdpbmdGcmVxdWVuY3ksIHBxLCBzYW1wbGVSYXRlKTsKKyAgICBmbG9hdCBwb2xlQ29lZmYxID0gLTIgKiBwb2xlUmVhbDsKKyAgICBmbG9hdCBwb2xlQ29lZmYyID0gcG9sZVJlYWwgKiBwb2xlUmVhbCArIHBvbGVJbWcgKiBwb2xlSW1nOworICAgIGNvbnN0IGZsb2F0IG5vcm0gPSAoMS4wZiArIHBvbGVDb2VmZjEgKyBwb2xlQ29lZmYyKSAvICgxLjBmICsgemVyb0NvZWZmMSArIHplcm9Db2VmZjIpOworICAgIGNvZWZmaWNpZW50WzBdID0gMS4wZiAqIG5vcm07CisgICAgY29lZmZpY2llbnRbMV0gPSB6ZXJvQ29lZmYxICogbm9ybTsKKyAgICBjb2VmZmljaWVudFsyXSA9IHplcm9Db2VmZjIgKiBub3JtOworICAgIGNvZWZmaWNpZW50WzNdID0gcG9sZUNvZWZmMTsKKyAgICBjb2VmZmljaWVudFs0XSA9IHBvbGVDb2VmZjI7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SGFwdGljQmlxdWFkRmlsdGVyPihjaGFubmVsQ291bnQsIGNvZWZmaWNpZW50KTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6YXVkaW9fZWZmZWN0OjpoYXB0aWNfZ2VuZXJhdG9yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9Qcm9jZXNzb3JzLmggYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9Qcm9jZXNzb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmMDU1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL1Byb2Nlc3NvcnMuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0VGRkVDVF9IQVBUSUNfR0VORVJBVE9SX1BST0NFU1NPUlNfSF8KKyNkZWZpbmUgX0VGRkVDVF9IQVBUSUNfR0VORVJBVE9SX1BST0NFU1NPUlNfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0JpcXVhZEZpbHRlci5oPgorCit1c2luZyBIYXB0aWNCaXF1YWRGaWx0ZXIgPSBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPGZsb2F0PjsKK3VzaW5nIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyA9IHN0ZDo6YXJyYXk8ZmxvYXQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+OworCituYW1lc3BhY2UgYW5kcm9pZDo6YXVkaW9fZWZmZWN0OjpoYXB0aWNfZ2VuZXJhdG9yIHsKKworLy8gQSBjbGFzcyBwcm92aWRpbmcgYSBwcm9jZXNzIGZ1bmN0aW9uIHRoYXQgbWFrZXMgaW5wdXQgZGF0YSBub24tbmVnYXRpdmUuCitjbGFzcyBSYW1wIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBSYW1wKHNpemVfdCBjaGFubmVsQ291bnQpOworCisgICAgdm9pZCBwcm9jZXNzKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgc2l6ZV90IGZyYW1lQ291bnQpOworCitwcml2YXRlOgorICAgIGNvbnN0IHNpemVfdCBtQ2hhbm5lbENvdW50OworfTsKKworCitjbGFzcyBTbG93RW52ZWxvcGUgeworcHVibGljOgorICAgIFNsb3dFbnZlbG9wZShmbG9hdCBjb3JuZXJGcmVxdWVuY3ksIGZsb2F0IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6YXRpb25Qb3dlciwgc2l6ZV90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLCBzaXplX3QgZnJhbWVDb3VudCk7CisKKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gbUxwZjsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbUxwZkluQnVmZmVyOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtTHBmT3V0QnVmZmVyOworICAgIGNvbnN0IGZsb2F0IG1Ob3JtYWxpemF0aW9uUG93ZXI7CisgICAgY29uc3QgZmxvYXQgbUNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBmbG9hdCBtRW52OworfTsKKworLy8gSGVscGVyIGZ1bmN0aW9ucworCitCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY2FzY2FkZUZpcnN0T3JkZXJGaWx0ZXJzKGNvbnN0IEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyAmY29lZnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgJmNvZWZzMik7CisKK3N0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGNyZWF0ZUxQRihjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50KTsKKworLy8gQ3JlYXRlIHR3byBjYXNjYWRlZCBMUEYgd2l0aCBzYW1lIGNvcm5lciBmcmVxdWVuY3kuCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVMUEYyKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCk7CisKKy8vIENyZWF0ZSB0d28gY2FzY2FkZWQgSFBGIHdpdGggc2FtZSBjb3JuZXIgZnJlcXVlbmN5Lgorc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gY3JlYXRlSFBGMihjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQpOworCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVBUEYoY29uc3QgZmxvYXQgY29ybmVyRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCk7CisKKy8vIENyZWF0ZSB0d28gY2FzY2FkZWQgQVBGIHdpdGggdHdvIGRpZmZlcmVudCBjb3JuZXIgZnJlcXVlbmN5Lgorc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gY3JlYXRlQVBGMihjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3kyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50KTsKKworc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gY3JlYXRlQlBGKGNvbnN0IGZsb2F0IHJpbmdpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQpOworCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVCU0YoY29uc3QgZmxvYXQgcmluZ2luZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB6cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBwcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjphdWRpb19lZmZlY3Q6OmhhcHRpY19nZW5lcmF0b3IKKworI2VuZGlmIC8vIF9FRkZFQ1RfSEFQVElDX0dFTkVSQVRPUl9QUk9DRVNTT1JTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS8uY2xhbmctZm9ybWF0IGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRiMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDE1IEBACitCYXNlZE9uU3R5bGU6IEdvb2dsZQorU3RhbmRhcmQ6IENwcDExCitBY2Nlc3NNb2RpZmllck9mZnNldDogLTIKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0NvbHVtbkxpbWl0OiAxMDAKK0NvbW1lbnRQcmFnbWFzOiBOT0xJTlQ6LioKK0Rlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCitJbmNsdWRlQmxvY2tzOiBQcmVzZXJ2ZQorSW5kZW50V2lkdGg6IDQKK0NvbnRpbnVhdGlvbkluZGVudFdpZHRoOiA4CitQb2ludGVyQWxpZ25tZW50OiBMZWZ0CitUYWJXaWR0aDogNAorVXNlVGFiOiBOZXZlcgorIyBGb2xsb3dpbmcgYXJlIHNwZWNpZmljIHRvIGxpYmVmZmVjdHMvbHZtCitTb3J0SW5jbHVkZXM6IGZhbHNlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwZTE3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvQW5kcm9pZC5icApAQCAtMCwwICsxLDE2IEBACitjY19iZW5jaG1hcmsgeworICAgIG5hbWU6ICJsdm1fYmVuY2htYXJrIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWyJsdm1fYmVuY2htYXJrLmNwcCJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJidW5kbGV3cmFwcGVyIiwKKyAgICAgICAgImxpYm11c2ljYnVuZGxlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvbHZtX2JlbmNobWFyay5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL2x2bV9iZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWRhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL2x2bV9iZW5jaG1hcmsuY3BwCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07Citjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBrRWZmZWN0VXVpZHNbXSA9IHsKKyAgICAgICAgLy8gTlhQIFNXIEJhc3NCb29zdAorICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgLy8gTlhQIFNXIFZpcnR1YWxpemVyCisgICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgRXF1YWxpemVyCisgICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgVm9sdW1lCisgICAgICAgIHsweDExOTM0MWEwLCAweDg0NjksIDB4MTFkZiwgMHg4MWY5LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtRWZmZWN0VXVpZHMgPSBzdGQ6OnNpemUoa0VmZmVjdFV1aWRzKTsKKworY29uc3RleHByIHNpemVfdCBrRnJhbWVDb3VudCA9IDIwNDg7CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ2hNYXNrc1tdID0geworICAgICAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLCAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELCAgICBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLCBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxLAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtQ2hNYXNrcyA9IHN0ZDo6c2l6ZShrQ2hNYXNrcyk7Citjb25zdGV4cHIgaW50IGtTYW1wbGVSYXRlID0gNDQxMDA7CisvLyBUT0RPKGIvMTMxMjQwOTQwKSBSZW1vdmUgb25jZSBlZmZlY3RzIGFyZSB1cGRhdGVkIHRvIHByb2R1Y2UgbW9ubyBvdXRwdXQKK2NvbnN0ZXhwciBzaXplX3Qga01pbk91dHB1dENoYW5uZWxDb3VudCA9IDI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBIHRlc3QgcmVzdWx0IHJ1bm5pbmcgb24gUGl4ZWwgMyBmb3IgY29tcGFyaXNvbi4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMuCisgKiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGVmZmVjdC4KKyAqIDA6IEJhc3MgQm9vc3QsIDE6IFZpcnR1YWxpemVyLCAyOiBFcXVhbGl6ZXIsIDM6IFZvbHVtZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJlbmNobWFyayAgICAgICAgICAgVGltZSAgICAgICAgICAgICBDUFUgICBJdGVyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQk1fTFZNLzIvMCAgICAgMTMxMjc5IG5zICAgICAgIDEzMDg1NSBucyAgICAgICAgIDUxOTUKKyAqIEJNX0xWTS8yLzEgICAgIDE4NDgxNCBucyAgICAgICAxODQyMTkgbnMgICAgICAgICAzNzk5CisgKiBCTV9MVk0vMi8yICAgICAgOTE5MzUgbnMgICAgICAgIDkxNjQ5IG5zICAgICAgICAgNzY0NworICogQk1fTFZNLzIvMyAgICAgIDI2NzA3IG5zICAgICAgICAyNjYyMyBucyAgICAgICAgMjYyODEKKyAqIEJNX0xWTS8zLzAgICAgIDE3MjEzMCBucyAgICAgICAxNzE1NjIgbnMgICAgICAgICA0MDg1CisgKiBCTV9MVk0vMy8xICAgICAxOTI0NDMgbnMgICAgICAgMTkxOTIzIG5zICAgICAgICAgMzY0NAorICogQk1fTFZNLzMvMiAgICAgMTI3NDQ0IG5zICAgICAgIDEyNzEwNyBucyAgICAgICAgIDU0ODMKKyAqIEJNX0xWTS8zLzMgICAgICAyNjgxMSBucyAgICAgICAgMjY3MzAgbnMgICAgICAgIDI2MTYzCisgKiBCTV9MVk0vNC8wICAgICAyMjM2ODggbnMgICAgICAgMjIzMDc2IG5zICAgICAgICAgMzEzMworICogQk1fTFZNLzQvMSAgICAgMjA0OTYxIG5zICAgICAgIDIwNDQwOCBucyAgICAgICAgIDM0MjUKKyAqIEJNX0xWTS80LzIgICAgIDE2OTE2MiBucyAgICAgICAxNjg3MDggbnMgICAgICAgICA0MTQzCisgKiBCTV9MVk0vNC8zICAgICAgMzczMzAgbnMgICAgICAgIDM3MjI1IG5zICAgICAgICAxODc5NQorICogQk1fTFZNLzUvMCAgICAgMjcyNjI4IG5zICAgICAgIDI3MTY2OCBucyAgICAgICAgIDI1NjgKKyAqIEJNX0xWTS81LzEgICAgIDIxODQ4NyBucyAgICAgICAyMTc4ODMgbnMgICAgICAgICAzMjEyCisgKiBCTV9MVk0vNS8yICAgICAyMTEwNDkgbnMgICAgICAgMjEwNDc5IG5zICAgICAgICAgMzMyNAorICogQk1fTFZNLzUvMyAgICAgIDQ2OTYyIG5zICAgICAgICA0NjgzNSBucyAgICAgICAgMTUwNTEKKyAqIEJNX0xWTS82LzAgICAgIDMxODg4MSBucyAgICAgICAzMTc3MzQgbnMgICAgICAgICAyMjE2CisgKiBCTV9MVk0vNi8xICAgICAyMzE4OTkgbnMgICAgICAgMjMxMjQ0IG5zICAgICAgICAgMzAyOAorICogQk1fTFZNLzYvMiAgICAgMjUyNjU1IG5zICAgICAgIDI1MTk2MyBucyAgICAgICAgIDI3NzEKKyAqIEJNX0xWTS82LzMgICAgICA1NDk0NCBucyAgICAgICAgNTQ3OTQgbnMgICAgICAgIDEyNzk5CisgKiBCTV9MVk0vNy8wICAgICAzNjY2MjIgbnMgICAgICAgMzY1MjYyIG5zICAgICAgICAgMTkxNgorICogQk1fTFZNLzcvMSAgICAgMjQ1MDc2IG5zICAgICAgIDI0NDM4OCBucyAgICAgICAgIDI4NjYKKyAqIEJNX0xWTS83LzIgICAgIDI5NTEwNSBucyAgICAgICAyOTQzMDQgbnMgICAgICAgICAyMzc5CisgKiBCTV9MVk0vNy8zICAgICAgNjM1OTUgbnMgICAgICAgIDYzNDIwIG5zICAgICAgICAxMTA3MAorICogQk1fTFZNLzgvMCAgICAgNDEwOTU3IG5zICAgICAgIDQwOTM4NyBucyAgICAgICAgIDE3MDYKKyAqIEJNX0xWTS84LzEgICAgIDI1NzgyNCBucyAgICAgICAyNTcwOTggbnMgICAgICAgICAyNzIzCisgKiBCTV9MVk0vOC8yICAgICAzNDI1NDYgbnMgICAgICAgMzQxNTMwIG5zICAgICAgICAgMjA1OQorICogQk1fTFZNLzgvMyAgICAgIDcyODk2IG5zICAgICAgICA3MjcwMCBucyAgICAgICAgIDk2ODUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBCTV9MVk0oYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBjb25zdCBzaXplX3QgY2hNYXNrID0ga0NoTWFza3Nbc3RhdGUucmFuZ2UoMCkgLSAxXTsKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90IHV1aWQgPSBrRWZmZWN0VXVpZHNbc3RhdGUucmFuZ2UoMSldOworICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hNYXNrKTsKKworICAgIC8vIEluaXRpYWxpemUgaW5wdXQgYnVmZmVyIHdpdGggZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIHZhbHVlcworICAgIHN0ZDo6bWluc3RkX3JhbmQgZ2VuKGNoTWFzayk7CisgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPD4gZGlzKC0xLjBmLCAxLjBmKTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gaW5wdXQoa0ZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQpOworICAgIGZvciAoYXV0byYgaW4gOiBpbnB1dCkgeworICAgICAgICBpbiA9IGRpcyhnZW4pOworICAgIH0KKworICAgIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUgPSBudWxscHRyOworICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdCgmdXVpZCwgMSwgMSwgJmVmZmVjdEhhbmRsZSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlne307CisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0ga1NhbXBsZVJhdGU7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IGNoTWFzazsKKyAgICBjb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIGlmIChpbnQgc3RhdHVzID0gKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJRywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY29tbWFuZCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGludCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBSdW4gdGhlIHRlc3QKKyAgICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRwdXQoa0ZyYW1lQ291bnQgKiBzdGQ6Om1heChjaGFubmVsQ291bnQsIGtNaW5PdXRwdXRDaGFubmVsQ291bnQpKTsKKworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoaW5wdXQuZGF0YSgpKTsKKyAgICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKG91dHB1dC5kYXRhKCkpOworCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGluQnVmZmVyID0gey5mcmFtZUNvdW50ID0ga0ZyYW1lQ291bnQsIC5mMzIgPSBpbnB1dC5kYXRhKCl9OworICAgICAgICBhdWRpb19idWZmZXJfdCBvdXRCdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBrRnJhbWVDb3VudCwgLmYzMiA9IG91dHB1dC5kYXRhKCl9OworICAgICAgICAoKmVmZmVjdEhhbmRsZSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlLCAmaW5CdWZmZXIsICZvdXRCdWZmZXIpOworCisgICAgICAgIGJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpOworICAgIH0KKworICAgIHN0YXRlLlNldENvbXBsZXhpdHlOKHN0YXRlLnJhbmdlKDApKTsKKworICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2VfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIExWTUFyZ3MoYmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrKiBiKSB7CisgICAgLy8gVE9ETyhiLzEzMTI0MDk0MCkgVGVzdCBzaW5nbGUgY2hhbm5lbCBvbmNlIGVmZmVjdHMgYXJlIHVwZGF0ZWQgdG8gcHJvY2VzcyBtb25vIGRhdGEKKyAgICBmb3IgKGludCBpID0gMjsgaSA8PSBrTnVtQ2hNYXNrczsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga051bUVmZmVjdFV1aWRzOyArK2opIHsKKyAgICAgICAgICAgIGItPkFyZ3Moe2ksIGp9KTsKKyAgICAgICAgfQorICAgIH0KK30KKworQkVOQ0hNQVJLKEJNX0xWTSktPkFwcGx5KExWTUFyZ3MpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAppbmRleCAxZjJhNWUxLi44ZjJmMDE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icApAQCAtMzAsNyArMzAsNiBAQAogICAgICAgICAiQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAiLAotICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcCIsCiAgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcCIsCiAgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwIiwKQEAgLTEzMywxMSArMTMyLDEwIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKICAgICBdLAogICAgIGNwcGZsYWdzOiBbCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKLSAgICAgICAgIi1EU1VQUE9SVF9NQyIsCiAKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAppbmRleCA5NDhkNzljLi5lNjBhZDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApAQCAtNjksMTUgKzY5LDEyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgdGFibGUqLwotI2RlZmluZSBMVkRCRV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KLQogLyogQmFzcyBFbmhhbmNlbWVudCBlZmZlY3QgbGV2ZWwgKi8KLSNkZWZpbmUgTFZEQkVfRUZGRUNUXzAzREIgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRWZmZWN0IGRlZmluZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIExWREJFX0VGRkVDVF8wNkRCICAgICAgICAgICAgNgotI2RlZmluZSBMVkRCRV9FRkZFQ1RfMDlEQiAgICAgICAgICAgIDkKLSNkZWZpbmUgTFZEQkVfRUZGRUNUXzEyREIgICAgICAgICAgICAxMgotI2RlZmluZSBMVkRCRV9FRkZFQ1RfMTVEQiAgICAgICAgICAgIDE1CisjZGVmaW5lIExWREJFX0VGRkVDVF8wM0RCIDMgLyogRWZmZWN0IGRlZmluZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIExWREJFX0VGRkVDVF8wNkRCIDYKKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzA5REIgOQorI2RlZmluZSBMVkRCRV9FRkZFQ1RfMTJEQiAxMgorI2RlZmluZSBMVkRCRV9FRkZFQ1RfMTVEQiAxNQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODYsNTIgKzgzLDMxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogSW5zdGFuY2UgaGFuZGxlICovCi10eXBlZGVmIHZvaWQgICAgKkxWREJFX0hhbmRsZV90OwordHlwZWRlZiB2b2lkKiBMVkRCRV9IYW5kbGVfdDsKIAogLyogT3BlcmF0aW5nIG1vZGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkRCRV9PRkYgICAgICA9IDAsCi0gICAgTFZEQkVfT04gICAgICAgPSAxLAotICAgIExWREJFX01PREVfTUFYID0gTFZNX01BWElOVF8zMgotfSBMVkRCRV9Nb2RlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZEQkVfT0ZGID0gMCwgTFZEQkVfT04gPSAxLCBMVkRCRV9NT0RFX01BWCA9IExWTV9NQVhJTlRfMzIgfSBMVkRCRV9Nb2RlX2VuOwogCiAvKiBIaWdoIHBhc3MgZmlsdGVyICovCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgICAgTFZEQkVfSFBGX09GRiA9IDAsCi0gICAgTFZEQkVfSFBGX09OICA9IDEsCisgICAgTFZEQkVfSFBGX09OID0gMSwKICAgICBMVkRCRV9IUEZfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9GaWx0ZXJTZWxlY3RfZW47CiAKIC8qIFZvbHVtZSBjb250cm9sICovCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgICAgTFZEQkVfVk9MVU1FX09GRiA9IDAsCi0gICAgTFZEQkVfVk9MVU1FX09OICA9IDEsCisgICAgTFZEQkVfVk9MVU1FX09OID0gMSwKICAgICBMVkRCRV9WT0xVTUVfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9Wb2x1bWVfZW47CiAKLS8qIE1lbW9yeSBUeXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZEQkVfUEVSU0lTVEVOVCAgICAgID0gMCwKLSAgICBMVkRCRV9QRVJTSVNURU5UX0RBVEEgPSAxLAotICAgIExWREJFX1BFUlNJU1RFTlRfQ09FRiA9IDIsCi0gICAgTFZEQkVfU0NSQVRDSCAgICAgICAgID0gMywKLSAgICBMVkRCRV9NRU1PUllfTUFYICAgICAgPSBMVk1fTUFYSU5UXzMyCi0KLX0gTFZEQkVfTWVtb3J5VHlwZXNfZW47Ci0KIC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWREJFX1NVQ0NFU1MgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLwotICAgIExWREJFX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCi0gICAgTFZEQkVfTlVMTEFERFJFU1MgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCi0gICAgTFZEQkVfVE9PTUFOWVNBTVBMRVMgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLwotICAgIExWREJFX1NJWkVFUlJPUiAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvcnJlY3Qgc3RydWN0dXJlIHNpemUgKi8KLSAgICBMVkRCRV9TVEFUVVNfTUFYICAgICA9IExWTV9NQVhJTlRfMzIKK3R5cGVkZWYgZW51bSB7CisgICAgTFZEQkVfU1VDQ0VTUyA9IDAsICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLworICAgIExWREJFX05VTExBRERSRVNTID0gMSwgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyA9IDIsIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLworICAgIExWREJFX1NUQVRVU19NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX1JldHVyblN0YXR1c19lbjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNTgsNDAgKzEzNCwzOCBAQAogLyoKICAqIEJhc3MgRW5oYW5jZW1lbnQgY2VudHJlIGZyZXF1ZW5jeQogICovCi0jZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNTVIeiAgICAgICAxCi0jZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNjZIeiAgICAgICAyCi0jZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNzhIeiAgICAgICA0Ci0jZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfOTBIeiAgICAgICA4CisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNTVIeiAxCisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNjZIeiAyCisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNzhIeiA0CisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfOTBIeiA4CiAKLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgICBMVkRCRV9DRU5UUkVfNTVIWiA9IDAsCiAgICAgTFZEQkVfQ0VOVFJFXzY2SFogPSAxLAogICAgIExWREJFX0NFTlRSRV83OEhaID0gMiwKICAgICBMVkRCRV9DRU5UUkVfOTBIWiA9IDMsCi0gICAgTFZEQkVfQ0VOVFJFX01BWCAgPSBMVk1fTUFYSU5UXzMyCisgICAgTFZEQkVfQ0VOVFJFX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfQ2VudHJlRnJlcV9lbjsKIAogLyoKICAqIFN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgaW4gc2FtcGxlcyBwZXIgc2Vjb25kCiAgKi8KLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzgwMDAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBMVkRCRV9DQVBfRlNfMTEwMjUgICAgICAgICAgICAgICAyCi0jZGVmaW5lIExWREJFX0NBUF9GU18xMjAwMCAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE2MDAwICAgICAgICAgICAgICAgOAotI2RlZmluZSBMVkRCRV9DQVBfRlNfMjIwNTAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBMVkRCRV9DQVBfRlNfMjQwMDAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBMVkRCRV9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBMVkRCRV9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAxMjgKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIExWREJFX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkRCRV9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAxMDI0Ci0jZGVmaW5lIExWREJFX0NBUF9GU18xNzY0MDAgICAgICAgICAgICAgIDIwNDgKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgNDA5NgorI2RlZmluZSBMVkRCRV9DQVBfRlNfODAwMCAxCisjZGVmaW5lIExWREJFX0NBUF9GU18xMTAyNSAyCisjZGVmaW5lIExWREJFX0NBUF9GU18xMjAwMCA0CisjZGVmaW5lIExWREJFX0NBUF9GU18xNjAwMCA4CisjZGVmaW5lIExWREJFX0NBUF9GU18yMjA1MCAxNgorI2RlZmluZSBMVkRCRV9DQVBfRlNfMjQwMDAgMzIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzMyMDAwIDY0CisjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAxMjgKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ4MDAwIDI1NgorI2RlZmluZSBMVkRCRV9DQVBfRlNfODgyMDAgNTEyCisjZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAxMDI0CisjZGVmaW5lIExWREJFX0NBUF9GU18xNzY0MDAgMjA0OAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwIDQwOTYKIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZEQkVfRlNfODAwMCAgPSAwLAordHlwZWRlZiBlbnVtIHsKKyAgICBMVkRCRV9GU184MDAwID0gMCwKICAgICBMVkRCRV9GU18xMTAyNSA9IDEsCiAgICAgTFZEQkVfRlNfMTIwMDAgPSAyLAogICAgIExWREJFX0ZTXzE2MDAwID0gMywKQEAgLTIwNCw3ICsxNzgsNyBAQAogICAgIExWREJFX0ZTXzk2MDAwID0gMTAsCiAgICAgTFZEQkVfRlNfMTc2NDAwID0gMTEsCiAgICAgTFZEQkVfRlNfMTkyMDAwID0gMTIsCi0gICAgTFZEQkVfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCisgICAgTFZEQkVfRlNfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9Gc19lbjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMTMsNDQgKzE4NywyNSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgQWxpZ25tZW50OyAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBhbGlnbm1lbnQgaW4gYnl0ZXMgKi8KLSAgICBMVkRCRV9NZW1vcnlUeXBlc19lbiAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZEQkVfTWVtb3J5UmVnaW9uX3Q7Ci0KLS8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZEQkVfTWVtb3J5UmVnaW9uX3QgICAgUmVnaW9uW0xWREJFX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVkRCRV9NZW1UYWJfdDsKLQogLyogUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVkRCRV9Nb2RlX2VuICAgICAgICAgICBPcGVyYXRpbmdNb2RlOwotICAgIExWREJFX0ZzX2VuICAgICAgICAgICAgIFNhbXBsZVJhdGU7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWw7Ci0gICAgTFZEQkVfQ2VudHJlRnJlcV9lbiAgICAgQ2VudHJlRnJlcXVlbmN5OwotICAgIExWREJFX0ZpbHRlclNlbGVjdF9lbiAgIEhQRlNlbGVjdDsKLSAgICBMVkRCRV9Wb2x1bWVfZW4gICAgICAgICBWb2x1bWVDb250cm9sOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZvbHVtZWRCOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEhlYWRyb29tZEI7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7Ci0jZW5kaWYKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVkRCRV9Nb2RlX2VuIE9wZXJhdGluZ01vZGU7CisgICAgTFZEQkVfRnNfZW4gU2FtcGxlUmF0ZTsKKyAgICBMVk1fSU5UMTYgRWZmZWN0TGV2ZWw7CisgICAgTFZEQkVfQ2VudHJlRnJlcV9lbiBDZW50cmVGcmVxdWVuY3k7CisgICAgTFZEQkVfRmlsdGVyU2VsZWN0X2VuIEhQRlNlbGVjdDsKKyAgICBMVkRCRV9Wb2x1bWVfZW4gVm9sdW1lQ29udHJvbDsKKyAgICBMVk1fSU5UMTYgVm9sdW1lZEI7CisgICAgTFZNX0lOVDE2IEhlYWRyb29tZEI7CisgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHM7CiAKIH0gTFZEQkVfUGFyYW1zX3Q7CiAKIC8qIENhcGFiaWxpdHkgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlIGNhcGFiaWxpdGllcyAqLwotICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgQ2VudHJlRnJlcXVlbmN5OyAgICAgICAgICAvKiBDZW50cmUgZnJlcXVlbmN5IGNhcGFiaWxpdGllcyAqLwotICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOyAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgaW4gc2FtcGxlIHBhaXJzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX1VJTlQxNiBTYW1wbGVSYXRlOyAgICAgIC8qIFNhbXBsaW5nIHJhdGUgY2FwYWJpbGl0aWVzICovCisgICAgTFZNX1VJTlQxNiBDZW50cmVGcmVxdWVuY3k7IC8qIENlbnRyZSBmcmVxdWVuY3kgY2FwYWJpbGl0aWVzICovCisgICAgTFZNX1VJTlQxNiBNYXhCbG9ja1NpemU7ICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KIH0gTFZEQkVfQ2FwYWJpbGl0aWVzX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjYxLDc1ICsyMTYsMzkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAqLwotLyogICAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAqLwotLyogICAgcENhcGFiaWxpdGllcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0ZXMgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfTWVtb3J5KExWREJFX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAqLwotLyogICAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICovCi0vKiAgICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICovCi0vKiAgICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgKi8KLS8qICAgIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAqLwotLyogICAgTFZEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkRCRV9BTElHTk1FTlRFUlJPUiAgICAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAqLwotLyogICAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9OVUxMQUREUkVTUyAgICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAtIG1hbGxvYyBmYWlsdXJlICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgICAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAqLwotLyogICAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAyLiAgICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgKi8KKy8qICAxLiAgICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Jbml0KExWREJFX0hhbmRsZV90KiBwaEluc3RhbmNlLCBMVkRCRV9DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBTY3JhdGNoKTsKIAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgZHVyaW5nIExWREJFX0luaXQgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZEQkVfRGVJbml0KExWREJFX0hhbmRsZV90KiBwaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1MSw4ICsyNzAsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldFBhcmFtZXRlcnMoTFZEQkVfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAqcFBhcmFtcyk7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0UGFyYW1ldGVycyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM3NCw4ICsyOTIsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldENhcGFiaWxpdGllcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDE0LDggKzMzMiw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgKnBQYXJhbXMpOworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0NvbnRyb2woTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MzcsOSArMzU0LDcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgTnVtU2FtcGxlcyk7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcyk7CiAKICNlbmRpZiAvKiBfX0xWREJFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCmluZGV4IGIzNjRkYWUuLjMwZTE2OTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKQEAgLTI0LDcgKzI0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIExWREJFX1NDQUxFU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBMVkRCRV9TQ0FMRVNISUZUIDEwIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTMyLDI4OSArMzIsMjg5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU4ODQ5ZgotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTE3Njk4ZikKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS45MzkwMDFmKQotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDgwN2YKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjY5MDlmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45MzM4MThmKQotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NjkwOWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1NTczMmYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU2NjkwZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2ODY1MGYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzNzMwMGYpCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY4NjUwZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU5MzI3ZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjAxMzhmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNTg4ZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ3MTc2ZikKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njk0OTRmKQotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTk1MmYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc2NzFmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTUzNDNmKQotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzY3MWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Nzg2M2YpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4MTA1ZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU1MWYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1NzEwMmYpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTUxZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc5NjYyZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk4NjZmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDQyZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYyMDg0ZikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODQ3NDZmKQotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDg2MWYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODMwOTdmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjYxOTRmKQotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA5N2YKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4ODkzMWYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4OTkyZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzUzOWYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NzA3OWYpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNTM5ZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg5ODMxZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODk4ODJmCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTAgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAoLTEuOTE3Njk4ZikKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EyIDAuOTU4ODQ5ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjEgKC0xLjkzOTAwMWYpCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMiAwLjk0MDgwN2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMCAwLjk2NjkwOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMSAoLTEuOTMzODE4ZikKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMiAwLjk2NjkwOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMSAoLTEuOTU1NzMyZikKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMiAwLjk1NjY5MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMCAwLjk2ODY1MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMSAoLTEuOTM3MzAwZikKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMiAwLjk2ODY1MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMSAoLTEuOTU5MzI3ZikKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMiAwLjk2MDEzOGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMCAwLjk3MzU4OGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMSAoLTEuOTQ3MTc2ZikKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMiAwLjk3MzU4OGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMSAoLTEuOTY5NDk0ZikKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMiAwLjk2OTk1MmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMCAwLjk3NzY3MWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMSAoLTEuOTU1MzQzZikKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMiAwLjk3NzY3MWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMSAoLTEuOTc3ODYzZikKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMiAwLjk3ODEwNWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMCAwLjk3ODU1MWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMSAoLTEuOTU3MTAyZikKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMiAwLjk3ODU1MWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMSAoLTEuOTc5NjYyZikKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMiAwLjk3OTg2NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMCAwLjk4MTA0MmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMSAoLTEuOTYyMDg0ZikKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMiAwLjk4MTA0MmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMSAoLTEuOTg0NzQ2ZikKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMiAwLjk4NDg2MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMCAwLjk4MzA5N2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMSAoLTEuOTY2MTk0ZikKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMiAwLjk4MzA5N2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMSAoLTEuOTg4OTMxZikKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMiAwLjk4ODk5MmYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMCAwLjk4MzUzOWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMSAoLTEuOTY3MDc5ZikKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMiAwLjk4MzUzOWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMSAoLTEuOTg5ODMxZikKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAwLjk4OTg4MmYKIAotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTgxOGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTYzNmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0NDY2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ0ODFmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTAgMC45ODU4MThmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTEgKC0xLjk3MTYzNmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTIgMC45ODU4MThmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjEgKC0xLjk5NDQ2NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjIgMC45OTQ0ODFmCiAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzIwODBmKQotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDkxNWYpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0OTI4ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwIDAuOTg2MDQwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0ExICgtMS45NzIwODBmKQorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyIDAuOTg2MDQwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IxICgtMS45OTQ5MTVmKQorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IyIDAuOTk0OTI4ZgogCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTgzZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0MzY2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTcyMzNmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzIzN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAgMC45ODcxODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0ExICgtMS45NzQzNjZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMiAwLjk4NzE4M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjEgKC0xLjk5NzIzM2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IyIDAuOTk3MjM3ZgogCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0NTg4ZikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTc0NThmKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzQ2MWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgMC45ODcyOTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICgtMS45NzQ1ODhmKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjEgKC0xLjk5NzQ1OGYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0IyIDAuOTk3NDYxZgogCi0gLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTMwMTZmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS45MDYwMzJmKQotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyNjgxMGYpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTI5Mzk2ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2MjYzOGYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyNTI3NWYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNjM4ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ2ODgxZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDgyNTZmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NzE4ZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI5NDM1ZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjQ3MThmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTExOTZmKQotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1MjM1OWYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzA2MjJmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDEyNDRmKQotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MzM5NGYpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0MDUyZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NTUwOWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MTAxOWYpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1NTA5ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczNDM2ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM3ODRmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NTYzZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUzMTI1ZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzY1NjNmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzU1OTRmKQotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NTg4OWYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk1NDdmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTkwOTNmKQotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MTY5NWYpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxODYxZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjAxMGYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NDAxOWYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDEwZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg2NzE4ZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODY4MDVmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyNTQwZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY1MDc5ZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODI1NDBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODc3OTdmKQotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4Nzg3MWYKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMCAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICgtMS45MDYwMzJmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTIgMC45NTMwMTZmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMSAoLTEuOTI2ODEwZikKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IyIDAuOTI5Mzk2ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EwIDAuOTYyNjM4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0ExICgtMS45MjUyNzVmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EyIDAuOTYyNjM4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IxICgtMS45NDY4ODFmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IyIDAuOTQ4MjU2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EwIDAuOTY0NzE4ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0ExICgtMS45Mjk0MzVmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EyIDAuOTY0NzE4ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IxICgtMS45NTExOTZmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IyIDAuOTUyMzU5ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EwIDAuOTcwNjIyZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0ExICgtMS45NDEyNDRmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EyIDAuOTcwNjIyZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IxICgtMS45NjMzOTRmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IyIDAuOTY0MDUyZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EwIDAuOTc1NTA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0ExICgtMS45NTEwMTlmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EyIDAuOTc1NTA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IxICgtMS45NzM0MzZmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IyIDAuOTczNzg0ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EwIDAuOTc2NTYzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0ExICgtMS45NTMxMjVmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EyIDAuOTc2NTYzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IxICgtMS45NzU1OTRmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IyIDAuOTc1ODg5ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EwIDAuOTc5NTQ3ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0ExICgtMS45NTkwOTNmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EyIDAuOTc5NTQ3ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IxICgtMS45ODE2OTVmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IyIDAuOTgxODYxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EwIDAuOTgyMDEwZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0ExICgtMS45NjQwMTlmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EyIDAuOTgyMDEwZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IxICgtMS45ODY3MThmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IyIDAuOTg2ODA1ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EwIDAuOTgyNTQwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0ExICgtMS45NjUwNzlmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EyIDAuOTgyNTQwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IxICgtMS45ODc3OTdmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IyIDAuOTg3ODcxZgogCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1MjczZgotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcwNTQ2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTMzNTlmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzM4MWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMCAwLjk4NTI3M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMSAoLTEuOTcwNTQ2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMiAwLjk4NTI3M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMSAoLTEuOTkzMzU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMiAwLjk5MzM4MWYKIAotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTA3N2YpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzODk4ZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTM5MTdmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgMC45ODU1MzlmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTEgKC0xLjk3MTA3N2YpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTIgMC45ODU1MzlmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgKC0xLjk5Mzg5OGYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjIgMC45OTM5MTdmCiAKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY5MTBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM4MjBmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjY3OWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2Njg1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMCAwLjk4NjkxMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEgKC0xLjk3MzgyMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EyIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMSAoLTEuOTk2Njc5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjIgMC45OTY2ODVmCiAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQwODZmKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Njk0OWYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2OTU0ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMCAwLjk4NzA0M2YKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEgKC0xLjk3NDA4NmYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMSAoLTEuOTk2OTQ5ZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjIgMC45OTY5NTRmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuODkzMzg3ZikKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NDY2OTNmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS45MTM1MTdmKQotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjkxNzEwNWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NTc5OTlmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45MTU5OThmKQotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzNzIyOWYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTM5MTQwZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDQ0NmYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyMDg5MmYpCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwNDQ2ZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQyMzI2ZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDM5NDRmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY3Mzk3ZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTM0Nzk0ZikKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjczOTdmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTY3NDBmKQotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1NzY1NmYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzMxNTZmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDYzMTNmKQotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODYwN2YpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MDkyZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NDM5OGYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0ODc5N2YpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc0Mzk4ZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxMTU3ZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzE1NjhmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3OTE4ZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU1ODM2ZikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc5MThmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzgzNjdmKQotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU5OWYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODA4MjRmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjE2NDlmKQotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NDMwM2YpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDI1ZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTQ1MGYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MjkwMGYpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxNDUwZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg1NTc4ZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU2ODFmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMCAwLjk0NjY5M2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0ExICgtMS44OTMzODdmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTIgMC45NDY2OTNmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMSAoLTEuOTEzNTE3ZikKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IyIDAuOTE3MTA1ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EwIDAuOTU3OTk5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0ExICgtMS45MTU5OThmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EyIDAuOTU3OTk5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IxICgtMS45MzcyMjlmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IyIDAuOTM5MTQwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0EwIDAuOTYwNDQ2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0ExICgtMS45MjA4OTJmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0EyIDAuOTYwNDQ2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IxICgtMS45NDIzMjZmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IyIDAuOTQzOTQ0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EwIDAuOTY3Mzk3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0ExICgtMS45MzQ3OTRmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EyIDAuOTY3Mzk3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IxICgtMS45NTY3NDBmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IyIDAuOTU3NjU2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EwIDAuOTczMTU2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0ExICgtMS45NDYzMTNmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EyIDAuOTczMTU2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IxICgtMS45Njg2MDdmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IyIDAuOTY5MDkyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0EwIDAuOTc0Mzk4ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0ExICgtMS45NDg3OTdmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0EyIDAuOTc0Mzk4ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IxICgtMS45NzExNTdmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IyIDAuOTcxNTY4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EwIDAuOTc3OTE4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0ExICgtMS45NTU4MzZmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EyIDAuOTc3OTE4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IxICgtMS45NzgzNjdmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IyIDAuOTc4NTk5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EwIDAuOTgwODI0ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0ExICgtMS45NjE2NDlmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EyIDAuOTgwODI0ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IxICgtMS45ODQzMDNmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IyIDAuOTg0NDI1ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0EwIDAuOTgxNDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0ExICgtMS45NjI5MDBmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0EyIDAuOTgxNDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IxICgtMS45ODU1NzhmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyIDAuOTg1NjgxZgogCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0Njc4ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5MzU2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTIxNTFmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE4MmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMCAwLjk4NDY3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMSAoLTEuOTY5MzU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMiAwLjk4NDY3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMSAoLTEuOTkyMTUxZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMiAwLjk5MjE4MmYKIAotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTk4NGYpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyNzg5ZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTAgMC45ODQ5OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTEgKC0xLjk2OTk4NGYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTIgMC45ODQ5OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgKC0xLjk5Mjc4OWYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjIgMC45OTI4MTVmCiAKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY2MTJmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzMyMjRmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjA3NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MDgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMCAwLjk4NjYxMmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEgKC0xLjk3MzIyNGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EyIDAuOTg2NjEyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMSAoLTEuOTk2MDc2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjIgMC45OTYwODNmCiAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM1MzlmKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjM5NGYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2NDAxZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMCAwLjk4Njc2OWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEgKC0xLjk3MzUzOWYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyIDAuOTg2NzY5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMSAoLTEuOTk2Mzk0ZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjIgMC45OTY0MDFmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NDA0MTJmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg4MDgyNWYpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDA0MTJmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkwMDIzMWYpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45MDQ5NzdmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NTMzODNmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjkwNjc2NmYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NTMzODNmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyNzU3OWYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45MzAxMTFmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NTYxOTNmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxMjM4N2YpCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NTYxOTNmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzMzQ1OWYpCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45MzU2MDNmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NjQxODNmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyODM2NWYpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NjQxODNmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MDA4N2YpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NTEzMDNmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzA4MDlmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0MTYxOGYpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzA4MDlmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2Mzc3OGYpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjQ0MjNmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzIyMzlmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0NDQ3N2YpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzIyMzlmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NjcyMWYpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjcyNjZmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzYyOTJmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MjU4NGYpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzYyOTJmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NTA0MGYpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzUzNDdmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk2NDFmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1OTI4MmYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45Nzk2NDFmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MTg4OGYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODIwNTBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODAzNjJmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MDcyNGYpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODAzNjJmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MzM1OWYpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODM0OTdmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMCAwLjk0MDQxMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICgtMS44ODA4MjVmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTIgMC45NDA0MTJmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMSAoLTEuOTAwMjMxZikKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IyIDAuOTA0OTc3ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EwIDAuOTUzMzgzZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0ExICgtMS45MDY3NjZmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EyIDAuOTUzMzgzZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0IxICgtMS45Mjc1NzlmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0IyIDAuOTMwMTExZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EwIDAuOTU2MTkzZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0ExICgtMS45MTIzODdmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EyIDAuOTU2MTkzZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IxICgtMS45MzM0NTlmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IyIDAuOTM1NjAzZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EwIDAuOTY0MTgzZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0ExICgtMS45MjgzNjVmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EyIDAuOTY0MTgzZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IxICgtMS45NTAwODdmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IyIDAuOTUxMzAzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EwIDAuOTcwODA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0ExICgtMS45NDE2MThmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EyIDAuOTcwODA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0IxICgtMS45NjM3NzhmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0IyIDAuOTY0NDIzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EwIDAuOTcyMjM5ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0ExICgtMS45NDQ0NzdmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EyIDAuOTcyMjM5ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IxICgtMS45NjY3MjFmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IyIDAuOTY3MjY2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EwIDAuOTc2MjkyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0ExICgtMS45NTI1ODRmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EyIDAuOTc2MjkyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IxICgtMS45NzUwNDBmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IyIDAuOTc1MzQ3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EwIDAuOTc5NjQxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0ExICgtMS45NTkyODJmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EyIDAuOTc5NjQxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0IxICgtMS45ODE4ODhmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0IyIDAuOTgyMDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EwIDAuOTgwMzYyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0ExICgtMS45NjA3MjRmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EyIDAuOTgwMzYyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IxICgtMS45ODMzNTlmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IyIDAuOTgzNDk3ZgogCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0MDg0ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4MTY4ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQwODRmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTA5NDRmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MDk4NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMCAwLjk4NDA4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMSAoLTEuOTY4MTY4ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMiAwLjk4NDA4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMSAoLTEuOTkwOTQ0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMiAwLjk5MDk4NWYKIAotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODg5MmYpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkxNjgwZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTE3MTRmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTAgMC45ODQ0NDZmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTEgKC0xLjk2ODg5MmYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTIgMC45ODQ0NDZmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjEgKC0xLjk5MTY4MGYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjIgMC45OTE3MTRmCiAKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODYzMTRmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzI2MjlmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjMxNGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTQ3MmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1NDgyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMCAwLjk4NjMxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEgKC0xLjk3MjYyOWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EyIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMSAoLTEuOTk1NDcyZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjIgMC45OTU0ODJmCiAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzI5OTJmKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTg0MGYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1ODQ4ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAwLjk4NjQ5NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgKC0xLjk3Mjk5MmYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyIDAuOTg2NDk2ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMSAoLTEuOTk1ODQwZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjIgMC45OTU4NDhmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzIzLDI4OCArMzIzLDI4OCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjAwOTE5N2YKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDA5MTk3ZikKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc5NTQ1ZikKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTM5M2YKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNjY5MWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2NjkxZikKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg1NDg4ZikKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ2NGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNjE1MGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2MTUwZikKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg2NzMzZikKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzU1N2YKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyMGYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDA0NjIwZikKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwMTg5ZikKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MDY1M2YKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzM1N2YKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMzU3ZikKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyOTY0ZikKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MzIwOWYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzA4NWYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMDg1ZikKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzNTUyZikKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Mzc1OWYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxNWYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAyMzE1ZikKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1MTk5ZikKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTMxNmYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTY4MWYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNjgxZikKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2NTM3ZikKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjU5OWYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU0NWYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNTQ1ZikKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2ODIzZikKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njg3NWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EwIDAuMDA5MTk3ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMiAoLTAuMDA5MTk3ZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IxICgtMS45Nzk1NDVmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjIgMC45ODEzOTNmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTAgMC4wMDY2OTFmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTIgKC0wLjAwNjY5MWYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjEgKC0xLjk4NTQ4OGYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjIgMC45ODY0NjRmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTAgMC4wMDYxNTBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTIgKC0wLjAwNjE1MGYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjEgKC0xLjk4NjczM2YpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjIgMC45ODc1NTdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTAgMC4wMDQ2MjBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTIgKC0wLjAwNDYyMGYpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjEgKC0xLjk5MDE4OWYpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjIgMC45OTA2NTNmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTAgMC4wMDMzNTdmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTIgKC0wLjAwMzM1N2YpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjEgKC0xLjk5Mjk2NGYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjIgMC45OTMyMDlmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTAgMC4wMDMwODVmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTIgKC0wLjAwMzA4NWYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjEgKC0xLjk5MzU1MmYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjIgMC45OTM3NTlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTAgMC4wMDIzMTVmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTIgKC0wLjAwMjMxNWYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjEgKC0xLjk5NTE5OWYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjIgMC45OTUzMTZmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTAgMC4wMDE2ODFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTIgKC0wLjAwMTY4MWYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjEgKC0xLjk5NjUzN2YpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjIgMC45OTY1OTlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTAgMC4wMDE1NDVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTIgKC0wLjAwMTU0NWYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjEgKC0xLjk5NjgyM2YpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjIgMC45OTY4NzVmCiAKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDgzMWYKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwODMxZikKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk4MzIxZikKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODMzOGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMCAwLjAwMDgzMWYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMiAoLTAuMDAwODMxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9CMSAoLTEuOTk4MzIxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9CMiAwLjk5ODMzOGYKIAotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzYyZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NjJmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTg0NjFmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4NDc3ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EwIDAuMDAwNzYyZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EyICgtMC4wMDA3NjJmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IxICgtMS45OTg0NjFmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IyIDAuOTk4NDc3ZgogCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA0MTZmCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDQxNmYpCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5OTE2NGYpCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTkxNjlmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0EwIDAuMDAwNDE2ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTIgKC0wLjAwMDQxNmYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IxICgtMS45OTkxNjRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMiAwLjk5OTE2OWYKIAotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzgxZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAzODFmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTkyMzRmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MjM4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMCAwLjAwMDM4MWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICgtMC4wMDAzODFmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMSAoLTEuOTk5MjM0ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQjIgMC45OTkyMzhmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxMjY0OGYKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxMjY0OGYpCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxNzYwZikKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc0NDEyZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDkyMDlmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDkyMDlmKQotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk3OTk2NmYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4MTM2OGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4NDY4ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA4NDY4ZikKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODE2ODVmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODI4NjlmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjM2NGYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNjM2NGYpCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTg2NDU3ZikKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTI0ZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQ2MjZmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQ2MjZmKQotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MDI4OGYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MDY0MWYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA0MjUyZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA0MjUyZikKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTExMDBmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTEzOThmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzE5MmYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzE5MmYpCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzMzc0ZikKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNTQxZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIzMThmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIzMThmKQotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTIyMWYpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTMwOWYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAyMTMxZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAyMTMxZikKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTU2MTVmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMCAwLjAxMjY0OGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgKC0wLjAxMjY0OGYpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9CMSAoLTEuOTcxNzYwZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IyIDAuOTc0NDEyZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EwIDAuMDA5MjA5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICgtMC4wMDkyMDlmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICgtMS45Nzk5NjZmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IyIDAuOTgxMzY4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EwIDAuMDA4NDY4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EyICgtMC4wMDg0NjhmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICgtMS45ODE2ODVmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IyIDAuOTgyODY5ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EwIDAuMDA2MzY0ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICgtMC4wMDYzNjRmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IxICgtMS45ODY0NTdmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyIDAuOTg3MTI0ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EwIDAuMDA0NjI2ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICgtMC4wMDQ2MjZmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICgtMS45OTAyODhmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IyIDAuOTkwNjQxZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EwIDAuMDA0MjUyZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EyICgtMC4wMDQyNTJmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICgtMS45OTExMDBmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IyIDAuOTkxMzk4ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EwIDAuMDAzMTkyZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICgtMC4wMDMxOTJmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IxICgtMS45OTMzNzRmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyIDAuOTkzNTQxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EwIDAuMDAyMzE4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICgtMC4wMDIzMThmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICgtMS45OTUyMjFmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IyIDAuOTk1MzA5ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EwIDAuMDAyMTMxZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EyICgtMC4wMDIxMzFmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICgtMS45OTU2MTVmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyIDAuOTk1NjkwZgogCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTE0NmYKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTE0NmYpCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3Njg0ZikKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3NzA4ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0EwIDAuMDAxMTQ2ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0EyICgtMC4wMDExNDZmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IxICgtMS45OTc2ODRmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IyIDAuOTk3NzA4ZgogCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA1NWYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTA1NWYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3ODY4ZikKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3ODkxZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EwIDAuMDAxMDU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EyICgtMC4wMDEwNTVmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IxICgtMS45OTc4NjhmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyIDAuOTk3ODkxZgogCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDU3M2YKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDU3M2YpCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4ODQ3ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4ODUzZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMCAwLjAwMDU3M2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EyICgtMC4wMDA1NzNmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMSAoLTEuOTk4ODQ3ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjIgMC45OTg4NTNmCiAKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI4ZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA1MjhmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAoLTEuOTk4OTM5ZikKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4OTQ1ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAwLjAwMDUyOGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICgtMC4wMDA1MjhmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMSAoLTEuOTk4OTM5ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjIgMC45OTg5NDVmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxODU3MmYKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxODU3MmYpCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU4NzQ1ZikKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNDI3ZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTM1NDVmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMTM1NDVmKQotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MDY0N2YpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk3MjU5NmYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDEyNDU4ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDEyNDU4ZikKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45NzMxNDhmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45NzQ3OTVmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTM3M2YKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwOTM3M2YpCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTgwMTA4ZikKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDM3ZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDY4MTlmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDY4MTlmKQotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NTcxNGYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NjIwNGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2MjY4ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2MjY4ZikKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODY5MDRmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODczMThmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDcwOWYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDcwOWYpCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwMjQwZikKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNDczZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDM0MjFmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDM0MjFmKQotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mjk1NWYpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzA3OGYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzMTQ0ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMTQ0ZikKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTM1MzVmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM2MzlmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMCAwLjAxODU3MmYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTIgKC0wLjAxODU3MmYpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMSAoLTEuOTU4NzQ1ZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IyIDAuOTYyNDI3ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EwIDAuMDEzNTQ1ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EyICgtMC4wMTM1NDVmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IxICgtMS45NzA2NDdmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IyIDAuOTcyNTk2ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EwIDAuMDEyNDU4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EyICgtMC4wMTI0NThmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IxICgtMS45NzMxNDhmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IyIDAuOTc0Nzk1ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EwIDAuMDA5MzczZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EyICgtMC4wMDkzNzNmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IxICgtMS45ODAxMDhmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IyIDAuOTgxMDM3ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EwIDAuMDA2ODE5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EyICgtMC4wMDY4MTlmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IxICgtMS45ODU3MTRmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IyIDAuOTg2MjA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EwIDAuMDA2MjY4ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EyICgtMC4wMDYyNjhmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IxICgtMS45ODY5MDRmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IyIDAuOTg3MzE4ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EwIDAuMDA0NzA5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EyICgtMC4wMDQ3MDlmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IxICgtMS45OTAyNDBmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IyIDAuOTkwNDczZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EwIDAuMDAzNDIxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EyICgtMC4wMDM0MjFmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IxICgtMS45OTI5NTVmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IyIDAuOTkzMDc4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EwIDAuMDAzMTQ0ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EyICgtMC4wMDMxNDRmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IxICgtMS45OTM1MzVmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IyIDAuOTkzNjM5ZgogCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjkzZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTY5M2YpCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY1ODJmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5NjYxNWYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMCAwLjAwMTY5M2YKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMiAoLTAuMDAxNjkzZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMSAoLTEuOTk2NTgyZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMiAwLjk5NjYxNWYKIAotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NTVmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTU1NTVmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk2ODYwZikKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODkxZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EwIDAuMDAxNTU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICgtMC4wMDE1NTU1ZikKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMSAoLTEuOTk2ODYwZikKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMiAwLjk5Njg5MWYKIAotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA4NDdmCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4NDdmKQotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODI5OGYpCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODMwNmYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTAgMC4wMDA4NDdmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMiAoLTAuMDAwODQ3ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjEgKC0xLjk5ODI5OGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IyIDAuOTk4MzA2ZgogCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDc3OGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzc4ZikKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgKC0xLjk5ODQzN2YpCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODQ0NGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTAgMC4wMDA3NzhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMiAoLTAuMDAwNzc4ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjEgKC0xLjk5ODQzN2YpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IyIDAuOTk4NDQ0ZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIyNzYwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMjI3NjBmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDkwNzNmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzOTUzZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE2NjE5ZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTY2MTlmKQotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NjM3OTFmKQotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY2Mzc3ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE1Mjg5ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTUyODlmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NjY4ODJmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MDY3ZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDExNTExZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTE1MTFmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NzU0NzdmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NzExZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA4Mzc5ZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDgzNzlmKQotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODIzOTVmKQotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDQ3ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA3NzA0ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDc3MDRmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODM4NjNmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDE0ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA1Nzg5ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDU3ODlmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODc5NzdmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg4Mjg4ZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MjA3ZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQyMDdmKQotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTEzMjRmKQotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNDg4ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzODY3ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDM4NjdmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTIwMzhmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTc3ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTAgMC4wMjI3NjBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EyICgtMC4wMjI3NjBmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjEgKC0xLjk0OTA3M2YpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMiAwLjk1Mzk1M2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMCAwLjAxNjYxOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMiAoLTAuMDE2NjE5ZikKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMSAoLTEuOTYzNzkxZikKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMiAwLjk2NjM3N2YKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMCAwLjAxNTI4OWYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMiAoLTAuMDE1Mjg5ZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMSAoLTEuOTY2ODgyZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMiAwLjk2OTA2N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMCAwLjAxMTUxMWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMiAoLTAuMDExNTExZikKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMSAoLTEuOTc1NDc3ZikKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMiAwLjk3NjcxMWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMCAwLjAwODM3OWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMiAoLTAuMDA4Mzc5ZikKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMSAoLTEuOTgyMzk1ZikKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMiAwLjk4MzA0N2YKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMCAwLjAwNzcwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMiAoLTAuMDA3NzA0ZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMSAoLTEuOTgzODYzZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMiAwLjk4NDQxNGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMCAwLjAwNTc4OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMiAoLTAuMDA1Nzg5ZikKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMSAoLTEuOTg3OTc3ZikKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMiAwLjk4ODI4OGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMCAwLjAwNDIwN2YKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMiAoLTAuMDA0MjA3ZikKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMSAoLTEuOTkxMzI0ZikKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMiAwLjk5MTQ4OGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMCAwLjAwMzg2N2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMiAoLTAuMDAzODY3ZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMSAoLTEuOTkyMDM4ZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMiAwLjk5MjE3N2YKIAotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDgzZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIwODNmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTU3OTFmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1ODM1ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0EwIDAuMDAyMDgzZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0EyICgtMC4wMDIwODNmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0IxICgtMS45OTU3OTFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0IyIDAuOTk1ODM1ZgogCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE5MTNmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxOTEzZikKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTYxMzRmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MTc0ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EwIDAuMDAxOTEzZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICgtMC4wMDE5MTNmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICgtMS45OTYxMzRmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IyIDAuOTk2MTc0ZgogCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDEwNDJmCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTA0MmYpCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzkwNGYpCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc5MTVmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0EwIDAuMDAxMDQyZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTIgKC0wLjAwMTA0MmYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IxICgtMS45OTc5MDRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMiAwLjk5NzkxNWYKIAotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwOTU4ZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDk1OGYpCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4MDc1ZikKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5ODA4NWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTAgMC4wMDA5NThmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMiAoLTAuMDAwOTU4ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjEgKC0xLjk5ODA3NWYpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0IyIDAuOTk4MDg1ZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYxMyw3NCArNjEzLDc0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBBR0MgVGltZSBjb25zdGFudHMgKi8KLSNkZWZpbmUgQUdDX0FUVEFDS19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODQxMzk1ZgotI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44ODIyMjNmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg5MTI1MWYKLSNkZWZpbmUgQUdDX0FUVEFDS19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTE3Mjc2ZgotI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45MzkyNjdmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NDA2MWYKLSNkZWZpbmUgQUdDX0FUVEFDS19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3NzQ1ZgotI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NjkxNThmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTYyOGYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczgwMDAgMC44NDEzOTVmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMTAyNSAwLjg4MjIyM2YKKyNkZWZpbmUgQUdDX0FUVEFDS19GczEyMDAwIDAuODkxMjUxZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTYwMDAgMC45MTcyNzZmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMyMjA1MCAwLjkzOTI2N2YKKyNkZWZpbmUgQUdDX0FUVEFDS19GczI0MDAwIDAuOTQ0MDYxZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMzIwMDAgMC45NTc3NDVmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0NDEwMCAwLjk2OTE1OGYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwIDAuOTcxNjI4ZgogCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NThmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODU3MTJmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTIxOTlmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MzBmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4ODIwMCAwLjk4NDQ1OGYKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwIDAuOTg1NzEyZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTc2NDAwIDAuOTkyMTk5ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTkyMDAwIDAuOTkyODMwZgogCi0jZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBERUNBWV9TSElGVCAxMAogCi0jZGVmaW5lIEFHQ19ERUNBWV9GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA0MmYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMwZgotI2RlZmluZSBBR0NfREVDQVlfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMjhmCi0jZGVmaW5lIEFHQ19ERUNBWV9GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAyMWYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE1ZgotI2RlZmluZSBBR0NfREVDQVlfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTRmCi0jZGVmaW5lIEFHQ19ERUNBWV9GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxMGYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA4ZgotI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDdmCisjZGVmaW5lIEFHQ19ERUNBWV9GczgwMDAgMC4wMDAwNDJmCisjZGVmaW5lIEFHQ19ERUNBWV9GczExMDI1IDAuMDAwMDMwZgorI2RlZmluZSBBR0NfREVDQVlfRnMxMjAwMCAwLjAwMDAyOGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTYwMDAgMC4wMDAwMjFmCisjZGVmaW5lIEFHQ19ERUNBWV9GczIyMDUwIDAuMDAwMDE1ZgorI2RlZmluZSBBR0NfREVDQVlfRnMyNDAwMCAwLjAwMDAxNGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMzIwMDAgMC4wMDAwMTBmCisjZGVmaW5lIEFHQ19ERUNBWV9GczQ0MTAwIDAuMDAwMDA4ZgorI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAwLjAwMDAwN2YKIAotI2RlZmluZSBBR0NfREVDQVlfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMzhmCi0jZGVmaW5lIEFHQ19ERUNBWV9GUzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzNWYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTg4ZgotI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxNzVmCisjZGVmaW5lIEFHQ19ERUNBWV9Gczg4MjAwIDAuMDAwMDAzOGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgMC4wMDAwMDM1ZgorI2RlZmluZSBBR0NfREVDQVlfRnMxNzY0MDAgMC4wMDAwMDE4OGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZTMTkyMDAwIDAuMDAwMDAxNzVmCiAKIC8qIEFHQyBHYWluIHNldHRpbmdzICovCi0jZGVmaW5lIEFHQ19HQUlOX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIEFHQ19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIEFHQ19UQVJHRVRMRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4ODU1M2YKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDEyNTM4ZgotI2RlZmluZSBBR0NfR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4NDg5M2YKLSNkZWZpbmUgQUdDX0dBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTIyMDE4ZgotI2RlZmluZSBBR0NfSFBGR0FJTl8yZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43NzgyNzlmCi0jZGVmaW5lIEFHQ19HQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ODkyNWYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MjYyZgotI2RlZmluZSBBR0NfR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIzODcyMWYKLSNkZWZpbmUgQUdDX0dBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgotI2RlZmluZSBBR0NfSFBGR0FJTl81ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE4ODZmCi0jZGVmaW5lIEFHQ19HQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fNmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODE4MzgzZgotI2RlZmluZSBBR0NfR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzdkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2MjI3OGYKLSNkZWZpbmUgQUdDX0dBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgotI2RlZmluZSBBR0NfSFBGR0FJTl84ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NDgxMzRmCi0jZGVmaW5lIEFHQ19HQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fOWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTgxMDcyZgotI2RlZmluZSBBR0NfR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzEwZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ2NjgzNmYKLSNkZWZpbmUgQUdDX0dBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgotI2RlZmluZSBBR0NfSFBGR0FJTl8xMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMTE4NzJmCi0jZGVmaW5lIEFHQ19HQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMTJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjIzNDEzZgotI2RlZmluZSBBR0NfR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzEzZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjMwOTU3M2YKLSNkZWZpbmUgQUdDX0dBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgotI2RlZmluZSBBR0NfSFBGR0FJTl8xNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNi4wNzk0NThmCi0jZGVmaW5lIEFHQ19HQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMTVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDYuOTQzMjgyZgotI2RlZmluZSBBR0NfR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisjZGVmaW5lIEFHQ19HQUlOX1NDQUxFIDMxIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBBR0NfR0FJTl9TSElGVCA0ICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX1RBUkdFVExFVkVMIDAuOTg4NTUzZgorI2RlZmluZSBBR0NfSFBGR0FJTl8wZEIgMC40MTI1MzhmCisjZGVmaW5lIEFHQ19HQUlOXzBkQiAwLjAwMDAwMGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMWRCIDAuNTg0ODkzZgorI2RlZmluZSBBR0NfR0FJTl8xZEIgMC4xMjIwMThmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzJkQiAwLjc3ODI3OWYKKyNkZWZpbmUgQUdDX0dBSU5fMmRCIDAuMjU4OTI1ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8zZEIgMC45OTUyNjJmCisjZGVmaW5lIEFHQ19HQUlOXzNkQiAwLjQxMjUzOGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNGRCIDEuMjM4NzIxZgorI2RlZmluZSBBR0NfR0FJTl80ZEIgMC41ODQ4OTNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzVkQiAxLjUxMTg4NmYKKyNkZWZpbmUgQUdDX0dBSU5fNWRCIDAuNzc4Mjc5ZgorI2RlZmluZSBBR0NfSFBGR0FJTl82ZEIgMS44MTgzODNmCisjZGVmaW5lIEFHQ19HQUlOXzZkQiAwLjk5NTI2MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fN2RCIDIuMTYyMjc4ZgorI2RlZmluZSBBR0NfR0FJTl83ZEIgMS4yMzg3MjFmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzhkQiAyLjU0ODEzNGYKKyNkZWZpbmUgQUdDX0dBSU5fOGRCIDEuNTExODg2ZgorI2RlZmluZSBBR0NfSFBGR0FJTl85ZEIgMi45ODEwNzJmCisjZGVmaW5lIEFHQ19HQUlOXzlkQiAxLjgxODM4M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTBkQiAzLjQ2NjgzNmYKKyNkZWZpbmUgQUdDX0dBSU5fMTBkQiAyLjE2MjI3OGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTFkQiA0LjAxMTg3MmYKKyNkZWZpbmUgQUdDX0dBSU5fMTFkQiAyLjU0ODEzNGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTJkQiA0LjYyMzQxM2YKKyNkZWZpbmUgQUdDX0dBSU5fMTJkQiAyLjk4MTA3MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTNkQiA1LjMwOTU3M2YKKyNkZWZpbmUgQUdDX0dBSU5fMTNkQiAzLjQ2NjgzNmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTRkQiA2LjA3OTQ1OGYKKyNkZWZpbmUgQUdDX0dBSU5fMTRkQiA0LjAxMTg3MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTVkQiA2Ljk0MzI4MmYKKyNkZWZpbmUgQUdDX0dBSU5fMTVkQiA0LjYyMzQxM2YKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02ODksMzggKzY4OSwzOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVm9sdW1lIGNvbnRyb2wgZ2FpbiAqLwotI2RlZmluZSBWT0xVTUVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEluIGRCcyAqLwotI2RlZmluZSBWT0xVTUVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEluIGRCcyAqLworI2RlZmluZSBWT0xVTUVfTUFYIDAgICAvKiBJbiBkQnMgKi8KKyNkZWZpbmUgVk9MVU1FX1NISUZUIDAgLyogSW4gZEJzICovCiAKIC8qIFZvbHVtZSBjb250cm9sIHRpbWUgY29uc3RhbnRzICovCi0jZGVmaW5lIFZPTF9UQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIFZPTF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDI0NjkwZgotI2RlZmluZSBWT0xfVENfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNzk3N2YKLSNkZWZpbmUgVk9MX1RDX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1MjlmCi0jZGVmaW5lIFZPTF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDEyNDIyZgotI2RlZmluZSBWT0xfVENfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwOTAyOWYKLSNkZWZpbmUgVk9MX1RDX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgyOTlmCi0jZGVmaW5lIFZPTF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA2MjMxZgotI2RlZmluZSBWT0xfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDUyNWYKLSNkZWZpbmUgVk9MX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQxNThmCi0jZGVmaW5lIFZPTF9UQ19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMjYzZgotI2RlZmluZSBWT0xfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA3OWYKLSNkZWZpbmUgVk9MX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDExMzFmCi0jZGVmaW5lIFZPTF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDM5ZgotI2RlZmluZSBNSVhfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTM2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODk2MTUxICovCi0jZGVmaW5lIE1JWF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMjMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MjI1NDggKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0MjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyODQxNSAqLwotI2RlZmluZSBNSVhfVENfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDk3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ1Mzg3ICovCi0jZGVmaW5lIE1JWF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTk4MDQgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE1NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2Mjk1NiAqLwotI2RlZmluZSBNSVhfVENfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTg1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcxOTczICovCi0jZGVmaW5lIE1JWF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIxNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLworI2RlZmluZSBWT0xfVENfU0hJRlQgMjEgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIFZPTF9UQ19GczgwMDAgMC4wMjQ2OTBmCisjZGVmaW5lIFZPTF9UQ19GczExMDI1IDAuMDE3OTc3ZgorI2RlZmluZSBWT0xfVENfRnMxMjAwMCAwLjAxNjUyOWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTYwMDAgMC4wMTI0MjJmCisjZGVmaW5lIFZPTF9UQ19GczIyMDUwIDAuMDA5MDI5ZgorI2RlZmluZSBWT0xfVENfRnMyNDAwMCAwLjAwODI5OWYKKyNkZWZpbmUgVk9MX1RDX0ZzMzIwMDAgMC4wMDYyMzFmCisjZGVmaW5lIFZPTF9UQ19GczQ0MTAwIDAuMDA0NTI1ZgorI2RlZmluZSBWT0xfVENfRnM0ODAwMCAwLjAwNDE1OGYKKyNkZWZpbmUgVk9MX1RDX0ZzODgyMDAgMC4wMDIyNjNmCisjZGVmaW5lIFZPTF9UQ19Gczk2MDAwIDAuMDAyMDc5ZgorI2RlZmluZSBWT0xfVENfRnMxNzY0MDAgMC4wMDExMzFmCisjZGVmaW5lIFZPTF9UQ19GczE5MjAwMCAwLjAwMTAzOWYKKyNkZWZpbmUgTUlYX1RDX0ZzODAwMCAyOTM2NSAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTEwMjUgMzAyMzAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MjI1NDggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTIwMDAgMzA0MjIgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Mjg0MTUgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTYwMDAgMzA5NzggLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDUzODcgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMjIwNTAgMzE0NTEgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTk4MDQgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMjQwMDAgMzE1NTQgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjI5NTYgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMzIwMDAgMzE4NTAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE5NzMgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgMzIwOTcgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgMzIxNTAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg5NzA0ICovCi0jZGVmaW5lIE1JWF9UQ19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDMwCi0jZGVmaW5lIE1JWF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA1MzAgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzODgyMDAgMzI0MzAKKyNkZWZpbmUgTUlYX1RDX0ZzOTYwMDAgMzI0NTYgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA1MzAgKi8KIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0ODM4ICovCi0jZGVmaW5lIE1JWF9UQ19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNTk4Ci0jZGVmaW5lIE1JWF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTI1MjQgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTc2NDAwIDMyNTk4CisjZGVmaW5lIE1JWF9UQ19GczE5MjAwMCAzMjYxMSAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmNwcAppbmRleCA1M2ZlYWU4Li41YjQ3YWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuY3BwCkBAIC00NywxNSArNDcsMTIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRQYXJhbWV0ZXJzKExWREJFX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldFBhcmFtZXRlcnMoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKICAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOwogCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZEQkVfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NywxNSArNzQsMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMpIHsKKyAgICBMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKIAotICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWREJFX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTAxLDM1ICs5NiwzMyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZEQkVfU2V0RmlsdGVycyhMVkRCRV9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewotCit2b2lkIExWREJFX1NldEZpbHRlcnMoTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgewogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCiAgICAgICovCi0gICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU18xOTIwMDApKSk7CisgICAgTFZNX1VJTlQxNiBPZmZzZXQgPQorICAgICAgICAgICAgKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMSArIExWREJFX0ZTXzE5MjAwMCkpKTsKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfRkxPQVRfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfRkxPQVRfQ29lZnNfdCopJkxWREJFX0hQRl9UYWJsZVtPZmZzZXRdKTsKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KLSAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0ZMT0FUX0NvZWZzX3QqKSZMVkRCRV9CUEZfVGFibGVbT2Zmc2V0XSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNDUsMjkgKzEzOCwyNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZEQkVfU2V0QUdDKExWREJFX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLQordm9pZCBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgewogICAgIC8qCiAgICAgICogR2V0IHRoZSBhdHRhY2sgYW5kIGRlY2F5IHRpbWUgY29uc3RhbnRzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0F0dGFjayA9IExWREJFX0FHQ19BVFRBQ0tfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBBdHRhY2sgbXVsdGlwbGllciAqLwotICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19EZWNheSAgPSBMVkRCRV9BR0NfREVDQVlfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAgLyogRGVjYXkgbXVsdGlwbGVyICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0F0dGFjayA9CisgICAgICAgICAgICBMVkRCRV9BR0NfQVRUQUNLX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAvKiBBdHRhY2sgbXVsdGlwbGllciAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19EZWNheSA9CisgICAgICAgICAgICBMVkRCRV9BR0NfREVDQVlfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIERlY2F5IG11bHRpcGxlciAqLwogCiAgICAgLyoKICAgICAgKiBHZXQgdGhlIGJvb3N0IGdhaW4KICAgICAgKi8KLSAgICBpZiAocFBhcmFtcy0+SFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKLSAgICB7Ci0gICAgICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluICAgPSBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5FZmZlY3RMZXZlbF07ICAvKiBIaWdoIHBhc3MgZmlsdGVyIG9uICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluICAgPSBMVkRCRV9BR0NfR0FJTl9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5FZmZlY3RMZXZlbF07ICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIG9mZiAqLworICAgIGlmIChwUGFyYW1zLT5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKSB7CisgICAgICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluID0KKyAgICAgICAgICAgICAgICBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5FZmZlY3RMZXZlbF07IC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb24gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiA9CisgICAgICAgICAgICAgICAgTFZEQkVfQUdDX0dBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAvKiBIaWdoIHBhc3MgZmlsdGVyIG9mZiAqLwogICAgIH0KICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfVGFyZ2V0ID0gQUdDX1RBUkdFVExFVkVMOwotCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xOTMsMjkgKzE4MywyMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZEQkVfU2V0Vm9sdW1lKExWREJFX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKK3ZvaWQgTFZEQkVfU2V0Vm9sdW1lKExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZEQkVfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fVUlOVDE2IGRCU2hpZnRzOyAgLyogNmRCIHNoaWZ0cyAqLworICAgIExWTV9VSU5UMTYgZEJPZmZzZXQ7ICAvKiBUYWJsZSBvZmZzZXQgKi8KKyAgICBMVk1fSU5UMTYgVm9sdW1lID0gMDsgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLwogCi0gICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLwotICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLwotICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KLQotICAgIExWTV9GTE9BVCAgICAgICAgZEJTaGlmdHNfZmFjOworICAgIExWTV9GTE9BVCBkQlNoaWZ0c19mYWM7CiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGlmIGVuYWJsZWQKICAgICAgKi8KLSAgICBpZiAocFBhcmFtcy0+Vm9sdW1lQ29udHJvbCA9PSBMVkRCRV9WT0xVTUVfT04pCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5Wb2x1bWVDb250cm9sID09IExWREJFX1ZPTFVNRV9PTikgewogICAgICAgICAvKgogICAgICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCiAgICAgICAgICAqLwotICAgICAgICBpZiAgKHBQYXJhbXMtPlZvbHVtZWRCID4gVk9MVU1FX01BWCkKLSAgICAgICAgeworICAgICAgICBpZiAocFBhcmFtcy0+Vm9sdW1lZEIgPiBWT0xVTUVfTUFYKSB7CiAgICAgICAgICAgICBWb2x1bWUgPSBWT0xVTUVfTUFYOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgVm9sdW1lID0gcFBhcmFtcy0+Vm9sdW1lZEI7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjMsOCArMjA2LDggQEAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgZ2FpbiBhbmQgc2hpZnRzCiAgICAgICovCi0gICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoNiArIFZvbHVtZSAlIDYpOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBkQnMgMC01ICovCi0gICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCisgICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoNiArIFZvbHVtZSAlIDYpOyAvKiBHZXQgdGhlIGRCcyAwLTUgKi8KKyAgICBkQlNoaWZ0cyA9IChMVk1fVUlOVDE2KShWb2x1bWUgLyAtNik7ICAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLwogCiAgICAgZEJTaGlmdHNfZmFjID0gKExWTV9GTE9BVCkoMSA8PCBkQlNoaWZ0cyk7CiAgICAgLyoKQEAgLTIzMiwyNyArMjE1LDIzIEBACiAgICAgICovCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0IC8gZEJTaGlmdHNfZmFjOwotICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVRDICAgID0gTFZEQkVfVm9sdW1lVENUYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWVUQyA9CisgICAgICAgICAgICBMVkRCRV9Wb2x1bWVUQ1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KIAogICAgIC8qCiAgICAgICogV2hlbiBEQkUgaXMgZGlzYWJsZWQgdXNlIHRoZSBieXBhc3Mgdm9sdW1lIGNvbnRyb2wKICAgICAgKi8KLSAgICBpZihkQlNoaWZ0cyA+IDApCi0gICAgeworICAgIGlmIChkQlNoaWZ0cyA+IDApIHsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSAvIGRCU2hpZnRzX2ZhYyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CiAgICAgfQogCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01JWEVSX1RDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjkyLDIxICsyNzEsMTcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Db250cm9sKExWREJFX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyOworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0NvbnRyb2woTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0KiBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXI7CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgZmlsdGVycwogICAgICAqLwogICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICE9IHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSkpCi0gICAgewotICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgIT0gcFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5KSkgeworICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgLyogTmV3IHBhcmFtZXRlcnMgKi8KICAgICB9CiAKICAgICAvKgpAQCAtMzE0LDE2ICsyODksMTQgQEAKICAgICAgKi8KICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICE9IHBQYXJhbXMtPkVmZmVjdExldmVsKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ICE9IHBQYXJhbXMtPkhQRlNlbGVjdCkpCi0gICAgewotICAgICAgICBMVkRCRV9TZXRBR0MocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCi0gICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAhPSBwUGFyYW1zLT5IUEZTZWxlY3QpKSB7CisgICAgICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgTFZEQkVfQllQQVNTX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CiAKLSAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwotCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIExWREJFX0JZUEFTU19NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwogICAgIH0KIAogICAgIC8qCkBAIC0zMzIsMTkgKzMwNSwxNiBAQAogICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lZEIgIT0gcFBhcmFtcy0+Vm9sdW1lZEIpIHx8CiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5IZWFkcm9vbWRCICE9IHBQYXJhbXMtPkhlYWRyb29tZEIpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Wb2x1bWVDb250cm9sICE9IHBQYXJhbXMtPlZvbHVtZUNvbnRyb2wpKQotICAgIHsKLSAgICAgICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAhPSBwUGFyYW1zLT5Wb2x1bWVDb250cm9sKSkgeworICAgICAgICBMVkRCRV9TZXRWb2x1bWUocEluc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgIC8qIE5ldyBwYXJhbWV0ZXJzICovCiAgICAgfQogCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09OICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09GRikKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04gJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpIHsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDApOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7CiAgICAgfQotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYgJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT04pCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRiAmJiBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKSB7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAxLjBmKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDApOwogICAgIH0KQEAgLTM1NCw1ICszMjQsNSBAQAogICAgICAqLwogICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CiAKLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkRCRV9TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcAppbmRleCBhZDc3Njk2Li4xMmFmMTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuY3BwCkBAIC0yMCwyMTAgKzIwLDkzIEBACiAvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlICJMVkRCRS5oIgogI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAqLwotLyogICAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAqLwotLyogICAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfTWVtb3J5KExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIFNjcmF0Y2hTaXplOwotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9JbnN0YW5jZV90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9JTlNUQU5DRV9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIERhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgPSBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvZWYgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgPSBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUY7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgPSBTY3JhdGNoU2l6ZTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICA9IExWREJFX1NDUkFUQ0hfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgPSBMVkRCRV9TQ1JBVENIOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgKi8KLS8qICAgIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgKi8KLS8qICAgIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAqLwotLyogICAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICovCi0vKiAgICBEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkRCRV9BTElHTk1FTlRFUlJPUiAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBvbiBpbmNvcnJlY3QgYWxpZ25tZW50ICAgICAgICAgICAqLwotLyogICAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCisvKiAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgLSBtYWxsb2MgZmFpbHVyZSAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gICAgIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgKi8KLS8qICAgICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgMi4gICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICovCisvKiAgMS4gICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Jbml0KExWREJFX0hhbmRsZV90ICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2U7Ci0gICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICAgICAgICpwTWl4ZXJfSW5zdGFuY2U7Ci0gICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgIE1peEdhaW47Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgIGk7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfSW5pdChMVkRCRV9IYW5kbGVfdCogcGhJbnN0YW5jZSwgTFZEQkVfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwU2NyYXRjaCkgeworICAgIExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZTsKKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QqIHBNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QqIHBCeXBhc3NNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgTWl4R2FpbjsKIAogICAgIC8qCi0gICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKKyAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAogICAgICAqLwotICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gKExWREJFX0hhbmRsZV90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzOworICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICAqcGhJbnN0YW5jZSA9IGNhbGxvYygxLCBzaXplb2YoKnBJbnN0YW5jZSkpOwogICAgIH0KLSAgICBwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzIGFuZCBpbmNvcnJlY3RseSBhbGlnbmVkIGRhdGEKLSAgICAgKi8KLSAgICBmb3IgKGk9MDsgaTxMVkRCRV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVkRCRV9OVUxMQUREUkVTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX0FMSUdOTUVOVEVSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZEQkVfTlVMTEFERFJFU1M7CiAgICAgfQorICAgIHBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90KikqcGhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOwogCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOworICAgIHBJbnN0YW5jZS0+cFNjcmF0Y2ggPSBwU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBkZWZhdWx0IGluc3RhbmNlIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgICA9ICAgIExWREJFX0NFTlRSRV81NUhaOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICAgICAgID0gICAgMDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5IZWFkcm9vbWRCICAgICAgICA9ICAgIDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ICAgICAgICAgPSAgICBMVkRCRV9IUEZfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgICAgID0gICAgTFZEQkVfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgID0gICAgTFZEQkVfRlNfODAwMDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5Wb2x1bWVDb250cm9sICAgICA9ICAgIExWREJFX1ZPTFVNRV9PRkY7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lZEIgICAgICAgICAgPSAgICAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NFTlRSRV81NUhaOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5IZWFkcm9vbWRCID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPSBMVkRCRV9IUEZfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkRCRV9PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSA9IExWREJFX0ZTXzgwMDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCA9IExWREJFX1ZPTFVNRV9PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lZEIgPSAwOwogCiAgICAgLyoKLSAgICAgKiBTZXQgcG9pbnRlciB0byBkYXRhIGFuZCBjb2VmIG1lbW9yeQorICAgICAqIENyZWF0ZSBwb2ludGVyIHRvIGRhdGEgYW5kIGNvZWYgbWVtb3J5CiAgICAgICovCi0gICAgcEluc3RhbmNlLT5wRGF0YSA9Ci0gICAgICAgICAoTFZEQkVfRGF0YV9GTE9BVF90ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzOwotICAgIHBJbnN0YW5jZS0+cENvZWYgPQotICAgICAgICAgKExWREJFX0NvZWZfRkxPQVRfdCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBwSW5zdGFuY2UtPnBEYXRhID0gKExWREJFX0RhdGFfRkxPQVRfdCopY2FsbG9jKDEsIHNpemVvZigqKHBJbnN0YW5jZS0+cERhdGEpKSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cERhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTFZEQkVfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBJbnN0YW5jZS0+cENvZWYgPSAoTFZEQkVfQ29lZl9GTE9BVF90KiljYWxsb2MoMSwgc2l6ZW9mKCoocEluc3RhbmNlLT5wQ29lZikpKTsKKyAgICBpZiAocEluc3RhbmNlLT5wQ29lZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBMVkRCRV9OVUxMQUREUkVTUzsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIGZpbHRlcnMKICAgICAgKi8KLSAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZmlsdGVyIHRhcHMgYW5kIGNvZWZmaWNpZW50cyAqLworICAgIExWREJFX1NldEZpbHRlcnMocEluc3RhbmNlLCAvKiBTZXQgdGhlIGZpbHRlciB0YXBzIGFuZCBjb2VmZmljaWVudHMgKi8KICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIEFHQwogICAgICAqLwotICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgQUdDIGdhaW4gKi8KKyAgICBMVkRCRV9TZXRBR0MocEluc3RhbmNlLCAvKiBTZXQgdGhlIEFHQyBnYWluICovCiAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0dhaW4gPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gdGhlIGJhc3MgYm9vc3Qgc2V0dGluZyAqLworICAgIC8qIERlZmF1bHQgdG8gdGhlIGJhc3MgYm9vc3Qgc2V0dGluZyAqLwogCiAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbWl4ZXIgd2l0aCBzb21lIGZpeGVzIHZhbHVlcyBzaW5jZSBvdGhlcndpc2UgTFZEQkVfU2V0Vm9sdW1lIGVuZHMgdXAKICAgICAvLyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YQpAQCAtMjMzLDExICsxMTYsMTEgQEAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIHZvbHVtZQogICAgICAqLwotICAgIExWREJFX1NldFZvbHVtZShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIFZvbHVtZSAqLworICAgIExWREJFX1NldFZvbHVtZShwSW5zdGFuY2UsIC8qIFNldCB0aGUgVm9sdW1lICovCiAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CiAKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWUgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIGFzIHRoZSB0YXJnZXQgKi8KKyAgICAvKiBJbml0aWFsaXNlIGFzIHRoZSB0YXJnZXQgKi8KICAgICBNaXhHYWluID0gTFZDX01peGVyX0dldFRhcmdldCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIE1peEdhaW4sIE1peEdhaW4pOwogCkBAIC0yNTksMTEgKzE0MiwxMSBAQAogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOwotICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MDsKKyAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMDsKIAotICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLDAsMCk7Ci0gICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgMCwgMCk7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgTFZEQkVfQllQQVNTX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSB1bnByb2Nlc3NlZCBwYXRoCkBAIC0yNzEsMTAgKzE1NCwzOCBAQAogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSA9IDA7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayA9IExWTV9OVUxMOwotICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQ9MDsKKyAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMDsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgMS4wLCAxLjApOwotICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCi0gICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIExWREJFX0JZUEFTU19NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CiAKLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkRCRV9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgZHVyaW5nIExWREJFX0luaXQgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZEQkVfRGVJbml0KExWREJFX0hhbmRsZV90KiBwaEluc3RhbmNlKSB7CisgICAgTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QqKSpwaEluc3RhbmNlOworICAgIGlmIChwSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wRGF0YSAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cERhdGEpOworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBDb2VmICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wQ29lZik7CisgICAgICAgIHBJbnN0YW5jZS0+cENvZWYgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZnJlZShwSW5zdGFuY2UpOworICAgICpwaEluc3RhbmNlID0gTFZNX05VTEw7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAppbmRleCBmM2ZhYWVkLi40ZmVmMWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKQEAgLTMzLDcgKzMzLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJMVkRCRS5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGluZyBvciBBcHBsaWNhdGlvbiBsYXllciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWREJFLmgiIC8qIENhbGxpbmcgb3IgQXBwbGljYXRpb24gbGF5ZXIgZGVmaW5pdGlvbnMgKi8KICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJMVkNfTWl4ZXIuaCIKICNpbmNsdWRlICJBR0MuaCIKQEAgLTQ1LDI4ICs0NSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEdlbmVyYWwgKi8KLSNkZWZpbmUgICAgTFZEQkVfSU5WQUxJRCAgICAgICAgICAgIDB4RkZGRiAgICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworI2RlZmluZSBMVkRCRV9JTlZBTElEIDB4RkZGRiAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCiAKLS8qIE1lbW9yeSAqLwotI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAwICAgICAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAxICAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAyICAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IHJlZ2lvbiAqLwotI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgIC8qIE9mZnNldCB0byBkYXRhIHNjcmF0Y2ggbWVtb3J5IHJlZ2lvbiAqLwotCi0jZGVmaW5lIExWREJFX0lOU1RBTkNFX0FMSUdOICAgICAgICAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAqLwotI2RlZmluZSBMVkRCRV9QRVJTSVNURU5UX0RBVEFfQUxJR04gICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGRhdGEgKi8KLSNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBjb2VmICovCi0jZGVmaW5lIExWREJFX1NDUkFUQ0hfQUxJR04gICAgICAgICAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCi0KLSNpZmRlZiBTVVBQT1JUX01DCi0vKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0jZGVmaW5lIExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0UgICAgIChMVk1fTUFYX0NIQU5ORUxTICogMykKLSNlbHNlCi0jZGVmaW5lIExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0UgICAgIDYgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTFZEQkVfTUlYRVJfVEMgICAgICAgICAgICAgICAgICAgNSAgICAgICAvKiBNaXhlciB0aW1lICAqLwotI2RlZmluZSBMVkRCRV9CWVBBU1NfTUlYRVJfVEMgICAgICAgICAgICAxMDAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lICovCisjZGVmaW5lIExWREJFX01JWEVSX1RDIDUgICAgICAgICAgLyogTWl4ZXIgdGltZSAgKi8KKyNkZWZpbmUgTFZEQkVfQllQQVNTX01JWEVSX1RDIDEwMCAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzYsMzcgKzU4LDM0IEBACiAKIC8qIERhdGEgc3RydWN0dXJlICovCiAvKiBEYXRhIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBBR0MgcGFyYW1ldGVycyAqLwotICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgIEFHQ0luc3RhbmNlOyAgICAgICAgLyogQUdDIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgQUdDSW5zdGFuY2U7IC8qIEFHQyBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCiAKICAgICAvKiBQcm9jZXNzIHZhcmlhYmxlcyAqLwotICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICBIUEZUYXBzOyAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgdGFwcyAqLwotICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICBCUEZUYXBzOyAgICAgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgdGFwcyAqLwotICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgICAgICAgICAgICBCeXBhc3NWb2x1bWU7ICAgICAgIC8qIEJ5cGFzcyB2b2x1bWUgc2NhbGVyICovCi0gICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICAgICAgIEJ5cGFzc01peGVyOyAgICAgICAgLyogQnlwYXNzIE1peGVyIGZvciBDbGljayBSZW1vdmFsICovCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgSFBGVGFwczsgLyogSGlnaCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgQlBGVGFwczsgLyogQmFuZCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0IEJ5cGFzc1ZvbHVtZTsgICAgLyogQnlwYXNzIHZvbHVtZSBzY2FsZXIgKi8KKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgQnlwYXNzTWl4ZXI7ICAgICAvKiBCeXBhc3MgTWl4ZXIgZm9yIENsaWNrIFJlbW92YWwgKi8KIAogfSBMVkRCRV9EYXRhX0ZMT0FUX3Q7CiAKIC8qIENvZWZzIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBQcm9jZXNzIHZhcmlhYmxlcyAqLwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICBIUEZJbnN0YW5jZTsgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAgQlBGSW5zdGFuY2U7ICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgSFBGSW5zdGFuY2U7IC8qIEhpZ2ggcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCBCUEZJbnN0YW5jZTsgLyogQmFuZCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLwogfSBMVkRCRV9Db2VmX0ZMT0FUX3Q7CiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KLSAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAgICAgICAgUGFyYW1zOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCi0gICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KKyAgICBMVkRCRV9QYXJhbXNfdCBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCBDYXBhYmlsaXRpZXM7IC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLwogCiAgICAgLyogRGF0YSBhbmQgY29lZmZpY2llbnQgcG9pbnRlcnMgKi8KLSAgICBMVkRCRV9EYXRhX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCi0gICAgTFZEQkVfQ29lZl9GTE9BVF90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCisgICAgTFZEQkVfRGF0YV9GTE9BVF90KiBwRGF0YTsgLyogSW5zdGFuY2UgZGF0YSAqLworICAgIExWREJFX0NvZWZfRkxPQVRfdCogcENvZWY7IC8qIEluc3RhbmNlIGNvZWZmaWNpZW50cyAqLworICAgIHZvaWQqIHBTY3JhdGNoOyAgICAgICAgICAgIC8qIHNjcmF0Y2ggcG9pbnRlciAqLwogfSBMVkRCRV9JbnN0YW5jZV90OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExNSwxMyArOTQsMTAgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZEQkVfU2V0QUdDKExWREJFX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAgKnBQYXJhbXMpOwordm9pZCBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcyk7CiAKLXZvaWQgICAgTFZEQkVfU2V0Vm9sdW1lKExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgKnBQYXJhbXMpOwordm9pZCBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcyk7CiAKLXZvaWQgICAgTFZEQkVfU2V0RmlsdGVycyhMVkRCRV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgKnBQYXJhbXMpOwordm9pZCBMVkRCRV9TZXRGaWx0ZXJzKExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZEQkVfUGFyYW1zX3QqIHBQYXJhbXMpOwogCi0jZW5kaWYgICAgICAvKiBfX0xWREJFX1BSSVZBVEVfSF9fICovCisjZW5kaWYgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuY3BwCmluZGV4IGI0YTcxYzcuLmY0YTRkNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jcHAKQEAgLTIxLDEyICsyMSwxMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBtZW1zZXQKKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIG1lbXNldAogI2luY2x1ZGUgIkxWREJFLmgiCiAjaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJBR0MuaCIKLSNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTczLDE3OSArNzMsMTIyIEBACiAvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCi0gICAgY29uc3QgTFZNX0ZMT0FUICpwSW5EYXRhLAotICAgIExWTV9GTE9BVCAqcE91dERhdGEsCi0gICAgY29uc3QgTFZNX1VJTlQxNiBOckZyYW1lcykgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoCisgICAgICAgIExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLCBMVk1fRkxPQVQqIHBPdXREYXRhLAorICAgICAgICBjb25zdCBMVk1fVUlOVDE2IE5yRnJhbWVzKSAgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgogewotICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICAgIExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKLSAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbwotICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQotICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKLSNlbHNlCi0gIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKLSNlbmRpZgotICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOworICAgIC8qRXh0cmFjdCBudW1iZXIgb2YgQ2hhbm5lbHMgaW5mbyovCisgICAgLy8gTW9ubyBwYXNzZWQgaW4gYXMgc3RlcmVvCisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPQorICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisgICAgY29uc3QgTFZNX0lOVDMyIE5yU2FtcGxlcyA9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsKIAotICAvKiBTcGFjZSB0byBzdG9yZSBEQkUgcGF0aCBjb21wdXRhdGlvbiAqLwotICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaCA9Ci0gICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7Ci0KLSAgLyoKLSAgICogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YKLSAgICogTnJTYW1wbGVzIGZsb2F0IHZhbHVlcyBmcm9tIHBTY3JhdGNoLgotICAgKi8KLSAgTFZNX0ZMT0FUICogY29uc3QgcE1vbm8gPSBwU2NyYXRjaCArIE5yU2FtcGxlczsKLQotICAvKgotICAgKiBUUklDS1k6IHBNb25vIGlzIHVzZWQgYW5kIGRpc2NhcmRlZCBieSB0aGUgREJFIHBhdGguCi0gICAqICAgICAgICAgc28gaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UgZm9yIHRoZSBwU2NyYXRjaFZvbAotICAgKiAgICAgICAgIHBhdGggd2hpY2ggaXMgY29tcHV0ZWQgYWZ0ZXJ3YXJkcy4KLSAgICoKLSAgICogU3BhY2UgdG8gc3RvcmUgVm9sdW1lIENvbnRyb2wgcGF0aCBjb21wdXRhdGlvbi4KLSAgICogVGhpcyBpcyBpZGVudGljYWwgdG8gcE1vbm8gKHNlZSBUUklDS1kgY29tbWVudCkuCi0gICAqLwotICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaFZvbCA9IHBNb25vOwotCi0gIC8qCi0gICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKLSAgICovCi0gIGlmIChOckZyYW1lcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKLSAgewotICAgIHJldHVybiBMVkRCRV9UT09NQU5ZU0FNUExFUzsKLSAgfQotCi0gIC8qCi0gICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAotICAgKi8KLSAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KLSAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKXx8Ci0gICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQotICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKLSAgewotICAgIC8vIG1ha2UgY29weSBvZiBpbnB1dCBkYXRhCi0gICAgQ29weV9GbG9hdChwSW5EYXRhLAotICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOworICAgIC8qIFNwYWNlIHRvIHN0b3JlIERCRSBwYXRoIGNvbXB1dGF0aW9uICovCisgICAgTFZNX0ZMT0FUKiBjb25zdCBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBJbnN0YW5jZS0+cFNjcmF0Y2g7CiAKICAgICAvKgotICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCisgICAgICogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YKKyAgICAgKiBOclNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2guCiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCi0gICAgewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KLSAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAotICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCi0gICAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCi0gICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7Ci0jZW5kaWYKKyAgICBMVk1fRkxPQVQqIGNvbnN0IHBNb25vID0gcFNjcmF0Y2ggKyBOclNhbXBsZXM7CisKKyAgICAvKgorICAgICAqIFRSSUNLWTogcE1vbm8gaXMgdXNlZCBhbmQgZGlzY2FyZGVkIGJ5IHRoZSBEQkUgcGF0aC4KKyAgICAgKiAgICAgICAgIHNvIGl0IGlzIGF2YWlsYWJsZSBmb3IgdXNlIGZvciB0aGUgcFNjcmF0Y2hWb2wKKyAgICAgKiAgICAgICAgIHBhdGggd2hpY2ggaXMgY29tcHV0ZWQgYWZ0ZXJ3YXJkcy4KKyAgICAgKgorICAgICAqIFNwYWNlIHRvIHN0b3JlIFZvbHVtZSBDb250cm9sIHBhdGggY29tcHV0YXRpb24uCisgICAgICogVGhpcyBpcyBpZGVudGljYWwgdG8gcE1vbm8gKHNlZSBUUklDS1kgY29tbWVudCkuCisgICAgICovCisgICAgTFZNX0ZMT0FUKiBjb25zdCBwU2NyYXRjaFZvbCA9IHBNb25vOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCisgICAgICovCisgICAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKSB7CisgICAgICAgIHJldHVybiBMVkRCRV9UT09NQU5ZU0FNUExFUzsKICAgICB9CiAKICAgICAvKgotICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KKyAgICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTb3VyY2UgKi8KLSAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gKi8KLSAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KLSAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKLSNlbmRpZgorICAgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKSB8fAorICAgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSAhPQorICAgICAgICAgTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkgeworICAgICAgICAvLyBtYWtlIGNvcHkgb2YgaW5wdXQgZGF0YQorICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKLSAgICAvKgotICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCi0gICAgICovCi0gICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAgKi8KLSAgICAgICAgcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgICAgICBwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCi0gICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pIHsKKyAgICAgICAgICAgIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisgICAgICAgIH0KIAotICAgIC8qCi0gICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4Ci0gICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCi0gICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAqLwotICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCi0gICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAqLwotICAgICAgICBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KLSAgICAgICAgTnJDaGFubmVscyk7IC8qIE51bWJlciBvZiBjaGFubmVscyAgICAgKi8KLSNlbHNlCi0gICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCi0gICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwotICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCi0gICAgICAgIE5yRnJhbWVzKTsKLSNlbmRpZgorICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCisgICAgICAgICAqLworICAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAvKiBNb25vIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwogCi0gICAgZm9yIChMVk1fSU5UMzIgaWkgPSAwOyBpaSA8IE5yU2FtcGxlczsgKytpaSkgewotICAgICAgLy9UT0RPOiByZXBsYWNlIHdpdGggZXhpc3RpbmcgY2xhbXBpbmcgZnVuY3Rpb24KLSAgICAgIGlmIChwU2NyYXRjaFtpaV0gPCAtMS4wKSB7Ci0gICAgICAgIHBTY3JhdGNoW2lpXSA9IC0xLjA7Ci0gICAgICB9IGVsc2UgaWYgKHBTY3JhdGNoW2lpXSA+IDEuMCkgewotICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7Ci0gICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKKyAgICAgICAgICovCisgICAgICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOyAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICAgICAqLworCisgICAgICAgIGZvciAoTFZNX0lOVDMyIGlpID0gMDsgaWkgPCBOclNhbXBsZXM7ICsraWkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCBleGlzdGluZyBjbGFtcGluZyBmdW5jdGlvbgorICAgICAgICAgICAgaWYgKHBTY3JhdGNoW2lpXSA8IC0xLjApIHsKKyAgICAgICAgICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOworICAgICAgICAgICAgfSBlbHNlIGlmIChwU2NyYXRjaFtpaV0gPiAxLjApIHsKKyAgICAgICAgICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBjbGVhciBEQkUgcHJvY2Vzc2VkIHBhdGgKKyAgICAgICAgbWVtc2V0KHBTY3JhdGNoLCAwLCBzaXplb2YoKnBTY3JhdGNoKSAqIE5yU2FtcGxlcyk7CiAgICAgfQotICB9IGVsc2UgewotICAgIC8vIGNsZWFyIERCRSBwcm9jZXNzZWQgcGF0aAotICAgIG1lbXNldChwU2NyYXRjaCwgMCwgc2l6ZW9mKCpwU2NyYXRjaCkgKiBOclNhbXBsZXMpOwotICB9CiAKLSAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwotICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKXx8Ci0gICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQotICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKLSAgeworICAgIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKSB8fAorICAgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSAhPQorICAgICAgICAgTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgorICAgICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQorICAgICAgICAgKi8KKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLCBwSW5EYXRhLCBwU2NyYXRjaFZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNsZWFyIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgICAgICBtZW1zZXQocFNjcmF0Y2hWb2wsIDAsIHNpemVvZigqcFNjcmF0Y2hWb2wpICogTnJTYW1wbGVzKTsKKyAgICB9CiAKICAgICAvKgotICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCi0gICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAotICAgICAgICBwSW5EYXRhLAotICAgICAgICBwU2NyYXRjaFZvbCwKLSAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKLSAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgcEluRGF0YSwKLSAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogTGVmdCBhbmQgcmlnaHQsIHJlYWxseSAjIHNhbXBsZXMgKi8KLSNlbmRpZgotICB9IGVsc2UgewotICAgIC8vIGNsZWFyIGJ5cGFzcyB2b2x1bWUgcGF0aAotICAgIG1lbXNldChwU2NyYXRjaFZvbCwgMCwgc2l6ZW9mKCpwU2NyYXRjaFZvbCkgKiBOclNhbXBsZXMpOwotICB9Ci0KLSAgLyoKLSAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCi0gICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAotICAgICAgcFNjcmF0Y2gsCi0gICAgICBwU2NyYXRjaFZvbCwKLSAgICAgIHBPdXREYXRhLAotICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKLSAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCi0gICAgICBwU2NyYXRjaCwKLSAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgcE91dERhdGEsCi0gICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7Ci0jZW5kaWYKLSAgcmV0dXJuIExWREJFX1NVQ0NFU1M7CisgICAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLCBwU2NyYXRjaCwgcFNjcmF0Y2hWb2wsIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisgICAgcmV0dXJuIExWREJFX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuY3BwCmluZGV4IDcyODU3NWMuLjFiOTU4MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiTFZEQkUuaCIKLSNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KICNpbmNsdWRlICJMVkRCRV9UYWJsZXMuaCIKICNpbmNsdWRlICJCSVFVQUQuaCIKIApAQCAtMzYsMjc1ICszNiwxMTkgQEAKICAqIEhpZ2ggUGFzcyBGaWx0ZXIgQ29lZmZpY2llbnQgdGFibGUKICAqLwogY29uc3QgQlFfRkxPQVRfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXSA9IHsKLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtIUEZfRnM4MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4MDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczgwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczgwMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczgwMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczExMDI1X0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTEwMjVfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMTEwMjVfRmM1NV9BMCwKLSAgICAgLUhQRl9GczExMDI1X0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMTIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMjAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMxMjAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzMTIwMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczEyMDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnMxNjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE2MDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczE2MDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMTYwMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczIyMDUwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjIwNTBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMjIwNTBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMjQwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyNDAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMyNDAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzMjQwMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczI0MDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnMzMjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczMyMDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczMyMDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMzIwMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczQ0MTAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDQxMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzNDQxMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzNDgwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0ODAwMF9GYzU1X0ExLAotICAgICBIUEZfRnM0ODAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnM4ODIwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczg4MjAwX0ZjNTVfQTEsCi0gICAgIEhQRl9Gczg4MjAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnM4ODIwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMX0sCi0gICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMTc2NDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE3NjQwMF9GYzU1X0ExLAotICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnMxOTIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczE5MjAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM1NV9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtIUEZfRnM4MDAwX0ZjNTVfQTIsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzODAwMF9GYzU1X0ExLCBIUEZfRnM4MDAwX0ZjNTVfQTAsIC1IUEZfRnM4MDAwX0ZjNTVfQjIsIC1IUEZfRnM4MDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzMTEwMjVfRmM1NV9BMiwgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTEwMjVfRmM1NV9BMSwgSFBGX0ZzMTEwMjVfRmM1NV9BMCwgLUhQRl9GczExMDI1X0ZjNTVfQjIsIC1IUEZfRnMxMTAyNV9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczEyMDAwX0ZjNTVfQTIsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczEyMDAwX0ZjNTVfQTEsIEhQRl9GczEyMDAwX0ZjNTVfQTAsIC1IUEZfRnMxMjAwMF9GYzU1X0IyLCAtSFBGX0ZzMTIwMDBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMxNjAwMF9GYzU1X0EyLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxNjAwMF9GYzU1X0ExLCBIUEZfRnMxNjAwMF9GYzU1X0EwLCAtSFBGX0ZzMTYwMDBfRmM1NV9CMiwgLUhQRl9GczE2MDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfRmM1NV9BMiwgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfRmM1NV9BMSwgSFBGX0ZzMjIwNTBfRmM1NV9BMCwgLUhQRl9GczIyMDUwX0ZjNTVfQjIsIC1IUEZfRnMyMjA1MF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0ZjNTVfQTIsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0ZjNTVfQTEsIEhQRl9GczI0MDAwX0ZjNTVfQTAsIC1IUEZfRnMyNDAwMF9GYzU1X0IyLCAtSFBGX0ZzMjQwMDBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9GYzU1X0EyLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMzMjAwMF9GYzU1X0ExLCBIUEZfRnMzMjAwMF9GYzU1X0EwLCAtSFBGX0ZzMzIwMDBfRmM1NV9CMiwgLUhQRl9GczMyMDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfRmM1NV9BMiwgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfRmM1NV9BMSwgSFBGX0ZzNDQxMDBfRmM1NV9BMCwgLUhQRl9GczQ0MTAwX0ZjNTVfQjIsIC1IUEZfRnM0NDEwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0ZjNTVfQTIsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTEsIEhQRl9GczQ4MDAwX0ZjNTVfQTAsIC1IUEZfRnM0ODAwMF9GYzU1X0IyLCAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9GYzU1X0EyLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM4ODIwMF9GYzU1X0ExLCBIUEZfRnM4ODIwMF9GYzU1X0EwLCAtSFBGX0ZzODgyMDBfRmM1NV9CMiwgLUhQRl9Gczg4MjAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfRmM1NV9BMiwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMSwgSFBGX0ZzOTYwMDBfRmM1NV9BMCwgLUhQRl9Gczk2MDAwX0ZjNTVfQjIsIC1IUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9GYzU1X0EyLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEsIEhQRl9GczE3NjQwMF9GYzU1X0EwLCAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjIsIC1IUEZfRnMxNzY0MDBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfRmM1NV9BMiwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLCBIUEZfRnMxOTIwMDBfRmM1NV9BMCwgLUhQRl9GczE5MjAwMF9GYzU1X0IyLCAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAogCi0gICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7SFBGX0ZzODAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODAwMF9GYzY2X0ExLAotICAgICBIUEZfRnM4MDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnM4MDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnM4MDAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnMxMTAyNV9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczExMDI1X0ZjNjZfQTEsCi0gICAgIEhQRl9GczExMDI1X0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzY2X0IyLAotICAgICAtSFBGX0ZzMTEwMjVfRmM2Nl9CMX0sCi0gICAge0hQRl9GczEyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTIwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMTIwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczEyMDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNjAwMF9GYzY2X0ExLAotICAgICBIUEZfRnMxNjAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzMTYwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczE2MDAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnMyMjA1MF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczIyMDUwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczIyMDUwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzY2X0IyLAotICAgICAtSFBGX0ZzMjIwNTBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczI0MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjQwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMjQwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczI0MDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMzIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMzMjAwMF9GYzY2X0ExLAotICAgICBIUEZfRnMzMjAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzMzIwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczMyMDAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnM0NDEwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ0MTAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczQ0MTAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzNDQxMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczQ4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzODgyMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4ODIwMF9GYzY2X0ExLAotICAgICBIUEZfRnM4ODIwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzODgyMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczE3NjQwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczE3NjQwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMTkyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE5MjAwMF9GYzY2X0ExLAotICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjNjZfQjF9LAorICAgICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICB7SFBGX0ZzODAwMF9GYzY2X0EyLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczgwMDBfRmM2Nl9BMSwgSFBGX0ZzODAwMF9GYzY2X0EwLCAtSFBGX0ZzODAwMF9GYzY2X0IyLCAtSFBGX0ZzODAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczExMDI1X0ZjNjZfQTIsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczExMDI1X0ZjNjZfQTEsIEhQRl9GczExMDI1X0ZjNjZfQTAsIC1IUEZfRnMxMTAyNV9GYzY2X0IyLCAtSFBGX0ZzMTEwMjVfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnMxMjAwMF9GYzY2X0EyLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxMjAwMF9GYzY2X0ExLCBIUEZfRnMxMjAwMF9GYzY2X0EwLCAtSFBGX0ZzMTIwMDBfRmM2Nl9CMiwgLUhQRl9GczEyMDAwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMTYwMDBfRmM2Nl9BMiwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTYwMDBfRmM2Nl9BMSwgSFBGX0ZzMTYwMDBfRmM2Nl9BMCwgLUhQRl9GczE2MDAwX0ZjNjZfQjIsIC1IUEZfRnMxNjAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0ZjNjZfQTIsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0ZjNjZfQTEsIEhQRl9GczIyMDUwX0ZjNjZfQTAsIC1IUEZfRnMyMjA1MF9GYzY2X0IyLCAtSFBGX0ZzMjIwNTBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9GYzY2X0EyLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMyNDAwMF9GYzY2X0ExLCBIUEZfRnMyNDAwMF9GYzY2X0EwLCAtSFBGX0ZzMjQwMDBfRmM2Nl9CMiwgLUhQRl9GczI0MDAwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfRmM2Nl9BMiwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfRmM2Nl9BMSwgSFBGX0ZzMzIwMDBfRmM2Nl9BMCwgLUhQRl9GczMyMDAwX0ZjNjZfQjIsIC1IUEZfRnMzMjAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0ZjNjZfQTIsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0ZjNjZfQTEsIEhQRl9GczQ0MTAwX0ZjNjZfQTAsIC1IUEZfRnM0NDEwMF9GYzY2X0IyLCAtSFBGX0ZzNDQxMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9GYzY2X0EyLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM0ODAwMF9GYzY2X0ExLCBIUEZfRnM0ODAwMF9GYzY2X0EwLCAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfRmM2Nl9BMiwgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMSwgSFBGX0ZzODgyMDBfRmM2Nl9BMCwgLUhQRl9Gczg4MjAwX0ZjNjZfQjIsIC1IUEZfRnM4ODIwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0ZjNjZfQTIsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsIEhQRl9Gczk2MDAwX0ZjNjZfQTAsIC1IUEZfRnM5NjAwMF9GYzY2X0IyLCAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfRmM2Nl9BMiwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9GYzY2X0ExLCBIUEZfRnMxNzY0MDBfRmM2Nl9BMCwgLUhQRl9GczE3NjQwMF9GYzY2X0IyLCAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0ZjNjZfQTIsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMiwgLUhQRl9GczE5MjAwMF9GYzY2X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0hQRl9GczgwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczgwMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzODAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzODAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzODAwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMTEwMjVfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMTAyNV9GYzc4X0ExLAotICAgICBIUEZfRnMxMTAyNV9GYzc4X0EwLAotICAgICAtSFBGX0ZzMTEwMjVfRmM3OF9CMiwKLSAgICAgLUhQRl9GczExMDI1X0ZjNzhfQjF9LAotICAgIHtIUEZfRnMxMjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczEyMDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczEyMDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMTIwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczE2MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTYwMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMTYwMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczE2MDAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMjIwNTBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyMjA1MF9GYzc4X0ExLAotICAgICBIUEZfRnMyMjA1MF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMjIwNTBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMyNDAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczI0MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczI0MDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMjQwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczMyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMzIwMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMzIwMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczMyMDAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzNDQxMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0NDEwMF9GYzc4X0ExLAotICAgICBIUEZfRnM0NDEwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzNDQxMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnM0ODAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ4MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczQ4MDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9Gczg4MjAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODgyMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzODgyMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnM4ODIwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzOTYwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM5NjAwMF9GYzc4X0ExLAotICAgICBIUEZfRnM5NjAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMxNzY0MDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczE3NjQwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczE5MjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzc4X0IxfSwKKyAgICAgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAge0hQRl9GczgwMDBfRmM3OF9BMiwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM4MDAwX0ZjNzhfQTEsIEhQRl9GczgwMDBfRmM3OF9BMCwgLUhQRl9GczgwMDBfRmM3OF9CMiwgLUhQRl9GczgwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnMxMTAyNV9GYzc4X0EyLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxMTAyNV9GYzc4X0ExLCBIUEZfRnMxMTAyNV9GYzc4X0EwLCAtSFBGX0ZzMTEwMjVfRmM3OF9CMiwgLUhQRl9GczExMDI1X0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzMTIwMDBfRmM3OF9BMiwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTIwMDBfRmM3OF9BMSwgSFBGX0ZzMTIwMDBfRmM3OF9BMCwgLUhQRl9GczEyMDAwX0ZjNzhfQjIsIC1IUEZfRnMxMjAwMF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczE2MDAwX0ZjNzhfQTIsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE2MDAwX0ZjNzhfQTEsIEhQRl9GczE2MDAwX0ZjNzhfQTAsIC1IUEZfRnMxNjAwMF9GYzc4X0IyLCAtSFBGX0ZzMTYwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9GYzc4X0EyLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMyMjA1MF9GYzc4X0ExLCBIUEZfRnMyMjA1MF9GYzc4X0EwLCAtSFBGX0ZzMjIwNTBfRmM3OF9CMiwgLUhQRl9GczIyMDUwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfRmM3OF9BMiwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfRmM3OF9BMSwgSFBGX0ZzMjQwMDBfRmM3OF9BMCwgLUhQRl9GczI0MDAwX0ZjNzhfQjIsIC1IUEZfRnMyNDAwMF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0ZjNzhfQTIsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0ZjNzhfQTEsIEhQRl9GczMyMDAwX0ZjNzhfQTAsIC1IUEZfRnMzMjAwMF9GYzc4X0IyLCAtSFBGX0ZzMzIwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9GYzc4X0EyLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM0NDEwMF9GYzc4X0ExLCBIUEZfRnM0NDEwMF9GYzc4X0EwLCAtSFBGX0ZzNDQxMDBfRmM3OF9CMiwgLUhQRl9GczQ0MTAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfRmM3OF9BMiwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMSwgSFBGX0ZzNDgwMDBfRmM3OF9BMCwgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0ZjNzhfQTIsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTEsIEhQRl9Gczg4MjAwX0ZjNzhfQTAsIC1IUEZfRnM4ODIwMF9GYzc4X0IyLCAtSFBGX0ZzODgyMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM5NjAwMF9GYzc4X0ExLCBIUEZfRnM5NjAwMF9GYzc4X0EwLCAtSFBGX0ZzOTYwMDBfRmM3OF9CMiwgLUhQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0ZjNzhfQTIsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMSwgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAsIC1IUEZfRnMxNzY0MDBfRmM3OF9CMiwgLUhQRl9GczE3NjQwMF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9GYzc4X0EyLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEsIEhQRl9GczE5MjAwMF9GYzc4X0EwLCAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjIsIC1IUEZfRnMxOTIwMDBfRmM3OF9CMX0sCiAKLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtIUEZfRnM4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4MDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczgwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczgwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczgwMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczExMDI1X0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTEwMjVfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMTEwMjVfRmM5MF9BMCwKLSAgICAgLUhQRl9GczExMDI1X0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMTIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMxMjAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMTIwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczEyMDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMxNjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE2MDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczE2MDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzMTYwMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczIyMDUwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjIwNTBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMjIwNTBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczIyMDUwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMjQwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyNDAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMyNDAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMjQwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczI0MDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMzMjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczMyMDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczMyMDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzMzIwMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczQ0MTAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDQxMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzNDQxMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzNDgwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0ODAwMF9GYzkwX0ExLAotICAgICBIUEZfRnM0ODAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjF9CisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtIUEZfRnM4MDAwX0ZjOTBfQTIsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzODAwMF9GYzkwX0ExLCBIUEZfRnM4MDAwX0ZjOTBfQTAsIC1IUEZfRnM4MDAwX0ZjOTBfQjIsIC1IUEZfRnM4MDAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzMTEwMjVfRmM5MF9BMiwgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTEwMjVfRmM5MF9BMSwgSFBGX0ZzMTEwMjVfRmM5MF9BMCwgLUhQRl9GczExMDI1X0ZjOTBfQjIsIC1IUEZfRnMxMTAyNV9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczEyMDAwX0ZjOTBfQTIsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczEyMDAwX0ZjOTBfQTEsIEhQRl9GczEyMDAwX0ZjOTBfQTAsIC1IUEZfRnMxMjAwMF9GYzkwX0IyLCAtSFBGX0ZzMTIwMDBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnMxNjAwMF9GYzkwX0EyLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxNjAwMF9GYzkwX0ExLCBIUEZfRnMxNjAwMF9GYzkwX0EwLCAtSFBGX0ZzMTYwMDBfRmM5MF9CMiwgLUhQRl9GczE2MDAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfRmM5MF9BMiwgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfRmM5MF9BMSwgSFBGX0ZzMjIwNTBfRmM5MF9BMCwgLUhQRl9GczIyMDUwX0ZjOTBfQjIsIC1IUEZfRnMyMjA1MF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0ZjOTBfQTIsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0ZjOTBfQTEsIEhQRl9GczI0MDAwX0ZjOTBfQTAsIC1IUEZfRnMyNDAwMF9GYzkwX0IyLCAtSFBGX0ZzMjQwMDBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9GYzkwX0EyLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMzMjAwMF9GYzkwX0ExLCBIUEZfRnMzMjAwMF9GYzkwX0EwLCAtSFBGX0ZzMzIwMDBfRmM5MF9CMiwgLUhQRl9GczMyMDAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfRmM5MF9BMiwgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfRmM5MF9BMSwgSFBGX0ZzNDQxMDBfRmM5MF9BMCwgLUhQRl9GczQ0MTAwX0ZjOTBfQjIsIC1IUEZfRnM0NDEwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0ZjOTBfQTIsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTEsIEhQRl9GczQ4MDAwX0ZjOTBfQTAsIC1IUEZfRnM0ODAwMF9GYzkwX0IyLCAtSFBGX0ZzNDgwMDBfRmM5MF9CMX0KIAotICAgICwKLSAgICB7SFBGX0ZzODgyMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4ODIwMF9GYzkwX0ExLAotICAgICBIUEZfRnM4ODIwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzODgyMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnM5NjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczE3NjQwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNzY0MDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczE3NjQwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMTkyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE5MjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjF9CisgICAgICAgICwKKyAgICAgICAge0hQRl9Gczg4MjAwX0ZjOTBfQTIsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0ZjOTBfQTEsIEhQRl9Gczg4MjAwX0ZjOTBfQTAsIC1IUEZfRnM4ODIwMF9GYzkwX0IyLCAtSFBGX0ZzODgyMDBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9GYzkwX0EyLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM5NjAwMF9GYzkwX0ExLCBIUEZfRnM5NjAwMF9GYzkwX0EwLCAtSFBGX0ZzOTYwMDBfRmM5MF9CMiwgLUhQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0ZjOTBfQTIsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfRmM5MF9BMSwgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAsIC1IUEZfRnMxNzY0MDBfRmM5MF9CMiwgLUhQRl9GczE3NjQwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEsIEhQRl9GczE5MjAwMF9GYzkwX0EwLCAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjIsIC1IUEZfRnMxOTIwMDBfRmM5MF9CMX0KIAogfTsKIApAQCAtMzEyLDE3MCArMTU2LDExNyBAQAogICogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudCB0YWJsZQogICovCiBjb25zdCBCUF9GTE9BVF9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdID0gewotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0JQRl9GczgwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4MDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnM4MDAwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnMxMTAyNV9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMTAyNV9GYzU1X0IyLAotICAgICAtQlBGX0ZzMTEwMjVfRmM1NV9CMX0sCi0gICAge0JQRl9GczEyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczEyMDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMxMjAwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzMTYwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTYwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczE2MDAwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnMyMjA1MF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyMjA1MF9GYzU1X0IyLAotICAgICAtQlBGX0ZzMjIwNTBfRmM1NV9CMX0sCi0gICAge0JQRl9GczI0MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczI0MDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMyNDAwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzMzIwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMzIwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczMyMDAwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnM0NDEwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0NDEwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzNDQxMDBfRmM1NV9CMX0sCi0gICAge0JQRl9GczQ4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKLSAgICAge0JQRl9Gczg4MjAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IyLAotICAgICAgLUJQRl9Gczg4MjAwX0ZjNTVfQjF9LAotICAgICB7QlBGX0ZzOTYwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjF9LAotICAgICB7QlBGX0ZzMTc2NDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjIsCi0gICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAotICAgICB7QlBGX0ZzMTkyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IxfSwKKyAgICAgICAgLyogQ29lZmZpY2llbnRzIGZvciA1NUh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAge0JQRl9GczgwMDBfRmM1NV9BMCwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzODAwMF9GYzU1X0IyLCAtQlBGX0ZzODAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9GczExMDI1X0ZjNTVfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxMTAyNV9GYzU1X0IyLCAtQlBGX0ZzMTEwMjVfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMxMjAwMF9GYzU1X0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTIwMDBfRmM1NV9CMiwgLUJQRl9GczEyMDAwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzMTYwMDBfRmM1NV9BMCwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE2MDAwX0ZjNTVfQjIsIC1CUEZfRnMxNjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9GczIyMDUwX0ZjNTVfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMyMjA1MF9GYzU1X0IyLCAtQlBGX0ZzMjIwNTBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMyNDAwMF9GYzU1X0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjQwMDBfRmM1NV9CMiwgLUJQRl9GczI0MDAwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzMzIwMDBfRmM1NV9BMCwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczMyMDAwX0ZjNTVfQjIsIC1CUEZfRnMzMjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9GczQ0MTAwX0ZjNTVfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM0NDEwMF9GYzU1X0IyLCAtQlBGX0ZzNDQxMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnM0ODAwMF9GYzU1X0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMiwgLUJQRl9GczQ4MDAwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzODgyMDBfRmM1NV9BMCwgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9Gczg4MjAwX0ZjNTVfQjIsIC1CUEZfRnM4ODIwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IyLCAtQlBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMxNzY0MDBfRmM1NV9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNzY0MDBfRmM1NV9CMiwgLUJQRl9GczE3NjQwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IyLCAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAogCi0gICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7QlBGX0ZzODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczgwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczgwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczExMDI1X0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczExMDI1X0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxMTAyNV9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTIwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczEyMDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnMxNjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxNjAwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzMTYwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczIyMDUwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczIyMDUwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMyMjA1MF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMjQwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMjQwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczI0MDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnMzMjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMzMjAwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzMzIwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczQ0MTAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ0MTAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnM0NDEwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzNDgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnM4ODIwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9Gczk2MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMTkyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IxfSwKKyAgICAgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAge0JQRl9GczgwMDBfRmM2Nl9BMCwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzODAwMF9GYzY2X0IyLCAtQlBGX0ZzODAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczExMDI1X0ZjNjZfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxMTAyNV9GYzY2X0IyLCAtQlBGX0ZzMTEwMjVfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMxMjAwMF9GYzY2X0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTIwMDBfRmM2Nl9CMiwgLUJQRl9GczEyMDAwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzMTYwMDBfRmM2Nl9BMCwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE2MDAwX0ZjNjZfQjIsIC1CUEZfRnMxNjAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczIyMDUwX0ZjNjZfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMyMjA1MF9GYzY2X0IyLCAtQlBGX0ZzMjIwNTBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMyNDAwMF9GYzY2X0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjQwMDBfRmM2Nl9CMiwgLUJQRl9GczI0MDAwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzMzIwMDBfRmM2Nl9BMCwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczMyMDAwX0ZjNjZfQjIsIC1CUEZfRnMzMjAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczQ0MTAwX0ZjNjZfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM0NDEwMF9GYzY2X0IyLCAtQlBGX0ZzNDQxMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnM0ODAwMF9GYzY2X0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMiwgLUJQRl9GczQ4MDAwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9Gczk2MDAwX0ZjNjZfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IyLCAtQlBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczE5MjAwMF9GYzY2X0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IyLCAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjF9LAogCi0gICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7QlBGX0ZzODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczgwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczgwMDBfRmM3OF9CMX0sCi0gICAge0JQRl9GczExMDI1X0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczExMDI1X0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMxMTAyNV9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMTIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTIwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczEyMDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMxNjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxNjAwMF9GYzc4X0IyLAotICAgICAtQlBGX0ZzMTYwMDBfRmM3OF9CMX0sCi0gICAge0JQRl9GczIyMDUwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczIyMDUwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMyMjA1MF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMjQwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMjQwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczI0MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMzMjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMzMjAwMF9GYzc4X0IyLAotICAgICAtQlBGX0ZzMzIwMDBfRmM3OF9CMX0sCi0gICAge0JQRl9GczQ0MTAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ0MTAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnM0NDEwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzNDgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnM4ODIwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMTkyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKKyAgICAgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAge0JQRl9GczgwMDBfRmM3OF9BMCwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzODAwMF9GYzc4X0IyLCAtQlBGX0ZzODAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9GczExMDI1X0ZjNzhfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxMTAyNV9GYzc4X0IyLCAtQlBGX0ZzMTEwMjVfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnMxMjAwMF9GYzc4X0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTIwMDBfRmM3OF9CMiwgLUJQRl9GczEyMDAwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzMTYwMDBfRmM3OF9BMCwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE2MDAwX0ZjNzhfQjIsIC1CUEZfRnMxNjAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9GczIyMDUwX0ZjNzhfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMyMjA1MF9GYzc4X0IyLCAtQlBGX0ZzMjIwNTBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnMyNDAwMF9GYzc4X0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjQwMDBfRmM3OF9CMiwgLUJQRl9GczI0MDAwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzMzIwMDBfRmM3OF9BMCwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczMyMDAwX0ZjNzhfQjIsIC1CUEZfRnMzMjAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9GczQ0MTAwX0ZjNzhfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM0NDEwMF9GYzc4X0IyLCAtQlBGX0ZzNDQxMDBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnM0ODAwMF9GYzc4X0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IyLCAtQlBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczE5MjAwMF9GYzc4X0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IyLCAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjF9LAogCi0gICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7QlBGX0ZzODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczgwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczgwMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczExMDI1X0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczExMDI1X0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMxMTAyNV9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMTIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTIwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczEyMDAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnMxNjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxNjAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzMTYwMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczIyMDUwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczIyMDUwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMyMjA1MF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMjQwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMjQwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczI0MDAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnMzMjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMzMjAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzMzIwMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczQ0MTAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzNDgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9Ci0gICAgLAotICAgIHtCUEZfRnM4ODIwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4ODIwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMX0sCi0gICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMTc2NDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczE3NjQwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IxfQorICAgICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICB7QlBGX0ZzODAwMF9GYzkwX0EwLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM4MDAwX0ZjOTBfQjIsIC1CUEZfRnM4MDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzMTEwMjVfRmM5MF9BMCwgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczExMDI1X0ZjOTBfQjIsIC1CUEZfRnMxMTAyNV9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczEyMDAwX0ZjOTBfQTAsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxMjAwMF9GYzkwX0IyLCAtQlBGX0ZzMTIwMDBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnMxNjAwMF9GYzkwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTYwMDBfRmM5MF9CMiwgLUJQRl9GczE2MDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzMjIwNTBfRmM5MF9BMCwgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczIyMDUwX0ZjOTBfQjIsIC1CUEZfRnMyMjA1MF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczI0MDAwX0ZjOTBfQTAsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMyNDAwMF9GYzkwX0IyLCAtQlBGX0ZzMjQwMDBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnMzMjAwMF9GYzkwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMzIwMDBfRmM5MF9CMiwgLUJQRl9GczMyMDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzNDQxMDBfRmM5MF9BMCwgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjIsIC1CUEZfRnM0NDEwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczQ4MDAwX0ZjOTBfQTAsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IyLCAtQlBGX0ZzNDgwMDBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnM4ODIwMF9GYzkwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMiwgLUJQRl9Gczg4MjAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzOTYwMDBfRmM5MF9BMCwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczE3NjQwMF9GYzkwX0EwLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE3NjQwMF9GYzkwX0IyLCAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjIsIC1CUEZfRnMxOTIwMDBfRmM5MF9CMX0KIAogfTsKIApAQCAtNDg3LDc3ICsyNzgsMzQgQEAKIAogLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0gewotICAgIEFHQ19BVFRBQ0tfRnM4MDAwLAotICAgIEFHQ19BVFRBQ0tfRnMxMTAyNSwKLSAgICBBR0NfQVRUQUNLX0ZzMTIwMDAsCi0gICAgQUdDX0FUVEFDS19GczE2MDAwLAotICAgIEFHQ19BVFRBQ0tfRnMyMjA1MCwKLSAgICBBR0NfQVRUQUNLX0ZzMjQwMDAsCi0gICAgQUdDX0FUVEFDS19GczMyMDAwLAotICAgIEFHQ19BVFRBQ0tfRnM0NDEwMCwKLSAgICBBR0NfQVRUQUNLX0ZzNDgwMDAKLSAgICAsQUdDX0FUVEFDS19Gczg4MjAwCi0gICAgLEFHQ19BVFRBQ0tfRnM5NjAwMAotICAgICxBR0NfQVRUQUNLX0ZzMTc2NDAwCi0gICAgLEFHQ19BVFRBQ0tfRnMxOTIwMDAKKyAgICAgICAgQUdDX0FUVEFDS19GczgwMDAsICBBR0NfQVRUQUNLX0ZzMTEwMjUsIEFHQ19BVFRBQ0tfRnMxMjAwMCwgQUdDX0FUVEFDS19GczE2MDAwLAorICAgICAgICBBR0NfQVRUQUNLX0ZzMjIwNTAsIEFHQ19BVFRBQ0tfRnMyNDAwMCwgQUdDX0FUVEFDS19GczMyMDAwLCBBR0NfQVRUQUNLX0ZzNDQxMDAsCisgICAgICAgIEFHQ19BVFRBQ0tfRnM0ODAwMCwgQUdDX0FUVEFDS19Gczg4MjAwLCBBR0NfQVRUQUNLX0ZzOTYwMDAsIEFHQ19BVFRBQ0tfRnMxNzY0MDAsCisgICAgICAgIEFHQ19BVFRBQ0tfRnMxOTIwMDAKIAogfTsKIAogLyogRGVjYXkgdGltZSAoc2lnbmFsIHRvbyBzbWFsbCkgKi8KLWNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfREVDQVlfVGFibGVbXSA9IHsKLSAgICBBR0NfREVDQVlfRnM4MDAwLAotICAgIEFHQ19ERUNBWV9GczExMDI1LAotICAgIEFHQ19ERUNBWV9GczEyMDAwLAotICAgIEFHQ19ERUNBWV9GczE2MDAwLAotICAgIEFHQ19ERUNBWV9GczIyMDUwLAotICAgIEFHQ19ERUNBWV9GczI0MDAwLAotICAgIEFHQ19ERUNBWV9GczMyMDAwLAotICAgIEFHQ19ERUNBWV9GczQ0MTAwLAotICAgIEFHQ19ERUNBWV9GczQ4MDAwCi0gICAgLEFHQ19ERUNBWV9Gczg4MjAwCi0gICAgLEFHQ19ERUNBWV9GUzk2MDAwCi0gICAgLEFHQ19ERUNBWV9GczE3NjQwMAotICAgICxBR0NfREVDQVlfRlMxOTIwMDAKK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfREVDQVlfVGFibGVbXSA9IHtBR0NfREVDQVlfRnM4MDAwLCAgQUdDX0RFQ0FZX0ZzMTEwMjUsIEFHQ19ERUNBWV9GczEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHQ19ERUNBWV9GczE2MDAwLCBBR0NfREVDQVlfRnMyMjA1MCwgQUdDX0RFQ0FZX0ZzMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdDX0RFQ0FZX0ZzMzIwMDAsIEFHQ19ERUNBWV9GczQ0MTAwLCBBR0NfREVDQVlfRnM0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0NfREVDQVlfRnM4ODIwMCwgQUdDX0RFQ0FZX0ZTOTYwMDAsIEFHQ19ERUNBWV9GczE3NjQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0NfREVDQVlfRlMxOTIwMDAKIAogfTsKIAogLyogR2FpbiBmb3IgdXNlIHdpdGhvdXQgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdID0gewotICAgIEFHQ19HQUlOXzBkQiwKLSAgICBBR0NfR0FJTl8xZEIsCi0gICAgQUdDX0dBSU5fMmRCLAotICAgIEFHQ19HQUlOXzNkQiwKLSAgICBBR0NfR0FJTl80ZEIsCi0gICAgQUdDX0dBSU5fNWRCLAotICAgIEFHQ19HQUlOXzZkQiwKLSAgICBBR0NfR0FJTl83ZEIsCi0gICAgQUdDX0dBSU5fOGRCLAotICAgIEFHQ19HQUlOXzlkQiwKLSAgICBBR0NfR0FJTl8xMGRCLAotICAgIEFHQ19HQUlOXzExZEIsCi0gICAgQUdDX0dBSU5fMTJkQiwKLSAgICBBR0NfR0FJTl8xM2RCLAotICAgIEFHQ19HQUlOXzE0ZEIsCi0gICAgQUdDX0dBSU5fMTVkQn07CisgICAgICAgIEFHQ19HQUlOXzBkQiwgIEFHQ19HQUlOXzFkQiwgIEFHQ19HQUlOXzJkQiwgIEFHQ19HQUlOXzNkQiwgQUdDX0dBSU5fNGRCLCAgQUdDX0dBSU5fNWRCLAorICAgICAgICBBR0NfR0FJTl82ZEIsICBBR0NfR0FJTl83ZEIsICBBR0NfR0FJTl84ZEIsICBBR0NfR0FJTl85ZEIsIEFHQ19HQUlOXzEwZEIsIEFHQ19HQUlOXzExZEIsCisgICAgICAgIEFHQ19HQUlOXzEyZEIsIEFHQ19HQUlOXzEzZEIsIEFHQ19HQUlOXzE0ZEIsIEFHQ19HQUlOXzE1ZEJ9OwogCiAvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLwogY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7Ci0gICAgQUdDX0hQRkdBSU5fMGRCLAotICAgIEFHQ19IUEZHQUlOXzFkQiwKLSAgICBBR0NfSFBGR0FJTl8yZEIsCi0gICAgQUdDX0hQRkdBSU5fM2RCLAotICAgIEFHQ19IUEZHQUlOXzRkQiwKLSAgICBBR0NfSFBGR0FJTl81ZEIsCi0gICAgQUdDX0hQRkdBSU5fNmRCLAotICAgIEFHQ19IUEZHQUlOXzdkQiwKLSAgICBBR0NfSFBGR0FJTl84ZEIsCi0gICAgQUdDX0hQRkdBSU5fOWRCLAotICAgIEFHQ19IUEZHQUlOXzEwZEIsCi0gICAgQUdDX0hQRkdBSU5fMTFkQiwKLSAgICBBR0NfSFBGR0FJTl8xMmRCLAotICAgIEFHQ19IUEZHQUlOXzEzZEIsCi0gICAgQUdDX0hQRkdBSU5fMTRkQiwKLSAgICBBR0NfSFBGR0FJTl8xNWRCfTsKKyAgICAgICAgQUdDX0hQRkdBSU5fMGRCLCAgQUdDX0hQRkdBSU5fMWRCLCAgQUdDX0hQRkdBSU5fMmRCLCAgQUdDX0hQRkdBSU5fM2RCLAorICAgICAgICBBR0NfSFBGR0FJTl80ZEIsICBBR0NfSFBGR0FJTl81ZEIsICBBR0NfSFBGR0FJTl82ZEIsICBBR0NfSFBGR0FJTl83ZEIsCisgICAgICAgIEFHQ19IUEZHQUlOXzhkQiwgIEFHQ19IUEZHQUlOXzlkQiwgIEFHQ19IUEZHQUlOXzEwZEIsIEFHQ19IUEZHQUlOXzExZEIsCisgICAgICAgIEFHQ19IUEZHQUlOXzEyZEIsIEFHQ19IUEZHQUlOXzEzZEIsIEFHQ19IUEZHQUlOXzE0ZEIsIEFHQ19IUEZHQUlOXzE1ZEJ9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU2Niw0NSArMzE0LDIzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLwotY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRhYmxlW10gPSB7Ci0gICAgMC41MDAwMDBmLCAgICAgICAgIC8qIC02ZEIgKi8KLSAgICAwLjU2MjM0MWYsICAgICAgICAgLyogLTVkQiAqLwotICAgIDAuNjMwOTU3ZiwgICAgICAgICAvKiAtNGRCICovCi0gICAgMC43MDc5NDZmLCAgICAgICAgIC8qIC0zZEIgKi8KLSAgICAwLjc5NDMyOGYsICAgICAgICAgLyogLTJkQiAqLwotICAgIDAuODkxMjUxZiwgICAgICAgICAvKiAtMWRCICovCi0gICAgMS4wMDAwMDBmfTsgICAgICAgIC8qICAwZEIgKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUYWJsZVtdID0gezAuNTAwMDAwZiwgIC8qIC02ZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyMzQxZiwgIC8qIC01ZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjMwOTU3ZiwgIC8qIC00ZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzA3OTQ2ZiwgIC8qIC0zZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzk0MzI4ZiwgIC8qIC0yZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxMjUxZiwgIC8qIC0xZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAwMDAwZn07IC8qICAwZEIgKi8KIAogY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRDVGFibGVbXSA9IHsKLSAgICBWT0xfVENfRnM4MDAwLAotICAgIFZPTF9UQ19GczExMDI1LAotICAgIFZPTF9UQ19GczEyMDAwLAotICAgIFZPTF9UQ19GczE2MDAwLAotICAgIFZPTF9UQ19GczIyMDUwLAotICAgIFZPTF9UQ19GczI0MDAwLAotICAgIFZPTF9UQ19GczMyMDAwLAotICAgIFZPTF9UQ19GczQ0MTAwLAotICAgIFZPTF9UQ19GczQ4MDAwCi0gICAgLFZPTF9UQ19Gczg4MjAwCi0gICAgLFZPTF9UQ19Gczk2MDAwCi0gICAgLFZPTF9UQ19GczE3NjQwMAotICAgICxWT0xfVENfRnMxOTIwMDAKLX07CisgICAgICAgIFZPTF9UQ19GczgwMDAsICBWT0xfVENfRnMxMTAyNSwgIFZPTF9UQ19GczEyMDAwLCBWT0xfVENfRnMxNjAwMCwgVk9MX1RDX0ZzMjIwNTAsCisgICAgICAgIFZPTF9UQ19GczI0MDAwLCBWT0xfVENfRnMzMjAwMCwgIFZPTF9UQ19GczQ0MTAwLCBWT0xfVENfRnM0ODAwMCwgVk9MX1RDX0ZzODgyMDAsCisgICAgICAgIFZPTF9UQ19Gczk2MDAwLCBWT0xfVENfRnMxNzY0MDAsIFZPTF9UQ19GczE5MjAwMH07CiAKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9NaXhlclRDVGFibGVbXSA9IHsKIAotICAgIE1JWF9UQ19GczgwMDAsCi0gICAgTUlYX1RDX0ZzMTEwMjUsCi0gICAgTUlYX1RDX0ZzMTIwMDAsCi0gICAgTUlYX1RDX0ZzMTYwMDAsCi0gICAgTUlYX1RDX0ZzMjIwNTAsCi0gICAgTUlYX1RDX0ZzMjQwMDAsCi0gICAgTUlYX1RDX0ZzMzIwMDAsCi0gICAgTUlYX1RDX0ZzNDQxMDAsCi0gICAgTUlYX1RDX0ZzNDgwMDAKLSAgICAsTUlYX1RDX0ZzODgyMDAKLSAgICAsTUlYX1RDX0ZzOTYwMDAKLSAgICAsTUlYX1RDX0ZzMTc2NDAwCi0gICAgLE1JWF9UQ19GczE5MjAwMAorICAgICAgICBNSVhfVENfRnM4MDAwLCAgTUlYX1RDX0ZzMTEwMjUsICBNSVhfVENfRnMxMjAwMCwgTUlYX1RDX0ZzMTYwMDAsIE1JWF9UQ19GczIyMDUwLAorICAgICAgICBNSVhfVENfRnMyNDAwMCwgTUlYX1RDX0ZzMzIwMDAsICBNSVhfVENfRnM0NDEwMCwgTUlYX1RDX0ZzNDgwMDAsIE1JWF9UQ19Gczg4MjAwLAorICAgICAgICBNSVhfVENfRnM5NjAwMCwgTUlYX1RDX0ZzMTc2NDAwLCBNSVhfVENfRnMxOTIwMDAKIAogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKaW5kZXggZTRlODQ1MC4uYzkwYzVjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKQEAgLTY3LDMxICs2NywyOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgTFZNX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICAgICAgICA0ICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KLQogLyogQ29uY2VydCBTb3VuZCBlZmZlY3QgbGV2ZWwgcHJlc2V0cyAqLwotI2RlZmluZSBMVk1fQ1NfRUZGRUNUX05PTkUgICAgICAgICAgICAgICAgICAgIDAgICAgIC8qIDAlIGVmZmVjdCwgbWluaW11bSB2YWx1ZSAqLwotI2RlZmluZSBMVk1fQ1NfRUZGRUNUX0xPVyAgICAgICAgICAgICAgICAgMTYzODQgICAgIC8qIDUwJSBlZmZlY3QgKi8KLSNkZWZpbmUgTFZNX0NTX0VGRkVDVF9NRUQgICAgICAgICAgICAgICAgIDI0NTc2ICAgICAvKiA3NSUgZWZmZWN0ICovCi0jZGVmaW5lIExWTV9DU19FRkZFQ1RfSElHSCAgICAgICAgICAgICAgICAzMjc2NyAgICAgLyogMTAwJSBlZmZlY3QsIG1heGltdW0gdmFsdWUgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9OT05FIDAgICAgIC8qIDAlIGVmZmVjdCwgbWluaW11bSB2YWx1ZSAqLworI2RlZmluZSBMVk1fQ1NfRUZGRUNUX0xPVyAxNjM4NCAgLyogNTAlIGVmZmVjdCAqLworI2RlZmluZSBMVk1fQ1NfRUZGRUNUX01FRCAyNDU3NiAgLyogNzUlIGVmZmVjdCAqLworI2RlZmluZSBMVk1fQ1NfRUZGRUNUX0hJR0ggMzI3NjcgLyogMTAwJSBlZmZlY3QsIG1heGltdW0gdmFsdWUgKi8KIAogLyogVHJlYmxlIGVuaGFuY2VtZW50ICovCi0jZGVmaW5lIExWTV9URV9MT1dfTUlQUyAgICAgICAgICAgICAgICAgICAzMjc2NworI2RlZmluZSBMVk1fVEVfTE9XX01JUFMgMzI3NjcKIAogLyogQmFzcyBlbmhhbmNlbWVudCBlZmZlY3QgbGV2ZWwgcHJlc2V0cyAqLwotI2RlZmluZSBMVk1fQkVfMERCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgIC8qIDBkQiBib29zdCwgbm8gZWZmZWN0ICovCi0jZGVmaW5lIExWTV9CRV8zREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgLyogKzNkQiBib29zdCAqLwotI2RlZmluZSBMVk1fQkVfNkRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgICAgIC8qICs2ZEIgYm9vc3QgKi8KLSNkZWZpbmUgTFZNX0JFXzlEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAvKiArOWRCIGJvb3N0ICovCi0jZGVmaW5lIExWTV9CRV8xMkRCICAgICAgICAgICAgICAgICAgICAgICAgICAxMiAgICAgLyogKzEyZEIgYm9vc3QgKi8KLSNkZWZpbmUgTFZNX0JFXzE1REIgICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAgICAvKiArMTVkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfMERCIDAgICAvKiAwZEIgYm9vc3QsIG5vIGVmZmVjdCAqLworI2RlZmluZSBMVk1fQkVfM0RCIDMgICAvKiArM2RCIGJvb3N0ICovCisjZGVmaW5lIExWTV9CRV82REIgNiAgIC8qICs2ZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzlEQiA5ICAgLyogKzlkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfMTJEQiAxMiAvKiArMTJkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfMTVEQiAxNSAvKiArMTVkQiBib29zdCAqLwogCiAvKiBOLUJhbmQgRXF1YWxpemVyICovCi0jZGVmaW5lIExWTV9FUV9OQkFORFMgICAgICAgICAgICAgICAgICAgICAgICAgNSAgICAvKiBOdW1iZXIgb2YgYmFuZHMgZm9yIGVxdWFsaXplciAqLworI2RlZmluZSBMVk1fRVFfTkJBTkRTIDUgLyogTnVtYmVyIG9mIGJhbmRzIGZvciBlcXVhbGl6ZXIgKi8KIAogLyogSGVhZHJvb20gbWFuYWdlbWVudCAqLwotI2RlZmluZSBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTFZNX0hFQURST09NX01BWF9OQkFORFMgNQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAwLDEyMyArOTcsODkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLXR5cGVkZWYgdm9pZCAqTFZNX0hhbmRsZV90OwordHlwZWRlZiB2b2lkKiBMVk1fSGFuZGxlX3Q7CiAKIC8qIFN0YXR1cyByZXR1cm4gdmFsdWVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fU1VDQ0VTUyAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLwotICAgIExWTV9BTElHTk1FTlRFUlJPUiAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KLSAgICBMVk1fTlVMTEFERFJFU1MgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLwotICAgIExWTV9PVVRPRlJBTkdFICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgIC8qIE91dCBvZiByYW5nZSBjb250cm9sIHBhcmFtZXRlciAqLwotICAgIExWTV9JTlZBTElETlVNU0FNUExFUyAgPSA0LCAgICAgICAgICAgICAgICAgICAgIC8qIEludmFsaWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KLSAgICBMVk1fV1JPTkdBVURJT1RJTUUgICAgID0gNSwgICAgICAgICAgICAgICAgICAgICAvKiBXcm9uZyB0aW1lIHZhbHVlIGZvciBhdWRpbyB0aW1lKi8KLSAgICBMVk1fQUxHT1JJVEhNRElTQUJMRUQgID0gNiwgICAgICAgICAgICAgICAgICAgICAvKiBBbGdvcml0aG0gaXMgZGlzYWJsZWQqLwotICAgIExWTV9BTEdPUklUSE1QU0EgICAgICAgPSA3LCAgICAgICAgICAgICAgICAgICAgIC8qIEFsZ29yaXRobSBQU0EgcmV0dXJucyBhbiBlcnJvciAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVk1fU1VDQ0VTUyA9IDAsICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLworICAgIExWTV9BTElHTk1FTlRFUlJPUiA9IDEsICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KKyAgICBMVk1fTlVMTEFERFJFU1MgPSAyLCAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWTV9PVVRPRlJBTkdFID0gMywgICAgICAgIC8qIE91dCBvZiByYW5nZSBjb250cm9sIHBhcmFtZXRlciAqLworICAgIExWTV9JTlZBTElETlVNU0FNUExFUyA9IDQsIC8qIEludmFsaWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICBMVk1fV1JPTkdBVURJT1RJTUUgPSA1LCAgICAvKiBXcm9uZyB0aW1lIHZhbHVlIGZvciBhdWRpbyB0aW1lKi8KKyAgICBMVk1fQUxHT1JJVEhNRElTQUJMRUQgPSA2LCAvKiBBbGdvcml0aG0gaXMgZGlzYWJsZWQqLworICAgIExWTV9BTEdPUklUSE1QU0EgPSA3LCAgICAgIC8qIEFsZ29yaXRobSBQU0EgcmV0dXJucyBhbiBlcnJvciAqLwogICAgIExWTV9SRVRVUk5TVEFUVVNfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fUmV0dXJuU3RhdHVzX2VuOwogCiAvKiBCdWZmZXIgTWFuYWdlbWVudCBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fTUFOQUdFRF9CVUZGRVJTICAgPSAwLAordHlwZWRlZiBlbnVtIHsKKyAgICBMVk1fTUFOQUdFRF9CVUZGRVJTID0gMCwKICAgICBMVk1fVU5NQU5BR0VEX0JVRkZFUlMgPSAxLAotICAgIExWTV9CVUZGRVJTX0RVTU1ZICAgICA9IExWTV9NQVhFTlVNCisgICAgTFZNX0JVRkZFUlNfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fQnVmZmVyTW9kZV9lbjsKIAogLyogT3V0cHV0IGRldmljZSB0eXBlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fSEVBRFBIT05FUyAgICAgICAgICAgICA9IDAsCi0gICAgTFZNX0VYX0hFQURQSE9ORVMgICAgICAgICAgPSAxLAotICAgIExWTV9TUEVBS0VSVFlQRV9NQVggICAgICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX0hFQURQSE9ORVMgPSAwLAorICAgIExWTV9FWF9IRUFEUEhPTkVTID0gMSwKKyAgICBMVk1fU1BFQUtFUlRZUEVfTUFYID0gTFZNX01BWEVOVU0KIH0gTFZNX091dHB1dERldmljZVR5cGVfZW47CiAKIC8qIFZpcnR1YWxpemVyIG1vZGUgc2VsZWN0aW9uKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9DT05DRVJUU09VTkQgICAgICAgPSAwLAotICAgIExWTV9WSVJUVUFMSVpFUlRZUEVfRFVNTVkgICA9IExWTV9NQVhFTlVNCit0eXBlZGVmIGVudW0geworICAgIExWTV9DT05DRVJUU09VTkQgPSAwLAorICAgIExWTV9WSVJUVUFMSVpFUlRZUEVfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fVmlydHVhbGl6ZXJUeXBlX2VuOwogCiAvKiBOLUJhbmQgRXF1YWxpc2VyIG9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fRVFOQl9PRkYgICA9IDAsCi0gICAgTFZNX0VRTkJfT04gICAgPSAxLAotICAgIExWTV9FUU5CX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX0VRTkJfTW9kZV9lbjsKK3R5cGVkZWYgZW51bSB7IExWTV9FUU5CX09GRiA9IDAsIExWTV9FUU5CX09OID0gMSwgTFZNX0VRTkJfRFVNTVkgPSBMVk1fTUFYRU5VTSB9IExWTV9FUU5CX01vZGVfZW47CiAKIC8qIEJhc3MgRW5oYW5jZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9CRV9PRkYgICA9IDAsCi0gICAgTFZNX0JFX09OICAgID0gMSwKLSAgICBMVk1fQkVfRFVNTVkgPSBMVk1fTUFYRU5VTQotfSBMVk1fQkVfTW9kZV9lbjsKK3R5cGVkZWYgZW51bSB7IExWTV9CRV9PRkYgPSAwLCBMVk1fQkVfT04gPSAxLCBMVk1fQkVfRFVNTVkgPSBMVk1fTUFYRU5VTSB9IExWTV9CRV9Nb2RlX2VuOwogCiAvKiBCYXNzIEVuaGFuY2VtZW50IGNlbnRyZSBmcmVxdWVuY3kgc2VsZWN0aW9uIGNvbnRyb2wgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9CRV9DRU5UUkVfNTVIeiAgPSAwLAotICAgIExWTV9CRV9DRU5UUkVfNjZIeiAgPSAxLAotICAgIExWTV9CRV9DRU5UUkVfNzhIeiAgPSAyLAotICAgIExWTV9CRV9DRU5UUkVfOTBIeiAgPSAzLAordHlwZWRlZiBlbnVtIHsKKyAgICBMVk1fQkVfQ0VOVFJFXzU1SHogPSAwLAorICAgIExWTV9CRV9DRU5UUkVfNjZIeiA9IDEsCisgICAgTFZNX0JFX0NFTlRSRV83OEh6ID0gMiwKKyAgICBMVk1fQkVfQ0VOVFJFXzkwSHogPSAzLAogICAgIExWTV9CRV9DRU5UUkVfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fQkVfQ2VudHJlRnJlcV9lbjsKIAogLyogQmFzcyBFbmhhbmNlbWVudCBIUEYgc2VsZWN0aW9uIGNvbnRyb2wgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9CRV9IUEZfT0ZGICAgPSAwLAotICAgIExWTV9CRV9IUEZfT04gICAgPSAxLAordHlwZWRlZiBlbnVtIHsKKyAgICBMVk1fQkVfSFBGX09GRiA9IDAsCisgICAgTFZNX0JFX0hQRl9PTiA9IDEsCiAgICAgTFZNX0JFX0hQRl9EVU1NWSA9IExWTV9NQVhFTlVNCiB9IExWTV9CRV9GaWx0ZXJTZWxlY3RfZW47CiAKIC8qIFZvbHVtZSBDb250cm9sIG9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fVkNfT0ZGICAgPSAwLAotICAgIExWTV9WQ19PTiAgICA9IDEsCi0gICAgTFZNX1ZDX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX1ZDX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fVkNfT0ZGID0gMCwgTFZNX1ZDX09OID0gMSwgTFZNX1ZDX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fVkNfTW9kZV9lbjsKIAogLyogVHJlYmxlIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fVEVfT0ZGICAgPSAwLAotICAgIExWTV9URV9PTiAgICA9IDEsCi0gICAgTFZNX1RFX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX1RFX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fVEVfT0ZGID0gMCwgTFZNX1RFX09OID0gMSwgTFZNX1RFX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fVEVfTW9kZV9lbjsKIAogLyogSGVhZHJvb20gbWFuYWdlbWVudCBvcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX0hFQURST09NX09GRiAgID0gMCwKLSAgICBMVk1fSEVBRFJPT01fT04gICAgPSAxLAordHlwZWRlZiBlbnVtIHsKKyAgICBMVk1fSEVBRFJPT01fT0ZGID0gMCwKKyAgICBMVk1fSEVBRFJPT01fT04gPSAxLAogICAgIExWTV9IZWFkcm9vbV9EVU1NWSA9IExWTV9NQVhFTlVNCiB9IExWTV9IZWFkcm9vbV9Nb2RlX2VuOwogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fUFNBX1NQRUVEX1NMT1csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgc2xvdyBzcGVlZCAqLwotICAgIExWTV9QU0FfU1BFRURfTUVESVVNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVhayBkZWNheWluZyBhdCBtZWRpdW0gc3BlZWQgKi8KLSAgICBMVk1fUFNBX1NQRUVEX0ZBU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgZmFzdCBzcGVlZCAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVk1fUFNBX1NQRUVEX1NMT1csICAgLyogUGVhayBkZWNheWluZyBhdCBzbG93IHNwZWVkICovCisgICAgTFZNX1BTQV9TUEVFRF9NRURJVU0sIC8qIFBlYWsgZGVjYXlpbmcgYXQgbWVkaXVtIHNwZWVkICovCisgICAgTFZNX1BTQV9TUEVFRF9GQVNULCAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgZmFzdCBzcGVlZCAqLwogICAgIExWTV9QU0FfU1BFRURfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fUFNBX0RlY2F5U3BlZWRfZW47CiAKLXR5cGVkZWYgZW51bQotewotICAgIExWTV9QU0FfT0ZGICAgPSAwLAotICAgIExWTV9QU0FfT04gICAgPSAxLAotICAgIExWTV9QU0FfRFVNTVkgPSBMVk1fTUFYRU5VTQotfSBMVk1fUFNBX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fUFNBX09GRiA9IDAsIExWTV9QU0FfT04gPSAxLCBMVk1fUFNBX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fUFNBX01vZGVfZW47CiAKIC8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgICAgICpwVmVyc2lvbk51bWJlcjsgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBmb3JtYXQgWC5ZWS5aWiAqLwotICAgIExWTV9DSEFSICAgICAgICAgICAgICAgICAgICAqcFBsYXRmb3JtOyAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBsaWJyYXJ5IHBsYXRmb3JtIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fQ0hBUiogcFZlcnNpb25OdW1iZXI7IC8qIFBvaW50ZXIgdG8gdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBmb3JtYXQgWC5ZWS5aWiAqLworICAgIExWTV9DSEFSKiBwUGxhdGZvcm07ICAgICAgLyogUG9pbnRlciB0byB0aGUgbGlicmFyeSBwbGF0Zm9ybSB0eXBlICovCiB9IExWTV9WZXJzaW9uSW5mb19zdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMjUsOTMgKzE4OCw4MCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fTWVtb3J5UmVnaW9uX3N0ICAgICAgICAgUmVnaW9uW0xWTV9OUl9NRU1PUllfUkVHSU9OU107ICAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KLX0gTFZNX01lbVRhYl90OwotCiAvKiBOLUJhbmQgZXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgR2FpbjsgICAgICAgICAgICAgICAgICAgLyogQmFuZCBnYWluIGluIGRCICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZyZXF1ZW5jeTsgICAgICAgICAgICAgIC8qIEJhbmQgY2VudHJlIGZyZXF1ZW5jeSBpbiBIeiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAvKiBCYW5kIHF1YWxpdHkgZmFjdG9yICh4MTAwKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQxNiBHYWluOyAgICAgICAvKiBCYW5kIGdhaW4gaW4gZEIgKi8KKyAgICBMVk1fVUlOVDE2IEZyZXF1ZW5jeTsgLyogQmFuZCBjZW50cmUgZnJlcXVlbmN5IGluIEh6ICovCisgICAgTFZNX1VJTlQxNiBRRmFjdG9yOyAgIC8qIEJhbmQgcXVhbGl0eSBmYWN0b3IgKHgxMDApICovCiB9IExWTV9FUU5CX0JhbmREZWZfdDsKIAogLyogSGVhZHJvb20gYmFuZCBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMaW1pdF9Mb3c7ICAgICAgICAgICAgICAvKiBMb3cgZnJlcXVlbmN5IGxpbWl0IG9mIHRoZSBiYW5kIGluIEhlcnR6ICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExpbWl0X0hpZ2g7ICAgICAgICAgICAgIC8qIEhpZ2ggZnJlcXVlbmN5IGxpbWl0IG9mIHRoZSBiYW5kIGluIEhlcnR6ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEhlYWRyb29tX09mZnNldDsgICAgICAgIC8qIEhlYWRyb29tID0gYmlnZ2VzdCBiYW5kIGdhaW4gLSBIZWFkcm9vbV9PZmZzZXQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fVUlOVDE2IExpbWl0X0xvdzsgICAgICAvKiBMb3cgZnJlcXVlbmN5IGxpbWl0IG9mIHRoZSBiYW5kIGluIEhlcnR6ICovCisgICAgTFZNX1VJTlQxNiBMaW1pdF9IaWdoOyAgICAgLyogSGlnaCBmcmVxdWVuY3kgbGltaXQgb2YgdGhlIGJhbmQgaW4gSGVydHogKi8KKyAgICBMVk1fSU5UMTYgSGVhZHJvb21fT2Zmc2V0OyAvKiBIZWFkcm9vbSA9IGJpZ2dlc3QgYmFuZCBnYWluIC0gSGVhZHJvb21fT2Zmc2V0ICovCiB9IExWTV9IZWFkcm9vbUJhbmREZWZfdDsKIAogLyogQ29udHJvbCBQYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlOyAgICAgICAgICAvKiBCdW5kbGUgb3BlcmF0aW5nIG1vZGUgT24vQnlwYXNzICovCi0gICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlICovCi0gICAgTFZNX0Zvcm1hdF9lbiAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsgICAgICAgICAgIC8qIElucHV0IGRhdGEgZm9ybWF0ICovCi0gICAgTFZNX091dHB1dERldmljZVR5cGVfZW4gICAgIFNwZWFrZXJUeXBlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLworICAgIExWTV9Nb2RlX2VuIE9wZXJhdGluZ01vZGU7ICAgICAgICAgICAvKiBCdW5kbGUgb3BlcmF0aW5nIG1vZGUgT24vQnlwYXNzICovCisgICAgTFZNX0ZzX2VuIFNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX0Zvcm1hdF9lbiBTb3VyY2VGb3JtYXQ7ICAgICAgICAgIC8qIElucHV0IGRhdGEgZm9ybWF0ICovCisgICAgTFZNX091dHB1dERldmljZVR5cGVfZW4gU3BlYWtlclR5cGU7IC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLwogCiAgICAgLyogQ29uY2VydCBTb3VuZCBWaXJ0dWFsaXplciBwYXJhbWV0ZXJzKi8KLSAgICBMVk1fTW9kZV9lbiAgICAgICAgICAgICAgICAgVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlOyAvKiBWaXJ0dWFsaXplciBvcGVyYXRpbmcgbW9kZSBPbi9PZmYgKi8KLSAgICBMVk1fVmlydHVhbGl6ZXJUeXBlX2VuICAgICAgVmlydHVhbGl6ZXJUeXBlOyAgICAgICAgICAvKiBWaXJ0dWFsaXplciB0eXBlOiBDb25jZXJ0U291bmQgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgVmlydHVhbGl6ZXJSZXZlcmJMZXZlbDsgICAvKiBWaXJ0dWFsaXplciByZXZlcmIgbGV2ZWwgaW4gJSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBDU19FZmZlY3RMZXZlbDsgICAgICAgICAgIC8qIENvbmNlcnQgU291bmQgZWZmZWN0IGxldmVsICovCisgICAgTFZNX01vZGVfZW4gVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlOyAgIC8qIFZpcnR1YWxpemVyIG9wZXJhdGluZyBtb2RlIE9uL09mZiAqLworICAgIExWTV9WaXJ0dWFsaXplclR5cGVfZW4gVmlydHVhbGl6ZXJUeXBlOyAvKiBWaXJ0dWFsaXplciB0eXBlOiBDb25jZXJ0U291bmQgKi8KKyAgICBMVk1fVUlOVDE2IFZpcnR1YWxpemVyUmV2ZXJiTGV2ZWw7ICAgICAgLyogVmlydHVhbGl6ZXIgcmV2ZXJiIGxldmVsIGluICUgKi8KKyAgICBMVk1fSU5UMTYgQ1NfRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgICAgLyogQ29uY2VydCBTb3VuZCBlZmZlY3QgbGV2ZWwgKi8KIAogICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwotICAgIExWTV9FUU5CX01vZGVfZW4gICAgICAgICAgICBFUU5CX09wZXJhdGluZ01vZGU7ICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIG9wZXJhdGluZyBtb2RlICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEVRTkJfTkJhbmRzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwotICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICAgICAqcEVRTkJfQmFuZERlZmluaXRpb247ICAvKiBQb2ludGVyIHRvIGVxdWFsaXNlciBkZWZpbml0aW9ucyAqLworICAgIExWTV9FUU5CX01vZGVfZW4gRVFOQl9PcGVyYXRpbmdNb2RlOyAgICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgb3BlcmF0aW5nIG1vZGUgKi8KKyAgICBMVk1fVUlOVDE2IEVRTkJfTkJhbmRzOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKyAgICBMVk1fRVFOQl9CYW5kRGVmX3QqIHBFUU5CX0JhbmREZWZpbml0aW9uOyAvKiBQb2ludGVyIHRvIGVxdWFsaXNlciBkZWZpbml0aW9ucyAqLwogCiAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gICAgTFZNX0JFX01vZGVfZW4gICAgICAgICAgICAgIEJFX09wZXJhdGluZ01vZGU7ICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgQkVfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBlZmZlY3QgbGV2ZWwgKi8KLSAgICBMVk1fQkVfQ2VudHJlRnJlcV9lbiAgICAgICAgQkVfQ2VudHJlRnJlcTsgICAgICAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgTFZNX0JFX0ZpbHRlclNlbGVjdF9lbiAgICAgIEJFX0hQRjsgICAgICAgICAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgaGlnaCBwYXNzIGZpbHRlciBzZWxlY3RvciAqLworICAgIExWTV9CRV9Nb2RlX2VuIEJFX09wZXJhdGluZ01vZGU7ICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KKyAgICBMVk1fSU5UMTYgQkVfRWZmZWN0TGV2ZWw7ICAgICAgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IGVmZmVjdCBsZXZlbCAqLworICAgIExWTV9CRV9DZW50cmVGcmVxX2VuIEJFX0NlbnRyZUZyZXE7IC8qIEJhc3MgRW5oYW5jZW1lbnQgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIExWTV9CRV9GaWx0ZXJTZWxlY3RfZW4gQkVfSFBGOyAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgaGlnaCBwYXNzIGZpbHRlciBzZWxlY3RvciAqLwogCiAgICAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBWQ19FZmZlY3RMZXZlbDsgICAgICAgICAvKiBWb2x1bWUgQ29udHJvbCBzZXR0aW5nIGluIGRCcyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBWQ19CYWxhbmNlOyAgICAgICAgICAgICAvKiBMZWZ0IFJpZ2h0IEJhbGFuY2UgY29udHJvbCBpbiBkQiAoLTk2IHRvIDk2IGRCKSwgLXZlIHZhbHVlcyByZWR1Y2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgY2hhbm5lbCB3aGlsZSArdmUgdmFsdWUgcmVkdWNlcyBMZWZ0IGNoYW5uZWwqLworICAgIExWTV9JTlQxNiBWQ19FZmZlY3RMZXZlbDsgLyogVm9sdW1lIENvbnRyb2wgc2V0dGluZyBpbiBkQnMgKi8KKyAgICBMVk1fSU5UMTYgVkNfQmFsYW5jZTsgICAgIC8qIExlZnQgUmlnaHQgQmFsYW5jZSBjb250cm9sIGluIGRCICgtOTYgdG8gOTYgZEIpLCAtdmUgdmFsdWVzIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgY2hhbm5lbCB3aGlsZSArdmUgdmFsdWUgcmVkdWNlcyBMZWZ0IGNoYW5uZWwqLwogCiAgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fVEVfTW9kZV9lbiAgICAgICAgICAgICAgVEVfT3BlcmF0aW5nTW9kZTsgICAgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IE9uL09mZiAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBURV9FZmZlY3RMZXZlbDsgICAgICAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgZ2FpbiBkQnMgKi8KKyAgICBMVk1fVEVfTW9kZV9lbiBURV9PcGVyYXRpbmdNb2RlOyAvKiBUcmVibGUgRW5oYW5jZW1lbnQgT24vT2ZmICovCisgICAgTFZNX0lOVDE2IFRFX0VmZmVjdExldmVsOyAgICAgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IGdhaW4gZEJzICovCiAKICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBwYXJhbWV0ZXJzIENvbnRyb2wgKi8KLSAgICBMVk1fUFNBX01vZGVfZW4gICAgICAgICAgICAgUFNBX0VuYWJsZTsKLSAgICBMVk1fUFNBX0RlY2F5U3BlZWRfZW4gICAgICAgUFNBX1BlYWtEZWNheVJhdGU7ICAgICAgLyogUGVhayB2YWx1ZSBkZWNheSByYXRlKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgIENoTWFzazsKLSNlbmRpZgorICAgIExWTV9QU0FfTW9kZV9lbiBQU0FfRW5hYmxlOworICAgIExWTV9QU0FfRGVjYXlTcGVlZF9lbiBQU0FfUGVha0RlY2F5UmF0ZTsgLyogUGVhayB2YWx1ZSBkZWNheSByYXRlKi8KKyAgICBMVk1fSU5UMzIgTnJDaGFubmVsczsKKyAgICBMVk1fSU5UMzIgQ2hNYXNrOwogCiB9IExWTV9Db250cm9sUGFyYW1zX3Q7CiAKIC8qIEluc3RhbmNlIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogR2VuZXJhbCAqLwotICAgIExWTV9CdWZmZXJNb2RlX2VuICAgICAgICAgICBCdWZmZXJNb2RlOyAgICAgICAgICAgICAvKiBCdWZmZXIgbWFuYWdlbWVudCBtb2RlICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gcHJvY2Vzc2luZyBibG9jayBzaXplICovCisgICAgTFZNX0J1ZmZlck1vZGVfZW4gQnVmZmVyTW9kZTsgLyogQnVmZmVyIG1hbmFnZW1lbnQgbW9kZSAqLworICAgIExWTV9VSU5UMTYgTWF4QmxvY2tTaXplOyAgICAgIC8qIE1heGltdW0gcHJvY2Vzc2luZyBibG9jayBzaXplICovCiAKICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEVRTkJfTnVtQmFuZHM7ICAgICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGVxdWFsaXNlciBiYW5kcyAqLworICAgIExWTV9VSU5UMTYgRVFOQl9OdW1CYW5kczsgLyogTWF4aW11bSBudW1iZXIgb2YgZXF1YWxpc2VyIGJhbmRzICovCiAKICAgICAvKiBQU0EgKi8KLSAgICBMVk1fUFNBX01vZGVfZW4gICAgICAgICAgICAgUFNBX0luY2x1ZGVkOyAgICAgICAgICAgIC8qIENvbnRyb2xzIHRoZSBpbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgUFNBOiBPTi9PRkYgKi8KKyAgICBMVk1fUFNBX01vZGVfZW4gUFNBX0luY2x1ZGVkOyAvKiBDb250cm9scyB0aGUgaW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFBTQTogT04vT0ZGICovCiB9IExWTV9JbnN0UGFyYW1zX3Q7CiAKIC8qIEhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSGVhZHJvb21fTW9kZV9lbiAgICAgICAgSGVhZHJvb21fT3BlcmF0aW5nTW9kZTsgLyogSGVhZHJvb20gQ29udHJvbCBPbi9PZmYgKi8KLSAgICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgICAgICAgKnBIZWFkcm9vbURlZmluaXRpb247ICAgLyogUG9pbnRlciB0byBoZWFkcm9vbSBiYW5kcyBkZWZpbml0aW9uICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE5IZWFkcm9vbUJhbmRzOyAgICAgICAgIC8qIE51bWJlciBvZiBoZWFkcm9vbSBiYW5kcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9IZWFkcm9vbV9Nb2RlX2VuIEhlYWRyb29tX09wZXJhdGluZ01vZGU7IC8qIEhlYWRyb29tIENvbnRyb2wgT24vT2ZmICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90KiBwSGVhZHJvb21EZWZpbml0aW9uOyAgLyogUG9pbnRlciB0byBoZWFkcm9vbSBiYW5kcyBkZWZpbml0aW9uICovCisgICAgTFZNX1VJTlQxNiBOSGVhZHJvb21CYW5kczsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGhlYWRyb29tIGJhbmRzICovCiAKIH0gTFZNX0hlYWRyb29tUGFyYW1zX3Q7CiAKQEAgLTMzOSw1NSArMjg5LDE4IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRWZXJzaW9uSW5mbyhMVk1fVmVyc2lvbkluZm9fc3QgICpwVmVyc2lvbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCi0vKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFZlcnNpb25JbmZvKExWTV9WZXJzaW9uSW5mb19zdCogcFZlcnNpb24pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgaW5zdGFuY2UgICovCi0vKiAgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzk5LDkgKzMxMiwyNCBAQAogLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoTFZNX0hhbmRsZV90ICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1UYWJfdCAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgKnBJbnN0UGFyYW1zKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCogcGhJbnN0YW5jZSwgTFZNX0luc3RQYXJhbXNfdCogcEluc3RQYXJhbXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgaW5zdGFuY2UgICovCisvKiAgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWTV9EZWxJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QqIHBoSW5zdGFuY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDIxLDcgKzM0OSw3IEBACiAvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9DbGVhckF1ZGlvQnVmZmVycyhMVk1fSGFuZGxlX3QgIGhJbnN0YW5jZSk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9DbGVhckF1ZGlvQnVmZmVycyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ0Myw4ICszNzEsNyBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDY2LDggKzM5Myw3IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00OTksMTEgKzQyNSw4IEBACiAvKiAgICAgIFNURVJFTyAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGUgcGFpcnMgaW4gdGhlIGJsb2NrICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcywgTFZNX1VJTlQzMiBBdWRpb1RpbWUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTI0LDggKzQ0Nyw4IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QqIHBIZWFkcm9vbVBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NDYsOCArNDY5LDggQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEhlYWRyb29tUGFyYW1zKCAgTFZNX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCAgICAqcEhlYWRyb29tUGFyYW1zKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEhlYWRyb29tUGFyYW1zKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCogcEhlYWRyb29tUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU3NCwxMCArNDk3LDggQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFNwZWN0cnVtKCBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBDdXJyZW50UGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBQYXN0UGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFNwZWN0cnVtKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9VSU5UOCogcEN1cnJlbnRQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCogcFBhc3RQZWFrcywgTFZNX0lOVDMyIEF1ZGlvVGltZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OTksOCArNTIwLDYgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nKCBMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCi0jZW5kaWYgICAgICAvKiBfX0xWTV9IX18gKi8KLQorI2VuZGlmIC8qIF9fTFZNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmNwcAppbmRleCBlMjQxY2RkLi5jZWE5NjRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmNwcApAQCAtNDcsNjkgKzQ3LDUyIEBACiAvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwQ3VycmVudFBlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBQYXN0UGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBdWRpb1RpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICAgKnBJbnN0YW5jZSAgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFNwZWN0cnVtKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9VSU5UOCogcEN1cnJlbnRQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCogcFBhc3RQZWFrcywgTFZNX0lOVDMyIEF1ZGlvVGltZSkgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAotICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgKmhQU0FJbnN0YW5jZTsKLSAgICBMVlBTQV9SRVRVUk4gICAgICAgICAgIExWUFNBX1N0YXR1czsKKyAgICBwTFZQU0FfSGFuZGxlX3QqIGhQU0FJbnN0YW5jZTsKKyAgICBMVlBTQV9SRVRVUk4gTFZQU0FfU3RhdHVzOwogCi0gICAgaWYocEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlID09IExWTV9OVUxMKSB7CiAgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgLypJZiBQU0EgaXMgbm90IGluY2x1ZGVkIGF0IHRoZSB0aW1lIG9mIGluc3RhbmNlIGNyZWF0aW9uLCByZXR1cm4gd2l0aG91dCBhbnkgcHJvY2Vzc2luZyovCi0gICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCE9TFZNX1BTQV9PTikKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgIT0gTFZNX1BTQV9PTikgewogICAgICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CiAgICAgfQogCi0gICAgaFBTQUluc3RhbmNlID0gKHBMVlBTQV9IYW5kbGVfdCAqKXBJbnN0YW5jZS0+aFBTQUluc3RhbmNlOworICAgIGhQU0FJbnN0YW5jZSA9IChwTFZQU0FfSGFuZGxlX3QqKXBJbnN0YW5jZS0+aFBTQUluc3RhbmNlOwogCi0gICAgaWYoKHBDdXJyZW50UGVha3MgPT0gTFZNX05VTEwpIHx8Ci0gICAgICAgIChwUGFzdFBlYWtzID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChwQ3VycmVudFBlYWtzID09IExWTV9OVUxMKSB8fCAocFBhc3RQZWFrcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKICAgICB9CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSBuZXcgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKICAgICB9CiAKICAgICAvKiBJZiBQU0EgbW9kdWxlIGlzIGRpc2FibGVkLCBkbyBub3RoaW5nICovCi0gICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZT09TFZNX1BTQV9PRkYpCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT0ZGKSB7CiAgICAgICAgIHJldHVybiBMVk1fQUxHT1JJVEhNRElTQUJMRUQ7CiAgICAgfQogCi0gICAgTFZQU0FfU3RhdHVzID0gTFZQU0FfR2V0U3BlY3RydW0oaFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVlBTQV9UaW1lKSAoQXVkaW9UaW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQ4KikgcEN1cnJlbnRQZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQ4KikgcFBhc3RQZWFrcyApOworICAgIExWUFNBX1N0YXR1cyA9IExWUFNBX0dldFNwZWN0cnVtKGhQU0FJbnN0YW5jZSwgKExWUFNBX1RpbWUpKEF1ZGlvVGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopcEN1cnJlbnRQZWFrcywgKExWTV9VSU5UOCopcFBhc3RQZWFrcyk7CiAKLSAgICBpZihMVlBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCi0gICAgewotICAgICAgICBpZihMVlBTQV9TdGF0dXMgPT0gTFZQU0FfRVJST1JfV1JPTkdUSU1FKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9XUk9OR0FVRElPVElNRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX05VTExBRERSRVNTOworICAgIGlmIChMVlBTQV9TdGF0dXMgIT0gTFZQU0FfT0spIHsKKyAgICAgICAgaWYgKExWUFNBX1N0YXR1cyA9PSBMVlBTQV9FUlJPUl9XUk9OR1RJTUUpIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX1JldHVyblN0YXR1c19lbilMVk1fV1JPTkdBVURJT1RJTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZNX05VTExBRERSRVNTOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWTV9TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzIsMTUgKzExNSwxMiBAQAogLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Vm9sdW1lTm9TbW9vdGhpbmcoIExWTV9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Vm9sdW1lTm9TbW9vdGhpbmcoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEVycm9yOwogCiAgICAgLypBcHBseSBuZXcgY29udHJvbHMqLwotICAgIEVycm9yID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKGhJbnN0YW5jZSxwUGFyYW1zKTsKKyAgICBFcnJvciA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UsIHBQYXJhbXMpOwogICAgIHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPSBMVk1fVFJVRTsKICAgICByZXR1cm4gRXJyb3I7CiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmNwcAppbmRleCAzYWVkZGJiLi5mYmIwZmUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuY3BwCkBAIC00OSwxMDkgKzQ5LDkwIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWTV9CdWZmZXJNYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICoqcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSU5UMTYgICAgICAgIFNhbXBsZUNvdW50OyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkIHRoaXMgY2FsbCAqLwotICAgIExWTV9JTlQxNiAgICAgICAgTnVtU2FtcGxlczsgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBzY3JhdGNoIGJ1ZmZlciAqLwotICAgIExWTV9GTE9BVCAgICAgICAgKnBTdGFydDsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAqcERlc3Q7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7Ci0jZWxzZQotICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwotI2VuZGlmCit2b2lkIExWTV9CdWZmZXJNYW5hZ2VkSW4oTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLCBMVk1fRkxPQVQqKiBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCoqIHBQcm9jZXNzZWQsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKSB7CisgICAgTFZNX0lOVDE2IFNhbXBsZUNvdW50OyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgdGhpcyBjYWxsICovCisgICAgTFZNX0lOVDE2IE51bVNhbXBsZXM7ICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBzY3JhdGNoIGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCogcFN0YXJ0OworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fQnVmZmVyX3QqIHBCdWZmZXI7CisgICAgTFZNX0ZMT0FUKiBwRGVzdDsKKyAgICBMVk1fSU5UMTYgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCiAgICAgICovCi0gICAgcEJ1ZmZlciAgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OwotICAgIHBEZXN0ICAgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgcEJ1ZmZlciA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgcERlc3QgPSBwQnVmZmVyLT5wU2NyYXRjaDsKICAgICAqcFRvUHJvY2VzcyA9IHBCdWZmZXItPnBTY3JhdGNoOwogICAgICpwUHJvY2Vzc2VkID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkgewogICAgICAgICAvKgogICAgICAgICAgKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayBvZiBzYW1wbGVzCiAgICAgICAgICAqLwogICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKyBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7Ci0gICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9IChMVk1fRkxPQVQgKilwSW5EYXRhOwotICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgICAgPSBMVk1fRklSU1RDQUxMOworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgPSAoTFZNX0ZMT0FUKilwSW5EYXRhOworICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVENBTEw7CiAgICAgfQotICAgIHBTdGFydCA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgKi8KLSAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIHRvIG91dHB1dCBpcyBzYW1lIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIHJlYWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworICAgIHBTdGFydCA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyAqLworICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IDA7ICAgICAgLyogU2FtcGxlcyB0byBvdXRwdXQgaXMgc2FtZSBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIHJlYWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsIGFuZCB1cGRhdGUgdGhlIGJ1ZmZlciBzdGF0ZQogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkgewogICAgICAgICAvKgogICAgICAgICAgKiBQcm9jZXNzIHRoZSBtYXhpbXVtIGJvY2sgc2l6ZSBvZiBzYW1wbGVzLgogICAgICAgICAgKi8KICAgICAgICAgU2FtcGxlQ291bnQgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgIH0gZWxzZSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIExhc3QgY2FsbCBmb3IgdGhlIGJsb2NrLCBzbyBjYWxjdWxhdGUgaG93IG1hbnkgZnJhbWVzIGFuZCBzYW1wbGVzIHRvIHByb2Nlc3MKLSAgICAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYgICBOdW1GcmFtZXM7CisgICAgICAgICAqLworICAgICAgICBMVk1fSU5UMTYgTnVtRnJhbWVzOwogCi0gICAgICAgIE51bVNhbXBsZXMgID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOwotICAgICAgICBOdW1GcmFtZXMgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKKyAgICAgICAgTnVtRnJhbWVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CiAgICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikoTnVtRnJhbWVzIDw8IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1ZmZlciBzdGF0ZQogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHsKICAgICAgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUTEFTVENBTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9MQVNUQ0FMTDsKICAgICAgICAgfQogICAgIH0KLSAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgIC8qIFNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgKi8KKyAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgLyogU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCAqLwogCiAgICAgLyoKICAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgZGVsYXkgYnVmZmVyIGFzIHJlcXVpcmVkCiAgICAgICovCi0gICAgaWYgKCgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwKLSAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkgJiYKLSAgICAgICAgKHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICE9IDApKQotICAgIHsKLSAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgIC8qIE51bWJlciBvZiBkZWxheSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgaWYgKCgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkgJiYKKyAgICAgICAgKHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICE9IDApKSB7CisgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLCBsZWZ0IGFuZCByaWdodCAqLwogICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHNhbXBsZSBjb3VudCAqLwotICAgICAgICBwRGVzdCArPSBOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAgICAgIC8qIFVwZGF0ZSB0aGUgZGVzdGluYXRpb24gcG9pbnRlciAqLworICAgICAgICBwRGVzdCArPSBOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHNhbXBsZXMgZm9yIHRoaXMgY2FsbCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKICAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IDApCi0gICAgewotICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7ICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgcFN0YXJ0ICs9IE51bUNoYW5uZWxzICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IDApIHsKKyAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7IC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBTdGFydCArPSBOdW1DaGFubmVscyAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgaW5wdXQgcG9pbnRlciAqLwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFVwZGF0ZSB0aGUgaW5wdXQgZGF0YSBwb2ludGVyIGFuZCBzYW1wbGVzIHRvIG91dHB1dApAQCAtMTYxLDMzICsxNDIsMzAgQEAKICAgICB9CiAKICAgICAvKgotICAgICAgKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCBhbmQgaW5wdXQgcG9pbnRlcgorICAgICAqIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50IGFuZCBpbnB1dCBwb2ludGVyCiAgICAgICovCiAgICAgLyogVXBkYXRlIHRoZSBjb3VudCBvZiBzYW1wbGVzICovCi0gICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsKLSAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgID0gcFN0YXJ0OyAvKiBVcGRhdGUgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7CisgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzID0gcFN0YXJ0OyAvKiBVcGRhdGUgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KIAogICAgIC8qCiAgICAgICogU2F2ZSBzYW1wbGVzIHRvIHRoZSBkZWxheSBidWZmZXIgaWYgYW55IGxlZnQgdW5wcm9jZXNzZWQKICAgICAgKi8KLSAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSB8fAotICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0xBU1RDQUxMKSkKLSAgICB7CisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpIHsKICAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKLSAgICAgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICAgICAgICBwU3RhcnQgICAgKz0gTnVtQ2hhbm5lbHMgKiBTYW1wbGVDb3VudDsgLyogT2Zmc2V0IGJ5IHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSAgICAgICAgaWYgKE51bVNhbXBsZXMgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7ICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgcFN0YXJ0ID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgIC8qIFN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgICAgICAgcFN0YXJ0ICs9IE51bUNoYW5uZWxzICogU2FtcGxlQ291bnQ7IC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApIHsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7IC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCiAgICAgICAgIH0KIAogICAgICAgICAvKgogICAgICAgICAgKiBVcGRhdGUgdGhlIGRlbGF5IHNhbXBsZSBjb3VudAogICAgICAgICAgKi8KLSAgICAgICAgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgICAgID0gTnVtU2FtcGxlczsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZSBwYWlycyAqLwotICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgU2FtcGxlcyB1c2VkICovCisgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gTnVtU2FtcGxlczsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZSBwYWlycyAqLworICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KICAgICB9CiB9CiAKQEAgLTIxMywzMyArMTkxLDI1IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKipwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqKnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwordm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiogcFRvUHJvY2VzcywgTFZNX0ZMT0FUKiogcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsgICAgLyogR2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGZpcnN0IGNhbGwgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKnBUb1Byb2Nlc3M7ICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgSS9PIHBvaW50ZXJzICovCi0gICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICAgPSAqcFByb2Nlc3NlZDsKKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApIHsKKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7IC8qIEdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmaXJzdCBjYWxsICovCisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyA9ICpwVG9Qcm9jZXNzOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIEkvTyBwb2ludGVycyAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gKnBQcm9jZXNzZWQ7CiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcwogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpIHsKICAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjksMzIgKzI5OSwxNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVySW4oTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwgTFZNX0ZMT0FUKiogcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCoqIHBQcm9jZXNzZWQsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbihoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbihoSW5zdGFuY2UsIHBJbkRhdGEsIHBUb1Byb2Nlc3MsIHBQcm9jZXNzZWQsIHBOdW1TYW1wbGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oaEluc3RhbmNlLCBwVG9Qcm9jZXNzLCBwUHJvY2Vzc2VkLCBwTnVtU2FtcGxlcyk7CiAgICAgfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNzcsMTk2ICszMzIsMTI0IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWTV9CdWZmZXJNYW5hZ2VkT3V0KExWTV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0J1ZmZlcl90ICAgICpwQnVmZmVyICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKLSAgICBMVk1fSU5UMTYgICAgICAgU2FtcGxlQ291bnQgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsKLSAgICBMVk1fSU5UMTYgICAgICAgTnVtU2FtcGxlczsKLSAgICBMVk1fRkxPQVQgICAgICAgKnBTdGFydDsKLSAgICBMVk1fRkxPQVQgICAgICAgKnBEZXN0OwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fSU5UMzIgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRPdXQoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiogcE51bVNhbXBsZXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90KiBwQnVmZmVyID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKKyAgICBMVk1fSU5UMTYgU2FtcGxlQ291bnQgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsKKyAgICBMVk1fSU5UMTYgTnVtU2FtcGxlczsKKyAgICBMVk1fRkxPQVQqIHBTdGFydDsKKyAgICBMVk1fRkxPQVQqIHBEZXN0OworICAgIExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwogI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQogI2RlZmluZSBGcmFtZUNvdW50IFNhbXBsZUNvdW50Ci0jZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwb2ludGVycwogICAgICAqLwogICAgIE51bVNhbXBsZXMgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7Ci0gICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOworICAgIHBTdGFydCA9IHBCdWZmZXItPnBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBjaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCi0gICAgICAqLwotICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwKLSAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkKLSAgICB7CisgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fCAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKSB7CiAgICAgICAgIC8qIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrICovCi0gICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwT3V0RGF0YTsgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGRlc3RpbmF0aW9uICovCisgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwT3V0RGF0YTsgLyogSW5pdGlhbGlzZSB0aGUgZGVzdGluYXRpb24gKi8KICAgICB9Ci0gICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgb3V0cHV0IGFkZHJlc3MgKi8KKyAgICBwRGVzdCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7IC8qIFNldCB0aGUgb3V0cHV0IGFkZHJlc3MgKi8KIAogICAgIC8qCiAgICAgICogSWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vbi16ZXJvIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHNhbXBsZXMgdG8gc2VuZCB0bwogICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICovCi0gICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCi0gICAgICAgIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkpCi0gICAgeworICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIENvcHkgdGhlIGRlbGF5ZWQgb3V0cHV0IGJ1ZmZlciBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICovCi0gICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPD0gTnVtU2FtcGxlcykKLSAgICAgICAgeworICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7Ci0jZWxzZQotICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLSNlbmRpZgogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbHNlCi0gICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBTYW1wbGVzIGxlZnQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZW5kICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLSNlbHNlCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwotI2VuZGlmCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotI2Vsc2UKLSAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBOdW1TYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbmRpZgogICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KICAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogUmVhbGlnbiB0aGUgZGVsYXkgYnVmZmVyIGRhdGEgdG8gYXZvaWQgdXNpbmcgY2lyY3VsYXIgYnVmZmVyIG1hbmFnZW1lbnQKICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyW05yQ2hhbm5lbHMgKiBOckZyYW1lc10sICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogTnJGcmFtZXNdLCAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOwotI2Vsc2UKLSAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBOdW1TYW1wbGVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCi0jZW5kaWYKLSAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDb3B5IHRoZSBwcm9jZXNzZWQgcmVzdWx0cyB0byB0aGUgb3V0cHV0CiAgICAgICovCi0gICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCi0gICAgICAgIChTYW1wbGVDb3VudCAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGlmIChTYW1wbGVDb3VudCA8PSBOdW1TYW1wbGVzKQotICAgICAgICB7CisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmIChTYW1wbGVDb3VudCAhPSAwKSkgeworICAgICAgICBpZiAoU2FtcGxlQ291bnQgPD0gTnVtU2FtcGxlcykgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgYWxsIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbHNlCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0jZW5kaWYKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gTnJDaGFubmVscyAqIEZyYW1lQ291bnQ7ICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbHNlCi0gICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotI2VuZGlmCi0gICAgICAgICAgICBOdW1TYW1wbGVzICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBTYW1wbGVDb3VudCk7ICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCi0gICAgICAgICAgICBTYW1wbGVDb3VudCA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogRnJhbWVDb3VudDsgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIFNhbXBsZUNvdW50KTsgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0jZWxzZQotICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotI2VuZGlmCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGFuZCBzYW1wbGUgY291bnRzCi0gICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgIHBTdGFydCAgICAgICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbHNlCi0gICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotI2VuZGlmCi0gICAgICAgICAgICBTYW1wbGVDb3VudCAgPSAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCAtIE51bVNhbXBsZXMpOyAvKiBQcm9jZXNzZWQgc2FtcGxlcyBsZWZ0ICovCi0gICAgICAgICAgICBOdW1TYW1wbGVzICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBTdGFydCArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCAtIE51bVNhbXBsZXMpOyAvKiBQcm9jZXNzZWQgc2FtcGxlcyBsZWZ0ICovCisgICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzYW1wbGUgY291bnQgKi8KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qCiAgICAgICogQ29weSB0aGUgcmVtYWluaW5nIHByb2Nlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyCiAgICAgICovCi0gICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCi0gICAgewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKSB7CisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotI2Vsc2UKLSAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbmRpZgorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwogICAgICAgICAvKiBVcGRhdGUgdGhlIGJ1ZmZlciBjb3VudCAqLwogICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgKyBTYW1wbGVDb3VudCk7CiAgICAgfQpAQCAtNTc0LDEwICs0NTcsMTAgQEAKICAgICAvKgogICAgICAqIHBvaW50ZXJzLCBjb3VudHMgYW5kIHNldCBkZWZhdWx0IGJ1ZmZlciBwcm9jZXNzaW5nCiAgICAgICovCi0gICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICA9IE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCi0gICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBEZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgPSBMVk1fTUFYQkxPQ0tDQUxMOyAgICAgICAgICAgICAgICAgICAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIHNpemUgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSBOdW1TYW1wbGVzOyAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBEZXN0OyAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9NQVhCTE9DS0NBTEw7IC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIHNpemUgKi8KICAgICAvKiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBsb29wIHdoZW4gYWxsIHNhbXBsZXMgcHJvY2Vzc2VkICovCiAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOwogfQpAQCAtNjAxLDQ0ICs0ODQsMzEgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwotICAgIGlmIChOdW1DaGFubmVscyA9PSAxKQotICAgIHsKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZE91dChMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMTYgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisgICAgaWYgKE51bUNoYW5uZWxzID09IDEpIHsKICAgICAgICAgLyogTW9ubyBpbnB1dCBpcyBwcm9jZXNzZWQgYXMgc3RlcmVvIGJ5IExWTSBtb2R1bGUgKi8KICAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwogICAgIH0KICN1bmRlZiBOckZyYW1lcwotI2RlZmluZSBOckZyYW1lcyAoKnBOdW1TYW1wbGVzKSAvLyBhbGlhcyBmb3IgY2xhcml0eQotI2Vsc2UKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0gMjsKLSNlbmRpZgorI2RlZmluZSBOckZyYW1lcyAoKnBOdW1TYW1wbGVzKSAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKIAogICAgIC8qCiAgICAgICogVXBkYXRlIHNhbXBsZSBjb3VudHMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogTnVtQ2hhbm5lbHMpOyAvKiBVcGRhdGUgdGhlIEkvTyBwb2ludGVycyAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgKz0gKExWTV9JTlQxNikoTnJGcmFtZXMgKiBOdW1DaGFubmVscyk7Ci0jZWxzZQotICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiAyKTsKLSNlbmRpZgotICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSAqcE51bVNhbXBsZXMpOyAvKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCAqLworICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyArPQorICAgICAgICAgICAgKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogTnVtQ2hhbm5lbHMpOyAvKiBVcGRhdGUgdGhlIEkvTyBwb2ludGVycyAqLworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgKz0gKExWTV9JTlQxNikoTnJGcmFtZXMgKiBOdW1DaGFubmVscyk7CisgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0KKyAgICAgICAgICAgIChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtICpwTnVtU2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50ICovCiAKICAgICAvKgogICAgICAqIFNldCB0ZSBibG9jayBzaXplIHRvIHByb2Nlc3MKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpIHsKICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CiAgICAgfQogfQpAQCAtNjk4LDI1ICs1NjgsMTUgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkT3V0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZE91dChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKSB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkT3V0KGhJbnN0YW5jZSwgcE91dERhdGEsIHBOdW1TYW1wbGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwgcE51bVNhbXBsZXMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAppbmRleCA4MTJmOGU1Li5jMDJjYWExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCkBAIC0yNCw4MzIgKzI0LDgzMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgVHJlYmxlQm9vc3RDb3JuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMAotI2RlZmluZSBUcmVibGVCb29zdE1pblJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgVHJlYmxlQm9vc3RDb3JuZXIgODAwMAorI2RlZmluZSBUcmVibGVCb29zdE1pblJhdGUgNAorI2RlZmluZSBUcmVibGVCb29zdFN0ZXBzIDE1CiAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDM4NDM0Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMxNTk5Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wODE1NTcKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yODg0NzUKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTk0MwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI0MDA5MAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTg0MjMyCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTg1ODAxCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNDUxNDUKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjQ4ODcKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxMzQ5MQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA1NjU0MQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzkwMTc3Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMjAxNDQpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NzYyMTkKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjEwNjE4NykKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU3Mjc2MQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjAyNzI4KQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MTA4MgotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzExMDQ5KQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgwMjYyMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNDMyNTg4KQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkzODk4OQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTY4OTU2KQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5MTk5NwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzIxOTY0KQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI2MzY3NAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODkzNjQxKQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ1NjMwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDg2MjY3KQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMCAxLjAzODQzNAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMSAwLjMzMTU5OQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMCAxLjA4MTU1NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMSAwLjI4ODQ3NQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAxLjEyOTk0MworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMSAwLjI0MDA5MAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMCAxLjE4NDIzMgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMSAwLjE4NTgwMQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMCAxLjI0NTE0NQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMSAwLjEyNDg4NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAxLjMxMzQ5MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMSAwLjA1NjU0MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMCAxLjM5MDE3NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMSAoLTAuMDIwMTQ0KQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMCAxLjQ3NjIxOQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMSAoLTAuMTA2MTg3KQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMCAxLjU3Mjc2MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMSAoLTAuMjAyNzI4KQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwIDEuNjgxMDgyCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMSAoLTAuMzExMDQ5KQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwIDEuODAyNjIwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMSAoLTAuNDMyNTg4KQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EwIDEuOTM4OTg5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAoLTAuNTY4OTU2KQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwIDIuMDkxOTk3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMSAoLTAuNzIxOTY0KQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwIDIuMjYzNjc0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMSAoLTAuODkzNjQxKQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EwIDIuNDU2MzAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAoLTEuMDg2MjY3KQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAwLjAwMDAwMAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyNDAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNDQ2NjIKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjMyODcKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NDc3MwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE3MzE3NgotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTUwOTk5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTE2OTUwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMTQwODYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNTM4NjMKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI4NDg3MAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDE2OTIxKQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjQyOTEKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDk2MzQyKQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDUzNDAzCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xODU0NTQpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41NTMzODkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI4NTQ0MCkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY2NTU3NAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzk3NjI1KQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc5MTQ0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTIzNDk5KQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkzMjY4MgotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjY0NzMzKQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5MTE0OAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODIzMTk5KQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI2ODk1MAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDAxMDAxKQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ2ODQ0NwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjAwNDk4KQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY5MjI4NwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNDI0MzM4KQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMCAxLjA0NDY2MgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMSAwLjIyMzI4NworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMCAxLjA5NDc3MworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAwLjE3MzE3NgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMCAxLjE1MDk5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMSAwLjExNjk1MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMCAxLjIxNDA4NgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMSAwLjA1Mzg2MworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMCAxLjI4NDg3MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMSAoLTAuMDE2OTIxKQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMCAxLjM2NDI5MQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMSAoLTAuMDk2MzQyKQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMCAxLjQ1MzQwMworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMSAoLTAuMTg1NDU0KQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMCAxLjU1MzM4OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMSAoLTAuMjg1NDQwKQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMCAxLjY2NTU3NAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMSAoLTAuMzk3NjI1KQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMSAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EwIDEuNzkxNDQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAoLTAuNTIzNDk5KQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0EwIDEuOTMyNjgyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMSAoLTAuNjY0NzMzKQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwIDIuMDkxMTQ4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMSAoLTAuODIzMTk5KQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EwIDIuMjY4OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAoLTEuMDAxMDAxKQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0EwIDIuNDY4NDQ3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMSAoLTEuMjAwNDk4KQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwIDIuNjkyMjg3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMSAoLTEuNDI0MzM4KQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMiAwLjAwMDAwMAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAzMjAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNjEwMDkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjA2MTAwOSkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjk0NjMKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xMjk0NjMpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA2MjY3Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjA2MjY3KQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjkyNDQ3Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yOTI0NDcpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zODkxNDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM4OTE0MCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40OTc2MzEKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40OTc2MzEpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjE5MzYxCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjE5MzYxKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc1NTk0MwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc1NTk0MykKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MDkxOTEKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45MDkxOTEpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA4MTEzOQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjA4MTEzOSkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yNzQwNjcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI3NDA2NykKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ5MDUzNgotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40OTA1MzYpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNzMzNDE4Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43MzM0MTgpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDA1OTM2Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wMDU5MzYpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zMTE3MDcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMzExNzA3KQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMCAxLjA2MTAwOQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAoLTAuMDYxMDA5KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMCAxLjEyOTQ2MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMSAoLTAuMTI5NDYzKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAxLjIwNjI2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMSAoLTAuMjA2MjY3KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMCAxLjI5MjQ0NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMSAoLTAuMjkyNDQ3KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMCAxLjM4OTE0MAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMSAoLTAuMzg5MTQwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAxLjQ5NzYzMQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMSAoLTAuNDk3NjMxKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMCAxLjYxOTM2MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMSAoLTAuNjE5MzYxKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMCAxLjc1NTk0MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMSAoLTAuNzU1OTQzKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAxLjkwOTE5MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMSAoLTAuOTA5MTkxKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMSAoLTAuMDAwMDAwKQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwIDIuMDgxMTM5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMSAoLTEuMDgxMTM5KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EwIDIuMjc0MDY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMSAoLTEuMjc0MDY3KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwIDIuNDkwNTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAoLTEuNDkwNTM2KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwIDIuNzMzNDE4CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMSAoLTEuNzMzNDE4KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwIDMuMDA1OTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMSAoLTIuMDA1OTM2KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0EwIDMuMzExNzA3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAoLTIuMzExNzA3KQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9CMiAwLjAwMDAwMAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0NDEwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNzQzNjQKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI5MzI1NykKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE1NzgwMQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzc2Njk1KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTE0MjAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNDcwMzEzKQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzU2NDYxCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzUzNTUpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NzQzMjAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY5MzIxMykKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjA2NTU5Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjgyNTQ1MykKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzU0OTM1Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3MzgyOCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkyMTQxNAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTQwMzA4KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTA4MjA4Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4zMjcxMDEpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMTc3OTMKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTM2Njg3KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTUyOTUyCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjc3MTg0NikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxNjgwNQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wMzU2OTgpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTEyODUyCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zMzE3NDYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NDUwMjMKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjYzOTE2KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuODE3NzI0Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjAzNjYxOCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgMS4wNzQzNjQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTEgKC0wLjI5MzI1NykKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTAgMS4xNTc4MDEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgKC0wLjM3NjY5NSkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTAgMS4yNTE0MjAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTEgKC0wLjQ3MDMxMykKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgMS4zNTY0NjEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTEgKC0wLjU3NTM1NSkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTAgMS40NzQzMjAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTEgKC0wLjY5MzIxMykKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTAgMS42MDY1NTkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTEgKC0wLjgyNTQ1MykKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTAgMS43NTQ5MzUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTEgKC0wLjk3MzgyOCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTAgMS45MjE0MTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgKC0xLjE0MDMwOCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTAgMi4xMDgyMDgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTEgKC0xLjMyNzEwMSkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgKC0wLjIxODg5NCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAyLjMxNzc5MworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTEgKC0xLjUzNjY4NykKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCAyLjU1Mjk1MgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgKC0xLjc3MTg0NikKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCAyLjgxNjgwNQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTEgKC0yLjAzNTY5OCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAzLjExMjg1MgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTEgKC0yLjMzMTc0NikKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCAzLjQ0NTAyMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgKC0yLjY2MzkxNikKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCAzLjgxNzcyNAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTEgKC0zLjAzNjYxOCkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQjIgMC4wMDAwMDAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgNDgwMDBIeiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NzM1NwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM0NTMwNikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNjQxNTIKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40MzIxMDEpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjYxNTM4Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTI5NDg4KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNzA4MDcKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjM4NzU3KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40OTM0MDkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzYxMzU5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjMwOTcxCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44OTg5MjApCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43ODUzMTgKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjA1MzI2NykKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTU4NDk4Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjIyNjQ0NykKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNTI4MDkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40MjA3NTgpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAyLjM3MDgyOQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjYzODc3OCkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjYxNTQ1MgotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS44ODM0MDEpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44ODk5MjQKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMTU3ODczKQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjE5Nzg4NgotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNDY1ODM1KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNTQzNDI1Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjgxMTM3NCkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTMxMTI3Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMTk5MDc2KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMCAxLjA3NzM1NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAoLTAuMzQ1MzA2KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMCAxLjE2NDE1MgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMSAoLTAuNDMyMTAxKQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAxLjI2MTUzOAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMSAoLTAuNTI5NDg4KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMCAxLjM3MDgwNworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAoLTAuNjM4NzU3KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMCAxLjQ5MzQwOQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMSAoLTAuNzYxMzU5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMCAxLjYzMDk3MQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMSAoLTAuODk4OTIwKQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMCAxLjc4NTMxOAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAoLTEuMDUzMjY3KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMCAxLjk1ODQ5OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMSAoLTEuMjI2NDQ3KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAyLjE1MjgwOQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMSAoLTEuNDIwNzU4KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMSAoLTAuMjY3OTQ5KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwIDIuMzcwODI5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMSAoLTEuNjM4Nzc4KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EwIDIuNjE1NDUyCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMSAoLTEuODgzNDAxKQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwIDIuODg5OTI0CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMSAoLTIuMTU3ODczKQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EwIDMuMTk3ODg2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMSAoLTIuNDY1ODM1KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwIDMuNTQzNDI1CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMSAoLTIuODExMzc0KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwIDMuOTMxMTI3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAoLTMuMTk5MDc2KQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMiAwLjAwMDAwMAogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDg4MjAwICovCiAvKiBHYWluID0gMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk0Mzc0ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY0MTI1NmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0EwIDEuMDk0Mzc0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMSAoLTAuNjQxMjU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDAyNjRmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ3MTQ2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTAgMS4yMDAyNjRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0ExICgtMC43NDcxNDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxOTA3NGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44NjU5NTZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMCAxLjMxOTA3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTEgKC0wLjg2NTk1NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDUyMzgwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk5OTI2M2YpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0EwIDEuNDUyMzgwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMSAoLTAuOTk5MjYzZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDE5NTNmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTQ4ODM2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTAgMS42MDE5NTNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0ExICgtMS4xNDg4MzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc2OTc3N2YKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4zMTY2NTlmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMCAxLjc2OTc3N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTEgKC0xLjMxNjY1OWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTU4MDc4ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjUwNDk2MGYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0EwIDEuOTU4MDc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMSAoLTEuNTA0OTYwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjkzNTVmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzE2MjM4ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTAgMi4xNjkzNTVmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0ExICgtMS43MTYyMzhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQwNjQxMmYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTMyOTVmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMCAyLjQwNjQxMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTEgKC0xLjk1MzI5NWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi42NzIzOTVmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjIxOTI3N2YpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCAyLjY3MjM5NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0ExICgtMi4yMTkyNzdmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTcwODMyZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi41MTc3MTRmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTAgMi45NzA4MzJmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMSAoLTIuNTE3NzE0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjMwNTY4NGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuODUyNTY2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EwIDMuMzA1Njg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTEgKC0yLjg1MjU2NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42ODEzOTRmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjIyODI3NmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMCAzLjY4MTM5NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0ExICgtMy4yMjgyNzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDE0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTAyOTQ3ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy42NDk4MzBmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTAgNC4xMDI5NDdmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMSAoLTMuNjQ5ODMwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU3NTkzOGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMTIyODIwZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EwIDQuNTc1OTM4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTEgKC00LjEyMjgyMGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjIgMC4wMDAwMDBmCiAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgOTYwMDBIeiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NjIzMwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY3MzU4MykKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDQyMDgKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43ODE1NTgpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzI1MzU4Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTAyNzA4KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NjEyOTEKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDM4NjQxKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTM4MTAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTkxMTYwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzg0OTM5Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4zNjIyODkpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk3Njk0OQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTU0Mjk5KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xOTIzODcKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzY5NzM4KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDM0MTEzCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMDExNDY0KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMi43MDUzMzUKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjI4MjY4NSkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjAwOTY1MAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi41ODcwMDApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzUxMDk3Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjkyODQ0NykKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjczNDIwNwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMzExNTU4KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNC4xNjQwNjQKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMy43NDE0MTQpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjY0NjM3MQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC00LjIyMzcyMSkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTAgMS4wOTYyMzMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTEgKC0wLjY3MzU4MykKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTAgMS4yMDQyMDgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTEgKC0wLjc4MTU1OCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTAgMS4zMjUzNTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTEgKC0wLjkwMjcwOCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTAgMS40NjEyOTEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTEgKC0xLjAzODY0MSkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTAgMS42MTM4MTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTEgKC0xLjE5MTE2MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTAgMS43ODQ5MzkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTEgKC0xLjM2MjI4OSkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTAgMS45NzY5NDkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTEgKC0xLjU1NDI5OSkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTAgMi4xOTIzODcKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTEgKC0xLjc2OTczOCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTAgMi40MzQxMTMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTEgKC0yLjAxMTQ2NCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjEgKC0wLjU3NzM1MCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMCAyLjcwNTMzNQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTEgKC0yLjI4MjY4NSkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMCAzLjAwOTY1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTEgKC0yLjU4NzAwMCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCAzLjM1MTA5NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTEgKC0yLjkyODQ0NykKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMCAzLjczNDIwNworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTEgKC0zLjMxMTU1OCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCA0LjE2NDA2NAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTEgKC0zLjc0MTQxNCkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCA0LjY0NjM3MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTEgKC00LjIyMzcyMSkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjIgMC4wMDAwMDAKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAxNzY0MDAgKi8KIC8qIEdhaW4gPSAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTA2NzExZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44NTU4MDdmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTAgMS4xMDY3MTFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMSAoLTAuODU1ODA3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI2NDQzZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45NzU1MzlmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTAgMS4yMjY0NDNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMSAoLTAuOTc1NTM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzYwNzg0ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xMDk4ODBmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTAgMS4zNjA3ODRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMSAoLTEuMTA5ODgwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExNTE3ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yNjA2MTNmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTAgMS41MTE1MTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMSAoLTEuMjYwNjEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgwNjQzZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40Mjk3MzlmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTAgMS42ODA2NDNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMSAoLTEuNDI5NzM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODcwNDA1ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS42MTk1MDFmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTAgMS44NzA0MDVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMSAoLTEuNjE5NTAxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDgzMzIxZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS44MzI0MTdmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTAgMi4wODMzMjFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMSAoLTEuODMyNDE3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzIyMjE3ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wNzEzMTNmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTAgMi4zMjIyMTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMSAoLTIuMDcxMzEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTkwMjYzZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zMzkzNTlmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTAgMi41OTAyNjNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMSAoLTIuMzM5MzU5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44OTEwMTZmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi42NDAxMTJmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwIDIuODkxMDE2ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0ExICgtMi42NDAxMTJmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IxICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjIyODQ2NWYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjk3NzU2MWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTAgMy4yMjg0NjVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTEgKC0yLjk3NzU2MWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjA3MDkwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMzU2MTg2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCAzLjYwNzA5MGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMSAoLTMuMzU2MTg2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMzE5MTRmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy43ODEwMTBmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwIDQuMDMxOTE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0ExICgtMy43ODEwMTBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IxICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDE0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjUwODU3NWYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC00LjI1NzY3MWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTAgNC41MDg1NzVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTEgKC00LjI1NzY3MWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDQzMzk3ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuNzkyNDkzZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCA1LjA0MzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMSAoLTQuNzkyNDkzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMiAwLjAwMDAwMGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAxOTIwMDBIeiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTA3ODIzCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg3NTE1MCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIyODgwMwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45OTYxMzApCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzY0NTQ0Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjEzMTg3MSkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTY4NDkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjg0MTc2KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42ODc3MzcKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQ1NTA2NCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjg3OTQ3NwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjY0NjgwNCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTQ2MTMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS44NjE5NDApCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMzNTk5OQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMTAzMzI2KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjYwNjgzOQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zNzQxNjYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjkxMDcyNgotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjY3ODA1MykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMjUxNjkzCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4wMTkwMjApCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYzNDI2NAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNDAxNTkxKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjA2MzUxNgotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjgzMDg0MykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU0NTE0NQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMzEyNDcyKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA1LjA4NTU0MgotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtNC44NTI4NjgpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAxLjEwNzgyMworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTEgKC0wLjg3NTE1MCkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EwIDEuMjI4ODAzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMSAoLTAuOTk2MTMwKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTAgMS4zNjQ1NDQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0ExICgtMS4xMzE4NzEpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMCAxLjUxNjg0OQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTEgKC0xLjI4NDE3NikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0EwIDEuNjg3NzM3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMSAoLTEuNDU1MDY0KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTAgMS44Nzk0NzcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0ExICgtMS42NDY4MDQpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMCAyLjA5NDYxMworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTEgKC0xLjg2MTk0MCkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0EwIDIuMzM1OTk5CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMSAoLTIuMTAzMzI2KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTAgMi42MDY4MzkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0ExICgtMi4zNzQxNjYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0EwIDIuOTEwNzI2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTEgKC0yLjY3ODA1MykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTAgMy4yNTE2OTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSAoLTMuMDE5MDIwKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCAzLjYzNDI2NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0ExICgtMy40MDE1OTEpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0EwIDQuMDYzNTE2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTEgKC0zLjgzMDg0MykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTAgNC41NDUxNDUKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSAoLTQuMzEyNDcyKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCA1LjA4NTU0MgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0ExICgtNC44NTI4NjgpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IyIDAuMDAwMDAwCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuY3BwCmluZGV4IGZmMmM5MGEuLjMxMThlNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAKQEAgLTUwLDc4ICs1MCw2MiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCi0gICAgaWYgKChwUGFyYW1zID09IExWTV9OVUxMKSB8fCAoaEluc3RhbmNlID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChwUGFyYW1zID09IExWTV9OVUxMKSB8fCAoaEluc3RhbmNlID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CiAgICAgfQogCiAgICAgcEluc3RhbmNlLT5OZXdQYXJhbXMgPSAqcFBhcmFtczsKIAotICAgIGlmKAotICAgICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgotICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCi0gICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmCi0gICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNzY0MDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJgotICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgotICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgJiYKLSAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01VTFRJQ0hBTk5FTCkpIHx8Ci0jZWxzZQotICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAotI2VuZGlmCi0gICAgICAgIChwUGFyYW1zLT5TcGVha2VyVHlwZSA+IExWTV9FWF9IRUFEUEhPTkVTKSkKLSAgICB7CisgICAgaWYgKAorICAgICAgICAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpIHx8CisgICAgICAgICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNzY0MDApICYmCisgICAgICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpIHx8CisgICAgICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCisgICAgICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkgfHwKKyAgICAgICAgICAgIChwUGFyYW1zLT5TcGVha2VyVHlwZSA+IExWTV9FWF9IRUFEUEhPTkVTKSkgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9IHBQYXJhbXMtPk5yQ2hhbm5lbHM7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuQ2hNYXNrICAgICA9IHBQYXJhbXMtPkNoTWFzazsKLSNlbmRpZgorICAgIHBJbnN0YW5jZS0+UGFyYW1zLkNoTWFzayA9IHBQYXJhbXMtPkNoTWFzazsKICAgICAvKgogICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgaWYoKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwUGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmCisgICAgICAgIChwUGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAotICAgIGlmKHBQYXJhbXMtPlZpcnR1YWxpemVyVHlwZSAhPSBMVk1fQ09OQ0VSVFNPVU5EKQotICAgIHsKKyAgICBpZiAocFBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlICE9IExWTV9DT05DRVJUU09VTkQpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYocFBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA+IExWTV9WSVJUVUFMSVpFUl9NQVhfUkVWRVJCX0xFVkVMKQotICAgIHsKKyAgICBpZiAocFBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA+IExWTV9WSVJUVUFMSVpFUl9NQVhfUkVWRVJCX0xFVkVMKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAotICAgIGlmKHBQYXJhbXMtPkNTX0VmZmVjdExldmVsIDwgTFZNX0NTX01JTl9FRkZFQ1RfTEVWRUwpCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5DU19FZmZlY3RMZXZlbCA8IExWTV9DU19NSU5fRUZGRUNUX0xFVkVMKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogTi1CYW5kIEVxdWFsaXplcgogICAgICAqLwotICAgIGlmKHBQYXJhbXMtPkVRTkJfTkJhbmRzID4gcEluc3RhbmNlLT5JbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMpCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5FUU5CX05CYW5kcyA+IHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5FUU5CX051bUJhbmRzKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAogICAgIC8qIERlZmluaXRpb24gcG9pbnRlciAqLwotICAgIGlmICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPT0gTFZNX05VTEwpICYmCi0gICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKSkKLSAgICB7CisgICAgaWYgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9PSBMVk1fTlVMTCkgJiYgKHBQYXJhbXMtPkVRTkJfTkJhbmRzICE9IDApKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9CiAKQEAgLTEyOSwzNSArMTEzLDMxIEBACiAgICAgICogQ29weSB0aGUgZmlsdGVyIGRlZmluaXRpb25zIGZvciB0aGUgRXF1YWxpc2VyCiAgICAgICovCiAgICAgewotICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisgICAgICAgIExWTV9JTlQxNiBpOwogCi0gICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwUGFyYW1zLT5FUU5CX05CYW5kczsgaSsrKQotICAgICAgICAgICAgeworICAgICAgICBpZiAocFBhcmFtcy0+RVFOQl9OQmFuZHMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspIHsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzW2ldID0gcFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwSW5zdGFuY2UtPk5ld1BhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYoIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwotICAgICAgICAoKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PRkYpICYmIChwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgIT0gTFZNX0VRTkJfT04pKSB8fAotICAgICAgICAocFBhcmFtcy0+RVFOQl9OQmFuZHMgPiBwSW5zdGFuY2UtPkluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcykpCi0gICAgeworICAgIGlmICgvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgKChwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgIT0gTFZNX0VRTkJfT0ZGKSAmJgorICAgICAgICAgKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PTikpIHx8CisgICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyA+IHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5FUU5CX051bUJhbmRzKSkgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAgICAgLyogQmFuZCBwYXJhbWV0ZXJzKi8KICAgICB7CiAgICAgICAgIExWTV9JTlQxNiBpOwotICAgICAgICBmb3IoaSA9IDA7IGkgPCBwUGFyYW1zLT5FUU5CX05CYW5kczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA8IExWTV9FUU5CX01JTl9CQU5EX0ZSRVEpICB8fAotICAgICAgICAgICAgICAgIChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgPiBMVk1fRVFOQl9NQVhfQkFORF9GUkVRKSkgfHwKLSAgICAgICAgICAgICAgICAoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gICAgIDwgTFZNX0VRTkJfTUlOX0JBTkRfR0FJTikgIHx8Ci0gICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gICAgICA+IExWTV9FUU5CX01BWF9CQU5EX0dBSU4pKSB8fAotICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgPCBMVk1fRVFOQl9NSU5fUUZBQ1RPUikgICAgIHx8Ci0gICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgICA+IExWTV9FUU5CX01BWF9RRkFDVE9SKSkpCi0gICAgICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGFyYW1zLT5FUU5CX05CYW5kczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgPCBMVk1fRVFOQl9NSU5fQkFORF9GUkVRKSB8fAorICAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5ID4gTFZNX0VRTkJfTUFYX0JBTkRfRlJFUSkpIHx8CisgICAgICAgICAgICAgICAgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5HYWluIDwgTFZNX0VRTkJfTUlOX0JBTkRfR0FJTikgfHwKKyAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gPiBMVk1fRVFOQl9NQVhfQkFORF9HQUlOKSkgfHwKKyAgICAgICAgICAgICAgICAoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgPCBMVk1fRVFOQl9NSU5fUUZBQ1RPUikgfHwKKyAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgPiBMVk1fRVFOQl9NQVhfUUZBQ1RPUikpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE2NiwyNCArMTQ2LDI1IEBACiAgICAgLyoKICAgICAgKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBpZigoKHBQYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgIT0gTFZNX0JFX09GRikgJiYgKHBQYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgIT0gTFZNX0JFX09OKSkgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKChwUGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA8IExWTV9CRV9NSU5fRUZGRUNUTEVWRUwgKSB8fCAocFBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPiBMVk1fQkVfTUFYX0VGRkVDVExFVkVMICkpfHwKLSAgICAgICAgKChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNTVIeikgJiYgKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV82Nkh6KSAgICAgICAgICAgJiYKLSAgICAgICAgKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV83OEh6KSAmJiAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzkwSHopKSAgICAgICAgICAgfHwKLSAgICAgICAgKChwUGFyYW1zLT5CRV9IUEYgIT0gTFZNX0JFX0hQRl9PRkYpICYmIChwUGFyYW1zLT5CRV9IUEYgIT0gTFZNX0JFX0hQRl9PTikpKQotICAgIHsKKyAgICBpZiAoKChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PRkYpICYmIChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PTikpIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMKSB8fAorICAgICAgICAgKHBQYXJhbXMtPkJFX0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCkpIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzU1SHopICYmCisgICAgICAgICAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzY2SHopICYmCisgICAgICAgICAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzc4SHopICYmCisgICAgICAgICAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzkwSHopKSB8fAorICAgICAgICAoKHBQYXJhbXMtPkJFX0hQRiAhPSBMVk1fQkVfSFBGX09GRikgJiYgKHBQYXJhbXMtPkJFX0hQRiAhPSBMVk1fQkVfSFBGX09OKSkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgaWYoKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsIDwgTFZNX1ZDX01JTl9FRkZFQ1RMRVZFTCApIHx8IChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA+IExWTV9WQ19NQVhfRUZGRUNUTEVWRUwgKSkKLSAgICB7CisgICAgaWYgKChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA8IExWTV9WQ19NSU5fRUZGRUNUTEVWRUwpIHx8CisgICAgICAgIChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA+IExWTV9WQ19NQVhfRUZGRUNUTEVWRUwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KLSAgICBpZigocFBhcmFtcy0+VkNfQmFsYW5jZSA8IExWTV9WQ19CQUxBTkNFX01JTiApIHx8IChwUGFyYW1zLT5WQ19CYWxhbmNlID4gTFZNX1ZDX0JBTEFOQ0VfTUFYICkpCi0gICAgeworICAgIGlmICgocFBhcmFtcy0+VkNfQmFsYW5jZSA8IExWTV9WQ19CQUxBTkNFX01JTikgfHwgKHBQYXJhbXMtPlZDX0JhbGFuY2UgPiBMVk1fVkNfQkFMQU5DRV9NQVgpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIApAQCAtMTkxLDIyICsxNzIsMjEgQEAKICAgICAgKiBQU0EgcGFyYW1ldGVycwogICAgICAqLwogICAgIGlmICgoKExWUFNBX0xldmVsRGV0ZWN0U3BlZWRfZW4pcFBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPiBMVlBTQV9TUEVFRF9ISUdIKSB8fAotICAgICAgICAocFBhcmFtcy0+UFNBX0VuYWJsZSA+IExWTV9QU0FfT04pKQotICAgIHsKKyAgICAgICAgKHBQYXJhbXMtPlBTQV9FbmFibGUgPiBMVk1fUFNBX09OKSkgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKICAgICAvKgotICAgICogU2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXJlIGFyZSBuZXcgcGFyYW1ldGVycyB0byB1c2UKLSAgICAqCi0gICAgKiBQcm90ZWN0IHRoZSBjb3B5IG9mIHRoZSBuZXcgcGFyYW1ldGVycyBmcm9tIGludGVycnVwdHMgdG8gYXZvaWQgcG9zc2libGUgcHJvYmxlbXMKLSAgICAqIHdpdGggbG9zcyBjb250cm9sIHBhcmFtZXRlcnMuIFRoaXMgcHJvYmxlbSBjYW4gb2NjdXIgaWYgdGhpcyBjb250cm9sIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlCi0gICAgKiB0aGFuIG9uY2UgYmVmb3JlIGEgY2FsbCB0byB0aGUgcHJvY2VzcyBmdW5jdGlvbi4gSWYgdGhlIHByb2Nlc3MgZnVuY3Rpb24gaW50ZXJydXB0cwotICAgICogdGhlIGNvcHkgdG8gTmV3UGFyYW1zIHRoZW4gb25lIGZyYW1lIG1heSBoYXZlIG1peGVkIHBhcmFtZXRlcnMsIHNvbWUgb2xkIGFuZCBzb21lIG5ldy4KLSAgICAqLworICAgICAqIFNldCB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGVyZSBhcmUgbmV3IHBhcmFtZXRlcnMgdG8gdXNlCisgICAgICoKKyAgICAgKiBQcm90ZWN0IHRoZSBjb3B5IG9mIHRoZSBuZXcgcGFyYW1ldGVycyBmcm9tIGludGVycnVwdHMgdG8gYXZvaWQgcG9zc2libGUgcHJvYmxlbXMKKyAgICAgKiB3aXRoIGxvc3MgY29udHJvbCBwYXJhbWV0ZXJzLiBUaGlzIHByb2JsZW0gY2FuIG9jY3VyIGlmIHRoaXMgY29udHJvbCBmdW5jdGlvbiBpcyBjYWxsZWQgbW9yZQorICAgICAqIHRoYW4gb25jZSBiZWZvcmUgYSBjYWxsIHRvIHRoZSBwcm9jZXNzIGZ1bmN0aW9uLiBJZiB0aGUgcHJvY2VzcyBmdW5jdGlvbiBpbnRlcnJ1cHRzCisgICAgICogdGhlIGNvcHkgdG8gTmV3UGFyYW1zIHRoZW4gb25lIGZyYW1lIG1heSBoYXZlIG1peGVkIHBhcmFtZXRlcnMsIHNvbWUgb2xkIGFuZCBzb21lIG5ldy4KKyAgICAgKi8KICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX1RSVUU7CiAKLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzMCwxNiArMjEwLDEzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKICAgICAvKgogICAgICAqIENoZWNrIHBvaW50ZXIKICAgICAgKi8KLSAgICBpZiAoKHBQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChoSW5zdGFuY2UgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChoSW5zdGFuY2UgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9CiAgICAgKnBQYXJhbXMgPSBwSW5zdGFuY2UtPk5ld1BhcmFtczsKQEAgLTI0OCwxNyArMjI1LDE2IEBACiAgICAgICogQ29weSB0aGUgZmlsdGVyIGRlZmluaXRpb25zIGZvciB0aGUgRXF1YWxpc2VyCiAgICAgICovCiAgICAgewotICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisgICAgICAgIExWTV9JTlQxNiBpOwogCiAgICAgICAgIGlmIChwSW5zdGFuY2UtPk5ld1BhcmFtcy5FUU5CX05CYW5kcyAhPSAwKQotICAgICAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPk5ld1BhcmFtcy5FUU5CX05CYW5kczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzW2ldID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmc1tpXTsKLSAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBJbnN0YW5jZS0+TmV3UGFyYW1zLkVRTkJfTkJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzW2ldID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmc1tpXTsKKyAgICAgICAgICAgIH0KICAgICAgICAgcFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzOwogICAgIH0KIAotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjc0LDU2ICsyNTAsNDYgQEAKIC8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZNX1NldFRyZWJsZUJvb3N0KExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0gICAgZXh0ZXJuIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKK3ZvaWQgTFZNX1NldFRyZWJsZUJvb3N0KExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190IExWTV9UcmVibGVCb29zdENvZWZzW107CiAKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPZmZzZXQ7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSAwOworICAgIExWTV9JTlQxNiBPZmZzZXQ7CisgICAgTFZNX0lOVDE2IEVmZmVjdExldmVsID0gMDsKIAogICAgIC8qCiAgICAgICogTG9hZCB0aGUgY29lZmZpY2llbnRzCiAgICAgICovCi0gICAgaWYgKChwUGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID09IExWTV9URV9PTikgJiYKLSAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgPj0gVHJlYmxlQm9vc3RNaW5SYXRlKSAmJgotICAgICAgICAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgJiYKLSAgICAgICAgKHBQYXJhbXMtPlRFX0VmZmVjdExldmVsID4gMCkpCi0gICAgewotICAgICAgICBpZigocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSAmJgotICAgICAgICAgICAgKChwUGFyYW1zLT5TcGVha2VyVHlwZSA9PSBMVk1fSEVBRFBIT05FUyl8fAotICAgICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9FWF9IRUFEUEhPTkVTKSkpCi0gICAgICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPT0gTFZNX1RFX09OKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSA+PSBUcmVibGVCb29zdE1pblJhdGUpICYmCisgICAgICAgIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJiAocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPiAwKSkgeworICAgICAgICBpZiAoKHBQYXJhbXMtPlRFX0VmZmVjdExldmVsID09IExWTV9URV9MT1dfTUlQUykgJiYKKyAgICAgICAgICAgICgocFBhcmFtcy0+U3BlYWtlclR5cGUgPT0gTFZNX0hFQURQSE9ORVMpIHx8CisgICAgICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9FWF9IRUFEUEhPTkVTKSkpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSBwUGFyYW1zLT5URV9FZmZlY3RMZXZlbDsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX1RSVUU7CiAgICAgICAgIH0KIAotICAgICAgICBpZihwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5URV9BY3RpdmUgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBMb2FkIHRoZSBjb2VmZmljaWVudHMgYW5kIGVuYWJsZWQgdGhlIHRyZWJsZSBib29zdAogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShFZmZlY3RMZXZlbCAtIDEgKyBUcmVibGVCb29zdFN0ZXBzICogKHBQYXJhbXMtPlNhbXBsZVJhdGUgLSBUcmVibGVCb29zdE1pblJhdGUpKTsKKyAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVibGVCb29zdFN0ZXBzICogKHBQYXJhbXMtPlNhbXBsZVJhdGUgLSBUcmVibGVCb29zdE1pblJhdGUpKTsKICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkxWTV9UcmVibGVCb29zdENvZWZzW09mZnNldF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENsZWFyIHRoZSB0YXBzCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0ZMT0FUKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLCAgLyogRGVzdGluYXRpb24uXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMpIC8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0ZMT0FUKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgLyogRGVzdGluYXRpb24uXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgLyoKICAgICAgICAgICogRGlzYWJsZSB0aGUgdHJlYmxlIGJvb3N0CiAgICAgICAgICAqLwpAQCAtMzQ1LDk0ICszMTEsNzYgQEAKIC8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgICAgTFZNX1NldFZvbHVtZShMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICBkQlNoaWZ0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDZkQiBzaGlmdHMgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgZEJPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBvZmZzZXQgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgVm9sdW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCi0gICAgTFZNX0ZMT0FUICAgICAgICBUZW1wOwordm9pZCBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fVUlOVDE2IGRCU2hpZnRzOyAgLyogNmRCIHNoaWZ0cyAqLworICAgIExWTV9VSU5UMTYgZEJPZmZzZXQ7ICAvKiBUYWJsZSBvZmZzZXQgKi8KKyAgICBMVk1fSU5UMTYgVm9sdW1lID0gMDsgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLworICAgIExWTV9GTE9BVCBUZW1wOwogCiAgICAgLyoKICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCiAgICAgICovCi0gICAgIGlmICAocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPiAwKQotICAgICB7Ci0gICAgICAgICBWb2x1bWUgPSAwOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICAgVm9sdW1lID0gcFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWw7Ci0gICAgIH0KKyAgICBpZiAocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPiAwKSB7CisgICAgICAgIFZvbHVtZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVm9sdW1lID0gcFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWw7CisgICAgfQogCi0gICAgIC8qIENvbXBlbnNhdGUgdGhpcyB2b2x1bWUgaW4gUFNBIHBsb3QgKi8KLSAgICAgaWYoVm9sdW1lID4gLTYwKSAgLyogTGltaXQgdm9sdW1lIGxvc3MgdG8gUFNBIExpbWl0cyovCi0gICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0PShMVk1fSU5UMTYpKC1Wb2x1bWUpOy8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCi0gICAgIGVsc2UKLSAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0dhaW5PZmZzZXQ9KExWTV9JTlQxNik2MDsvKiBMb3NzIGlzIGNvbXBlbnNhdGVkIGJ5IEdhaW4qLworICAgIC8qIENvbXBlbnNhdGUgdGhpcyB2b2x1bWUgaW4gUFNBIHBsb3QgKi8KKyAgICBpZiAoVm9sdW1lID4gLTYwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW1pdCB2b2x1bWUgbG9zcyB0byBQU0EgTGltaXRzKi8KKyAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldCA9IChMVk1fSU5UMTYpKC1Wb2x1bWUpOyAvKiBMb3NzIGlzIGNvbXBlbnNhdGVkIGJ5IEdhaW4qLworICAgIGVsc2UKKyAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldCA9IChMVk1fSU5UMTYpNjA7IC8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCiAKICAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lID0gMDsKIAogICAgIC8qCiAgICAgICogU2V0IHZvbHVtZSBjb250cm9sIGFuZCBBVkwgdm9sdW1lcyBhY2NvcmRpbmcgdG8gaGVhZHJvb20gYW5kIHZvbHVtZSB1c2VyIHNldHRpbmcKICAgICAgKi8KLSAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKQotICAgIHsKKyAgICBpZiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgewogICAgICAgICAvKiBEZWZhdWx0IFNpdHVhdGlvbiB3aXRoIG5vIEFWTCBhbmQgbm8gUlMgKi8KLSAgICAgICAgaWYocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID09IExWTV9FUU5CX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWb2x1bWUgPiAtcEluc3RhbmNlLT5IZWFkcm9vbSkKLSAgICAgICAgICAgICAgICBWb2x1bWUgPSAoTFZNX0lOVDE2KS1wSW5zdGFuY2UtPkhlYWRyb29tOworICAgICAgICBpZiAocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID09IExWTV9FUU5CX09OKSB7CisgICAgICAgICAgICBpZiAoVm9sdW1lID4gLXBJbnN0YW5jZS0+SGVhZHJvb20pIFZvbHVtZSA9IChMVk1fSU5UMTYpLXBJbnN0YW5jZS0+SGVhZHJvb207CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKgogICAgICAqIEFjdGl2YXRlIHZvbHVtZSBjb250cm9sIGlmIG5lY2Vzc2FyeQogICAgICAqLwotICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlICAgPSBMVk1fVFJVRTsKLSAgICBpZiAoVm9sdW1lICE9IDApCi0gICAgeworICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlID0gTFZNX1RSVUU7CisgICAgaWYgKFZvbHVtZSAhPSAwKSB7CiAgICAgICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgPSBWb2x1bWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiA9IDA7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIHJlcXVpcmVkIGdhaW4gYW5kIHNoaWZ0cwogICAgICAqLwotICAgIGRCT2Zmc2V0ID0gKExWTV9VSU5UMTYpKCgtVm9sdW1lKSAlIDYpOyAgICAgICAgICAgICAvKiBHZXQgdGhlIGRCcyAwLTUgKi8KLSAgICBkQlNoaWZ0cyA9IChMVk1fVUlOVDE2KShWb2x1bWUgLyAtNik7ICAgICAgICAgICAgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCisgICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoKC1Wb2x1bWUpICUgNik7IC8qIEdldCB0aGUgZEJzIDAtNSAqLworICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgaWYoZEJTaGlmdHMgPT0gMCkKLSAgICB7CisgICAgaWYgKGRCU2hpZnRzID09IDApIHsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7Ci0gICAgICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisgICAgfSBlbHNlIHsKICAgICAgICAgVGVtcCA9IExWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF07Ci0gICAgICAgIHdoaWxlKGRCU2hpZnRzKSB7CisgICAgICAgIHdoaWxlIChkQlNoaWZ0cykgewogICAgICAgICAgICAgVGVtcCA9IFRlbXAgLyAyLjBmOwogICAgICAgICAgICAgZEJTaGlmdHMtLTsKICAgICAgICAgfQogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgVGVtcCk7CiAgICAgfQogICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKLSAgICBpZihwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID09IExWTV9UUlVFKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9PSBMVk1fVFJVRSkgewogICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCBMVk1fVkNfTUlYRVJfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKICAgICB9CiB9CiAKQEAgLTQ1Myw0MyArNDAxLDM5IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICAgIExWTV9TZXRIZWFkcm9vbShMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotICAgIExWTV9JTlQxNiAgIGlpLCBqajsKLSAgICBMVk1fSU5UMTYgICBIZWFkcm9vbSA9IDA7Ci0gICAgTFZNX0lOVDE2ICAgTWF4R2FpbiA9IDA7Cit2b2lkIExWTV9TZXRIZWFkcm9vbShMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBMVk1fSU5UMTYgSGVhZHJvb20gPSAwOworICAgIExWTV9JTlQxNiBNYXhHYWluID0gMDsKIAotICAgIGlmICgoKExWRVFOQl9Nb2RlX2VuKXBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCi0gICAgICAgICAgICYmIChwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPT0gTFZNX0hFQURST09NX09OKSkKLSAgICB7CisgICAgaWYgKCgoTFZFUU5CX01vZGVfZW4pcFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9PSBMVk1fSEVBRFJPT01fT04pKSB7CiAgICAgICAgIC8qIEZpbmQgdHlwaWNhbCBoZWFkcm9vbSB2YWx1ZSAqLwotICAgICAgICBmb3IoamogPSAwOyBqaiA8IHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7IGpqKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgamorKykgewogICAgICAgICAgICAgTWF4R2FpbiA9IDA7Ci0gICAgICAgICAgICBmb3IoIGlpID0gMDsgaWkgPCBwUGFyYW1zLT5FUU5CX05CYW5kczsgaWkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkZyZXF1ZW5jeSA+PSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0xvdykgJiYKLSAgICAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkZyZXF1ZW5jeSA8PSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0hpZ2gpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkdhaW4gPiBNYXhHYWluKQotICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBwUGFyYW1zLT5FUU5CX05CYW5kczsgaWkrKykgeworICAgICAgICAgICAgICAgIGlmICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkZyZXF1ZW5jeSA+PQorICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5MaW1pdF9Mb3cpICYmCisgICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uRnJlcXVlbmN5IDw9CisgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0hpZ2gpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uR2FpbiA+IE1heEdhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIE1heEdhaW4gPSBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uR2FpbjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYoKE1heEdhaW4gLSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkhlYWRyb29tX09mZnNldCkgPiBIZWFkcm9vbSl7Ci0gICAgICAgICAgICAgICAgSGVhZHJvb20gPSAoTFZNX0lOVDE2KShNYXhHYWluIC0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5IZWFkcm9vbV9PZmZzZXQpOworICAgICAgICAgICAgaWYgKChNYXhHYWluIC0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5IZWFkcm9vbV9PZmZzZXQpID4KKyAgICAgICAgICAgICAgICBIZWFkcm9vbSkgeworICAgICAgICAgICAgICAgIEhlYWRyb29tID0gKExWTV9JTlQxNikoCisgICAgICAgICAgICAgICAgICAgICAgICBNYXhHYWluIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uSGVhZHJvb21fT2Zmc2V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgIGlmKEhlYWRyb29tIDwgMCkKLSAgICAgICAgICAgIEhlYWRyb29tID0gMDsKKyAgICAgICAgaWYgKEhlYWRyb29tIDwgMCkgSGVhZHJvb20gPSAwOwogICAgIH0KLSAgICBwSW5zdGFuY2UtPkhlYWRyb29tID0gKExWTV9VSU5UMTYpSGVhZHJvb20gOwotCisgICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9IChMVk1fVUlOVDE2KUhlYWRyb29tOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTUxMCwzMiArNDU0LDI2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCAgIGhJbnN0YW5jZSkKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgIExvY2FsUGFyYW1zOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgQ291bnQgPSA1OworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQXBwbHlOZXdTZXR0aW5ncyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWTV9Db250cm9sUGFyYW1zX3QgTG9jYWxQYXJhbXM7CisgICAgTFZNX0lOVDE2IENvdW50ID0gNTsKIAogICAgIC8qCiAgICAgICogQ29weSB0aGUgbmV3IHBhcmFtZXRlcnMgYnV0IG1ha2Ugc3VyZSB0aGV5IGRpZG4ndCBjaGFuZ2Ugd2hpbGUgY29weWluZwogICAgICAqLwotICAgIGRvCi0gICAgeworICAgIGRvIHsKICAgICAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKICAgICAgICAgTG9jYWxQYXJhbXMgPSBwSW5zdGFuY2UtPk5ld1BhcmFtczsKICAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXM7CiAgICAgICAgIENvdW50LS07Ci0gICAgfSB3aGlsZSAoKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgIT0gTFZNX0ZBTFNFKSAmJgotICAgICAgICAgICAgIChDb3VudCA+IDApKTsKKyAgICB9IHdoaWxlICgocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyAhPSBMVk1fRkFMU0UpICYmIChDb3VudCA+IDApKTsKIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwogICAgIHBJbnN0YW5jZS0+Q2hNYXNrID0gTG9jYWxQYXJhbXMuQ2hNYXNrOwotI2VuZGlmCiAKICAgICAvKiBDbGVhciBhbGwgaW50ZXJuYWwgZGF0YSBpZiBmb3JtYXQgY2hhbmdlKi8KLSAgICBpZihMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0KQotICAgIHsKKyAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCkgewogICAgICAgICBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMocEluc3RhbmNlKTsKICAgICAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKICAgICB9CkBAIC01NDcsMzEgKzQ4NSwyNyBAQAogICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVEVfRWZmZWN0TGV2ZWwgIT0gTG9jYWxQYXJhbXMuVEVfRWZmZWN0TGV2ZWwpIHx8CiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5URV9PcGVyYXRpbmdNb2RlICE9IExvY2FsUGFyYW1zLlRFX09wZXJhdGluZ01vZGUpIHx8CiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBMb2NhbFBhcmFtcy5TcGVha2VyVHlwZSkpCi0gICAgewotICAgICAgICBMVk1fU2V0VHJlYmxlQm9vc3QocEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJkxvY2FsUGFyYW1zKTsKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IExvY2FsUGFyYW1zLlNwZWFrZXJUeXBlKSkgeworICAgICAgICBMVk1fU2V0VHJlYmxlQm9vc3QocEluc3RhbmNlLCAmTG9jYWxQYXJhbXMpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBoZWFkcm9vbSBpZiByZXF1aXJlZAogICAgICAqLwotICAgICAgICBMVk1fU2V0SGVhZHJvb20ocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgTFZNX1NldEhlYWRyb29tKHBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgJkxvY2FsUGFyYW1zKTsgLyogTmV3IHBhcmFtZXRlcnMgKi8KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSB2b2x1bWUgaWYgcmVxdWlyZWQKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWTV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgJkxvY2FsUGFyYW1zKTsgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgICAgICBMVk1fU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAvKiBOZXcgcGFyYW1ldGVycyAqLwogICAgIH0KICAgICAvKiBBcHBseSBiYWxhbmNlIGNoYW5nZXMqLwotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgIT0gTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgIT0gTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSkgewogICAgICAgICAvKiBDb25maWd1cmUgTWl4ZXIgbW9kdWxlIGZvciBncmFkdWFsIGNoYW5nZXMgdG8gdm9sdW1lKi8KLSAgICAgICAgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8IDApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPCAwKSB7CiAgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OwogICAgICAgICAgICAgLyogRHJvcCBpbiByaWdodCBjaGFubmVsIHZvbHVtZSovCiAgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7CkBAIC01ODMsOSArNTE3LDcgQEAKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0X0Zsb2F0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA+MCkKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgaWYgKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPiAwKSB7CiAgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OwogICAgICAgICAgICAgLyogRHJvcCBpbiBsZWZ0IGNoYW5uZWwgdm9sdW1lKi8KICAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IGRCX3RvX0xpbkZsb2F0KChMVk1fSU5UMTYpKCgtTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSkgPDwgNCkpOwpAQCAtNTk3LDYzICs1MjksNTQgQEAKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0X0Zsb2F0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTFZNX0ZMT0FUIFRhcmdldF9GbG9hdDsKICAgICAgICAgICAgIC8qIE5vIGRyb3AqLwogICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gTFZNX01BWEZMT0FUOwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIFRhcmdldF9GbG9hdCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CiAKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOwogICAgICAgICB9CiAgICAgfQogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBiYXNzIGVuaGFuY2VtZW50CiAgICAgICovCiAgICAgewotICAgICAgICBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gICAgICAgREJFX1N0YXR1czsKLSAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAgICAgIERCRV9QYXJhbXM7Ci0gICAgICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgICAgICAqaERCRUluc3RhbmNlID0gKExWREJFX0hhbmRsZV90ICopcEluc3RhbmNlLT5oREJFSW5zdGFuY2U7CisgICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiBEQkVfU3RhdHVzOworICAgICAgICBMVkRCRV9QYXJhbXNfdCBEQkVfUGFyYW1zOworICAgICAgICBMVkRCRV9IYW5kbGVfdCogaERCRUluc3RhbmNlID0gKExWREJFX0hhbmRsZV90KilwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCiAgICAgICAgICAqLwotICAgICAgICBpZihMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKLSAgICAgICAgeworICAgICAgICBpZiAoTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PRkYpIHsKICAgICAgICAgICAgIERCRV9QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWREJFX09GRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERCRV9QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IChMVkRCRV9Nb2RlX2VuKUxvY2FsUGFyYW1zLkJFX09wZXJhdGluZ01vZGU7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkVfUGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSAoTFZEQkVfTW9kZV9lbilMb2NhbFBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlOwotICAgICAgICB9Ci0gICAgICAgIERCRV9QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICA9IChMVkRCRV9Gc19lbilMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOwotICAgICAgICBEQkVfUGFyYW1zLkVmZmVjdExldmVsICAgICAgPSBMb2NhbFBhcmFtcy5CRV9FZmZlY3RMZXZlbDsKLSAgICAgICAgREJFX1BhcmFtcy5DZW50cmVGcmVxdWVuY3kgID0gKExWREJFX0NlbnRyZUZyZXFfZW4pTG9jYWxQYXJhbXMuQkVfQ2VudHJlRnJlcTsKLSAgICAgICAgREJFX1BhcmFtcy5IUEZTZWxlY3QgICAgICAgID0gKExWREJFX0ZpbHRlclNlbGVjdF9lbilMb2NhbFBhcmFtcy5CRV9IUEY7Ci0gICAgICAgIERCRV9QYXJhbXMuSGVhZHJvb21kQiAgICAgICA9IDA7Ci0gICAgICAgIERCRV9QYXJhbXMuVm9sdW1lQ29udHJvbCAgICA9IExWREJFX1ZPTFVNRV9PRkY7Ci0gICAgICAgIERCRV9QYXJhbXMuVm9sdW1lZEIgICAgICAgICA9IDA7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICBEQkVfUGFyYW1zLk5yQ2hhbm5lbHMgICAgICAgICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7Ci0jZW5kaWYKKyAgICAgICAgREJFX1BhcmFtcy5TYW1wbGVSYXRlID0gKExWREJFX0ZzX2VuKUxvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CisgICAgICAgIERCRV9QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5CRV9FZmZlY3RMZXZlbDsKKyAgICAgICAgREJFX1BhcmFtcy5DZW50cmVGcmVxdWVuY3kgPSAoTFZEQkVfQ2VudHJlRnJlcV9lbilMb2NhbFBhcmFtcy5CRV9DZW50cmVGcmVxOworICAgICAgICBEQkVfUGFyYW1zLkhQRlNlbGVjdCA9IChMVkRCRV9GaWx0ZXJTZWxlY3RfZW4pTG9jYWxQYXJhbXMuQkVfSFBGOworICAgICAgICBEQkVfUGFyYW1zLkhlYWRyb29tZEIgPSAwOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZUNvbnRyb2wgPSBMVkRCRV9WT0xVTUVfT0ZGOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZWRCID0gMDsKKyAgICAgICAgREJFX1BhcmFtcy5OckNoYW5uZWxzID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKIAogICAgICAgICAvKgogICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCiAgICAgICAgICAqLwotICAgICAgICBEQkVfU3RhdHVzID0gTFZEQkVfQ29udHJvbChoREJFSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfUGFyYW1zKTsKKyAgICAgICAgREJFX1N0YXR1cyA9IExWREJFX0NvbnRyb2woaERCRUluc3RhbmNlLCAmREJFX1BhcmFtcyk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAogICAgICAgICAgKi8KLSAgICAgICAgaWYgKERCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKURCRV9TdGF0dXMpOworICAgICAgICBpZiAoREJFX1N0YXR1cyAhPSBMVkRCRV9TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKURCRV9TdGF0dXMpOwogICAgICAgICB9CiAKICAgICAgICAgLyoKQEAgLTY2NiwxNjggKzU4OSwxMzIgQEAKICAgICAgKiBVcGRhdGUgdGhlIE4tQmFuZCBFcXVhbGlzZXIKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gICAgICBFUU5CX1N0YXR1czsKLSAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgIEVRTkJfUGFyYW1zOwotICAgICAgICBMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgICAgKmhFUU5CSW5zdGFuY2UgPSAoTFZFUU5CX0hhbmRsZV90ICopcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlOworICAgICAgICBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIEVRTkJfU3RhdHVzOworICAgICAgICBMVkVRTkJfUGFyYW1zX3QgRVFOQl9QYXJhbXM7CisgICAgICAgIExWRVFOQl9IYW5kbGVfdCogaEVRTkJJbnN0YW5jZSA9IChMVkVRTkJfSGFuZGxlX3QqKXBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCiAgICAgICAgICAqLwogCi0gICAgICAgIGlmKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZFUU5CX0JZUEFTUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSAoTFZFUU5CX01vZGVfZW4pTG9jYWxQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlOworICAgICAgICBpZiAoTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PRkYpIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVFOQl9QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IChMVkVRTkJfTW9kZV9lbilMb2NhbFBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGU7CiAgICAgICAgIH0KIAotICAgICAgICBFUU5CX1BhcmFtcy5TYW1wbGVSYXRlICAgICAgID0gKExWRVFOQl9Gc19lbilMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOwotICAgICAgICBFUU5CX1BhcmFtcy5OQmFuZHMgICAgICAgICAgID0gTG9jYWxQYXJhbXMuRVFOQl9OQmFuZHM7Ci0gICAgICAgIEVRTkJfUGFyYW1zLnBCYW5kRGVmaW5pdGlvbiAgPSAoTFZFUU5CX0JhbmREZWZfdCAqKUxvY2FsUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOwotICAgICAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9TVEVSRU8pICAgIC8qIE1vbm8gZm9ybWF0IG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgRVFOQl9QYXJhbXMuU2FtcGxlUmF0ZSA9IChMVkVRTkJfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgRVFOQl9QYXJhbXMuTkJhbmRzID0gTG9jYWxQYXJhbXMuRVFOQl9OQmFuZHM7CisgICAgICAgIEVRTkJfUGFyYW1zLnBCYW5kRGVmaW5pdGlvbiA9IChMVkVRTkJfQmFuZERlZl90KilMb2NhbFBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbjsKKyAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPKSAvKiBNb25vIGZvcm1hdCBub3Qgc3VwcG9ydGVkICovCiAgICAgICAgIHsKICAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9TVEVSRU87CiAgICAgICAgIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgIC8qIE5vdGU6IEN1cnJlbnRseSBTb3VyY2VGb3JtYXQgZmllbGQgb2YgRVFOQiBpcyBub3QgYmVlbgogICAgICAgICAgKiAgICAgICB1c2VkIGJ5IHRoZSBtb2R1bGUuCiAgICAgICAgICAqLwotICAgICAgICBlbHNlIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01VTFRJQ0hBTk5FTCkKLSAgICAgICAgeworICAgICAgICBlbHNlIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01VTFRJQ0hBTk5FTCkgewogICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX01VTFRJQ0hBTk5FTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9NT05PSU5TVEVSRU87IC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX01PTk9JTlNURVJFTzsgICAgIC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KLSAgICAgICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgRVFOQl9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKLSNlbmRpZgorICAgICAgICBFUU5CX1BhcmFtcy5OckNoYW5uZWxzID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwogICAgICAgICAgKi8KICAgICAgICAgaWYgKChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgotICAgICAgICAgICAgKExvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikpCi0gICAgICAgIHsKKyAgICAgICAgICAgIChMb2NhbFBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZNX0VRTkJfT04pKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID0gTFZNX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX0JZUEFTUzsKICAgICAgICAgfQogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKICAgICAgICAgICovCi0gICAgICAgIEVRTkJfU3RhdHVzID0gTFZFUU5CX0NvbnRyb2woaEVRTkJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9QYXJhbXMpOworICAgICAgICBFUU5CX1N0YXR1cyA9IExWRVFOQl9Db250cm9sKGhFUU5CSW5zdGFuY2UsICZFUU5CX1BhcmFtcyk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAogICAgICAgICAgKi8KLSAgICAgICAgaWYgKEVRTkJfU3RhdHVzICE9IExWRVFOQl9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pRVFOQl9TdGF0dXMpOworICAgICAgICBpZiAoRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybiAoKExWTV9SZXR1cm5TdGF0dXNfZW4pRVFOQl9TdGF0dXMpOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSBjb25jZXJ0IHNvdW5kCiAgICAgICovCiAgICAgewotICAgICAgICBMVkNTX1JldHVyblN0YXR1c19lbiAgICAgICAgQ1NfU3RhdHVzOwotICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICAgICAgICAgQ1NfUGFyYW1zOwotICAgICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICAgKmhDU0luc3RhbmNlID0gKExWQ1NfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhDU0luc3RhbmNlOwotICAgICAgICBMVk1fTW9kZV9lbiAgICAgICAgICAgICAgICAgQ29tcHJlc3Nvck1vZGU9TFZNX01PREVfT047CisgICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIENTX1N0YXR1czsKKyAgICAgICAgTFZDU19QYXJhbXNfdCBDU19QYXJhbXM7CisgICAgICAgIExWQ1NfSGFuZGxlX3QqIGhDU0luc3RhbmNlID0gKExWQ1NfSGFuZGxlX3QqKXBJbnN0YW5jZS0+aENTSW5zdGFuY2U7CisgICAgICAgIExWTV9Nb2RlX2VuIENvbXByZXNzb3JNb2RlID0gTFZNX01PREVfT047CiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBuZXcgcGFyYW1ldGVycwogICAgICAgICAgKi8KLSAgICAgICAgaWYoTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICBDU19QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IExWQ1NfT047Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDU19QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IExWQ1NfT0ZGOworICAgICAgICBpZiAoTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSB7CisgICAgICAgICAgICBDU19QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWQ1NfT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDU19QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWQ1NfT0ZGOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoKExvY2FsUGFyYW1zLlRFX09wZXJhdGluZ01vZGUgPT0gTFZNX1RFX09OKSAmJiAoTG9jYWxQYXJhbXMuVEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfRVhfSEVBRFBIT05FUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTX1BhcmFtcy5TcGVha2VyVHlwZSAgPSBMVkNTX0hFQURQSE9ORVM7CisgICAgICAgIGlmICgoTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmCisgICAgICAgICAgICAoTG9jYWxQYXJhbXMuVEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSkgeworICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlID0gTFZDU19FWF9IRUFEUEhPTkVTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlID0gTFZDU19IRUFEUEhPTkVTOwogICAgICAgICB9CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgIC8qIENvbmNlcnQgc291bmQgbW9kdWxlIHByb2Nlc3NlcyBvbmx5IHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscwogICAgICAgICAgKiBkYXRhLiBTbyB0aGUgU291cmNlIEZvcm1hdCBpcyBzZXQgdG8gTFZDU19TVEVSRU8gZm9yIG11bHRpY2hhbm5lbAogICAgICAgICAgKiBpbnB1dCBhbHNvLgogICAgICAgICAgKi8KICAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPIHx8Ci0gICAgICAgICAgICBMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01VTFRJQ0hBTk5FTCkKLSNlbHNlCi0gICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLwotI2VuZGlmCi0gICAgICAgIHsKKyAgICAgICAgICAgIExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTVVMVElDSEFOTkVMKSB7CiAgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19TVEVSRU87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19NT05PSU5TVEVSRU87IC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkNTX01PTk9JTlNURVJFTzsgICAgICAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwotICAgICAgICB9Ci0gICAgICAgIENTX1BhcmFtcy5TYW1wbGVSYXRlICA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CisgICAgICAgIENTX1BhcmFtcy5TYW1wbGVSYXRlID0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKICAgICAgICAgQ1NfUGFyYW1zLlJldmVyYkxldmVsID0gTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbDsKICAgICAgICAgQ1NfUGFyYW1zLkVmZmVjdExldmVsID0gTG9jYWxQYXJhbXMuQ1NfRWZmZWN0TGV2ZWw7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICBDU19QYXJhbXMuTnJDaGFubmVscyAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwotI2VuZGlmCisgICAgICAgIENTX1BhcmFtcy5OckNoYW5uZWxzID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwogICAgICAgICAgKi8KICAgICAgICAgaWYgKCgoTFZNX01vZGVfZW4pTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgJiYKLSAgICAgICAgICAgICgoTFZDU19Nb2Rlc19lbilMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpKQotICAgICAgICB7CisgICAgICAgICAgICAoKExWQ1NfTW9kZXNfZW4pTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DU19BY3RpdmUgPSBMVk1fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PRkY7CiAgICAgICAgIH0KIAotICAgICAgICBDU19QYXJhbXMuQ29tcHJlc3Nvck1vZGU9Q29tcHJlc3Nvck1vZGU7CisgICAgICAgIENTX1BhcmFtcy5Db21wcmVzc29yTW9kZSA9IENvbXByZXNzb3JNb2RlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKICAgICAgICAgICovCi0gICAgICAgIENTX1N0YXR1cyA9IExWQ1NfQ29udHJvbChoQ1NJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19QYXJhbXMpOworICAgICAgICBDU19TdGF0dXMgPSBMVkNTX0NvbnRyb2woaENTSW5zdGFuY2UsICZDU19QYXJhbXMpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFF1aXQgaWYgdGhlIGNoYW5nZXMgd2VyZSBub3QgYWNjZXB0ZWQKICAgICAgICAgICovCi0gICAgICAgIGlmIChDU19TdGF0dXMgIT0gTFZDU19TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pQ1NfU3RhdHVzKTsKKyAgICAgICAgaWYgKENTX1N0YXR1cyAhPSBMVkNTX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybiAoKExWTV9SZXR1cm5TdGF0dXNfZW4pQ1NfU3RhdHVzKTsKICAgICAgICAgfQotCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIFBvd2VyIFNwZWN0cnVtIEFuYWx5c2VyCiAgICAgICovCiAgICAgewotICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgICAgICAgICAgUFNBX1N0YXR1czsKLSAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIFBTQV9QYXJhbXM7Ci0gICAgICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqaFBTQUluc3RhbmNlID0gKHBMVlBTQV9IYW5kbGVfdCAqKXBJbnN0YW5jZS0+aFBTQUluc3RhbmNlOworICAgICAgICBMVlBTQV9SRVRVUk4gUFNBX1N0YXR1czsKKyAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190IFBTQV9QYXJhbXM7CisgICAgICAgIHBMVlBTQV9IYW5kbGVfdCogaFBTQUluc3RhbmNlID0gKHBMVlBTQV9IYW5kbGVfdCopcEluc3RhbmNlLT5oUFNBSW5zdGFuY2U7CiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBuZXcgcGFyYW1ldGVycwpAQCAtODM4LDIzICs3MjUsMTkgQEAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcwogICAgICAgICAgKi8KLSAgICAgICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZD09TFZNX1BTQV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0NvbnRyb2woaFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICZQU0FfUGFyYW1zKTsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikgeworICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0NvbnRyb2woaFBTQUluc3RhbmNlLCAmUFNBX1BhcmFtcyk7CiAKLSAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilQU0FfU3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTFZNX1JldHVyblN0YXR1c19lbilQU0FfU3RhdHVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEFwcGx5IG5ldyBzZXR0aW5ncwogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAoKExWUFNBX0luc3RhbmNlUHJfdCopaFBTQUluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOworICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0FwcGx5TmV3U2V0dGluZ3MoKExWUFNBX0luc3RhbmNlUHJfdCopaFBTQUluc3RhbmNlKTsKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTFZNX1JldHVyblN0YXR1c19lbilQU0FfU3RhdHVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTg2Myw5ICs3NDYsOSBAQAogICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycyBhbmQgY2xlYXIgdGhlIGZsYWcKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID0gTFZNX0ZBTFNFOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gIExvY2FsUGFyYW1zOworICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gTG9jYWxQYXJhbXM7CiAKLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTg4NywzNiArNzcwLDMwIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgICAgKnBIZWFkcm9vbVBhcmFtcykKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBpaSwgTkJhbmRzOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0SGVhZHJvb21QYXJhbXMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190KiBwSGVhZHJvb21QYXJhbXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX1VJTlQxNiBpaSwgTkJhbmRzOwogCiAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBIZWFkcm9vbVBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CiAgICAgfQotICAgIGlmICgocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyAhPSAwKSAmJiAocEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzICE9IDApICYmCisgICAgICAgIChwSGVhZHJvb21QYXJhbXMtPnBIZWFkcm9vbURlZmluaXRpb24gPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICAvKiBDb25zaWRlciBvbmx5IHRoZSBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyBmaXJzdCBiYW5kcyovCi0gICAgaWYgKHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgPiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUykKLSAgICB7CisgICAgaWYgKHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgPiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUykgewogICAgICAgICBOQmFuZHMgPSBMVk1fSEVBRFJPT01fTUFYX05CQU5EUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBOQmFuZHMgPSBwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzOwogICAgIH0KICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gTkJhbmRzOwogCiAgICAgLyogQ29weSBzZXR0aW5ncyBpbiBtZW1vcnkgKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IE5CYW5kczsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgTkJhbmRzOyBpaSsrKSB7CiAgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzW2lpXSA9IHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbltpaV07CiAgICAgfQogCkBAIC05MjQsNyArODAxLDcgQEAKICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBwSGVhZHJvb21QYXJhbXMtPkhlYWRyb29tX09wZXJhdGluZ01vZGU7CiAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9UUlVFOwogCi0gICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWTV9TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NDcsMjkgKzgyNCwyNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0SGVhZHJvb21QYXJhbXMoTFZNX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAqcEhlYWRyb29tUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0SGVhZHJvb21QYXJhbXMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190KiBwSGVhZHJvb21QYXJhbXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX1VJTlQxNiBpaTsKIAogICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSGVhZHJvb21QYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBIZWFkcm9vbVBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KIAogICAgIHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgPSBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzOwogCiAgICAgLyogQ29weSBzZXR0aW5ncyBpbiBtZW1vcnkgKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7IGlpKyspCi0gICAgeworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7IGlpKyspIHsKICAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnNbaWldID0gcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnNbaWldOwogICAgIH0KIAogICAgIHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzOwogICAgIHBIZWFkcm9vbVBhcmFtcy0+SGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZTsKLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk4OCwxOCArODYyLDE0IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZNX0FsZ29DYWxsQmFjayggdm9pZCAgICAgICAgICAqcEJ1bmRsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIGNhbGxiYWNrSWQpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopcEJ1bmRsZUhhbmRsZTsKK0xWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKHZvaWQqIHBCdW5kbGVIYW5kbGUsIHZvaWQqIHBEYXRhLCBMVk1fSU5UMTYgY2FsbGJhY2tJZCkgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKXBCdW5kbGVIYW5kbGU7CiAKLSAgICAodm9pZCkgcERhdGE7CisgICAgKHZvaWQpcERhdGE7CiAKLSAgICBzd2l0Y2goY2FsbGJhY2tJZCAmIDB4RkYwMCl7CisgICAgc3dpdGNoIChjYWxsYmFja0lkICYgMHhGRjAwKSB7CiAgICAgICAgIGNhc2UgQUxHT1JJVEhNX0NTX0lEOgotICAgICAgICAgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweDAwRkYpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbGxiYWNrSWQgJiAweDAwRkYpIHsKICAgICAgICAgICAgICAgICBjYXNlIExWQ1NfRVZFTlRfQUxHT0ZGOgogICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9IExWTV9GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDA4LDggKzg3OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBTEdPUklUSE1fRVFOQl9JRDoKLSAgICAgICAgICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHgwMEZGKQotICAgICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjYWxsYmFja0lkICYgMHgwMEZGKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfRVZFTlRfQUxHT0ZGOgogICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwNDAsMjEgKzkwOSwxNyBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0lOVDMyICAgIExWTV9WQ0NhbGxCYWNrKHZvaWQqICAgcEJ1bmRsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgIHBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgIENhbGxCYWNrUGFyYW0pCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKXBCdW5kbGVIYW5kbGU7Ci0gICAgTFZNX0ZMT0FUICAgIFRhcmdldDsKK0xWTV9JTlQzMiBMVk1fVkNDYWxsQmFjayh2b2lkKiBwQnVuZGxlSGFuZGxlLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsIHNob3J0IENhbGxCYWNrUGFyYW0pIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KilwQnVuZGxlSGFuZGxlOworICAgIExWTV9GTE9BVCBUYXJnZXQ7CiAKLSAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOwotICAgICh2b2lkKSBDYWxsQmFja1BhcmFtOworICAgICh2b2lkKXBHZW5lcmFsUHVycG9zZTsKKyAgICAodm9pZClDYWxsQmFja1BhcmFtOwogCiAgICAgLyogV2hlbiB2b2x1bWUgbWl4ZXIgaGFzIHJlYWNoZWQgMCBkQiB0YXJnZXQgdGhlbiBzdG9wIGl0IHRvIGF2b2lkCiAgICAgICAgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZy4gKi8KICAgICBUYXJnZXQgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSk7Ci0gICAgaWYoVGFyZ2V0ID09IDEuMGYpCi0gICAgeworICAgIGlmIChUYXJnZXQgPT0gMS4wZikgewogICAgICAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSA9IExWTV9GQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jcHAKaW5kZXggNTYyMDUyOS4uYmI5NjJkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmNwcApAQCAtMjAsNiArMjAsNyBAQAogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVk1fVGFibGVzLmgiCkBAIC0yOCw1NzAgKzI5LDkwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCi0vKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhlIHNjcmF0Y2ggbWVtb3J5IGlzIHRoZSBsYXJnZXN0IHJlcXVpcmVkIGJ5IGFueSBvZiB0aGUgc3ViLW1vZHVsZXMgcGx1cyBhbnkgICAqLwotLyogICAgICBhZGRpdGlvbmFsIHNjcmF0Y2ggcmVxdWlyZW1lbnRzIG9mIHRoZSBidW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogNCBUeXBlcyBvZiBNZW1vcnkgUmVnaW9ucyBvZiBMVk0KLSAqIFRPRE86IEFsbG9jYXRlIG9uIHRoZSBmbHkuCi0gKiBpKSAgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgLSBGb3IgSW5zdGFuY2UgSGFuZGxlcwotICogaWkpICBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBIC0gUGVyc2lzdGVudCBCdWZmZXJzCi0gKiBpaWkpIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCi0gKiBpdikgIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCi0gKgotICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQToKLSAqICAgVG90YWwgTWVtb3J5IHNpemU6Ci0gKiAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSArIFwKLSAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSArIFwKLSAqICAgICBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSArIFwKLSAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSAtIG5lZWRlZCBpZiBidWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIKLSAqCi0gKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBOgotICogICBUb3RhbCBNZW1vcnkgc2l6ZToKLSAqICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkgKyBcCi0gKiAgICAgMiAqIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWQ1NfRGF0YV90KSArIFwKLSAqICAgICBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KSArIFwKLSAqICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAotICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCi0gKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSArIFwKLSAqICAgICAyICogTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSArIFwKLSAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICsgXAotICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KQotICoKLSAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUY6Ci0gKiAgIFRvdGFsIE1lbW9yeSBzaXplOgotICogICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWQ1NfQ29lZmZpY2llbnRfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKLSAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKLSAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICsgXAotICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkKLSAqCi0gKiBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUIChTY3JhdGNoKToKLSAqICAgVG90YWwgTWVtb3J5IFNpemU6Ci0gKiAgICAgQnVuZGxlU2NyYXRjaFNpemUgKyBcCi0gKiAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpICsgXAotICogICAgIE1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQotICoKLSAqICAgICBhKUJ1bmRsZVNjcmF0Y2hTaXplOgotICogICAgICAgICAzICogTFZNX01BWF9DSEFOTkVMUyBcCi0gKiAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0ZMT0FUKQotICogICAgICAgVGhpcyBNZW1vcnkgaXMgYWxsb2NhdGVkIG9ubHkgd2hlbiBCdWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIuCi0gKiAgICAgYilNYXhTY3JhdGNoT2YgKENTLCBFUU5CLCBEQkUsIFBTQSkKLSAqICAgICAgIFRoaXMgTWVtb3J5IGlzIG5lZWRlZCBmb3Igc2NyYXRjaCB1c2FnZSBmb3IgQ1MsIEVRTkIsIERCRSwgUFNBLgotICogICAgICAgQ1MgICA9IChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKLSAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCi0gKiAgICAgICBFUU5CID0gKExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpCi0gKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQotICogICAgICAgREJFICA9IChMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpCi0gKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQotICogICAgICAgUFNBICA9ICgyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkpCi0gKiAgICAgICAgICAgICAgb25lIE1heElucHV0QmxvY2tTaXplIGZvciBpbnB1dCBhbmQgYW5vdGhlciBmb3IgZmlsdGVyIG91dHB1dAotICogICAgIGMpTUFYX0lOVEVSTkFMX0JMT0NLU0laRQotICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBQU0FJbnB1dCAtIFRlbXAgbWVtb3J5IHRvIHN0b3JlIG91dHB1dAotICogICAgICAgZnJvbSBNY1RvTW9ubyBibG9jayBhbmQgZ2l2ZW4gYXMgaW5wdXQgdG8gUFNBIGJsb2NrCi0gKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIEFsZ1NjcmF0Y2hTaXplOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtW0xWTV9OUl9NRU1PUllfUkVHSU9OU107Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBpOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgaWYocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybiBtZW1vcnkgdGFibGUgaWYgdGhlIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgIT0gTFZNX05VTEwpCi0gICAgewotICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKLSAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKLSAgICAgKi8KLSAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBpZiggKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qIE4tQmFuZCBFcXVhbGl6ZXIgKi8KLSAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcwotICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sIExWTV9OVUxMKTsKLSAgICB9Ci0gICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLwotCi0gICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKLSAgICB7Ci0gICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKLSAgICB9Ci0KLSAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCi0gICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQotICAgIHsKLSAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBCdW5kbGUgcmVxdWlyZW1lbnRzCi0gICAgKi8KLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYWxnb3JpdGhtIGFuZCBidW5kbGUgc2NyYXRjaCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICBBbGdTY3JhdGNoU2l6ZSAgICA9IDA7Ci0gICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCi0gICAgewotICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihMVk1fRkxPQVQpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAgICAgIC8qIFNjcmF0Y2ggYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7Ci0KLSAgICAvKgotICAgICAqIE4tQmFuZCBFcXVhbGl6ZXIgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sICAgICAgLyogTG9jYWwgc3RvcmFnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBVc2VyIHN0b3JhZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7Ci0KLSAgICAvKgotICAgICAqIENvbmNlcnQgU291bmQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgewotICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICBDU19NZW1UYWI7Ci0gICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENTX0NhcGFiaWxpdGllczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKLSAgICAgICAgICovCi0gICAgICAgIExWQ1NfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cnVjdHVyZXMKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIGlmIChDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICB7Ci0gICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7Ci0gICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgIERCRV9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7Ci0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gSW50ZXJuYWxCbG9ja1NpemU7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBMVkRCRV9NZW1vcnkoTFZNX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAotCi0gICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBidW5kbGUgdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgaWYgKERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOLUJhbmQgZXF1YWxpc2VyIHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgRVFOQl9NZW1UYWI7ICAgICAgICAgICAgLyogRm9yIE4tQmFuZCBFcXVhbGlzZXIgKi8KLSAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgRVFOQl9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICZFUU5CX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgaWYgKEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID4gQWxnU2NyYXRjaFNpemUpIEFsZ1NjcmF0Y2hTaXplID0gRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhlYWRyb29tIG1hbmFnZW1lbnQgbWVtb3J5IGFsbG9jYXRpb24KLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLQotICAgIC8qCi0gICAgICogU3BlY3RydW0gQW5hbHl6ZXIgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdCA9IExWTV9OVUxMOwotICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7Ci0gICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgUFNBX0luaXRQYXJhbXM7Ci0gICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKLSAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICBQU0FfU3RhdHVzOwotCi0gICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7Ci0KLSAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07Ci0gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBQU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDI1OwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfSW5pdFBhcmFtcyk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogU2xvdyBEYXRhICovCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLQotICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSA9IFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPCA0KQotICAgIHsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplIDwgNCkKLSAgICB7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPSAwOwotICAgIH0KLQotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgQWxnU2NyYXRjaFNpemUpOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgPSBMVk1fTlVMTDsKLSAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA8IDQpCi0gICAgewotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJ1bmRsZSBpbnN0YW5jZS4gSXQgcmV0dXJucyB0aGUgY3JlYXRlZCBpbnN0YW5jZSAgKi8KLS8qICBoYW5kbGUgdGhyb3VnaCBwaEluc3RhbmNlLiBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsIGluYWN0aXZlIHN0YXRlLiAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIG9uZSBvZiBwaEluc3RhbmNlLCBwTWVtb3J5VGFibGUgb3IgcEluc3RQYXJhbXMgYXJlIE5VTEwqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoTFZNX0hhbmRsZV90ICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgKnBJbnN0UGFyYW1zKQotewotCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgU3RhdHVzID0gTFZNX1NVQ0NFU1M7Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBBbGxvY01lbVtMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGk7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWTV9JbnN0UGFyYW1zX3QqIHBJbnN0UGFyYW1zKSB7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBTdGF0dXMgPSBMVk1fU1VDQ0VTUzsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlOworICAgIExWTV9JTlQxNiBpOworICAgIExWTV9VSU5UMTYgSW50ZXJuYWxCbG9ja1NpemU7CisgICAgTFZNX0lOVDMyIEJ1bmRsZVNjcmF0Y2hTaXplOwogCiAgICAgLyoKICAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCiAgICAgICovCi0gICAgaWYgKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycwotICAgICAqLwotICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplICE9IDApICYmCi0gICAgICAgICAgICAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihMVk1fTlVMTEFERFJFU1MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKICAgICAgKiBDaGVjayB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycwogICAgICAqLwotICAgIGlmKCAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX01BTkFHRURfQlVGRkVSUykgJiYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9VTk1BTkFHRURfQlVGRkVSUykgKQotICAgIHsKKyAgICBpZiAoKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmCisgICAgICAgIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAotICAgIGlmKCBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyA+IDMyICkKLSAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzID4gMzIpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICkgKQotICAgICAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpIHsKKyAgICAgICAgaWYgKChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUpIHx8CisgICAgICAgICAgICAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpKSB7CiAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSApIHx8IChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFKSApCi0gICAgICAgIHsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSkgfHwKKyAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFKSkgewogICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKLSAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPiBMVk1fUFNBX09OKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UgaGFuZGxlCiAgICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgKnBoSW5zdGFuY2UgPSAoTFZNX0hhbmRsZV90KWNhbGxvYygxLCBzaXplb2YoKnBJbnN0YW5jZSkpOworICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOwogICAgIH0KKyAgICBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKSpwaEluc3RhbmNlOworCisgICAgcEluc3RhbmNlLT5JbnN0UGFyYW1zID0gKnBJbnN0UGFyYW1zOwogCiAgICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAqIENyZWF0ZSB0aGUgYnVuZGxlIHNjcmF0Y2ggbWVtb3J5IGFuZCBpbml0aWFsc2UgdGhlIGJ1ZmZlciBtYW5hZ2VtZW50CiAgICAgICovCi0gICAgKnBoSW5zdGFuY2UgID0gKExWTV9IYW5kbGVfdClJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7Ci0gICAgcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7Ci0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSwgcGFyYW1ldGVycyBhbmQgY2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICA9ICpwTWVtb3J5VGFibGU7Ci0gICAgcEluc3RhbmNlLT5JbnN0UGFyYW1zICAgICA9ICpwSW5zdFBhcmFtczsKLQotICAgIC8qCi0gICAgICogU2V0IHRoZSBidW5kbGUgc2NyYXRjaCBtZW1vcnkgYW5kIGluaXRpYWxzZSB0aGUgYnVmZmVyIG1hbmFnZW1lbnQKLSAgICAgKi8KLSAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IChMVk1fVUlOVDE2KSgocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSkgJiBNSU5fSU5URVJOQUxfQkxPQ0tNQVNLKTsgLyogRm9yY2UgdG8gYSBtdWx0aXBsZSBvZiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICovCi0gICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKLSAgICB7CisgICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoCisgICAgICAgICAgICAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSkgJgorICAgICAgICAgICAgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLworICAgIGlmIChJbnRlcm5hbEJsb2NrU2l6ZSA8IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpIHsKICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOwogICAgIH0KIAogICAgIC8qIE1heGltdW0gSW50ZXJuYWwgQmxhY2sgU2l6ZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKi8KLSAgICBpZihJbnRlcm5hbEJsb2NrU2l6ZSA+IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUpCi0gICAgeworICAgIGlmIChJbnRlcm5hbEJsb2NrU2l6ZSA+IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUpIHsKICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOwogICAgIH0KICAgICBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplID0gKExWTV9JTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKQEAgLTU5OSw0MCArMTIwLDQ2IEBACiAgICAgLyoKICAgICAgKiBDb21tb24gc2V0dGluZ3MgZm9yIG1hbmFnZWQgYW5kIHVubWFuYWdlZCBidWZmZXJzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KLSAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7CisgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KKyAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9CisgICAgICAgICAgICAoTFZNX0lOVDMyKSgzICogTFZNX01BWF9DSEFOTkVMUyAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICBwSW5zdGFuY2UtPnBTY3JhdGNoID0gY2FsbG9jKDEsIEJ1bmRsZVNjcmF0Y2hTaXplKTsKKyAgICBpZiAocEluc3RhbmNlLT5wU2NyYXRjaCA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIE1hbmFnZWQgYnVmZmVycyByZXF1aXJlZAogICAgICAgICAgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCA9IChMVk1fQnVmZmVyX3QgKikKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSk7Ci0gICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gKExWTV9JTlQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyAqIExWTV9NQVhfQ0hBTk5FTFMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPnBTY3JhdGNoID0gKExWTV9GTE9BVCAqKQotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sIC8qIFNjcmF0Y2ggMSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpQnVuZGxlU2NyYXRjaFNpemUpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCA9CisgICAgICAgICAgICAgICAgKExWTV9CdWZmZXJfdCopY2FsbG9jKDEsIHNpemVvZigqKHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQpKSk7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgICAgICB9CisKKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+cFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKilwSW5zdGFuY2UtPnBTY3JhdGNoOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKExWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7Ci0gICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlTYW1wbGVzID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsgLyogU2V0IHRoZSBudW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwotICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5PdXREZWxheVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+QnVmZmVyU3RhdGUgPSBMVk1fRklSU1RDQUxMOyAgICAgICAgICAgICAvKiBTZXQgdGhlIHN0YXRlIHJlYWR5IGZvciB0aGUgZmlyc3QgY2FsbCAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5U2FtcGxlcyA9CisgICAgICAgICAgICAgICAgTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9CisgICAgICAgICAgICAgICAgTFZNX0ZJUlNUQ0FMTDsgLyogU2V0IHRoZSBzdGF0ZSByZWFkeSBmb3IgdGhlIGZpcnN0IGNhbGwgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZNX01PREVfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSBMVk1fRlNfODAwMDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgID0gTFZNX01PTk87Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgICA9IExWTV9IRUFEUEhPTkVTOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0VmZmVjdExldmVsICAgPSAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVkNfRWZmZWN0TGV2ZWwgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgPSAwOwogCiAgICAgLyoKICAgICAgKiBTZXQgY2FsbGJhY2sKQEAgLTY0MiwzMzggKzE2OSwyNjUgQEAKICAgICAvKgogICAgICAqIERDIHJlbW92YWwgZmlsdGVyCiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLSNlbHNlCi0gICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotI2VuZGlmCiAKICAgICAvKgogICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudAogICAgICAqLwotICAgIHBJbnN0YW5jZS0+cFRFX1RhcHMgID0gKExWTV9URV9EYXRhX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotCi0gICAgcEluc3RhbmNlLT5wVEVfU3RhdGUgPSAoTFZNX1RFX0NvZWZzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7CisgICAgcEluc3RhbmNlLT5wVEVfVGFwcyA9IChMVk1fVEVfRGF0YV90KiljYWxsb2MoMSwgc2l6ZW9mKCoocEluc3RhbmNlLT5wVEVfVGFwcykpKTsKKyAgICBpZiAocEluc3RhbmNlLT5wVEVfVGFwcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKyAgICBwSW5zdGFuY2UtPnBURV9TdGF0ZSA9IChMVk1fVEVfQ29lZnNfdCopY2FsbG9jKDEsIHNpemVvZigqKHBJbnN0YW5jZS0+cFRFX1N0YXRlKSkpOworICAgIGlmIChwSW5zdGFuY2UtPnBURV9TdGF0ZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KICAgICBwSW5zdGFuY2UtPlBhcmFtcy5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlRFX0FjdGl2ZSAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlRFX0VmZmVjdExldmVsID0gMDsKKyAgICBwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9IExWTV9GQUxTRTsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSB2b2x1bWUgY29udHJvbCBhbmQgaW5pdGlhbGlzZSBDdXJyZW50IHRvIFRhcmdldAogICAgICAqLwotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7Ci0gICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IHBJbnN0YW5jZTsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fVkNDYWxsQmFjazsKIAotICAgIC8qIEluIG1hbmFnZWQgYnVmZmVyaW5nLCBzdGFydCB3aXRoIGxvdyBzaWduYWwgbGV2ZWwgYXMgZGVsYXkgaW4gYnVmZmVyIG1hbmFnZW1lbnQgY2F1c2VzIGEgY2xpY2sqLwotICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKKyAgICAvKiBJbiBtYW5hZ2VkIGJ1ZmZlcmluZywgc3RhcnQgd2l0aCBsb3cgc2lnbmFsIGxldmVsIGFzIGRlbGF5IGluIGJ1ZmZlciBtYW5hZ2VtZW50IGNhdXNlcyBhCisgICAgICogY2xpY2sqLworICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKSB7CiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwgMCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7CiAgICAgfQogCi0gICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfODAwMCwyKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOwogCi0gICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lICAgICAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlICAgICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSA9IExWTV9GQUxTRTsKIAotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7Ci0gICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9WQ0NhbGxCYWNrOwogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKLSAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBMVk1fVkNfTUlYRVJfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GU184MDAwLCAyKTsKIAotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7Ci0gICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayA9IExWTV9WQ0NhbGxCYWNrOwogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKLSAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBMVk1fVkNfTUlYRVJfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GU184MDAwLCAyKTsKIAogICAgIC8qCi0gICAgICogU2V0IHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKKyAgICAgKiBDcmVhdGUgdGhlIGRlZmF1bHQgRVFOQiBwcmUtZ2FpbiBhbmQgcG9pbnRlciB0byB0aGUgYmFuZCBkZWZpbml0aW9ucwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMgPQotICAgICAgICAoTFZNX0VRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7Ci0gICAgcEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyA9Ci0gICAgICAgIChMVk1fRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKKyAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0gKExWTV9FUU5CX0JhbmREZWZfdCopY2FsbG9jKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCoocEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcykpKTsKKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKyAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzID0gKExWTV9FUU5CX0JhbmREZWZfdCopY2FsbG9jKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCoocEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcykpKTsKKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgIGhDU0luc3RhbmNlOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgQ1NfTWVtVGFiOyAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwotICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICBDU19DYXBhYmlsaXRpZXM7ICAgICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KLSAgICAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgTFZDU19TdGF0dXM7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgICAgIExWQ1NfSGFuZGxlX3QgaENTSW5zdGFuY2U7ICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCBDU19DYXBhYmlsaXRpZXM7IC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCisgICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RhdHVzOyAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKICAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgICAgPSAxMDA7Ci0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyVHlwZSAgICAgICAgICAgPSBMVk1fQ09OQ0VSVFNPVU5EOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT0ZGOwotICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsID0gMTAwOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgICAgIHBJbnN0YW5jZS0+Q1NfQWN0aXZlID0gTFZNX0ZBTFNFOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwotICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKICAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLkNhbGxCYWNrID0gcEluc3RhbmNlLT5DYWxsQmFjazsKICAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSA9ICh2b2lkKilwSW5zdGFuY2U7CiAKICAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKLSAgICAgICAgICovCi0gICAgICAgIExWQ1NfU3RhdHVzID0gTFZDU19NZW1vcnkoTFZNX05VTEwsICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX0NhcGFiaWxpdGllcyk7Ci0gICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICZwSW5zdGFuY2UtPkNTX0luc3RhbmNlOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCi0gICAgICAgIC8qCiAgICAgICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQogICAgICAgICAgKi8KLSAgICAgICAgaENTSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLwotICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfSW5pdCgmaENTSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbml0aWFpbHNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOwotICAgICAgICBpZiAoTFZDU19TdGF0dXMgIT0gTFZDU19TVUNDRVNTKSByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZDU19TdGF0dXMpOwotICAgICAgICBwSW5zdGFuY2UtPmhDU0luc3RhbmNlID0gaENTSW5zdGFuY2U7ICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KLQorICAgICAgICBoQ1NJbnN0YW5jZSA9IExWTV9OVUxMOyAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KKyAgICAgICAgTFZDU19TdGF0dXMgPSBMVkNTX0luaXQoJmhDU0luc3RhbmNlLCAvKiBDcmVhdGUgYW5kIGluaXRpYWlsc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX0NhcGFiaWxpdGllcywgcEluc3RhbmNlLT5wU2NyYXRjaCk7CisgICAgICAgIGlmIChMVkNTX1N0YXR1cyAhPSBMVkNTX1NVQ0NFU1MpIHJldHVybiAoKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZDU19TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhDU0luc3RhbmNlID0gaENTSW5zdGFuY2U7IC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwogICAgIH0KIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgREJFX01lbVRhYjsgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwotICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICBEQkVfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KLSAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuICAgTFZEQkVfU3RhdHVzOyAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgICAgIExWREJFX0hhbmRsZV90IGhEQkVJbnN0YW5jZTsgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCBEQkVfQ2FwYWJpbGl0aWVzOyAvKiBJbml0aWFsIGNhcGFiaWxpdGllcyAqLworICAgICAgICBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfU3RhdHVzOyAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgKi8KICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PRkY7Ci0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0NlbnRyZUZyZXEgICAgPSBMVk1fQkVfQ0VOVFJFXzU1SHo7Ci0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0VmZmVjdExldmVsICAgPSAwOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9IUEYgICAgICAgICAgID0gTFZNX0JFX0hQRl9PRkY7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0NlbnRyZUZyZXEgPSBMVk1fQkVfQ0VOVFJFXzU1SHo7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0VmZmVjdExldmVsID0gMDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfSFBGID0gTFZNX0JFX0hQRl9PRkY7CiAKLSAgICAgICAgcEluc3RhbmNlLT5EQkVfQWN0aXZlICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcEluc3RhbmNlLT5EQkVfQWN0aXZlID0gTFZNX0ZBTFNFOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfODgyMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xNzY0MDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xOTIwMDA7Ci0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuQ2VudHJlRnJlcXVlbmN5ID0gTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwgTFZEQkVfQ0FQX0NFTlRSRV85MEh6OwotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU184ODIwMCB8IExWREJFX0NBUF9GU185NjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xNzY0MDAgfCBMVkRCRV9DQVBfRlNfMTkyMDAwOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMKLSAgICAgICAgICovCi0gICAgICAgIExWREJFX1N0YXR1cyA9IExWREJFX01lbW9yeShMVk1fTlVMTCwgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOwotICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyAgICAgICAgPSAmcEluc3RhbmNlLT5EQkVfSW5zdGFuY2U7Ci0gICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKLSAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOwotICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgICAgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuQ2VudHJlRnJlcXVlbmN5ID0gTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQogICAgICAgICAgKi8KLSAgICAgICAgaERCRUluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KLSAgICAgICAgTFZEQkVfU3RhdHVzID0gTFZEQkVfSW5pdCgmaERCRUluc3RhbmNlLCAgICAgICAgICAgIC8qIEluaXRpYWlsc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX0NhcGFiaWxpdGllcyk7Ci0gICAgICAgIGlmIChMVkRCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWREJFX1N0YXR1cyk7Ci0gICAgICAgIHBJbnN0YW5jZS0+aERCRUluc3RhbmNlID0gaERCRUluc3RhbmNlOyAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgaERCRUluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCisgICAgICAgIExWREJFX1N0YXR1cyA9IExWREJFX0luaXQoJmhEQkVJbnN0YW5jZSwgLyogQ3JlYXRlIGFuZCBpbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMsIHBJbnN0YW5jZS0+cFNjcmF0Y2gpOworICAgICAgICBpZiAoTFZEQkVfU3RhdHVzICE9IExWREJFX1NVQ0NFU1MpIHJldHVybiAoKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZEQkVfU3RhdHVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5oREJFSW5zdGFuY2UgPSBoREJFSW5zdGFuY2U7IC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwogICAgIH0KIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgICBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwotICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgRVFOQl9DYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KLSAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiAgIExWRVFOQl9TdGF0dXM7ICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgICAgIExWRVFOQl9IYW5kbGVfdCBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCBFUU5CX0NhcGFiaWxpdGllczsgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU3RhdHVzOyAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgKi8KLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlICAgPSBMVk1fRVFOQl9PRkY7Ci0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfTkJhbmRzICAgICAgICAgID0gMDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5FUU5CX05CYW5kcyA9IDA7CiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gTFZNX05VTEw7Ci0gICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID0gTFZNX0ZBTFNFOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfODgyMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xNzY0MDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJhbmRzICAgICAgICA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgICAgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5DYWxsQmFjayAgICAgICAgPSBwSW5zdGFuY2UtPkNhbGxCYWNrOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgID0gKHZvaWQqKXBJbnN0YW5jZTsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSA9CisgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfAorICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwKKyAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzg4MjAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKIAotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzLCBmb3JjaW5nIGFsaWdubWVudAotICAgICAgICAgKi8KLSAgICAgICAgTFZFUU5CX1N0YXR1cyA9IExWRVFOQl9NZW1vcnkoTFZNX05VTEwsICAgICAgICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX0NhcGFiaWxpdGllcyk7Ci0gICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgICAgICAgID0gJnBJbnN0YW5jZS0+RVFOQl9JbnN0YW5jZTsKLSAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUpOwotICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyAgICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5DYWxsQmFjayA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSA9ICh2b2lkKilwSW5zdGFuY2U7CiAKICAgICAgICAgLyoKICAgICAgICAgICogSW5pdGlhbGlzZSB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKICAgICAgICAgICovCi0gICAgICAgIGhFUU5CSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCi0gICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfSW5pdCgmaEVRTkJJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFpbHNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotICAgICAgICBpZiAoTFZFUU5CX1N0YXR1cyAhPSBMVkVRTkJfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWRVFOQl9TdGF0dXMpOwotICAgICAgICBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgPSBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIGhFUU5CSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLworICAgICAgICBMVkVRTkJfU3RhdHVzID0gTFZFUU5CX0luaXQoJmhFUU5CSW5zdGFuY2UsIC8qIENyZWF0ZSBhbmQgaW5pdGlhaWxzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzLCBwSW5zdGFuY2UtPnBTY3JhdGNoKTsKKyAgICAgICAgaWYgKExWRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpIHJldHVybiAoKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZFUU5CX1N0YXR1cyk7CisgICAgICAgIHBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSA9IGhFUU5CSW5zdGFuY2U7IC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwogICAgIH0KIAogICAgIC8qCiAgICAgICogSGVhZHJvb20gbWFuYWdlbWVudCBtZW1vcnkgYWxsb2NhdGlvbgogICAgICAqLwogICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMgPSAoTFZNX0hlYWRyb29tQmFuZERlZl90ICopCi0gICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLSAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMgPSAoTFZNX0hlYWRyb29tQmFuZERlZl90ICopCi0gICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKKyAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMgPSAoTFZNX0hlYWRyb29tQmFuZERlZl90KiljYWxsb2MoCisgICAgICAgICAgICAgICAgTFZNX0hFQURST09NX01BWF9OQkFORFMsIHNpemVvZigqKHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzKSkpOworICAgICAgICBpZiAocEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgICAgIH0KKyAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMgPSAoTFZNX0hlYWRyb29tQmFuZERlZl90KiljYWxsb2MoCisgICAgICAgICAgICAgICAgTFZNX0hFQURST09NX01BWF9OQkFORFMsIHNpemVvZigqKHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzKSkpOworICAgICAgICBpZiAocEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgICAgIH0KIAogICAgICAgICAvKiBIZWFkcm9vbSBtYW5hZ2VtZW50IHBhcmFtZXRlcnMgaW5pdGlhbGlzYXRpb24gKi8KICAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7CiAgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzOwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfTG93ICAgICAgICAgID0gMjA7Ci0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblswXS5MaW1pdF9IaWdoICAgICAgICAgPSA0OTk5OwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uSGVhZHJvb21fT2Zmc2V0ICAgID0gMzsKLSAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzFdLkxpbWl0X0xvdyAgICAgICAgICA9IDUwMDA7Ci0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9IaWdoICAgICAgICAgPSAyNDAwMDsKLSAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzFdLkhlYWRyb29tX09mZnNldCAgICA9IDQ7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblswXS5MaW1pdF9Mb3cgPSAyMDsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkxpbWl0X0hpZ2ggPSA0OTk5OworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uSGVhZHJvb21fT2Zmc2V0ID0gMzsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzFdLkxpbWl0X0xvdyA9IDUwMDA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9IaWdoID0gMjQwMDA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5IZWFkcm9vbV9PZmZzZXQgPSA0OwogICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CiAKLSAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9MDsKKyAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9IDA7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBJbml0aWFsaXNlIHRoZSBQU0EgbW9kdWxlCiAgICAgICovCiAgICAgewotICAgICAgICBwTFZQU0FfSGFuZGxlX3QgICAgIGhQU0FJbnN0YW5jZSA9IExWTV9OVUxMOyAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7Ci0gICAgICAgIExWUFNBX1JFVFVSTiAgICAgICAgUFNBX1N0YXR1czsgICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgICAgIHBMVlBTQV9IYW5kbGVfdCBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWUFNBX1JFVFVSTiBQU0FfU3RhdHVzOyAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCBGaWx0ZXJzUGFyYW1zWzldOwogCi0gICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQ9PUxWTV9QU0FfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLk1heElucHV0QmxvY2tTaXplICAgICAgICAgICAgPSAoTFZNX1VJTlQxNikgMjA0ODsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMubkJhbmRzICAgICAgICAgICAgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSA5OwotICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICAgID0gJkZpbHRlcnNQYXJhbXNbMF07Ci0gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLm5CYW5kczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uQ2VudGVyRnJlcXVlbmN5ICAgID0gKExWTV9VSU5UMTYpIDEwMDA7Ci0gICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5RRmFjdG9yICAgICAgICAgICAgPSAoTFZNX1VJTlQxNikgMTAwOwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7CisgICAgICAgIGlmIChwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPSAoTFZNX1VJTlQxNik1MDA7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLk1heElucHV0QmxvY2tTaXplID0gKExWTV9VSU5UMTYpMjA0ODsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMubkJhbmRzID0gKExWTV9VSU5UMTYpOTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMucEZpbHRlcnNQYXJhbXMgPSAmRmlsdGVyc1BhcmFtc1swXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLm5CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5DZW50ZXJGcmVxdWVuY3kgPSAoTFZNX1VJTlQxNikxMDAwOworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciA9IChMVk1fVUlOVDE2KTEwMDsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlBvc3RHYWluID0gKExWTV9JTlQxNikwOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvKkdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMqLwotICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX01lbW9yeSAoaFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBTQV9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcyk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFNsb3cgRGF0YSAqLwotICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEZhc3QgRGF0YSAqLwotICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLwotICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEZhc3QgVGVtcG9yYXJ5ICovCi0gICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwwKTsKLQogICAgICAgICAgICAgLypJbml0aWFsaXNlIFBTQSBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlKi8KICAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMuRnMgPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgID0gTFZQU0FfU1BFRURfTUVESVVNOwotICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0luaXQgKCZoUFNBSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBTQV9NZW1UYWIpOworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkID0gTFZQU0FfU1BFRURfTUVESVVNOworICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSAoTFZNX0ZMT0FUKiljYWxsb2MoTUFYX0lOVEVSTkFMX0JMT0NLU0laRSwgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cFBTQUlucHV0ID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9Jbml0KCZoUFNBSW5zdGFuY2UsICZwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMsIHBJbnN0YW5jZS0+cFNjcmF0Y2gpOwogCi0gICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOworICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWTV9BTEdPUklUSE1QU0EpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSA9IGhQU0FJbnN0YW5jZTsgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSA9IGhQU0FJbnN0YW5jZTsgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCiAgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlID0gTFZNX05VTEw7CiAgICAgICAgIH0KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAqLwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSAgID0gTFZNX1BTQV9TUEVFRF9NRURJVU07Ci0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgPSBMVk1fUFNBX09GRjsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOwogICAgIH0KIAogICAgIC8qCkBAIC05OTIsMjAgKzQ0NiwxMjEgQEAKICAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX1ZDX01BU0s7CiAgICAgcEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICs9IExWTV9QU0FfTUFTSzsKIAotICAgIGlmKCgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICAmIExWTV9DU19NQVNLKSE9MCkgIHx8Ci0gICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0RCRV9NQVNLKSE9MCkgfHwKLSAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fRVFOQl9NQVNLKSE9MCl8fAotICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9URV9NQVNLKSE9MCkgIHx8Ci0gICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX1ZDX01BU0spIT0wKSkKLSAgICB7Ci0gICAgICAgIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUgICAgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlICAgID0gMTsKKyAgICBpZiAoKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fQ1NfTUFTSykgIT0gMCkgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fREJFX01BU0spICE9IDApIHx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0VRTkJfTUFTSykgIT0gMCkgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVEVfTUFTSykgIT0gMCkgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVkNfTUFTSykgIT0gMCkpIHsKKyAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSA9IDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSA9IDE7CiAgICAgfQogCi0gICAgcmV0dXJuKFN0YXR1cyk7CisgICAgcmV0dXJuIChTdGF0dXMpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fRGVsSW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLworLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVk1fRGVsSW5zdGFuY2VIYW5kbGUoTFZNX0hhbmRsZV90KiBwaEluc3RhbmNlKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CisKKyAgICBpZiAocEluc3RhbmNlLT5wU2NyYXRjaCAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cFNjcmF0Y2gpOworICAgICAgICBwSW5zdGFuY2UtPnBTY3JhdGNoID0gTFZNX05VTEw7CisgICAgfQorCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlZCBidWZmZXJzIHJlcXVpcmVkCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCAhPSBMVk1fTlVMTCkgeworICAgICAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50KTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSBMVk1fTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVHJlYmxlIEVuaGFuY2VtZW50CisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+cFRFX1RhcHMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBURV9UYXBzKTsKKyAgICAgICAgcEluc3RhbmNlLT5wVEVfVGFwcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wVEVfU3RhdGUgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBURV9TdGF0ZSk7CisgICAgICAgIHBJbnN0YW5jZS0+cFRFX1N0YXRlID0gTFZNX05VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGcmVlIHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMpOworICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPSBMVk1fTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERlLWluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+aENTSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZDU19EZUluaXQoJnBJbnN0YW5jZS0+aENTSW5zdGFuY2UpOworICAgIH0KKworICAgIC8qCisgICAgICogRGUtaW5pdGlhbGlzZSB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5oREJFSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZEQkVfRGVJbml0KCZwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZS1pbml0aWFsaXNlIHRoZSBOLUJhbmQgRXF1YWxpc2VyIG1vZHVsZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZFUU5CX0RlSW5pdCgmcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZyZWUgSGVhZHJvb20gbWFuYWdlbWVudCBtZW1vcnkuCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMpOworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID0gTFZNX05VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZS1pbml0aWFsaXNlIHRoZSBQU0EgbW9kdWxlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlICE9IExWTV9OVUxMKSB7CisgICAgICAgIExWUFNBX0RlSW5pdCgmcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UpOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wUFNBSW5wdXQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBQU0FJbnB1dCk7CisgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gTFZNX05VTEw7CisgICAgfQorCisgICAgZnJlZSgqcGhJbnN0YW5jZSk7CisgICAgcmV0dXJuOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwMjcsNDggKzU4MiwzNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpCi17Ci0gICAgTFZNX01lbVRhYl90ICAgICAgICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsgLyogUG9pbnRlciB0byBJbnN0YW5jZSAqLwotICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgIEhlYWRyb29tUGFyYW1zOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSkgeworICAgIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOyAvKiBQb2ludGVyIHRvIEluc3RhbmNlICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7CiAKLSAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwpeworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKICAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKICAgICB9CiAKLSAgICAvKiBTYXZlIHRoZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlIGludGVybmFsIGZ1bmN0aW9uIGNhbGxzICovCisgICAgLyogU2F2ZSB0aGUgY29udHJvbCBwYXJhbWV0ZXJzICovIC8qIGNvdmVyaXR5W3VuY2hlY2tlZF92YWx1ZV0gKi8gLyogRG8gbm90IGNoZWNrIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGZ1bmN0aW9uIGNhbGxzICovCiAgICAgTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKGhJbnN0YW5jZSwgJlBhcmFtcyk7CiAKICAgICAvKlNhdmUgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMqLwogICAgIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhoSW5zdGFuY2UsICZIZWFkcm9vbVBhcmFtcyk7CiAKLSAgICAvKiAgUmV0cmlldmUgYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gbWVtdGFiICovCi0gICAgTFZNX0dldE1lbW9yeVRhYmxlKGhJbnN0YW5jZSwgJk1lbVRhYiwgIExWTV9OVUxMKTsKLQogICAgIC8qICBTYXZlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCiAgICAgSW5zdFBhcmFtcyA9IHBJbnN0YW5jZS0+SW5zdFBhcmFtczsKIAogICAgIC8qICBDYWxsICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgdG8gcmUtaW5pdGlhbGlzZSB0aGUgYnVuZGxlICovCi0gICAgTFZNX0dldEluc3RhbmNlSGFuZGxlKCAmaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKLQotICAgIC8qIFJlc3RvcmUgY29udHJvbCBwYXJhbWV0ZXJzICovIC8qIGNvdmVyaXR5W3VuY2hlY2tlZF92YWx1ZV0gKi8gLyogRG8gbm90IGNoZWNrIHJldHVybiB2YWx1ZSBpbnRlcm5hbCBmdW5jdGlvbiBjYWxscyAqLworICAgIC8qIFJlc3RvcmUgY29udHJvbCBwYXJhbWV0ZXJzICovIC8qIGNvdmVyaXR5W3VuY2hlY2tlZF92YWx1ZV0gKi8gLyogRG8gbm90IGNoZWNrIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCAmUGFyYW1zKTsKIAogICAgIC8qUmVzdG9yZSB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyovCiAgICAgTFZNX1NldEhlYWRyb29tUGFyYW1zKGhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAogICAgIC8qIERDIHJlbW92YWwgZmlsdGVyICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLSNlbHNlCi0gICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotI2VuZGlmCiAKICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCmluZGV4IGRkYWFjOTkuLjkwYTFmMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaApAQCAtMzMsMTQgKzMzLDE0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgIkxWTS5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlmZVZpYmVzICovCi0jaW5jbHVkZSAiTFZNX0NvbW1vbi5oIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaWZlVmliZXMgY29tbW9uICovCi0jaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgbGlicmFyeSAqLwotI2luY2x1ZGUgIkxWQ19NaXhlci5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgbGlicmFyeSAqLwotI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAgLyogQ29uY2VydCBTb3VuZCAqLwotI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50ICovCi0jaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAvKiBOLUJhbmQgZXF1YWxpc2VyICovCi0jaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJhbWV0cmljIFNwZWN0cnVtIEFuYWx5emVyICovCisjaW5jbHVkZSAiTFZNLmgiICAgICAgICAgICAgLyogTGlmZVZpYmVzICovCisjaW5jbHVkZSAiTFZNX0NvbW1vbi5oIiAgICAgLyogTGlmZVZpYmVzIGNvbW1vbiAqLworI2luY2x1ZGUgIkJJUVVBRC5oIiAgICAgICAgIC8qIEJpcXVhZCBsaWJyYXJ5ICovCisjaW5jbHVkZSAiTFZDX01peGVyLmgiICAgICAgLyogTWl4ZXIgbGlicmFyeSAqLworI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIiAgIC8qIENvbmNlcnQgU291bmQgKi8KKyNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgKi8KKyNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIiAvKiBOLUJhbmQgZXF1YWxpc2VyICovCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIiAgLyogUGFyYW1ldHJpYyBTcGVjdHJ1bSBBbmFseXplciAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ5LDYzICs0OSw2NCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogR2VuZXJhbCAqLwotI2RlZmluZSBMVk1fSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCisjZGVmaW5lIExWTV9JTlZBTElEIDB4RkZGRiAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCiAKIC8qIE1lbW9yeSAqLwotI2RlZmluZSBMVk1fSU5TVEFOQ0VfQUxJR04gICAgICAgICAgICAgIDQgICAgICAgICAvKiAzMi1iaXQgZm9yIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgTFZNX0ZJUlNUQ0FMTCAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmlyc3QgY2FsbCB0byB0aGUgYnVmZmVyICovCi0jZGVmaW5lIExWTV9NQVhCTE9DS0NBTEwgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBjYWxscyB0byB0aGUgYnVmZmVyICovCi0jZGVmaW5lIExWTV9MQVNUQ0FMTCAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIExhc3QgY2FsbCB0byB0aGUgYnVmZmVyICovCi0jZGVmaW5lIExWTV9GSVJTVExBU1RDQUxMICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNpbmdsZSBjYWxsIGZvciBzbWFsbCBudW1iZXIgb2Ygc2FtcGxlcyAqLworI2RlZmluZSBMVk1fSU5TVEFOQ0VfQUxJR04gNCAvKiAzMi1iaXQgZm9yIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgTFZNX0ZJUlNUQ0FMTCAwICAgICAgLyogRmlyc3QgY2FsbCB0byB0aGUgYnVmZmVyICovCisjZGVmaW5lIExWTV9NQVhCTE9DS0NBTEwgMSAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBjYWxscyB0byB0aGUgYnVmZmVyICovCisjZGVmaW5lIExWTV9MQVNUQ0FMTCAyICAgICAgIC8qIExhc3QgY2FsbCB0byB0aGUgYnVmZmVyICovCisjZGVmaW5lIExWTV9GSVJTVExBU1RDQUxMIDMgIC8qIFNpbmdsZSBjYWxsIGZvciBzbWFsbCBudW1iZXIgb2Ygc2FtcGxlcyAqLwogCiAvKiBCbG9jayBTaXplICovCi0jZGVmaW5lIExWTV9NSU5fTUFYQkxPQ0tTSVpFICAgICAgICAgICAgMTYgICAgICAgIC8qIE1pbmltdW0gTWF4QmxvY2tTaXplIExpbWl0Ki8KLSNkZWZpbmUgTFZNX01BTkFHRURfTUFYX01BWEJMT0NLU0laRSAgICA4MTkxICAgICAgLyogTWF4aW11bSBNYXhCbG9ja1N6aWUgTGltaXQgZm9yIE1hbmFnZWQgQnVmZmVyIE1vZGUqLwotI2RlZmluZSBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgIDQwOTYgICAgICAvKiBNYXhpbXVtIE1heEJsb2NrU3ppZSBMaW1pdCBmb3IgVW5tYW5hZ2VkIEJ1ZmZlciBNb2RlICovCisjZGVmaW5lIExWTV9NSU5fTUFYQkxPQ0tTSVpFIDE2ICAgICAgICAgICAvKiBNaW5pbXVtIE1heEJsb2NrU2l6ZSBMaW1pdCovCisjZGVmaW5lIExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgODE5MSAvKiBNYXhpbXVtIE1heEJsb2NrU3ppZSBMaW1pdCBmb3IgTWFuYWdlZCBCdWZmZXIgTW9kZSovCisjZGVmaW5lIExWTV9VTk1BTkFHRURfTUFYX01BWEJMT0NLU0laRSBcCisgICAgNDA5NiAvKiBNYXhpbXVtIE1heEJsb2NrU3ppZSBMaW1pdCBmb3IgVW5tYW5hZ2VkIEJ1ZmZlciBNb2RlICovCiAKLSNkZWZpbmUgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAgICAgICAgICA4MTI4ICAgICAgLyogTWF4aW11bSBtdWx0aXBsZSBvZiA2NCAgYmVsb3cgODE5MSovCisjZGVmaW5lIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgODEyOCAvKiBNYXhpbXVtIG11bHRpcGxlIG9mIDY0ICBiZWxvdyA4MTkxKi8KIAotI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICAgICAgICAgIDE2ICAgICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KLSNkZWZpbmUgTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQgICAgICAgICA0ICAgICAgICAgLyogTWluaW11bSBpbnRlcm5hbCBibG9jayBzaXplIGFzIGEgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tNQVNLICAgICAgICAgIDB4RkZGMCAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgbWFzayAqLworI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFIDE2ICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KKyNkZWZpbmUgTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQgNCAgICAgLyogTWluaW11bSBpbnRlcm5hbCBibG9jayBzaXplIGFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tNQVNLIDB4RkZGMCAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgbWFzayAqLwogCi0jZGVmaW5lIExWTV9QU0FfRFlOQU1JQ1JBTkdFICAgICAgICAgICAgNjAgICAgICAgIC8qIFNwZWN0cmFsIER5bmFtaWMgcmFuZ2U6IHVzZWQgZm9yIG9mZnNldGluZyBvdXRwdXQqLwotI2RlZmluZSBMVk1fUFNBX0JBUkhFSUdIVCAgICAgICAgICAgICAgIDEyNyAgICAgICAvKiBTcGVjdHJhbCBCYXIgSGVpZ2h0Ki8KKyNkZWZpbmUgTFZNX1BTQV9EWU5BTUlDUkFOR0UgNjAgLyogU3BlY3RyYWwgRHluYW1pYyByYW5nZTogdXNlZCBmb3Igb2Zmc2V0aW5nIG91dHB1dCovCisjZGVmaW5lIExWTV9QU0FfQkFSSEVJR0hUIDEyNyAgIC8qIFNwZWN0cmFsIEJhciBIZWlnaHQqLwogCi0jZGVmaW5lIExWTV9URV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qVEUgTWluaW11bSBFZmZlY3RMZXZlbCovCi0jZGVmaW5lIExWTV9URV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qVEUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworI2RlZmluZSBMVk1fVEVfTUlOX0VGRkVDVExFVkVMIDAgIC8qVEUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9URV9NQVhfRUZGRUNUTEVWRUwgMTUgLypURSBNYXhpbXVtIEVmZmVjdCBsZXZlbCovCiAKLSNkZWZpbmUgTFZNX1ZDX01JTl9FRkZFQ1RMRVZFTCAgICAgICAgICAoLTk2KSAgICAgLypWQyBNaW5pbXVtIEVmZmVjdExldmVsKi8KLSNkZWZpbmUgTFZNX1ZDX01BWF9FRkZFQ1RMRVZFTCAgICAgICAgICAwICAgICAgICAgLypWQyBNYXhpbXVtIEVmZmVjdCBsZXZlbCovCisjZGVmaW5lIExWTV9WQ19NSU5fRUZGRUNUTEVWRUwgKC05NikgLypWQyBNaW5pbXVtIEVmZmVjdExldmVsKi8KKyNkZWZpbmUgTFZNX1ZDX01BWF9FRkZFQ1RMRVZFTCAwICAgICAvKlZDIE1heGltdW0gRWZmZWN0IGxldmVsKi8KIAotI2RlZmluZSBMVk1fQkVfTUlOX0VGRkVDVExFVkVMICAgICAgICAgIDAgICAgICAgICAvKkJFIE1pbmltdW0gRWZmZWN0TGV2ZWwqLwotI2RlZmluZSBMVk1fQkVfTUFYX0VGRkVDVExFVkVMICAgICAgICAgIDE1ICAgICAgICAvKkJFIE1heGltdW0gRWZmZWN0IGxldmVsKi8KKyNkZWZpbmUgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCAwICAvKkJFIE1pbmltdW0gRWZmZWN0TGV2ZWwqLworI2RlZmluZSBMVk1fQkVfTUFYX0VGRkVDVExFVkVMIDE1IC8qQkUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLwogCi0jZGVmaW5lIExWTV9FUU5CX01JTl9CQU5EX0ZSRVEgICAgICAgICAgMjAgICAgICAgIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KLSNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfRlJFUSAgICAgICAgICAyNDAwMCAgICAgLypFUU5CIE1heGltdW0gQmFuZCBGcmVxdWVuY3kqLwotI2RlZmluZSBMVk1fRVFOQl9NSU5fQkFORF9HQUlOICAgICAgICAgICgtMTUpICAgICAvKkVRTkIgTWluaW11bSBCYW5kIEZyZXF1ZW5jeSovCi0jZGVmaW5lIExWTV9FUU5CX01BWF9CQU5EX0dBSU4gICAgICAgICAgMTUgICAgICAgIC8qRVFOQiBNYXhpbXVtIEJhbmQgRnJlcXVlbmN5Ki8KLSNkZWZpbmUgTFZNX0VRTkJfTUlOX1FGQUNUT1IgICAgICAgICAgICAyNSAgICAgICAgLypFUU5CIE1pbmltdW0gUSBGYWN0b3IqLwotI2RlZmluZSBMVk1fRVFOQl9NQVhfUUZBQ1RPUiAgICAgICAgICAgIDEyMDAgICAgICAvKkVRTkIgTWF4aW11bSBRIEZhY3RvciovCi0jZGVmaW5lIExWTV9FUU5CX01JTl9MUEZfRlJFUSAgICAgICAgICAgMTAwMCAgICAgIC8qRVFOQiBNaW5pbXVtIExvdyBQYXNzIENvcm5lciBmcmVxdWVuY3kqLwotI2RlZmluZSBMVk1fRVFOQl9NSU5fSFBGX0ZSRVEgICAgICAgICAgIDIwICAgICAgICAvKkVRTkIgTWluaW11bSBIaWdoIFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCi0jZGVmaW5lIExWTV9FUU5CX01BWF9IUEZfRlJFUSAgICAgICAgICAgMTAwMCAgICAgIC8qRVFOQiBNYXhpbXVtIEhpZ2ggUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSAyMCAgICAvKkVRTkIgTWluaW11bSBCYW5kIEZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01BWF9CQU5EX0ZSRVEgMjQwMDAgLypFUU5CIE1heGltdW0gQmFuZCBGcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fQkFORF9HQUlOICgtMTUpIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfR0FJTiAxNSAgICAvKkVRTkIgTWF4aW11bSBCYW5kIEZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01JTl9RRkFDVE9SIDI1ICAgICAgLypFUU5CIE1pbmltdW0gUSBGYWN0b3IqLworI2RlZmluZSBMVk1fRVFOQl9NQVhfUUZBQ1RPUiAxMjAwICAgIC8qRVFOQiBNYXhpbXVtIFEgRmFjdG9yKi8KKyNkZWZpbmUgTFZNX0VRTkJfTUlOX0xQRl9GUkVRIDEwMDAgICAvKkVRTkIgTWluaW11bSBMb3cgUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUlOX0hQRl9GUkVRIDIwICAgICAvKkVRTkIgTWluaW11bSBIaWdoIFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01BWF9IUEZfRlJFUSAxMDAwICAgLypFUU5CIE1heGltdW0gSGlnaCBQYXNzIENvcm5lciBmcmVxdWVuY3kqLwogCi0jZGVmaW5lIExWTV9DU19NSU5fRUZGRUNUX0xFVkVMICAgICAgICAgMCAgICAgICAgIC8qQ1MgTWluaW11bSBFZmZlY3QgTGV2ZWwqLwotI2RlZmluZSBMVk1fQ1NfTUFYX1JFVkVSQl9MRVZFTCAgICAgICAgIDEwMCAgICAgICAvKkNTIE1heGltdW0gUmV2ZXJiIExldmVsKi8KLSNkZWZpbmUgTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwgMTAwICAgICAgLypWaXRydWFsaXplciBNYXhpbXVtIFJldmVyYiBMZXZlbCovCisjZGVmaW5lIExWTV9DU19NSU5fRUZGRUNUX0xFVkVMIDAgICAgICAgICAgICAvKkNTIE1pbmltdW0gRWZmZWN0IExldmVsKi8KKyNkZWZpbmUgTFZNX0NTX01BWF9SRVZFUkJfTEVWRUwgMTAwICAgICAgICAgIC8qQ1MgTWF4aW11bSBSZXZlcmIgTGV2ZWwqLworI2RlZmluZSBMVk1fVklSVFVBTElaRVJfTUFYX1JFVkVSQl9MRVZFTCAxMDAgLypWaXRydWFsaXplciBNYXhpbXVtIFJldmVyYiBMZXZlbCovCiAKLSNkZWZpbmUgTFZNX1ZDX01JWEVSX1RJTUUgICAgICAgICAgICAgIDEwMCAgICAgICAvKlZDIG1peGVyIHRpbWUqLwotI2RlZmluZSBMVk1fVkNfQkFMQU5DRV9NQVggICAgICAgICAgICAgOTYgICAgICAgIC8qVkMgYmFsYW5jZSBtYXggdmFsdWUqLwotI2RlZmluZSBMVk1fVkNfQkFMQU5DRV9NSU4gICAgICAgICAgICAgKC05NikgICAgIC8qVkMgYmFsYW5jZSBtaW4gdmFsdWUqLworI2RlZmluZSBMVk1fVkNfTUlYRVJfVElNRSAxMDAgICAgLypWQyBtaXhlciB0aW1lKi8KKyNkZWZpbmUgTFZNX1ZDX0JBTEFOQ0VfTUFYIDk2ICAgIC8qVkMgYmFsYW5jZSBtYXggdmFsdWUqLworI2RlZmluZSBMVk1fVkNfQkFMQU5DRV9NSU4gKC05NikgLypWQyBiYWxhbmNlIG1pbiB2YWx1ZSovCiAKIC8qIEFsZ29yaXRobSBtYXNrcyAqLwotI2RlZmluZSBMVk1fQ1NfTUFTSyAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTFZNX0VRTkJfTUFTSyAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIExWTV9EQkVfTUFTSyAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBMVk1fVkNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIExWTV9URV9NQVNLICAgICAgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgTFZNX1BTQV9NQVNLICAgICAgICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIExWTV9DU19NQVNLIDEKKyNkZWZpbmUgTFZNX0VRTkJfTUFTSyAyCisjZGVmaW5lIExWTV9EQkVfTUFTSyA0CisjZGVmaW5lIExWTV9WQ19NQVNLIDE2CisjZGVmaW5lIExWTV9URV9NQVNLIDMyCisjZGVmaW5lIExWTV9QU0FfTUFTSyAyMDQ4CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTEzLDEzMyArMTE0LDEwMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgQWxpZ25tZW50OyAgICAgICAgICAvKiBCeXRlIGFsaWdubWVudCAqLwotICAgIExWTV9NZW1vcnlUeXBlc19lbiAgICAgIFR5cGU7ICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZNX0ludE1lbW9yeVJlZ2lvbl90OwotCi0vKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JbnRNZW1vcnlSZWdpb25fdCAgIFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCi19IExWTV9JbnRNZW1UYWJfdDsKLQogLyogQnVmZmVyIE1hbmFnZW1lbnQgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQqIHBTY3JhdGNoOyAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KIAotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJ1ZmZlclN0YXRlOyAgICAgICAgLyogQnVmZmVyIHN0YXR1cyAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzMgKiBMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07Ci0jZWxzZQotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbNiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBJbnB1dCBidWZmZXIgZGVsYXkgbGluZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KLSNlbmRpZgotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlTYW1wbGVzOyAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlcltMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07Ci0jZWxzZQotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyWzIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogT3V0cHV0IGJ1ZmZlciBkZWxheSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKi8KLSNlbmRpZgotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLworICAgIExWTV9JTlQxNiBCdWZmZXJTdGF0ZTsgLyogQnVmZmVyIHN0YXR1cyAqLworICAgIExWTV9GTE9BVCBJbkRlbGF5QnVmZmVyWzMgKiBMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07CisgICAgTFZNX0lOVDE2IEluRGVsYXlTYW1wbGVzOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisgICAgTFZNX0ZMT0FUIE91dERlbGF5QnVmZmVyW0xWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsKKyAgICBMVk1fSU5UMTYgT3V0RGVsYXlTYW1wbGVzOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBMVk1fSU5UMTYgU2FtcGxlc1RvT3V0cHV0OyAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KIH0gTFZNX0J1ZmZlcl90OwogCiAvKiBGaWx0ZXIgdGFwcyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KIH0gTFZNX1RFX0RhdGFfdDsKIAogLyogQ29lZmZpY2llbnRzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFRyZWJsZUJvb3N0X1N0YXRlOyAgLyogU3RhdGUgZm9yIHRoZSB0cmVibGUgYm9vc3QgZmlsdGVyICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgVHJlYmxlQm9vc3RfU3RhdGU7IC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLwogfSBMVk1fVEVfQ29lZnNfdDsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLwotICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgIE1lbW9yeVRhYmxlOyAgICAgICAgLyogSW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgIEluc3RQYXJhbXM7ICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgUGFyYW1zOyAgLyogQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCiAKICAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBDb250cm9sUGVuZGluZzsgICAgIC8qIENvbnRyb2wgZmxhZyB0byBpbmRpY2F0ZSB1cGRhdGUgcGVuZGluZyAqLwotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIE5ld1BhcmFtczsgICAgICAgICAgLyogTmV3IGNvbnRyb2wgcGFyYW1ldGVycyBwZW5kaW5nIHVwZGF0ZSAqLworICAgIExWTV9VSU5UMTYgQ29udHJvbFBlbmRpbmc7ICAgICAvKiBDb250cm9sIGZsYWcgdG8gaW5kaWNhdGUgdXBkYXRlIHBlbmRpbmcgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IE5ld1BhcmFtczsgLyogTmV3IGNvbnRyb2wgcGFyYW1ldGVycyBwZW5kaW5nIHVwZGF0ZSAqLwogCiAgICAgLyogQnVmZmVyIGNvbnRyb2wgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZTsgIC8qIE1heGltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLwotICAgIExWTV9CdWZmZXJfdCAgICAgICAgICAgICpwQnVmZmVyTWFuYWdlbWVudDsgLyogQnVmZmVyIG1hbmFnZW1lbnQgdmFyaWFibGVzICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzczsgICAvKiBJbnB1dCBzYW1wbGVzIGxlZnQgdG8gcHJvY2VzcyAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRTYW1wbGVzOyAgICAgLyogRXh0ZXJuYWwgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dFNhbXBsZXM7ICAgIC8qIEV4dGVybmFsIG91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgIExWTV9JTlQxNiBJbnRlcm5hbEJsb2NrU2l6ZTsgICAgIC8qIE1heGltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLworICAgIExWTV9CdWZmZXJfdCogcEJ1ZmZlck1hbmFnZW1lbnQ7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqLworICAgIExWTV9JTlQxNiBTYW1wbGVzVG9Qcm9jZXNzOyAgICAgIC8qIElucHV0IHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisgICAgTFZNX0ZMT0FUKiBwSW5wdXRTYW1wbGVzOyAgICAgICAgLyogRXh0ZXJuYWwgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBMVk1fRkxPQVQqIHBPdXRwdXRTYW1wbGVzOyAgICAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KIAogICAgIC8qIENvbmZpZ3VyYXRpb24gbnVtYmVyICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbk51bWJlcjsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBCbGlja1NpemVNdWx0aXBsZTsKKyAgICBMVk1fSU5UMzIgQ29uZmlndXJhdGlvbk51bWJlcjsKKyAgICBMVk1fSU5UMzIgQmxpY2tTaXplTXVsdGlwbGU7CiAKICAgICAvKiBEQyByZW1vdmFsICovCi0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90IERDX1JlbW92YWxJbnN0YW5jZTsgLyogREMgcmVtb3ZhbCBmaWx0ZXIgaW5zdGFuY2UgKi8KIAogICAgIC8qIENvbmNlcnQgU291bmQgKi8KLSAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgQ1NfSW5zdGFuY2U7ICAgICAgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQ1NfQWN0aXZlOyAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKyAgICBMVkNTX0hhbmRsZV90IGhDU0luc3RhbmNlOyAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZDU19JbnN0YW5jZV90IENTX0luc3RhbmNlOyAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlICovCisgICAgTFZNX0lOVDE2IENTX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIEVxdWFsaXplciAqLwotICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgIGhFUU5CSW5zdGFuY2U7ICAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAgICBFUU5CX0luc3RhbmNlOyAgICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgaW5zdGFuY2UgKi8KLSAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAqcEVRTkJfQmFuZERlZnM7ICAgIC8qIExvY2FsIHN0b3JhZ2UgZm9yIG5ldyBkZWZpbml0aW9ucyAqLwotICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICpwRVFOQl9Vc2VyRGVmczsgICAgLyogTG9jYWwgc3RvcmFnZSBmb3IgdGhlIHVzZXIncyBkZWZpbml0aW9ucyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVRTkJfQWN0aXZlOyAgICAgICAgLyogQ29udHJvbCBmbGFnICovCisgICAgTFZFUU5CX0hhbmRsZV90IGhFUU5CSW5zdGFuY2U7ICAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMVkVRTkJfSW5zdGFuY2VfdCBFUU5CX0luc3RhbmNlOyAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIGluc3RhbmNlICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90KiBwRVFOQl9CYW5kRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90KiBwRVFOQl9Vc2VyRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgdGhlIHVzZXIncyBkZWZpbml0aW9ucyAqLworICAgIExWTV9JTlQxNiBFUU5CX0FjdGl2ZTsgICAgICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLwogCiAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50ICovCi0gICAgTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaERCRUluc3RhbmNlOyAgICAgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAgICAgREJFX0luc3RhbmNlOyAgICAgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBEQkVfQWN0aXZlOyAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworICAgIExWREJFX0hhbmRsZV90IGhEQkVJbnN0YW5jZTsgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZEQkVfSW5zdGFuY2VfdCBEQkVfSW5zdGFuY2U7IC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSAqLworICAgIExWTV9JTlQxNiBEQkVfQWN0aXZlOyAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIFZvbHVtZSBDb250cm9sICovCi0gICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCi0gICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICAgVkNfQmFsYW5jZU1peDsgICAgICAvKiBWQyBiYWxhbmNlIG1peGVyICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfVm9sdW1lZEI7ICAgICAgICAvKiBHYWluIGluIGRCICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQWN0aXZlOyAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19BVkxGaXhlZFZvbHVtZTsgIC8qIEFWTCBmaXhlZCB2b2x1bWUgKi8KKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgVkNfVm9sdW1lOyAgICAgLyogVm9sdW1lIHNjYWxlciAqLworICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCBWQ19CYWxhbmNlTWl4OyAvKiBWQyBiYWxhbmNlIG1peGVyICovCisgICAgTFZNX0lOVDE2IFZDX1ZvbHVtZWRCOyAgICAgICAgICAgICAgIC8qIEdhaW4gaW4gZEIgKi8KKyAgICBMVk1fSU5UMTYgVkNfQWN0aXZlOyAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCisgICAgTFZNX0lOVDE2IFZDX0FWTEZpeGVkVm9sdW1lOyAgICAgICAgIC8qIEFWTCBmaXhlZCB2b2x1bWUgKi8KIAogICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCAqLwotICAgIExWTV9URV9EYXRhX3QgICAgICAgICAgICpwVEVfVGFwczsgICAgICAgICAgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KLSAgICBMVk1fVEVfQ29lZnNfdCAgICAgICAgICAqcFRFX1N0YXRlOyAgICAgICAgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFRFX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCisgICAgTFZNX1RFX0RhdGFfdCogcFRFX1RhcHM7ICAgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KKyAgICBMVk1fVEVfQ29lZnNfdCogcFRFX1N0YXRlOyAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KKyAgICBMVk1fSU5UMTYgVEVfQWN0aXZlOyAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIEhlYWRyb29tICovCi0gICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgTmV3SGVhZHJvb21QYXJhbXM7ICAgLyogTmV3IGhlYWRyb29tIHBhcmFtZXRlcnMgcGVuZGluZyB1cGRhdGUgKi8KLSAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCAgICBIZWFkcm9vbVBhcmFtczsgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgKnBIZWFkcm9vbV9CYW5kRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgKnBIZWFkcm9vbV9Vc2VyRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgdGhlIHVzZXIncyBkZWZpbml0aW9ucyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEhlYWRyb29tOyAgICAgICAgICAgIC8qIFZhbHVlIG9mIHRoZSBjdXJyZW50IGhlYWRyb29tICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgTmV3SGVhZHJvb21QYXJhbXM7ICAgIC8qIE5ldyBoZWFkcm9vbSBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgIC8qIEhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSGVhZHJvb21CYW5kRGVmX3QqIHBIZWFkcm9vbV9CYW5kRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90KiBwSGVhZHJvb21fVXNlckRlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fVUlOVDE2IEhlYWRyb29tOyAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgb2YgdGhlIGN1cnJlbnQgaGVhZHJvb20gKi8KIAogICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyICovCi0gICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgaFBTQUluc3RhbmNlOyAgICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICBQU0FfSW5zdGFuY2U7ICAgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluc3RhbmNlICovCi0gICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgUFNBX0luaXRQYXJhbXM7ICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUFNBX0NvbnRyb2xQYXJhbXM7ICAvKiBTcGVjdHJ1bSBBbmFseXplciBjb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBQU0FfR2Fpbk9mZnNldDsgICAgIC8qIFRvbmUgY29udHJvbCBmbGFnICovCi0gICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2s7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBQU0FJbnB1dDsgICAgICAgICAvKiBQU0EgaW5wdXQgcG9pbnRlciAqLworICAgIHBMVlBTQV9IYW5kbGVfdCBoUFNBSW5zdGFuY2U7ICAgICAgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZQU0FfSW5zdGFuY2VQcl90IFBTQV9JbnN0YW5jZTsgICAgICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbnN0YW5jZSAqLworICAgIExWUFNBX0luaXRQYXJhbXNfdCBQU0FfSW5pdFBhcmFtczsgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCBQU0FfQ29udHJvbFBhcmFtczsgLyogU3BlY3RydW0gQW5hbHl6ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX0lOVDE2IFBTQV9HYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiBUb25lIGNvbnRyb2wgZmxhZyAqLworICAgIExWTV9DYWxsYmFjayBDYWxsQmFjazsKKyAgICBMVk1fRkxPQVQqIHBQU0FJbnB1dDsgLyogUFNBIGlucHV0IHBvaW50ZXIgKi8KIAotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KKyAgICBMVk1fSU5UMTYgTm9TbW9vdGhWb2x1bWU7IC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCiAKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOckNoYW5uZWxzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgQ2hNYXNrOwotI2VuZGlmCisgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHM7CisgICAgTFZNX0lOVDMyIENoTWFzazsKKyAgICB2b2lkKiBwU2NyYXRjaDsgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIqLwogCiB9IExWTV9JbnN0YW5jZV90OwogCkBAIC0yNDksMzIgKzIxOSwxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UpOwogCi12b2lkICAgIExWTV9TZXRUcmVibGVCb29zdCggTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwordm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcyk7CiAKLXZvaWQgICAgTFZNX1NldFZvbHVtZSggIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwordm9pZCBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCi1MVk1fSU5UMzIgICAgTFZNX1ZDQ2FsbEJhY2sodm9pZCogICBwQnVuZGxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSk7CitMVk1fSU5UMzIgTFZNX1ZDQ2FsbEJhY2sodm9pZCogcEJ1bmRsZUhhbmRsZSwgdm9pZCogcEdlbmVyYWxQdXJwb3NlLCBzaG9ydCBDYWxsQmFja1BhcmFtKTsKIAotdm9pZCAgICBMVk1fU2V0SGVhZHJvb20oICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKLXZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKLXZvaWQgICAgTFZNX0J1ZmZlck91dCggIExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcyk7Cit2b2lkIExWTV9TZXRIZWFkcm9vbShMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwgTFZNX0ZMT0FUKiogcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCoqIHBQcm9jZXNzZWQsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKTsKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcyk7CiAKLUxWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCAgICAgdm9pZCAgICAgICAgICAqcEJ1bmRsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgY2FsbGJhY2tJZCk7CitMVk1fSU5UMzIgTFZNX0FsZ29DYWxsQmFjayh2b2lkKiBwQnVuZGxlSGFuZGxlLCB2b2lkKiBwRGF0YSwgTFZNX0lOVDE2IGNhbGxiYWNrSWQpOwogCi0jZW5kaWYgICAgICAvKiBfX0xWTV9QUklWQVRFX0hfXyAqLwotCisjZW5kaWYgLyogX19MVk1fUFJJVkFURV9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcAppbmRleCBkYzg2Y2ZkLi5jOTRjNDY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuY3BwCkBAIC01MSw3NyArNTEsNjEgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSkKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCAgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDMyICAgICAgICAgICBOckNoYW5uZWxzICA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIENoTWFzayAgICAgID0gcEluc3RhbmNlLT5DaE1hc2s7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzLCBMVk1fVUlOVDMyIEF1ZGlvVGltZSkgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2IFNhbXBsZUNvdW50ID0gTnVtU2FtcGxlczsKKyAgICBMVk1fRkxPQVQqIHBJbnB1dCA9IChMVk1fRkxPQVQqKXBJbkRhdGE7CisgICAgTFZNX0ZMT0FUKiBwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQqIHBQcm9jZXNzZWQgPSBwT3V0RGF0YTsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIFN0YXR1czsKKyAgICBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyAgICBMVk1fSU5UMzIgQ2hNYXNrID0gcEluc3RhbmNlLT5DaE1hc2s7CiAjZGVmaW5lIE5yRnJhbWVzIFNhbXBsZUNvdW50ICAvLyBhbGlhcyBmb3IgY2xhcml0eQotI2VuZGlmCiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCiAgICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgaWYgKE51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gKExWTV9TVUNDRVNTKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIENoZWNrIHZhbGlkIHBvaW50cyBoYXZlIGJlZW4gZ2l2ZW4KICAgICAgKi8KLSAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBGb3IgdW5tYW5hZ2VkIG1vZGUgb25seQogICAgICAqLwotICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9VTk1BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgICAvKgorICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpIHsKKyAgICAgICAgLyoKICAgICAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIGEgZ29vZCBtdWx0aXBsZSAodW5tYW5hZ2VkIG1vZGUgb25seSkKICAgICAgICAgICovCi0gICAgICAgIGlmKChOdW1TYW1wbGVzICUgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWTV9JTlZBTElETlVNU0FNUExFUyk7CisgICAgICAgIGlmICgoTnVtU2FtcGxlcyAlIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX0lOVkFMSUROVU1TQU1QTEVTKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qCiAgICAgICAgICAqIENoZWNrIHRoZSBidWZmZXIgYWxpZ25tZW50CiAgICAgICAgICAqLwotICAgICAgICBpZigoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZNX0FMSUdOTUVOVEVSUk9SKTsKKyAgICAgICAgaWYgKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX0FMSUdOTUVOVEVSUk9SKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIG5ldyBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeQogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkgewogICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgLyogVXBkYXRlIHRoZSBsb2NhbCB2YXJpYWJsZSBOckNoYW5uZWxzIGZyb20gcEluc3RhbmNlLT5OckNoYW5uZWxzIHZhbHVlICovCiAgICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7Ci0gICAgICAgIENoTWFzayAgICAgPSBwSW5zdGFuY2UtPkNoTWFzazsKLSNlbmRpZgorICAgICAgICBDaE1hc2sgPSBwSW5zdGFuY2UtPkNoTWFzazsKIAotICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgewogICAgICAgICAgICAgcmV0dXJuIFN0YXR1czsKICAgICAgICAgfQogICAgIH0KQEAgLTEyOSwyMDEgKzExMywxMTYgQEAKICAgICAvKgogICAgICAqIENvbnZlcnQgZnJvbSBNb25vIGlmIG5lY2Vzc2FyeQogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pCi0gICAgewotICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgcElucHV0ICAgICA9IHBPdXREYXRhOworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pIHsKKyAgICAgICAgTW9ub1RvMklfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBJbnB1dCA9IHBPdXREYXRhOwogICAgICAgICBwVG9Qcm9jZXNzID0gcE91dERhdGE7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICBOckNoYW5uZWxzID0gMjsKLSAgICAgICAgQ2hNYXNrICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSNlbmRpZgorICAgICAgICBDaE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBQcm9jZXNzIHRoZSBkYXRhIHdpdGggbWFuYWdlZCBidWZmZXJzCiAgICAgICovCi0gICAgd2hpbGUgKFNhbXBsZUNvdW50ICE9IDApCi0gICAgeworICAgIHdoaWxlIChTYW1wbGVDb3VudCAhPSAwKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIE1hbmFnZSB0aGUgaW5wdXQgYnVmZmVyIGFuZCBmcmFtZSBwcm9jZXNzaW5nCiAgICAgICAgICAqLwotICAgICAgICBMVk1fQnVmZmVySW4oaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgcElucHV0LAotICAgICAgICAgICAgICAgICAgICAgJnBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAmcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICZTYW1wbGVDb3VudCk7CisgICAgICAgIExWTV9CdWZmZXJJbihoSW5zdGFuY2UsIHBJbnB1dCwgJnBUb1Byb2Nlc3MsICZwUHJvY2Vzc2VkLCAmU2FtcGxlQ291bnQpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE9ubHkgcHJvY2VzcyBkYXRhIHdoZW4gU2FtcGxlQ291bnQgaXMgbm9uZSB6ZXJvLCBhIHplcm8gY291bnQgY2FuIG9jY3VyIHdoZW4KICAgICAgICAgICogdGhlIEJ1ZmZlckluIHJvdXRpbmUgaXMgd29ya2luZyBpbiBtYW5hZ2VkIG1vZGUuCiAgICAgICAgICAqLwotICAgICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEFwcGx5IENvbmNlcnRTb3VuZCBpZiByZXF1aXJlZAogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5DU19BY3RpdmUgPT0gTFZNX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpTFZDU19Qcm9jZXNzKHBJbnN0YW5jZS0+aENTSW5zdGFuY2UsICAgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5DU19BY3RpdmUgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAodm9pZClMVkNTX1Byb2Nlc3MocEluc3RhbmNlLT5oQ1NJbnN0YW5jZSwgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywgcFByb2Nlc3NlZCwgU2FtcGxlQ291bnQpOwogICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgdm9sdW1lIGlmIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSE9MCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQqLwotI2VuZGlmCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUgIT0gMCkgeworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLCBwVG9Qcm9jZXNzLCBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLCBOckNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENhbGwgTi1CYW5kIGVxdWFsaXNlciBpZiBlbmFibGVkCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID09IExWTV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzKHBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSwgICAgLyogTi1CYW5kIGVxdWFsaXNlciBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyhwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UsIC8qIE4tQmFuZCBlcXVhbGlzZXIgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywgcFByb2Nlc3NlZCwgU2FtcGxlQ291bnQpOwogICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ2FsbCBiYXNzIGVuaGFuY2VtZW50IGlmIGVuYWJsZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+REJFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMVkRCRV9Qcm9jZXNzKHBJbnN0YW5jZS0+aERCRUluc3RhbmNlLCAgICAgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKSB7CisgICAgICAgICAgICAgICAgTFZEQkVfUHJvY2VzcyhwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZSwgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsIHBQcm9jZXNzZWQsIFNhbXBsZUNvdW50KTsKICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEJ5cGFzcyBtb2RlIG9yIGV2ZXJ5dGhpbmcgb2ZmLCBzbyBjb3B5IHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwVG9Qcm9jZXNzICE9IHBQcm9jZXNzZWQpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQ29weSBhbGwgc2FtcGxlcyAqLwotI2Vsc2UKLSAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBUb1Byb2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCi0jZW5kaWYKKyAgICAgICAgICAgIGlmIChwVG9Qcm9jZXNzICE9IHBQcm9jZXNzZWQpIHsKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBUb1Byb2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7IC8qIENvcHkgYWxsIHNhbXBsZXMgKi8KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEFwcGx5IHRyZWJsZSBib29zdCBpZiByZXF1aXJlZAogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5URV9BY3RpdmUgPT0gTFZNX1RSVUUpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5URV9BY3RpdmUgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICAgICAgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7Ci0jZW5kaWYKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgcFByb2Nlc3NlZCwgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CiAgICAgICAgICAgICB9Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hNYXNrKTsKLSNlbHNlCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOwotI2VuZGlmCisgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsIHBQcm9jZXNzZWQsIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCBOckNoYW5uZWxzLCBDaE1hc2spOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogUGVyZm9ybSBQYXJhbWV0cmljIFNwZWN0dW0gQW5hbHlzaXMKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pKQotICAgICAgICAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKKyAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSkgeworICAgICAgICAgICAgICAgIEZyb21NY1RvTW9ub19GbG9hdChwUHJvY2Vzc2VkLCBwSW5zdGFuY2UtPnBQU0FJbnB1dCwgKExWTV9JTlQxNikoTnJGcmFtZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOwotI2VuZGlmCiAKLSAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLCBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksIEF1ZGlvVGltZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBEQyByZW1vdmFsCiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBEQ19NY19EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICAgICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOwotI2VuZGlmCisgICAgICAgICAgICBEQ19NY19EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsIHBQcm9jZXNzZWQsIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCBOckNoYW5uZWxzKTsKICAgICAgICAgfQogICAgICAgICAvKgogICAgICAgICAgKiBNYW5hZ2UgdGhlIG91dHB1dCBidWZmZXIKICAgICAgICAgICovCi0gICAgICAgIExWTV9CdWZmZXJPdXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICZTYW1wbGVDb3VudCk7Ci0KKyAgICAgICAgTFZNX0J1ZmZlck91dChoSW5zdGFuY2UsIHBPdXREYXRhLCAmU2FtcGxlQ291bnQpOwogICAgIH0KIAotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuY3BwCmluZGV4IDY2MzkyZTIuLjg2MDE5NmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuY3BwCkBAIC0zMCw0MzEgKzMwLDI5NyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdID0geworRk9fRkxPQVRfTFNoeF9Db2Vmc190IExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7CiAKLSAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4yX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW41X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW44X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTVfQjF9LAorICAgICAgICAvKiAyMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMV9BMSwgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xX0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjJfQTEsIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMl9BMCwgLUhQRl9GczIyMDUwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4zX0ExLCAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjNfQTAsIC1IUEZfRnMyMjA1MF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNF9BMSwgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW40X0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjVfQTEsIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNV9BMCwgLUhQRl9GczIyMDUwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW42X0ExLCAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjZfQTAsIC1IUEZfRnMyMjA1MF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluN19BMSwgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW43X0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjhfQTEsIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOF9BMCwgLUhQRl9GczIyMDUwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW45X0ExLCAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjlfQTAsIC1IUEZfRnMyMjA1MF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTBfQTEsIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMV9BMSwgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTFfQTAsIC1IUEZfRnMyMjA1MF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEyX0ExLCAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMl9BMCwgLUhQRl9GczIyMDUwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTNfQTEsIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNF9BMSwgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTRfQTAsIC1IUEZfRnMyMjA1MF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE1X0ExLCAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNV9BMCwgLUhQRl9GczIyMDUwX0dhaW4xNV9CMX0sCiAKLSAgICAgICAgICAgICAgICAgICAgLyogMjRrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4yX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW41X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW44X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTVfQjF9LAorICAgICAgICAvKiAyNGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMV9BMSwgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xX0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjJfQTEsIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMl9BMCwgLUhQRl9GczI0MDAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4zX0ExLCAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjNfQTAsIC1IUEZfRnMyNDAwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNF9BMSwgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW40X0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjVfQTEsIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNV9BMCwgLUhQRl9GczI0MDAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW42X0ExLCAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjZfQTAsIC1IUEZfRnMyNDAwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluN19BMSwgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW43X0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjhfQTEsIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOF9BMCwgLUhQRl9GczI0MDAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW45X0ExLCAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjlfQTAsIC1IUEZfRnMyNDAwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTBfQTEsIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEwX0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMV9BMSwgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfQTAsIC1IUEZfRnMyNDAwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEyX0ExLCAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMl9BMCwgLUhQRl9GczI0MDAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTNfQTEsIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEzX0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNF9BMSwgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfQTAsIC1IUEZfRnMyNDAwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE1X0ExLCAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNV9BMCwgLUhQRl9GczI0MDAwX0dhaW4xNV9CMX0sCiAKLSAgICAgICAgICAgICAgICAgICAgLyogMzJrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4yX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW41X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW44X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTVfQjF9LAorICAgICAgICAvKiAzMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMV9BMSwgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xX0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjJfQTEsIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9BMCwgLUhQRl9GczMyMDAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4zX0ExLCAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjNfQTAsIC1IUEZfRnMzMjAwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNF9BMSwgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW40X0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjVfQTEsIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9BMCwgLUhQRl9GczMyMDAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW42X0ExLCAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjZfQTAsIC1IUEZfRnMzMjAwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluN19BMSwgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW43X0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjhfQTEsIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9BMCwgLUhQRl9GczMyMDAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW45X0ExLCAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjlfQTAsIC1IUEZfRnMzMjAwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTBfQTEsIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsIC1IUEZfRnMzMjAwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEyX0ExLCAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMl9BMCwgLUhQRl9GczMyMDAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTNfQTEsIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsIC1IUEZfRnMzMjAwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjE1X0ExLCAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNV9BMCwgLUhQRl9GczMyMDAwX0dhaW4xNV9CMX0sCiAKLSAgICAgICAgICAgICAgICAgICAgLyogNDRrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMV9CMSx9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogNDRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7CisgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xX0IxLAorICAgICAgICB9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjJfQTEsIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMl9BMCwgLUhQRl9GczQ0MTAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4zX0ExLCAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjNfQTAsIC1IUEZfRnM0NDEwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNF9BMSwgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW40X0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjVfQTEsIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNV9BMCwgLUhQRl9GczQ0MTAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW42X0ExLCAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjZfQTAsIC1IUEZfRnM0NDEwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluN19BMSwgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW43X0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjhfQTEsIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOF9BMCwgLUhQRl9GczQ0MTAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW45X0ExLCAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjlfQTAsIC1IUEZfRnM0NDEwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTBfQTEsIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMV9BMSwgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTFfQTAsIC1IUEZfRnM0NDEwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEyX0ExLCAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCwgLUhQRl9GczQ0MTAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTNfQTEsIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNF9BMSwgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTRfQTAsIC1IUEZfRnM0NDEwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE1X0ExLCAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCwgLUhQRl9GczQ0MTAwX0dhaW4xNV9CMX0sCiAKLSAgICAgICAgICAgICAgICAgICAgLyogNDhrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4yX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW41X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW44X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTVfQjF9Ci0gICAgICAgICAgICAgICAgICAgICwKLSAgICAgICAgICAgICAgICAgICAgLyogODhrSHogU2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAzICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW40X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA2ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW43X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDggKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA5ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEwICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEzICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTVfQjF9LAorICAgICAgICAvKiA0OGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMV9BMSwgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xX0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjJfQTEsIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9BMCwgLUhQRl9GczQ4MDAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4zX0ExLCAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjNfQTAsIC1IUEZfRnM0ODAwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNF9BMSwgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW40X0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjVfQTEsIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9BMCwgLUhQRl9GczQ4MDAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW42X0ExLCAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjZfQTAsIC1IUEZfRnM0ODAwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluN19BMSwgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW43X0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjhfQTEsIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9BMCwgLUhQRl9GczQ4MDAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW45X0ExLCAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjlfQTAsIC1IUEZfRnM0ODAwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTBfQTEsIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsIC1IUEZfRnM0ODAwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEyX0ExLCAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCwgLUhQRl9GczQ4MDAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTNfQTEsIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEzX0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsIC1IUEZfRnM0ODAwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE1X0ExLCAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCwgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMX0sCisgICAgICAgIC8qIDg4a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xX0ExLCAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xX0EwLCAtSFBGX0ZzODgyMDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjJfQTEsIC8qIEdhaW4gU2V0dGluZyAgMiAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjJfQTAsIC1IUEZfRnM4ODIwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluM19BMSwgLyogR2FpbiBTZXR0aW5nICAzICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluM19BMCwgLUhQRl9Gczg4MjAwX0dhaW4zX0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW40X0ExLCAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW40X0EwLCAtSFBGX0ZzODgyMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjVfQTEsIC8qIEdhaW4gU2V0dGluZyAgNSAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjVfQTAsIC1IUEZfRnM4ODIwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNl9BMSwgLyogR2FpbiBTZXR0aW5nICA2ICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNl9BMCwgLUhQRl9Gczg4MjAwX0dhaW42X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW43X0ExLCAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW43X0EwLCAtSFBGX0ZzODgyMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjhfQTEsIC8qIEdhaW4gU2V0dGluZyAgOCAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjhfQTAsIC1IUEZfRnM4ODIwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOV9BMSwgLyogR2FpbiBTZXR0aW5nICA5ICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOV9BMCwgLUhQRl9Gczg4MjAwX0dhaW45X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMF9BMSwgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEwX0EwLCAtSFBGX0ZzODgyMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMV9BMSwgLyogR2FpbiBTZXR0aW5nICAxMSAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjExX0EwLCAtSFBGX0ZzODgyMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMl9BMSwgLyogR2FpbiBTZXR0aW5nICAxMiAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEyX0EwLCAtSFBGX0ZzODgyMDBfR2FpbjEyX0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xM19BMSwgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEzX0EwLCAtSFBGX0ZzODgyMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xNF9BMSwgLyogR2FpbiBTZXR0aW5nICAxNCAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE0X0EwLCAtSFBGX0ZzODgyMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xNV9BMSwgLyogR2FpbiBTZXR0aW5nICAxNSAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE1X0EwLCAtSFBGX0ZzODgyMDBfR2FpbjE1X0IxfSwKIAotICAgICAgICAgICAgICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCisgICAgICAgIC8qIDk2a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xX0ExLCAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsIC1IUEZfRnM5NjAwMF9HYWluMV9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMl9BMSwgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4yX0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjJfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjNfQTEsIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluM19BMCwgLUhQRl9Gczk2MDAwX0dhaW4zX0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW40X0ExLCAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjRfQTAsIC1IUEZfRnM5NjAwMF9HYWluNF9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNV9BMSwgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW41X0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjVfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjZfQTEsIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNl9BMCwgLUhQRl9Gczk2MDAwX0dhaW42X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW43X0ExLCAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjdfQTAsIC1IUEZfRnM5NjAwMF9HYWluN19CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOF9BMSwgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW44X0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjhfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjlfQTEsIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOV9BMCwgLUhQRl9Gczk2MDAwX0dhaW45X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMF9BMSwgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTBfQTAsIC1IUEZfRnM5NjAwMF9HYWluMTBfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjExX0ExLCAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMV9BMCwgLUhQRl9Gczk2MDAwX0dhaW4xMV9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTJfQTEsIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEyX0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xM19BMSwgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTNfQTAsIC1IUEZfRnM5NjAwMF9HYWluMTNfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE0X0ExLCAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCwgLUhQRl9Gczk2MDAwX0dhaW4xNF9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTVfQTEsIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjE1X0IxfSwKIAotICAgICAgICAgICAgICAgICAgICAvKiAxNzZrSHogU2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW40X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW43X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTVfQjF9LAorICAgICAgICAvKiAxNzZrSHogU2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xX0ExLCAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMV9BMCwgLUhQRl9GczE3NjQwMF9HYWluMV9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjJfQTEsIC8qIEdhaW4gU2V0dGluZyAgMiAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4yX0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluM19BMSwgLyogR2FpbiBTZXR0aW5nICAzICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjNfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW40X0ExLCAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNF9BMCwgLUhQRl9GczE3NjQwMF9HYWluNF9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjVfQTEsIC8qIEdhaW4gU2V0dGluZyAgNSAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW41X0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNl9BMSwgLyogR2FpbiBTZXR0aW5nICA2ICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjZfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW43X0ExLCAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluN19BMCwgLUhQRl9GczE3NjQwMF9HYWluN19CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjhfQTEsIC8qIEdhaW4gU2V0dGluZyAgOCAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW44X0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluOV9BMSwgLyogR2FpbiBTZXR0aW5nICA5ICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjlfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSwgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCwgLUhQRl9GczE3NjQwMF9HYWluMTBfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSwgLyogR2FpbiBTZXR0aW5nICAxMSAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCwgLUhQRl9GczE3NjQwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMl9BMSwgLyogR2FpbiBTZXR0aW5nICAxMiAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCwgLUhQRl9GczE3NjQwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xM19BMSwgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCwgLUhQRl9GczE3NjQwMF9HYWluMTNfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSwgLyogR2FpbiBTZXR0aW5nICAxNCAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCwgLUhQRl9GczE3NjQwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNV9BMSwgLyogR2FpbiBTZXR0aW5nICAxNSAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCwgLUhQRl9GczE3NjQwMF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDE5MmtIeiBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluNl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluOV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMX0KLSAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgLyogMTkya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMV9BMSwgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMV9BMCwgLUhQRl9GczE5MjAwMF9HYWluMV9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjJfQTEsIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjJfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjJfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4zX0ExLCAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4zX0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4zX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNF9BMSwgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNF9BMCwgLUhQRl9GczE5MjAwMF9HYWluNF9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjVfQTEsIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjVfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjVfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW42X0ExLCAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW42X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW42X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluN19BMSwgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluN19BMCwgLUhQRl9GczE5MjAwMF9HYWluN19CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjhfQTEsIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjhfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjhfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW45X0ExLCAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW45X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW45X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTBfQTEsIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCwgLUhQRl9GczE5MjAwMF9HYWluMTBfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSwgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjExX0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEyX0ExLCAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTJfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTNfQTEsIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCwgLUhQRl9GczE5MjAwMF9HYWluMTNfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSwgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE1X0ExLCAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTVfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjE1X0IxfX07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NjMsMTQgKzMyOSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KLWNvbnN0IExWTV9GTE9BVCBMVk1fVm9sdW1lVGFibGVbXSA9IHsKLSAgICAxLjAwMGYsICAgICAgICAgICAgIC8qICAwZEIgKi8KLSAgICAwLjg5MWYsICAgICAgICAgICAgIC8qIC0xZEIgKi8KLSAgICAwLjc5NGYsICAgICAgICAgICAgIC8qIC0yZEIgKi8KLSAgICAwLjcwOGYsICAgICAgICAgICAgIC8qIC0zZEIgKi8KLSAgICAwLjYzMWYsICAgICAgICAgICAgIC8qIC00ZEIgKi8KLSAgICAwLjU2MmYsICAgICAgICAgICAgIC8qIC01ZEIgKi8KLSAgICAwLjUwMWZ9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KK2NvbnN0IExWTV9GTE9BVCBMVk1fVm9sdW1lVGFibGVbXSA9IHsxLjAwMGYsICAvKiAgMGRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTFmLCAgLyogLTFkQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzk0ZiwgIC8qIC0yZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwOGYsICAvKiAtM2RCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MzFmLCAgLyogLTRkQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyZiwgIC8qIC01ZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwMWZ9OyAvKiAtNmRCICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDc4LDI0ICszNDMsMTYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIExWTV9NSVhfVENfRnM4MDAwICAgICAgMzI1ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTEwMjUgICAgIDMyNjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczEyMDAwICAgICAzMjY0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnMxNjAwMCAgICAgMzI2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzMjIwNTAgICAgIDMyNzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczI0MDAwICAgICAzMjcwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnMzMjAwMCAgICAgMzI3MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnM4MDAwIDMyNTgwICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTEwMjUgMzI2MzIgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczEyMDAwIDMyNjQzIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMxNjAwMCAzMjY3NCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMjIwNTAgMzI3MDAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczI0MDAwIDMyNzA1IC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMzMjAwMCAzMjcyMSAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzNDQxMDAgMzI3MzQgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczQ4MDAwIDMyNzM3IC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCiAKLWNvbnN0IExWTV9JTlQxNiBMVk1fTWl4ZXJUQ1RhYmxlW10gPSB7Ci0gICAgTFZNX01JWF9UQ19GczgwMDAsCi0gICAgTFZNX01JWF9UQ19GczExMDI1LAotICAgIExWTV9NSVhfVENfRnMxMjAwMCwKLSAgICBMVk1fTUlYX1RDX0ZzMTYwMDAsCi0gICAgTFZNX01JWF9UQ19GczIyMDUwLAotICAgIExWTV9NSVhfVENfRnMyNDAwMCwKLSAgICBMVk1fTUlYX1RDX0ZzMzIwMDAsCi0gICAgTFZNX01JWF9UQ19GczQ0MTAwLAotICAgIExWTV9NSVhfVENfRnM0ODAwMH07Ci0KK2NvbnN0IExWTV9JTlQxNiBMVk1fTWl4ZXJUQ1RhYmxlW10gPSB7TFZNX01JWF9UQ19GczgwMDAsICBMVk1fTUlYX1RDX0ZzMTEwMjUsIExWTV9NSVhfVENfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01JWF9UQ19GczE2MDAwLCBMVk1fTUlYX1RDX0ZzMjIwNTAsIExWTV9NSVhfVENfRnMyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01JWF9UQ19GczMyMDAwLCBMVk1fTUlYX1RDX0ZzNDQxMDAsIExWTV9NSVhfVENfRnM0ODAwMH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKaW5kZXggZmM4MjE5NC4uY2YyZmI1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaApAQCAtMzMsNyArMzMsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWV4dGVybiBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107CitleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190IExWTV9UcmVibGVCb29zdENvZWZzW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDUsNCArNDUsMyBAQAogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVk1fTWl4ZXJUQ1RhYmxlW107CiAKICNlbmRpZiAvKiBfX0xWTV9UQUJMRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKaW5kZXggYmVmN2ZhMS4uYzIwYjQ5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKQEAgLTMxLDE2ICszMSwxNSBAQAogLyogICAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgIEFHQ19HYWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IEFHQyBnYWluICovCi0gICAgTFZNX0ZMT0FUICBBR0NfTWF4R2FpbjsgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgbWF4aW11bSBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgdm9sdW1lIHNldHRpbmcgKi8KLSAgICBMVk1fRkxPQVQgIFRhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0YXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KLSAgICBMVk1fRkxPQVQgIEFHQ19UYXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyB0YXJnZXQgbGV2ZWwgKi8KLSAgICBMVk1fRkxPQVQgIEFHQ19BdHRhY2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyBhdHRhY2sgc2NhbGVyICovCi0gICAgTFZNX0ZMT0FUICBBR0NfRGVjYXk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgZGVjYXkgc2NhbGVyICovCi0gICAgTFZNX0ZMT0FUICBWb2x1bWVUQzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgQUdDX0dhaW47ICAgIC8qIFRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUIEFHQ19NYXhHYWluOyAvKiBUaGUgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBWb2x1bWU7ICAgICAgLyogVGhlIGN1cnJlbnQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgVGFyZ2V0OyAgICAgIC8qIFRoZSB0YXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgQUdDX1RhcmdldDsgIC8qIEFHQyB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgQUdDX0F0dGFjazsgIC8qIEFHQyBhdHRhY2sgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUIEFHQ19EZWNheTsgICAvKiBBR0MgZGVjYXkgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUIFZvbHVtZVRDOyAgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KIAogfSBBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3Q7CiAKQEAgLTQ5LDE5ICs0OCwxNiBAQAogLyogICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgIC8qIE1vbm8gc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOyAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCi0jZW5kaWYKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCogcEluc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHBTdFNyYywgICAgICAgICAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBwTW9ub1NyYywgICAgICAgICAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEc3QsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KK3ZvaWQgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90KiBwSW5zdGFuY2UsICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogcFN0U3JjLCAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogcE1vbm9TcmMsICAgICAgICAgICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRHN0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE5yRnJhbWVzLCAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOckNoYW5uZWxzKTsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KIAotI2VuZGlmICAvKiBfX0FHQ19IX18gKi8KLQorI2VuZGlmIC8qIF9fQUdDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAppbmRleCBjMDUwY2QwLi5iMzhlOWZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaApAQCAtMjIsNjQgKzIyLDU0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdAotewotI2lmZGVmIFNVUFBPUlRfTUMKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBUaGUgbWVtb3J5IHJlZ2lvbiBjcmVhdGVkIGJ5IHRoaXMgc3RydWN0dXJlIGluc3RhbmNlIGlzIHR5cGVjYXN0CiAgICAgICogaW50byBhbm90aGVyIHN0cnVjdHVyZSBjb250YWluaW5nIGEgcG9pbnRlciBhbmQgYW4gYXJyYXkgb2YgZmlsdGVyCiAgICAgICogY29lZmZpY2llbnRzLiBJbiBvbmUgY2FzZSB0aGlzIG1lbW9yeSByZWdpb24gaXMgdXNlZCBmb3Igc3RvcmluZwogICAgICAqIERDIGNvbXBvbmVudCBvZiBjaGFubmVscwogICAgICAqLwotICAgIExWTV9GTE9BVCAqcFN0b3JhZ2U7CisgICAgTFZNX0ZMT0FUKiBwU3RvcmFnZTsKICAgICBMVk1fRkxPQVQgU3RvcmFnZVtMVk1fTUFYX0NIQU5ORUxTXTsKLSNlbHNlCi0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbNl07Ci0jZW5kaWYKIH0gQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3Q7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ09FRkZJQ0lFTlQgVFlQRSBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogQmlxdWFkIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgIEEyOyAgIC8qICBhMiAgKi8KLSAgICBMVk1fRkxPQVQgIEExOyAgIC8qICBhMSAgKi8KLSAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KLSAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgQTI7IC8qICBhMiAgKi8KKyAgICBMVk1fRkxPQVQgQTE7IC8qICBhMSAgKi8KKyAgICBMVk1fRkxPQVQgQTA7IC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgQjI7IC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgQjE7IC8qIC1iMSEgKi8KIH0gQlFfRkxPQVRfQ29lZnNfdDsKIAogLyoqKiBGaXJzdCBvcmRlciBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCBBMTsgICAvKiAgYTEgICovCi0gICAgTFZNX0ZMT0FUIEEwOyAgIC8qICBhMCAgKi8KLSAgICBMVk1fRkxPQVQgQjE7ICAgLyogLWIxISAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBMTsgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMTsgLyogLWIxISAqLwogfSBGT19GTE9BVF9Db2Vmc190OwogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyB3aXRoIFNoaWZ0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCBBMTsgICAgLyogIGExICAqLwotICAgIExWTV9GTE9BVCBBMDsgICAgLyogIGEwICAqLwotICAgIExWTV9GTE9BVCBCMTsgICAgLyogLWIxISAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBMTsgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMTsgLyogLWIxISAqLwogfSBGT19GTE9BVF9MU2h4X0NvZWZzX3Q7CiAvKioqIEJhbmQgcGFzcyBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUICBBMDsgICAvKiAgYTAgICovCi0gICAgTFZNX0ZMT0FUICBCMjsgICAvKiAtYjIhICovCi0gICAgTFZNX0ZMT0FUICBCMTsgICAvKiAtYjEhICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEEwOyAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIyOyAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUIEIxOyAvKiAtYjEhICovCiB9IEJQX0ZMT0FUX0NvZWZzX3Q7CiAKIC8qKiogUGVha2luZyBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLwotICAgIExWTV9GTE9BVCBCMjsgICAvKiAtYjIhICovCi0gICAgTFZNX0ZMT0FUIEIxOyAgIC8qIC1iMSEgKi8KLSAgICBMVk1fRkxPQVQgIEc7ICAgLyogR2FpbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBMDsgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMjsgLyogLWIyISAqLworICAgIExWTV9GTE9BVCBCMTsgLyogLWIxISAqLworICAgIExWTV9GTE9BVCBHOyAgLyogR2FpbiAqLwogfSBQS19GTE9BVF9Db2Vmc190OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODcsMzkgKzc3LDI4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBUeXBlcyB1c2VkIGZvciBmaXJzdCBvcmRlciBhbmQgc2hlbHZpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDIpIF07ICAvKiBPbmUgY2hhbm5lbCwgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsoMSAqIDIpXTsgLyogT25lIGNoYW5uZWwsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCiB9IEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190OwogCi10eXBlZGVmIHN0cnVjdAotewotI2lmZGVmIFNVUFBPUlRfTUMKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBMVk1fTUFYX0NIQU5ORUxTIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDIpIF07Ci0jZWxzZQotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCi0jZW5kaWYKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsoTFZNX01BWF9DSEFOTkVMUyAqIDIpXTsKIH0gQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CiAKIC8qKiogVHlwZXMgdXNlZCBmb3IgYmlxdWFkLCBiYW5kIHBhc3MgYW5kIHBlYWtpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBTdG9yYWdlWygxICogNCldOyAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCiB9IEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190OwogCi10eXBlZGVmIHN0cnVjdAotewotI2lmZGVmIFNVUFBPUlRfTUMKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBMVk1fTUFYX0NIQU5ORUxTLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiA0KSBdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KLSNlbmRpZgorICAgIExWTV9GTE9BVCBTdG9yYWdlWyhMVk1fTUFYX0NIQU5ORUxTICogNCldOwogfSBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKLS8qIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb25zIGFyZSBjaGFuZ2VkIHRvIHNhdGlzZnkgUUFDIHJ1bGVzOiBOYW1lIHNob3VsZCBiZSBVbmlxdWUgd2l0aGluZyAxNiBjaGFyYWN0ZXJzKi8KLSNkZWZpbmUgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgSW5pdF9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMQotI2RlZmluZSBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiAgICAgICBUV09fQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIKKy8qIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb25zIGFyZSBjaGFuZ2VkIHRvIHNhdGlzZnkgUUFDIHJ1bGVzOiBOYW1lIHNob3VsZCBiZSBVbmlxdWUgd2l0aGluIDE2CisgKiBjaGFyYWN0ZXJzKi8KKyNkZWZpbmUgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCBJbml0X0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxCisjZGVmaW5lIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyIFRXT19CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQklRVUFEIEZJTFRFUlMKQEAgLTEyNywxNzYgKzEwNiwxMDggQEAKIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCogcFRhcHMsIEJRX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKTsKIAotdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpOwogCi12b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Cit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcyk7CiAKLXZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJTYW1wbGVzKTsKIAotdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KiBwVGFwcywgQlFfRkxPQVRfQ29lZnNfdCogcENvZWYpOwogCi12b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwordm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpOwogCi12b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwordm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpOwogCi12b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOwordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLCBCUV9GTE9BVF9Db2Vmc190KiBwQ29lZik7CiAKLXZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwordm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpOwogCi12b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOwordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLCBCUV9GTE9BVF9Db2Vmc190KiBwQ29lZik7CiAKLXZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Cit2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcyk7CiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKLSNlbmRpZgordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLCBCUV9GTE9BVF9Db2Vmc190KiBwQ29lZik7Cit2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcyk7Cit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBGSVJTVCBPUkRFUiBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOwordm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QqIHBUYXBzLCBGT19GTE9BVF9Db2Vmc190KiBwQ29lZik7CiAKLXZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Cit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcyk7CiAKLXZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgICpwQ29lZik7Cit2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfTFNoeF9Db2Vmc190KiBwQ29lZik7CiAKLXZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwordm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJTYW1wbGVzKTsKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLXZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KiBwVGFwcywgRk9fRkxPQVRfQ29lZnNfdCogcENvZWYpOwordm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpOwordm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBCQU5EIFBBU1MgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci12b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgKnBDb2VmKTsKLXZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKK3ZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KiBwVGFwcywgQlBfRkxPQVRfQ29lZnNfdCogcENvZWYpOwordm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpOwordm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLCBCUF9GTE9BVF9Db2Vmc190KiBwQ29lZik7Cit2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcyk7CiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Cit2b2lkIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCogcFRhcHMsIEJQX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKTsKK3ZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJTYW1wbGVzKTsKIAogLyoqKiAzMiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKLSNlbmRpZgordm9pZCBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKTsKK3ZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJTYW1wbGVzKTsKK3ZvaWQgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IERDIFJFTU9WQUwgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7Cit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSk7CiAKLXZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2Vsc2UKLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7Ci0KLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbmRpZgordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmICAvKiogX0JJUVVBRF9IXyAqKi8KLQorI2VuZGlmIC8qKiBfQklRVUFEX0hfICoqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCmluZGV4IDViN2NiMWIuLjJmYzc4YjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKQEAgLTM1LDIxICszNSwyMSBAQAogdHlwZWRlZiBzdHJ1Y3QgLyogQ29tcHJlc3NvciBzdGF0ZSAqLwogewogICAgIC8qIE5vcm1hbGlzZXIgKi8KLSAgICBMVk1fSU5UMTYgICBOb3JtX0F0dGFjazsgICAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBOb3JtYWxpc2VyIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBOb3JtX0RlY2F5OyAgICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLwotICAgIExWTV9JTlQzMiAgIE5vcm1JbnQ7ICAgICAgICAgICAgLyogTm9ybWFsaXNlciBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KLSAgICBMVk1fSU5UMTYgICBTaGlmdDsgICAgICAgICAgICAgIC8qIFNoaWZ0IGdhaW4gKi8KLSAgICBMVk1fSU5UMTYgICBUaHJlc2hvbGQ7ICAgICAgICAgIC8qIFRhcmdldCB0aHJlc2hvbGQgKi8KKyAgICBMVk1fSU5UMTYgTm9ybV9BdHRhY2s7IC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBOb3JtYWxpc2VyIGludGVncmF0b3IgKi8KKyAgICBMVk1fSU5UMTYgTm9ybV9EZWNheTsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQzMiBOb3JtSW50OyAgICAgLyogTm9ybWFsaXNlciBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KKyAgICBMVk1fSU5UMTYgU2hpZnQ7ICAgICAgIC8qIFNoaWZ0IGdhaW4gKi8KKyAgICBMVk1fSU5UMTYgVGhyZXNob2xkOyAgIC8qIFRhcmdldCB0aHJlc2hvbGQgKi8KIAogICAgIC8qIENvbXByZXNzb3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0F0dGVuOyAgICAgICAgIC8qIEF0dGVudWF0aW9uIGFwcGxpZWQgYmVmb3JlIHNvZnQga25lZSBjb21wcmVzc29yICovCi0gICAgTFZNX0lOVDE2ICAgQ29tcF9BdHRhY2tfUzsgICAgICAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiB0aGUgc2xvdyBpbnRlZ3JhdG9yICovCi0gICAgTFZNX0lOVDE2ICAgQ29tcF9EZWNheV9TOyAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50IG9mIHNsb3cgdGhlIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0F0dGFja19GOyAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIGZhc3QgdGhlIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0RlY2F5X0Y7ICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLwotICAgIExWTV9JTlQxNiAgIFNvZnRDbGlwR2FpbjsgICAgICAgLyogU29mdCBjbGlwIGdhaW4gY29udHJvbCAqLwotICAgIExWTV9JTlQzMiAgIENvbXBJbnRTbG93OyAgICAgICAgLyogQ29tcHJlc3NvciBzbG93IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLwotICAgIExWTV9JTlQzMiAgIENvbXBJbnRGYXN0OyAgICAgICAgLyogQ29tcHJlc3NvciBmYXN0IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGVuOyAgICAvKiBBdHRlbnVhdGlvbiBhcHBsaWVkIGJlZm9yZSBzb2Z0IGtuZWUgY29tcHJlc3NvciAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGFja19TOyAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiB0aGUgc2xvdyBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2IENvbXBfRGVjYXlfUzsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2Ygc2xvdyB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGFja19GOyAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiBmYXN0IHRoZSBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2IENvbXBfRGVjYXlfRjsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiBTb2Z0Q2xpcEdhaW47ICAvKiBTb2Z0IGNsaXAgZ2FpbiBjb250cm9sICovCisgICAgTFZNX0lOVDMyIENvbXBJbnRTbG93OyAgIC8qIENvbXByZXNzb3Igc2xvdyBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KKyAgICBMVk1fSU5UMzIgQ29tcEludEZhc3Q7ICAgLyogQ29tcHJlc3NvciBmYXN0IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLwogCiB9IENvbXBMaW1fSW5zdGFuY2VfdDsKIApAQCAtNTgsMTAgKzU4LDcgQEAKIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgICAgICAgIEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKTsKK3ZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgR2FpbiwgTFZNX0ZMT0FUKiBwRGF0YUluLCBMVk1fRkxPQVQqIHBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBCbG9ja0xlbmd0aCk7CiAKICNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKaW5kZXggMWVlYjMyMS4uMGJhNTIyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKQEAgLTI3LDI2ICsyNywyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIERFRklORVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBGSUxURVJfTE9TUyAgICAgMzI3MzAgICAgICAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLwotI2RlZmluZSBGSUxURVJfTE9TU19GTE9BVCAgICAwLjk5ODg0OWYKKyNkZWZpbmUgRklMVEVSX0xPU1MgMzI3MzAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLworI2RlZmluZSBGSUxURVJfTE9TU19GTE9BVCAwLjk5ODg0OWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX0ZMT0FUIExWTV9Qb3dlcjEwKCAgIExWTV9GTE9BVCAgWCk7CitMVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUIFgpOwogCi1MVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBYKTsKLUxWTV9GTE9BVCAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICBGYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sIExWTV9GTE9BVCogcENvZWZmaWNpZW50cywgTFZNX0ZMT0FUIFgpOworTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyIEZjLCBMVk1fRnNfZW4gU2FtcGxlUmF0ZSk7CiAKLUxWTV9GTE9BVCBMVk1fRk9fTFBGKCAgICBMVk1fRkxPQVQgIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpOworTFZNX0ZMT0FUIExWTV9GT19MUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpOwogCi1MVk1fRkxPQVQgTFZNX0ZPX0hQRiggICAgTFZNX0ZMT0FUICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKTsKK0xWTV9GTE9BVCBMVk1fRk9fSFBGKExWTV9GTE9BVCB3LCBGT19GTE9BVF9Db2Vmc190KiBwQ29lZmZzKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgIC8qKiBfRklMVEVSX0hfICoqLwotCisjZW5kaWYgLyoqIF9GSUxURVJfSF8gKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCmluZGV4IGJhZTg0ZTcuLjE3Njk5ZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCkBAIC0yMiwxMSArMjIsMTAgQEAKIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogLyogIFR5cGUgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgVG90YWxTaXplOyAgICAgIC8qICBBY2N1bXVsYXRpdmUgdG90YWwgbWVtb3J5IHNpemUgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICBwTmV4dE1lbWJlcjsgICAgLyogIFBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdGFuY2UgbWVtYmVyIHRvIGJlIGFsbG9jYXRlZCAqLwotfSAgIElOU1RfQUxMT0M7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX1VJTlQzMiBUb3RhbFNpemU7ICAvKiAgQWNjdW11bGF0aXZlIHRvdGFsIG1lbW9yeSBzaXplICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdWludHB0cl90IHBOZXh0TWVtYmVyOyAvKiAgUG9pbnRlciB0byB0aGUgbmV4dCBpbnN0YW5jZSBtZW1iZXIgdG8gYmUgYWxsb2NhdGVkICovCit9IElOU1RfQUxMT0M7CiAKIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQxLDcgKzQwLDcgQEAKICAqICBSZW1hcmtzICAgICA6CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgIEluc3RBbGxvY19Jbml0KCBJTlNUX0FMTE9DICpwbXMsIHZvaWQgKlN0YXJ0QWRkciApOwordm9pZCBJbnN0QWxsb2NfSW5pdChJTlNUX0FMTE9DKiBwbXMsIHZvaWQqIFN0YXJ0QWRkcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfQWRkTWVtYmVyKCkKQEAgLTU0LDcgKzUzLDcgQEAKICAqICBSZW1hcmtzICAgICA6CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCogSW5zdEFsbG9jX0FkZE1lbWJlciggSU5TVF9BTExPQyAqcG1zLCBMVk1fVUlOVDMyIFNpemUgKTsKK3ZvaWQqIEluc3RBbGxvY19BZGRNZW1iZXIoSU5TVF9BTExPQyogcG1zLCBMVk1fVUlOVDMyIFNpemUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0dldFRvdGFsKCkKQEAgLTY0LDE5ICs2MywxNCBAQAogICogIFJlbWFya3MgICAgIDoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fVUlOVDMyIEluc3RBbGxvY19HZXRUb3RhbCggSU5TVF9BTExPQyAqcG1zKTsKK0xWTV9VSU5UMzIgSW5zdEFsbG9jX0dldFRvdGFsKElOU1RfQUxMT0MqIHBtcyk7CiAKLXZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbFJldCggICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgIFNpemVbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKnB0cik7Cit2b2lkKiBJbnN0QWxsb2NfQWRkTWVtYmVyQWxsUmV0KElOU1RfQUxMT0MqIHBtcywgTFZNX1VJTlQzMiBTaXplW10sIHZvaWQqKiBwdHIpOwogCi12b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgICBTaXplW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICpwTWVtb3J5VGFibGUpOwordm9pZCogSW5zdEFsbG9jX0FkZE1lbWJlckFsbChJTlNUX0FMTE9DKiBwbXMsIExWTV9VSU5UMzIgU2l6ZVtdLCBMVk1fTWVtb3J5VGFibGVfc3QqIHBNZW1vcnlUYWJsZSk7CiAKLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlKTsKK3ZvaWQgSW5zdEFsbG9jX0luaXRBbGwoSU5TVF9BTExPQyogcG1zLCBMVk1fTWVtb3J5VGFibGVfc3QqIHBNZW1vcnlUYWJsZSk7CiAKLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGxfTlVMTCggSU5TVF9BTExPQyAgICAgICAgICAgICAgKnBtcyk7Cit2b2lkIEluc3RBbGxvY19Jbml0QWxsX05VTEwoSU5TVF9BTExPQyogcG1zKTsKIAogI2VuZGlmIC8qIF9fSkJTX0lOU1RBTExPQ19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaAppbmRleCA0OWYxNmFkLi5kM2QxMjhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fQ29tbW9uLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX0NvbW1vbi5oCkBAIC0zOSwxMiArMzksMTEgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBBbGdvcml0aG0gaWRlbnRpZmljYXRpb24gKi8KLSNkZWZpbmUgQUxHT1JJVEhNX05PTkVfSUQgICAgICAweDAwMDAKLSNkZWZpbmUgQUxHT1JJVEhNX0NTX0lEICAgICAgICAweDAxMDAKLSNkZWZpbmUgQUxHT1JJVEhNX0VRTkJfSUQgICAgICAweDAyMDAKLSNkZWZpbmUgQUxHT1JJVEhNX0RCRV9JRCAgICAgICAweDAzMDAKLSNkZWZpbmUgQUxHT1JJVEhNX1ZDX0lEICAgICAgICAweDA1MDAKLSNkZWZpbmUgQUxHT1JJVEhNX1RFX0lEICAgICAgICAweDA2MDAKKyNkZWZpbmUgQUxHT1JJVEhNX05PTkVfSUQgMHgwMDAwCisjZGVmaW5lIEFMR09SSVRITV9DU19JRCAweDAxMDAKKyNkZWZpbmUgQUxHT1JJVEhNX0VRTkJfSUQgMHgwMjAwCisjZGVmaW5lIEFMR09SSVRITV9EQkVfSUQgMHgwMzAwCisjZGVmaW5lIEFMR09SSVRITV9WQ19JRCAweDA1MDAKKyNkZWZpbmUgQUxHT1JJVEhNX1RFX0lEIDB4MDYwMAogCi0jZW5kaWYgICAgICAvKiBfX0xWTV9DT01NT05fSF9fICovCi0KKyNlbmRpZiAvKiBfX0xWTV9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmgKaW5kZXggMWExNTEyNS4uYjk4NDc0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX01hY3Jvcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9NYWNyb3MuaApAQCAtMjgsMzEgKzI4LDM2IEBACiAgICAgICAgIG9mIG92ZXJmbG93IGlzIHVuZGVmaW5lZC4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1VTDMyeDMySU5UTzMyKEEsQixDLFNoaWZ0UikgICBcCi0gICAgICAgIHtMVk1fSU5UMzIgTVVMMzJ4MzJJTlRPMzJfdGVtcCxNVUwzMngzMklOVE8zMl90ZW1wMixNVUwzMngzMklOVE8zMl9tYXNrLE1VTDMyeDMySU5UTzMyX0hILE1VTDMyeDMySU5UTzMyX0hMLE1VTDMyeDMySU5UTzMyX0xILE1VTDMyeDMySU5UTzMyX0xMO1wKLSAgICAgICAgIExWTV9JTlQzMiAgc2hpZnRWYWx1ZTtcCi0gICAgICAgIHNoaWZ0VmFsdWUgPSAoU2hpZnRSKTtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX21hc2s9MHgwMDAwRkZGRjtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0hIPSAoKExWTV9JTlQzMikoKExWTV9JTlQxNikoKEEpPj4xNikpKigoTFZNX0lOVDE2KSgoQik+PjE2KSkgKTtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0hMPSAoKExWTV9JTlQzMikoKEIpJk1VTDMyeDMySU5UTzMyX21hc2spKigoTFZNX0lOVDE2KSgoQSk+PjE2KSkpIDtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0xIPSAoKExWTV9JTlQzMikoKEEpJk1VTDMyeDMySU5UTzMyX21hc2spKigoTFZNX0lOVDE2KSgoQik+PjE2KSkpO1wKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzJfTEw9IChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSooTFZNX0lOVDMyKSgoQikmTVVMMzJ4MzJJTlRPMzJfbWFzayk7XAotICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wPSAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9ITCZNVUwzMngzMklOVE8zMl9tYXNrKSsoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSCZNVUwzMngzMklOVE8zMl9tYXNrKSsoTFZNX0lOVDMyKSgoTVVMMzJ4MzJJTlRPMzJfTEw+PjE2KSZNVUwzMngzMklOVE8zMl9tYXNrKTtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0hIPSBNVUwzMngzMklOVE8zMl9ISCsoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9ITD4+MTYpKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0xIPj4xNikrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfdGVtcD4+MTYpO1wKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzJfTEw9TVVMMzJ4MzJJTlRPMzJfTEwrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEw8PDE2KSsoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSDw8MTYpO1wKLSAgICAgICAgaWYoc2hpZnRWYWx1ZTwzMilcCi0gICAgICAgIHtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0hIPU1VTDMyeDMySU5UTzMyX0hIPDwoMzItc2hpZnRWYWx1ZSk7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9tYXNrPSgoTFZNX0lOVDMyKTE8PCgzMi1zaGlmdFZhbHVlKSktMTtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPShNVUwzMngzMklOVE8zMl9MTD4+c2hpZnRWYWx1ZSkmTVVMMzJ4MzJJTlRPMzJfbWFzaztcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX3RlbXAyPU1VTDMyeDMySU5UTzMyX0hIfE1VTDMyeDMySU5UTzMyX0xMO1wKLSAgICAgICAgfVwKLSAgICAgICAgZWxzZVwKLSAgICAgICB7XAotICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMj0oTFZNX0lOVDMyKU1VTDMyeDMySU5UTzMyX0hIPj4oc2hpZnRWYWx1ZS0zMik7XAotICAgICAgIH1cCi0gICAgICAgKEMpID0gTVVMMzJ4MzJJTlRPMzJfdGVtcDI7XAotICAgICAgIH0KKyNkZWZpbmUgTVVMMzJ4MzJJTlRPMzIoQSwgQiwgQywgU2hpZnRSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExWTV9JTlQzMiBNVUwzMngzMklOVE8zMl90ZW1wLCBNVUwzMngzMklOVE8zMl90ZW1wMiwgTVVMMzJ4MzJJTlRPMzJfbWFzaywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBNVUwzMngzMklOVE8zMl9ISCwgTVVMMzJ4MzJJTlRPMzJfSEwsIE1VTDMyeDMySU5UTzMyX0xILCBNVUwzMngzMklOVE8zMl9MTDsgICAgXAorICAgICAgICBMVk1fSU5UMzIgc2hpZnRWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNoaWZ0VmFsdWUgPSAoU2hpZnRSKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfbWFzayA9IDB4MDAwMEZGRkY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISCA9ICgoTFZNX0lOVDMyKSgoTFZNX0lOVDE2KSgoQSkgPj4gMTYpKSAqICgoTFZNX0lOVDE2KSgoQikgPj4gMTYpKSk7ICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0hMID0gKChMVk1fSU5UMzIpKChCKSZNVUwzMngzMklOVE8zMl9tYXNrKSAqICgoTFZNX0lOVDE2KSgoQSkgPj4gMTYpKSk7IFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfTEggPSAoKExWTV9JTlQzMikoKEEpJk1VTDMyeDMySU5UTzMyX21hc2spICogKChMVk1fSU5UMTYpKChCKSA+PiAxNikpKTsgXAorICAgICAgICBNVUwzMngzMklOVE8zMl9MTCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoKEEpJk1VTDMyeDMySU5UTzMyX21hc2spICogKExWTV9JTlQzMikoKEIpJk1VTDMyeDMySU5UTzMyX21hc2spOyAgIFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcCA9IChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0hMICYgTVVMMzJ4MzJJTlRPMzJfbWFzaykgKyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEggJiBNVUwzMngzMklOVE8zMl9tYXNrKSArICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgoTVVMMzJ4MzJJTlRPMzJfTEwgPj4gMTYpICYgTVVMMzJ4MzJJTlRPMzJfbWFzayk7ICAgIFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfSEggPSBNVUwzMngzMklOVE8zMl9ISCArIChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0hMID4+IDE2KSArICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0xIID4+IDE2KSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfdGVtcCA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfTEwgPSBNVUwzMngzMklOVE8zMl9MTCArIChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0hMIDw8IDE2KSArICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0xIIDw8IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzaGlmdFZhbHVlIDwgMzIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyX0hIID0gTVVMMzJ4MzJJTlRPMzJfSEggPDwgKDMyIC0gc2hpZnRWYWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzJfbWFzayA9ICgoTFZNX0lOVDMyKTEgPDwgKDMyIC0gc2hpZnRWYWx1ZSkpIC0gMTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMl9MTCA9IChNVUwzMngzMklOVE8zMl9MTCA+PiBzaGlmdFZhbHVlKSAmIE1VTDMyeDMySU5UTzMyX21hc2s7ICAgICAgIFwKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyX3RlbXAyID0gTVVMMzJ4MzJJTlRPMzJfSEggfCBNVUwzMngzMklOVE8zMl9MTDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMiA9IChMVk1fSU5UMzIpTVVMMzJ4MzJJTlRPMzJfSEggPj4gKHNoaWZ0VmFsdWUgLSAzMik7ICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoQykgPSBNVUwzMngzMklOVE8zMl90ZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgTVVMMzJ4MTZJTlRPMzIoQSxCLEMsU2hpZnRSKQpAQCAtNjUsMjUgKzcwLDI0IEBACiAgICAgICAgIG9mIG92ZXJmbG93IGlzIHVuZGVmaW5lZC4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1VTDMyeDE2SU5UTzMyKEEsQixDLFNoaWZ0UikgICBcCi0gICAgICAgIHtMVk1fSU5UMzIgTVVMMzJ4MTZJTlRPMzJfbWFzayxNVUwzMngxNklOVE8zMl9ISCxNVUwzMngxNklOVE8zMl9MTDtcCi0gICAgICAgICBMVk1fSU5UMzIgIHNoaWZ0VmFsdWU7XAotICAgICAgICBzaGlmdFZhbHVlID0gKFNoaWZ0Uik7XAotICAgICAgICBNVUwzMngxNklOVE8zMl9tYXNrPTB4MDAwMEZGRkY7XAotICAgICAgICBNVUwzMngxNklOVE8zMl9ISD0gKChMVk1fSU5UMzIpKEIpKigoTFZNX0lOVDE2KSgoQSk+PjE2KSkpO1wKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzJfTEw9ICgoTFZNX0lOVDMyKSgoQSkmTVVMMzJ4MTZJTlRPMzJfbWFzaykqKEIpKTtcCi0gICAgICAgIGlmKHNoaWZ0VmFsdWU8MTYpXAotICAgICAgICB7XAotICAgICAgICBNVUwzMngxNklOVE8zMl9ISD0oTFZNX0lOVDMyKSgoTFZNX1VJTlQzMilNVUwzMngxNklOVE8zMl9ISDw8KDE2LXNoaWZ0VmFsdWUpKTtcCi0gICAgICAgIChDKT1NVUwzMngxNklOVE8zMl9ISCsoTFZNX0lOVDMyKShNVUwzMngxNklOVE8zMl9MTD4+c2hpZnRWYWx1ZSk7XAotICAgICAgICB9XAotICAgICAgICBlbHNlIGlmKHNoaWZ0VmFsdWU8MzIpIHtcCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIPShMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0hIPj4oc2hpZnRWYWx1ZS0xNikpO1wKLSAgICAgICAgKEMpPU1VTDMyeDE2SU5UTzMyX0hIKyhMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0xMPj5zaGlmdFZhbHVlKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGVsc2Uge1wKLSAgICAgICAgKEMpPU1VTDMyeDE2SU5UTzMyX0hIPj4oc2hpZnRWYWx1ZS0xNik7fVwKLSAgICAgICAgfQorI2RlZmluZSBNVUwzMngxNklOVE8zMihBLCBCLCBDLCBTaGlmdFIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExWTV9JTlQzMiBNVUwzMngxNklOVE8zMl9tYXNrLCBNVUwzMngxNklOVE8zMl9ISCwgTVVMMzJ4MTZJTlRPMzJfTEw7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMVk1fSU5UMzIgc2hpZnRWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2hpZnRWYWx1ZSA9IChTaGlmdFIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX21hc2sgPSAweDAwMDBGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNVUwzMngxNklOVE8zMl9ISCA9ICgoTFZNX0lOVDMyKShCKSAqICgoTFZNX0lOVDE2KSgoQSkgPj4gMTYpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzJfTEwgPSAoKExWTV9JTlQzMikoKEEpJk1VTDMyeDE2SU5UTzMyX21hc2spICogKEIpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzaGlmdFZhbHVlIDwgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEggPSAoTFZNX0lOVDMyKSgoTFZNX1VJTlQzMilNVUwzMngxNklOVE8zMl9ISCA8PCAoMTYgLSBzaGlmdFZhbHVlKSk7IFwKKyAgICAgICAgICAgIChDKSA9IE1VTDMyeDE2SU5UTzMyX0hIICsgKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfTEwgPj4gc2hpZnRWYWx1ZSk7ICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAoc2hpZnRWYWx1ZSA8IDMyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEggPSAoTFZNX0lOVDMyKShNVUwzMngxNklOVE8zMl9ISCA+PiAoc2hpZnRWYWx1ZSAtIDE2KSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChDKSA9IE1VTDMyeDE2SU5UTzMyX0hIICsgKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfTEwgPj4gc2hpZnRWYWx1ZSk7ICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEMpID0gTVVMMzJ4MTZJTlRPMzJfSEggPj4gKHNoaWZ0VmFsdWUgLSAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQUREMl9TQVRfMzJ4MzIoQSxCLEMpCkBAIC05MSwxNiArOTUsMTYgQEAKIAogICAgICAgICBBLEIgYW5kIEMgYXJlIDMyIGJpdCBTSUdORUQgbnVtYmVycy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBBREQyX1NBVF8zMngzMihBLEIsQykgICBcCi0gICAgICAgIHsoQyk9KEEpKyhCKTtcCi0gICAgICAgICBpZiAoKCgoQykgXiAoQSkpICYgKChDKSBeIChCKSkpID4+IDMxKVwKLSAgICAgICAgICAgIHtcCi0gICAgICAgICAgICAgICAgaWYoKEEpPDApXAotICAgICAgICAgICAgICAgICAgICAoQyk9MHg4MDAwMDAwMGw7XAotICAgICAgICAgICAgICAgIGVsc2VcCi0gICAgICAgICAgICAgICAgICAgIChDKT0weDdGRkZGRkZGbDtcCi0gICAgICAgICAgICB9XAotICAgICAgICB9CisjZGVmaW5lIEFERDJfU0FUXzMyeDMyKEEsIEIsIEMpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKEMpID0gKEEpICsgKEIpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKChDKSBeIChBKSkgJiAoKEMpIF4gKEIpKSkgPj4gMzEpIHsgXAorICAgICAgICAgICAgaWYgKChBKSA8IDApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoQykgPSAweDgwMDAwMDAwbDsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChDKSA9IDB4N0ZGRkZGRkZsOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCiAjZW5kaWYgLyogX0xWTV9NQUNST1NfSF8gKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaAppbmRleCBkYmY5ZTZhLi43NWY0Nzg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaApAQCAtMzcsOCArMzcsNyBAQAogLyogIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKgogICAgICAqIFRoZSBtZW1vcnkgYXJlYSBjcmVhdGVkIHVzaW5nIHRoaXMgc3RydWN0dXJlIGlzIGludGVybmFsbHkKICAgICAgKiB0eXBlY2FzdCB0byBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IGFuZCB1c2VkLgpAQCAtNTEsMTQgKzUwLDEzIEBACiAKIH0gTFZNX1RpbWVyX0luc3RhbmNlX3Q7CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyICBTYW1wbGluZ1JhdGU7Ci0gICAgTFZNX0lOVDE2ICBUaW1lSW5NczsKLSAgICBMVk1fSU5UMzIgIENhbGxCYWNrUGFyYW07Ci0gICAgdm9pZCAgICAgICAqcENhbGxCYWNrUGFyYW1zOwotICAgIHZvaWQgICAgICAgKnBDYWxsYmFja0luc3RhbmNlOwotICAgIHZvaWQgICAgICAgKCpwQ2FsbEJhY2spKHZvaWQqLHZvaWQqLExWTV9JTlQzMik7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0lOVDMyIFNhbXBsaW5nUmF0ZTsKKyAgICBMVk1fSU5UMTYgVGltZUluTXM7CisgICAgTFZNX0lOVDMyIENhbGxCYWNrUGFyYW07CisgICAgdm9pZCogcENhbGxCYWNrUGFyYW1zOworICAgIHZvaWQqIHBDYWxsYmFja0luc3RhbmNlOworICAgIHZvaWQgKCpwQ2FsbEJhY2spKHZvaWQqLCB2b2lkKiwgTFZNX0lOVDMyKTsKIAogfSBMVk1fVGltZXJfUGFyYW1zX3Q7CiAKQEAgLTY2LDE0ICs2NCwxMiBAQAogLyogIEZVTkNUSU9OIFBST1RPVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBMVk1fVGltZXJfSW5pdCAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9UaW1lcl9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zICAgICApOwordm9pZCBMVk1fVGltZXJfSW5pdChMVk1fVGltZXJfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fVGltZXJfUGFyYW1zX3QqIHBQYXJhbXMpOwogCi12b2lkIExWTV9UaW1lciAgICAgICggICBMVk1fVGltZXJfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICBCbG9ja1NpemUgKTsKK3ZvaWQgTFZNX1RpbWVyKExWTV9UaW1lcl9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9JTlQxNiBCbG9ja1NpemUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICBFTkQgT0YgSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNlbmRpZiAgLyogX19MVk1fVElNRVJfSF9fICovCisjZW5kaWYgLyogX19MVk1fVElNRVJfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCmluZGV4IDhiNjg3ZjYuLmZiNzk3YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC0zMyw0NiArMzMsMjcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZNX05VTEwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiBOVUxMIHBvaW50ZXIgKi8KKyNkZWZpbmUgTFZNX05VTEwgMCAvKiBOVUxMIHBvaW50ZXIgKi8KIAotI2RlZmluZSBMVk1fVFJVRSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW5zICovCi0jZGVmaW5lIExWTV9GQUxTRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTFZNX1RSVUUgMSAvKiBCb29sZWFucyAqLworI2RlZmluZSBMVk1fRkFMU0UgMAogCi0jZGVmaW5lIExWTV9NQVhJTlRfOCAgICAgICAgICAgIDEyNyAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHNpemUgKi8KLSNkZWZpbmUgTFZNX01BWElOVF8xNiAgICAgICAgICAgMzI3NjcKLSNkZWZpbmUgTFZNX01BWElOVF8zMiAgICAgICAgICAgMjE0NzQ4MzY0NwotI2RlZmluZSBMVk1fTUFYRU5VTSAgICAgICAgICAgICAyMTQ3NDgzNjQ3CisjZGVmaW5lIExWTV9NQVhJTlRfOCAxMjcgLyogTWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHNpemUgKi8KKyNkZWZpbmUgTFZNX01BWElOVF8xNiAzMjc2NworI2RlZmluZSBMVk1fTUFYSU5UXzMyIDIxNDc0ODM2NDcKKyNkZWZpbmUgTFZNX01BWEVOVU0gMjE0NzQ4MzY0NwogCi0jZGVmaW5lIExWTV9NT0RVTEVJRF9NQVNLICAgICAgIDB4RkYwMCAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsaW5nIG1vZHVsZSBJRCBmcm9tIGNhbGxiYWNrSWQgKi8KLSNkZWZpbmUgTFZNX0VWRU5USURfTUFTSyAgICAgICAgMHgwMEZGICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxiYWNrIGV2ZW50IGZyb20gY2FsbGJhY2tJZCAqLworI2RlZmluZSBMVk1fTU9EVUxFSURfTUFTSyAweEZGMDAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsaW5nIG1vZHVsZSBJRCBmcm9tIGNhbGxiYWNrSWQgKi8KKyNkZWZpbmUgTFZNX0VWRU5USURfTUFTSyAweDAwRkYgIC8qIE1hc2sgdG8gZXh0cmFjdCB0aGUgY2FsbGJhY2sgZXZlbnQgZnJvbSBjYWxsYmFja0lkICovCiAKIC8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgICAgICAwICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgICAxICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGICAgICAgMiAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBjb2VmZmljaWVudCBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgICAgICAzICAgLyogT2Zmc2V0IHRvIHRlbXBvcmFyeSBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgMCAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSAxIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiBcCisgICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgY29lZmZpY2llbnQgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUIDMgLyogT2Zmc2V0IHRvIHRlbXBvcmFyeSBtZW1vcnkgcmVnaW9uICovCiAKLSNkZWZpbmUgTFZNX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICAgICAgICAgIDQgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KLQotLyogTWVtb3J5IHBhcnRpdGlvbiB0eXBlICovCi0jZGVmaW5lIExWTV9NRU1fUEFSVElUSU9OMCAgICAgIDAgICAgICAgICAgICAgICAgICAgLyogMXN0IG1lbW9yeSBwYXJ0aXRpb24gKi8KLSNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04xICAgICAgMSAgICAgICAgICAgICAgICAgICAvKiAybmQgbWVtb3J5IHBhcnRpdGlvbiAqLwotI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjIgICAgICAyICAgICAgICAgICAgICAgICAgIC8qIDNyZCBtZW1vcnkgcGFydGl0aW9uICovCi0jZGVmaW5lIExWTV9NRU1fUEFSVElUSU9OMyAgICAgIDMgICAgICAgICAgICAgICAgICAgLyogNHRoIG1lbW9yeSBwYXJ0aXRpb24gKi8KLQotLyogVXNlIHR5cGUgKi8KLSNkZWZpbmUgTFZNX01FTV9QRVJTSVNURU5UICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiBQZXJzaXN0ZW50IG1lbW9yeSB0eXBlICovCi0jZGVmaW5lIExWTV9NRU1fU0NSQVRDSCAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogU2NyYXRjaCAgbWVtb3J5IHR5cGUgKi8KLQotLyogQWNjZXNzIHR5cGUgKi8KLSNkZWZpbmUgTFZNX01FTV9JTlRFUk5BTCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCAoZmFzdCkgYWNjZXNzIG1lbW9yeSAqLwotI2RlZmluZSBMVk1fTUVNX0VYVEVSTkFMICAgICAgICA4ICAgICAgICAgICAgICAgICAgIC8qIEV4dGVybmFsIChzbG93KSBhY2Nlc3MgbWVtb3J5ICovCi0KLS8qIFBsYXRmb3JtIHNwZWNpZmljICovCi0jZGVmaW5lIExWTV9QRVJTSVNURU5UICAgICAgICAgIChMVk1fTUVNX1BBUlRJVElPTjArTFZNX01FTV9QRVJTSVNURU5UK0xWTV9NRU1fSU5URVJOQUwpCi0jZGVmaW5lIExWTV9QRVJTSVNURU5UX0RBVEEgICAgIChMVk1fTUVNX1BBUlRJVElPTjErTFZNX01FTV9QRVJTSVNURU5UK0xWTV9NRU1fSU5URVJOQUwpCi0jZGVmaW5lIExWTV9QRVJTSVNURU5UX0NPRUYgICAgIChMVk1fTUVNX1BBUlRJVElPTjIrTFZNX01FTV9QRVJTSVNURU5UK0xWTV9NRU1fSU5URVJOQUwpCi0jZGVmaW5lIExWTV9TQ1JBVENIICAgICAgICAgICAgIChMVk1fTUVNX1BBUlRJVElPTjMrTFZNX01FTV9TQ1JBVENIK0xWTV9NRU1fSU5URVJOQUwpCisjZGVmaW5lIExWTV9OUl9NRU1PUllfUkVHSU9OUyA0IC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODAsMzMgKzYxLDI4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9DSEFSOyAgICAgICAgICAgLyogQVNDSUkgY2hhcmFjdGVyICovCit0eXBlZGVmIGNoYXIgTFZNX0NIQVI7IC8qIEFTQ0lJIGNoYXJhY3RlciAqLwogCi10eXBlZGVmICAgICBpbnQ4X3QgICAgICAgICAgICAgIExWTV9JTlQ4OyAgICAgICAgICAgLyogU2lnbmVkIDgtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVpbnQ4X3QgICAgICAgICAgICAgTFZNX1VJTlQ4OyAgICAgICAgICAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCit0eXBlZGVmIGludDhfdCBMVk1fSU5UODsgICAvKiBTaWduZWQgOC1iaXQgd29yZCAqLwordHlwZWRlZiB1aW50OF90IExWTV9VSU5UODsgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLwogCi10eXBlZGVmICAgICBpbnQxNl90ICAgICAgICAgICAgIExWTV9JTlQxNjsgICAgICAgICAgLyogU2lnbmVkIDE2LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1aW50MTZfdCAgICAgICAgICAgIExWTV9VSU5UMTY7ICAgICAgICAgLyogVW5zaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgaW50MTZfdCBMVk1fSU5UMTY7ICAgLyogU2lnbmVkIDE2LWJpdCB3b3JkICovCit0eXBlZGVmIHVpbnQxNl90IExWTV9VSU5UMTY7IC8qIFVuc2lnbmVkIDE2LWJpdCB3b3JkICovCiAKLXR5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgaW50NjRfdCAgICAgICAgICAgICBMVk1fSU5UNjQ7ICAgICAgICAgIC8qIFNpZ25lZCA2NC1iaXQgd29yZCAqLwordHlwZWRlZiBpbnQzMl90IExWTV9JTlQzMjsgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KK3R5cGVkZWYgdWludDMyX3QgTFZNX1VJTlQzMjsgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KK3R5cGVkZWYgaW50NjRfdCBMVk1fSU5UNjQ7ICAgLyogU2lnbmVkIDY0LWJpdCB3b3JkICovCiAKLSNkZWZpbmUgTFZNX01BWEZMT0FUICAgICAgICAgICAgMS5mCisjZGVmaW5lIExWTV9NQVhGTE9BVCAxLmYKIAotdHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBMVk1fRkxPQVQ7ICAgICAgICAgIC8qIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKi8KK3R5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOyAvKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50ICovCiAKIC8vIFNlbGVjdCB3aGV0aGVyIHdlIGV4cG9zZSBpbnQxNl90IG9yIGZsb2F0IGJ1ZmZlcnMuCiAKLSNkZWZpbmUgICAgRUZGRUNUX0JVRkZFUl9GT1JNQVQgQVVESU9fRk9STUFUX1BDTV9GTE9BVAotdHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBlZmZlY3RfYnVmZmVyX3Q7CisjZGVmaW5lIEVGRkVDVF9CVUZGRVJfRk9STUFUIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKK3R5cGVkZWYgZmxvYXQgZWZmZWN0X2J1ZmZlcl90OwogCi0KLSNpZmRlZiBTVVBQT1JUX01DCi0jZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgOCAvLyBGQ0NfOAotI2Vsc2UKLSNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyAyIC8vIEZDQ18yCi0jZW5kaWYKKyNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyA4ICAvLyBGQ0NfOAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTE1LDI5ICs5MSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIE9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fTU9ERV9PRkYgICAgPSAwLAotICAgIExWTV9NT0RFX09OICAgICA9IDEsCi0gICAgTFZNX01PREVfRFVNTVkgID0gTFZNX01BWEVOVU0KLX0gTFZNX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fTU9ERV9PRkYgPSAwLCBMVk1fTU9ERV9PTiA9IDEsIExWTV9NT0RFX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fTW9kZV9lbjsKIAogLyogRm9ybWF0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKLSAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKLSAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX01VTFRJQ0hBTk5FTCAgICA9IDMsCi0jZW5kaWYKLSAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX1NURVJFTyA9IDAsCisgICAgTFZNX01PTk9JTlNURVJFTyA9IDEsCisgICAgTFZNX01PTk8gPSAyLAorICAgIExWTV9NVUxUSUNIQU5ORUwgPSAzLAorICAgIExWTV9TT1VSQ0VfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fRm9ybWF0X2VuOwogCiAvKiBMVk0gc2FtcGxpbmcgcmF0ZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9GU184MDAwICA9IDAsCit0eXBlZGVmIGVudW0geworICAgIExWTV9GU184MDAwID0gMCwKICAgICBMVk1fRlNfMTEwMjUgPSAxLAogICAgIExWTV9GU18xMjAwMCA9IDIsCiAgICAgTFZNX0ZTXzE2MDAwID0gMywKQEAgLTE1MCwzMiArMTE3LDI5IEBACiAgICAgTFZNX0ZTXzk2MDAwID0gMTAsCiAgICAgTFZNX0ZTXzE3NjQwMCA9IDExLAogICAgIExWTV9GU18xOTIwMDAgPSAxMiwKLSAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCisgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTSAtIDEsCiAgICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0ZzX2VuOwogCiAvKiBNZW1vcnkgVHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9QRVJTSVNURU5UX1NMT1dfREFUQSAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEsCi0gICAgTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSwKLSAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGLAotICAgIExWTV9URU1QT1JBUllfRkFTVCAgICAgICAgICA9IExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QsCi0gICAgTFZNX01FTU9SWVRZUEVfRFVNTVkgICAgICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSwKKyAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEEgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBLAorICAgIExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRiA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYsCisgICAgTFZNX1RFTVBPUkFSWV9GQVNUID0gTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCwKKyAgICBMVk1fTUVNT1JZVFlQRV9EVU1NWSA9IExWTV9NQVhFTlVNCiB9IExWTV9NZW1vcnlUeXBlc19lbjsKIAogLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9NZW1vcnlUeXBlc19lbiAgICAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX1VJTlQzMiBTaXplOyAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCisgICAgTFZNX01lbW9yeVR5cGVzX2VuIFR5cGU7IC8qIFJlZ2lvbiB0eXBlICovCisgICAgdm9pZCogcEJhc2VBZGRyZXNzOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KIH0gTFZNX01lbW9yeVJlZ2lvbl9zdDsKIAogLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fTWVtb3J5UmVnaW9uX3N0ICAgICAgICAgUmVnaW9uW0xWTV9OUl9NRU1PUllfUkVHSU9OU107ICAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fTWVtb3J5UmVnaW9uX3N0IFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KIH0gTFZNX01lbW9yeVRhYmxlX3N0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE4Myw5ICsxNDcsMTEgQEAKIC8qICBTdGFuZGFyZCBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgTFZNX0lOVDMyICgqTFZNX0NhbGxiYWNrKSh2b2lkICAgICAgICAgICpwQ2FsbGJhY2tEYXRhLCAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2UsICAgLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKGUuZy4gdG8gYSBkYXRhIHN0cnVjdHVyZSBuZWVkZWQgaW4gdGhlIGNhbGxiYWNrKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgR2VuZXJhbFB1cnBvc2UgKTsgICAvKiBHZW5lcmFsIHB1cnBvc2UgdmFyaWFibGUgKGUuZy4gdG8gYmUgdXNlZCBhcyBjYWxsYmFjayBJRCkgKi8KK3R5cGVkZWYgTFZNX0lOVDMyICgqTFZNX0NhbGxiYWNrKSgKKyAgICAgICAgdm9pZCogcENhbGxiYWNrRGF0YSwgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBkYXRhIHN0cnVjdHVyZSAqLworICAgICAgICB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsIC8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyIChlLmcuIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgbmVlZGVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKSAqLworICAgICAgICBMVk1fSU5UMTYgR2VuZXJhbFB1cnBvc2UpOyAvKiBHZW5lcmFsIHB1cnBvc2UgdmFyaWFibGUgKGUuZy4gdG8gYmUgdXNlZCBhcyBjYWxsYmFjayBJRCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE5Myw0ICsxNTksNCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmICAvKiBMVk1fVFlQRVNfSCAqLworI2VuZGlmIC8qIExWTV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaAppbmRleCBiMmUwMTk1Li5iYTYwNWU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKQEAgLTI0LDgwICsyNCw2MiBAQAogICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQuIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCi0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCB2YWx1ZS4gIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCi0gICAgTFZNX0ZMT0FUICAgQ3VycmVudDsgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgdmFsdWUuICBTZXQgYnkgdGhlIG1peGVyIGZ1bmN0aW9uLiAqLwotICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0OyAgICAgICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLwotICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW07ICAgICAgICAgICAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KLSAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlOyAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTsgICAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLwotICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBbHBoYTsgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSAqLworICAgIExWTV9GTE9BVCBUYXJnZXQ7ICAgICAgICAvKiBUYXJnZXQgdmFsdWUuICBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSAqLworICAgIExWTV9GTE9BVCBDdXJyZW50OyAgICAgICAvKiBDdXJyZW50IHZhbHVlLiAgU2V0IGJ5IHRoZSBtaXhlciBmdW5jdGlvbi4gKi8KKyAgICBMVk1fSU5UMTYgQ2FsbGJhY2tTZXQ7ICAgLyogQm9vbGVhbi4gIFNob3VsZCBiZSBzZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggdGltZSB0aGUgdGFyZ2V0IHZhbHVlIGlzIHVwZGF0ZWQgKi8KKyAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbTsgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCogcENhbGxiYWNrSGFuZGxlOyAgIC8qIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQqIHBHZW5lcmFsUHVycG9zZTsgICAvKiBQb2ludGVyIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNhZ2UgKi8KKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrOyAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KIH0gTWl4XzFTdF9DbGxfRkxPQVRfdDsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUICAgQWxwaGExOwotICAgIExWTV9GTE9BVCAgIFRhcmdldDE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudDE7Ci0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQxOwotICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW0xOwotICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGUxOwotICAgIHZvaWQgICAgICAgICpwR2VuZXJhbFB1cnBvc2UxOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBbHBoYTE7CisgICAgTFZNX0ZMT0FUIFRhcmdldDE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOworICAgIExWTV9JTlQxNiBDYWxsYmFja1NldDE7CisgICAgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0xOworICAgIHZvaWQqIHBDYWxsYmFja0hhbmRsZTE7CisgICAgdm9pZCogcEdlbmVyYWxQdXJwb3NlMTsKICAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMTsKIAotICAgIExWTV9GTE9BVCAgIEFscGhhMjsgICAgICAgICAgICAgICAgICAgLyogV2FybmluZyB0aGUgYWRkcmVzcyBvZiB0aGlzIGxvY2F0aW9uIGlzIHBhc3NlZCBhcyBhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gTWl4XzFTdF9DbGxfdCBpbiBzb21lIGZ1bmN0aW9ucyAqLwotICAgIExWTV9GTE9BVCAgIFRhcmdldDI7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudDI7Ci0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQyOwotICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW0yOwotICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGUyOwotICAgIHZvaWQgICAgICAgICpwR2VuZXJhbFB1cnBvc2UyOworICAgIExWTV9GTE9BVCBBbHBoYTI7IC8qIFdhcm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhpcyBsb2NhdGlvbiBpcyBwYXNzZWQgYXMgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBNaXhfMVN0X0NsbF90IGluIHNvbWUgZnVuY3Rpb25zICovCisgICAgTFZNX0ZMT0FUIFRhcmdldDI7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQyOworICAgIExWTV9JTlQxNiBDYWxsYmFja1NldDI7CisgICAgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0yOworICAgIHZvaWQqIHBDYWxsYmFja0hhbmRsZTI7CisgICAgdm9pZCogcEdlbmVyYWxQdXJwb3NlMjsKICAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMjsKIH0gTWl4XzJTdF9DbGxfRkxPQVRfdDsKIAogLyoqKiBHZW5lcmFsIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9GTE9BVCBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyk7CitMVk1fRkxPQVQgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyIHRjLCBMVk1fVUlOVDMyIEZzLCBMVk1fVUlOVDE2IE51bUNoYW5uZWxzKTsKIAotdm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKIAotdm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKK3ZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVChNaXhfMlN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHNyYzIsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7CiAKLXZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKK3ZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoTWl4XzFTdF9DbGxfRkxPQVRfdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKExPVyBMRVZFTCBTVUJGVU5DVElPTlMpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci12b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci12b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoTWl4XzFTdF9DbGxfRkxPQVRfdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVChNaXhfMlN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKaW5kZXggYWU1NDQxOS4uMDRiMTgwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaApAQCAtMzAsNyArMzAsNyBAQAogCiAvKiBBYnNvbHV0ZSB2YWx1ZSBpbmNsdWRpbmcgdGhlIGNvcm5lciBjYXNlIGZvciB0aGUgZXh0cmVtZSBuZWdhdGl2ZSB2YWx1ZSAqLwogCi1MVk1fRkxPQVQgICBBYnNfRmxvYXQoTFZNX0ZMT0FUICAgICBpbnB1dCk7CitMVk1fRkxPQVQgQWJzX0Zsb2F0KExWTV9GTE9BVCBpbnB1dCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgTmFtZSAgICAgICAgOiBkQl90b19MaW4zMigpCkBAIC00NCw3ICs0NCw2IEBACiAgKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0CiAgKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0ZMT0FUIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiAgICBkYl9maXgpOworTFZNX0ZMT0FUIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiBkYl9maXgpOwogCi0jZW5kaWYgIC8qIF9fU0NBTEFSQVJJVEhNRVRJQ19IX18gKi8KLQorI2VuZGlmIC8qIF9fU0NBTEFSQVJJVEhNRVRJQ19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAppbmRleCBiMjdiYWM1Li42NmUzZTc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCkBAIC0yNCwyNCArMjQsMTMgQEAKICAgICBWQVJJT1VTIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTG9hZENvbnN0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Cit2b2lkIExvYWRDb25zdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgdmFsLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwogCi12b2lkIENvcHlfRmxvYXQoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwotdm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKlN0ZXJlb091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwotI2VuZGlmCit2b2lkIENvcHlfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7Cit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIFN0ZXJlb091dCwgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBub3RlOiBJbiBNdWx0M3NfMTZ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCkBAIC01MSwxMCArNDAsNyBAQAogICogICAgICAgVGhpcyBpcyB0aGUgb25seSBjYXNlIHdoaWNoIHdpbGwgZ2l2ZSB3cm9uZyByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgKgogICogICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8gVmVjdG9yX0FyaXRobWV0aWMuZG9jIGluIC9kb2MgZm9sZGVyICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTXVsdDNzX0Zsb2F0KCAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwordm9pZCBNdWx0M3NfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIGNvbnN0IExWTV9GTE9BVCB2YWwsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG5vdGU6IEluIE11bHQzc18zMngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKQEAgLTY0LDg3ICs1MCw1NCBAQAogICogICAgICAgVGhpcyBpcyB0aGUgb25seSBleHRyZW1lIGNvbmRpdGlvbiB3aGljaCBpcyBnaXZpbmcgdW5leHBlY3RlZCByZXN1bHQgICAgKgogICogICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8gVmVjdG9yX0FyaXRobWV0aWMuZG9jIGluIC9kb2MgZm9sZGVyICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTXVsdDNzXzMyeDE2KCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci12b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwotdm9pZCBEZWxheVdyaXRlXzMyKCAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcE9mZnNldCwgICAgICAgICAgIC8qIERlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotdm9pZCBBZGQyX1NhdF9GbG9hdCggICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci12b2lkIE1hYzNzX1NhdF9GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLXZvaWQgRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIoICAgIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBjb2VmZiwgICAgICAgICAgICAgICAgLyogQWxsIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IERlbGF5T2Zmc2V0LCAgICAgICAgIC8qIFNpbXBsZSBkZWxheSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgKnBBbGxQYXNzT2Zmc2V0LCAgICAgLyogQWxsIHBhc3MgZmlsdGVyIGRlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LCAgICAgICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKK3ZvaWQgTXVsdDNzXzMyeDE2KGNvbnN0IExWTV9JTlQzMiogc3JjLCBjb25zdCBMVk1fSU5UMTYgdmFsLCBMVk1fSU5UMzIqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBEZWxheU1peF9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkZWxheSwgICAgIC8qIERlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiogcE9mZnNldCwgICAvKiBEZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOyAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwordm9pZCBEZWxheVdyaXRlXzMyKGNvbnN0IExWTV9JTlQzMiogc3JjLCAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIqIGRlbGF5LCAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYqIHBPZmZzZXQsICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwordm9pZCBBZGQyX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBjb25zdCBMVk1fRkxPQVQgdmFsLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMihMVk1fSU5UMzIqIGRlbGF5LCAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBjb2VmZiwgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBEZWxheU9mZnNldCwgICAgIC8qIFNpbXBsZSBkZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiogcEFsbFBhc3NPZmZzZXQsIC8qIEFsbCBwYXNzIGZpbHRlciBkZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyKiBkc3QsICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgU0hJRlQgRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgU2hpZnRfU2F0X0Zsb2F0IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKTsKK3ZvaWQgU2hpZnRfU2F0X0Zsb2F0KGNvbnN0IExWTV9JTlQxNiB2YWwsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBBVURJTyBGT1JNQVQgQ09OVkVSU0lPTiBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNb25vVG8ySV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotdm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgRnJvbU1jVG9Nb25vX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCit2b2lkIE1vbm9UbzJJX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKLSNlbmRpZgotdm9pZCBNU1RvMmlfU2F0X0Zsb2F0KCAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmNNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotdm9pZCBGcm9tMmlUb01TX0Zsb2F0KCAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdE0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotdm9pZCBKb2luVG8yaV9GbG9hdCggICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjTSwgY29uc3QgTFZNX0ZMT0FUKiBzcmNTLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBGcm9tMmlUb01TX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdE0sIExWTV9GTE9BVCogZHN0UywgTFZNX0lOVDE2IG4pOwordm9pZCBKb2luVG8yaV9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyY0wsIGNvbnN0IExWTV9GTE9BVCogc3JjUiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICk7Cit2b2lkIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihjb25zdCBMVk1fSU5UMTYqIHNyYywgTFZNX0lOVDMyKiBkc3QsIExWTV9JTlQxNiBuLCBMVk1fSU5UMTYgc2hpZnQpOwogCi12b2lkIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYoY29uc3QgIExWTV9JTlQzMiAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2hpZnQgKTsKK3ZvaWQgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihjb25zdCBMVk1fSU5UMzIqIHNyYywgTFZNX0lOVDE2KiBkc3QsIExWTV9JTlQxNiBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaGlmdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgIC8qIF9WRUNUT1JfQVJJVEhNRVRJQ19IXyAqLworI2VuZGlmIC8qIF9WRUNUT1JfQVJJVEhNRVRJQ19IXyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuY3BwCmluZGV4IGUxOGFhNzguLmFlOGNkYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcApAQCAtMzAsMTAgKzMwLDEwIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIFZPTF9UQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgREVDQVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBWT0xfVENfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMGYgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIERFQ0FZX0ZBQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NC4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX1NISUZUIDIxICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBERUNBWV9TSElGVCAxMCAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIFZPTF9UQ19GTE9BVCAyLjBmICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgREVDQVlfRkFDX0ZMT0FUIDY0LjBmIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjksOTEgKzY5LDgzIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKSAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCogcEluc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHBTdFNyYywgICAgICAgICAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBwTW9ub1NyYywgICAgICAgICAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEc3QsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KIHsKLQogICAgIC8qCiAgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNhbXBsZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBSaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHNhbXBsZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCi0gICAgTFZNX0ZMT0FUICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLworICAgIExWTV9VSU5UMTYgaTsgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUIExlZnQ7ICAgICAvKiBMZWZ0IHNhbXBsZSAqLworICAgIExWTV9GTE9BVCBSaWdodDsgICAgLyogUmlnaHQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUIE1vbm87ICAgICAvKiBNb25vIHNhbXBsZSAqLworICAgIExWTV9GTE9BVCBBYnNQZWFrOyAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KKyAgICBMVk1fRkxPQVQgQUdDX011bHQ7IC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUIFZvbF9NdWx0OyAvKiBTaG9ydCB2b2x1bWUgKi8KIAogICAgIC8qCiAgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKICAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOy8qIERlY2F5IHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworICAgIExWTV9GTE9BVCBBR0NfR2FpbiA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBBR0NfTWF4R2FpbiA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47IC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUIEFHQ19BdHRhY2sgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgLyogQXR0YWNrIHNjYWxlciAqLworICAgIExWTV9GTE9BVCBBR0NfRGVjYXkgPSAocEluc3RhbmNlLT5BR0NfRGVjYXkgKiAoMSA8PCAoREVDQVlfU0hJRlQpKSk7IC8qIERlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCBBR0NfVGFyZ2V0ID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUIFZvbF9DdXJyZW50ID0gcEluc3RhbmNlLT5Wb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUIFZvbF9UYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUIFZvbF9UQyA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLwogCiAgICAgLyoKICAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcwogICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1TYW1wbGVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIHNhbXBsZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1TYW1wbGVzOyBpKyspIC8qIEZvciBlYWNoIHNhbXBsZSAqLwogICAgIHsKLQogICAgICAgICAvKgogICAgICAgICAgKiBHZXQgdGhlIHNob3J0IHNjYWxlcnMKICAgICAgICAgICovCi0gICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCBBR0MgZ2FpbiAqLwotICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgdm9sdW1lIGdhaW4gKi8KKyAgICAgICAgQUdDX011bHQgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgIC8qIEdldCB0aGUgc2hvcnQgQUdDIGdhaW4gKi8KKyAgICAgICAgVm9sX011bHQgPSAoTFZNX0ZMT0FUKShWb2xfQ3VycmVudCk7IC8qIEdldCB0aGUgc2hvcnQgdm9sdW1lIGdhaW4gKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKICAgICAgICAgICovCi0gICAgICAgIExlZnQgID0gKnBTdFNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBsZWZ0IHNhbXBsZSAqLwotICAgICAgICBSaWdodCA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcmlnaHQgc2FtcGxlICovCi0gICAgICAgIE1vbm8gID0gKnBNb25vU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtb25vIHNhbXBsZSAqLworICAgICAgICBMZWZ0ID0gKnBTdFNyYysrOyAgIC8qIEdldCB0aGUgbGVmdCBzYW1wbGUgKi8KKyAgICAgICAgUmlnaHQgPSAqcFN0U3JjKys7ICAvKiBHZXQgdGhlIHJpZ2h0IHNhbXBsZSAqLworICAgICAgICBNb25vID0gKnBNb25vU3JjKys7IC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBzdGVyZW8gc2lnbmFsCiAgICAgICAgICAqLwotICAgICAgICBMZWZ0ICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLworICAgICAgICBMZWZ0ICs9IChNb25vICogQUdDX011bHQpOyAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCiAgICAgICAgIFJpZ2h0ICs9IChNb25vICogQUdDX011bHQpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCiAgICAgICAgICAqLwotICAgICAgICBMZWZ0ICA9IExlZnQgICogVm9sX011bHQ7CisgICAgICAgIExlZnQgPSBMZWZ0ICogVm9sX011bHQ7CiAgICAgICAgIFJpZ2h0ID0gUmlnaHQgKiBWb2xfTXVsdDsKLSAgICAgICAgKnBEc3QrKyA9IExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCisgICAgICAgICpwRHN0KysgPSBMZWZ0OyAvKiBTYXZlIHRoZSByZXN1bHRzICovCiAgICAgICAgICpwRHN0KysgPSBSaWdodDsKIAogICAgICAgICAvKgogICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCiAgICAgICAgICAqLwogICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KExlZnQpID4gQWJzX0Zsb2F0KFJpZ2h0KSA/IEFic19GbG9hdChMZWZ0KSA6IEFic19GbG9hdChSaWdodCk7Ci0gICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKLSAgICAgICAgeworICAgICAgICBpZiAoQWJzUGVhayA+IEFHQ19UYXJnZXQpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBsYXJnZSBzbyBkZWNyZWFzZSB0aGUgZ2FpbgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBBR0NfR2FpbiA9IEFHQ19HYWluICogQUdDX0F0dGFjazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKSB7CiAgICAgICAgICAgICAgICAgQUdDX0dhaW4gLT0gKEFHQ19EZWNheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNjEsMTggKzE1MywxNyBAQAogICAgICAgICAvKgogICAgICAgICAgKiBVcGRhdGUgdGhlIGdhaW4KICAgICAgICAgICovCi0gICAgICAgIFZvbF9DdXJyZW50ICs9ICAoVm9sX1RhcmdldCAtIFZvbF9DdXJyZW50KSAqICgoTFZNX0ZMT0FUKVZvbF9UQyAvIFZPTF9UQ19GTE9BVCk7CisgICAgICAgIFZvbF9DdXJyZW50ICs9IChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+Vm9sdW1lID0gVm9sX0N1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIHBJbnN0YW5jZS0+Vm9sdW1lID0gVm9sX0N1cnJlbnQ7IC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLwogICAgIHBJbnN0YW5jZS0+QUdDX0dhaW4gPSBBR0NfR2FpbjsKIAogICAgIHJldHVybjsKIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDksOTMgKzIwMCw4MCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1jU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCi17Ci0KK3ZvaWQgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcE1jU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHBNb25vU3JjLCBMVk1fRkxPQVQqIHBEc3QsIExWTV9VSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgTnJDaGFubmVscykgewogICAgIC8qCiAgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgaSwgamo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgdmFsdWUgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIHNhbXBsZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBBYnNQZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCi0gICAgTFZNX0ZMT0FUICAgICAgIEFHQ19NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICAgVm9sX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCB2b2x1bWUgKi8KKyAgICBMVk1fVUlOVDE2IGksIGpqOyAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fRkxPQVQgU2FtcGxlVmFsOyAvKiBTYW1wbGUgdmFsdWUgKi8KKyAgICBMVk1fRkxPQVQgTW9ubzsgICAgICAvKiBNb25vIHNhbXBsZSAqLworICAgIExWTV9GTE9BVCBBYnNQZWFrOyAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCisgICAgTFZNX0ZMT0FUIEFHQ19NdWx0OyAgLyogU2hvcnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgVm9sX011bHQ7ICAvKiBTaG9ydCB2b2x1bWUgKi8KIAogICAgIC8qCiAgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKICAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgQUdDX0dhaW4gPSBwSW5zdGFuY2UtPkFHQ19HYWluOyAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgQUdDX01heEdhaW4gPSBwSW5zdGFuY2UtPkFHQ19NYXhHYWluOyAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBBR0NfQXR0YWNrID0gcEluc3RhbmNlLT5BR0NfQXR0YWNrOyAgIC8qIEF0dGFjayBzY2FsZXIgKi8KICAgICAvKiBEZWNheSBzY2FsZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworICAgIExWTV9GTE9BVCBBR0NfRGVjYXkgPSAocEluc3RhbmNlLT5BR0NfRGVjYXkgKiAoMSA8PCAoREVDQVlfU0hJRlQpKSk7CisgICAgTFZNX0ZMT0FUIEFHQ19UYXJnZXQgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7IC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUIFZvbF9DdXJyZW50ID0gcEluc3RhbmNlLT5Wb2x1bWU7ICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCBWb2xfVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAgICAvKiBUYXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgVm9sX1RDID0gcEluc3RhbmNlLT5Wb2x1bWVUQzsgICAgICAgLyogVGltZSBjb25zdGFudCAqLwogCiAgICAgLyoKICAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcwogICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBOckZyYW1lczsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZWFjaCBmcmFtZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOckZyYW1lczsgaSsrKSAvKiBGb3IgZWFjaCBmcmFtZSAqLwogICAgIHsKLQogICAgICAgICAvKgogICAgICAgICAgKiBHZXQgdGhlIHNjYWxlcnMKICAgICAgICAgICovCi0gICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBBR0MgZ2FpbiAqLwotICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgdm9sdW1lIGdhaW4gKi8KKyAgICAgICAgQUdDX011bHQgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgIC8qIEdldCB0aGUgQUdDIGdhaW4gKi8KKyAgICAgICAgVm9sX011bHQgPSAoTFZNX0ZMT0FUKShWb2xfQ3VycmVudCk7IC8qIEdldCB0aGUgdm9sdW1lIGdhaW4gKi8KIAogICAgICAgICBBYnNQZWFrID0gMC4wZjsKICAgICAgICAgLyoKICAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCiAgICAgICAgICAqLwotICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTYW1wbGVWYWwgID0gKnBNY1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBzYW1wbGUgdmFsdWUgb2YgamogQ2hhbm5lbCovCi0gICAgICAgICAgICBNb25vICAgICAgID0gKnBNb25vU3JjOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtb25vIHNhbXBsZSAqLworICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKSB7CisgICAgICAgICAgICBTYW1wbGVWYWwgPSAqcE1jU3JjKys7IC8qIEdldCB0aGUgc2FtcGxlIHZhbHVlIG9mIGpqIENoYW5uZWwqLworICAgICAgICAgICAgTW9ubyA9ICpwTW9ub1NyYzsgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBpbnB1dCBzaWduYWwKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU2FtcGxlVmFsICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisgICAgICAgICAgICBTYW1wbGVWYWwgKz0gKE1vbm8gKiBBR0NfTXVsdCk7IC8qIE1peCBpbiB0aGUgbW9ubyBzaWduYWwgKi8KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFNhbXBsZVZhbCAgPSBTYW1wbGVWYWwgICogVm9sX011bHQ7CisgICAgICAgICAgICBTYW1wbGVWYWwgPSBTYW1wbGVWYWwgKiBWb2xfTXVsdDsKIAotICAgICAgICAgICAgKnBEc3QrKyA9IFNhbXBsZVZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIHJlc3VsdHMgKi8KKyAgICAgICAgICAgICpwRHN0KysgPSBTYW1wbGVWYWw7IC8qIFNhdmUgdGhlIHJlc3VsdHMgKi8KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgQUdDIGdhaW4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQWJzUGVhayA9IEFic19GbG9hdChTYW1wbGVWYWwpID4gQWJzUGVhayA/IEFic19GbG9hdChTYW1wbGVWYWwpIDogQWJzUGVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoQWJzUGVhayA+IEFHQ19UYXJnZXQpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKEFic1BlYWsgPiBBR0NfVGFyZ2V0KSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gbGFyZ2Ugc28gZGVjcmVhc2UgdGhlIGdhaW4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQUdDX0dhaW4gPSBBR0NfR2FpbiAqIEFHQ19BdHRhY2s7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gc21hbGwgc28gaW5jcmVhc2UgdGhlIGdhaW4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKEFHQ19HYWluID4gQUdDX01heEdhaW4pCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikgewogICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzAzLDE1ICsyODEsMTQgQEAKICAgICAgICAgLyoKICAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCiAgICAgICAgICAqLwotICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOworICAgICAgICBWb2xfQ3VycmVudCArPSAoVm9sX1RhcmdldCAtIFZvbF9DdXJyZW50KSAqICgoTFZNX0ZMT0FUKVZvbF9UQyAvIFZPTF9UQ19GTE9BVCk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KICAgICBwSW5zdGFuY2UtPkFHQ19HYWluID0gQUdDX0dhaW47CiAKICAgICByZXR1cm47CiB9Ci0jZW5kaWYgLypTVVBQT1JUX01DKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuY3BwCmluZGV4IGUwMTM4MDkuLjNlMzdkODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmNwcApAQCAtMTksNyArMTksNyBAQAogLyogIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KIAotI2luY2x1ZGUgICAgIlNjYWxhckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgTmFtZSAgICAgICAgOiBBYnNfMzIoKQpAQCAtMzAsMjcgKzMwLDIwIEBACiAgKiAgUmVtYXJrcyAgICAgOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9JTlQzMiAgICBBYnNfMzIoTFZNX0lOVDMyICAgIGlucHV0KQotewotICAgIGlmKGlucHV0IDwgIDApCi0gICAgewotICAgICAgICBpZiAoaW5wdXQgPT0gKExWTV9JTlQzMikoMHg4MDAwMDAwMFUpKQotICAgICAgICB7CitMVk1fSU5UMzIgQWJzXzMyKExWTV9JTlQzMiBpbnB1dCkgeworICAgIGlmIChpbnB1dCA8IDApIHsKKyAgICAgICAgaWYgKGlucHV0ID09IChMVk1fSU5UMzIpKDB4ODAwMDAwMDBVKSkgewogICAgICAgICAgICAgLyogVGhlIGNvcm5lciBjYXNlLCBzbyBzZXQgdG8gdGhlIG1heGltdW0gcG9zaXRpdmUgdmFsdWUgKi8KLSAgICAgICAgICAgIGlucHV0PShMVk1fSU5UMzIpIDB4N2ZmZmZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgICAgICBpbnB1dCA9IChMVk1fSU5UMzIpMHg3ZmZmZmZmZjsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIE5lZ2F0aXZlIGlucHV0LCBzbyBpbnZlcnQgKi8KICAgICAgICAgICAgIGlucHV0ID0gKExWTV9JTlQzMikoLWlucHV0KTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gaW5wdXQ7CiB9Ci1MVk1fRkxPQVQgICAgQWJzX0Zsb2F0KExWTV9GTE9BVCAgICBpbnB1dCkKLXsKLSAgICBpZihpbnB1dCA8ICAwKQotICAgIHsKK0xWTV9GTE9BVCBBYnNfRmxvYXQoTFZNX0ZMT0FUIGlucHV0KSB7CisgICAgaWYgKGlucHV0IDwgMCkgewogICAgICAgICAvKiBOZWdhdGl2ZSBpbnB1dCwgc28gaW52ZXJ0ICovCiAgICAgICAgIGlucHV0ID0gKExWTV9GTE9BVCkoLWlucHV0KTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jcHAKaW5kZXggNjk3OGZlNy4uYmUyMDUyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmNwcApAQCAtMjUsMjcgKzI1LDE4IEBACiAgICBGVU5DVElPTiBBREQyX1NBVF8xNlgxNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgQWRkMl9TYXRfMTZ4MTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewordm9pZCBBZGQyX1NhdF8xNngxNihjb25zdCBMVk1fSU5UMTYqIHNyYywgTFZNX0lOVDE2KiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDMyIFRlbXA7CiAgICAgTFZNX0lOVDE2IGlpOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSAqc3JjKSArICgoTFZNX0lOVDMyKSAqZHN0KTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpKnNyYykgKyAoKExWTV9JTlQzMikqZHN0KTsKICAgICAgICAgc3JjKys7CiAKLSAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQotICAgICAgICB7CisgICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikgewogICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApIHsKKyAgICAgICAgICAgICpkc3QgPSAtMHg4MDAwOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpVGVtcDsKICAgICAgICAgfQogICAgICAgICBkc3QrKzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmNwcAppbmRleCBhNDhlNjY4Li40MjBmOTNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuY3BwCkBAIC0yNSwyOCArMjUsMjEgQEAKICAgIEZVTkNUSU9OIEFERDJfU0FUXzMyWDMyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBBZGQyX1NhdF8zMngzMiggY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKLXsKLSAgICBMVk1fSU5UMzIgYSxiLGM7Cit2b2lkIEFkZDJfU2F0XzMyeDMyKGNvbnN0IExWTV9JTlQzMiogc3JjLCBMVk1fSU5UMzIqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fSU5UMzIgYSwgYiwgYzsKICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBhPSpzcmM7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgYSA9ICpzcmM7CiAgICAgICAgIHNyYysrOwogCi0gICAgICAgIGI9KmRzdDsKLSAgICAgICAgYz1hK2I7Ci0gICAgICAgIGlmICgoKChjIF4gYSkgJiAoYyBeIGIpKSA+PiAzMSkhPTApICAgICAvKiBvdmVyZmxvdyAvIHVuZGVyZmxvdyAqLworICAgICAgICBiID0gKmRzdDsKKyAgICAgICAgYyA9IGEgKyBiOworICAgICAgICBpZiAoKCgoYyBeIGEpICYgKGMgXiBiKSkgPj4gMzEpICE9IDApIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKGE8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGM9MHg3RkZGRkZGRkw7CisgICAgICAgICAgICBpZiAoYSA8IDApIHsKKyAgICAgICAgICAgICAgICBjID0gMHg4MDAwMDAwMEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01NiwyNyArNDksMTggQEAKICAgICByZXR1cm47CiB9CiAKLXZvaWQgQWRkMl9TYXRfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Cit2b2lkIEFkZDJfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fRkxPQVQgVGVtcDsKICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpICpzcmMpICsgKChMVk1fRkxPQVQpICpkc3QpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqc3JjKSArICgoTFZNX0ZMT0FUKSpkc3QpOwogICAgICAgICBzcmMrKzsKIAotICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikKLSAgICAgICAgeworICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikgewogICAgICAgICAgICAgKmRzdCA9IDEuMDAwMDAwZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMDAwMDAwZikKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgaWYgKFRlbXAgPCAtMS4wMDAwMDBmKSB7CiAgICAgICAgICAgICAqZHN0ID0gLTEuMDAwMDAwZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICpkc3QgPSBUZW1wOwogICAgICAgICB9CiAgICAgICAgIGRzdCsrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwCmluZGV4IDFhNWUwN2YuLjE5OGE2YTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jcHAKQEAgLTMyLDQ1ICszMiwzOCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKK3ZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJTYW1wbGVzKQogCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW5MOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKK3sKKyAgICBMVk1fRkxPQVQgeW5MOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKIAotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKKyAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQorICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogKCgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0pOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKLSAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiAoKCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0pOworICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CiAKLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQorICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKIAotICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgICogeShuLTEpTCAgKSApCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKz15bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0KLSAgICAgICAgfQotCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgKnBEYXRhT3V0KysgPSB5bkw7ICAvLyBXcml0ZSBMZWZ0IG91dHB1dAogICAgIH0KLQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcAppbmRleCA2MGI2YzE2Li42ZDM2MzAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApAQCAtMzcsMTIgKzM3LDExIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOwordm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKSB7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzID0gKExWTV9GTE9BVCopcFRhcHM7CiAKICAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOwogICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CkBAIC01MCw0ICs0OSwzIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA4YTAwMGI2Li5hNDFjODU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0xOSwxOSArMTksMTYgQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8geworICAgIExWTV9JTlQzMiogcERlbGF5czsgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fSU5UMzIgY29lZnNbM107IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gRmlsdGVyX1N0YXRlOwogCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwordHlwZWRlZiBGaWx0ZXJfU3RhdGUqIFBGaWx0ZXJfU3RhdGU7CiAKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLQotICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQgeworICAgIExWTV9GTE9BVCogcERlbGF5czsgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgY29lZnNbM107IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gRmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQqIFBGaWx0ZXJfU3RhdGVfRkxPQVQ7CiAjZW5kaWYgLypfQlBfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jcHAKaW5kZXggYzg0NGQwMy4uZDRkNGViMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmNwcApAQCAtMzIsMjIgKzMyLDE4IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi17Ci0gICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKK3ZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJTYW1wbGVzKSB7CisgICAgTFZNX0ZMT0FUIHluTCwgdGVtcGw7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCi0gICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICB7CisgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgLy8geW5MPSAoQTAgKiAoeChuKUwgLSB4KG4tMilMICkpCi0gICAgICAgIHRlbXBsID0gKExWTV9GTE9BVCkgKnBEYXRhSW4gLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgIHRlbXBsID0gKExWTV9GTE9BVCkqcERhdGFJbiAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOwogCiAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQpAQCAtNjEsMTQgKzU3LDE0IEBACiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTE2Ci0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMTYKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKIAogICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICpwRGF0YU91dCsrID0gKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0gICAgICAgIH0KKyAgICAgICAgKnBEYXRhT3V0KysgPSAoeW5MKTsgIC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcAppbmRleCBlYjE1MDMyLi5kMzIyYThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcApAQCAtNDcsMTcgKzQ3LDE1IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICAgKnBDb2VmKQotewotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7Cit2b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCogcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCogcENvZWYpIHsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgPSAoTFZNX0ZMT0FUKilwVGFwczsKIAotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSAgcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNmQ3NTRlMi4uMDYwMzI1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMTksMTcgKzE5LDE1IEBACiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCi17Ci0gIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfIHsKKyAgICBMVk1fSU5UMzIqIHBEZWxheXM7IC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0lOVDMyIGNvZWZzWzNdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IEZpbHRlcl9TdGF0ZTsKIAotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZV9GbG9hdDsKLXR5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0ICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZSogUEZpbHRlcl9TdGF0ZTsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQgeworICAgIExWTV9GTE9BVCogcERlbGF5czsgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgY29lZnNbM107IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gRmlsdGVyX1N0YXRlX0Zsb2F0OwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQqIFBGaWx0ZXJfU3RhdGVfRkxPQVQ7CiAjZW5kaWYgLypfQlBfMUlfRDE2RjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jcHAKaW5kZXggZDBiYTIwNi4uMDY3MDMzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmNwcApAQCAtMzIsNDYgKzMyLDM5IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Cit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcykgeworICAgIExWTV9GTE9BVCB5bkwsIHRlbXBsOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKIAotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKKyAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7CiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQotICAgICAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOworICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICB5bkwgKz0gdGVtcGw7CiAKLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOworICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApICkKKyAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICB5bkwgKz0gdGVtcGw7CiAKLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrID0geW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotCi0gICAgICAgIH0KLQorICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICpwRGF0YU91dCsrID0geW5MOyAgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKICAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuY3BwCmluZGV4IDZmN2QwYjUuLjE0NmNjNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuY3BwCkBAIC0zNywxMiArMzcsMTEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0ZMT0FUICopIHBUYXBzOwordm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKSB7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzID0gKExWTV9GTE9BVCopcFRhcHM7CiAKICAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOwogCkBAIC01Miw0ICs1MSwzIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaAppbmRleCA5ZjFjNjZhLi5lYTgzYzBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCkBAIC0xOSwxOCArMTksMTYgQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8geworICAgIExWTV9JTlQzMiogcERlbGF5czsgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fSU5UMzIgY29lZnNbM107IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gRmlsdGVyX1N0YXRlOwogCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAotewotICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlX0Zsb2F0OwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwordHlwZWRlZiBGaWx0ZXJfU3RhdGUqIFBGaWx0ZXJfU3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUIHsKKyAgICBMVk1fRkxPQVQqIHBEZWxheXM7IC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUIGNvZWZzWzNdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IEZpbHRlcl9TdGF0ZV9GbG9hdDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0KiBQRmlsdGVyX1N0YXRlX0ZMT0FUOwogCiAjZW5kaWYgLypfQlBfMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDJfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKaW5kZXggOWFlY2M0MC4uYTQ2YjFlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcApAQCAtMzIsNDkgKzMyLDQyIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwordm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpIHsKKyAgICBMVk1fRkxPQVQgeW5MOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKIAotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKKyAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgIC8vIHluTCs9QTEgKiB4KG4tMSlMCisgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CiAKLSAgICAgICAgICAgIC8vIHluTCs9QTEgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworICAgICAgICAvLyB5bkwrPUEwICogeChuKUwKKyAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CiAKLSAgICAgICAgICAgIC8vIHluTCs9QTAgKiB4KG4pTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgIC8vIHluTCs9ICAoLUIyICAqIHkobi0yKUwgKQorICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwogCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMiAgKiB5KG4tMilMICkKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgIC8vIHluTCs9ICgtQjEgICogeShuLTEpTCAgKQorICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwogCi0gICAgICAgICAgICAvLyB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgIC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKLQotICAgICAgICB9Ci0KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKICAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCmluZGV4IGYwYjVkMDYuLmU4YmZjZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0zNywxMyArMzcsMTIgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKK3ZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KiBwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190KiBwQ29lZikgewogICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyA9IChMVk1fRkxPQVQqKXBUYXBzOwogICAgIHRlbXAgPSBwQ29lZi0+QTI7CiAgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CiAgICAgdGVtcCA9IHBDb2VmLT5BMTsKQEAgLTU3LDQgKzU2LDMgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGZhZDM0NWQuLmFjMjgxOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTE5LDE5ICsxOSwxNyBAQAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDE2ICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXyB7CisgICAgTFZNX0lOVDMyKiBwRGVsYXlzOyAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9JTlQxNiBjb2Vmc1s1XTsgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfSBGaWx0ZXJfU3RhdGU7CiAKLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZSogUEZpbHRlcl9TdGF0ZTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAotewotICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUIHsKKyAgICBMVk1fRkxPQVQqIHBEZWxheXM7IC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUIGNvZWZzWzVdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAKLX1GaWx0ZXJfU3RhdGVfRkxPQVQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworfSBGaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCogUEZpbHRlcl9TdGF0ZV9GTE9BVDsKICNlbmRpZiAvKl9CUV8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAKaW5kZXggMDQzYmM1Zi4uYzYwZGNmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmNwcApAQCAtMzIsNDggKzMyLDQyIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Cit2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcykgeworICAgIExWTV9GTE9BVCB5bkw7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgeworICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CiAKLSAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKyAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKIAotICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgIC8vIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkKKyAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CiAKLSAgICAgICAgICAgIC8vIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkKLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworICAgICAgICAvLyB5bkwrPSAtQjEgICogeShuLTEpTAorICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKIAotICAgICAgICAgICAgLy8geW5MKz0gLUIxICAqIHkobi0xKUwKLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgIC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0KLSAgICAgICAgfQorICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCkoeW5MKTsgIC8vIFdyaXRlIExlZnQgb3V0cHV0CiAgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDZhNjFkOWEuLmFmMGVmYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTE5LDE5ICsxOSwxNyBAQAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMTYgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8geworICAgIExWTV9JTlQzMiogcERlbGF5czsgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fSU5UMTYgY29lZnNbNV07IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gRmlsdGVyX1N0YXRlOwogCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwordHlwZWRlZiBGaWx0ZXJfU3RhdGUqIFBGaWx0ZXJfU3RhdGU7CiAKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICAgIExWTV9GTE9BVCAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQgeworICAgIExWTV9GTE9BVCogcERlbGF5czsgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgY29lZnNbNV07IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIAotfUZpbHRlcl9TdGF0ZV9GTE9BVDsKLXR5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Cit9IEZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUKiBQRmlsdGVyX1N0YXRlX0ZMT0FUOwogI2VuZGlmIC8qX0JRXzFJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcAppbmRleCAyYjgwNjkxLi5lY2Y0NGNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcApAQCAtMzcsMTMgKzM3LDEyIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Cit2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCogcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCogcENvZWYpIHsKICAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopcFRhcHM7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzID0gKExWTV9GTE9BVCopcFRhcHM7CiAKICAgICB0ZW1wID0gcENvZWYtPkEyOwogICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwpAQCAtNTgsNCArNTcsMyBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwCmluZGV4IDUxY2Q5MTguLmQwNDdlOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jcHAKQEAgLTM2LDcyICszNiw2NSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Cit2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcykgeworICAgIExWTV9GTE9BVCB5bkwsIHluUjsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CiAKLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7CisgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCisgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKIAotICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwogCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKyAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTCAgKQorICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOwogCi0gICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMICApCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwgKQorICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOwogCi0gICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwgKQotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKKyAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKKyAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKIAotICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCisgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluICsgMSkpOwogCi0gICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKKyAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKIAotICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKyAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCisgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CiAKLSAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSCiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQKLQotICAgICAgICB9Ci0KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKyAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgIC8vIFdyaXRlIFJpZ2h0IG91dHB1dAogICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcAppbmRleCA4Zjc0NzQ5Li4zOTliNWVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwCkBAIC0zNiw3MiArMzYsNjUgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwordm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpIHsKKyAgICBMVk1fRkxPQVQgeW5MLCB5blI7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgeworICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CiAKLSAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKyAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKIAotICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgIC8vIHluTCs9ICggLUIyICAqIHkobi0yKUwKKyAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKIAotICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKyAgICAgICAgLy8geW5MKz0oIC1CMSAgKiB5KG4tMSlMCisgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CiAKLSAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgICogeShuLTEpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKKyAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKKyAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKIAotICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCisgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluICsgMSkpOwogCi0gICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKKyAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKIAotICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKyAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCisgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CiAKLSAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSCiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQKLQotICAgICAgICB9Ci0KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKyAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgIC8vIFdyaXRlIFJpZ2h0IG91dHB1dAogICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKaW5kZXggOTg3Y2JjZi4uZTBjZDkzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKQEAgLTM3LDEzICszNywxMiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewordm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKSB7CiAgICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgPSAoTFZNX0ZMT0FUKilwVGFwczsKIAogICAgIHRlbXAgPSBwQ29lZi0+QTI7CiAgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CkBAIC01OCw0ICs1NywzIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA1YTlhMGU5Li45NGNjNzk0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yMCwyMCArMjAsMTggQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICBwRGVsYXlzOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAqLwotICBMVk1fSU5UMTYgICAgIGNvZWZzWzVdOyAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfIHsKKyAgICBMVk1fSU5UMzIqIHBEZWxheXM7IC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAqLworICAgIExWTV9JTlQxNiBjb2Vmc1s1XTsgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfSBGaWx0ZXJfU3RhdGU7CiAKLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZSogUEZpbHRlcl9TdGF0ZTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAotewotICAgIExWTV9GTE9BVCAqICAgcERlbGF5czsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgKi8KLSAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzVdOyAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVCB7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlzOyAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgKi8KKyAgICBMVk1fRkxPQVQgY29lZnNbNV07IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIAotfUZpbHRlcl9TdGF0ZV9GTE9BVDsKLXR5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Cit9IEZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUKiBQRmlsdGVyX1N0YXRlX0ZMT0FUOwogCiAjZW5kaWYgLyogX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmNwcAppbmRleCAzMzFjOTdmLi4zYjdlYjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuY3BwCkBAIC0zNiw3NCArMzYsNjkgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwordm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpIHsKKyAgICBMVk1fRkxPQVQgeW5MLCB5blI7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCi0gICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKKyAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogeW5MPUEyICogeChuLTIpTCAqLworICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPUEyICogeChuLTIpTCAqLwotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAvKiB5bkwrPUExKiB4KG4tMSlMICovCisgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CiAKLSAgICAgICAgICAgIC8qIHluTCs9QTEqIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgIC8qIHluTCs9QTAqIHgobilMICAgKi8KKyAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CiAKLSAgICAgICAgICAgIC8qIHluTCs9QTAqIHgobilMICAgKi8KLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAvKiB5bkwrPS1CMip5KG4tMilMICovCisgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwogCi0gICAgICAgICAgICAvKiB5bkwrPS1CMip5KG4tMilMICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKyAgICAgICAgLyogeW5MKz0tQjEqeShuLTEpTCAqLworICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKIAotICAgICAgICAgICAgLyogeW5MKz0tQjEqeShuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIHluUj1BMiAqIHgobi0yKVIgKi8KKyAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5blI9QTIgKiB4KG4tMilSICovCi0gICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgIC8qIHluUis9QTEqIHgobi0xKVIgKi8KKyAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKIAotICAgICAgICAgICAgLyogeW5SKz1BMSogeChuLTEpUiAqLwotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgLyogeW5SKz1BMCogeChuKVIgICAqLworICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbiArIDEpKTsKIAotICAgICAgICAgICAgLyogeW5SKz1BMCogeChuKVIgICAqLwotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworICAgICAgICAvKiB5blIrPS1CMiAqIHkobi0yKVIgKi8KKyAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CiAKLSAgICAgICAgICAgIC8qIHluUis9LUIyICogeShuLTIpUiAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisgICAgICAgIC8qIHluUis9LUIxICogeShuLTEpUiAqLworICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKIAotICAgICAgICAgICAgLyogeW5SKz0tQjEgKiB5KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICBwRGF0YUluKys7CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgIHBEYXRhSW4rKzsKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgfQorICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91dHB1dCAqLworICAgICAgICBwRGF0YU91dCsrOwogICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmNwcAppbmRleCAzYTM5NmRmLi44YzQzNDMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuY3BwCkBAIC0zNiw3NSArMzYsNjkgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwordm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpIHsKKyAgICBMVk1fRkxPQVQgeW5MLCB5blI7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCi0gICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKKyAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KKyAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLworICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwogCi0gICAgICAgICAgICAvKiB5bkwrPUExICAqIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgIC8qIHluTCs9QTAgICogeChuKUwgKi8KKyAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CiAKLSAgICAgICAgICAgIC8qIHluTCs9QTAgICogeChuKUwgKi8KLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAvKiB5bkwrPSAoICgtQjIgICogeShuLTIpTCAgKSkqLworICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKIAotICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyICAqIHkobi0yKUwgICkpKi8KLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworICAgICAgICAvKiB5bkwrPSggKC1CMSAgKiB5KG4tMSlMICApKSAgKi8KKyAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CiAKLSAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxICAqIHkobi0xKUwgICkpICAqLwotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIHluUj1BMiAgKiB4KG4tMilSICovCisgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCisgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CiAKLSAgICAgICAgICAgIC8qIHluUis9QTEgICogeChuLTEpUiAqLwotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgLyogeW5SKz1BMCAgKiB4KG4pUiAqLworICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbiArIDEpKTsKIAotICAgICAgICAgICAgLyogeW5SKz1BMCAgKiB4KG4pUiAqLwotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworICAgICAgICAvKiB5blIrPSAoICgtQjIgICogeShuLTIpUiAgKSkqLworICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKIAotICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyICAqIHkobi0yKVIgICkpKi8KLSAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSAgKi8KKyAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CiAKLSAgICAgICAgICAgIC8qIHluUis9KCAoLUIxICAqIHkobi0xKVIgICkpICAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgcERhdGFJbisrOworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICBwRGF0YUluKys7CiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgIH0KLQorICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91dHB1dCAqLworICAgICAgICBwRGF0YU91dCsrOwogICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmNwcAppbmRleCAxY2JmZjFhLi44NGZiYWRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuY3BwCkBAIC0zNiw3NSArMzYsNjkgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpIHsKKyAgICBMVk1fRkxPQVQgeW5MLCB5blI7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgeworICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiB5bkw9QTIgICogeChuLTIpTCAqLworICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgLyogeW5MKz1BMSAgKiB4KG4tMSlMICovCisgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CiAKLSAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKyAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLworICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKIAotICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkgICovCisgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwogCi0gICAgICAgICAgICAvKiB5bkwrPSAoICgtQjIgICogeShuLTIpTCApICAqLwotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisgICAgICAgIC8qIHluTCs9KCAoLUIxICAqIHkobi0xKUwgICkpICAqLworICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKIAotICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KKyAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5blI9QTIgICogeChuLTIpUiAqLwotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICAvKiB5blIrPUExICAqIHgobi0xKVIgKi8KKyAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKIAotICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCisgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluICsgMSkpOwogCi0gICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICkgKi8KKyAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CiAKLSAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICkgKi8KLSAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSBpbiBRMTUgKi8KKyAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CiAKLSAgICAgICAgICAgIC8qIHluUis9KCAoLUIxICAqIHkobi0xKVIgICkpIGluIFExNSAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMKi8KKyAgICAgICAgcERhdGFJbisrOworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiovCisgICAgICAgIHBEYXRhSW4rKzsKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAvKiBVcGRhdGUgeShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgfQotCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLworICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXRwdXQqLworICAgICAgICBwRGF0YU91dCsrOwogICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCAzMTQzODhhLi4xY2M3NjE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yMCwyMCArMjAsMTggQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmc1s1XTsgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8geworICAgIExWTV9JTlQzMiogcERlbGF5czsgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fSU5UMTYgY29lZnNbNV07IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gRmlsdGVyX1N0YXRlOwogCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwordHlwZWRlZiBGaWx0ZXJfU3RhdGUqIFBGaWx0ZXJfU3RhdGU7CiAKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmc1s1XTsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGVfRkxPQVQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVCB7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlzOyAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUIGNvZWZzWzVdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IEZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUKiBQRmlsdGVyX1N0YXRlX0ZMT0FUOwogCiAjZW5kaWYgLyogX0JRXzJJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKaW5kZXggMDU4NTQxYS4uNjgxN2Q5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKQEAgLTM2LDEzICszNiwxMiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewordm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKSB7CiAgICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgPSAoTFZNX0ZMT0FUKilwVGFwczsKICAgICB0ZW1wID0gcENvZWYtPkEyOwogICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwogICAgIHRlbXAgPSBwQ29lZi0+QTE7CkBAIC01Niw0ICs1NSwzIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAKaW5kZXggNzhkMWJhMS4uNGVlYWFhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmNwcApAQCAtMzYsOTEgKzM2LDg0IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJTYW1wbGVzKQogCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix0ZW1wbCx0ZW1wZDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Cit7CisgICAgTFZNX0ZMT0FUIHluTCwgeW5SLCB0ZW1wbCwgdGVtcGQ7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgeworICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiB5bkw9ICggQTIgICogeChuLTIpTCAgKSAqLworICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD0gKCBBMiAgKiB4KG4tMilMICApICovCi0gICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAvKiB5bkwrPSAoIEExICAqIHgobi0xKUwgICkqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgIHluTCArPSB0ZW1wbDsKIAotICAgICAgICAgICAgLyogeW5MKz0gKCBBMSAgKiB4KG4tMSlMICApKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKyAgICAgICAgLyogeW5MKz0gKCBBMCAgKiB4KG4pTCAgKSAqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICB5bkwgKz0gdGVtcGw7CiAKLSAgICAgICAgICAgIC8qIHluTCs9ICggQTAgICogeChuKUwgICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisgICAgICAgIC8qIHluTCs9ICgtQjIgICogeShuLTIpTCAgKSAqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisgICAgICAgIHluTCArPSB0ZW1wbDsKIAotICAgICAgICAgICAgIC8qIHluTCs9ICgtQjIgICogeShuLTIpTCAgKSAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOworICAgICAgICAvKiB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisgICAgICAgIHluTCArPSB0ZW1wbDsKIAotICAgICAgICAgICAgLyogeW5MKz0gKC1CMSAgKiB5KG4tMSlMICApKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogeW5SPSAoIEEyICAqIHgobi0yKVIgICkgKi8KKyAgICAgICAgeW5SID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPSAoIEEyICAqIHgobi0yKVIgICkgKi8KLSAgICAgICAgICAgIHluUiA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgIC8qIHluUis9ICggQTEgICogeChuLTEpUiAgKSAqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgIHluUiArPSB0ZW1wbDsKIAotICAgICAgICAgICAgLyogeW5SKz0gKCBBMSAgKiB4KG4tMSlSICApICovCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0gICAgICAgICAgICB5blIgKz0gdGVtcGw7CisgICAgICAgIC8qIHluUis9ICggQTAgICogeChuKVIgICkgKi8KKyAgICAgICAgdGVtcGQgPSAqKHBEYXRhSW4gKyAxKTsKKyAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogdGVtcGQ7CisgICAgICAgIHluUiArPSB0ZW1wbDsKIAotICAgICAgICAgICAgLyogeW5SKz0gKCBBMCAgKiB4KG4pUiAgKSAqLwotICAgICAgICAgICAgdGVtcGQgPSogKHBEYXRhSW4rMSk7Ci0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiB0ZW1wZDsKLSAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKyAgICAgICAgLyogeW5SKz0gKC1CMiAgKiB5KG4tMilSICApICovCisgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKyAgICAgICAgeW5SICs9IHRlbXBsOwogCi0gICAgICAgICAgICAvKiB5blIrPSAoLUIyICAqIHkobi0yKVIgICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKLSAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKyAgICAgICAgLyogeW5SKz0gKC1CMSAgKiB5KG4tMSlSICApICAqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisgICAgICAgIHluUiArPSB0ZW1wbDsKIAotICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAgKiB5KG4tMSlSICApICAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IChMVk1fRkxPQVQpeW5SOyAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0gKExWTV9GTE9BVCl5bkw7ICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgcERhdGFJbisrOwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSAoTFZNX0ZMT0FUKXluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IChMVk1fRkxPQVQpeW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bkw7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5blI7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotCi0gICAgICAgIH0KLQorICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpeW5MOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluUjsgLyogV3JpdGUgUmlnaHQgb3V0cHV0ICovCisgICAgICAgIHBEYXRhT3V0Kys7CiAgICAgfQorfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgQVNTVU1QVElPTlM6CiAgQ09FRlMtCkBAIC0xNDEsNjEgKzEzNCw1MyBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzQqTnJDaGFubmVscyAtIDFdIGlzIHkobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKQordm9pZCBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpCiAKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5biwgdGVtcDsKLSAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworeworICAgIExWTV9GTE9BVCB5biwgdGVtcDsKKyAgICBMVk1fSU5UMTYgaWksIGpqOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCi0gICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7CisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBDSEFOTkVMLVdJU0UKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKSB7CisgICAgICAgICAgICAvKiB5bj0gKEEyICAqIHgobi0yKSkgKi8KKyAgICAgICAgICAgIHluID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOworCisgICAgICAgICAgICAvKiB5bis9IChBMSAgKiB4KG4tMSkpICovCisgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07CisgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAvKiB5bis9IChBMCAgKiB4KG4pKSAqLworICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgLyogeW4rPSAoLUIyICAqIHkobi0yKSkgKi8KKyAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdOworICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgLyogeW4rPSAoLUIxICAqIHkobi0xKSkgKi8KKyAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOworICAgICAgICAgICAgeW4gKz0gdGVtcDsKKwogICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBDSEFOTkVMLVdJU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHluPSAoQTIgICogeChuLTIpKSAqLwotICAgICAgICAgICAgICAgIHluID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOwotCi0gICAgICAgICAgICAgICAgLyogeW4rPSAoQTEgICogeChuLTEpKSAqLwotICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXTsKLSAgICAgICAgICAgICAgICB5biArPSB0ZW1wOwotCi0gICAgICAgICAgICAgICAgLyogeW4rPSAoQTAgICogeChuKSkgKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0gICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKLQotICAgICAgICAgICAgICAgICAvKiB5bis9ICgtQjIgICogeShuLTIpKSAqLwotICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMyArIGpqXTsKLSAgICAgICAgICAgICAgICB5biArPSB0ZW1wOwotCi0gICAgICAgICAgICAgICAgLyogeW4rPSAoLUIxICAqIHkobi0xKSkgKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjIgKyBqal07Ci0gICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKLQotICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMyArIGpqXSA9CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQogICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IChMVk1fRkxPQVQpeW47IC8qIFVwZGF0ZSB5KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KLSAgICAgICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluOyAvKiBXcml0ZSBqaiBDaGFubmVsIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeChuLTIpPXgobi0xKSovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSAoTFZNX0ZMT0FUKXluOyAvKiBVcGRhdGUgeShuLTEpKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSkqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluOyAvKiBXcml0ZSBqaiBDaGFubmVsIG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKICAgICAgICAgfQotCiAgICAgfQotI2VuZGlmIC8qU1VQUE9SVF9NQyovCi0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKaW5kZXggNDkyYTllMC4uMWUyNzM5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKQEAgLTM3LDEzICszNywxMiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKSB7CiAgICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgPSAoTFZNX0ZMT0FUKilwVGFwczsKICAgICB0ZW1wID0gcENvZWYtPkEyOwogICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwogICAgIHRlbXAgPSBwQ29lZi0+QTE7CkBAIC01Nyw0ICs1NiwzIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QzMkYzMkMzMl9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA3ZWI2NDc0Li40YTIxNDlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yMCwyMCArMjAsMTggQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXyB7CisgICAgTFZNX0lOVDMyKiBwRGVsYXlzOyAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9JTlQzMiBjb2Vmc1s1XTsgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfSBGaWx0ZXJfU3RhdGU7CiAKLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZSogUEZpbHRlcl9TdGF0ZTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAotewotICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGVfRkxPQVQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVCB7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlzOyAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCBjb2Vmc1s1XTsgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfSBGaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCogUEZpbHRlcl9TdGF0ZV9GTE9BVDsKIAogI2VuZGlmIC8qIF9CUV8ySV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvbXBMaW1fcHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKaW5kZXggMDZhMjFjMy4uOWM3YTk2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKQEAgLTI4LDE3ICsyOCwxNiBAQAogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEZTXzQ4SyAgICAgIDQ4MDAwCisjZGVmaW5lIEZTXzQ4SyA0ODAwMAogCi0jZGVmaW5lIElOVEVHRVJfMTYgIDB4RkZGRiAvKiAgIDY1NTM1Ki8KLSNkZWZpbmUgSU5URUdFUl8xNSAgMHg3RkZGIC8qICAgMzI3NjcqLworI2RlZmluZSBJTlRFR0VSXzE2IDB4RkZGRiAvKiAgIDY1NTM1Ki8KKyNkZWZpbmUgSU5URUdFUl8xNSAweDdGRkYgLyogICAzMjc2NyovCiAKLSNkZWZpbmUgR0FJTl82REIgICAgMQotI2RlZmluZSBHQUlOXzEyREIgICAyCi0jZGVmaW5lIEdBSU5fMThEQiAgIDMKLSNkZWZpbmUgR0FJTl8yNERCICAgNAorI2RlZmluZSBHQUlOXzZEQiAxCisjZGVmaW5lIEdBSU5fMTJEQiAyCisjZGVmaW5lIEdBSU5fMThEQiAzCisjZGVmaW5lIEdBSU5fMjREQiA0CiAKICNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9QUklWQVRFXyAqLwogCiAvKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcAppbmRleCAzYTUwNTU0Li44ODg3ODkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcApAQCAtMjUsMjcgKzI1LDE5IEBACiAgICBGVU5DVElPTiBDT1BZXzE2CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBDb3B5XzE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Cit2b2lkIENvcHlfMTYoY29uc3QgTFZNX0lOVDE2KiBzcmMsIExWTV9JTlQxNiogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9JTlQxNiBpaTsKIAotICAgIGlmIChzcmMgPiBkc3QpCi0gICAgewotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgeworICAgIGlmIChzcmMgPiBkc3QpIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgICpkc3QgPSAqc3JjOwogICAgICAgICAgICAgZHN0Kys7CiAgICAgICAgICAgICBzcmMrKzsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIHNyYyArPSBuIC0gMTsKICAgICAgICAgZHN0ICs9IG4gLSAxOwotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgeworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgKmRzdCA9ICpzcmM7CiAgICAgICAgICAgICBkc3QtLTsKICAgICAgICAgICAgIHNyYy0tOwpAQCAtNTQsMjcgKzQ2LDE5IEBACiAKICAgICByZXR1cm47CiB9Ci12b2lkIENvcHlfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKLXsKK3ZvaWQgQ29weV9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogCi0gICAgaWYgKHNyYyA+IGRzdCkKLSAgICB7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgaWYgKHNyYyA+IGRzdCkgeworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgKmRzdCA9ICpzcmM7CiAgICAgICAgICAgICBkc3QrKzsKICAgICAgICAgICAgIHNyYysrOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgc3JjICs9IG4gLSAxOwogICAgICAgICBkc3QgKz0gbiAtIDE7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICAqZHN0ID0gKnNyYzsKICAgICAgICAgICAgIGRzdC0tOwogICAgICAgICAgICAgc3JjLS07CkBAIC04Myw0NiArNjcsMzUgQEAKIAogICAgIHJldHVybjsKIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvLyBFeHRyYWN0IG91dCB0aGUgc3RlcmVvIGNoYW5uZWwgcGFpciBmcm9tIG11bHRpY2hhbm5lbCBzb3VyY2UuCi12b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzICovCi0gICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKQotewordm9pZCBDb3B5X0Zsb2F0X01jX1N0ZXJlbyhjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykgewogICAgIExWTV9JTlQxNiBpaTsKIAotICAgIGlmIChOckNoYW5uZWxzID49IDIpCi0gICAgewotICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKKyAgICBpZiAoTnJDaGFubmVscyA+PSAyKSB7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOwogICAgICAgICAgICAgZHN0WzFdID0gc3JjWzFdOwogICAgICAgICAgICAgZHN0ICs9IDI7CiAgICAgICAgICAgICBzcmMgKz0gTnJDaGFubmVsczsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChOckNoYW5uZWxzID09IDEpCi0gICAgeyAgIC8vIG5vdCBleHBlY3RlZCB0byBvY2N1ciwgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICB9IGVsc2UgaWYgKE5yQ2hhbm5lbHMgPT0gMSkgeyAgLy8gbm90IGV4cGVjdGVkIHRvIG9jY3VyLCBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzLgogICAgICAgICBzcmMgKz0gKE5yRnJhbWVzIC0gMSk7CiAgICAgICAgIGRzdCArPSAyICogKE5yRnJhbWVzIC0gMSk7Ci0gICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgeworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKICAgICAgICAgICAgIGRzdFsxXSA9IHNyY1swXTsKICAgICAgICAgICAgIGRzdCAtPSAyOwotICAgICAgICAgICAgc3JjIC0tOworICAgICAgICAgICAgc3JjLS07CiAgICAgICAgIH0KICAgICB9CiB9CiAKIC8vIE1lcmdlIGEgbXVsdGljaGFubmVsIHNvdXJjZSB3aXRoIHN0ZXJlbyBjb250YWluZWQgaW4gU3RlcmVvT3V0LCB0byBkc3QuCi12b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKlN0ZXJlb091dCwKLSAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyovCi0gICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKQotewordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBTdGVyZW9PdXQsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykgewogICAgIExWTV9JTlQxNiBpaSwgamo7CiAKICAgICAvLyBwYWNrIGRzdCB3aXRoIHN0ZXJlbyBpbmZvcm1hdGlvbiBvZiBTdGVyZW9PdXQKQEAgLTEzMCwxOCArMTAzLDE1IEBACiAgICAgU3RlcmVvT3V0ICs9IDIgKiAoTnJGcmFtZXMgLSAxKTsKICAgICBkc3QgKz0gTnJDaGFubmVscyAqIChOckZyYW1lcyAtIDEpOwogICAgIHNyYyArPSBOckNoYW5uZWxzICogKE5yRnJhbWVzIC0gMSk7Ci0gICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgZHN0WzFdID0gU3RlcmVvT3V0WzFdOwotICAgICAgICBkc3RbMF0gPSBTdGVyZW9PdXRbMF07IC8vIGNvcHkgMSBiZWZvcmUgMCBpcyByZXF1aXJlZCBmb3IgTnJDaGFubmVscyA9PSAzLgotICAgICAgICBmb3IgKGpqID0gMjsgamogPCBOckNoYW5uZWxzOyBqaisrKQotICAgICAgICB7CisgICAgICAgIGRzdFswXSA9IFN0ZXJlb091dFswXTsgIC8vIGNvcHkgMSBiZWZvcmUgMCBpcyByZXF1aXJlZCBmb3IgTnJDaGFubmVscyA9PSAzLgorICAgICAgICBmb3IgKGpqID0gMjsgamogPCBOckNoYW5uZWxzOyBqaisrKSB7CiAgICAgICAgICAgICBkc3RbampdID0gc3JjW2pqXTsKICAgICAgICAgfQotICAgICAgICBkc3QgICAgLT0gTnJDaGFubmVsczsKLSAgICAgICAgc3JjICAgIC09IE5yQ2hhbm5lbHM7CisgICAgICAgIGRzdCAtPSBOckNoYW5uZWxzOworICAgICAgICBzcmMgLT0gTnJDaGFubmVsczsKICAgICAgICAgU3RlcmVvT3V0IC09IDI7CiAgICAgfQogfQotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuY3BwCmluZGV4IDVlNzczMzUuLjJjMjA2MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmNwcApAQCAtMjUsMTMgKzI1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWEhBUkRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0ZMT0FUICBUZW1wMSxUZW1wMixUZW1wMzsKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKE1peF8yU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDEsIFRlbXAyLCBUZW1wMzsKICAgICBMVk1fSU5UMTYgaWk7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxU2hvcnQ7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQyU2hvcnQ7CkBAIC0zOSw3ICszNSw3IEBACiAgICAgQ3VycmVudDFTaG9ydCA9IChwSW5zdGFuY2UtPkN1cnJlbnQxKTsKICAgICBDdXJyZW50MlNob3J0ID0gKHBJbnN0YW5jZS0+Q3VycmVudDIpOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0peworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIFRlbXAxID0gKnNyYzErKzsKICAgICAgICAgVGVtcDMgPSBUZW1wMSAqIEN1cnJlbnQxU2hvcnQ7CiAgICAgICAgIFRlbXAyID0gKnNyYzIrKzsKQEAgLTQ3LDExICs0MywxMSBAQAogICAgICAgICBUZW1wMiA9IChUZW1wMSAvIDIuMGYpICsgKFRlbXAzIC8gMi4wZik7CiAgICAgICAgIGlmIChUZW1wMiA+IDAuNWYpCiAgICAgICAgICAgICBUZW1wMiA9IDEuMGY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAyIDwgLTAuNWYgKQorICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0wLjVmKQogICAgICAgICAgICAgVGVtcDIgPSAtMS4wZjsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgVGVtcDIgPSAoVGVtcDIgKiAyKTsKLSAgICAgICAgICAgICpkc3QrKyA9IFRlbXAyOworICAgICAgICAqZHN0KysgPSBUZW1wMjsKICAgICB9CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKaW5kZXggOGY1YzBhZS4uYmU5ZTQ5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKQEAgLTI2LDUzICsyNiw0OCBAQAogICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIExWTV9GTE9BVCAgICBUZW1wMSxUZW1wMixUZW1wMzsKLSAgICBMVk1fSU5UMTYgICAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgICBJbkxvb3A7Ci0gICAgTFZNX0ZMT0FUICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGE7Ci0gICAgTFZNX0ZMT0FUICAgIEN1cnJlbnRUaW1lc0FscGhhOwotICAgIExWTV9JTlQxNiAgICAgaWksamo7Cit2b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoTWl4XzFTdF9DbGxfRkxPQVRfdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDEsIFRlbXAyLCBUZW1wMzsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9GTE9BVCBUYXJnZXRUaW1lc09uZU1pbkFscGhhOworICAgIExWTV9GTE9BVCBDdXJyZW50VGltZXNBbHBoYTsKKyAgICBMVk1fSU5UMTYgaWksIGpqOwogCiAgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCiAgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKIAotICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPSAoKDEuMGYgLXBJbnN0YW5jZS0+QWxwaGEpICogcEluc3RhbmNlLT5UYXJnZXQpOwotICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpewotICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9KExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KKyAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKCgxLjBmIC0gcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldCk7CisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkgeworICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9IChMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCiAgICAgfQogCi0gICAgaWYgKE91dExvb3ApewotCisgICAgaWYgKE91dExvb3ApIHsKICAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOwogICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CiAKLSAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICBUZW1wMSA9ICpzcmMrKzsKLSAgICAgICAgVGVtcDIgPSAqZHN0OworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgICAgICBUZW1wMiA9ICpkc3Q7CiAKLSAgICAgICAgVGVtcDMgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOwotICAgICAgICBUZW1wMSA9IFRlbXAyICsgVGVtcDM7CisgICAgICAgICAgICBUZW1wMyA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICBUZW1wMSA9IFRlbXAyICsgVGVtcDM7CiAKLSAgICAgICAgaWYgKFRlbXAxID4gMS4wZikKLSAgICAgICAgICAgIFRlbXAxID0gMS4wZjsKLSAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtMS4wZikKLSAgICAgICAgICAgIFRlbXAxID0gLTEuMGY7CisgICAgICAgICAgICBpZiAoVGVtcDEgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAxID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcDEgPSAtMS4wZjsKIAotICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgICAgICpkc3QrKyA9IFRlbXAxOwogICAgICAgICB9CiAgICAgfQogCi0gICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0KKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwogCi0gICAgICAgIGZvciAoamogPSA0OyBqaiE9MCA7IGpqLS0peworICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMDsgamotLSkgewogICAgICAgICAgICAgVGVtcDEgPSAqc3JjKys7CiAgICAgICAgICAgICBUZW1wMiA9ICpkc3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwCmluZGV4IDZmZjc4NTMuLjYxYTQ3NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmNwcApAQCAtMjUsMTIgKzI1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIExWTV9GTE9BVCBUZW1wMSxUZW1wMjsKK3ZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDEsIFRlbXAyOwogICAgIExWTV9JTlQxNiBPdXRMb29wOwogICAgIExWTV9JTlQxNiBJbkxvb3A7CiAgICAgTFZNX0ZMT0FUIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CkBAIC00MSwxOSArMzgsMTcgQEAKICAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KICAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOwogCi0gICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSA9ICgxLjBmIC0gcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldDsgLyogZmxvYXQgKiBmbG9hdCBpbiBmbG9hdCAqLwotICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpCi0gICAgeworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPQorICAgICAgICAgICAgKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBmbG9hdCAqIGZsb2F0IGluIGZsb2F0ICovCisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkgewogICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9IChMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCiAgICAgfQogCi0gICAgaWYgKE91dExvb3AgIT0gMCkKLSAgICB7CisgICAgaWYgKE91dExvb3AgIT0gMCkgewogICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IChwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhKTsKICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwogCi0gICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CiAgICAgICAgICAgICBzcmMrKzsKIApAQCAtNjMsMzcgKzU4LDM2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwogCi0gICAgICAgICAgICBUZW1wMSA9ICpzcmM7Ci0gICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICBzcmMrKzsKIAotICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOwotICAgICAgICAgICAgKmRzdCA9IFRlbXAyOwotICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICBkc3QrKzsKIAotICAgICAgICAgICAgVGVtcDEgPSAqc3JjOwotICAgICAgICAgICAgc3JjKys7CisgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgc3JjKys7CiAKLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOworICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgZHN0Kys7CiAKLSAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKLSAgICAgICAgICAgIHNyYysrOworICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgIHNyYysrOwogCi0gICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7Ci0gICAgICAgICAgICAqZHN0ID0gVGVtcDI7Ci0gICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgIGRzdCsrOwogCi0gICAgICAgICAgICBUZW1wMSA9ICpzcmM7Ci0gICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOworICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgIHNyYysrOworICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgZHN0Kys7CiAgICAgfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAKaW5kZXggYTdjZTRkMy4uMjg2MWJlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmNwcApAQCAtMTgsNTAgKzE4LDQ3IEBACiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCBMZWZ0REMsUmlnaHREQzsKLSAgICAgICAgTFZNX0ZMT0FUIERpZmY7Ci0gICAgICAgIExWTV9JTlQzMiBqOwotICAgICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7Cit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcykgeworICAgIExWTV9GTE9BVCBMZWZ0REMsIFJpZ2h0REM7CisgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgTFZNX0lOVDMyIGo7CisgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZSlwSW5zdGFuY2U7CiAKLSAgICAgICAgTGVmdERDID0gcEJpcXVhZFN0YXRlLT5MZWZ0REM7Ci0gICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7Ci0gICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KLSAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoTGVmdERDKTsKLSAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgewotICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9Ci0gICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KLSAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7Ci0gICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKLSAgICAgICAgICAgICAgICBMZWZ0REMgLT0gRENfRkxPQVRfU1RFUDsgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgTGVmdERDICs9IERDX0ZMT0FUX1NURVA7IH0KLQotICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KLSAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoUmlnaHREQyk7Ci0gICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQotICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7Ci0gICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9Ci0gICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOwotICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19GTE9BVF9TVEVQOyB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBSaWdodERDICs9IERDX0ZMT0FUX1NURVA7IH0KLQorICAgIExlZnREQyA9IHBCaXF1YWRTdGF0ZS0+TGVmdERDOworICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CisgICAgZm9yIChqID0gTnJTYW1wbGVzIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCisgICAgICAgIERpZmYgPSAqKHBEYXRhSW4rKykgLSAoTGVmdERDKTsKKyAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CisgICAgICAgICAgICBEaWZmID0gMS4wZjsKKyAgICAgICAgfSBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgIERpZmYgPSAtMS4wZjsKICAgICAgICAgfQotICAgICAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyA9IExlZnREQzsKLSAgICAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDID0gUmlnaHREQzsKKyAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKKyAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICBMZWZ0REMgLT0gRENfRkxPQVRfU1RFUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExlZnREQyArPSBEQ19GTE9BVF9TVEVQOworICAgICAgICB9CiAKKyAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgRGlmZiA9ICoocERhdGFJbisrKSAtIChSaWdodERDKTsKKyAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CisgICAgICAgICAgICBEaWZmID0gMS4wZjsKKyAgICAgICAgfSBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgIERpZmYgPSAtMS4wZjsKKyAgICAgICAgfQorICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgIFJpZ2h0REMgLT0gRENfRkxPQVRfU1RFUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJpZ2h0REMgKz0gRENfRkxPQVRfU1RFUDsKKyAgICAgICAgfQogICAgIH0KLSNpZmRlZiBTVVBQT1JUX01DCisgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgPSBMZWZ0REM7CisgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDID0gUmlnaHREQzsKK30KIC8qCiAgKiBGVU5DVElPTjogICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEKICAqCkBAIC03OSwzNyArNzYsMzAgQEAKICAqICB2b2lkCiAgKgogICovCi12b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICpDaERDOwotICAgICAgICBMVk1fRkxPQVQgRGlmZjsKLSAgICAgICAgTFZNX0lOVDMyIGo7Ci0gICAgICAgIExWTV9JTlQzMiBpOwotICAgICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKSBwSW5zdGFuY2U7Cit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscykgeworICAgIExWTV9GTE9BVCogQ2hEQzsKKyAgICBMVk1fRkxPQVQgRGlmZjsKKyAgICBMVk1fSU5UMzIgajsKKyAgICBMVk1fSU5UMzIgaTsKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKXBJbnN0YW5jZTsKIAotICAgICAgICBDaERDID0gJnBCaXF1YWRTdGF0ZS0+Q2hEQ1swXTsKLSAgICAgICAgZm9yIChqID0gTnJGcmFtZXMgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCi0gICAgICAgICAgICBmb3IgKGkgPSBOckNoYW5uZWxzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGlmZiA9ICoocERhdGFJbisrKSAtIChDaERDW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9Ci0gICAgICAgICAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKLSAgICAgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSAtPSBEQ19GTE9BVF9TVEVQOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENoRENbaV0gKz0gRENfRkxPQVRfU1RFUDsgfQorICAgIENoREMgPSAmcEJpcXVhZFN0YXRlLT5DaERDWzBdOworICAgIGZvciAoaiA9IE5yRnJhbWVzIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCisgICAgICAgIGZvciAoaSA9IE5yQ2hhbm5lbHMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgRGlmZiA9ICoocERhdGFJbisrKSAtIChDaERDW2ldKTsKKyAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOworICAgICAgICAgICAgfSBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7CisgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICBDaERDW2ldIC09IERDX0ZMT0FUX1NURVA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENoRENbaV0gKz0gRENfRkxPQVRfU1RFUDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgfQotI2VuZGlmCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCmluZGV4IGJlZWUxMTIuLjI4MjhjYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0xNywyMCArMTcsMTUgQEAKIAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLXZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQotewotICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGUgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMC4wZjsKLSAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwLjBmOwordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UpIHsKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKXBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyA9IDAuMGY7CisgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDID0gMC4wZjsKIH0KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKLXsKLSAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UpIHsKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKXBJbnN0YW5jZTsKICAgICBMVk1fSU5UMzIgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTFZNX01BWF9DSEFOTkVMUzsgaSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFZNX01BWF9DSEFOTkVMUzsgaSsrKSB7CiAgICAgICAgIHBCaXF1YWRTdGF0ZS0+Q2hEQ1tpXSA9IDAuMGY7CiAgICAgfQogfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNjUwOGI3My4uOGY0NTlkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMTgsMjEgKzE4LDE3IEBACiAjaWZuZGVmIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAjZGVmaW5lIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAKLSNkZWZpbmUgRENfRkxPQVRfU1RFUCAgIDAuMDAwMDAwMjM4NGY7CisjZGVmaW5lIERDX0ZMT0FUX1NURVAgMC4wMDAwMDAyMzg0ZgogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4qLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV8KLXsKLSAgICBMVk1fRkxPQVQgIExlZnREQzsgICAgIC8qIExlZnREQyAgKi8KLSAgICBMVk1fRkxPQVQgIFJpZ2h0REM7ICAgIC8qIFJpZ2h0REMgICovCi19RmlsdGVyX0ZMT0FUX1N0YXRlOwotdHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGUgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlIDsKLSNpZmRlZiBTVVBQT1JUX01DCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlX01jXwotewotICAgIExWTV9GTE9BVCAgQ2hEQ1tMVk1fTUFYX0NIQU5ORUxTXTsgICAgIC8qIENoYW5uZWxEQyAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfRkxPQVRfU3RhdGVfIHsKKyAgICBMVk1fRkxPQVQgTGVmdERDOyAgLyogTGVmdERDICAqLworICAgIExWTV9GTE9BVCBSaWdodERDOyAvKiBSaWdodERDICAqLworfSBGaWx0ZXJfRkxPQVRfU3RhdGU7Cit0eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZSogUEZpbHRlcl9GTE9BVF9TdGF0ZTsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfRkxPQVRfU3RhdGVfTWNfIHsKKyAgICBMVk1fRkxPQVQgQ2hEQ1tMVk1fTUFYX0NIQU5ORUxTXTsgLyogQ2hhbm5lbERDICAqLwogfSBGaWx0ZXJfRkxPQVRfU3RhdGVfTWM7Ci10eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyAqIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgOwotI2VuZGlmCit0eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyogUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYzsKICNlbmRpZiAvKiBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuY3BwCmluZGV4IDc3MWZhZTIuLjVkYWVmNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jcHAKQEAgLTI3LDU0ICsyNyw0NCBAQAogICAgRlVOQ1RJT04gRGVsYXlBbGxQYXNzXzMyeDMyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IERlbGF5T2Zmc2V0LCAgICAgICAgICAgICAgIC8qIFNpbXBsZSBkZWxheSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwQWxsUGFzc09mZnNldCwgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBkZWxheSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mICBzYW1wbGVzICovCit2b2lkIERlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyKExWTV9JTlQzMiogZGVsYXksICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBjb2VmZmljaWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IERlbGF5T2Zmc2V0LCAgICAgLyogU2ltcGxlIGRlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2KiBwQWxsUGFzc09mZnNldCwgLyogQWxsIHBhc3MgZmlsdGVyIGRlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIqIGRzdCwgICAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgIHNhbXBsZXMgKi8KIHsKLSAgICBMVk1fSU5UMTYgICBpOwotICAgIExWTV9VSU5UMTYgICBBbGxQYXNzT2Zmc2V0ID0gKnBBbGxQYXNzT2Zmc2V0OwotICAgIExWTV9JTlQzMiAgICB0ZW1wOwotICAgIExWTV9JTlQzMiAgICBhLGIsYzsKKyAgICBMVk1fSU5UMTYgaTsKKyAgICBMVk1fVUlOVDE2IEFsbFBhc3NPZmZzZXQgPSAqcEFsbFBhc3NPZmZzZXQ7CisgICAgTFZNX0lOVDMyIHRlbXA7CisgICAgTFZNX0lOVDMyIGEsIGIsIGM7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotICAgIHsKLQotICAgICAgICBNVUwzMngxNklOVE8zMihkZWxheVtBbGxQYXNzT2Zmc2V0XSwgY29lZmYsIHRlbXAsIDE1KQotICAgICAgICBhID0gdGVtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIE1VTDMyeDE2SU5UTzMyKGRlbGF5W0FsbFBhc3NPZmZzZXRdLCBjb2VmZiwgdGVtcCwgMTUpIGEgPSB0ZW1wOwogICAgICAgICBiID0gZGVsYXlbRGVsYXlPZmZzZXRdOwogICAgICAgICBEZWxheU9mZnNldCsrOwogCiAgICAgICAgIGMgPSBhICsgYjsKLSAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSAhPSAwKSAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KKyAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSAhPSAwKSAvKiBvdmVyZmxvdyAvIHVuZGVyZmxvdyAqLwogICAgICAgICB7Ci0gICAgICAgICAgICBpZihhIDwgMCkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhIDwgMCkgewogICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYyA9IDB4N0ZGRkZGRkZMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICpkc3QgPSBjOwogICAgICAgICBkc3QrKzsKIAotICAgICAgICBNVUwzMngxNklOVE8zMihjLCAtY29lZmYsIHRlbXAsIDE1KQotICAgICAgICBhID0gdGVtcDsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoYywgLWNvZWZmLCB0ZW1wLCAxNSkgYSA9IHRlbXA7CiAgICAgICAgIGIgPSBkZWxheVtBbGxQYXNzT2Zmc2V0XTsKICAgICAgICAgYyA9IGEgKyBiOwotICAgICAgICBpZiAoKCgoYyBeIGEpICYgKGMgXiBiKSkgPj4gMzEpIT0wKSAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KKyAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSAhPSAwKSAvKiBvdmVyZmxvdyAvIHVuZGVyZmxvdyAqLwogICAgICAgICB7Ci0gICAgICAgICAgICBpZihhIDwgMCkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhIDwgMCkgewogICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYyA9IDB4N0ZGRkZGRkZMOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MiwxMyArNzIsMTEgQEAKICAgICAgICAgQWxsUGFzc09mZnNldCsrOwogCiAgICAgICAgIC8qIE1ha2UgdGhlIGRlbGF5IGJ1ZmZlciBhIGNpcmN1bGFyIGJ1ZmZlciAqLwotICAgICAgICBpZiAoRGVsYXlPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgeworICAgICAgICBpZiAoRGVsYXlPZmZzZXQgPj0gc2l6ZSkgewogICAgICAgICAgICAgRGVsYXlPZmZzZXQgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKEFsbFBhc3NPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgeworICAgICAgICBpZiAoQWxsUGFzc09mZnNldCA+PSBzaXplKSB7CiAgICAgICAgICAgICBBbGxQYXNzT2Zmc2V0ID0gMDsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMCw0ICs4OCwzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jcHAKaW5kZXggNTJkMjYzZi4uZGE3NTk4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmNwcApAQCAtMjUsMTkgKzI1LDE4IEBACiAgICBGVU5DVElPTiBEZWxheU1peF8xNngxNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgRGVsYXlNaXhfMTZ4MTYoY29uc3QgTFZNX0lOVDE2ICpzcmMsICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRlbGF5LCAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LCAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KK3ZvaWQgRGVsYXlNaXhfMTZ4MTYoY29uc3QgTFZNX0lOVDE2KiBzcmMsIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiogZGVsYXksICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgIC8qIERlbGF5IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiBkc3QsICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqIHBPZmZzZXQsICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KIHsKLSAgICBMVk1fSU5UMTYgICBpOwotICAgIExWTV9JTlQxNiAgIE9mZnNldCAgPSAqcE9mZnNldDsKLSAgICBMVk1fSU5UMTYgICB0ZW1wOworICAgIExWTV9JTlQxNiBpOworICAgIExWTV9JTlQxNiBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBMVk1fSU5UMTYgdGVtcDsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgeworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgLyogTGVmdCBjaGFubmVsICovCiAgICAgICAgIHRlbXAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOwogICAgICAgICAqZHN0ID0gdGVtcDsKQEAgLTU3LDggKzU2LDcgQEAKICAgICAgICAgc3JjKys7CiAKICAgICAgICAgLyogTWFrZSB0aGUgcmV2ZXJiIGRlbGF5IGJ1ZmZlciBhIGNpcmN1bGFyIGJ1ZmZlciAqLwotICAgICAgICBpZiAoT2Zmc2V0ID49IHNpemUpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKSB7CiAgICAgICAgICAgICBPZmZzZXQgPSAwOwogICAgICAgICB9CiAgICAgfQpAQCAtNjgsMjIgKzY2LDIxIEBACiAKICAgICByZXR1cm47CiB9Ci12b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRlbGF5LCAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiBwT2Zmc2V0LCAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCiB7Ci0gICAgTFZNX0lOVDE2ICAgaTsKLSAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7Ci0gICAgTFZNX0ZMT0FUICAgdGVtcDsKKyAgICBMVk1fSU5UMTYgaTsKKyAgICBMVk1fSU5UMTYgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgTFZNX0ZMT0FUIHRlbXA7CiAKLSAgICBmb3IgKGk9MDsgaTxuOyBpKyspCi0gICAgeworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgLyogTGVmdCBjaGFubmVsICovCi0gICAgICAgIHRlbXAgICAgICAgICAgICA9IChMVk1fRkxPQVQpKChMVk1fRkxPQVQpKCpkc3QgKyAoTFZNX0ZMT0FUKWRlbGF5W09mZnNldF0pIC8gMi4wZik7Ci0gICAgICAgICpkc3QgICAgICAgICAgICA9IHRlbXA7CisgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOworICAgICAgICAqZHN0ID0gdGVtcDsKICAgICAgICAgZHN0Kys7CiAKICAgICAgICAgZGVsYXlbT2Zmc2V0XSA9ICpzcmM7CkBAIC05MSw4ICs4OCw4IEBACiAgICAgICAgIHNyYysrOwogCiAgICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVCkoKmRzdCAtIChMVk1fRkxPQVQpZGVsYXlbT2Zmc2V0XSkgLyAyLjBmKTsKLSAgICAgICAgKmRzdCAgICAgICAgICAgID0gdGVtcDsKKyAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKChMVk1fRkxPQVQpKCpkc3QgLSAoTFZNX0ZMT0FUKWRlbGF5W09mZnNldF0pIC8gMi4wZik7CisgICAgICAgICpkc3QgPSB0ZW1wOwogICAgICAgICBkc3QrKzsKIAogICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKQEAgLTEwMCw4ICs5Nyw3IEBACiAgICAgICAgIHNyYysrOwogCiAgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KLSAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQotICAgICAgICB7CisgICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkgewogICAgICAgICAgICAgT2Zmc2V0ID0gMDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5V3JpdGVfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKaW5kZXggODA5Y2RkYy4uNDdjZmZiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKQEAgLTI1LDI0ICsyNSwyMiBAQAogICAgRlVOQ1RJT04gRGVsYXlNaXhfMTZ4MTYKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIERlbGF5V3JpdGVfMzIoY29uc3QgTFZNX0lOVDMyICAqc3JjLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcE9mZnNldCwgICAgICAgICAgIC8qIERlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbikgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLwordm9pZCBEZWxheVdyaXRlXzMyKGNvbnN0IExWTV9JTlQzMiogc3JjLCAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLworICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiogZGVsYXksICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYqIHBPZmZzZXQsICAvKiBEZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KIHsKLSAgICBMVk1fSU5UMTYgICBpOwotICAgIExWTV9JTlQxNiAgIE9mZnNldCAgPSAoTFZNX0lOVDE2KSpwT2Zmc2V0OworICAgIExWTV9JTlQxNiBpOworICAgIExWTV9JTlQxNiBPZmZzZXQgPSAoTFZNX0lOVDE2KSpwT2Zmc2V0OwogCi0gICAgZm9yIChpPTA7IGk8bjsgaSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOwogICAgICAgICBPZmZzZXQrKzsKICAgICAgICAgc3JjKys7CiAKICAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgeworICAgICAgICBpZiAoT2Zmc2V0ID49IHNpemUpIHsKICAgICAgICAgICAgIE9mZnNldCA9IDA7CiAgICAgICAgIH0KICAgICB9CkBAIC01NCw0ICs1MiwzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKaW5kZXggYmVmMGQ2Mi4uZGY4ZmFkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcApAQCAtMzEsNDEgKzMxLDM0IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKK3ZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJTYW1wbGVzKSB7CisgICAgTFZNX0ZMT0FUIHluTDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CiAKLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7CisgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCisgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5bkw9QTEgICogeChuLTEpTAotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOwogCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKyAgICAgICAgLy8geW5MKz0gICgtQjEgICogeShuLTEpTAorICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwogCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7ICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAvLyBVcGRhdGUgeChuLTEpTAogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLQotICAgICAgICB9Ci0KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAgLy8gV3JpdGUgTGVmdCBvdXRwdXQKICAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCmluZGV4IDE2MTIyNWUuLjEwNjA0YmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0zNywxMyArMzcsMTIgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKK3ZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KiBwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190KiBwQ29lZikgewogICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopcFRhcHM7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzID0gKExWTV9GTE9BVCopcFRhcHM7CiAgICAgdGVtcCA9IHBDb2VmLT5BMTsKICAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKICAgICB0ZW1wID0gcENvZWYtPkEwOwpAQCAtNTMsNCArNTIsMyBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggMzRmM2RmOS4uZDE4MTlmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjAsMjAgKzIwLDE4IEBACiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCi17Ci0gIExWTV9JTlQzMiogICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMTYgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfIHsKKyAgICBMVk1fSU5UMzIqIHBEZWxheXM7IC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0lOVDE2IGNvZWZzWzNdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IEZpbHRlcl9TdGF0ZTsKIAotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlKiBQRmlsdGVyX1N0YXRlOwogCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCi17Ci0gICAgTFZNX0ZMT0FUICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQgeworICAgIExWTV9GTE9BVCogcERlbGF5czsgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgY29lZnNbM107IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gRmlsdGVyX1N0YXRlX0ZMT0FUOwogCi10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQqIFBGaWx0ZXJfU3RhdGVfRkxPQVQ7CiAjZW5kaWYgLyogX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmNwcAppbmRleCBlM2VmYWQ3Li40Yzc1ZTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuY3BwCkBAIC0zMCw0MiArMzAsMzYgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgIGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Cit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcykgeworICAgIExWTV9GTE9BVCB5bkwsIHRlbXBsOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKIAotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCisgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUExICAqIHgobi0xKUwKLSAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKyAgICAgICAgeW5MICs9IHRlbXBsOwogCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOworICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCisgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgeW5MICs9IHRlbXBsOwogCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgIC8vIFVwZGF0ZSB4KG4tMSlMCiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotICAgICAgICB9Ci0KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKICAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCmluZGV4IGJiNTI5NWMuLmJmMmU1ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0zNiwxMyArMzYsMTIgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KiBwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190KiBwQ29lZikgewogICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopICAgIHBUYXBzOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyA9IChMVk1fRkxPQVQqKXBUYXBzOwogCiAgICAgdGVtcCA9IHBDb2VmLT5BMTsKICAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKQEAgLTUzLDQgKzUyLDMgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDY3ZDEzODQuLjg2NDU1OTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTIwLDE5ICsyMCwxNyBAQAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXyB7CisgICAgTFZNX0lOVDMyKiBwRGVsYXlzOyAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9JTlQzMiBjb2Vmc1szXTsgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfSBGaWx0ZXJfU3RhdGU7CiAKLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZSogUEZpbHRlcl9TdGF0ZTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVF8KLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVRfIHsKKyAgICBMVk1fRkxPQVQqIHBEZWxheXM7IC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUIGNvZWZzWzNdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IEZpbHRlcl9TdGF0ZV9GTE9BVDsKIAotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUKiBQRmlsdGVyX1N0YXRlX0ZMT0FUOwogI2VuZGlmIC8qIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuY3BwCmluZGV4IDZjYTgxOWEuLmRhZDA3MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuY3BwCkBAIC0zMiw4OCArMzIsNzMgQEAKIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMSlSIGluIFExNSBmb3JtYXQKIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMSlSIGluIFEzMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgICB5bkwseW5SOwotICAgICAgICBMVk1fRkxPQVQgICBUZW1wOwotICAgICAgICBMVk1fRkxPQVQgICBOZWdTYXRWYWx1ZTsKLSAgICAgICAgTFZNX0lOVDE2ICAgaWk7Cit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOclNhbXBsZXMpIHsKKyAgICBMVk1fRkxPQVQgeW5MLCB5blI7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisgICAgTFZNX0ZMT0FUIE5lZ1NhdFZhbHVlOworICAgIExWTV9JTlQxNiBpaTsKIAotICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSlwSW5zdGFuY2U7CiAKLSAgICAgICAgTmVnU2F0VmFsdWUgPSAtMS4wZjsKKyAgICBOZWdTYXRWYWx1ZSA9IC0xLjBmOwogCi0gICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKKyAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8vIHluTCA9QTEgICogeChuLTEpTAorICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgIC8vIHluUiA9QTEgICogeChuLTEpUgorICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CiAKLSAgICAgICAgICAgIC8vIHluTCA9QTEgICogeChuLTEpTAotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotICAgICAgICAgICAgLy8geW5SID1BMSAgKiB4KG4tMSlSCi0gICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisgICAgICAgIC8vIHluUis9QTAgICogeChuKUwKKyAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqKHBEYXRhSW4gKyAxKSk7CiAKLSAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOwotICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pTAotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqKHBEYXRhSW4rMSkpOworICAgICAgICAvLyB5bkwgKz0gICgtQjEgICogeShuLTEpTCAgKQorICAgICAgICBUZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgeW5MICs9IFRlbXA7CisgICAgICAgIC8vIHluUiArPSAgKC1CMSAgKiB5KG4tMSlSICkgKQorICAgICAgICBUZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgeW5SICs9IFRlbXA7CiAKLSAgICAgICAgICAgIC8vIHluTCArPSAgKC1CMSAgKiB5KG4tMSlMICApCi0gICAgICAgICAgICBUZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKLSAgICAgICAgICAgIHluTCArPSBUZW1wOwotICAgICAgICAgICAgLy8geW5SICs9ICAoLUIxICAqIHkobi0xKVIgKSApCi0gICAgICAgICAgICBUZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKLSAgICAgICAgICAgIHluUiArPSBUZW1wOworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7ICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAvLyBVcGRhdGUgeChuLTEpTAogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHluUjsgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9ICgqcERhdGFJbisrKTsgIC8vIFVwZGF0ZSB4KG4tMSlSCiAKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHluUjsgLy8gVXBkYXRlIHkobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKVIKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KLSAgICAgICAgICAgIGlmKHluTCA+IDEuMGYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeW5MID0gMS4wZjsKKyAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgaWYgKHluTCA+IDEuMGYpIHsKKyAgICAgICAgICAgIHluTCA9IDEuMGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoeW5MIDwgTmVnU2F0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICB5bkwgPSBOZWdTYXRWYWx1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoeW5SID4gMS4wZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB5blIgPSAxLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsKICAgICAgICAgfQogCisgICAgICAgIGlmICh5blIgPiAxLjBmKSB7CisgICAgICAgICAgICB5blIgPSAxLjBmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHluUiA8IE5lZ1NhdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOworICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOwogICAgIH0KLSNpZmRlZiBTVVBQT1JUX01DCit9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEFTU1VNUFRJT05TOgogQ09FRlMtCkBAIC0xMzUsNjQgKzEyMCw1NiBAQAogUkVUVVJOUzoKICB2b2lkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZPX01jX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgIHluOwotICAgICAgICBMVk1fRkxPQVQgICBUZW1wOwotICAgICAgICBMVk1fSU5UMTYgICBpaTsKLSAgICAgICAgTFZNX0lOVDE2ICAgY2g7Ci0gICAgICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpIHBJbnN0YW5jZTsKK3ZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIHluOworICAgIExWTV9GTE9BVCBUZW1wOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMTYgY2g7CisgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSlwSW5zdGFuY2U7CiAKLSAgICAgICAgTFZNX0ZMT0FUICAgKnBEZWxheXMgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXM7Ci0gICAgICAgIExWTV9GTE9BVCAgICpwQ29lZnMgID0gJnBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07Ci0gICAgICAgIExWTV9GTE9BVCAgIEEwID0gcENvZWZzWzFdOwotICAgICAgICBMVk1fRkxPQVQgICBBMSA9IHBDb2Vmc1swXTsKLSAgICAgICAgTFZNX0ZMT0FUICAgQjEgPSBwQ29lZnNbMl07CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlzID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzOworICAgIExWTV9GTE9BVCogcENvZWZzID0gJnBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisgICAgTFZNX0ZMT0FUIEEwID0gcENvZWZzWzFdOworICAgIExWTV9GTE9BVCBBMSA9IHBDb2Vmc1swXTsKKyAgICBMVk1fRkxPQVQgQjEgPSBwQ29lZnNbMl07CiAKLSAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgQ0hBTk5FTFMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAvLyB5biA9QTEgICogeChuLTEpCisgICAgICAgICAgICB5biA9IChMVk1fRkxPQVQpQTEgKiBwRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bis9QTAgICogeChuKQorICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluICs9ICAoLUIxICAqIHkobi0xKSkKKyAgICAgICAgICAgIFRlbXAgPSBCMSAqIHBEZWxheXNbMV07CisgICAgICAgICAgICB5biArPSBUZW1wOwogCiAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBDSEFOTkVMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8geW4gPUExICAqIHgobi0xKQotICAgICAgICAgICAgICAgIHluID0gKExWTV9GTE9BVClBMSAqIHBEZWxheXNbMF07CisgICAgICAgICAgICBwRGVsYXlzWzFdID0geW47ICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKQorICAgICAgICAgICAgcERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgIC8vIFVwZGF0ZSB4KG4tMSkKIAotICAgICAgICAgICAgICAgIC8vIHluKz1BMCAgKiB4KG4pCi0gICAgICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgICAgICAgICAgICAgIC8vIHluICs9ICAoLUIxICAqIHkobi0xKSkKLSAgICAgICAgICAgICAgICBUZW1wID0gQjEgKiBwRGVsYXlzWzFdOwotICAgICAgICAgICAgICAgIHluICs9IFRlbXA7Ci0KLSAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICBwRGVsYXlzWzFdID0geW47IC8vIFVwZGF0ZSB5KG4tMSkKLSAgICAgICAgICAgICAgICBwRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpCi0KLSAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KLSAgICAgICAgICAgICAgICBpZiAoeW4gPiAxLjBmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeW4gPSAxLjBmOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeW4gPCAtMS4wZikgewotICAgICAgICAgICAgICAgICAgICB5biA9IC0xLjBmOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bjsKLSAgICAgICAgICAgICAgICBwRGVsYXlzICs9IDI7CisgICAgICAgICAgICAvKlNhdHVyYXRlIHJlc3VsdHMqLworICAgICAgICAgICAgaWYgKHluID4gMS4wZikgeworICAgICAgICAgICAgICAgIHluID0gMS4wZjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeW4gPCAtMS4wZikgeworICAgICAgICAgICAgICAgIHluID0gLTEuMGY7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVsYXlzIC09IE5yQ2hhbm5lbHMgKiAyOworCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW47CisgICAgICAgICAgICBwRGVsYXlzICs9IDI7CiAgICAgICAgIH0KKyAgICAgICAgcERlbGF5cyAtPSBOckNoYW5uZWxzICogMjsKICAgICB9Ci0jZW5kaWYKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuY3BwCmluZGV4IGI4MWI5NzYuLjU1MmFlZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmNwcApAQCAtMzcsMTMgKzM3LDEyIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgICAgKnBDb2VmKQotewordm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190KiBwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCogcENvZWYpIHsKICAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzICAgICAgICAgICAgOworICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyA9IChMVk1fRkxPQVQqKXBUYXBzOwogCiAgICAgdGVtcCA9IHBDb2VmLT5BMTsKICAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKQEAgLTU0LDQgKzUzLDMgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDUwMjI1MDAuLjAxMDMzMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yMCwxMSArMjAsMTAgQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgICBMVk1fRkxPQVQgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICAgIExWTV9GTE9BVCAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfRmxvYXRfU3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXyB7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlzOyAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCBjb2Vmc1szXTsgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfSBGaWx0ZXJfRmxvYXRfU3RhdGU7CiAKLXR5cGVkZWYgRmlsdGVyX0Zsb2F0X1N0YXRlICogUEZpbHRlcl9GbG9hdF9TdGF0ZSA7Cit0eXBlZGVmIEZpbHRlcl9GbG9hdF9TdGF0ZSogUEZpbHRlcl9GbG9hdF9TdGF0ZTsKICNlbmRpZiAvKiBfRk9fMklfRDE2RjMyQ1NTX0xTSFhfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKaW5kZXggYjVkYjhmNC4uOGViM2U3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaApAQCAtMzAsMjYgKzMwLDIzIEBACiAgKiBCaXF1YWQgd2l0aCBjb2VmZmljaWVudHMgQTAsIEExLCBBMiwgQjEgYW5kIEIyIGNvZWZmaWNpZW50cwogICovCiAvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICBBMDsKLSAgICBMVk1fRkxPQVQgICBBMTsKLSAgICBMVk1fRkxPQVQgICBBMjsKLSAgICBMVk1fRkxPQVQgICBCMTsKLSAgICBMVk1fRkxPQVQgICBCMjsKLSAgICBMVk1fVUlOVDE2ICBTY2FsZTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgQTA7CisgICAgTFZNX0ZMT0FUIEExOworICAgIExWTV9GTE9BVCBBMjsKKyAgICBMVk1fRkxPQVQgQjE7CisgICAgTFZNX0ZMT0FUIEIyOworICAgIExWTV9VSU5UMTYgU2NhbGU7CiB9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CiAvKgogICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSBhbmQgQjEgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgIEEwOwotICAgIExWTV9GTE9BVCAgIEExOwotICAgIExWTV9GTE9BVCAgIEIxOwotICAgIExWTV9VSU5UMTYgIFNjYWxlOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBMDsKKyAgICBMVk1fRkxPQVQgQTE7CisgICAgTFZNX0ZMT0FUIEIxOworICAgIExWTV9VSU5UMTYgU2NhbGU7CiB9IEJpcXVhZEEwMUIxQ29lZnNTUF90OwogCi0jZW5kaWYgICAgICAvKiBGSUxURVJTX0ggKi8KLQorI2VuZGlmIC8qIEZJTFRFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcAppbmRleCBjM2Y2NjQ4Li5iMDUwMjY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcApAQCAtMjUsMTUgKzI1LDEwIEBACiAgICBGVU5DVElPTiAgRnJvbTJpVG9NU18xNngxNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgRnJvbTJpVG9NU18xNngxNiggY29uc3QgTFZNX0lOVDE2ICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9JTlQzMiB0ZW1wMSxsZWZ0LHJpZ2h0Owordm9pZCBGcm9tMmlUb01TXzE2eDE2KGNvbnN0IExWTV9JTlQxNiogc3JjLCBMVk1fSU5UMTYqIGRzdE0sIExWTV9JTlQxNiogZHN0UywgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fSU5UMzIgdGVtcDEsIGxlZnQsIHJpZ2h0OwogICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgbGVmdCA9IChMVk1fSU5UMzIpKnNyYzsKICAgICAgICAgc3JjKys7CiAKQEAgLTQxLDI3ICszNiwyMiBAQAogICAgICAgICBzcmMrKzsKIAogICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQrcmlnaHQpPj4xOworICAgICAgICB0ZW1wMSA9IChsZWZ0ICsgcmlnaHQpID4+IDE7CiAgICAgICAgICpkc3RNID0gKExWTV9JTlQxNil0ZW1wMTsKICAgICAgICAgZHN0TSsrOwogCiAgICAgICAgIC8qIENvbXB1dGUgUyBzaWduYWwqLwotICAgICAgICB0ZW1wMSA9ICAobGVmdC1yaWdodCk+PjE7CisgICAgICAgIHRlbXAxID0gKGxlZnQgLSByaWdodCkgPj4gMTsKICAgICAgICAgKmRzdFMgPSAoTFZNX0lOVDE2KXRlbXAxOwogICAgICAgICBkc3RTKys7CiAgICAgfQogCiAgICAgcmV0dXJuOwogfQotdm9pZCBGcm9tMmlUb01TX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdE0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXAxLGxlZnQscmlnaHQ7Cit2b2lkIEZyb20yaVRvTVNfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0TSwgTFZNX0ZMT0FUKiBkc3RTLCBMVk1fSU5UMTYgbikgeworICAgIExWTV9GTE9BVCB0ZW1wMSwgbGVmdCwgcmlnaHQ7CiAgICAgTFZNX0lOVDE2IGlpOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICBsZWZ0ID0gKExWTV9GTE9BVCkqc3JjOwogICAgICAgICBzcmMrKzsKIApAQCAtNjksMTIgKzU5LDEyIEBACiAgICAgICAgIHNyYysrOwogCiAgICAgICAgIC8qIENvbXB1dGUgTSBzaWduYWwqLwotICAgICAgICB0ZW1wMSA9ICAobGVmdCArIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgIHRlbXAxID0gKGxlZnQgKyByaWdodCkgLyAyLjBmOwogICAgICAgICAqZHN0TSA9IChMVk1fRkxPQVQpdGVtcDE7CiAgICAgICAgIGRzdE0rKzsKIAogICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQgLSByaWdodCkgLyAyLjBmOworICAgICAgICB0ZW1wMSA9IChsZWZ0IC0gcmlnaHQpIC8gMi4wZjsKICAgICAgICAgKmRzdFMgPSAoTFZNX0ZMT0FUKXRlbXAxOwogICAgICAgICBkc3RTKys7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jcHAKaW5kZXggYjc1OGVlNy4uOWE1NGVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuY3BwCkBAIC0yNSwyMSArMjUsMTcgQEAKICAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18xNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgRnJvbTJpVG9Nb25vXzE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgRnJvbTJpVG9Nb25vXzE2KGNvbnN0IExWTV9JTlQxNiogc3JjLCBMVk1fSU5UMTYqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7CiAgICAgTFZNX0lOVDMyIFRlbXA7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIFRlbXAgPSAoTFZNX0lOVDMyKSpzcmM7CiAgICAgICAgIHNyYysrOwogCiAgICAgICAgIFRlbXAgKz0gKExWTV9JTlQzMikqc3JjOwogICAgICAgICBzcmMrKzsKIAotICAgICAgICAqZHN0ICA9IChMVk1fSU5UMTYpKFRlbXAgPj4xKTsKKyAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpKFRlbXAgPj4gMSk7CiAgICAgICAgIGRzdCsrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jcHAKaW5kZXggYTg2ODhiNC4uNmVkZTk1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuY3BwCkBAIC0yNSwxOSArMjUsMTUgQEAKICAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18zMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgRnJvbTJpVG9Nb25vXzMyKGNvbnN0IExWTV9JTlQzMiogc3JjLCBMVk1fSU5UMzIqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7CiAgICAgTFZNX0lOVDMyIFRlbXA7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKnNyYz4+MSk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgVGVtcCA9ICgqc3JjID4+IDEpOwogICAgICAgICBzcmMrKzsKIAotICAgICAgICBUZW1wICs9KCpzcmM+PjEpOworICAgICAgICBUZW1wICs9ICgqc3JjID4+IDEpOwogICAgICAgICBzcmMrKzsKIAogICAgICAgICAqZHN0ID0gVGVtcDsKQEAgLTQ2LDE1ICs0MiwxMSBAQAogCiAgICAgcmV0dXJuOwogfQotdm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewordm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9JTlQxNiBpaTsKICAgICBMVk1fRkxPQVQgVGVtcDsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICBUZW1wID0gKCpzcmMpOwogICAgICAgICBzcmMrKzsKIApAQCAtNjcsNyArNTksNiBAQAogCiAgICAgcmV0dXJuOwogfQotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBGVU5DVElPTjogICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0CiAgKgpAQCAtODUsMTkgKzc2LDE0IEBACiAgKiAgdm9pZAogICoKICAqLwotdm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKQotewordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscykgewogICAgIExWTV9JTlQxNiBpaSwgamo7CiAgICAgTFZNX0ZMT0FUIFRlbXA7CiAKLSAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICBUZW1wID0gMC4wZjsKLSAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkKLSAgICAgICAgeworICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMDsgamotLSkgewogICAgICAgICAgICAgVGVtcCArPSAoKnNyYyk7CiAgICAgICAgICAgICBzcmMrKzsKICAgICAgICAgfQpAQCAtMTA3LDYgKzkzLDUgQEAKIAogICAgIHJldHVybjsKIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuY3BwCmluZGV4IGEwMzliZjUuLjJjZmUwNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcApAQCAtMjYsOSArMjYsNyBAQAogICogIFJlbWFya3MgICAgIDoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICAgIEluc3RBbGxvY19Jbml0KCBJTlNUX0FMTE9DICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqU3RhcnRBZGRyICkKLXsKK3ZvaWQgSW5zdEFsbG9jX0luaXQoSU5TVF9BTExPQyogcG1zLCB2b2lkKiBTdGFydEFkZHIpIHsKICAgICBwbXMtPlRvdGFsU2l6ZSA9IDM7CiAgICAgcG1zLT5wTmV4dE1lbWJlciA9ICgoKHVpbnRwdHJfdClTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwogfQpAQCAtNDQsMTAgKzQyLDggQEAKICAqICBSZW1hcmtzICAgICA6CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyKCBJTlNUX0FMTE9DICAgICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgU2l6ZSApCi17Ci0gICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLwordm9pZCogSW5zdEFsbG9jX0FkZE1lbWJlcihJTlNUX0FMTE9DKiBwbXMsIExWTV9VSU5UMzIgU2l6ZSkgeworICAgIHZvaWQqIE5ld01lbWJlckFkZHJlc3M7IC8qIFZhcmlhYmxlIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgKi8KICAgICBOZXdNZW1iZXJBZGRyZXNzID0gKHZvaWQqKXBtcy0+cE5leHRNZW1iZXI7CiAKICAgICBTaXplID0gKChTaXplICsgMykgJiAoTFZNX1VJTlQzMil+Myk7IC8qIENlaWwgdGhlIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBmb3VyICovCkBAIC01NSw3ICs1MSw3IEBACiAgICAgcG1zLT5Ub3RhbFNpemUgKz0gU2l6ZTsKICAgICBwbXMtPnBOZXh0TWVtYmVyICs9IFNpemU7CiAKLSAgICByZXR1cm4oTmV3TWVtYmVyQWRkcmVzcyk7CisgICAgcmV0dXJuIChOZXdNZW1iZXJBZGRyZXNzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY2LDIxICs2MiwxNSBAQAogICogIFJlbWFya3MgICAgIDoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fVUlOVDMyIEluc3RBbGxvY19HZXRUb3RhbCggSU5TVF9BTExPQyAqcG1zKQotewotICAgIGlmIChwbXMtPlRvdGFsU2l6ZSA+IDMpCi0gICAgewotICAgICAgICByZXR1cm4ocG1zLT5Ub3RhbFNpemUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gMDsgICAgICAgICAgIC8qIE5vIG1lbW9yeSBhZGRlZCAqLworTFZNX1VJTlQzMiBJbnN0QWxsb2NfR2V0VG90YWwoSU5TVF9BTExPQyogcG1zKSB7CisgICAgaWYgKHBtcy0+VG90YWxTaXplID4gMykgeworICAgICAgICByZXR1cm4gKHBtcy0+VG90YWxTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsgLyogTm8gbWVtb3J5IGFkZGVkICovCiAgICAgfQogfQogCi12b2lkICAgIEluc3RBbGxvY19Jbml0QWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKLXsKK3ZvaWQgSW5zdEFsbG9jX0luaXRBbGwoSU5TVF9BTExPQyogcG1zLCBMVk1fTWVtb3J5VGFibGVfc3QqIHBNZW1vcnlUYWJsZSkgewogICAgIHVpbnRwdHJfdCBTdGFydEFkZHI7CiAKICAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOwpAQCAtMTAyLDcgKzkyLDYgQEAKIAogICAgIHBtc1szXS5Ub3RhbFNpemUgPSAzOwogICAgIHBtc1szXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKLQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTE0LDggKzEwMyw3IEBACiAgKiAgUmVtYXJrcyAgICAgOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGxfTlVMTCggSU5TVF9BTExPQyAgKnBtcykKLXsKK3ZvaWQgSW5zdEFsbG9jX0luaXRBbGxfTlVMTChJTlNUX0FMTE9DKiBwbXMpIHsKICAgICBwbXNbMF0uVG90YWxTaXplID0gMzsKICAgICBwbXNbMF0ucE5leHRNZW1iZXIgPSAwOwogCkBAIC0xMjcsNDcgKzExNSw0NiBAQAogCiAgICAgcG1zWzNdLlRvdGFsU2l6ZSA9IDM7CiAgICAgcG1zWzNdLnBOZXh0TWVtYmVyID0gMDsKLQogfQogCi12b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgICBTaXplW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICpwTWVtb3J5VGFibGUpCi17Ci0gICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLwordm9pZCogSW5zdEFsbG9jX0FkZE1lbWJlckFsbChJTlNUX0FMTE9DKiBwbXMsIExWTV9VSU5UMzIgU2l6ZVtdLCBMVk1fTWVtb3J5VGFibGVfc3QqIHBNZW1vcnlUYWJsZSkgeworICAgIHZvaWQqIE5ld01lbWJlckFkZHJlc3M7IC8qIFZhcmlhYmxlIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgKi8KIAogICAgIC8qIGNvdmVyaXR5W3JldHVybmVkX3BvaW50ZXJdIElnbm9yZSBjb3Zlcml0eSB3YXJuaW5nIHRoYXQgcHRyIGlzIG5vdCB1c2VkICovCi0gICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOworICAgIE5ld01lbWJlckFkZHJlc3MgPQorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0sIFNpemVbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSk7CiAKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSA9CisgICAgICAgICAgICBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlR5cGUgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7CiAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKIAotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBOZXdNZW1iZXJBZGRyZXNzID0KKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOwogCi0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfREFUQTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPQorICAgICAgICAgICAgSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSk7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBOwogICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CiAKLSAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sIFNpemVbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7CisgICAgTmV3TWVtYmVyQWRkcmVzcyA9CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKIAotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUY7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplID0KKyAgICAgICAgICAgIEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwogCiAgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdLCBTaXplW0xWTV9URU1QT1JBUllfRkFTVF0pOwogCi0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9URU1QT1JBUllfRkFTVF0pOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgICAgICAgICAgPSBMVk1fVEVNUE9SQVJZX0ZBU1Q7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgICAgICAgICA9IExWTV9OVUxMOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9URU1QT1JBUllfRkFTVF0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSA9IExWTV9URU1QT1JBUllfRkFTVDsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwogCi0gICAgcmV0dXJuKE5ld01lbWJlckFkZHJlc3MpOworICAgIHJldHVybiAoTmV3TWVtYmVyQWRkcmVzcyk7CiB9CiAKLXZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbFJldCggICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgIFNpemVbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKnB0cikKLXsKK3ZvaWQqIEluc3RBbGxvY19BZGRNZW1iZXJBbGxSZXQoSU5TVF9BTExPQyogcG1zLCBMVk1fVUlOVDMyIFNpemVbXSwgdm9pZCoqIHB0cikgewogICAgIHB0clswXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOwogICAgIHB0clsxXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOwogICAgIHB0clsyXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jcHAKaW5kZXggOWYwOWU0ZC4uOWRkY2JlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIuY3BwCkBAIC0yNSwxOSArMjUsMTQgQEAKICAgIEZVTkNUSU9OIElOVDE2TFNISUZUVE9JTlQzMl8xNlgzMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKGNvbnN0IExWTV9JTlQxNiAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgIHNoaWZ0ICkKLXsKK3ZvaWQgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKGNvbnN0IExWTV9JTlQxNiogc3JjLCBMVk1fSU5UMzIqIGRzdCwgTFZNX0lOVDE2IG4sIExWTV9JTlQxNiBzaGlmdCkgewogICAgIExWTV9JTlQxNiBpaTsKIAotICAgIHNyYyArPSBuLTE7Ci0gICAgZHN0ICs9IG4tMTsKKyAgICBzcmMgKz0gbiAtIDE7CisgICAgZHN0ICs9IG4gLSAxOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICAqZHN0ID0gKCAoKExWTV9JTlQzMikqc3JjKSA8PCBzaGlmdCk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgKmRzdCA9ICgoKExWTV9JTlQzMikqc3JjKSA8PCBzaGlmdCk7CiAgICAgICAgIHNyYy0tOwogICAgICAgICBkc3QtLTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCmluZGV4IDhjOTk4MGQuLjI1ODQxMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCkBAIC0yNSwyOSArMjUsMjAgQEAKICAgIEZVTkNUSU9OIElOVDMyUlNISUZUVE9JTlQxNl9TQVRfMzJYMTYKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYoY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaGlmdCApCi17Cit2b2lkIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYoY29uc3QgTFZNX0lOVDMyKiBzcmMsIExWTV9JTlQxNiogZHN0LCBMVk1fSU5UMTYgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2hpZnQpIHsKICAgICBMVk1fSU5UMzIgdGVtcDsKICAgICBMVk1fSU5UMTYgaWk7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgdGVtcCA9ICpzcmMgPj4gc2hpZnQ7CiAgICAgICAgIHNyYysrOwogCi0gICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikKLSAgICAgICAgeworICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpIHsKICAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKSB7CisgICAgICAgICAgICAqZHN0ID0gLTB4ODAwMDsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuY3BwCmluZGV4IDA1ZGY2NTYuLjA3MjFiNzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jcHAKQEAgLTI1LDE5ICsyNSwxNCBAQAogICAgRlVOQ1RJT04gSm9pblRvMmlfMzJ4MzIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIEpvaW5UbzJpXzMyeDMyKCBjb25zdCBMVk1fSU5UMzIgICAgKnNyY0wsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgKnNyY1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKLXsKK3ZvaWQgSm9pblRvMmlfMzJ4MzIoY29uc3QgTFZNX0lOVDMyKiBzcmNMLCBjb25zdCBMVk1fSU5UMzIqIHNyY1IsIExWTV9JTlQzMiogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9JTlQxNiBpaTsKIAotICAgIHNyY0wgKz0gbi0xOwotICAgIHNyY1IgKz0gbi0xOwotICAgIGRzdCAgKz0gKCgyKm4pLTEpOworICAgIHNyY0wgKz0gbiAtIDE7CisgICAgc3JjUiArPSBuIC0gMTsKKyAgICBkc3QgKz0gKCgyICogbikgLSAxKTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAqZHN0ID0gKnNyY1I7CiAgICAgICAgIGRzdC0tOwogICAgICAgICBzcmNSLS07CkBAIC00OSwxOSArNDQsMTQgQEAKIAogICAgIHJldHVybjsKIH0KLXZvaWQgSm9pblRvMmlfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjTCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgIG4gKQotewordm9pZCBKb2luVG8yaV9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyY0wsIGNvbnN0IExWTV9GTE9BVCogc3JjUiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogCiAgICAgc3JjTCArPSBuIC0gMTsKICAgICBzcmNSICs9IG4gLSAxOwotICAgIGRzdCAgKz0gKCgyICogbikgLSAxKTsKKyAgICBkc3QgKz0gKCgyICogbikgLSAxKTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAqZHN0ID0gKnNyY1I7CiAgICAgICAgIGRzdC0tOwogICAgICAgICBzcmNSLS07CkBAIC03NCw0ICs2NCwzIEBACiAgICAgcmV0dXJuOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKaW5kZXggMTRkNjFiZC4uOGIwMDkyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKQEAgLTI2LDE5ICsyNiwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCi17Ci0gICAgTFZNX0ZMT0FUICBUZW1wOwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlMiwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgTFZNX0ZMT0FUIFRlbXA7CiAgICAgTFZNX0lOVDE2IGlpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UxLT5DdXJyZW50KTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkgKiAoc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UxLT5DdXJyZW50KTsKICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQogICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQpAQCAtNDYsNyArNDIsNyBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CiAKLSAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UyLT5DdXJyZW50KTsKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTItPkN1cnJlbnQpOwogICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCiAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOwogICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCkBAIC01NCwyMyArNTAsMTUgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOwogICAgIH0KLQogfQotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscykKLXsKLSAgICBMVk1fRkxPQVQgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVChNaXhfUHJpdmF0ZV9GTE9BVF9zdCoqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIFRlbXA7CiAgICAgTFZNX0lOVDE2IGlpLCBqajsKLSAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2VbampdKTsKLSAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMS0+Q3VycmVudCk7CisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspIHsKKyAgICAgICAgICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2VbampdKTsKKyAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkgKiAoc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UxLT5DdXJyZW50KTsKICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOwogICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQpAQCAtODAsNSArNjgsNCBAQAogICAgICAgICB9CiAgICAgfQogfQotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKaW5kZXggODQxZmExZS4uMzFjZDgwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKQEAgLTI0LDI2ICsyNCwyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhIQVJEXzJTVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnB0ckluc3RhbmNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIExWTV9GTE9BVCAgVGVtcDsKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZTIsIGNvbnN0IExWTV9GTE9BVCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHNyYzIsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIExWTV9GTE9BVCBUZW1wOwogICAgIExWTV9JTlQxNiBpaTsKICAgICBMVk1fRkxPQVQgQ3VycmVudDE7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQyOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CiAKICAgICBDdXJyZW50MSA9IChwSW5zdGFuY2UxLT5DdXJyZW50KTsKICAgICBDdXJyZW50MiA9IChwSW5zdGFuY2UyLT5DdXJyZW50KTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgVGVtcCA9ICgoKExWTV9GTE9BVCkqKHNyYzErKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQxKSkgKwotICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKSooc3JjMisrKSAqIChMVk1fRkxPQVQpQ3VycmVudDIpKTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBUZW1wID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMxKyspICogKExWTV9GTE9BVClDdXJyZW50MSkpICsKKyAgICAgICAgICAgICAgICgoKExWTV9GTE9BVCkgKiAoc3JjMisrKSAqIChMVk1fRkxPQVQpQ3VycmVudDIpKTsKICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQogICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCmluZGV4IDMxODEzOGQuLmI3ODY1ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAKQEAgLTI1LDMzICsyNSwyOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQotewotCi0gICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICBJbkxvb3A7Ci0gICAgTFZNX0lOVDMyICAgaWksamo7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOwotICAgIExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OwotICAgIExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgIExWTV9GTE9BVCAgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIExWTV9JTlQxNiBPdXRMb29wOworICAgIExWTV9JTlQxNiBJbkxvb3A7CisgICAgTFZNX0lOVDMyIGlpLCBqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCBUZW1wOwogCiAgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCiAgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKIAotICAgIGlmKEN1cnJlbnQgPCBUYXJnZXQpewotICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKICAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CiAgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKICAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCiAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQpAQCAtNjEsMTQgKzU2LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKICAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CiAgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQogICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKQEAgLTc3LDE1ICs3MSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZXsKLSAgICAgICAgaWYgKE91dExvb3ApeworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CiAgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKICAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCiAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQpAQCAtOTUsMTMgKzg3LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDAgOyBqai0tKXsKLSAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMDsgamotLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKICAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCkBAIC0xMTMsNyArMTA0LDYgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvKgogICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUCiAgKgpAQCAtMTMxLDIxICsxMjEsMTYgQEAKICAqICB2b2lkCiAgKgogICovCi12b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yQ2hhbm5lbHMpCi17Ci0KLSAgICBMVk1fSU5UMTYgICBPdXRMb29wOwotICAgIExWTV9JTlQxNiAgIEluTG9vcDsKLSAgICBMVk1fSU5UMzIgICBpaSwgamo7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOwotICAgIExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OwotICAgIExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgIExWTV9GTE9BVCAgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKSB7CisgICAgTFZNX0lOVDE2IE91dExvb3A7CisgICAgTFZNX0lOVDE2IEluTG9vcDsKKyAgICBMVk1fSU5UMzIgaWksIGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0ZMT0FUIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUIFRlbXA7CiAKICAgICAvKgogICAgICAqIFNhbWUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBjb25zZWN1dGl2ZSBmcmFtZXMuCkBAIC0xNjAsMTAgKzE0NSw5IEBACiAgICAgICAgIGlmIChPdXRMb29wKSB7CiAgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwogICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AgKiBOckNoYW5uZWxzOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOwogICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKICAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKQEAgLTE3NywxMCArMTYxLDkgQEAKICAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKICAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CiAgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOwogICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKICAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKQEAgLTE5NiwxNyArMTc5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKLQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKE91dExvb3ApIHsKICAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wKk5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wICogTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKICAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCiAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CkBAIC0yMTksMTAgKzE5OSw5IEBACiAKICAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMDsgamotLSkgewogICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKICAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCiAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CkBAIC0yMzgsMTIgKzIxNywxMCBAQAogICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7Ci0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQogCi0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcAppbmRleCAxZjRiMDhhLi5kNDU4NDVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcApAQCAtMjYsMTIgKzI2LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBMVk1fRkxPQVQgQUREMl9TQVRfRkxPQVQoTFZNX0ZMT0FUIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgYykKLXsKK3N0YXRpYyBMVk1fRkxPQVQgQUREMl9TQVRfRkxPQVQoTFZNX0ZMT0FUIGEsIExWTV9GTE9BVCBiLCBMVk1fRkxPQVQgYykgewogICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIHRlbXAgPSBhICsgYiA7CisgICAgdGVtcCA9IGEgKyBiOwogICAgIGlmICh0ZW1wIDwgLTEuMGYpCiAgICAgICAgIGMgPSAtMS4wZjsKICAgICBlbHNlIGlmICh0ZW1wID4gMS4wZikKQEAgLTQwLDE1NCArMzcsMTEyIEBACiAgICAgICAgIGMgPSB0ZW1wOwogICAgIHJldHVybiBjOwogfQotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCi17Ci0gICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICBJbkxvb3A7Ci0gICAgTFZNX0lOVDMyICAgaWk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VMID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VSID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UyLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlTCA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZVIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwogCi0gICAgTFZNX0ZMT0FUICAgRGVsdGFMID0gcEluc3RhbmNlTC0+RGVsdGE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudEwgPSBwSW5zdGFuY2VMLT5DdXJyZW50OwotICAgIExWTV9GTE9BVCAgIFRhcmdldEwgPSBwSW5zdGFuY2VMLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUIERlbHRhTCA9IHBJbnN0YW5jZUwtPkRlbHRhOworICAgIExWTV9GTE9BVCBDdXJyZW50TCA9IHBJbnN0YW5jZUwtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUIFRhcmdldEwgPSBwSW5zdGFuY2VMLT5UYXJnZXQ7CiAKLSAgICBMVk1fRkxPQVQgICBEZWx0YVIgPSBwSW5zdGFuY2VSLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50UiA9IHBJbnN0YW5jZVItPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0UiA9IHBJbnN0YW5jZVItPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgRGVsdGFSID0gcEluc3RhbmNlUi0+RGVsdGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnRSID0gcEluc3RhbmNlUi0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0UiA9IHBJbnN0YW5jZVItPlRhcmdldDsKIAotICAgIExWTV9GTE9BVCAgIFRlbXAgPSAwOworICAgIExWTV9GTE9BVCBUZW1wID0gMDsKIAogICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwogICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CiAKLSAgICBpZiAoT3V0TG9vcCkKLSAgICB7Ci0gICAgICAgIGlmKEN1cnJlbnRMIDwgVGFyZ2V0TCkKLSAgICAgICAgeworICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpIHsKICAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOwogICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKSBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQotICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpIEN1cnJlbnRMID0gVGFyZ2V0TDsKICAgICAgICAgfQogCi0gICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgeworICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKSB7CiAgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50UiwgRGVsdGFSLCBUZW1wKTsKICAgICAgICAgICAgIEN1cnJlbnRSID0gVGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCi0gICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKSBDdXJyZW50UiA9IFRhcmdldFI7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIDI7IGlpICE9IDA7IGlpIC09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIDI7IGlpICE9IDA7IGlpIC09IDIpIHsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGZvciAoaWkgPSBJbkxvb3AgKiAyOyBpaSAhPSAwOyBpaS09MikKLSAgICB7Ci0gICAgICAgIGlmKEN1cnJlbnRMIDwgVGFyZ2V0TCkKLSAgICAgICAgeworICAgIGZvciAoaWkgPSBJbkxvb3AgKiAyOyBpaSAhPSAwOyBpaSAtPSAyKSB7CisgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpIHsKICAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOwogICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKSBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQotICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpIEN1cnJlbnRMID0gVGFyZ2V0TDsKICAgICAgICAgfQogCi0gICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgeworICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKSB7CiAgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50UiwgRGVsdGFSLCBUZW1wKTsKICAgICAgICAgICAgIEN1cnJlbnRSID0gVGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCi0gICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKSBDdXJyZW50UiA9IFRhcmdldFI7CiAgICAgICAgIH0KIAotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKICAgICB9CiAgICAgcEluc3RhbmNlTC0+Q3VycmVudCA9IEN1cnJlbnRMOwogICAgIHBJbnN0YW5jZVItPkN1cnJlbnQgPSBDdXJyZW50UjsKLQogfQotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscykKLXsKLSAgICBMVk1fSU5UMzIgICBpaSwgY2g7Ci0gICAgTFZNX0ZMT0FUICAgVGVtcCA9MC4wZjsKLSAgICBMVk1fRkxPQVQgICB0ZW1wQ3VycmVudFtOckNoYW5uZWxzXTsKLSAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQotICAgIHsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fSU5UMzIgaWksIGNoOworICAgIExWTV9GTE9BVCBUZW1wID0gMC4wZjsKKyAgICBMVk1fRkxPQVQgdGVtcEN1cnJlbnRbTnJDaGFubmVsc107CisgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykgewogICAgICAgICB0ZW1wQ3VycmVudFtjaF0gPSBwdHJJbnN0YW5jZVtjaF0tPkN1cnJlbnQ7CiAgICAgfQotICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgPiAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKLSAgICAgICAgewotICAgICAgICAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IHB0ckluc3RhbmNlW2NoXTsKLSAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKLSAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgIEN1cnJlbnQgPSB0ZW1wQ3VycmVudFtjaF07Ci0gICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgeworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgPiAwOyBpaS0tKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSBwdHJJbnN0YW5jZVtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgICAgICAgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSB0ZW1wQ3VycmVudFtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgewogICAgICAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnQsIERlbHRhLCBUZW1wKTsKICAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKLSAgICAgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKyAqIEN1cnJlbnQ7CiAgICAgICAgICAgICB0ZW1wQ3VycmVudFtjaF0gPSBDdXJyZW50OwogICAgICAgICB9CiAgICAgfQotICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspCi0gICAgeworICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgcHRySW5zdGFuY2VbY2hdLT5DdXJyZW50ID0gdGVtcEN1cnJlbnRbY2hdOwogICAgIH0KIH0KLSNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuY3BwCmluZGV4IDVkOGFhZGMuLmY4YzBhOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuY3BwCkBAIC0yNiw0MyArMjYsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQotewotICAgIExWTV9JTlQxNiAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgSW5Mb29wOwotICAgIExWTV9JTlQzMiAgIGlpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTFZNX0ZMT0FUICAgRGVsdGE9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0PSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VGFyZ2V0OwotICAgIExWTV9GTE9BVCAgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCBEZWx0YSA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCBUYXJnZXQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCBUZW1wOwogCiAgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCiAgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKIAotICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKLSAgICAgICAgaWYgKE91dExvb3ApewotCisgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKICAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CiAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCiAgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CiAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCiAgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOwogCi0gICAgICAgICAgICBDdXJyZW50PVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pewotCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CiAKICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKQEAgLTcwLDQyICs2NCwzNyBAQAogICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQogICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKIAotICAgICAgICAgICAgQ3VycmVudD1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZXsKLSAgICAgICAgaWYgKE91dExvb3ApeworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CiAgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICB9CiAgICAgfQotICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OworICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnQ7CiB9CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAvKgogICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQQogICoKQEAgLTEyMywyMCArMTEyLDE2IEBACiAgKiAgdm9pZAogICoKICAqLwotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yQ2hhbm5lbHMpCi17Ci0gICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICBJbkxvb3A7Ci0gICAgTFZNX0lOVDMyICAgaWksIGpqOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTFZNX0ZMT0FUICAgRGVsdGE9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0PSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VGFyZ2V0OwotICAgIExWTV9GTE9BVCAgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgVGVtcDsKIAogICAgIC8qCiAgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KQEAgLTE0NywyOCArMTMyLDI1IEBACiAgICAgLyogT3V0TG9vcCBpcyBjYWxjdWxhdGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBOckZyYW1lcyB2YWx1ZSBjYW4gYmUgb2RkLiovCiAgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzIC0gKEluTG9vcCA8PCAxKSk7CiAKLSAgICBpZiAoQ3VycmVudDxUYXJnZXQpIHsKKyAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgewogICAgICAgICBpZiAoT3V0TG9vcCkgewotCiAgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwogICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQogICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOwogICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQogICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKIAotICAgICAgICAgICAgQ3VycmVudD1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKICAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgewotICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7Ci0KICAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CiAKICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKQEAgLTE3Niw0NCArMTU4LDM3IEBACiAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCiAgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOwogCi0gICAgICAgICAgICBDdXJyZW50PVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAogICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKLSAgICAgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OworICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnQ7CiB9Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmNwcAppbmRleCAyYmVjM2JlLi4yNzBjN2UwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAKQEAgLTI3LDM5ICsyNywzNSBAQAogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIFRSVUUgICAgICAgICAgMQotI2RlZmluZSBGQUxTRSAgICAgICAgIDAKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWElOU09GVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKIAotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChuIDw9IDApIHJldHVybjsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBTT0ZUIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKLSAgICB7Ci0gICAgICAgIGlmKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZil7CisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKLSAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgfSBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKICAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIG4pOwpAQCAtNzAsMTExICs2NiwxMiBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nKXsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLwotICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZil7Ci0gICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIG4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOwotICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBDQUxMIEJBQ0sKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKLSAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7Ci0gICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCi0jaWZkZWYgU1VQUE9SVF9NQwotLyoKLSAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKLSAqCi0gKiBERVNDUklQVElPTjoKLSAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0Ci0gKgotICogUEFSQU1FVEVSUzoKLSAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCi0gKiAgc3JjICAgICAgICAgICAgU291cmNlCi0gKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KLSAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCi0gKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCi0gKgotICogUkVUVVJOUzoKLSAqICB2b2lkCi0gKgotICovCi12b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQotewotICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwotICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0KLSAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KLSAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgSEFSRCBNSVhJTkcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAgICAgaWYgKEhhcmRNaXhpbmcpIHsKICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApIHsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMqTnJDaGFubmVscyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlRhcmdldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgbik7CiAgICAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aGUgTFZDb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgfQpAQCAtMTkzLDE1ICs5MCw5NyBAQAogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOwogICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CiAgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYgKE5yRnJhbWVzIDw9IDApIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfSBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCkgeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikgeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CisgICAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aGUgTFZDb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spKAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKaW5kZXggMzE1M2FkYS4uYzc0YzhjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmNwcApAQCAtMjksMTQ0ICsyOSwxMTcgQEAKICAgIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUUlVFICAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgICAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCiAKICNkZWZpbmUgQVJSQVlfU0laRShhKSAoKHNpemVvZihhKSkgLyAoc2l6ZW9mKCooYSkpKSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAvKiBUaGlzIHRocmVzaG9sZCBpcyB1c2VkIHRvIGRlY2lkZSBvbiB0aGUgcHJvY2Vzc2luZyB0byBiZSBhcHBsaWVkIG9uCiAgKiBmcm9udCBjZW50ZXIgYW5kIGJhY2sgY2VudGVyIGNoYW5uZWxzCiAgKi8KICNkZWZpbmUgTFZNX1ZPTF9CQUxfVEhSICgwLjAwMDAxNmYpCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQgKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIE5yQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgQ2hNYXNrKQotewotICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwotICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgIFRhcmdldF9sZmUgPSB7TFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVH07Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgIFRhcmdldF9jdHIgPSB7TFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVH07Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcE1peFByaXZJbnN0WzRdID0ge3BJbnN0YW5jZTEsIHBJbnN0YW5jZTIsICZUYXJnZXRfY3RyLCAmVGFyZ2V0X2xmZX07Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VbTnJDaGFubmVsc107Cit2b2lkIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDMyIE5yQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIENoTWFzaykgeworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgVGFyZ2V0X2xmZSA9IHtMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUfTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCBUYXJnZXRfY3RyID0ge0xWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVR9OworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UxID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMiA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBNaXhQcml2SW5zdFs0XSA9IHtwSW5zdGFuY2UxLCBwSW5zdGFuY2UyLCAmVGFyZ2V0X2N0ciwgJlRhcmdldF9sZmV9OworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2VbTnJDaGFubmVsc107CiAKLSAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihDaE1hc2spCi0gICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgIHsKKyAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihDaE1hc2spID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFtpXTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IE5yQ2hhbm5lbHM7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IE5yQ2hhbm5lbHM7IGkrKykgewogICAgICAgICAgICAgcEluc3RhbmNlW2ldID0gcE1peFByaXZJbnN0WzJdOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVE9ETzogQ29tYmluZSB3aXRoIHN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9CYWxhbmNlLmNwcAogICAgICAgICAvLyBDb25zdGFudHMgaW4gc3lzdGVtL21lZGlhL2F1ZGlvL2luY2x1ZGUvc3lzdGVtL2F1ZGlvLWJhc2UuaAogICAgICAgICAvLyAnbWl4SW5zdElkeCcgaXMgdXNlZCB0byBtYXAgdGhlIGFwcHJvcHJpYXRlIG1peGVyIGluc3RhbmNlIGZvciBlYWNoIGNoYW5uZWwuCiAgICAgICAgIGNvbnN0IGludCBtaXhJbnN0SWR4W10gPSB7Ci0gICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUICAgICAgICAgICAgPSAweDF1LAotICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgICAgICAgICAgID0gMHgydSwKLSAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiAgICAgICAgICA9IDB4NHUsCi0gICAgICAgICAgICAzLCAvLyBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZICAgICAgICAgPSAweDh1LAotICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUICAgICAgICAgICAgID0gMHgxMHUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX1JJR0hUICAgICAgICAgICAgPSAweDIwdSwKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSICA9IDB4NDB1LAotICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSID0gMHg4MHUsCi0gICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUiAgICAgICAgICAgPSAweDEwMHUsCi0gICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgICAgICAgICAgICAgPSAweDIwMHUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUICAgICAgICAgICAgPSAweDQwMHUsCi0gICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQ0VOVEVSICAgICAgICAgICAgPSAweDgwMHUsCi0gICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCAgICAgICAgPSAweDEwMDB1LAotICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0NFTlRFUiAgICAgID0gMHgyMDAwdSwKLSAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9SSUdIVCAgICAgICA9IDB4NDAwMHUsCi0gICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUICAgICAgICAgPSAweDgwMDB1LAotICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSICAgICAgID0gMHgxMDAwMHUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCAgICAgICAgPSAweDIwMDAwdSwKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX0xFRlQgICAgICAgICA9IDB4NDAwMDB1LAotICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQgICAgICAgID0gMHg4MDAwMHUKKyAgICAgICAgICAgICAgICAwLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCAgICAgICAgICAgID0gMHgxdSwKKyAgICAgICAgICAgICAgICAxLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgICAgICAgICAgID0gMHgydSwKKyAgICAgICAgICAgICAgICAyLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSICAgICAgICAgID0gMHg0dSwKKyAgICAgICAgICAgICAgICAzLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSAgICAgICAgID0gMHg4dSwKKyAgICAgICAgICAgICAgICAwLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUICAgICAgICAgICAgID0gMHgxMHUsCisgICAgICAgICAgICAgICAgMSwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQgICAgICAgICAgICA9IDB4MjB1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiAgPSAweDQwdSwKKyAgICAgICAgICAgICAgICAxLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSID0gMHg4MHUsCisgICAgICAgICAgICAgICAgMiwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSICAgICAgICAgICA9IDB4MTAwdSwKKyAgICAgICAgICAgICAgICAwLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUICAgICAgICAgICAgID0gMHgyMDB1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUICAgICAgICAgICAgPSAweDQwMHUsCisgICAgICAgICAgICAgICAgMiwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIgICAgICAgICAgICA9IDB4ODAwdSwKKyAgICAgICAgICAgICAgICAwLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0xFRlQgICAgICAgID0gMHgxMDAwdSwKKyAgICAgICAgICAgICAgICAyLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0NFTlRFUiAgICAgID0gMHgyMDAwdSwKKyAgICAgICAgICAgICAgICAxLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUICAgICAgID0gMHg0MDAwdSwKKyAgICAgICAgICAgICAgICAwLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCAgICAgICAgID0gMHg4MDAwdSwKKyAgICAgICAgICAgICAgICAyLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSICAgICAgID0gMHgxMDAwMHUsCisgICAgICAgICAgICAgICAgMSwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUICAgICAgICA9IDB4MjAwMDB1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUICAgICAgICAgPSAweDQwMDAwdSwKKyAgICAgICAgICAgICAgICAxLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQgICAgICAgID0gMHg4MDAwMHUKICAgICAgICAgfTsKLSAgICAgICAgaWYgKHBJbnN0YW5jZTEtPlRhcmdldCA8PSBMVk1fVk9MX0JBTF9USFIgfHwKLSAgICAgICAgICAgIHBJbnN0YW5jZTItPlRhcmdldCA8PSBMVk1fVk9MX0JBTF9USFIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRhcmdldF9jdHIuVGFyZ2V0ICA9IDAuMGY7CisgICAgICAgIGlmIChwSW5zdGFuY2UxLT5UYXJnZXQgPD0gTFZNX1ZPTF9CQUxfVEhSIHx8IHBJbnN0YW5jZTItPlRhcmdldCA8PSBMVk1fVk9MX0JBTF9USFIpIHsKKyAgICAgICAgICAgIFRhcmdldF9jdHIuVGFyZ2V0ID0gMC4wZjsKICAgICAgICAgICAgIFRhcmdldF9jdHIuQ3VycmVudCA9IDAuMGY7Ci0gICAgICAgICAgICBUYXJnZXRfY3RyLkRlbHRhICAgPSAwLjBmOworICAgICAgICAgICAgVGFyZ2V0X2N0ci5EZWx0YSA9IDAuMGY7CiAgICAgICAgIH0KICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGlkeEFyclNpemUgPSBBUlJBWV9TSVpFKG1peEluc3RJZHgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgY2hhbm5lbCA9IENoTWFzazsgY2hhbm5lbCAhPTAgOyArK2kpCi0gICAgICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIGNoYW5uZWwgPSBDaE1hc2s7IGNoYW5uZWwgIT0gMDsgKytpKSB7CiAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaWR4ID0gX19idWlsdGluX2N0eihjaGFubmVsKTsKLSAgICAgICAgICAgIGlmIChpZHggPCBpZHhBcnJTaXplKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlkeCA8IGlkeEFyclNpemUpIHsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbbWl4SW5zdElkeFtpZHhdXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcEluc3RhbmNlW2ldID0gcE1peFByaXZJbnN0WzJdOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2hhbm5lbCAmPSB+KDEgPDwgaWR4KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisgICAgaWYgKE5yRnJhbWVzIDw9IDApIHJldHVybjsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBTT0ZUIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fAotICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQotICAgIHsKKyAgICAgICAgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkgewogICAgICAgICAvLyBUT0RPOiBjb21iaW5lIHNpbWlsYXIgY2hlY2tzIGJlbG93LgotICAgICAgICBpZiAocEluc3RhbmNlMS0+RGVsdGEgPT0gTFZNX01BWEZMT0FUCi0gICAgICAgICAgICAgICAgfHwgQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZTEtPkRlbHRhID09IExWTV9NQVhGTE9BVCB8fAorICAgICAgICAgICAgQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpIHsKICAgICAgICAgICAgIC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIE1ha2UgdGhlbSBlcXVhbC4gKi8KICAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChIYXJkTWl4aW5nID09IFRSVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UyLT5EZWx0YSA9PSBMVk1fTUFYRkxPQVQKLSAgICAgICAgICAgICAgICAgICAgfHwgQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCi0gICAgICAgICAgICB7CisgICAgICAgIGlmIChIYXJkTWl4aW5nID09IFRSVUUpIHsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UyLT5EZWx0YSA9PSBMVk1fTUFYRkxPQVQgfHwKKyAgICAgICAgICAgICAgICBBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkgewogICAgICAgICAgICAgICAgIC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIE1ha2UgdGhlbSBlcXVhbC4gKi8KICAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OwogICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChIYXJkTWl4aW5nID09IEZBTFNFKQotICAgICAgICB7Ci0gICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBICgmcEluc3RhbmNlWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgICAgIGlmIChIYXJkTWl4aW5nID09IEZBTFNFKSB7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEoJnBJbnN0YW5jZVswXSwgc3JjLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTc0LDE5ICsxNDcsMTMgQEAKICAgICAgICBIQVJEIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZiAoSGFyZE1peGluZyA9PSBUUlVFKQotICAgIHsKLSAgICAgICAgaWYgKChwSW5zdGFuY2UxLT5UYXJnZXQgPT0gTFZNX01BWEZMT0FUKSAmJiAocEluc3RhbmNlMi0+VGFyZ2V0ID09IExWTV9NQVhGTE9BVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzKk5yQ2hhbm5lbHMpOworICAgIGlmIChIYXJkTWl4aW5nID09IFRSVUUpIHsKKyAgICAgICAgaWYgKChwSW5zdGFuY2UxLT5UYXJnZXQgPT0gTFZNX01BWEZMT0FUKSAmJiAocEluc3RhbmNlMi0+VGFyZ2V0ID09IExWTV9NQVhGTE9BVCkpIHsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KSB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVCgmKHBJbnN0YW5jZVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQoJihwSW5zdGFuY2VbMF0pLCBzcmMsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTQsMTA5ICsxNjEsODYgQEAKICAgICAgICBDQUxMIEJBQ0sKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkKLSAgICB7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKLSAgICAgICAgeworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBUYXJnZXRHYWluKTsKICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spKAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKLSAgICB7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKLSAgICAgICAgeworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQpIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0R2Fpbik7CiAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrKSAoXAotICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQotI2VuZGlmCi12b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQotewotICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwotICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMSA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTIgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwogCi0gICAgaWYobiA8PSAwKSAgICByZXR1cm47CisgICAgaWYgKG4gPD0gMCkgcmV0dXJuOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFNPRlQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQotICAgIHsKLSAgICAgICAgaWYocEluc3RhbmNlMS0+RGVsdGEgPT0gMS4wZikKLSAgICAgICAgeworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8CisgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZTEtPkRlbHRhID09IDEuMGYpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoSGFyZE1peGluZyA9PSBUUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwSW5zdGFuY2UyLT5EZWx0YSA9PSAxLjBmKQotICAgICAgICAgICAgeworICAgICAgICBpZiAoSGFyZE1peGluZyA9PSBUUlVFKSB7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlMi0+RGVsdGEgPT0gMS4wZikgewogICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CiAgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCiAgICAgICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYoSGFyZE1peGluZyA9PSBGQUxTRSkKLSAgICAgICAgewotICAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG4pOworICAgICAgICBpZiAoSGFyZE1peGluZyA9PSBGQUxTRSkgeworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgc3JjLCBkc3QsIG4pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMDQsMjAgKzI0OCwxNCBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nKQotICAgIHsKLSAgICAgICAgaWYgKChwSW5zdGFuY2UxLT5UYXJnZXQgPT0gMS4wZikgJiYgKHBJbnN0YW5jZTItPlRhcmdldCA9PSAxLjBmKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoc3JjICE9IGRzdCkKLSAgICAgICAgICAgIHsKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSAxLjBmKSAmJiAocEluc3RhbmNlMi0+VGFyZ2V0ID09IDEuMGYpKSB7CisgICAgICAgICAgICBpZiAoc3JjICE9IGRzdCkgewogICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYywgZHN0LCBuKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzI1LDM5ICsyNjMsMzMgQEAKICAgICAgICBDQUxMIEJBQ0sKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkKLSAgICB7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKLSAgICAgICAgeworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBUYXJnZXRHYWluKTsKICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykoCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0KQotICAgIHsKLSAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQotICAgICAgICB7CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBUYXJnZXRHYWluKTsKICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spKAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAKaW5kZXggNGQyMjlkYS4uYmUxOWZhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmNwcApAQCAtMjcsMzkgKzI3LDM1IEBACiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgVFJVRSAgICAgICAgICAxCi0jZGVmaW5lIEZBTFNFICAgICAgICAgMAorI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZNaXhlcjNfTUlYU09GVF8xU1RfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQotewotICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwotICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwogCi0gICAgaWYobiA8PSAwKSAgICByZXR1cm47CisgICAgaWYgKG4gPD0gMCkgcmV0dXJuOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFNPRlQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKLSAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKXsKKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICB9IGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKQEAgLTcwLDM5ICs2NiwzNyBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICBpZiAoSGFyZE1peGluZykgewogICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKICAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgbik7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgIT0gMS4wZikKICAgICAgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOwotICAgICAgICAgICAgZWxzZSBpZihzcmMgIT0gZHN0KQorICAgICAgICAgICAgZWxzZSBpZiAoc3JjICE9IGRzdCkKICAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKICAgICAgICAgfQotCiAgICAgfQogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENBTEwgQkFDSwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KXsKLSAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CiAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBGVU5DVElPTjogICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVAogICoKQEAgLTEyMCw0MCArMTE0LDMyIEBACiAgKiAgdm9pZAogICoKICAqLwotdm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yQ2hhbm5lbHMpCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscykgeworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKLSAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChOckZyYW1lcyA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKICAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICB9IGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwotICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIE5yRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTcxLDcgKzE1Nyw2IEBACiAgICAgICAgICAgICBlbHNlIGlmIChzcmMgIT0gZHN0KQogICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NiwxNSArMTcxLDEzIEBACiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CiAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKICAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spKAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLSNlbmRpZgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcAppbmRleCA1NGFiNzlkLi44ODJhOGNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuY3BwCkBAIC0yNSw0OSArMjUsMzkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKLXsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTEgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UyID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKIAotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChuIDw9IDApIHJldHVybjsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBTT0ZUIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkgJiYgKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gMCkpewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSl7Ci0gICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCi0gICAgewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOwotICAgICAgICBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOwotICAgIH0KLSAgICBlbHNleworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBuKTsKKyAgICB9IGVsc2UgaWYgKChwSW5zdGFuY2UyLT5DdXJyZW50ID09IHBJbnN0YW5jZTItPlRhcmdldCkgJiYgKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gMCkpIHsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIG4pOworICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fAorICAgICAgICAgICAgICAgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkgeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4pOworICAgIH0gZWxzZSB7CiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgSEFSRCBNSVhJTkcKICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogLyoKICAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVAogICoKQEAgLTg2LDQ4ICs3NiwzOCBAQAogICogIHZvaWQKICAqCiAgKi8KLXZvaWQgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQotewotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscykgeworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UxID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMiA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CiAKLSAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChOckZyYW1lcyA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7Ci0gICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKSB7Ci0gICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCi0gICAgewotICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7Ci0gICAgfQotICAgIGVsc2V7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBzcmMyLCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjMSwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9IGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwKKyAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpIHsKKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9IGVsc2UgewogICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgIEhBUkQgTUlYSU5HCiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggY2U0MmQyZS4uNTUyNTVhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTI1LDM0ICsyNSwzMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIExWTWl4ZXIzX3N0IHN0cnVjdHVyZSBzdG9yZXMgSW5zdGFuY2UgcGFyYW1ldGVycyBmb3Igb25lIGF1ZGlvIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICAgICAgUHJpdmF0ZVBhcmFtc1szXTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSBzaGlmdCBwYXJhbWV0ZXIgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCi0gICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCi0gICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgUHJpdmF0ZVBhcmFtc1szXTsgLyogUHJpdmF0ZSBJbnN0YW5jZSBwYXJhbXMgZm9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW8gU3RyZWFtIHNoaWZ0IHBhcmFtZXRlciAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1NldDsgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtOyAgICAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkKiBwQ2FsbGJhY2tIYW5kbGU7ICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCogcEdlbmVyYWxQdXJwb3NlOyAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogfSBMVk1peGVyM19GTE9BVF9zdDsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1peGVyM19GTE9BVF9zdCBNaXhlclN0cmVhbVsxXTsgLyogSW5zdGFuY2UgUGFyYW1zIGZvciBvbmUgQXVkaW8gU3RyZWFtICovCiB9IExWTWl4ZXIzXzFTdF9GTE9BVF9zdDsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNaXhlcjNfRkxPQVRfc3QgTWl4ZXJTdHJlYW1bMl07IC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdHdvIEF1ZGlvIFN0cmVhbXMgKi8KIH0gTFZNaXhlcjNfMlN0X0ZMT0FUX3N0OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKEhJR0ggTEVWRUwgRlVOQ1RJT05TKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEZ1bmN0aW9uIG5hbWVzIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIGZpcnN0IDE2IGNoYXJhY3RlcnMgICovCi0jZGVmaW5lICAgIExWTWl4ZXIzX01peFNvZnRfMVN0X0QxNkMzMV9TQVQgICBMVk1peGVyM18xU3RfRDE2QzMxX1NBVF9NaXhTb2Z0Ci0jZGVmaW5lICAgIExWTWl4ZXIzX01peEluU29mdF9EMTZDMzFfU0FUICAgICBMVk1peGVyM19EMTZDMzFfU0FUX01peEluU29mdAotI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfMlN0X0QxNkMzMV9TQVRfTWl4U29mdAotI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzNTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfM1N0X0QxNkMzMV9TQVRfTWl4U29mdAorI2RlZmluZSBMVk1peGVyM19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUIExWTWl4ZXIzXzFTdF9EMTZDMzFfU0FUX01peFNvZnQKKyNkZWZpbmUgTFZNaXhlcjNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQgTFZNaXhlcjNfRDE2QzMxX1NBVF9NaXhJblNvZnQKKyNkZWZpbmUgTFZNaXhlcjNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCBMVk1peGVyM18yU3RfRDE2QzMxX1NBVF9NaXhTb2Z0CisjZGVmaW5lIExWTWl4ZXIzX01peFNvZnRfM1N0X0QxNkMzMV9TQVQgTFZNaXhlcjNfM1N0X0QxNkMzMV9TQVRfTWl4U29mdAogCiAvKioqIEdlbmVyYWwgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNjIsODUgKzU5LDUyIEBACiAvKiB0aGVuIHRoZSBjYWxjdWxhdGlvbiB3aWxsIGdpdmUgYW4gaW5jb3JyZWN0IHZhbHVlIGZvciBhbHBoYSwgc2VlIHRoZSBtaXhlciAgICAgKi8KIC8qIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgIFRhcmdldEdhaW4pOwotTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0ZMT0FUIFRhcmdldEdhaW4pOworTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0pOwogCi1MVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSk7CiAKLXZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBUYXJnZXRHYWluLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50R2Fpbik7Cit2b2lkIExWQ19NaXhlcl9Jbml0KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fRkxPQVQgVGFyZ2V0R2FpbiwgTFZNX0ZMT0FUIEN1cnJlbnRHYWluKTsKIAotdm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7Cit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0sIExWTV9JTlQzMiBUY19taWxsaXNlYywgTFZNX0ZzX2VuIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOdW1DaGFubmVscyk7CiAKLXZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOwordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fSU5UMzIgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuIEZzLCBMVk1fSU5UMTYgTnVtQ2hhbm5lbHMpOwogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscyk7CiAKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscyk7CiAKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBNaXhlclN0cmVhbVswXSBhcHBsaWVzIHRvIExlZnQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE1peGVyU3RyZWFtWzFdIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBOckNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgQ2hNYXNrKTsKLSNlbmRpZgotdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQzMiBOckNoYW5uZWxzLCBMVk1fSU5UMzIgQ2hNYXNrKTsKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOyAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9IX18KLQorI2VuZGlmICAvLyNpZm5kZWYgX19MVkNfTUlYRVJfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jcHAKaW5kZXggZDBiNTBlNi4uMDNkZThiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmNwcApAQCAtMzAsMTAgKzMwLDkgQEAKIC8qICBDdXJyZW50R2FpbiAgICAgIC0gQ3VycmVudEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCi17Ci0gICAgTFZNX0ZMT0FUICAgICAgIEN1cnJlbnRHYWluOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSkgeworICAgIExWTV9GTE9BVCBDdXJyZW50R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0KilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwogICAgIEN1cnJlbnRHYWluID0gcEluc3RhbmNlLT5DdXJyZW50OyAgLy8gQ3VycmVudEdhaW4KICAgICByZXR1cm4gQ3VycmVudEdhaW47CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuY3BwCmluZGV4IDNhZTViYTQuLjIxZWJhYzFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmNwcApAQCAtMzAsMTAgKzMwLDkgQEAKIC8qICBUYXJnZXRHYWluICAgICAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSkKLXsKLSAgICBMVk1fRkxPQVQgICAgICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CitMVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSkgeworICAgIExWTV9GTE9BVCBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CiAKICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAvLyBUYXJnZXRHYWluCiAgICAgcmV0dXJuIFRhcmdldEdhaW47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jcHAKaW5kZXggYzlmZDM0NC4uZTM3ZjYzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmNwcApAQCAtNDQsMTQgKzQ0LDEwIEBACiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgVGFyZ2V0R2FpbiwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgQ3VycmVudEdhaW4pCi17Cit2b2lkIExWQ19NaXhlcl9Jbml0KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fRkxPQVQgVGFyZ2V0R2FpbiwgTFZNX0ZMT0FUIEN1cnJlbnRHYWluKSB7CiAgICAgTFZNX0ZMT0FUIE1heEdhaW4gPSBUYXJnZXRHYWluOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwotICAgIGlmKEN1cnJlbnRHYWluID4gTWF4R2FpbikKLSAgICAgICAgTWF4R2FpbiA9IEN1cnJlbnRHYWluOwotICAgIHBJbnN0YW5jZS0+VGFyZ2V0ID0gVGFyZ2V0R2FpbjsgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIFRhcmdldAotICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnRHYWluOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0KilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIGlmIChDdXJyZW50R2FpbiA+IE1heEdhaW4pIE1heEdhaW4gPSBDdXJyZW50R2FpbjsKKyAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudEdhaW47ICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCmluZGV4IDEyM2QyMmIuLjVmMjJkNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApAQCAtMjYsNTQgKzI2LDM2IEBACiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCiAvKiBJbnN0YW5jZSBwYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDsgICAgICAgICAgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgVGFyZ2V0IEdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQ7ICAgICAgICAgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgQ3VycmVudCBHYWluICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBEZWx0YTsgICAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIERlbHRhIEdhaW4gKi8KKyAgICBMVk1fRkxPQVQgVGFyZ2V0OyAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBUYXJnZXQgR2FpbiAqLworICAgIExWTV9GTE9BVCBDdXJyZW50OyAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIEN1cnJlbnQgR2FpbiAqLworICAgIExWTV9GTE9BVCBEZWx0YTsgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIERlbHRhIEdhaW4gKi8KIH0gTWl4X1ByaXZhdGVfRkxPQVRfc3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIExWQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCAgICBMVkNvcmVfSW5Tb2Z0X0QzMkMzMV9TQVQKLSNkZWZpbmUgTFZDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEgIExWQ29yZV9Tb2Z0XzFTdF9EMzJDMzFfV1JBCi0jZGVmaW5lIExWQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUICBMVkNvcmVfSGFyZF8yU3RfRDMyQzMxX1NBVAorI2RlZmluZSBMVkNvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQgTFZDb3JlX0luU29mdF9EMzJDMzFfU0FUCisjZGVmaW5lIExWQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBIExWQ29yZV9Tb2Z0XzFTdF9EMzJDMzFfV1JBCisjZGVmaW5lIExWQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUIExWQ29yZV9IYXJkXzJTdF9EMzJDMzFfU0FUCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTIChMT1cgTEVWRUwgU1VCRlVOQ1RJT05TKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKLXZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnBJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscyk7Cit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QqIHBJbnN0YW5jZTEsIExWTWl4ZXIzX0ZMT0FUX3N0KiBwSW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MSwxOCArNjMsMTEgQEAKIC8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X01DX2Zsb2F0X1dSQShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlMiwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwMCwyMSArNzUsMTMgQEAKIC8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKLXZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlMiwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAogLyoqKiAzMiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwotCisjZW5kaWYgIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcAppbmRleCA0N2IwY2VjLi5kODAxNWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcApAQCAtNDMsOSArNDMsNyBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgIFRhcmdldEdhaW4pCi17Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBnYWluIFRhcmdldAordm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fRkxPQVQgVGFyZ2V0R2FpbikgeworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgLy8gVXBkYXRlIGdhaW4gVGFyZ2V0CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCmluZGV4IDFhOGRhN2EuLjcxNWI5MDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCkBAIC00NCwzNiArNDQsMzMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKLXsKLSAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzEzXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ1MzUyZiwvKjg4MjAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2N2YsLyo5NjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KK3ZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0lOVDMyIFRjX21pbGxpc2VjLCBMVk1fRnNfZW4gRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwgIC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwgIC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsICAvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLCAgLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwgIC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsICAvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLCAgLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwgIC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsICAvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLCAgLyo4ODIwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY3ZiwgIC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsICAvKjE3NjQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07IC8qMTkyMDAwKi8KIAotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CiAgICAgTFZNX0ZMT0FUIERlbHRhID0gRGVsdGFUYWJsZVtGc107CiAgICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7CiAKLSAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgIGlmIChUY19taWxsaXNlYyA9PSAwKQogICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKICAgICBlbHNlCiAgICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlYzsKIAotICAgIGlmKERlbHRhID09IDApCi0gICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KKyAgICBpZiAoRGVsdGEgPT0gMCkKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAvKiBJZiBUaW1lIENvbnN0YW50IGlzIHNvIGxhcmdlIHRoYXQgRGVsdGEgaXMgMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KICAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcAppbmRleCBmMzM1YTFlLi5jZjg0NjEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcApAQCAtNDQsNTcgKzQ0LDUwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQotewotICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzEzXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ1MzUyZiwvKjg4MjAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjZmLC8qOTYwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsLyoxNzY0MDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0lOVDMyIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiBGcywgTFZNX0lOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwgIC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwgIC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsICAvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLCAgLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwgIC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsICAvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLCAgLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwgIC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsICAvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLCAgLyo4ODIwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwgIC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsICAvKjE3NjQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07IC8qMTkyMDAwKi8KICAgICBMVk1fRkxPQVQgVGNfbWlsbGlzZWNfZmxvYXQ7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKICAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKIAotICAgIExWTV9GTE9BVCAgIEN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0OworICAgIExWTV9GTE9BVCBDdXJyZW50OworICAgIExWTV9GTE9BVCBUYXJnZXQ7CiAKLSAgICBEZWx0YT1EZWx0YSAvIChOdW1DaGFubmVscyk7CisgICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7CiAKICAgICAvKiAgR2V0IGdhaW4gdmFsdWVzICAqLwogICAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CiAgICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAKLSAgICBpZiAoQ3VycmVudCAhPSBUYXJnZXQpCi0gICAgeworICAgIGlmIChDdXJyZW50ICE9IFRhcmdldCkgewogICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IChMVk1fRkxPQVQpKFRjX21pbGxpc2VjKSAvIChDdXJyZW50IC0gVGFyZ2V0KTsKLSAgICAgICAgaWYgKFRjX21pbGxpc2VjX2Zsb2F0IDwgMCkKLSAgICAgICAgICAgIFRjX21pbGxpc2VjX2Zsb2F0ID0gLVRjX21pbGxpc2VjX2Zsb2F0OworICAgICAgICBpZiAoVGNfbWlsbGlzZWNfZmxvYXQgPCAwKSBUY19taWxsaXNlY19mbG9hdCA9IC1UY19taWxsaXNlY19mbG9hdDsKIAotICAgICAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgICAgICBpZiAoVGNfbWlsbGlzZWMgPT0gMCkKICAgICAgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBEZWx0YSA9IERlbHRhIC8gVGNfbWlsbGlzZWNfZmxvYXQ7CiAKLSAgICAgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgaWYgKERlbHRhID09IDApCiAgICAgICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7IC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHRpbmcgaXQgdG8gemVybyBoYXMgc29tZSBwcm9ibGVtcywgdG8gYmUgY29ycmVjdGVkKSAqLworICAgIH0gZWxzZSB7CisgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgLyogTWluaW11bSB2YWx1ZSBmb3IgcHJvcGVyIGNhbGwtYmFja3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkgKi8KICAgICB9CiAKLSAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQorICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCmluZGV4IDI0OTdkMjkuLjU5MDk1ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCkBAIC02NywzMSArNjcsMTkgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUxWTV9GTE9BVCBMVk1fRk9fSFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCi17Ci0gICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07Ci0gICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworTFZNX0ZMT0FUIExWTV9GT19IUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpIHsKKyAgICBMVk1fRkxPQVQgWSwgQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLCAwLjk5OTgwMWYsICAtMC40OTc4MjRmLCAwLjMyMjkzN2YsICAtMC4xODA4ODBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwgIC0wLjAzMjEwMmYsIDAuMDA4MTYzZiwgIC0wLjAwMTI1MmYsIDAuMDAwMDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAwfTsKKyAgICBZID0gTFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKIAotICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAgICAgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KLSAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgICAgICAvKiBBMD1ZPUIxLzIqLwotICAgIFkgPSBZIC0gMC41ZjsgICAgICAgICAvKiBBMD1ZPShCMS8yIC0gMC41KSovCisgICAgcENvZWZmcy0+QjEgPSAtWTsgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLworICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KKyAgICBZID0gWSAvIDIuMGY7ICAgICAvKiBBMD1ZPUIxLzIqLworICAgIFkgPSBZIC0gMC41ZjsgICAgIC8qIEEwPVk9KEIxLzIgLSAwLjUpKi8KIAotICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOyAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLwotICAgIHBDb2VmZnMtPkExID0gLXBDb2VmZnMtPkEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIEExPS1BMCovCisgICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7IC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLworICAgIHBDb2VmZnMtPkExID0gLXBDb2VmZnMtPkEwOyAgICAgICAgICAvKiBTdG9yZSBBMT0tQTAqLwogCiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCmluZGV4IDdiYzYwNDYuLjkxOTY0ZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCkBAIC02NywyNSArNjcsMTUgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUxWTV9GTE9BVCBMVk1fRk9fTFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCi17Ci0gICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OwotICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKLSAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41Ci0gICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKLSAgICBZID0gWSArIDAuNWY7ICAgICAvLyBBMD1ZPShCMS8yICsgMC41KQorTFZNX0ZMT0FUIExWTV9GT19MUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpIHsKKyAgICBMVk1fRkxPQVQgWSwKKyAgICAgICAgICAgIENvZWZmaWNpZW50c1sxM10gPSB7LTAuOTk5OTk2ZiwgMC45OTk4MDFmLCAtMC40OTc4MjRmLCAwLjMyMjkzN2YsIC0wLjE4MDg4MGYsIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDMyMTAyZiwgMC4wMDgxNjNmLCAtMC4wMDEyNTJmLCAwLjAwMDA4OWYsIDB9OworICAgIFkgPSBMVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworICAgIHBDb2VmZnMtPkIxID0gLVk7ICAvLyBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxIQorICAgICAgICAgICAgICAgICAgICAgICAvLyBBMD0oMStCMSkvMj0gQjEvMiArIDAuNQorICAgIFkgPSBZIC8gMi4wZjsgICAgICAvLyBBMD1ZPUIxLzIKKyAgICBZID0gWSArIDAuNWY7ICAgICAgLy8gQTA9WT0oQjEvMiArIDAuNSkKIAogICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOwogICAgIHBDb2VmZnMtPkExID0gcENvZWZmcy0+QTA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmNwcAppbmRleCAyYTdjY2EyLi41ZjI1Njc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jcHAKQEAgLTI1LDQxICsyNSwzMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZWRExfMlBpQnlfODAwMCAgICAgICAgMTcyNzEwODgyNiAgLyogSW4gUTQxIGZvcm1hdCAqLwotI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNSAgICAgICAxMjUzMjMwODk0ICAvKiBJbiBRNDEgZm9ybWF0ICovCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwICAgICAgIDExNTE0MDU4ODQgIC8qIEluIFE0MSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlfODAwMCAxNzI3MTA4ODI2ICAvKiBJbiBRNDEgZm9ybWF0ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1IDEyNTMyMzA4OTQgLyogSW4gUTQxIGZvcm1hdCAqLworI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMCAxMTUxNDA1ODg0IC8qIEluIFE0MSBmb3JtYXQgKi8KIAotI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAgICAxMiAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KLSNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgICAgMTMgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLwotI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAgICAxNCAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLwotI2RlZmluZSBMVlZETF8yUGlCeV84MDAwX2YgICAgICAgIDAuMDAwNzg1Mzk4ZgotI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNV9mICAgICAgIDAuMDAwNTY5OTAzZgotI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMF9mICAgICAgIDAuMDAwNTIzNTk5ZgotI2RlZmluZSBMVlZETF8yUGlCeV8xNjAwMF9mICAgICAgIDAuMDAwMzkyNzAwZgotI2RlZmluZSBMVlZETF8yUGlCeV8yMjA1MF9mICAgICAgIDAuMDAwMjg0OTUyZgotI2RlZmluZSBMVlZETF8yUGlCeV8yNDAwMF9mICAgICAgIDAuMDAwMjYxODAwZgotI2RlZmluZSBMVlZETF8yUGlCeV8zMjAwMF9mICAgICAgIDAuMDAwMTk2MzUwZgotI2RlZmluZSBMVlZETF8yUGlCeV80NDEwMF9mICAgICAgIDAuMDAwMTQyNDc2ZgotI2RlZmluZSBMVlZETF8yUGlCeV80ODAwMF9mICAgICAgIDAuMDAwMTMwOTAwZgorI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAxMiAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgMTMgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAxNCAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeV84MDAwX2YgMC4wMDA3ODUzOThmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1X2YgMC4wMDA1Njk5MDNmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwX2YgMC4wMDA1MjM1OTlmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE2MDAwX2YgMC4wMDAzOTI3MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzIyMDUwX2YgMC4wMDAyODQ5NTJmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzI0MDAwX2YgMC4wMDAyNjE4MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzMyMDAwX2YgMC4wMDAxOTYzNTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ0MTAwX2YgMC4wMDAxNDI0NzZmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgMC4wMDAxMzA5MDBmCiAKLSNkZWZpbmUgTFZWRExfMlBpQnlfODgyMDBfZiAgICAgICAwLjAwMDA3MTIzOGYKLSNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKLSNkZWZpbmUgTFZWRExfMlBpQnlfMTc2NDAwX2YgICAgICAwLjAwMDAzNTYxOWYKLSNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKLWNvbnN0IExWTV9GTE9BVCAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1X2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTYwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzIyMDUwX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8yNDAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMzIwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV80ODAwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV84ODIwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV85NjAwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xNzY0MDBfZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfMTkyMDAwX2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2RlZmluZSBMVlZETF8yUGlCeV84ODIwMF9mIDAuMDAwMDcxMjM4ZgorI2RlZmluZSBMVlZETF8yUGlCeV85NjAwMF9mIDAuMDAwMDY1NDUwZgorI2RlZmluZSBMVlZETF8yUGlCeV8xNzY0MDBfZiAwLjAwMDAzNTYxOWYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgMC4wMDAwMzI3MjVmCitjb25zdCBMVk1fRkxPQVQgTFZWRExfMlBpT25Gc1RhYmxlW10gPSB7CisgICAgICAgIExWVkRMXzJQaUJ5XzgwMDBfZiwgIExWVkRMXzJQaUJ5XzExMDI1X2YsIExWVkRMXzJQaUJ5XzEyMDAwX2YsIExWVkRMXzJQaUJ5XzE2MDAwX2YsCisgICAgICAgIExWVkRMXzJQaUJ5XzIyMDUwX2YsIExWVkRMXzJQaUJ5XzI0MDAwX2YsIExWVkRMXzJQaUJ5XzMyMDAwX2YsIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCisgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YsIExWVkRMXzJQaUJ5Xzg4MjAwX2YsIExWVkRMXzJQaUJ5Xzk2MDAwX2YsIExWVkRMXzJQaUJ5XzE3NjQwMF9mLAorICAgICAgICBMVlZETF8yUGlCeV8xOTIwMDBfZn07CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03NywxMCArNjgsOCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdz0yKnBpKkZjL0ZzIGluIFEyLjI5IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgRmMsCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKLXsKLSAgICBMVk1fRkxPQVQgICB3OworTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyIEZjLCBMVk1fRnNfZW4gRnMpIHsKKyAgICBMVk1fRkxPQVQgdzsKICAgICB3ID0gKExWTV9GTE9BVClGYyAqIExWVkRMXzJQaU9uRnNUYWJsZVtGc107CiAgICAgcmV0dXJuIHc7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKaW5kZXggMjQ0ZjA5ZC4uMzFkY2FhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaApAQCAtMzMsMTA5ICszMywxMDkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEFscGhhX1RhYmxlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIDUwICAgICAgLyogVGhlIG51bWJlciBvZiB0YWJsZSBlbnRpcmVzICovCi0jZGVmaW5lIEFMUEhBXzAgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDgwNzY5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5OSAqLwotI2RlZmluZSBBTFBIQV8xICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3OTU3NyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTggKi8KLSNkZWZpbmUgQUxQSEFfMiAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0Nzc4OTIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk3ICovCi0jZGVmaW5lIEFMUEhBXzMgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDc1NTEwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NiAqLwotI2RlZmluZSBBTFBIQV80ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3MjE0MSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTUgKi8KLSNkZWZpbmUgQUxQSEFfNSAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NjczNzcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTkyICovCi0jZGVmaW5lIEFMUEhBXzYgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDYwNjQyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk4OSAqLwotI2RlZmluZSBBTFBIQV83ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ1MTExOCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5ODUgKi8KLSNkZWZpbmUgQUxQSEFfOCAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0Mzc2NTEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTc5ICovCi0jZGVmaW5lIEFMUEhBXzkgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDE4NjA4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk3MCAqLwotI2RlZmluZSBBTFBIQV8xMCAgICAgICAgICAgICAgICAgICAgICAgMjE0NzM5MTY4MyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NTcgKi8KLSNkZWZpbmUgQUxQSEFfMTEgICAgICAgICAgICAgICAgICAgICAgIDIxNDczNTM2MTEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTM5ICovCi0jZGVmaW5lIEFMUEhBXzEyICAgICAgICAgICAgICAgICAgICAgICAyMTQ3Mjk5Nzc5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTkxNCAqLwotI2RlZmluZSBBTFBIQV8xMyAgICAgICAgICAgICAgICAgICAgICAgMjE0NzIyMzY2MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk4NzkgKi8KLSNkZWZpbmUgQUxQSEFfMTQgICAgICAgICAgICAgICAgICAgICAgIDIxNDcxMTYwMzcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5ODI5ICovCi0jZGVmaW5lIEFMUEhBXzE1ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2OTYzODY1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTc1OCAqLwotI2RlZmluZSBBTFBIQV8xNiAgICAgICAgICAgICAgICAgICAgICAgMjE0Njc0ODcxMiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk2NTggKi8KLSNkZWZpbmUgQUxQSEFfMTcgICAgICAgICAgICAgICAgICAgICAgIDIxNDY0NDQ1MjIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NTE2ICovCi0jZGVmaW5lIEFMUEhBXzE4ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2MDE0NDcyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTMxNiAqLwotI2RlZmluZSBBTFBIQV8xOSAgICAgICAgICAgICAgICAgICAgICAgMjE0NTQwNjUyNyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTkwMzMgKi8KLSNkZWZpbmUgQUxQSEFfMjAgICAgICAgICAgICAgICAgICAgICAgIDIxNDQ1NDcxODggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk4NjMzICovCi0jZGVmaW5lIEFMUEhBXzIxICAgICAgICAgICAgICAgICAgICAgICAyMTQzMzMyNjY5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5ODA2NyAqLwotI2RlZmluZSBBTFBIQV8yMiAgICAgICAgICAgICAgICAgICAgICAgMjE0MTYxNjUxNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTcyNjggKi8KLSNkZWZpbmUgQUxQSEFfMjMgICAgICAgICAgICAgICAgICAgICAgIDIxMzkxOTIyMTUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk2MTM5ICovCi0jZGVmaW5lIEFMUEhBXzI0ICAgICAgICAgICAgICAgICAgICAgICAyMTM1NzY4OTM5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NDU0NSAqLwotI2RlZmluZSBBTFBIQV8yNSAgICAgICAgICAgICAgICAgICAgICAgMjEzMDkzNzc3NCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTIyOTUgKi8KLSNkZWZpbmUgQUxQSEFfMjYgICAgICAgICAgICAgICAgICAgICAgIDIxMjQxMjUxNTMgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTg5MTIzICovCi0jZGVmaW5lIEFMUEhBXzI3ICAgICAgICAgICAgICAgICAgICAgICAyMTE0NTI5MjYzICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk4NDY1NCAqLwotI2RlZmluZSBBTFBIQV8yOCAgICAgICAgICAgICAgICAgICAgICAgMjEwMTAzNDYxMiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NzgzNzAgKi8KLSNkZWZpbmUgQUxQSEFfMjkgICAgICAgICAgICAgICAgICAgICAgIDIwODIxMDAwMzAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTY5NTUzICovCi0jZGVmaW5lIEFMUEhBXzMwICAgICAgICAgICAgICAgICAgICAgICAyMDU1NjE3Mzk4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk1NzIyMSAqLwotI2RlZmluZSBBTFBIQV8zMSAgICAgICAgICAgICAgICAgICAgICAgMjAxODc0NDgyNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NDAwNTEgKi8KLSNkZWZpbmUgQUxQSEFfMzIgICAgICAgICAgICAgICAgICAgICAgIDE5Njc3MzMwMTUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTE2Mjk3ICovCi0jZGVmaW5lIEFMUEhBXzMzICAgICAgICAgICAgICAgICAgICAgICAxODk3Nzk0NTg3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjg4MzcyOSAqLwotI2RlZmluZSBBTFBIQV8zNCAgICAgICAgICAgICAgICAgICAgICAgMTgwMzEyMzIzNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC44Mzk2NDUgKi8KLSNkZWZpbmUgQUxQSEFfMzUgICAgICAgICAgICAgICAgICAgICAgIDE2NzcyNjIyMjAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNzgxMDM2ICovCi0jZGVmaW5lIEFMUEhBXzM2ICAgICAgICAgICAgICAgICAgICAgICAxNTE0MTQyNjc1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjcwNTA3OCAqLwotI2RlZmluZSBBTFBIQV8zNyAgICAgICAgICAgICAgICAgICAgICAgMTMxMDE5Nzg3NSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC42MTAxMDggKi8KLSNkZWZpbmUgQUxQSEFfMzggICAgICAgICAgICAgICAgICAgICAgIDEwNjc4MTM0ODAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNDk3MjM5ICovCi0jZGVmaW5lIEFMUEhBXzM5ICAgICAgICAgICAgICAgICAgICAgICAgNzk5NjAxMzcxICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjM3MjM0MyAqLwotI2RlZmluZSBBTFBIQV80MCAgICAgICAgICAgICAgICAgICAgICAgIDUzMTE4MzA0OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4yNDczNTEgKi8KLSNkZWZpbmUgQUxQSEFfNDEgICAgICAgICAgICAgICAgICAgICAgICAyOTc5MDQwMDcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMTM4NzIyICovCi0jZGVmaW5lIEFMUEhBXzQyICAgICAgICAgICAgICAgICAgICAgICAgMTMxNDk5NzY4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjA2MTIzNCAqLwotI2RlZmluZSBBTFBIQV80MyAgICAgICAgICAgICAgICAgICAgICAgICA0MTM3NTI4MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMTkyNjcgKi8KLSNkZWZpbmUgQUxQSEFfNDQgICAgICAgICAgICAgICAgICAgICAgICAgIDgwNjU4OTkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAzNzU2ICovCi0jZGVmaW5lIEFMUEhBXzQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgNzk5MDc2ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDM3MiAqLwotI2RlZmluZSBBTFBIQV80NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDM5OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMTQgKi8KLSNkZWZpbmUgQUxQSEFfNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCi0jZGVmaW5lIEFMUEhBXzQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLwotI2RlZmluZSBBTFBIQV80OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KLSNkZWZpbmUgQUxQSEFfNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFscGhhX1RhYmxlU2l6ZSA1MCAgLyogVGhlIG51bWJlciBvZiB0YWJsZSBlbnRpcmVzICovCisjZGVmaW5lIEFMUEhBXzAgMjE0NzQ4MDc2OSAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5OSAqLworI2RlZmluZSBBTFBIQV8xIDIxNDc0Nzk1NzcgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTggKi8KKyNkZWZpbmUgQUxQSEFfMiAyMTQ3NDc3ODkyICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk3ICovCisjZGVmaW5lIEFMUEhBXzMgMjE0NzQ3NTUxMCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NiAqLworI2RlZmluZSBBTFBIQV80IDIxNDc0NzIxNDEgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTUgKi8KKyNkZWZpbmUgQUxQSEFfNSAyMTQ3NDY3Mzc3ICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTkyICovCisjZGVmaW5lIEFMUEhBXzYgMjE0NzQ2MDY0MiAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk4OSAqLworI2RlZmluZSBBTFBIQV83IDIxNDc0NTExMTggIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5ODUgKi8KKyNkZWZpbmUgQUxQSEFfOCAyMTQ3NDM3NjUxICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTc5ICovCisjZGVmaW5lIEFMUEhBXzkgMjE0NzQxODYwOCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk3MCAqLworI2RlZmluZSBBTFBIQV8xMCAyMTQ3MzkxNjgzIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NTcgKi8KKyNkZWZpbmUgQUxQSEFfMTEgMjE0NzM1MzYxMSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTM5ICovCisjZGVmaW5lIEFMUEhBXzEyIDIxNDcyOTk3NzkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTkxNCAqLworI2RlZmluZSBBTFBIQV8xMyAyMTQ3MjIzNjYyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk4NzkgKi8KKyNkZWZpbmUgQUxQSEFfMTQgMjE0NzExNjAzNyAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5ODI5ICovCisjZGVmaW5lIEFMUEhBXzE1IDIxNDY5NjM4NjUgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTc1OCAqLworI2RlZmluZSBBTFBIQV8xNiAyMTQ2NzQ4NzEyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk2NTggKi8KKyNkZWZpbmUgQUxQSEFfMTcgMjE0NjQ0NDUyMiAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NTE2ICovCisjZGVmaW5lIEFMUEhBXzE4IDIxNDYwMTQ0NzIgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTMxNiAqLworI2RlZmluZSBBTFBIQV8xOSAyMTQ1NDA2NTI3IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTkwMzMgKi8KKyNkZWZpbmUgQUxQSEFfMjAgMjE0NDU0NzE4OCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk4NjMzICovCisjZGVmaW5lIEFMUEhBXzIxIDIxNDMzMzI2NjkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5ODA2NyAqLworI2RlZmluZSBBTFBIQV8yMiAyMTQxNjE2NTE0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTcyNjggKi8KKyNkZWZpbmUgQUxQSEFfMjMgMjEzOTE5MjIxNSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk2MTM5ICovCisjZGVmaW5lIEFMUEhBXzI0IDIxMzU3Njg5MzkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NDU0NSAqLworI2RlZmluZSBBTFBIQV8yNSAyMTMwOTM3Nzc0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTIyOTUgKi8KKyNkZWZpbmUgQUxQSEFfMjYgMjEyNDEyNTE1MyAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTg5MTIzICovCisjZGVmaW5lIEFMUEhBXzI3IDIxMTQ1MjkyNjMgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk4NDY1NCAqLworI2RlZmluZSBBTFBIQV8yOCAyMTAxMDM0NjEyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NzgzNzAgKi8KKyNkZWZpbmUgQUxQSEFfMjkgMjA4MjEwMDAzMCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTY5NTUzICovCisjZGVmaW5lIEFMUEhBXzMwIDIwNTU2MTczOTggLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk1NzIyMSAqLworI2RlZmluZSBBTFBIQV8zMSAyMDE4NzQ0ODI0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NDAwNTEgKi8KKyNkZWZpbmUgQUxQSEFfMzIgMTk2NzczMzAxNSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTE2Mjk3ICovCisjZGVmaW5lIEFMUEhBXzMzIDE4OTc3OTQ1ODcgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjg4MzcyOSAqLworI2RlZmluZSBBTFBIQV8zNCAxODAzMTIzMjM0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC44Mzk2NDUgKi8KKyNkZWZpbmUgQUxQSEFfMzUgMTY3NzI2MjIyMCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNzgxMDM2ICovCisjZGVmaW5lIEFMUEhBXzM2IDE1MTQxNDI2NzUgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjcwNTA3OCAqLworI2RlZmluZSBBTFBIQV8zNyAxMzEwMTk3ODc1IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC42MTAxMDggKi8KKyNkZWZpbmUgQUxQSEFfMzggMTA2NzgxMzQ4MCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNDk3MjM5ICovCisjZGVmaW5lIEFMUEhBXzM5IDc5OTYwMTM3MSAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjM3MjM0MyAqLworI2RlZmluZSBBTFBIQV80MCA1MzExODMwNDkgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4yNDczNTEgKi8KKyNkZWZpbmUgQUxQSEFfNDEgMjk3OTA0MDA3ICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMTM4NzIyICovCisjZGVmaW5lIEFMUEhBXzQyIDEzMTQ5OTc2OCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjA2MTIzNCAqLworI2RlZmluZSBBTFBIQV80MyA0MTM3NTI4MiAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMTkyNjcgKi8KKyNkZWZpbmUgQUxQSEFfNDQgODA2NTg5OSAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAzNzU2ICovCisjZGVmaW5lIEFMUEhBXzQ1IDc5OTA3NiAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDM3MiAqLworI2RlZmluZSBBTFBIQV80NiAzMDM5OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMTQgKi8KKyNkZWZpbmUgQUxQSEFfNDcgMjk5ICAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFMUEhBXzQ4IDAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLworI2RlZmluZSBBTFBIQV80OSAwICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KKyNkZWZpbmUgQUxQSEFfNTAgMCAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCiAKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OThmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5N2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMyAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk2ZgotI2RlZmluZSBBTFBIQV9GbG9hdF80ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzUgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5MmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTg5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF83ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5ODVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzggICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk3OWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfOSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTcwZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xMCAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NTdmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzExICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTkzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTE0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xMyAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4NzlmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzE0ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgyOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTUgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NzU4ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xNiAgICAgICAgICAgICAgICAgICAgICAgMC45OTk2NThmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzE3ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTUxNmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTggICAgICAgICAgICAgICAgICAgICAgIDAuOTk5MzE2ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xOSAgICAgICAgICAgICAgICAgICAgICAgMC45OTkwMzNmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIwICAgICAgICAgICAgICAgICAgICAgICAwLjk5ODYzM2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjEgICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MDY3ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTcyNjhmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIzICAgICAgICAgICAgICAgICAgICAgICAwLjk5NjEzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjQgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0NTQ1ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yNSAgICAgICAgICAgICAgICAgICAgICAgMC45OTIyOTVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzI2ICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTEyM2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjcgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NjU0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yOCAgICAgICAgICAgICAgICAgICAgICAgMC45NzgzNzBmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzI5ICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTU1M2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3MjIxZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zMSAgICAgICAgICAgICAgICAgICAgICAgMC45NDAwNTFmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzMyICAgICAgICAgICAgICAgICAgICAgICAwLjkxNjI5N2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzMgICAgICAgICAgICAgICAgICAgICAgIDAuODgzNzI5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zNCAgICAgICAgICAgICAgICAgICAgICAgMC44Mzk2NDVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzM1ICAgICAgICAgICAgICAgICAgICAgICAwLjc4MTAzNmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzYgICAgICAgICAgICAgICAgICAgICAgIDAuNzA1MDc4ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zNyAgICAgICAgICAgICAgICAgICAgICAgMC42MTAxMDhmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzM4ICAgICAgICAgICAgICAgICAgICAgICAwLjQ5NzIzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzkgICAgICAgICAgICAgICAgICAgICAgIDAuMzcyMzQzZgotI2RlZmluZSBBTFBIQV9GbG9hdF80MCAgICAgICAgICAgICAgICAgICAgICAgMC4yNDczNTFmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQxICAgICAgICAgICAgICAgICAgICAgICAwLjEzODcyMmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDIgICAgICAgICAgICAgICAgICAgICAgIDAuMDYxMjM0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF80MyAgICAgICAgICAgICAgICAgICAgICAgMC4wMTkyNjdmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQ0ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMzc1NmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDUgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzcyZgotI2RlZmluZSBBTFBIQV9GbG9hdF80NiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTRmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQ3ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDggICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBBTFBIQV9GbG9hdF80OSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzUwICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMCAwLjk5OTk5OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMSAwLjk5OTk5OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMiAwLjk5OTk5N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMyAwLjk5OTk5NmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNCAwLjk5OTk5NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNSAwLjk5OTk5MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNiAwLjk5OTk4OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNyAwLjk5OTk4NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOCAwLjk5OTk3OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOSAwLjk5OTk3MGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTAgMC45OTk5NTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzExIDAuOTk5OTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMiAwLjk5OTkxNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTMgMC45OTk4NzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE0IDAuOTk5ODI5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNSAwLjk5OTc1OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTYgMC45OTk2NThmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE3IDAuOTk5NTE2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xOCAwLjk5OTMxNmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTkgMC45OTkwMzNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIwIDAuOTk4NjMzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMSAwLjk5ODA2N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjIgMC45OTcyNjhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIzIDAuOTk2MTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNCAwLjk5NDU0NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjUgMC45OTIyOTVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI2IDAuOTg5MTIzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNyAwLjk4NDY1NGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjggMC45NzgzNzBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI5IDAuOTY5NTUzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMCAwLjk1NzIyMWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzEgMC45NDAwNTFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMyIDAuOTE2Mjk3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMyAwLjg4MzcyOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzQgMC44Mzk2NDVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM1IDAuNzgxMDM2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNiAwLjcwNTA3OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzcgMC42MTAxMDhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM4IDAuNDk3MjM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zOSAwLjM3MjM0M2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDAgMC4yNDczNTFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQxIDAuMTM4NzIyZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MiAwLjA2MTIzNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDMgMC4wMTkyNjdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ0IDAuMDAzNzU2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NSAwLjAwMDM3MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDYgMC4wMDAwMTRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ3IDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF80OCAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDkgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzUwIDAuMDAwMDAwZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKaW5kZXggNzNkYTJjZi4uM2VjMTAzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKQEAgLTU2LDgzICs1NiwzNyBAQAogLyogIEFscGhhICAgLSB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IFEzMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCi17Ci0KLSAgICBMVk1fVUlOVDMyICBQcm9kdWN0OwotICAgIExWTV9GTE9BVCAgUHJvZHVjdEZsb2F0OwotICAgIExWTV9JTlQxNiAgIEludGVycG9sYXRlU2hvcnQ7Ci0gICAgTFZNX0ZMT0FUICAgSW50ZXJwb2xhdGU7Ci0gICAgTFZNX1VJTlQxNiAgU2hpZnQ7Ci0gICAgTFZNX0ZMT0FUICAgRGlmZjsKLSAgICBMVk1fRkxPQVQgIFRhYmxlW10gPSB7QUxQSEFfRmxvYXRfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM3LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF81MH07CitMVk1fRkxPQVQgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyIHRjLCBMVk1fVUlOVDMyIEZzLCBMVk1fVUlOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX1VJTlQzMiBQcm9kdWN0OworICAgIExWTV9GTE9BVCBQcm9kdWN0RmxvYXQ7CisgICAgTFZNX0lOVDE2IEludGVycG9sYXRlU2hvcnQ7CisgICAgTFZNX0ZMT0FUIEludGVycG9sYXRlOworICAgIExWTV9VSU5UMTYgU2hpZnQ7CisgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgTFZNX0ZMT0FUIFRhYmxlW10gPSB7CisgICAgICAgICAgICBBTFBIQV9GbG9hdF8wLCAvKiBMb2cgc3BhY2VkIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsICBBTFBIQV9GbG9hdF8yLCAgQUxQSEFfRmxvYXRfMywgIEFMUEhBX0Zsb2F0XzQsICBBTFBIQV9GbG9hdF81LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNiwgIEFMUEhBX0Zsb2F0XzcsICBBTFBIQV9GbG9hdF84LCAgQUxQSEFfRmxvYXRfOSwgIEFMUEhBX0Zsb2F0XzEwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTEsIEFMUEhBX0Zsb2F0XzEyLCBBTFBIQV9GbG9hdF8xMywgQUxQSEFfRmxvYXRfMTQsIEFMUEhBX0Zsb2F0XzE1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTYsIEFMUEhBX0Zsb2F0XzE3LCBBTFBIQV9GbG9hdF8xOCwgQUxQSEFfRmxvYXRfMTksIEFMUEhBX0Zsb2F0XzIwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsIEFMUEhBX0Zsb2F0XzIyLCBBTFBIQV9GbG9hdF8yMywgQUxQSEFfRmxvYXRfMjQsIEFMUEhBX0Zsb2F0XzI1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjYsIEFMUEhBX0Zsb2F0XzI3LCBBTFBIQV9GbG9hdF8yOCwgQUxQSEFfRmxvYXRfMjksIEFMUEhBX0Zsb2F0XzMwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzEsIEFMUEhBX0Zsb2F0XzMyLCBBTFBIQV9GbG9hdF8zMywgQUxQSEFfRmxvYXRfMzQsIEFMUEhBX0Zsb2F0XzM1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsIEFMUEhBX0Zsb2F0XzM3LCBBTFBIQV9GbG9hdF8zOCwgQUxQSEFfRmxvYXRfMzksIEFMUEhBX0Zsb2F0XzQwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDEsIEFMUEhBX0Zsb2F0XzQyLCBBTFBIQV9GbG9hdF80MywgQUxQSEFfRmxvYXRfNDQsIEFMUEhBX0Zsb2F0XzQ1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDYsIEFMUEhBX0Zsb2F0XzQ3LCBBTFBIQV9GbG9hdF80OCwgQUxQSEFfRmxvYXRfNDksIEFMUEhBX0Zsb2F0XzUwfTsKIAogICAgIC8qIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0aGUgdGltZSBjb25zdGFudCBhbmQgdGhlIHNhbXBsZSByYXRlICovCi0gICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAgLyogU3RlcmVvIHZhbHVlICovCisgICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAvKiBTdGVyZW8gdmFsdWUgKi8KICAgICBQcm9kdWN0ID0gUHJvZHVjdCArICgoKHRjICYgMHgwMDAwRkZGRikgKiAoTFZNX1VJTlQzMilGcykgPj4gMyk7CiAKLSAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7ICAgLyogTW9ubyB2YWx1ZSAqLworICAgIGlmIChOdW1DaGFubmVscyA9PSAxKSB7CisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7IC8qIE1vbm8gdmFsdWUgKi8KICAgICB9CiAKICAgICAvKiBOb3JtYWxpemUgdG8gZ2V0IHRoZSB0YWJsZSBpbmRleCBhbmQgaW50ZXJwb2xhdGlvbiBmYWN0b3IgKi8KLSAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQgPCAoKEFscGhhX1RhYmxlU2l6ZSAtIDEpIC8gMik7IFNoaWZ0KyspCi0gICAgewotICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSAhPSAwKQotICAgICAgICB7CisgICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0IDwgKChBbHBoYV9UYWJsZVNpemUgLSAxKSAvIDIpOyBTaGlmdCsrKSB7CisgICAgICAgIGlmICgoUHJvZHVjdCAmIDB4ODAwMDAwMDApICE9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0MCw4ICs5NCw3IEBACiAgICAgfQogICAgIFNoaWZ0ID0gKExWTV9VSU5UMTYpKChTaGlmdCA8PCAxKSk7CiAKLSAgICBpZiAoKFByb2R1Y3QgJiAweDQwMDAwMDAwKT09MCkKLSAgICB7CisgICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCkgPT0gMCkgewogICAgICAgICBTaGlmdCsrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuY3BwCmluZGV4IDJjM2U5ZWMuLjgzODI1MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jcHAKQEAgLTQwLDMzICs0MCwyNSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgVGhlIHJlc3VsdCBvZiB0aGUgcG9seW5vbWlhbCBleHBhbnNpb24gaW4gUTEuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotTFZNX0ZMT0FUIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgKnBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgIFgpCi17CitMVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLCBMVk1fRkxPQVQqIHBDb2VmZmljaWVudHMsIExWTV9GTE9BVCBYKSB7CiAgICAgTFZNX0lOVDMyIGk7Ci0gICAgTFZNX0ZMT0FUIFksQSxYVGVtcCxUZW1wLHNpZ247CisgICAgTFZNX0ZMT0FUIFksIEEsIFhUZW1wLCBUZW1wLCBzaWduOwogCiAgICAgWSA9ICpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KICAgICBwQ29lZmZpY2llbnRzKys7CiAKLSAgICBpZihYID09IC0xLjBmKQotICAgIHsKKyAgICBpZiAoWCA9PSAtMS4wZikgewogICAgICAgICBUZW1wID0gLTE7CiAgICAgICAgIHNpZ24gPSBUZW1wOwotICAgICAgICBmb3IoaSA9IDE7IGkgPD0gTjsgaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTjsgaSsrKSB7CiAgICAgICAgICAgICBZICs9ICgoKnBDb2VmZmljaWVudHMpICogc2lnbik7CiAgICAgICAgICAgICBwQ29lZmZpY2llbnRzKys7CiAgICAgICAgICAgICBzaWduICo9IFRlbXA7CiAgICAgICAgIH0KIAotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIFhUZW1wID0gWDsKLSAgICAgICAgZm9yKGkgPSBOLTE7IGkgPj0gMDsgaS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IE4gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgQSA9ICpwQ29lZmZpY2llbnRzOwogICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jcHAKaW5kZXggYWU4ZTlkMS4uODU1OTZhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmNwcApAQCAtNTMsMjMgKzUzLDEwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGUgcmVzdWx0IG9mIHRoZSAxMHggZXhwYW5zaW9uIGluIFE4LjI0IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1MVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUICAgICBYKQotewotICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM109ezAuOTk5OTA2ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMwMjQ3NWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42NTI3NjVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDM1NDk0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NTY2N2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41Mzc2NzZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjEzMTkyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA2OTYwM2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1NTNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MzczZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTgxN2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzNjdmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OwotICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsCi0gICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICBYKTsKK0xWTV9GTE9BVCBMVk1fUG93ZXIxMChMVk1fRkxPQVQgWCkgeworICAgIExWTV9GTE9BVCBZLCBDb2VmZmljaWVudHNbMTNdID0gezAuOTk5OTA2ZiwgMi4zMDI0NzVmLCAyLjY1Mjc2NWYsIDIuMDM1NDk0ZiwgMS4xNjU2NjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM3Njc2ZiwgMC4yMTMxOTJmLCAwLjA2OTYwM2YsIDAuMDE2NTUzZiwgMC4wMDQzNzNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxODE3ZiwgMC4wMDAzNjdmLCAwfTsKKyAgICBZID0gTFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsIENvZWZmaWNpZW50cywgWCk7CiAgICAgcmV0dXJuIFk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyLmNwcAppbmRleCA1OTk1ZjU0Li5iZTdjOGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lci5jcHAKQEAgLTI2LDE5ICsyNiwxNiBAQAogLyogIFRJTUVSIEZVTkNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBMVk1fVGltZXIgICAgICAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSApewordm9pZCBMVk1fVGltZXIoTFZNX1RpbWVyX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0lOVDE2IEJsb2NrU2l6ZSkgeworICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QqIHBJbnN0YW5jZVByOworICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QqKXBJbnN0YW5jZTsKIAotICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKnBJbnN0YW5jZVByOwotICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKilwSW5zdGFuY2U7Ci0KLSAgICBpZiAocEluc3RhbmNlUHItPlRpbWVyQXJtZWQpeworICAgIGlmIChwSW5zdGFuY2VQci0+VGltZXJBcm1lZCkgewogICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyAtPSBCbG9ja1NpemU7Ci0gICAgICAgIGlmIChwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyA8PSAwKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzIDw9IDApIHsKICAgICAgICAgICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMDsKLSAgICAgICAgICAgICgqcEluc3RhbmNlUHItPnBDYWxsQmFjaykgKCBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSApOworICAgICAgICAgICAgKCpwSW5zdGFuY2VQci0+cENhbGxCYWNrKShwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsIHBJbnN0YW5jZVByLT5wQ2FsbEJhY2tQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmNwcAppbmRleCAzMDE1MDU3Li5iZmQ2YmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuY3BwCkBAIC0zMywyMCArMzMsMjAgQEAKIC8qICBJTklUIEZVTkNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTFZNX1RpbWVyX0luaXQgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyAgICAgKXsKK3ZvaWQgTFZNX1RpbWVyX0luaXQoTFZNX1RpbWVyX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX1RpbWVyX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCogcEluc3RhbmNlUHI7CisgICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCopcEluc3RhbmNlOwogCi0gICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqcEluc3RhbmNlUHI7Ci0gICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqKXBJbnN0YW5jZTsKLQotICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtICAgICA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07Ci0gICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyAgID0gKExWTV9JTlQzMiAqKXBQYXJhbXMtPnBDYWxsQmFja1BhcmFtczsKKyAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07CisgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyA9IChMVk1fSU5UMzIqKXBQYXJhbXMtPnBDYWxsQmFja1BhcmFtczsKICAgICBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UgPSBwUGFyYW1zLT5wQ2FsbGJhY2tJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2VQci0+cENhbGxCYWNrICAgICAgICAgPSBwUGFyYW1zLT5wQ2FsbEJhY2s7Ci0gICAgcEluc3RhbmNlUHItPlRpbWVyQXJtZWQgICAgICAgID0gMTsKKyAgICBwSW5zdGFuY2VQci0+cENhbGxCYWNrID0gcFBhcmFtcy0+cENhbGxCYWNrOworICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMTsKIAotICAgIE1VTDMyeDE2SU5UTzMyKHBQYXJhbXMtPlNhbXBsaW5nUmF0ZSxPbmVPdmVyVGhvdXNhbmRJblEyNCxwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcywxNik7ICAvKiAoUTAgKiBRMjQpID4+MTYgaW50byBROCovCi0gICAgTVVMMzJ4MTZJTlRPMzIocEluc3RhbmNlUHItPlJlbWFpbmluZ1RpbWVJblNhbXBsZXMscFBhcmFtcy0+VGltZUluTXMscEluc3RhbmNlUHItPlJlbWFpbmluZ1RpbWVJblNhbXBsZXMsOCk7ICAvKiAoUTggKiBRMCkgPj44IGludG8gUTAqLworICAgIE1VTDMyeDE2SU5UTzMyKHBQYXJhbXMtPlNhbXBsaW5nUmF0ZSwgT25lT3ZlclRob3VzYW5kSW5RMjQsIHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgIDE2KTsgLyogKFEwICogUTI0KSA+PjE2IGludG8gUTgqLworICAgIE1VTDMyeDE2SU5UTzMyKHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLCBwUGFyYW1zLT5UaW1lSW5NcywKKyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcywgOCk7IC8qIChROCAqIFEwKSA+PjggaW50byBRMCovCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Qcml2YXRlLmgKaW5kZXggYTM3MmI4Mi4uM2U4YWJhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCkBAIC0yNCwxNCArMjQsMTMgQEAKIC8qICBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyICBSZW1haW5pbmdUaW1lSW5TYW1wbGVzOwotICAgIExWTV9JTlQzMiAgQ2FsbEJhY2tQYXJhbTsKLSAgICBMVk1fSU5UMzIgICpwQ2FsbEJhY2tQYXJhbXM7Ci0gICAgdm9pZCAgKnBDYWxsYmFja0luc3RhbmNlOwotICAgIHZvaWQgICgqcENhbGxCYWNrKSh2b2lkKix2b2lkKixMVk1fSU5UMzIpOwotICAgIExWTV9JTlQxNiBUaW1lckFybWVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW4sIHRydWUgYmV0d2VlbiBpbml0IGFuZCBjYWxsYmFjayAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQzMiBSZW1haW5pbmdUaW1lSW5TYW1wbGVzOworICAgIExWTV9JTlQzMiBDYWxsQmFja1BhcmFtOworICAgIExWTV9JTlQzMiogcENhbGxCYWNrUGFyYW1zOworICAgIHZvaWQqIHBDYWxsYmFja0luc3RhbmNlOworICAgIHZvaWQgKCpwQ2FsbEJhY2spKHZvaWQqLCB2b2lkKiwgTFZNX0lOVDMyKTsKKyAgICBMVk1fSU5UMTYgVGltZXJBcm1lZDsgLyogQm9vbGVhbiwgdHJ1ZSBiZXR3ZWVuIGluaXQgYW5kIGNhbGxiYWNrICovCiAKIH0gTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdDsKIApAQCAtMzksNCArMzgsNCBAQAogLyogIEVORCBPRiBIRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmICAvKiBMVk1fVElNRVJfUFJJVkFURV9IICovCisjZW5kaWYgLyogTFZNX1RJTUVSX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8xNi5jcHAKaW5kZXggZjg4Y2EwZS4uYTM5ZmEyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuY3BwCkBAIC0yNSwxNCArMjUsMTAgQEAKICAgIEZVTkNUSU9OIExvYWRDb25zdF8xNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTG9hZENvbnN0XzE2KGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKLXsKK3ZvaWQgTG9hZENvbnN0XzE2KGNvbnN0IExWTV9JTlQxNiB2YWwsIExWTV9JTlQxNiogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9JTlQxNiBpaTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAqZHN0ID0gdmFsOwogICAgICAgICBkc3QrKzsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmNwcAppbmRleCBjNzg5NzU2Li5kZjdhNTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jcHAKQEAgLTI0LDE0ICsyNCwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExvYWRDb25zdF8zMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExvYWRDb25zdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApCi17Cit2b2lkIExvYWRDb25zdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgdmFsLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgKmRzdCA9IHZhbDsKICAgICAgICAgZHN0Kys7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcAppbmRleCAxZWE3NjVhLi5hMTllNjZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcApAQCAtMjUsNTAgKzI1LDM1IEBACiAgICBGVU5DVElPTiAgTVNUTzJJX1NBVF8xNlgxNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTVNUbzJpX1NhdF8xNngxNihjb25zdCBMVk1fSU5UMTYgICpzcmNNLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgKnNyY1MsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDMyIHRlbXAsbVZhbCxzVmFsOwordm9pZCBNU1RvMmlfU2F0XzE2eDE2KGNvbnN0IExWTV9JTlQxNiogc3JjTSwgY29uc3QgTFZNX0lOVDE2KiBzcmNTLCBMVk1fSU5UMTYqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fSU5UMzIgdGVtcCwgbVZhbCwgc1ZhbDsKICAgICBMVk1fSU5UMTYgaWk7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIG1WYWw9KExWTV9JTlQzMikqc3JjTTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBtVmFsID0gKExWTV9JTlQzMikqc3JjTTsKICAgICAgICAgc3JjTSsrOwogCi0gICAgICAgIHNWYWw9KExWTV9JTlQzMikqc3JjUzsKKyAgICAgICAgc1ZhbCA9IChMVk1fSU5UMzIpKnNyY1M7CiAgICAgICAgIHNyY1MrKzsKIAogICAgICAgICB0ZW1wID0gbVZhbCArIHNWYWw7CiAKLSAgICAgICAgaWYgKHRlbXAgPiAweDAwMDA3RkZGKQotICAgICAgICB7CisgICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikgewogICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApIHsKKyAgICAgICAgICAgICpkc3QgPSAtMHg4MDAwOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKICAgICAgICAgfQogICAgICAgICBkc3QrKzsKIAogICAgICAgICB0ZW1wID0gbVZhbCAtIHNWYWw7CiAKLSAgICAgICAgaWYgKHRlbXAgPiAweDAwMDA3RkZGKQotICAgICAgICB7CisgICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikgewogICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApIHsKKyAgICAgICAgICAgICpkc3QgPSAtMHg4MDAwOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKICAgICAgICAgfQogICAgICAgICBkc3QrKzsKQEAgLTc2LDE2ICs2MSwxMSBAQAogCiAgICAgcmV0dXJuOwogfQotdm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgKnNyY00sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjUywKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKLXsKLSAgICBMVk1fRkxPQVQgdGVtcCxtVmFsLHNWYWw7Cit2b2lkIE1TVG8yaV9TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmNNLCBjb25zdCBMVk1fRkxPQVQqIHNyY1MsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIExWTV9GTE9BVCB0ZW1wLCBtVmFsLCBzVmFsOwogICAgIExWTV9JTlQxNiBpaTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICBtVmFsID0gKExWTV9GTE9BVCkqc3JjTTsKICAgICAgICAgc3JjTSsrOwogCkBAIC05NCwzMiArNzQsMjIgQEAKIAogICAgICAgICB0ZW1wID0gbVZhbCArIHNWYWw7CiAKLSAgICAgICAgaWYgKHRlbXAgPiAxLjBmKQotICAgICAgICB7CisgICAgICAgIGlmICh0ZW1wID4gMS4wZikgewogICAgICAgICAgICAgKmRzdCA9IDEuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0xLjBmKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAodGVtcCA8IC0xLjBmKSB7CiAgICAgICAgICAgICAqZHN0ID0gLTEuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOwogICAgICAgICB9CiAgICAgICAgIGRzdCsrOwogCiAgICAgICAgIHRlbXAgPSBtVmFsIC0gc1ZhbDsKIAotICAgICAgICBpZiAodGVtcCA+IDEuMGYpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHRlbXAgPiAxLjBmKSB7CiAgICAgICAgICAgICAqZHN0ID0gMS4wZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDEuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAodGVtcCA8IC0xLjBmKSB7CisgICAgICAgICAgICAqZHN0ID0gLTEuMGY7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOwogICAgICAgICB9CiAgICAgICAgIGRzdCsrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jcHAKaW5kZXggNjU4NDI1MS4uMWQ0NTBiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuY3BwCkBAIC0zNSwzNiArMzUsMjYgQEAKICAgIEZVTkNUSU9OIE1hYzNTXzE2WDE2CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBNYWMzc19TYXRfMTZ4MTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Cit2b2lkIE1hYzNzX1NhdF8xNngxNihjb25zdCBMVk1fSU5UMTYqIHNyYywgY29uc3QgTFZNX0lOVDE2IHZhbCwgTFZNX0lOVDE2KiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIExWTV9JTlQxNiBzcmN2YWw7Ci0gICAgTFZNX0lOVDMyIFRlbXAsZEluVmFsOworICAgIExWTV9JTlQzMiBUZW1wLCBkSW5WYWw7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHNyY3ZhbD0qc3JjOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIHNyY3ZhbCA9ICpzcmM7CiAgICAgICAgIHNyYysrOwogCi0gICAgICAgIFRlbXAgPSAoc3JjdmFsICp2YWwpPj4xNTsKKyAgICAgICAgVGVtcCA9IChzcmN2YWwgKiB2YWwpID4+IDE1OwogCi0gICAgICAgIGRJblZhbCAgPSAoTFZNX0lOVDMyKSpkc3Q7CisgICAgICAgIGRJblZhbCA9IChMVk1fSU5UMzIpKmRzdDsKIAogICAgICAgICBUZW1wID0gVGVtcCArIGRJblZhbDsKIAotICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKSB7CiAgICAgICAgICAgICAqZHN0ID0gMHg3RkZGOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkgeworICAgICAgICAgICAgKmRzdCA9IC0weDgwMDA7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNilUZW1wOwogICAgICAgICB9CiAKQEAgLTc1LDQgKzY1LDMgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuY3BwCmluZGV4IDVkNTU2NGYuLjBmZTlmZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmNwcApAQCAtMjYsMzMgKzI2LDI1IEBACiAgICBGVU5DVElPTiBNQUMzU18xNlgxNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTWFjM3NfU2F0XzMyeDE2KCAgY29uc3QgTFZNX0lOVDMyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgTWFjM3NfU2F0XzMyeDE2KGNvbnN0IExWTV9JTlQzMiogc3JjLCBjb25zdCBMVk1fSU5UMTYgdmFsLCBMVk1fSU5UMzIqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0lOVDMyIHNyY3ZhbCx0ZW1wLCBkSW5WYWwsIGRPdXRWYWw7CisgICAgTFZNX0lOVDMyIHNyY3ZhbCwgdGVtcCwgZEluVmFsLCBkT3V0VmFsOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBzcmN2YWw9KnNyYzsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBzcmN2YWwgPSAqc3JjOwogICAgICAgICBzcmMrKzsKIAotICAgICAgICBNVUwzMngxNklOVE8zMihzcmN2YWwsdmFsLHRlbXAsMTUpCisgICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCwgdmFsLCB0ZW1wLCAxNSkKIAotICAgICAgICAgICAgZEluVmFsICA9ICpkc3Q7CisgICAgICAgICAgICAgICAgZEluVmFsID0gKmRzdDsKICAgICAgICAgZE91dFZhbCA9IHRlbXAgKyBkSW5WYWw7CiAKLSAgICAgICAgaWYgKCgoKGRPdXRWYWwgXiB0ZW1wKSAmIChkT3V0VmFsIF4gZEluVmFsKSkgPj4gMzEpIT0wKSAgICAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KKyAgICAgICAgaWYgKCgoKGRPdXRWYWwgXiB0ZW1wKSAmIChkT3V0VmFsIF4gZEluVmFsKSkgPj4gMzEpICE9IDApIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRlbXA8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkT3V0VmFsPTB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg3RkZGRkZGRkw7CisgICAgICAgICAgICBpZiAodGVtcCA8IDApIHsKKyAgICAgICAgICAgICAgICBkT3V0VmFsID0gMHg4MDAwMDAwMEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRPdXRWYWwgPSAweDdGRkZGRkZGTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02MiwzNSArNTQsMjUgQEAKIAogICAgIHJldHVybjsKIH0KLXZvaWQgTWFjM3NfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Cit2b2lkIE1hYzNzX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgY29uc3QgTFZNX0ZMT0FUIHZhbCwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIExWTV9GTE9BVCBzcmN2YWw7Ci0gICAgTFZNX0ZMT0FUIFRlbXAsZEluVmFsOworICAgIExWTV9GTE9BVCBUZW1wLCBkSW5WYWw7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgc3JjdmFsID0gKnNyYzsKICAgICAgICAgc3JjKys7CiAKICAgICAgICAgVGVtcCA9IHNyY3ZhbCAqIHZhbDsKIAotICAgICAgICBkSW5WYWwgID0gKExWTV9GTE9BVCkqZHN0OworICAgICAgICBkSW5WYWwgPSAoTFZNX0ZMT0FUKSpkc3Q7CiAgICAgICAgIFRlbXAgPSBUZW1wICsgZEluVmFsOwogCi0gICAgICAgIGlmIChUZW1wID4gMS4wMDAwMDBmKQotICAgICAgICB7CisgICAgICAgIGlmIChUZW1wID4gMS4wMDAwMDBmKSB7CiAgICAgICAgICAgICAqZHN0ID0gMS4wMDAwMDBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wMDAwMDBmKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAoVGVtcCA8IC0xLjAwMDAwMGYpIHsKICAgICAgICAgICAgICpkc3QgPSAtMS4wMDAwMDBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKmRzdCA9IFRlbXA7CiAgICAgICAgIH0KICAgICAgICAgZHN0Kys7CkBAIC05OSw0ICs4MSwzIEBACiAgICAgcmV0dXJuOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmNwcAppbmRleCA3YzdiMzZmLi45NjYzOTk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwCkBAIC0yNiwzMyArMjYsMjkgQEAKICAgIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUUlVFICAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgICAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDMyQzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBuKQotewordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVChNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pIHsKICAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOwogCi0gICAgaWYobiA8PSAwKSAgICByZXR1cm47CisgICAgaWYgKG4gPD0gMCkgcmV0dXJuOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFNPRlQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKLSAgICAgICAgaWYocEluc3RhbmNlLT5BbHBoYSA9PSAwKXsKKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkFscGhhID09IDApIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICB9ZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgotICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKICAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CkBAIC02MywxMSArNTksMTEgQEAKICAgICAgICBIQVJEIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZiAoSGFyZE1peGluZyl7Ci0gICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCkgeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLwogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikKICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgbik7Ci0gICAgICAgICAgICBlbHNleworICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogSW4gY2FzZSB0aGUgY29yZSBmdW5jdGlvbiB3b3VsZCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLwpAQCAtODEsMTYgKzc3LDE1IEBACiAgICAgLyogQ2FsbCBiYWNrIGJlZm9yZSB0aGUgaGFyZCBtaXhpbmcsIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCBoYXJkIG1peGluZyBtYWtlcwogICAgICAgIHVzZSBvZiB0aGUgY29yZSBzb2Z0IG1peCBmdW5jdGlvbiB3aGljaCBjYW4gY2hhbmdlIHRoZSBDdXJyZW50IHZhbHVlISAgICAgICovCiAKLSAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgaWYgKHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQpIHsKICAgICAgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgotICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBDYWxsQmFjayAhPSAwKXsKLSAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKSAoIHBJbnN0YW5jZS0+cENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykocEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwCmluZGV4IGQzMzI1ZWMuLjg0MDg5NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwCkBAIC0yNiwzMyArMjYsMjkgQEAKICAgIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUUlVFICAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgICAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewordm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSB7CiAgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKIAotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChuIDw9IDApIHJldHVybjsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBTT0ZUIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKLSAgICB7Ci0gICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7CisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkgeworICAgICAgICBpZiAocEluc3RhbmNlLT5BbHBoYSA9PSAwKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgotICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgfSBlbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICAgICAgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOwpAQCAtNjMsMTQgKzU5LDEyIEBACiAgICAgICAgSEFSRCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKEhhcmRNaXhpbmcpeworICAgIGlmIChIYXJkTWl4aW5nKSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQogICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIGRzdCwgbik7Ci0gICAgICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZil7Ci0gICAgICAgICAgICBpZiAoc3JjICE9IGRzdCkKLSAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXNyYywgKExWTV9GTE9BVCopZHN0LCAoTFZNX0lOVDE2KShuKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQorICAgICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KSBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXNyYywgKExWTV9GTE9BVCopZHN0LCAoTFZNX0lOVDE2KShuKSk7CisgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgcEluc3RhbmNlLT5DdXJyZW50LCBkc3QsIG4pOwogICAgIH0KIApAQCAtNzgsMTYgKzcyLDE1IEBACiAgICAgICAgQ0FMTCBCQUNLCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCkgewogICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKShwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKaW5kZXggYjAwMjczOC4uYWJhODUzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKQEAgLTI1LDQyICsyNSwzNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotCi0gICAgaWYobiA8PSAwKSAgICByZXR1cm47Cit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoTWl4XzJTdF9DbGxfRkxPQVRfdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8IChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpCi0gICAgeworICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpIHsKICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOwotICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCgoTWl4XzFTdF9DbGxfRkxPQVRfdCAqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CiAgICAgfQogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGVsc2UKLSAgICB7CisgICAgZWxzZSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCiAgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKAotICAgICAgICAgICAgICAgICAgICAoTWl4XzFTdF9DbGxfRkxPQVRfdCAqKSAmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogbm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICAgICAgKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOwogICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCi0gICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOwogICAgIH0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKaW5kZXggMWQ2NTNiYi4uZTFlNjJjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaApAQCAtMjYsMTMgKzI2LDEzIEBACiAKICNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KIAotI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCA9ICgxMF4oMC4wMS8yMCkgLTEpICogMl4zMSAqLworI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAgICAgICAgIFwKKyAgICAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCisgICAgICAgICAgICAgICAgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmIC8vI2lmbmRlZiBfX01JWEVSX1BSSVZBVEVfSF9fCi0KKyNlbmRpZiAgLy8jaWZuZGVmIF9fTUlYRVJfUFJJVkFURV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzE2LmNwcAppbmRleCBlYWQ3OThkLi43YWI1ZDQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuY3BwCkBAIC0yNSwxNiArMjUsMTIgQEAKICAgIEZVTkNUSU9OIE1vbm9UbzJJXzE2CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBNb25vVG8ySV8xNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgTW9ub1RvMklfMTYoY29uc3QgTFZNX0lOVDE2KiBzcmMsIExWTV9JTlQxNiogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9JTlQxNiBpaTsKLSAgICBzcmMgKz0gKG4tMSk7Ci0gICAgZHN0ICs9ICgobioyKS0xKTsKKyAgICBzcmMgKz0gKG4gLSAxKTsKKyAgICBkc3QgKz0gKChuICogMikgLSAxKTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAqZHN0ID0gKnNyYzsKICAgICAgICAgZHN0LS07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmNwcAppbmRleCA2MDNkMWZjLi4xYmE2NjlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuY3BwCkBAIC0yNSwxNiArMjUsMTIgQEAKICAgIEZVTkNUSU9OIE1vbm9UbzJJXzMyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBNb25vVG8ySV8zMiggY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewordm9pZCBNb25vVG8ySV8zMihjb25zdCBMVk1fSU5UMzIqIHNyYywgTFZNX0lOVDMyKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwotICAgIHNyYyArPSAobi0xKTsKLSAgICBkc3QgKz0gKChuKjIpLTEpOworICAgIHNyYyArPSAobiAtIDEpOworICAgIGRzdCArPSAoKG4gKiAyKSAtIDEpOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICpkc3QgPSAqc3JjOwogICAgICAgICBkc3QtLTsKIApAQCAtNDUsMTYgKzQxLDEyIEBACiAKICAgICByZXR1cm47CiB9Ci12b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgTW9ub1RvMklfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9JTlQxNiBpaTsKICAgICBzcmMgKz0gKG4gLSAxKTsKICAgICBkc3QgKz0gKChuICogMikgLSAxKTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAqZHN0ID0gKnNyYzsKICAgICAgICAgZHN0LS07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuY3BwCmluZGV4IDM3MGMzOWEuLjQ1ODk3MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcApAQCAtMjYsMzcgKzI2LDI3IEBACiBGVU5DVElPTiBNVUxUM1NfMTZYMTYKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIE11bHQzc18zMngxNiggY29uc3QgTFZNX0lOVDMyICpzcmMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCi0gICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgTXVsdDNzXzMyeDE2KGNvbnN0IExWTV9JTlQzMiogc3JjLCBjb25zdCBMVk1fSU5UMTYgdmFsLCBMVk1fSU5UMzIqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0lOVDMyIHNyY3ZhbCx0ZW1wOworICAgIExWTV9JTlQzMiBzcmN2YWwsIHRlbXA7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHNyY3ZhbD0qc3JjOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIHNyY3ZhbCA9ICpzcmM7CiAgICAgICAgIHNyYysrOwogCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoc3JjdmFsLCB2YWwsIHRlbXAsIDE1KQogCi0gICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICAgICAgICAgICogZHN0ID0gdGVtcDsKICAgICAgICAgZHN0Kys7CiAgICAgfQogCiAgICAgcmV0dXJuOwogfQotdm9pZCBNdWx0M3NfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCi0gICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Cit2b2lkIE11bHQzc19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgY29uc3QgTFZNX0ZMT0FUIHZhbCwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIExWTV9GTE9BVCB0ZW1wOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIHRlbXAgPSAoKnNyYykgKiB2YWw7CiAgICAgICAgIHNyYysrOwogICAgICAgICAqZHN0ID0gdGVtcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmNwcAppbmRleCAzNmQxMTQ5Li5mYmEwNjY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuY3BwCkBAIC02MSwyMiArNjEsMTYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTm9uTGluQ29tcF9EMTYoTFZNX0lOVDE2ICAgICAgICBHYWluLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKQotewotCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgU2FtcGxlOyAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgc2FtcGxlcyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgIFNhbXBsZU5vOyAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICBUZW1wOwordm9pZCBOb25MaW5Db21wX0QxNihMVk1fSU5UMTYgR2FpbiwgTFZNX0lOVDE2KiBwRGF0YUluLCBMVk1fSU5UMTYqIHBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgQmxvY2tMZW5ndGgpIHsKKyAgICBMVk1fSU5UMTYgU2FtcGxlOyAgIC8qIElucHV0IHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgU2FtcGxlTm87IC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9JTlQxNiBUZW1wOwogCiAgICAgLyoKICAgICAgKiBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcwogICAgICAqLwotICAgIGZvcihTYW1wbGVObyA9IDA7IFNhbXBsZU5vPEJsb2NrTGVuZ3RoOyBTYW1wbGVObysrKQotICAgIHsKLQorICAgIGZvciAoU2FtcGxlTm8gPSAwOyBTYW1wbGVObyA8IEJsb2NrTGVuZ3RoOyBTYW1wbGVObysrKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFJlYWQgdGhlIGlucHV0CiAgICAgICAgICAqLwpAQCAtODgsMTUgKzgyLDExIEBACiAgICAgICAgICAqIGhhcm1vbmljIGRpc3RvcnRpb24uIFRoZSBhbW91bnQgb2YgY29tcHJlc3Npb24gaXMgY29udHJvbCBieSB0aGUKICAgICAgICAgICogZ2FpbiBmYWN0b3IKICAgICAgICAgICovCi0gICAgICAgIGlmICgoTFZNX0lOVDMyKVNhbXBsZSAhPSAtMzI3NjgpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKChMVk1fSU5UMzIpU2FtcGxlICE9IC0zMjc2OCkgewogICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMTYpKChTYW1wbGUgKiBTYW1wbGUpID4+IDE1KTsKLSAgICAgICAgICAgIGlmKFNhbXBsZSA+MCkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChTYW1wbGUgPiAwKSB7CiAgICAgICAgICAgICAgICAgU2FtcGxlID0gKExWTV9JTlQxNikoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSAtIFRlbXApKSA+PiAxNSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBTYW1wbGUgPSAoTFZNX0lOVDE2KShTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlICsgVGVtcCkpID4+IDE1KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwNiwyNSArOTYsMTggQEAKICAgICAgICAgICovCiAgICAgICAgICpwRGF0YU91dCA9IFNhbXBsZTsKICAgICAgICAgcERhdGFPdXQrKzsKLQogICAgIH0KLQogfQotdm9pZCBOb25MaW5Db21wX0Zsb2F0KExWTV9GTE9BVCAgICAgICAgR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpCi17Ci0KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICBTYW1wbGU7ICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGVzICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgU2FtcGxlTm87ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgIFRlbXA7Cit2b2lkIE5vbkxpbkNvbXBfRmxvYXQoTFZNX0ZMT0FUIEdhaW4sIExWTV9GTE9BVCogcERhdGFJbiwgTFZNX0ZMT0FUKiBwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgQmxvY2tMZW5ndGgpIHsKKyAgICBMVk1fRkxPQVQgU2FtcGxlOyAgIC8qIElucHV0IHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgU2FtcGxlTm87IC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCBUZW1wOwogCiAgICAgLyoKICAgICAgKiBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcwogICAgICAqLwotICAgIGZvcihTYW1wbGVObyA9IDA7IFNhbXBsZU5vIDwgQmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCi0gICAgeworICAgIGZvciAoU2FtcGxlTm8gPSAwOyBTYW1wbGVObyA8IEJsb2NrTGVuZ3RoOyBTYW1wbGVObysrKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFJlYWQgdGhlIGlucHV0CiAgICAgICAgICAqLwpAQCAtMTM2LDE2ICsxMTksMTIgQEAKICAgICAgICAgICogaGFybW9uaWMgZGlzdG9ydGlvbi4gVGhlIGFtb3VudCBvZiBjb21wcmVzc2lvbiBpcyBjb250cm9sIGJ5IHRoZQogICAgICAgICAgKiBnYWluIGZhY3RvcgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKFNhbXBsZSAhPSAtMS4wZikKLSAgICAgICAgeworICAgICAgICBpZiAoU2FtcGxlICE9IC0xLjBmKSB7CiAgICAgICAgICAgICBUZW1wID0gKChTYW1wbGUgKiBTYW1wbGUpKTsKLSAgICAgICAgICAgIGlmKFNhbXBsZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgKyBUZW1wKSkgKSk7CisgICAgICAgICAgICBpZiAoU2FtcGxlID4gMCkgeworICAgICAgICAgICAgICAgIFNhbXBsZSA9IChTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlIC0gVGVtcCkpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNhbXBsZSA9IChTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlICsgVGVtcCkpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuY3BwCmluZGV4IDNmNjJmOTkuLjBhZmFhZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jcHAKQEAgLTM3LDg3ICszNyw3OSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5bkwseW5SLHluTE8seW5STyx0ZW1wbDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7Cit2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9GTE9BVCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwRGF0YU91dCwgTFZNX0lOVDE2IE5yU2FtcGxlcykgeworICAgIExWTV9GTE9BVCB5bkwsIHluUiwgeW5MTywgeW5STywgdGVtcGw7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpcEluc3RhbmNlOwogCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgeworICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiB5bkw9IChBMCAgKiAoeChuKUwgLSB4KG4tMilMICApICkqLworICAgICAgICB0ZW1wbCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgIHluTCA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5bkw9IChBMCAgKiAoeChuKUwgLSB4KG4tMilMICApICkqLwotICAgICAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotICAgICAgICAgICAgeW5MID0gdGVtcGwgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworICAgICAgICAvKiB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApKSAqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07CisgICAgICAgIHluTCArPSB0ZW1wbDsKIAotICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKyAgICAgICAgLyogeW5MKz0gKCgtQjEgKiB5KG4tMSlMICApICkgKi8KKyAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICB5bkwgKz0gdGVtcGw7CiAKLSAgICAgICAgICAgIC8qIHluTCs9ICgoLUIxICogeShuLTEpTCAgKSApICovCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisgICAgICAgIC8qIHluTE89ICgoR2FpbiAqIHluTCApKSAqLworICAgICAgICB5bkxPID0geW5MICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKIAotICAgICAgICAgICAgLyogeW5MTz0gKChHYWluICogeW5MICkpICovCi0gICAgICAgICAgICB5bkxPID0geW5MICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKyAgICAgICAgLyogeW5MTz0oIHluTE8gKyB4KG4pTCAgKSovCisgICAgICAgIHluTE8gKz0gKCpwRGF0YUluKTsKIAotICAgICAgICAgICAgLyogeW5MTz0oIHluTE8gKyB4KG4pTCAgKSovCi0gICAgICAgICAgICB5bkxPICs9ICgqcERhdGFJbik7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIHluUj0gKEEwICAqICh4KG4pUiAgLSB4KG4tMilSICApICkgKi8KKyAgICAgICAgdGVtcGwgPSAoKihwRGF0YUluICsgMSkpIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICB5blIgPSB0ZW1wbCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CiAKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluUj0gKEEwICAqICh4KG4pUiAgLSB4KG4tMilSICApICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gKCoocERhdGFJbiArIDEpKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLSAgICAgICAgICAgIHluUiA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKyAgICAgICAgLyogeW5SKz0gKCgtQjIgICogeShuLTIpUiAgKSApICAqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07CisgICAgICAgIHluUiArPSB0ZW1wbDsKIAotICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgICogeShuLTIpUiAgKSApICAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOworICAgICAgICAvKiB5blIrPSAoKC1CMSAgKiB5KG4tMSlSICApICkgICAqLworICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgIHluUiArPSB0ZW1wbDsKIAotICAgICAgICAgICAgLyogeW5SKz0gKCgtQjEgICogeShuLTEpUiAgKSApICAgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKLSAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKyAgICAgICAgLyogeW5STz0gKChHYWluICAqIHluUiApKSAqLworICAgICAgICB5blJPID0geW5SICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKIAotICAgICAgICAgICAgLyogeW5STz0gKChHYWluICAqIHluUiApKSAqLwotICAgICAgICAgICAgeW5STyA9IHluUiAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisgICAgICAgIC8qIHluUk89KCB5blJPICsgeChuKVIgICkqLworICAgICAgICB5blJPICs9ICgqKHBEYXRhSW4gKyAxKSk7CiAKLSAgICAgICAgICAgIC8qIHluUk89KCB5blJPICsgeChuKVIgICkqLwotICAgICAgICAgICAgeW5STyArPSAoKihwRGF0YUluKzEpKTsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICBwRGF0YUluKys7CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgIHBEYXRhSW4rKzsKIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAvKiBVcGRhdGUgeShuLTEpUiAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5MTzsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgICAgICpwRGF0YU91dCA9IHluUk87IC8qIFdyaXRlIFJpZ2h0IG91cHV0Ki8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0KLSAgICAgICAgfQotCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgKnBEYXRhT3V0ID0geW5MTzsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLworICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAqcERhdGFPdXQgPSB5blJPOyAvKiBXcml0ZSBSaWdodCBvdXRwdXQqLworICAgICAgICBwRGF0YU91dCsrOwogICAgIH0KK30KIAotI2lmZGVmIFNVUFBPUlRfTUMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogREVMQVlTLQogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIHRvCkBAIC0xMzMsNjAgKzEyNSw1MSBAQAogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzQqTnJDaGFubmVscyAtIDFdIGlzIHkobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUIHluLCB5bk8sIHRlbXA7Ci0gICAgICAgIExWTV9JTlQxNiBpaSwgamo7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKK3ZvaWQgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBEYXRhT3V0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIHluLCB5bk8sIHRlbXA7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KXBJbnN0YW5jZTsKIAotICAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgeworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKSB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBqaiBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bj0gKEEwICAqICh4KG4pIC0geChuLTIpKSkqLworICAgICAgICAgICAgdGVtcCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKKyAgICAgICAgICAgIHluID0gdGVtcCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CiAKLSAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIGpqIENIQU5ORUwKLSAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogeW49IChBMCAgKiAoeChuKSAtIHgobi0yKSkpKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOwotICAgICAgICAgICAgICAgIHluID0gdGVtcCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisgICAgICAgICAgICAvKiB5bis9ICgoLUIyICAqIHkobi0yKSkpICovCisgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgIHluICs9IHRlbXA7CiAKLSAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIyICAqIHkobi0yKSkpICovCi0gICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOwotICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisgICAgICAgICAgICAvKiB5bis9ICgoLUIxICogeShuLTEpKSkgKi8KKyAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW4gKz0gdGVtcDsKIAotICAgICAgICAgICAgICAgIC8qIHluKz0gKCgtQjEgKiB5KG4tMSkpKSAqLwotICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKLSAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworICAgICAgICAgICAgLyogeW5PPSAoKEdhaW4gKiB5bikpICovCisgICAgICAgICAgICB5bk8gPSB5biAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CiAKLSAgICAgICAgICAgICAgICAvKiB5bk89ICgoR2FpbiAqIHluKSkgKi8KLSAgICAgICAgICAgICAgICB5bk8gPSB5biAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisgICAgICAgICAgICAvKiB5bk89KHluTyArIHgobikpKi8KKyAgICAgICAgICAgIHluTyArPSAoKnBEYXRhSW4pOwogCi0gICAgICAgICAgICAgICAgLyogeW5PPSh5bk8gKyB4KG4pKSovCi0gICAgICAgICAgICAgICAgeW5PICs9ICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KICAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSB5bjsgLyogVXBkYXRlIHkobi0xKSAqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KLSAgICAgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAgICAgICAgICAgICAgIC8qIHgobi0yKT14KG4tMSkqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdID0geW47IC8qIFVwZGF0ZSB5KG4tMSkgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKIAotICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5POyAvKiBXcml0ZSBvdXRwdXQqLwotICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IHluTzsgLyogV3JpdGUgb3V0cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CiAgICAgICAgIH0KLQogICAgIH0KLSNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcAppbmRleCA3MTRhYTUyLi4xZTA4YTU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApAQCAtMTcsNCArMTcsMyBAQAogCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggYzVmOWM3Yy4uM2Y1ZDMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjAsMTIgKzIwLDExIEBACiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCi17Ci0gIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfIHsKKyAgICBMVk1fSU5UMzIqIHBEZWxheXM7IC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0lOVDMyIGNvZWZzWzVdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IEZpbHRlcl9TdGF0ZTsKIAotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlKiBQRmlsdGVyX1N0YXRlOwogCiAjZW5kaWYgLyogX1BLXzJJX0QzMkYzMkNMTEdTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKaW5kZXggZjZjMDVkYS4uMTc4ZDc2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKQEAgLTE3LDEyICsxNywxMSBAQAogCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotdm9pZCAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOwordm9pZCBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QqIHBDb2VmKSB7CisgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdClwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzID0gKExWTV9GTE9BVCopcFRhcHM7CiAKICAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggY2M5MjRjNC4uNTdhMWMxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjEsMTkgKzIxLDE3IEBACiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCiAKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRmxvYXRfCi17Ci0gICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGVfRmxvYXQ7Cit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0Zsb2F0XyB7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlzOyAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCBjb2Vmc1s1XTsgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfSBGaWx0ZXJfU3RhdGVfRmxvYXQ7CiAKLXR5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0ICogUEZpbHRlcl9TdGF0ZV9GbG9hdCA7Ci10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCogUEZpbHRlcl9TdGF0ZV9GbG9hdDsKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfIHsKKyAgICBMVk1fSU5UMzIqIHBEZWxheXM7IC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0lOVDMyIGNvZWZzWzVdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IEZpbHRlcl9TdGF0ZTsKIAotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlKiBQRmlsdGVyX1N0YXRlOwogCiAjZW5kaWYgLyogX1BLXzJJX0QzMkYzMkNTU0dTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmNwcAppbmRleCA5N2EwNGMxLi5mNTRiYTkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuY3BwCkBAIC0yNCw1NSArMjQsMzkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBTaGlmdF9TYXRfdjMyeHYzMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFNoaWZ0X1NhdF9GbG9hdCAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKLXsKLSAgICBMVk1fRkxPQVQgICB0ZW1wOwotICAgIExWTV9JTlQzMiAgIGlpLGlqOwotICAgIExWTV9JTlQxNiAgIFJTaGlmdDsKK3ZvaWQgU2hpZnRfU2F0X0Zsb2F0KGNvbnN0IExWTV9JTlQxNiB2YWwsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBMVk1fSU5UMzIgaWksIGlqOworICAgIExWTV9JTlQxNiBSU2hpZnQ7CiAKLSAgICBpZih2YWwgPiAwKQotICAgIHsKLSAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKKyAgICBpZiAodmFsID4gMCkgeworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKnNyYzsKICAgICAgICAgICAgIHNyYysrOwotICAgICAgICAgICAgZm9yKGlqID0gMDsgaWogPCB2YWw7IGlqKyspCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlqID0gMDsgaWogPCB2YWw7IGlqKyspIHsKICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCAqIDI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKHRlbXAgPiAxLjApCi0gICAgICAgICAgICAgICAgdGVtcCA9IDEuMDsKLSAgICAgICAgICAgIGlmKHRlbXAgPCAtMS4wKQotICAgICAgICAgICAgICAgIHRlbXAgPSAtMS4wOworICAgICAgICAgICAgaWYgKHRlbXAgPiAxLjApIHRlbXAgPSAxLjA7CisgICAgICAgICAgICBpZiAodGVtcCA8IC0xLjApIHRlbXAgPSAtMS4wOwogCiAgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOwogICAgICAgICAgICAgZHN0Kys7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZih2YWwgPCAwKQotICAgIHsKLSAgICAgICAgUlNoaWZ0PShMVk1fSU5UMTYpKC12YWwpOworICAgIH0gZWxzZSBpZiAodmFsIDwgMCkgeworICAgICAgICBSU2hpZnQgPSAoTFZNX0lOVDE2KSgtdmFsKTsKIAotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgeworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKnNyYzsKICAgICAgICAgICAgIHNyYysrOwotICAgICAgICAgICAgZm9yKGlqID0gMDsgaWogPCBSU2hpZnQ7IGlqKyspCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlqID0gMDsgaWogPCBSU2hpZnQ7IGlqKyspIHsKICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCAvIDI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOwogICAgICAgICAgICAgZHN0Kys7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoc3JjICE9IGRzdCkKLSAgICAgICAgeworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzcmMgIT0gZHN0KSB7CiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmNwcAppbmRleCA0ZGEyMDEzLi4yMTQzNDY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuY3BwCkBAIC01NywxNyArNTcsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBGT1VSX09WRVJfU0lYICAgIDIxODQ2ICAgICAgICAgICAgICAgICAgLyogKDQgLyA2KSAqIDJeMTUgKi8KLSNkZWZpbmUgU0lYX0RCICAgICAgICAgICA5NiAgICAgICAgICAgICAgICAgICAgIC8qIDYgKiAxNiBvciA2ZEIgaW4gUTExLjQgZm9ybWF0ICovCi0jZGVmaW5lIEZJUlNUX0NPRUZfTkVHICAgMTQ4ODQzMDUKLSNkZWZpbmUgRklSU1RfQ09FRl9QT1MgICA3NDQyMTUyICAgICAgICAgICAgICAgIC8qIEZJUlNUX0NPRUZfTkVHIC8gMiAqLwotI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2Ci0jZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCisjZGVmaW5lIEZPVVJfT1ZFUl9TSVggMjE4NDYgLyogKDQgLyA2KSAqIDJeMTUgKi8KKyNkZWZpbmUgU0lYX0RCIDk2ICAgICAgICAgICAvKiA2ICogMTYgb3IgNmRCIGluIFExMS40IGZvcm1hdCAqLworI2RlZmluZSBGSVJTVF9DT0VGX05FRyAxNDg4NDMwNQorI2RlZmluZSBGSVJTVF9DT0VGX1BPUyA3NDQyMTUyIC8qIEZJUlNUX0NPRUZfTkVHIC8gMiAqLworI2RlZmluZSBTRUNPTkRfQ09FRiAzODgzNgorI2RlZmluZSBNQVhfVkFMVUUgMTUzNiAvKiA5NiAqIDE2ICovCiAKLUxWTV9GTE9BVCAgIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiAgICBkYl9maXgpCi17Ci0gICAgTFZNX0ZMT0FUICAgIGRCX0Zsb2F0OwotICAgIExWTV9GTE9BVCAgICBMaW5GbG9hdDsKK0xWTV9GTE9BVCBkQl90b19MaW5GbG9hdChMVk1fSU5UMTYgZGJfZml4KSB7CisgICAgTFZNX0ZMT0FUIGRCX0Zsb2F0OworICAgIExWTV9GTE9BVCBMaW5GbG9hdDsKIAogICAgIGRCX0Zsb2F0ID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVClkYl9maXggLyAxNi4wZik7CiAgICAgTGluRmxvYXQgPSBwb3coMTAsIGRCX0Zsb2F0IC8gMjAuMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmNwcAppbmRleCA0MDkyNTYwLi42NmY5MTMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jcHAKQEAgLTI1LDE2ICsyNSwxMSBAQAogICAgRlVOQ1RJT04gTVVMVDNTXzE2WDE2CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBNdWx0M3NfMTZ4MTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Cit2b2lkIE11bHQzc18xNngxNihjb25zdCBMVk1fSU5UMTYqIHNyYywgY29uc3QgTFZNX0lOVDE2IHZhbCwgTFZNX0lOVDE2KiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIExWTV9JTlQzMiB0ZW1wOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgqc3JjKSAqIChMVk1fSU5UMzIpdmFsOwogICAgICAgICBzcmMrKzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKaW5kZXggYzVkZGY3Ny4uZjFhZmNkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCkBAIC04NiwxNiArODYsOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHRhYmxlICovCi0jZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAgMCAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgIDEgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUYgICAyICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnQgcmVnaW9uICovCi0jZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAgMyAgIC8qIE9mZnNldCB0byBkYXRhIHNjcmF0Y2ggbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgIDQgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KLQogLyogQ2FsbGJhY2sgZXZlbnRzICovCi0jZGVmaW5lIExWRVFOQl9FVkVOVF9OT05FICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAvKiBOb3QgYSB2YWxpZCBldmVudCAqLwotI2RlZmluZSBMVkVRTkJfRVZFTlRfQUxHT0ZGICAgICAgICAgICAgICAgICAweDAwMDEgICAgLyogRVFOQiBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KKyNkZWZpbmUgTFZFUU5CX0VWRU5UX05PTkUgMHgwMDAwICAgLyogTm90IGEgdmFsaWQgZXZlbnQgKi8KKyNkZWZpbmUgTFZFUU5CX0VWRU5UX0FMR09GRiAweDAwMDEgLyogRVFOQiBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwNCw0MiArOTcsMjUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLXR5cGVkZWYgdm9pZCAqTFZFUU5CX0hhbmRsZV90OwordHlwZWRlZiB2b2lkKiBMVkVRTkJfSGFuZGxlX3Q7CiAKIC8qIE9wZXJhdGluZyBtb2RlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZFUU5CX0JZUEFTUyAgID0gMCwKLSAgICBMVkVRTkJfT04gICAgICAgPSAxLAotICAgIExWRVFOQl9NT0RFX01BWCA9IExWTV9NQVhJTlRfMzIKLX0gTFZFUU5CX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVkVRTkJfQllQQVNTID0gMCwgTFZFUU5CX09OID0gMSwgTFZFUU5CX01PREVfTUFYID0gTFZNX01BWElOVF8zMiB9IExWRVFOQl9Nb2RlX2VuOwogCiAvKiBGaWx0ZXIgbW9kZSBjb250cm9sICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkVRTkJfRklMVEVSX09GRiAgID0gMCwKLSAgICBMVkVRTkJfRklMVEVSX09OICAgID0gMSwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZFUU5CX0ZJTFRFUl9PRkYgPSAwLAorICAgIExWRVFOQl9GSUxURVJfT04gPSAxLAogICAgIExWRVFOQl9GSUxURVJfRFVNTVkgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9GaWx0ZXJNb2RlX2VuOwogCi0vKiBNZW1vcnkgVHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWRVFOQl9QRVJTSVNURU5UICAgICAgPSAwLAotICAgIExWRVFOQl9QRVJTSVNURU5UX0RBVEEgPSAxLAotICAgIExWRVFOQl9QRVJTSVNURU5UX0NPRUYgPSAyLAotICAgIExWRVFOQl9TQ1JBVENIICAgICAgICAgPSAzLAotICAgIExWRVFOQl9NRU1PUllfTUFYICAgICAgPSBMVk1fTUFYSU5UXzMyCi19IExWRVFOQl9NZW1vcnlUeXBlc19lbjsKLQogLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZFUU5CX1NVQ0NFU1MgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCi0gICAgTFZFUU5CX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KLSAgICBMVkVRTkJfTlVMTEFERFJFU1MgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVkVRTkJfVE9PTUFOWVNBTVBMRVMgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCi0gICAgTFZFUU5CX1NUQVRVU19NQVggICAgID0gTFZNX01BWElOVF8zMgordHlwZWRlZiBlbnVtIHsKKyAgICBMVkVRTkJfU1VDQ0VTUyA9IDAsICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLworICAgIExWRVFOQl9BTElHTk1FTlRFUlJPUiA9IDEsIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KKyAgICBMVkVRTkJfTlVMTEFERFJFU1MgPSAyLCAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWRVFOQl9UT09NQU5ZU0FNUExFUyA9IDMsIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLworICAgIExWRVFOQl9TVEFUVVNfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE2NiwzOSArMTQyLDM1IEBACiAvKgogICogU3VwcG9ydGVkIHNvdXJjZSBkYXRhIGZvcm1hdHMKICAqLwotI2RlZmluZSBMVkVRTkJfQ0FQX1NURVJFTyAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU8gICAgICAgICAgICAyCisjZGVmaW5lIExWRVFOQl9DQVBfU1RFUkVPIDEKKyNkZWZpbmUgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU8gMgogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkVRTkJfU1RFUkVPICAgICAgID0gMCwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZFUU5CX1NURVJFTyA9IDAsCiAgICAgTFZFUU5CX01PTk9JTlNURVJFTyA9IDEsCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIExWRVFOQl9NVUxUSUNIQU5ORUwgPSAyLAotI2VuZGlmCi0gICAgTFZFUU5CX1NPVVJDRV9NQVggICA9IExWTV9NQVhJTlRfMzIKKyAgICBMVkVRTkJfU09VUkNFX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX1NvdXJjZUZvcm1hdF9lbjsKIAogLyoKICAqIFN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgaW4gc2FtcGxlcyBwZXIgc2Vjb25kCiAgKi8KLSNkZWZpbmUgTFZFUU5CX0NBUF9GU184MDAwICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMTEwMjUgICAgICAgICAgICAgICAgMgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzEyMDAwICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18xNjAwMCAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMjIwNTAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18yNDAwMCAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzMyMDAwICAgICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIExWRVFOQl9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAgMTI4Ci0jZGVmaW5lIExWRVFOQl9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIExWRVFOQl9DQVBfRlNfODgyMDAgICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAgMTAyNAotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCAgICAgICAgICAgICAgIDIwNDgKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICA0MDk2CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfODAwMCAxCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTEwMjUgMgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzEyMDAwIDQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xNjAwMCA4CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMjIwNTAgMTYKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18yNDAwMCAzMgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzMyMDAwIDY0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDQxMDAgMTI4CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDgwMDAgMjU2CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfODgyMDAgNTEyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfOTYwMDAgMTAyNAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCAyMDQ4CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTkyMDAwIDQwOTYKIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZFUU5CX0ZTXzgwMDAgID0gMCwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZFUU5CX0ZTXzgwMDAgPSAwLAogICAgIExWRVFOQl9GU18xMTAyNSA9IDEsCiAgICAgTFZFUU5CX0ZTXzEyMDAwID0gMiwKICAgICBMVkVRTkJfRlNfMTYwMDAgPSAzLApAQCAtMjExLDcgKzE4Myw3IEBACiAgICAgTFZFUU5CX0ZTXzk2MDAwID0gMTAsCiAgICAgTFZFUU5CX0ZTXzE3NjQwMCA9IDExLAogICAgIExWRVFOQl9GU18xOTIwMDAgPSAxMiwKLSAgICBMVkVRTkJfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCisgICAgTFZFUU5CX0ZTX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0ZzX2VuOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIyMCw1OCArMTkyLDM4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEFsaWdubWVudDsgICAgICAgICAgICAgIC8qIFJlZ2lvbiBhbGlnbm1lbnQgaW4gYnl0ZXMgKi8KLSAgICBMVkVRTkJfTWVtb3J5VHlwZXNfZW4gICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLwotfSBMVkVRTkJfTWVtb3J5UmVnaW9uX3Q7Ci0KLS8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZFUU5CX01lbW9yeVJlZ2lvbl90ICAgICAgIFJlZ2lvbltMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCi19IExWRVFOQl9NZW1UYWJfdDsKLQogLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgR2FpbjsgICAgICAgICAgICAgICAgICAgLyogQmFuZCBnYWluIGluIGRCICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZyZXF1ZW5jeTsgICAgICAgICAgICAgIC8qIEJhbmQgY2VudHJlIGZyZXF1ZW5jeSBpbiBIeiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAvKiBCYW5kIHF1YWxpdHkgZmFjdG9yICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0lOVDE2IEdhaW47ICAgICAgIC8qIEJhbmQgZ2FpbiBpbiBkQiAqLworICAgIExWTV9VSU5UMTYgRnJlcXVlbmN5OyAvKiBCYW5kIGNlbnRyZSBmcmVxdWVuY3kgaW4gSHogKi8KKyAgICBMVk1fVUlOVDE2IFFGYWN0b3I7ICAgLyogQmFuZCBxdWFsaXR5IGZhY3RvciAqLwogfSBMVkVRTkJfQmFuZERlZl90OwogCiAvKiBQYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgIExWRVFOQl9Nb2RlX2VuICAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlOwotICAgIExWRVFOQl9Gc19lbiAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOwotICAgIExWRVFOQl9Tb3VyY2VGb3JtYXRfZW4gICAgICBTb3VyY2VGb3JtYXQ7CisgICAgTFZFUU5CX01vZGVfZW4gT3BlcmF0aW5nTW9kZTsKKyAgICBMVkVRTkJfRnNfZW4gU2FtcGxlUmF0ZTsKKyAgICBMVkVRTkJfU291cmNlRm9ybWF0X2VuIFNvdXJjZUZvcm1hdDsKIAogICAgIC8qIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE5CYW5kczsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwotICAgIExWRVFOQl9CYW5kRGVmX3QgICAgICAgICAgICAqcEJhbmREZWZpbml0aW9uOyAgICAgICAvKiBQb2ludGVyIHRvIGVxdWFsaXNlciBkZWZpbml0aW9ucyAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJDaGFubmVsczsKLSNlbmRpZgorICAgIExWTV9VSU5UMTYgTkJhbmRzOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCisgICAgTFZFUU5CX0JhbmREZWZfdCogcEJhbmREZWZpbml0aW9uOyAvKiBQb2ludGVyIHRvIGVxdWFsaXNlciBkZWZpbml0aW9ucyAqLworICAgIExWTV9JTlQxNiBOckNoYW5uZWxzOwogfSBMVkVRTkJfUGFyYW1zX3Q7CiAKIC8qIENhcGFiaWxpdHkgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOworICAgIExWTV9VSU5UMTYgU2FtcGxlUmF0ZTsKIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTb3VyY2VGb3JtYXQ7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmFuZHM7CisgICAgTFZNX1VJTlQxNiBTb3VyY2VGb3JtYXQ7CisgICAgTFZNX1VJTlQxNiBNYXhCbG9ja1NpemU7CisgICAgTFZNX1VJTlQxNiBNYXhCYW5kczsKIAogICAgIC8qIENhbGxiYWNrIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICAgICAgQ2FsbEJhY2s7ICAgICAgICAgICAgICAgLyogQnVuZGxlIGNhbGxiYWNrICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQnVuZGxlSW5zdGFuY2U7ICAgICAgIC8qIEJ1bmRsZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMVk1fQ2FsbGJhY2sgQ2FsbEJhY2s7IC8qIEJ1bmRsZSBjYWxsYmFjayAqLworICAgIHZvaWQqIHBCdW5kbGVJbnN0YW5jZTsgLyogQnVuZGxlIGluc3RhbmNlIGhhbmRsZSAqLwogCiB9IExWRVFOQl9DYXBhYmlsaXRpZXNfdDsKIApAQCAtMjgzLDc4ICsyMzUsNDMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBhbnkgb2YgcE1lbW9yeVRhYmxlIGFuZCBwQ2FwYWJpbGl0aWVzIGlzIE5VTEwgYWRkcmVzcyAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX01lbW9yeShMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIE4tQmFuZCBlcXVhbGxpc2VyIG1vZHVsZSAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLwotLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCi0vKiAgTFZFUU5CX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsaXNlciBtb2R1bGUuICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLworLyogIHBTY3JhdGNoICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYnVuZGxlIHNjcmF0Y2ggYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBXaGVuIHBDYXBhYmlsaXRpZXMgb3IgcE1lbW9yeVRhYmxlaXMgb3IgcGhJbnN0YW5jZSBhcmUgTlVMTCAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgT25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGhhcyBhIE5VTEwgYmFzZSBhZGRyZXNzICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIGZvciBhIG1lbW9yeSByZWdpb24gd2l0aCBhIG5vbi16ZXJvIHNpemUuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBwQ2FwYWJpbGl0aWVzIG9yIHBoSW5zdGFuY2UgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGFsbG9jYXRlZCBtZW1vcnkgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0luaXQoTFZFUU5CX0hhbmRsZV90KiBwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMsIHZvaWQqIHBTY3JhdGNoKTsKIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgZHVyaW5nIExWRVFOQl9Jbml0IGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZFUU5CX0RlSW5pdChMVkVRTkJfSGFuZGxlX3QqIHBoSW5zdGFuY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzc3LDggKzI5NCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRQYXJhbWV0ZXJzKExWRVFOQl9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICpwUGFyYW1zKTsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZFUU5CX1BhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQwMSw4ICszMTcsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpOworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQyNiw4ICszNDIsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfQ29udHJvbChMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpOworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfQ29udHJvbChMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkVRTkJfUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDUxLDEwICszNjYsNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgICAgICAvKiBfX0xWRVFOQl9fICovCi0KKyNlbmRpZiAvKiBfX0xWRVFOQl9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jcHAKaW5kZXggYzNjMGZhZC4uZjhhNWYyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmNwcApAQCAtMTExLDQzICsxMTEsMzcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgKnBDb2VmZmljaWVudHMpCi17Ci0KLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9HYWluVGFibGVbXTsKLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOwotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX0RUYWJsZVtdOworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgRnMsIExWRVFOQl9CYW5kRGVmX3QqIHBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZmljaWVudHMpIHsKKyAgICBleHRlcm4gTFZNX0ZMT0FUIExWRVFOQl9HYWluVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgTFZFUU5CX0RUYWJsZVtdOwogCiAgICAgLyoKICAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCiAgICAgICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluICAgICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OworICAgIExWTV9JTlQxNiBHYWluID0gcEZpbHRlckRlZmluaXRpb24tPkdhaW47CisgICAgTFZNX1VJTlQxNiBGcmVxdWVuY3kgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OwogICAgIC8qIEFzIG1lbnRpb25lZCBpbiBlZmZlY3RidW5kbGUuaCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgUUZhY3RvciAgICAgPSAoTFZNX0ZMT0FUKXBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yIC8gMTAwLjBmOworICAgIExWTV9GTE9BVCBRRmFjdG9yID0gKExWTV9GTE9BVClwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvciAvIDEwMC4wZjsKIAogICAgIC8qCiAgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwogICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBEOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworICAgIExWTV9GTE9BVCBUMDsKKyAgICBMVk1fRkxPQVQgRDsKKyAgICBMVk1fRkxPQVQgQTA7CisgICAgTFZNX0ZMT0FUIEIxOworICAgIExWTV9GTE9BVCBCMjsKIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKICAgICAgKi8KLSAgICBUMCA9IEZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107ICAgICAgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KLSAgICBpZiAoR2FpbiA+PSAwKQotICAgIHsKLSAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4gKyAxNV07ICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVkVRTkJfVHdvUGlPbkZzVGFibGVbRnNdOyAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBpZiAoR2FpbiA+PSAwKSB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlWzE1XTsgLyogRCA9IDEgICAgICAgICAgICBpZiBHYWluZEIgPj0gMCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4gKyAxNV07IC8qIEQgPSAxIC8gKDEgKyBHKSAgaWYgR2FpbmRCIDwgIDAgKi8KICAgICB9CiAKICAgICAvKgpAQCAtMTY0LDcgKzE1OCw3IEBACiAgICAgcENvZWZmaWNpZW50cy0+QTAgPSAyICogQTA7CiAgICAgcENvZWZmaWNpZW50cy0+QjEgPSAyICogQjE7CiAgICAgcENvZWZmaWNpZW50cy0+QjIgPSAyICogQjI7Ci0gICAgcENvZWZmaWNpZW50cy0+RyAgPSBMVkVRTkJfR2FpblRhYmxlW0dhaW4gKyAxNV07CisgICAgcENvZWZmaWNpZW50cy0+RyA9IExWRVFOQl9HYWluVGFibGVbR2FpbiArIDE1XTsKIAotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkVRTkJfU1VDQ0VTUyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCmluZGV4IDYzMjkxODEuLmM0NGE5YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCkBAIC0yMyw3OCArMjMsNzggQEAKIC8qIEdhaW4gdGFibGUgZm9yICgxMF4oR2Fpbi8yMCkgLSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44MjIxNzJmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjgwMDQ3NGYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzc2MTI4ZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDg4MTFmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjcxODE2MmYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjgzNzcyZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NDUxODdmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc4X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjYwMTg5M2YpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTUzMzE2ZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40OTg4MTNmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQzNzY1OWYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzY5MDQzZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yOTIwNTRmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIwNTY3MmYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTA4NzQ5ZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyMjAxOGYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ODkyNWYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxMjUzOGYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4NDg5M2YKLSNkZWZpbmUgTFZFUU5CX0dhaW5fNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5NTI2MmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIzODcyMWYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgxODM4M2YKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2MjI3OGYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk4MTA3MmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ2NjgzNmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjYyMzQxM2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgKC0wLjgyMjE3MmYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICgtMC44MDA0NzRmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxM19kQiAoLTAuNzc2MTI4ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTJfZEIgKC0wLjc0ODgxMWYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICgtMC43MTgxNjJmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMF9kQiAoLTAuNjgzNzcyZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOV9kQiAoLTAuNjQ1MTg3ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOF9kQiAoLTAuNjAxODkzZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnN19kQiAoLTAuNTUzMzE2ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNl9kQiAoLTAuNDk4ODEzZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNV9kQiAoLTAuNDM3NjU5ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNF9kQiAoLTAuMzY5MDQzZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnM19kQiAoLTAuMjkyMDU0ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMl9kQiAoLTAuMjA1NjcyZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMV9kQiAoLTAuMTA4NzQ5ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMF9kQiAwLjAwMDAwMGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMV9kQiAwLjEyMjAxOGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMl9kQiAwLjI1ODkyNWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fM19kQiAwLjQxMjUzOGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fNF9kQiAwLjU4NDg5M2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fNV9kQiAwLjc3ODI3OWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fNl9kQiAwLjk5NTI2MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fN19kQiAxLjIzODcyMWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fOF9kQiAxLjUxMTg4NmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fOV9kQiAxLjgxODM4M2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTBfZEIgMi4xNjIyNzhmCisjZGVmaW5lIExWRVFOQl9HYWluXzExX2RCIDIuNTQ4MTM0ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMl9kQiAyLjk4MTA3MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTNfZEIgMy40NjY4MzZmCisjZGVmaW5lIExWRVFOQl9HYWluXzE0X2RCIDQuMDExODcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xNV9kQiA0LjYyMzQxM2YKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGcmVxdWVuY3kgdGFibGUgZm9yIDIqUGkvRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIExWRVFOQl8yUGlPbl84MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc4NWYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTcwZgotI2RlZmluZSBMVkVRTkJfMlBpT25fMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjRmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8xNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM5M2YKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMjg1ZgotI2RlZmluZSBMVkVRTkJfMlBpT25fMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAyNjJmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8zMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDE5NmYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTQyZgotI2RlZmluZSBMVkVRTkJfMlBpT25fNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxMzFmCisjZGVmaW5lIExWRVFOQl8yUGlPbl84MDAwIDAuMDAwNzg1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTEwMjUgMC4wMDA1NzBmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMjAwMCAwLjAwMDUyNGYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE2MDAwIDAuMDAwMzkzZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMjIwNTAgMC4wMDAyODVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yNDAwMCAwLjAwMDI2MmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzMyMDAwIDAuMDAwMTk2ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fNDQxMDAgMC4wMDAxNDJmCisjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAwLjAwMDEzMWYKIAotI2RlZmluZSBMVkVRTkJfMlBpT25fODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNzFmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA2NWYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDM2ZgotI2RlZmluZSBMVkVRTkJfMlBpT25fMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzNmCisjZGVmaW5lIExWRVFOQl8yUGlPbl84ODIwMCAwLjAwMDA3MWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzk2MDAwIDAuMDAwMDY1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTc2NDAwIDAuMDAwMDM2ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTkyMDAwIDAuMDAwMDMzZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIDUwRCB0YWJsZSBmb3IgNTAgLyAoIDEgKyBHYWluICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjIzNDEzZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wMTE4NzJmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjQ2NjgzNmYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgxMDcyZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDgxMzRmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjE2MjI3OGYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzgzZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc4X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41MTE4ODZmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjIzODcyMWYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTk1MjYyZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NzgyNzlmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU4NDg5M2YKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyNTM4ZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTg5MjVmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyMjAxOGYKLSNkZWZpbmUgTFZFUU5CXzEwMERfMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAwMDAwZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNV9kQiA1LjYyMzQxM2YKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgNS4wMTE4NzJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEzX2RCIDQuNDY2ODM2ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMl9kQiAzLjk4MTA3MmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTFfZEIgMy41NDgxMzRmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEwX2RCIDMuMTYyMjc4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc5X2RCIDIuODE4MzgzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc4X2RCIDIuNTExODg2ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc3X2RCIDIuMjM4NzIxZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc2X2RCIDEuOTk1MjYyZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc1X2RCIDEuNzc4Mjc5ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc0X2RCIDEuNTg0ODkzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWczX2RCIDEuNDEyNTM4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcyX2RCIDEuMjU4OTI1ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCIDEuMTIyMDE4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF8wX2RCIDEuMDAwMDAwZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKaW5kZXggNmJiNGE3ZS4uYmNjYmU4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKQEAgLTMyLDggKzMyLDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgICAgIExPV19GUkVRICAgICAgICAgICAgMjk4ICAgICAgICAgICAgIC8qIDMyNzY4LzExMCBmb3IgbG93IHRlc3QgZnJlcXVlbmN5ICovCi0jZGVmaW5lICAgICBISUdIX0ZSRVEgICAgICAgICAgIDM4NiAgICAgICAgICAgICAvKiAzMjc2OC84NSBmb3IgaGlnaCB0ZXN0IGZyZXF1ZW5jeSAqLworI2RlZmluZSBMT1dfRlJFUSAyOTggIC8qIDMyNzY4LzExMCBmb3IgbG93IHRlc3QgZnJlcXVlbmN5ICovCisjZGVmaW5lIEhJR0hfRlJFUSAzODYgLyogMzI3NjgvODUgZm9yIGhpZ2ggdGVzdCBmcmVxdWVuY3kgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU2LDIzICs1NiwxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0UGFyYW1ldGVycyhMVkVRTkJfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAqcFBhcmFtcykKLXsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZFUU5CX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotICAgLyoKKyAgICAvKgogICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCiAgICAgICovCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgKnBQYXJhbXMgPSBwSW5zdGFuY2UtPlBhcmFtczsKIAotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkVRTkJfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NiwyMCArOTIsMTcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRDYXBhYmlsaXRpZXMoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcykKLXsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldENhcGFiaWxpdGllcyhMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcykgeworICAgIExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocENhcGFiaWxpdGllcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocENhcGFiaWxpdGllcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKICAgICB9CiAKICAgICAqcENhcGFiaWxpdGllcyA9IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzOwogCi0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWRVFOQl9TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEzNCwzMyArMTI3LDMwIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewotICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDMyICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCit2b2lkIExWRVFOQl9TZXRGaWx0ZXJzKExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWRVFOQl9QYXJhbXNfdCogcFBhcmFtcykgeworICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDMyIExWRVFOQl9TYW1wbGVSYXRlVGFiW107IC8qIFNhbXBsZSByYXRlIHRhYmxlICovCiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLwotICAgIExWTV9VSU5UMzIgICAgICAgICAgZnMgPSAoTFZNX1VJTlQzMilMVkVRTkJfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgIC8qIFNhbXBsZSByYXRlICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgUSBmYWN0b3IgKi8KKyAgICBMVk1fVUlOVDE2IGk7IC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZNX1VJTlQzMiBmcyA9CisgICAgICAgICAgICAoTFZNX1VJTlQzMilMVkVRTkJfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgLyogU2FtcGxlIHJhdGUgKi8KKyAgICBMVk1fVUlOVDMyIGZjOyAgICAgLyogRmlsdGVyIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICBMVk1fSU5UMTYgUUZhY3RvcjsgLyogRmlsdGVyIFEgZmFjdG9yICovCiAKICAgICBwSW5zdGFuY2UtPk5CYW5kcyA9IHBQYXJhbXMtPk5CYW5kczsKIAotICAgIGZvciAoaT0wOyBpPHBQYXJhbXMtPk5CYW5kczsgaSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFBhcmFtcy0+TkJhbmRzOyBpKyspIHsKICAgICAgICAgLyoKICAgICAgICAgICogR2V0IHRoZSBmaWx0ZXIgc2V0dGluZ3MKICAgICAgICAgICovCi0gICAgICAgIGZjID0gKExWTV9VSU5UMzIpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeTsgICAgIC8qIEdldCB0aGUgYmFuZCBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgICAgIFFGYWN0b3IgPSAoTFZNX0lOVDE2KXBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yOyAgIC8qIEdldCB0aGUgYmFuZCBRIGZhY3RvciAqLworICAgICAgICBmYyA9IChMVk1fVUlOVDMyKXBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3k7IC8qIEdldCB0aGUgYmFuZCBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIFFGYWN0b3IgPSAoTFZNX0lOVDE2KXBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yOyAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KIAogICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDsgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCiAKICAgICAgICAgLyoKICAgICAgICAgICogQ2hlY2sgZm9yIG91dCBvZiByYW5nZSBmcmVxdWVuY2llcwogICAgICAgICAgKi8KLSAgICAgICAgaWYgKGZjID4gKGZzID4+IDEpKQotICAgICAgICB7CisgICAgICAgIGlmIChmYyA+IChmcyA+PiAxKSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9PdXRPZlJhbmdlOwogICAgICAgICB9CiAKQEAgLTE2OCw3ICsxNTgsNiBAQAogICAgICAgICAgKiBDb3B5IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiB0byBwZXJzaXN0YW50IG1lbW9yeQogICAgICAgICAgKi8KICAgICAgICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldID0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldOwotCiAgICAgfQogfQogCkBAIC0xODYsNDYgKzE3NSwzNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSkKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLwotICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuICAgIEJpcXVhZFR5cGU7ICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmlxdWFkIHR5cGUgKi8KK3ZvaWQgTFZFUU5CX1NldENvZWZmaWNpZW50cyhMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlKSB7CisgICAgTFZNX1VJTlQxNiBpOyAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KKyAgICBMVkVRTkJfQmlxdWFkVHlwZV9lbiBCaXF1YWRUeXBlOyAvKiBGaWx0ZXIgYmlxdWFkIHR5cGUgKi8KIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZCBieSB0aGUgaW5pdCBmdW5jdGlvbgogICAgICAqLwotICAgIGZvciAoaT0wOyBpPHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kczsgaSsrKQotICAgIHsKLQorICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHM7IGkrKykgewogICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBiYW5kIHR5cGUgZm9yIGNvcnJlY3QgaW5pdGlhbGlzYXRpb24gbWV0aG9kIGFuZCByZWNhbGN1bGF0ZSB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAqLwogICAgICAgICBCaXF1YWRUeXBlID0gcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXTsKLSAgICAgICAgc3dpdGNoICAoQmlxdWFkVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisgICAgICAgIHN3aXRjaCAoQmlxdWFkVHlwZSkgeworICAgICAgICAgICAgY2FzZSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OiB7CisgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCBDb2VmZmljaWVudHM7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgTFZFUU5CX1NpbmdsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSwgJkNvZWZmaWNpZW50cyk7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0W2ldLCAmQ29lZmZpY2llbnRzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzOSwyMCArMjE5LDE5IEBACiAvKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCi17Ci0gICAgTFZNX0ZMT0FUICAgICAgICpwVGFwQWRkcmVzczsKLSAgICBMVk1fSU5UMTYgICAgICAgTnVtVGFwczsKK3ZvaWQgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlKSB7CisgICAgTFZNX0ZMT0FUKiBwVGFwQWRkcmVzczsKKyAgICBMVk1fSU5UMTYgTnVtVGFwczsKIAotICAgIHBUYXBBZGRyZXNzID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdDsKLSAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOworICAgIHBUYXBBZGRyZXNzID0gKExWTV9GTE9BVCopcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0OworICAgIE51bVRhcHMgPQorICAgICAgICAgICAgKExWTV9JTlQxNikoKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSkgLworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOwogCi0gICAgaWYgKE51bVRhcHMgIT0gMCkKLSAgICB7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGFwQWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgIGlmIChOdW1UYXBzICE9IDApIHsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcFRhcEFkZHJlc3MsIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCiAgICAgfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNzcsNTYgKzI1Niw0NyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfQ29udHJvbChMVkVRTkJfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgIGJDaGFuZ2UgICAgPSBMVk1fRkFMU0U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgaSA9IDA7Ci0gICAgTFZFUU5CX01vZGVfZW4gICAgICAgT3BlcmF0aW5nTW9kZVNhdmUgOworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfQ29udHJvbChMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkVRTkJfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2IGJDaGFuZ2UgPSBMVk1fRkFMU0U7CisgICAgTFZNX0lOVDE2IGkgPSAwOworICAgIExWRVFOQl9Nb2RlX2VuIE9wZXJhdGluZ01vZGVTYXZlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOwogICAgIH0KIAotICAgIGlmKChwUGFyYW1zLT5OQmFuZHMgIT0wKSAmJiAocFBhcmFtcy0+cEJhbmREZWZpbml0aW9uPT1MVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgocFBhcmFtcy0+TkJhbmRzICE9IDApICYmIChwUGFyYW1zLT5wQmFuZERlZmluaXRpb24gPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgT3BlcmF0aW5nTW9kZVNhdmUgPSBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlOwogCiAgICAgLyogU2V0IHRoZSBhbHBoYSBmYWN0b3Igb2YgdGhlIG1peGVyICovCi0gICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkKLSAgICB7Ci0gICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7Ci0gICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkgeworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsIChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQllQQVNTX01JWEVSX1RDLCAoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CiAgICAgfQogCi0gICAgaWYoIChwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHMgICAgICAgICAgICAhPSAgcFBhcmFtcy0+TkJhbmRzICAgICAgICAgICkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgICAgICE9ICBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICAgKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMucEJhbmREZWZpbml0aW9uICAgIT0gIHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbiApIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgICAhPSAgcFBhcmFtcy0+U2FtcGxlUmF0ZSAgICAgICkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAgICAgICE9ICBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgICAgKSkKLSAgICB7Ci0KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kcyAhPSBwUGFyYW1zLT5OQmFuZHMpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IHBQYXJhbXMtPk9wZXJhdGluZ01vZGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5wQmFuZERlZmluaXRpb24gIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IHBQYXJhbXMtPlNvdXJjZUZvcm1hdCkpIHsKICAgICAgICAgYkNoYW5nZSA9IExWTV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IoaSA9IDA7IGkgPCBwUGFyYW1zLT5OQmFuZHM7IGkrKykKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZigocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkZyZXF1ZW5jeSAgIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSApfHwKLSAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkdhaW4gICAgICAgIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkdhaW4gICAgICApfHwKLSAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLlFGYWN0b3IgICAgIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgICApKQotICAgICAgICAgICAgewotCisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQYXJhbXMtPk5CYW5kczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5GcmVxdWVuY3kgIT0KKyAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSkgfHwKKyAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkdhaW4gIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkdhaW4pIHx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5RRmFjdG9yICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yKSkgewogICAgICAgICAgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzM1LDE5ICszMDUsMTcgQEAKICAgICAvLyBEdXJpbmcgb3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiwgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbW9kZQogICAgIC8vIGlzIHN0aWxsIExWRVFOQl9PTiwgYnV0IHRoZSBlZmZlY3QgaXMgY29uc2lkZXJlZCBkaXNhYmxlZCBpbiB0aGUgdXBwZXIgbGF5ZXJzLgogICAgIC8vIG1vZGVDaGFuZ2UgaGFuZGxlcyB0aGlzIHNwZWNpYWwgcmFjZSBjb25kaXRpb24uCi0gICAgY29uc3QgaW50IC8qIGJvb2wgKi8gbW9kZUNoYW5nZSA9IHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUKLSAgICAgICAgICAgIHx8IChPcGVyYXRpbmdNb2RlU2F2ZSA9PSBMVkVRTkJfT04KLSAgICAgICAgICAgICAgICAgICAgJiYgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbgotICAgICAgICAgICAgICAgICAgICAmJiBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAwKTsKKyAgICBjb25zdCBpbnQgLyogYm9vbCAqLyBtb2RlQ2hhbmdlID0KKyAgICAgICAgICAgIHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUgfHwKKyAgICAgICAgICAgIChPcGVyYXRpbmdNb2RlU2F2ZSA9PSBMVkVRTkJfT04gJiYgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAmJgorICAgICAgICAgICAgIExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDApOwogCiAgICAgaWYgKGJDaGFuZ2UgfHwgbW9kZUNoYW5nZSkgewotCiAgICAgICAgIC8qCiAgICAgICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCBjbGVhciB0aGUgaGlzdG9yeQogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOyAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnkgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOyAvKiBDbGVhciB0aGUgaGlzdG9yeSAqLwogICAgICAgICB9CiAKICAgICAgICAgLyoKQEAgLTM1OCw0NSArMzI2LDQ1IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFJlc2V0IHRoZSBmaWx0ZXJzIGV4Y2VwdCBpZiB0aGUgYWxnbyBpcyBzd2l0Y2hlZCBvZmYKICAgICAgICAgICovCi0gICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZFUU5CX0JZUEFTUyl7CisgICAgICAgIGlmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWRVFOQl9CWVBBU1MpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBSZXNldCB0aGUgZmlsdGVycyBhcyBhbGwgcGFyYW1ldGVycyBjb3VsZCBoYXZlIGNoYW5nZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgIC8qIE5ldyBwYXJhbWV0ZXJzICovCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIGZpbHRlcnMKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhwSW5zdGFuY2UpOyAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1vZGVDaGFuZ2UpIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKSB7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMS4wZik7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMC4wZik7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogU3RheSBvbiB0aGUgT04gb3BlcmF0aW5nIG1vZGUgdW50aWwgdGhlIHRyYW5zaXRpb24gaXMgZG9uZSAqLwogICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGludHJvZHVjZSBhIHN0YXRlIHJhY2UgY29uZGl0aW9uIGlmIHRoZSBlZmZlY3QgaXMgZW5hYmxlZCBhZ2FpbgogICAgICAgICAgICAgICAgIC8vIHdoaWxlIGluIHRyYW5zaXRpb24uICBUaGlzIGlzIGZpeGVkIGluIHRoZSBtb2RlQ2hhbmdlIGxvZ2ljLgogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfT047CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMC4wZik7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JZUEFTU19NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7CiAgICAgICAgIH0KLQogICAgIH0KLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZFUU5CX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQwOCwyMyArMzc2LDIyIEBACiAvKiAgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSkKLXsKLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2sgID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2s7CitMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0pIHsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0NhbGxiYWNrIENhbGxCYWNrID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2s7CiAKLSAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOworICAgICh2b2lkKXBHZW5lcmFsUHVycG9zZTsKIAotICAgICAvKgotICAgICAgKiBTZW5kIGFuIEFMR09GRiBldmVudCBpZiB0aGUgT04tPk9GRiBzd2l0Y2ggdHJhbnNpdGlvbiBpcyBmaW5pc2hlZAotICAgICAgKi8KLSAgICBpZigoTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCkgJiYKLSAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSl7CisgICAgLyoKKyAgICAgKiBTZW5kIGFuIEFMR09GRiBldmVudCBpZiB0aGUgT04tPk9GRiBzd2l0Y2ggdHJhbnNpdGlvbiBpcyBmaW5pc2hlZAorICAgICAqLworICAgIGlmICgoTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCkgJiYKKyAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpIHsKICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7Ci0gICAgICAgIGlmIChDYWxsQmFjayAhPSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICBDYWxsQmFjayhwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLCBBTEdPUklUSE1fRVFOQl9JRHxMVkVRTkJfRVZFTlRfQUxHT0ZGKTsKKyAgICAgICAgaWYgKENhbGxCYWNrICE9IExWTV9OVUxMKSB7CisgICAgICAgICAgICBDYWxsQmFjayhwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgQUxHT1JJVEhNX0VRTkJfSUQgfCBMVkVRTkJfRVZFTlRfQUxHT0ZGKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcAppbmRleCAyNzFhOTE0Li4xZDJhNWY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcApAQCAtMjEsNiArMjEsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIkxWRVFOQi5oIgogI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiSW5zdEFsbG9jLmgiCkBAIC0yOCwyOTUgKzI5LDE0OCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGFueSBvZiBwTWVtb3J5VGFibGUgYW5kIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCBhZGRyZXNzICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfTWVtb3J5KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgSU5TVF9BTExPQyAgICAgICAgICBBbGxvY01lbTsKLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7Ci0KLSAgICBpZigocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKXx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWRVFOQl9JbnN0YW5jZV90KSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfSU5TVEFOQ0VfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0YW50IGRhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKLSAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBUYXBzICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpKTsKLSAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSkpOwotICAgICAgICAvKiBCaXF1YWQgdHlwZXMgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfREFUQV9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0YW50IGNvZWZmaWNpZW50IG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0gICAgICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0NPRUZfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgICAgICA9IExWRVFOQl9TQ1JBVENIX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0g7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgPSBMVk1fTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOwotICAgIH0KLQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIE4tQmFuZCBlcXVhbGlzZXIgbW9kdWxlICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLwotLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCi0vKiAgREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsaXNlciBtb2R1bGUuICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIFdoZW4gcENhcGFiaWxpdGllcyBvciBwTWVtb3J5VGFibGVpcyBvciBwaEluc3RhbmNlIGFyZSBOVUxMICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZm9yIGEgbWVtb3J5IHJlZ2lvbiB3aXRoIGEgbm9uLXplcm8gc2l6ZS4gICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAtIG1hbGxvYyBmYWlsdXJlICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KLS8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0luaXQoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQoteworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QqIHBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcywgdm9pZCogcFNjcmF0Y2gpIHsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlOwogCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgTWVtU2l6ZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgaTsKKyAgICAqcGhJbnN0YW5jZSA9IGNhbGxvYygxLCBzaXplb2YoKnBJbnN0YW5jZSkpOworICAgIGlmIChwaEluc3RhbmNlID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CiAKLSAgICAvKgotICAgICAqIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzCi0gICAgICovCi0gICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKKyAgICBwSW5zdGFuY2UtPnBTY3JhdGNoID0gcFNjcmF0Y2g7CisKKyAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisgICAgTFZNX1VJTlQzMiBNZW1TaXplID0gcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoKihwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0KSk7CisgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdCA9IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopY2FsbG9jKDEsIE1lbVNpemUpOworICAgIGlmIChwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0ID09IExWTV9OVUxMKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IExWRVFOQl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVkVRTkJfTlVMTEFERFJFU1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZigqKHBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdCkpKTsKKyAgICBwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQgPSAoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QqKWNhbGxvYygxLCBNZW1TaXplKTsKKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAotICAgICAqLwotCi0gICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzKTsKLQotICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sIHNpemVvZihMVkVRTkJfSW5zdGFuY2VfdCkpOworICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoKihwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMpKSk7CisgICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zID0gKExWRVFOQl9CYW5kRGVmX3QqKWNhbGxvYygxLCBNZW1TaXplKTsKKyAgICBpZiAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQotICAgIHBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQotICAgICAqLwotICAgIHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzID0gKnBDYXBhYmlsaXRpZXM7Ci0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGFuZAotICAgICAqIHNldCB0aGUgc3RydWN0dXJlIHBvaW50ZXJzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICAgICA9ICpwTWVtb3J5VGFibGU7Ci0KLSAgICAvKgotICAgICAqIEFsbG9jYXRlIGNvZWZmaWNpZW50IG1lbW9yeQotICAgICAqLwotICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzKTsKLQotICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KLSAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0ID0gKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICopCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKLQotICAgIC8qCi0gICAgICogQWxsb2NhdGUgZGF0YSBtZW1vcnkKLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyk7Ci0KLSAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7Ci0gICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ID0gKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKLSAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKTsKLSAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgID0gKExWRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOwogICAgIC8vIGNsZWFyIGFsbCB0aGUgYmFuZHMsIHNldHRpbmcgdGhlaXIgZ2FpbiB0byAwLCBvdGhlcndpc2Ugd2hlbiBhcHBseWluZyBuZXcgcGFyYW1zLAogICAgIC8vIGl0IHdpbGwgY29tcGFyZSBhZ2FpbnN0IHVuaW5pdGlhbGl6ZWQgdmFsdWVzCiAgICAgbWVtc2V0KHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucywgMCwgTWVtU2l6ZSk7Ci0gICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmlxdWFkVHlwZV9lbikpOwotICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUgPSAoTFZFUU5CX0JpcXVhZFR5cGVfZW4gKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKIAotICAgIC8qCi0gICAgICogSW50ZXJuYWxseSBtYXAsIHN0cnVjdHVyZSBhbmQgYWxsaWduIHNjcmF0Y2ggbWVtb3J5Ci0gICAgICovCi0gICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzKTsKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKCoocEluc3RhbmNlLT5wQmlxdWFkVHlwZSkpKTsKKyAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlID0gKExWRVFOQl9CaXF1YWRUeXBlX2VuKiljYWxsb2MoMSwgTWVtU2l6ZSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CiAKLSAgICBwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5ID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeSA9IChMVk1fRkxPQVQqKXBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHMgICAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgICA9IExWRVFOQl9CWVBBU1M7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX0JZUEFTUzsKICAgICBwSW5zdGFuY2UtPlBhcmFtcy5wQmFuZERlZmluaXRpb24gPSBMVk1fTlVMTDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfRlNfODAwMDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgPSBMVkVRTkJfU1RFUkVPOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgPSBMVkVRTkJfRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfU1RFUkVPOwogCiAgICAgLyoKICAgICAgKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXJzCiAgICAgICovCi0gICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZmlsdGVyIHR5cGVzICovCisgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAvKiBTZXQgdGhlIGZpbHRlciB0eXBlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CiAKLSAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKHBJbnN0YW5jZSk7ICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhwSW5zdGFuY2UpOyAvKiBTZXQgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIAotICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkocEluc3RhbmNlKTsgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgZmlsdGVyIGhpc3RvcnkgKi8KKyAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0YW5jZSk7IC8qIENsZWFyIHRoZSBmaWx0ZXIgaGlzdG9yeSAqLwogCiAgICAgLyoKICAgICAgKiBJbml0aWFsaXNlIHRoZSBieXBhc3MgdmFyaWFibGVzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9ICh2b2lkKilwSW5zdGFuY2U7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjazsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gKHZvaWQqKXBJbnN0YW5jZTsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrOwogCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAsIExWTV9GU184MDAwLCAyKTsKIAotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSAxOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayA9IExWTV9OVUxMOwogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLCAxLjBmKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLCBMVk1fRlNfODAwMCwgMik7CiAKLSAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKIAotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkVRTkJfU1VDQ0VTUyk7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgTFZFUU5CX0luaXQgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCit2b2lkIExWRVFOQl9EZUluaXQoTFZFUU5CX0hhbmRsZV90KiBwaEluc3RhbmNlKSB7CisgICAgTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZTsKKyAgICBpZiAocGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CisKKyAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisgICAgaWYgKHBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0KTsKKyAgICAgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdCA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0KTsKKyAgICAgICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMpOworICAgICAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBCaXF1YWRUeXBlKTsKKyAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZSA9IExWTV9OVUxMOworICAgIH0KKyAgICBmcmVlKHBJbnN0YW5jZSk7CisgICAgKnBoSW5zdGFuY2UgPSBMVk1fTlVMTDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAppbmRleCA0MGZhY2ZiLi44M2EzNDQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCkBAIC0yNCw3ICsyNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiTFZFUU5CLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxpbmcgb3IgQXBwbGljYXRpb24gbGF5ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkVRTkIuaCIgLyogQ2FsbGluZyBvciBBcHBsaWNhdGlvbiBsYXllciBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkxWQ19NaXhlci5oIgogCkBAIC0zNSwyMSArMzUsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEdlbmVyYWwgKi8KLSNkZWZpbmUgTFZFUU5CX0lOVkFMSUQgICAgICAgICAgICAgIDB4RkZGRiAgICAgICAgICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLwotCi0vKiBNZW1vcnkgKi8KLSNkZWZpbmUgTFZFUU5CX0lOU1RBTkNFX0FMSUdOICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgaW5zdGFuY2Ugc3RydWN0dXJlcyAqLwotI2RlZmluZSBMVkVRTkJfREFUQV9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIExWRVFOQl9DT0VGX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0vKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0jZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDIpCi0jZWxzZQotI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0jZW5kaWYKLSNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hfQUxJR04gICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCi0KLSNkZWZpbmUgTFZFUU5CX0JZUEFTU19NSVhFUl9UQyAgICAgIDEwMCAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIFRDICovCisjZGVmaW5lIExWRVFOQl9JTlZBTElEIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgTFZFUU5CX0JZUEFTU19NSVhFUl9UQyAxMDAgLyogQnlwYXNzIE1peGVyIFRDICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OCwxMyArNDUsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdCA9IC0xLAogICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb24gPSAwLAogICAgIExWRVFOQl9Eb3VibGVQcmVjaXNpb24gPSAxLAotICAgIExWRVFOQl9PdXRPZlJhbmdlICAgICAgPSAyLAotICAgIExWRVFOQl9CSVFVQURUWVBFX01BWCAgPSBMVk1fTUFYSU5UXzMyCisgICAgTFZFUU5CX091dE9mUmFuZ2UgPSAyLAorICAgIExWRVFOQl9CSVFVQURUWVBFX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0JpcXVhZFR5cGVfZW47CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzQsMjggKzYwLDI3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCi0gICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCisgICAgdm9pZCogcFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KKyAgICBMVkVRTkJfUGFyYW1zX3QgUGFyYW1zOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZFUU5CX0NhcGFiaWxpdGllc190IENhcGFiaWxpdGllczsgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBBbGlnbmVkIG1lbW9yeSBwb2ludGVycyAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAqcEZhc3RUZW1wb3Jhcnk7ICAgICAgICAvKiBGYXN0IHRlbXBvcmFyeSBkYXRhIGJhc2UgYWRkcmVzcyAqLworICAgIExWTV9GTE9BVCogcEZhc3RUZW1wb3Jhcnk7IC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCiAKLSAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwRVFOQl9UYXBzX0Zsb2F0OyAgICAgICAgLyogRXF1YWxpc2VyIFRhcHMgKi8KLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdDsgLyogU3RhdGUgZm9yIGVhY2ggZmlsdGVyIGJhbmQgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCogcEVRTkJfVGFwc19GbG9hdDsgIC8qIEVxdWFsaXNlciBUYXBzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0OyAvKiBTdGF0ZSBmb3IgZWFjaCBmaWx0ZXIgYmFuZCAqLwogCiAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zIGFuZCBjYWxsIGJhY2sgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIE5CYW5kczsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCi0gICAgTFZFUU5CX0JhbmREZWZfdCAgICAgICAgICAgICAgICAqcEJhbmREZWZpbml0aW9uczsgIC8qIEZpbHRlciBiYW5kIGRlZmluaXRpb25zICovCi0gICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgICAgICAgICAqcEJpcXVhZFR5cGU7ICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KKyAgICBMVk1fVUlOVDE2IE5CYW5kczsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKyAgICBMVkVRTkJfQmFuZERlZl90KiBwQmFuZERlZmluaXRpb25zOyAvKiBGaWx0ZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuKiBwQmlxdWFkVHlwZTsgIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KIAogICAgIC8qIEJ5cGFzcyB2YXJpYWJsZSAqLwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgQnlwYXNzTWl4ZXI7CisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0IEJ5cGFzc01peGVyOwogCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgYkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb247IC8qIE9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24gZmxhZyAqLworICAgIExWTV9JTlQxNiBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCiAKIH0gTFZFUU5CX0luc3RhbmNlX3Q7CiAKQEAgLTEwNSwxNyArOTAsMTUgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICpwUGFyYW1zKTsKK3ZvaWQgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZFUU5CX1BhcmFtc190KiBwUGFyYW1zKTsKIAotdm9pZCAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UpOwordm9pZCBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UpOwogCi12b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgKnBJbnN0YW5jZSk7Ci1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOwordm9pZCBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UpOworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgRnMsIExWRVFOQl9CYW5kRGVmX3QqIHBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZmljaWVudHMpOwogCi1MVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLCBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSk7CitMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0pOwogCiAjZW5kaWYgLyogX19MVkVRTkJfUFJJVkFURV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmNwcAppbmRleCA2NWVmZjUzLi5kMmEyNmRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmNwcApAQCAtMzQsNyArMzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBTSElGVCAgICAgICAxMworI2RlZmluZSBTSElGVCAxMwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTgsODkgKzU4LDY1IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgIE5yRnJhbWVzKQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIHRvIHVzZSBzYW1wbGVzID0gZnJhbWVzICogY2hhbm5lbHMuCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoCisgICAgICAgIExWRVFOQl9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwgTFZNX0ZMT0FUKiBwT3V0RGF0YSwKKyAgICAgICAgY29uc3QgTFZNX1VJTlQxNiBOckZyYW1lcykgeyAgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgorICAgIExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAvLyBNb25vIHBhc3NlZCBpbiBhcyBzdGVyZW8KLSAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQotICAgICAgICA/IDIgOiBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOwotI2Vsc2UKLSAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IDI7IC8vIEZDQ18yCi0jZW5kaWYKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IDEgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKICAgICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwogCi0gICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBidWZmZXJzIGFyZSAzMi1iaXQgYWxpZ25lZCAqLwotICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQotICAgIHsKKyAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkgewogICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOwogICAgIH0KIAotICAgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CisgICAgTFZNX0ZMT0FUKiBjb25zdCBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CiAKICAgICAvKgotICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQotICAgICovCi0gICAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQotICAgIHsKKyAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCisgICAgICovCisgICAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfVE9PTUFOWVNBTVBMRVM7CiAgICAgfQogCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pIHsKICAgICAgICAgLyoKICAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCiAgICAgICAgICAqLwotICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoTFZNX1VJTlQxNiBpID0gMDsgaSA8IHBJbnN0YW5jZS0+TkJhbmRzOyBpKyspCi0gICAgICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKExWTV9VSU5UMTYgaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiBiYW5kIGlzIG5vbi16ZXJvIGRCIGdhaW4KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkdhaW4gIT0gMCkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBiaXF1YWQgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CisgICAgICAgICAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiBwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CiAKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLCBwU2NyYXRjaCwgcFNjcmF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOwotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMTUwLDQ0ICsxMjYsMjcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwotI2VuZGlmCisgICAgICAgIGlmIChwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKSB7CisgICAgICAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwgcFNjcmF0Y2gsIHBJbkRhdGEsIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3aXRoIGVsc2UgY2xhdXNlKHMpCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgICAgICAgICAgICAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIE1vZGUgaXMgT0ZGIHNvIGNvcHkgdGhlIGRhdGEgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAqLwotICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLworICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkgeworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBMVkVRTkJfU1VDQ0VTUzsKLQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jcHAKaW5kZXggMDYyODExNC4uZDc5ZDdjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuY3BwCkBAIC0zNSwyMCArMzUsOSBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLwotY29uc3QgTFZNX1VJTlQzMiAgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCi19OworY29uc3QgTFZNX1VJTlQzMiBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTksNzQgKzQ4LDM0IEBACiAvKgogICogVGFibGUgZm9yIDIgKiBQaSAvIEZzCiAgKi8KLWNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzIyMDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMjQwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8zMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzg4MjAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl85NjAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTc2NDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xOTIwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IExWTV9GTE9BVCBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXSA9IHsKKyAgICAgICAgTFZFUU5CXzJQaU9uXzgwMDAsIC8qIDhrUy9zICovCisgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwgTFZFUU5CXzJQaU9uXzEyMDAwLCBMVkVRTkJfMlBpT25fMTYwMDAsICBMVkVRTkJfMlBpT25fMjIwNTAsCisgICAgICAgIExWRVFOQl8yUGlPbl8yNDAwMCwgTFZFUU5CXzJQaU9uXzMyMDAwLCBMVkVRTkJfMlBpT25fNDQxMDAsICBMVkVRTkJfMlBpT25fNDgwMDAsCisgICAgICAgIExWRVFOQl8yUGlPbl84ODIwMCwgTFZFUU5CXzJQaU9uXzk2MDAwLCBMVkVRTkJfMlBpT25fMTc2NDAwLCBMVkVRTkJfMlBpT25fMTkyMDAwfTsKIAogLyoKICAqIEdhaW4gdGFibGUKICAqLwotY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfR2FpblRhYmxlW10gPSB7TFZFUU5CX0dhaW5fTmVnMTVfZEIsICAgICAgICAvKiAtMTVkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxNF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEzX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTJfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEwX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnOV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzhfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc3X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzVfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc0X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzJfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMF9kQiwgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzJfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8zX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzVfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl82X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fN19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzhfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl85X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTBfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE1X2RCfTsgICAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLworY29uc3QgTFZNX0ZMT0FUIExWRVFOQl9HYWluVGFibGVbXSA9IHsKKyAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTVfZEIsIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsIExWRVFOQl9HYWluX05lZzEzX2RCLCBMVkVRTkJfR2Fpbl9OZWcxMl9kQiwgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCisgICAgICAgIExWRVFOQl9HYWluX05lZzEwX2RCLCBMVkVRTkJfR2Fpbl9OZWc5X2RCLCAgTFZFUU5CX0dhaW5fTmVnOF9kQiwgIExWRVFOQl9HYWluX05lZzdfZEIsCisgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsICBMVkVRTkJfR2Fpbl9OZWc1X2RCLCAgTFZFUU5CX0dhaW5fTmVnNF9kQiwgIExWRVFOQl9HYWluX05lZzNfZEIsCisgICAgICAgIExWRVFOQl9HYWluX05lZzJfZEIsICBMVkVRTkJfR2Fpbl9OZWcxX2RCLCAgTFZFUU5CX0dhaW5fMF9kQiwgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgTFZFUU5CX0dhaW5fMV9kQiwgICAgIExWRVFOQl9HYWluXzJfZEIsICAgICBMVkVRTkJfR2Fpbl8zX2RCLCAgICAgTFZFUU5CX0dhaW5fNF9kQiwKKyAgICAgICAgTFZFUU5CX0dhaW5fNV9kQiwgICAgIExWRVFOQl9HYWluXzZfZEIsICAgICBMVkVRTkJfR2Fpbl83X2RCLCAgICAgTFZFUU5CX0dhaW5fOF9kQiwKKyAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwgICAgIExWRVFOQl9HYWluXzEwX2RCLCAgICBMVkVRTkJfR2Fpbl8xMV9kQiwgICAgTFZFUU5CX0dhaW5fMTJfZEIsCisgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLCAgICBMVkVRTkJfR2Fpbl8xNF9kQiwgICAgTFZFUU5CX0dhaW5fMTVfZEJ9OyAvKiArMTVkQiBnYWluICovCiAvKgogICogRCB0YWJsZSBmb3IgMTAwIC8gKEdhaW4gKyAxKQogICovCi1jb25zdCBMVk1fRkxPQVQgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc5X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc4X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc3X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc1X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc0X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWczX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworY29uc3QgTFZNX0ZMT0FUIExWRVFOQl9EVGFibGVbXSA9IHsKKyAgICAgICAgTFZFUU5CXzEwMERfTmVnMTVfZEIsIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsIExWRVFOQl8xMDBEX05lZzEzX2RCLCBMVkVRTkJfMTAwRF9OZWcxMl9kQiwgTFZFUU5CXzEwMERfTmVnMTFfZEIsCisgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLCBMVkVRTkJfMTAwRF9OZWc5X2RCLCAgTFZFUU5CXzEwMERfTmVnOF9kQiwgIExWRVFOQl8xMDBEX05lZzdfZEIsCisgICAgICAgIExWRVFOQl8xMDBEX05lZzZfZEIsICBMVkVRTkJfMTAwRF9OZWc1X2RCLCAgTFZFUU5CXzEwMERfTmVnNF9kQiwgIExWRVFOQl8xMDBEX05lZzNfZEIsCisgICAgICAgIExWRVFOQl8xMDBEX05lZzJfZEIsICBMVkVRTkJfMTAwRF9OZWcxX2RCLCAgTFZFUU5CXzEwMERfMF9kQn07IC8qIDBkQiBnYWluICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZpbHRlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNDIsMTMgKzkxLDEzIEBACiAgKiBhIHJhbmdlIG9mIDAgdG8gUGkuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDMyNzY3IHRvIC0zMjc2OCByZXByZXNlbnRpbmcgdGhlIHJhbmdlCiAgKiArMS4wIHRvIC0xLjAKICAqLwotY29uc3QgTFZNX0lOVDE2ICAgICBMVkVRTkJfQ29zQ29lZltdID0gezMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTk3MjUsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjY3MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KK2NvbnN0IExWTV9JTlQxNiBMVkVRTkJfQ29zQ29lZltdID0gezMsICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzYsICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTk3MjUsIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjY3MSwgIC8qIGEzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgIC8qIGE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07IC8qIGE1ICovCiAKIC8qCiAgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246CkBAIC0xNjQsOSArMTEzLDggQEAKICAqCiAgKiBDb3MoeCkgPSAxLjAgLSBDb3NFcnIoeCkKICAqLwotY29uc3QgTFZNX0lOVDE2ICAgICBMVkVRTkJfRFBDb3NDb2VmW10gPSB7MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLQorY29uc3QgTFZNX0lOVDE2IExWRVFOQl9EUENvc0NvZWZbXSA9IHsxLCAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNiwgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAvKiBhMyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuaAppbmRleCBhNzFlZWI5Li5hYjUxMTk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuaApAQCAtMjcsNyArMjcsNyBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsKK2V4dGVybiBjb25zdCBMVk1fVUlOVDMyIExWRVFOQl9TYW1wbGVSYXRlVGFiW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzgsMTcgKzM4LDE3IEBACiAvKgogICogVGFibGUgZm9yIDIgKiBQaSAvIEZzCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXTsKIAogLyoKICAqIEdhaW4gdGFibGUKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX0dhaW5UYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkVRTkJfR2FpblRhYmxlW107CiAKIC8qCiAgKiBEIHRhYmxlIGZvciAxMDAgLyAoR2FpbiArIDEpCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9EVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZFUU5CX0RUYWJsZVtdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY1LDcgKzY1LDcgQEAKICAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKICAqICsxLjAgdG8gLTEuMAogICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVkVRTkJfQ29zQ29lZltdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkVRTkJfQ29zQ29lZltdOwogCiAvKgogICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgpAQCAtODEsNiArODEsNiBAQAogICoKICAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQogICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVkVRTkJfRFBDb3NDb2VmW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWRVFOQl9EUENvc0NvZWZbXTsKIAogI2VuZGlmIC8qIF9fTFZFUU5CX1RBQkxFU19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCmluZGV4IDhjOTFlYTkuLjQ4NDc4N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaApAQCAtNDEsMTEgKzQxLDExIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogR2VuZXJhbCAqLwotI2RlZmluZSBMVlJFVl9CTE9DS1NJWkVfTVVMVElQTEUgICAgICAgICAgICAgICAgMSAgICAgICAvKiBQcm9jZXNzaW5nIGJsb2NrIHNpemUgbXVsdGlwbGUgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1Q2MCAgICAgICAgICAgICAgICAgICAgICAgIDcwMDAgICAgICAgLyogTWF4aW11bSBkZWNheSB0aW1lIGlzIDcwMDBtcyAqLworI2RlZmluZSBMVlJFVl9CTE9DS1NJWkVfTVVMVElQTEUgMSAvKiBQcm9jZXNzaW5nIGJsb2NrIHNpemUgbXVsdGlwbGUgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1Q2MCA3MDAwICAgICAgICAgLyogTWF4aW11bSBkZWNheSB0aW1lIGlzIDcwMDBtcyAqLwogCiAvKiBNZW1vcnkgdGFibGUqLwotI2RlZmluZSBMVlJFVl9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgNCAgICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KKyNkZWZpbmUgTFZSRVZfTlJfTUVNT1JZX1JFR0lPTlMgNCAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUzLDI0ICs1MywyMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotdHlwZWRlZiB2b2lkICpMVlJFVl9IYW5kbGVfdDsKK3R5cGVkZWYgdm9pZCogTFZSRVZfSGFuZGxlX3Q7CiAKIC8qIFN0YXR1cyByZXR1cm4gdmFsdWVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVlJFVl9TVUNDRVNTICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVlJFVl9PVVRPRlJBTkdFICAgICAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0IG9mIHJhbmdlIGNvbnRyb2wgcGFyYW1ldGVyICovCi0gICAgTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMgID0gMywgICAgICAgICAgICAgICAgICAgICAgIC8qIEludmFsaWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFZSRVZfU1VDQ0VTUyA9IDAsICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLworICAgIExWUkVWX05VTExBRERSRVNTID0gMSwgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVlJFVl9PVVRPRlJBTkdFID0gMiwgICAgICAgIC8qIE91dCBvZiByYW5nZSBjb250cm9sIHBhcmFtZXRlciAqLworICAgIExWUkVWX0lOVkFMSUROVU1TQU1QTEVTID0gMywgLyogSW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyAqLwogICAgIExWUkVWX1JFVFVSTlNUQVRVU19EVU1NWSA9IExWTV9NQVhFTlVNCiB9IExWUkVWX1JldHVyblN0YXR1c19lbjsKIAogLyogUmV2ZXJiIGRlbGF5IGxpbmVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVlJFVl9ERUxBWUxJTkVTXzEgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogT25lIGRlbGF5IGxpbmUgKi8KLSAgICBMVlJFVl9ERUxBWUxJTkVTXzIgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHdvIGRlbGF5IGxpbmVzICovCi0gICAgTFZSRVZfREVMQVlMSU5FU180ICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvdXIgZGVsYXkgbGluZXMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFZSRVZfREVMQVlMSU5FU18xID0gMSwgLyogT25lIGRlbGF5IGxpbmUgKi8KKyAgICBMVlJFVl9ERUxBWUxJTkVTXzIgPSAyLCAvKiBUd28gZGVsYXkgbGluZXMgKi8KKyAgICBMVlJFVl9ERUxBWUxJTkVTXzQgPSA0LCAvKiBGb3VyIGRlbGF5IGxpbmVzICovCiAgICAgTFZSRVZfREVMQVlMSU5FU19EVU1NWSA9IExWTV9NQVhFTlVNCiB9IExWUkVWX051bURlbGF5TGluZXNfZW47CiAKQEAgLTgxLDQwICs3OSwzNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgUmVnaW9uW0xWUkVWX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9NZW1vcnlSZWdpb25fc3QgUmVnaW9uW0xWUkVWX05SX01FTU9SWV9SRUdJT05TXTsgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCiB9IExWUkVWX01lbW9yeVRhYmxlX3N0OwogCiAvKiBDb250cm9sIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIE9wZXJhdGluZyBtb2RlICovCi0gICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlICovCi0gICAgTFZNX0Zvcm1hdF9lbiAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsgICAgICAgICAgIC8qIFNvdXJjZSBkYXRhIGZvcm1hdCAqLworICAgIExWTV9Nb2RlX2VuIE9wZXJhdGluZ01vZGU7ICAvKiBPcGVyYXRpbmcgbW9kZSAqLworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOyAgICAgICAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9Gb3JtYXRfZW4gU291cmNlRm9ybWF0OyAvKiBTb3VyY2UgZGF0YSBmb3JtYXQgKi8KIAogICAgIC8qIFBhcmFtZXRlcnMgZm9yIFJFViAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMZXZlbDsgICAgICAgICAgICAgICAgICAvKiBMZXZlbCwgMCB0byAxMDAgcmVwcmVzZW50aW5nIHBlcmNlbnRhZ2Ugb2YgcmV2ZXJiICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIExQRjsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciwgaW4gSHogKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgSFBGOyAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyAgICBMVk1fVUlOVDE2IExldmVsOyAvKiBMZXZlbCwgMCB0byAxMDAgcmVwcmVzZW50aW5nIHBlcmNlbnRhZ2Ugb2YgcmV2ZXJiICovCisgICAgTFZNX1VJTlQzMiBMUEY7ICAgLyogTG93IHBhc3MgZmlsdGVyLCBpbiBIeiAqLworICAgIExWTV9VSU5UMzIgSFBGOyAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIsIGluIEh6ICovCiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgVDYwOyAgICAgICAgICAgICAgICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCwgaW4gbXMgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRGVuc2l0eTsgICAgICAgICAgICAgICAgLyogRWNobyBkZW5zaXR5LCAwIHRvIDEwMCBmb3IgbWluaW11bSB0byBtYXhpbXVtIGRlbnNpdHkgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRGFtcGluZzsgICAgICAgICAgICAgICAgLyogRGFtcGluZyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBSb29tU2l6ZTsgICAgICAgICAgICAgICAvKiBTaW11bGF0ZWQgcm9vbSBzaXplLCAxIHRvIDEwMCBmb3IgbWluaW11bSB0byBtYXhpbXVtIHNpemUgKi8KKyAgICBMVk1fVUlOVDE2IFQ2MDsgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50LCBpbiBtcyAqLworICAgIExWTV9VSU5UMTYgRGVuc2l0eTsgIC8qIEVjaG8gZGVuc2l0eSwgMCB0byAxMDAgZm9yIG1pbmltdW0gdG8gbWF4aW11bSBkZW5zaXR5ICovCisgICAgTFZNX1VJTlQxNiBEYW1waW5nOyAgLyogRGFtcGluZyAqLworICAgIExWTV9VSU5UMTYgUm9vbVNpemU7IC8qIFNpbXVsYXRlZCByb29tIHNpemUsIDEgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gc2l6ZSAqLwogCiB9IExWUkVWX0NvbnRyb2xQYXJhbXNfc3Q7CiAKIC8qIEluc3RhbmNlIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogR2VuZXJhbCAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7ICAgICAgICAgICAvKiBNYXhpbXVtIHByb2Nlc3NpbmcgYmxvY2sgc2l6ZSAqLworICAgIExWTV9VSU5UMTYgTWF4QmxvY2tTaXplOyAvKiBNYXhpbXVtIHByb2Nlc3NpbmcgYmxvY2sgc2l6ZSAqLwogCiAgICAgLyogUmV2ZXJiICovCi0gICAgTFZNX0Zvcm1hdF9lbiAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsgICAgICAgICAgIC8qIFNvdXJjZSBkYXRhIGZvcm1hdHMgdG8gc3VwcG9ydCAqLwotICAgIExWUkVWX051bURlbGF5TGluZXNfZW4gICAgICBOdW1EZWxheXM7ICAgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRlbGF5IGxpbmVzLCAxLCAyIG9yIDQgKi8KKyAgICBMVk1fRm9ybWF0X2VuIFNvdXJjZUZvcm1hdDsgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0cyB0byBzdXBwb3J0ICovCisgICAgTFZSRVZfTnVtRGVsYXlMaW5lc19lbiBOdW1EZWxheXM7IC8qIFRoZSBudW1iZXIgb2YgZGVsYXkgbGluZXMsIDEsIDIgb3IgNCAqLwogCiB9IExWUkVWX0luc3RhbmNlUGFyYW1zX3N0OwogCkBAIC0xNjAsOSArMTU1LDkgQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRNZW1vcnlUYWJsZShMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAqcEluc3RhbmNlUGFyYW1zKTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRNZW1vcnlUYWJsZShMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QqIHBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCogcEluc3RhbmNlUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE5MCw5ICsxODUsOSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgKnBJbnN0YW5jZVBhcmFtcyk7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUoTFZSRVZfSGFuZGxlX3QqIHBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QqIHBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCogcEluc3RhbmNlUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIxNCw4ICsyMDksOCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwQ29udHJvbFBhcmFtcyk7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QqIHBDb250cm9sUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIzNiw4ICsyMzEsOCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwTmV3UGFyYW1zKTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCogcE5ld1BhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yNTcsNyArMjUyLDcgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyhMVlJFVl9IYW5kbGVfdCAgaEluc3RhbmNlKTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyhMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjgwLDExICsyNzUsOSBAQAogLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBjb25zdCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgICAgICAvKiBfX0xWUkVWX0hfXyAqLworI2VuZGlmIC8qIF9fTFZSRVZfSF9fICovCiAKIC8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuY3BwCmluZGV4IDFmMGQzOWIuLjczN2VmMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuY3BwCkBAIC00MSwxNjAgKzQxLDEzNCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCi17Ci0KLSAgICBMVk1fTW9kZV9lbiAgT3BlcmF0aW5nTW9kZTsKLSAgICBMVk1fSU5UMzIgICAgTnVtYmVyT2ZEZWxheUxpbmVzOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MoTFZSRVZfSW5zdGFuY2Vfc3QqIHBQcml2YXRlKSB7CisgICAgTFZNX01vZGVfZW4gT3BlcmF0aW5nTW9kZTsKKyAgICBMVk1fSU5UMzIgTnVtYmVyT2ZEZWxheUxpbmVzOwogCiAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLwotICAgIGlmKHBQcml2YXRlID09IExWTV9OVUxMKQotICAgIHsKKyAgICBpZiAocFByaXZhdGUgPT0gTFZNX05VTEwpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOwogICAgIH0KIAogICAgIE9wZXJhdGluZ01vZGUgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGU7CiAKLSAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICB7CisgICAgaWYgKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KSB7CiAgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgeworICAgIH0gZWxzZSBpZiAocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpIHsKICAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBoaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cwogICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuSFBGKSAgICAgICAgfHwKLSAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7Ci0gICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkhQRikgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpKSB7CisgICAgICAgIExWTV9GTE9BVCBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCBDb2VmZnM7CiAKICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CiAgICAgICAgIExWTV9GT19IUEYoT21lZ2EsICZDb2VmZnMpOwotICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgJkNvZWZmcyk7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLAorICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5IUENvZWZzLCAmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCopJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCkgLyBzaXplb2YoTFZNX0ZMT0FUKSk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGxvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMKICAgICAgKi8KLSAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxQRikgICAgICAgIHx8Ci0gICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICAgICAgIE9tZWdhOwotICAgICAgICBGT19GTE9BVF9Db2Vmc190ICBDb2VmZnM7CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MUEYpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKSkgeworICAgICAgICBMVk1fRkxPQVQgT21lZ2E7CisgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgQ29lZmZzOwogCiAgICAgICAgIENvZWZmcy5BMCA9IDE7CiAgICAgICAgIENvZWZmcy5BMSA9IDA7CiAgICAgICAgIENvZWZmcy5CMSA9IDA7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQotICAgICAgICB7CisgICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiA8PSAoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkgewogICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBEbyBub3QgYXBwbHkgZmlsdGVyIGlmIHcgPTIqcGkqZmMvZnMgPj0gMi45CiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKE9tZWdhIDw9IChMVk1fRkxPQVQpTFZSRVZfMl85X0lOUTI5KQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKE9tZWdhIDw9IChMVk1fRkxPQVQpTFZSRVZfMl85X0lOUTI5KSB7CiAgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsICZDb2VmZnMpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywKKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywgJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCiAgICAgICovCi0gICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCi0gICAgeworICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB7CiAgICAgICAgIC8qIFJvb20gc2l6ZSByYW5nZSBpcyAxMG1zIHRvIDIwMG1zCiAgICAgICAgICAqIDAlICAgLS0gMTBtcwogICAgICAgICAgKiA1MCUgIC0tIDY1bXMKICAgICAgICAgICogMTAwJSAtLSAxMjBtcwogICAgICAgICAgKi8KLSAgICAgICAgcFByaXZhdGUtPlJvb21TaXplSW5tcyA9IDEwICsgKCgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSoxMSkgKyA1KSAvIDEwKTsKKyAgICAgICAgcFByaXZhdGUtPlJvb21TaXplSW5tcyA9IDEwICsgKCgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAqIDExKSArIDUpIC8gMTApOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBUIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzIGFuZCB0aGUgYWxsIHBhc3MgZGVsYXkgbnVtYmVyIG9mIHNhbXBsZXMKICAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKICAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0KLSAgICAgICAgTFZNX1VJTlQzMiAgVGVtcDsKLSAgICAgICAgTFZNX0lOVDMyICAgQVBEZWxheVNpemU7Ci0gICAgICAgIExWTV9JTlQzMiAgIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7Ci0gICAgICAgIExWTV9VSU5UMzIgIERlbGF5TGVuZ3RoU2FtcGxlcyA9IChMVk1fVUlOVDMyKShGcyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMpOwotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OwotICAgICAgICBMVk1fSU5UMTYgICBNYXhUX0RlbGF5W10gID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QyX0RFTEFZLCBMVlJFVl9NQVhfVDNfREVMQVl9OwotICAgICAgICBMVk1fSU5UMTYgICBNYXhBUF9EZWxheVtdID0ge0xWUkVWX01BWF9BUDBfREVMQVksIExWUkVWX01BWF9BUDFfREVMQVksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfQVAyX0RFTEFZLCBMVlJFVl9NQVhfQVAzX0RFTEFZfTsKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKSkgeworICAgICAgICBMVk1fVUlOVDMyIFRlbXA7CisgICAgICAgIExWTV9JTlQzMiBBUERlbGF5U2l6ZTsKKyAgICAgICAgTFZNX0lOVDMyIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9VSU5UMzIgRGVsYXlMZW5ndGhTYW1wbGVzID0gKExWTV9VSU5UMzIpKEZzICogcFByaXZhdGUtPlJvb21TaXplSW5tcyk7CisgICAgICAgIExWTV9JTlQxNiBpOworICAgICAgICBMVk1fRkxPQVQgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKKyAgICAgICAgTFZNX0lOVDE2IE1heFRfRGVsYXlbXSA9IHtMVlJFVl9NQVhfVDBfREVMQVksIExWUkVWX01BWF9UMV9ERUxBWSwgTFZSRVZfTUFYX1QyX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9UM19ERUxBWX07CisgICAgICAgIExWTV9JTlQxNiBNYXhBUF9EZWxheVtdID0ge0xWUkVWX01BWF9BUDBfREVMQVksIExWUkVWX01BWF9BUDFfREVMQVksIExWUkVWX01BWF9BUDJfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9BUDNfREVMQVl9OwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKICAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDE7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIFRlbXAxOyAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KIAotICAgICAgICAgICAgICAgIFRlbXAxPShMVk1fRkxPQVQpRGVsYXlMZW5ndGhTYW1wbGVzOworICAgICAgICAgICAgICAgIFRlbXAxID0gKExWTV9GTE9BVClEZWxheUxlbmd0aFNhbXBsZXM7CiAgICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fVUlOVDMyKShUZW1wMSAqIFNjYWxlVGFibGVbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gRGVsYXlMZW5ndGhTYW1wbGVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgVGVtcCA9IERlbGF5TGVuZ3RoU2FtcGxlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFQRGVsYXlTaXplID0gVGVtcCAgLyAxNTAwOworICAgICAgICAgICAgQVBEZWxheVNpemUgPSBUZW1wIC8gMTUwMDsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFNldCB0aGUgZml4ZWQgZGVsYXkKICAgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICBUZW1wICA9IChNYXhUX0RlbGF5W2ldIC0gTWF4QVBfRGVsYXlbaV0pICogRnMgLyAxOTIwMDA7CisgICAgICAgICAgICBUZW1wID0gKE1heFRfRGVsYXlbaV0gLSBNYXhBUF9EZWxheVtpXSkgKiBGcyAvIDE5MjAwMDsKICAgICAgICAgICAgIHBQcml2YXRlLT5EZWxheV9BUFtpXSA9IHBQcml2YXRlLT5UW2ldIC0gVGVtcDsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFNldCB0aGUgdGFwIHNlbGVjdGlvbgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gdGFwIEIgKi8KLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbaV0gPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gVGVtcCAtIEFQRGVsYXlTaXplXTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gPSBBUERlbGF5U2l6ZTsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAwOwogICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDEuMGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBCIHRvIHRhcCBBICovCi0gICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXAgLSBBUERlbGF5U2l6ZV07Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2ldID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFRlbXAgLSBBUERlbGF5U2l6ZV07CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldID0gQVBEZWxheVNpemU7CiAgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMDsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAxLjBmOwogICAgICAgICAgICAgfQpAQCAtMjAyLDIyICsxNzYsMTcgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBTZXQgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSB0byB0aGUgc21hbGxlc3QgZGVsYXkgc2l6ZQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuICAgPSBUZW1wOwotICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0pCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldKSB7CiAgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0pIHsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKQotICAgICAgICB7CisgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOwogICAgICAgICB9CiAKQEAgLTIyNiw4ICsxOTUsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLwogICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPk1heEJsa0xlbiAtIDI7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplKQotICAgICAgICB7CisgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZSkgewogICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IChMVk1fSU5UMzIpcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTIzNSwzOSArMjAzLDMwIEBACiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGxvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudAogICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRhbXBpbmcpICAgIHx8CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGFtcGluZykgfHwKICAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0KLSAgICAgICAgTFZNX0lOVDMyICAgICAgIFRlbXA7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOwotICAgICAgICBMVk1fSU5UMTYgICAgICAgaTsKLSAgICAgICAgTFZNX0lOVDE2ICAgICAgIERhbXBpbmcgICAgICA9IChMVk1fSU5UMTYpKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgKiAxMDApICsgMTAwMCk7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyXzBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfM19vbl80fTsKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKSkgeworICAgICAgICBMVk1fSU5UMzIgVGVtcDsKKyAgICAgICAgTFZNX0ZMT0FUIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190IENvZWZmczsKKyAgICAgICAgTFZNX0lOVDE2IGk7CisgICAgICAgIExWTV9JTlQxNiBEYW1waW5nID0gKExWTV9JTlQxNikoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAqIDEwMCkgKyAxMDAwKTsKKyAgICAgICAgTFZNX0ZMT0FUIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl8yX29uXzQsIExWUkVWX1RfM19Qb3dlcl8zX29uXzR9OwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIGZpbHRlcgogICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHsKICAgICAgICAgICAgICAgICBUZW1wID0gKExWTV9JTlQzMikoU2NhbGVUYWJsZVtpXSAqIERhbXBpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBUZW1wID0gRGFtcGluZzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFRlbXAgPD0gKExWTV9JTlQzMikoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChUZW1wIDw9IChMVk1fSU5UMzIpKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpIHsKICAgICAgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShUZW1wLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOwogICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBDb2VmZnMuQTAgPSAxOwogICAgICAgICAgICAgICAgIENvZWZmcy5BMSA9IDA7CiAgICAgICAgICAgICAgICAgQ29lZmZzLkIxID0gMDsKQEAgLTI4MCwyNyArMjM5LDIzIEBACiAgICAgLyoKICAgICAgKiBVcGRhdGUgQWxsLXBhc3MgZmlsdGVyIG1peGVyIHRpbWUgY29uc3RhbnRzCiAgICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpIHx8CiAgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQxNiAgIGk7Ci0gICAgICAgIExWTV9GTE9BVCAgIEFscGhhOwotICAgICAgICBMVk1fRkxPQVQgICBBbHBoYVRhcDsKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSkgeworICAgICAgICBMVk1fSU5UMTYgaTsKKyAgICAgICAgTFZNX0ZMT0FUIEFscGhhOworICAgICAgICBMVk1fRkxPQVQgQWxwaGFUYXA7CiAKICAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIDEpOwogCiAgICAgICAgIEFscGhhVGFwID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RBUF9UQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgMSk7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTEgICAgICAgPSBBbHBoYVRhcDsKLSAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGEyICAgICAgID0gQWxwaGFUYXA7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5BbHBoYSAgICA9IEFscGhhOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMSA9IEFscGhhVGFwOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTIgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkFscGhhID0gQWxwaGE7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5BbHBoYSA9IEFscGhhOwogICAgICAgICB9CiAgICAgfQpAQCAtMzA4LDE1MCArMjYzLDEyMSBAQAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBmZWVkIGJhY2sgZ2FpbgogICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAogICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSAgICAgICAgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgeworICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpKSB7CisgICAgICAgIExWTV9GTE9BVCBHWzRdOyAvKiBGZWVkYmFjayBnYWluIChRNy4yNCkgKi8KIAotICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBHWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmVlZGJhY2sgZ2FpbiAoUTcuMjQpICovCi0KLSAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPT0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPT0gMCkgewogICAgICAgICAgICAgR1szXSA9IDA7CiAgICAgICAgICAgICBHWzJdID0gMDsKICAgICAgICAgICAgIEdbMV0gPSAwOwogICAgICAgICAgICAgR1swXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wMTsKLSAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXAyOwotICAgICAgICAgICAgTFZNX0lOVDE2ICAgaTsKLSAgICAgICAgICAgIExWTV9GTE9BVCAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDE7CisgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDI7CisgICAgICAgICAgICBMVk1fSU5UMTYgaTsKKyAgICAgICAgICAgIExWTV9GTE9BVCBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQotICAgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgVGVtcDEgPSAoMyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgKiBTY2FsZVRhYmxlW2ldKSAvIHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwOwotICAgICAgICAgICAgICAgIGlmKFRlbXAxID49ICg0KSkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAxID49ICg0KSkgewogICAgICAgICAgICAgICAgICAgICBHW2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZigoVGVtcDEgPj0gKDIpKSkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoVGVtcDEgPj0gKDIpKSkgewogICAgICAgICAgICAgICAgICAgICBUZW1wMiA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7CiAgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSAvIDIuMGYpKTsKICAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBUZW1wMSAqIFRlbXAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoTnVtYmVyT2ZEZWxheUxpbmVzID09IDEpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChOdW1iZXJPZkRlbGF5TGluZXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICBHW2ldID0gVGVtcDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXBHOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCBUZW1wRzsKICAgICAgICAgICAgICAgICAgICAgVGVtcEcgPSBUZW1wMSAqIE9ORV9PVkVSX1NRUlRfVFdPOwotICAgICAgICAgICAgICAgICAgICBHW2ldPVRlbXBHOworICAgICAgICAgICAgICAgICAgICBHW2ldID0gVGVtcEc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyogU2V0IHVwIHRoZSBmZWVkYmFjayBtaXhlcnMgZm9yIGZvdXIgZGVsYXkgbGluZXMgKi8KLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMF0uVGFyZ2V0PUdbMF07Ci0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzFdLlRhcmdldD1HWzFdOwotICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsyXS5UYXJnZXQ9R1syXTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbM10uVGFyZ2V0PUdbM107CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzBdLlRhcmdldCA9IEdbMF07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzFdLlRhcmdldCA9IEdbMV07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldCA9IEdbMl07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLlRhcmdldCA9IEdbM107CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgogICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyIEluZGV4PTA7CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkpIHsKKyAgICAgICAgTFZNX0lOVDMyIEluZGV4ID0gMDsKICAgICAgICAgTFZNX0ZMT0FUIEluZGV4X0ZMT0FUOwotICAgICAgICBMVk1fSU5UMzIgaT0wOwotICAgICAgICBMVk1fRkxPQVQgR2Fpbj0wOwotICAgICAgICBMVk1fSU5UMzIgUm9vbVNpemU9MDsKKyAgICAgICAgTFZNX0lOVDMyIGkgPSAwOworICAgICAgICBMVk1fRkxPQVQgR2FpbiA9IDA7CisgICAgICAgIExWTV9JTlQzMiBSb29tU2l6ZSA9IDA7CiAgICAgICAgIExWTV9GTE9BVCBUNjA7CiAgICAgICAgIExWTV9GTE9BVCBDb2Vmc1s1XTsKIAotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplID09IDApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgPT0gMCkgewogICAgICAgICAgICAgUm9vbVNpemUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUm9vbVNpemUgPSAoTFZNX0lOVDMyKXBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemU7CiAgICAgICAgIH0KIAotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA8IDEwMCkKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPCAxMDApIHsKICAgICAgICAgICAgIFQ2MCA9IDEwMCAqIExWUkVWX1Q2MF9TQ0FMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFQ2MCA9IHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICogTFZSRVZfVDYwX1NDQUxFOwogICAgICAgICB9CiAKICAgICAgICAgLyogRmluZCB0aGUgbmVhcmVzdCByb29tIHNpemUgaW4gdGFibGUgKi8KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoUm9vbVNpemUgPD0gTFZSRVZfR2FpblBvbHlUYWJsZVtpXVswXSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChSb29tU2l6ZSA8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKSB7CiAgICAgICAgICAgICAgICAgSW5kZXggPSBpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYoUm9vbVNpemUgPT0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0pCi0gICAgICAgIHsKKyAgICAgICAgaWYgKFJvb21TaXplID09IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdKSB7CiAgICAgICAgICAgICAvKiBUYWtlIHRhYmxlIHZhbHVlcyBpZiB0aGUgcm9vbSBzaXplIGlzIGluIHRhYmxlICovCi0gICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgICAgIENvZWZzW2kgLSAxXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29lZnNbNF0gPSAwOwotICAgICAgICAgICAgR2FpbiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgICAvKiBRLjI0IHJlc3VsdCAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICAgICAgR2FpbiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAvKiBRLjI0IHJlc3VsdCAqLworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIGdhaW4gYmV0d2VlbiBuZWFyZXN0IHJvb20gc2l6ZXMgKi8KIAotICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW4xLEdhaW4yOwotICAgICAgICAgICAgTFZNX0lOVDMyIFRvdF9EaXN0LERpc3Q7CisgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbjEsIEdhaW4yOworICAgICAgICAgICAgTFZNX0lOVDMyIFRvdF9EaXN0LCBEaXN0OwogCi0gICAgICAgICAgICBUb3RfRGlzdCA9IChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4LTFdWzBdOworICAgICAgICAgICAgVG90X0Rpc3QgPSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSAtCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVswXTsKICAgICAgICAgICAgIERpc3QgPSBSb29tU2l6ZSAtIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVswXTsKIAogICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIGZpcnN0ICovCi0gICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1baV07CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ29lZnNbaSAtIDFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleCAtIDFdW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29lZnNbNF0gPSAwOwogCi0gICAgICAgICAgICBHYWluMSA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgICAgICBHYWluMSA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAvKiBRLjI0IHJlc3VsdCAqLwogCiAgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3Igc2Vjb25kICovCi0gICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgICAgIENvZWZzW2kgLSAxXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29lZnNbNF0gPSAwOwogCi0gICAgICAgICAgICBHYWluMiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgICAgICBHYWluMiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAvKiBRLjI0IHJlc3VsdCAqLwogCiAgICAgICAgICAgICAvKiBMaW5lYXIgSW50ZXJwb2xhdGUgdGhlIGdhaW4gKi8KICAgICAgICAgICAgIEdhaW4gPSBHYWluMSArICgoKEdhaW4yIC0gR2FpbjEpICogRGlzdCkgLyAoVG90X0Rpc3QpKTsKQEAgLTQ2MSwzMiArMzg3LDI3IEBACiAgICAgICAgICAqIEdldCB0aGUgaW52ZXJzZSBvZiBnYWluOiBRLjE1CiAgICAgICAgICAqIEdhaW4gaXMgbW9zdGx5IGFib3ZlIG9uZSBleGNlcHQgZmV3IGNhc2VzLCB0YWtlIG9ubHkgZ2FpbnMgYWJvdmUgMQogICAgICAgICAgKi8KLSAgICAgICAgaWYoR2FpbiA8IDEpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKEdhaW4gPCAxKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDEgLyBHYWluOwogICAgICAgICB9CiAKICAgICAgICAgSW5kZXhfRkxPQVQgPSAxMDAuMGYgLyAoTFZNX0ZMT0FUKSgxMDAgKyBwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKTsKICAgICAgICAgcFByaXZhdGUtPkdhaW4gPSBwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUOwotICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbipJbmRleF9GTE9BVCkgLyAyOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUKSAvIDI7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGFsbCBwYXNzIGNvbWIgZmlsdGVyIGNvZWZmaWNpZW50CiAgICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fRkxPQVQgICBiID0gKExWTV9GTE9BVClwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgKiBMVlJFVl9CXzhfb25fMTAwMDsKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpKSB7CisgICAgICAgIExWTV9JTlQxNiBpOworICAgICAgICBMVk1fRkxPQVQgYiA9IChMVk1fRkxPQVQpcFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICogTFZSRVZfQl84X29uXzEwMDA7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uVGFyZ2V0ICAgID0gYjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uVGFyZ2V0ID0gYjsKICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLlRhcmdldCA9IGI7CiAgICAgICAgIH0KICAgICB9CkBAIC00OTQsMTEgKzQxNSwxMCBAQAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudAogICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSAgIHx8Ci0gICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgTU9OTyBmb3JtYXQgKi8KLSAgICAgICAgTFZNX0ZMT0FUICAgIEFscGhhOworICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkpIHsKKyAgICAgICAgTFZNX1VJTlQxNiBOdW1DaGFubmVscyA9IDE7IC8qIEFzc3VtZSBNT05PIGZvcm1hdCAqLworICAgICAgICBMVk1fRkxPQVQgQWxwaGE7CiAKICAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0ZFRURCQUNLTUlYRVJfVEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKQEAgLTUwOCw2NyArNDI4LDU1IEBACiAgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLkFscGhhID0gQWxwaGE7CiAgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLkFscGhhID0gQWxwaGE7CiAKLSAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsd2F5cyBzdGVyZW8gb3V0cHV0ICovCi0gICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0JZUEFTU01JWEVSX1RDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgTnVtQ2hhbm5lbHMpOworICAgICAgICBOdW1DaGFubmVscyA9IDI7IC8qIEFsd2F5cyBzdGVyZW8gb3V0cHV0ICovCisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KAorICAgICAgICAgICAgICAgIExWUkVWX0JZUEFTU01JWEVSX1RDLCBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICBOdW1DaGFubmVscyk7CiAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTIgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOwotICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLkFscGhhICAgID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5BbHBoYSA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0YXJnZXRzCiAgICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAmJgotICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSkKLSAgICB7Ci0gICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCApIC8gMTAwLjBmOworICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgJiYKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikpIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKSAvIDEwMC4wZjsKICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOwotICAgICAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgJiYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApICYmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSAwKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkKLSAgICB7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7CisgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlKSB7CisgICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCkgLyAxMDAuMGY7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CiAKICAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7Ci0gICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047Ci0gICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQotICAgICAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgewogICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX0ZBTFNFKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICA9IDAuMDMxMjVmOworICAgICAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgPSAwLjAzMTI1ZjsKICAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiAgSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgdG8gQXBwbHlOZXcgc2V0dGluZ3MgZm9yY2UgdGhlIGN1cnJlbnQgdG8gdGhlIHRhcmdldCBcCiAgICAgICAgIHRvIGJlZ2luIGltbWVkaWF0ZSBwbGF5YmFjayBvZiB0aGUgZWZmZWN0ICovCi0gICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkgewogICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MTsKICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDI7CiAgICAgfQpAQCAtNTgyLDggKzQ5MCw3IEBACiAgICAgLyoKICAgICAgKiBVcGRhdGUgZmxhZwogICAgICAqLwotICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQotICAgIHsKKyAgICBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgcFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPSBMVk1fRkFMU0U7CiAgICAgfQogCkBAIC02MDYsMTIgKzUxMyw5IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sgKHZvaWQgKnBDYWxsYmFja0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEdlbmVyYWxQdXJwb3NlICkKLXsKLQotICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKilwQ2FsbGJhY2tEYXRhOworTFZNX0lOVDMyIEJ5cGFzc01peGVyX0NhbGxiYWNrKHZvaWQqIHBDYWxsYmFja0RhdGEsIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgR2VuZXJhbFB1cnBvc2UpIHsKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCogcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QqKXBDYWxsYmFja0RhdGE7CiAKICAgICAvKgogICAgICAqIEF2b2lkIGJ1aWxkIHdhcm5pbmdzCkBAIC02MjMsMTEgKzUyNywxMCBAQAogICAgICAqIFR1cm4gb2ZmCiAgICAgICovCiAgICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgICAgICAgICAgICAgID0gTFZNX1RSVUU7CisgICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX1RSVUU7CiAgICAgTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoKExWUkVWX0hhbmRsZV90KXBDYWxsYmFja0RhdGEpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmNwcAppbmRleCA1ODY1MzlmLi41YzgzY2U1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuY3BwCkBAIC00MSwxNyArNDEsMTQgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyhMVlJFVl9IYW5kbGVfdCAgaEluc3RhbmNlKQotewotCi0gICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSkgeworICAgIExWUkVWX0luc3RhbmNlX3N0KiBwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwogICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKICAgICB9CiAKQEAgLTU5LDE4ICs1NiwxMyBAQAogICAgICAqIENsZWFyIGFsbCBmaWx0ZXIgdGFwIGRhdGEsIGRlbGF5LWxpbmVzIGFuZCBvdGhlciBzaWduYWwgcmVsYXRlZCBkYXRhCiAgICAgICovCiAKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsCi0gICAgICAgIDIpOwotICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywKLSAgICAgICAgMik7Ci0gICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgewotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAyKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgMik7CisgICAgaWYgKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KSB7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzNdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKIAogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOwogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOwpAQCAtNzgsMTggKzcwLDE2IEBACiAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CiAgICAgfQogCi0gICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgewotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworICAgIGlmICgoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID49IExWUkVWX0RFTEFZTElORVNfMikgeworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKIAogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOwogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOwogICAgIH0KIAotICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPj0gTFZSRVZfREVMQVlMSU5FU18xKQotICAgIHsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKKyAgICBpZiAoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzEpIHsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOwogICAgIH0KICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmNwcAppbmRleCBlMGIwMTQyLi5mODU4Yjc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwCkBAIC00MiwxNyArNDIsMTQgQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcENvbnRyb2xQYXJhbXMpCi17Ci0KLSAgICBMVlJFVl9JbnN0YW5jZV9zdCAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0KiBwQ29udHJvbFBhcmFtcykgeworICAgIExWUkVWX0luc3RhbmNlX3N0KiBwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocENvbnRyb2xQYXJhbXMgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmNwcAppbmRleCA2OGY4ODNhLi5iNWRiMjNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuY3BwCkBAIC00NSwzNSArNDUsMjkgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZShMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgICpwSW5zdGFuY2VQYXJhbXMpCi17Ci0KLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBTbG93RGF0YTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBGYXN0RGF0YTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBGYXN0Q29lZjsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBUZW1wb3Jhcnk7Ci0gICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICAgKnBMVlJFVl9Qcml2YXRlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGk7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90KiBwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01lbW9yeVRhYmxlX3N0KiBwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QqIHBJbnN0YW5jZVBhcmFtcykgeworICAgIElOU1RfQUxMT0MgU2xvd0RhdGE7CisgICAgSU5TVF9BTExPQyBGYXN0RGF0YTsKKyAgICBJTlNUX0FMTE9DIEZhc3RDb2VmOworICAgIElOU1RfQUxMT0MgVGVtcG9yYXJ5OworICAgIExWUkVWX0luc3RhbmNlX3N0KiBwTFZSRVZfUHJpdmF0ZTsKKyAgICBMVk1fSU5UMTYgaTsKKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKICAgICAgKi8KICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CiAgICAgfQogICAgIC8qIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTFZSRVZfTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oTFZSRVZfTlVMTEFERFJFU1MpOworICAgIGZvciAoaSA9IDA7IGkgPCBMVlJFVl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplICE9IDApIHsKKyAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKExWUkVWX05VTExBRERSRVNTKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTgyLDEwMSArNzYsODEgQEAKICAgICAgKiBDaGVjayBhbGwgaW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKICAgICAgKi8KICAgICAvKiBDaGVjayBmb3IgYSBub24temVybyBibG9jayBzaXplICovCi0gICAgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplID09IDApCi0gICAgeworICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAogICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLwotICAgIGlmICgocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18xKSYmCi0gICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpJiYKLSAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfNCkpCi0gICAgeworICAgIGlmICgocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18xKSAmJgorICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18yKSAmJgorICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU180KSkgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKICAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyk7Ci0gICAgSW5zdEFsbG9jX0luaXQoJkZhc3REYXRhLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCZGYXN0Q29lZiwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdERhdGEsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdENvZWYsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzKTsKICAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyk7CiAKICAgICAvKgogICAgICAqIFplcm8gYWxsIG1lbW9yeSByZWdpb25zCiAgICAgICovCi0gICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKSAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOwotICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpIC8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0gICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoCisgICAgICAgICAgICAwLCAoTFZNX0ZMT0FUKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoCisgICAgICAgICAgICAwLCAoTFZNX0ZMT0FUKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoCisgICAgICAgICAgICAwLCAoTFZNX0ZMT0FUKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoCisgICAgICAgICAgICAwLCAoTFZNX0ZMT0FUKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKICAgICAvKgogICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCiAgICAgICovCi0gICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKICAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7CiAgICAgfQotICAgIHBMVlJFVl9Qcml2YXRlICAgICAgICAgICAgICA9KExWUkVWX0luc3RhbmNlX3N0ICopKnBoSW5zdGFuY2U7CisgICAgcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QqKSpwaEluc3RhbmNlOwogICAgIHBMVlJFVl9Qcml2YXRlLT5NZW1vcnlUYWJsZSA9ICpwTWVtb3J5VGFibGU7CiAKLSAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfNCkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkgewogICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAzX0RFTEFZOwotICAgIH0KLSAgICBlbHNlIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU18yKQotICAgIHsKKyAgICB9IGVsc2UgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikgewogICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAxX0RFTEFZOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDBfREVMQVk7CiAgICAgfQogCi0gICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOworICAgIGlmIChNYXhCbG9ja1NpemUgPiBwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSkgeworICAgICAgICBNYXhCbG9ja1NpemUgPSBwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgZGF0YSwgY29lZmZpY2llbnQgYW5kIHRlbXBvcmFyeSBtZW1vcnkgcG9pbnRlcnMKICAgICAgKi8KICAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEgPSAoTFZSRVZfRmFzdERhdGFfc3QgKikKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOwotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICB7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgICAgPQotICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdICAgICA9Ci0gICAgICAgICAgICAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMl9ERUxBWSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gICAgID0KLSAgICAgICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgICAgPQotICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhID0KKyAgICAgICAgICAgIChMVlJFVl9GYXN0RGF0YV9zdCopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOworICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdID0KKyAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0gPQorICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSA9CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdID0KKyAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwogCi0gICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCi0gICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9CisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOwogICAgICAgICB9CiAKICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgTFZSRVZfTUFYX1QzX0RFTEFZKTsKQEAgLTE4NSw2MCArMTU5LDUwIEBACiAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CiAgICAgfQogCi0gICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQotICAgIHsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdICA9IChMVk1fRkxPQVQgKikKLSAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSAoTFZNX0ZMT0FUICopCi0gICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdID0KKyAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gPQorICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CiAKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0KKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7CiAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKICAgICB9CiAKLSAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpCi0gICAgewotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gPQorICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CiAKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTsgaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHsKICAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0KKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CiAgICAgfQogICAgIC8qIEFsbC1wYXNzIGRlbGF5IGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCi0gICAgcExWUkVWX1ByaXZhdGUtPlRbMF0gICAgICAgICA9IExWUkVWX01BWF9UMF9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+VFsxXSAgICAgICAgID0gTFZSRVZfTUFYX1QxX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5UWzJdICAgICAgICAgPSBMVlJFVl9NQVhfVDJfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPlRbM10gICAgICAgICA9IExWUkVWX01BWF9UM19ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsgICAgICAgLyogU2VsZWN0IHNtb290aGluZyBBIHRvIEIgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFswXSA9IExWUkVWX01BWF9UMF9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFsxXSA9IExWUkVWX01BWF9UMV9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFsyXSA9IExWUkVWX01BWF9UMl9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFszXSA9IExWUkVWX01BWF9UM19ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsgLyogU2VsZWN0IHNtb290aGluZyBBIHRvIEIgKi8KIAogICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdENvZWYgICAgICAgPQotICAgICAgICAoTFZSRVZfRmFzdENvZWZfc3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0Q29lZiwgc2l6ZW9mKExWUkVWX0Zhc3RDb2VmX3N0KSk7CisgICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0Q29lZiA9CisgICAgICAgICAgICAoTFZSRVZfRmFzdENvZWZfc3QqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3RDb2VmLCBzaXplb2YoTFZSRVZfRmFzdENvZWZfc3QpKTsKICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCAgICAgICAgPQotICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggPQorICAgICAgICAgICAgKExWTV9GTE9BVCopSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CiAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmUgZm9yIGVuZCBtaXggKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0KLSAgICAgICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlID0KKyAgICAgICAgICAgIChMVk1fRkxPQVQqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUsIChMVk1fSU5UMTYpKE1heEJsb2NrU2l6ZSAqIDIpKTsKIAogICAgIC8qCkBAIC0yNDksOTEgKzIxMyw5MCBAQAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwYXJhbWV0ZXJzIHRvIGludmFsaWQKICAgICAgKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlICAgID0gTFZNX0ZTX0lOVkFMSUQ7CisgICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSA9IExWTV9GU19JTlZBTElEOwogICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9EVU1NWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgID0gTFZNX1NPVVJDRV9EVU1NWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVk1fU09VUkNFX0RVTU1ZOwogCi0gICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyAgICAgICAgICAgICA9IExWTV9GQUxTRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICAgICAgID0gTFZNX1RSVUU7Ci0gICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOworICAgIHBMVlJFVl9Qcml2YXRlLT5iRmlyc3RDb250cm9sID0gTFZNX1RSVUU7CisgICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOwogCiAgICAgLyoKICAgICAgKiBTZXQgbWl4ZXIgcGFyYW1ldGVycwogICAgICAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMiAgICAgID0gMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMiAgICA9IHBMVlJFVl9Qcml2YXRlOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UyICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazIgICAgICAgICAgPSBCeXBhc3NNaXhlcl9DYWxsYmFjazsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyICAgICAgICA9IExWTV9GQUxTRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDIgICAgICAgICAgICA9IDA7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgICAgICAgICAgICAgPSAwOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMSAgICAgID0gMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMSAgICA9IExWTV9OVUxMOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UxICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazEgICAgICAgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQxICAgICAgICA9IExWTV9GQUxTRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgICAgICAgICAgICA9IDB4MDAwMDAwMDA7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgICAgICAgICAgICAgPSAweDAwMDAwMDAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMiA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsYmFja0hhbmRsZTIgPSBwTFZSRVZfUHJpdmF0ZTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucEdlbmVyYWxQdXJwb3NlMiA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbEJhY2syID0gQnlwYXNzTWl4ZXJfQ2FsbGJhY2s7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDIgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tQYXJhbTEgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbGJhY2tIYW5kbGUxID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBHZW5lcmFsUHVycG9zZTEgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxCYWNrMSA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDEgPSBMVk1fRkFMU0U7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQxID0gMHgwMDAwMDAwMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CiAKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Um9vbVNpemVJbm1zICAgICAgICAgICAgICAgICAgICA9IDEwMDsgIC8vIDEwMCBtc2VjCisgICAgcExWUkVWX1ByaXZhdGUtPlJvb21TaXplSW5tcyA9IDEwMDsgIC8vIDEwMCBtc2VjCiAKICAgICAvKgogICAgICAqICBTZXQgdGhlIG91dHB1dCBnYWluIG1peGVyIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBHZW5lcmFsUHVycG9zZSAgICA9IExWTV9OVUxMOwotICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1NldCAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAwLjAzMTI1ZjsvLzB4MDNmZmZmZmY7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgICAgICAgICAgPSAwLjAzMTI1ZjsvLzB4MDNmZmZmZmY7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrU2V0ID0gTFZNX0ZBTFNFOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ3VycmVudCA9IDAuMDMxMjVmOyAgLy8gMHgwM2ZmZmZmZjsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IDAuMDMxMjVmOyAgIC8vIDB4MDNmZmZmZmY7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgQWxsLVBhc3MgRmlsdGVyIG1peGVycwogICAgICAqLwotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cE9mZnNldEFbaV0gPSBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV07CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wT2Zmc2V0QltpXSA9IHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXTsKICAgICAgICAgLyogRGVsYXkgdGFwIHNlbGVjdGlvbiBtaXhlciAqLwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0yICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0yID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbGJhY2tIYW5kbGUyID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucEdlbmVyYWxQdXJwb3NlMiA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazIgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDIgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkN1cnJlbnQyICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0xICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazIgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDIgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0xID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbGJhY2tIYW5kbGUxID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucEdlbmVyYWxQdXJwb3NlMSA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazEgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDEgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkN1cnJlbnQxICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgICAgICAgICAgPSAxOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazEgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDEgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDEgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAxOwogICAgICAgICAvKiBGZWVkZm9yd2FyZCBtaXhlciAqLwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DYWxsYmFja1BhcmFtICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBHZW5lcmFsUHVycG9zZSA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbEJhY2sgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tTZXQgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DdXJyZW50ICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tTZXQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLkN1cnJlbnQgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgPSAwOwogICAgICAgICAvKiBGZWVkYmFjayBtaXhlciAqLwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1BhcmFtICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLnBHZW5lcmFsUHVycG9zZSA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbEJhY2sgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uQ2FsbGJhY2tTZXQgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DdXJyZW50ICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5UYXJnZXQgICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uQ2FsbGJhY2tTZXQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkN1cnJlbnQgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5UYXJnZXQgPSAwOwogICAgICAgICAvKiBGZWVkYmFjayBnYWluIG1peGVyICovCi0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrUGFyYW0gICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbGJhY2tIYW5kbGUgID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBHZW5lcmFsUHVycG9zZSAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucENhbGxCYWNrICAgICAgICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5DYWxsYmFja1NldCAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5DdXJyZW50ICAgICAgICAgID0gMDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uVGFyZ2V0ICAgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrUGFyYW0gPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5DYWxsYmFja1NldCA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uQ3VycmVudCA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLlRhcmdldCA9IDA7CiAgICAgfQogICAgIC8qIERlbGF5IHRhcCBpbmRleCAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVswXSA9IExWUkVWX01BWF9BUDBfREVMQVk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jcHAKaW5kZXggZjU5OTMzYy4uMmMxZTA0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmNwcApAQCAtNTYsNDYgKzU2LDQwIEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0TWVtb3J5VGFibGUoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgKnBJbnN0YW5jZVBhcmFtcykKLXsKLQotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFNsb3dEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3REYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3RDb2VmOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFRlbXBvcmFyeTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRNZW1vcnlUYWJsZShMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QqIHBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCogcEluc3RhbmNlUGFyYW1zKSB7CisgICAgSU5TVF9BTExPQyBTbG93RGF0YTsKKyAgICBJTlNUX0FMTE9DIEZhc3REYXRhOworICAgIElOU1RfQUxMT0MgRmFzdENvZWY7CisgICAgSU5TVF9BTExPQyBUZW1wb3Jhcnk7CisgICAgTFZNX0lOVDE2IGk7CisgICAgTFZNX1VJTlQxNiBNYXhCbG9ja1NpemU7CiAKICAgICAvKgogICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCiAgICAgICovCiAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLwotICAgIGlmIChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4oTFZSRVZfTlVMTEFERFJFU1MpOworICAgIGlmIChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIChMVlJFVl9OVUxMQUREUkVTUyk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDaGVjayBhbGwgaW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlUGFyYW1zICE9IExWTV9OVUxMKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlUGFyYW1zICE9IExWTV9OVUxMKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIENhbGwgZm9yIG1lbW9yeSBhbGxvY2F0aW9uLCBzbyBjaGVjayB0aGUgcGFyYW1ldGVycwogICAgICAgICAgKi8KICAgICAgICAgLyogQ2hlY2sgZm9yIGEgbm9uLXplcm8gYmxvY2sgc2l6ZSAqLwotICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemUgPT0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemUgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBudW1iZXIgb2YgZGVsYXkgbGluZXMgKi8KICAgICAgICAgaWYgKChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzEpICYmCiAgICAgICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18yKSAmJgotICAgICAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfNCkpCi0gICAgICAgIHsKKyAgICAgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzQpKSB7CiAgICAgICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMyw4NiArOTcsNzUgQEAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKICAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdERhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdENvZWYsICAodm9pZCAqKUxWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICh2b2lkKilMVk1fTlVMTCk7CisgICAgSW5zdEFsbG9jX0luaXQoJkZhc3REYXRhLCAodm9pZCopTFZNX05VTEwpOworICAgIEluc3RBbGxvY19Jbml0KCZGYXN0Q29lZiwgKHZvaWQqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCAodm9pZCopTFZNX05VTEwpOwogCiAgICAgLyoKICAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKICAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIENoZWNrIGZvciBudWxsIHBvaW50ZXJzCiAgICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZSRVZfTlVMTEFERFJFU1MpOworICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gKExWUkVWX05VTExBRERSRVNTKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNlbGVjdCB0aGUgbWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplCiAgICAgICAgICAqLwotICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfNCkKLSAgICAgICAgeworICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KSB7CiAgICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAzX0RFTEFZOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT1MVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIGlmIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpIHsKICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAwX0RFTEFZOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXhCbG9ja1NpemU9cEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemU7CisgICAgICAgIGlmIChNYXhCbG9ja1NpemUgPiBwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSkgeworICAgICAgICAgICAgTWF4QmxvY2tTaXplID0gcEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemU7CiAgICAgICAgIH0KIAogICAgICAgICAvKgogICAgICAgICAgKiBTbG93IGRhdGEgbWVtb3J5CiAgICAgICAgICAqLwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTbG93RGF0YSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlNsb3dEYXRhKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFBlcnNpc3RlbnQgZmFzdCBkYXRhIG1lbW9yeQogICAgICAgICAgKi8KICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOwotICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkgewogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICAgICAgeworICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKSB7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKLSAgICAgICAgeworICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKSB7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwogICAgICAgICB9CiAKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkZhc3REYXRhKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdERhdGEpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlR5cGUgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CiAKICAgICAgICAgLyoKICAgICAgICAgICogUGVyc2lzdGVudCBmYXN0IGNvZWZmaWNpZW50IG1lbW9yeQogICAgICAgICAgKi8KICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdENvZWYpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplID0gSW5zdEFsbG9jX0dldFRvdGFsKCZGYXN0Q29lZik7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKIAogICAgICAgICAvKgpAQCAtMTkyLDQxICsxNzUsMzMgQEAKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CiAgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspCi0gICAgICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGk9MDsgaTwxOyBpKyspCi0gICAgICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHsKICAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZUZW1wb3JhcnkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICA9IExWTV9URU1QT1JBUllfRkFTVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gSW5zdEFsbG9jX0dldFRvdGFsKCZUZW1wb3JhcnkpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgPSBMVk1fVEVNUE9SQVJZX0ZBU1Q7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CiAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QqIHBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0KiloSW5zdGFuY2U7CiAKICAgICAgICAgLyoKICAgICAgICAgICogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlCkBAIC0yMzQsNyArMjA5LDcgQEAKICAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBMVlJFVl9Qcml2YXRlLT5NZW1vcnlUYWJsZTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZSRVZfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVlJFVl9TVUNDRVNTKTsKIH0KIAogLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAppbmRleCAyYzI3YzZlLi5iNmVkYjAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCkBAIC0zNyw2MyArMzcsNjMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBHZW5lcmFsICovCi0jZGVmaW5lIE9ORV9PVkVSX1NRUlRfVFdPICAgICAgICAgICAgMC43MDcxMDdmICAgICAgICAgICAvKiAxL3NxcnQoMikgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX0JfOF9vbl8xMDAwICAgICAgICAgICAgICAgMC4wMDhmICAgICAgICAgICAvKiAwLjggKiAyXjMxICovCi0jZGVmaW5lIExWUkVWX0hFQURST09NICAgICAgICAgICAgICAgICAgIDAuMjVmICAgICAgICAgICAvKiAtMTJkQiAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfMl85X0lOUTI5ICAgICAgICAgICAgICAgICAgIDIuOWYgICAgICAgICAgIC8qIDIuOSBpbiBRMjkgZm9ybWF0ICovCi0jZGVmaW5lIExWUkVWX01JTjNEQiAgICAgICAgICAgICAgICAwLjcwNzk0NTdmICAgICAgICAgICAvKiAtM2RCIGluIFExNSBmb3JtYXQgKi8KKyNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gMC43MDcxMDdmIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgMC4wMDhmICAgIC8qIDAuOCAqIDJeMzEgKi8KKyNkZWZpbmUgTFZSRVZfSEVBRFJPT00gMC4yNWYgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLworI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgMi45ZiAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZSRVZfTUlOM0RCIDAuNzA3OTQ1N2YgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLwogCiAvKiBJbnRlbmFsIGNvbnN0YW50cyAqLwotI2RlZmluZSBMVlJFVl9MUF9Qb2x5X09yZGVyICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIExWUkVWX0xQX1BvbHlfU2hpZnQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTFZSRVZfTFBfUG9seV9PcmRlciA0CisjZGVmaW5lIExWUkVWX0xQX1BvbHlfU2hpZnQgNQogCi0jZGVmaW5lIExWUkVWX1Q2MF9TQ0FMRSAgICAgICAgICAgICAgICAwLjAwMDE0MmYgICAgICAgICAgIC8qKDEvNzAwMCkgKi8KKyNkZWZpbmUgTFZSRVZfVDYwX1NDQUxFIDAuMDAwMTQyZiAvKigxLzcwMDApICovCiAKLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzBfb25fNCAgICAgICAgICAgICAgMS4wZgotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMV9vbl80ICAgICAgICAgMS4zMTYwNzRmCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8yX29uXzQgICAgICAgICAxLjczMjA1MWYKLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNCAgICAgICAgIDIuMjc5NTA3ZgotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQgICAgICAgICAxLjBmICAgICAgICAvKiAzXigtMC80KSAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgIDAuNzU5ODM2ZiAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAwLjU3NzM1MGYgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLwotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgMC40Mzg2OTFmICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzBfb25fNCAxLjBmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8xX29uXzQgMS4zMTYwNzRmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8yX29uXzQgMS43MzIwNTFmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8zX29uXzQgMi4yNzk1MDdmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCAxLjBmICAgICAgLyogM14oLTAvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCAwLjc1OTgzNmYgLyogM14oLTEvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAwLjU3NzM1MGYgLyogM14oLTIvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCAwLjQzODY5MWYgLyogM14oLTMvNCkgKiAyXjE1ICovCiAKLSAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAxMDEwOAotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAgICAgICAgICAgICAgIDEzMzA0Ci0gICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgMTc1MDgKLSAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICAyMzA0MAotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgICAgICAgICAgICAgICA2NzQwCi0gICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgIDg4NzIKLSAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAxMTY3MgotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDBfREVMQVkgICAgICAgICAgICAgIDE1MzYwCisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgMTAxMDgKKy8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAxMzMwNAorLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZIDE3NTA4CisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgMjMwNDAKKy8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgNjc0MAorLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSA4ODcyCisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZIDExNjcyCisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZIDE1MzYwCiAKLSNkZWZpbmUgTFZSRVZfQllQQVNTTUlYRVJfVEMgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQqLwotI2RlZmluZSBMVlJFVl9BTExQQVNTX1RDICAgICAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgdGltZSBjb25zdGFudCAqLwotI2RlZmluZSBMVlJFVl9BTExQQVNTX1RBUF9UQyAgICAgICAgICAgICAxMDAwMCAgICAgICAgICAgLyogQWxsLXBhc3MgZmlsdGVyIGRlbHkgdGFwIGNoYW5nZSAqLwotI2RlZmluZSBMVlJFVl9GRUVEQkFDS01JWEVSX1RDICAgICAgICAgICAgMTAwICAgICAgICAgICAvKiBGZWVkYmFjayBtaXhlciB0aW1lIGNvbnN0YW50Ki8KLSNkZWZpbmUgTFZSRVZfT1VUUFVUR0FJTl9TSElGVCAgICAgICAgICAgICAgNSAgICAgICAgICAgLyogQml0cyBzaGlmdCBmb3Igb3V0cHV0IGdhaW4gY29ycmVjdGlvbiAqLworI2RlZmluZSBMVlJFVl9CWVBBU1NNSVhFUl9UQyAxMDAwICAvKiBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudCovCisjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEMgMTAwMCAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciB0aW1lIGNvbnN0YW50ICovCisjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEFQX1RDIDEwMDAwIC8qIEFsbC1wYXNzIGZpbHRlciBkZWx5IHRhcCBjaGFuZ2UgKi8KKyNkZWZpbmUgTFZSRVZfRkVFREJBQ0tNSVhFUl9UQyAxMDAgLyogRmVlZGJhY2sgbWl4ZXIgdGltZSBjb25zdGFudCovCisjZGVmaW5lIExWUkVWX09VVFBVVEdBSU5fU0hJRlQgNSAgIC8qIEJpdHMgc2hpZnQgZm9yIG91dHB1dCBnYWluIGNvcnJlY3Rpb24gKi8KIAogLyogUGFyYW1ldGVyIGxpbWl0cyAqLwotI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgIDEzICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2RlZmluZSBMVlJFVl9OVU1fRlMgMTMgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KIAotI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCi0jZGVmaW5lIExWUkVWX01BWF9MRVZFTCAgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KLSNkZWZpbmUgTFZSRVZfTUlOX0xQRl9DT1JORVIgICAgICAgICAgICAgICA1MCAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGxpbWl0cyAqLwotI2RlZmluZSBMVlJFVl9NQVhfTFBGX0NPUk5FUiAgICAgICAgICAgIDIzOTk5Ci0jZGVmaW5lIExWUkVWX01JTl9IUEZfQ09STkVSICAgICAgICAgICAgICAgMjAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWxyZXIgbGltaXRzICovCi0jZGVmaW5lIExWUkVWX01BWF9IUEZfQ09STkVSICAgICAgICAgICAgIDEwMDAKLSNkZWZpbmUgTFZSRVZfTUFYX1Q2MCAgICAgICAgICAgICAgICAgICAgNzAwMCAgICAgICAgICAgLyogTWF4aW11bSBUNjAgdGltZSBpbiBtcyAqLwotI2RlZmluZSBMVlJFVl9NQVhfREVOU0lUWSAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAvKiBNYXhpbXVtIGRlbnNpdHksIDEwMCUgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0RBTVBJTkcgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBkYW1waW5nLCAxMDAlICovCi0jZGVmaW5lIExWUkVWX01BWF9ST09NU0laRSAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gcm9vbSBzaXplLCAxMDAlICovCisjZGVmaW5lIExWUkVWX01BWEJMS1NJWkVfTElNSVQgNjQgLyogTWF4aW11bSBibG9jayBzaXplIGxvdyBsaW1pdCAqLworI2RlZmluZSBMVlJFVl9NQVhfTEVWRUwgMTAwICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUlOX0xQRl9DT1JORVIgNTAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgbGltaXRzICovCisjZGVmaW5lIExWUkVWX01BWF9MUEZfQ09STkVSIDIzOTk5CisjZGVmaW5lIExWUkVWX01JTl9IUEZfQ09STkVSIDIwIC8qIEhpZ2ggcGFzcyBmaWxyZXIgbGltaXRzICovCisjZGVmaW5lIExWUkVWX01BWF9IUEZfQ09STkVSIDEwMDAKKyNkZWZpbmUgTFZSRVZfTUFYX1Q2MCA3MDAwICAgICAvKiBNYXhpbXVtIFQ2MCB0aW1lIGluIG1zICovCisjZGVmaW5lIExWUkVWX01BWF9ERU5TSVRZIDEwMCAgLyogTWF4aW11bSBkZW5zaXR5LCAxMDAlICovCisjZGVmaW5lIExWUkVWX01BWF9EQU1QSU5HIDEwMCAgLyogTWF4aW11bSBkYW1waW5nLCAxMDAlICovCisjZGVmaW5lIExWUkVWX01BWF9ST09NU0laRSAxMDAgLyogTWF4aW11bSByb29tIHNpemUsIDEwMCUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwMiw3MiArMTAyLDY4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBIUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciB0YXBzICovCi0gICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgTFBUYXBzOyAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciB0YXBzICovCi0gICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgUmV2TFBUYXBzWzRdOyAgICAgICAgICAgICAgIC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIHRhcHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBIUFRhcHM7ICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgdGFwcyAqLworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IExQVGFwczsgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBSZXZMUFRhcHNbNF07IC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIHRhcHMgKi8KIAogfSBMVlJFVl9GYXN0RGF0YV9zdDsKIAogLyogRmFzdCBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0KLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBIUENvZWZzOyAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBMUENvZWZzOyAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFJldkxQQ29lZnNbNF07ICAgICAgICAvKiBSZXZlcmIgbG93IHBhc3MgZmlsdGVycyBjb2VmZmljaWVudHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCBIUENvZWZzOyAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90IExQQ29lZnM7ICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCBSZXZMUENvZWZzWzRdOyAvKiBSZXZlcmIgbG93IHBhc3MgZmlsdGVycyBjb2VmZmljaWVudHMgKi8KIAogfSBMVlJFVl9GYXN0Q29lZl9zdDsKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogR2VuZXJhbCAqLwotICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0IEluc3RhbmNlUGFyYW1zOyAgICAgICAgICAgLyogSW5pdGlhbGlzYXRpb24gdGltZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgTWVtb3J5VGFibGU7ICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICBDdXJyZW50UGFyYW1zOyAgICAgICAgICAgIC8qIFBhcmFtZXRlcnMgYmVpbmcgdXNlZCAqLwotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgIE5ld1BhcmFtczsgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgZnJvbSB0aGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyBhcHBsaWNhdGlvbiAqLwotICAgIExWTV9DSEFSICAgICAgICAgICAgICAgIGJDb250cm9sUGVuZGluZzsgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBuZXcgcGFyYW1ldGVycyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlICovCi0gICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkZpcnN0Q29udHJvbDsgICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbnRyb2wgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAqLwotICAgIExWTV9DSEFSICAgICAgICAgICAgICAgIGJEaXNhYmxlUmV2ZXJiOyAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtaXggbGV2ZWwgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIGFuZCB0aGUgcmV2ZXJiIGNhbiBiZSBkaXNhYmxlZCAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFJvb21TaXplSW5tczsgICAgICAgICAgICAgLyogUm9vbSBzaXplIGluIG1zZWMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBNYXhCbGtMZW47ICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBmb3IgaW50ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgKi8KKyAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCBJbnN0YW5jZVBhcmFtczsgLyogSW5pdGlhbGlzYXRpb24gdGltZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgTWVtb3J5VGFibGU7ICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQ3VycmVudFBhcmFtczsgICAvKiBQYXJhbWV0ZXJzIGJlaW5nIHVzZWQgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IE5ld1BhcmFtczsgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgZnJvbSB0aGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIGFwcGxpY2F0aW9uICovCisgICAgTFZNX0NIQVIgYkNvbnRyb2xQZW5kaW5nOyAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgbmV3IHBhcmFtZXRlcnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlICovCisgICAgTFZNX0NIQVIgYkZpcnN0Q29udHJvbDsgICAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICBMVk1fQ0hBUiBiRGlzYWJsZVJldmVyYjsgICAgICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtaXggbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgYW5kIHRoZSByZXZlcmIgY2FuIGJlIGRpc2FibGVkICovCisgICAgTFZNX0lOVDMyIFJvb21TaXplSW5tczsgICAgICAgICAgICAgICAgIC8qIFJvb20gc2l6ZSBpbiBtc2VjICovCisgICAgTFZNX0lOVDMyIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBmb3IgaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAqLwogCiAgICAgLyogQWxpZ25lZCBtZW1vcnkgcG9pbnRlcnMgKi8KLSAgICBMVlJFVl9GYXN0RGF0YV9zdCAgICAgICAqcEZhc3REYXRhOyAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0gICAgTFZSRVZfRmFzdENvZWZfc3QgICAgICAgKnBGYXN0Q29lZjsgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2hEZWxheUxpbmVbNF07ICAgIC8qIERlbGF5IGxpbmUgc2NyYXRjaCBtZW1vcnkgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2F2ZTsgICAgICAgICAgICAgIC8qIFJldmVyYiBibG9jayBpbnB1dCBzYXZlIGZvciBkcnkvd2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhpbmcqLworICAgIExWUkVWX0Zhc3REYXRhX3N0KiBwRmFzdERhdGE7ICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZSRVZfRmFzdENvZWZfc3QqIHBGYXN0Q29lZjsgICAgLyogRmFzdCBjb2VmZmljaWVudCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaERlbGF5TGluZVs0XTsgLyogRGVsYXkgbGluZSBzY3JhdGNoIG1lbW9yeSAqLworICAgIExWTV9GTE9BVCogcFNjcmF0Y2g7ICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KKyAgICBMVk1fRkxPQVQqIHBJbnB1dFNhdmU7ICAgICAgICAgICAvKiBSZXZlcmIgYmxvY2sgaW5wdXQgc2F2ZSBmb3IgZHJ5L3dldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluZyovCiAKICAgICAvKiBGZWVkYmFjayBtYXRyaXggKi8KLSAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBGZWVkYmFja01peGVyWzRdOyAgICAgICAgIC8qIE1peGVyIGZvciBQb3AgYW5kIENsaWNrIFN1cHJlc3Npb24gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2VkIGJ5IGZlZWRiYWNrIEdhaW4gKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90IEZlZWRiYWNrTWl4ZXJbNF07IC8qIE1peGVyIGZvciBQb3AgYW5kIENsaWNrIFN1cHByZXNzaW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZCBieSBmZWVkYmFjayBHYWluICovCiAKICAgICAvKiBBbGwtUGFzcyBGaWx0ZXIgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBUWzRdOyAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gZGVsYXkgc2l6ZSBvZiBidWZmZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERlbGF5X1RbNF07ICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGVsYXkgYnVmZmVycyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIERlbGF5X0FQWzRdOyAgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIEFQIGRlbGF5IGJ1ZmZlciBzdGFydCAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEFCX1NlbGVjdGlvbjsgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gQiB3aGVuIDEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIEIgdG8gQSAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEFfRGVsYXlTaXplWzRdOyAgICAgICAgICAgLyogQSBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJfRGVsYXlTaXplWzRdOyAgICAgICAgICAgLyogQiBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT2Zmc2V0QVs0XTsgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQSBkZWxheSB0YXAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE9mZnNldEJbNF07ICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgdGhlIEIgZGVsYXkgdGFwICovCi0gICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfQVBUYXBzWzRdOyAgICAgICAgICAvKiBTbW9vdGhlZCBBUCBkZWxheSBtaXhlciAqLwotICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIE1peGVyX1NHRmVlZGJhY2tbNF07ICAgICAgLyogU21vb3RoZWQgU0FmZWVkYmFjayBnYWluICovCi0gICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfU0dGZWVkZm9yd2FyZFs0XTsgICAvKiBTbW9vdGhlZCBBUCBmZWVkZm9yd2FyZCBnYWluICovCisgICAgTFZNX0lOVDMyIFRbNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGRlbGF5IHNpemUgb2YgYnVmZmVyICovCisgICAgTFZNX0ZMT0FUKiBwRGVsYXlfVFs0XTsgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGRlbGF5IGJ1ZmZlcnMgKi8KKyAgICBMVk1fSU5UMzIgRGVsYXlfQVBbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIE9mZnNldCB0byBBUCBkZWxheSBidWZmZXIgc3RhcnQgKi8KKyAgICBMVk1fSU5UMTYgQUJfU2VsZWN0aW9uOyAgICAgICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBBIHRvIEIgd2hlbiAxIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBCIHRvIEEgKi8KKyAgICBMVk1fSU5UMzIgQV9EZWxheVNpemVbNF07ICAgICAgICAgICAgICAgICAgIC8qIEEgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgQl9EZWxheVNpemVbNF07ICAgICAgICAgICAgICAgICAgIC8qIEIgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKyAgICBMVk1fRkxPQVQqIHBPZmZzZXRBWzRdOyAgICAgICAgICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgdGhlIEEgZGVsYXkgdGFwICovCisgICAgTFZNX0ZMT0FUKiBwT2Zmc2V0Qls0XTsgICAgICAgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBCIGRlbGF5IHRhcCAqLworICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgTWl4ZXJfQVBUYXBzWzRdOyAgICAgICAgLyogU21vb3RoZWQgQVAgZGVsYXkgbWl4ZXIgKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90IE1peGVyX1NHRmVlZGJhY2tbNF07ICAgIC8qIFNtb290aGVkIFNBZmVlZGJhY2sgZ2FpbiAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgTWl4ZXJfU0dGZWVkZm9yd2FyZFs0XTsgLyogU21vb3RoZWQgQVAgZmVlZGZvcndhcmQgZ2FpbiAqLwogCiAgICAgLyogT3V0cHV0IGdhaW4gKi8KLSAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgIC8qIERyeS93ZXQgbWl4ZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBHYWluOyAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gYXBwbGllZCB0byBvdXRwdXQgdG8gbWFpbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2Ugc2lnbmFsIHBvd2VyICovCi0gICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgR2Fpbk1peGVyOyAgICAgICAgICAgICAgICAvKiBHYWluIHNtb290aGluZyAqLworICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgQnlwYXNzTWl4ZXI7IC8qIERyeS93ZXQgbWl4ZXIgKi8KKyAgICBMVk1fRkxPQVQgR2FpbjsgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSBzaWduYWwgcG93ZXIgKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90IEdhaW5NaXhlcjsgICAvKiBHYWluIHNtb290aGluZyAqLwogCiB9IExWUkVWX0luc3RhbmNlX3N0OwogCkBAIC0xNzcsMTUgKzE3MywxMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyhMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKTsKLXZvaWQgICAgICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrKExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICpwUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7Ci1MVk1fSU5UMzIgICAgICAgICAgICAgICBCeXBhc3NNaXhlcl9DYWxsYmFjayh2b2lkICAgICAgICpwQ2FsbGJhY2tEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBHZW5lcmFsUHVycG9zZSApOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MoTFZSRVZfSW5zdGFuY2Vfc3QqIHBQcml2YXRlKTsKK3ZvaWQgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUKiBwSW5wdXQsIExWTV9GTE9BVCogcE91dHB1dCwgTFZSRVZfSW5zdGFuY2Vfc3QqIHBQcml2YXRlLAorICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOworTFZNX0lOVDMyIEJ5cGFzc01peGVyX0NhbGxiYWNrKHZvaWQqIHBDYWxsYmFja0RhdGEsIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgR2VuZXJhbFB1cnBvc2UpOwogCi0jZW5kaWYgIC8qKiBfX0xWUkVWX1BSSVZBVEVfSF9fICoqLworI2VuZGlmIC8qKiBfX0xWUkVWX1BSSVZBVEVfSF9fICoqLwogCiAvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcAppbmRleCAzNWY5YWQ4Li5lZDNiODljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcApAQCAtNDUsNDMgKzQ1LDM3IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKLXsKLSAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7Ci0gICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKLSAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOwotICAgTFZNX0lOVDMyICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3MsIFJlbWFpbmluZ1NhbXBsZXM7Ci0gICBMVk1fSU5UMzIgICAgICAgICAgICAgZm9ybWF0ID0gMTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgY29uc3QgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgTFZSRVZfSW5zdGFuY2Vfc3QqIHBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0KiloSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUKiBwSW5wdXQgPSAoTFZNX0ZMT0FUKilwSW5EYXRhOworICAgIExWTV9GTE9BVCogcE91dHB1dCA9IHBPdXREYXRhOworICAgIExWTV9JTlQzMiBTYW1wbGVzVG9Qcm9jZXNzLCBSZW1haW5pbmdTYW1wbGVzOworICAgIExWTV9JTlQzMiBmb3JtYXQgPSAxOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwogCiAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKICAgICB9CiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBuZXcgY29udHJvbHMgc2V0dGluZ3MgaWYgcmVxdWlyZWQKICAgICAgKi8KLSAgICBpZihwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQotICAgIHsKLSAgICAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgZXJyb3JDb2RlOworICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKSB7CisgICAgICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBlcnJvckNvZGU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogQ2xlYXIgdGhlIHBlbmRpbmcgZmxhZyBhbmQgdXBkYXRlIHRoZSBjb250cm9sIHNldHRpbmdzCiAgICAgICAgICAqLwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwogCi0gICAgICAgIGVycm9yQ29kZSA9IExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKHBMVlJFVl9Qcml2YXRlKTsKKyAgICAgICAgZXJyb3JDb2RlID0gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyhwTFZSRVZfUHJpdmF0ZSk7CiAKLSAgICAgICAgaWYoZXJyb3JDb2RlICE9IExWUkVWX1NVQ0NFU1MpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBMVlJFVl9TVUNDRVNTKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyb3JDb2RlOwogICAgICAgICB9CiAgICAgfQpAQCAtODksMjcgKzgzLDIzIEBACiAgICAgLyoKICAgICAgKiBUcmFwIHRoZSBjYXNlIHdoZXJlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvLgogICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID09IDApCi0gICAgeworICAgIGlmIChOdW1TYW1wbGVzID09IDApIHsKICAgICAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBJZiBPRkYgY29weSBhbmQgcmVmb3JtYXQgdGhlIGRhdGEgYXMgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgaWYgKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQotICAgIHsKLSAgICAgICAgaWYocElucHV0ICE9IHBPdXRwdXQpCi0gICAgICAgIHsKKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PRkYpIHsKKyAgICAgICAgaWYgKHBJbnB1dCAhPSBwT3V0cHV0KSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgY29udmVydCB0byBzdGVyZW8gaXMgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKKyAgICAgICAgICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pIHsKICAgICAgICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsgLy8gMzIgYml0IGRhdGEsIHN0ZXJlbworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocElucHV0LCBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKSk7ICAvLyAzMiBiaXQgZGF0YSwgc3RlcmVvCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTE4LDMxICsxMDgsMjYgQEAKIAogICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAoTFZNX0lOVDMyKU51bVNhbXBsZXM7CiAKLSAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICE9IExWTV9NT05PKQotICAgIHsKKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICE9IExWTV9NT05PKSB7CiAgICAgICAgIGZvcm1hdCA9IDI7CiAgICAgfQogCi0gICAgd2hpbGUgKFJlbWFpbmluZ1NhbXBsZXMhPTApCi0gICAgeworICAgIHdoaWxlIChSZW1haW5pbmdTYW1wbGVzICE9IDApIHsKICAgICAgICAgLyoKICAgICAgICAgICogUHJvY2VzcyB0aGUgZGF0YQogICAgICAgICAgKi8KIAotICAgICAgICBpZihSZW1haW5pbmdTYW1wbGVzID4gIHBMVlJFVl9Qcml2YXRlLT5NYXhCbGtMZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3MgPSAgcExWUkVWX1ByaXZhdGUtPk1heEJsa0xlbjsKKyAgICAgICAgaWYgKFJlbWFpbmluZ1NhbXBsZXMgPiBwTFZSRVZfUHJpdmF0ZS0+TWF4QmxrTGVuKSB7CisgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzID0gcExWUkVWX1ByaXZhdGUtPk1heEJsa0xlbjsKICAgICAgICAgICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAoTFZNX0lOVDE2KShSZW1haW5pbmdTYW1wbGVzIC0gU2FtcGxlc1RvUHJvY2Vzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzID0gUmVtYWluaW5nU2FtcGxlczsKICAgICAgICAgICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAwOwogICAgICAgICB9CiAKICAgICAgICAgUmV2ZXJiQmxvY2socElucHV0LCBwT3V0cHV0LCBwTFZSRVZfUHJpdmF0ZSwgKExWTV9VSU5UMTYpU2FtcGxlc1RvUHJvY2Vzcyk7Ci0gICAgICAgIHBJbnB1dCAgPSAoTFZNX0ZMT0FUICopKHBJbnB1dCArIChTYW1wbGVzVG9Qcm9jZXNzICogZm9ybWF0KSk7Ci0gICAgICAgIHBPdXRwdXQgPSAoTFZNX0ZMT0FUICopKHBPdXRwdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIDIpKTsgICAgICAvLyBBbHdheXMgc3RlcmVvIG91dHB1dAorICAgICAgICBwSW5wdXQgPSAoTFZNX0ZMT0FUKikocElucHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiBmb3JtYXQpKTsKKyAgICAgICAgcE91dHB1dCA9IChMVk1fRkxPQVQqKShwT3V0cHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiAyKSk7ICAvLyBBbHdheXMgc3RlcmVvIG91dHB1dAogICAgIH0KIAogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwpAQCAtMTcwLDE2ICsxNTUsMTUgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUICpwSW5wdXQsIExWTV9GTE9BVCAqcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgKnBQcml2YXRlLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCi17Ci0gICAgTFZNX0lOVDE2ICAgaiwgc2l6ZTsKLSAgICBMVk1fRkxPQVQgICAqcERlbGF5TGluZTsKLSAgICBMVk1fRkxPQVQgICAqcERlbGF5TGluZUlucHV0ID0gcFByaXZhdGUtPnBTY3JhdGNoOwotICAgIExWTV9GTE9BVCAgICpwU2NyYXRjaCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKLSAgICBMVk1fRkxPQVQgICAqcEluOwotICAgIExWTV9GTE9BVCAgICpwVGVtcCA9IHBQcml2YXRlLT5wSW5wdXRTYXZlOwotICAgIExWTV9JTlQzMiAgIE51bWJlck9mRGVsYXlMaW5lczsKK3ZvaWQgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUKiBwSW5wdXQsIExWTV9GTE9BVCogcE91dHB1dCwgTFZSRVZfSW5zdGFuY2Vfc3QqIHBQcml2YXRlLAorICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKKyAgICBMVk1fSU5UMTYgaiwgc2l6ZTsKKyAgICBMVk1fRkxPQVQqIHBEZWxheUxpbmU7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlMaW5lSW5wdXQgPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKKyAgICBMVk1fRkxPQVQqIHBJbjsKKyAgICBMVk1fRkxPQVQqIHBUZW1wID0gcFByaXZhdGUtPnBJbnB1dFNhdmU7CisgICAgTFZNX0lOVDMyIE51bWJlck9mRGVsYXlMaW5lczsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgKiBBbGwgY2FsY3VsYXRpb25zIHdpbGwgZ28gaW50byB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgcFRlbXAsIHRoaXMgd2lsbCAgICAqCkBAIC0xOTYsODUgKzE4MCw2MCBAQAogICAgICAqIGFuZCB0aGUgZmluYWwgb3V0cHV0IGlzIGNvbnZlcnRlZCB0byBTVEVSRU8gYWZ0ZXIgdGhlIG1peGVyICAgICAgICAgICAgICAgICoKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgeworICAgIGlmIChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkgewogICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSA0OwotICAgIH0KLSAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQotICAgIHsKKyAgICB9IGVsc2UgaWYgKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKSB7CiAgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMTsKICAgICB9CiAKLSAgICBpZihwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pCi0gICAgeworICAgIGlmIChwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pIHsKICAgICAgICAgcEluID0gcElucHV0OwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqICBTdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9uCiAgICAgICAgICAqLwogCi0gICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwSW5wdXQsIHBUZW1wLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICBwSW4gPSBwVGVtcDsKICAgICB9CiAKLSAgICBNdWx0M3NfRmxvYXQocEluLAotICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLAotICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICBNdWx0M3NfRmxvYXQocEluLCAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLCBwVGVtcCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAogICAgIC8qCiAgICAgICogIEhpZ2ggcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5IUENvZWZzLCBwVGVtcCwgcFRlbXAsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgLyoKICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCiAgICAgICovCi0gICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywgcFRlbXAsIHBUZW1wLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCiAgICAgLyoKICAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKICAgICAgKi8KIAotICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQotICAgIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspIHsKICAgICAgICAgcERlbGF5TGluZSA9IHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtqXTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBBbGwtcGFzcyBmaWx0ZXIgd2l0aCBwb3AgYW5kIGNsaWNrIHN1cHByZXNzaW9uCiAgICAgICAgICAqLwogICAgICAgICAvKiBHZXQgdGhlIHNtb290aGVkLCBkZWxheWVkIG91dHB1dC4gUHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sIHBQcml2YXRlLT5wT2Zmc2V0QVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbal0sIHBEZWxheUxpbmUsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgIC8qIFJlLWFsaWduIHRoZSBhbGwgcGFzcyBmaWx0ZXIgZGVsYXkgYnVmZmVyIGFuZCBjb3B5aW5nIHRoZSBmaXhlZCBkZWxheSBkYXRhIFwKICAgICAgICAgICAgdG8gdGhlIEFQIGRlbGF5IGluIHRoZSBwcm9jZXNzICovCi0gICAgICAgIENvcHlfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikocFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzKSk7ICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICAgICAgQ29weV9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW051bVNhbXBsZXNdLCBwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikocFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzKSk7IC8qIDMyLWJpdCBkYXRhICovCiAgICAgICAgIC8qIEFwcGx5IHRoZSBzbW9vdGhlZCBmZWVkYmFjayBhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLwotICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tqXSwgcERlbGF5TGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgLyogU3VtIGludG8gdGhlIEFQIGRlbGF5IGxpbmUgKi8KICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLCAgICAvKiBJbnZlcnQgc2luY2UgdGhlIGZlZWRiYWNrIGNvZWZmaWNpZW50IGlzIG5lZ2F0aXZlICovCisgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwgLyogSW52ZXJ0IHNpbmNlIHRoZSBmZWVkYmFjayBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0gLSBOdW1TYW1wbGVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgIC8qIEFwcGx5IHNtb290aGVkIGZlZWRmb3J3YXJkIHNhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLwpAQCAtMjgzLDkgKzI0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBvdXRwdXQgKi8KLSAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICBNYWMzc19TYXRfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLCAxLjBmLCBwRGVsYXlMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAogICAgICAgICAvKgpAQCAtMjk2LDM0ICsyNTMsMjcgQEAKICAgICAgICAgLyoKICAgICAgICAgICogIExvdyBwYXNzIGZpbHRlcgogICAgICAgICAgKi8KLSAgICAgICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5SZXZMUENvZWZzW2pdLCBwRGVsYXlMaW5lLCBwRGVsYXlMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogIEFwcGx5IHJvdGF0aW9uIG1hdHJpeCBhbmQgZGVsYXkgc2FtcGxlcwogICAgICAqLwotICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQotICAgIHsKLQotICAgICAgICBDb3B5X0Zsb2F0KHBUZW1wLAotICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7CisgICAgZm9yIChqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKSB7CisgICAgICAgIENvcHlfRmxvYXQocFRlbXAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOwogICAgICAgICAvKgogICAgICAgICAgKiAgUm90YXRpb24gbWF0cml4IG1peAogICAgICAgICAgKi8KLSAgICAgICAgc3dpdGNoKGopCi0gICAgICAgIHsKKyAgICAgICAgc3dpdGNoIChqKSB7CiAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyOgpAQCAtMzMxLDYxICsyODEsNTIgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAzIGNvbnRyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkgewogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCBwRGVsYXlMaW5lSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KSB7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIHBEZWxheUxpbmVJbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGNvbnRyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQwMiw1NCArMzQzLDM3IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqICBEZWxheSBzYW1wbGVzCiAgICAgICAgICAqLwotICAgICAgICBDb3B5X0Zsb2F0KHBEZWxheUxpbmVJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICAgICAgQ29weV9GbG9hdChwRGVsYXlMaW5lSW5wdXQsICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7IC8qIDMyLWJpdCBkYXRhICovCiAgICAgfQogCiAgICAgLyoKICAgICAgKiAgQ3JlYXRlIHN0ZXJlbyBvdXRwdXQKICAgICAgKi8KLSAgICBzd2l0Y2gocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cykKLSAgICB7CisgICAgc3dpdGNoIChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzKSB7CiAgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU180OgotICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKLSAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgSm9pblRvMmlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIHBUZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU18yOgogCi0gICAgICAgICAgICAgQ29weV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCBwU2NyYXRjaCwgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOwogCi0gICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCi0gICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCi0gICAgICAgICAgICAgSm9pblRvMmlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBTY3JhdGNoLCBwVGVtcCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMToKLSAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcFRlbXAsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDYwLDI1ICszODQsMTQgQEAKICAgICAgKi8KIAogICAgIHNpemUgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpOwotICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5CeXBhc3NNaXhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPkJ5cGFzc01peGVyLCBwVGVtcCwgcFRlbXAsIHBPdXRwdXQsIHNpemUpOwogCiAgICAgLyogQXBwbHkgR2FpbiovCiAKLSAgICBTaGlmdF9TYXRfRmxvYXQoTFZSRVZfT1VUUFVUR0FJTl9TSElGVCwKLSAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgU2hpZnRfU2F0X0Zsb2F0KExWUkVWX09VVFBVVEdBSU5fU0hJRlQsIHBPdXRwdXQsIHBPdXRwdXQsIHNpemUpOwogCi0gICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPkdhaW5NaXhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPkdhaW5NaXhlciwgcE91dHB1dCwgcE91dHB1dCwgc2l6ZSk7CiAKICAgICByZXR1cm47CiB9CiAvKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jcHAKaW5kZXggMmE3NTU1OS4uZTVhMGJjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmNwcApAQCAtNDIsODQgKzQyLDY3IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgKnBOZXdQYXJhbXMpCi17Ci0KLSAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0KiBwTmV3UGFyYW1zKSB7CisgICAgTFZSRVZfSW5zdGFuY2Vfc3QqIHBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0KiloSW5zdGFuY2U7CiAKICAgICAvKgogICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCiAgICAgICovCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBOZXdQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBOZXdQYXJhbXMgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKICAgICB9CiAKICAgICAvKgogICAgICAqIENoZWNrIGFsbCBuZXcgY29udHJvbCBwYXJhbWV0ZXJzIGFyZSBpbiByYW5nZQogICAgICAqLwotICAgIGlmKCAgICAoKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocE5ld1BhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJgotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkKLSAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApCi0gICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNzY0MDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApCi0gICAgICAgICkKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIHx8ICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICAgICAgICYmCi0gICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCi0gICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAgICAgICAgICYmCi0gICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSkKLSNlbHNlCi0gICAgICAgIHx8ICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpICkKLSNlbmRpZgotICAgIHsKKyAgICBpZiAoKChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09OKSkgfHwKKyAgICAgICAgKChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSB8fAorICAgICAgICAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkpIHsKICAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKICAgICB9CiAKLSAgICBpZiAocE5ld1BhcmFtcy0+TGV2ZWwgPiBMVlJFVl9NQVhfTEVWRUwpCi0gICAgeworICAgIGlmIChwTmV3UGFyYW1zLT5MZXZlbCA+IExWUkVWX01BWF9MRVZFTCkgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKLSAgICBpZiAoKHBOZXdQYXJhbXMtPkxQRiA8IExWUkVWX01JTl9MUEZfQ09STkVSKSB8fCAocE5ld1BhcmFtcy0+TFBGID4gTFZSRVZfTUFYX0xQRl9DT1JORVIpKQotICAgIHsKKyAgICBpZiAoKHBOZXdQYXJhbXMtPkxQRiA8IExWUkVWX01JTl9MUEZfQ09STkVSKSB8fCAocE5ld1BhcmFtcy0+TFBGID4gTFZSRVZfTUFYX0xQRl9DT1JORVIpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAotICAgIGlmICgocE5ld1BhcmFtcy0+SFBGIDwgTFZSRVZfTUlOX0hQRl9DT1JORVIpIHx8IChwTmV3UGFyYW1zLT5IUEYgPiBMVlJFVl9NQVhfSFBGX0NPUk5FUikpCi0gICAgeworICAgIGlmICgocE5ld1BhcmFtcy0+SFBGIDwgTFZSRVZfTUlOX0hQRl9DT1JORVIpIHx8IChwTmV3UGFyYW1zLT5IUEYgPiBMVlJFVl9NQVhfSFBGX0NPUk5FUikpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgfQogCi0gICAgaWYgKHBOZXdQYXJhbXMtPlQ2MCA+IExWUkVWX01BWF9UNjApCi0gICAgeworICAgIGlmIChwTmV3UGFyYW1zLT5UNjAgPiBMVlJFVl9NQVhfVDYwKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAotICAgIGlmIChwTmV3UGFyYW1zLT5EZW5zaXR5ID4gTFZSRVZfTUFYX0RFTlNJVFkpCi0gICAgeworICAgIGlmIChwTmV3UGFyYW1zLT5EZW5zaXR5ID4gTFZSRVZfTUFYX0RFTlNJVFkpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgfQogCi0gICAgaWYgKHBOZXdQYXJhbXMtPkRhbXBpbmcgPiBMVlJFVl9NQVhfREFNUElORykKLSAgICB7CisgICAgaWYgKHBOZXdQYXJhbXMtPkRhbXBpbmcgPiBMVlJFVl9NQVhfREFNUElORykgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKLSAgICBpZiAocE5ld1BhcmFtcy0+Um9vbVNpemUgPiBMVlJFVl9NQVhfUk9PTVNJWkUpCi0gICAgeworICAgIGlmIChwTmV3UGFyYW1zLT5Sb29tU2l6ZSA+IExWUkVWX01BWF9ST09NU0laRSkgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKICAgICAvKgogICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzIGFuZCBzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhleSBhcmUgYXZhaWxhYmxlCiAgICAgICovCi0gICAgcExWUkVWX1ByaXZhdGUtPk5ld1BhcmFtcyAgICAgICA9ICpwTmV3UGFyYW1zOworICAgIHBMVlJFVl9Qcml2YXRlLT5OZXdQYXJhbXMgPSAqcE5ld1BhcmFtczsKICAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX1RSVUU7CiAKICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuY3BwCmluZGV4IDVjZDYyM2UuLjM1YTY1MjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmNwcApAQCAtMzAsMjUgKzMwLDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCi1jb25zdCBMVk1fVUlOVDMyIExWTV9Gc1RhYmxlW10gPSB7Ci0gICAgODAwMCAsCi0gICAgMTEwMjUsCi0gICAgMTIwMDAsCi0gICAgMTYwMDAsCi0gICAgMjIwNTAsCi0gICAgMjQwMDAsCi0gICAgMzIwMDAsCi0gICAgNDQxMDAsCi0gICAgNDgwMDAsCi0gICAgODgyMDAsCi0gICAgOTYwMDAsCi0gICAgMTc2NDAwLAotICAgIDE5MjAwMAotfTsKK2NvbnN0IExWTV9VSU5UMzIgTFZNX0ZzVGFibGVbXSA9IHs4MDAwLCAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsICAyNDAwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwfTsKIC8qIFRhYmxlIHdpdGggc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiAgVGhlIHRhYmxlIGNhbiBiZSBpbmRleGVkIHVzaW5nIExWTV9Gc19lbiAgICAgICAqLwotTFZNX1VJTlQzMiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpewotICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzE5MjAwMCkKLSAgICAgICAgcmV0dXJuIDA7CitMVk1fVUlOVDMyIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCkgeworICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzE5MjAwMCkgcmV0dXJuIDA7CiAKICAgICByZXR1cm4gKExWTV9Gc1RhYmxlW0ZzSW5kZXhdKTsKIH0KQEAgLTczLDMwICs1OSwxNzQgQEAKICAgKi8KIAogLyogTm9ybWFsaXppbmcgb3V0cHV0IGluY2x1ZGluZyBSZXZlcmIgTGV2ZWwgcGFydCAob25seSBzaGlmdCB1cCkqLwotY29uc3QgTFZNX0ZMT0FUIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdPXt7MSwxLjA0NTkwOWYsNy42ODEwOThmLC03LjIxMTUwMGYsMy4wMjU2MDVmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLDEuMDg4MTk0ZiwxMC4yOTE3NDlmLC0xMS41MTM3ODdmLDUuMjY1ODE3Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywwLjk4ODkxOWYsOC4yOTk5NTZmLC04LjkyMDg2MmYsMy45Nzk4MDZmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LDEuMDM1OTI3ZiwxMC4xODI1NjdmLC0xMC4zNDYxMzRmLDQuNTQ2NTMzZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NSwxLjEzMDMxM2YsMTIuNTM4NzI3ZiwtMTMuNjI3MDIzZiw2LjE2NTIwOGYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYsMS4wNjA3NDNmLDguMDkxNzEzZiwtOC41ODgwNzlmLDMuODM0MjMwZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NywxLjA0MDM4MWYsMTAuNDA2NTY2ZiwtMTEuMTc2NjUwZiw1LjA3NTEzMmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgsMS4wMjY5NDRmLDguMzg3MzAyZiwtOC42ODk3OTZmLDMuODk1ODYzZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OSwxLjAxMzMxMmYsOS43MjcyMzZmLC0xMC41MzQxNjVmLDQuNzQyMjcyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAsMC45OTYwOTVmLDguNDkyMjQ5ZiwtNy45NDc2NzdmLDMuNDc4OTE3Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTMsMS4wNzkzNDZmLDguODk0NDI1ZiwtOS42NDE3NjhmLDQuNDM0NDQyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTUsMC45OTQzMjdmLDcuNDQxMzM1ZiwtOC4wMDM5NzlmLDMuNTgxMTc3Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTcsMC45OTEwNjdmLDcuMjA4MzczZiwtNy4yNTc4NTlmLDMuMTY3Nzc0Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjAsMS4wMzM0NDVmLDcuNDc2MzcxZiwtNy41NDY5NjBmLDMuMzY5NzAzZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjUsMC45ODI4MzBmLDUuOTEzODY3ZiwtNS42Mzg0NDhmLDIuNDIwOTMyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MzAsMC45Mjg3ODJmLDUuMDM1MzQzZiwtNC40OTIxMDRmLDEuODQ0OTA0Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDAsMC45NTM3MTRmLDUuMDYwMjMyZiwtNC40NzIyMDRmLDEuODI5NjQyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NTAsMC44OTkyNThmLDQuMjczMzU3ZiwtMy41Mzc0OTJmLDEuMzg3NTc2Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NjAsMC45NDM1ODRmLDQuMDkzMjI4ZiwtMy40Njk2NThmLDEuNDEwOTExZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzAsMC45MjYwMjFmLDMuOTczMTI1ZiwtMy4zMzE5ODVmLDEuMzQ0NjkwZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzUsMC44OTQ4NTNmLDIuODcxNzQ3ZiwtMS40Mzg3NThmLDAuMzExODU2Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ODAsMC45MzUxMjJmLDIuOTkxODU3ZiwtMi4wMzg4ODJmLDAuNjg2Mzk1Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OTAsMC45NTM4NzJmLDIuODgwMzE1ZiwtMi4xMjIzNjVmLDAuNzg0MDMyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAwLDAuOTUxMDA1ZiwyLjg5NDI5NGYsLTIuMDA5MDg2ZiwwLjY5ODMxNmYsfSwKK2NvbnN0IExWTV9GTE9BVCBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XSA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgMS4wNDU5MDlmLAorICAgICAgICAgICAgICAgIDcuNjgxMDk4ZiwKKyAgICAgICAgICAgICAgICAtNy4yMTE1MDBmLAorICAgICAgICAgICAgICAgIDMuMDI1NjA1ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgMS4wODgxOTRmLAorICAgICAgICAgICAgICAgIDEwLjI5MTc0OWYsCisgICAgICAgICAgICAgICAgLTExLjUxMzc4N2YsCisgICAgICAgICAgICAgICAgNS4yNjU4MTdmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAwLjk4ODkxOWYsCisgICAgICAgICAgICAgICAgOC4yOTk5NTZmLAorICAgICAgICAgICAgICAgIC04LjkyMDg2MmYsCisgICAgICAgICAgICAgICAgMy45Nzk4MDZmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNCwKKyAgICAgICAgICAgICAgICAxLjAzNTkyN2YsCisgICAgICAgICAgICAgICAgMTAuMTgyNTY3ZiwKKyAgICAgICAgICAgICAgICAtMTAuMzQ2MTM0ZiwKKyAgICAgICAgICAgICAgICA0LjU0NjUzM2YsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA1LAorICAgICAgICAgICAgICAgIDEuMTMwMzEzZiwKKyAgICAgICAgICAgICAgICAxMi41Mzg3MjdmLAorICAgICAgICAgICAgICAgIC0xMy42MjcwMjNmLAorICAgICAgICAgICAgICAgIDYuMTY1MjA4ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDYsCisgICAgICAgICAgICAgICAgMS4wNjA3NDNmLAorICAgICAgICAgICAgICAgIDguMDkxNzEzZiwKKyAgICAgICAgICAgICAgICAtOC41ODgwNzlmLAorICAgICAgICAgICAgICAgIDMuODM0MjMwZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDcsCisgICAgICAgICAgICAgICAgMS4wNDAzODFmLAorICAgICAgICAgICAgICAgIDEwLjQwNjU2NmYsCisgICAgICAgICAgICAgICAgLTExLjE3NjY1MGYsCisgICAgICAgICAgICAgICAgNS4wNzUxMzJmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAxLjAyNjk0NGYsCisgICAgICAgICAgICAgICAgOC4zODczMDJmLAorICAgICAgICAgICAgICAgIC04LjY4OTc5NmYsCisgICAgICAgICAgICAgICAgMy44OTU4NjNmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgOSwKKyAgICAgICAgICAgICAgICAxLjAxMzMxMmYsCisgICAgICAgICAgICAgICAgOS43MjcyMzZmLAorICAgICAgICAgICAgICAgIC0xMC41MzQxNjVmLAorICAgICAgICAgICAgICAgIDQuNzQyMjcyZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAgIDAuOTk2MDk1ZiwKKyAgICAgICAgICAgICAgICA4LjQ5MjI0OWYsCisgICAgICAgICAgICAgICAgLTcuOTQ3Njc3ZiwKKyAgICAgICAgICAgICAgICAzLjQ3ODkxN2YsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAxMywKKyAgICAgICAgICAgICAgICAxLjA3OTM0NmYsCisgICAgICAgICAgICAgICAgOC44OTQ0MjVmLAorICAgICAgICAgICAgICAgIC05LjY0MTc2OGYsCisgICAgICAgICAgICAgICAgNC40MzQ0NDJmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMTUsCisgICAgICAgICAgICAgICAgMC45OTQzMjdmLAorICAgICAgICAgICAgICAgIDcuNDQxMzM1ZiwKKyAgICAgICAgICAgICAgICAtOC4wMDM5NzlmLAorICAgICAgICAgICAgICAgIDMuNTgxMTc3ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDE3LAorICAgICAgICAgICAgICAgIDAuOTkxMDY3ZiwKKyAgICAgICAgICAgICAgICA3LjIwODM3M2YsCisgICAgICAgICAgICAgICAgLTcuMjU3ODU5ZiwKKyAgICAgICAgICAgICAgICAzLjE2Nzc3NGYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAyMCwKKyAgICAgICAgICAgICAgICAxLjAzMzQ0NWYsCisgICAgICAgICAgICAgICAgNy40NzYzNzFmLAorICAgICAgICAgICAgICAgIC03LjU0Njk2MGYsCisgICAgICAgICAgICAgICAgMy4zNjk3MDNmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMjUsCisgICAgICAgICAgICAgICAgMC45ODI4MzBmLAorICAgICAgICAgICAgICAgIDUuOTEzODY3ZiwKKyAgICAgICAgICAgICAgICAtNS42Mzg0NDhmLAorICAgICAgICAgICAgICAgIDIuNDIwOTMyZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDMwLAorICAgICAgICAgICAgICAgIDAuOTI4NzgyZiwKKyAgICAgICAgICAgICAgICA1LjAzNTM0M2YsCisgICAgICAgICAgICAgICAgLTQuNDkyMTA0ZiwKKyAgICAgICAgICAgICAgICAxLjg0NDkwNGYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA0MCwKKyAgICAgICAgICAgICAgICAwLjk1MzcxNGYsCisgICAgICAgICAgICAgICAgNS4wNjAyMzJmLAorICAgICAgICAgICAgICAgIC00LjQ3MjIwNGYsCisgICAgICAgICAgICAgICAgMS44Mjk2NDJmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNTAsCisgICAgICAgICAgICAgICAgMC44OTkyNThmLAorICAgICAgICAgICAgICAgIDQuMjczMzU3ZiwKKyAgICAgICAgICAgICAgICAtMy41Mzc0OTJmLAorICAgICAgICAgICAgICAgIDEuMzg3NTc2ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDYwLAorICAgICAgICAgICAgICAgIDAuOTQzNTg0ZiwKKyAgICAgICAgICAgICAgICA0LjA5MzIyOGYsCisgICAgICAgICAgICAgICAgLTMuNDY5NjU4ZiwKKyAgICAgICAgICAgICAgICAxLjQxMDkxMWYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA3MCwKKyAgICAgICAgICAgICAgICAwLjkyNjAyMWYsCisgICAgICAgICAgICAgICAgMy45NzMxMjVmLAorICAgICAgICAgICAgICAgIC0zLjMzMTk4NWYsCisgICAgICAgICAgICAgICAgMS4zNDQ2OTBmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNzUsCisgICAgICAgICAgICAgICAgMC44OTQ4NTNmLAorICAgICAgICAgICAgICAgIDIuODcxNzQ3ZiwKKyAgICAgICAgICAgICAgICAtMS40Mzg3NThmLAorICAgICAgICAgICAgICAgIDAuMzExODU2ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDgwLAorICAgICAgICAgICAgICAgIDAuOTM1MTIyZiwKKyAgICAgICAgICAgICAgICAyLjk5MTg1N2YsCisgICAgICAgICAgICAgICAgLTIuMDM4ODgyZiwKKyAgICAgICAgICAgICAgICAwLjY4NjM5NWYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA5MCwKKyAgICAgICAgICAgICAgICAwLjk1Mzg3MmYsCisgICAgICAgICAgICAgICAgMi44ODAzMTVmLAorICAgICAgICAgICAgICAgIC0yLjEyMjM2NWYsCisgICAgICAgICAgICAgICAgMC43ODQwMzJmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMTAwLAorICAgICAgICAgICAgICAgIDAuOTUxMDA1ZiwKKyAgICAgICAgICAgICAgICAyLjg5NDI5NGYsCisgICAgICAgICAgICAgICAgLTIuMDA5MDg2ZiwKKyAgICAgICAgICAgICAgICAwLjY5ODMxNmYsCisgICAgICAgIH0sCiB9OwogLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaAppbmRleCBlMTAwZDhhLi40YjBkY2NhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaApAQCAtMzEsMTEgKzMxLDExIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gY29uc3QgICAgTFZNX1VJTlQzMiAgTFZNX0ZzVGFibGVbXTsKLWV4dGVybiAgICAgICAgICBMVk1fVUlOVDMyICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgTFZNX0ZzVGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDMyIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCk7CiAKLWV4dGVybiBjb25zdCAgICBMVk1fRkxPQVQgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV07CiAKLSNlbmRpZiAgLyoqIF9MVlJFVl9UQUJMRVNfSF8gKiovCisjZW5kaWYgLyoqIF9MVlJFVl9UQUJMRVNfSF8gKiovCiAKIC8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCmluZGV4IGM5ZmE3YWQuLjg1ZTNhYjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCkBAIC0yMiwyNTUgKzIyLDE5MSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENPTlNUQU5UUyBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBNZW1vcnkgdGFibGUqLwotI2RlZmluZSAgICAgTFZQU0FfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgICA0ICAgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUWVBFUyBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE1lbW9yeSBUeXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZQU0FfUEVSU0lTVEVOVCAgICAgID0gTFZNX1BFUlNJU1RFTlQsCi0gICAgTFZQU0FfUEVSU0lTVEVOVF9EQVRBID0gTFZNX1BFUlNJU1RFTlRfREFUQSwKLSAgICBMVlBTQV9QRVJTSVNURU5UX0NPRUYgPSBMVk1fUEVSU0lTVEVOVF9DT0VGLAotICAgIExWUFNBX1NDUkFUQ0ggICAgICAgICA9IExWTV9TQ1JBVENILAotICAgIExWUFNBX01FTU9SWV9EVU1NWSA9IExWTV9NQVhJTlRfMzIgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgMzIgYml0cyBlbnVtLCBkb24ndCB1c2UgaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gTFZQU0FfTWVtb3J5VHlwZXNfZW47Ci0KIC8qIExldmVsIGRldGVjdGlvbiBzcGVlZCBjb250cm9sIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWUFNBX1NQRUVEX0xPVywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9TUEVFRF9NRURJVU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lZGl1bSBzcGVlZCBsZXZlbCAgIGRldGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfU1BFRURfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX1NQRUVEX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgMzIgYml0cyBlbnVtLCBkb24ndCB1c2UgaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFZQU0FfU1BFRURfTE9XLCAgICAvKiBMb3cgc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1NQRUVEX01FRElVTSwgLyogTWVkaXVtIHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9TUEVFRF9ISUdILCAgIC8qIEhpZ2ggc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfU1BFRURfRFVNTVkgPSBMVk1fTUFYSU5UXzMyIC8qIEZvcmNlIDMyIGJpdHMgZW51bSwgZG9uJ3QgdXNlIGl0ISAqLwogfSBMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuOwogCiAvKiBGaWx0ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIENlbnRlckZyZXF1ZW5jeTsgICAgICAgICAgICAgLyogQ2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgYmFuZC1wYXNzIGZpbHRlciAoaW4gSHopICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgIC8qIFF1YWxpdHkgZmFjdG9yIG9mIHRoZSBmaWx0ZXIgICAgICAgICAgICAgKGluIDEvMTAwKSAgICAgICAgICAgICAgICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgUG9zdEdhaW47ICAgICAgICAgICAgICAgICAgICAvKiBQb3N0Z2FpbiB0byBhcHBseSBhZnRlciB0aGUgZmlsdGVyaW5nICAgIChpbiBkQiBRMTYuMCkgICAgICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9VSU5UMTYgQ2VudGVyRnJlcXVlbmN5OyAvKiBDZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBiYW5kLXBhc3MgZmlsdGVyIChpbiBIeikgKi8KKyAgICBMVk1fVUlOVDE2IFFGYWN0b3I7IC8qIFF1YWxpdHkgZmFjdG9yIG9mIHRoZSBmaWx0ZXIgICAgICAgICAgICAgKGluIDEvMTAwKSAgICAgICAgICAgICAgICovCisgICAgTFZNX0lOVDE2IFBvc3RHYWluOyAvKiBQb3N0Z2FpbiB0byBhcHBseSBhZnRlciB0aGUgZmlsdGVyaW5nICAgIChpbiBkQiBRMTYuMCkgICAgICAgICAgICAqLwogCiB9IExWUFNBX0ZpbHRlclBhcmFtX3Q7CiAKIC8qIExWUFNBIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247ICAvKiBTcGVjdHJhbCBkYXRhIGJ1ZmZlciBkdXJhdGlvbiBpbiB0aW1lIChtcyBpbiBRMTYuMCkgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE1heElucHV0QmxvY2tTaXplOyAgICAgICAgICAgLyogTWF4aW11bSBleHBlY3RlZCBpbnB1dCBibG9jayBzaXplIChpbiBzYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAvKiBQb2ludHMgdG8gbkJhbmRzIGZpbHRlciBwYXJhbSBzdHJ1Y3R1cmVzIGZvciBmaWx0ZXJzIHNldHRpbmdzICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9VSU5UMTYKKyAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOyAvKiBTcGVjdHJhbCBkYXRhIGJ1ZmZlciBkdXJhdGlvbiBpbiB0aW1lIChtcyBpbiBRMTYuMCkgKi8KKyAgICBMVk1fVUlOVDE2IE1heElucHV0QmxvY2tTaXplOyAgICAgICAvKiBNYXhpbXVtIGV4cGVjdGVkIGlucHV0IGJsb2NrIHNpemUgKGluIHNhbXBsZXMpICAgICAgICovCisgICAgTFZNX1VJTlQxNiBuQmFuZHM7IC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCoKKyAgICAgICAgICAgIHBGaWx0ZXJzUGFyYW1zOyAvKiBQb2ludHMgdG8gbkJhbmRzIGZpbHRlciBwYXJhbSBzdHJ1Y3R1cmVzIGZvciBmaWx0ZXJzIHNldHRpbmdzICAgICAqLwogCiB9IExWUFNBX0luaXRQYXJhbXNfdCwgKnBMVlBTQV9Jbml0UGFyYW1zX3Q7CiAKIC8qIExWUFNBIGNvbnRyb2wgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICBGczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsaW5nIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbiAgTGV2ZWxEZXRlY3Rpb25TcGVlZDsgICAgICAgICAvKiBMZXZlbCBkZXRlY3Rpb24gc3BlZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9Gc19lbiBGczsgLyogSW5wdXQgc2FtcGxpbmcgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuIExldmVsRGV0ZWN0aW9uU3BlZWQ7IC8qIExldmVsIGRldGVjdGlvbiBzcGVlZCAqLwogCiB9IExWUFNBX0NvbnRyb2xQYXJhbXNfdCwgKnBMVlBTQV9Db250cm9sUGFyYW1zX3Q7CiAKLS8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfTWVtb3J5VHlwZXNfZW4gICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gTFZQU0FfTWVtb3J5UmVnaW9uX3Q7Ci0KLS8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZQU0FfTWVtb3J5UmVnaW9uX3QgICAgICAgUmVnaW9uW0xWUFNBX05SX01FTU9SWV9SRUdJT05TXTsvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBMVlBTQV9NZW1UYWJfdDsKLQogLyogQXVkaW8gdGltZSB0eXBlICovCiB0eXBlZGVmIExWTV9JTlQzMiBMVlBTQV9UaW1lOwogCiAvKiBNb2R1bGUgaW5zdGFuY2UgSGFuZGxlICovCi10eXBlZGVmIHZvaWQgKnBMVlBTQV9IYW5kbGVfdDsKK3R5cGVkZWYgdm9pZCogcExWUFNBX0hhbmRsZV90OwogCiAvKiBMVlBTQSByZXR1cm4gY29kZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWUFNBX09LLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZ1bmN0aW9uIHJhbiB3aXRob3V0IGFueSBwcm9ibGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEgcGFyYW1ldGVyIGlzIGluY29ycmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfRVJST1JfV1JPTkdUSU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbiBpbmNvcnJlY3QgQXVkaW9UaW1lIGlzIHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX0VSUk9SX05VTExBRERSRVNTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQSBwb2ludGVyIGhhcyBhIE5VTEwgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9SRVRVUk5fRFVNTVkgPSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIDMyIGJpdHMgZW51bSwgZG9uJ3QgdXNlIGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit0eXBlZGVmIGVudW0geworICAgIExWUFNBX09LLCAvKiBUaGUgZnVuY3Rpb24gcmFuIHdpdGhvdXQgYW55IHByb2JsZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSwgLyogQSBwYXJhbWV0ZXIgaXMgaW5jb3JyZWN0ICovCisgICAgTFZQU0FfRVJST1JfV1JPTkdUSU1FLCAgIC8qIEFuIGluY29ycmVjdCBBdWRpb1RpbWUgaXMgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRVJST1JfTlVMTEFERFJFU1MsIC8qIEEgcG9pbnRlciBoYXMgYSBOVUxMIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfUkVUVVJOX0RVTU1ZID0gTFZNX01BWElOVF8zMiAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgKi8KIH0gTFZQU0FfUkVUVVJOOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTlMgUFJPVE9UWVBFCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluaXRQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSB0aGUgTFZQU0EgbW9kdWxlIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdFBhcmFtcyAgICAgICAgICBJbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvbnRyb2xQYXJhbXMgICAgICAgQ29udHJvbCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgIFBvaW50ZXIgdG8gYnVuZGxlIHNjcmF0Y2ggbWVtb3J5IGFyZWEgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0luaXQocExWUFNBX0hhbmRsZV90KiBwaEluc3RhbmNlLCBMVlBTQV9Jbml0UGFyYW1zX3QqIHBJbml0UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwQ29udHJvbFBhcmFtcywgdm9pZCogcFNjcmF0Y2gpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgaW4gTFZQU0FfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfRGVJbml0KHBMVlBTQV9IYW5kbGVfdCogcGhJbnN0YW5jZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NvbnRyb2wgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluaXRpYWxpemVzIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAqLworLyogIENvbnRyb2xzIHRoZSBMVlBTQSBtb2R1bGUuICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAqLworLyogIHBOZXdQYXJhbXMgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbml0UGFyYW1zICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaW5pdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ29udHJvbFBhcmFtcyAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfSW5pdCAgICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAgKnBJbml0UGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgICpwQ29udHJvbFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlICApOworTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwTmV3UGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29udHJvbHMgdGhlIExWUFNBIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICovCisvKiAgVGhlIHByb2Nlc3MgY2FsY3VsYXRlcyB0aGUgbGV2ZWxzIG9mIHRoZSBmcmVxdWVuY3kgYmFuZHMuICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE5ld1BhcmFtcyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBuZXcgY29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAqLworLyogIHBMVlBTQV9JbnB1dFNhbXBsZXMgUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyBidWZmZXIgKi8KKy8qICBJbnB1dEJsb2NrU2l6ZSAgICAgIE51bWJlciBvZiBtb25vIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworLyogIEF1ZGlvVGltZSAgICAgICAgICAgUGxheWJhY2sgdGltZSBvZiB0aGUgZmlyc3QgaW5wdXQgc2FtcGxlICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9Db250cm9sICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcE5ld1BhcmFtcyAgICAgKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCogcExWUFNBX0lucHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgSW5wdXRCbG9ja1NpemUsIExWUFNBX1RpbWUgQXVkaW9UaW1lKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAqLworLyogIEdldFNwZWN0cnVtQXVkaW9UaW1lIFRpbWUgdG8gcmV0cmlldmUgdGhlIHZhbHVlcyBhdCAqLworLyogIHBDdXJyZW50VmFsdWVzICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgYnVmZmVyIDogQ3VycmVudCBsZXZlbCB2YWx1ZXMgb3V0cHV0ICovCisvKiAgcFBlYWtWYWx1ZXMgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBidWZmZXIgOiBQZWFrIGxldmVsIHZhbHVlcyBvdXRwdXQgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWUFNBX1RpbWUgR2V0U3BlY3RydW1BdWRpb1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4KiBwQ3VycmVudFZhbHVlcywgTFZNX1VJTlQ4KiBwUGVha1ZhbHVlcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldENvbnRyb2xQYXJhbXMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoZSBwcm9jZXNzIGNhbGN1bGF0ZXMgdGhlIGxldmVscyBvZiB0aGUgZnJlcXVlbmN5IGJhbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAqLworLyogIEdldCB0aGUgY3VycmVudCBjb250cm9sIHBhcmFtZXRlcnMgb2YgdGhlIExWUFNBIG1vZHVsZS4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTFZQU0FfSW5wdXRTYW1wbGVzIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5wdXRCbG9ja1NpemUgICAgICBOdW1iZXIgb2YgbW9ubyBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEF1ZGlvVGltZSAgICAgICAgICAgUGxheWJhY2sgdGltZSBvZiB0aGUgZmlyc3QgaW5wdXQgc2FtcGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjb250cm9sIHBhcmFtZXRlcnMgc3RydWN0dXJlICovCisvKiBSRVRVUk5TOiAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICAgKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR2V0U3BlY3RydW1BdWRpb1RpbWUgVGltZSB0byByZXRyaWV2ZSB0aGUgdmFsdWVzIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDdXJyZW50VmFsdWVzICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgYnVmZmVyIDogQ3VycmVudCBsZXZlbCB2YWx1ZXMgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGVha1ZhbHVlcyAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlciA6IFBlYWsgbGV2ZWwgdmFsdWVzIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApOworTFZQU0FfUkVUVVJOIExWUFNBX0dldENvbnRyb2xQYXJhbXMocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRDb250cm9sUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0SW5pdFBhcmFtcyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR2V0IHRoZSBjdXJyZW50IGNvbnRyb2wgcGFyYW1ldGVycyBvZiB0aGUgTFZQU0EgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICovCisvKiAgR2V0IHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBpbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICovCisvKiBSRVRVUk5TOiAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICpwUGFyYW1zICAgICAgKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR2V0IHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBpbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAqcFBhcmFtcyAgICAgICk7CitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0SW5pdFBhcmFtcyhwTFZQU0FfSGFuZGxlX3QgaEluc3RhbmNlLCBMVlBTQV9Jbml0UGFyYW1zX3QqIHBQYXJhbXMpOwogCiAjZW5kaWYgLyogX0xWUFNBX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcAppbmRleCBkZWFmYWE3Li40ZTkwYTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwCkBAIC0xNSwzMCArMTUsMjUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICAgICJMVlBTQS5oIgotI2luY2x1ZGUgICAgIkxWUFNBX1ByaXZhdGUuaCIKLSNpbmNsdWRlICAgICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZQU0EuaCIKKyNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCi0jZGVmaW5lICAgICBMT1dfRlJFUSAgICAgICAgICAgIDI5OCAgICAgICAgICAgICAvKiAzMjc2OC8xMTAgZm9yIGxvdyB0ZXN0IGZyZXF1ZW5jeSAqLwotI2RlZmluZSAgICAgSElHSF9GUkVRICAgICAgICAgICAzODYgICAgICAgICAgICAgLyogMzI3NjgvODUgZm9yIGhpZ2ggdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgTE9XX0ZSRVEgMjk4ICAvKiAzMjc2OC8xMTAgZm9yIGxvdyB0ZXN0IGZyZXF1ZW5jeSAqLworI2RlZmluZSBISUdIX0ZSRVEgMzg2IC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCiAKLUxWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICggIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZShMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0LCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCi1MVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKCBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApOworTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyhMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0LCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpOworTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgRnMsIExWUFNBX0ZpbHRlclBhcmFtX3QqIHBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCogcENvZWZmaWNpZW50cyk7CiAKLUxWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICpwRmlsdGVyUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAqcENvZWZmaWNpZW50cyk7Ci1MVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGQ29lZmZpY2llbnRzKCBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApOworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKExWTV9VSU5UMTYgRnMsIExWUFNBX0ZpbHRlclBhcmFtX3QqIHBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCogcENvZWZmaWNpZW50cyk7CitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGQ29lZmZpY2llbnRzKExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcyk7CiAKLUxWUFNBX1JFVFVSTiBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0KTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkoTFZQU0FfSW5zdGFuY2VQcl90KiBwSW5zdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTYsMjkgKzUxLDIzIEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfQ29udHJvbCAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBOZXdQYXJhbXMgICAgICkKLXsKK0xWUFNBX1JFVFVSTiBMVlBTQV9Db250cm9sKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcE5ld1BhcmFtcykgeworICAgIExWUFNBX0luc3RhbmNlUHJfdCogcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CiAKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLQotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTmV3UGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTmV3UGFyYW1zID09IExWTV9OVUxMKSkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKICAgICB9Ci0gICAgaWYocE5ld1BhcmFtcy0+RnMgPj0gTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICBpZiAocE5ld1BhcmFtcy0+RnMgPj0gTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwogICAgIH0KLSAgICBpZihwTmV3UGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkID49IExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIGlmIChwTmV3UGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkID49IExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CiAgICAgfQogCiAgICAgcExWUFNBX0luc3QtPk5ld1BhcmFtcyA9ICpwTmV3UGFyYW1zOwogICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NiwyMCArODUsMTcgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9HZXRDb250cm9sUGFyYW1zICAgICAgICAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAqcFBhcmFtcyApCi17Ci0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyhwTFZQU0FfSGFuZGxlX3QgaEluc3RhbmNlLCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QqIHBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwogCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwogICAgIH0KIAotICAgIHBQYXJhbXMtPkZzICAgICAgICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GczsKLSAgICBwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICAgID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZDsKKyAgICBwUGFyYW1zLT5GcyA9IHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzOworICAgIHBQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgPSBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkOwogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyNywyMiArMTEzLDE5IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfR2V0SW5pdFBhcmFtcyAgICAgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgKnBQYXJhbXMgKQotewotICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ICAgID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfSW5pdFBhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKIAotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKICAgICB9CiAKLSAgICBwUGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiAgID0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOwotICAgIHBQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemU7Ci0gICAgcFBhcmFtcy0+bkJhbmRzICAgICAgICAgICAgICAgICAgICAgICA9IHBMVlBTQV9JbnN0LT5uQmFuZHM7Ci0gICAgcFBhcmFtcy0+cEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgICA9IHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtczsKKyAgICBwUGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKKyAgICBwUGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZTsKKyAgICBwUGFyYW1zLT5uQmFuZHMgPSBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIHBQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zID0gcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zOwogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE2Myw0MiArMTQ2LDM4IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAoTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcEluc3QpCi17CitMVlBTQV9SRVRVUk4gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyhMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0KSB7CiAgICAgTFZNX1VJTlQxNiBpaTsKICAgICBMVk1fVUlOVDE2IEZyZXE7Ci0gICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUGFyYW1zOwotICAgIGV4dGVybiBMVk1fSU5UMTYgICAgICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW107Ci0gICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOwotICAgIGV4dGVybiBMVk1fVUlOVDE2ICAgICAgIExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdOworICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCBQYXJhbXM7CisgICAgZXh0ZXJuIExWTV9JTlQxNiBMVlBTQV9uU2FtcGxlc0J1ZmZlclVwZGF0ZVtdOworICAgIGV4dGVybiBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsKKyAgICBleHRlcm4gTFZNX1VJTlQxNiBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXTsKIAotICAgIGlmKHBJbnN0ID09IDApCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIGlmIChwSW5zdCA9PSAwKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwogICAgIH0KIAogICAgIFBhcmFtcyA9IHBJbnN0LT5OZXdQYXJhbXM7CiAKICAgICAvKiBNb2RpZmllcyBmaWx0ZXJzIHR5cGVzIGFuZCBjb2VmZmljaWVudHMsIGNsZWFyIHRoZSB0YXBzIGFuZAogICAgICAgIHJlLWluaXRpYWxpemVzIHBhcmFtZXRlcnMgaWYgc2FtcGxlIGZyZXF1ZW5jeSBoYXMgY2hhbmdlZCAgICAqLwotICAgIGlmKFBhcmFtcy5GcyAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5GcykKLSAgICB7CisgICAgaWYgKFBhcmFtcy5GcyAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5GcykgewogICAgICAgICBwSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9IFBhcmFtcy5GczsKIAogICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBjZW50ZXIgZnJlcWV1bmNpZXMgYXMgYSBmdW5jdGlvbiBvZiB0aGUgc2FtcGxlIHJhdGUgKi8KLSAgICAgICAgRnJlcSA9IChMVk1fVUlOVDE2KSAoKExWUFNBX1NhbXBsZVJhdGVUYWJbcEluc3QtPkN1cnJlbnRQYXJhbXMuRnNdPj4xKSAvIChwSW5zdC0+bkJhbmRzICsgMSkpOwotICAgICAgICBmb3IoaWkgPSBwSW5zdC0+bkJhbmRzOyBpaSA+IDA7IGlpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaS0xXS5DZW50ZXJGcmVxdWVuY3kgPSAoTFZNX1VJTlQxNikgKEZyZXEgKiBpaSk7CisgICAgICAgIEZyZXEgPSAoTFZNX1VJTlQxNikoKExWUFNBX1NhbXBsZVJhdGVUYWJbcEluc3QtPkN1cnJlbnRQYXJhbXMuRnNdID4+IDEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3QtPm5CYW5kcyArIDEpKTsKKyAgICAgICAgZm9yIChpaSA9IHBJbnN0LT5uQmFuZHM7IGlpID4gMDsgaWktLSkgeworICAgICAgICAgICAgcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpIC0gMV0uQ2VudGVyRnJlcXVlbmN5ID0gKExWTV9VSU5UMTYpKEZyZXEgKiBpaSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlbGV2YW50IGZpbHRlcnMuIElmIHRoZSBjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBmaWx0ZXIgaXMKICAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIG55cXVpc3QgZnJlcXVlbmN5LCB0aGVuIHRoZSBmaWx0ZXIgaXMgbm90IHJlbGV2YW50IGFuZCBkb2Vzbid0CiAgICAgICAgICAgIG5lZWQgdG8gYmUgdXNlZCAqLwotICAgICAgICBmb3IoaWkgPSBwSW5zdC0+bkJhbmRzOyBpaSA+IDA7IGlpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaS0xXS5DZW50ZXJGcmVxdWVuY3kgPCAoTFZQU0FfU2FtcGxlUmF0ZVRhYltwSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10+PjEpKQotICAgICAgICAgICAgeworICAgICAgICBmb3IgKGlpID0gcEluc3QtPm5CYW5kczsgaWkgPiAwOyBpaS0tKSB7CisgICAgICAgICAgICBpZiAocEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpIC0gMV0uQ2VudGVyRnJlcXVlbmN5IDwKKyAgICAgICAgICAgICAgICAoTFZQU0FfU2FtcGxlUmF0ZVRhYltwSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10gPj4gMSkpIHsKICAgICAgICAgICAgICAgICBwSW5zdC0+blJlbGV2YW50RmlsdGVycyA9IGlpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjExLDE5ICsxOTAsMTQgQEAKICAgICAgICAgcEluc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IDA7CiAgICAgICAgIHBJbnN0LT5Eb3duU2FtcGxpbmdGYWN0b3IgPSBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbUGFyYW1zLkZzXTsKICAgICAgICAgcEluc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gMDsKLSAgICAgICAgZm9yKGlpID0gMDsgaWkgPCAocEluc3QtPm5CYW5kcyAqIHBJbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpOyBpaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChwSW5zdC0+bkJhbmRzICogcEluc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCk7IGlpKyspIHsKICAgICAgICAgICAgIHBJbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnRbaWldID0gMDsKICAgICAgICAgfQotICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5CYW5kczsgaWkrKykgewogICAgICAgICAgICAgcEluc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9IDA7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgIT0gcEluc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCkKLSAgICAgICAgeworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkKSB7CiAgICAgICAgICAgICBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMocEluc3QsICZQYXJhbXMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjUzLDQ3ICsyMjcsNDMgQEAKIC8qICAgICAgICAgIFNpbmdsZSBwcmVjaXNpb24gICAgb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICggICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKQotewotICAgIGV4dGVybiBMVk1fVUlOVDMyICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWUFNBX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+RnNdOyAgICAgIC8qIFNhbXBsZSByYXRlICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZShMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0LCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBleHRlcm4gTFZNX1VJTlQzMiBMVlBTQV9TYW1wbGVSYXRlVGFiW107IC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisgICAgTFZNX1VJTlQxNiBpaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLworICAgIExWTV9VSU5UMzIgZnMgPSAoTFZNX1VJTlQzMilMVlBTQV9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkZzXTsgLyogU2FtcGxlIHJhdGUgKi8KKyAgICBMVk1fVUlOVDMyIGZjOyAgICAgLyogRmlsdGVyIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICBMVk1fSU5UMTYgUUZhY3RvcjsgLyogRmlsdGVyIFEgZmFjdG9yICovCiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspIHsKICAgICAgICAgLyoKICAgICAgICAgICogR2V0IHRoZSBmaWx0ZXIgc2V0dGluZ3MKICAgICAgICAgICovCi0gICAgICAgIGZjID0gKExWTV9VSU5UMzIpcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3k7ICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgICAgICBRRmFjdG9yID0oTFZNX0lOVDE2KSBwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KKyAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldCisgICAgICAgICAgICAgICAgICAgICAuQ2VudGVyRnJlcXVlbmN5OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yOyAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAogICAgICAgICAgKi8KLSAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOyAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCi0gICAgICAgIGlmICgoTE9XX0ZSRVEgKiBmcykgPj0gKGZjIDw8IDE1KSkKLSAgICAgICAgeworICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPQorICAgICAgICAgICAgICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjsgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisgICAgICAgIGlmICgoTE9XX0ZSRVEgKiBmcykgPj0gKGZjIDw8IDE1KSkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIGZjIDw9IGZzLzExMAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPSBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKChMT1dfRlJFUSAqIGZzKSA8IChmYyA8PCAxNSkpICYmICgoZmMgPDwgMTUpIDwgKEhJR0hfRlJFUSAqIGZzKSkgJiYgKFFGYWN0b3IgPiAzMDApKQotICAgICAgICAgICAgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCgoTE9XX0ZSRVEgKiBmcykgPCAoZmMgPDwgMTUpKSAmJiAoKGZjIDw8IDE1KSA8IChISUdIX0ZSRVEgKiBmcykpICYmCisgICAgICAgICAgICAgICAgKFFGYWN0b3IgPiAzMDApKSB7CiAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAqIChmcy8xMTAgPCBmYyA8IGZzLzg1KSAmIChRPjMpCi0gICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgKiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKQorICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIHBJbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSA9IExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMTQsNjAgKzI4NCw0OSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBpaTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoTFZQU0FfSW5zdGFuY2VQcl90KiBwSW5zdCwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX1VJTlQxNiBpaTsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZCBieSB0aGUgaW5pdCBmdW5jdGlvbgogICAgICAqLwotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKLSAgICAgICAgc3dpdGNoICAocEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKSB7CisgICAgICAgIHN3aXRjaCAocEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKSB7CisgICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjogeworICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgQ29lZmZpY2llbnRzOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLCAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sICZwSW5zdC0+cEJQX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgICAgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisgICAgICAgICAgICBjYXNlIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjogeworICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgQ29lZmZpY2llbnRzOwogCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sICZwSW5zdC0+cEJQX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOworICAgIHJldHVybiAoTFZQU0FfT0spOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzg4LDI2ICszNDcsMjAgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApCi17Ci0gICAgTFZNX1VJTlQxNiAgICAgaWk7Ci0gICAgTFZNX0ZzX2VuICAgICAgRnMgPSBwUGFyYW1zLT5GczsKLSAgICBRUERfRkxPQVRfQ29lZnMgICpwQ29lZmZpY2llbnRzOwotICAgIGV4dGVybiAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW107CitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgaWk7CisgICAgTFZNX0ZzX2VuIEZzID0gcFBhcmFtcy0+RnM7CisgICAgUVBEX0ZMT0FUX0NvZWZzKiBwQ29lZmZpY2llbnRzOworICAgIGV4dGVybiBRUERfRkxPQVRfQ29lZnMgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW107CiAKLSAgICBwQ29lZmZpY2llbnRzID0gJkxWUFNBX1FQRF9GbG9hdF9Db2Vmc1socFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKSArIEZzXTsKKyAgICBwQ29lZmZpY2llbnRzID0KKyAgICAgICAgICAgICZMVlBTQV9RUERfRmxvYXRfQ29lZnNbKHBQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgKiBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkgKyBGc107CiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKLSAgICB7Ci0gICAgICAgIExWUFNBX1FQRF9Jbml0X0Zsb2F0ICgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cFFQRF9UYXBzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykgeworICAgICAgICBMVlBTQV9RUERfSW5pdF9GbG9hdCgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwgJnBJbnN0LT5wUVBEX1RhcHNbaWldLCBwQ29lZmZpY2llbnRzKTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOwotCisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDQzLDQ5ICszOTYsNDYgQEAKIC8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICpwRmlsdGVyUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAqcENvZWZmaWNpZW50cykKLXsKLQotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2IEZzLCBMVlBTQV9GaWx0ZXJQYXJhbV90KiBwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZmljaWVudHMpIHsKKyAgICBleHRlcm4gTFZNX0ZMT0FUIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Db3NDb2VmW107CiAKICAgICAvKgogICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKICAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIER0MDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX0RlbjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX051bTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIENPU19UMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIGNvZWY7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBmYWN0b3I7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICB0MDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisgICAgTFZNX0ZMT0FUIFQwOworICAgIExWTV9GTE9BVCBEOworICAgIExWTV9GTE9BVCBBMDsKKyAgICBMVk1fRkxPQVQgQjE7CisgICAgTFZNX0ZMT0FUIEIyOworICAgIExWTV9GTE9BVCBEdDA7CisgICAgTFZNX0ZMT0FUIEIyX0RlbjsKKyAgICBMVk1fRkxPQVQgQjJfTnVtOworICAgIExWTV9GTE9BVCBDT1NfVDA7CisgICAgTFZNX0ZMT0FUIGNvZWY7CisgICAgTFZNX0ZMT0FUIGZhY3RvcjsKKyAgICBMVk1fRkxPQVQgdDA7CisgICAgTFZNX0lOVDE2IGk7CiAKICAgICAvKgogICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KICAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgRnJlcXVlbmN5ICAgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOwotICAgIExWTV9GTE9BVCAgICAgICAgICBRRmFjdG9yICAgICA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CisgICAgTFZNX0ZMT0FUIEZyZXF1ZW5jeSA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7CisgICAgTFZNX0ZMT0FUIFFGYWN0b3IgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwogICAgICAqLwotICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107IC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCisgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKICAgICAgKi8KLSAgICBEdDAgPSAgVDAgLyAyMDQ4IDsKKyAgICBEdDAgPSBUMCAvIDIwNDg7CiAgICAgQjJfRGVuID0gUUZhY3RvciArIER0MDsKICAgICBCMl9OdW0gPSBEdDAgLSBRRmFjdG9yOwogICAgIEIyID0gQjJfTnVtIC8gKDIgKiBCMl9EZW4pOwpAQCAtNDk1LDIwICs0NDUsMTkgQEAKICAgICAgKgogICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKICAgICAgKi8KLSAgICBUMCA9IChUMCAvIDIwNDgpICogMC42MzY1ODU1OGY7ICAgICAgICAgICAgICAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzIgKi8KLSAgICB0MCA9IFQwIDsKLSAgICBmYWN0b3IgPSAxLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCi0gICAgQ09TX1QwID0gMC4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCi0gICAgZm9yIChpID0gMTsgaSA8IDc7IGkrKykKLSAgICB7Ci0gICAgICAgIGNvZWYgICAgPSBMVlBTQV9GbG9hdF9Db3NDb2VmW2ldOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLwotICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpOyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KLSAgICAgICAgZmFjdG9yICA9IChmYWN0b3IgKiB0MCkgOyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICBUMCA9IChUMCAvIDIwNDgpICogMC42MzY1ODU1OGY7IC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gVDA7CisgICAgZmFjdG9yID0gMS4wZjsgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENPU19UMCA9IDAuMGY7IC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKSB7CisgICAgICAgIGNvZWYgPSBMVlBTQV9GbG9hdF9Db3NDb2VmW2ldOyAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpOyAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApOyAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KICAgICB9Ci0gICAgQ09TX1QwID0gQ09TX1QwICogODsgICAgLypMVlBTQV9Db3NDb2VmX2Zsb2F0WzBdKi8gICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisgICAgQ09TX1QwID0gQ09TX1QwICogODsgLypMVlBTQV9Db3NDb2VmX2Zsb2F0WzBdKi8gLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLwogCi0gICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMikgKiAoQ09TX1QwKTsgICAgLyogQjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAqLwotICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisgICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMikgKiAoQ09TX1QwKTsgLyogQjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAqLworICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICsgQjIpIC8gMjsgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KIAogICAgIC8qCiAgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKQEAgLTUxNyw3ICs0NjYsNyBAQAogICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjEgKiAyOwogICAgIHBDb2VmZmljaWVudHMtPkIyID0gQjIgKiAyOwogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NjEsNDkgKzUxMCw0NiBAQAogLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICpwQ29lZmZpY2llbnRzKQotewotCi0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOwotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW107CitMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoTFZNX1VJTlQxNiBGcywgTFZQU0FfRmlsdGVyUGFyYW1fdCogcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190KiBwQ29lZmZpY2llbnRzKSB7CisgICAgZXh0ZXJuIExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW107CiAKICAgICAvKgogICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKICAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIER0MDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX0RlbjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX051bTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIENvc0VycjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIGNvZWY7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBmYWN0b3I7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICB0MDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisgICAgTFZNX0ZMT0FUIFQwOworICAgIExWTV9GTE9BVCBEOworICAgIExWTV9GTE9BVCBBMDsKKyAgICBMVk1fRkxPQVQgQjE7CisgICAgTFZNX0ZMT0FUIEIyOworICAgIExWTV9GTE9BVCBEdDA7CisgICAgTFZNX0ZMT0FUIEIyX0RlbjsKKyAgICBMVk1fRkxPQVQgQjJfTnVtOworICAgIExWTV9GTE9BVCBDb3NFcnI7CisgICAgTFZNX0ZMT0FUIGNvZWY7CisgICAgTFZNX0ZMT0FUIGZhY3RvcjsKKyAgICBMVk1fRkxPQVQgdDA7CisgICAgTFZNX0lOVDE2IGk7CiAKICAgICAvKgogICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KICAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgRnJlcXVlbmN5ICAgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOwotICAgIExWTV9GTE9BVCAgICAgICAgICBRRmFjdG9yICAgICA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CisgICAgTFZNX0ZMT0FUIEZyZXF1ZW5jeSA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7CisgICAgTFZNX0ZMT0FUIFFGYWN0b3IgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwogICAgICAqLwotICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIEQgPSAzMjAwOyAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLwotICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgotICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCisgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAogICAgICAqLwotICAgIER0MCA9ICBUMCAvIDIwNDggOworICAgIER0MCA9IFQwIC8gMjA0ODsKICAgICBCMl9EZW4gPSBRRmFjdG9yICsgRHQwOwogICAgIEIyX051bSA9IER0MCAtIFFGYWN0b3I7CiAgICAgQjIgPSBCMl9OdW0gLyAoMiAqIEIyX0Rlbik7CkBAIC02MTMsMjUgKzU1OSwyNCBAQAogICAgICAqCiAgICAgICogIENvc0VyciArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNAogICAgICAqLwotICAgIFQwID0gVDAgKiAwLjk5NDc1MGY7ICAgICAgICAgICAgICAgICAgICAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzUwICovCisgICAgVDAgPSBUMCAqIDAuOTk0NzUwZjsgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLwogICAgIHQwID0gVDA7Ci0gICAgZmFjdG9yID0gMS4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLwotICAgIENvc0VyciA9IDAuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLwotICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCi0gICAgewotICAgICAgICBjb2VmID0gTFZQU0FfRmxvYXRfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICBmYWN0b3IgPSAxLjBmOyAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCisgICAgQ29zRXJyID0gMC4wZjsgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgY29lZiA9IExWUFNBX0Zsb2F0X0RQQ29zQ29lZltpXTsgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KICAgICAgICAgQ29zRXJyICs9IGZhY3RvciAqIGNvZWY7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLwotICAgICAgICBmYWN0b3IgPSBmYWN0b3IgKiB0MDsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgICAgIGZhY3RvciA9IGZhY3RvciAqIHQwOyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCiAgICAgfQotICAgIENvc0VyciA9IENvc0VyciAqIDI7ICAgICAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KKyAgICBDb3NFcnIgPSBDb3NFcnIgKiAyOyAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cwogICAgICAqLwotICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpOyAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqLwotICAgIEEwID0gQjEgKiBDb3NFcnIgOyAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgKDAuNSAtIGIyKSAqIGNvc2Vycih0MCkgKi8KLSAgICBCMSAtPSBBMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqICgxIC0gY29zZXJyKHQwKSkgICovCi0gICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpOyAgICAgLyogQjEgPSAoMC41IC0gYjIpICovCisgICAgQTAgPSBCMSAqIENvc0VycjsgICAgICAgICAgICAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgKDAuNSAtIGIyKSAqIGNvc2Vycih0MCkgKi8KKyAgICBCMSAtPSBBMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqICgxIC0gY29zZXJyKHQwKSkgICovCisgICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgKyBCMikgLyAyOyAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCiAKICAgICAvKgogICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCkBAIC02NDAsNyArNTg1LDcgQEAKICAgICBwQ29lZmZpY2llbnRzLT5CMSA9IEIxOwogICAgIHBDb2VmZmljaWVudHMtPkIyID0gQjI7CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOworICAgIHJldHVybiAoTFZQU0FfT0spOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NTgsMjQgKzYwMywyMCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeShMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCkKLXsKLSAgICBMVk1fSU5UOCAgICAgICAqcFRhcEFkZHJlc3M7Ci0gICAgTFZNX1VJTlQzMiAgICAgICBpOworTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeShMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0KSB7CisgICAgTFZNX0lOVDgqIHBUYXBBZGRyZXNzOworICAgIExWTV9VSU5UMzIgaTsKIAogICAgIC8qIEJhbmQgUGFzcyBmaWx0ZXJzIHRhcHMgKi8KLSAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wQlBfVGFwczsKLSAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KTsgaSsrKQotICAgIHsKKyAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCopcEluc3QtPnBCUF9UYXBzOworICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KTsgaSsrKSB7CiAgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKICAgICB9CiAgICAgLyogUXVhc2ktcGVhayBmaWx0ZXJzIHRhcHMgKi8KLSAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wUVBEX1RhcHM7Ci0gICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KTsgaSsrKQotICAgIHsKKyAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCopcEluc3QtPnBRUERfVGFwczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KTsgaSsrKSB7CiAgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKICAgICB9CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOworICAgIHJldHVybiAoTFZQU0FfT0spOwogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAKaW5kZXggOWZjZDgyZi4uOWEyYjI5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmNwcApAQCAtMTUsMjMgKzE1LDI0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAgICAiTFZQU0EuaCIKLSNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiTFZQU0EuaCIKKyNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiSW5zdEFsbG9jLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluaXRpYWxpemUgdGhlIExWUFNBIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIEluaXRpYWxpemUgdGhlIExWUFNBIG1vZHVsZSBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBJbml0UGFyYW1zICAgICAgICAgIEluaXQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgQ29udHJvbFBhcmFtcyAgICAgICBDb250cm9sIHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgTWVtb3J5IHRhYmxlIHRoYXQgY29udGFpbnMgbWVtb3J5IGFyZWFzIGRlZmluaXRpb24gICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgIFBvaW50ZXIgdG8gYnVuZGxlIHNjcmF0Y2ggbWVtb3J5IGFyZWEgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOSw3NSArNDAsMjIgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9Jbml0ICAgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICAqcEluaXRQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgKnBDb250cm9sUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgICpwTWVtb3J5VGFibGUgKQotewotICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgICAqcExWUFNBX0luc3Q7Ci0gICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIGVycm9yQ29kZSAgICAgICA9IExWUFNBX09LOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBpaTsKLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgICAgICAgICAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW107Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCA9IDA7Ci0KLSAgICAvKiBJbnRzX0FsbG9jIGluc3RhbmNlcywgbmVlZGVkIGZvciBtZW1vcnkgYWxpZ25tZW50IG1hbmFnZW1lbnQgKi8KLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEluc3RhbmNlOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgU2NyYXRjaDsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIERhdGE7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBDb2VmOwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluaXRQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwotICAgIH0KLSAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID4gTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUpICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzIDwgTFZQU0FfTkJBTkRTTUlOKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA+IExWUFNBX05CQU5EU01BWCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwotICAgIH0KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbml0UGFyYW1zLT5uQmFuZHM7IGlpKyspCi0gICAgewotICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAotICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPiBMVlBTQV9NQVhQT1NUR0FJTikgICB8fAotICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPCBMVlBTQV9NSU5QT1NUR0FJTikgICB8fAotICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAotICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yID4gTFZQU0FfTUFYUUZBQ1RPUikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICAgICAgICAgfQotICAgIH0KLQotICAgIC8qSW5zdF9BbGxvYyBpbnN0YW5jZXMgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBJbnN0QWxsb2NfSW5pdCggJkluc3RhbmNlICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZTY3JhdGNoICAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZEYXRhICAgICAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJkNvZWYgICAgICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MpOworTFZQU0FfUkVUVVJOIExWUFNBX0luaXQocExWUFNBX0hhbmRsZV90KiBwaEluc3RhbmNlLCBMVlBTQV9Jbml0UGFyYW1zX3QqIHBJbml0UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwQ29udHJvbFBhcmFtcywgdm9pZCogcFNjcmF0Y2gpIHsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QqIHBMVlBTQV9JbnN0OworICAgIExWUFNBX1JFVFVSTiBlcnJvckNvZGUgPSBMVlBTQV9PSzsKKyAgICBMVk1fVUlOVDMyIGlpOworICAgIGV4dGVybiBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfR2FpblRhYmxlW107CisgICAgTFZNX1VJTlQzMiBCdWZmZXJMZW5ndGggPSAwOwogCiAgICAgLyogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KLSAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAqcGhJbnN0YW5jZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgc2l6ZW9mKExWUFNBX0luc3RhbmNlUHJfdCkgKTsKKyAgICAqcGhJbnN0YW5jZSA9IGNhbGxvYygxLCBzaXplb2YoKnBMVlBTQV9JbnN0KSk7CisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKICAgICB9Ci0gICAgcExWUFNBX0luc3QgPShMVlBTQV9JbnN0YW5jZVByX3QqKSpwaEluc3RhbmNlOworICAgIHBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopKnBoSW5zdGFuY2U7CiAKLSAgICAvKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgTFZQU0FfTlJfTUVNT1JZX1JFR0lPTlM7IGlpKyspCi0gICAgewotICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baWldLlNpemUhPTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpaV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltpaV0gPSBwTWVtb3J5VGFibGUtPlJlZ2lvbltpaV07Ci0gICAgICAgIH0KLSAgICB9CisgICAgcExWUFNBX0luc3QtPnBTY3JhdGNoID0gcFNjcmF0Y2g7CiAKICAgICAvKiBJbml0aWFsaXplIG1vZHVsZSdzIGludGVybmFsIHBhcmFtZXRlcnMgKi8KICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwpAQCAtMTE3LDgxICs2NSwxNTAgQEAKICAgICBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9IExWTV9GU19EVU1NWTsKICAgICBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkID0gTFZQU0FfU1BFRURfRFVNTVk7CiAKLSAgICB7ICAgLyogZm9yIGF2b2lkaW5nIFFBQyB3YXJuaW5ncyAqLwotICAgICAgICBMVk1fSU5UMzIgU0RCRD0oTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKLSAgICAgICAgTFZNX0lOVDMyIElSVEk9KExWTV9JTlQzMilMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52OworICAgIHsgLyogZm9yIGF2b2lkaW5nIFFBQyB3YXJuaW5ncyAqLworICAgICAgICBMVk1fSU5UMzIgU0RCRCA9IChMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgICAgICBMVk1fSU5UMzIgSVJUSSA9IChMVk1fSU5UMzIpTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludjsKICAgICAgICAgTFZNX0lOVDMyIEJMOwogCi0gICAgICAgIE1VTDMyeDMySU5UTzMyKFNEQkQsSVJUSSxCTCxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpCisgICAgICAgIE1VTDMyeDMySU5UTzMyKFNEQkQsIElSVEksIEJMLCBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpCiAKLSAgICAgICAgQnVmZmVyTGVuZ3RoPShMVk1fVUlOVDMyKUJMOworICAgICAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCA9IChMVk1fVUlOVDMyKUJMOwogICAgIH0KIAotICAgIGlmKChCdWZmZXJMZW5ndGggKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24pCi0gICAgeworICAgIGlmICgoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKSB7CiAgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggPSBCdWZmZXJMZW5ndGggKyAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggPSBCdWZmZXJMZW5ndGg7CiAgICAgfQogCiAgICAgLyogQXNzaWduIHRoZSBwb2ludGVycyAqLwotICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgID0KLSAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICA9IChMVlBTQV9GaWx0ZXJQYXJhbV90ICopCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0ZpbHRlclBhcmFtX3QpKTsKLSAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICAgPSAoTFZNX1VJTlQ4ICopCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoICogc2l6ZW9mKExWTV9VSU5UOCkpOwotICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyAgICAgICAgICAgICA9IChMVk1fVUlOVDggKikKLSAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UOCkpOwotICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICAgICAgICA9IChMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiAqKQotICAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSk7Ci0gICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgKikKLSAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0gICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSAoUVBEX0ZMT0FUX1N0YXRlX3QgKikKLSAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSk7Ci0KLSAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IChCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqKQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKLSAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzICAgICAgICAgICAgICA9IChRUERfRkxPQVRfVGFwc190ICopCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9UYXBzX3QpKTsKKyAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyA9CisgICAgICAgICAgICAoTFZNX0ZMT0FUKiljYWxsb2MocEluaXRQYXJhbXMtPm5CYW5kcywgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBQb3N0R2FpbnMpKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zID0gKExWUFNBX0ZpbHRlclBhcmFtX3QqKWNhbGxvYygKKyAgICAgICAgICAgIHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcykpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCA9IChMVk1fVUlOVDgqKWNhbGxvYygKKyAgICAgICAgICAgIHBJbml0UGFyYW1zLT5uQmFuZHMsIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzID0KKyAgICAgICAgICAgIChMVk1fVUlOVDgqKWNhbGxvYyhwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MpKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uID0gKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKiljYWxsb2MoCisgICAgICAgICAgICBwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbikpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyA9IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopY2FsbG9jKAorICAgICAgICAgICAgcEluaXRQYXJhbXMtPm5CYW5kcywgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMpKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzID0KKyAgICAgICAgICAgIChRUERfRkxPQVRfU3RhdGVfdCopY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcykpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBRUERfU3RhdGVzID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBCUF9UYXBzID0gKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KiljYWxsb2MoCisgICAgICAgICAgICBwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cEJQX1RhcHMpKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wQlBfVGFwcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgPQorICAgICAgICAgICAgKFFQRF9GTE9BVF9UYXBzX3QqKWNhbGxvYyhwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cFFQRF9UYXBzKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFFQRF9UYXBzID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CiAKICAgICAvKiBDb3B5IGZpbHRlcnMgcGFyYW1ldGVycyBpbiB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAqLwotICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykgewogICAgICAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldID0gcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXTsKICAgICB9CiAKICAgICAvKiBTZXQgUG9zdCBmaWx0ZXJzIGdhaW5zKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgewotICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPSBMVlBTQV9GbG9hdF9HYWluVGFibGVbMTUgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW5dOworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspIHsKKyAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbaWldID0KKyAgICAgICAgICAgICAgICBMVlBTQV9GbG9hdF9HYWluVGFibGVbMTUgKyBwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluXTsKICAgICB9CiAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OwogCiAgICAgLyogSW5pdGlhbGl6ZSBjb250cm9sIGRlcGVuZGFudCBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCi0gICAgZXJyb3JDb2RlID0gTFZQU0FfQ29udHJvbCAoKnBoSW5zdGFuY2UsIHBDb250cm9sUGFyYW1zKTsKKyAgICBlcnJvckNvZGUgPSBMVlBTQV9Db250cm9sKCpwaEluc3RhbmNlLCBwQ29udHJvbFBhcmFtcyk7CiAKLSAgICBpZihlcnJvckNvZGUhPTApCi0gICAgeworICAgIGlmIChlcnJvckNvZGUgIT0gMCkgewogICAgICAgICByZXR1cm4gZXJyb3JDb2RlOwogICAgIH0KIAotICAgIGVycm9yQ29kZSA9IExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgKHBMVlBTQV9JbnN0KTsKKyAgICBlcnJvckNvZGUgPSBMVlBTQV9BcHBseU5ld1NldHRpbmdzKHBMVlBTQV9JbnN0KTsKIAotICAgIGlmKGVycm9yQ29kZSE9MCkKLSAgICB7CisgICAgaWYgKGVycm9yQ29kZSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBlcnJvckNvZGU7CiAgICAgfQogCi0gICAgcmV0dXJuKGVycm9yQ29kZSk7CisgICAgcmV0dXJuIChlcnJvckNvZGUpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgaW4gTFZQU0FfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfRGVJbml0KHBMVlBTQV9IYW5kbGVfdCogcGhJbnN0YW5jZSkgeworICAgIExWUFNBX0luc3RhbmNlUHJfdCogcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KikqcGhJbnN0YW5jZTsKKyAgICBpZiAocExWUFNBX0luc3QgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBQb3N0R2FpbnMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMpOworICAgICAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbiAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMpOworICAgICAgICBwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBRUERfU3RhdGVzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocExWUFNBX0luc3QtPnBRUERfU3RhdGVzKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cEJQX1RhcHMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cEJQX1RhcHMpOworICAgICAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cFFQRF9UYXBzKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBmcmVlKHBMVlBTQV9JbnN0KTsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmY2JlNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAgICAiTFZQU0EuaCIKLSNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBJbml0UGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKQotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgaWk7Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICBCdWZmZXJMZW5ndGg7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIFNjcmF0Y2g7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgQ29lZjsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwotCi0gICAgSW5zdEFsbG9jX0luaXQoICZJbnN0YW5jZSAgICwgTFZNX05VTEwpOwotICAgIEluc3RBbGxvY19Jbml0KCAmU2NyYXRjaCAgICAsIExWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJkRhdGEgICAgICAgLCBMVk1fTlVMTCk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZDb2VmICAgICAgICwgTFZNX05VTEwpOwotCi0gICAgaWYoKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkgfHwgKHBJbml0UGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLQotICAgICAgICAvKiBDaGVjayBpbml0IHBhcmFtZXRlciAqLwotICAgICAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID09IDApICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPiBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSkgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA8IExWUFNBX05CQU5EU01JTikgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzID4gTFZQU0FfTkJBTkRTTUFYKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5pdFBhcmFtcy0+bkJhbmRzOyBpaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAotICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgID4gTFZQU0FfTUFYUE9TVEdBSU4pICAgfHwKLSAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA8IExWUFNBX01JTlBPU1RHQUlOKSAgIHx8Ci0gICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA+IExWUFNBX01BWFFGQUNUT1IpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQotICAgICAgICAgKi8KLQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fRkxPQVQpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGZvciBhdm9pZGluZyBRQUMgd2FybmluZ3MgYXMgTVVMMzJ4MzJJTlRPMzIgd29ya3Mgb24gTFZNX0lOVDMyIG9ubHkqLwotICAgICAgICAgICAgTFZNX0lOVDMyIFNEQkQ9KExWTV9JTlQzMilwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247Ci0gICAgICAgICAgICBMVk1fSU5UMzIgSVJUST0oTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7Ci0gICAgICAgICAgICBMVk1fSU5UMzIgQkw7Ci0KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKFNEQkQsSVJUSSxCTCxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpCi0gICAgICAgICAgICBCdWZmZXJMZW5ndGg9KExWTV9VSU5UMzIpQkw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBCdWZmZXJMZW5ndGgrKzsKLSAgICAgICAgfQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4pICk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZJbnN0YW5jZSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJlNjcmF0Y2gsIDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0ZMT0FUKSApOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTY3JhdGNoKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWUFNBX1NDUkFUQ0g7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0ZW50IGNvZWZmaWNpZW50cyBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfRkxPQVRfU3RhdGVfdCkgKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0ZW50IGRhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkgKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZEYXRhKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAppbmRleCA2MTk4N2I1Li5lMDBjMTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKQEAgLTI3LDk1ICsyNywxMDAgQEAKICAgIENPTlNUQU5UIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5ICovCi0jZGVmaW5lIExWUFNBX0lOU1RBTkNFX0FMSUdOICAgICAgICAgICAgIDQgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBzdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX1NDUkFUQ0hfQUxJR04gICAgICAgICAgICAgIDQgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX0NPRUZfQUxJR04gICAgICAgICAgICAgICAgIDQgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIHdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX0RBVEFfQUxJR04gICAgICAgICAgICAgICAgIDQgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFIDEzIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEIFwKKyAgICAzIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAwICAgICAgLyogT2Zmc2V0IHRvIGluc3RhbmNlIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAxICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnRzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAyICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgdGFwcyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgLyogT2Zmc2V0IHRvIHNjcmF0Y2ggIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMyAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04gXAorICAgIDQwMDAgLyogTWF4aW11bSBsZW5ndGggaW4gbXMgb2YgdGhlIGxldmVscyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSBcCisgICAgNTAwMCAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGxlbmd0aCBpbiBtb25vIHNhbXBsZXMgb2YgdGhlIGJsb2NrIHRvIHByb2Nlc3MgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX05CQU5EU01JTiAxICAvKiBNaW5pbXVtIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX05CQU5EU01BWCAzMCAvKiBNYXhpbXVtIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01BWENFTlRFUkZSRVEgXAorICAgIDIwMDAwIC8qIE1heGltdW0gcG9zc2libGUgY2VudGVyIGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUlOUE9TVEdBSU4gXAorICAgICgtMTUpICAgICAgICAgICAgICAgICAgICAgLyogTWluaW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhQT1NUR0FJTiAxNSAgLyogTWF4aW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICovCisjZGVmaW5lIExWUFNBX01JTlFGQUNUT1IgMjUgICAvKiBNaW5pbXVtIHBvc3NpYmxlIFEgZmFjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01BWFFGQUNUT1IgMTIwMCAvKiBNYXhpbXVtIHBvc3NpYmxlIFEgZmFjdG9yICovCiAKLSNkZWZpbmUgTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04gICAgICAgICAgNDAwMCAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1zIG9mIHRoZSBsZXZlbHMgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUgICAgICAgICAgNTAwMCAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1vbm8gc2FtcGxlcyBvZiB0aGUgYmxvY2sgdG8gcHJvY2VzcyAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTkJBTkRTTUlOICAgICAgICAgICAgICAgICAgMSAgICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTkJBTkRTTUFYICAgICAgICAgICAgICAgICAgMzAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYQ0VOVEVSRlJFUSAgICAgICAgICAgICAgMjAwMDAgIC8qIE1heGltdW0gcG9zc2libGUgY2VudGVyIGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUlOUE9TVEdBSU4gICAgICAgICAgICAgICgtMTUpICAgIC8qIE1pbmltdW0gcG9zc2libGUgcG9zdCBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYUE9TVEdBSU4gICAgICAgICAgICAgICAgMTUgICAgIC8qIE1heGltdW0gcG9zc2libGUgcG9zdCBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUlOUUZBQ1RPUiAgICAgICAgICAgICAgICAgMjUgICAgIC8qIE1pbmltdW0gcG9zc2libGUgUSBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYUUZBQ1RPUiAgICAgICAgICAgICAgICAgMTIwMCAgIC8qIE1heGltdW0gcG9zc2libGUgUSBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUiBcCisgICAgMHg0MTExIC8qIERlY2F5IGZhY3RvciBmb3IgdGhlIG1heGltdW0gdmFsdWVzIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYTEVWRUxERUNBWVNISUZUIFwKKyAgICAxNCAvKiBEZWNheSBzaGlmdCBmb3IgdGhlIG1heGltdW0gdmFsdWVzIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgICovCiAKLSNkZWZpbmUgTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUiAgICAgICAgMHg0MTExIC8qIERlY2F5IGZhY3RvciBmb3IgdGhlIG1heGltdW0gdmFsdWVzIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYTEVWRUxERUNBWVNISUZUICAgICAgICAgMTQgICAgIC8qIERlY2F5IHNoaWZ0IGZvciB0aGUgbWF4aW11bSB2YWx1ZXMgY2FsY3VsYXRpb24gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYVU5TSUdORURDSEFSIDB4RkYKIAotI2RlZmluZSBMVlBTQV9NQVhVTlNJR05FRENIQVIgICAgICAgICAgICAweEZGCi0KLSNkZWZpbmUgTFZQU0FfRnNJbnZlcnRTaGlmdCAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgTFZQU0FfR0FJTlNISUZUICAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgTFZQU0FfRlJFUVNISUZUICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgTFZQU0FfRnNJbnZlcnRTaGlmdCAzMQorI2RlZmluZSBMVlBTQV9HQUlOU0hJRlQgMTEKKyNkZWZpbmUgTFZQU0FfRlJFUVNISUZUIDI1CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBUWVBFUyBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSAgICAgICAweDAwMTQgICAgLyogMjAgbXMgKDUwSHopIGluIFExNi4wICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiAgICAweDA2NjYgICAgLyogMS8yMG1zIGxlZnQgc2hpZnRlZCBieSAxNSAgKi8KLSNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0ICAxNQorI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lIDB4MDAxNCAgICAvKiAyMCBtcyAoNTBIeikgaW4gUTE2LjAgICAgICAqLworI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52IDB4MDY2NiAvKiAxLzIwbXMgbGVmdCBzaGlmdGVkIGJ5IDE1ICAqLworI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQgMTUKIAogLyogUHJlY2lzaW9uIG9mIHRoZSBmaWx0ZXIgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlciwgICAgLyogU2ltcGxlIHByZWNpc2lvbiAqLwotICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlciAgICAgLyogRG91YmxlIHByZWNpc2lvbiAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXIsIC8qIFNpbXBsZSBwcmVjaXNpb24gKi8KKyAgICBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXIgIC8qIERvdWJsZSBwcmVjaXNpb24gKi8KIH0gTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW47CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgICAgIGJDb250cm9sUGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgaW5jYXRpbmcgYSBjaGFuZ2Ugb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIG5CYW5kczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgc3BlY3RydW0gYW5hbHl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heElucHV0QmxvY2tTaXplOyAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gaW5wdXQgZGF0YSBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0NIQVIgYkNvbnRyb2xQZW5kaW5nOyAgICAgLyogRmxhZyBpbmNhdGluZyBhIGNoYW5nZSBvZiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzICAgICAqLworICAgIExWTV9VSU5UMTYgbkJhbmRzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgc3BlY3RydW0gYW5hbHl6ZXIgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgTWF4SW5wdXRCbG9ja1NpemU7IC8qIE1heGltdW0gaW5wdXQgZGF0YSBidWZmZXIgc2l6ZSAqLwogCi0gICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIEN1cnJlbnRQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIE5ld1BhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgdGhlIHVzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOworICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCBDdXJyZW50UGFyYW1zOyAvKiBDdXJyZW50IGNvbnRyb2wgcGFyYW1ldGVycyBvZiB0aGUgbW9kdWxlICovCisgICAgTFZQU0FfQ29udHJvbFBhcmFtc190IE5ld1BhcmFtczsgICAgIC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgdGhlIHVzZXIgICAgICovCisgICAgdm9pZCogcFNjcmF0Y2g7CisgICAgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KIAotICAgIExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuICpwQlBGaWx0ZXJzUHJlY2lzaW9uOyAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZmlsdGVyIHByZWNpc2lvbiBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAqLwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwQlBfSW5zdGFuY2VzOworICAgIExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKiBwQlBGaWx0ZXJzUHJlY2lzaW9uOyAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsdGVyIHByZWNpc2lvbiBmb3IgZWFjaCBiYW5kICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBCUF9JbnN0YW5jZXM7CiAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCi0gICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgKnBCUF9UYXBzOworICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KiBwQlBfVGFwczsKICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciBpbnN0YW5jZSBmb3IgZWFjaCBiYW5kICovCi0gICAgUVBEX0ZMT0FUX1N0YXRlX3QgICAgICAgICAgICAgICAgKnBRUERfU3RhdGVzOworICAgIFFQRF9GTE9BVF9TdGF0ZV90KiBwUVBEX1N0YXRlczsKICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciB0YXBzIGZvciBlYWNoIGJhbmQgKi8KLSAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAgICAgICAgICAqcFFQRF9UYXBzOworICAgIFFQRF9GTE9BVF9UYXBzX3QqIHBRUERfVGFwczsKIAogICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7Ci0gICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgICAgKnBGaWx0ZXJzUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgb2YgdGhlIGZpbHRlcnMgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnB1dCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX0ZMT0FUKiBwUG9zdEdhaW5zOworICAgIExWUFNBX0ZpbHRlclBhcmFtX3QqCisgICAgICAgICAgICBwRmlsdGVyc1BhcmFtczsgLyogQ29weSBvZiB0aGUgZmlsdGVycyBwYXJhbWV0ZXJzIGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMgKi8KIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBuU2FtcGxlc0J1ZmZlclVwZGF0ZTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtYWtlIDIwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7ICAgICAgICAgICAvKiBDb3VudGVyIHVzZWQgdG8ga25vdyB3aGVuIHRvIHB1dCBhIG5ldyB2YWx1ZSBpbiB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBuUmVsZXZhbnRGaWx0ZXJzOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcmVsZXZlbnQgZmlsdGVycyBkZXBlbmRpbmcgb24gc2FtcGxpbmcgZnJlcXVlbmN5IGFuZCBiYW5kcyBjZW50ZXIgZnJlcXVlbmN5ICAgICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMb2NhbFNhbXBsZXNDb3VudDsgICAgICAgICAgICAgICAgICAvKiBDb3VudGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgblNhbXBsZXNCdWZmZXJVcGRhdGU7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1ha2UgMjBtcyAgICAqLworICAgIExWTV9JTlQzMiBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7IC8qIENvdW50ZXIgdXNlZCB0byBrbm93IHdoZW4gdG8gcHV0IGEgbmV3IHZhbHVlIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2IG5SZWxldmFudEZpbHRlcnM7ICAvKiBOdW1iZXIgb2YgcmVsZXZhbnQgZmlsdGVycyBkZXBlbmRpbmcgb24gc2FtcGxpbmcgZnJlcXVlbmN5IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRzIGNlbnRlciBmcmVxdWVuY3kgICAgICAgICovCisgICAgTFZNX1VJTlQxNiBMb2NhbFNhbXBsZXNDb3VudDsgLyogQ291bnRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lICovCiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRG93blNhbXBsaW5nRmFjdG9yOyAgICAgICAgICAgICAgICAgLyogRG93biBzYW1wbGluZyBmYWN0b3IgZGVwZW5kaW5nIG9uIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRG93blNhbXBsaW5nQ291bnQ7ICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB1c2VkIGZvciB0aGUgZG93bnNhbXBsaW5nIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2IERvd25TYW1wbGluZ0ZhY3RvcjsgLyogRG93biBzYW1wbGluZyBmYWN0b3IgZGVwZW5kaW5nIG9uIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBMVk1fVUlOVDE2IERvd25TYW1wbGluZ0NvdW50OyAgLyogQ291bnRlciB1c2VkIGZvciB0aGUgZG93bnNhbXBsaW5nIGhhbmRsaW5nICAqLwogCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOyAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgYnVmZmVyIGluIHRpbWUgKG1zKSBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsgICAgICAgICAgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7ICAgIC8qIEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHdyaXR0aW5nIHBvaW50ZXIgb2YgdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfVGltZSAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTsgICAgICAgIC8qIEF1ZGlvVGltZSBhdCB3aGljaCB0aGUgbGFzdCB2YWx1ZSBzYXZlIG9jY3VyZWQgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aDsgICAgICAgICAgIC8qIE51bWJlciBvZiBzcGVjdHJ1bSBkYXRhIHZhbHVlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gY29udGFpbiAocGVyIGJhbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24vMjBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiBTcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsgICAgICAvKiBMZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiB0aW1lIChtcykgZGVmaW5lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDgqIHBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsgICAgICAgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAgICAgICAgKi8KKyAgICBMVk1fVUlOVDgqIHBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7IC8qIEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHdyaXRpbmcgcG9pbnRlciBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfVGltZSBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU7IC8qIEF1ZGlvVGltZSBhdCB3aGljaCB0aGUgbGFzdCB2YWx1ZSBzYXZlIG9jY3VycmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMzIKKyAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aDsgLyogTnVtYmVyIG9mIHNwZWN0cnVtIGRhdGEgdmFsdWUgdGhhdCB0aGUgYnVmZmVyIGNhbiBjb250YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZXIgYmFuZCkgPSBTcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbi8yMG1zICovCiAKLSAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAgICAqcFByZXZpb3VzUGVha3M7ICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIHRvIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHByZXZpb3VzIHBlYWsgdmFsdWUgb2YgdGhlIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24uIFRob3NlIHZhbHVlcyBhcmUgZGVjcmVtZW50ZWQgYWZ0ZXIgZWFjaCBjYWxsIHRvIHRoZSBHZXRTcGVjdHJ1bSBmdW5jdGlvbiAgICAgICAgICAqLworICAgIExWTV9VSU5UOCogcFByZXZpb3VzUGVha3M7IC8qIFBvaW50cyB0byBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwcmV2aW91cyBwZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIHRoZSBsZXZlbCBkZXRlY3Rpb24uIFRob3NlIHZhbHVlcyBhcmUgZGVjcmVtZW50ZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBjYWxsIHRvIHRoZSBHZXRTcGVjdHJ1bSBmdW5jdGlvbiAgICAgICAgICAqLwogCi19TFZQU0FfSW5zdGFuY2VQcl90LCAqcExWUFNBX0luc3RhbmNlUHJfdDsKK30gTFZQU0FfSW5zdGFuY2VQcl90LCAqcExWUFNBX0luc3RhbmNlUHJfdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OUyBQUk9UT1RZUEUKQEAgLTEzNSw2ICsxNDAsNiBAQAogLyogIExWUFNBX09LICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgKExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBJbnN0KTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzKExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QpOwogCiAjZW5kaWYgLyogX0xWUFNBX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuY3BwCmluZGV4IDgxYTg4YzUuLjI5OWRmZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jcHAKQEAgLTE1LDIzICsxNSwyMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgICAgIkxWUFNBLmgiCi0jaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgotI2luY2x1ZGUgICAgIkxWTV9NYWNyb3MuaCIKLSNpbmNsdWRlICAgICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZQU0EuaCIKKyNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAotI2RlZmluZSBMVk1fTUlOSU5UXzMyICAgMHg4MDAwMDAwMAorI2RlZmluZSBMVk1fTUlOSU5UXzMyIDB4ODAwMDAwMDAKIAogc3RhdGljIExWTV9JTlQzMiBtdWx0MzJ4MzJpbjMyX3NoaWZ0cihMVk1fSU5UMzIgYSwgTFZNX0lOVDMyIGIsIExWTV9JTlQzMiBjKSB7Ci0gIExWTV9JTlQ2NCByZXN1bHQgPSAoKExWTV9JTlQ2NClhICogYikgPj4gYzsKKyAgICBMVk1fSU5UNjQgcmVzdWx0ID0gKChMVk1fSU5UNjQpYSAqIGIpID4+IGM7CiAKLSAgaWYgKHJlc3VsdCA+PSBJTlQzMl9NQVgpIHsKLSAgICByZXR1cm4gSU5UMzJfTUFYOwotICB9IGVsc2UgaWYgKHJlc3VsdCA8PSBJTlQzMl9NSU4pIHsKLSAgICByZXR1cm4gSU5UMzJfTUlOOwotICB9IGVsc2UgewotICAgIHJldHVybiAoTFZNX0lOVDMyKXJlc3VsdDsKLSAgfQorICAgIGlmIChyZXN1bHQgPj0gSU5UMzJfTUFYKSB7CisgICAgICAgIHJldHVybiBJTlQzMl9NQVg7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPD0gSU5UMzJfTUlOKSB7CisgICAgICAgIHJldHVybiBJTlQzMl9NSU47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChMVk1fSU5UMzIpcmVzdWx0OworICAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU0LDQyICs1NCwzNiBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgKQorTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwTFZQU0FfSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBJbnB1dEJsb2NrU2l6ZSwgTFZQU0FfVGltZSBBdWRpb1RpbWUpCiAKIHsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaWk7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jOwotICAgIGV4dGVybiBMVk1fVUlOVDMyICAgICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKLSAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFdyaXRlX1NhdmU7ICAgICAgICAgLyogUG9zaXRpb24gb2YgdGhlIHdyaXRlIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvY2VzcyAgKi8KKyAgICBMVlBTQV9JbnN0YW5jZVByX3QqIHBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCogcFNjcmF0Y2g7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQzMiBBdWRpb1RpbWVJbmM7CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOworICAgIExWTV9VSU5UOCogcFdyaXRlX1NhdmU7IC8qIFBvc2l0aW9uIG9mIHRoZSB3cml0ZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvY2VzcyAgKi8KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDSEVDSyBQQVJBTUVURVJTCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcExWUFNBX0lucHV0U2FtcGxlcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwTFZQU0FfSW5wdXRTYW1wbGVzID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwogICAgIH0KLSAgICBpZihJbnB1dEJsb2NrU2l6ZSA9PSAwIHx8IElucHV0QmxvY2tTaXplID4gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgaWYgKElucHV0QmxvY2tTaXplID09IDAgfHwgSW5wdXRCbG9ja1NpemUgPiBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUpIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwogICAgIH0KLQotICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPnBTY3JhdGNoOwogICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgQVBQTFkgTkVXIFNFVFRJTkdTIElGIE5FRURFRAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKSB7CiAgICAgICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSAwOwotICAgICAgICBMVlBTQV9BcHBseU5ld1NldHRpbmdzKCBwTFZQU0FfSW5zdCk7CisgICAgICAgIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MocExWUFNBX0luc3QpOwogICAgIH0KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk5LDM5ICs5MywzMCBAQAogICAgIENvcHlfRmxvYXQocExWUFNBX0lucHV0U2FtcGxlcywgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOwogICAgIFNoaWZ0X1NhdF9GbG9hdCgtMSwgcFNjcmF0Y2gsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKLSAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKLSAgICAgICAgeworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKSB7CisgICAgICAgIHN3aXRjaCAocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKSB7CiAgICAgICAgICAgICBjYXNlIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKLSAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEoJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgotICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICAoICZwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSgmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLCBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAgICggcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKKyAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQocExWUFNBX0luc3QsIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKICAgICB9CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgVVBEQVRFIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkKLSAgICB7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZV9TYXZlKSB7CiAgICAgICAgIEF1ZGlvVGltZUluYyA9IG11bHQzMngzMmluMzJfc2hpZnRyKAogICAgICAgICAgICAgICAgIChBdWRpb1RpbWUgKyAoKExWTV9JTlQzMilwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQgKiAxMDAwKSksCiAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVlBTQV9TYW1wbGVSYXRlSW52VGFiW3BMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzXSwKQEAgLTEzOSw3ICsxMjQsNyBAQAogICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lID0gQXVkaW9UaW1lICsgQXVkaW9UaW1lSW5jOwogICAgIH0KIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjIsOTkgKzE0Nyw5NSBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0U3BlY3RydW0ocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfVGltZSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDgqIHBDdXJyZW50VmFsdWVzLCBMVk1fVUlOVDgqIHBQZWFrVmFsdWVzKQogCiB7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMzIgU3RhdHVzRGVsdGEsIGlpOworICAgIExWTV9VSU5UOCogcFJlYWQ7CiAKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgU3RhdHVzRGVsdGEsIGlpOwotICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUmVhZDsKLQotICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwQ3VycmVudFZhbHVlcyA9PSBMVk1fTlVMTCB8fCBwUGVha1ZhbHVlcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwQ3VycmVudFZhbHVlcyA9PSBMVk1fTlVMTCB8fCBwUGVha1ZhbHVlcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICAvKiBGaXJzdCBmaW5kIHRoZSBwbGFjZSB3aGVyZSB0byBsb29rIGluIHRoZSBzdGF0dXMgYnVmZmVyICovCi0gICAgaWYoR2V0U3BlY3RydW1BdWRpb1RpbWUgPD0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkKLSAgICB7Ci0gICAgICAgIE1VTDMyeDMySU5UTzMyKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gR2V0U3BlY3RydW1BdWRpb1RpbWUpLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsU3RhdHVzRGVsdGEsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KTsKLSAgICAgICAgaWYoKFN0YXR1c0RlbHRhICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpCi0gICAgICAgIHsKKyAgICBpZiAoR2V0U3BlY3RydW1BdWRpb1RpbWUgPD0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkgeworICAgICAgICBNVUwzMngzMklOVE8zMigocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiwgU3RhdHVzRGVsdGEsIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCk7CisgICAgICAgIGlmICgoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPQorICAgICAgICAgICAgKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpIHsKICAgICAgICAgICAgIFN0YXR1c0RlbHRhICs9IDE7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvKiBUaGlzIHBhcnQgaGFuZGxlcyB0aGUgd3JhcCBhcm91bmQgKi8KLSAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsU3RhdHVzRGVsdGEsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQotICAgICAgICBpZigoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSkgIT0gKChMVk1fSU5UMzIpKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpKSkKLSAgICAgICAgeworICAgICAgICBNVUwzMngzMklOVE8zMigKKyAgICAgICAgICAgICAgICAoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSAoTFZNX0lOVDMyKUxWTV9NSU5JTlRfMzIpICsKKyAgICAgICAgICAgICAgICAgKChMVk1fSU5UMzIpTFZNX01BWElOVF8zMiAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSksCisgICAgICAgICAgICAgICAgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiwgU3RhdHVzRGVsdGEsCisgICAgICAgICAgICAgICAgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KSBpZiAoKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fSU5UMzIpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBMVlBTQV9JbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9JTlQzMilMVk1fTUFYSU5UXzMyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpKSkgewogICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKICAgICAgICAgfQogICAgIH0KICAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXNpcmVkIGxldmVsIGlzIG5vdCB0b28gIm9sZCIgKHNlZSAyLjEwIGluIExWUFNBX0Rlc2lnbk5vdGVzLmRvYykqLwotICAgIGlmKAotICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDwgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkmJgotICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZTwwKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU+MCkpJiYKLSAgICAgICAgICgoKExWTV9JTlQzMikoLUdldFNwZWN0cnVtQXVkaW9UaW1lICsgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPkxWTV9NQVhJTlRfMzIpKXx8CisgICAgaWYgKCgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPCBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSAmJgorICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA8IDApICYmIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lID4gMCkpICYmCisgICAgICAgICAoKChMVk1fSU5UMzIpKC1HZXRTcGVjdHJ1bUF1ZGlvVGltZSArIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpKSA+CisgICAgICAgICAgTFZNX01BWElOVF8zMikpIHx8CiAKLSAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSYmCi0gICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZT49MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPj0wKSl8fAotICAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWU8PTApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTw9MCkpfHwKLSAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lPj0wKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU8PTApKSYmCi0gICAgICAgICAoKChMVk1fSU5UMzIpKEdldFNwZWN0cnVtQXVkaW9UaW1lIC0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPExWTV9NQVhJTlRfMzIpKSkpfHwKKyAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA+IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpICYmCisgICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA+PSAwKSAmJiAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA+PSAwKSkgfHwKKyAgICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDw9IDApICYmIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIDw9IDApKSB8fAorICAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lID49IDApICYmIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIDw9IDApKSAmJgorICAgICAgICAgICAoKChMVk1fSU5UMzIpKEdldFNwZWN0cnVtQXVkaW9UaW1lIC0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpIDwKKyAgICAgICAgICAgIExWTV9NQVhJTlRfMzIpKSkpIHx8CiAKLSAgICAgICAgKFN0YXR1c0RlbHRhID4gKExWTV9JTlQzMilwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSB8fAotICAgICAgICAoIVN0YXR1c0RlbHRhKSkKLSAgICB7Ci0gICAgICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcEN1cnJlbnRWYWx1ZXNbaWldICA9IDA7Ci0gICAgICAgICAgICBwUGVha1ZhbHVlc1tpaV0gICAgICA9IDA7CisgICAgICAgIChTdGF0dXNEZWx0YSA+IChMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkgfHwgKCFTdGF0dXNEZWx0YSkpIHsKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykgeworICAgICAgICAgICAgcEN1cnJlbnRWYWx1ZXNbaWldID0gMDsKKyAgICAgICAgICAgIHBQZWFrVmFsdWVzW2lpXSA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9PSyk7CiAgICAgfQogICAgIC8qIFNldCB0aGUgcmVhZGluZyBwb2ludGVyICovCi0gICAgaWYoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzKSA+IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAtIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQpKQotICAgIHsKLSAgICAgICAgcFJlYWQgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciArIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoIC0gKExWTV9VSU5UMzIpU3RhdHVzRGVsdGEpICogcExWUFNBX0luc3QtPm5CYW5kczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFJlYWQgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAgLSBTdGF0dXNEZWx0YSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgaWYgKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICogcExWUFNBX0luc3QtPm5CYW5kcykgPgorICAgICAgICAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkgeworICAgICAgICBwUmVhZCA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICsKKyAgICAgICAgICAgICAgICAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAtIChMVk1fVUlOVDMyKVN0YXR1c0RlbHRhKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIH0gZWxzZSB7CisgICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBTdGF0dXNEZWx0YSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7CiAgICAgfQogCiAgICAgLyogUmVhZCB0aGUgc3RhdHVzIGJ1ZmZlciBhbmQgZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlcnMgKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgeworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspIHsKICAgICAgICAgcEN1cnJlbnRWYWx1ZXNbaWldID0gcFJlYWRbaWldOwotICAgICAgICBpZihwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldIDw9IHBSZWFkW2lpXSkKLSAgICAgICAgeworICAgICAgICBpZiAocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA8PSBwUmVhZFtpaV0pIHsKICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPSBwUmVhZFtpaV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldICE9IDApCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIGlmIChwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldICE9IDApIHsKICAgICAgICAgICAgIExWTV9JTlQzMiB0ZW1wOwogICAgICAgICAgICAgLypSZS1jb21wdXRlIG1heCB2YWx1ZXMgZm9yIGRlY2F5ICovCiAgICAgICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSk7Ci0gICAgICAgICAgICB0ZW1wID0gKCh0ZW1wICogTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUik+PkxWUFNBX01BWExFVkVMREVDQVlTSElGVCk7CisgICAgICAgICAgICB0ZW1wID0gKCh0ZW1wICogTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUikgPj4gTFZQU0FfTUFYTEVWRUxERUNBWVNISUZUKTsKICAgICAgICAgICAgIC8qIElmIHRoZSBnYWluIGhhcyBubyBlZmZlY3QsICJoZWxwIiB0aGUgdmFsdWUgdG8gaW5jcmVhc2UgKi8KLSAgICAgICAgICAgIGlmKHRlbXAgPT0gKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHRlbXAgPT0gKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pKSB7CiAgICAgICAgICAgICAgICAgdGVtcCArPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KICAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+IExWUFNBX01BWFVOU0lHTkVEQ0hBUikgPyBMVlBTQV9NQVhVTlNJR05FRENIQVIgOiB0ZW1wOwogICAgICAgICAgICAgLyogU3RvcmUgbmV3IG1heCBsZXZlbCAqLwotICAgICAgICAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9ICAoTFZNX1VJTlQ4KShMVlBTQV9NQVhVTlNJR05FRENIQVIgLSB0ZW1wKTsKKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPSAoTFZNX1VJTlQ4KShMVlBTQV9NQVhVTlNJR05FRENIQVIgLSB0ZW1wKTsKICAgICAgICAgfQogCiAgICAgICAgIHBQZWFrVmFsdWVzW2lpXSA9IHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV07CiAgICAgfQogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaAppbmRleCA2MDlhNDg1Li4yZjc1MmJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCkBAIC0yMCw0MSArMjAsMzUgQEAKIAogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCi10eXBlZGVmIHN0cnVjdAotewotICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZWxheTsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2Vmc1syXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfVFQRF9TdGF0ZV90LCAqcFFQRF9TdGF0ZV90OwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQzMiogcERlbGF5OyAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fSU5UMzIgQ29lZnNbMl07IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gUVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZWxheTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZnNbMl07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1RUERfRkxPQVRfU3RhdGVfdCwgKnBRUERfRkxPQVRfU3RhdGVfdDsKKyAgICBMVk1fRkxPQVQqIHBEZWxheTsKKyAgICBMVk1fRkxPQVQgQ29lZnNbMl07IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gUVBEX0ZMT0FUX1N0YXRlX3QsICpwUVBEX0ZMT0FUX1N0YXRlX3Q7CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCi0gICAgTFZNX0lOVDMyIEtNOyAgICAvKnNob3VsZCBzdG9yZSBiMiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0lOVDMyIEtQOyAvKnNob3VsZCBzdG9yZSBhMCovCisgICAgTFZNX0lOVDMyIEtNOyAvKnNob3VsZCBzdG9yZSBiMiovCiAKIH0gUVBEX0MzMl9Db2VmcywgKlBRUERfQzMyX0NvZWZzOwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCBLUDsgICAgLypzaG91bGQgc3RvcmUgYTAqLwotICAgIExWTV9GTE9BVCBLTTsgICAgLypzaG91bGQgc3RvcmUgYjIqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBLUDsgLypzaG91bGQgc3RvcmUgYTAqLworICAgIExWTV9GTE9BVCBLTTsgLypzaG91bGQgc3RvcmUgYjIqLwogCiB9IFFQRF9GTE9BVF9Db2VmcywgKlBRUERfRkxPQVRfQ29lZnM7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbMV07CiAKIH0gUVBEX1RhcHNfdCwgKnBRUERfVGFwc190OwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIExWTV9GTE9BVCBTdG9yYWdlWzFdOwogCiB9IFFQRF9GTE9BVF9UYXBzX3QsICpwUVBEX0ZMT0FUX1RhcHNfdDsKQEAgLTcyLDE1ICs2NiwxMSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVlBTQV9RUERfUHJvY2VzcyAoICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KTsKK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3Modm9pZCogaEluc3RhbmNlLCBMVk1fSU5UMTYqIHBJblNhbXBzLCBMVk1fSU5UMTYgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEJhbmRJbmRleCk7CiAKLXZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7Cit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0KHZvaWQqIGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwSW5TYW1wcywgTFZNX0lOVDE2IG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBCYW5kSW5kZXgpOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTYsMTMgKzg2LDkgQEAKIC8qIFJFVFVSTlM6ICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIFFQRF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICk7Cit2b2lkIExWUFNBX1FQRF9Jbml0KFFQRF9TdGF0ZV90KiBwSW5zdGFuY2UsIFFQRF9UYXBzX3QqIHBUYXBzLCBRUERfQzMyX0NvZWZzKiBwQ29lZik7CiAKLXZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgICAgICAqcENvZWYgICAgICk7Cit2b2lkIExWUFNBX1FQRF9Jbml0X0Zsb2F0KFFQRF9GTE9BVF9TdGF0ZV90KiBwSW5zdGFuY2UsIFFQRF9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMqIHBDb2VmKTsKIAogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuY3BwCmluZGV4IDJkYmY2OTQuLmM1MDIzYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmNwcApAQCAtMzIsMjAgKzMyLDE1IEBACiAvKiBSRVRVUk5TOiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWUFNBX1FQRF9Jbml0ICggICBwUVBEX1N0YXRlX3QgICAgICAgcFFQRF9TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9UYXBzX3QgICAgICAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9DMzJfQ29lZnMgICAgICpwQ29lZiAgICAgKQotewotICAgIHBRUERfU3RhdGUtPnBEZWxheSAgPSBwVGFwcy0+U3RvcmFnZTsKLSAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSBwQ29lZi0+S1A7Ci0gICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gID0gcENvZWYtPktNOwordm9pZCBMVlBTQV9RUERfSW5pdChwUVBEX1N0YXRlX3QgcFFQRF9TdGF0ZSwgUVBEX1RhcHNfdCogcFRhcHMsIFFQRF9DMzJfQ29lZnMqIHBDb2VmKSB7CisgICAgcFFQRF9TdGF0ZS0+cERlbGF5ID0gcFRhcHMtPlN0b3JhZ2U7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gPSBwQ29lZi0+S1A7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gPSBwQ29lZi0+S007CiB9CiAKLXZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIHBRUERfRkxPQVRfU3RhdGVfdCAgICAgICBwUVBEX1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgICAgICAqcENvZWYgICAgICkKLXsKLSAgICBwUVBEX1N0YXRlLT5wRGVsYXkgID0gcFRhcHMtPlN0b3JhZ2U7Ci0gICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gKChMVk1fRkxPQVQpcENvZWYtPktQKTsKLSAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S00pOwordm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdChwUVBEX0ZMT0FUX1N0YXRlX3QgcFFQRF9TdGF0ZSwgUVBEX0ZMT0FUX1RhcHNfdCogcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyogcENvZWYpIHsKKyAgICBwUVBEX1N0YXRlLT5wRGVsYXkgPSBwVGFwcy0+U3RvcmFnZTsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LUCk7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gPSAoKExWTV9GTE9BVClwQ29lZi0+S00pOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jcHAKaW5kZXggODgwNTQyMC4uZTMwMWNmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwCkBAIC0zNCwxNSArMzQsMTEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZQU0FfUVBEX1dyaXRlUGVhayggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICAgKipwcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgVmFsdWUgICApOwordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKHBMVlBTQV9JbnN0YW5jZVByX3QgcExWUFNBX0luc3QsIExWTV9VSU5UOCoqIHBwV3JpdGUsIExWTV9JTlQxNiBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IFZhbHVlKTsKIAotdm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgVmFsdWUgICApOwordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KHBMVlBTQV9JbnN0YW5jZVByX3QgcExWUFNBX0luc3QsIExWTV9VSU5UOCoqIHBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEJhbmRJbmRleCwgTFZNX0ZMT0FUIFZhbHVlKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU2LDM4ICs1MiwzNCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAoICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KQotewotCit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0KHZvaWQqIGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwSW5TYW1wcywgTFZNX0lOVDE2IG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBCYW5kSW5kZXgpIHsKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgUEFSQU1FVEVSUwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0gICAgUVBEX0ZMT0FUX1N0YXRlX3QgKnBRUERTdGF0ZSA9ICAoUVBEX0ZMT0FUX1N0YXRlX3QqKSZwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXNbQmFuZEluZGV4XTsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QqIHBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIFFQRF9GTE9BVF9TdGF0ZV90KiBwUVBEU3RhdGUgPSAoUVBEX0ZMT0FUX1N0YXRlX3QqKSZwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXNbQmFuZEluZGV4XTsKIAogICAgIC8qIFBvaW50ZXIgdG8gdGFwcyAqLwotICAgIExWTV9GTE9BVCogcERlbGF5ICA9IHBRUERTdGF0ZS0+cERlbGF5OworICAgIExWTV9GTE9BVCogcERlbGF5ID0gcFFQRFN0YXRlLT5wRGVsYXk7CiAKICAgICAvKiBQYXJhbWV0ZXJzIG5lZWRlZCBkdXJpbmcgcXVhc2kgcGVhayBjYWxjdWxhdGlvbnMgKi8KLSAgICBMVk1fRkxPQVQgICBYMDsKLSAgICBMVk1fRkxPQVQgICB0ZW1wLHRlbXAyOwotICAgIExWTV9GTE9BVCAgIGFjY3U7Ci0gICAgTFZNX0ZMT0FUICAgWGcwOwotICAgIExWTV9GTE9BVCAgIEQwOwotICAgIExWTV9GTE9BVCAgIFYwID0gKExWTV9GTE9BVCkoKnBEZWxheSk7CisgICAgTFZNX0ZMT0FUIFgwOworICAgIExWTV9GTE9BVCB0ZW1wLCB0ZW1wMjsKKyAgICBMVk1fRkxPQVQgYWNjdTsKKyAgICBMVk1fRkxPQVQgWGcwOworICAgIExWTV9GTE9BVCBEMDsKKyAgICBMVk1fRkxPQVQgVjAgPSAoTFZNX0ZMT0FUKSgqcERlbGF5KTsKIAogICAgIC8qIEZpbHRlcidzIGNvZWYgKi8KLSAgICBMVk1fRkxPQVQgICBLcCA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzBdKSk7Ci0gICAgTFZNX0ZMT0FUICAgS20gPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1sxXSkpOworICAgIExWTV9GTE9BVCBLcCA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzBdKSk7CisgICAgTFZNX0ZMT0FUIEttID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMV0pKTsKIAotICAgIExWTV9JTlQxNiAgIGlpID0gbnVtU2FtcGxlczsKKyAgICBMVk1fSU5UMTYgaWkgPSBudW1TYW1wbGVzOwogCi0gICAgTFZNX1VJTlQ4ICAqcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7Ci0gICAgTFZNX0lOVDMyICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gcExWUFNBX0luc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsKLSAgICBMVk1fVUlOVDE2ICBEb3duU2FtcGxpbmdGYWN0b3IgPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nRmFjdG9yOworICAgIExWTV9VSU5UOCogcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisgICAgTFZNX0lOVDMyIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgTFZNX1VJTlQxNiBEb3duU2FtcGxpbmdGYWN0b3IgPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nRmFjdG9yOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIElOSVRJQUxJWkFUSU9OCkBAIC05NywyOSArODksMjcgQEAKICAgICAvKiBDb3JyZWN0IGFsc28gdGhlIG51bWJlciBvZiBzYW1wbGVzICovCiAgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIChMVk1fSU5UMTYpcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50KTsKIAotICAgIHdoaWxlIChpaSA+IDApCi0gICAgeworICAgIHdoaWxlIChpaSA+IDApIHsKICAgICAgICAgLyogQXBwbHkgcG9zdCBnYWluICovCiAgICAgICAgIC8qIC0gMSB0byBjb21wZW5zYXRlIHNjYWxpbmcgaW4gcHJvY2VzcyBmdW5jdGlvbiovCiAgICAgICAgIFgwID0gKCpwSW5TYW1wcykgKiBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tCYW5kSW5kZXhdOwogICAgICAgICBwSW5TYW1wcyA9IHBJblNhbXBzICsgRG93blNhbXBsaW5nRmFjdG9yOwogCiAgICAgICAgIC8qIFNhdHVyYXRlIGFuZCB0YWtlIGFic29sdXRlIHZhbHVlICovCi0gICAgICAgIGlmKFgwIDwgMC4wZikKLSAgICAgICAgICAgIFgwID0gLVgwOworICAgICAgICBpZiAoWDAgPCAwLjBmKSBYMCA9IC1YMDsKICAgICAgICAgaWYgKFgwID4gMS4wZikKICAgICAgICAgICAgIFhnMCA9IDEuMGY7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIFhnMCA9WDA7CisgICAgICAgICAgICBYZzAgPSBYMDsKIAogICAgICAgICAvKiBRdWFzaSBwZWFrIGZpbHRlciBjYWxjdWxhdGlvbiAqLwotICAgICAgICBEMCAgPSBYZzAgLSBWMDsKKyAgICAgICAgRDAgPSBYZzAgLSBWMDsKIAogICAgICAgICB0ZW1wMiA9IEQwOwogCiAgICAgICAgIGFjY3UgPSB0ZW1wMiAqIEtwOwotICAgICAgICBEMCAgICA9IEQwIC8gMi4wZjsKLSAgICAgICAgaWYgKEQwIDwgMC4wZil7CisgICAgICAgIEQwID0gRDAgLyAyLjBmOworICAgICAgICBpZiAoRDAgPCAwLjBmKSB7CiAgICAgICAgICAgICBEMCA9IC1EMDsKICAgICAgICAgfQogCkBAIC0xMzAsMTcgKzEyMCwxMyBAQAogCiAgICAgICAgIGlmIChhY2N1ID4gMS4wZikKICAgICAgICAgICAgIGFjY3UgPSAxLjBmOwotICAgICAgICBlbHNlIGlmKGFjY3UgPCAwLjBmKQorICAgICAgICBlbHNlIGlmIChhY2N1IDwgMC4wZikKICAgICAgICAgICAgIGFjY3UgPSAwLjBmOwogCiAgICAgICAgIFYwID0gYWNjdTsKIAotICAgICAgICBpZigoKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSAtIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCkgPCBEb3duU2FtcGxpbmdGYWN0b3IpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMCk7CisgICAgICAgIGlmICgoKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSAtIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCkgPCBEb3duU2FtcGxpbmdGYWN0b3IpKSB7CisgICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KHBMVlBTQV9JbnN0LCAmcFdyaXRlLCBCYW5kSW5kZXgsIFYwKTsKIAogICAgICAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50IC09IHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZTsKICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCA9IChMVk1fVUlOVDE2KShudW1TYW1wbGVzIC0gaWkpOwpAQCAtMTQ4LDcgKzEzNCw2IEBACiAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCArPSBEb3duU2FtcGxpbmdGYWN0b3I7CiAKICAgICAgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIERvd25TYW1wbGluZ0ZhY3Rvcik7Ci0KICAgICB9CiAKICAgICAvKiBTdG9yZSBsYXN0IHRhcHMgaW4gbWVtb3J5ICovCkBAIC0xNTYsMjAgKzE0MSwxNSBAQAogCiAgICAgLyogSWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsIHRvIHRoZSBmdW5jdGlvbiBhZnRlciBsYXN0IGJhbmQgcHJvY2Vzc2luZywKICAgICAgICB1cGRhdGUgdGhlIHBhcmFtZXRlcnMuICovCi0gICAgaWYoQmFuZEluZGV4ID09IChwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVycyAtIDEpKQotICAgIHsKKyAgICBpZiAoQmFuZEluZGV4ID09IChwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVycyAtIDEpKSB7CiAgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOwogICAgICAgICAvKiBBZGp1c3RtZW50IGZvciAxMTAyNUh6IGlucHV0LCAyMjAsNSBpcyBub3JtYWxseQogICAgICAgICAgICB0aGUgZXhhY3QgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIDIwbXMuKi8KLSAgICAgICAgaWYoKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZSkmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9PSBMVk1fRlNfMTEwMjUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPT0gMjIwKQotICAgICAgICAgICAgeworICAgICAgICBpZiAoKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZSkgJiYKKyAgICAgICAgICAgIChwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9PSBMVk1fRlNfMTEwMjUpKSB7CisgICAgICAgICAgICBpZiAocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkgewogICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIwOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xOTQsMzcgKzE3NCwyOSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVmFsdWUgICApCi17Ci0gICAgTFZNX1VJTlQ4ICpwV3JpdGUgPSAqcHBXcml0ZTsKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVhayhwTFZQU0FfSW5zdGFuY2VQcl90IHBMVlBTQV9JbnN0LCBMVk1fVUlOVDgqKiBwcFdyaXRlLCBMVk1fSU5UMTYgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBWYWx1ZSkgeworICAgIExWTV9VSU5UOCogcFdyaXRlID0gKnBwV3JpdGU7CiAKICAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLwotICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlPj43KTsKKyAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZSA+PiA3KTsKICAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKLSAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQotICAgIHsKKyAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+bkJhbmRzICogcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkpIHsKICAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKICAgICB9CiAKICAgICAqcHBXcml0ZSA9IHBXcml0ZTsKLQogfQotdm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgIHBMVlBTQV9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgVmFsdWUgICApCi17Ci0gICAgTFZNX1VJTlQ4ICpwV3JpdGUgPSAqcHBXcml0ZTsKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdChwTFZQU0FfSW5zdGFuY2VQcl90IHBMVlBTQV9JbnN0LCBMVk1fVUlOVDgqKiBwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBCYW5kSW5kZXgsIExWTV9GTE9BVCBWYWx1ZSkgeworICAgIExWTV9VSU5UOCogcFdyaXRlID0gKnBwV3JpdGU7CiAKICAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLwogICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlICogMjU2KTsKICAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKLSAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQotICAgIHsKKyAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+bkJhbmRzICogcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkpIHsKICAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAKaW5kZXggOWYwYWEwMi4uNGZiZmY2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAKQEAgLTM0LDE5ICszNCw5IEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCi1jb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXSA9IHsgICA4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KK2NvbnN0IExWTV9VSU5UMzIgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwgNDgwMDAsIDg4MjAwLCA5NjAwMCwgMTc2NDAwLCAxOTIwMDB9OyAvKiAxOTJrUy9zICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTgsMjAgKzQ4LDExIEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCi1jb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXSA9IHsgICAgMjY4NDM1LCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk0NzgzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ODk1NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzQyMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTczOTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODk0NzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjcxMDksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDg2OTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ3MzkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjQzNDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjIzNjkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIxNzQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTExODUgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Citjb25zdCBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXSA9IHsKKyAgICAgICAgMjY4NDM1LCAvKiA4a1MvcyAgKi8KKyAgICAgICAgMTk0NzgzLCAxNzg5NTcsIDEzNDIxOCwgOTczOTEsIDg5NDc4LCA2NzEwOSwKKyAgICAgICAgNDg2OTYsICA0NDczOSwgIDI0MzQ4LCAgMjIzNjksIDEyMTc0LCAxMTE4NSAvKiAxOTJrUy9zICovCit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTgzLDIwICs2NCwxMCBAQAogICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKICAqIGR1cmluZyAyMG1zCiAgKi8KLWNvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXSAgPSB7ICAgMTYwLCAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE3NjQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE5MjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM1MjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM4NDAgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IExWTV9VSU5UMTYgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXSA9IHsKKyAgICAgICAgMTYwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgIDIyMCwgMjQwLCAzMjAsIDQ0MSwgNDgwLCA2NDAsIDg4MiwgOTYwLCAxNzY0LCAxOTIwLCAzNTI4LCAzODQwIC8qIDE5MmtTL3MgKi8KK307CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEb3duIHNhbXBsaW5nIGZhY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDYsMjAgKzc3LDI1IEBACiAvKgogICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgZG93biBzYW1wbGluZyBmYWN0b3IKICAqLwotY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXSAgPSB7ICAgICA1LCAgICAgICAgICAgICAgICAgICAgLyogODAwMCAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgICAgICAgICAgICAgICAgICAgLyogMTEwMjUgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgLyogMTIwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgLyogMTYwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgICAgICAgICAgICAgICAgICAgLyogMjIwNTAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgLyogMjQwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgICAgICAgICAgICAgICAgICAgLyogMzIwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2MCAgICAgICAgICAgICAgICAgICAvKiA4ODIwMCBTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIwICAgICAgICAgICAgICAgICAgLyogMTc2NDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY29uc3QgTFZNX1VJTlQxNiBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXSA9IHsKKyAgICAgICAgNSwgIC8qIDgwMDAgIFMvcyAgKi8KKyAgICAgICAgNywgIC8qIDExMDI1IFMvcyAgKi8KKyAgICAgICAgOCwgIC8qIDEyMDAwIFMvcyAgKi8KKyAgICAgICAgMTAsIC8qIDE2MDAwIFMvcyAgKi8KKyAgICAgICAgMTUsIC8qIDIyMDUwIFMvcyAgKi8KKyAgICAgICAgMTYsIC8qIDI0MDAwIFMvcyAgKi8KKyAgICAgICAgMjEsIC8qIDMyMDAwIFMvcyAgKi8KKyAgICAgICAgMzAsIC8qIDQ0MTAwIFMvcyAgKi8KKyAgICAgICAgMzIgIC8qIDQ4MDAwIFMvcyAgKi8KKyAgICAgICAgLAorICAgICAgICA2MCAvKiA4ODIwMCBTL3MgICovCisgICAgICAgICwKKyAgICAgICAgNjQgLyogOTYwMDAgUy9zICAqLworICAgICAgICAsCisgICAgICAgIDEyMCAvKiAxNzY0MDAgUy9zICAqLworICAgICAgICAsCisgICAgICAgIDEyOCAvKjE5MjAwMCBTL3MgICovCit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMCwxMDIgKzEwNiwzNCBAQAogLyoKICAqIFRhYmxlIGZvciAyICogUGkgLyBGcwogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX1R3b1BpT25Gc1RhYmxlW10gPSB7ICAyNjM1NCwgICAgICAvKiA4a1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkxMjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzU2OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMTc3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1NjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3ODEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIzOTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMTk2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTE5NQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwOTggICAgLyogMTkya1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IExWTV9JTlQxNiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdID0geworICAgICAgICAyNjM1NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICovCisgICAgICAgIDE5MTIzLCAxNzU2OSwgMTMxNzcsIDk1NjEsIDg3ODUsIDY1ODgsIDQ3ODEsIDQzOTIsIDIzOTAsIDIxOTYsIDExOTUsIDEwOTggLyogMTkya1MvcyAqLworfTsKIAotY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdID0geyAgMC44MDQyODQ3ZiwgICAgICAvKiA4a1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODM2MDU0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM2MTc5NmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQwMjE0MjNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yOTE3ODc0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY4MTA1MWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIwMTA1NTlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDU5MDg5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM0MDM3MmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDcyOTQ3NmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDY3MDE4NmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDM2NDczOGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDMzNTA5M2YgICAgLyogMTkya1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdID0geworICAgICAgICAwLjgwNDI4NDdmLCAvKiA4a1MvcyAqLworICAgICAgICAwLjU4MzYwNTRmLCAwLjUzNjE3OTZmLCAwLjQwMjE0MjNmLCAwLjI5MTc4NzRmLCAwLjI2ODEwNTFmLCAwLjIwMTA1NTlmLAorICAgICAgICAwLjE0NTkwODlmLCAwLjEzNDAzNzJmLCAwLjA3Mjk0NzZmLCAwLjA2NzAxODZmLCAwLjAzNjQ3MzhmLCAwLjAzMzUwOTNmIC8qIDE5MmtTL3MgKi8KK307CiAKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KLWNvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfR2FpblRhYmxlW10gPSB7ICAgMzY0LCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4LCAgICAgICAgIC8qIDBkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyOTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2NDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1ODQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0NzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNjYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTU3Nn07ICAgICAgICAvKiArMTVkQiBnYWluICovCitjb25zdCBMVk1fSU5UMTYgTFZQU0FfR2FpblRhYmxlW10gPSB7MzY0LCAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA4LCAgNDU4LCAgNTE0LCAgNTc3LCAgNjQ3LCAgNzI2LCAgIDgxNSwgIDkxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2LCAxMTUxLCAxMjkyLCAxNDQ5LCAxNjI2LCAxODI1LCAgMjA0OCwgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjk3LCAyNTc4LCAyODkyLCAzMjQ1LCAzNjQxLCA0MDk2LCAgNDU4NCwgNTE0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcyLCA2NDc2LCA3MjY2LCA4MTUzLCA5MTQ4LCAxMDI2NCwgMTE1NzZ9OyAvKiArMTVkQiBnYWluICovCiAKLWNvbnN0IExWTV9GTE9BVCAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW109eyAgMC4xNzc3MzQzNzVmLCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5MjE4NzUwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjM2MzI4MTJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDk3NjU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgxNzM4MjgxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTU5MTc5NjhmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1NDQ5MjE4N2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzk3OTQ5MjE4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDYyODkwNjJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwMDk3NjU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyMDExNzE4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MzA4NTkzNzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzUxOTUzMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzkzOTQ1MzEyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTExMTMyODFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMDAwMGYsICAgICAgICAgLyogMGRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjE1ODIwMzFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODc4OTA2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyMTA5Mzc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ0NzI2NTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3NzgzMjAzMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDAwMDAwMDAwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzgyODEyNTBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTcxODc1MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzU5Mzc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIxMDkzNzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0Nzg1MTU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgwOTU3MDMxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY3OTY4NzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTcxODc1MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjUyMzQzNzUwZn07ICAgICAgICAvKiArMTVkQiBnYWluICovCitjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfR2FpblRhYmxlW10gPSB7CisgICAgICAgIDAuMTc3NzM0Mzc1ZiwgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAwLjE5OTIxODc1MGYsIDAuMjIzNjMyODEyZiwgMC4yNTA5NzY1NjJmLCAwLjI4MTczODI4MWYsIDAuMzE1OTE3OTY4ZiwKKyAgICAgICAgMC4zNTQ0OTIxODdmLCAwLjM5Nzk0OTIxOGYsIDAuNDQ2Mjg5MDYyZiwgMC41MDA5NzY1NjJmLCAwLjU2MjAxMTcxOGYsCisgICAgICAgIDAuNjMwODU5Mzc1ZiwgMC43MDc1MTk1MzFmLCAwLjc5Mzk0NTMxMmYsIDAuODkxMTEzMjgxZiwgMS4wMDAwMDAwMDBmLCAvKiAwZEIgZ2FpbiAqLworICAgICAgICAxLjEyMTU4MjAzMWYsIDEuMjU4Nzg5MDYyZiwgMS40MTIxMDkzNzVmLCAxLjU4NDQ3MjY1NmYsIDEuNzc3ODMyMDMxZiwKKyAgICAgICAgMi4wMDAwMDAwMDBmLCAyLjIzODI4MTI1MGYsIDIuNTExNzE4NzUwZiwgMi44MTgzNTkzNzVmLCAzLjE2MjEwOTM3NWYsCisgICAgICAgIDMuNTQ3ODUxNTYyZiwgMy45ODA5NTcwMzFmLCA0LjQ2Njc5Njg3NWYsIDUuMDExNzE4NzUwZiwgNS42NTIzNDM3NTBmfTsgLyogKzE1ZEIgZ2FpbiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgQ29zb25lIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjQxLDIwICsxNDksMjAgQEAKICAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKICAqICsxLjAgdG8gLTEuMAogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLwotY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW10gPSB7IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMzhmLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwOTg2ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYwMTk3NzVmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDgxNTE0OWYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MjQyMDQyZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yODk2MjA2Zn07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KK2NvbnN0IExWTV9JTlQxNiBMVlBTQV9Db3NDb2VmW10gPSB7MywgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzYsICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NzEsICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgIC8qIGE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgLyogYTUgKi8KK2NvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Db3NDb2VmW10gPSB7MywgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDM4ZiwgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwOTg2ZiwgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYwMTk3NzVmLCAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDgxNTE0OWYsICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcyNDIwNDJmLCAgIC8qIGE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4OTYyMDZmfTsgLyogYTUgKi8KIC8qCiAgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246CiAgKgpAQCAtMjY5LDEwMSArMTc3LDEwMCBAQAogICoKICAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0RQQ29zQ29lZltdID0geyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLWNvbnN0IExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXSA9IHsxLjBmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwODMxMWYsICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTA2MTc5OTlmLCAgICAgICAgICAgICAgICAgLyogYTIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEzNDI4MWZ9OyAgICAgICAgICAgICAgICAvKiBhMyAqLworY29uc3QgTFZNX0lOVDE2IExWUFNBX0RQQ29zQ29lZltdID0gezEsICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgIC8qIGEzICovCitjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW10gPSB7MS4wZiwgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwODMxMWYsICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTA2MTc5OTlmLCAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMzQyODFmfTsgLyogYTMgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFF1YXNpIHBlYWsgZmlsdGVyIGNvZWZmaWNpZW50cyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9MT1cgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwQ0VGRDJCLDB4MDBDQjlCMTd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRDI0MkU3LDB4MDBDRUQxMUR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LDB4MDBEOTE2Nzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwQ0VGRDJCLDB4MDBDQjlCMTd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRTEzNzM5LDB4MDBERDdDRDN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LDB4MDBEOTE2Nzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRDk0QkFGLDB4MDBENUI3RTd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRTEzNzM5LDB4MDBERDdDRDN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LDB4MDBEOTE2Nzl9LCAgLyogNDhrUy9zICovCitjb25zdCBRUERfQzMyX0NvZWZzIExWUFNBX1FQRF9Db2Vmc1tdID0geworICAgICAgICAvKiA4a1MvcyAgKi8gLyogTFZQU0FfU1BFRURfTE9XICAgKi8KKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MENFRkQyQiwgMHgwMENCOUIxN30sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBEMjQyRTcsIDB4MDBDRUQxMUR9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LCAweDAwRDkxNjc5fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MENFRkQyQiwgMHgwMENCOUIxN30sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBFMTM3MzksIDB4MDBERDdDRDN9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LCAweDAwRDkxNjc5fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MEQ5NEJBRiwgMHgwMEQ1QjdFN30sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBFMTM3MzksIDB4MDBERDdDRDN9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LCAweDAwRDkxNjc5fSwgLyogNDhrUy9zICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX01FRElVTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1ODc1MTNELDB4MDU1QzIyQ0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1OUQyOTY3LDB4MDU3MEYwMDd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLDB4MDVCMzRENzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1ODc1MTNELDB4MDU1QzIyQ0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLDB4MDVCMzRENzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1Q0MxMDE4LDB4MDU5RDhGNjl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLDB4MDVCMzRENzl9LCAgLyogNDhrUy9zICovCisgICAgICAgIC8qIDhrUy9zICAqLyAvKiBMVlBTQV9TUEVFRF9NRURJVU0gKi8KKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NTg3NTEzRCwgMHgwNTVDMjJDRn0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODU5RDI5NjcsIDB4MDU3MEYwMDd9LAorICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLCAweDA1QjM0RDc5fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NTg3NTEzRCwgMHgwNTVDMjJDRn0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODYwMEM3QjksIDB4MDVDRkE2Q0Z9LAorICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLCAweDA1QjM0RDc5fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUNDMTAxOCwgMHgwNTlEOEY2OX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODYwMEM3QjksIDB4MDVDRkE2Q0Z9LAorICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLCAweDA1QjM0RDc5fSwgLyogNDhrUy9zICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEExMTVFQTdBLDB4MUNEQjNGNUN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEExODQ3NUYwLDB4MUQyQzgzQTJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEyRTFFOTUwLDB4MUUyQTUzMkV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEExMTVFQTdBLDB4MUNEQjNGNUN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEyRTFFOTUwLDB4MUUyQTUzMkV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEyNkZGNkJELDB4MUREODE1MzB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEyRTFFOTUwLDB4MUUyQTUzMkV9fTsgLyogNDhrUy9zICovCisgICAgICAgIC8qIDhrUy9zICAqLyAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICovCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTExNUVBN0EsIDB4MUNEQjNGNUN9LAorICAgICAgICB7KExWTV9JTlQzMikweEExODQ3NUYwLCAweDFEMkM4M0EyfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwgMHgxRTJBNTMyRX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTExNUVBN0EsIDB4MUNEQjNGNUN9LAorICAgICAgICB7KExWTV9JTlQzMikweEEzNzVCMkM2LCAweDFFOTQzQkJDfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwgMHgxRTJBNTMyRX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTI2RkY2QkQsIDB4MUREODE1MzB9LAorICAgICAgICB7KExWTV9JTlQzMikweEEzNzVCMkM2LCAweDFFOTQzQkJDfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwgMHgxRTJBNTMyRX19OyAvKiA0OGtTL3MgKi8KIAotY29uc3QgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXSA9IHsKK2NvbnN0IFFQRF9GTE9BVF9Db2VmcyBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXSA9IHsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTE9XICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNTgzMzMzMjEyODgyM2YsMC4wMDYzMTE1NDkzMzk0NDM0Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzM2ODY2MzM1OTQzMzRmLDAuMDA2NTIyMTY3MDA4MzcwMmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTYxNDEzMDQ2OTAzOTA4ZiwwLjA0MjUwOTA4MjIzOTEyMTJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsMC4wNDM4NzA4NTU1ODg0NjU5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzM4MTQ1MTIwNDQxOTEzNmYsMC4yMjc5MjA5NjUyOTE1NTk3Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczMDk1ODEzNTMzMjkxMjJmLDAuMjMzMTU2ODIyNjIxODIyNGZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAvKiA4a1MvcyAgKi8gLyogTFZQU0FfU1BFRURfTE9XICAgKi8KKyAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLCAwLjAwNjIxMzU1NjUwOTQ2NTBmfSwKKyAgICAgICAgey0wLjk5MzU4MzMzMzIxMjg4MjNmLCAwLjAwNjMxMTU0OTMzOTQ0MzRmfSwKKyAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLCAwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLCAwLjAwNjIxMzU1NjUwOTQ2NTBmfSwKKyAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLCAwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLCAwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgey0wLjk5MzM2ODY2MzM1OTQzMzRmLCAwLjAwNjUyMjE2NzAwODM3MDJmfSwKKyAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLCAwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwgMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwgMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwgMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwgMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwgMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgIC8qIDhrUy9zICAqLyAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLworICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsIDAuMDQxODc0MjY2Njk1MjMxMmZ9LAorICAgICAgICB7LTAuOTU2MTQxMzA0NjkwMzkwOGYsIDAuMDQyNTA5MDgyMjM5MTIxMmZ9LAorICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsIDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsIDAuMDQxODc0MjY2Njk1MjMxMmZ9LAorICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsIDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAorICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsIDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsIDAuMDQzODcwODU1NTg4NDY1OWZ9LAorICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsIDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAorICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLCAwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLCAwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLCAwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLCAwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLCAwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgLyogOGtTL3MgICovIC8qIExWUFNBX1NQRUVEX0hJR0ggICAgICAqLworICAgICAgICB7LTAuNzQxNTE4Njc5MDc0OTQzMWYsIDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAorICAgICAgICB7LTAuNzM4MTQ1MTIwNDQxOTEzNmYsIDAuMjI3OTIwOTY1MjkxNTU5N2Z9LAorICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsIDAuMjM1NjY2NjU0MDcyNzAxOWZ9LAorICAgICAgICB7LTAuNzQxNTE4Njc5MDc0OTQzMWYsIDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAorICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsIDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsIDAuMjM1NjY2NjU0MDcyNzAxOWZ9LAorICAgICAgICB7LTAuNzMwOTU4MTM1MzMyOTEyMmYsIDAuMjMzMTU2ODIyNjIxODIyNGZ9LAorICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsIDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLCAwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLCAwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLCAwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLCAwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLCAwLjIzNTY2NjY1NDA3MjcwMTlmfX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmgKaW5kZXggNjU4NzJmZS4uYzc3MWRhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuaApAQCAtMjcsNyArMjcsNyBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM5LDcgKzM5LDcgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KLWV4dGVybiBjb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKK2V4dGVybiBjb25zdCBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MSw3ICs1MSw3IEBACiAgKiBUYWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBudW1iZXIgb2Ygc2FtcGxlcwogICogZHVyaW5nIDIwbXMKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKK2V4dGVybiBjb25zdCBMVk1fVUlOVDE2IExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsNyArNjIsNyBAQAogLyoKICAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGRvd24gc2FtcGxpbmcgZmFjdG9yCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdOworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzMsMTQgKzczLDE0IEBACiAvKgogICogVGFibGUgZm9yIDIgKiBQaSAvIEZzCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX1R3b1BpT25Gc1RhYmxlW107Ci1leHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOwogCiAvKgogICogR2FpbiB0YWJsZQogICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9HYWluVGFibGVbXTsKLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVlBTQV9HYWluVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfR2FpblRhYmxlW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTcsOCArOTcsOCBAQAogICogYSByYW5nZSBvZiAwIHRvIFBpLiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAzMjc2NyB0byAtMzI3NjggcmVwcmVzZW50aW5nIHRoZSByYW5nZQogICogKzEuMCB0byAtMS4wCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0Nvc0NvZWZbXTsKLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZQU0FfQ29zQ29lZltdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Db3NDb2VmW107CiAKIC8qCiAgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246CkBAIC0xMTQsMTUgKzExNCwxNSBAQAogICoKICAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQogICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9EUENvc0NvZWZbXTsKLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWUFNBX0RQQ29zQ29lZltdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUXVhc2kgcGVhayBmaWx0ZXIgY29lZmZpY2llbnRzIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gY29uc3QgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW107Ci1leHRlcm4gY29uc3QgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKK2V4dGVybiBjb25zdCBRUERfQzMyX0NvZWZzIExWUFNBX1FQRF9Db2Vmc1tdOworZXh0ZXJuIGNvbnN0IFFQRF9GTE9BVF9Db2VmcyBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKIAogI2VuZGlmIC8qIF9fTFZQU0FfVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAppbmRleCAwYWRmZDFiLi5mZmU3OTAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtNzEsMjEgKzcxLDE0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgdGFibGUgKi8KLSNkZWZpbmUgTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgICAgMCAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgMSAgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGICAgIDIgICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgICAgMyAgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZDU19OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgNCAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KLQogLyogRWZmZWN0IExldmVsICovCi0jZGVmaW5lIExWQ1NfRUZGRUNUX0xPVyAgICAgICAgICAgICAgICAgICAgMTYzODQgICAgLyogRWZmZWN0IHNjYWxpbmcgNTAlICovCi0jZGVmaW5lIExWQ1NfRUZGRUNUX01FRElVTSAgICAgICAgICAgICAgICAgMjQ1NzYgICAgLyogRWZmZWN0IHNjYWxpbmcgNzUlICovCi0jZGVmaW5lIExWQ1NfRUZGRUNUX0hJR0ggICAgICAgICAgICAgICAgICAgMzI3NjcgICAgLyogRWZmZWN0IFNjYWxpbmcgMTAwJSAqLworI2RlZmluZSBMVkNTX0VGRkVDVF9MT1cgMTYzODQgICAgLyogRWZmZWN0IHNjYWxpbmcgNTAlICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX01FRElVTSAyNDU3NiAvKiBFZmZlY3Qgc2NhbGluZyA3NSUgKi8KKyNkZWZpbmUgTFZDU19FRkZFQ1RfSElHSCAzMjc2NyAgIC8qIEVmZmVjdCBTY2FsaW5nIDEwMCUgKi8KIAogLyogQ2FsbGJhY2sgZXZlbnRzICovCi0jZGVmaW5lIExWQ1NfRVZFTlRfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAgICAgLyogTm90IGEgdmFsaWQgZXZlbnQgKi8KLSNkZWZpbmUgTFZDU19FVkVOVF9BTEdPRkYgICAgICAgICAgICAgICAgIDB4MDAwMSAgICAvKiBDUyBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KKyNkZWZpbmUgTFZDU19FVkVOVF9OT05FIDB4MDAwMCAgIC8qIE5vdCBhIHZhbGlkIGV2ZW50ICovCisjZGVmaW5lIExWQ1NfRVZFTlRfQUxHT0ZGIDB4MDAwMSAvKiBDUyBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk0LDcwICs4Nyw0OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotdHlwZWRlZiB2b2lkICpMVkNTX0hhbmRsZV90OwordHlwZWRlZiB2b2lkKiBMVkNTX0hhbmRsZV90OwogCiAvKiBPcGVyYXRpbmcgbW9kZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWQ1NfT0ZGID0gMCwKLSAgICBMVkNTX09OICA9IDE1LAotICAgIExWQ1NfTUFYID0gTFZNX01BWEVOVU0KLX0gTFZDU19Nb2Rlc19lbjsKLQotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX1NDUkFUQ0ggICAgICAgID0gMCwKLSAgICBMVkNTX0RBVEEgICAgICAgICAgID0gMSwKLSAgICBMVkNTX0NPRUZGSUNJRU5UICAgID0gMiwKLSAgICBMVkNTX1BFUlNJU1RFTlQgICAgID0gMywKLSAgICBMVkNTX01FTU9SWVRZUEVfTUFYID0gTFZNX01BWEVOVU0KLX0gTFZDU19NZW1vcnlUeXBlc19lbjsKK3R5cGVkZWYgZW51bSB7IExWQ1NfT0ZGID0gMCwgTFZDU19PTiA9IDE1LCBMVkNTX01BWCA9IExWTV9NQVhFTlVNIH0gTFZDU19Nb2Rlc19lbjsKIAogLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZDU19TVUNDRVNTICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBMVkNTX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCi0gICAgTFZDU19OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVkNTX1RPT01BTllTQU1QTEVTID0gMywgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KLSAgICBMVkNTX0lOVkFMSURCVUZGRVIgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIGJ1ZmZlciBwcm9jZXNzaW5nIHJlcXVlc3QgKi8KLSAgICBMVkNTX1NUQVRVU01BWCAgICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZDU19TVUNDRVNTID0gMCwgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZDU19OVUxMQUREUkVTUyA9IDEsICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCisgICAgTFZDU19UT09NQU5ZU0FNUExFUyA9IDIsIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLworICAgIExWQ1NfU1RBVFVTTUFYID0gTFZNX01BWEVOVU0KIH0gTFZDU19SZXR1cm5TdGF0dXNfZW47CiAKIC8qCiAgKiBTb3VyY2UgZGF0YSBmb3JtYXRzCiAgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWQ1NfU1RFUkVPICAgICAgID0gMCwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZDU19TVEVSRU8gPSAwLAogICAgIExWQ1NfTU9OT0lOU1RFUkVPID0gMSwKLSAgICBMVkNTX1NPVVJDRU1BWCAgICA9IExWTV9NQVhFTlVNCisgICAgTFZDU19TT1VSQ0VNQVggPSBMVk1fTUFYRU5VTQogfSBMVkNTX1NvdXJjZUZvcm1hdF9lbjsKIAogLyoKICAqIFN1cHBvcnRlZCBvdXRwdXQgZGV2aWNlcwogICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX0hFQURQSE9ORVMgICAgICAgICAgICAgPSAwLAotICAgIExWQ1NfRVhfSEVBRFBIT05FUyAgICAgICAgICA9IDEsCi0gICAgTFZDU19TUEVBS0VSVFlQRV9NQVggICAgICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZDU19IRUFEUEhPTkVTID0gMCwKKyAgICBMVkNTX0VYX0hFQURQSE9ORVMgPSAxLAorICAgIExWQ1NfU1BFQUtFUlRZUEVfTUFYID0gTFZNX01BWEVOVU0KIH0gTFZDU19TcGVha2VyVHlwZV9lbjsKIAogLyoKICAqIFNwZWFrZXIgQ29lZmZpY2llbnRzIFRhYmxlCiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdm9pZCAgICAqcFRhYmxlMTsKLSAgICB2b2lkICAgICpwVGFibGUyOwotICAgIHZvaWQgICAgKnBUYWJsZTM7Ci0gICAgdm9pZCAgICAqcFRhYmxlNDsKLSAgICB2b2lkICAgICpwVGFibGU1OwotICAgIHZvaWQgICAgKnBUYWJsZTY7Ci0gICAgdm9pZCAgICAqcFRhYmxlNzsKLSAgICB2b2lkICAgICpwVGFibGU4OwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQqIHBUYWJsZTE7CisgICAgdm9pZCogcFRhYmxlMjsKKyAgICB2b2lkKiBwVGFibGUzOworICAgIHZvaWQqIHBUYWJsZTQ7CisgICAgdm9pZCogcFRhYmxlNTsKKyAgICB2b2lkKiBwVGFibGU2OworICAgIHZvaWQqIHBUYWJsZTc7CisgICAgdm9pZCogcFRhYmxlODsKIH0gTFZDU19DU01TX0NvZWZfVGFibGVzX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTY2LDQ0ICsxMzgsMjYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWQ1NfTWVtb3J5VHlwZXNfZW4gICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLwotfSBMVkNTX01lbW9yeVJlZ2lvbl90OwotCi0vKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWQ1NfTWVtb3J5UmVnaW9uX3QgUmVnaW9uW0xWQ1NfTlJfTUVNT1JZX1JFR0lPTlNdOyAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KLX0gTFZDU19NZW1UYWJfdDsKLQogLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWQ1NfTW9kZXNfZW4gICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIEFsZ29yaXRobSBtb2RlICovCi0gICAgTFZDU19TcGVha2VyVHlwZV9lbiAgICAgU3BlYWtlclR5cGU7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSB0eXBlICovCi0gICAgTFZDU19Tb3VyY2VGb3JtYXRfZW4gICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0ICovCi0gICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgQ29tcHJlc3Nvck1vZGU7ICAgICAgICAgLyogTm9uLUxpbmVhciBDb21wcmVzc29yIE1vZGUgKi8KLSAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7ICAgICAgICAgICAgLyogUmV2ZXJiIGxldmVsIGluICUgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgTnJDaGFubmVsczsKLSNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWQ1NfTW9kZXNfZW4gT3BlcmF0aW5nTW9kZTsgICAgICAgLyogQWxnb3JpdGhtIG1vZGUgKi8KKyAgICBMVkNTX1NwZWFrZXJUeXBlX2VuIFNwZWFrZXJUeXBlOyAgIC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLworICAgIExWQ1NfU291cmNlRm9ybWF0X2VuIFNvdXJjZUZvcm1hdDsgLyogU291cmNlIGRhdGEgZm9ybWF0ICovCisgICAgTFZNX01vZGVfZW4gQ29tcHJlc3Nvck1vZGU7ICAgICAgICAvKiBOb24tTGluZWFyIENvbXByZXNzb3IgTW9kZSAqLworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOyAgICAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSAqLworICAgIExWTV9JTlQxNiBFZmZlY3RMZXZlbDsgICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCisgICAgTFZNX1VJTlQxNiBSZXZlcmJMZXZlbDsgICAgICAgICAgICAvKiBSZXZlcmIgbGV2ZWwgaW4gJSAqLworICAgIExWTV9JTlQzMiBOckNoYW5uZWxzOwogfSBMVkNTX1BhcmFtc190OwogCiAvKiBDb25jZXJ0IFNvdW5kIENhcGFiaWxpdHkgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsgLyogTWF4aW11bSBibG9jayBzaXplIGluIHNhbXBsZSBwYWlycyAqLwogCiAgICAgLyogQ2FsbGJhY2sgcGFyYW1ldGVycyAqLwotICAgIExWTV9DYWxsYmFjayAgICAgICAgICAgIENhbGxCYWNrOyAgICAgICAgICAgICAgIC8qIEJ1bmRsZSBjYWxsYmFjayAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwQnVuZGxlSW5zdGFuY2U7ICAgICAgIC8qIEJ1bmRsZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMVk1fQ2FsbGJhY2sgQ2FsbEJhY2s7IC8qIEJ1bmRsZSBjYWxsYmFjayAqLworICAgIHZvaWQqIHBCdW5kbGVJbnN0YW5jZTsgLyogQnVuZGxlIGluc3RhbmNlIGhhbmRsZSAqLwogCiB9IExWQ1NfQ2FwYWJpbGl0aWVzX3Q7CiAKQEAgLTIxMyw4MiArMTY3LDQ0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSBpdCBpcyAgICAgICAgICAgKi8KLS8qICBwYXNzZWQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzLCBvZiB0aGVzZSBvbmx5IHRoZSBidWZmZXIgcHJvY2Vzc2luZyBzZXR0aW5nIGlzICAgICAqLwotLyogIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gICAgICAqLwotLyogIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlICAgICAgICAgICAgICAqLwotLyogIGNhcGFiaWxpdGllcyBhcmUgaWdub3JlZCBhbmQgdGhlIG1lbW9yeSB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0luaXQoTFZDU19IYW5kbGVfdCogcGhJbnN0YW5jZSwgTFZDU19DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwU2NyYXRjaCk7CiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfTWVtb3J5KExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLwotLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCi0vKiAgTFZDU19NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19BbGlnbm1lbnRFcnJvciAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAgICAgKi8KLS8qICBMVkNTX051bGxBZGRyZXNzICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfSW5pdChMVkNTX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZyZWUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgdGhlIExWQ1NfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNTX0RlSW5pdChMVkNTX0hhbmRsZV90KiBwaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTMxMCw4ICsyMjYsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19HZXRQYXJhbWV0ZXJzKExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICpwUGFyYW1zKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMzIsOCArMjQ3LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Db250cm9sKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1Niw5ICsyNzAsNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcyk7CiAKLSNlbmRpZiAgLyogTFZDU19IICovCisjZW5kaWYgLyogTFZDU19IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguY3BwCmluZGV4IGJhMTUyYzAuLmVmY2EyN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguY3BwCkBAIC0zMiw5ICszMiw4IEBACiAvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKCAgIExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tQYXJhbSk7CitMVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NSwyOSArNjQsMjIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OwotICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnQ7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7Ci0gICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgT2Zmc2V0OworICAgIExWTV9GTE9BVCBHYWluOworICAgIExWTV9GTE9BVCBDdXJyZW50OworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfQnlwYXNzTWl4X3QqIHBDb25maWcgPSAoTFZDU19CeXBhc3NNaXhfdCopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OworICAgIGNvbnN0IEdhaW5fdCogcE91dHB1dEdhaW5UYWJsZTsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSB0cmFuc2l0aW9uIGdhaW4KICAgICAgKi8KLSAgICBpZiAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikgJiYKLSAgICAgICAgKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgJiYgKHBJbnN0YW5jZS0+TVNUYXJnZXQxICE9IDB4N0ZGRikgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb2ZmLT5vbiB0cmFuc3Rpb24gKi8KLSAgICAgICAgKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikgJiYgKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQxICE9IDB4N0ZGRikgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb2ZmLT5vbiB0cmFuc2l0aW9uICovCisgICAgKSB7CiAgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSAoKExWTV9GTE9BVClwUGFyYW1zLT5FZmZlY3RMZXZlbCAvIDMyNzY3KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvKiBTZWxlY3Qgbm8gZWZmZWN0IGxldmVsICovCiAgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSAwOwogICAgIH0KQEAgLTk1LDE4ICs4NywxOSBAQAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBvdXRwdXQgZ2FpbiB0YWJsZSBvZmZzZXQKICAgICAgKi8KLSAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U3BlYWtlclR5cGUgKyAocFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpKTsKKyAgICBPZmZzZXQgPQorICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAqICgxICsgTFZDU19FWF9IRUFEUEhPTkVTKSkpOwogICAgIHBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CiAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgcHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KLSAgICBHYWluID0gIChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogcEluc3RhbmNlLT5UcmFuc2l0aW9uR2Fpbik7CisgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogcEluc3RhbmNlLT5UcmFuc2l0aW9uR2Fpbik7CiAKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0xOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKIAogICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOwogICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOwpAQCAtMTE2LDggKzEwOSw4IEBACiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KLSAgICBHYWluID0gKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiAoMS4wIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSk7CisgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICoKKyAgICAgICAgICAgICAgICAgICAgICAgKDEuMCAtIChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOwogICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogR2FpbjsKICAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKQEAgLTEyNSw3ICsxMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IGhJbnN0YW5jZTsKLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0xOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVkNTX01peGVyQ2FsbGJhY2s7CiAKICAgICAvKgpAQCAtMTM3LDQ1ICsxMzAsNDIgQEAKICAgICAgKiBDb3JyZWN0IGdhaW4gZm9yIHRoZSBlZmZlY3QgbGV2ZWwKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbkNvcnJlY3Q7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjE7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjI7CisgICAgICAgIExWTV9GTE9BVCBHYWluQ29ycmVjdDsKKyAgICAgICAgTFZNX0ZMT0FUIEdhaW4xOworICAgICAgICBMVk1fRkxPQVQgR2FpbjI7CiAKICAgICAgICAgR2FpbjEgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CiAgICAgICAgIEdhaW4yID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOwogICAgICAgICAvKgogICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKQotICAgICAgICB7Ci0gICAgICAgIEdhaW5Db3JyZWN0ID0gKExWTV9GTE9BVCkoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2FpbkZ1bGwgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkpOworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pIHsKKyAgICAgICAgICAgIEdhaW5Db3JyZWN0ID0gKExWTV9GTE9BVCkocEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5GdWxsICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpKTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCi0gICAgICAgICAqLwotICAgICAgICBHYWluMSA9IChHYWluMSAqIEdhaW5Db3JyZWN0KTsKLSAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCk7Ci0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdhaW4xID0gKEdhaW4xICogR2FpbkNvcnJlY3QpOworICAgICAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGdhaW4gdmFsdWVzCiAgICAgICAgICAqLwogICAgICAgICBwQ29uZmlnLT5PdXRwdXRfU2hpZnQgPSBwQ29uZmlnLT5PdXRwdXRfU2hpZnQ7Ci0gICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLEdhaW4xKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIEdhaW4xKTsKICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxHYWluMik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCBHYWluMik7CiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKLQorICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIwNSwzOSArMTk1LDI5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFVucHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSAgICAgID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgICAgICAgPSAoTFZDU19CeXBhc3NNaXhfdCAqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBwVW5wcm9jZXNzZWQsIExWTV9GTE9BVCogcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfQnlwYXNzTWl4X3QqIHBDb25maWcgPSAoTFZDU19CeXBhc3NNaXhfdCopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgYnlwYXNzIG1peGVyIGlzIGVuYWJsZWQKICAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX0JZUEFTU01JWFNXSVRDSCkgIT0gMCkKLSAgICB7CisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19CWVBBU1NNSVhTV0lUQ0gpICE9IDApIHsKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgdGhlIGJ5cGFzcyBtaXgKICAgICAgICAgICovCi0gICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSBwVW5wcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UsIHBQcm9jZXNzZWQsIChMVk1fRkxPQVQqKXBVbnByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IG91dHB1dCBnYWluIGNvcnJlY3Rpb24gc2hpZnQKICAgICAgICAgICovCi0gICAgICAgIFNoaWZ0X1NhdF9GbG9hdCgoTFZNX0lOVDE2KXBDb25maWctPk91dHB1dF9TaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisgICAgICAgIFNoaWZ0X1NhdF9GbG9hdCgoTFZNX0lOVDE2KXBDb25maWctPk91dHB1dF9TaGlmdCwgKExWTV9GTE9BVCopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQqLwogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0NSwyMiArMjI1LDE4IEBACiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19NaXhlckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKExWQ1NfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgQ2FsbGJhY2tQYXJhbSkKLXsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWTV9JTlQzMiBMVkNTX01peGVyQ2FsbGJhY2soTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0pIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAotICAgKHZvaWQpcEdlbmVyYWxQdXJwb3NlOworICAgICh2b2lkKXBHZW5lcmFsUHVycG9zZTsKIAogICAgIC8qCiAgICAgICogT2ZmIHRyYW5zaXRpb24gaGFzIGNvbXBsZXRlZCBpbiBIZWFkcGhvbmUgbW9kZQogICAgICAqLwotICAgIGlmICgocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpICYmCi0gICAgICAgIChwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uKSAgICAgJiYKLSAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQwID09IDB4MDAwMCkmJiAgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb24tPm9mZiB0cmFuc2l0aW9uICovCi0gICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKQotICAgIHsKKyAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAmJiAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbikgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQwID09IDB4MDAwMCkgJiYgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb24tPm9mZiB0cmFuc2l0aW9uICovCisgICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKSB7CiAgICAgICAgIC8qIFNldCBvcGVyYXRpbmcgbW9kZSB0byBPRkYgKi8KICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWQ1NfT0ZGOwogCkBAIC0yNjgsMjEgKzI0NCwxNyBAQAogICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX0ZBTFNFOwogCiAgICAgICAgIC8qIFNpZ25hbCB0byB0aGUgYnVuZGxlICovCi0gICAgICAgIGlmKCgqcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2spICE9IExWTV9OVUxMKXsKLSAgICAgICAgICAgICgqcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2spKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMLAorICAgICAgICBpZiAoKCpwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5DYWxsQmFjaykgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgICAgICgqcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2spKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSwgTFZNX05VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUxHT1JJVEhNX0NTX0lEIHwgTFZDU19FVkVOVF9BTEdPRkYpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpICAmJgotICAgICAgICAocEluc3RhbmNlLT5NU1RhcmdldDAgPT0gMSkgJiYKLSAgICAgICAgKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkpewotCisgICAgaWYgKChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgJiYgKHBJbnN0YW5jZS0+TVNUYXJnZXQwID09IDEpICYmCisgICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpKSB7CiAgICAgICAgIC8qIEV4aXQgdHJhbnNpdGlvbiBzdGF0ZSAqLwogICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX0ZBTFNFOwogICAgIH0KIAogICAgIHJldHVybiAxOwogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKaW5kZXggZmNkOGVlMy4uNjlhZmNiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaApAQCAtMzMsMjAgKzMzLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBCeXBhc3MgbWl4ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIE1peGVyIHNldHRpbmdzICovCi0gICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgTWl4ZXJfSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIE1peGVyIGluc3RhbmNlICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT3V0cHV0X1NoaWZ0OyAgICAgICAgICAgICAgIC8qIENvcnJlY3RpbmcgZ2FpbiBvdXRwdXQgc2hpZnQgKi8KKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgTWl4ZXJfSW5zdGFuY2U7IC8qIE1peGVyIGluc3RhbmNlICovCisgICAgTFZNX1VJTlQxNiBPdXRwdXRfU2hpZnQ7ICAgICAgICAgICAgICAvKiBDb3JyZWN0aW5nIGdhaW4gb3V0cHV0IHNoaWZ0ICovCiAKIH0gTFZDU19CeXBhc3NNaXhfdDsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBPdXRwdXQgZ2FpbiBzZXR0aW5ncywgR2FpbiA9IChMb3NzLzMyNzY4KSAqIDJeU2hpZnQgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgIFNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNoaWZ0cyByZXF1aXJlZCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgTG9zczsgICAgICAgICAgICAgICAgICAgICAgIC8qIExvc3MgcmVxdWlyZWQgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgIFVucHJvY0xvc3M7ICAgICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGxvc3MgKi8KKyAgICBMVk1fVUlOVDE2IFNoaWZ0OyAgICAgLyogTGVmdCBzaGlmdHMgcmVxdWlyZWQgKi8KKyAgICBMVk1fRkxPQVQgTG9zczsgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLworICAgIExWTV9GTE9BVCBVbnByb2NMb3NzOyAvKiBVbnByb2Nlc3NlZCBwYXRoIGxvc3MgKi8KIH0gR2Fpbl90OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU0LDEzICs1MiwxMCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgKnBQYXJhbXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhJbml0KExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKTsKIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqdW5Qcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICBOdW1TYW1wbGVzKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiB1blByb2Nlc3NlZCwgTFZNX0ZMT0FUKiBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKTsKIAotI2VuZGlmICAvKiBCWVBBU1NNSVhfSCAqLworI2VuZGlmIC8qIEJZUEFTU01JWF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jcHAKaW5kZXggNTBkYjAzZC4uOGY4ODk4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmNwcApAQCAtNDUsMTUgKzQ1LDEyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19HZXRQYXJhbWV0ZXJzKExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICpwUGFyYW1zKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0oTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgKnBQYXJhbXMgPSBwSW5zdGFuY2UtPlBhcmFtczsKIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc1LDM0ICs3MiwyOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAqcFBhcmFtcykKLXsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgT2Zmc2V0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICAgICAqcEluc3RhbmNlID0oTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX1JldHVyblN0YXR1c19lbiAgICAgICAgZXJyOwotICAgIExWQ1NfTW9kZXNfZW4gICAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlU2F2ZSA9IHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0NvbnRyb2woTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fSU5UMTYgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKyAgICBMVkNTX01vZGVzX2VuIE9wZXJhdGluZ01vZGVTYXZlID0gcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZTsKIAotICAgIGlmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUpCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUpIHsKICAgICAgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5TYW1wbGluZ1JhdGUgPSBMVkNTX1NhbXBsZVJhdGVUYWJsZVtwUGFyYW1zLT5TYW1wbGVSYXRlXTsKICAgICB9CiAKICAgICAvKgogICAgICAqIElmIHRoZSByZXZlcmIgbGV2ZWwgaGFzIGNoYW5nZWQKICAgICAgKi8KLSAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAhPSBwUGFyYW1zLT5SZXZlcmJMZXZlbCkKLSAgICB7Ci0gICAgICAgIGVycj1MVkNTX1JldmVyYkdlbmVyYXRvckluaXQoaEluc3RhbmNlLHBQYXJhbXMpOworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAhPSBwUGFyYW1zLT5SZXZlcmJMZXZlbCkgeworICAgICAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoaEluc3RhbmNlLCBwUGFyYW1zKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIGhhcyBjaGFuZ2VkIHRoZW4gcGVyZm9ybSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24KICAgICAgKi8KICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKLSAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQotICAgIHsKLSAgICAgICAgY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkgeworICAgICAgICBjb25zdCBMVkNTX1ZvbENvcnJlY3RfdCogcExWQ1NfVm9sQ29ycmVjdFRhYmxlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE91dHB1dCBkZXZpY2UKQEAgLTExNCwxNSArMTA2LDE2IEBACiAgICAgICAgICAqLwogICAgICAgICAvKiBVc2UgaW50ZXJuYWwgY29lZmZpY2llbnQgdGFibGUgKi8KICAgICAgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlID0gKExWQ1NfVm9sQ29ycmVjdF90KikmTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07Ci0gICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgcFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpOworICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAqICgxICsgTFZDU19FWF9IRUFEUEhPTkVTKSk7CiAKICAgICAgICAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0ID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlW09mZnNldF07CiAKICAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbjsKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKICAgICAgICAgewotICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgIEdhaW47Ci0gICAgICAgICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOworICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW47CisgICAgICAgICAgICBjb25zdCBHYWluX3QqIHBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CiAgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MpOwogICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiAoR2Fpbik7CiAKQEAgLTEzMywyMiArMTI2LDE4IEBACiAKICAgICAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwgMCwgR2Fpbik7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CiAgICAgICAgIH0KIAotICAgICAgICBlcnI9TFZDU19TRW5oYW5jZXJJbml0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworICAgICAgICBlcnIgPSBMVkNTX1NFbmhhbmNlckluaXQoaEluc3RhbmNlLCBwUGFyYW1zKTsKIAotICAgICAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworICAgICAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoaEluc3RhbmNlLCBwUGFyYW1zKTsKIAotICAgICAgICBlcnI9TFZDU19FcXVhbGlzZXJJbml0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworICAgICAgICBlcnIgPSBMVkNTX0VxdWFsaXNlckluaXQoaEluc3RhbmNlLCBwUGFyYW1zKTsKIAotICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLCBwUGFyYW1zKTsKIAogICAgIH0KIApAQCAtMTU2LDMwICsxNDUsMjYgQEAKICAgICAgKiBDaGVjayBpZiB0aGUgZWZmZWN0IGxldmVsIG9yIHNvdXJjZSBmb3JtYXQgaGFzIGNoYW5nZWQKICAgICAgKi8KICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5QYXJhbXMuRWZmZWN0TGV2ZWwgIT0gcFBhcmFtcy0+RWZmZWN0TGV2ZWwpIHx8Ci0gICAgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IHBQYXJhbXMtPlNvdXJjZUZvcm1hdCkpCi0gICAgewotICAgICAgICBjb25zdCBMVkNTX1ZvbENvcnJlY3RfdCAqcExWQ1NfVm9sQ29ycmVjdFRhYmxlOworICAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcFBhcmFtcy0+U291cmNlRm9ybWF0KSkgeworICAgICAgICBjb25zdCBMVkNTX1ZvbENvcnJlY3RfdCogcExWQ1NfVm9sQ29ycmVjdFRhYmxlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEdldCB0aGUgdm9sdW1lIGNvcnJlY3Rpb24gcGFyYW1ldGVycwogICAgICAgICAgKi8KICAgICAgICAgLyogVXNlIGludGVybmFsIGNvZWZmaWNpZW50IHRhYmxlICovCiAgICAgICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwotICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKTsKKyAgICAgICAgT2Zmc2V0ID0gKExWTV9JTlQxNikocFBhcmFtcy0+U3BlYWtlclR5cGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgKiAoMSArIExWQ1NfRVhfSEVBRFBIT05FUykpOwogCiAgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOwogCiAgICAgICAgIC8qIFVwZGF0ZSB0aGUgZWZmZWN0IGxldmVsIGFuZCBhbHBoYS1taXhlciBnYWlucyAqLwotICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLCBwUGFyYW1zKTsKIAotICAgICAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQotICAgICAgICB7CisgICAgICAgIGlmIChlcnIgIT0gTFZDU19TVUNDRVNTKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKICAgICB9CiAKQEAgLTE4OSw0MCArMTc0LDM2IEBACiAgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKIAogICAgIC8qIFN0YXkgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgdW50aWwgdGhlIHRyYW5zaXRpb24gaXMgZG9uZSAqLwotICAgIGlmKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IE9wZXJhdGluZ01vZGVTYXZlKSB8fAotICAgICAgIChwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKSl7Ci0KKyAgICBpZiAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKSkgewogICAgICAgICAvKiBTZXQgdGhlIHJldmVyYiBkZWxheSB0aW1lb3V0ICovCi0gICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gIT0gTFZNX1RSVUUpeworICAgICAgICBpZiAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAhPSBMVk1fVFJVRSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5iVGltZXJEb25lID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5UaW1lSW5NcyA9Ci0gICAgICAgICAgICAoTFZNX0lOVDE2KSgoKHBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbi5EZWxheVNpemUgPDwgMikKLSAgICAgICAgICAgIC9wSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlNhbXBsaW5nUmF0ZSkgKyAxKTsKLSAgICAgICAgICAgIExWTV9UaW1lcl9Jbml0ICggJnBJbnN0YW5jZS0+VGltZXJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+VGltZXJQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgoKHBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbi5EZWxheVNpemUgPDwgMikgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5TYW1wbGluZ1JhdGUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgICBMVk1fVGltZXJfSW5pdCgmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLCAmcEluc3RhbmNlLT5UaW1lclBhcmFtcyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBVcGRhdGUgdGhlIGVmZmVjdCBsZXZlbCBhbmQgYWxwaGEtbWl4ZXIgZ2FpbnMgKi8KLSAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKyAgICAgICAgZXJyID0gTFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwgcFBhcmFtcyk7CiAKICAgICAgICAgLyogQ2hhbmdlIHRyYW5zaXRpb24gYnlwYXNzIG1peGVyIHNldHRpbmdzIGlmIG5lZWRlZCBkZXBlbmRpbmcgb24gdHJhbnNpdGlvbiB0eXBlICovCi0gICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpewotICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDA9TFZNX01BWElOVF8xNjsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxPTA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIGlmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MCA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MSA9IDA7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gT3BlcmF0aW5nTW9kZVNhdmU7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MT1MVk1fTUFYSU5UXzE2OwotICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDA9MDsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxID0gTFZNX01BWElOVF8xNjsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwID0gMDsKICAgICAgICAgfQogCiAgICAgICAgIC8qIFNldCB0cmFuc2l0aW9uIGZsYWcgKi8KICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9UUlVFOwogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzMsMTIgKzIxNCwxMSBAQAogLyogIENhbGxCYWNrIGZ1bmN0aW9uIG9mIHRoZSBUaW1lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCogcENhbGxCYWNrUGFyYW1zLCBMVk1fSU5UMzIgQ2FsbGJhY2tQYXJhbSkKLXsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Cit2b2lkIExWQ1NfVGltZXJDYWxsQmFjayh2b2lkKiBoSW5zdGFuY2UsIHZvaWQqIHBDYWxsQmFja1BhcmFtcywgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgIC8qIEF2b2lkIHdhcm5pbmdzIGJlY2F1c2UgcENhbGxCYWNrUGFyYW1zIGFuZCBDYWxsYmFja1BhcmFtIGFyZSBub3QgdXNlZCovCi0gICAgaWYoKHBDYWxsQmFja1BhcmFtcyAhPSBMVk1fTlVMTCkgfHwgKENhbGxiYWNrUGFyYW0gIT0gMCkpeworICAgIGlmICgocENhbGxCYWNrUGFyYW1zICE9IExWTV9OVUxMKSB8fCAoQ2FsbGJhY2tQYXJhbSAhPSAwKSkgewogICAgICAgICBwQ2FsbEJhY2tQYXJhbXMgPSBoSW5zdGFuY2U7CiAgICAgICAgIENhbGxiYWNrUGFyYW0gPSAwOwogICAgICAgICByZXR1cm47CkBAIC0yNDgsNCArMjI4LDMgQEAKIAogICAgIHJldHVybjsKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmNwcAppbmRleCA0MzFiN2UzLi5iYWQ5YWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmNwcApAQCAtNTMsMjkgKzUzLDIyIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfRXF1YWxpc2VyX3QqIHBDb25maWcgPSAoTFZDU19FcXVhbGlzZXJfdCopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOworICAgIExWQ1NfRGF0YV90KiBwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QqIHBDb2VmZmljaWVudHM7CisgICAgQlFfRkxPQVRfQ29lZnNfdCBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCogcEVxdWFsaXNlckNvZWZUYWJsZTsKIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOwotICAgIExWQ1NfRGF0YV90ICAgICAgICAgKnBEYXRhOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHM7Ci0gICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmczsKLSAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwRXF1YWxpc2VyQ29lZlRhYmxlOwotCi0gICAgcERhdGEgPSAoTFZDU19EYXRhX3QgKikgXAotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCi0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCopcEluc3RhbmNlLT5wRGF0YTsKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCopcEluc3RhbmNlLT5wQ29lZmY7CiAgICAgLyoKICAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCiAgICAgICovCiAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCi0gICAgeworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldHVwIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeQogICAgICAgICAgKi8KQEAgLTg0LDM3ICs3NywzNSBAQAogCiAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0IGZpbHRlcnMgKi8KICAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLwotICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTA7Ci0gICAgICAgIENvZWZmcy5BMSA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKLSAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzLkExID0gKExWTV9GTE9BVClwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEyOwogICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjE7CiAgICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKIAotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMsIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0lOVDE2KTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKikmcERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMsIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKIAogICAgICAgICBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnRzLT5FcXVhbGlzZXJCaXF1YWRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAmQ29lZmZzKTsKIAogICAgICAgICAvKiBDYWxsYmFja3MgKi8KLSAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKLSAgICAgICAgeworICAgICAgICBzd2l0Y2ggKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkgewogICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMzUsMzAgKzEyNiwyMyBAQAogLyogIDEuICBBbHdheXMgcHJvY2Vzc2VzIGluIHBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpCi17CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90KiBwQ29uZmlnID0gKExWQ1NfRXF1YWxpc2VyX3QqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QqIHBDb2VmZmljaWVudHM7CiAKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAgKikmcEluc3RhbmNlLT5FcXVhbGlzZXI7Ci0gICAgTFZDU19Db2VmZmljaWVudF90ICAqcENvZWZmaWNpZW50czsKLQotICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QqKXBJbnN0YW5jZS0+cENvZWZmOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCiAgICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApCi0gICAgeworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfRVFVQUxJU0VSU1dJVENIKSAhPSAwKSB7CiAgICAgICAgIC8qIEFwcGx5IGZpbHRlciB0byB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgKi8KLSAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFjaykoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnRzLT5FcXVhbGlzZXJCaXF1YWRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXRPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFjaykoCisgICAgICAgICAgICAgICAgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50cy0+RXF1YWxpc2VyQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcElucHV0T3V0cHV0LCAoTFZNX0ZMT0FUKilwSW5wdXRPdXRwdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCmluZGV4IDkxOGQ5MzEuLmMwZDA5NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKQEAgLTI1LDkgKzI1LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEVxdWFsaXNlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdm9pZCAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CiB9IExWQ1NfRXF1YWxpc2VyX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNiwxMCArMzUsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKTsKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCogcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKTsKIAotI2VuZGlmICAvKiBFUVVBTElTRVJfSCAqLworI2VuZGlmIC8qIEVRVUFMSVNFUl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAppbmRleCBjN2VlMjMyLi42OWM0NmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKQEAgLTI0LDIwMSArMjQsMjAxIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCi0jZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjc3MjAKLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTUxMjUpCi0jZGVmaW5lIENTX01JRERMRV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45MjE4OTkpCi0jZGVmaW5lIENTX01JRERMRV84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjExNDQxCi0jZGVmaW5lIENTX1NJREVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzgwMzQ0KQotI2RlZmluZSBDU19TSURFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMTA5NykKLSNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42MjI0NzApCi0jZGVmaW5lIENTX1NJREVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTMwNzU5KQotI2RlZmluZSBDU19TSURFXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTAgMC4yMjc3MjAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgKC0wLjIxNTEyNSkKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjEgKC0wLjkyMTg5OSkKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EwIDAuNjExNDQxCisjZGVmaW5lIENTX1NJREVfODAwMF9BMSAoLTAuMzgwMzQ0KQorI2RlZmluZSBDU19TSURFXzgwMDBfQTIgKC0wLjIzMTA5NykKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICgtMC42MjI0NzApCisjZGVmaW5lIENTX1NJREVfODAwMF9CMiAoLTAuMTMwNzU5KQorI2RlZmluZSBDU19TSURFXzgwMDBfU0NBTEUgMTUKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjI5NDMgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDgzOAotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyMTU1OSkKLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0wLjk0MzA1NikKLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC41NTczNzIKLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zOTE0OTApCi0jZGVmaW5lIENTX1NJREVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTY1ODgxKQotI2RlZmluZSBDU19TSURFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg4MDYwOCkKLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAzMjM5NwotI2RlZmluZSBDU19TSURFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMCAwLjIzMDgzOAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTEgKC0wLjIyMTU1OSkKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMSAoLTAuOTQzMDU2KQorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTAgMC41NTczNzIKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMSAoLTAuMzkxNDkwKQorI2RlZmluZSBDU19TSURFXzExMDI1X0EyICgtMC4xNjU4ODEpCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQjEgKC0wLjg4MDYwOCkKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMiAwLjAzMjM5NworI2RlZmluZSBDU19TSURFXzExMDI1X1NDQUxFIDE1CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyMTkxICovCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI5OTMyCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyMTQzNikKLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTQ3NjE2KQotI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU4Mzk4Ci0jZGVmaW5lIENTX1NJREVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzkyMjExKQotI2RlZmluZSBDU19TSURFXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE2NjE4NykKLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC44OTI1NTApCi0jZGVmaW5lIENTX1NJREVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzI4NTYKLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EwIDAuMjI5OTMyCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMSAoLTAuMjIxNDM2KQorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IxICgtMC45NDc2MTYpCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTIwMDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMCAwLjU1ODM5OAorI2RlZmluZSBDU19TSURFXzEyMDAwX0ExICgtMC4zOTIyMTEpCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTIgKC0wLjE2NjE4NykKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMSAoLTAuODkyNTUwKQorI2RlZmluZSBDU19TSURFXzEyMDAwX0IyIDAuMDMyODU2CisjZGVmaW5lIENTX1NJREVfMTIwMDBfU0NBTEUgMTUKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIzNzEgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDYzOAotI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyNDIzMikKLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0wLjk2MDU1MCkKLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDk5Njk1Ci0jZGVmaW5lIENTX1NJREVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzU1NTQzKQotI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE0NDE1MikKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wNTA3ODgpCi0jZGVmaW5lIENTX1NJREVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDQxMDQKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EwIDAuMjMwNjM4CisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMSAoLTAuMjI0MjMyKQorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IxICgtMC45NjA1NTApCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMCAwLjQ5OTY5NQorI2RlZmluZSBDU19TSURFXzE2MDAwX0ExICgtMC4zNTU1NDMpCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTIgKC0wLjE0NDE1MikKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMSAoLTEuMDUwNzg4KQorI2RlZmluZSBDU19TSURFXzE2MDAwX0IyIDAuMTQ0MTA0CisjZGVmaW5lIENTX1NJREVfMTYwMDBfU0NBTEUgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjA3ODEgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIyODc0OQotI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyNDEyOCkKLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3MTI2MikKLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQ0MDExMgotI2RlZmluZSBDU19TSURFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjEwOTYpCi0jZGVmaW5lIENTX1NJREVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE3OTAxNikKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTE2Nzg2KQotI2RlZmluZSBDU19TSURFXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MjUwNwotI2RlZmluZSBDU19TSURFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTAgMC4yMjg3NDkKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0ExICgtMC4yMjQxMjgpCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjEgKC0wLjk3MTI2MikKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzIyMDUwX0EwIDAuNDQwMTEyCisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTEgKC0wLjI2MTA5NikKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMiAoLTAuMTc5MDE2KQorI2RlZmluZSBDU19TSURFXzIyMDUwX0IxICgtMS4xMTY3ODYpCisjZGVmaW5lIENTX1NJREVfMjIwNTBfQjIgMC4xODI1MDcKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9TQ0FMRSAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTg4MiAqLwotI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMzAzOTUKLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyNjExNykKLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC45NzM1NzMpCi0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTQ3NzAKLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI4NzE4MikKLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjEyNzU4OCkKLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjIyOTY0OCkKLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgyMTc3Ci0jZGVmaW5lIENTX1NJREVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMCAwLjIzMDM5NQorI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTEgKC0wLjIyNjExNykKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMSAoLTAuOTczNTczKQorI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTAgMC40MTQ3NzAKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAoLTAuMjg3MTgyKQorI2RlZmluZSBDU19TSURFXzI0MDAwX0EyICgtMC4xMjc1ODgpCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQjEgKC0xLjIyOTY0OCkKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMiAwLjI4MjE3NworI2RlZmluZSBDU19TSURFXzI0MDAwX1NDQUxFIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwMzIyICovCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjg0MDAKLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjUyMTQpCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45ODAxMjYpCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2NDU3OQotI2RlZmluZSBDU19TSURFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIwNzM1NSkKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNTcyMjQpCi0jZGVmaW5lIENTX1NJREVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjc0MjMxKQotI2RlZmluZSBDU19TSURFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzEyNDk1Ci0jZGVmaW5lIENTX1NJREVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMCAwLjIyODQwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTEgKC0wLjIyNTIxNCkKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAoLTAuOTgwMTI2KQorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTAgMC4zNjQ1NzkKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMSAoLTAuMjA3MzU1KQorI2RlZmluZSBDU19TSURFXzMyMDAwX0EyICgtMC4xNTcyMjQpCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjEgKC0xLjI3NDIzMSkKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMiAwLjMxMjQ5NQorI2RlZmluZSBDU19TSURFXzMyMDAwX1NDQUxFIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYzODM0ICovCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzNTkzCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjIzMTIyNSkKLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTg1NTQ1KQotI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjI4NDU3MwotI2RlZmluZSBDU19TSURFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMC4yNTg5MTApCi0jZGVmaW5lIENTX1NJREVfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAyNTY2MikKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNTcyMjQ4KQotI2RlZmluZSBDU19TSURFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU4ODM5OQotI2RlZmluZSBDU19TSURFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EwIDAuMjMzNTkzCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMSAoLTAuMjMxMjI1KQorI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IxICgtMC45ODU1NDUpCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDQxMDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMCAwLjI4NDU3MworI2RlZmluZSBDU19TSURFXzQ0MTAwX0ExICgtMC4yNTg5MTApCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTIgKC0wLjAyNTY2MikKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAoLTEuNTcyMjQ4KQorI2RlZmluZSBDU19TSURFXzQ0MTAwX0IyIDAuNTg4Mzk5CisjZGVmaW5lIENTX1NJREVfNDQxMDBfU0NBTEUgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjQ0MDIgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzQ0NDUKLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjMyMjYxKQotI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45ODY3MTMpCi0jZGVmaW5lIENTX01JRERMRV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI3MjYwNgotI2RlZmluZSBDU19TSURFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjY2OTUyKQotI2RlZmluZSBDU19TSURFXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDA1NjU0KQotI2RlZmluZSBDU19TSURFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuNjE3MTQxKQotI2RlZmluZSBDU19TSURFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC42MzA0MDUKLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EwIDAuMjM0NDQ1CisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAoLTAuMjMyMjYxKQorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IxICgtMC45ODY3MTMpCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDgwMDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMCAwLjI3MjYwNgorI2RlZmluZSBDU19TSURFXzQ4MDAwX0ExICgtMC4yNjY5NTIpCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTIgKC0wLjAwNTY1NCkKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMSAoLTEuNjE3MTQxKQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0IyIDAuNjMwNDA1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgMTQKIAogLyogQ29lZmZpY2llbnRzIGZvciA4ODIwMEh6IHNhbXBsZSByYXRlLgogICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAogICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKICAqIGZvciA0NDEwMEh6LgogICovCi0jZGVmaW5lIENTX01JRERMRV84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzODQ2ZgotI2RlZmluZSBDU19NSURETEVfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjMyNjU3ZikKLSNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIENTX01JRERMRV84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC45OTI3NDdmKQotI2RlZmluZSBDU19NSURETEVfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzE1NDFmCi0jZGVmaW5lIENTX1NJREVfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4yODk1ODZmKQotI2RlZmluZSBDU19TSURFXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjA1ODA0NWYKLSNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjc2NTMwMGYpCi0jZGVmaW5lIENTX1NJREVfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNzY5ODE2ZgotI2RlZmluZSBDU19TSURFXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19NSURETEVfODgyMDBfQTAgMC4yMzM4NDZmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMSAoLTAuMjMyNjU3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EyIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfQjEgKC0wLjk5Mjc0N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9CMiAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfODgyMDBfQTAgMC4yMzE1NDFmCisjZGVmaW5lIENTX1NJREVfODgyMDBfQTEgKC0wLjI4OTU4NmYpCisjZGVmaW5lIENTX1NJREVfODgyMDBfQTIgMC4wNTgwNDVmCisjZGVmaW5lIENTX1NJREVfODgyMDBfQjEgKC0xLjc2NTMwMGYpCisjZGVmaW5lIENTX1NJREVfODgyMDBfQjIgMC43Njk4MTZmCisjZGVmaW5lIENTX1NJREVfODgyMDBfU0NBTEUgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY1Ki8KIC8qIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXRvZmYgZnJlcXVlbmN5IDEwMi4xOCBIeiovCi0jZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM1NTMyCi0jZGVmaW5lIENTX01JRERMRV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjIzNDQzMikKLSNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTkzMzM0KQotI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTAgMC4yMzU1MzIKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0ExICgtMC4yMzQ0MzIpCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgKC0wLjk5MzMzNCkKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAxNQogLyogQ29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgdXNpbmcgdGYyc3MgYW5kIHNzMnRmIGZ1bmN0aW9ucyBiYXNlZCBvbgogICogY29lZmZpY2llbnRzIGF2YWlsYWJsZSBmb3IgNDgwMDBIeiBzYW1wbGluZyBmcmVxdWVuY3kKICAqLwotI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMjQzMjZmCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjk0OTM3ZikKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDcwNjExZgotI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjc5MjE2NmYpCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NTgzMGYKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgMC4yMjQzMjZmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgKC0wLjI5NDkzN2YpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgMC4wNzA2MTFmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgKC0xLjc5MjE2NmYpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgMC43OTU4MzBmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUuCiAgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CiAgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQogICogZm9yIDQ0MTAwSHouCiAgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzOTczZgotI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMzM3OGYpCi0jZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC45OTYzNjdmKQotI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIENTX01JRERMRV8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xOTk4MzZmCi0jZGVmaW5lIENTX1NJREVfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzA3NTQ0ZikKLSNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMTA3NzA4ZgotI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg3NjU3MmYpCi0jZGVmaW5lIENTX1NJREVfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjg3Nzc3MWYKLSNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTAgMC4yMzM5NzNmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTEgKC0wLjIzMzM3OGYpCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTIgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjEgKC0wLjk5NjM2N2YpCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjIgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTAgMC4xOTk4MzZmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0ExICgtMC4zMDc1NDRmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMiAwLjEwNzcwOGYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjEgKC0xLjg3NjU3MmYpCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0IyIDAuODc3NzcxZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9TQ0FMRSAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY4OSovCi0jZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI0MTIxOQotI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjQwNjU2KQotI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjY2MSkKLSNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EwIDAuMjQxMjE5CisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTEgKC0wLjI0MDY1NikKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IxICgtMC45OTY2NjEpCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9TQ0FMRSAxNQogLyogQ29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgdXNpbmcgdGYyc3MgYW5kIHNzMnRmIGZ1bmN0aW9ucyBiYXNlZCBvbgogICogY29lZmZpY2llbnRzIGF2YWlsYWJsZSBmb3IgNDgwMDBIeiBzYW1wbGluZyBmcmVxdWVuY3kKICAqLwotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMC4xOTYwMzlmCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMzExMDI3ZikKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuMTE0OTg4ZgotI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjg5MTM4MGYpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjg5MjM0NjBmCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAwLjE5NjAzOWYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgKC0wLjMxMTAyN2YpCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyIDAuMTE0OTg4ZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMSAoLTEuODkxMzgwZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgMC44OTIzNDYwZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9TQ0FMRSAxNAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIyNywxMzMgKzIyNywxMzMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFJldmVyYiBkZWxheSBzZXR0aW5ncyBpbiBzYW1wbGVzICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfOEtIWiAgICAgICAgICAgICAgICAgICAgIDkzICAgICAgICAgLyogU2FtcGxlIHJhdGUgOGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xMUtIWiAgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxMWtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xMktIWiAgICAgICAgICAgICAgICAgICAxMzkgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxMmtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xNktIWiAgICAgICAgICAgICAgICAgICAxODYgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxNmtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yMktIWiAgICAgICAgICAgICAgICAgICAyNTYgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAyMmtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiAgICAgICAgICAgICAgICAgICAyNzkgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAyNGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiAgICAgICAgICAgICAgICAgICAzNzIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAzMmtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0NGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1NTcgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiAgICAgICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4OC4ya1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haICAgICAgICAgICAgICAgICAgIDExMTUgICAgICAgIC8qIFNhbXBsZSByYXRlIDk2a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiAgICAgICAgICAgICAgICAgIDIwNDggICAgICAgIC8qIFNhbXBsZSByYXRlIDE3Ni40a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiAgICAgICAgICAgICAgICAgIDIyMjkgICAgICAgIC8qIFNhbXBsZSByYXRlIDE5NmtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMICAgICAgICAgICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWgorI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFogOTMgICAgIC8qIFNhbXBsZSByYXRlIDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFogMTI4ICAgLyogU2FtcGxlIHJhdGUgMTFrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFogMTM5ICAgLyogU2FtcGxlIHJhdGUgMTJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFogMTg2ICAgLyogU2FtcGxlIHJhdGUgMTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFogMjU2ICAgLyogU2FtcGxlIHJhdGUgMjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogMjc5ICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogMzcyICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogNTEyICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogNTU3ICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfODhLSFogMTAyNCAgLyogU2FtcGxlIHJhdGUgODguMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiAxMTE1ICAvKiBTYW1wbGUgcmF0ZSA5NmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xNzZLSFogMjA0OCAvKiBTYW1wbGUgcmF0ZSAxNzYuNGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFogMjIyOSAvKiBTYW1wbGUgcmF0ZSAxOTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTCBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWgogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY2NzI3MSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NjgxNzkpCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAwLjY2NzI3MQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMSAoLTAuNjY3MjcxKQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMSAoLTAuNjY4MTc5KQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfODAwMF9TQ0FMRSAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAwLjY5OTYzOAotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICgtMC42OTk2MzgpCi0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NikKLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EwIDAuNjk5NjM4CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMSAoLTAuNjk5NjM4KQorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICgtMC43NDkwOTYpCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfU0NBTEUgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgIDAuNzA2OTMxCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICgtMC43MDY5MzEpCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMCAwLjcwNjkzMQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTEgKC0wLjcwNjkzMSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX1NDQUxFIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjcyODI3MgotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuNzI4MjcyKQotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjgyMDY3OSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMCAwLjcyODI3MgorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTEgKC0wLjcyODI3MikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMSAoLTAuODIwNjc5KQorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX1NDQUxFIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuNTE2Mzk2Ci0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjUxNjM5NikKLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuNTE4NTEyKQotI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICgtMC4yOTA5OTApCi0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMCAwLjUxNjM5NgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTEgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EyICgtMC41MTYzOTYpCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMSAoLTAuNTE4NTEyKQorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjIgKC0wLjI5MDk5MCkKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX1NDQUxFIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC40Nzk1NjUKLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjQ3OTU2NSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMC42Mzc3NDUpCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMTk4OTEyKQotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTAgMC40Nzk1NjUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0ExIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMiAoLTAuNDc5NTY1KQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjEgKC0wLjYzNzc0NSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IyICgtMC4xOTg5MTIpCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9TQ0FMRSAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4zODAzNDkKLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4zODAzNDkpCi0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC45NTA4NzMpCi0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjA0OTEyNwotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTAgMC4zODAzNDkKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0ExIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMiAoLTAuMzgwMzQ5KQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjEgKC0wLjk1MDg3MykKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IyIDAuMDQ5MTI3CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9TQ0FMRSAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yOTczODkKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yOTczODkpCi0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yMDA0MjMpCi0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1NjUyOQotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTAgMC4yOTczODkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0ExIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMiAoLTAuMjk3Mzg5KQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjEgKC0xLjIwMDQyMykKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IyIDAuMjU2NTI5CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9TQ0FMRSAxNAogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjc4NjYxCi0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4yNzg2NjEpCi0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuMjU0OTkzKQotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMzAzMzQ3Ci0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMCAwLjI3ODY2MQorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTEgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EyICgtMC4yNzg2NjEpCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMSAoLTEuMjU0OTkzKQorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjIgMC4zMDMzNDcKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFIDE0CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwICovCi0jZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNzE5MDFmCi0jZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMTcxOTAxZikKLSNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS41NTM5NDhmKQotI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAgKDAuNTcwMjQ4ZikKLSNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMCAwLjE3MTkwMWYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTIgKC0wLjE3MTkwMWYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMSAoLTEuNTUzOTQ4ZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0IyICgwLjU3MDI0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9TQ0FMRSAxNAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCiAvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAqLwotI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTYwMjQ4OAotI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMTYwMjQ4OCkKLSNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS41ODU0MTMpCi0jZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41OTkzNzcKLSNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwIDAuMTYwMjQ4OAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTEgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EyICgtMC4xNjAyNDg4KQorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjEgKC0xLjU4NTQxMykKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyIDAuNTk5Mzc3CisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9TQ0FMRSAxNAogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCiAvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wOTQ3NjNmCi0jZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTQ3NjNmKQotI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NTg1OTNmKQotI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjc2MzA5MWYpCi0jZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMCAwLjA5NDc2M2YKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMiAoLTAuMDk0NzYzZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9CMSAoLTEuNzU4NTkzZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9CMiAoMC43NjMwOTFmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX1NDQUxFIDE0CiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCiAvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAqLwotI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzgzNjkKLSNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDg3ODM2OSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNzc2NTc2NCkKLSNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43ODA0MDc2Ci0jZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EwIDAuMDg3ODM2OQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0ExIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTIgKC0wLjA4NzgzNjkpCisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQjEgKC0xLjc3NjU3NjQpCisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQjIgMC43ODA0MDc2CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfU0NBTEUgMTQKIAogLyogUmV2ZXJiIEdhaW4gU2V0dGluZ3MgKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfREVMQVlHQUlOICAgICAgICAgICAgICAgMC44MDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gZGVsYXkgcGF0aCBnYWluICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX09VVFBVVEdBSU4gICAgICAgICAgICAgIDEuMDAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIG91dHB1dCBnYWluICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX1BST0NHQUlOICAgICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogUHJvY2Vzc2VkIHBhdGggZ2FpbiAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOQ09SUkVDVCAgICAgICAgICAgICAxLjAwOTM0MyAgICAgICAgIC8qIERlbGF5IG1peGVyIGdhaW4gY29ycmVjdGlvbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9ERUxBWUdBSU4gMC44MDAwMDAgICAvKiBBbGdvcml0aG0gZGVsYXkgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX09VVFBVVEdBSU4gMS4wMDAwMDAgIC8qIEFsZ29yaXRobSBvdXRwdXQgZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTiAxODQwMyAgICAgICAvKiBQcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4gMTg0MDMgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOQ09SUkVDVCAxLjAwOTM0MyAvKiBEZWxheSBtaXhlciBnYWluIGNvcnJlY3Rpb24gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNjMsMjA1ICszNjMsMjA0IEBACiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDM4NDk3IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzc1NDgwICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS4yNjMzMTIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC42MDE3NDgpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMjgwNjgxKQotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjQ3NTg2NSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICgtMC40MDgxNTQpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDAuOTQzMzU3Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0wLjQ0OTM0NSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAoLTAuMjA5NTk0KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgICgtMC40NzU4NjUpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgKC0wLjQwODE1NCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTAgMS4yNjMzMTIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTEgKC0wLjYwMTc0OCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTIgKC0wLjI4MDY4MSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjEgKC0wLjQ3NTg2NSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjIgKC0wLjQwODE1NCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEUgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMCAwLjk0MzM1NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0ExICgtMC40NDkzNDUpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIgKC0wLjIwOTU5NCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSAoLTAuNDc1ODY1KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0IyICgtMC40MDgxNTQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEUgMTUKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMjc3NjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Njc0NjMgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAxLjEwMTE0NQotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgIDAuMTM5MDIwCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAoLTAuODY0NDIzKQotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgIDAuMDI0NTQxCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAoLTAuOTA4OTMwKQotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgMC45NzYwNTgKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgKC0wLjY5NTMyNikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgKC0wLjA5MDgwOSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgKC0wLjYxMDU5NCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgKC0wLjMxMTE0OSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EwIDEuMTAxMTQ1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMSAwLjEzOTAyMAorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTIgKC0wLjg2NDQyMykKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IxIDAuMDI0NTQxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMiAoLTAuOTA4OTMwKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfU0NBTEUgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTAgMC45NzYwNTgKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEgKC0wLjY5NTMyNikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIgKC0wLjA5MDgwOSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEgKC0wLjYxMDU5NCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIgKC0wLjMxMTE0OSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEUgMTUKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzI1MjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzEwMTcgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDEuMjc2NjYxCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMS4wMTc1MTkpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wNDQxMjgpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC43Mjk2MTYpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICgtMC4yMDQ1MzIpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAxLjAwNzA5NQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAoLTAuODcxOTEyKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgMC4wMjMyMzIKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgKC0wLjc0NTg1NykKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgKC0wLjE4OTE3MSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EwIDEuMjc2NjYxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMSAoLTEuMDE3NTE5KQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTIgKC0wLjA0NDEyOCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IxICgtMC43Mjk2MTYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMiAoLTAuMjA0NTMyKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfU0NBTEUgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTAgMS4wMDcwOTUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEgKC0wLjg3MTkxMikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIgMC4wMjMyMzIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEgKC0wLjc0NTg1NykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIgKC0wLjE4OTE3MSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEUgMTQKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzEzNzggYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzAxNjQgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS4yODE2MjkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTEuMDc1ODcyKQotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wNDEzNjUpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjcyNTIzOSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAoLTAuMjI0MzU4KQotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgIDEuMDgxMDkxCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAoLTAuODY3MTgzKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgKC0wLjA3MDI0NykKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICgtMC41MTUxMjEpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuNDI1ODkzKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTAgMS4yODE2MjkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0ExICgtMS4wNzU4NzIpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMiAoLTAuMDQxMzY1KQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjEgKC0wLjcyNTIzOSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IyICgtMC4yMjQzNTgpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCAxLjA4MTA5MQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMSAoLTAuODY3MTgzKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiAoLTAuMDcwMjQ3KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSAoLTAuNTE1MTIxKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMiAoLTAuNDI1ODkzKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAxNAogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjA0MTU3NiBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3Nzc3OSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgMS4zODg2MDUKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgKC0xLjMwNTc5OSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgIDAuMDM5OTIyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICgtMC43MTk0OTQpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICgtMC4yNDMyNDUpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDEuMjcyOTEwCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgKC0xLjM0MTAxNCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgMC4xNjc0NjIKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAoLTAuNjE0MjE5KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICgtMC4zNDUzODQpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMCAxLjM4ODYwNQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTEgKC0xLjMwNTc5OSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyIDAuMDM5OTIyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMSAoLTAuNzE5NDk0KQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjIgKC0wLjI0MzI0NSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX1NDQUxFIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EwIDEuMjcyOTEwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExICgtMS4zNDEwMTQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyIDAuMTY3NDYyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxICgtMC42MTQyMTkpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyICgtMC4zNDUzODQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX1NDQUxFIDE0CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDM0NDk1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcyNDkxICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS40MDk4MzIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICgtMS40NTY1MDYpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xNTE0MTAKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICgtMC44MDQyMDEpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAoLTAuMTYzNzgzKQotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgIDEuMjk5MTk4Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAoLTEuNDUyNDQ3KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgIDAuMjQwNDg5Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAoLTAuNjY5MzAzKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjI5NDk4NCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EwIDEuNDA5ODMyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMSAoLTEuNDU2NTA2KQorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTIgMC4xNTE0MTAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IxICgtMC44MDQyMDEpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMiAoLTAuMTYzNzgzKQorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfU0NBTEUgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTAgMS4yOTkxOTgKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEgKC0xLjQ1MjQ0NykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIgMC4yNDA0ODkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEgKC0wLjY2OTMwMykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIgKC0wLjI5NDk4NCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEUgMTQKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wNDQ1NTkgYW5kIENTRVggc2NhbGVkIHdpdGggMC43ODAwMDYgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS41NjA5ODgKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTEuODc3NzI0KQotI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjM4OTc0MQotI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45MDc0MTApCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgKC0wLjA3MDQ4OSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAxLjc4NTA0OQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgKC0yLjIzMzQ5NykKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAwLjUyNjQzMQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjQ0NTkzOSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICgtMC41MjI0NDYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMCAxLjU2MDk4OAorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTEgKC0xLjg3NzcyNCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyIDAuMzg5NzQxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMSAoLTAuOTA3NDEwKQorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjIgKC0wLjA3MDQ4OSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EwIDEuNzg1MDQ5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExICgtMi4yMzM0OTcpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyIDAuNTI2NDMxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxICgtMC40NDU5MzkpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyICgtMC41MjI0NDYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFIDEzCiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDIyMTcwIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYzMjg4ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgIDEuNjIzOTkzCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgKC0yLjI3MDc0MykKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgMC42ODg4MjkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAoLTEuMTE3MTkwKQotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAwLjEzMDIwOAotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAyLjAyODMxNQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgICgtMi44ODI0NTkpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgIDAuOTA0NTM1Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgKC0wLjU5MzMwOCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAoLTAuMzg1ODE2KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTAgMS42MjM5OTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExICgtMi4yNzA3NDMpCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMiAwLjY4ODgyOQorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjEgKC0xLjExNzE5MCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IyIDAuMTMwMjA4CisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMCAyLjAyODMxNQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSAoLTIuODgyNDU5KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiAwLjkwNDUzNQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSAoLTAuNTkzMzA4KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiAoLTAuMzg1ODE2KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAxMwogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAxODYzNSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MDY0OCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNjQxMTc3Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTIuMzY0Njg3KQotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuNzU5OTEwCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEuMTY2Nzc0KQotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuMTc4MDc0Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgMi4wOTk2NTUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICgtMy4wNjUyMjApCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgMS4wMTA0MTcKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICgtMC42MzQwMjEpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuMzQ3MzMyKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTAgMS42NDExNzcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExICgtMi4zNjQ2ODcpCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMiAwLjc1OTkxMAorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjEgKC0xLjE2Njc3NCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyIDAuMTc4MDc0CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCAyLjA5OTY1NQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSAoLTMuMDY1MjIwKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiAxLjAxMDQxNworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAoLTAuNjM0MDIxKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiAoLTAuMzQ3MzMyKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAxMwogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4ODIwMEh6IHNhbXBsZSByYXRlLgogICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAogICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKICAqIGZvciA0NDEwMEh6LgogICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAxLjc3MTg5OWYKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICgtMi45MzA3NjJmKQotI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgMS4xNzIxNzVmCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEuNDM4MzQ5ZikKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgIDAuNDQyNTIwZgotI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTAgICAgICAgICAgICAgICAgIDIuNjc1MjQxZgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSAgICAgICAgICAgICAgICAgKC00LjQ2NjE1NGYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyICAgICAgICAgICAgICAgICAxLjgxMDMwNWYKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjEgICAgICAgICAgICAgICAgICgtMC45MjUzNTBmKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjA2NjYxNmYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAxMworI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTAgMS43NzE4OTlmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMSAoLTIuOTMwNzYyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EyIDEuMTcyMTc1ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjEgKC0xLjQzODM0OWYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9CMiAwLjQ0MjUyMGYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX1NDQUxFIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EwIDIuNjc1MjQxZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSAoLTQuNDY2MTU0ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgMS44MTAzMDVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IxICgtMC45MjUzNTBmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiAoLTAuMDY2NjE2ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgMTMKIAotI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNzg0NDk3Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTMuMDAxNDM1KQotI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIDEuMjI4NDIyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEuNDc3ODA0KQotI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuNDgxMzY5Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgMi43NTczCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAoLTQuNjcyMSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAxLjkzMTcKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICgtMC45NzE3MTgpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDIxMjE2KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTAgMS43ODQ0OTcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExICgtMy4wMDE0MzUpCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMiAxLjIyODQyMgorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQjEgKC0xLjQ3NzgwNCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyIDAuNDgxMzY5CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCAyLjc1NzMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEgKC00LjY3MjEpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EyIDEuOTMxNworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAoLTAuOTcxNzE4KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiAoLTAuMDIxMjE2KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAxMwogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUuCiAgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CiAgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQogICogZm9yIDQ0MTAwSHouCiAgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgIDEuODgzNDQwZgotI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgKC0zLjQxNDI3MmYpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAxLjUzNDcwMmYKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICgtMS42NzQ2MTRmKQotI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgMC42NzU4MjdmCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAxMwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTAgICAgICAgICAgICAgICAgMy4zNTUwNjhmCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAoLTYuMTEyNTc4ZikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyICAgICAgICAgICAgICAgIDIuNzY0MTM1ZgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEgICAgICAgICAgICAgICAgKC0xLjI2ODUzM2YpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAwLjI3MTI3N2YKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTAgMS44ODM0NDBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgKC0zLjQxNDI3MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIgMS41MzQ3MDJmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjEgKC0xLjY3NDYxNGYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgMC42NzU4MjdmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwIDMuMzU1MDY4ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTEgKC02LjExMjU3OGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMiAyLjc2NDEzNWYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IxICgtMS4yNjg1MzNmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjIgMC4yNzEyNzdmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAxMwogCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuODg5NTgyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjQ1NjE0MCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS41Njk4NjQKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEuNzAwNzk4KQotI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjcwMTgyNAotI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgMy40MjczCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgKC02LjI5MzYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgIDIuODcyMAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICgtMS4zMTA3NCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAwLjMxMzEyCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwIDEuODg5NTgyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEgKC0zLjQ1NjE0MCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiAxLjU2OTg2NAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IxICgtMS43MDA3OTgpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIgMC43MDE4MjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAgMy40MjczCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSAoLTYuMjkzNikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyIDIuODcyMAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjEgKC0xLjMxMDc0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIgMC4zMTMxMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEUgMTMKIAotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0ICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgICAgIDAuODQ3NzczNSAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgbG9zcyAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAgICAwLjIwODc0NjUgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCi0jZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgKi8KLSNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgMC41NjkyMjUgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCBsb3NzICovCi0jZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgIDAuMDc3OTQ0MjUgICAgICAgICAvKiBFWCBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlQgMiAgICAgICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MgMC44NDc3NzM1ICAgLyogT3V0cHV0IFNoaWZ0IGxvc3MgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfR0FJTiAwLjIwODc0NjUgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVCAzICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0ICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUyAwLjU2OTIyNSAvKiBFWCBPdXRwdXQgU2hpZnQgbG9zcyAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9HQUlOIDAuMDc3OTQ0MjUgICAgLyogRVggVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuY3BwCmluZGV4IDYzMGVjZjcuLjVjOGYxYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jcHAKQEAgLTIwLDk5ICsyMCwxMSBAQAogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiTFZDUy5oIgogI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIGl0IGlzICAgICAgICAgICAqLwotLyogIHBhc3NlZCB0aGUgZGVmYXVsdCBjYXBhYmlsaXRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gICAgICAqLwotLyogIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlICAgICAgICAgICAgICAqLwotLyogIGNhcGFiaWxpdGllcyBhcmUgaWdub3JlZCBhbmQgdGhlIG1lbW9yeSB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX01lbW9yeShMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIFNjcmF0Y2hTaXplOwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7Ci0KLSAgICAvKgotICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19JbnN0YW5jZV90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlR5cGUgICAgICAgICA9IExWQ1NfUEVSU0lTVEVOVDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIERhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfRGF0YV90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlR5cGUgICAgICAgICA9IExWQ1NfREFUQTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvZWZmaWNpZW50IG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0NvZWZmaWNpZW50X3QpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZDU19DT0VGRklDSUVOVDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICAvKiBJbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikgXAotICAgICAgICAgICAgICAgICAgICAgICAgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBTY3JhdGNoU2l6ZTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICA9IExWQ1NfU0NSQVRDSDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEyMCw5MSArMzIsMTA2IEBACiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZSAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAqLwotLyogIGhJbnN0YW5jZSBzZXQgdG8gTFZNX05VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICovCi0vKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAqLwotLyogIExWQ1NfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHNjcmF0Y2ggYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAtIG1hbGxvYyBmYWlsdXJlICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCi0vKiAgMy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgYXMgdXNlZCBmb3IgdGhlICAgICAqLwotLyogICAgICBjYWxsIHRvIHRoZSBtZW1vcnkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Jbml0KExWQ1NfSGFuZGxlX3QgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgICAgICpwSW5zdGFuY2U7Ci0gICAgTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgICAgICAgICAqcExWQ1NfVm9sQ29ycmVjdFRhYmxlOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Jbml0KExWQ1NfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWQ1NfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFNjcmF0Y2gpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZTsKKyAgICBMVkNTX1ZvbENvcnJlY3RfdCogcExWQ1NfVm9sQ29ycmVjdFRhYmxlOwogCiAgICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAorICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCiAgICAgICovCi0gICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgKnBoSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICAqcGhJbnN0YW5jZSA9IGNhbGxvYygxLCBzaXplb2YoKnBJbnN0YW5jZSkpOwogICAgIH0KLSAgICBwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVkNTX05VTExBRERSRVNTOworICAgIH0KKyAgICBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KikqcGhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogU2F2ZSB0aGUgY2FwYWJpbGl0aWVzIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOwogCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOworICAgIHBJbnN0YW5jZS0+cFNjcmF0Y2ggPSBwU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogU2V0IGFsbCBpbml0aWFsIHBhcmFtZXRlcnMgdG8gaW52YWxpZCB0byBmb3JjZSBhIGZ1bGwgaW5pdGlhbGlzYXRpb24KICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICA9IExWQ1NfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICAgID0gTFZDU19TUEVBS0VSVFlQRV9NQVg7Ci0gICAgcEluc3RhbmNlLT5PdXRwdXREZXZpY2UgICAgICAgICAgPSBMVkNTX0hFQURQSE9ORTsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICA9IExWQ1NfU09VUkNFTUFYOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9IExWQ1NfU1BFQUtFUlRZUEVfTUFYOworICAgIHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID0gTFZDU19IRUFEUEhPTkU7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19TT1VSQ0VNQVg7CiAgICAgcEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPSBMVk1fTU9ERV9PRkY7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgPSBMVk1fRlNfSU5WQUxJRDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgICAgPSAoTFZNX1VJTlQxNikweDgwMDA7Ci0gICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlICAgICAgICAgICAgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKLSAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgICAgICAgICAgICA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKLSAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluICAgICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSA9IExWTV9GU19JTlZBTElEOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCA9IChMVk1fVUlOVDE2KTB4ODAwMDsKKyAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKKyAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07CisgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9IDA7CiAKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLDAsMCk7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAwLCAwKTsKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgYnlwYXNzIHZhcmlhYmxlcwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwPTA7Ci0gICAgcEluc3RhbmNlLT5NU1RhcmdldDE9MDsKLSAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBJbnN0YW5jZS0+YlRpbWVyRG9uZSAgICAgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuQ2FsbEJhY2tQYXJhbSAgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsQmFjayAgICAgICAgICAgICA9IExWQ1NfVGltZXJDYWxsQmFjazsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsYmFja0luc3RhbmNlICAgICA9IHBJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsQmFja1BhcmFtcyAgICAgICA9IExWTV9OVUxMOworICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwID0gMDsKKyAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MSA9IDA7CisgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5DYWxsQmFja1BhcmFtID0gMDsKKyAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsQmFjayA9IExWQ1NfVGltZXJDYWxsQmFjazsKKyAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsYmFja0luc3RhbmNlID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrUGFyYW1zID0gTFZNX05VTEw7CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZyZWUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgdGhlIExWQ1NfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNTX0RlSW5pdChMVkNTX0hhbmRsZV90KiBwaEluc3RhbmNlKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KikqcGhJbnN0YW5jZTsKKyAgICBpZiAocEluc3RhbmNlID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cENvZWZmICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wQ29lZmYpOworICAgICAgICBwSW5zdGFuY2UtPnBDb2VmZiA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wRGF0YSAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cERhdGEpOworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhID0gTFZNX05VTEw7CisgICAgfQorICAgIGZyZWUocEluc3RhbmNlKTsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCmluZGV4IDE1NGVhNTUuLmY5YzIzYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaApAQCAtMzMsMTEgKzMzLDExIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgIkxWQ1MuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGluZyBvciBBcHBsaWNhdGlvbiBsYXllciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkxWQ1NfU3RlcmVvRW5oYW5jZXIuaCIgICAgICAgICAgICAgICAgLyogU3RlcmVvIGVuaGFuY2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkxWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgiICAgICAgICAgICAgICAgLyogUmV2ZXJiZXJhdGlvbiBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJMVkNTX0VxdWFsaXNlci5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEVxdWFsaXNlciBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJMVkNTX0J5cGFzc01peC5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkNTLmgiICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19TdGVyZW9FbmhhbmNlci5oIiAgLyogU3RlcmVvIGVuaGFuY2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgiIC8qIFJldmVyYmVyYXRpb24gbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19FcXVhbGlzZXIuaCIgICAgICAgLyogRXF1YWxpc2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiICAgICAgIC8qIEJ5cGFzcyBNaXhlciBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KICNpbmNsdWRlICJMVk1fVGltZXIuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ3LDM1ICs0NywyOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQ29uZmlndXJhdGlvbiBzd2l0Y2ggY29udHJvbHMgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIICAgIDB4MDAwMSAgICAgIC8qIFN0ZXJlbyBlbmhhbmNlbWVudCBlbmFibGUgY29udHJvbCAqLwotI2RlZmluZSBMVkNTX1JFVkVSQlNXSVRDSCAgICAgICAgICAgMHgwMDAyICAgICAgLyogUmV2ZXJiZXJhdGlvbiBlbmFibGUgY29udHJvbCAqLwotI2RlZmluZSBMVkNTX0VRVUFMSVNFUlNXSVRDSCAgICAgICAgMHgwMDA0ICAgICAgLyogRXF1YWxpc2VyIGVuYWJsZSBjb250cm9sICovCi0jZGVmaW5lIExWQ1NfQllQQVNTTUlYU1dJVENIICAgICAgICAweDAwMDggICAgICAvKiBCeXBhc3MgbWl4ZXIgZW5hYmxlIGNvbnRyb2wgKi8KLSNkZWZpbmUgTFZDU19DT01QR0FJTkZSQU1FICAgICAgICAgIDY0ICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiB1cGRhdGUgaW50ZXJ2YWwgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIIDB4MDAwMSAvKiBTdGVyZW8gZW5oYW5jZW1lbnQgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTFZDU19SRVZFUkJTV0lUQ0ggMHgwMDAyICAgICAgICAvKiBSZXZlcmJlcmF0aW9uIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfRVFVQUxJU0VSU1dJVENIIDB4MDAwNCAgICAgLyogRXF1YWxpc2VyIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfQllQQVNTTUlYU1dJVENIIDB4MDAwOCAgICAgLyogQnlwYXNzIG1peGVyIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfQ09NUEdBSU5GUkFNRSA2NCAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHVwZGF0ZSBpbnRlcnZhbCAqLwogCiAvKiBNZW1vcnkgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0jZGVmaW5lIExWQ1NfU0NSQVRDSEJVRkZFUlMgICAgICAgICAgICAgIDggICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0jZWxzZQotI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA2ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwotI2VuZGlmCi0jaWZkZWYgU1VQUE9SVF9NQworI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTIDggLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwogLyoKICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBhcHBsaWVzIHByb2Nlc3Npbmcgb25seSBvbiB0aGUgZmlyc3QgdHdvCiAgKiBjaGFubmVscyBvZiBhIG11bHRpY2hhbm5lbCBpbnB1dC4gVGhlIGRhdGEgb2YgZmlyc3QgdHdvIGNoYW5uZWxzIGlzIGNvcGllZAogICogZnJvbSB0aGUgbXVsdGljaGFubmVsIGlucHV0IGludG8gc2NyYXRjaCBidWZmZXIuIFRoZSBidWZmZXJzIGFkZGVkIGhlcmUKICAqIGFyZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UKICAqLwotI2RlZmluZSBMVkNTX01DX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAyCi0jZW5kaWYKKyNkZWZpbmUgTFZDU19NQ19TQ1JBVENIQlVGRkVSUyAyCiAKIC8qIEdlbmVyYWwgKi8KLSNkZWZpbmUgTFZDU19JTlZBTElEICAgICAgICAgICAgICAgIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgTFZDU19CWVBBU1NfTUlYRVJfVEMgICAgICAgIDEwMCAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lICovCisjZGVmaW5lIExWQ1NfSU5WQUxJRCAweEZGRkYgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCisjZGVmaW5lIExWQ1NfQllQQVNTX01JWEVSX1RDIDEwMCAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLwogCiAvKiBBY2Nlc3MgdG8gZXh0ZXJuYWwgY29lZmZpY2llbnRzIHRhYmxlICovCi0jZGVmaW5lIExWQ1NfTlJfT0ZfRlMgICAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgTFZDU19OUl9PRl9DSEFOX0NGRyAgICAgICAgICAgICAgMgorI2RlZmluZSBMVkNTX05SX09GX0ZTIDkKKyNkZWZpbmUgTFZDU19OUl9PRl9DSEFOX0NGRyAyCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODMsMTMgKzc3LDkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIExWTV9VSU5UMTYgIExWQ1NfQ29uZmlndXJhdGlvbl90OyAgICAgICAvKiBJbnRlcm5hbCBhbGdvcml0aG0gY29uZmlndXJhdGlvbiAqLwordHlwZWRlZiBMVk1fVUlOVDE2IExWQ1NfQ29uZmlndXJhdGlvbl90OyAvKiBJbnRlcm5hbCBhbGdvcml0aG0gY29uZmlndXJhdGlvbiAqLwogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX0hFQURQSE9ORSAgPSAwLAotICAgIExWQ1NfREVWSUNFX01BWCA9IExWTV9NQVhFTlVNCi19IExWQ1NfT3V0cHV0RGV2aWNlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZDU19IRUFEUEhPTkUgPSAwLCBMVkNTX0RFVklDRV9NQVggPSBMVk1fTUFYRU5VTSB9IExWQ1NfT3V0cHV0RGV2aWNlX2VuOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk4LDY1ICs4OCw2MCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVm9sdW1lIGNvcnJlY3Rpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLwotICAgIExWTV9GTE9BVCAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KLSAgICBMVk1fRkxPQVQgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLwotICAgIExWTV9GTE9BVCAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBDb21wRnVsbDsgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCBDb21wTWluOyAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KKyAgICBMVk1fRkxPQVQgR2FpbkZ1bGw7IC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCBHYWluTWluOyAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLwogfSBMVkNTX1ZvbENvcnJlY3RfdDsKIAogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCi0gICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgTWVtb3J5VGFibGU7ICAgICAgICAvKiBJbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgIFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICovCisgICAgTFZDU19QYXJhbXNfdCBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkNTX0NhcGFiaWxpdGllc190IENhcGFiaWxpdGllczsgLyogSW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KLSAgICBMVkNTX091dHB1dERldmljZV9lbiAgICBPdXRwdXREZXZpY2U7ICAgICAgIC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLwotICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgIFZvbENvcnJlY3Q7ICAgICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisgICAgTFZDU19PdXRwdXREZXZpY2VfZW4gT3V0cHV0RGV2aWNlOyAvKiBTZWxlY3RlZCBvdXRwdXQgZGV2aWNlIHR5cGUgKi8KKyAgICBMVkNTX1ZvbENvcnJlY3RfdCBWb2xDb3JyZWN0OyAgICAgIC8qIFZvbHVtZSBjb3JyZWN0aW9uIHNldHRpbmdzICovCisgICAgTFZNX0ZMT0FUIFRyYW5zaXRpb25HYWluOyAgICAgICAgICAvKiBUcmFuc2l0aW9uIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgQ29tcHJlc3NHYWluOyAgICAgICAgICAgIC8qIExhc3QgdXNlZCBjb21wcmVzc29yIGdhaW4qLwogCiAgICAgLyogU3ViLWJsb2NrIGNvbmZpZ3VyYXRpb25zICovCi0gICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgU3RlcmVvRW5oYW5jZXI7ICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgY29uZmlndXJhdGlvbiAqLwotICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgIFJldmVyYmVyYXRpb247ICAgICAgLyogUmV2ZXJiZXJhdGlvbiBjb25maWd1cmF0aW9uICovCi0gICAgTFZDU19FcXVhbGlzZXJfdCAgICAgICAgRXF1YWxpc2VyOyAgICAgICAgICAvKiBFcXVhbGlzZXIgY29uZmlndXJhdGlvbiAqLwotICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgICAgIEJ5cGFzc01peDsgICAgICAgICAgLyogQnlwYXNzIG1peGVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgU3RlcmVvRW5oYW5jZXI7IC8qIFN0ZXJlbyBlbmhhbmNlciBjb25maWd1cmF0aW9uICovCisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCBSZXZlcmJlcmF0aW9uOyAvKiBSZXZlcmJlcmF0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBMVkNTX0VxdWFsaXNlcl90IEVxdWFsaXNlcjsgICAgICAgICAgIC8qIEVxdWFsaXNlciBjb25maWd1cmF0aW9uICovCisgICAgTFZDU19CeXBhc3NNaXhfdCBCeXBhc3NNaXg7ICAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgY29uZmlndXJhdGlvbiAqLwogCiAgICAgLyogQnlwYXNzIHZhcmlhYmxlICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTVNUYXJnZXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgc3RhdGUgY29udHJvbCB2YXJpYWJsZSBmb3Igc21vb3RoIHRyYW5zdGlvbiAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE1TVGFyZ2V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peGVyIHN0YXRlIGNvbnRyb2wgdmFyaWFibGUgZm9yIHNtb290aCB0cmFuc3Rpb24gKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgICAgICAgICAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiVGltZXJEb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBjb21wbGV0aW9uIGZsYWcgKi8KLSAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICBUaW1lclBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBwYXJhbWV0ZXJzICovCi0gICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgVGltZXJJbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgLyogVGltZXIgaW5zdGFuY2UgKi8KKyAgICBMVk1fSU5UMTYgTVNUYXJnZXQwOyAgICAgICAgICAgICAgICAgIC8qIE1peGVyIHN0YXRlIGNvbnRyb2wgdmFyaWFibGUgZm9yIHNtb290aCB0cmFuc2l0aW9uICovCisgICAgTFZNX0lOVDE2IE1TVGFyZ2V0MTsgICAgICAgICAgICAgICAgICAvKiBNaXhlciBzdGF0ZSBjb250cm9sIHZhcmlhYmxlIGZvciBzbW9vdGggdHJhbnNpdGlvbiAqLworICAgIExWTV9JTlQxNiBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCisgICAgTFZNX0lOVDE2IGJUaW1lckRvbmU7ICAgICAgICAgICAgICAgICAvKiBUaW1lciBjb21wbGV0aW9uIGZsYWcgKi8KKyAgICBMVk1fVGltZXJfUGFyYW1zX3QgVGltZXJQYXJhbXM7ICAgICAgIC8qIFRpbWVyIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fVGltZXJfSW5zdGFuY2VfdCBUaW1lckluc3RhbmNlOyAgIC8qIFRpbWVyIGluc3RhbmNlICovCisgICAgdm9pZCogcENvZWZmOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgZXF1YWxpc2VyIGZpbHRlciBjb2VmZnMgKi8KKyAgICB2b2lkKiBwRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnVmZmVyIGZvciBlcXVhbGlzZXIgZmlsdGVyIHN0YXRlcyAqLworICAgIHZvaWQqIHBTY3JhdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KIAogfSBMVkNTX0luc3RhbmNlX3Q7CiAKIC8qIENvZWZmaWNpZW50IFN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90IEVxdWFsaXNlckJpcXVhZEluc3RhbmNlOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90IFJldmVyYkJpcXVhZEluc3RhbmNlOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90IFNFQmlxdWFkSW5zdGFuY2VNaWQ7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgU0VCaXF1YWRJbnN0YW5jZVNpZGU7CiB9IExWQ1NfQ29lZmZpY2llbnRfdDsKIAogLyogRGF0YSBTdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOwogICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOwogfSBMVkNTX0RhdGFfdDsKIAotdm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sgKCAgIHZvaWQqIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pOwordm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKTsKIAotI2VuZGlmICAgICAgLyogUFJJVkFURV9IICovCi0KKyNlbmRpZiAvKiBQUklWQVRFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmNwcAppbmRleCA4ZTA5YmUyLi5kMThmMmMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuY3BwCkBAIC02NSwxOCArNjUsMTQgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0gICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcElucHV0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgY29uc3QgTFZNX0ZMT0FUKiBwSW5wdXQ7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaDsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTdEluOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworICAgIExWTV9GTE9BVCogcFN0SW47CisgICAgTFZNX0lOVDMyIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKICNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKIAogICAgIC8qSW4gY2FzZSBvZiBtb25vIHByb2Nlc3NpbmcsIHN0ZXJlbyBpbnB1dCBpcyBjcmVhdGVkIGZyb20gbW9ubwpAQCAtODUsOTYgKzgxLDY0IEBACiAgICAgICphdCB0aGlzIHBvaW50LgogICAgICAqU28gdG8gdHJlYXQgdGhlIHBJbkRhdGEgYXMgc3RlcmVvIHdlIGFyZSBzZXR0aW5nIGNoYW5uZWxzIHRvIDIKICAgICAgKi8KLSAgICBpZiAoY2hhbm5lbHMgPT0gMSkKLSAgICB7CisgICAgaWYgKGNoYW5uZWxzID09IDEpIHsKICAgICAgICAgY2hhbm5lbHMgPSAyOwogICAgIH0KLSNlbmRpZgogCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCi0gICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcEluc3RhbmNlLT5wU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAvKgogICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCiAgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgogICAgICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBjYXJyaWVzIG91dCBwcm9jZXNzaW5nIG9ubHkgb24gTCwgUi4KICAgICAgKi8KICAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnJGcmFtZXMpOwotICAgIHBTdEluICA9IHBTY3JhdGNoICsgKChMVkNTX1NDUkFUQ0hCVUZGRVJTIC0gMikgKiBOckZyYW1lcyk7CisgICAgcFN0SW4gPSBwU2NyYXRjaCArICgoTFZDU19TQ1JBVENIQlVGRkVSUyAtIDIpICogTnJGcmFtZXMpOwogICAgIC8qIFRoZSBmaXJzdCB0d28gY2hhbm5lbCBkYXRhIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBkYXRhIGFuZAogICAgICAqIGNvcGllZCBpbnRvIHBJbnB1dCBidWZmZXIKICAgICAgKi8KLSAgICBDb3B5X0Zsb2F0X01jX1N0ZXJlbygoTFZNX0ZMT0FUICopcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKLSAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5wdXQsCi0gICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFN0SW4sCi0gICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnJGcmFtZXMpKTsKLSNlbHNlCi0gICAgaWYgKHBJbkRhdGEgPT0gcE91dERhdGEpCi0gICAgewotICAgICAgICAvKiBQcm9jZXNzaW5nIGlucGxhY2UgKi8KLSAgICAgICAgcElucHV0ID0gcFNjcmF0Y2ggKyAoMiAqIE51bVNhbXBsZXMpOwotICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dCwgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCi0gICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7Ci0gICAgfQotI2VuZGlmCisgICAgQ29weV9GbG9hdF9NY19TdGVyZW8oKExWTV9GTE9BVCopcEluRGF0YSwgKExWTV9GTE9BVCopcElucHV0LCBOckZyYW1lcywgY2hhbm5lbHMpOworICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcElucHV0LCAoTFZNX0ZMT0FUKilwU3RJbiwgKExWTV9JTlQxNikoMiAqIE5yRnJhbWVzKSk7CiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSBzdGVyZW8gZW5oYW5jZXIKICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdEluLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIHRvIHByb2Nlc3MgKi8KLSNlbHNlCi0gICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0jZW5kaWYKKyAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RJbiwgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsgLyogTnVtYmVyIG9mIGZyYW1lcyB0byBwcm9jZXNzICovCiAKICAgICAvKgogICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKICAgICAgKi8KLSAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvcihoSW5zdGFuY2UsICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvcihoSW5zdGFuY2UsICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSBlcXVhbGlzZXIKICAgICAgKi8KLSAgICBlcnIgPSBMVkNTX0VxdWFsaXNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisgICAgZXJyID0gTFZDU19FcXVhbGlzZXIoaEluc3RhbmNlLCAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KIAogICAgIC8qCiAgICAgICogQ2FsbCB0aGUgYnlwYXNzIG1peGVyCiAgICAgICovCi0gICAgZXJyID0gTFZDU19CeXBhc3NNaXhlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBwcm9jZXNzZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0ICh1bnByb2Nlc3NlZCkgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4ZXIoaEluc3RhbmNlLCAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgIC8qIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgKHVucHJvY2Vzc2VkKSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCiAKLSAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQotICAgIHsKKyAgICBpZiAoZXJyICE9IExWQ1NfU1VDQ0VTUykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjAyLDE3MSArMTY2LDExNCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KICAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOwogI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQotICAgIGlmIChjaGFubmVscyA9PSAxKQotICAgIHsKKyAgICBpZiAoY2hhbm5lbHMgPT0gMSkgewogICAgICAgICBjaGFubmVscyA9IDI7CiAgICAgfQotI2VuZGlmCiAgICAgLyoKICAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQogICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWQ1NfVE9PTUFOWVNBTVBMRVMpOworICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKSB7CisgICAgICAgIHJldHVybiAoTFZDU19UT09NQU5ZU0FNUExFUyk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRikKLSAgICB7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICBMVk1fRkxPQVQgKnBTdGVyZW9PdXQ7CisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpIHsKKyAgICAgICAgTFZNX0ZMT0FUKiBwU3RlcmVvT3V0OwogICAgICAgICAvKgogICAgICAgICAgKiBMVkNTX1Byb2Nlc3NfQ1MgdXNlcyBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIGludGVybWVkaWF0ZSBvdXRwdXRzIG9mIFN0ZXJlb0VuaGFuY2VyLAogICAgICAgICAgKiBFcXVhbGl6ZXIsIFJldmVyYkdlbmVyYXRvciBhbmQgQnlwYXNzTWl4ZXIuCiAgICAgICAgICAqIFNvLCB0byBhdm9pZCBpL28gZGF0YSBvdmVybGFwcGluZywgd2hlbiBpL28gYnVmZmVycyBhcmUgY29tbW9uLCB1c2Ugc2NyYXRjaCBidWZmZXIKICAgICAgICAgICogdG8gc3RvcmUgaW50ZXJtZWRpYXRlIG91dHB1dHMuCiAgICAgICAgICAqLwotICAgICAgICBpZiAocE91dERhdGEgPT0gcEluRGF0YSkKLSAgICAgICAgewotICAgICAgICAgIC8qCi0gICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkgaXMgdXNlZCBpbiA0IGNodW5rcyBvZiAoMiAqIE5yRnJhbWVzKSBzaXplLgotICAgICAgICAgICAqIEZpcnN0IGNodW5rIG9mIG1lbW9yeSBpcyB1c2VkIGJ5IExWQ1NfU3RlcmVvRW5oYW5jZXIgYW5kIExWQ1NfUmV2ZXJiR2VuZXJhdG9yLAotICAgICAgICAgICAqIHNlY29uZCBhbmQgZm91cnRoIGFyZSB1c2VkIGFzIGlucHV0IGJ1ZmZlcnMgYnkgcElucHV0IGFuZCBwU3RJbiBpbiBMVkNTX1Byb2Nlc3NfQ1MuCi0gICAgICAgICAgICogSGVuY2UsIHBTdGVyZW9PdXQgaXMgcG9pbnRlZCB0byB1c2UgdW51c2VkIHRoaXJkIHBvcnRpb24gb2Ygc2NyYXRjaCBtZW1vcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgICBwU3RlcmVvT3V0ID0gKExWTV9GTE9BVCAqKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWQ1NfU0NSQVRDSEJVRkZFUlMgLSA0KSAqIE5yRnJhbWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBPdXREYXRhID09IHBJbkRhdGEpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeSBpcyB1c2VkIGluIDQgY2h1bmtzIG9mICgyICogTnJGcmFtZXMpIHNpemUuCisgICAgICAgICAgICAgKiBGaXJzdCBjaHVuayBvZiBtZW1vcnkgaXMgdXNlZCBieSBMVkNTX1N0ZXJlb0VuaGFuY2VyIGFuZCBMVkNTX1JldmVyYkdlbmVyYXRvciwKKyAgICAgICAgICAgICAqIHNlY29uZCBhbmQgZm91cnRoIGFyZSB1c2VkIGFzIGlucHV0IGJ1ZmZlcnMgYnkgcElucHV0IGFuZCBwU3RJbiBpbiBMVkNTX1Byb2Nlc3NfQ1MuCisgICAgICAgICAgICAgKiBIZW5jZSwgcFN0ZXJlb091dCBpcyBwb2ludGVkIHRvIHVzZSB1bnVzZWQgdGhpcmQgcG9ydGlvbiBvZiBzY3JhdGNoIG1lbW9yeS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcFN0ZXJlb091dCA9IChMVk1fRkxPQVQqKXBJbnN0YW5jZS0+cFNjcmF0Y2ggKyAoKExWQ1NfU0NSQVRDSEJVRkZFUlMgLSA0KSAqIE5yRnJhbWVzKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBTdGVyZW9PdXQgPSBwT3V0RGF0YTsKICAgICAgICAgfQogCiAgICAgICAgIC8qCiAgICAgICAgICAqIENhbGwgQ1MgcHJvY2VzcyBmdW5jdGlvbgogICAgICAgICAgKi8KLSAgICAgICAgICAgIGVyciA9IExWQ1NfUHJvY2Vzc19DUyhoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RlcmVvT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsKLSNlbHNlCi0gICAgICAgICAgICBlcnIgPSBMVkNTX1Byb2Nlc3NfQ1MoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0jZW5kaWYKKyAgICAgICAgZXJyID0gTFZDU19Qcm9jZXNzX0NTKGhJbnN0YW5jZSwgcEluRGF0YSwgcFN0ZXJlb091dCwgTnJGcmFtZXMpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIENvbXByZXNzIHRvIHJlZHVjZSBleHBhbnNpb24gZWZmZWN0IG9mIENvbmNlcnQgU291bmQgYW5kIGNvcnJlY3Qgdm9sdW1lCiAgICAgICAgICAqIGRpZmZlcmVuY2VzIGZvciBkaWZmZXJlbmNlIHNldHRpbmdzLiBOb3QgYXBwbGllZCBpbiB0ZXN0IG1vZGVzCiAgICAgICAgICAqLwotICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKSkKLSAgICAgICAgeworICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikpIHsKICAgICAgICAgICAgIExWTV9GTE9BVCBHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47CiAgICAgICAgICAgICBMVk1fRkxPQVQgQ3VycmVudDE7CiAKICAgICAgICAgICAgIEN1cnJlbnQxID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKLSAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4gICogKEN1cnJlbnQxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBGdWxsICogKEN1cnJlbnQxKSkpKTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluICogKEN1cnJlbnQxKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBGdWxsICogKEN1cnJlbnQxKSkpKTsKIAotICAgICAgICAgICAgaWYoTnVtU2FtcGxlcyA8IExWQ1NfQ09NUEdBSU5GUkFNRSkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGVyZW9PdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RlcmVvT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIE5yRnJhbWVzKSk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIE51bVNhbXBsZXMpKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgR2FpblN0ZXA7Ci0gICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBGaW5hbEdhaW47Ci0gICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBTYW1wbGVUb1Byb2Nlc3MgPSBOdW1TYW1wbGVzOwotICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBPdXRQdHI7CisgICAgICAgICAgICBpZiAoTnVtU2FtcGxlcyA8IExWQ1NfQ09NUEdBSU5GUkFNRSkgeworICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGVyZW9PdXQsIHBTdGVyZW9PdXQsIChMVk1fSU5UMzIpKDIgKiBOckZyYW1lcykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgR2FpblN0ZXA7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICBMVk1fSU5UMTYgU2FtcGxlVG9Qcm9jZXNzID0gTnVtU2FtcGxlczsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXRQdHI7CiAKICAgICAgICAgICAgICAgICAvKiBMYXJnZSBjaGFuZ2VzIGluIEdhaW4gY2FuIGNhdXNlIGNsaWNrcyBpbiBvdXRwdXQKICAgICAgICAgICAgICAgICAgICBTcGxpdCBkYXRhIGludG8gc21hbGwgYmxvY2tzIGFuZCB1c2UgaW50ZXJwb2xhdGVkIGdhaW4gdmFsdWVzICovCiAKLSAgICAgICAgICAgICAgICBHYWluU3RlcCA9IChMVk1fRkxPQVQpKCgoR2Fpbi1wSW5zdGFuY2UtPkNvbXByZXNzR2FpbikgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NPTVBHQUlORlJBTUUpIC8gTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAoTFZNX0ZMT0FUKSgoKEdhaW4gLSBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbikgKiBMVkNTX0NPTVBHQUlORlJBTUUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwogCi0gICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA8IEdhaW4pKQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA8IEdhaW4pKSB7CiAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA+IEdhaW4pKQotICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPiBHYWluKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEZpbmFsR2FpbiA9IEdhaW47CiAgICAgICAgICAgICAgICAgR2FpbiA9IHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluOwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgICAgICBwT3V0UHRyID0gcFN0ZXJlb091dDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgcE91dFB0ciA9IHBPdXREYXRhOwotI2VuZGlmCiAKLSAgICAgICAgICAgICAgICB3aGlsZShTYW1wbGVUb1Byb2Nlc3MgPiAwKQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoU2FtcGxlVG9Qcm9jZXNzID4gMCkgewogICAgICAgICAgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkoR2FpbiArIEdhaW5TdGVwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID4gMCkgJiYgKEZpbmFsR2FpbiA8PSBHYWluKSkKLSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKEdhaW5TdGVwID4gMCkgJiYgKEZpbmFsR2FpbiA8PSBHYWluKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA8IDApICYmIChGaW5hbEdhaW4gPiBHYWluKSkKLSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKEdhaW5TdGVwIDwgMCkgJiYgKEZpbmFsR2FpbiA+IEdhaW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOwogICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYoU2FtcGxlVG9Qcm9jZXNzID4gTFZDU19DT01QR0FJTkZSQU1FKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTFZDU19DT01QR0FJTkZSQU1FKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTYW1wbGVUb1Byb2Nlc3MgPiBMVkNTX0NPTVBHQUlORlJBTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwgcE91dFB0ciwgKExWTV9JTlQzMikoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciArPSAoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShTYW1wbGVUb1Byb2Nlc3MgLSBMVkNTX0NPTVBHQUlORlJBTUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIFNhbXBsZVRvUHJvY2VzcykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLCBwT3V0UHRyLCAoTFZNX0lOVDMyKSgyICogU2FtcGxlVG9Qcm9jZXNzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTM3NCw1NyArMjgxLDMzIEBACiAgICAgICAgICAgICBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA9IEdhaW47CiAgICAgICAgIH0KIAotICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKLQorICAgICAgICBpZiAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFJlLWluaXQgYnlwYXNzIG1peCB3aGVuIHRpbWVyIGhhcyBjb21wbGV0ZWQKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID09IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID09IDApKSB7CisgICAgICAgICAgICAgICAgZXJyID0gTFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwgJnBJbnN0YW5jZS0+UGFyYW1zKTsKIAotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTFZDU19TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgIExWTV9UaW1lciAoICZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTFZNX1RpbWVyKCZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIENvcHlfRmxvYXRfU3RlcmVvX01jKHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGVyZW9PdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQotICAgICAgICB7Ci0jaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhwSW5EYXRhLCBwU3RlcmVvT3V0LCBwT3V0RGF0YSwgTnJGcmFtZXMsIGNoYW5uZWxzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShjaGFubmVscyAqIE5yRnJhbWVzKSk7ICAgIC8qIEFsbCBDaGFubmVscyovCi0jZWxzZQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLwotI2VuZGlmCisgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoY2hhbm5lbHMgKiBOckZyYW1lcykpOyAvKiBBbGwgQ2hhbm5lbHMqLwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmNwcAppbmRleCBkMGU2ZTA5Li5mNmQyNDUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmNwcApAQCAtMjAsNyArMjAsNyBAQAogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiTFZDUy5oIgogI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgiCkBAIC01NywzMSArNTcsMzkgQEAKIC8qICAyLiAgVGhlIG51bWVyYXRvciBjb2VmZmljaWVudHMgb2YgdGhlIGZpbHRlciBhcmUgbmVnYXRlZCB0byBjYXVzZSBhbiBpbnZlcnNpb24uICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpCi17CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fVUlOVDE2IERlbGF5OworICAgIExWTV9VSU5UMTYgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QqIHBDb25maWcgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0RhdGFfdCogcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90KiBwQ29lZmZpY2llbnRzOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgQ29lZmZzOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqIHBSZXZlcmJDb2VmVGFibGU7CiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBEZWxheTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247Ci0gICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzOwotICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICBDb2VmZnM7Ci0gICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgKnBSZXZlcmJDb2VmVGFibGU7Ci0KLSAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCAqKSBcCi0gICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCi0gICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgaWYgKHBJbnN0YW5jZS0+cERhdGEgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcEluc3RhbmNlLT5wRGF0YSA9IHBEYXRhID0gKExWQ1NfRGF0YV90KiljYWxsb2MoMSwgc2l6ZW9mKCpwRGF0YSkpOworICAgICAgICBpZiAocERhdGEgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBMVkNTX05VTExBRERSRVNTOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcERhdGEgPSAoTFZDU19EYXRhX3QqKXBJbnN0YW5jZS0+cERhdGE7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBDb2VmZiA9PSBMVk1fTlVMTCkgeworICAgICAgICBwSW5zdGFuY2UtPnBDb2VmZiA9IHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90KiljYWxsb2MoMSwgc2l6ZW9mKCpwQ29lZmZpY2llbnRzKSk7CisgICAgICAgIGlmIChwQ29lZmZpY2llbnRzID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTFZDU19OVUxMQUREUkVTUzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90KilwSW5zdGFuY2UtPnBDb2VmZjsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgogICAgICAqICAtIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZAogICAgICAqICAtIHRoZSBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIKICAgICAgKi8KLSAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUgKSAgICAgIC8qIFNhbXBsZSByYXRlIGNoYW5nZSB0ZXN0ICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgLyogU2FtcGxlIHJhdGUgY2hhbmdlIHRlc3QgKi8KIAogICAgIHsKICAgICAgICAgLyoKQEAgLTg5LDEwICs5NywxMCBAQAogICAgICAgICAgKi8KICAgICAgICAgRGVsYXkgPSAoTFZNX1VJTlQxNilMVkNTX1N0ZXJlb0RlbGF5Q1NbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07CiAKLSAgICAgICAgcENvbmZpZy0+RGVsYXlTaXplICAgICAgPSAoTFZNX0lOVDE2KSgyICogRGVsYXkpOwotICAgICAgICBwQ29uZmlnLT5EZWxheU9mZnNldCAgICA9IDA7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcENvbmZpZy0+U3RlcmVvU2FtcGxlc1swXSwgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgPSAoTFZNX0lOVDE2KSgyICogRGVsYXkpOworICAgICAgICBwQ29uZmlnLT5EZWxheU9mZnNldCA9IDA7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBDb25maWctPlN0ZXJlb1NhbXBsZXMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKICAgICAgICAgLyoKQEAgLTEwOCwyMyArMTE2LDIxIEBACiAgICAgICAgIENvZWZmcy5CMSA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMTsKICAgICAgICAgQ29lZmZzLkIyID0gKExWTV9GTE9BVCktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIyOwogCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLCAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLCAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CiAKICAgICAgICAgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywgJkNvZWZmcyk7CiAKICAgICAgICAgLyogQ2FsbGJhY2tzICovCi0gICAgICAgIHN3aXRjaChwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpCi0gICAgICAgIHsKKyAgICAgICAgc3dpdGNoIChwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpIHsKICAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayA9IEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrID0gQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTMyLDE2ICsxMzgsMTUgQEAKICAgICAgICAgICogU2V0dXAgdGhlIG1peGVyCiAgICAgICAgICAqLwogICAgICAgICBwQ29uZmlnLT5Qcm9jR2FpbiA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOUFJPQyk7Ci0gICAgICAgIHBDb25maWctPlVucHJvY0dhaW4gID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOworICAgICAgICBwQ29uZmlnLT5VbnByb2NHYWluID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOwogICAgIH0KIAotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyICAgUmV2ZXJiUGVyY2VudGFnZSA9IDgzODg2OyAgICAgIC8vIDEgUGVyY2VudCBSZXZlcmIgaS5lIDEvMTAwIGluIFEgMjMgZm9ybWF0CisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKSB7CisgICAgICAgIExWTV9JTlQzMiBSZXZlcmJQZXJjZW50YWdlID0gODM4ODY7ICAgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAogICAgICAgICBSZXZlcmJQZXJjZW50YWdlICo9IHBQYXJhbXMtPlJldmVyYkxldmVsOyAgLy8gQWN0dWFsIFJldmVyYiBMZXZlbCBpbiBRIDIzIGZvcm1hdAotICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCA9ICgoTFZNX0ZMT0FUKShSZXZlcmJQZXJjZW50YWdlPj44KSkgLyAzMjc2Ny4wZjsKKyAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWwgPSAoKExWTV9GTE9BVCkoUmV2ZXJiUGVyY2VudGFnZSA+PiA4KSkgLyAzMjc2Ny4wZjsKICAgICB9Ci0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODEsNDYgKzE4NiwzNyBAQAogLyogIDIuICBUaGUgR2FpbiBpcyBjb21iaW5lZCB3aXRoIHRoZSBMUEYgYW5kIGluY29ycG9yYXRlZCBpbiB0byB0aGUgY29lZmZpY2llbnRzICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90KiBwQ29uZmlnID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19Db2VmZmljaWVudF90KiBwQ29lZmZpY2llbnRzOworICAgIExWTV9GTE9BVCogcFNjcmF0Y2g7CiAKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKVwKLSAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwotCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKVwKLSAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCopcEluc3RhbmNlLT5wQ29lZmY7CisgICAgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKilwSW5zdGFuY2UtPnBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgaW4gb3V0cGxhY2UgcHJvY2Vzc2luZwogICAgICAqLwotICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQotICAgIHsKKyAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkgewogICAgICAgICAvKgogICAgICAgICAgKiBSZXZlcmIgbm90IHJlcXVpcmVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQogICAgICAgICAgKi8KLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwSW5EYXRhLCAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICovCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgcmV2ZXJiIGlzIHJlcXVpcmVkCiAgICAgICovCiAgICAgLyogRGlzYWJsZSB3aGVuIENTNE1TIGluIHN0ZXJlbyBtb2RlICovCi0gICAgaWYgKCgoKExWQ1NfT3V0cHV0RGV2aWNlX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfSEVBRFBIT05FKSB8fCBcCisgICAgaWYgKCgoKExWQ1NfT3V0cHV0RGV2aWNlX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfSEVBRFBIT05FKSB8fAogICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfRVhfSEVBRFBIT05FUykgfHwKLSAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gTFZDU19TVEVSRU8pKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KLSAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9MCkpCi0gICAgeworICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBMVkNTX1NURVJFTykpICYmCisgICAgICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KKyAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9IDApKSB7CiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAvKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHNjcmF0Y2ggbWVtb3J5IGFuZCBmaWx0ZXIgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMzAsMzQgKzIyNiwyNiBAQAogICAgICAgICAvKgogICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBzY3JhdGNoIG1lbW9yeQogICAgICAgICAgKi8KLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwSW5EYXRhLCAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwU2NyYXRjaCwgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICovCiAKICAgICAgICAgLyoKICAgICAgICAgICogRmlsdGVyIHRoZSBkYXRhCiAgICAgICAgICAqLwogICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBTY3JhdGNoLCAoTFZNX0ZMT0FUKilwU2NyYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAotICAgICAgICBNdWx0M3NfRmxvYXQoIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKyAgICAgICAgTXVsdDNzX0Zsb2F0KChMVk1fRkxPQVQqKXBTY3JhdGNoLCBwQ29uZmlnLT5SZXZlcmJMZXZlbCwgKExWTV9GTE9BVCopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IHRoZSBkZWxheSBtaXgKICAgICAgICAgICovCi0gICAgICAgIERlbGF5TWl4X0Zsb2F0KChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5EZWxheU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQorICAgICAgICBEZWxheU1peF9GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sIHBDb25maWctPkRlbGF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICZwQ29uZmlnLT5EZWxheU9mZnNldCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKaW5kZXggMWJjNDMzOC4uYjY2NmRhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaApAQCAtMzIsOCArMzIsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgICAgIEhFQURQSE9ORUdBSU5QUk9DICAgICAgICAgICBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTgotI2RlZmluZSAgICAgSEVBRFBIT05FR0FJTlVOUFJPQyAgICAgICAgIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4KKyNkZWZpbmUgSEVBRFBIT05FR0FJTlBST0MgTFZDU19IRUFEUEhPTkVfUFJPQ0dBSU4KKyNkZWZpbmUgSEVBRFBIT05FR0FJTlVOUFJPQyBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDIsMjAgKzQyLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBSZXZlcmJlcmF0aW9uIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0KK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBTdGVyZW8gZGVsYXkgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgRGVsYXlTaXplOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBEZWxheU9mZnNldDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUHJvY0dhaW47Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFVucHJvY0dhaW47Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMiAqIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTF07CisgICAgTFZNX0lOVDE2IERlbGF5U2l6ZTsKKyAgICBMVk1fSU5UMTYgRGVsYXlPZmZzZXQ7CisgICAgTFZNX0lOVDE2IFByb2NHYWluOworICAgIExWTV9JTlQxNiBVbnByb2NHYWluOworICAgIExWTV9GTE9BVCBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTX01BWF9WQUxdOwogICAgIC8qIFJldmVyYiBMZXZlbCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsKKyAgICBMVk1fRkxPQVQgUmV2ZXJiTGV2ZWw7CiAgICAgLyogRmlsdGVyICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisgICAgdm9pZCAoKnBCaXF1YWRDYWxsQmFjaykoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLCBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwogfSBMVkNTX1JldmVyYkdlbmVyYXRvcl90OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjQsMTEgKzYxLDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgKnBQYXJhbXMpOwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dHB1dCwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKTsKIAotI2VuZGlmICAvKiBSRVZFUkJfSCAqLworI2VuZGlmIC8qIFJFVkVSQl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmNwcAppbmRleCA3ZmQ4NDQ0Li5mZmE5YzliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jcHAKQEAgLTQ5LDMxICs0OSwyNCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCi17CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fVUlOVDE2IE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QqIHBDb25maWcgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90KikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKKyAgICBMVkNTX0RhdGFfdCogcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90KiBwQ29lZmZpY2llbnQ7CisgICAgRk9fRkxPQVRfQ29lZnNfdCBDb2VmZnNNaWQ7CisgICAgQlFfRkxPQVRfQ29lZnNfdCBDb2VmZnNTaWRlOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqIHBTRVNpZGVDb2VmczsKIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKLSAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGE7Ci0gICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKLSAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc01pZDsKLSAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc1NpZGU7Ci0gICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcFNFU2lkZUNvZWZzOwotCi0gICAgcERhdGEgICAgID0gKExWQ1NfRGF0YV90ICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgcERhdGEgPSAoTFZDU19EYXRhX3QqKXBJbnN0YW5jZS0+cERhdGE7CisgICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCopcEluc3RhbmNlLT5wQ29lZmY7CiAKICAgICAvKgogICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdXBkYXRlIHRoZSBmaWx0ZXJzCiAgICAgICovCiAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCi0gICAgeworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBiYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUKICAgICAgICAgICovCkBAIC04MSwyNCArNzQsMjIgQEAKICAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKIAogICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCi0gICAgICAgIENvZWZmc01pZC5BMCA9IChMVk1fRkxPQVQpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMDsKLSAgICAgICAgQ29lZmZzTWlkLkExID0gKExWTV9GTE9BVCkgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNNaWQuQTAgPSAoTFZNX0ZMT0FUKUxWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzTWlkLkExID0gKExWTV9GTE9BVClMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTE7CiAgICAgICAgIENvZWZmc01pZC5CMSA9IChMVk1fRkxPQVQpLUxWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5CMTsKIAogICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc01pZCkgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOwogCi0gICAgICAgIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwKKyAgICAgICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLCAmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzTWlkKTsKIAogICAgICAgICAvKiBDYWxsYmFja3MgKi8KLSAgICAgICAgaWYoTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLlNjYWxlID09IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkICA9IEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICBpZiAoTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLlNjYWxlID09IDE1KSB7CisgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkID0gRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CiAgICAgICAgIH0KIAogICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSk7CkBAIC0xMDYsMzkgKzk3LDM1IEBACiAKICAgICAgICAgLyogU2lkZSBmaWx0ZXIgKi8KICAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLwotICAgICAgICBDb2VmZnNTaWRlLkEwID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTA7Ci0gICAgICAgIENvZWZmc1NpZGUuQTEgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMTsKLSAgICAgICAgQ29lZmZzU2lkZS5BMiA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnNTaWRlLkEwID0gKExWTV9GTE9BVClwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzU2lkZS5BMSA9IChMVk1fRkxPQVQpcFNFU2lkZUNvZWZzW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmc1NpZGUuQTIgPSAoTFZNX0ZMT0FUKXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEyOwogICAgICAgICBDb2VmZnNTaWRlLkIxID0gKExWTV9GTE9BVCktcFNFU2lkZUNvZWZzW09mZnNldF0uQjE7CiAgICAgICAgIENvZWZmc1NpZGUuQjIgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMjsKIAogICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CiAgICAgICAgIC8qIENhbGxiYWNrcyAqLwotICAgICAgICBzd2l0Y2gocFNFU2lkZUNvZWZzW09mZnNldF0uU2NhbGUpCi0gICAgICAgIHsKKyAgICAgICAgc3dpdGNoIChwU0VTaWRlQ29lZnNbT2Zmc2V0XS5TY2FsZSkgewogICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAmQ29lZmZzU2lkZSk7CiAKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSA9IEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAmQ29lZmZzU2lkZSk7CiAKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSA9IEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE3OCw4NSArMTY1LDYxIEBACiAvKiAgMS4gIFRoZSBzaWRlIGZpbHRlciBpcyBub3QgdXNlZCBpbiBNb2JpbGUgU3BlYWtlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7Ci0gICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7Ci0KLSAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwotCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCi0gICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCogcENvbmZpZyA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCogcENvZWZmaWNpZW50OworICAgIExWTV9GTE9BVCogcFNjcmF0Y2g7CisgICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCopcEluc3RhbmNlLT5wQ29lZmY7CisgICAgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKilwSW5zdGFuY2UtPnBTY3JhdGNoOwogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIFN0ZXJlbyBFbmhhbmNlciBpcyBlbmFibGVkCiAgICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKQotICAgICAgICB7CisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIENvbnZlcnQgZnJvbSBzdGVyZW8gdG8gbWlkZGxlIGFuZCBzaWRlCiAgICAgICAgICAqLwotICAgICAgICBGcm9tMmlUb01TX0Zsb2F0KHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIEZyb20yaVRvTVNfRmxvYXQocEluRGF0YSwgcFNjcmF0Y2gsIHBTY3JhdGNoICsgTnVtU2FtcGxlcywgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBBcHBseSBmaWx0ZXIgdG8gdGhlIG1pZGRsZSBzaWduYWwKICAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkKLSAgICAgICAgewotICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQpKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11bHQzc19GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcENvbmZpZy0+TWlkR2FpbiwgICAgICAvKiBHYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpIHsKKyAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkKSgKKyAgICAgICAgICAgICAgICAgICAgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwU2NyYXRjaCwgKExWTV9GTE9BVCopcFNjcmF0Y2gsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNdWx0M3NfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKXBDb25maWctPk1pZEdhaW4sIC8qIEdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlciB0aGUgc2lkZSBzaWduYWwgb25seSBpbiBzdGVyZW8gbW9kZSBmb3IgaGVhZHBob25lcwogICAgICAgICAgKiBhbmQgaW4gYWxsIG1vZGVzIGZvciBtb2JpbGUgc3BlYWtlcnMKICAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZDU19TVEVSRU8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSkoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZDU19TVEVSRU8pIHsKKyAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSkoCisgICAgICAgICAgICAgICAgICAgIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLCAoTFZNX0ZMT0FUKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qCiAgICAgICAgICAqIENvbnZlcnQgZnJvbSBtaWRkbGUgYW5kIHNpZGUgdG8gc3RlcmVvCiAgICAgICAgICAqLwotICAgICAgICBNU1RvMmlfU2F0X0Zsb2F0KHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgTnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICBNU1RvMmlfU2F0X0Zsb2F0KHBTY3JhdGNoLCBwU2NyYXRjaCArIE51bVNhbXBsZXMsIHBPdXREYXRhLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCi0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgLyoKICAgICAgICAgICogVGhlIHN0ZXJlbyBlbmhhbmNlciBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICovCi0gICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcEluRGF0YSwgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAqLwogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKaW5kZXggMTJhNTk4Mi4uYzkyZjhhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKQEAgLTI0LDggKzI0LDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiRmlsdGVycy5oIiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkxWQ1NfSGVhZHBob25lX0NvZWZmcy5oIiAgICAgICAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiRmlsdGVycy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfSGVhZHBob25lX0NvZWZmcy5oIiAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCiAjaW5jbHVkZSAiQklRVUFELmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNSwyMSArMzUsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFN0ZXJlbyBlbmhhbmNlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0KK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKgogICAgICAqIE1pZGRsZSBmaWx0ZXIKICAgICAgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19NaWQpKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisgICAgdm9pZCAoKnBCaXF1YWRDYWxsQmFja19NaWQpKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKIAogICAgIC8qCiAgICAgICogU2lkZSBmaWx0ZXIKICAgICAgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCisgICAgdm9pZCAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisgICAgTFZNX0ZMT0FUIE1pZEdhaW47IC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KIH0gTFZDU19TdGVyZW9FbmhhbmNlcl90OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTgsMTIgKzU0LDkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcyk7CiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgIC8qIFNURVJFT0VOSEFOQ0VfSCAqLworI2VuZGlmIC8qIFNURVJFT0VOSEFOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmNwcAppbmRleCBkNzlkYjYxLi41NWI1MjQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmNwcApAQCAtMjMsOSArMjMsOSBAQAogCiAjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCiAjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKLSNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkJJUVVBRC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmlxdWFkIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiICAgICAgICAgICAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiRmlsdGVycy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkJJUVVBRC5oIiAgICAgICAgICAgICAgICAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCIgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1LDE0NCArMzUsNzUgQEAKIAogLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBtaWRkbGUgZmlsdGVyICovCiBjb25zdCBCaXF1YWRBMDFCMUNvZWZzU1BfdCBMVkNTX1NFTWlkQ29lZlRhYmxlW10gPSB7Ci0gICAge0NTX01JRERMRV84MDAwX0EwLCAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfODAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzgwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfODAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8xMTAyNV9BMCwgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzExMDI1X0ExLAotICAgICBDU19NSURETEVfMTEwMjVfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTEwMjVfU0NBTEV9LAotICAgIHtDU19NSURETEVfMTIwMDBfQTAsICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8xMjAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzEyMDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzEyMDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzE2MDAwX0EwLCAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMTYwMDBfQTEsCi0gICAgIENTX01JRERMRV8xNjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xNjAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8yMjA1MF9BMCwgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzIyMDUwX0ExLAotICAgICBDU19NSURETEVfMjIwNTBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMjIwNTBfU0NBTEV9LAotICAgIHtDU19NSURETEVfMjQwMDBfQTAsICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8yNDAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzI0MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzI0MDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzMyMDAwX0EwLCAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMzIwMDBfQTEsCi0gICAgIENTX01JRERMRV8zMjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8zMjAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV80NDEwMF9BMCwgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzQ0MTAwX0ExLAotICAgICBDU19NSURETEVfNDQxMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDQxMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfNDgwMDBfQTAsICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV80ODAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzQ4MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfQotICAgICwKLSAgICB7Q1NfTUlERExFXzg4MjAwX0EwLCAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfODgyMDBfQTEsCi0gICAgIENTX01JRERMRV84ODIwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYpQ1NfTUlERExFXzg4MjAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfOTYwMDBfQTEsCi0gICAgIENTX01JRERMRV85NjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8xNzY0MDBfQTAsICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMTc2NDAwX0ExLAotICAgICBDU19NSURETEVfMTc2NDAwX0IxLAotICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfMTc2NDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8xOTIwMDBfQTEsCi0gICAgIENTX01JRERMRV8xOTIwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTkyMDAwX1NDQUxFfQotICAgIH07CisgICAgICAgIHtDU19NSURETEVfODAwMF9BMCwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfODAwMF9BMSwgQ1NfTUlERExFXzgwMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV84MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV8xMTAyNV9BMCwgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzExMDI1X0ExLCBDU19NSURETEVfMTEwMjVfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV8xMTAyNV9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMTIwMDBfQTAsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV8xMjAwMF9BMSwgQ1NfTUlERExFXzEyMDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfMTIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzE2MDAwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfMTYwMDBfQTEsIENTX01JRERMRV8xNjAwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzE2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV8yMjA1MF9BMCwgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzIyMDUwX0ExLCBDU19NSURETEVfMjIwNTBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV8yMjA1MF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMjQwMDBfQTAsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV8yNDAwMF9BMSwgQ1NfTUlERExFXzI0MDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfMjQwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzMyMDAwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfMzIwMDBfQTEsIENTX01JRERMRV8zMjAwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzMyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV80NDEwMF9BMCwgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzQ0MTAwX0ExLCBDU19NSURETEVfNDQxMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV80NDEwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfNDgwMDBfQTAsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV80ODAwMF9BMSwgQ1NfTUlERExFXzQ4MDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfNDgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzg4MjAwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfODgyMDBfQTEsIENTX01JRERMRV84ODIwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzg4MjAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV85NjAwMF9BMCwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzk2MDAwX0ExLCBDU19NSURETEVfOTYwMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMTc2NDAwX0EwLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzE3NjQwMF9BMSwgQ1NfTUlERExFXzE3NjQwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzE3NjQwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwgQ1NfTUlERExFXzE5MjAwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzE5MjAwMF9TQ0FMRX19OwogCiAvKiBDb2VmZmljaWVudCB0YWJsZSBmb3IgdGhlIHNpZGUgZmlsdGVyICovCiBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfU0VTaWRlQ29lZlRhYmxlW10gPSB7Ci0gICAgLyogSGVhZHBob25lIFNpZGUgY29lZmZpY2llbnRzICovCi0gICAge0NTX1NJREVfODAwMF9BMCwgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzgwMDBfQTEsCi0gICAgIENTX1NJREVfODAwMF9BMiwKLSAgICAgQ1NfU0lERV84MDAwX0IxLAotICAgICBDU19TSURFXzgwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzgwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzExMDI1X0EwLCAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMTEwMjVfQTEsCi0gICAgIENTX1NJREVfMTEwMjVfQTIsCi0gICAgIENTX1NJREVfMTEwMjVfQjEsCi0gICAgIENTX1NJREVfMTEwMjVfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzExMDI1X1NDQUxFfSwKLSAgICB7Q1NfU0lERV8xMjAwMF9BMCwgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzEyMDAwX0ExLAotICAgICBDU19TSURFXzEyMDAwX0EyLAotICAgICBDU19TSURFXzEyMDAwX0IxLAotICAgICBDU19TSURFXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xMjAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMTYwMDBfQTAsICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8xNjAwMF9BMSwKLSAgICAgQ1NfU0lERV8xNjAwMF9BMiwKLSAgICAgQ1NfU0lERV8xNjAwMF9CMSwKLSAgICAgQ1NfU0lERV8xNjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTYwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzIyMDUwX0EwLCAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMjIwNTBfQTEsCi0gICAgIENTX1NJREVfMjIwNTBfQTIsCi0gICAgIENTX1NJREVfMjIwNTBfQjEsCi0gICAgIENTX1NJREVfMjIwNTBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzIyMDUwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV8yNDAwMF9BMCwgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzI0MDAwX0ExLAotICAgICBDU19TSURFXzI0MDAwX0EyLAotICAgICBDU19TSURFXzI0MDAwX0IxLAotICAgICBDU19TSURFXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8yNDAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMzIwMDBfQTAsICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8zMjAwMF9BMSwKLSAgICAgQ1NfU0lERV8zMjAwMF9BMiwKLSAgICAgQ1NfU0lERV8zMjAwMF9CMSwKLSAgICAgQ1NfU0lERV8zMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMzIwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzQ0MTAwX0EwLCAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfNDQxMDBfQTEsCi0gICAgIENTX1NJREVfNDQxMDBfQTIsCi0gICAgIENTX1NJREVfNDQxMDBfQjEsCi0gICAgIENTX1NJREVfNDQxMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ0MTAwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV80ODAwMF9BMCwgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzQ4MDAwX0ExLAotICAgICBDU19TSURFXzQ4MDAwX0EyLAotICAgICBDU19TSURFXzQ4MDAwX0IxLAotICAgICBDU19TSURFXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KLSAgICAgLAotICAgIHtDU19TSURFXzg4MjAwX0EwLCAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfODgyMDBfQTEsCi0gICAgIENTX1NJREVfODgyMDBfQTIsCi0gICAgIENTX1NJREVfODgyMDBfQjEsCi0gICAgIENTX1NJREVfODgyMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTX1NJREVfODgyMDBfU0NBTEV9LAotICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzk2MDAwX0ExLAotICAgICBDU19TSURFXzk2MDAwX0EyLAotICAgICBDU19TSURFXzk2MDAwX0IxLAotICAgICBDU19TSURFXzk2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMTc2NDAwX0EwLCAgICAgICAgICAvKjE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMTc2NDAwX0ExLAotICAgICBDU19TSURFXzE3NjQwMF9BMiwKLSAgICAgQ1NfU0lERV8xNzY0MDBfQjEsCi0gICAgIENTX1NJREVfMTc2NDAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE3NjQwMF9TQ0FMRX0sCi0gICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCi0gICAgIENTX1NJREVfMTkyMDAwX0EyLAotICAgICBDU19TSURFXzE5MjAwMF9CMSwKLSAgICAgQ1NfU0lERV8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzE5MjAwMF9TQ0FMRX0KLX07CisgICAgICAgIC8qIEhlYWRwaG9uZSBTaWRlIGNvZWZmaWNpZW50cyAqLworICAgICAgICB7Q1NfU0lERV84MDAwX0EwLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfODAwMF9BMSwgQ1NfU0lERV84MDAwX0EyLCBDU19TSURFXzgwMDBfQjEsIENTX1NJREVfODAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzExMDI1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzExMDI1X0ExLCBDU19TSURFXzExMDI1X0EyLCBDU19TSURFXzExMDI1X0IxLCBDU19TSURFXzExMDI1X0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xMTAyNV9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzEyMDAwX0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzEyMDAwX0ExLCBDU19TSURFXzEyMDAwX0EyLCBDU19TSURFXzEyMDAwX0IxLCBDU19TSURFXzEyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzE2MDAwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzE2MDAwX0ExLCBDU19TSURFXzE2MDAwX0EyLCBDU19TSURFXzE2MDAwX0IxLCBDU19TSURFXzE2MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xNjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzIyMDUwX0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzIyMDUwX0ExLCBDU19TSURFXzIyMDUwX0EyLCBDU19TSURFXzIyMDUwX0IxLCBDU19TSURFXzIyMDUwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8yMjA1MF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzI0MDAwX0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzI0MDAwX0ExLCBDU19TSURFXzI0MDAwX0EyLCBDU19TSURFXzI0MDAwX0IxLCBDU19TSURFXzI0MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8yNDAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzMyMDAwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzMyMDAwX0ExLCBDU19TSURFXzMyMDAwX0EyLCBDU19TSURFXzMyMDAwX0IxLCBDU19TSURFXzMyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8zMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzQ0MTAwX0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzQ0MTAwX0ExLCBDU19TSURFXzQ0MTAwX0EyLCBDU19TSURFXzQ0MTAwX0IxLCBDU19TSURFXzQ0MTAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV80NDEwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzQ4MDAwX0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzQ4MDAwX0ExLCBDU19TSURFXzQ4MDAwX0EyLCBDU19TSURFXzQ4MDAwX0IxLCBDU19TSURFXzQ4MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV80ODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzg4MjAwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzg4MjAwX0ExLCBDU19TSURFXzg4MjAwX0EyLCBDU19TSURFXzg4MjAwX0IxLCBDU19TSURFXzg4MjAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV84ODIwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzk2MDAwX0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzk2MDAwX0ExLCBDU19TSURFXzk2MDAwX0EyLCBDU19TSURFXzk2MDAwX0IxLCBDU19TSURFXzk2MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzE3NjQwMF9BMCwgLyoxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfU0lERV8xNzY0MDBfQTEsIENTX1NJREVfMTc2NDAwX0EyLCBDU19TSURFXzE3NjQwMF9CMSwgQ1NfU0lERV8xNzY0MDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE3NjQwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfMTkyMDAwX0ExLCBDU19TSURFXzE5MjAwMF9BMiwgQ1NfU0lERV8xOTIwMDBfQjEsIENTX1NJREVfMTkyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xOTIwMDBfU0NBTEV9fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODEsMTY3ICsxMTIsODcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19FcXVhbGlzZXJDb2VmVGFibGVbXSA9IHsKLSAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCi0gICAge0NTX0VRVUFMSVNFUl84MDAwX0EwLCAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfODAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl84MDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl84MDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzExMDI1X0EwLCAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMTEwMjVfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0IxLAotICAgICBDU19FUVVBTElTRVJfMTEwMjVfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTEwMjVfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMTIwMDBfQTAsICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8xMjAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfMTIwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8xMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8xNjAwMF9BMCwgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMTYwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8xNjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzE2MDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzIyMDUwX0EwLCAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMjIwNTBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0IxLAotICAgICBDU19FUVVBTElTRVJfMjIwNTBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMjIwNTBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMjQwMDBfQTAsICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8yNDAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfMjQwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8yNDAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8zMjAwMF9BMCwgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMzIwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8zMjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzQ0MTAwX0EwLCAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfNDQxMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IxLAotICAgICBDU19FUVVBTElTRVJfNDQxMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfNDQxMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfNDgwMDBfQTAsICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl80ODAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl84ODIwMF9BMCwgICAgIC8qIDg4a1MvcyBjb2VmZmllaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0ExLAotICAgICBDU19FUVVBTElTRVJfODgyMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl84ODIwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU19FUVVBTElTRVJfODgyMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfOTYwMDBfQTAsICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8xNzY0MDBfQTAsICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU19FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFfSwKKyAgICAgICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworICAgICAgICB7Q1NfRVFVQUxJU0VSXzgwMDBfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQTEsIENTX0VRVUFMSVNFUl84MDAwX0EyLCBDU19FUVVBTElTRVJfODAwMF9CMSwgQ1NfRVFVQUxJU0VSXzgwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19FUVVBTElTRVJfODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTEwMjVfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMSwgQ1NfRVFVQUxJU0VSXzExMDI1X0EyLCBDU19FUVVBTElTRVJfMTEwMjVfQjEsIENTX0VRVUFMSVNFUl8xMTAyNV9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTIwMDBfQTAsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8xMjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyLCBDU19FUVVBTElTRVJfMTIwMDBfQjEsIENTX0VRVUFMSVNFUl8xMjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTYwMDBfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8xNjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzE2MDAwX0EyLCBDU19FUVVBTElTRVJfMTYwMDBfQjEsIENTX0VRVUFMSVNFUl8xNjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMjIwNTBfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMSwgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyLCBDU19FUVVBTElTRVJfMjIwNTBfQjEsIENTX0VRVUFMSVNFUl8yMjA1MF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMjQwMDBfQTAsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8yNDAwMF9BMSwgQ1NfRVFVQUxJU0VSXzI0MDAwX0EyLCBDU19FUVVBTElTRVJfMjQwMDBfQjEsIENTX0VRVUFMSVNFUl8yNDAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMzIwMDBfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8zMjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyLCBDU19FUVVBTElTRVJfMzIwMDBfQjEsIENTX0VRVUFMSVNFUl8zMjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfNDQxMDBfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMSwgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyLCBDU19FUVVBTElTRVJfNDQxMDBfQjEsIENTX0VRVUFMSVNFUl80NDEwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfNDgwMDBfQTAsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl80ODAwMF9BMSwgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyLCBDU19FUVVBTElTRVJfNDgwMDBfQjEsIENTX0VRVUFMSVNFUl80ODAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfODgyMDBfQTAsIC8qIDg4a1MvcyBjb2VmZmllaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMSwgQ1NfRVFVQUxJU0VSXzg4MjAwX0EyLCBDU19FUVVBTElTRVJfODgyMDBfQjEsIENTX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfOTYwMDBfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyLCBDU19FUVVBTElTRVJfOTYwMDBfQjEsIENTX0VRVUFMSVNFUl85NjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTc2NDAwX0EwLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMSwgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiwgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIsIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAorICAgICAgICB7Q1NfRVFVQUxJU0VSXzE5MjAwMF9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEsIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIsIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEsCisgICAgICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0IyLCAoTFZNX1VJTlQxNilDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFfSwKIAotICAgIC8qIENvbmNlcnQgU291bmQgRVggSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLwotICAgIHtDU0VYX0VRVUFMSVNFUl84MDAwX0EwLCAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCwgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCwgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCwgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCwgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl80NDEwMF9BMCwgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCwgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEV9Ci0gICAgLAotICAgIHtDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCwgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzk2MDAwX0EwLCAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCwgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCi0gICAgIHtDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFfQotfTsKKyAgICAgICAgLyogQ29uY2VydCBTb3VuZCBFWCBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisgICAgICAgIHtDU0VYX0VRVUFMSVNFUl84MDAwX0EwLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEsIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0IyLCAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl84MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzExMDI1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSwgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIsIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzExMDI1X1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzEyMDAwX0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzE2MDAwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzIyMDUwX0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSwgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTIsIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzIyMDUwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzI0MDAwX0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzMyMDAwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSwgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIsIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzg4MjAwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSwgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIsIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzk2MDAwX0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyLCBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCisgICAgICAgIHtDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyLCAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNTAsMjAgKzIwMSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogU3RlcmVvIGRlbGF5IHRhYmxlIGZvciBDb25jZXJ0IFNvdW5kICovCi1jb25zdCBMVk1fVUlOVDE2ICAgIExWQ1NfU3RlcmVvRGVsYXlDU1tdID0gewotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfOEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18xNktIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haLAorY29uc3QgTFZNX1VJTlQxNiBMVkNTX1N0ZXJlb0RlbGF5Q1NbXSA9IHsKKyAgICAgICAgTFZDU19TVEVSRU9ERUxBWV9DU184S0haLCAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFosIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFosCisgICAgICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFosICBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haLCBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haLAorICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haLCAgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiwgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiwKKyAgICAgICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwgIExWQ1NfU1RFUkVPREVMQVlfQ1NfOTZLSFosIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAorICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNzMsODcgKzIxNiw0NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1JldmVyYkNvZWZUYWJsZVtdID0gewotICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KLSAgICB7Q1NfUkVWRVJCXzgwMDBfQTAsICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfODAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzgwMDBfQTIsCi0gICAgIENTX1JFVkVSQl84MDAwX0IxLAotICAgICBDU19SRVZFUkJfODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl84MDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzExMDI1X0EwLCAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzExMDI1X0ExLAotICAgICBDU19SRVZFUkJfMTEwMjVfQTIsCi0gICAgIENTX1JFVkVSQl8xMTAyNV9CMSwKLSAgICAgQ1NfUkVWRVJCXzExMDI1X0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzExMDI1X1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzEyMDAwX0EwLCAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzEyMDAwX0ExLAotICAgICBDU19SRVZFUkJfMTIwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8xMjAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzEyMDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzE2MDAwX0EwLCAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzE2MDAwX0ExLAotICAgICBDU19SRVZFUkJfMTYwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8xNjAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzE2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzE2MDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzIyMDUwX0EwLCAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzIyMDUwX0ExLAotICAgICBDU19SRVZFUkJfMjIwNTBfQTIsCi0gICAgIENTX1JFVkVSQl8yMjA1MF9CMSwKLSAgICAgQ1NfUkVWRVJCXzIyMDUwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzIyMDUwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzI0MDAwX0EwLCAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzI0MDAwX0ExLAotICAgICBDU19SRVZFUkJfMjQwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8yNDAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzI0MDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzMyMDAwX0EwLCAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzMyMDAwX0ExLAotICAgICBDU19SRVZFUkJfMzIwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8zMjAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzMyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzMyMDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzQ0MTAwX0EwLCAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzQ0MTAwX0ExLAotICAgICBDU19SRVZFUkJfNDQxMDBfQTIsCi0gICAgIENTX1JFVkVSQl80NDEwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzQ0MTAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzQ4MDAwX0EwLCAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzQ4MDAwX0ExLAotICAgICBDU19SRVZFUkJfNDgwMDBfQTIsCi0gICAgIENTX1JFVkVSQl80ODAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFfQotICAgICwKLSAgICB7Q1NfUkVWRVJCXzg4MjAwX0EwLCAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzg4MjAwX0ExLAotICAgICBDU19SRVZFUkJfODgyMDBfQTIsCi0gICAgIENTX1JFVkVSQl84ODIwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzg4MjAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODgyMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfOTYwMDBfQTEsCi0gICAgIENTX1JFVkVSQl85NjAwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzk2MDAwX0IxLAotICAgICBDU19SRVZFUkJfOTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfMTc2NDAwX0EwLCAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8xNzY0MDBfQTEsCi0gICAgIENTX1JFVkVSQl8xNzY0MDBfQTIsCi0gICAgIENTX1JFVkVSQl8xNzY0MDBfQjEsCi0gICAgIENTX1JFVkVSQl8xNzY0MDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xNzY0MDBfU0NBTEV9LAotICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLAotICAgICBDU19SRVZFUkJfMTkyMDAwX0EyLAotICAgICBDU19SRVZFUkJfMTkyMDAwX0IxLAotICAgICBDU19SRVZFUkJfMTkyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRX0KLX07CisgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyAgICAgICAge0NTX1JFVkVSQl84MDAwX0EwLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl84MDAwX0ExLCBDU19SRVZFUkJfODAwMF9BMiwgQ1NfUkVWRVJCXzgwMDBfQjEsIENTX1JFVkVSQl84MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzExMDI1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMTEwMjVfQTEsIENTX1JFVkVSQl8xMTAyNV9BMiwgQ1NfUkVWRVJCXzExMDI1X0IxLCBDU19SRVZFUkJfMTEwMjVfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTEwMjVfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzEyMDAwX0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMTIwMDBfQTEsIENTX1JFVkVSQl8xMjAwMF9BMiwgQ1NfUkVWRVJCXzEyMDAwX0IxLCBDU19SRVZFUkJfMTIwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzE2MDAwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMTYwMDBfQTEsIENTX1JFVkVSQl8xNjAwMF9BMiwgQ1NfUkVWRVJCXzE2MDAwX0IxLCBDU19SRVZFUkJfMTYwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTYwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzIyMDUwX0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMjIwNTBfQTEsIENTX1JFVkVSQl8yMjA1MF9BMiwgQ1NfUkVWRVJCXzIyMDUwX0IxLCBDU19SRVZFUkJfMjIwNTBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMjIwNTBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzI0MDAwX0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMjQwMDBfQTEsIENTX1JFVkVSQl8yNDAwMF9BMiwgQ1NfUkVWRVJCXzI0MDAwX0IxLCBDU19SRVZFUkJfMjQwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMjQwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzMyMDAwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMzIwMDBfQTEsIENTX1JFVkVSQl8zMjAwMF9BMiwgQ1NfUkVWRVJCXzMyMDAwX0IxLCBDU19SRVZFUkJfMzIwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMzIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzQ0MTAwX0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfNDQxMDBfQTEsIENTX1JFVkVSQl80NDEwMF9BMiwgQ1NfUkVWRVJCXzQ0MTAwX0IxLCBDU19SRVZFUkJfNDQxMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfNDQxMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzQ4MDAwX0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfNDgwMDBfQTEsIENTX1JFVkVSQl80ODAwMF9BMiwgQ1NfUkVWRVJCXzQ4MDAwX0IxLCBDU19SRVZFUkJfNDgwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfNDgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzg4MjAwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfODgyMDBfQTEsIENTX1JFVkVSQl84ODIwMF9BMiwgQ1NfUkVWRVJCXzg4MjAwX0IxLCBDU19SRVZFUkJfODgyMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODgyMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzk2MDAwX0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfOTYwMDBfQTEsIENTX1JFVkVSQl85NjAwMF9BMiwgQ1NfUkVWRVJCXzk2MDAwX0IxLCBDU19SRVZFUkJfOTYwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzE3NjQwMF9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8xNzY0MDBfQTEsIENTX1JFVkVSQl8xNzY0MDBfQTIsIENTX1JFVkVSQl8xNzY0MDBfQjEsIENTX1JFVkVSQl8xNzY0MDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTc2NDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1JFVkVSQl8xOTIwMDBfQTAsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLCBDU19SRVZFUkJfMTkyMDAwX0EyLCBDU19SRVZFUkJfMTkyMDAwX0IxLCBDU19SRVZFUkJfMTkyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRX19OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ2MSwyMCArMjYzLDE0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY29uc3QgR2Fpbl90IExWQ1NfT3V0cHV0R2FpblRhYmxlW10gPSB7Ci0gICAge0xWQ1NfSEVBRFBIT05FX1NISUZULCAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KLSAgICAgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTLAotICAgICBMVkNTX0hFQURQSE9ORV9HQUlOfSwKLSAgICB7TFZDU19FWF9IRUFEUEhPTkVfU0hJRlQsICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLwotICAgICBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MsCi0gICAgIExWQ1NfRVhfSEVBRFBIT05FX0dBSU59LAotICAgIHtMVkNTX0hFQURQSE9ORV9TSElGVCwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLwotICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsCi0gICAgIExWQ1NfSEVBRFBIT05FX0dBSU59LAotICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgICAgICAvKiBFWCBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLwotICAgICBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MsCi0gICAgIExWQ1NfRVhfSEVBRFBIT05FX0dBSU59Ci19OworY29uc3QgR2Fpbl90IExWQ1NfT3V0cHV0R2FpblRhYmxlW10gPSB7e0xWQ1NfSEVBRFBIT05FX1NISUZULCAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTLCBMVkNTX0hFQURQSE9ORV9HQUlOfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TFZDU19IRUFEUEhPTkVfU0hJRlQsIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTLCBMVkNTX0hFQURQSE9ORV9HQUlOfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MsIExWQ1NfRVhfSEVBRFBIT05FX0dBSU59fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MDEsMjQgKzI5NywxNCBAQAogLyogICAgICAgICAgMTAyNCAgICBpcyAtMTJkQiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHsKLSAgICB7MC40MzMzNjJmLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCi0gICAgIDAuMDAwMDAwZiwKLSAgICAgMS4wMDAwMjRmLAotICAgICAxLjQxMjY0MGZ9LAotICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KLSAgICAgMC4wMDAwMDBmLAotICAgICAxLjAwMDAyNGYsCi0gICAgIDEuNDEyNjQwZn0sCi0gICAgezEuMDAwMDAwZiwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLwotICAgICAwLjAwMDAwMGYsCi0gICAgIDEuMDAwMDI0ZiwKLSAgICAgMS40MTI2NDBmfSwKLSAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIDAuMDAwMDAwZiwKLSAgICAgMS4wMDAwMjRmLAotICAgICAxLjQxMjY0MGZ9Ci19OworY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHt7MC40MzMzNjJmLCAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYsIDEuMDAwMDI0ZiwgMS40MTI2NDBmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuNDMzMzYyZiwgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmLCAxLjAwMDAyNGYsIDEuNDEyNjQwZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLjAwMDAwMGYsIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYsIDEuMDAwMDI0ZiwgMS40MTI2NDBmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuMDAwMDAwZiwgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZiwgMS4wMDAwMjRmLCAxLjQxMjY0MGZ9fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MjYsNTEgKzMxMiwzMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZDU19WT0xfVENfRnM4MDAwICAgICAgMzI1ODAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxMTAyNSAgICAgMzI2MzIgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxMjAwMCAgICAgMzI2NDMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTYxODUzMDMgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxNjAwMCAgICAgMzI2NzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMyMjA1MCAgICAgMzI3MDAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMyNDAwMCAgICAgMzI3MDUgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTgwNzczOTMgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMzMjAwMCAgICAgMzI3MjEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnM4ODIwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk0ODEwNjYgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxNzY0MDAgICAgMzI3NTkgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk3NDA0OTkgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczgwMDAgMzI1ODAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTEwMjUgMzI2MzIgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxMjAwMCAzMjY0MyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE2MDAwIDMyNjc0IC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMjIwNTAgMzI3MDAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMyNDAwMCAzMjcwNSAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczMyMDAwIDMyNzIxIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgMzI3MzQgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAzMjczNyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19Gczg4MjAwIDMyNzUxIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NDgxMDY2ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzOTYwMDAgXAorICAgIDMyNzUxIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NTExNzAzICovIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE3NjQwMCAzMjc1OSAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NzQwNDk5ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTkyMDAwIFwKKyAgICAzMjc2MyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTg3NzkyNSAqLyAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KIAotY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxM10gPSB7TFZDU19WT0xfVENfRnM4MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczg4MjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM5NjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTc2NDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxOTIwMDAKLX07Citjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzEzXSA9IHsKKyAgICAgICAgTFZDU19WT0xfVENfRnM4MDAwLCAgTFZDU19WT0xfVENfRnMxMTAyNSwgTFZDU19WT0xfVENfRnMxMjAwMCwgTFZDU19WT0xfVENfRnMxNjAwMCwKKyAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwgTFZDU19WT0xfVENfRnMyNDAwMCwgTFZDU19WT0xfVENfRnMzMjAwMCwgTFZDU19WT0xfVENfRnM0NDEwMCwKKyAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMCwgTFZDU19WT0xfVENfRnM4ODIwMCwgTFZDU19WT0xfVENfRnM5NjAwMCwgTFZDU19WT0xfVENfRnMxNzY0MDAsCisgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU2FtcGxlIHJhdGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVsxM10gPSB7ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCi19OworY29uc3QgTFZNX0lOVDMyIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzEzXSA9IHs4MDAwLCAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsICAyNDAwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmgKaW5kZXggNTQ5MDY5OS4uNzY2ZjVmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaApAQCAtMjQsNyArMjQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJCSVFVQUQuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpcXVhZCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkJJUVVBRC5oIiAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDYsMzUgKzEwNiwzNCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWV4dGVybiBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgTFZDU19TYW1wbGVSYXRlVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMzIgTFZDU19TYW1wbGVSYXRlVGFibGVbXTsKIAogLypTcGVha2VyIGNvZWZmaWVudCB0YWJsZXMqLwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1NFTWlkZGxlR2FpblRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfU0VTaWRlQ29lZlRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfRXF1YWxpc2VyQ29lZlRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfUmV2ZXJiQ29lZlRhYmxlW10gOwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1N0ZXJlb0RlbGF5Q1M0TVNbXTsKLWV4dGVybiBHYWluX3QgICAgICAgICAgICAgICAgICAgTFZDU19NU19TbWFsbF9PdXRwdXRHYWluVGFibGVbXTsKLWV4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICAgTFZDU19NU19TbWFsbF9Wb2xDb3JyZWN0VGFibGVbXTsKLWV4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19TbWFsbF9SZXZlcmJHYWluVGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfU21hbGxfU0VNaWRkbGVHYWluVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfU21hbGxfU0VTaWRlQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX1NtYWxsX0VxdWFsaXNlckNvZWZUYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19TbWFsbF9SZXZlcmJDb2VmVGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfU21hbGxfU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCBMVkNTX01TX1NtYWxsX091dHB1dEdhaW5UYWJsZVtdOworZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfTVNfU21hbGxfVm9sQ29ycmVjdFRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiBMVkNTX01TX1NtYWxsX1JldmVyYkdhaW5UYWJsZVtdOwogCi1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX1NFTWlkZGxlR2FpblRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfTWVkaXVtX1NFU2lkZUNvZWZUYWJsZVtdOwotZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX01lZGl1bV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19NZWRpdW1fUmV2ZXJiQ29lZlRhYmxlW10gOwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX01lZGl1bV9TdGVyZW9EZWxheUNTNE1TW107Ci1leHRlcm4gR2Fpbl90ICAgICAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX091dHB1dEdhaW5UYWJsZVtdOwotZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX01lZGl1bV9Wb2xDb3JyZWN0VGFibGVbXTsKLWV4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19NZWRpdW1fUmV2ZXJiR2FpblRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiBMVkNTX01TX01lZGl1bV9TRU1pZGRsZUdhaW5UYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19NZWRpdW1fU0VTaWRlQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX01lZGl1bV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfTWVkaXVtX1JldmVyYkNvZWZUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19NZWRpdW1fU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCBMVkNTX01TX01lZGl1bV9PdXRwdXRHYWluVGFibGVbXTsKK2V4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCBMVkNTX01TX01lZGl1bV9Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfTWVkaXVtX1JldmVyYkdhaW5UYWJsZVtdOwogCi1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfU0VNaWRkbGVHYWluVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9TRVNpZGVDb2VmVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9SZXZlcmJDb2VmVGFibGVbXSA7Ci1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfU3RlcmVvRGVsYXlDUzRNU1tdOwotZXh0ZXJuIEdhaW5fdCAgICAgICAgICAgICAgICAgICBMVkNTX01TX0xhcmdlX091dHB1dEdhaW5UYWJsZVtdOwotZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX0xhcmdlX1ZvbENvcnJlY3RUYWJsZVtdOwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX0xhcmdlX1JldmVyYkdhaW5UYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19MYXJnZV9TRU1pZGRsZUdhaW5UYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19MYXJnZV9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfTGFyZ2VfRXF1YWxpc2VyQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX0xhcmdlX1JldmVyYkNvZWZUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19MYXJnZV9TdGVyZW9EZWxheUNTNE1TW107CitleHRlcm4gR2Fpbl90IExWQ1NfTVNfTGFyZ2VfT3V0cHV0R2FpblRhYmxlW107CitleHRlcm4gTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19NU19MYXJnZV9Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfTGFyZ2VfUmV2ZXJiR2FpblRhYmxlW107CiAKICNlbmRpZiAvKiBfX0xWQ1NfVEFCTEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA2NzRjMjQ2Li5kMDI2YWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTQ0LDYgKzQ0LDM2IEBACiB9CiAKIGNjX3Rlc3QgeworICAgIG5hbWU6ICJyZXZlcmJfdGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJyZXZlcmJ3cmFwcGVyIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAicmV2ZXJiX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgewogICAgIG5hbWU6ICJzbnIiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2ggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzX3JldmVyYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYzNiMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIHJldmVyYiB0ZXN0CisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9yZXZUZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyByZXZlcmIiCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCisKK0VfVkFMPTEKK2NtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3JldmVyYl90ZXN0L2FybS9yZXZlcmJfdGVzdCAkdGVzdGRpciIKKworZnNfYXJyPSgKKyAgICA4MDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDMyMDAwCisgICAgNDQxMDAKKyAgICA0ODAwMAorICAgIDg4MjAwCisgICAgOTYwMDAKKyAgICAxNzY0MDAKKyAgICAxOTIwMDAKKykKKworZmxhZ3NfYXJyPSgKKyAgICAiLS1NIC0tZmNoIDEiCisgICAgIi0tZmNoIDIiCispCisKKyMgcnVuIHJldmVyYiBhdCBkaWZmZXJlbnQgY29uZmlncywgc2F2aW5nIG9ubHkgdGhlIHN0ZXJlbyBjaGFubmVsCisjIHBhaXIuCitlcnJvcl9jb3VudD0wCit0ZXN0Y2FzZV9jb3VudD0wCitmb3IgY21kIGluICIke2NtZHNbQF19IgorZG8KKyAgICAkY21kCisgICAgZm9yIGZsYWdzIGluICIke2ZsYWdzX2FycltAXX0iCisgICAgZG8KKyAgICAgICAgZm9yIHByZXNldF92YWwgaW4gezAuLjZ9CisgICAgICAgIGRvCisgICAgICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIGZvciBjaE1hc2sgaW4gezAuLjIyfQorICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBMRF9MSUJSQVJZX1BBVEg9L3N5c3RlbS92ZW5kb3IvbGliL3NvdW5kZnggJHRlc3RkaXIvcmV2ZXJiX3Rlc3QgXAorICAgICAgICAgICAgICAgICAgICAgICAgLS1pbnB1dCAkdGVzdGRpci9zaW5lc3dlZXByYXcucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAtLWNoTWFzayAkY2hNYXNrICRmbGFncyAtLWZzICRmcyAtLXByZXNldCAkcHJlc2V0X3ZhbAorCisgICAgICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3I6ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgICAgIGlmIFtbICIkY2hNYXNrIiAtZ3QgMCBdXSAmJiBbWyAkZmxhZ3MgIT0gKiItLWZjaCAyIiogXV0KKyAgICAgICAgICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5nbGUgY2hhbm5lbCBmaWxlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGhpZ2hlciBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIChmaXJzdCBjaGFubmVsKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzBfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdworICAgICAgICAgICAgICAgICAgICBlbGlmIFtbICIkY2hNYXNrIiAtZ3QgMSBdXQorICAgICAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3CisgICAgICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjbXAgcmV0dXJucyBFWElUX0ZBSUxVUkUgb24gbWlzbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3I6ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAoKCsrdGVzdGNhc2VfY291bnQpKQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKKworYWRiIHNoZWxsIHJtIC1yICR0ZXN0ZGlyCitlY2hvICIkdGVzdGNhc2VfY291bnQgdGVzdHMgcGVyZm9ybWVkIgorZWNobyAiJGVycm9yX2NvdW50IGVycm9ycyIKK2V4aXQgJGVycm9yX2NvdW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCmluZGV4IGE0YWNlNmMuLjVjNWY2NDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCkBAIC0zMywxOTggKzMzLDE0OCBAQAogI2RlZmluZSBBTE9HVlYgQUxPR1YKICNlbHNlCiAjZGVmaW5lIEFMT0dWVihhLi4uKSBcCi0gIGRvIHsgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQorICAgIGRvIHsgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKGZhbHNlKQogI2VuZGlmCiAKLSNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCi0gICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgXAotfQorI2RlZmluZSBDSEVDS19BUkcoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiAjY29uZCk7IFwKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAotICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgXAotICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAotICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KKyNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJiYWQgYWxpZ25tZW50IHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgcmV0dXJuZWQgYnkgJXMgaW4gJXNcbiIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIHN0cnVjdCBsdm1Db25maWdQYXJhbXNfdCB7Ci0gIGludCAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxICAgID0gNDQxMDA7Ci0gIGludCAgICAgICAgICAgICAgbnJDaGFubmVscyAgICAgID0gMjsKLSAgaW50ICAgICAgICAgICAgICBjaE1hc2sgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gIGludCAgICAgICAgICAgICAgdmNCYWwgICAgICAgICAgID0gMDsKLSAgaW50ICAgICAgICAgICAgICBmQ2hhbm5lbHMgICAgICAgPSAyOwotICBib29sICAgICAgICAgICAgIG1vbm9Nb2RlICAgICAgICA9IGZhbHNlOwotICBpbnQgICAgICAgICAgICAgIGJhc3NFZmZlY3RMZXZlbCA9IDA7Ci0gIGludCAgICAgICAgICAgICAgZXFQcmVzZXRMZXZlbCAgID0gMDsKLSAgaW50ICAgICAgICAgICAgICBmcmFtZUxlbmd0aCAgICAgPSAyNTY7Ci0gIExWTV9CRV9Nb2RlX2VuICAgYmFzc0VuYWJsZSAgICAgID0gTFZNX0JFX09GRjsKLSAgTFZNX1RFX01vZGVfZW4gICB0cmVibGVFbmFibGUgICAgPSBMVk1fVEVfT0ZGOwotICBMVk1fRVFOQl9Nb2RlX2VuIGVxRW5hYmxlICAgICAgICA9IExWTV9FUU5CX09GRjsKLSAgTFZNX01vZGVfZW4gICAgICBjc0VuYWJsZSAgICAgICAgPSBMVk1fTU9ERV9PRkY7CisgICAgaW50IHNhbXBsaW5nRnJlcSA9IDQ0MTAwOworICAgIGludCBuckNoYW5uZWxzID0gMjsKKyAgICBpbnQgY2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIGludCB2Y0JhbCA9IDA7CisgICAgaW50IGZDaGFubmVscyA9IDI7CisgICAgYm9vbCBtb25vTW9kZSA9IGZhbHNlOworICAgIGludCBiYXNzRWZmZWN0TGV2ZWwgPSAwOworICAgIGludCBlcVByZXNldExldmVsID0gMDsKKyAgICBpbnQgZnJhbWVMZW5ndGggPSAyNTY7CisgICAgTFZNX0JFX01vZGVfZW4gYmFzc0VuYWJsZSA9IExWTV9CRV9PRkY7CisgICAgTFZNX1RFX01vZGVfZW4gdHJlYmxlRW5hYmxlID0gTFZNX1RFX09GRjsKKyAgICBMVk1fRVFOQl9Nb2RlX2VuIGVxRW5hYmxlID0gTFZNX0VRTkJfT0ZGOworICAgIExWTV9Nb2RlX2VuIGNzRW5hYmxlID0gTFZNX01PREVfT0ZGOwogfTsKIAogY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGx2bUNvbmZpZ0NoTWFza1tdID0gewotICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKLSAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKLSAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQsCi0gICAgKDEgPDwgNCkgLSAxLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKLSAgICBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwKLSAgICAoMSA8PCA1KSAtIDEsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwKLSAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKLSAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUsCi0gICAgKDEgPDwgNikgLSAxLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEsCi0gICAgKDEgPDwgNykgLSAxLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKLSAgICAoMSA8PCA4KSAtIDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCwKIH07CiAKLQogdm9pZCBwcmludFVzYWdlKCkgewotICBwcmludGYoIlxuVXNhZ2U6ICIpOwotICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gLWk6PGlucHV0X2ZpbGU+IC1vOjxvdXRfZmlsZT4gW29wdGlvbnNdXG4iKTsKLSAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPGlucHV0ZmlsZT4gIGlzIHRoZSBpbnB1dCBmaWxlIG5hbWUiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIExWTSBlZmZlY3RzIGFyZSBhcHBsaWVkIik7Ci0gIHByaW50ZigiXG4gICAgIDxvdXRwdXRmaWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKLSAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiXG4gICAgIC1oZWxwIChvcikgLWgiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKLSAgcHJpbnRmKCJcbiIpOwotICBwcmludGYoIlxuICAgICAtY2hNYXNrOjxjaGFubmVsX21hc2s+XG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDAgIC0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIpOwotICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDIgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMyAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyIik7Ci0gIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDUgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLIik7Ci0gIHByaW50ZigiXG4gICAgICAgICA2ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOwotICBwcmludGYoIlxuICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOwotICBwcmludGYoIlxuICAgICAgICAgOCAgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA0IGNoOiAoMSA8PCA0KSAtIDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDkgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiIpOwotICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxMSAtIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDUgY2g6ICgxIDw8IDUpIC0gMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxNCAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDE1IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOwotICBwcmludGYoIlxuICAgICAgICAgMTcgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA2IGNoOiAoMSA8PCA2KSAtIDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDE4IC0gQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDIwIC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiIpOwotICBwcmludGYoIlxuICAgICAgICAgMjEgLSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOwotICBwcmludGYoIlxuICAgICAgICAgZGVmYXVsdCAwIik7Ci0gIHByaW50ZigiXG4gICAgIC12Y0JhbDo8TGVmdCBSaWdodCBCYWxhbmNlIGNvbnRyb2wgaW4gZEIgWy05NiB0byA5NiBkQl0+Iik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgICAtdmUgdmFsdWVzIHJlZHVjZSBSaWdodCBjaGFubmVsIHdoaWxlICt2ZSB2YWx1ZSByZWR1Y2VzIExlZnQgY2hhbm5lbCIpOwotICBwcmludGYoIlxuICAgICAgICAgICAgICAgICBkZWZhdWx0IDAiKTsKLSAgcHJpbnRmKCJcbiAgICAgLWZjaDo8ZmlsZV9jaGFubmVscz4gKDEgdGhyb3VnaCA4KVxuXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLU0iKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgTW9ubyBtb2RlIChmb3JjZSBhbGwgaW5wdXQgYXVkaW8gY2hhbm5lbHMgdG8gYmUgaWRlbnRpY2FsKSIpOwotICBwcmludGYoIlxuICAgICAtYmFzc2x2bDo8ZWZmZWN0X2xldmVsPiIpOwotICBwcmludGYoIlxuICAgICAgICAgICBBIHZhbHVlIHRoYXQgcmFuZ2VzIGJldHdlZW4gJWQgLSAlZCBkZWZhdWx0IDAiLCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMLAotICAgIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiXG4gICAgIC1lcVByZXNldDo8cHJlc2V0IFZhbHVlPiIpOwotICBjb25zdCBzaXplX3QgbnVtUHJlc2V0THZscyAgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVByZXNldEx2bHM7ICsraSkgewotICAgIHByaW50ZigiXG4gICAgICAgICAgICV6dSAtICVzIiwgaSwgZ0VxdWFsaXplclByZXNldHNbaV0ubmFtZSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIDAiKTsKLSAgcHJpbnRmKCJcbiAgICAgLWJFICIpOwotICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50Iik7Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLXRFICIpOwotICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgVHJlYmxlIEJvb3N0Iik7Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLWNzRSAiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIENvbmNlcnQgU3Vycm91bmQiKTsKLSAgcHJpbnRmKCJcbiIpOwotICBwcmludGYoIlxuICAgICAtZXFFICIpOwotICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgRXF1YWxpemVyIik7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTHZtRWZmZWN0X2ZyZWUoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQdXJwb3NlOiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBCdW5kbGUuCi0vLwotLy8gSW5wdXRzOgotLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAotLy8KLS8vIE91dHB1dHM6Ci0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTHZtRWZmZWN0X2ZyZWUoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0KSB7Ci0gIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gIExWTV9NZW1UYWJfdCBNZW1UYWI7Ci0KLSAgLyogRnJlZSB0aGUgYWxnb3JpdGhtIG1lbW9yeSAqLwotICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotCi0gIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtRWZmZWN0X2ZyZWUiKQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKLSAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApIHsKLSAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gU1RBUlQgZnJlZWluZyAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLQotICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLQotICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIEVORCAgIGZyZWVpbmcgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJcdExWTV9FUlJPUiA6IEx2bUVmZmVjdF9mcmVlIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgIgotICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCi0gICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgIH0KKyAgICBwcmludGYoIlxuVXNhZ2U6ICIpOworICAgIHByaW50ZigiXG4gICAgIDxleGVjdXRhYmxlPiAtaTo8aW5wdXRfZmlsZT4gLW86PG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICAgIHByaW50ZigiXG53aGVyZSwgXG4gICAgIDxpbnB1dGZpbGU+ICBpcyB0aGUgaW5wdXQgZmlsZSBuYW1lIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIExWTSBlZmZlY3RzIGFyZSBhcHBsaWVkIik7CisgICAgcHJpbnRmKCJcbiAgICAgPG91dHB1dGZpbGU+IHByb2Nlc3NlZCBvdXRwdXQgZmlsZSIpOworICAgIHByaW50ZigiXG4gICAgIGFuZCBvcHRpb25zIGFyZSBtZW50aW9uZWQgYmVsb3ciKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWhlbHAgKG9yKSAtaCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIFByaW50cyB0aGlzIHVzYWdlIGluZm9ybWF0aW9uIik7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiXG4gICAgIC1jaE1hc2s6PGNoYW5uZWxfbWFzaz5cbiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNiAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOworICAgIHByaW50ZigiXG4gICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICA5ICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTIgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA1IGNoOiAoMSA8PCA1KSAtIDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxNSAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxOCAtIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDIxIC0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtdmNCYWw6PExlZnQgUmlnaHQgQmFsYW5jZSBjb250cm9sIGluIGRCIFstOTYgdG8gOTYgZEJdPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgICAtdmUgdmFsdWVzIHJlZHVjZSBSaWdodCBjaGFubmVsIHdoaWxlICt2ZSB2YWx1ZSByZWR1Y2VzIExlZnQgY2hhbm5lbCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgIGRlZmF1bHQgMCIpOworICAgIHByaW50ZigiXG4gICAgIC1mY2g6PGZpbGVfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLU0iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBNb25vIG1vZGUgKGZvcmNlIGFsbCBpbnB1dCBhdWRpbyBjaGFubmVscyB0byBiZSBpZGVudGljYWwpIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWJhc3Nsdmw6PGVmZmVjdF9sZXZlbD4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBBIHZhbHVlIHRoYXQgcmFuZ2VzIGJldHdlZW4gJWQgLSAlZCBkZWZhdWx0IDAiLCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMLAorICAgICAgICAgICBMVk1fQkVfTUFYX0VGRkVDVExFVkVMKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWVxUHJlc2V0OjxwcmVzZXQgVmFsdWU+Iik7CisgICAgY29uc3Qgc2l6ZV90IG51bVByZXNldEx2bHMgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJlc2V0THZsczsgKytpKSB7CisgICAgICAgIHByaW50ZigiXG4gICAgICAgICAgICV6dSAtICVzIiwgaSwgZ0VxdWFsaXplclByZXNldHNbaV0ubmFtZSk7CiAgICAgfQotICB9Ci19IC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLworICAgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSAwIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWJFICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQiKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLXRFICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBUcmVibGUgQm9vc3QiKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWNzRSAiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgQ29uY2VydCBTdXJyb3VuZCIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtZXFFICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKK30KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMdm1CdW5kbGVfaW5pdCgpCkBAIC0yMzksNTg2ICsxODksNTEwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBMdm1CdW5kbGVfaW5pdChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIExWTV9Db250cm9sUGFyYW1zX3QgKnBhcmFtcykgewotICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOworaW50IEx2bUJ1bmRsZV9pbml0KHN0cnVjdCBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcGFyYW1zKSB7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgc3RhcnQiKTsKIAotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7Ci0gIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7Ci0gIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAKLSAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7Ci0gICAgQUxPR1YoCi0gICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgotICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKIAotICAgIEx2bUVmZmVjdF9mcmVlKHBDb250ZXh0KTsKLQotICAgIEFMT0dWKAotICAgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKLSAgICAgICAgIi0+IENhbGxlZCBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7Ci0gIH0KLQotICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICBMVk1fSW5zdFBhcmFtc190IEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCi0gIExWTV9FUU5CX0JhbmREZWZfdCBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCi0gIExWTV9IZWFkcm9vbVBhcmFtc190IEhlYWRyb29tUGFyYW1zOyAgICAgICAgIC8qIEhlYWRyb29tIHBhcmFtZXRlcnMgKi8KLSAgTFZNX0hlYWRyb29tQmFuZERlZl90IEhlYWRyb29tQmFuZERlZltMVk1fSEVBRFJPT01fTUFYX05CQU5EU107Ci0gIExWTV9NZW1UYWJfdCBNZW1UYWI7IC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gIGJvb2wgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fRkFMU0U7Ci0KLSAgLyogU2V0IHRoZSBjYXBhYmlsaXRpZXMgKi8KLSAgSW5zdFBhcmFtcy5CdWZmZXJNb2RlID0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTOwotICBJbnN0UGFyYW1zLk1heEJsb2NrU2l6ZSA9IE1BWF9DQUxMX1NJWkU7Ci0gIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyA9IE1BWF9OVU1fQkFORFM7Ci0gIEluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID0gTFZNX1BTQV9PTjsKLQotICAvKiBBbGxvY2F0ZSBtZW1vcnksIGZvcmNpbmcgYWxpZ25tZW50ICovCi0gIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShMVk1fTlVMTCwgJk1lbVRhYiwgJkluc3RQYXJhbXMpOwotCi0gIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtQnVuZGxlX2luaXQiKTsKLSAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgQUxPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRNZW1vcnlUYWJsZVxuIik7Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5ICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKLSAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApIHsKLSAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7Ci0KLSAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICIKLSAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLAotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKLSAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZWQgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICB9CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKICAgICB9Ci0gIH0KIAotICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zCi0gICAqIHRoYXQgd2VyZQotICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCi0gICAqLwotICBpZiAoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7Ci0gICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKLSAgICAgICAgQUxPR0UoCi0gICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCi0gICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwKLSAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICIKLSAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgfQorICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOworCisgICAgLyogU2V0IHRoZSBjYXBhYmlsaXRpZXMgKi8KKyAgICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyA9IE1BWF9OVU1fQkFORFM7CisgICAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOworCisgICAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZJbnN0UGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0SW5zdGFuY2VIYW5kbGUiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgIgorICAgICAgICAgICJMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgICAgcGFyYW1zLT5DaE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKworICAgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgIHBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgICAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT047CisgICAgcGFyYW1zLT5FUU5CX05CYW5kcyA9IEZJVkVCQU5EX05VTUJBTkRTOworICAgIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uUUZhY3RvciA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07CisgICAgICAgIEJhbmREZWZzW2ldLkdhaW4gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CiAgICAgfQotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0gIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CiAKLSAgLyogSW5pdGlhbGlzZSAqLwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBMVk1fTlVMTDsKKyAgICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgICAgcGFyYW1zLT5WQ19CYWxhbmNlID0gMDsKIAotICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwotICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKyAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgICAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CiAKLSAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpOwotICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKIAotICBBTE9HVigKLSAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCi0gICAgICAiTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKyAgICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT047CisgICAgcGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA9IDA7CisgICAgcGFyYW1zLT5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OworICAgIHBhcmFtcy0+QkVfSFBGID0gTFZNX0JFX0hQRl9PTjsKIAotICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCi0gIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKLSAgcGFyYW1zLT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOwotICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87Ci0gIHBhcmFtcy0+Q2hNYXNrICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICBwYXJhbXMtPlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisgICAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOworICAgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKIAotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgIC8qIFRFIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgICAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CiAKLSAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOwotICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7Ci0gIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKLSAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7CiAKLSAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT047Ci0gIHBhcmFtcy0+RVFOQl9OQmFuZHMgPSBGSVZFQkFORF9OVU1CQU5EUzsKLSAgcGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKLSAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKLSAgICBCYW5kRGVmc1tpXS5HYWluID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOwotICB9CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IGNhbGxlZCAiCisgICAgICAgICAgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKLSAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKLSAgcGFyYW1zLT5WQ19CYWxhbmNlID0gMDsKKyAgICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ID0gMjA7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0hpZ2ggPSA0OTk5OworICAgIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgPSA1MDAwOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9IaWdoID0gMjQwMDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkhlYWRyb29tX09mZnNldCA9IDA7CisgICAgSGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9ICZIZWFkcm9vbUJhbmREZWZbMF07CisgICAgSGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IExWTV9IRUFEUk9PTV9PTjsKKyAgICBIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7CiAKLSAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKLSAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisgICAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAotICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOwotICBwYXJhbXMtPlBTQV9QZWFrRGVjYXlSYXRlID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0SGVhZHJvb21QYXJhbXMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09OOwotICBwYXJhbXMtPkJFX0VmZmVjdExldmVsID0gMDsKLSAgcGFyYW1zLT5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OwotICBwYXJhbXMtPkJFX0hQRiA9IExWTV9CRV9IUEZfT047Ci0KLSAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKLSAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IExWTV9QU0FfU1BFRURfTUVESVVNOwotCi0gIC8qIFRFIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOwotICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKLQotICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwotICBMdm1TdGF0dXMgPQotICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKLQotICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7Ci0gIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gIEFMT0dWKAotICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKLSAgICAgICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotCi0gIC8qIFNldCB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyAqLwotICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ID0gMjA7Ci0gIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9IaWdoID0gNDk5OTsKLSAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCA9IDA7Ci0gIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgPSA1MDAwOwotICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfSGlnaCA9IDI0MDAwOwotICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKLSAgSGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9ICZIZWFkcm9vbUJhbmREZWZbMF07Ci0gIEhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047Ci0gIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKLQotICBMdm1TdGF0dXMgPSBMVk1fU2V0SGVhZHJvb21QYXJhbXMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhlYWRyb29tUGFyYW1zKTsKLQotICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldEhlYWRyb29tUGFyYW1zIiwgIkx2bUJ1bmRsZV9pbml0Iik7Ci0gIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gIEFMT0dWKAotICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKLSAgICAgICJMVk1fU2V0SGVhZHJvb21QYXJhbXNcbiIpOwotICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBFbmQiKTsKLSAgcmV0dXJuIDA7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IGNhbGxlZCAiCisgICAgICAgICAgIkxWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CisgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLwogCi1pbnQgbHZtQ3JlYXRlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCi0gICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKLSAgaW50IHJldCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBOVUxMOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gKEJ1bmRsZWRFZmZlY3RDb250ZXh0ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHQpKTsKLSAgaWYgKE5VTEwgPT0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCkgewotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0KLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fRkFMU0U7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID0gTFZNX1RSVUU7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7Ci0KLSAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlCi0gICAqIHNldCB0byB0aGUgZ2V0Ci0gICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbAotICAgKiBhdm9pZAotICAgKiBxdWFudGlzYXRpb24gbGlrZSBlZmZlY3Qgd2hlbiByZXR1cm5pbmcKLSAgICovCi0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgPSAwOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9IE5VTEw7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAtMTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOwotICB9Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOwotICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7Ci0gIHJldCA9IEx2bUJ1bmRsZV9pbml0KHBDb250ZXh0LCBwYXJhbXMpOwotCi0gIGlmIChyZXQgPCAwKSB7Ci0gICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogbHZtQ3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IGx2bUNvbnRyb2woc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCi0gICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7Ci0gIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0KLSAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLwotICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047Ci0gIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKLQotICBwYXJhbXMtPkNoTWFzayAgICAgPSBwbHZtQ29uZmlnUGFyYW1zLT5jaE1hc2s7Ci0gIHBhcmFtcy0+TnJDaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7Ci0gIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPT0gMSkgewotICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01PTk87Ci0gIH0gZWxzZSBpZiAocGFyYW1zLT5OckNoYW5uZWxzID09IDIpIHsKLSAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87Ci0gIH0gZWxzZSBpZiAocGFyYW1zLT5OckNoYW5uZWxzID4gMiAmJiBwYXJhbXMtPk5yQ2hhbm5lbHMgPD0gOCkgeyAvLyBGQ0NfMiBGQ0NfOAotICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01VTFRJQ0hBTk5FTDsKLSAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0KLSAgTFZNX0ZzX2VuIHNhbXBsZVJhdGU7Ci0gIHN3aXRjaCAocGx2bUNvbmZpZ1BhcmFtcy0+c2FtcGxpbmdGcmVxKSB7Ci0gICAgY2FzZSA4MDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTEwMjU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyMDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xMjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18yNDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzIwMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzMyMDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODgyMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjAwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE3NjQwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOTIwMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotCi0gIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmNzRW5hYmxlOwotICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7Ci0gIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKLSAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKLQotICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KLSAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcVByZXNldExldmVsOwotICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLwotICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOwotICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOwotICAgIEJhbmREZWZzW2ldLkdhaW4gPQotICAgICAgICBFUU5CXzVCYW5kU29mdFByZXNldHNbKEZJVkVCQU5EX05VTUJBTkRTICogZXFQcmVzZXRMZXZlbCkgKyBpXTsKLSAgfQotICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmVxRW5hYmxlOwotIC8vIENhdXRpb246IHJhdyBwb2ludGVyIHRvIHN0YWNrIGRhdGEsIHN0b3JlZCBpbiBpbnN0YW5jZSBieSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMuCi0gIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07Ci0KLSAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKLSAgcGFyYW1zLT5WQ19CYWxhbmNlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dmNCYWw7Ci0KLSAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dHJlYmxlRW5hYmxlOwotCi0gIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PTjsKLQotICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+YmFzc0VuYWJsZTsKLQotICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwotICBMdm1TdGF0dXMgPQotICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKLQotICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7Ci0gIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gIEx2bVN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7Ci0KLSAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBsdm1FeGVjdXRlKGZsb2F0ICpmbG9hdEluLCBmbG9hdCAqZmxvYXRPdXQsIHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zKSB7Ci0gIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOwotICByZXR1cm4KLSAgICAgIExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICBmbG9hdEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgZmxvYXRPdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUxlbmd0aCwgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwotICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KLX0KLQotaW50IGx2bU1haW5Qcm9jZXNzKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgKnBQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgKnBsdm1Db25maWdQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgRklMRSAqZmlucCwKLSAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7Ci0gIGludCBlcnJDb2RlID0gbHZtQ29udHJvbChwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcywgcFBhcmFtcyk7Ci0gIGlmIChlcnJDb2RlKSB7Ci0gICAgQUxPR0UoIkVycm9yOiBsdm1Db250cm9sIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOwotICAgIHJldHVybiBlcnJDb2RlOwotICB9Ci0KLSAgY29uc3QgaW50IGNoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7Ci0gIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOwotICBjb25zdCBpbnQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsgIC8vIHByb2Nlc3Npbmcgc2l6ZQotICBjb25zdCBpbnQgaW9DaGFubmVsQ291bnQgPSBwbHZtQ29uZmlnUGFyYW1zLT5mQ2hhbm5lbHM7Ci0gIGNvbnN0IGludCBpb0ZyYW1lU2l6ZSA9IGlvQ2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsgLy8gZmlsZSBsb2FkIHNpemUKLSAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOwotICAvKgotICAgKiBNb25vIGlucHV0IHdpbGwgYmUgY29udmVydGVkIHRvIDIgY2hhbm5lbHMgaW50ZXJuYWxseSBpbiB0aGUgcHJvY2VzcyBjYWxsCi0gICAqIGJ5IGNvcHlpbmcgdGhlIHNhbWUgZGF0YSBpbnRvIHRoZSBzZWNvbmQgY2hhbm5lbC4KLSAgICogSGVuY2Ugd2hlbiBjaGFubmVsQ291bnQgaXMgMSwgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGZvcgotICAgKiAyIGNoYW5uZWxzLiBUaGUgbWVtQWxsb2NDaENvdW50IHRha2VzIGNhcmUgb2YgYWxsb2NhdGlvbiBvZiBzdWZmaWNpZW50Ci0gICAqIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBidWZmZXIuCi0gICAqLwotICBjb25zdCBpbnQgbWVtQWxsb2NDaENvdW50ID0gKGNoYW5uZWxDb3VudCA9PSAxID8gMiA6IGNoYW5uZWxDb3VudCk7Ci0KLSAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKLSAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7Ci0gIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKLSAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogbWVtQWxsb2NDaENvdW50KTsKLQotICBpbnQgZnJhbWVDb3VudGVyID0gMDsKLSAgd2hpbGUgKGZyZWFkKGluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmaW5wKSA9PSAoc2l6ZV90KWZyYW1lTGVuZ3RoKSB7Ci0gICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgewotICAgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGlvRnJhbWVTaXplKTsKK2ludCBsdm1DcmVhdGUoc3RydWN0IEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBsdm1Db25maWdQYXJhbXNfdCogcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCogcGFyYW1zKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IE5VTEw7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IChCdW5kbGVkRWZmZWN0Q29udGV4dCopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHQpKTsKKyAgICBpZiAoTlVMTCA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLSAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOwogCi0gICAgLy8gTW9ubyBtb2RlIHdpbGwgcmVwbGljYXRlIHRoZSBmaXJzdCBjaGFubmVsIHRvIGFsbCBvdGhlciBjaGFubmVscy4KLSAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCi0gICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KLSAgICBpZiAocGx2bUNvbmZpZ1BhcmFtcy0+bW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07Ci0gICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgLy8gcmVwbGljYXRlIGNoIDAKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8gPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9UUlVFOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7CisKKyAgICAvKiBTYXZlZCBzdHJlbmd0aCBpcyB1c2VkIHRvIHJldHVybiB0aGUgZXhhY3Qgc3RyZW5ndGggdGhhdCB3YXMgdXNlZCBpbiB0aGUKKyAgICAgKiBzZXQgdG8gdGhlIGdldAorICAgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbAorICAgICAqIGF2b2lkCisgICAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCisgICAgICovCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gTFZNX0ZBTFNFOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAtMTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICAgIH0KKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7CisgICAgcmV0ID0gTHZtQnVuZGxlX2luaXQocENvbnRleHQsIHBhcmFtcyk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBsdm1DcmVhdGUoKSBCdW5kbGUgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsdm1Db250cm9sKHN0cnVjdCBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgbHZtQ29uZmlnUGFyYW1zX3QqIHBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190KiBwYXJhbXMpIHsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICAgIHBhcmFtcy0+Q2hNYXNrID0gcGx2bUNvbmZpZ1BhcmFtcy0+Y2hNYXNrOworICAgIHBhcmFtcy0+TnJDaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgICAgaWYgKHBhcmFtcy0+TnJDaGFubmVscyA9PSAxKSB7CisgICAgICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01PTk87CisgICAgfSBlbHNlIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPT0gMikgeworICAgICAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgICAgfSBlbHNlIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPiAyICYmIHBhcmFtcy0+TnJDaGFubmVscyA8PSA4KSB7ICAvLyBGQ0NfMiBGQ0NfOAorICAgICAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NVUxUSUNIQU5ORUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgTFZNX0ZzX2VuIHNhbXBsZVJhdGU7CisgICAgc3dpdGNoIChwbHZtQ29uZmlnUGFyYW1zLT5zYW1wbGluZ0ZyZXEpIHsKKyAgICAgICAgY2FzZSA4MDAwOgorICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTEwMjU6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzExMDI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTIwMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzEyMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTYwMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjIwNTA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzIyMDUwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjQwMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzI0MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzIwMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzMyMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDQxMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDgwMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODgyMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOTYwMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTc2NDAwOgorICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xNzY0MDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOTIwMDA6CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHBhcmFtcy0+U2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisKKyAgICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmNzRW5hYmxlOworICAgIHBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgICAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFQcmVzZXRMZXZlbDsKKyAgICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107IC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgICAgIEJhbmREZWZzW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07CisgICAgICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5HYWluID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzWyhGSVZFQkFORF9OVU1CQU5EUyAqIGVxUHJlc2V0TGV2ZWwpICsgaV07CisgICAgfQorICAgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFFbmFibGU7CisgICAgLy8gQ2F1dGlvbjogcmF3IHBvaW50ZXIgdG8gc3RhY2sgZGF0YSwgc3RvcmVkIGluIGluc3RhbmNlIGJ5IExWTV9TZXRDb250cm9sUGFyYW1ldGVycy4KKyAgICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgICAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPSAwOworICAgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IHBsdm1Db25maWdQYXJhbXMtPnZjQmFsOworCisgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT50cmVibGVFbmFibGU7CisKKyAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PTjsKKworICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmJhc3NFbmFibGU7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBMdm1TdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOworCisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGx2bUV4ZWN1dGUoZmxvYXQqIGZsb2F0SW4sIGZsb2F0KiBmbG9hdE91dCwgc3RydWN0IEVmZmVjdENvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QqIHBsdm1Db25maWdQYXJhbXMpIHsKKyAgICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSBwbHZtQ29uZmlnUGFyYW1zLT5mcmFtZUxlbmd0aDsKKyAgICByZXR1cm4gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRJbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRPdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lTGVuZ3RoLCAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KK30KKworaW50IGx2bU1haW5Qcm9jZXNzKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zLAorICAgICAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190KiBwbHZtQ29uZmlnUGFyYW1zLCBGSUxFKiBmaW5wLCBGSUxFKiBmb3V0KSB7CisgICAgaW50IGVyckNvZGUgPSBsdm1Db250cm9sKHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCBwUGFyYW1zKTsKKyAgICBpZiAoZXJyQ29kZSkgeworICAgICAgICBBTE9HRSgiRXJyb3I6IGx2bUNvbnRyb2wgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgICAgIHJldHVybiBlcnJDb2RlOworICAgIH0KKworICAgIGNvbnN0IGludCBjaGFubmVsQ291bnQgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOworICAgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOworICAgIGNvbnN0IGludCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOyAgLy8gcHJvY2Vzc2luZyBzaXplCisgICAgY29uc3QgaW50IGlvQ2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZkNoYW5uZWxzOworICAgIGNvbnN0IGludCBpb0ZyYW1lU2l6ZSA9IGlvQ2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsgIC8vIGZpbGUgbG9hZCBzaXplCisgICAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOworICAgIC8qCisgICAgICogTW9ubyBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCB0byAyIGNoYW5uZWxzIGludGVybmFsbHkgaW4gdGhlIHByb2Nlc3MgY2FsbAorICAgICAqIGJ5IGNvcHlpbmcgdGhlIHNhbWUgZGF0YSBpbnRvIHRoZSBzZWNvbmQgY2hhbm5lbC4KKyAgICAgKiBIZW5jZSB3aGVuIGNoYW5uZWxDb3VudCBpcyAxLCBvdXRwdXQgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yCisgICAgICogMiBjaGFubmVscy4gVGhlIG1lbUFsbG9jQ2hDb3VudCB0YWtlcyBjYXJlIG9mIGFsbG9jYXRpb24gb2Ygc3VmZmljaWVudAorICAgICAqIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICovCisgICAgY29uc3QgaW50IG1lbUFsbG9jQ2hDb3VudCA9IChjaGFubmVsQ291bnQgPT0gMSA/IDIgOiBjaGFubmVsQ291bnQpOworCisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRJbihmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogbWVtQWxsb2NDaENvdW50KTsKKworICAgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICAgIHdoaWxlIChmcmVhZChpbi5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZmlucCkgPT0gKHNpemVfdClmcmFtZUxlbmd0aCkgeworICAgICAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0SW4uZGF0YSgpLCBpbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKworICAgICAgICAvLyBNb25vIG1vZGUgd2lsbCByZXBsaWNhdGUgdGhlIGZpcnN0IGNoYW5uZWwgdG8gYWxsIG90aGVyIGNoYW5uZWxzLgorICAgICAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCisgICAgICAgIC8vIEJhc3MgQm9vc3QsIHdoaWNoIGV4dHJhY3RzIGEgbW9ubyBzaWduYWwgZm9yIHByb2Nlc3NpbmcuCisgICAgICAgIGlmIChwbHZtQ29uZmlnUGFyYW1zLT5tb25vTW9kZSAmJiBjaGFubmVsQ291bnQgPiAxKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhdXRvKiBmcCA9ICZmbG9hdEluW2kgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgICAgIHN0ZDo6ZmlsbChmcCArIDEsIGZwICsgY2hhbm5lbENvdW50LCAqZnApOyAgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmbmRlZiBCWVBBU1NfRVhFQworICAgICAgICBlcnJDb2RlID0gbHZtRXhlY3V0ZShmbG9hdEluLmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcyk7CisgICAgICAgIGlmIChlcnJDb2RlKSB7CisgICAgICAgICAgICBwcmludGYoIlxuRXJyb3I6IGx2bUV4ZWN1dGUgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgICAgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKWZyYW1lU2l6ZTsgIC8vIGVsaW1pbmF0ZSB3YXJuaW5nCisjZWxzZQorICAgICAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOworI2VuZGlmCisgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChvdXQuZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgICAgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGNoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgfQorICAgICAgICAodm9pZClmd3JpdGUob3V0LmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmb3V0KTsKKyAgICAgICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOworICAgIH0KKyAgICBwcmludGYoImZyYW1lQ291bnRlcjogWyVkXVxuIiwgZnJhbWVDb3VudGVyKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjID09IDEpIHsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbHZtQ29uZmlnUGFyYW1zX3QgbHZtQ29uZmlnUGFyYW1ze307ICAvLyBkZWZhdWx0IGluaXRpYWxpemUKKyAgICBjb25zdCBjaGFyKiBpbmZpbGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIG91dGZpbGUgPSBudWxscHRyOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICAgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItaToiLCAzKSkgeworICAgICAgICAgICAgaW5maWxlID0gYXJndltpXSArIDM7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1vOiIsIDMpKSB7CisgICAgICAgICAgICBvdXRmaWxlID0gYXJndltpXSArIDM7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsaW5nRnJlcSA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgICAgICAgaWYgKHNhbXBsaW5nRnJlcSAhPSA4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxMTAyNSAmJiBzYW1wbGluZ0ZyZXEgIT0gMTIwMDAgJiYKKyAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTYwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDIyMDUwICYmIHNhbXBsaW5nRnJlcSAhPSAyNDAwMCAmJgorICAgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAzMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gNDQxMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmCisgICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDg4MjAwICYmIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCisgICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkXG4iLCBzYW1wbGluZ0ZyZXEpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5zYW1wbGluZ0ZyZXEgPSBzYW1wbGluZ0ZyZXE7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1jaE1hc2s6IiwgOCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBjaE1hc2tDb25maWdJZHggPSBhdG9pKGFyZ3ZbaV0gKyA4KTsKKyAgICAgICAgICAgIGlmIChjaE1hc2tDb25maWdJZHggPCAwIHx8IChzaXplX3QpY2hNYXNrQ29uZmlnSWR4ID49IHN0ZDo6c2l6ZShsdm1Db25maWdDaE1hc2spKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIENoYW5uZWwgTWFzayA6ICVkXG4iLCBjaE1hc2tDb25maWdJZHgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IGx2bUNvbmZpZ0NoTWFza1tjaE1hc2tDb25maWdJZHhdOworICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmNoTWFzayA9IGNoTWFzazsKKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoTWFzayk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi12Y0JhbDoiLCA3KSkgeworICAgICAgICAgICAgY29uc3QgaW50IHZjQmFsYW5jZSA9IGF0b2koYXJndltpXSArIDcpOworICAgICAgICAgICAgaWYgKHZjQmFsYW5jZSA+IDk2IHx8IHZjQmFsYW5jZSA8IC05NikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCB2b2x1bWUgYmFsYW5jZSB2YWx1ZTogJWRcbiIsIHZjQmFsYW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMudmNCYWwgPSB2Y0JhbGFuY2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgICAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkXG4iLCBmQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHMgPSBmQ2hhbm5lbHM7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLU0iKSkgeworICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLm1vbm9Nb2RlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWJhc3Nsdmw6IiwgOSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBiYXNzRWZmZWN0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyA5KTsKKyAgICAgICAgICAgIGlmIChiYXNzRWZmZWN0TGV2ZWwgPiBMVk1fQkVfTUFYX0VGRkVDVExFVkVMIHx8CisgICAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsIDwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIEJhc3MgRWZmZWN0IExldmVsIDogJWRcbiIsIGJhc3NFZmZlY3RMZXZlbCk7CisgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRWZmZWN0TGV2ZWwgPSBiYXNzRWZmZWN0TGV2ZWw7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1lcVByZXNldDoiLCAxMCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gYXRvaShhcmd2W2ldICsgMTApOworICAgICAgICAgICAgY29uc3QgaW50IG51bVByZXNldEx2bHMgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOworICAgICAgICAgICAgaWYgKGVxUHJlc2V0TGV2ZWwgPj0gbnVtUHJlc2V0THZscyB8fCBlcVByZXNldExldmVsIDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIEVxdWFsaXplciBQcmVzZXQgOiAlZFxuIiwgZXFQcmVzZXRMZXZlbCk7CisgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcVByZXNldExldmVsID0gZXFQcmVzZXRMZXZlbDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYkUiKSkgeworICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFbmFibGUgPSBMVk1fQkVfT047CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWVxRSIpKSB7CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZXFFbmFibGUgPSBMVk1fRVFOQl9PTjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItdEUiKSkgeworICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLnRyZWJsZUVuYWJsZSA9IExWTV9URV9PTjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItY3NFIikpIHsKKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5jc0VuYWJsZSA9IExWTV9NT0RFX09OOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKKyAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQotI2lmbmRlZiBCWVBBU1NfRVhFQwotICAgIGVyckNvZGUgPSBsdm1FeGVjdXRlKGZsb2F0SW4uZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zKTsKLSAgICBpZiAoZXJyQ29kZSkgewotICAgICAgcHJpbnRmKCJcbkVycm9yOiBsdm1FeGVjdXRlIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOwotICAgICAgcmV0dXJuIGVyckNvZGU7Ci0gICAgfQogCi0gICAgKHZvaWQpZnJhbWVTaXplOyAvLyBlbGltaW5hdGUgd2FybmluZwotI2Vsc2UKLSAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOwotI2VuZGlmCi0gICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dC5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOwotICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKLSAgICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGNoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOwotICAgIH0KLSAgICAodm9pZCkgZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZm91dCk7Ci0gICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOwotICB9Ci0gIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOwotICByZXR1cm4gMDsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgewotICBpZiAoYXJnYyA9PSAxKSB7Ci0gICAgcHJpbnRVc2FnZSgpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGx2bUNvbmZpZ1BhcmFtc190IGx2bUNvbmZpZ1BhcmFtc3t9OyAvLyBkZWZhdWx0IGluaXRpYWxpemUKLSAgY29uc3QgY2hhciAqaW5maWxlID0gbnVsbHB0cjsKLSAgY29uc3QgY2hhciAqb3V0ZmlsZSA9IG51bGxwdHI7Ci0KLSAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOwotICAgIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWk6IiwgMykpIHsKLSAgICAgIGluZmlsZSA9IGFyZ3ZbaV0gKyAzOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1vOiIsIDMpKSB7Ci0gICAgICBvdXRmaWxlID0gYXJndltpXSArIDM7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZzOiIsIDQpKSB7Ci0gICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7Ci0gICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmCi0gICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJgotICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKLSAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmCi0gICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJgotICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCi0gICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgewotICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBTYW1wbGluZyBGcmVxdWVuY3kgOiAlZFxuIiwgc2FtcGxpbmdGcmVxKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbHZtQ29uZmlnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IHNhbXBsaW5nRnJlcTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItY2hNYXNrOiIsIDgpKSB7Ci0gICAgICBjb25zdCBpbnQgY2hNYXNrQ29uZmlnSWR4ID0gYXRvaShhcmd2W2ldICsgOCk7Ci0gICAgICBpZiAoY2hNYXNrQ29uZmlnSWR4IDwgMCB8fCAoc2l6ZV90KWNoTWFza0NvbmZpZ0lkeCA+PSBzdGQ6OnNpemUobHZtQ29uZmlnQ2hNYXNrKSkgewotICAgICAgICBBTE9HRSgiXG5FcnJvcjogVW5zdXBwb3J0ZWQgQ2hhbm5lbCBNYXNrIDogJWRcbiIsIGNoTWFza0NvbmZpZ0lkeCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IGx2bUNvbmZpZ0NoTWFza1tjaE1hc2tDb25maWdJZHhdOwotICAgICAgbHZtQ29uZmlnUGFyYW1zLmNoTWFzayA9IGNoTWFzazsKLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoTWFzayk7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXZjQmFsOiIsIDcpKSB7Ci0gICAgICBjb25zdCBpbnQgdmNCYWxhbmNlID0gYXRvaShhcmd2W2ldICsgNyk7Ci0gICAgICBpZiAodmNCYWxhbmNlID4gOTYgfHwgdmNCYWxhbmNlIDwgLTk2KSB7Ci0gICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCB2b2x1bWUgYmFsYW5jZSB2YWx1ZTogJWRcbiIsIHZjQmFsYW5jZSk7Ci0gICAgICB9Ci0gICAgICBsdm1Db25maWdQYXJhbXMudmNCYWwgPSB2Y0JhbGFuY2U7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZjaDoiLCA1KSkgewotICAgICAgY29uc3QgaW50IGZDaGFubmVscyA9IGF0b2koYXJndltpXSArIDUpOwotICAgICAgaWYgKGZDaGFubmVscyA+IDggfHwgZkNoYW5uZWxzIDwgMSkgewotICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBmaWxlIGNoYW5uZWxzIDogJWRcbiIsIGZDaGFubmVscyk7Ci0gICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHMgPSBmQ2hhbm5lbHM7Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sIi1NIikpIHsKLSAgICAgICAgICBsdm1Db25maWdQYXJhbXMubW9ub01vZGUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1iYXNzbHZsOiIsIDkpKSB7Ci0gICAgICBjb25zdCBpbnQgYmFzc0VmZmVjdExldmVsID0gYXRvaShhcmd2W2ldICsgOSk7Ci0gICAgICBpZiAoYmFzc0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCB8fCBiYXNzRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMKSB7Ci0gICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIEJhc3MgRWZmZWN0IExldmVsIDogJWRcbiIsCi0gICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwpOworICAgIGlmIChpbmZpbGUgPT0gbnVsbHB0ciB8fCBvdXRmaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogbWlzc2luZyBpbnB1dC9vdXRwdXQgZmlsZXNcbiIpOwogICAgICAgICBwcmludFVzYWdlKCk7CiAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRWZmZWN0TGV2ZWwgPSBiYXNzRWZmZWN0TGV2ZWw7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWVxUHJlc2V0OiIsIDEwKSkgewotICAgICAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyAxMCk7Ci0gICAgICBjb25zdCBpbnQgbnVtUHJlc2V0THZscyA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7Ci0gICAgICBpZiAoZXFQcmVzZXRMZXZlbCA+PSBudW1QcmVzZXRMdmxzIHx8IGVxUHJlc2V0TGV2ZWwgPCAwKSB7Ci0gICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIEVxdWFsaXplciBQcmVzZXQgOiAlZFxuIiwgZXFQcmVzZXRMZXZlbCk7Ci0gICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxUHJlc2V0TGV2ZWwgPSBlcVByZXNldExldmVsOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWJFIikpIHsKLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRW5hYmxlID0gTFZNX0JFX09OOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWVxRSIpKSB7Ci0gICAgICBsdm1Db25maWdQYXJhbXMuZXFFbmFibGUgPSBMVk1fRVFOQl9PTjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi10RSIpKSB7Ci0gICAgICBsdm1Db25maWdQYXJhbXMudHJlYmxlRW5hYmxlID0gTFZNX1RFX09OOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWNzRSIpKSB7Ci0gICAgICBsdm1Db25maWdQYXJhbXMuY3NFbmFibGUgPSBMVk1fTU9ERV9PTjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKLSAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgIHJldHVybiAwOwogICAgIH0KLSAgfQogCi0gIGlmIChpbmZpbGUgPT0gbnVsbHB0ciB8fCBvdXRmaWxlID09IG51bGxwdHIpIHsKLSAgICBwcmludGYoIkVycm9yOiBtaXNzaW5nIGlucHV0L291dHB1dCBmaWxlc1xuIik7Ci0gICAgcHJpbnRVc2FnZSgpOwotICAgIHJldHVybiAtMTsKLSAgfQorICAgIEZJTEUqIGZpbnAgPSBmb3BlbihpbmZpbGUsICJyYiIpOworICAgIGlmIChmaW5wID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzIiwgaW5maWxlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKLSAgaWYgKGZpbnAgPT0gbnVsbHB0cikgewotICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7Ci0gICAgcmV0dXJuIC0xOwotICB9CisgICAgRklMRSogZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICAgIGlmIChmb3V0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgICAgICBmY2xvc2UoZmlucCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLSAgRklMRSAqZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOwotICBpZiAoZm91dCA9PSBudWxscHRyKSB7Ci0gICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgIEVmZmVjdENvbnRleHQgY29udGV4dDsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IHBhcmFtczsKKyAgICBpbnQgZXJyQ29kZSA9IGx2bUNyZWF0ZSgmY29udGV4dCwgJmx2bUNvbmZpZ1BhcmFtcywgJnBhcmFtcyk7CisgICAgaWYgKGVyckNvZGUgPT0gMCkgeworICAgICAgICBlcnJDb2RlID0gbHZtTWFpblByb2Nlc3MoJmNvbnRleHQsICZwYXJhbXMsICZsdm1Db25maWdQYXJhbXMsIGZpbnAsIGZvdXQpOworICAgICAgICBpZiAoZXJyQ29kZSAhPSAwKSB7CisgICAgICAgICAgICBwcmludGYoIkVycm9yOiBsdm1NYWluUHJvY2VzcyByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKKyAgICB9CiAgICAgZmNsb3NlKGZpbnApOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIEVmZmVjdENvbnRleHQgY29udGV4dDsKLSAgTFZNX0NvbnRyb2xQYXJhbXNfdCBwYXJhbXM7Ci0gIGludCBlcnJDb2RlID0gbHZtQ3JlYXRlKCZjb250ZXh0LCAmbHZtQ29uZmlnUGFyYW1zLCAmcGFyYW1zKTsKLSAgaWYgKGVyckNvZGUgPT0gMCkgewotICAgIGVyckNvZGUgPSBsdm1NYWluUHJvY2VzcygmY29udGV4dCwgJnBhcmFtcywgJmx2bUNvbmZpZ1BhcmFtcywgZmlucCwgZm91dCk7Ci0gICAgaWYgKGVyckNvZGUgIT0gMCkgewotICAgICAgcHJpbnRmKCJFcnJvcjogbHZtTWFpblByb2Nlc3MgcmV0dXJuZWQgd2l0aCB0aGUgZXJyb3I6ICVkIixlcnJDb2RlKTsKKyAgICBmY2xvc2UoZm91dCk7CisgICAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBMVk1fRGVsSW5zdGFuY2VIYW5kbGUoJmNvbnRleHQucEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIGZyZWUoY29udGV4dC5wQnVuZGxlZENvbnRleHQpOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkVycm9yOiBsdm1DcmVhdGUgcmV0dXJuZWQgd2l0aCB0aGUgZXJyb3I6ICVkIiwgZXJyQ29kZSk7Ci0gIH0KLSAgZmNsb3NlKGZpbnApOwotICBmY2xvc2UoZm91dCk7Ci0gIC8qIEZyZWUgdGhlIGFsbG9jYXRlZCBidWZmZXJzICovCi0gIGlmIChjb250ZXh0LnBCdW5kbGVkQ29udGV4dCAhPSBudWxscHRyKSB7Ci0gICAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gbnVsbHB0cikgewotICAgICAgTHZtRWZmZWN0X2ZyZWUoJmNvbnRleHQpOwotICAgIH0KLSAgICBmcmVlKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0KTsKLSAgfQogCi0gIGlmIChlcnJDb2RlKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOworICAgIGlmIChlcnJDb2RlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9yZXZlcmJfdGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9yZXZlcmJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiY2E5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3JldmVyYl90ZXN0LmNwcApAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiRWZmZWN0UmV2ZXJiLmgiCisKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCisvLyBHbG9iYWwgVmFyaWFibGVzCitlbnVtIFJldmVyYlBhcmFtcyB7CisgICAgQVJHX0hFTFAgPSAxLAorICAgIEFSR19JTlBVVCwKKyAgICBBUkdfT1VUUFVULAorICAgIEFSR19GUywKKyAgICBBUkdfQ0hfTUFTSywKKyAgICBBUkdfUFJFU0VULAorICAgIEFSR19BVVgsCisgICAgQVJHX01PTk9fTU9ERSwKKyAgICBBUkdfRklMRV9DSCwKK307CisKK2NvbnN0IGVmZmVjdF91dWlkX3Qga1JldmVyYlV1aWRzW10gPSB7CisgICAgICAgIHsweDE3MmNkZjAwLAorICAgICAgICAgMHhhM2JjLAorICAgICAgICAgMHgxMWRmLAorICAgICAgICAgMHhhNzJmLAorICAgICAgICAgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHByZXNldC1pbnNlcnQgbW9kZQorICAgICAgICB7MHhmMjlhMTQwMCwKKyAgICAgICAgIDB4YTNiYiwKKyAgICAgICAgIDB4MTFkZiwKKyAgICAgICAgIDB4OGRkYywKKyAgICAgICAgIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBwcmVzZXQtYXV4IG1vZGUKK307CisKKy8vIHN0cnVjdHVyZXMKK3N0cnVjdCByZXZlcmJDb25maWdQYXJhbXNfdCB7CisgICAgaW50IGZDaGFubmVscyA9IDI7CisgICAgaW50IG1vbm9Nb2RlID0gZmFsc2U7CisgICAgaW50IGZyYW1lTGVuZ3RoID0gMjU2OworICAgIGludCBwcmVzZXQgPSAwOworICAgIGludCBuckNoYW5uZWxzID0gMjsKKyAgICBpbnQgc2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgIGludCBhdXhpbGlhcnkgPSAwOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKK307CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrUmV2ZXJiQ29uZmlnQ2hNYXNrW10gPSB7CisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCwKK307CisKK2NvbnN0ZXhwciBpbnQga1JldmVyYkNvbmZpZ0NoTWFza0NvdW50ID0gc3RkOjpzaXplKGtSZXZlcmJDb25maWdDaE1hc2spOworCitpbnQgcmV2ZXJiQ3JlYXRlRWZmZWN0KGVmZmVjdF9oYW5kbGVfdCogcEVmZmVjdEhhbmRsZSwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnLCBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9JZCwgaW50IGF1eEZsYWcpIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoJmtSZXZlcmJVdWlkc1thdXhGbGFnXSwgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0lkLCBwRWZmZWN0SGFuZGxlKTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldmVyYiBjcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgICgqKnBFZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJRywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksIHBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCByZXZlcmJTZXRDb25maWdQYXJhbSh1aW50MzJfdCBwYXJhbVR5cGUsIHVpbnQzMl90IHBhcmFtVmFsdWUsIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUpIHsKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgdWludDMyX3QgcGFyYW1EYXRhWzJdID0ge3BhcmFtVHlwZSwgcGFyYW1WYWx1ZX07CisgICAgZWZmZWN0X3BhcmFtX3QqIGVmZmVjdFBhcmFtID0gKGVmZmVjdF9wYXJhbV90KiltYWxsb2Moc2l6ZW9mKCplZmZlY3RQYXJhbSkgKyBzaXplb2YocGFyYW1EYXRhKSk7CisgICAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnBhcmFtRGF0YVswXSwgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMF0pOworICAgIGVmZmVjdFBhcmFtLT52c2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMV0pOworICAgIGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICBmcmVlKGVmZmVjdFBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldmVyYiBzZXQgY29uZmlnIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiByZXBseTsKK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICAgIHByaW50ZigiXG5Vc2FnZTogIik7CisgICAgcHJpbnRmKCJcbiAgICAgPGV4ZWN1dGFibGU+IFtvcHRpb25zXVxuIik7CisgICAgcHJpbnRmKCJcbndoZXJlIG9wdGlvbnMgYXJlLCAiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWlucHV0IDxpbnB1dGZpbGU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgcGF0aCB0byB0aGUgaW5wdXQgZmlsZSIpOworICAgIHByaW50ZigiXG4gICAgIC0tb3V0cHV0IDxvdXRwdXRmaWxlPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIHBhdGggdG8gdGhlIG91dHB1dCBmaWxlIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1oZWxwIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgcHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgICBwcmludGYoIlxuICAgICAtLWNoTWFzayA8Y2hhbm5lbF9tYXNrPlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMCAgLSBBVURJT19DSEFOTkVMX09VVF9NT05PIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAzICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICA1ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDYgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDggIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNCBjaDogKDEgPDwgNCkgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgOSAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTEgLSBBVURJT19DSEFOTkVMX09VVF9QRU5UQSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDEyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNSBjaDogKDEgPDwgNSkgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTQgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTUgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0siKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDE3IC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNiBjaDogKDEgPDwgNikgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTggLSBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyMCAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyMSAtIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICAgIHByaW50ZigiXG4gICAgIC0tZnMgPHNhbXBsaW5nX2ZyZXE+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDQ4MDAwLiIpOworICAgIHByaW50ZigiXG4gICAgIC0tcHJlc2V0IDxwcmVzZXRfdmFsdWU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMCAtIE5vbmUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAxIC0gU21hbGwgUm9vbSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDIgLSBNZWRpdW0gUm9vbSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDMgLSBMYXJnZSBSb29tIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNCAtIE1lZGl1bSBIYWxsIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNSAtIExhcmdlIEhhbGwiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICA2IC0gUGxhdGUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWZjaCA8ZmlsZV9jaGFubmVscz4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBudW1iZXIgb2YgY2hhbm5lbHMgaW4gaW5wdXQgZmlsZSAoMSB0aHJvdWdoIDgpLCBkZWZhdWx0IDEiKTsKKyAgICBwcmludGYoIlxuICAgICAtLU0iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBNb25vIG1vZGUgKGZvcmNlIGFsbCBpbnB1dCBhdWRpbyBjaGFubmVscyB0byBiZSBpZGVudGljYWwpIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hdXggPGF1eGlsaWFyeV9mbGFnPiAiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAwIC0gSW5zZXJ0IE1vZGUgb24iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAxIC0gYXV4aWxpYXJ5IE1vZGUgb24iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXZlcmJDb25maWdQYXJhbXNfdCByZXZDb25maWdQYXJhbXN7fTsgIC8vIGRlZmF1bHQgaW5pdGlhbGl6ZQorICAgIGNvbnN0IGNoYXIqIGlucHV0RmlsZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogb3V0cHV0RmlsZSA9IG51bGxwdHI7CisKKyAgICBjb25zdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7CisgICAgICAgICAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0hFTFB9LAorICAgICAgICAgICAgeyJpbnB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfSU5QVVR9LAorICAgICAgICAgICAgeyJvdXRwdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX09VVFBVVH0sCisgICAgICAgICAgICB7ImZzIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19GU30sCisgICAgICAgICAgICB7ImNoTWFzayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQ0hfTUFTS30sCisgICAgICAgICAgICB7InByZXNldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfUFJFU0VUfSwKKyAgICAgICAgICAgIHsiYXV4IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BVVh9LAorICAgICAgICAgICAgeyJNIiwgbm9fYXJndW1lbnQsICZyZXZDb25maWdQYXJhbXMubW9ub01vZGUsIHRydWV9LAorICAgICAgICAgICAgeyJmY2giLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0ZJTEVfQ0h9LAorICAgICAgICAgICAge251bGxwdHIsIDAsIG51bGxwdHIsIDB9LAorICAgIH07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBjb25zdCBpbnQgb3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgKGNoYXIqIGNvbnN0Kilhcmd2LCAiaTpvOiIsIGxvbmdfb3B0cywgbnVsbHB0cik7CisgICAgICAgIGlmIChvcHQgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICBjYXNlIEFSR19IRUxQOgorICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworICAgICAgICAgICAgY2FzZSBBUkdfSU5QVVQ6IHsKKyAgICAgICAgICAgICAgICBpbnB1dEZpbGUgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfT1VUUFVUOiB7CisgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19GUzogeworICAgICAgICAgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5zYW1wbGVSYXRlID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQ0hfTUFTSzogeworICAgICAgICAgICAgICAgIGludCBjaE1hc2tJZHggPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGNoTWFza0lkeCA8IDAgb3IgY2hNYXNrSWR4ID4ga1JldmVyYkNvbmZpZ0NoTWFza0NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDaGFubmVsIE1hc2sgaW5kZXggbm90IGluIGNvcnJlY3QgcmFuZ2VcbiIpOworICAgICAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5jaE1hc2sgPSBrUmV2ZXJiQ29uZmlnQ2hNYXNrW2NoTWFza0lkeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19QUkVTRVQ6IHsKKyAgICAgICAgICAgICAgICByZXZDb25maWdQYXJhbXMucHJlc2V0ID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQVVYOiB7CisgICAgICAgICAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmF1eGlsaWFyeSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX01PTk9fTU9ERTogeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfRklMRV9DSDogeworICAgICAgICAgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlucHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogbWlzc2luZyBpbnB1dCBmaWxlc1xuIik7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBpbnB1dEZwKGZvcGVuKGlucHV0RmlsZSwgInJiIiksICZmY2xvc2UpOworCisgICAgaWYgKGlucHV0RnAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgaW5wdXRGaWxlKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAob3V0cHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogbWlzc2luZyBvdXRwdXQgZmlsZXNcbiIpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gb3V0cHV0RnAoZm9wZW4ob3V0cHV0RmlsZSwgIndiIiksICZmY2xvc2UpOworCisgICAgaWYgKG91dHB1dEZwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRwdXRGaWxlKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlc3Npb25JZCA9IDE7CisgICAgaW50MzJfdCBpb0lkID0gMTsKKyAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlID0gbnVsbHB0cjsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICAgIGNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBjb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHJldkNvbmZpZ1BhcmFtcy5zYW1wbGVSYXRlOworICAgIGNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSByZXZDb25maWdQYXJhbXMuY2hNYXNrOworICAgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgaWYgKEFVRElPX0NIQU5ORUxfT1VUX01PTk8gPT0gcmV2Q29uZmlnUGFyYW1zLmNoTWFzaykgeworICAgICAgICBjb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIH0KKyAgICBpZiAoaW50IHN0YXR1cyA9IHJldmVyYkNyZWF0ZUVmZmVjdCgmZWZmZWN0SGFuZGxlLCAmY29uZmlnLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmF1eGlsaWFyeSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJDcmVhdGUgZWZmZWN0IGNhbGwgcmV0dXJuZWQgZXJyb3IgJWkiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICAoKmVmZmVjdEhhbmRsZSktPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICBpZiAocmVwbHkgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ29tbWFuZCBlbmFibGUgY2FsbCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmVwbHkpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChpbnQgc3RhdHVzID0gcmV2ZXJiU2V0Q29uZmlnUGFyYW0oUkVWRVJCX1BBUkFNX1BSRVNFVCwgKHVpbnQzMl90KXJldkNvbmZpZ1BhcmFtcy5wcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGUpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCByZXZlcmIgcHJlc2V0LiBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXZDb25maWdQYXJhbXMubnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhyZXZDb25maWdQYXJhbXMuY2hNYXNrKTsKKyAgICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcmV2Q29uZmlnUGFyYW1zLm5yQ2hhbm5lbHM7CisgICAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcmV2Q29uZmlnUGFyYW1zLmZyYW1lTGVuZ3RoOworI2lmZGVmIEJZUEFTU19FWEVDCisgICAgY29uc3QgaW50IGZyYW1lU2l6ZSA9IChpbnQpY2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsKKyNlbmRpZgorICAgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHM7CisgICAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICAgIGNvbnN0IGludCBtYXhDaGFubmVsQ291bnQgPSBzdGQ6Om1heChjaGFubmVsQ291bnQsIGlvQ2hhbm5lbENvdW50KTsKKyAgICAvKgorICAgICAqIE1vbm8gaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMiBjaGFubmVscyBpbnRlcm5hbGx5IGluIHRoZSBwcm9jZXNzIGNhbGwKKyAgICAgKiBieSBjb3B5aW5nIHRoZSBzYW1lIGRhdGEgaW50byB0aGUgc2Vjb25kIGNoYW5uZWwuCisgICAgICogSGVuY2Ugd2hlbiBjaGFubmVsQ291bnQgaXMgMSwgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGZvcgorICAgICAqIDIgY2hhbm5lbHMuIFRoZSBvdXRDaGFubmVsQ291bnQgdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW9uIG9mIHN1ZmZpY2llbnQKKyAgICAgKiBtZW1vcnkgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqLworICAgIGNvbnN0IGludCBvdXRDaGFubmVsQ291bnQgPSAoY2hhbm5lbENvdW50ID09IDEgPyAyIDogY2hhbm5lbENvdW50KTsKKworICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBpbihmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdE91dChmcmFtZUxlbmd0aCAqIG91dENoYW5uZWxDb3VudCk7CisKKyAgICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKworICAgIHdoaWxlIChmcmVhZChpbi5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgaW5wdXRGcC5nZXQoKSkgPT0gKHNpemVfdClmcmFtZUxlbmd0aCkgeworICAgICAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0SW4uZGF0YSgpLCBpbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKworICAgICAgICAvLyBNb25vIG1vZGUgd2lsbCByZXBsaWNhdGUgdGhlIGZpcnN0IGNoYW5uZWwgdG8gYWxsIG90aGVyIGNoYW5uZWxzLgorICAgICAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCisgICAgICAgIC8vIEJhc3MgQm9vc3QsIHdoaWNoIGV4dHJhY3RzIGEgbW9ubyBzaWduYWwgZm9yIHByb2Nlc3NpbmcuCisgICAgICAgIGlmIChyZXZDb25maWdQYXJhbXMubW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgYXV0byogZnAgPSAmZmxvYXRJbltpICogY2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgIC8vIHJlcGxpY2F0ZSBjaCAwCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19idWZmZXJfdCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyOworICAgICAgICBpbnB1dEJ1ZmZlci5mcmFtZUNvdW50ID0gb3V0cHV0QnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUxlbmd0aDsKKyAgICAgICAgaW5wdXRCdWZmZXIuZjMyID0gZmxvYXRJbi5kYXRhKCk7CisgICAgICAgIG91dHB1dEJ1ZmZlci5mMzIgPSBmbG9hdE91dC5kYXRhKCk7CisjaWZuZGVmIEJZUEFTU19FWEVDCisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gKCplZmZlY3RIYW5kbGUpLT5wcm9jZXNzKGVmZmVjdEhhbmRsZSwgJmlucHV0QnVmZmVyLCAmb3V0cHV0QnVmZmVyKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyByZXR1cm5lZCB3aXRoIGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgbWVtY3B5KGZsb2F0T3V0LmRhdGEoKSwgZmxvYXRJbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogZnJhbWVTaXplKTsKKyNlbmRpZgorICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0LmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBmcmFtZUxlbmd0aCAqIG91dENoYW5uZWxDb3VudCk7CisKKyAgICAgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIG91dENoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBvdXRDaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgfQorICAgICAgICAodm9pZClmd3JpdGUob3V0LmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBvdXRwdXRGcC5nZXQoKSk7CisgICAgICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgICB9CisKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpbyBQcmVwcm9jZXNzaW5nIHJlbGVhc2UgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3Nuci5jcHAKaW5kZXggODg1OTk0Yy4uMGZlZjMzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwCkBAIC0yMiw4NCArMjIsODMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBID0gZmxvYXQ+Ci1zdGQ6OnBhaXI8QSwgQT4gZ2V0U2lnbmFsTm9pc2UoRklMRSAqZmlucCwgRklMRSAqZnJlZikgewotICBjb25zdGV4cHIgc2l6ZV90IGZyYW1lc2l6ZSA9IDI1NjsKLSAgc3RkOjp2ZWN0b3I8VD4gaW4oZnJhbWVzaXplKTsKLSAgc3RkOjp2ZWN0b3I8VD4gcmVmKGZyYW1lc2l6ZSk7Ci0gIEEgc2lnbmFse307Ci0gIEEgbm9pc2V7fTsKK3N0ZDo6cGFpcjxBLCBBPiBnZXRTaWduYWxOb2lzZShGSUxFKiBmaW5wLCBGSUxFKiBmcmVmKSB7CisgICAgY29uc3RleHByIHNpemVfdCBmcmFtZXNpemUgPSAyNTY7CisgICAgc3RkOjp2ZWN0b3I8VD4gaW4oZnJhbWVzaXplKTsKKyAgICBzdGQ6OnZlY3RvcjxUPiByZWYoZnJhbWVzaXplKTsKKyAgICBBIHNpZ25hbHt9OworICAgIEEgbm9pc2V7fTsKIAotICBmb3IgKDs7KSB7Ci0gICAgc2l6ZV90IHJlYWRfc2FtcGxlc19pbiA9IGZyZWFkKCZpblswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZpbnApOwotICAgIGNvbnN0IHNpemVfdCByZWFkX3NhbXBsZXNfcmVmID0gZnJlYWQoJnJlZlswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZyZWYpOwotICAgIGlmIChyZWFkX3NhbXBsZXNfaW4gIT0gcmVhZF9zYW1wbGVzX3JlZikgewotICAgICAgcHJpbnRmKCJmaWxlIHNpemVzIGRvIG5vdCBtYXRjaCAobGFzdCAlenUgJXp1KSIsIHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7Ci0gICAgICByZWFkX3NhbXBsZXNfaW4gPSBzdGQ6Om1pbihyZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc2l6ZV90IHJlYWRfc2FtcGxlc19pbiA9IGZyZWFkKCZpblswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZpbnApOworICAgICAgICBjb25zdCBzaXplX3QgcmVhZF9zYW1wbGVzX3JlZiA9IGZyZWFkKCZyZWZbMF0sIHNpemVvZihUKSwgZnJhbWVzaXplLCBmcmVmKTsKKyAgICAgICAgaWYgKHJlYWRfc2FtcGxlc19pbiAhPSByZWFkX3NhbXBsZXNfcmVmKSB7CisgICAgICAgICAgICBwcmludGYoImZpbGUgc2l6ZXMgZG8gbm90IG1hdGNoIChsYXN0ICV6dSAlenUpIiwgcmVhZF9zYW1wbGVzX2luLCByZWFkX3NhbXBsZXNfcmVmKTsKKyAgICAgICAgICAgIHJlYWRfc2FtcGxlc19pbiA9IHN0ZDo6bWluKHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRfc2FtcGxlc19pbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4ge3NpZ25hbCwgbm9pc2V9OworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVhZF9zYW1wbGVzX2luOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEEgdmFsdWUocmVmW2ldKTsKKyAgICAgICAgICAgIGNvbnN0IEEgZGlmZihBKGluW2ldKSAtIHZhbHVlKTsKKyAgICAgICAgICAgIHNpZ25hbCArPSB2YWx1ZSAqIHZhbHVlOworICAgICAgICAgICAgbm9pc2UgKz0gZGlmZiAqIGRpZmY7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHJlYWRfc2FtcGxlc19pbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiB7IHNpZ25hbCwgbm9pc2UgfTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkX3NhbXBsZXNfaW47ICsraSkgewotICAgICAgIGNvbnN0IEEgdmFsdWUocmVmW2ldKTsKLSAgICAgICBjb25zdCBBIGRpZmYoQShpbltpXSkgLSB2YWx1ZSk7Ci0gICAgICAgc2lnbmFsICs9IHZhbHVlICogdmFsdWU7Ci0gICAgICAgbm9pc2UgKz0gZGlmZiAqIGRpZmY7Ci0gICAgfQotICB9CiB9CiAKIHZvaWQgcHJpbnRVc2FnZSgpIHsKLSAgcHJpbnRmKCJcblVzYWdlOiAiKTsKLSAgcHJpbnRmKCJcbiAgICAgc25yIDxyZWZfZmlsZT4gPHRlc3RfZmlsZT4gW29wdGlvbnNdXG4iKTsKLSAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPHJlZl9maWxlPiAgaXMgdGhlIHJlZmVyZW5jZSBmaWxlIG5hbWUiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHdpbGwgYmUgdGFrZW4gYXMgcHVyZSBzaWduYWwiKTsKLSAgcHJpbnRmKCJcbiAgICAgPHRlc3RfZmlsZT4gaXMgdGVzdCBmaWxlIGZvciBzbnIgY2FsY3VsYXRpb24iKTsKLSAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiXG4gICAgIC1wY21fZm9ybWF0OjxwY20gZm9ybWF0IG9mIGlucHV0IGZpbGVzPiIpOwotICBwcmludGYoIlxuICAgICAgICAgICAwIC0gMTYgYml0IHBjbSIpOwotICBwcmludGYoIlxuICAgICAgICAgICAxIC0gMzIgYml0IGZsb2F0Iik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOwotICBwcmludGYoIlxuICAgICAtdGhyOjx0aHJlc2hvbGQgdmFsdWU+Iik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSBuZWdhdGl2ZSBpbmZpbml0eVxuXG4iKTsKKyAgICBwcmludGYoIlxuVXNhZ2U6ICIpOworICAgIHByaW50ZigiXG4gICAgIHNuciA8cmVmX2ZpbGU+IDx0ZXN0X2ZpbGU+IFtvcHRpb25zXVxuIik7CisgICAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPHJlZl9maWxlPiAgaXMgdGhlIHJlZmVyZW5jZSBmaWxlIG5hbWUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBhcyBwdXJlIHNpZ25hbCIpOworICAgIHByaW50ZigiXG4gICAgIDx0ZXN0X2ZpbGU+IGlzIHRlc3QgZmlsZSBmb3Igc25yIGNhbGN1bGF0aW9uIik7CisgICAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtcGNtX2Zvcm1hdDo8cGNtIGZvcm1hdCBvZiBpbnB1dCBmaWxlcz4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAwIC0gMTYgYml0IHBjbSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDEgLSAzMiBiaXQgZmxvYXQiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtdGhyOjx0aHJlc2hvbGQgdmFsdWU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIG5lZ2F0aXZlIGluZmluaXR5XG5cbiIpOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7Ci0gIGlmIChhcmdjIDwgMykgewotICAgIHByaW50VXNhZ2UoKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaW50IHBjbV9mb3JtYXQgPSAwOwotICBmbG9hdCB0aHIgPSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwotICBGSUxFICpmcmVmID0gZm9wZW4oYXJndlsxXSwgInJiIik7Ci0gIEZJTEUgKmZpbnAgPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKLSAgZm9yIChpbnQgaSA9IDM7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1wY21fZm9ybWF0OiIsIDEyKSkgewotICAgICAgcGNtX2Zvcm1hdCA9IGF0b2koYXJndltpXSArIDEyKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdGhyOiIsIDUpKSB7Ci0gICAgICB0aHIgPSBhdG9mKGFyZ3ZbaV0gKyA1KTsKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyA8IDMpIHsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICB9Ci0gIGlmIChmaW5wID09IG51bGxwdHIgfHwgZnJlZiA9PSBudWxscHRyKSB7Ci0gICAgcHJpbnRmKCJcbkVycm9yOiBtaXNzaW5nIGlucHV0L3JlZmVyZW5jZSBmaWxlc1xuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGludCByZXQgPSBFWElUX1NVQ0NFU1M7Ci0gIGF1dG8gc24gPSBwY21fZm9ybWF0ID09IDAKLSAgICAgID8gZ2V0U2lnbmFsTm9pc2U8c2hvcnQ+KGZpbnAsIGZyZWYpCi0gICAgICA6IGdldFNpZ25hbE5vaXNlPGZsb2F0PihmaW5wLCBmcmVmKTsKLSAgaWYgKHNuLmZpcnN0ID4gMC5mICYmIHNuLnNlY29uZCA+IDAuZikgewotICAgIGZsb2F0IHNuciA9IDEwLmYgKiBsb2coc24uZmlyc3QgLyBzbi5zZWNvbmQpOwotICAgIC8vIGNvbXBhcmUgdGhlIG1lYXN1cmVkIHNuciB2YWx1ZSB3aXRoIHRocmVzaG9sZAotICAgIGlmIChzbnIgPCB0aHIpIHsKLSAgICAgIHByaW50ZigiJS42ZiBsZXNzIHRoYW4gdGhyZXNob2xkICUuNmZcbiIsIHNuciwgdGhyKTsKLSAgICAgIHJldCA9IEVYSVRfRkFJTFVSRTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRmKCIlLjZmXG4iLCBzbnIpOworICAgIGludCBwY21fZm9ybWF0ID0gMDsKKyAgICBmbG9hdCB0aHIgPSAtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgRklMRSogZnJlZiA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworICAgIEZJTEUqIGZpbnAgPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKKyAgICBmb3IgKGludCBpID0gMzsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1wY21fZm9ybWF0OiIsIDEyKSkgeworICAgICAgICAgICAgcGNtX2Zvcm1hdCA9IGF0b2koYXJndltpXSArIDEyKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXRocjoiLCA1KSkgeworICAgICAgICAgICAgdGhyID0gYXRvZihhcmd2W2ldICsgNSk7CisgICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZmNsb3NlKGZpbnApOwotICBmY2xvc2UoZnJlZik7CisgICAgaWYgKGZpbnAgPT0gbnVsbHB0ciB8fCBmcmVmID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBtaXNzaW5nIGlucHV0L3JlZmVyZW5jZSBmaWxlc1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKKyAgICBhdXRvIHNuID0KKyAgICAgICAgICAgIHBjbV9mb3JtYXQgPT0gMCA/IGdldFNpZ25hbE5vaXNlPHNob3J0PihmaW5wLCBmcmVmKSA6IGdldFNpZ25hbE5vaXNlPGZsb2F0PihmaW5wLCBmcmVmKTsKKyAgICBpZiAoc24uZmlyc3QgPiAwLmYgJiYgc24uc2Vjb25kID4gMC5mKSB7CisgICAgICAgIGZsb2F0IHNuciA9IDEwLmYgKiBsb2coc24uZmlyc3QgLyBzbi5zZWNvbmQpOworICAgICAgICAvLyBjb21wYXJlIHRoZSBtZWFzdXJlZCBzbnIgdmFsdWUgd2l0aCB0aHJlc2hvbGQKKyAgICAgICAgaWYgKHNuciA8IHRocikgeworICAgICAgICAgICAgcHJpbnRmKCIlLjZmIGxlc3MgdGhhbiB0aHJlc2hvbGQgJS42ZlxuIiwgc25yLCB0aHIpOworICAgICAgICAgICAgcmV0ID0gRVhJVF9GQUlMVVJFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlLjZmXG4iLCBzbnIpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmaW5wKTsKKyAgICBmY2xvc2UoZnJlZik7CiAKLSAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCmluZGV4IGFmYzQyMjAuLmJlNjBhYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw1IEBACiAvLyBtdXNpYyBidW5kbGUgd3JhcHBlcgotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmJ1bmRsZXdyYXBwZXIiLAogCiAgICAgYXJjaDogewpAQCAtMTMsNyArMTMsNiBAQAogCiAgICAgY3BwZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAotICAgICAgICAiLURTVVBQT1JUX01DIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCA2ZmNhMGU3Li42NzBiNDE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKIHR5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOwogI2VuZGlmCiAjZGVmaW5lIExPR19UQUcgIkJ1bmRsZSIKLSNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mIChhcnJheSlbMF0pCisjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5KVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgpAQCAtNDIsMjYgKzQyLDMzIEBACiAjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORwogI2RlZmluZSBBTE9HVlYgQUxPR1YKICNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUgKGZhbHNlKQorI2RlZmluZSBBTE9HVlYoYS4uLikgXAorICAgIGRvIHsgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKGZhbHNlKQogI2VuZGlmCiAKLSNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpe1wKLSAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUyl7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKLSAgICAgICAgICAgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKLSAgICAgICAgfVwKLSAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUil7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKLSAgICAgICAgICAgICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fSU5WQUxJRE5VTVNBTVBMRVMpe1wKLSAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fT1VUT0ZSQU5HRSl7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKLSAgICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKLSAgICAgICAgfVwKKyNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJiYWQgYWxpZ25tZW50IHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgcmV0dXJuZWQgYnkgJXMgaW4gJXNcbiIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAKIC8vIE5hbWVzcGFjZXMKQEAgLTc0LDIwICs4MSwyMSBAQAogaW50IFNlc3Npb25JbmRleFtMVk1fTUFYX1NFU1NJT05TXTsKIAogLyogbG9jYWwgZnVuY3Rpb25zICovCi0jZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiNjb25kKTsgICAgICBcCi0gICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIC8vIE5YUCBTVyBCYXNzQm9vc3QgVVVJRAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQmFzc0Jvb3N0RGVzY3JpcHRvciA9IHsKLSAgICAgICAgezB4MDYzNGYyMjAsIDB4ZGRkNCwgMHgxMWRiLCAweGEwZmMsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKLSAgICAgICAgezB4ODYzMWYzMDAsIDB4NzJlMiwgMHgxMWRmLCAweGI1N2UsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKKyAgICAgICAgezB4MDYzNGYyMjAsIDB4ZGRkNCwgMHgxMWRiLCAweGEwZmMsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIHsweDg2MzFmMzAwLCAweDcyZTIsIDB4MTFkZiwgMHhiNTdlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdXVpZAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKLSAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORAotICAgICAgICB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCB8CisgICAgICAgICBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCiAgICAgICAgIEJBU1NfQk9PU1RfQ1VQX0xPQURfQVJNOUUsCiAgICAgICAgIEJVTkRMRV9NRU1fVVNBR0UsCiAgICAgICAgICJEeW5hbWljIEJhc3MgQm9vc3QiLApAQCAtOTksOCArMTA3LDggQEAKICAgICAgICAgezB4MzdjYzJjMDAsIDB4ZGRkZCwgMHgxMWRiLCAweDg1NzcsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKLSAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5ECi0gICAgICAgIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgfAorICAgICAgICAgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBWSVJUVUFMSVpFUl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgQlVORExFX01FTV9VU0FHRSwKICAgICAgICAgIlZpcnR1YWxpemVyIiwKQEAgLTEwOSw4ICsxMTcsOCBAQAogCiAvLyBOWFAgU1cgRXF1YWxpemVyIFVVSUQKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0VxdWFsaXplckRlc2NyaXB0b3IgPSB7Ci0gICAgICAgIHsweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB0eXBlCi0gICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkIEVxIE5YUAorICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHR5cGUKKyAgICAgICAgezB4Y2U3NzJmMjAsIDB4ODQ3ZCwgMHgxMWRmLCAweGJiMTcsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB1dWlkIEVxIE5YUAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBFUVVBTElaRVJfQ1VQX0xPQURfQVJNOUUsCkBAIC0xMjEsOCArMTI5LDggQEAKIAogLy8gTlhQIFNXIFZvbHVtZSBVVUlECiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWb2x1bWVEZXNjcmlwdG9yID0gewotICAgICAgICB7MHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LAotICAgICAgICB7MHgxMTkzNDFhMCwgMHg4NDY5LCAweDExZGYsIDB4ODFmOSwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LCAvL3V1aWQgVk9MIE5YUAorICAgICAgICB7MHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgezB4MTE5MzQxYTAsIDB4ODQ2OSwgMHgxMWRmLCAweDgxZjksIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB1dWlkIFZPTCBOWFAKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBWT0xVTUVfQ1VQX0xPQURfQVJNOUUsCkBAIC0xMzIsNzcgKzE0MCw1MCBAQAogfTsKIAogLy8tLS0gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotdm9pZCBMdm1HbG9iYWxCdW5kbGVfaW5pdCAgICAgICh2b2lkKTsKLWludCAgTHZtQnVuZGxlX2luaXQgICAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOwotaW50ICBMdm1FZmZlY3RfZW5hYmxlICAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCk7Ci1pbnQgIEx2bUVmZmVjdF9kaXNhYmxlICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKLXZvaWQgTHZtRWZmZWN0X2ZyZWUgICAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOwotaW50ICBFZmZlY3Rfc2V0Q29uZmlnICAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKLXZvaWQgRWZmZWN0X2dldENvbmZpZyAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyk7Ci1pbnQgIEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgIFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgIFZvbHVtZV9zZXRQYXJhbWV0ZXIgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBWb2x1bWVfZ2V0UGFyYW1ldGVyICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgRWZmZWN0X3NldEVuYWJsZWQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGJvb2wgZW5hYmxlZCk7Cit2b2lkIEx2bUdsb2JhbEJ1bmRsZV9pbml0KHZvaWQpOworaW50IEx2bUJ1bmRsZV9pbml0KEVmZmVjdENvbnRleHQqIHBDb250ZXh0KTsKK2ludCBMdm1FZmZlY3RfZW5hYmxlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KTsKK2ludCBMdm1FZmZlY3RfZGlzYWJsZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCk7CitpbnQgRWZmZWN0X3NldENvbmZpZyhFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKTsKK3ZvaWQgRWZmZWN0X2dldENvbmZpZyhFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKTsKK2ludCBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IFZvbHVtZV9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IFZvbHVtZV9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSk7CitpbnQgRWZmZWN0X3NldEVuYWJsZWQoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGJvb2wgZW5hYmxlZCk7CiAKIC8qIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CitleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QqIHBIYW5kbGUpIHsKICAgICBpbnQgcmV0ID0gMDsKICAgICBpbnQgc2Vzc2lvbk5vID0gLTE7CiAgICAgaW50IGk7Ci0gICAgRWZmZWN0Q29udGV4dCAqcENvbnRleHQgPSBOVUxMOworICAgIEVmZmVjdENvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsKICAgICBib29sIG5ld0J1bmRsZSA9IGZhbHNlOwotICAgIFNlc3Npb25Db250ZXh0ICpwU2Vzc2lvbkNvbnRleHQ7CisgICAgU2Vzc2lvbkNvbnRleHQqIHBTZXNzaW9uQ29udGV4dDsKIAogICAgIEFMT0dWKCJcblx0RWZmZWN0Q3JlYXRlIHN0YXJ0IHNlc3Npb24gJWQiLCBzZXNzaW9uSWQpOwogCi0gICAgaWYgKHBIYW5kbGUgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCi0gICAgaWYoTHZtSW5pdEZsYWcgPT0gTFZNX0ZBTFNFKXsKKyAgICBpZiAoTHZtSW5pdEZsYWcgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgIEx2bUluaXRGbGFnID0gTFZNX1RSVUU7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEluaXRpYWxpemluZyBhbGwgZ2xvYmFsIG1lbW9yeSIpOwogICAgICAgICBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpOwpAQCAtMjEwLDcgKzE5MSw3IEBACiAKICAgICAvLyBGaW5kIHNlc3Npb25ObzogaWYgb25lIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgc2Vzc2lvbklkIHVzZSBpdCwKICAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBmaXJzdCBhdmFpbGFibGUgZW1wdHkgc2xvdC4KLSAgICBmb3IoaT0wOyBpPExWTV9NQVhfU0VTU0lPTlM7IGkrKyl7CisgICAgZm9yIChpID0gMDsgaSA8IExWTV9NQVhfU0VTU0lPTlM7IGkrKykgewogICAgICAgICBpZiAoU2Vzc2lvbkluZGV4W2ldID09IHNlc3Npb25JZCkgewogICAgICAgICAgICAgc2Vzc2lvbk5vID0gaTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjMyLDEwNiArMjEzLDEwMiBAQAogICAgIHBDb250ZXh0ID0gbmV3IEVmZmVjdENvbnRleHQ7CiAKICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjcmVhdGUgaW4gdGhpcyBzZXNzaW9uCi0gICAgaWYoR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICBpZiAoR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIFRoaXMgaXMgdGhlIGZpcnN0IGVmZmVjdCBpbiBjdXJyZW50IHNlc3Npb25JZCAlZCBzZXNzaW9uTm8gJWQiLAotICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvbk5vKTsKKyAgICAgICAgICAgICAgc2Vzc2lvbklkLCBzZXNzaW9uTm8pOwogCiAgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID0gTFZNX1RSVUU7Ci0gICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQgICAgICAgID0gbmV3IEJ1bmRsZWRFZmZlY3RDb250ZXh0OworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0ID0gbmV3IEJ1bmRsZWRFZmZlY3RDb250ZXh0OwogICAgICAgICBuZXdCdW5kbGUgPSB0cnVlOwogCiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0OwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8gICAgICAgICAgICAgICAgPSBzZXNzaW9uTm87Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCAgICAgICAgICAgICAgICA9IHNlc3Npb25JZDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICAgICAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCAgICAgICAgICAgICA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgICAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObyA9IHNlc3Npb25ObzsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBOVUxMOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZSAgICAgICAgICAgID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lICAgICAgICAgICAgICA9IExWTV9UUlVFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgICAgICAgICAgICAgICAgICAgPSAwOwotCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID0gTFZNX1RSVUU7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7CiAKICAgICAgICAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlIHNldCB0byB0aGUgZ2V0CiAgICAgICAgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbCBhdm9pZAogICAgICAgICAgKiBxdWFudGlzYXRpb24gbGlrZSBlZmZlY3Qgd2hlbiByZXR1cm5pbmcKICAgICAgICAgICovCi0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkICAgICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkICAgICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCAgICAgICAgICAgICAgICA9IFBSRVNFVF9DVVNUT007Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgICAgICAgICAgICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCAgICAgICAgICAgICA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkICAgICAgICAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyICAgICAgICAgICAgICAgPSBOVUxMOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ICAgICAgICAgICAgICAgPSAtMTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAgID0gMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgICAgID0gMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCA9IFBSRVNFVF9DVVNUT007CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0gTlVMTDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA9IC0xOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKICAgICAgICAgfQotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RQcm9jZXNzQ2FsbGVkICAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluICAgICAgICAgICAgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RQcm9jZXNzQ2FsbGVkID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbiA9IDA7CiAKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBMdm1CdW5kbGVfaW5pdCIpOwogICAgICAgICByZXQgPSBMdm1CdW5kbGVfaW5pdChwQ29udGV4dCk7CiAKLSAgICAgICAgaWYgKHJldCA8IDApeworICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBBc3NpZ25pbmcgbWVtb3J5IGZvciBwcmV2aW91c2x5IGNyZWF0ZWQgZWZmZWN0IG9uIHNlc3Npb25ObyAlZCIsCi0gICAgICAgICAgICAgICAgc2Vzc2lvbk5vKTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLnBCdW5kbGVkQ29udGV4dDsKKyAgICAgICAgICAgICAgc2Vzc2lvbk5vKTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQ7CiAgICAgfQogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIHBCdW5kbGVkQ29udGV4dCBpcyAlcCIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOwogCiAgICAgcFNlc3Npb25Db250ZXh0ID0gJkdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXTsKIAogICAgIC8vIENyZWF0ZSBlYWNoIEVmZmVjdAotICAgIGlmIChtZW1jbXAodXVpZCwgJmdCYXNzQm9vc3REZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ0Jhc3NCb29zdERlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgIC8vIENyZWF0ZSBCYXNzIEJvb3N0CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9CQVNTX0JPT1NUIik7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YkJhc3NJbnN0YW50aWF0ZWQgPSBMVk1fVFJVRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPSAwOwogCi0gICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5pdGZlID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CiAgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX0JBU1NfQk9PU1Q7Ci0gICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWaXJ0dWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKXsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZpcnR1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIFZpcnR1YWxpemVyCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9WSVJUVUFMSVpFUiIpOwotICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZD1MVk1fVFJVRTsKKyAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fVFJVRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7CiAKLSAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPml0ZmUgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKICAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fVklSVFVBTElaRVI7Ci0gICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgRXF1YWxpemVyCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9FUVVBTElaRVIiKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKIAotICAgICAgICBwQ29udGV4dC0+aXRmZSAgICAgICA9ICZnTHZtRWZmZWN0SW50ZXJmYWNlOworICAgICAgICBwQ29udGV4dC0+aXRmZSA9ICZnTHZtRWZmZWN0SW50ZXJmYWNlOwogICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSA9IExWTV9FUVVBTElaRVI7Ci0gICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWb2x1bWVEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWb2x1bWVEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgVm9sdW1lCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9WT0xVTUUiKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVm9sdW1lSW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CiAKLSAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPml0ZmUgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKICAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fVk9MVU1FOwotICAgIH0KLSAgICBlbHNleworICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGludmFsaWQgVVVJRCIpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CkBAIC0zNDcsNjYgKzMyNCw2NCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVsZXRlIHBDb250ZXh0OwogICAgICAgICB9Ci0gICAgICAgIGlmIChwSGFuZGxlICE9IE5VTEwpCi0gICAgICAgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KU5VTEw7CisgICAgICAgIGlmIChwSGFuZGxlICE9IE5VTEwpICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClOVUxMOwogICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocEhhbmRsZSAhPSBOVUxMKQotICAgICAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CisgICAgICAgIGlmIChwSGFuZGxlICE9IE5VTEwpICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKICAgICB9CiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZC4uXG5cbiIpOwogICAgIHJldHVybiByZXQ7CiB9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKXsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgewogICAgIEFMT0dWKCJcblx0RWZmZWN0UmVsZWFzZSBzdGFydCAlcCIsIGhhbmRsZSk7Ci0gICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKiloYW5kbGU7CisgICAgRWZmZWN0Q29udGV4dCogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCopaGFuZGxlOwogCiAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZSBzdGFydCBoYW5kbGU6ICVwLCBjb250ZXh0ICVwIiwgaGFuZGxlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKLSAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgU2Vzc2lvbkNvbnRleHQgKnBTZXNzaW9uQ29udGV4dCA9ICZHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob107CisgICAgU2Vzc2lvbkNvbnRleHQqIHBTZXNzaW9uQ29udGV4dCA9ICZHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob107CiAKICAgICAvLyBDbGVhciB0aGUgaW5zdGFudGlhdGVkIGZsYWcgZm9yIHRoZSBlZmZlY3QKICAgICAvLyBwcm90ZWN0IGFnYWlucyB0aGUgY2FzZSB3aGVyZSBhbiBlZmZlY3QgaXMgdW4taW5zdGFudGlhdGVkIHdpdGhvdXQgYmVpbmcgZGlzYWJsZWQKIAotICAgIGludCAmZWZmZWN0SW5EcmFpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW47Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICBpbnQmIGVmZmVjdEluRHJhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluOworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9CQVNTX0JPT1NUIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iQmFzc0luc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKLSAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPiAwKXsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCkgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKICAgICAgICAgfQogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7Ci0gICAgfSBlbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX1ZJUlRVQUxJWkVSIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7Ci0gICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKXsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOwogICAgICAgICB9CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOwotICAgIH0gZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX0VRVUFMSVpFUiBDbGVhcmluZyBnbG9iYWwgaW50c3RhbnRpYXRlZCBmbGFnIik7Ci0gICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9TFZNX0ZBTFNFOwotICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApeworICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CiAgICAgICAgIH0KICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOwotICAgIH0gZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX1ZPTFVNRSBDbGVhcmluZyBnbG9iYWwgaW50c3RhbnRpYXRlZCBmbGFnIik7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YlZvbHVtZUluc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKICAgICAgICAgLy8gVGhlcmUgaXMgbm8gc2FtcGxlc1RvRXhpdENvdW50IGZvciB2b2x1bWUgc28gd2UgYWxzbyB1c2UgdGhlIGRyYWluIGZsYWcgdG8gY2hlY2sKICAgICAgICAgLy8gaWYgd2Ugc2hvdWxkIGRlY3JlbWVudCB0aGUgZWZmZWN0cyBlbmFibGVkLgotICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX1RSVUUKLSAgICAgICAgICAgICAgICB8fCAoZWZmZWN0SW5EcmFpbiAmIDEgPDwgTFZNX1ZPTFVNRSkgIT0gMCkgeworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX1RSVUUgfHwKKyAgICAgICAgICAgIChlZmZlY3RJbkRyYWluICYgMSA8PCBMVk1fVk9MVU1FKSAhPSAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSA6IFVuc3VwcG9ydGVkIGVmZmVjdFxuXG5cblxuXG5cblxuIik7CiAgICAgfQotICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IHBDb250ZXh0LT5FZmZlY3RUeXBlKTsgLy8gbm8gbmVlZCB0byBkcmFpbiBpZiByZWxlYXNlZAorICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IHBDb250ZXh0LT5FZmZlY3RUeXBlKTsgIC8vIG5vIG5lZWQgdG8gZHJhaW4gaWYgcmVsZWFzZWQKIAogICAgIC8vIERpc2FibGUgZWZmZWN0LCBpbiB0aGlzIGNhc2UgaWdub3JlIGVycm9ycyAocmV0dXJuIGNvZGVzKQogICAgIC8vIGlmIGFuIGVmZmVjdCBoYXMgYWxyZWFkeSBiZWVuIGRpc2FibGVkCkBAIC00MTQsMTcgKzM4OSwxNSBAQAogCiAgICAgLy8gaWYgYWxsIGVmZmVjdHMgYXJlIG5vIGxvbmdlciBpbnN0YW50aWFlZCBmcmVlIHRoZSBsdm0gbWVtb3J5IGFuZCBkZWxldGUgQnVuZGxlZEVmZmVjdENvbnRleHQKICAgICBpZiAoKHBTZXNzaW9uQ29udGV4dC0+YkJhc3NJbnN0YW50aWF0ZWQgPT0gTFZNX0ZBTFNFKSAmJgotICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZvbHVtZUluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpICYmCi0gICAgICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID09TFZNX0ZBTFNFKSAmJgotICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZpcnR1YWxpemVySW5zdGFudGlhdGVkPT1MVk1fRkFMU0UpKQotICAgIHsKLQorICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iVm9sdW1lSW5zdGFudGlhdGVkID09IExWTV9GQUxTRSkgJiYKKyAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpICYmCisgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpKSB7CiAgICAgICAgIC8vIENsZWFyIHRoZSBTZXNzaW9uSW5kZXgKLSAgICAgICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKLSAgICAgICAgICAgIGlmKFNlc3Npb25JbmRleFtpXSA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQpeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9NQVhfU0VTU0lPTlM7IGkrKykgeworICAgICAgICAgICAgaWYgKFNlc3Npb25JbmRleFtpXSA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQpIHsKICAgICAgICAgICAgICAgICBTZXNzaW9uSW5kZXhbaV0gPSBMVk1fVU5VU0VEX1NFU1NJT047Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZTogQ2xlYXJpbmcgU2Vzc2lvbkluZGV4IFNlc3Npb25ObyAlZCBmb3IgU2Vzc2lvbklkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlOiBDbGVhcmluZyBTZXNzaW9uSW5kZXggU2Vzc2lvbk5vICVkIGZvciBTZXNzaW9uSWQgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDMzLDcgKzQwNiw3IEBACiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCA9IExWTV9GQUxTRTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBMVk1fTlVMTDsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZTogRnJlZWluZyBMVk0gQnVuZGxlIG1lbW9yeVxuIik7Ci0gICAgICAgIEx2bUVmZmVjdF9mcmVlKHBDb250ZXh0KTsKKyAgICAgICAgTFZNX0RlbEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOwogICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlOiBEZWxldGluZyBMVk0gQnVuZGxlIGNvbnRleHQgJXBcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOwogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOwpAQCAtNDQ5LDExICs0MjIsMTAgQEAKIAogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEw7CitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCogZGVzYyA9IE5VTEw7CiAKLSAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvcigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC00NjksNyArNDQxLDcgQEAKICAgICB9CiAKICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAgLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCiAgICAgKnBEZXNjcmlwdG9yID0gKmRlc2M7CkBAIC00NzcsMTUgKzQ0OSwxNSBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLwogCi12b2lkIEx2bUdsb2JhbEJ1bmRsZV9pbml0KCl7Cit2b2lkIEx2bUdsb2JhbEJ1bmRsZV9pbml0KCkgewogICAgIEFMT0dWKCJcdEx2bUdsb2JhbEJ1bmRsZV9pbml0IHN0YXJ0Iik7Ci0gICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKLSAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYlZvbHVtZUluc3RhbnRpYXRlZCAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgICA9IExWTV9GQUxTRTsKLSAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQmFzc0luc3RhbnRpYXRlZCAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTUFYX1NFU1NJT05TOyBpKyspIHsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJWb2x1bWVJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYkVxdWFsaXplckluc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQmFzc0luc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKICAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7Ci0gICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0ucEJ1bmRsZWRDb250ZXh0ICAgICAgICAgID0gTFZNX05VTEw7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0ucEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CiAKICAgICAgICAgU2Vzc2lvbkluZGV4W2ldID0gTFZNX1VOVVNFRF9TRVNTSU9OOwogICAgIH0KQEAgLTUwNCwyMDMgKzQ3NiwxNDAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEx2bUJ1bmRsZV9pbml0KEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKK2ludCBMdm1CdW5kbGVfaW5pdChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCkgewogICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHN0YXJ0Iik7CiAKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgID0gNDQxMDA7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgPSA0NDEwMDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSAgICAgICAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKIAogICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKIAotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCl7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgotICAgICAgICAgICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKLQotICAgICAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgICAgICAgTFZNX0RlbEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOwogCiAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgotICAgICAgICAgICAgICAgICItPiBDYWxsZWQgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworICAgICAgICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKICAgICB9CiAKLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgICAgICAgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCi0gICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKLSAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fRkFMU0U7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IHBhcmFtczsgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190IEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90IEhlYWRyb29tQmFuZERlZltMVk1fSEVBRFJPT01fTUFYX05CQU5EU107CiAKICAgICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLwotICAgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSAgICAgICA9IExWTV9VTk1BTkFHRURfQlVGRkVSUzsKLSAgICBJbnN0UGFyYW1zLk1heEJsb2NrU2l6ZSAgICAgPSBNQVhfQ0FMTF9TSVpFOwotICAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyAgICA9IE1BWF9OVU1fQkFORFM7Ci0gICAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgICAgID0gTFZNX1BTQV9PTjsKKyAgICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyA9IE1BWF9OVU1fQkFORFM7CisgICAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOwogCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLwotICAgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShMVk1fTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKLQotICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtQnVuZGxlX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7Ci0gICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7Ci0gICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOwotCi0gICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKLSAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVkICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zIHRoYXQgd2VyZQotICAgICAqIHN1Y2Nlc2Z1bGx5IGFsbG9jYXRlZCBhbmQgcmV0dXJuIHdpdGggYW4gZXJyb3IKLSAgICAgKi8KLSAgICBpZihiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSl7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7Ci0gICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAotICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7Ci0KLSAgICAvKiBJbml0aWFsaXNlICovCi0gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7Ci0KLSAgICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwotICAgIEx2bVN0YXR1cyA9IExWTV9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZJbnN0UGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0SW5zdGFuY2VIYW5kbGUiLCAiTHZtQnVuZGxlX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKyAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CiAKICAgICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgICAgICAgICAgPSBMVk1fTU9ERV9PTjsKLSAgICBwYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgICAgICA9IExWTV9GU180NDEwMDsKLSAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgICAgICAgICA9IExWTV9TVEVSRU87Ci0gICAgcGFyYW1zLlNwZWFrZXJUeXBlICAgICAgICAgICAgPSBMVk1fSEVBRFBIT05FUzsKKyAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgIHBhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVk1fU1RFUkVPOworICAgIHBhcmFtcy5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICAgPSBMVk1fTU9ERV9PRkY7Ci0gICAgcGFyYW1zLlZpcnR1YWxpemVyVHlwZSAgICAgICAgICAgID0gTFZNX0NPTkNFUlRTT1VORDsKLSAgICBwYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbCAgICAgPSAxMDA7Ci0gICAgcGFyYW1zLkNTX0VmZmVjdExldmVsICAgICAgICAgICAgID0gTFZNX0NTX0VGRkVDVF9OT05FOworICAgIHBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcGFyYW1zLlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgICAgcGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgICAgcGFyYW1zLkNTX0VmZmVjdExldmVsID0gTFZNX0NTX0VGRkVDVF9OT05FOwogCiAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgICAgPSBMVk1fRVFOQl9PRkY7Ci0gICAgcGFyYW1zLkVRTkJfTkJhbmRzICAgICAgICAgICAgPSBGSVZFQkFORF9OVU1CQU5EUzsKLSAgICBwYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb24gICA9ICZCYW5kRGVmc1swXTsKKyAgICBwYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT0ZGOworICAgIHBhcmFtcy5FUU5CX05CYW5kcyA9IEZJVkVCQU5EX05VTUJBTkRTOworICAgIHBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKIAotICAgIGZvciAoaW50IGk9MDsgaTxGSVZFQkFORF9OVU1CQU5EUzsgaSsrKQotICAgIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKLSAgICAgICAgQmFuZERlZnNbaV0uUUZhY3RvciAgID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKLSAgICAgICAgQmFuZERlZnNbaV0uR2FpbiAgICAgID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uR2FpbiA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKICAgICB9CiAKICAgICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlZDX0VmZmVjdExldmVsICAgICAgICAgPSAwOwotICAgIHBhcmFtcy5WQ19CYWxhbmNlICAgICAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuVkNfRWZmZWN0TGV2ZWwgPSAwOworICAgIHBhcmFtcy5WQ19CYWxhbmNlID0gMDsKIAogICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlRFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fVEVfT0ZGOwotICAgIHBhcmFtcy5URV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgICAgcGFyYW1zLlRFX0VmZmVjdExldmVsID0gMDsKIAogICAgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMuUFNBX0VuYWJsZSAgICAgICAgICAgICA9IExWTV9QU0FfT0ZGOwotICAgIHBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSAgICAgID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOworICAgIHBhcmFtcy5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOwogCiAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT0ZGOwotICAgIHBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKLSAgICBwYXJhbXMuQkVfQ2VudHJlRnJlcSAgICAgICAgICA9IExWTV9CRV9DRU5UUkVfOTBIejsKLSAgICBwYXJhbXMuQkVfSFBGICAgICAgICAgICAgICAgICA9IExWTV9CRV9IUEZfT047CisgICAgcGFyYW1zLkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT0ZGOworICAgIHBhcmFtcy5CRV9FZmZlY3RMZXZlbCA9IDA7CisgICAgcGFyYW1zLkJFX0NlbnRyZUZyZXEgPSBMVk1fQkVfQ0VOVFJFXzkwSHo7CisgICAgcGFyYW1zLkJFX0hQRiA9IExWTV9CRV9IUEZfT047CiAKICAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgICAgPSBMVk1fUFNBX09GRjsKLSAgICBwYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgICAgICA9IExWTV9QU0FfU1BFRURfTUVESVVNOworICAgIHBhcmFtcy5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CiAKICAgICAvKiBURSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9URV9PRkY7Ci0gICAgcGFyYW1zLlRFX0VmZmVjdExldmVsICAgICAgICAgPSAwOworICAgIHBhcmFtcy5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgICBwYXJhbXMuVEVfRWZmZWN0TGV2ZWwgPSAwOwogCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIHBhcmFtcy5OckNoYW5uZWxzICAgICAgICAgICAgID0KLSAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7Ci0gICAgcGFyYW1zLkNoTWFzayAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0jZW5kaWYKKyAgICBwYXJhbXMuTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgIHBhcmFtcy5DaE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmcGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKICAgICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KLSAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ICAgICAgICAgID0gMjA7Ci0gICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0hpZ2ggICAgICAgICA9IDQ5OTk7Ci0gICAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDA7Ci0gICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyAgICAgICAgICA9IDUwMDA7Ci0gICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggICAgICAgICA9IDI0MDAwOwotICAgIEhlYWRyb29tQmFuZERlZlsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSAwOwotICAgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gICAgPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICAgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9Mb3cgPSAyMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfSGlnaCA9IDQ5OTk7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCA9IDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyA9IDUwMDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggPSAyNDAwMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgICBIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uID0gJkhlYWRyb29tQmFuZERlZlswXTsKICAgICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOwotICAgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzICAgICAgICAgPSAyOworICAgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKIAotICAgIEx2bVN0YXR1cyA9IExWTV9TZXRIZWFkcm9vbVBhcmFtcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIZWFkcm9vbVBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0SGVhZHJvb21QYXJhbXMiLCAiTHZtQnVuZGxlX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldEhlYWRyb29tUGFyYW1zXG4iKTsKKyAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CiAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CiAgICAgcmV0dXJuIDA7Ci19ICAgLyogZW5kIEx2bUJ1bmRsZV9pbml0ICovCit9IC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEx2bUJ1bmRsZV9wcm9jZXNzKCkKQEAgLTcxOSwyNSArNjI4LDIyIEBACiAvLyAgcE91dDogICAgICAgcG9pbnRlciB0byB1cGRhdGVkIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBMdm1CdW5kbGVfcHJvY2VzcyhlZmZlY3RfYnVmZmVyX3QgICpwSW4sCi0gICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2J1ZmZlcl90ICAqcE91dCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCAgICAqcENvbnRleHQpewotCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgZWZmZWN0X2J1ZmZlcl90ICAgICAgICAgKnBPdXRUbXA7CitpbnQgTHZtQnVuZGxlX3Byb2Nlc3MoZWZmZWN0X2J1ZmZlcl90KiBwSW4sIGVmZmVjdF9idWZmZXJfdCogcE91dCwgaW50IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIGVmZmVjdF9idWZmZXJfdCogcE91dFRtcDsKICAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAotICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFKXsKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSkgewogICAgICAgICBwT3V0VG1wID0gcE91dDsKLSAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgIT0gZnJhbWVDb3VudCkgewogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90KiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBOckNoYW5uZWxzKTsKICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgICAgIH0KQEAgLTc0OSw3ICs2NTUsNiBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLQogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCkBAIC03NTcsMTYgKzY2MiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lQ291bnQsICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotCi0gICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBOckNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgIHBPdXRbaV0gPSBwT3V0W2ldICsgcE91dFRtcFtpXTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIEx2bUJ1bmRsZV9wcm9jZXNzICovCit9IC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcygpCkBAIC03NzksMjkgKzY4MywyOCBAQAogLy8gT3V0cHV0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgRXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KSB7Ci0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwordm9pZCBFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyIpCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zIGp1c3QgR290IC0+ICVkXG4iLAorICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyBqdXN0IEdvdCAtPiAlZFxuIiwKICAgICAvLyAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07Ci0gICAgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOwotICAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV07Ci0gICAgICAgfQorICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV07CisgICAgfQogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyIpCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMganVzdCBTZXQgLT4gJWRcbiIsCisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zIGp1c3QgU2V0IC0+ICVkXG4iLAogICAgIC8vICAgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltiYW5kXS5HYWluKTsKLQogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTgxNiwxOSArNzE5LDE5IEBACiAvLyBPdXRwdXRzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBMdm1FZmZlY3RfbGltaXRMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgewotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KK3ZvaWQgTHZtRWZmZWN0X2xpbWl0TGV2ZWwoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9saW1pdExldmVsIikKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIGp1c3QgR290IC0+ICVkXG4iLAorICAgIC8vIEFMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2xpbWl0TGV2ZWwganVzdCBHb3QgLT4gJWRcbiIsCiAgICAgLy8gICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4pOwogCiAgICAgaW50IGdhaW5Db3JyZWN0aW9uID0gMDsKLSAgICAvL0NvdW50IHRoZSBlbmVyZ3kgY29udHJpYnV0aW9uIHBlciBiYW5kIGZvciBFUSBhbmQgQmFzc0Jvb3N0IG9ubHkgaWYgdGhleSBhcmUgYWN0aXZlLgorICAgIC8vIENvdW50IHRoZSBlbmVyZ3kgY29udHJpYnV0aW9uIHBlciBiYW5kIGZvciBFUSBhbmQgQmFzc0Jvb3N0IG9ubHkgaWYgdGhleSBhcmUgYWN0aXZlLgogICAgIGZsb2F0IGVuZXJneUNvbnRyaWJ1dGlvbiA9IDA7CiAgICAgZmxvYXQgZW5lcmd5Q3Jvc3MgPSAwOwogICAgIGZsb2F0IGVuZXJneUJhc3NCb29zdCA9IDA7CkBAIC04MzgsODggKzc0MSw4MyBAQAogICAgIGJvb2wgYmJFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFOwogICAgIGJvb2wgdmlFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRTsKIAotICAgIC8vRVEgY29udHJpYnV0aW9uCisgICAgLy8gRVEgY29udHJpYnV0aW9uCiAgICAgaWYgKGVxRW5hYmxlZCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldLzE1LjA7CisgICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSAvIDE1LjA7CiAgICAgICAgICAgICBmbG9hdCBiYW5kQ29lZmZpY2llbnQgPSBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb2VmZmljaWVudFtpXTsKICAgICAgICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSBiYW5kRmFjdG9yICogYmFuZENvZWZmaWNpZW50ICogYmFuZENvZWZmaWNpZW50OwotICAgICAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKQotICAgICAgICAgICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBiYW5kRW5lcmd5OworICAgICAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKSBlbmVyZ3lDb250cmlidXRpb24gKz0gYmFuZEVuZXJneTsKICAgICAgICAgfQogCi0gICAgICAgIC8vY3Jvc3MgRVEgY29lZmZpY2llbnRzCisgICAgICAgIC8vIGNyb3NzIEVRIGNvZWZmaWNpZW50cwogICAgICAgICBmbG9hdCBiYW5kRmFjdG9yU3VtID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUy0xOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IxID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXS8xNS4wOwotICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvcjIgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2krMV0vMTUuMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUyAtIDE7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvcjEgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldIC8gMTUuMDsKKyAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IyID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpICsgMV0gLyAxNS4wOwogCiAgICAgICAgICAgICBpZiAoYmFuZEZhY3RvcjEgPiAwICYmIGJhbmRGYWN0b3IyID4gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0IGNyb3NzRW5lcmd5ID0gYmFuZEZhY3RvcjEgKiBiYW5kRmFjdG9yMiAqCi0gICAgICAgICAgICAgICAgICAgICAgICBMaW1pdExldmVsX2JhbmRFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W2ldOworICAgICAgICAgICAgICAgIGZsb2F0IGNyb3NzRW5lcmd5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRGYWN0b3IxICogYmFuZEZhY3RvcjIgKiBMaW1pdExldmVsX2JhbmRFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W2ldOwogICAgICAgICAgICAgICAgIGJhbmRGYWN0b3JTdW0gKz0gYmFuZEZhY3RvcjEgKiBiYW5kRmFjdG9yMjsKIAotICAgICAgICAgICAgICAgIGlmIChjcm9zc0VuZXJneSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVuZXJneUNyb3NzICs9IGNyb3NzRW5lcmd5OworICAgICAgICAgICAgICAgIGlmIChjcm9zc0VuZXJneSA+IDApIGVuZXJneUNyb3NzICs9IGNyb3NzRW5lcmd5OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJhbmRGYWN0b3JTdW0gLT0gMS4wOwotICAgICAgICBpZiAoYmFuZEZhY3RvclN1bSA+IDApCi0gICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uID0gYmFuZEZhY3RvclN1bSAqIDAuNzsKKyAgICAgICAgaWYgKGJhbmRGYWN0b3JTdW0gPiAwKSBjcm9zc0NvcnJlY3Rpb24gPSBiYW5kRmFjdG9yU3VtICogMC43OwogICAgIH0KIAotICAgIC8vQmFzc0Jvb3N0IGNvbnRyaWJ1dGlvbgorICAgIC8vIEJhc3NCb29zdCBjb250cmlidXRpb24KICAgICBpZiAoYmJFbmFibGVkKSB7Ci0gICAgICAgIGZsb2F0IGJvb3N0RmFjdG9yID0gKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKS8xMDAwLjA7CisgICAgICAgIGZsb2F0IGJvb3N0RmFjdG9yID0gKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKSAvIDEwMDAuMDsKICAgICAgICAgZmxvYXQgYm9vc3RDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29lZmZpY2llbnQ7CiAKICAgICAgICAgZW5lcmd5Q29udHJpYnV0aW9uICs9IGJvb3N0RmFjdG9yICogYm9vc3RDb2VmZmljaWVudCAqIGJvb3N0Q29lZmZpY2llbnQ7CiAKICAgICAgICAgaWYgKGVxRW5hYmxlZCkgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0vMTUuMDsKKyAgICAgICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSAvIDE1LjA7CiAgICAgICAgICAgICAgICAgZmxvYXQgYmFuZENyb3NzQ29lZmZpY2llbnQgPSBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNyb3NzQ29lZmZpY2llbnRbaV07Ci0gICAgICAgICAgICAgICAgZmxvYXQgYmFuZEVuZXJneSA9IGJvb3N0RmFjdG9yICogYmFuZEZhY3RvciAqCi0gICAgICAgICAgICAgICAgICAgIGJhbmRDcm9zc0NvZWZmaWNpZW50OwotICAgICAgICAgICAgICAgIGlmIChiYW5kRW5lcmd5ID4gMCkKLSAgICAgICAgICAgICAgICAgIGVuZXJneUJhc3NCb29zdCArPSBiYW5kRW5lcmd5OworICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSBib29zdEZhY3RvciAqIGJhbmRGYWN0b3IgKiBiYW5kQ3Jvc3NDb2VmZmljaWVudDsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZEVuZXJneSA+IDApIGVuZXJneUJhc3NCb29zdCArPSBiYW5kRW5lcmd5OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgLy9WaXJ0dWFsaXplciBjb250cmlidXRpb24KKyAgICAvLyBWaXJ0dWFsaXplciBjb250cmlidXRpb24KICAgICBpZiAodmlFbmFibGVkKSB7Ci0gICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uICoKLSAgICAgICAgICAgICAgICBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uOworICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0KKyAgICAgICAgICAgICAgICBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uICogTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbjsKICAgICB9CiAKLSAgICBkb3VibGUgdG90YWxFbmVyZ3lFc3RpbWF0aW9uID0gc3FydChlbmVyZ3lDb250cmlidXRpb24gKyBlbmVyZ3lDcm9zcyArIGVuZXJneUJhc3NCb29zdCkgLQotICAgICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uOworICAgIGRvdWJsZSB0b3RhbEVuZXJneUVzdGltYXRpb24gPQorICAgICAgICAgICAgc3FydChlbmVyZ3lDb250cmlidXRpb24gKyBlbmVyZ3lDcm9zcyArIGVuZXJneUJhc3NCb29zdCkgLSBjcm9zc0NvcnJlY3Rpb247CiAgICAgQUxPR1YoIiBUT1RBTCBlbmVyZ3kgZXN0aW1hdGlvbjogJTAuMmYgZEIiLCB0b3RhbEVuZXJneUVzdGltYXRpb24pOwogCi0gICAgLy9yb3VuZG9mZgorICAgIC8vIHJvdW5kb2ZmCiAgICAgaW50IG1heExldmVsUm91bmQgPSAoaW50KSh0b3RhbEVuZXJneUVzdGltYXRpb24gKyAwLjk5KTsKICAgICBpZiAobWF4TGV2ZWxSb3VuZCArIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA+IDApIHsKICAgICAgICAgZ2FpbkNvcnJlY3Rpb24gPSBtYXhMZXZlbFJvdW5kICsgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lOwogICAgIH0KIAotICAgIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCAgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgLSBnYWluQ29ycmVjdGlvbjsKKyAgICBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgLSBnYWluQ29ycmVjdGlvbjsKICAgICBpZiAoQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsIDwgLTk2KSB7CiAgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCA9IC05NjsKICAgICB9CiAgICAgQUxPR1YoIlx0Vm9sOiVkLCBHYWluQ29ycmVjdGlvbjogJWQsIEFjdHVhbCB2b2w6ICVkIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lLAotICAgICAgICAgICAgZ2FpbkNvcnJlY3Rpb24sIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCk7CisgICAgICAgICAgZ2FpbkNvcnJlY3Rpb24sIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCk7CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2xpbWl0TGV2ZWwiKQogCiAgICAgQUxPR1YoIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyByZXR1cm46JWQiLCAoaW50KUx2bVN0YXR1cyk7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBqdXN0IFNldCAtPiAlZFxuIiwKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBqdXN0IFNldCAtPiAlZFxuIiwKICAgICAvLyAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7CiAKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIGp1c3Qgc2V0ICgtOTZkQiAtPiAwZEIpIC0+ICVkXG4iLEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCApOwotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9PSBMVk1fVFJVRSl7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2xpbWl0TGV2ZWwganVzdCBzZXQgKC05NmRCIC0+IDBkQikgLT4gJWRcbiIsQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICk7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID09IExWTV9UUlVFKSB7CiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKICAgICAgICAgQUxPR1YoIlx0TFZNX1ZPTFVNRTogRGlzYWJsaW5nIFNtb290aGluZyBmb3IgZmlyc3Qgdm9sdW1lIGNoYW5nZSB0byByZW1vdmUgc3Bpa2VzL2NsaWNrcyIpOwpAQCAtOTM5LDQyICs4MzcsNDEgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEx2bUVmZmVjdF9lbmFibGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBzdGFydCIpOworaW50IEx2bUVmZmVjdF9lbmFibGUoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIHN0YXJ0Iik7CiAKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2VuYWJsZSIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX0JBU1NfQk9PU1QiKTsKLSAgICAgICAgQWN0aXZlUGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT047CisgICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09OOwogICAgIH0KLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fVklSVFVBTElaRVIiKTsKLSAgICAgICAgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAgID0gTFZNX01PREVfT047CisgICAgICAgIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fRVFVQUxJWkVSIik7Ci0gICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICAgID0gTFZNX0VRTkJfT047CisgICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgPSBMVk1fRVFOQl9PTjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fVk9MVU1FIik7CiAgICAgfQogCiAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfZW5hYmxlIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIGVuZCIpOwogICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTk5MSw4MiArODg4LDQ1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBMdm1FZmZlY3RfZGlzYWJsZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBzdGFydCIpOworaW50IEx2bUVmZmVjdF9kaXNhYmxlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgc3RhcnQiKTsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2Rpc2FibGUiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSA6IERpc2FibGluZyBMVk1fQkFTU19CT09TVCIpOwotICAgICAgICBBY3RpdmVQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9CRV9PRkY7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09GRjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSA6IERpc2FibGluZyBMVk1fVklSVFVBTElaRVIiKTsKLSAgICAgICAgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAgID0gTFZNX01PREVfT0ZGOworICAgICAgICBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOwogICAgIH0KLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgOiBEaXNhYmxpbmcgTFZNX0VRVUFMSVpFUiIpOwotICAgICAgICBBY3RpdmVQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlICAgICA9IExWTV9FUU5CX09GRjsKKyAgICAgICAgQWN0aXZlUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9IExWTV9FUU5CX09GRjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIDogRGlzYWJsaW5nIExWTV9WT0xVTUUiKTsKICAgICB9CiAKICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9kaXNhYmxlIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBlbmQiKTsKICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTHZtRWZmZWN0X2ZyZWUoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQdXJwb3NlOiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBCdW5kbGUuCi0vLwotLy8gSW5wdXRzOgotLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAotLy8KLS8vIE91dHB1dHM6Ci0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTHZtRWZmZWN0X2ZyZWUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpewotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgIE1lbVRhYjsKLQotICAgIC8qIEZyZWUgdGhlIGFsZ29yaXRobSBtZW1vcnkgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0KLSAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUVmZmVjdF9mcmVlIikKLQotICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7Ci0gICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7Ci0gICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ICAgIC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdF9zZXRDb25maWcoKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBQdXJwb3NlOiBTZXQgaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uLgpAQCAtMTA4MCw5ICs5NDAsOSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgRWZmZWN0X3NldENvbmZpZyhFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKXsKLSAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlOwotICAgIC8vQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBzdGFydCIpOworaW50IEVmZmVjdF9zZXRDb25maWcoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZykgeworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOworICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgc3RhcnQiKTsKIAogICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKICAgICBDSEVDS19BUkcocENvbmZpZyAhPSBOVUxMKTsKQEAgLTEwOTAsMTA3ICs5NTAsOTMgQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgIENIRUNLX0FSRyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIDw9IExWTV9NQVhfQ0hBTk5FTFMpOwotI2Vsc2UKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKLSNlbmRpZgotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQotICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgfHwKKyAgICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgcENvbnRleHQtPmNvbmZpZyA9ICpwQ29uZmlnOwogICAgIGNvbnN0IExWTV9JTlQxNiBOckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAogICAgIHN3aXRjaCAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKSB7Ci0gICAgY2FzZSA4MDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzgwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4MDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4ODIwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDg4MjAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzY0MDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTc2NDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOTIwMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTkyMDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgY2FzZSA4MDAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDgwMDAgKiBOckNoYW5uZWxzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTYwMDA6CisgICAgICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwICogTnJDaGFubmVsczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIyMDUwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCAqIE5yQ2hhbm5lbHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMjAwMDoKKyAgICAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMzIwMDA7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMzIwMDAgKiBOckNoYW5uZWxzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDQxMDA6CisgICAgICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwICogTnJDaGFubmVsczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ4MDAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODgyMDAgKiBOckNoYW5uZWxzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOTYwMDA6CisgICAgICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwICogTnJDaGFubmVsczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3NjQwMDoKKyAgICAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE3NjQwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOTIwMDA6CisgICAgICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxOTIwMDAgKiBOckNoYW5uZWxzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIGludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCIsIHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSB8fAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgIT0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIHsKLSNlbHNlCi0gICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSAhPSBTYW1wbGVSYXRlKXsKLSNlbmRpZgotCi0gICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsKLSAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7CisgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOworICAgICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOwogCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgY2hhbmdlIHNhbXBsaW5nIHJhdGUgdG8gJWQiLCBTYW1wbGVSYXRlKTsKIAogICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X3NldENvbmZpZyIpCi0gICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCiAgICAgICAgIEFjdGl2ZVBhcmFtcy5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgQWN0aXZlUGFyYW1zLk5yQ2hhbm5lbHMgPSBOckNoYW5uZWxzOwogICAgICAgICBBY3RpdmVQYXJhbXMuQ2hNYXNrID0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHM7Ci0jZW5kaWYKIAogICAgICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVmZmVjdF9zZXRDb25maWciKQotICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgPSBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVsczsKLSNlbmRpZgogCiAgICAgICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKIAotICAgIH1lbHNlewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcga2VlcCBzYW1wbGluZyByYXRlIGF0ICVkIiwgU2FtcGxlUmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBrZWVwIHNhbXBsaW5nIHJhdGUgYXQgJWQiLCBTYW1wbGVSYXRlKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgRW5kLi4uLiIpOworICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgRW5kLi4uLiIpOwogICAgIHJldHVybiAwOwotfSAgIC8qIGVuZCBFZmZlY3Rfc2V0Q29uZmlnICovCit9IC8qIGVuZCBFZmZlY3Rfc2V0Q29uZmlnICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRWZmZWN0X2dldENvbmZpZygpCkBAIC0xMjA2LDEwICsxMDUyLDkgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBFZmZlY3RfZ2V0Q29uZmlnKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpCi17Cit2b2lkIEVmZmVjdF9nZXRDb25maWcoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZykgewogICAgICpwQ29uZmlnID0gcENvbnRleHQtPmNvbmZpZzsKLX0gICAvKiBlbmQgRWZmZWN0X2dldENvbmZpZyAqLworfSAvKiBlbmQgRWZmZWN0X2dldENvbmZpZyAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEJhc3NHZXRTdHJlbmd0aCgpCkBAIC0xMjI1LDMyICsxMDcwLDMxIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXVpbnQzMl90IEJhc3NHZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRCYXNzR2V0U3RyZW5ndGgoKSAoMC0xMDAwKSAtPiAlZFxuIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpOwordWludDMyX3QgQmFzc0dldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTAwMCkgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKTsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc0dldFN0cmVuZ3RoIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRCYXNzR2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCiAgICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RyZW5ndGggcmV0dXJuZWQgbWF0Y2hlcyB0aGUgc3RyZW5ndGggdGhhdCB3YXMgc2V0IGVhcmxpZXIgKi8KLSAgICBpZihBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgIT0KLSAgICAgICAoTFZNX0lOVDE2KSgoMTUqcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpLzEwMDApKXsKKyAgICBpZiAoQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsICE9CisgICAgICAgIChMVk1fSU5UMTYpKCgxNSAqIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKSAvIDEwMDApKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NHZXRTdHJlbmd0aCBtb2R1bGUgc3RyZW5ndGggZG9lcyBub3QgbWF0Y2ggc2F2ZWRTdHJlbmd0aCAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKTsKKyAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOwotICAgIC8vQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKHNhdmVkKSAgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkICk7CisgICAgLy8gQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOworICAgIC8vIEFMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpIChzYXZlZCkgIC0+ICVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCApOwogICAgIHJldHVybiBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZDsKLX0gICAgLyogZW5kIEJhc3NHZXRTdHJlbmd0aCAqLworfSAvKiBlbmQgQmFzc0dldFN0cmVuZ3RoICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQmFzc1NldFN0cmVuZ3RoKCkKQEAgLTEyNjQsMzUgKzExMDgsMzQgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBCYXNzU2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IHN0cmVuZ3RoKXsKLSAgICAvL0FMT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCglZCkiLCBzdHJlbmd0aCk7Cit2b2lkIEJhc3NTZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3Qgc3RyZW5ndGgpIHsKKyAgICAvLyBBTE9HVigiXHRCYXNzU2V0U3RyZW5ndGgoJWQpIiwgc3RyZW5ndGgpOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAoaW50KXN0cmVuZ3RoOwogCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJCYXNzU2V0U3RyZW5ndGgiKQotICAgIC8vQUxPR1YoIlx0QmFzc1NldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRCYXNzU2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKIAogICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLwotICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgICA9IChMVk1fSU5UMTYpKCgxNSpzdHJlbmd0aCkvMTAwMCk7Ci0gICAgQWN0aXZlUGFyYW1zLkJFX0NlbnRyZUZyZXEgICAgID0gTFZNX0JFX0NFTlRSRV85MEh6OworICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCA9IChMVk1fSU5UMTYpKCgxNSAqIHN0cmVuZ3RoKSAvIDEwMDApOworICAgIEFjdGl2ZVBhcmFtcy5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OwogCi0gICAgLy9BTE9HVigiXHRCYXNzU2V0U3RyZW5ndGgoKSAoMC0xNSkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsICk7CisgICAgLy8gQUxPR1YoIlx0QmFzc1NldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc1NldFN0cmVuZ3RoIikKLSAgICAvL0FMT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRCYXNzU2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCiAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwotfSAgICAvKiBlbmQgQmFzc1NldFN0cmVuZ3RoICovCit9IC8qIGVuZCBCYXNzU2V0U3RyZW5ndGggKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWaXJ0dWFsaXplckdldFN0cmVuZ3RoKCkKQEAgLTEzMDgsMjEgKzExNTEsMjMgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdWludDMyX3QgVmlydHVhbGl6ZXJHZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoICgwLTEwMDApIC0+ICVkXG4iLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkKTsKK3VpbnQzMl90IFZpcnR1YWxpemVyR2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoICgwLTEwMDApIC0+CisgICAgLy8gJWRcbiIscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQpOwogCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZpcnR1YWxpemVyR2V0U3RyZW5ndGgiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyR2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJHZXRTdHJlbmd0aCgpICgwLTEwMCkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwqMTApOworICAgIC8vIEFMT0dWKCJcdFZpcnR1YWxpemVyR2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoKCkgKDAtMTAwKSAgIC0+ICVkXG4iLAorICAgIC8vIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsKjEwKTsKICAgICByZXR1cm4gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQ7Ci19ICAgIC8qIGVuZCBnZXRTdHJlbmd0aCAqLworfSAvKiBlbmQgZ2V0U3RyZW5ndGggKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkKQEAgLTEzMzYsMzEgKzExODEsMzEgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBzdHJlbmd0aCl7Ci0gICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCVkKSIsIHN0cmVuZ3RoKTsKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCit2b2lkIFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHN0cmVuZ3RoKSB7CisgICAgLy8gQUxPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCglZCkiLCBzdHJlbmd0aCk7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgPSAoaW50KXN0cmVuZ3RoOwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVmlydHVhbGl6ZXJTZXRTdHJlbmd0aCIpCi0gICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKICAgICAvKiBWaXJ0dWFsaXplciBwYXJhbWV0ZXJzICovCi0gICAgQWN0aXZlUGFyYW1zLkNTX0VmZmVjdExldmVsICAgICAgICAgICAgID0gKGludCkoKHN0cmVuZ3RoKjMyNzY3KS8xMDAwKTsKKyAgICBBY3RpdmVQYXJhbXMuQ1NfRWZmZWN0TGV2ZWwgPSAoaW50KSgoc3RyZW5ndGggKiAzMjc2NykgLyAxMDAwKTsKIAotICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoKSAoMC0xMDAwKSAgIC0+ICVkXG4iLCBzdHJlbmd0aCApOwotICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoKSAoMC0gMTAwKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQ1NfRWZmZWN0TGV2ZWwgKTsKKyAgICBBTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkgKDAtMTAwMCkgICAtPiAlZFxuIiwgc3RyZW5ndGgpOworICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoKSAoMC0gMTAwKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQ1NfRWZmZWN0TGV2ZWwpOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZpcnR1YWxpemVyU2V0U3RyZW5ndGgiKQotICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG5cbiIpOworICAgIC8vIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcblxuIik7CiAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwotfSAgICAvKiBlbmQgc2V0U3RyZW5ndGggKi8KK30gLyogZW5kIHNldFN0cmVuZ3RoICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZCgpCkBAIC0xMzc2LDE0ICsxMjIxLDE0IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGludCBWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSB7CiAgICAgc3dpdGNoIChkZXZpY2VUeXBlKSB7Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6Ci0gICAgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6ICAvLyBGb3IgVVNCIHRlc3Rpbmcgb2YgdGhlIHZpcnR1YWxpemVyIG9ubHkuCi0gICAgICAgIHJldHVybiAwOwotICAgIGRlZmF1bHQgOgotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CisgICAgICAgICAgICAvLyBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTogIC8vIEZvciBVU0IgdGVzdGluZyBvZiB0aGUgdmlydHVhbGl6ZXIgb25seS4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogfQogCkBAIC0xNDAxLDkgKzEyNDYsOSBAQAogLy8gIDAgICAgICAgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaW50IFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSB7CiAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKLSAgICBpZiAoY2hhbm5lbENvdW50IDwgMSB8fCBjaGFubmVsQ291bnQgPiBGQ0NfMikgeyAvLyBUT0RPOiB1cGRhdGUgdG8gOCBjaGFubmVscyB3aGVuIHN1cHBvcnRlZC4KKyAgICBpZiAoY2hhbm5lbENvdW50IDwgMSB8fCBjaGFubmVsQ291bnQgPiBGQ0NfMikgeyAgLy8gVE9ETzogdXBkYXRlIHRvIDggY2hhbm5lbHMgd2hlbiBzdXBwb3J0ZWQuCiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICByZXR1cm4gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2VUeXBlKTsKQEAgLTE0MjMsMTYgKzEyNjgsMTYgQEAKIC8vICAwICAgICAgICAgICAgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgYW5kIHRoZSB2aXJ0dWFsaXphdGlvbiBtb2RlIGZvcmNlZAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UpIHsKK2ludCBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlKSB7CiAgICAgQUxPR1YoIlZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGU6IGZvcmNlZERldj0weCV4IGVuYWJsZWQ9JWQgdG1wRGlzYWJsZWQ9JWQiLAotICAgICAgICAgICAgZm9yY2VkRGV2aWNlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKKyAgICAgICAgICBmb3JjZWREZXZpY2UsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQsCisgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBib29sIHVzZVZpcnR1YWxpemVyID0gZmFsc2U7CiAKICAgICBpZiAoVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChmb3JjZWREZXZpY2UpICE9IDApIHsKICAgICAgICAgaWYgKGZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgLy9mb3JjZWQgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQsIG1ha2UgaXQgYmVoYXZlIGFzIGEgcmVzZXQgb2YgZm9yY2VkIG1vZGUKKyAgICAgICAgICAgIC8vIGZvcmNlZCBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCwgbWFrZSBpdCBiZWhhdmUgYXMgYSByZXNldCBvZiBmb3JjZWQgbW9kZQogICAgICAgICAgICAgZm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgICAgICAvLyBidXQgcmV0dXJuIGFuIGVycm9yCiAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwpAQCAtMTQ3Miw4ICsxMzE3LDggQEAKICAgICB9CiAKICAgICBBTE9HVigiXHRhZnRlciBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlOiBlbmFibGVkPSVkIHRtcERpc2FibGVkPSVkIiwKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQsCi0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQpOworICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQsCisgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKIAogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0xNDk5LDIzICsxMzQ0LDIzIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgX191bnVzZWQsIGludDMyX3QgKnBTcGVha2VyQW5nbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSBfX3VudXNlZCwgaW50MzJfdCogcFNwZWFrZXJBbmdsZXMpIHsKICAgICAvLyB0aGUgY2hhbm5lbCBjb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIDEgb3IgMgogICAgIC8vIHRoZSBkZXZpY2UgaXMgZ3VhcmFudGVlZCB0byBiZSBvZiB0eXBlIGhlYWRwaG9uZQogICAgIC8vIHRoaXMgdmlydHVhbGl6ZXIgaXMgYWx3YXlzIHVzaW5nIDIgdmlydHVhbCBzcGVha2VycyBhdCAtOTAgYW5kIDkwZGVnIG9mIGF6aW11dGgsIDBkZWcgb2YKICAgICAvLyBlbGV2YXRpb24gYnV0IHRoZSByZXR1cm4gaW5mb3JtYXRpb24gaXMgc2l6ZWQgZm9yIG5iQ2hhbm5lbHMgKiAzLCBzbyB3ZSBoYXZlIHRvIGNvbnNpZGVyCiAgICAgLy8gdGhlIChmYWxzZSBoZXJlKSBjYXNlIG9mIGEgc2luZ2xlIGNoYW5uZWwsIGFuZCByZXR1cm4gb25seSAzIGZpZWxkcy4KICAgICBpZiAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA9PSAxKSB7Ci0gICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpIEFVRElPX0NIQU5ORUxfT1VUX01PTk87IC8vIHNhbWUgYXMgRlJPTlRfTEVGVAotICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDA7IC8vIGF6aW11dGgKLSAgICAgICAgKnBTcGVha2VyQW5nbGVzID0gMDsgLy8gZWxldmF0aW9uCisgICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsgIC8vIHNhbWUgYXMgRlJPTlRfTEVGVAorICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhemltdXRoCisgICAgICAgICpwU3BlYWtlckFuZ2xlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZXZhdGlvbgogICAgIH0gZWxzZSB7Ci0gICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQ7Ci0gICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gLTkwOyAvLyBhemltdXRoCi0gICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gMDsgICAvLyBlbGV2YXRpb24KLSAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdCkgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQ7CisgICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVDsKKyAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAtOTA7ICAvLyBhemltdXRoCisgICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gMDsgICAgLy8gZWxldmF0aW9uCisgICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQ7CiAgICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gOTA7ICAvLyBhemltdXRoCi0gICAgICAgICpwU3BlYWtlckFuZ2xlcyAgID0gMDsgICAvLyBlbGV2YXRpb24KKyAgICAgICAgKnBTcGVha2VyQW5nbGVzID0gMDsgICAgIC8vIGVsZXZhdGlvbgogICAgIH0KIH0KIApAQCAtMTUyOSwxMCArMTM3NCwxMCBAQAogLy8gICBBVURJT19ERVZJQ0VfTk9ORSBpZiB0aGUgZWZmZWN0IGlzIG5vdCB2aXJ0dWFsaXppbmcKIC8vICAgb3IgdGhlIGRldmljZSB0eXBlIGlmIHRoZSBlZmZlY3QgaXMgdmlydHVhbGl6aW5nCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWF1ZGlvX2RldmljZXNfdCBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgeworYXVkaW9fZGV2aWNlc190IFZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CiAgICAgYXVkaW9fZGV2aWNlc190IHZpcnREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpCi0gICAgICAgICAgICAmJiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID09IExWTV9GQUxTRSkpIHsKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpICYmCisgICAgICAgIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX0ZBTFNFKSkgewogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgICAgICAvLyB2aXJ0dWFsaXphdGlvbiBtb2RlIGlzIGZvcmNlZCwgcmV0dXJuIHRoYXQgZGV2aWNlCiAgICAgICAgICAgICB2aXJ0RGV2aWNlID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlOwpAQCAtMTU1Nyw4ICsxNDAyLDggQEAKIC8vIE91dHB1dHM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldEJhbmRMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBiYW5kKXsKLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplckdldEJhbmRMZXZlbCAtPiAlZFxuIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltiYW5kXSApOworaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGludDMyX3QgYmFuZCkgeworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplckdldEJhbmRMZXZlbCAtPiAlZFxuIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltiYW5kXSApOwogICAgIHJldHVybiBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2JhbmRdICogMTAwOwogfQogCkBAIC0xNTc2LDE0ICsxNDIxLDE0IEBACiAvLyBPdXRwdXRzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIEVxdWFsaXplclNldEJhbmRMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50IGJhbmQsIHNob3J0IEdhaW4pewordm9pZCBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGludCBiYW5kLCBzaG9ydCBHYWluKSB7CiAgICAgaW50IGdhaW5Sb3VuZGVkOwotICAgIGlmKEdhaW4gPiAwKXsKLSAgICAgICAgZ2FpblJvdW5kZWQgPSAoaW50KSgoR2Fpbis1MCkvMTAwKTsKLSAgICB9ZWxzZXsKLSAgICAgICAgZ2FpblJvdW5kZWQgPSAoaW50KSgoR2Fpbi01MCkvMTAwKTsKKyAgICBpZiAoR2FpbiA+IDApIHsKKyAgICAgICAgZ2FpblJvdW5kZWQgPSAoaW50KSgoR2FpbiArIDUwKSAvIDEwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2FpblJvdW5kZWQgPSAoaW50KSgoR2FpbiAtIDUwKSAvIDEwMCk7CiAgICAgfQotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyU2V0QmFuZExldmVsKCVkKS0+KCVkKSIsIEdhaW4sIGdhaW5Sb3VuZGVkKTsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwoJWQpLT4oJWQpIiwgR2FpbiwgZ2FpblJvdW5kZWQpOwogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbYmFuZF0gPSBnYWluUm91bmRlZDsKICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOwogCkBAIC0xNjAzLDIzICsxNDQ4LDIyIEBACiAvLyBPdXRwdXRzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50MzJfdCBFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3koRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgYmFuZCl7Ci0gICAgaW50MzJfdCBGcmVxdWVuY3kgPTA7CitpbnQzMl90IEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgaW50MzJfdCBiYW5kKSB7CisgICAgaW50MzJfdCBGcmVxdWVuY3kgPSAwOwogCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKkJhbmREZWY7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCogQmFuZERlZjsKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5IikKIAotICAgIEJhbmREZWYgICA9IEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbjsKLSAgICBGcmVxdWVuY3kgPSAoaW50MzJfdClCYW5kRGVmW2JhbmRdLkZyZXF1ZW5jeSoxMDAwOyAgICAgLy8gQ29udmVydCB0byBtaWxsaWJlbHMKKyAgICBCYW5kRGVmID0gQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOworICAgIEZyZXF1ZW5jeSA9IChpbnQzMl90KUJhbmREZWZbYmFuZF0uRnJlcXVlbmN5ICogMTAwMDsgIC8vIENvbnZlcnQgdG8gbWlsbGliZWxzCiAKLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSAtPiAlZFxuIiwgRnJlcXVlbmN5ICk7Ci0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSAtPiAlZFxuIiwgRnJlcXVlbmN5ICk7CisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5IFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAgICAgcmV0dXJuIEZyZXF1ZW5jeTsKIH0KIApAQCAtMTY0MSwxMCArMTQ4NSwxMCBAQAogLy8gIHBMb3c6ICAgICAgIGxvd2VyIGJhbmQgcmFuZ2UKIC8vICBwTG93OiAgICAgICB1cHBlciBiYW5kIHJhbmdlCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludDMyX3QgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCBfX3VudXNlZCwgaW50MzJfdCBiYW5kLCB1aW50MzJfdCAqcExvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcEhpKXsKK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCBfX3VudXNlZCwgaW50MzJfdCBiYW5kLCB1aW50MzJfdCogcExvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcEhpKSB7CiAgICAgKnBMb3cgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzBdOwotICAgICpwSGkgID0gYmFuZEZyZXFSYW5nZVtiYW5kXVsxXTsKKyAgICAqcEhpID0gYmFuZEZyZXFSYW5nZVtiYW5kXVsxXTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTY2NSwxNiArMTUwOSwxNiBAQAogLy8gIHBMb3c6ICAgICAgIGxvd2VyIGJhbmQgcmFuZ2UKIC8vICBwTG93OiAgICAgICB1cHBlciBiYW5kIHJhbmdlCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludDMyX3QgRXF1YWxpemVyR2V0QmFuZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCBfX3VudXNlZCwgdWludDMyX3QgdGFyZ2V0RnJlcSl7CitpbnQzMl90IEVxdWFsaXplckdldEJhbmQoRWZmZWN0Q29udGV4dCogcENvbnRleHQgX191bnVzZWQsIHVpbnQzMl90IHRhcmdldEZyZXEpIHsKICAgICBpbnQgYmFuZCA9IDA7CiAKLSAgICBpZih0YXJnZXRGcmVxIDwgYmFuZEZyZXFSYW5nZVswXVswXSl7CisgICAgaWYgKHRhcmdldEZyZXEgPCBiYW5kRnJlcVJhbmdlWzBdWzBdKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH1lbHNlIGlmKHRhcmdldEZyZXEgPT0gYmFuZEZyZXFSYW5nZVswXVswXSl7CisgICAgfSBlbHNlIGlmICh0YXJnZXRGcmVxID09IGJhbmRGcmVxUmFuZ2VbMF1bMF0pIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGZvcihpbnQgaT0wOyBpPEZJVkVCQU5EX05VTUJBTkRTO2krKyl7Ci0gICAgICAgIGlmKCh0YXJnZXRGcmVxID4gYmFuZEZyZXFSYW5nZVtpXVswXSkmJih0YXJnZXRGcmVxIDw9IGJhbmRGcmVxUmFuZ2VbaV1bMV0pKXsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgaWYgKCh0YXJnZXRGcmVxID4gYmFuZEZyZXFSYW5nZVtpXVswXSkgJiYgKHRhcmdldEZyZXEgPD0gYmFuZEZyZXFSYW5nZVtpXVsxXSkpIHsKICAgICAgICAgICAgIGJhbmQgPSBpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTY5NCw3ICsxNTM4LDcgQEAKIC8vICBwQ29udGV4dDogICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldFByZXNldChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CitpbnQzMl90IEVxdWFsaXplckdldFByZXNldChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCkgewogICAgIHJldHVybiBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQ7CiB9CiAKQEAgLTE3MTEsMTQgKzE1NTUsMTIgQEAKIC8vICBwcmVzZXQgICAgICAgVGhlIHByZXNldCBJRC4KIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgRXF1YWxpemVyU2V0UHJlc2V0KEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQgcHJlc2V0KXsKLQotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyU2V0UHJlc2V0KCVkKSIsIHByZXNldCk7Cit2b2lkIEVxdWFsaXplclNldFByZXNldChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgaW50IHByZXNldCkgeworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplclNldFByZXNldCglZCkiLCBwcmVzZXQpOwogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCA9IHByZXNldDsKIAotICAgIC8vQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOwotICAgIGZvciAoaW50IGk9MDsgaTxGSVZFQkFORF9OVU1CQU5EUzsgaSsrKQotICAgIHsKKyAgICAvLyBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPQogICAgICAgICAgICAgICAgIEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpICsgcHJlc2V0ICogRklWRUJBTkRfTlVNQkFORFNdOwogICAgIH0KQEAgLTE3MjYsMTEgKzE1NjgsMTEgQEAKICAgICBFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMocENvbnRleHQpOwogICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKIAotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyU2V0UHJlc2V0IFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplclNldFByZXNldCBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAgICAgcmV0dXJuOwogfQogCi1pbnQzMl90IEVxdWFsaXplckdldE51bVByZXNldHMoKXsKK2ludDMyX3QgRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpIHsKICAgICByZXR1cm4gc2l6ZW9mKGdFcXVhbGl6ZXJQcmVzZXRzKSAvIHNpemVvZihQcmVzZXRDb25maWcpOwogfQogCkBAIC0xNzQ1LDE0ICsxNTg3LDE0IEBACiAvLyBwcmVzZXQgICAgICAgVGhlIHByZXNldCBJRC4gTXVzdCBiZSBsZXNzIHRoYW4gbnVtYmVyIG9mIHByZXNldHMuCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb25zdCBjaGFyICogRXF1YWxpemVyR2V0UHJlc2V0TmFtZShpbnQzMl90IHByZXNldCl7Ci0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJHZXRQcmVzZXROYW1lIHN0YXJ0KCVkKSIsIHByZXNldCk7Citjb25zdCBjaGFyKiBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKGludDMyX3QgcHJlc2V0KSB7CisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyR2V0UHJlc2V0TmFtZSBzdGFydCglZCkiLCBwcmVzZXQpOwogICAgIGlmIChwcmVzZXQgPT0gUFJFU0VUX0NVU1RPTSkgewogICAgICAgICByZXR1cm4gIkN1c3RvbSI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGdFcXVhbGl6ZXJQcmVzZXRzW3ByZXNldF0ubmFtZTsKICAgICB9Ci0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJHZXRQcmVzZXROYW1lIGVuZCglZCkiLCBwcmVzZXQpOworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplckdldFByZXNldE5hbWUgZW5kKCVkKSIsIHByZXNldCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE3NjcsOCArMTYwOSw3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBWb2x1bWVTZXRWb2x1bWVMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0KK2ludCBWb2x1bWVTZXRWb2x1bWVMZXZlbChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCBsZXZlbCkgewogICAgIGlmIChsZXZlbCA+IDAgfHwgbGV2ZWwgPCAtOTYwMCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0xNzgyLDcgKzE2MjMsNyBAQAogICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKIAogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgVm9sdW1lU2V0Vm9sdW1lTGV2ZWwgKi8KK30gLyogZW5kIFZvbHVtZVNldFZvbHVtZUxldmVsICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVm9sdW1lR2V0Vm9sdW1lTGV2ZWwoKQpAQCAtMTc5NCwxNSArMTYzNSwxNCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVm9sdW1lR2V0Vm9sdW1lTGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDE2X3QgKmxldmVsKXsKLQoraW50IFZvbHVtZUdldFZvbHVtZUxldmVsKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90KiBsZXZlbCkgewogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgKmxldmVsID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCAqIDEwMDsKICAgICB9IGVsc2UgewogICAgICAgICAqbGV2ZWwgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgKiAxMDA7CiAgICAgfQogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgVm9sdW1lR2V0Vm9sdW1lTGV2ZWwgKi8KK30gLyogZW5kIFZvbHVtZUdldFZvbHVtZUxldmVsICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVm9sdW1lU2V0TXV0ZSgpCkBAIC0xODE1LDIzICsxNjU1LDIzIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDMyX3QgVm9sdW1lU2V0TXV0ZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3QgbXV0ZSl7Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVTZXRNdXRlIHN0YXJ0KCVkKSIsIG11dGUpOworaW50MzJfdCBWb2x1bWVTZXRNdXRlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBtdXRlKSB7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0TXV0ZSBzdGFydCglZCkiLCBtdXRlKTsKIAogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IG11dGU7CiAKICAgICAvKiBTZXQgYXBwcm9wcmlhdGUgdm9sdW1lIGxldmVsICovCi0gICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9UUlVFKXsKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9UUlVFKSB7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IC05NjsKLSAgICB9ZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkOwogICAgIH0KIAogICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKIAogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgc2V0TXV0ZSAqLworfSAvKiBlbmQgc2V0TXV0ZSAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFZvbHVtZUdldE11dGUoKQpAQCAtMTg0NSwyNiArMTY4NSwyNSBAQAogLy8gIG11dGU6ICAgICAgIGVuYWJsZS9kaXNhYmxlIGZsYWcKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQzMl90IFZvbHVtZUdldE11dGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90ICptdXRlKXsKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUdldE11dGUgc3RhcnQiKTsKLSAgICBpZigocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9GQUxTRSl8fAotICAgICAgIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpKXsKK2ludDMyX3QgVm9sdW1lR2V0TXV0ZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QqIG11dGUpIHsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVHZXRNdXRlIHN0YXJ0Iik7CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX0ZBTFNFKSB8fAorICAgICAgICAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9UUlVFKSkgewogICAgICAgICAqbXV0ZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZDsKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfWVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lR2V0TXV0ZSByZWFkIGFuIGludmFsaWQgdmFsdWUgZnJvbSBjb250ZXh0ICVkIiwKICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgIC8vQUxPR1YoIlx0Vm9sdW1lR2V0TXV0ZSBlbmQiKTsKLX0gICAgLyogZW5kIGdldE11dGUgKi8KKyAgICAvLyBBTE9HVigiXHRWb2x1bWVHZXRNdXRlIGVuZCIpOworfSAvKiBlbmQgZ2V0TXV0ZSAqLwogCi1pbnQxNl90IFZvbHVtZUNvbnZlcnRTdGVyZW9Qb3NpdGlvbihpbnQxNl90IHBvc2l0aW9uKXsKK2ludDE2X3QgVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKGludDE2X3QgcG9zaXRpb24pIHsKICAgICBpbnQxNl90IGNvbnZlcnRlZFBvc2l0aW9uID0gMDsKIAotICAgIGNvbnZlcnRlZFBvc2l0aW9uID0gKGludDE2X3QpKCgoZmxvYXQpcG9zaXRpb24vMTAwMCkqOTYpOworICAgIGNvbnZlcnRlZFBvc2l0aW9uID0gKGludDE2X3QpKCgoZmxvYXQpcG9zaXRpb24gLyAxMDAwKSAqIDk2KTsKICAgICByZXR1cm4gY29udmVydGVkUG9zaXRpb247Ci0KIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xODc5LDU1ICsxNzE4LDU1IEBACiAvLyBPdXRwdXRzOgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBwb3NpdGlvbil7Ci0KLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFsYW5jZSA9IDA7CitpbnQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24oRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGludDE2X3QgcG9zaXRpb24pIHsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2IEJhbGFuY2UgPSAwOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IHBvc2l0aW9uOwogICAgIEJhbGFuY2UgPSBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24ocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAKLSAgICAvL0FMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIHN0YXJ0IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAlZCIsCi0gICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBzdGFydCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gJWQiLAorICAgIC8vIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOwogCi0gICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fVFJVRSl7Ci0KLSAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBQb3NpdGlvbiB0byBiZSBzZXQgaXMgJWQgJWRcbiIsIHBvc2l0aW9uLCBCYWxhbmNlKTsKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBQb3NpdGlvbiB0byBiZSBzZXQgaXMgJWQgJWRcbiIsIHBvc2l0aW9uLCBCYWxhbmNlKTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IHBvc2l0aW9uOwogICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQotICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIGdvdDoiCisgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMKKyAgICAgICAgLy8gZ290OiIKICAgICAgICAgLy8gICAgICIgJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKTsKIAogICAgICAgICAvKiBWb2x1bWUgcGFyYW1ldGVycyAqLwotICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSAgPSBCYWxhbmNlOwotICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKCkgKC05NmRCIC0+ICs5NmRCKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSApOworICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSA9IEJhbGFuY2U7CisgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKCkgKC05NmRCIC0+ICs5NmRCKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZQorICAgICAgICAvLyApOwogCiAgICAgICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIikKLSAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCiAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCi0gICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgZ290OiAiCisgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgZ290OgorICAgICAgICAvLyAiCiAgICAgICAgIC8vICAgICAiJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBQb3NpdGlvbiBhdHRlbXB0aW5nIHRvIHNldCwgYnV0IG5vdCBlbmFibGVkICVkICVkXG4iLAorICAgICAgICAvLyBwb3NpdGlvbiwgQmFsYW5jZSk7CiAgICAgfQotICAgIGVsc2V7Ci0gICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gUG9zaXRpb24gYXR0ZW1wdGluZyB0byBzZXQsIGJ1dCBub3QgZW5hYmxlZCAlZCAlZFxuIiwKLSAgICAgICAgLy9wb3NpdGlvbiwgQmFsYW5jZSk7Ci0gICAgfQotICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gZW5kIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAlZFxuIiwKLSAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIGVuZCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gJWRcbiIsCisgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiAqLworfSAvKiBlbmQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbigpCkBAIC0xOTQxLDM1ICsxNzgwLDM1IEBACiAvLyAgcG9zaXRpb246ICAgICAgIHN0ZXJlbyBwb3NpdGlvbgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDMyX3QgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24oRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDE2X3QgKnBvc2l0aW9uKXsKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIHN0YXJ0Iik7CitpbnQzMl90IFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90KiBwb3NpdGlvbikgeworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIHN0YXJ0Iik7CiAKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiYWxhbmNlOworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgYmFsYW5jZTsKIAotICAgIC8vQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gc3RhcnQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkIiwKLSAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIHN0YXJ0IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAlZCIsCisgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAKICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpOwotICAgIC8vQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSk7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKIAogICAgIGJhbGFuY2UgPSBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24ocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAKLSAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID09IExWTV9UUlVFKXsKLSAgICAgICAgaWYoYmFsYW5jZSAhPSBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSl7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgaWYgKGJhbGFuY2UgIT0gQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAgICAgfQotICAgICpwb3NpdGlvbiA9IChMVk1fSU5UMTYpcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZDsgICAgIC8vIENvbnZlcnQgZEIgdG8gbWlsbGliZWxzCi0gICAgLy9BTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBlbmQgcmV0dXJuaW5nIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSVkXG4iLAotICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgKnBvc2l0aW9uID0gKExWTV9JTlQxNilwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkOyAgLy8gQ29udmVydCBkQiB0byBtaWxsaWJlbHMKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBlbmQgcmV0dXJuaW5nIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQKKyAgICAvLyA9JWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOwogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gKi8KK30gLyogZW5kIFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24oKQpAQCAtMTk4Miw0MCArMTgyMSw0MCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQzMl90IFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBlbmFibGVkKXsKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIHN0YXJ0KCkiKTsKK2ludDMyX3QgVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24oRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IGVuYWJsZWQpIHsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBzdGFydCgpIik7CiAKICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gZW5hYmxlZDsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiB0byAlZCwgcG9zaXRpb24gd2FzICVkXG4iLAorICAgIC8vIEFMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gdG8gJWQsIHBvc2l0aW9uIHdhcyAlZFxuIiwKICAgICAvLyAgICAgZW5hYmxlZCwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgKTsKIAogICAgIC8qIFNldCBhcHByb3ByaWF0ZSBzdGVyZW8gcG9zaXRpb24gKi8KLSAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID09IExWTV9GQUxTRSl7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlID0gMDsKLSAgICB9ZWxzZXsKLSAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24ocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgPQorICAgICAgICAgICAgICAgIFZvbHVtZUNvbnZlcnRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKICAgICB9CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24iKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gZW5kKClcbiIpOworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBlbmQoKVxuIik7CiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiAqLworfSAvKiBlbmQgVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkKQEAgLTIwMzgsMTMgKzE4NzcsMTAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CitpbnQgQmFzc0Jvb3N0X2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCogcGFyYW1zID0gKGludDMyX3QqKXBQYXJhbTsKIAogICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKQEAgLTIwNTUsMjggKzE4OTEsMjcgQEAKICAgICBzd2l0Y2ggKHBhcmFtc1swXSkgewogICAgICAgICBjYXNlIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQ6CiAgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQogCi0gICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gMTsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCAldSIsIF9fZnVuY19fLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgICoodWludDMyX3QqKXBWYWx1ZSA9IDE7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgJXUiLCBfX2Z1bmNfXywgKih1aW50MzJfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIOgogICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEggaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEggaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKLSAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IEJhc3NHZXRTdHJlbmd0aChwQ29udGV4dCk7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSBCYXNzR2V0U3RyZW5ndGgocENvbnRleHQpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEggJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTIxMDQsMTMgKzE5MzksMTAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB2YWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKK2ludCBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCogcGFyYW1zID0gKGludDMyX3QqKXBQYXJhbTsKIAogICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKQEAgLTIxMjYsNyArMTk1OCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3Qgc3RyZW5ndGggPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHN0cmVuZ3RoID0gKihpbnQxNl90KilwVmFsdWU7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCAlZCIsIF9fZnVuY19fLCBzdHJlbmd0aCk7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCBDYWxsaW5nIEJhc3NTZXRTdHJlbmd0aCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIEJhc3NTZXRTdHJlbmd0aChwQ29udGV4dCwgKGludDMyX3Qpc3RyZW5ndGgpOwpAQCAtMjE2NCwxMyArMTk5NiwxMCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CitpbnQgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBhcmFtcyA9IChpbnQzMl90KilwUGFyYW07CiAKICAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCkBAIC0yMTgwLDQ3ICsyMDA5LDQ3IEBACiAgICAgfQogICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7CiAgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKLSAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAxOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgJWQiLCBfX2Z1bmNfXywgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSAxOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgJWQiLCBfX2Z1bmNfXywgKih1aW50MzJfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEg6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7IC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQogCi0gICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBWaXJ0dWFsaXplckdldFN0cmVuZ3RoKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gVmlydHVhbGl6ZXJHZXRTdHJlbmd0aChwQ29udGV4dCk7CiAKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMX1NQRUFLRVJfQU5HTEVTOiB7CiAgICAgICAgICAgICBpZiAocGFyYW1TaXplIDwgMyAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TUEVBS0VSX0FOR0xFUyBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NQRUFLRVJfQU5HTEVTIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmFtU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHBhcmFtc1sxXTsKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gKGF1ZGlvX2RldmljZXNfdCkgcGFyYW1zWzJdOworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcGFyYW1zWzFdOworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KXBhcmFtc1syXTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG5iQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdmFsdWVTaXplUmVxdWlyZWQgPSAzICogbmJDaGFubmVscyAqIHNpemVvZihpbnQzMl90KTsKICAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHZhbHVlU2l6ZVJlcXVpcmVkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NQRUFLRVJfQU5HTEVTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1BFQUtFUl9BTkdMRVMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjIyOSwyMyArMjA1OCwyMyBAQAogICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAogICAgICAgICAgICAgc3RhdHVzID0gVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVMgbWFzaz0weCV4IGRldmljZT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjaGFubmVsTWFzaywgZGV2aWNlVHlwZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVMgbWFzaz0weCV4IGRldmljZT0weCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOwogICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkLCBnZXQgdGhlIGFuZ2xlcwotICAgICAgICAgICAgICAgIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcyhjaGFubmVsTWFzaywgZGV2aWNlVHlwZSwgKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgICAgIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcyhjaGFubmVsTWFzaywgZGV2aWNlVHlwZSwgKGludDMyX3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMSVpBVElPTl9NT0RFOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMSVpBVElPTl9NT0RFIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxJWkFUSU9OX01PREUgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9ICh1aW50MzJfdCkgVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUocENvbnRleHQpOworICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gKHVpbnQzMl90KVZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0yMjczLDE3ICsyMTAyLDE0IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB2YWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworaW50IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCogcGFyYW1zID0gKGludDMyX3QqKXBQYXJhbTsKIAogICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKLSAgICBpZiAocGFyYW1TaXplICE9IHNpemVvZihpbnQzMl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgaWYgKHBhcmFtU2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KICAgICAgICAgQUxPR1YoIiVzIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0yMjk1LDcgKzIxMjEsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdCBpbnQxNl90IHN0cmVuZ3RoID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCBzdHJlbmd0aCA9ICooaW50MTZfdCopcFZhbHVlOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCAlZCIsIF9fZnVuY19fLCBzdHJlbmd0aCk7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIIENhbGxpbmcgVmlydHVhbGl6ZXJTZXRTdHJlbmd0aCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIFZpcnR1YWxpemVyU2V0U3RyZW5ndGgocENvbnRleHQsIChpbnQzMl90KXN0cmVuZ3RoKTsKQEAgLTIzMDUsMTYgKzIxMzEsMTYgQEAKICAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9GT1JDRV9WSVJUVUFMSVpBVElPTl9NT0RFOiB7CiAgICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREUgaW52YWxpZCB2YWx1ZVNpemU6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2YWx1ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2YWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjQ0NzgwMDMiKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IChhdWRpb19kZXZpY2VzX3QpKihpbnQzMl90ICopcFZhbHVlOworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSAqIChpbnQzMl90KilwVmFsdWU7CiAgICAgICAgICAgICBzdGF0dXMgPSBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0LCBkZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERSBkZXZpY2U9JSN4IHJlc3VsdD0lZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXZpY2VUeXBlLCBzdGF0dXMpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9GT1JDRV9WSVJUVUFMSVpBVElPTl9NT0RFIGRldmljZT0lI3ggcmVzdWx0PSVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZSwgc3RhdHVzKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMjM0NywxMyArMjE3MywxMCBAQAogLy8gU2lkZSBFZmZlY3RzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CitpbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCogcGFyYW1zID0gKGludDMyX3QqKXBQYXJhbTsKIAogICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKQEAgLTIzNjIsMjExICsyMTg1LDIxMCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHsKLSAgICBjYXNlIEVRX1BBUkFNX05VTV9CQU5EUzoKLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX05VTV9CQU5EUyBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7Ci0KLSAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClGSVZFQkFORF9OVU1CQU5EUzsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9OVU1fQkFORFMgJXUiLCBfX2Z1bmNfXywgKih1aW50MTZfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7Ci0KLSAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClFcXVhbGl6ZXJHZXRQcmVzZXQocENvbnRleHQpOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgJXUiLCBfX2Z1bmNfXywgKih1aW50MTZfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFM6Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOwotCi0gICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUyAldSIsIF9fZnVuY19fLCAqKHVpbnQxNl90ICopcFZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0dFVF9CQU5EOiB7Ci0gICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fR0VUX0JBTkQgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0dFVF9CQU5EIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKLQotICAgICAgICBjb25zdCBpbnQzMl90IGZyZXF1ZW5jeSA9IHBhcmFtc1sxXTsKLSAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kKHBDb250ZXh0LCBmcmVxdWVuY3kpOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAldSIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGZyZXF1ZW5jeSwgKih1aW50MTZfdCAqKXBWYWx1ZSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDogewotICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBwYXJhbVNpemUgJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwotCi0gICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1sxXTsKLSAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKLSAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzI0Mzg1OTgiKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIGJhbmQgJWQiLCBfX2Z1bmNfXywgYmFuZCk7CisgICAgICAgIGNhc2UgRVFfUEFSQU1fTlVNX0JBTkRTOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9OVU1fQkFORFMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwocENvbnRleHQsIGJhbmQpOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiYW5kLCAqKGludDE2X3QgKilwVmFsdWUpOwotICAgIH0gYnJlYWs7CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7CiAKLSAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fTEVWRUxfUkFOR0UgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgKih1aW50MTZfdCopcFZhbHVlID0gKHVpbnQxNl90KUZJVkVCQU5EX05VTUJBTkRTOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9OVU1fQkFORFMgJXUiLCBfX2Z1bmNfXywgKih1aW50MTZfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gMiAqIHNpemVvZihpbnQxNl90KTsKIAotICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAtMTUwMDsKLSAgICAgICAgKigoaW50MTZfdCAqKXBWYWx1ZSArIDEpID0gMTUwMDsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9MRVZFTF9SQU5HRSBtaW4gJWQsIG1heCAlZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSwgKigoaW50MTZfdCAqKXBWYWx1ZSArIDEpKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRTogewotICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gMiAqIHNpemVvZihpbnQzMl90KTsKLQotICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMV07Ci0gICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7Ci0gICAgICAgICAgICBpZiAoYmFuZCA8IDApIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyMjQ3OTQ4Iik7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBpbnZhbGlkIGJhbmQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJhbmQpOworICAgICAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKHBDb250ZXh0LCBiYW5kLCAodWludDMyX3QgKilwVmFsdWUsICgodWludDMyX3QgKilwVmFsdWUgKyAxKSk7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGJhbmQgJWQsIG1pbiAlZCwgbWF4ICVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmFuZCwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOwogCi0gICAgfSBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fQ0VOVEVSX0ZSRVE6IHsKLSAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAqKHVpbnQxNl90KilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCAldSIsIF9fZnVuY19fLCAqKHVpbnQxNl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MzJfdCk7CiAKLSAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzFdOwotICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgewotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzI0MzYzNDEiKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXMgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgaW52YWxpZCBiYW5kICVkIiwgX19mdW5jX18sIGJhbmQpOworICAgICAgICBjYXNlIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUzoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSA9IEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeShwQ29udGV4dCwgYmFuZCk7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgYmFuZCAlZCwgZnJlcXVlbmN5ICVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmFuZCwgKihpbnQzMl90ICopcFZhbHVlKTsKLSAgICB9IGJyZWFrOworICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOwogCi0gICAgY2FzZSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUU6IHsKLSAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUkVTRVRfTkFNRSBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAqKHVpbnQxNl90KilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFMgJXUiLCBfX2Z1bmNfXywgKih1aW50MTZfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc1MzY0MDciKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IGludDMyX3QgcHJlc2V0ID0gcGFyYW1zWzFdOwotICAgICAgICBpZiAoKHByZXNldCA8IDAgJiYgcHJlc2V0ICE9IFBSRVNFVF9DVVNUT00pIHx8ICBwcmVzZXQgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKSB7Ci0gICAgICAgICAgICBpZiAocHJlc2V0IDwgMCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzI0NDgyNTgiKTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOworICAgICAgICBjYXNlIEVRX1BBUkFNX0dFVF9CQU5EOiB7CisgICAgICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9HRVRfQkFORCBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9HRVRfQkFORCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOworCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyZXF1ZW5jeSA9IHBhcmFtc1sxXTsKKyAgICAgICAgICAgICoodWludDE2X3QqKXBWYWx1ZSA9ICh1aW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kKHBDb250ZXh0LCBmcmVxdWVuY3kpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9HRVRfQkFORCBmcmVxdWVuY3kgJWQsIGJhbmQgJXUiLCBfX2Z1bmNfXywgZnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICoodWludDE2X3QqKXBWYWx1ZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOiB7CisgICAgICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgcGFyYW1TaXplICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzFdOworICAgICAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzODU5OCIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIGJhbmQgJWQiLCBfX2Z1bmNfXywgYmFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IChpbnQxNl90KUVxdWFsaXplckdldEJhbmRMZXZlbChwQ29udGV4dCwgYmFuZCk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBfX2Z1bmNfXywgYmFuZCwgKihpbnQxNl90KilwVmFsdWUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRVFfUEFSQU1fTEVWRUxfUkFOR0U6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0xFVkVMX1JBTkdFIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gLTE1MDA7CisgICAgICAgICAgICAqKChpbnQxNl90KilwVmFsdWUgKyAxKSA9IDE1MDA7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0xFVkVMX1JBTkdFIG1pbiAlZCwgbWF4ICVkIiwgX19mdW5jX18sICooaW50MTZfdCopcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICooKGludDE2X3QqKXBWYWx1ZSArIDEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFOiB7CisgICAgICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MzJfdCk7CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1sxXTsKKyAgICAgICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIyNDc5NDgiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBpbnZhbGlkIGJhbmQgJWQiLCBfX2Z1bmNfXywgYmFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKHBDb250ZXh0LCBiYW5kLCAodWludDMyX3QqKXBWYWx1ZSwgKCh1aW50MzJfdCopcFZhbHVlICsgMSkpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgYmFuZCAlZCwgbWluICVkLCBtYXggJWQiLCBfX2Z1bmNfXywgYmFuZCwKKyAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBWYWx1ZSwgKigoaW50MzJfdCopcFZhbHVlICsgMSkpOworCisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUTogeworICAgICAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MzJfdCk7CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1sxXTsKKyAgICAgICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzNjM0MSIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgaW52YWxpZCBiYW5kICVkIiwgX19mdW5jX18sIGJhbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50MzJfdCopcFZhbHVlID0gRXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5KHBDb250ZXh0LCBiYW5kKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgYmFuZCAlZCwgZnJlcXVlbmN5ICVkIiwgX19mdW5jX18sIGJhbmQsCisgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwVmFsdWUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FOiB7CisgICAgICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUkVTRVRfTkFNRSBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMSkgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc1MzY0MDciKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHByZXNldCA9IHBhcmFtc1sxXTsKKyAgICAgICAgICAgIGlmICgocHJlc2V0IDwgMCAmJiBwcmVzZXQgIT0gUFJFU0VUX0NVU1RPTSkgfHwgcHJlc2V0ID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChwcmVzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzI0NDgyNTgiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRSBwcmVzZXQgJWQiLCBfX2Z1bmNfXywgcHJlc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hhciogY29uc3QgbmFtZSA9IChjaGFyKilwVmFsdWU7CisgICAgICAgICAgICBzdHJuY3B5KG5hbWUsIEVxdWFsaXplckdldFByZXNldE5hbWUocHJlc2V0KSwgKnBWYWx1ZVNpemUgLSAxKTsKKyAgICAgICAgICAgIG5hbWVbKnBWYWx1ZVNpemUgLSAxXSA9IDA7CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRSBwcmVzZXQgJWQsIG5hbWUgJXMgbGVuICVkIiwgX19mdW5jX18sIHByZXNldCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CisKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKKyAgICAgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCByZXF1aXJlZFZhbHVlU2l6ZSA9ICgyICsgRklWRUJBTkRfTlVNQkFORFMpICogc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHJlcXVpcmVkVmFsdWVTaXplKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gcmVxdWlyZWRWYWx1ZVNpemU7CisKKyAgICAgICAgICAgIGludDE2X3QqIHAgPSAoaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBwWzBdID0gKGludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBbMV0gPSAoaW50MTZfdClGSVZFQkFORF9OVU1CQU5EUzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICAgICAgICAgIHBbMiArIGldID0gKGludDE2X3QpRXF1YWxpemVyR2V0QmFuZExldmVsKHBDb250ZXh0LCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1YoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgKiBjb25zdCBuYW1lID0gKGNoYXIgKilwVmFsdWU7Ci0gICAgICAgIHN0cm5jcHkobmFtZSwgRXF1YWxpemVyR2V0UHJlc2V0TmFtZShwcmVzZXQpLCAqcFZhbHVlU2l6ZSAtIDEpOwotICAgICAgICBuYW1lWypwVmFsdWVTaXplIC0gMV0gPSAwOwotICAgICAgICAqcFZhbHVlU2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLAotICAgICAgICAgICAgICAgX19mdW5jX18sIHByZXNldCwgbmFtZSwgKnBWYWx1ZVNpemUpOwotCi0gICAgfSBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fUFJPUEVSVElFUzogewotICAgICAgICBjb25zdGV4cHIgdWludDMyX3QgcmVxdWlyZWRWYWx1ZVNpemUgPSAoMiArIEZJVkVCQU5EX05VTUJBTkRTKSAqIHNpemVvZih1aW50MTZfdCk7Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHJlcXVpcmVkVmFsdWVTaXplKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IHJlcXVpcmVkVmFsdWVTaXplOwotCi0gICAgICAgIGludDE2X3QgKnAgPSAoaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHBbMF0gPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRQcmVzZXQocENvbnRleHQpOwotICAgICAgICBwWzFdID0gKGludDE2X3QpRklWRUJBTkRfTlVNQkFORFM7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewotICAgICAgICAgICAgcFsyICsgaV0gPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwocENvbnRleHQsIGkpOwotICAgICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSk7Ci0gICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIEFMT0dWVigiJXMgZW5kIHBhcmFtOiAlZCwgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0sIHN0YXR1cyk7CkBAIC0yNTg5LDEzICsyNDExLDEwIEBACiAvLyBPdXRwdXRzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB2YWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKK2ludCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCogcGFyYW1zID0gKGludDMyX3QqKXBQYXJhbTsKIAogICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKQEAgLTI2MDQsODcgKzI0MjMsODcgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7Ci0gICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOiB7Ci0gICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgaW50MzJfdCBwcmVzZXQgPSAoaW50MzJfdCkqKHVpbnQxNl90ICopcFZhbHVlOwotCi0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOwotICAgICAgICBpZiAocHJlc2V0ID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSB8fCBwcmVzZXQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCBpbnZhbGlkIHByZXNldCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgcHJlc2V0KTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOiB7Ci0gICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIHZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCB2YWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9ICBwYXJhbXNbMV07Ci0gICAgICAgIGNvbnN0IGludDMyX3QgbGV2ZWwgPSAoaW50MzJfdCkqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsIF9fZnVuY19fLCBiYW5kLCBsZXZlbCk7Ci0gICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7Ci0gICAgICAgICAgICBpZiAoYmFuZCA8IDApIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyMDk1NjI2Iik7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBiYW5kICVkIiwgX19mdW5jX18sIGJhbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEVxdWFsaXplclNldEJhbmRMZXZlbChwQ29udGV4dCwgYmFuZCwgbGV2ZWwpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIiwgX19mdW5jX18pOwotICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIHZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCB2YWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGludDE2X3QgKnAgPSAoaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgaWYgKChpbnQpcFswXSA+PSBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgcHJlc2V0ICVkIiwgX19mdW5jX18sIChpbnQpcFswXSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBbMF0gPj0gMCkgewotICAgICAgICAgICAgRXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCAoaW50KXBbMF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3RleHByIHVpbnQzMl90IHZhbHVlU2l6ZVJlcXVpcmVkID0gKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgdmFsdWVTaXplUmVxdWlyZWQpIHsKLSAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNzU2MzM3MSIpOwotICAgICAgICAgICAgICBBTE9HRSgiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIHZhbHVlU2l6ZSAldSA8ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdmFsdWVTaXplLCB2YWx1ZVNpemVSZXF1aXJlZCk7Ci0gICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChpbnQpcFsxXSAhPSBGSVZFQkFORF9OVU1CQU5EUykgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgYmFuZHMgJWQiLCBfX2Z1bmNfXywgKGludClwWzFdKTsKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOiB7CisgICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRXF1YWxpemVyU2V0QmFuZExldmVsKHBDb250ZXh0LCBpLCAoaW50KXBbMiArIGldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHByZXNldCA9IChpbnQzMl90KSAqICh1aW50MTZfdCopcFZhbHVlOwogCi0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1YoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgJWQiLCBfX2Z1bmNfXywgcHJlc2V0KTsKKyAgICAgICAgICAgIGlmIChwcmVzZXQgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpIHx8IHByZXNldCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCBpbnZhbGlkIHByZXNldCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFcXVhbGl6ZXJTZXRQcmVzZXQocENvbnRleHQsIHByZXNldCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOiB7CisgICAgICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBsZXZlbCA9IChpbnQzMl90KSAqIChpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBfX2Z1bmNfXywgYmFuZCwgbGV2ZWwpOworICAgICAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjA5NTYyNiIpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIGJhbmQgJWQiLCBfX2Z1bmNfXywgYmFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwocENvbnRleHQsIGJhbmQsIGxldmVsKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIHZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCB2YWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQxNl90KiBwID0gKGludDE2X3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIGlmICgoaW50KXBbMF0gPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCBwcmVzZXQgJWQiLCBfX2Z1bmNfXywgKGludClwWzBdKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBbMF0gPj0gMCkgeworICAgICAgICAgICAgICAgIEVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgKGludClwWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uc3RleHByIHVpbnQzMl90IHZhbHVlU2l6ZVJlcXVpcmVkID0gKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHZhbHVlU2l6ZVJlcXVpcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc1NjMzNzEiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCB2YWx1ZVNpemUgJXUgPCAldSIsIF9fZnVuY19fLCB2YWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2l6ZVJlcXVpcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoaW50KXBbMV0gIT0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCBiYW5kcyAlZCIsIF9fZnVuY19fLCAoaW50KXBbMV0pOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEVxdWFsaXplclNldEJhbmRMZXZlbChwQ29udGV4dCwgaSwgKGludClwWzIgKyBpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIEFMT0dWVigiJXMgZW5kIHBhcmFtOiAlZCwgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0sIHN0YXR1cyk7CkBAIC0yNzEyLDEzICsyNTMxLDEwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworaW50IFZvbHVtZV9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBhcmFtcyA9IChpbnQzMl90KilwUGFyYW07CiAKICAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCkBAIC0yNzI4LDE5ICsyNTQ0LDE5IEBACiAgICAgfQogICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7CiAgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0xFVkVMOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9MRVZFTCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lR2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90ICopKHBWYWx1ZSkpOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZUdldFZvbHVtZUxldmVsKHBDb250ZXh0LCAoaW50MTZfdCopKHBWYWx1ZSkpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTUFYTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7IC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KICAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX01BWExFVkVMIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yNzQ4LDIxICsyNTY0LDIxIEBACiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQogCiAgICAgICAgICAgICAvLyBpbiBtaWxsaWJlbAotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gMDsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX01BWExFVkVMICVkIiwgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IDA7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTjoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24ocENvbnRleHQsIChpbnQxNl90ICopcFZhbHVlKTsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OICVkIiwgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgKGludDE2X3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9NVVRFOgpAQCAtMjc3MywyMSArMjU4OSwyMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOwogCi0gICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVHZXRNdXRlKHBDb250ZXh0LCAodWludDMyX3QgKilwVmFsdWUpOwotICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9NVVRFICV1IiwgX19mdW5jX18sICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lR2V0TXV0ZShwQ29udGV4dCwgKHVpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9NVVRFICV1IiwgX19mdW5jX18sICoodWludDMyX3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTjoKICAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04gaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04gaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MzJfdCk7CiAKLSAgICAgICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQ7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiAlZCIsIF9fZnVuY19fLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgKihpbnQzMl90KilwVmFsdWUgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04gJWQiLCBfX2Z1bmNfXywgKihpbnQzMl90KilwVmFsdWUpOwogCiAgICAgICAgICAgICBicmVhazsKIApAQCAtMjgxNiwxMyArMjYzMiwxMCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVm9sdW1lX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworaW50IFZvbHVtZV9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwYXJhbXMgPSAoaW50MzJfdCopcFBhcmFtOwogCiAgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIApAQCAtMjgzOCw3ICsyNjUxLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgaW50MTZfdCBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgbGV2ZWwgPSAqKGludDE2X3QqKXBWYWx1ZTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX0xFVkVMICVkIiwgX19mdW5jX18sIGxldmVsKTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX0xFVkVMIENhbGxpbmcgVm9sdW1lU2V0Vm9sdW1lTGV2ZWwiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgbGV2ZWwpOwpAQCAtMjg1Myw3ICsyNjY2LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbXV0ZSA9ICoodWludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtdXRlID0gKih1aW50MzJfdCopcFZhbHVlOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTVVURSAlZCIsIF9fZnVuY19fLCBtdXRlKTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX01VVEUgQ2FsbGluZyBWb2x1bWVTZXRNdXRlIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lU2V0TXV0ZShwQ29udGV4dCwgbXV0ZSk7CkBAIC0yODYyLDE1ICsyNjc1LDE2IEBACiAKICAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT046IHsKICAgICAgICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YodWludDMyX3QpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBpbnZhbGlkIHZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwb3NpdGlvbkVuYWJsZWQgPSAqKHVpbnQzMl90ICopcFZhbHVlOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcG9zaXRpb25FbmFibGVkID0gKih1aW50MzJfdCopcFZhbHVlOwogICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24ocENvbnRleHQsIHBvc2l0aW9uRW5hYmxlZCkKLSAgICAgICAgICAgICAgICAgICAgPzogVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24ocENvbnRleHQsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/OiBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBjYWxsZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTI4ODEsMTMgKzI2OTUsMTEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgaW50MTZfdCBwb3NpdGlvbiA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgcG9zaXRpb24gPSAqKGludDE2X3QqKXBWYWx1ZTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OICVkIiwgX19mdW5jX18sIHBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIENhbGxpbmcgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiBDYWxsaW5nIFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24ocENvbnRleHQsIHBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIENhbGxlZCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIENhbGxlZCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMjkxMiwxOCArMjcyNCwxNSBAQAogICogIFJlbWFya3MgICAgIDoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fSU5UMTYgTFZDX1RvREJfczMyVG9zMTYoTFZNX0lOVDMyIExpbl9maXgpCi17Ci0gICAgTFZNX0lOVDE2ICAgZGJfZml4OwotICAgIExWTV9JTlQxNiAgIFNoaWZ0OwotICAgIExWTV9JTlQxNiAgIFNtYWxsUmVtYWluZGVyOwotICAgIExWTV9VSU5UMzIgIFJlbWFpbmRlciA9IChMVk1fVUlOVDMyKUxpbl9maXg7CitMVk1fSU5UMTYgTFZDX1RvREJfczMyVG9zMTYoTFZNX0lOVDMyIExpbl9maXgpIHsKKyAgICBMVk1fSU5UMTYgZGJfZml4OworICAgIExWTV9JTlQxNiBTaGlmdDsKKyAgICBMVk1fSU5UMTYgU21hbGxSZW1haW5kZXI7CisgICAgTFZNX1VJTlQzMiBSZW1haW5kZXIgPSAoTFZNX1VJTlQzMilMaW5fZml4OwogCiAgICAgLyogQ291bnQgbGVhZGluZyBiaXRzLCAxIGN5Y2xlIGluIGFzc2VtYmx5Ki8KLSAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQ8MzI7IFNoaWZ0KyspCi0gICAgewotICAgICAgICBpZiAoKFJlbWFpbmRlciAmIDB4ODAwMDAwMDBVKSE9MCkKLSAgICAgICAgeworICAgIGZvciAoU2hpZnQgPSAwOyBTaGlmdCA8IDMyOyBTaGlmdCsrKSB7CisgICAgICAgIGlmICgoUmVtYWluZGVyICYgMHg4MDAwMDAwMFUpICE9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIFJlbWFpbmRlciA9IFJlbWFpbmRlciA8PCAxOwpAQCAtMjkzNCw5ICsyNzQzLDkgQEAKICAgICAgKgogICAgICAqIGRCID0gLTk2ICogU2hpZnQgKyAxNiAqICg4ICogUmVtYWluZGVyIC0gMiAqIFJlbWFpbmRlcl4yKQogICAgICAqLwotICAgIGRiX2ZpeCAgICA9IChMVk1fSU5UMTYpKC05NiAqIFNoaWZ0KTsgICAgICAgICAgICAgICAvKiBTaXggZEIgc3RlcHMgaW4gUTExLjQgZm9ybWF0Ki8KKyAgICBkYl9maXggPSAoTFZNX0lOVDE2KSgtOTYgKiBTaGlmdCk7IC8qIFNpeCBkQiBzdGVwcyBpbiBRMTEuNCBmb3JtYXQqLwogICAgIFNtYWxsUmVtYWluZGVyID0gKExWTV9JTlQxNikoKFJlbWFpbmRlciAmIDB4N2ZmZmZmZmYpID4+IDI0KTsKLSAgICBkYl9maXggPSAoTFZNX0lOVDE2KShkYl9maXggKyBTbWFsbFJlbWFpbmRlciApOworICAgIGRiX2ZpeCA9IChMVk1fSU5UMTYpKGRiX2ZpeCArIFNtYWxsUmVtYWluZGVyKTsKICAgICBTbWFsbFJlbWFpbmRlciA9IChMVk1fSU5UMTYpKFNtYWxsUmVtYWluZGVyICogU21hbGxSZW1haW5kZXIpOwogICAgIGRiX2ZpeCA9IChMVk1fSU5UMTYpKGRiX2ZpeCAtIChMVk1fSU5UMTYpKChMVk1fVUlOVDE2KVNtYWxsUmVtYWluZGVyID4+IDkpKTsKIApAQCAtMjk2MCwxMSArMjc2OSwxMCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgRWZmZWN0X3NldEVuYWJsZWQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBBTE9HVigiJXMgZWZmZWN0VHlwZSAlZCwgZW5hYmxlZCAlZCwgY3VycmVudGx5IGVuYWJsZWQgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlLCBlbmFibGVkLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCk7Ci0gICAgaW50ICZlZmZlY3RJbkRyYWluID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbjsKK2ludCBFZmZlY3Rfc2V0RW5hYmxlZChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgYm9vbCBlbmFibGVkKSB7CisgICAgQUxPR1YoIiVzIGVmZmVjdFR5cGUgJWQsIGVuYWJsZWQgJWQsIGN1cnJlbnRseSBlbmFibGVkICVkIiwgX19mdW5jX18sIHBDb250ZXh0LT5FZmZlY3RUeXBlLAorICAgICAgICAgIGVuYWJsZWQsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKTsKKyAgICBpbnQmIGVmZmVjdEluRHJhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluOwogICAgIGlmIChlbmFibGVkKSB7CiAgICAgICAgIC8vIEJhc3MgYm9vc3Qgb3IgVmlydHVhbGl6ZXIgY2FuIGJlIHRlbXBvcmFyaWx5IGRpc2FibGVkIGlmIHBsYXlpbmcgb3ZlciBkZXZpY2Ugc3BlYWtlciBkdWUKICAgICAgICAgLy8gdG8gdGhlaXIgbmF0dXJlLgpAQCAtMjk3MiwxNSArMjc4MCwxNSBAQAogICAgICAgICBzd2l0Y2ggKHBDb250ZXh0LT5FZmZlY3RUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIExWTV9CQVNTX0JPT1NUOgogICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX0JBU1NfQk9PU1QgaXMgYWxyZWFkeSBlbmFibGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldEVuYWJsZWQoKSBMVk1fQkFTU19CT09TVCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIDw9IDApeworICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9CQVNTX0JPT1NUKTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9Ci0gICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kKjAuMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kICogMC4xKTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fVFJVRTsKICAgICAgICAgICAgICAgICB0ZW1wRGlzYWJsZWQgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZDsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI5ODksMTIgKzI3OTcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldEVuYWJsZWQoKSBMVk1fRVFVQUxJWkVSIGlzIGFscmVhZHkgZW5hYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPD0gMCl7CisgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQrKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWZmZWN0SW5EcmFpbiAmPSB+KDEgPDwgTFZNX0VRVUFMSVpFUik7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPQotICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCowLjEpOworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCAqIDAuMSk7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPSBMVk1fVFJVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTFZNX1ZJUlRVQUxJWkVSOgpAQCAtMzAwMiwxMiArMjgxMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0RW5hYmxlZCgpIExWTV9WSVJUVUFMSVpFUiBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPD0gMCl7CisgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluICY9IH4oMSA8PCBMVk1fVklSVFVBTElaRVIpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPQotICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCowLjEpOworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCAqIDAuMSk7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9UUlVFOwogICAgICAgICAgICAgICAgIHRlbXBEaXNhYmxlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZDsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMwODQsNDEgKzI4OTIsMzkgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDE2X3QgTFZDX0NvbnZlcnRfVm9sVG9EYih1aW50MzJfdCB2b2wpewotICAgIGludDE2X3QgIGRCOworaW50MTZfdCBMVkNfQ29udmVydF9Wb2xUb0RiKHVpbnQzMl90IHZvbCkgeworICAgIGludDE2X3QgZEI7CiAKLSAgICBkQiA9IExWQ19Ub0RCX3MzMlRvczE2KHZvbCA8PDcpOwotICAgIGRCID0gKGRCICs4KT4+NDsKLSAgICBkQiA9IChkQiA8LTk2KSA/IC05NiA6IGRCIDsKKyAgICBkQiA9IExWQ19Ub0RCX3MzMlRvczE2KHZvbCA8PCA3KTsKKyAgICBkQiA9IChkQiArIDgpID4+IDQ7CisgICAgZEIgPSAoZEIgPCAtOTYpID8gLTk2IDogZEI7CiAKICAgICByZXR1cm4gZEI7CiB9CiAKLX0gLy8gbmFtZXNwYWNlCi19IC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBleHRlcm4gIkMiIHsKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogUHJvY2VzcyAqLwotaW50IEVmZmVjdF9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKLSAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOwotICAgIGludCAgICBzdGF0dXMgPSAwOwotICAgIGludCAgICBwcm9jZXNzU3RhdHVzID0gMDsKK2ludCBFZmZlY3RfcHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QqIGluQnVmZmVyLCBhdWRpb19idWZmZXJfdCogb3V0QnVmZmVyKSB7CisgICAgRWZmZWN0Q29udGV4dCogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCopc2VsZjsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQgcHJvY2Vzc1N0YXR1cyA9IDA7CiAgICAgY29uc3QgaW50IE5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAKLS8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgU3RhcnQgOiBFbmFibGVkID0gJWQgICAgIENhbGxlZCA9ICVkICglOGQgJThkICU4ZCkiLAotLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCxwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLAotLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIsCi0vLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0LAotLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEpOworICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCAoJThkICU4ZCAlOGQpIiwKKyAgICAvLyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCxwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLAorICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiLAorICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQsCisgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEpOwogCi0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9wcm9jZXNzKCkgRVJST1IgcENvbnRleHQgPT0gTlVMTCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAvL2lmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKKyAgICAvLyBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CiAgICAgLy8gIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBFZmZlY3QgdHlwZSBpcyBCQVNTX0JPT1NUIik7CiAgICAgLy99ZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKXsKICAgICAvLyAgQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IEVmZmVjdCB0eXBlIGlzIExWTV9FUVVBTElaRVIiKTsKQEAgLTMxMjYsMTUgKzI5MzIsMTQgQEAKICAgICAvLyAgQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IEVmZmVjdCB0eXBlIGlzIExWTV9WSVJUVUFMSVpFUiIpOwogICAgIC8vfQogCi0gICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCAgfHwKLSAgICAgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKLSAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCl7CisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8IG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9wcm9jZXNzKCkgRVJST1IgTlVMTCBJTlBVVCBQT0lOVEVSIE9SIEZSQU1FIENPVU5UIElTIFdST05HIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIGludCAmZWZmZWN0UHJvY2Vzc0NhbGxlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdFByb2Nlc3NDYWxsZWQ7Ci0gICAgaW50ICZlZmZlY3RJbkRyYWluID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbjsKKyAgICBpbnQmIGVmZmVjdFByb2Nlc3NDYWxsZWQgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RQcm9jZXNzQ2FsbGVkOworICAgIGludCYgZWZmZWN0SW5EcmFpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW47CiAgICAgaWYgKChlZmZlY3RQcm9jZXNzQ2FsbGVkICYgMSA8PCBwQ29udGV4dC0+RWZmZWN0VHlwZSkgIT0gMCkgewogICAgICAgICBBTE9HVygiRWZmZWN0ICVkIGFscmVhZHkgY2FsbGVkIiwgcENvbnRleHQtPkVmZmVjdFR5cGUpOwogICAgICAgICBjb25zdCBpbnQgdW5kcmFpbmVkRWZmZWN0cyA9IGVmZmVjdEluRHJhaW4gJiB+ZWZmZWN0UHJvY2Vzc0NhbGxlZDsKQEAgLTMxNjQsMTIgKzI5NjksMTIgQEAKICAgICB9CiAgICAgZWZmZWN0UHJvY2Vzc0NhbGxlZCB8PSAxIDw8IHBDb250ZXh0LT5FZmZlY3RUeXBlOwogCi0gICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCi0gICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkpewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0JBU1NfQk9PU1QgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCl7CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0JBU1NfQk9PU1QgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA+IDApIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEJBU1NfQk9PU1QsICVkIHNhbXBsZXMgbGVmdCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBCQVNTX0JPT1NULCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA8PSAwKSB7CkBAIC0zMTgxLDIxICsyOTg2LDIxIEBACiAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgZm9yIExWTV9CQVNTX0JPT1NUIik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9PSBMVk1fRkFMU0UpJiYKLSAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpKXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WT0xVTUUgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9PSBMVk1fRkFMU0UpICYmCisgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSkgeworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WT0xVTUUgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIHN0YXR1cyA9IC1FTk9EQVRBOwogICAgICAgICBpZiAoKGVmZmVjdEluRHJhaW4gJiAxIDw8IExWTV9WT0xVTUUpICE9IDApIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CiAgICAgICAgICAgICBlZmZlY3RJbkRyYWluICY9IH4oMSA8PCBMVk1fVk9MVU1FKTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9GQUxTRSkmJgotICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikpewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0VRVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKLSAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKXsKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9GQUxTRSkgJiYKKyAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0VRVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID4gMCkgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgRVFVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgRVFVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA8PSAwKSB7CkBAIC0zMjA3LDEzICszMDEyLDEyIEBACiAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgZm9yIExWTV9FUVVBTElaRVIiKTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCi0gICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpKXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WSVJUVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKLSAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPQotICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIGZvciB0byB0dXJuIG9mZiBWSVJUVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSkgeworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WSVJUVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKSB7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyBmb3IgdG8gdHVybiBvZmYgVklSVFVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0KTsKICAgICAgICAgfQogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA8PSAwKSB7CkBAIC0zMjI2LDM3ICszMDMwLDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZihzdGF0dXMgIT0gLUVOT0RBVEEpeworICAgIGlmIChzdGF0dXMgIT0gLUVOT0RBVEEpIHsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCsrOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID49Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCkgewotCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKSB7CiAgICAgICAgIC8vIFdlIGV4cGVjdCB0aGUgIyBlZmZlY3RzIGNhbGxlZCB0byBiZSBlcXVhbCB0byAjIGVmZmVjdHMgZW5hYmxlZCBpbiBzZXF1ZW5jZSAoaW5jbHVkaW5nCiAgICAgICAgIC8vIGRyYWluaW5nIGVmZmVjdHMpLiAgV2FybiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSBkdWUgdG8gaW5jb25zaXN0ZW50IGNhbGxzLgogICAgICAgICBBTE9HV19JRihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID4KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAiJXMgTnVtYmVyIG9mIGVmZmVjdHMgY2FsbGVkICVkIGlzIGdyZWF0ZXIgdGhhbiBudW1iZXIgb2YgZWZmZWN0cyBlbmFibGVkICVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCk7Ci0gICAgICAgIGVmZmVjdFByb2Nlc3NDYWxsZWQgPSAwOyAvLyByZXNldCBvdXIgY29uc2lzdGVuY3kgY2hlY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCisgICAgICAgICAgICAgICAgICIlcyBOdW1iZXIgb2YgZWZmZWN0cyBjYWxsZWQgJWQgaXMgZ3JlYXRlciB0aGFuIG51bWJlciBvZiBlZmZlY3RzIGVuYWJsZWQgJWQiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKKyAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOworICAgICAgICBlZmZlY3RQcm9jZXNzQ2FsbGVkID0gMDsgIC8vIHJlc2V0IG91ciBjb25zaXN0ZW5jeSBjaGVjay4KIAotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzICAgICBDYWxsaW5nIHByb2Nlc3Mgd2l0aCAlZCBlZmZlY3RzIGVuYWJsZWQsICVkIGNhbGxlZDogRWZmZWN0ICVkIiwKLSAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKLSAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzICAgICBDYWxsaW5nIHByb2Nlc3Mgd2l0aCAlZCBlZmZlY3RzIGVuYWJsZWQsICVkIGNhbGxlZDogRWZmZWN0CisgICAgICAgIC8vICVkIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCisgICAgICAgIC8vIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKIAotICAgICAgICBpZiAoc3RhdHVzID09IC1FTk9EQVRBKXsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSAtRU5PREFUQSkgewogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBwcm9jZXNzaW5nIGxhc3QgZnJhbWUiKTsKICAgICAgICAgfQogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKICAgICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMKICAgICAgICAgICAgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCi0gICAgICAgIHByb2Nlc3NTdGF0dXMgPSBhbmRyb2lkOjpMdm1CdW5kbGVfcHJvY2VzcyhpbkJ1ZmZlci0+ZjMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCk7Ci0gICAgICAgIGlmIChwcm9jZXNzU3RhdHVzICE9IDApeworICAgICAgICBwcm9jZXNzU3RhdHVzID0gYW5kcm9pZDo6THZtQnVuZGxlX3Byb2Nlc3MoaW5CdWZmZXItPmYzMiwgb3V0QnVmZmVyLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsIHBDb250ZXh0KTsKKyAgICAgICAgaWYgKHByb2Nlc3NTdGF0dXMgIT0gMCkgewogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgcmV0dXJuZWQgZXJyb3IgJWQiLCBwcm9jZXNzU3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHByb2Nlc3NTdGF0dXM7CkBAIC0zMjY0LDEzMyArMzA2NSwxMjYgQEAKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIE5vdCBDYWxsaW5nIHByb2Nlc3Mgd2l0aCAlZCBlZmZlY3RzIGVuYWJsZWQsICVkIGNhbGxlZDogRWZmZWN0ICVkIiwKLSAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKLSAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIE5vdCBDYWxsaW5nIHByb2Nlc3Mgd2l0aCAlZCBlZmZlY3RzIGVuYWJsZWQsICVkIGNhbGxlZDogRWZmZWN0CisgICAgICAgIC8vICVkIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCisgICAgICAgIC8vIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKIAogICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7ICsraSkgewogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAob3V0QnVmZmVyLT5yYXcgIT0gaW5CdWZmZXItPnJhdykgewotICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yKTsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBzdGF0dXM7Ci19ICAgLyogZW5kIEVmZmVjdF9wcm9jZXNzICovCit9IC8qIGVuZCBFZmZlY3RfcHJvY2VzcyAqLwogCiAvLyBUaGUgdmFsdWUgb2Zmc2V0IG9mIGFuIGVmZmVjdCBwYXJhbWV0ZXIgaXMgY29tcHV0ZWQgYnkgcm91bmRpbmcgdXAKIC8vIHRoZSBwYXJhbWV0ZXIgc2l6ZSB0byB0aGUgbmV4dCAzMiBiaXQgYWxpZ25tZW50Lgotc3RhdGljIGlubGluZSB1aW50MzJfdCBjb21wdXRlUGFyYW1WT2Zmc2V0KGNvbnN0IGVmZmVjdF9wYXJhbV90ICpwKSB7Ci0gICAgcmV0dXJuICgocC0+cHNpemUgKyBzaXplb2YoaW50MzJfdCkgLSAxKSAvIHNpemVvZihpbnQzMl90KSkgKgotICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpOworc3RhdGljIGlubGluZSB1aW50MzJfdCBjb21wdXRlUGFyYW1WT2Zmc2V0KGNvbnN0IGVmZmVjdF9wYXJhbV90KiBwKSB7CisgICAgcmV0dXJuICgocC0+cHNpemUgKyBzaXplb2YoaW50MzJfdCkgLSAxKSAvIHNpemVvZihpbnQzMl90KSkgKiBzaXplb2YoaW50MzJfdCk7CiB9CiAKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogQ29tbWFuZCAqLwotaW50IEVmZmVjdF9jb21tYW5kKGVmZmVjdF9oYW5kbGVfdCAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcFJlcGx5RGF0YSl7Ci0gICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKikgc2VsZjsKK2ludCBFZmZlY3RfY29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCogcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHJlcGx5U2l6ZSwgdm9pZCogcFJlcGx5RGF0YSkgeworICAgIEVmZmVjdENvbnRleHQqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQqKXNlbGY7CiAKLSAgICAvL0FMT0dWKCJcdFxuRWZmZWN0X2NvbW1hbmQgc3RhcnQiKTsKKyAgICAvLyBBTE9HVigiXHRcbkVmZmVjdF9jb21tYW5kIHN0YXJ0Iik7CiAKLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fQkFTU19CT09TVCIpOworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9CQVNTX0JPT1NUIik7CiAgICAgfQotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fVklSVFVBTElaRVIiKTsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX1ZJUlRVQUxJWkVSIik7CiAgICAgfQotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX0VRVUFMSVpFUiIpOworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX0VRVUFMSVpFUiIpOwogICAgIH0KLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9WT0xVTUUiKTsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9WT0xVTUUiKTsKICAgICB9CiAKLSAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgRVJST1IgcENvbnRleHQgPT0gTlVMTCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIElOUFVUUyBhcmU6IGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CisgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgSU5QVVRTIGFyZTogY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKIAogICAgIC8vIEluY2FzZSB3ZSBkaXNhYmxlIGFuIGVmZmVjdCwgbmV4dCB0aW1lIHByb2Nlc3MgaXMKICAgICAvLyBjYWxsZWQgdGhlIG51bWJlciBvZiBlZmZlY3QgY2FsbGVkIGNvdWxkIGJlIGdyZWF0ZXIKICAgICAvLyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKIAotICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgTnVtYmVyRWZmZWN0c0NhbGxlZCA9ICVkLCBOdW1iZXJFZmZlY3RzRW5hYmxlZCA9ICVkIiwKKyAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBOdW1iZXJFZmZlY3RzQ2FsbGVkID0gJWQsIE51bWJlckVmZmVjdHNFbmFibGVkID0gJWQiLAogICAgIC8vICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLAogICAgIC8vICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCk7CiAKLSAgICBzd2l0Y2ggKGNtZENvZGUpeworICAgIHN3aXRjaCAoY21kQ29kZSkgewogICAgICAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IsIEVGRkVDVF9DTURfSU5JVDogRVJST1IgZm9yIGVmZmVjdCB0eXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gMDsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgc3RhcnQiKTsKLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fQkFTU19CT09TVCIpOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fQkFTU19CT09TVCIpOwogICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkJhc3NTZXRTdHJlbmd0aChwQ29udGV4dCwgMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpewotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fVklSVFVBTElaRVIiKTsKICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWaXJ0dWFsaXplclNldFN0cmVuZ3RoKHBDb250ZXh0LCAwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpewotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9FUVVBTElaRVIiKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9FUVVBTElaRVIiKTsKICAgICAgICAgICAgICAgICBhbmRyb2lkOjpFcXVhbGl6ZXJTZXRQcmVzZXQocENvbnRleHQsIDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSl7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX1ZPTFVNRSIpOwotICAgICAgICAgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBhbmRyb2lkOjpWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgMCk7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fVk9MVU1FIik7CisgICAgICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0NPTkZJRzoKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgc3RhcnQiKTsKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgICA9PSBOVUxMIHx8IGNtZFNpemUgICAgICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfQ09ORklHIHN0YXJ0Iik7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUc6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0NPTkZJRzogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBhbmRyb2lkOjpFZmZlY3Rfc2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190ICopIHBDbWREYXRhKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgZW5kIik7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVmZmVjdF9zZXRDb25maWcocENvbnRleHQsIChlZmZlY3RfY29uZmlnX3QqKXBDbWREYXRhKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfQ09ORklHIGVuZCIpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9DT05GSUc6CiAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9DT05GSUc6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0NPTkZJRzogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYW5kcm9pZDo6RWZmZWN0X2dldENvbmZpZyhwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCAqKXBSZXBseURhdGEpOworICAgICAgICAgICAgYW5kcm9pZDo6RWZmZWN0X2dldENvbmZpZyhwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCopcFJlcGx5RGF0YSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfUkVTRVQ6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9SRVNFVCBzdGFydCIpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1JFU0VUIHN0YXJ0Iik7CiAgICAgICAgICAgICBhbmRyb2lkOjpFZmZlY3Rfc2V0Q29uZmlnKHBDb250ZXh0LCAmcENvbnRleHQtPmNvbmZpZyk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9SRVNFVCBlbmQiKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9SRVNFVCBlbmQiKTsKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06ewotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKIAotICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpKSB7CisgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQpAQCAtMzQwMSw3NSArMzE5NSw2MiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcGFkZGVkUGFyYW1TaXplID0gY29tcHV0ZVBhcmFtVk9mZnNldChwKTsKICAgICAgICAgICAgIGlmICgoRUZGRUNUX1BBUkFNX1NJWkVfTUFYIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSA8IHBhZGRlZFBhcmFtU2l6ZSkgfHwKLSAgICAgICAgICAgICAgICAoRUZGRUNUX1BBUkFNX1NJWkVfTUFYIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAtIHBhZGRlZFBhcmFtU2l6ZSA8Ci0gICAgICAgICAgICAgICAgICAgIHAtPnZzaXplKSkgeworICAgICAgICAgICAgICAgIChFRkZFQ1RfUEFSQU1fU0laRV9NQVggLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIC0gcGFkZGVkUGFyYW1TaXplIDwgcC0+dnNpemUpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRUZGRUNUX0NNRF9HRVRfUEFSQU06IHBhZGRlZF9wc2l6ZSBvciB2c2l6ZSB0b28gYmlnIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZFJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwYWRkZWRQYXJhbVNpemUgKyBwLT52c2l6ZTsKICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplIDwgZXhwZWN0ZWRSZXBseVNpemUpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTTogbWluLiByZXBseVNpemUgJXUsIGdvdCAldSBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFJlcGx5U2l6ZSwgKnJlcGx5U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRSZXBseVNpemUsICpyZXBseVNpemUpOwogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzI3MDU0MzgiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOwogCi0gICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKyAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBSZXBseURhdGE7CiAKICAgICAgICAgICAgIHVpbnQzMl90IHZvZmZzZXQgPSBwYWRkZWRQYXJhbVNpemU7Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7Ci0gICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6QmFzc0Jvb3N0X2dldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OkJhc3NCb29zdF9nZXRQYXJhbWV0ZXIocENvbnRleHQsIHAtPnBzaXplLCBwLT5kYXRhLCAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRCYXNzQm9vc3RfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0QmFzc0Jvb3N0X2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKLSAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwgcC0+cHNpemUsICh2b2lkKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICIqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICVkICIsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwotICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6RXF1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwgcC0+cHNpemUsIHAtPmRhdGEsICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAiCisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAiCiAgICAgICAgICAgICAgICAgLy8gICAgICAgIipwUmVwbHlEYXRhICUwOHggJTA4eCIsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksICpyZXBseVNpemUsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCksCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArCiAgICAgICAgICAgICAgICAgLy8gICAgICAgIHNpemVvZihpbnQzMl90KSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSl7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7Ci0gICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6Vm9sdW1lX2dldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6Vm9sdW1lX2dldFBhcmFtZXRlcihwQ29udGV4dCwgcC0+cHNpemUsICh2b2lkKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLCBwLT5kYXRhICsgdm9mZnNldCk7CiAKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZV9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICIqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICVkICIsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCkBAIC0zNDc3LDEyMyArMzI1OCwxMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwogCi0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9HRVRfUEFSQU0gZW5kIik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIGVuZCIpOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOnsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOwotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpewotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0QmFzc0Jvb3N0X2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkIiwKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTogeworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0QmFzc0Jvb3N0X2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlCisgICAgICAgICAgICAgICAgLy8gJWQiLAogICAgICAgICAgICAgICAgIC8vICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCiAgICAgICAgICAgICAgICAgLy8gICAgICAgKnJlcGx5U2l6ZSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKTsKIAotICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgICAgIT0gKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgK3NpemVvZihpbnQxNl90KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgIT0gKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgKyBzaXplb2YoaW50MTZfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2b2Zmc2V0ID0gY29tcHV0ZVBhcmFtVk9mZnNldChwKTsKIAotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0bkJhc3NCb29zdF9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRuQmFzc0Jvb3N0X2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRzaXplb2YoZWZmZWN0X3BhcmFtX3QpIGlzICAlZFxuIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT5wc2l6ZSBpcyAlZFxuIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT52c2l6ZSBpcyAlZCIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIlxuIiwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CiAKLSAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkJhc3NCb29zdF9zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcC0+cHNpemUsICh2b2lkKilwLT5kYXRhLCBwLT52c2l6ZSwgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKLSAgICAgICAgICAgICAgLy8gV2FybmluZyB0aGlzIGxvZyB3aWxsIGZhaWwgdG8gcHJvcGVybHkgcmVhZCBhbiBpbnQzMl90IHZhbHVlLCBhc3N1bWVzIGludDE2X3QKLSAgICAgICAgICAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCIsCi0gICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAotICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgICAgICAgICAgICAgIC8vIFdhcm5pbmcgdGhpcyBsb2cgd2lsbCBmYWlsIHRvIHByb3Blcmx5IHJlYWQgYW4gaW50MzJfdCB2YWx1ZSwgYXNzdW1lcyBpbnQxNl90CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUKKyAgICAgICAgICAgICAgICAvLyAlZCIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCisgICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArCisgICAgICAgICAgICAgICAgLy8gICAgICAgIHNpemVvZihpbnQzMl90KSkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWwgcGFyYW1ldGVycyBhcmUgaW50MTZfdCBvciBpbnQzMl90Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplICAgID4gKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgK3NpemVvZihpbnQzMl90KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgICAgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArc2l6ZW9mKGludDE2X3QpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWwgcGFyYW1ldGVycyBhcmUgaW50MTZfdCBvciBpbnQzMl90CisgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPiAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArIHNpemVvZihpbnQzMl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICsgc2l6ZW9mKGludDE2X3QpKSB8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2b2Zmc2V0ID0gY29tcHV0ZVBhcmFtVk9mZnNldChwKTsKIAotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0blZpcnR1YWxpemVyX2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdG5WaXJ0dWFsaXplcl9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0c2l6ZW9mKGVmZmVjdF9wYXJhbV90KSBpcyAgJWRcbiIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+cHNpemUgaXMgJWRcbiIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+dnNpemUgaXMgJWQiCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgIGNtZFNpemUsIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIHAtPnBzaXplLCBwLT52c2l6ZSApOwogCi0gICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHAtPnBzaXplLCAodm9pZCopcC0+ZGF0YSwgcC0+dnNpemUsIHAtPmRhdGEgKyB2b2Zmc2V0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpewotICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCi0gICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKLSAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkCisgICAgICAgICAgICAgICAgLy8gIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgc2l6ZW9mKGludDMyX3QpKSk7CiAKICAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBDbWREYXRhOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZvZmZzZXQgPSBjb21wdXRlUGFyYW1WT2Zmc2V0KHApOwogCi0gICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RXF1YWxpemVyX3NldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHAtPnBzaXplLCAodm9pZCopcC0+ZGF0YSwgcC0+dnNpemUsIHAtPmRhdGEgKyB2b2Zmc2V0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpewotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOwotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICtzaXplb2YoaW50MzJfdCkpKTsKIAotICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgICAgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2b2Zmc2V0ID0gY29tcHV0ZVBhcmFtVk9mZnNldChwKTsKIAotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlZvbHVtZV9zZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6Vm9sdW1lX3NldFBhcmFtZXRlcihwQ29udGV4dCwgcC0+cHNpemUsICh2b2lkKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSwgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIGVuZCIpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBlbmQiKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfRU5BQkxFOgpAQCAtMzYwMyw1NyArMzM3NSw1NiBAQAogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFZmZlY3Rfc2V0RW5hYmxlZChwQ29udGV4dCwgTFZNX1RSVUUpOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFZmZlY3Rfc2V0RW5hYmxlZChwQ29udGV4dCwgTFZNX1RSVUUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFIHN0YXJ0Iik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRSBzdGFydCIpOwogICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFZmZlY3Rfc2V0RW5hYmxlZChwQ29udGV4dCwgTFZNX0ZBTFNFKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X3NldEVuYWJsZWQocENvbnRleHQsIExWTV9GQUxTRSk7CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKLSAgICAgICAgeworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRTogewogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0Ugc3RhcnQiKTsKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgID09IE5VTEwpeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX0RFVklDRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlID0gKih1aW50MzJfdCAqKXBDbWREYXRhOwotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZSA9IChhdWRpb19kZXZpY2VzX3QpIGRldmljZTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAqKGF1ZGlvX2RldmljZXNfdCAqKXBDbWREYXRhOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZSA9IGRldmljZTsKIAogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSB7Ci0gICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpeworICAgICAgICAgICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSB8fAorICAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fQkFTU19CT09TVCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fQkFTX0JPT1NUIik7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2UgZG9lc250IHN1cHBvcnQgYmFzc2Jvb3N0IHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgYmFzc2Jvb3N0IHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZAogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKIAogICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGlzYWJsZSBMVk1fQkFTU19CT09TVCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcENtZERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2Rpc2FibGUocENvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX1RSVUU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyB2YWxpZCBmb3IgTFZNX0JBU1NfQk9PU1QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwQ21kRGF0YSk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2Ugc3VwcG9ydHMgYmFzc2Jvb3N0IGFuZCB0aGUgZWZmZWN0IGhhcyBiZWVuIHRlbXBvcmFyaWx5IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgdGhlbiByZS1lbmFibGUgaXQKIAogICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgcmUtZW5hYmxlIExWTV9CQVNTX0JPT1NUICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKQEAgLTM2NjQsMTI5ICszNDM1LDEyOCBAQAogICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGNhc2UgdW5sZXNzIGNvbmZpZ3VyYXRpb24gaXMgZm9yY2VkCiAgICAgICAgICAgICAgICAgICAgIGlmIChhbmRyb2lkOjpWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGRldmljZSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhIGRldmljZSBkb2VzbnQgc3VwcG9ydCB2aXJ0dWFsaXplciB0aGUgZWZmZWN0IG11c3QgYmUgdGVtcG9yYXJpbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCB2aXJ0dWFsaXplciB0aGUgZWZmZWN0IG11c3QgYmUgdGVtcG9yYXJpbHkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkIHRoZSBlZmZlY3QgbXVzdCBzdGlsbCByZXBvcnQgaXRzIG9yaWdpbmFsIHN0YXRlIGFzIHRoaXMgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcENtZERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9kaXNhYmxlKHBDb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9UUlVFOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyB2YWxpZCBmb3IgTFZNX1ZJUlRVQUxJWkVSICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwQ21kRGF0YSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIHN1cHBvcnRzIHZpcnR1YWxpemVyIGFuZCB0aGUgZWZmZWN0IGhhcyBiZWVuIHRlbXBvcmFyaWx5CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgcmUtZW5hYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IC8vIGVsc2UgdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQgdG8gYSBjZXJ0YWluIGRldmljZSwgbm90aGluZyB0byBkbworICAgICAgICAgICAgICAgIH0gIC8vIGVsc2UgdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQgdG8gYSBjZXJ0YWluIGRldmljZSwgbm90aGluZyB0byBkbwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZW5kIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKLSAgICAgICAgeworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogewogICAgICAgICAgICAgdWludDMyX3QgbGVmdFZvbHVtZSwgcmlnaHRWb2x1bWU7Ci0gICAgICAgICAgICBpbnQxNl90ICBsZWZ0ZEIsIHJpZ2h0ZEI7Ci0gICAgICAgICAgICBpbnQxNl90ICBtYXhkQiwgcGFuZEI7Ci0gICAgICAgICAgICBpbnQzMl90ICB2b2xfcmV0WzJdID0gezE8PDI0LDE8PDI0fTsgLy8gQXBwbHkgbm8gdm9sdW1lCi0gICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgICAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICAgICAgICAgIGludDE2X3QgbGVmdGRCLCByaWdodGRCOworICAgICAgICAgICAgaW50MTZfdCBtYXhkQiwgcGFuZEI7CisgICAgICAgICAgICBpbnQzMl90IHZvbF9yZXRbMl0gPSB7MSA8PCAyNCwgMSA8PCAyNH07ICAgICAvLyBBcHBseSBubyB2b2x1bWUKKyAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgICAgICAgICAvLyBpZiBwUmVwbHlEYXRhIGlzIE5VTEwsIFZPTF9DVFJMIGlzIGRlbGVnYXRlZCB0byBhbm90aGVyIGVmZmVjdAotICAgICAgICAgICAgaWYocFJlcGx5RGF0YSA9PSBMVk1fTlVMTCl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBMVk1fTlVMTCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IDIgKiBzaXplb2YodWludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgMipzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1ZPTFVNRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsZWZ0Vm9sdW1lICA9ICgoKih1aW50MzJfdCAqKXBDbWREYXRhKSk7Ci0gICAgICAgICAgICByaWdodFZvbHVtZSA9ICgoKigodWludDMyX3QgKilwQ21kRGF0YSArIDEpKSk7CisgICAgICAgICAgICBsZWZ0Vm9sdW1lID0gKCgqKHVpbnQzMl90KilwQ21kRGF0YSkpOworICAgICAgICAgICAgcmlnaHRWb2x1bWUgPSAoKCooKHVpbnQzMl90KilwQ21kRGF0YSArIDEpKSk7CiAKLSAgICAgICAgICAgIGlmKGxlZnRWb2x1bWUgPT0gMHgxMDAwMDAwKXsKKyAgICAgICAgICAgIGlmIChsZWZ0Vm9sdW1lID09IDB4MTAwMDAwMCkgewogICAgICAgICAgICAgICAgIGxlZnRWb2x1bWUgLT0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHJpZ2h0Vm9sdW1lID09IDB4MTAwMDAwMCl7CisgICAgICAgICAgICBpZiAocmlnaHRWb2x1bWUgPT0gMHgxMDAwMDAwKSB7CiAgICAgICAgICAgICAgICAgcmlnaHRWb2x1bWUgLT0gMTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ29udmVydCB2b2x1bWUgdG8gZEIKLSAgICAgICAgICAgIGxlZnRkQiAgPSBhbmRyb2lkOjpMVkNfQ29udmVydF9Wb2xUb0RiKGxlZnRWb2x1bWUpOworICAgICAgICAgICAgbGVmdGRCID0gYW5kcm9pZDo6TFZDX0NvbnZlcnRfVm9sVG9EYihsZWZ0Vm9sdW1lKTsKICAgICAgICAgICAgIHJpZ2h0ZEIgPSBhbmRyb2lkOjpMVkNfQ29udmVydF9Wb2xUb0RiKHJpZ2h0Vm9sdW1lKTsKIAogICAgICAgICAgICAgcGFuZEIgPSByaWdodGRCIC0gbGVmdGRCOwogCiAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbWF4IHZvbHVtZSBpbiBkQgogICAgICAgICAgICAgbWF4ZEIgPSBsZWZ0ZEI7Ci0gICAgICAgICAgICBpZihyaWdodGRCID4gbWF4ZEIpeworICAgICAgICAgICAgaWYgKHJpZ2h0ZEIgPiBtYXhkQikgewogICAgICAgICAgICAgICAgIG1heGRCID0gcmlnaHRkQjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FIFNlc3Npb246ICVkLCBTZXNzaW9uSUQ6ICVkIFZPTFVNRSBpcyAlZCBkQiwgIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FIFNlc3Npb246ICVkLCBTZXNzaW9uSUQ6ICVkIFZPTFVNRSBpcyAlZCBkQiwgIgogICAgICAgICAgICAgLy8gICAgICAiZWZmZWN0IGlzICVkIiwKLSAgICAgICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQsCisgICAgICAgICAgICAvLyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8sIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCwKICAgICAgICAgICAgIC8vKGludDMyX3QpbWF4ZEIsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBMZWZ0IGlzICVkLCBSaWdodCBpcyAlZCIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBMZWZ0ICVkZEIsIFJpZ2h0ICVkZEIsIFBvc2l0aW9uICVkZEIiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBMZWZ0IGlzICVkLCBSaWdodCBpcyAlZCIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogTGVmdCAlZGRCLCBSaWdodCAlZGRCLCBQb3NpdGlvbiAlZGRCIiwKICAgICAgICAgICAgIC8vICAgICAgICBsZWZ0ZEIsIHJpZ2h0ZEIsIHBhbmRCKTsKIAotICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHZvbF9yZXQsIHNpemVvZihpbnQzMl90KSoyKTsKLSAgICAgICAgICAgIGFuZHJvaWQ6OlZvbHVtZVNldFZvbHVtZUxldmVsKHBDb250ZXh0LCAoaW50MTZfdCkobWF4ZEIqMTAwKSk7CisgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgdm9sX3JldCwgc2l6ZW9mKGludDMyX3QpICogMik7CisgICAgICAgICAgICBhbmRyb2lkOjpWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgKGludDE2X3QpKG1heGRCICogMTAwKSk7CiAKICAgICAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotICAgICAgICAgICAgTHZtU3RhdHVzID1MVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCZBY3RpdmVQYXJhbXMpOworICAgICAgICAgICAgTHZtU3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIikKLSAgICAgICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAogICAgICAgICAgICAgLyogVm9sdW1lIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICA9IHBhbmRCOwotICAgICAgICAgICAgQUxPR1YoIlx0XHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbigpICgtOTZkQiAtPiArOTZkQiktPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgKTsKKyAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlID0gcGFuZEI7CisgICAgICAgICAgICBBTE9HVigiXHRcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKCkgKC05NmRCIC0+ICs5NmRCKS0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSk7CiAKICAgICAgICAgICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCi0gICAgICAgICAgICBMdm1TdGF0dXMgPUxWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgICAgICBMdm1TdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQotICAgICAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGVuZC4uLlxuXG4iKTsKKyAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBlbmQuLi5cblxuIik7CiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBFZmZlY3RfY29tbWFuZCAqLworfSAvKiBlbmQgRWZmZWN0X2NvbW1hbmQgKi8KIAogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBnZXRfZGVzY3JpcHRvciAqLwotaW50IEVmZmVjdF9nZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKLXsKLSAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOwotICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CitpbnQgRWZmZWN0X2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CisgICAgRWZmZWN0Q29udGV4dCogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCopc2VsZjsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjOwogCiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiRWZmZWN0X2dldERlc2NyaXB0b3IoKSBpbnZhbGlkIHBhcmFtIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHN3aXRjaChwQ29udGV4dC0+RWZmZWN0VHlwZSkgeworICAgIHN3aXRjaCAocENvbnRleHQtPkVmZmVjdFR5cGUpIHsKICAgICAgICAgY2FzZSBMVk1fQkFTU19CT09TVDoKICAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z0Jhc3NCb29zdERlc2NyaXB0b3I7CiAgICAgICAgICAgICBicmVhazsKQEAgLTM4MDYsMjYgKzM1NzYsMjQgQEAKICAgICAqcERlc2NyaXB0b3IgPSAqZGVzYzsKIAogICAgIHJldHVybiAwOwotfSAgIC8qIGVuZCBFZmZlY3RfZ2V0RGVzY3JpcHRvciAqLworfSAvKiBlbmQgRWZmZWN0X2dldERlc2NyaXB0b3IgKi8KIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZWZmZWN0CiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdMdm1FZmZlY3RJbnRlcmZhY2UgPSB7Ci0gICAgRWZmZWN0X3Byb2Nlc3MsCi0gICAgRWZmZWN0X2NvbW1hbmQsCi0gICAgRWZmZWN0X2dldERlc2NyaXB0b3IsCi0gICAgTlVMTCwKLX07ICAgIC8qIGVuZCBnTHZtRWZmZWN0SW50ZXJmYWNlICovCisgICAgICAgIEVmZmVjdF9wcm9jZXNzLAorICAgICAgICBFZmZlY3RfY29tbWFuZCwKKyAgICAgICAgRWZmZWN0X2dldERlc2NyaXB0b3IsCisgICAgICAgIE5VTEwsCit9OyAvKiBlbmQgZ0x2bUVmZmVjdEludGVyZmFjZSAqLwogCiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCi1fX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1hdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0gewotICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCi0gICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKLSAgICAubmFtZSA9ICJFZmZlY3QgQnVuZGxlIExpYnJhcnkiLAotICAgIC5pbXBsZW1lbnRvciA9ICJOWFAgU29mdHdhcmUgTHRkLiIsCi0gICAgLmNyZWF0ZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCi0gICAgLnJlbGVhc2VfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKLSAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAorX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICAgICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICAgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAgICAgLm5hbWUgPSAiRWZmZWN0IEJ1bmRsZSBMaWJyYXJ5IiwKKyAgICAgICAgLmltcGxlbWVudG9yID0gIk5YUCBTb2Z0d2FyZSBMdGQuIiwKKyAgICAgICAgLmNyZWF0ZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCisgICAgICAgIC5yZWxlYXNlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCisgICAgICAgIC5nZXRfZGVzY3JpcHRvciA9IGFuZHJvaWQ6OkVmZmVjdEdldERlc2NyaXB0b3IsCiB9OwotCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCmluZGV4IDUyNGUxMDMuLmYzZTc4ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCkBAIC0yMywxNzYgKzIzLDE0OCBAQAogI2luY2x1ZGUgPExWTS5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogCi0jZGVmaW5lIEZJVkVCQU5EX05VTUJBTkRTICAgICAgICAgIDUKLSNkZWZpbmUgTUFYX05VTV9CQU5EUyAgICAgICAgICAgICAgNQotI2RlZmluZSBNQVhfQ0FMTF9TSVpFICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgTFZNX01BWF9TRVNTSU9OUyAgICAgICAgICAgMzIKLSNkZWZpbmUgTFZNX1VOVVNFRF9TRVNTSU9OICAgICAgICAgSU5UX01BWAotI2RlZmluZSBCQVNTX0JPT1NUX0NVUF9MT0FEX0FSTTlFICAxNTAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCi0jZGVmaW5lIFZJUlRVQUxJWkVSX0NVUF9MT0FEX0FSTTlFIDEyMCAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKLSNkZWZpbmUgRVFVQUxJWkVSX0NVUF9MT0FEX0FSTTlFICAgMjIwICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUwotI2RlZmluZSBWT0xVTUVfQ1VQX0xPQURfQVJNOUUgICAgICAwICAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCi0jZGVmaW5lIEJVTkRMRV9NRU1fVVNBR0UgICAgICAgICAgIDI1ICAgICAvLyBFeHByZXNzZWQgaW4ga0IKKyNkZWZpbmUgRklWRUJBTkRfTlVNQkFORFMgNQorI2RlZmluZSBNQVhfTlVNX0JBTkRTIDUKKyNkZWZpbmUgTUFYX0NBTExfU0laRSAyNTYKKyNkZWZpbmUgTFZNX01BWF9TRVNTSU9OUyAzMgorI2RlZmluZSBMVk1fVU5VU0VEX1NFU1NJT04gSU5UX01BWAorI2RlZmluZSBCQVNTX0JPT1NUX0NVUF9MT0FEX0FSTTlFIDE1MCAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBWSVJUVUFMSVpFUl9DVVBfTE9BRF9BUk05RSAxMjAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBFUVVBTElaRVJfQ1VQX0xPQURfQVJNOUUgMjIwICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBWT0xVTUVfQ1VQX0xPQURfQVJNOUUgMCAgICAgICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBCVU5ETEVfTUVNX1VTQUdFIDI1ICAgICAgICAgICAgIC8vIEV4cHJlc3NlZCBpbiBrQgogCiAjaWZuZGVmIE9QRU5TTF9FU19IXwotc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZPTFVNRV8gPSB7IDB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Ci1jb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1ZPTFVNRSA9ICZTTF9JSURfVk9MVU1FXzsKLSNlbmRpZiAvL09QRU5TTF9FU19IXworc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZPTFVNRV8gPSB7CisgICAgICAgIDB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX07Citjb25zdCBlZmZlY3RfdXVpZF90KiBjb25zdCBTTF9JSURfVk9MVU1FID0gJlNMX0lJRF9WT0xVTUVfOworI2VuZGlmICAvLyBPUEVOU0xfRVNfSF8KIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX0JBU1NfQk9PU1QsCi0gICAgTFZNX1ZJUlRVQUxJWkVSLAotICAgIExWTV9FUVVBTElaRVIsCi0gICAgTFZNX1ZPTFVNRQotfSBsdm1fZWZmZWN0X2VuOwordHlwZWRlZiBlbnVtIHsgTFZNX0JBU1NfQk9PU1QsIExWTV9WSVJUVUFMSVpFUiwgTFZNX0VRVUFMSVpFUiwgTFZNX1ZPTFVNRSB9IGx2bV9lZmZlY3RfZW47CiAKIC8vIFByZXNldCBjb25maWd1cmF0aW9uLgogc3RydWN0IFByZXNldENvbmZpZyB7CiAgICAgLy8gSHVtYW4tcmVhZGFibGUgbmFtZS4KLSAgICBjb25zdCBjaGFyICogbmFtZTsKKyAgICBjb25zdCBjaGFyKiBuYW1lOwogICAgIC8vIEFuIGFycmF5IG9mIHNpemUgbkJhbmRzIHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQogICAgIC8vIGNvcnJlc3BvbmRpbmcgYmFuZC4KLSAgICAvL2NvbnN0IEJhbmRDb25maWcgKiBiYW5kQ29uZmlnczsKKyAgICAvLyBjb25zdCBCYW5kQ29uZmlnICogYmFuZENvbmZpZ3M7CiB9OwogCiAvKiBCdW5kbGVkRWZmZWN0Q29udGV4dCA6IE9uZSBwZXIgc2Vzc2lvbiAqLwotc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0ewotICAgIExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25ObzsgICAgICAgICAgICAgICAgLyogQ3VycmVudCBzZXNzaW9uIG51bWJlciAqLwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbklkOyAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHNlc3Npb24gaWQgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWb2x1bWVFbmFibGVkOyAgICAgICAgICAgLyogRmxhZyBmb3IgVm9sdW1lICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXF1YWxpemVyRW5hYmxlZDsgICAgICAgIC8qIEZsYWcgZm9yIEVRICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmFzc0VuYWJsZWQ7ICAgICAgICAgICAgIC8qIEZsYWcgZm9yIEJhc3MgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzVGVtcERpc2FibGVkOyAgICAgICAgLyogRmxhZyBmb3IgQmFzcyB0byBiZSByZS1lbmFibGVkICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJFbmFibGVkOyAgICAgIC8qIEZsYWcgZm9yIFZpcnR1YWxpemVyICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQ7IC8qIEZsYWcgZm9yIGVmZmVjdCB0byBiZSByZS1lbmFibGVkICovCi0gICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgICBuT3V0cHV0RGV2aWNlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgZm9yIHRoZSBlZmZlY3QgKi8KLSAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICAgIG5WaXJ0dWFsaXplckZvcmNlZERldmljZTsgLyogRm9yY2VkIGRldmljZSB2aXJ0dWFsaXphdGlvbiBtb2RlKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNFbmFibGVkOyAgICAgLyogRWZmZWN0cyBpbiB0aGlzIHNlc3Npb24gKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNDYWxsZWQ7ICAgICAgLyogRWZmZWN0cyBjYWxsZWQgc28gZmFyICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZvbHVtZTsgICAgICAgICAgICAgIC8qIE5vIHNtb290aGluZyBvbiBmaXJzdCBWb2wgY2hhbmdlICovCitzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHQgeworICAgIExWTV9IYW5kbGVfdCBoSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgIGludCBTZXNzaW9uTm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc2Vzc2lvbiBudW1iZXIgKi8KKyAgICBpbnQgU2Vzc2lvbklkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHNlc3Npb24gaWQgKi8KKyAgICBib29sIGJWb2x1bWVFbmFibGVkOyAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBWb2x1bWUgKi8KKyAgICBib29sIGJFcXVhbGl6ZXJFbmFibGVkOyAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBFUSAqLworICAgIGJvb2wgYkJhc3NFbmFibGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIEJhc3MgKi8KKyAgICBib29sIGJCYXNzVGVtcERpc2FibGVkOyAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBCYXNzIHRvIGJlIHJlLWVuYWJsZWQgKi8KKyAgICBib29sIGJWaXJ0dWFsaXplckVuYWJsZWQ7ICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBWaXJ0dWFsaXplciAqLworICAgIGJvb2wgYlZpcnR1YWxpemVyVGVtcERpc2FibGVkOyAgICAgICAgICAgIC8qIEZsYWcgZm9yIGVmZmVjdCB0byBiZSByZS1lbmFibGVkICovCisgICAgYXVkaW9fZGV2aWNlc190IG5PdXRwdXREZXZpY2U7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSBmb3IgdGhlIGVmZmVjdCAqLworICAgIGF1ZGlvX2RldmljZXNfdCBuVmlydHVhbGl6ZXJGb3JjZWREZXZpY2U7IC8qIEZvcmNlZCBkZXZpY2UgdmlydHVhbGl6YXRpb24gbW9kZSovCisgICAgaW50IE51bWJlckVmZmVjdHNFbmFibGVkOyAgICAgICAgICAgICAgICAgLyogRWZmZWN0cyBpbiB0aGlzIHNlc3Npb24gKi8KKyAgICBpbnQgTnVtYmVyRWZmZWN0c0NhbGxlZDsgICAgICAgICAgICAgICAgICAvKiBFZmZlY3RzIGNhbGxlZCBzbyBmYXIgKi8KKyAgICBib29sIGZpcnN0Vm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBzbW9vdGhpbmcgb24gZmlyc3QgVm9sIGNoYW5nZSAqLwogICAgIC8vIFNhdmVkIHBhcmFtZXRlcnMgZm9yIGVhY2ggZWZmZWN0ICovCiAgICAgLy8gQmFzcyBCb29zdAotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzc1N0cmVuZ3RoU2F2ZWQ7ICAgICAgICAvKiBDb252ZXJzaW9uIGJldHdlZW4gR2V0L1NldCAqLworICAgIGludCBCYXNzU3RyZW5ndGhTYXZlZDsgLyogQ29udmVyc2lvbiBiZXR3ZWVuIEdldC9TZXQgKi8KICAgICAvLyBFcXVhbGl6ZXIKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1clByZXNldDsgICAgICAgICAgICAgICAgLyogQ3VycmVudCBwcmVzZXQgYmVpbmcgdXNlZCAqLworICAgIGludCBDdXJQcmVzZXQ7IC8qIEN1cnJlbnQgcHJlc2V0IGJlaW5nIHVzZWQgKi8KICAgICAvLyBWaXJ0dWFsemVyCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0U3RyZW5ndGhTYXZlZDsgICAgICAgIC8qIENvbnZlcnNpb24gYmV0d2VlbiBHZXQvU2V0ICovCisgICAgaW50IFZpcnRTdHJlbmd0aFNhdmVkOyAvKiBDb252ZXJzaW9uIGJldHdlZW4gR2V0L1NldCAqLwogICAgIC8vIFZvbHVtZQotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxTYXZlZDsgICAgIC8qIGZvciB3aGVuIG11dGUgaXMgc2V0LCBsZXZlbCBtdXN0IGJlIHNhdmVkICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblNhdmVkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk11dGVFbmFibGVkOyAgIC8qIE11c3Qgc3RvcmUgYXMgbXV0ZSA9IC05NmRCIGxldmVsICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RlcmVvUG9zaXRpb25FbmFibGVkOwotICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNQZXJTZWNvbmQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnRFcTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNUb0V4aXRDb3VudEJiOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1RvRXhpdENvdW50VmlydDsKLSAgICBlZmZlY3RfYnVmZmVyX3QgICAgICAgICAgICAgICAgICp3b3JrQnVmZmVyOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRHYWluZEJbRklWRUJBTkRfTlVNQkFORFNdOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIENoTWFzazsKLSNlbmRpZgorICAgIGludCBsZXZlbFNhdmVkOyAvKiBmb3Igd2hlbiBtdXRlIGlzIHNldCwgbGV2ZWwgbXVzdCBiZSBzYXZlZCAqLworICAgIGludCBwb3NpdGlvblNhdmVkOworICAgIGJvb2wgYk11dGVFbmFibGVkOyAvKiBNdXN0IHN0b3JlIGFzIG11dGUgPSAtOTZkQiBsZXZlbCAqLworICAgIGJvb2wgYlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZDsKKyAgICBMVk1fRnNfZW4gU2FtcGxlUmF0ZTsKKyAgICBpbnQgU2FtcGxlc1BlclNlY29uZDsKKyAgICBpbnQgU2FtcGxlc1RvRXhpdENvdW50RXE7CisgICAgaW50IFNhbXBsZXNUb0V4aXRDb3VudEJiOworICAgIGludCBTYW1wbGVzVG9FeGl0Q291bnRWaXJ0OworICAgIGVmZmVjdF9idWZmZXJfdCogd29ya0J1ZmZlcjsKKyAgICBpbnQgZnJhbWVDb3VudDsKKyAgICBpbnQzMl90IGJhbmRHYWluZEJbRklWRUJBTkRfTlVNQkFORFNdOworICAgIGludCB2b2x1bWU7CisgICAgTFZNX0lOVDMyIENoTWFzazsKIAogICAgIC8qIEJpdG1hc2sgd2hldGhlciBkcmFpbiBpcyBpbiBwcm9ncmVzcyBkdWUgdG8gZGlzYWJsaW5nIHRoZSBlZmZlY3QuCiAgICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgYml0IHRvIGFuIGVmZmVjdCBpcyBzZXQgYnkgMSA8PCBsdm1fZWZmZWN0X2VuLiAqLwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SW5EcmFpbjsKKyAgICBpbnQgZWZmZWN0SW5EcmFpbjsKIAogICAgIC8qIEJpdG1hc2sgd2hldGhlciBwcm9jZXNzKCkgd2FzIGNhbGxlZCBmb3IgYSBwYXJ0aWN1bGFyIGVmZmVjdC4KICAgICAgICBUaGUgY29ycmVzcG9uZGluZyBiaXQgdG8gYW4gZWZmZWN0IGlzIHNldCBieSAxIDw8IGx2bV9lZmZlY3RfZW4uICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RQcm9jZXNzQ2FsbGVkOworICAgIGludCBlZmZlY3RQcm9jZXNzQ2FsbGVkOwogfTsKIAogLyogU2Vzc2lvbkNvbnRleHQgOiBPbmUgc2Vzc2lvbiAqLwotc3RydWN0IFNlc3Npb25Db250ZXh0ewotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWb2x1bWVJbnN0YW50aWF0ZWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXF1YWxpemVySW5zdGFudGlhdGVkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJhc3NJbnN0YW50aWF0ZWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQ7Ci0gICAgQnVuZGxlZEVmZmVjdENvbnRleHQgICAgICAgICAgICAqcEJ1bmRsZWRDb250ZXh0Oworc3RydWN0IFNlc3Npb25Db250ZXh0IHsKKyAgICBib29sIGJCdW5kbGVkRWZmZWN0c0VuYWJsZWQ7CisgICAgYm9vbCBiVm9sdW1lSW5zdGFudGlhdGVkOworICAgIGJvb2wgYkVxdWFsaXplckluc3RhbnRpYXRlZDsKKyAgICBib29sIGJCYXNzSW5zdGFudGlhdGVkOworICAgIGJvb2wgYlZpcnR1YWxpemVySW5zdGFudGlhdGVkOworICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0KiBwQnVuZGxlZENvbnRleHQ7CiB9OwogCi1zdHJ1Y3QgRWZmZWN0Q29udGV4dHsKLSAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOwotICAgIGVmZmVjdF9jb25maWdfdCAgICAgICAgICAgICAgICAgY29uZmlnOwotICAgIGx2bV9lZmZlY3RfZW4gICAgICAgICAgICAgICAgICAgRWZmZWN0VHlwZTsKLSAgICBCdW5kbGVkRWZmZWN0Q29udGV4dCAgICAgICAgICAgICpwQnVuZGxlZENvbnRleHQ7CitzdHJ1Y3QgRWZmZWN0Q29udGV4dCB7CisgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyogaXRmZTsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICAgIGx2bV9lZmZlY3RfZW4gRWZmZWN0VHlwZTsKKyAgICBCdW5kbGVkRWZmZWN0Q29udGV4dCogcEJ1bmRsZWRDb250ZXh0OwogfTsKIAogLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIFZvbHVtZSBlZmZlY3QgKi8KLXR5cGVkZWYgZW51bQotewotICAgIFZPTFVNRV9QQVJBTV9MRVZFTCwgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgU0xtaWxsaWJlbCA9IHR5cGVkZWYgU0x1aW50MTYgKHNldCAmIGdldCkKLSAgICBWT0xVTUVfUEFSQU1fTUFYTEVWRUwsICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIFNMbWlsbGliZWwgPSB0eXBlZGVmIFNMdWludDE2IChnZXQpCi0gICAgVk9MVU1FX1BBUkFNX01VVEUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMiAoc2V0ICYgZ2V0KQotICAgIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiwgICAgICAgIC8vIHR5cGUgU0xib29sZWFuICA9IHR5cGVkZWYgU0x1aW50MzIgKHNldCAmIGdldCkKLSAgICBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04sICAgICAgICAgICAgICAvLyB0eXBlIFNMcGVybWlsbGUgPSB0eXBlZGVmIFNMdWludDE2IChzZXQgJiBnZXQpCit0eXBlZGVmIGVudW0geworICAgIFZPTFVNRV9QQVJBTV9MRVZFTCwgICAgICAgICAgICAgICAgIC8vIHR5cGUgU0xtaWxsaWJlbCA9IHR5cGVkZWYgU0x1aW50MTYgKHNldCAmIGdldCkKKyAgICBWT0xVTUVfUEFSQU1fTUFYTEVWRUwsICAgICAgICAgICAgICAvLyB0eXBlIFNMbWlsbGliZWwgPSB0eXBlZGVmIFNMdWludDE2IChnZXQpCisgICAgVk9MVU1FX1BBUkFNX01VVEUsICAgICAgICAgICAgICAgICAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMiAoc2V0ICYgZ2V0KQorICAgIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiwgIC8vIHR5cGUgU0xib29sZWFuICA9IHR5cGVkZWYgU0x1aW50MzIgKHNldCAmIGdldCkKKyAgICBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04sICAgICAgICAvLyB0eXBlIFNMcGVybWlsbGUgPSB0eXBlZGVmIFNMdWludDE2IChzZXQgJiBnZXQpCiB9IHRfdm9sdW1lX3BhcmFtczsKIAogc3RhdGljIGNvbnN0IGludCBQUkVTRVRfQ1VTVE9NID0gLTE7CiAKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBiYW5kRnJlcVJhbmdlW0ZJVkVCQU5EX05VTUJBTkRTXVsyXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMDAwMCwgMTIwMDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMjAwMDEsIDQ2MDAwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDYwMDAxLCAxODAwMDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxODAwMDAxLCA3MDAwMDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3MDAwMDAxLCAyMDAwMDAwMH19Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IGJhbmRGcmVxUmFuZ2VbRklWRUJBTkRfTlVNQkFORFNdWzJdID0ge3szMDAwMCwgMTIwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTIwMDAxLCA0NjAwMDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0NjAwMDEsIDE4MDAwMDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxODAwMDAxLCA3MDAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzAwMDAwMSwgMjAwMDAwMDB9fTsKIAotLy9Ob3RlOiBJZiB0aGVzZSBmcmVxdWVuY2llcyBjaGFuZ2UsIHBsZWFzZSB1cGRhdGUgTGltaXRMZXZlbCB2YWx1ZXMgYWNjb3JkaW5nbHkuCi1zdGF0aWMgY29uc3QgTFZNX1VJTlQxNiAgRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAsICAgICAgICAgICAvKiBGcmVxdWVuY2llcyBpbiBIeiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MDAwfTsKKy8vIE5vdGU6IElmIHRoZXNlIGZyZXF1ZW5jaWVzIGNoYW5nZSwgcGxlYXNlIHVwZGF0ZSBMaW1pdExldmVsIHZhbHVlcyBhY2NvcmRpbmdseS4KK3N0YXRpYyBjb25zdCBMVk1fVUlOVDE2IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbXSA9IHs2MCwgLyogRnJlcXVlbmNpZXMgaW4gSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzAsIDkxMCwgMzYwMCwgMTQwMDB9OwogCi1zdGF0aWMgY29uc3QgTFZNX1VJTlQxNiBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwgICAgICAgICAgICAgICAvKiBRIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTZ9Oworc3RhdGljIGNvbnN0IExWTV9VSU5UMTYgRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tdID0gezk2LCAvKiBRIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LCA5NiwgOTYsIDk2fTsKIAotc3RhdGljIGNvbnN0IExWTV9JTlQxNiBFUU5CXzVCYW5kTm9ybWFsUHJlc2V0c1tdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMCwgMCwgMywgICAgICAgLyogTm9ybWFsIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgNSwgLTMsIDUsIDYsICAgICAgLyogQ2xhc3NpY2FsIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIC02LCA3LCAxMywgMTAsICAgLyogRGFuY2UgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAvKiBGbGF0IFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgLTIsIC0yLCA2LCAtMywgICAgLyogRm9sayBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIC04LCAxMywgLTEsIC00LCAgIC8qIEhlYXZ5IE1ldGFsIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDYsIC00LCA1LCA4LCAgICAgLyogSGlwIEhvcCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDUsIC00LCA1LCA5LCAgICAgIC8qIEphenogUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCA0LCA5LCA0LCAtNSwgICAgICAvKiBQb3AgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNiwgLTEsIDgsIDEwfTsgICAvKiBSb2NrIFByZXNldCAqLworc3RhdGljIGNvbnN0IExWTV9JTlQxNiBFUU5CXzVCYW5kTm9ybWFsUHJlc2V0c1tdID0gezMsICAwLCAgMCwgIDAsICAzLCAgIC8qIE5vcm1hbCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgNSwgIC0zLCA1LCAgNiwgICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIC02LCA3LCAgMTMsIDEwLCAgLyogRGFuY2UgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAgLyogRmxhdCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAgLTIsIC0yLCA2LCAgLTMsICAvKiBGb2xrIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICAtOCwgMTMsIC0xLCAtNCwgIC8qIEhlYXZ5IE1ldGFsIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA2LCAgLTQsIDUsICA4LCAgIC8qIEhpcCBIb3AgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgIDUsICAtNCwgNSwgIDksICAgLyogSmF6eiBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNiwgNCwgIDksICA0LCAgLTUsICAvKiBQb3AgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDYsICAtMSwgOCwgIDEwfTsgLyogUm9jayBQcmVzZXQgKi8KIAotc3RhdGljIGNvbnN0IExWTV9JTlQxNiBFUU5CXzVCYW5kU29mdFByZXNldHNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAwLCAwLCAzLCAgICAgIC8qIE5vcm1hbCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAzLCAtMiwgNCwgNCwgICAgIC8qIENsYXNzaWNhbCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAwLCAyLCA0LCAxLCAgICAgIC8qIERhbmNlIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgLyogRmxhdCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAwLCAyLCAtMSwgICAgIC8qIEZvbGsgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMSwgOSwgMywgMCwgICAgICAvKiBIZWF2eSBNZXRhbCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAzLCAwLCAxLCAzLCAgICAgIC8qIEhpcCBIb3AgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMiwgLTIsIDIsIDUsICAgICAvKiBKYXp6IFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDIsIDUsIDEsIC0yLCAgICAgLyogUG9wIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDMsIC0xLCAzLCA1fTsgICAgLyogUm9jayBQcmVzZXQgKi8KK3N0YXRpYyBjb25zdCBMVk1fSU5UMTYgRVFOQl81QmFuZFNvZnRQcmVzZXRzW10gPSB7MywgIDAsIDAsICAwLCAzLCAgLyogTm9ybWFsIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAgMywgLTIsIDQsIDQsICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsICAwLCAyLCAgNCwgMSwgIC8qIERhbmNlIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgMCwgIDAsIDAsICAvKiBGbGF0IFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAgMCwgMCwgIDIsIC0xLCAvKiBGb2xrIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAgMSwgOSwgIDMsIDAsICAvKiBIZWF2eSBNZXRhbCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgIDMsIDAsICAxLCAzLCAgLyogSGlwIEhvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgIDIsIC0yLCAyLCA1LCAgLyogSmF6eiBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDIsIDUsICAxLCAtMiwgLyogUG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAgMywgLTEsIDMsIDV9OyAvKiBSb2NrIFByZXNldCAqLwogCi1zdGF0aWMgY29uc3QgUHJlc2V0Q29uZmlnIGdFcXVhbGl6ZXJQcmVzZXRzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJOb3JtYWwifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkNsYXNzaWNhbCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiRGFuY2UifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkZsYXQifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkZvbGsifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkhlYXZ5IE1ldGFsIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJIaXAgSG9wIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJKYXp6In0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJQb3AifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlJvY2sifX07CitzdGF0aWMgY29uc3QgUHJlc2V0Q29uZmlnIGdFcXVhbGl6ZXJQcmVzZXRzW10gPSB7eyJOb3JtYWwifSwgeyJDbGFzc2ljYWwifSwgICB7IkRhbmNlIn0sICAgeyJGbGF0In0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJGb2xrIn0sICAgeyJIZWF2eSBNZXRhbCJ9LCB7IkhpcCBIb3AifSwgeyJKYXp6In0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJQb3AifSwgICAgeyJSb2NrIn19OwogCiAvKiBUaGUgZm9sbG93aW5nIHRhYmxlcyBoYXZlIGJlZW4gY29tcHV0ZWQgdXNpbmcgdGhlIGFjdHVhbCBsZXZlbHMgbWVhc3VyZWQgYnkgdGhlIG91dHB1dCBvZgogICogd2hpdGUgbm9pc2Ugb3IgcGluayBub2lzZSAoSUVDMjY4LTEpIGZvciB0aGUgRVEgYW5kIEJhc3NCb29zdCBFZmZlY3RzLiBUaGVzZSBhcmUgZXN0aW1hdGVzIG9mCkBAIC0yMDEsMTQgKzE3MywxNCBAQAogICogdXBkYXRlZC4KICAqLwogCi1zdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYW5kRW5lcmd5Q29lZmZpY2llbnRbRklWRUJBTkRfTlVNQkFORFNdID0gewotICAgICAgICA3LjU2LCA5LjY5LCA5LjU5LCA3LjM3LCAyLjg4fTsKK3N0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EU10gPSB7Ny41NiwgOS42OSwgOS41OSwgNy4zNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi44OH07CiAKLXN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2JhbmRFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTLTFdID0gewotICAgICAgICAxMjYuMCwgMTE1LjAsIDEyNS4wLCAxMDQuMCB9Oworc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFuZEVuZXJneUNyb3NzQ29lZmZpY2llbnRbRklWRUJBTkRfTlVNQkFORFMgLSAxXSA9IHsxMjYuMCwgMTE1LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNS4wLCAxMDQuMH07CiAKIHN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNyb3NzQ29lZmZpY2llbnRbRklWRUJBTkRfTlVNQkFORFNdID0gewotICAgICAgICAyMjEuMjEsIDIwOC4xMCwgMjguMTYsIDAuMCwgMC4wIH07CisgICAgICAgIDIyMS4yMSwgMjA4LjEwLCAyOC4xNiwgMC4wLCAwLjB9OwogCiBzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDb2VmZmljaWVudCA9IDkuMDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCmluZGV4IDM5ZjViYjYuLjllYTcwY2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtMTgsNyArMTgsNyBAQAogdHlwZWRlZiBmbG9hdCBMVk1fRkxPQVQ7CiAjZW5kaWYKICNkZWZpbmUgTE9HX1RBRyAiUmV2ZXJiIgotI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIChhcnJheSkgLyBzaXplb2YgKGFycmF5KVswXSkKKyNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXkpWzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CkBAIC0zNywxOSArMzcsMjMgQEAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHJldmVyYgogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdSZXZlcmJJbnRlcmZhY2U7CiAKLSNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpe1wKLSAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWUkVWX05VTExBRERSRVNTKXtcCi0gICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVlJFVl9JTlZBTElETlVNU0FNUExFUyl7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAotICAgICAgICAgICAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAotICAgICAgICB9XAotICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfT1VUT0ZSQU5HRSl7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAotICAgICAgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAotICAgICAgICB9XAorI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfTlVMTEFERFJFU1MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfT1VUT0ZSQU5HRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAogLy8gTmFtZXNwYWNlcwpAQCAtODEsOCArODUsOCBAQAogCiAvLyBOWFAgU1cgYXV4aWxpYXJ5IGVudmlyb25tZW50YWwgcmV2ZXJiCiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yID0gewotICAgICAgICB7IDB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsgMHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZSB9IH0sCi0gICAgICAgIHsgMHg0YTM4N2ZjMCwgMHg4YWIzLCAweDExZGYsIDB4OGJhZCwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwKKyAgICAgICAgezB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllfX0sCisgICAgICAgIHsweDRhMzg3ZmMwLCAweDhhYjMsIDB4MTFkZiwgMHg4YmFkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCiAgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLApAQCAtMTI4LDQyICsxMzIsMzkgQEAKIH07CiAKIC8vIGdEZXNjcmlwdG9ycyBjb250YWlucyBwb2ludGVycyB0byBhbGwgZGVmaW5lZCBlZmZlY3QgZGVzY3JpcHRvciBpbiB0aGlzIGxpYnJhcnkKLXN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICogY29uc3QgZ0Rlc2NyaXB0b3JzW10gPSB7Ci0gICAgICAgICZnQXV4RW52UmV2ZXJiRGVzY3JpcHRvciwKLSAgICAgICAgJmdJbnNlcnRFbnZSZXZlcmJEZXNjcmlwdG9yLAotICAgICAgICAmZ0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3IsCi0gICAgICAgICZnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcgotfTsKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBjb25zdCBnRGVzY3JpcHRvcnNbXSA9IHsKKyAgICAgICAgJmdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yLCAmZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IsICZnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciwKKyAgICAgICAgJmdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yfTsKIAotdHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBwcm9jZXNzX2J1ZmZlcl90OyAvLyBwcm9jZXNzIGluIGZsb2F0Cit0eXBlZGVmIGZsb2F0IHByb2Nlc3NfYnVmZmVyX3Q7ICAvLyBwcm9jZXNzIGluIGZsb2F0CiAKLXN0cnVjdCBSZXZlcmJDb250ZXh0ewotICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7Ci0gICAgZWZmZWN0X2NvbmZpZ190ICAgICAgICAgICAgICAgICBjb25maWc7Ci0gICAgTFZSRVZfSGFuZGxlX3QgICAgICAgICAgICAgICAgICBoSW5zdGFuY2U7Ci0gICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZFJvb21MZXZlbDsKLSAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkSGZMZXZlbDsKLSAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkRGVjYXlUaW1lOwotICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWREZWNheUhmUmF0aW87Ci0gICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZFJldmVyYkxldmVsOwotICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWREaWZmdXNpb247Ci0gICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZERlbnNpdHk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW5hYmxlZDsKLSAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7Ci0gICAgcHJvY2Vzc19idWZmZXJfdCAgICAgICAgICAgICAgICAqSW5GcmFtZXM7Ci0gICAgcHJvY2Vzc19idWZmZXJfdCAgICAgICAgICAgICAgICAqT3V0RnJhbWVzOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZUluOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZU91dDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eGlsaWFyeTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldDsKLSAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIGN1clByZXNldDsKLSAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQcmVzZXQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnQ7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Vm9sdW1lOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRWb2x1bWU7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGVmdFZvbHVtZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIHByZXZSaWdodFZvbHVtZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZU1vZGU7CitzdHJ1Y3QgUmV2ZXJiQ29udGV4dCB7CisgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyogaXRmZTsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICAgIExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZTsKKyAgICBpbnQxNl90IFNhdmVkUm9vbUxldmVsOworICAgIGludDE2X3QgU2F2ZWRIZkxldmVsOworICAgIGludDE2X3QgU2F2ZWREZWNheVRpbWU7CisgICAgaW50MTZfdCBTYXZlZERlY2F5SGZSYXRpbzsKKyAgICBpbnQxNl90IFNhdmVkUmV2ZXJiTGV2ZWw7CisgICAgaW50MTZfdCBTYXZlZERpZmZ1c2lvbjsKKyAgICBpbnQxNl90IFNhdmVkRGVuc2l0eTsKKyAgICBib29sIGJFbmFibGVkOworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOworICAgIHByb2Nlc3NfYnVmZmVyX3QqIEluRnJhbWVzOworICAgIHByb2Nlc3NfYnVmZmVyX3QqIE91dEZyYW1lczsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZUluOworICAgIHNpemVfdCBidWZmZXJTaXplT3V0OworICAgIGJvb2wgYXV4aWxpYXJ5OworICAgIGJvb2wgcHJlc2V0OworICAgIHVpbnQxNl90IGN1clByZXNldDsKKyAgICB1aW50MTZfdCBuZXh0UHJlc2V0OworICAgIGludCBTYW1wbGVzVG9FeGl0Q291bnQ7CisgICAgTFZNX0lOVDE2IGxlZnRWb2x1bWU7CisgICAgTFZNX0lOVDE2IHJpZ2h0Vm9sdW1lOworICAgIExWTV9JTlQxNiBwcmV2TGVmdFZvbHVtZTsKKyAgICBMVk1fSU5UMTYgcHJldlJpZ2h0Vm9sdW1lOworICAgIGludCB2b2x1bWVNb2RlOwogfTsKIAogZW51bSB7CkBAIC0xNzQsNDQgKzE3NSwzOCBAQAogCiAjZGVmaW5lIFJFVkVSQl9ERUZBVUxUX1BSRVNFVCBSRVZFUkJfUFJFU0VUX05PTkUKIAotI2RlZmluZSBSRVZFUkJfU0VORF9MRVZFTCAgIDAuNzVmIC8vIDAuNzUgaW4gNC4xMiBmb3JtYXQKLSNkZWZpbmUgUkVWRVJCX1VOSVRfVk9MVU1FICAoMHgxMDAwKSAvLyAxLjAgaW4gNC4xMiBmb3JtYXQKKyNkZWZpbmUgUkVWRVJCX1NFTkRfTEVWRUwgMC43NWYgICAgICAvLyAwLjc1IGluIDQuMTIgZm9ybWF0CisjZGVmaW5lIFJFVkVSQl9VTklUX1ZPTFVNRSAoMHgxMDAwKSAgLy8gMS4wIGluIDQuMTIgZm9ybWF0CiAKIC8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLWludCAgUmV2ZXJiX2luaXQgICAgICAgICAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpOwotdm9pZCBSZXZlcmJfZnJlZSAgICAgICAgICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCk7Ci1pbnQgIFJldmVyYl9zZXRDb25maWcgICAgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOwotdm9pZCBSZXZlcmJfZ2V0Q29uZmlnICAgICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKLWludCAgUmV2ZXJiX3NldFBhcmFtZXRlciAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlLCBpbnQgdnNpemUpOwotaW50ICBSZXZlcmJfZ2V0UGFyYW1ldGVyICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50IFJldmVyYl9Mb2FkUHJlc2V0ICAgICAgIChSZXZlcmJDb250ZXh0ICAgKnBDb250ZXh0KTsKLWludCBSZXZlcmJfcGFyYW1WYWx1ZVNpemUgICAoaW50MzJfdCBwYXJhbSk7CitpbnQgUmV2ZXJiX2luaXQoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpOwordm9pZCBSZXZlcmJfZnJlZShSZXZlcmJDb250ZXh0KiBwQ29udGV4dCk7CitpbnQgUmV2ZXJiX3NldENvbmZpZyhSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKTsKK3ZvaWQgUmV2ZXJiX2dldENvbmZpZyhSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKTsKK2ludCBSZXZlcmJfc2V0UGFyYW1ldGVyKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSwgaW50IHZzaXplKTsKK2ludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCB2b2lkKiBwUGFyYW0sIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IFJldmVyYl9Mb2FkUHJlc2V0KFJldmVyYkNvbnRleHQqIHBDb250ZXh0KTsKK2ludCBSZXZlcmJfcGFyYW1WYWx1ZVNpemUoaW50MzJfdCBwYXJhbSk7CiAKIC8qIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CitleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgaW50MzJfdCBzZXNzaW9uSWQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkIF9fdW51c2VkLCBlZmZlY3RfaGFuZGxlX3QqIHBIYW5kbGUpIHsKICAgICBpbnQgcmV0OwogICAgIGludCBpOwotICAgIGludCBsZW5ndGggPSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopOwotICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CisgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqKTsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjOwogCiAgICAgQUxPR1YoIlx0XG5FZmZlY3RDcmVhdGUgc3RhcnQiKTsKIAotICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICBpZiAocEhhbmRsZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgIGRlc2MgPSBnRGVzY3JpcHRvcnNbaV07Ci0gICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmRlc2MtPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkKLSAgICAgICAgICAgICAgICA9PSAwKSB7CisgICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmRlc2MtPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLCBpLCBkZXNjLT51dWlkLnRpbWVMb3cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIyMSwxNiArMjE2LDE2IEBACiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KIAotICAgIFJldmVyYkNvbnRleHQgKnBDb250ZXh0ID0gbmV3IFJldmVyYkNvbnRleHQ7CisgICAgUmV2ZXJiQ29udGV4dCogcENvbnRleHQgPSBuZXcgUmV2ZXJiQ29udGV4dDsKIAotICAgIHBDb250ZXh0LT5pdGZlICAgICAgPSAmZ1JldmVyYkludGVyZmFjZTsKKyAgICBwQ29udGV4dC0+aXRmZSA9ICZnUmV2ZXJiSW50ZXJmYWNlOwogICAgIHBDb250ZXh0LT5oSW5zdGFuY2UgPSBOVUxMOwogCiAgICAgcENvbnRleHQtPmF1eGlsaWFyeSA9IGZhbHNlOwotICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKXsKKyAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICBwQ29udGV4dC0+YXV4aWxpYXJ5ID0gdHJ1ZTsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQVVYIik7Ci0gICAgfWVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gSU5TIik7CiAgICAgfQogCkBAIC0yNDEsMTQgKzIzNiwxNCBAQAogICAgICAgICBwQ29udGV4dC0+Y3VyUHJlc2V0ID0gUkVWRVJCX1BSRVNFVF9MQVNUICsgMTsKICAgICAgICAgcENvbnRleHQtPm5leHRQcmVzZXQgPSBSRVZFUkJfREVGQVVMVF9QUkVTRVQ7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIFBSRVNFVCIpOwotICAgIH1lbHNleworICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVOVklST05NRU5UQUwiKTsKICAgICB9CiAKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIFJldmVyYl9pbml0Iik7CiAgICAgcmV0ID0gUmV2ZXJiX2luaXQocENvbnRleHQpOwogCi0gICAgaWYgKHJldCA8IDApeworICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGluaXQgZmFpbGVkIik7CiAgICAgICAgIGRlbGV0ZSBwQ29udGV4dDsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTI1NiwyNSArMjUxLDI1IEBACiAKICAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CiAKLQogICAgIGludCBjaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAorICAgIGNoYW5uZWxzID0gKHBDb250ZXh0LT5hdXhpbGlhcnkgPT0gdHJ1ZSkgPyBjaGFubmVscyA6IEZDQ18yOwogICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmV2ZXJiIHByb2Nlc3MgKCoyIGlzIGZvciBTVEVSRU8pCiAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogY2hhbm5lbHM7CiAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihwcm9jZXNzX2J1ZmZlcl90KSAqIEZDQ18yOwotICAgIHBDb250ZXh0LT5JbkZyYW1lcyAgPSAocHJvY2Vzc19idWZmZXJfdCAqKWNhbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZUluLCAxIC8qIHNpemUgKi8pOwotICAgIHBDb250ZXh0LT5PdXRGcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCAqKWNhbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCwgMSAvKiBzaXplICovKTsKKyAgICBwQ29udGV4dC0+SW5GcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCopY2FsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4sIDEgLyogc2l6ZSAqLyk7CisgICAgcENvbnRleHQtPk91dEZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90KiljYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQsIDEgLyogc2l6ZSAqLyk7CiAKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgJXAsIHNpemUgJXp1IiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZFxuIik7CiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKXsKLSAgICBSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoUmV2ZXJiQ29udGV4dCAqKWhhbmRsZTsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIFJldmVyYkNvbnRleHQqIHBDb250ZXh0ID0gKFJldmVyYkNvbnRleHQqKWhhbmRsZTsKIAogICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2UgJXAiLCBoYW5kbGUpOwotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RSZWxlYXNlIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0yODgsMTIgKzI4MywxMSBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CiAgICAgaW50IGk7Ci0gICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7CisgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqKTsKIAotICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTMwMSw4ICsyOTUsOCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgKnBEZXNjcmlwdG9yID0gKmdEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLAotICAgICAgICAgICAgICAgICBpLCBnRGVzY3JpcHRvcnNbaV0tPnV1aWQudGltZUxvdyk7CisgICAgICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBSZXZlcmIgdHlwZSAlZCwgVVVJRCA9ICV4IiwgaSwKKyAgICAgICAgICAgICAgICAgIGdEZXNjcmlwdG9yc1tpXS0+dXVpZC50aW1lTG93KTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQpAQCAtMzExLDEyICszMDUsMTMgQEAKIH0gLyogZW5kIEVmZmVjdEdldERlc2NyaXB0b3IgKi8KIAogLyogbG9jYWwgZnVuY3Rpb25zICovCi0jZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiNjb25kKTsgICAgICBcCi0gICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gcHJvY2VzcygpCkBAIC0zMzUsOTEgKzMzMCwxMDAgQEAKIC8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgc3RlcmVvIDE2IGJpdCBvdXRwdXQgZGF0YQogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IHByb2Nlc3MoIGVmZmVjdF9idWZmZXJfdCAgICpwSW4sCi0gICAgICAgICAgICAgZWZmZWN0X2J1ZmZlcl90ICAgKnBPdXQsCi0gICAgICAgICAgICAgaW50ICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgIFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKLQoraW50IHByb2Nlc3MoZWZmZWN0X2J1ZmZlcl90KiBwSW4sIGVmZmVjdF9idWZmZXJfdCogcE91dCwgaW50IGZyYW1lQ291bnQsIFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CiAgICAgaW50IGNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7ICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCi0gICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgaXMgZWl0aGVyIG1vbm8gb3Igc3RlcmVvCi0gICAgaWYgKCEoY2hhbm5lbHMgPT0gMSB8fCBjaGFubmVscyA9PSBGQ0NfMikgKSB7Ci0gICAgICAgIEFMT0dFKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBpbnZhbGlkIFBDTSBmb3JtYXQiKTsKKyAgICAvLyBSZXZlcmIgb25seSBlZmZlY3RzIHRoZSBzdGVyZW8gY2hhbm5lbHMgaW4gbXVsdGljaGFubmVsIHNvdXJjZS4KKyAgICBpZiAoY2hhbm5lbHMgPCAxIHx8IGNoYW5uZWxzID4gTFZNX01BWF9DSEFOTkVMUykgeworICAgICAgICBBTE9HRSgiXHRMVlJFVl9FUlJPUiA6IHByb2Nlc3MgaW52YWxpZCBQQ00gY2hhbm5lbHMgJWQiLCBjaGFubmVscyk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAogICAgIHNpemVfdCBpblNpemUgPSBmcmFtZUNvdW50ICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogY2hhbm5lbHM7CiAgICAgc2l6ZV90IG91dFNpemUgPSBmcmFtZUNvdW50ICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogRkNDXzI7Ci0gICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lcyA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluIDwgaW5TaXplKSB7CisgICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lcyA9PSBOVUxMIHx8IHBDb250ZXh0LT5idWZmZXJTaXplSW4gPCBpblNpemUpIHsKICAgICAgICAgZnJlZShwQ29udGV4dC0+SW5GcmFtZXMpOwogICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gaW5TaXplOwotICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCAqKWNhbGxvYygxLCBwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKKyAgICAgICAgcENvbnRleHQtPkluRnJhbWVzID0gKHByb2Nlc3NfYnVmZmVyX3QqKWNhbGxvYygxLCBwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKICAgICB9Ci0gICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMgPT0gTlVMTCB8fAotICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPCBvdXRTaXplKSB7CisgICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMgPT0gTlVMTCB8fCBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA8IG91dFNpemUpIHsKICAgICAgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzKTsKICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBvdXRTaXplOwotICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzID0gKHByb2Nlc3NfYnVmZmVyX3QgKiljYWxsb2MoMSwgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOworICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzID0gKHByb2Nlc3NfYnVmZmVyX3QqKWNhbGxvYygxLCBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCk7CiAgICAgfQogCi0KICAgICAvLyBDaGVjayBmb3IgTlVMTCBwb2ludGVycwogICAgIGlmICgocENvbnRleHQtPkluRnJhbWVzID09IE5VTEwpIHx8IChwQ29udGV4dC0+T3V0RnJhbWVzID09IE5VTEwpKSB7CiAgICAgICAgIEFMT0dFKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0ZW1wb3JhcnkgYnVmZmVycyAiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0KICAgICBpZiAocENvbnRleHQtPnByZXNldCAmJiBwQ29udGV4dC0+bmV4dFByZXNldCAhPSBwQ29udGV4dC0+Y3VyUHJlc2V0KSB7CiAgICAgICAgIFJldmVyYl9Mb2FkUHJlc2V0KHBDb250ZXh0KTsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgewogICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSgqcEluKSwgZGVjbHR5cGUoKnBDb250ZXh0LT5JbkZyYW1lcyk+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAicEluIGFuZCBJbkZyYW1lcyBtdXN0IGJlIHNhbWUgdHlwZSIpOworICAgICAgICAgICAgICAgICAgICAgICJwSW4gYW5kIEluRnJhbWVzIG11c3QgYmUgc2FtZSB0eXBlIik7CiAgICAgICAgIG1lbWNweShwQ29udGV4dC0+SW5GcmFtZXMsIHBJbiwgZnJhbWVDb3VudCAqIGNoYW5uZWxzICogc2l6ZW9mKCpwSW4pKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtb25vIGlucHV0IGlzIGR1cGxpY2F0ZWQKKyAgICAgICAgaWYgKGNoYW5uZWxzID49IEZDQ18yKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1tGQ0NfMiAqIGldID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzX2J1ZmZlcl90KXBJbltjaGFubmVscyAqIGldICogUkVWRVJCX1NFTkRfTEVWRUw7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzW0ZDQ18yICogaSArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzX2J1ZmZlcl90KXBJbltjaGFubmVscyAqIGkgKyAxXSAqIFJFVkVSQl9TRU5EX0xFVkVMOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAvLyBpbnNlcnQgcmV2ZXJiIGlucHV0IGlzIGFsd2F5cyBzdGVyZW8KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1syICogaV0gPSAocHJvY2Vzc19idWZmZXJfdClwSW5bMiAqIGldICogUkVWRVJCX1NFTkRfTEVWRUw7Ci0gICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMiAqIGkgKyAxXSA9IChwcm9jZXNzX2J1ZmZlcl90KXBJblsyICogaSArIDFdICogUkVWRVJCX1NFTkRfTEVWRUw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1tGQ0NfMiAqIGldID0gcENvbnRleHQtPkluRnJhbWVzW0ZDQ18yICogaSArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzX2J1ZmZlcl90KXBJbltpXSAqIFJFVkVSQl9TRU5EX0xFVkVMOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQgJiYgcENvbnRleHQtPmN1clByZXNldCA9PSBSRVZFUkJfUFJFU0VUX05PTkUpIHsKICAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5PdXRGcmFtZXMsIDAsCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZigqcENvbnRleHQtPk91dEZyYW1lcykgKiBGQ0NfMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogc2l6ZW9mKCpwQ29udGV4dC0+T3V0RnJhbWVzKSAqIEZDQ18yKTsgIC8vIGFsd2F5cyBzdGVyZW8gaGVyZQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UgJiYgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA+IDApIHsKLSAgICAgICAgICAgIG1lbXNldChwQ29udGV4dC0+SW5GcmFtZXMsIDAsCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoKnBDb250ZXh0LT5PdXRGcmFtZXMpICogY2hhbm5lbHMpOworICAgICAgICBpZiAocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSAmJiBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgeworICAgICAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5JbkZyYW1lcywgMCwgZnJhbWVDb3VudCAqIHNpemVvZigqcENvbnRleHQtPk91dEZyYW1lcykgKiBjaGFubmVscyk7CiAgICAgICAgICAgICBBTE9HVigiXHRaZXJvaW5nICVkIHNhbXBsZXMgcGVyIGZyYW1lIGF0IHRoZSBlbmQgb2YgY2FsbCIsIGNoYW5uZWxzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMsIHByb2R1Y2luZyBhIHN0ZXJlbyBvdXRwdXQgKi8KLSAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfUHJvY2VzcyhwQ29udGV4dC0+aEluc3RhbmNlLCAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lcywgICAgIC8qIElucHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfUHJvY2VzcyhwQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMsICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzLCAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7ICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwogICAgIH0KIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9Qcm9jZXNzIiwgInByb2Nlc3MiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCiAgICAgLy8gQ29udmVydCB0byAxNiBiaXRzCiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlCiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeyAvLyBhbHdheXMgc3RlcmVvIGhlcmUKLSAgICAgICAgICAgIC8vIE1peCB3aXRoIGRyeSBpbnB1dAotICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tpXSArPSBwSW5baV07CisgICAgICAgIGlmIChjaGFubmVscyA+PSBGQ0NfMikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBNaXggd2l0aCBkcnkgaW5wdXQKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaV0gKz0gcEluW2NoYW5uZWxzICogaV07CisgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGkgKyAxXSArPSBwSW5bY2hhbm5lbHMgKiBpICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIE1peCB3aXRoIGRyeSBpbnB1dAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpXSArPSBwSW5baV07CisgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGkgKyAxXSArPSBwSW5baV07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHdpdGggcmFtcCBpZiBuZWVkZWQKICAgICAgICAgaWYgKChwQ29udGV4dC0+bGVmdFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgfHwKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSkgJiYKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9PSBSRVZFUkJfVk9MVU1FX1JBTVApIHsKKyAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSkgJiYKKyAgICAgICAgICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID09IFJFVkVSQl9WT0xVTUVfUkFNUCkgewogICAgICAgICAgICAgLy8gRklYTUU6IHN0aWxsIHVzaW5nIGludDE2IHZvbHVtZXMuCiAgICAgICAgICAgICAvLyBGb3IgcmVmZXJlbmNlOiBSRVZFUkJfVU5JVF9WT0xVTUUgICgweDEwMDApIC8vIDEuMCBpbiA0LjEyIGZvcm1hdAogICAgICAgICAgICAgZmxvYXQgdmwgPSAoZmxvYXQpcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIC8gNDA5NjsKQEAgLTQ1MCwyMCArNDU0LDM1IEBACiAgICAgICAgIH0KICAgICB9CiAKLQotICAgIC8vIEFjY3VtdWxhdGUgaWYgcmVxdWlyZWQKLSAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKLSAgICAgICAgLy9BTE9HVigiXHRCdWZmZXIgYWNjZXNzIGlzIEFDQ1VNVUxBVEUiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeyAvLyBhbHdheXMgc3RlcmVvIGhlcmUKLSAgICAgICAgICAgIHBPdXRbaV0gKz0gcENvbnRleHQtPk91dEZyYW1lc1tpXTsKKyAgICBpZiAoY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIC8vIEFjY3VtdWxhdGUgaWYgcmVxdWlyZWQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwT3V0W2NoYW5uZWxzICogaV0gKz0gcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldOworICAgICAgICAgICAgICAgIHBPdXRbY2hhbm5lbHMgKiBpICsgMV0gKz0gcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGkgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcE91dFtjaGFubmVscyAqIGldID0gcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldOworICAgICAgICAgICAgICAgIHBPdXRbY2hhbm5lbHMgKiBpICsgMV0gPSBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaSArIDFdOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfWVsc2V7Ci0gICAgICAgIC8vQUxPR1YoIlx0QnVmZmVyIGFjY2VzcyBpcyBXUklURSIpOwotICAgICAgICBtZW1jcHkocE91dCwgcENvbnRleHQtPk91dEZyYW1lcywgZnJhbWVDb3VudCAqIHNpemVvZigqcE91dCkgKiBGQ0NfMik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gRkNDXzI7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAgICAgcE91dFtjaGFubmVscyAqIGkgKyBqXSA9IHBJbltjaGFubmVscyAqIGkgKyBqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwT3V0W2ldICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkocE91dCwgcENvbnRleHQtPk91dEZyYW1lcywgZnJhbWVDb3VudCAqIHNpemVvZigqcE91dCkgKiBGQ0NfMik7CisgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIHByb2Nlc3MgKi8KK30gLyogZW5kIHByb2Nlc3MgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBSZXZlcmJfZnJlZSgpCkBAIC00NzcsMzAgKzQ5NiwyOCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYl9mcmVlKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKLQotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgIE1lbVRhYjsKK3ZvaWQgUmV2ZXJiX2ZyZWUoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCBNZW1UYWI7CiAKICAgICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCi0gICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0TWVtb3J5VGFibGUocENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5oSW5zdGFuY2UsICZNZW1UYWIsIExWTV9OVUxMKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiUmV2ZXJiX2ZyZWUiKQogCi0gICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKLSAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKLSAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMiAiIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAorICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotfSAgICAvKiBlbmQgUmV2ZXJiX2ZyZWUgKi8KK30gLyogZW5kIFJldmVyYl9mcmVlICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUmV2ZXJiX3NldENvbmZpZygpCkBAIC01MTYsODkgKzUzMyw4OSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgUmV2ZXJiX3NldENvbmZpZyhSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKXsKLSAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBzdGFydCIpOworaW50IFJldmVyYl9zZXRDb25maWcoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZykgeworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOworICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgc3RhcnQiKTsKIAogICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKICAgICBDSEVDS19BUkcocENvbmZpZyAhPSBOVUxMKTsKIAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyAgICBpbnQgaW5wdXRDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKChwQ29udGV4dC0+YXV4aWxpYXJ5ICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8Ci0gICAgICAgICAgICAgICgoIXBDb250ZXh0LT5hdXhpbGlhcnkpICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKLSAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKLSAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CisgICAgICAgICAgICAgICgoIXBDb250ZXh0LT5hdXhpbGlhcnkpICYmIChpbnB1dENoYW5uZWxzIDw9IExWTV9NQVhfQ0hBTk5FTFMpKSk7CisgICAgaW50IG91dHB1dENoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CisgICAgQ0hFQ0tfQVJHKG91dHB1dENoYW5uZWxzID49IEZDQ18yICYmIG91dHB1dENoYW5uZWxzIDw9IExWTV9NQVhfQ0hBTk5FTFMpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSB8fAorICAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgY2FsbGluZyBtZW1jcHkiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIGNhbGxpbmcgbWVtY3B5Iik7CiAgICAgcENvbnRleHQtPmNvbmZpZyA9ICpwQ29uZmlnOwogCiAgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKLSAgICBjYXNlIDgwMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4ODIwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzY0MDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE5MjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWKCJcclJldmVyYl9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGNhc2UgODAwMDoKKyAgICAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2MDAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIyMDUwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMyMDAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ0MTAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ4MDAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg4MjAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk2MDAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3NjQwMDoKKyAgICAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTkyMDAwOgorICAgICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dWKCJcclJldmVyYl9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+U2FtcGxlUmF0ZSAhPSBTYW1wbGVSYXRlKSB7CisgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOworICAgICAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsKIAotICAgICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsKLSAgICAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOwotCi0gICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBjaGFuZ2Ugc2FtcGxpbmcgcmF0ZSB0byAlZCIsIFNhbXBsZVJhdGUpOworICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIGNoYW5nZSBzYW1wbGluZyByYXRlIHRvICVkIiwgU2FtcGxlUmF0ZSk7CiAKICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiX3NldENvbmZpZyIpCi0gICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAogICAgICAgICBBY3RpdmVQYXJhbXMuU2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU7CiAKICAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYl9zZXRDb25maWciKQotICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBTdWNjZXNmdWxseSBjYWxsZWQgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgICAgICBpZiAoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogICAgICAgICBwQ29udGV4dC0+U2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU7Ci0gICAgfWVsc2V7Ci0gICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBrZWVwIHNhbXBsaW5nIHJhdGUgYXQgJWQiLCBTYW1wbGVSYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIGtlZXAgc2FtcGxpbmcgcmF0ZSBhdCAlZCIsIFNhbXBsZVJhdGUpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBFbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIEVuZCIpOwogICAgIHJldHVybiAwOwotfSAgIC8qIGVuZCBSZXZlcmJfc2V0Q29uZmlnICovCit9IC8qIGVuZCBSZXZlcmJfc2V0Q29uZmlnICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUmV2ZXJiX2dldENvbmZpZygpCkBAIC02MTQsMTAgKzYzMSw5IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiX2dldENvbmZpZyhSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKQotewordm9pZCBSZXZlcmJfZ2V0Q29uZmlnKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QqIHBDb25maWcpIHsKICAgICAqcENvbmZpZyA9IHBDb250ZXh0LT5jb25maWc7Ci19ICAgLyogZW5kIFJldmVyYl9nZXRDb25maWcgKi8KK30gLyogZW5kIFJldmVyYl9nZXRDb25maWcgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBSZXZlcmJfaW5pdCgpCkBAIC02MzEsMzUgKzY0NywzNSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgUmV2ZXJiX2luaXQoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworaW50IFJldmVyYl9pbml0KFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CiAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgc3RhcnQiKTsKIAogICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKIAotICAgIGlmIChwQ29udGV4dC0+aEluc3RhbmNlICE9IE5VTEwpeworICAgIGlmIChwQ29udGV4dC0+aEluc3RhbmNlICE9IE5VTEwpIHsKICAgICAgICAgUmV2ZXJiX2ZyZWUocENvbnRleHQpOwogICAgIH0KIAotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKLSAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKKyAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgIH0KLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSAgICAgICAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKIAogICAgIHBDb250ZXh0LT5sZWZ0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOwogICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSA9IFJFVkVSQl9VTklUX1ZPTFVNRTsKQEAgLTY2Nyw0MCArNjgzLDM5IEBACiAgICAgcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSA9IFJFVkVSQl9VTklUX1ZPTFVNRTsKICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9IFJFVkVSQl9WT0xVTUVfRkxBVDsKIAotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgIEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fRkFMU0U7CisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBwYXJhbXM7ICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0IEluc3RQYXJhbXM7ICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgYm9vbCBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKIAogICAgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCi0gICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgID0gTUFYX0NBTExfU0laRTsKLSAgICBJbnN0UGFyYW1zLlNvdXJjZUZvcm1hdCAgPSBMVk1fU1RFUkVPOyAgICAgICAgICAvLyBNYXggZm9ybWF0LCBjb3VsZCBiZSBtb25vIGR1cmluZyBwcm9jZXNzCi0gICAgSW5zdFBhcmFtcy5OdW1EZWxheXMgICAgID0gTFZSRVZfREVMQVlMSU5FU180OworICAgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKKyAgICBJbnN0UGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87ICAvLyBNYXggZm9ybWF0LCBjb3VsZCBiZSBtb25vIGR1cmluZyBwcm9jZXNzCisgICAgSW5zdFBhcmFtcy5OdW1EZWxheXMgPSBMVlJFVl9ERUxBWUxJTkVTXzQ7CiAKICAgICAvKiBBbGxvY2F0ZSBtZW1vcnksIGZvcmNpbmcgYWxpZ25tZW50ICovCi0gICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRNZW1vcnlUYWJsZSIsICJSZXZlcmJfaW5pdCIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKKyAgICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRNZW1vcnlUYWJsZVxuIik7CiAKICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBjYWxsb2MoMSwgTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKIAotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOworICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkpOwogICAgICAgICAgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03MDgsODIgKzcyMyw4MyBAQAogICAgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMgdGhhdCB3ZXJlCiAgICAgICogc3VjY2VzZnVsbHkgYWxsb2NhdGVkIGFuZCByZXR1cm4gd2l0aCBhbiBlcnJvcgogICAgICAqLwotICAgIGlmKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKXsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKLSAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7CisgICAgaWYgKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IC0gTm90IGZyZWVpbmdcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOwotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IC0gTm90IGZyZWVpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CiAKICAgICAvKiBJbml0aWFsaXNlICovCiAgICAgcENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOwogCiAgICAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPmhJbnN0YW5jZSwgJk1lbVRhYiwgJkluc3RQYXJhbXMpOwogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJSZXZlcmJfaW5pdCIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKyAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CiAKICAgICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT047Ci0gICAgcGFyYW1zLlNhbXBsZVJhdGUgICAgID0gTFZNX0ZTXzQ0MTAwOwotICAgIHBDb250ZXh0LT5TYW1wbGVSYXRlICA9IExWTV9GU180NDEwMDsKKyAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgIHBDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOwogCi0gICAgaWYocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKXsKLSAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZNX01PTk87CisgICAgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgeworICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX01PTk87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZNX1NURVJFTzsKKyAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CiAgICAgfQogCisgICAgaWYgKChwQ29udGV4dC0+YXV4aWxpYXJ5ID09IGZhbHNlKSAmJiAocGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykpIHsKKyAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgICAgfQogICAgIC8qIFJldmVyYiBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLkxldmVsICAgICAgICAgID0gMDsKLSAgICBwYXJhbXMuTFBGICAgICAgICAgICAgPSAyMzk5OTsKLSAgICBwYXJhbXMuSFBGICAgICAgICAgICAgPSA1MDsKLSAgICBwYXJhbXMuVDYwICAgICAgICAgICAgPSAxNDkwOwotICAgIHBhcmFtcy5EZW5zaXR5ICAgICAgICA9IDEwMDsKLSAgICBwYXJhbXMuRGFtcGluZyAgICAgICAgPSAyMTsKLSAgICBwYXJhbXMuUm9vbVNpemUgICAgICAgPSAxMDA7CisgICAgcGFyYW1zLkxldmVsID0gMDsKKyAgICBwYXJhbXMuTFBGID0gMjM5OTk7CisgICAgcGFyYW1zLkhQRiA9IDUwOworICAgIHBhcmFtcy5UNjAgPSAxNDkwOworICAgIHBhcmFtcy5EZW5zaXR5ID0gMTAwOworICAgIHBhcmFtcy5EYW1waW5nID0gMjE7CisgICAgcGFyYW1zLlJvb21TaXplID0gMTAwOwogCi0gICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA9IChwYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpLzEwMDA7CisgICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA9IChwYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIC8gMTAwMDsKIAogICAgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZSBzZXQgdG8gdGhlIGdldAogICAgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbCBhdm9pZAogICAgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZwogICAgICAqLwotICAgIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCAgICA9IC02MDAwOwotICAgIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwgICAgICA9IDA7Ci0gICAgcENvbnRleHQtPmJFbmFibGVkICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSAgICA9IHBhcmFtcy5UNjA7Ci0gICAgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvID0gcGFyYW1zLkRhbXBpbmcqMjA7Ci0gICAgcENvbnRleHQtPlNhdmVkRGVuc2l0eSAgICAgID0gcGFyYW1zLlJvb21TaXplKjEwOwotICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiAgICA9IHBhcmFtcy5EZW5zaXR5KjEwOwotICAgIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsICA9IC02MDAwOworICAgIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCA9IC02MDAwOworICAgIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwgPSAwOworICAgIHBDb250ZXh0LT5iRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+U2F2ZWREZWNheVRpbWUgPSBwYXJhbXMuVDYwOworICAgIHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyA9IHBhcmFtcy5EYW1waW5nICogMjA7CisgICAgcENvbnRleHQtPlNhdmVkRGVuc2l0eSA9IHBhcmFtcy5Sb29tU2l6ZSAqIDEwOworICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiA9IHBhcmFtcy5EZW5zaXR5ICogMTA7CisgICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgPSAtNjAwMDsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJnBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKICAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBFbmQiKTsKICAgICByZXR1cm4gMDsKLX0gICAvKiBlbmQgUmV2ZXJiX2luaXQgKi8KK30gLyogZW5kIFJldmVyYl9pbml0ICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUmV2ZXJiQ29udmVydExldmVsKCkKQEAgLTc5NiwyNyArODEyLDIxIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDE2X3QgUmV2ZXJiQ29udmVydExldmVsKGludDE2X3QgbGV2ZWwpewotICAgIHN0YXRpYyBpbnQxNl90IExldmVsQXJyYXlbMTAxXSA9Ci0gICAgewotICAgICAgIC0xMjAwMCwgLTQwMDAsICAtMzM5OCwgIC0zMDQ2LCAgLTI3OTYsICAtMjYwMywgIC0yNDQ0LCAgLTIzMTAsICAtMjE5NCwgIC0yMDkyLAotICAgICAgIC0yMDAwLCAgLTE5MTgsICAtMTg0MiwgIC0xNzczLCAgLTE3MDgsICAtMTY0OCwgIC0xNTkyLCAgLTE1NDAsICAtMTQ5MCwgIC0xNDQzLAotICAgICAgIC0xMzk4LCAgLTEzNTYsICAtMTMxNiwgIC0xMjc3LCAgLTEyNDAsICAtMTIwNSwgIC0xMTcxLCAgLTExMzgsICAtMTEwNiwgIC0xMDc2LAotICAgICAgIC0xMDQ2LCAgLTEwMTgsICAtOTkwLCAgIC05NjMsICAgLTkzOCwgICAtOTEyLCAgIC04ODgsICAgLTg2NCwgICAtODQxLCAgIC04MTgsCi0gICAgICAgLTc5NiwgICAtNzc1LCAgIC03NTQsICAgLTczNCwgICAtNzE0LCAgIC02OTQsICAgLTY3NSwgICAtNjU2LCAgIC02MzgsICAgLTYyMCwKLSAgICAgICAtNjAzLCAgIC01ODUsICAgLTU2OCwgICAtNTUyLCAgIC01MzYsICAgLTUyMCwgICAtNTA0LCAgIC00ODksICAgLTQ3NCwgICAtNDU5LAotICAgICAgIC00NDQsICAgLTQzMCwgICAtNDE2LCAgIC00MDIsICAgLTM4OCwgICAtMzc1LCAgIC0zNjEsICAgLTM0OCwgICAtMzM1LCAgIC0zMjMsCi0gICAgICAgLTMxMCwgICAtMjk4LCAgIC0yODYsICAgLTI3NCwgICAtMjYyLCAgIC0yNTAsICAgLTIzOSwgICAtMjI4LCAgIC0yMTYsICAgLTIwNSwKLSAgICAgICAtMTk0LCAgIC0xODQsICAgLTE3MywgICAtMTYyLCAgIC0xNTIsICAgLTE0MiwgICAtMTMyLCAgIC0xMjEsICAgLTExMiwgICAtMTAyLAotICAgICAgIC05MiwgICAgLTgyLCAgICAtNzMsICAgIC02NCwgICAgLTU0LCAgICAtNDUsICAgIC0zNiwgICAgLTI3LCAgICAtMTgsICAgIC05LAotICAgICAgIDAKLSAgICB9OworaW50MTZfdCBSZXZlcmJDb252ZXJ0TGV2ZWwoaW50MTZfdCBsZXZlbCkgeworICAgIHN0YXRpYyBpbnQxNl90IExldmVsQXJyYXlbMTAxXSA9IHsKKyAgICAgICAgICAgIC0xMjAwMCwgLTQwMDAsIC0zMzk4LCAtMzA0NiwgLTI3OTYsIC0yNjAzLCAtMjQ0NCwgLTIzMTAsIC0yMTk0LCAtMjA5MiwgLTIwMDAsIC0xOTE4LAorICAgICAgICAgICAgLTE4NDIsICAtMTc3MywgLTE3MDgsIC0xNjQ4LCAtMTU5MiwgLTE1NDAsIC0xNDkwLCAtMTQ0MywgLTEzOTgsIC0xMzU2LCAtMTMxNiwgLTEyNzcsCisgICAgICAgICAgICAtMTI0MCwgIC0xMjA1LCAtMTE3MSwgLTExMzgsIC0xMTA2LCAtMTA3NiwgLTEwNDYsIC0xMDE4LCAtOTkwLCAgLTk2MywgIC05MzgsICAtOTEyLAorICAgICAgICAgICAgLTg4OCwgICAtODY0LCAgLTg0MSwgIC04MTgsICAtNzk2LCAgLTc3NSwgIC03NTQsICAtNzM0LCAgLTcxNCwgIC02OTQsICAtNjc1LCAgLTY1NiwKKyAgICAgICAgICAgIC02MzgsICAgLTYyMCwgIC02MDMsICAtNTg1LCAgLTU2OCwgIC01NTIsICAtNTM2LCAgLTUyMCwgIC01MDQsICAtNDg5LCAgLTQ3NCwgIC00NTksCisgICAgICAgICAgICAtNDQ0LCAgIC00MzAsICAtNDE2LCAgLTQwMiwgIC0zODgsICAtMzc1LCAgLTM2MSwgIC0zNDgsICAtMzM1LCAgLTMyMywgIC0zMTAsICAtMjk4LAorICAgICAgICAgICAgLTI4NiwgICAtMjc0LCAgLTI2MiwgIC0yNTAsICAtMjM5LCAgLTIyOCwgIC0yMTYsICAtMjA1LCAgLTE5NCwgIC0xODQsICAtMTczLCAgLTE2MiwKKyAgICAgICAgICAgIC0xNTIsICAgLTE0MiwgIC0xMzIsICAtMTIxLCAgLTExMiwgIC0xMDIsICAtOTIsICAgLTgyLCAgIC03MywgICAtNjQsICAgLTU0LCAgIC00NSwKKyAgICAgICAgICAgIC0zNiwgICAgLTI3LCAgIC0xOCwgICAtOSwgICAgMH07CiAgICAgaW50MTZfdCBpOwogCi0gICAgZm9yKGkgPSAwOyBpIDwgMTAxOyBpKyspCi0gICAgewotICAgICAgIGlmKGxldmVsIDw9IExldmVsQXJyYXlbaV0pCi0gICAgICAgICAgIGJyZWFrOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDE7IGkrKykgeworICAgICAgICBpZiAobGV2ZWwgPD0gTGV2ZWxBcnJheVtpXSkgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBpOwogfQpAQCAtODMyLDM3ICs4NDIsMzEgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MTZfdCBSZXZlcmJDb252ZXJ0SGZMZXZlbChpbnQxNl90IEhmbGV2ZWwpeworaW50MTZfdCBSZXZlcmJDb252ZXJ0SGZMZXZlbChpbnQxNl90IEhmbGV2ZWwpIHsKICAgICBpbnQxNl90IGk7CiAKLSAgICBzdGF0aWMgTFBGUGFpcl90IExQRkFycmF5Wzk3XSA9Ci0gICAgeyAgIC8vIExpbWl0IHJhbmdlIHRvIDUwIGZvciBMVlJFViBwYXJhbWV0ZXIgcmFuZ2UKLSAgICAgICAgey0xMDAwMCwgNTB9LCB7IC01MDAwLCA1MCB9LCB7IC00MDAwLCA1MH0sICB7IC0zMDAwLCAxNTh9LCB7IC0yMDAwLCA1MDJ9LAotICAgICAgICB7LTEwMDAsIDE2NjZ9LHsgLTkwMCwgMTg5N30sIHsgLTgwMCwgMjE2OX0sIHsgLTcwMCwgMjQ5Nn0sIHsgLTYwMCwgMjg5NX0sCi0gICAgICAgIHstNTAwLCAzNDAwfSwgeyAtNDAwLCA0MDY2fSwgeyAtMzAwLCA1MDExfSwgeyAtMjAwLCA2NTM3fSwgeyAtMTAwLCAgOTgyNn0sCi0gICAgICAgIHstOTksIDk4ODEgfSwgeyAtOTgsIDk5MzcgfSwgeyAtOTcsIDk5OTQgfSwgeyAtOTYsIDEwMDUyfSwgeyAtOTUsIDEwMTExfSwKLSAgICAgICAgey05NCwgMTAxNzF9LCB7IC05MywgMTAyMzF9LCB7IC05MiwgMTAyOTN9LCB7IC05MSwgMTAzNTZ9LCB7IC05MCwgMTA0MTl9LAotICAgICAgICB7LTg5LCAxMDQ4NH0sIHsgLTg4LCAxMDU0OX0sIHsgLTg3LCAxMDYxNn0sIHsgLTg2LCAxMDY4NH0sIHsgLTg1LCAxMDc1M30sCi0gICAgICAgIHstODQsIDEwODIzfSwgeyAtODMsIDEwODk1fSwgeyAtODIsIDEwOTY4fSwgeyAtODEsIDExMDQyfSwgeyAtODAsIDExMTE3fSwKLSAgICAgICAgey03OSwgMTExOTR9LCB7IC03OCwgMTEyNzJ9LCB7IC03NywgMTEzNTJ9LCB7IC03NiwgMTE0MzN9LCB7IC03NSwgMTE1MTZ9LAotICAgICAgICB7LTc0LCAxMTYwMH0sIHsgLTczLCAxMTY4Nn0sIHsgLTcyLCAxMTc3NH0sIHsgLTcxLCAxMTg2NH0sIHsgLTcwLCAxMTk1NX0sCi0gICAgICAgIHstNjksIDEyMDQ5fSwgeyAtNjgsIDEyMTQ0fSwgeyAtNjcsIDEyMjQyfSwgeyAtNjYsIDEyMzQxfSwgeyAtNjUsIDEyNDQzfSwKLSAgICAgICAgey02NCwgMTI1NDh9LCB7IC02MywgMTI2NTR9LCB7IC02MiwgMTI3NjN9LCB7IC02MSwgMTI4NzV9LCB7IC02MCwgMTI5OTB9LAotICAgICAgICB7LTU5LCAxMzEwN30sIHsgLTU4LCAxMzIyN30sIHsgLTU3LCAxMzM1MX0sIHsgLTU2LCAxMzQ3N30sIHsgLTU1LCAxMzYwN30sCi0gICAgICAgIHstNTQsIDEzNzQxfSwgeyAtNTMsIDEzODc4fSwgeyAtNTIsIDE0MDE5fSwgeyAtNTEsIDE0MTY0fSwgeyAtNTAsIDE0MzEzfSwKLSAgICAgICAgey00OSwgMTQ0Njd9LCB7IC00OCwgMTQ2MjZ9LCB7IC00NywgMTQ3ODl9LCB7IC00NiwgMTQ5NTh9LCB7IC00NSwgMTUxMzJ9LAotICAgICAgICB7LTQ0LCAxNTMxMn0sIHsgLTQzLCAxNTQ5OH0sIHsgLTQyLCAxNTY5MX0sIHsgLTQxLCAxNTg5MH0sIHsgLTQwLCAxNjA5N30sCi0gICAgICAgIHstMzksIDE2MzExfSwgeyAtMzgsIDE2NTM0fSwgeyAtMzcsIDE2NzY2fSwgeyAtMzYsIDE3MDA3fSwgeyAtMzUsIDE3MjU5fSwKLSAgICAgICAgey0zNCwgMTc1MjF9LCB7IC0zMywgMTc3OTV9LCB7IC0zMiwgMTgwODF9LCB7IC0zMSwgMTgzODF9LCB7IC0zMCwgMTg2OTZ9LAotICAgICAgICB7LTI5LCAxOTAyN30sIHsgLTI4LCAxOTM3NX0sIHsgLTI3LCAxOTc0Mn0sIHsgLTI2LCAyMDEyOX0sIHsgLTI1LCAyMDU0MH0sCi0gICAgICAgIHstMjQsIDIwOTc2fSwgeyAtMjMsIDIxNDM5fSwgeyAtMjIsIDIxOTM0fSwgeyAtMjEsIDIyNDYzfSwgeyAtMjAsIDIzMDMxfSwKLSAgICAgICAgey0xOSwgMjM2NDN9LCB7IC0xOCwgMjM5OTl9Ci0gICAgfTsKKyAgICBzdGF0aWMgTFBGUGFpcl90IExQRkFycmF5Wzk3XSA9IHsKKyAgICAgICAgICAgIC8vIExpbWl0IHJhbmdlIHRvIDUwIGZvciBMVlJFViBwYXJhbWV0ZXIgcmFuZ2UKKyAgICAgICAgICAgIHstMTAwMDAsIDUwfSwgey01MDAwLCA1MH0sICB7LTQwMDAsIDUwfSwgIHstMzAwMCwgMTU4fSwgey0yMDAwLCA1MDJ9LCB7LTEwMDAsIDE2NjZ9LAorICAgICAgICAgICAgey05MDAsIDE4OTd9LCB7LTgwMCwgMjE2OX0sIHstNzAwLCAyNDk2fSwgey02MDAsIDI4OTV9LCB7LTUwMCwgMzQwMH0sIHstNDAwLCA0MDY2fSwKKyAgICAgICAgICAgIHstMzAwLCA1MDExfSwgey0yMDAsIDY1Mzd9LCB7LTEwMCwgOTgyNn0sIHstOTksIDk4ODF9LCAgey05OCwgOTkzN30sICB7LTk3LCA5OTk0fSwKKyAgICAgICAgICAgIHstOTYsIDEwMDUyfSwgey05NSwgMTAxMTF9LCB7LTk0LCAxMDE3MX0sIHstOTMsIDEwMjMxfSwgey05MiwgMTAyOTN9LCB7LTkxLCAxMDM1Nn0sCisgICAgICAgICAgICB7LTkwLCAxMDQxOX0sIHstODksIDEwNDg0fSwgey04OCwgMTA1NDl9LCB7LTg3LCAxMDYxNn0sIHstODYsIDEwNjg0fSwgey04NSwgMTA3NTN9LAorICAgICAgICAgICAgey04NCwgMTA4MjN9LCB7LTgzLCAxMDg5NX0sIHstODIsIDEwOTY4fSwgey04MSwgMTEwNDJ9LCB7LTgwLCAxMTExN30sIHstNzksIDExMTk0fSwKKyAgICAgICAgICAgIHstNzgsIDExMjcyfSwgey03NywgMTEzNTJ9LCB7LTc2LCAxMTQzM30sIHstNzUsIDExNTE2fSwgey03NCwgMTE2MDB9LCB7LTczLCAxMTY4Nn0sCisgICAgICAgICAgICB7LTcyLCAxMTc3NH0sIHstNzEsIDExODY0fSwgey03MCwgMTE5NTV9LCB7LTY5LCAxMjA0OX0sIHstNjgsIDEyMTQ0fSwgey02NywgMTIyNDJ9LAorICAgICAgICAgICAgey02NiwgMTIzNDF9LCB7LTY1LCAxMjQ0M30sIHstNjQsIDEyNTQ4fSwgey02MywgMTI2NTR9LCB7LTYyLCAxMjc2M30sIHstNjEsIDEyODc1fSwKKyAgICAgICAgICAgIHstNjAsIDEyOTkwfSwgey01OSwgMTMxMDd9LCB7LTU4LCAxMzIyN30sIHstNTcsIDEzMzUxfSwgey01NiwgMTM0Nzd9LCB7LTU1LCAxMzYwN30sCisgICAgICAgICAgICB7LTU0LCAxMzc0MX0sIHstNTMsIDEzODc4fSwgey01MiwgMTQwMTl9LCB7LTUxLCAxNDE2NH0sIHstNTAsIDE0MzEzfSwgey00OSwgMTQ0Njd9LAorICAgICAgICAgICAgey00OCwgMTQ2MjZ9LCB7LTQ3LCAxNDc4OX0sIHstNDYsIDE0OTU4fSwgey00NSwgMTUxMzJ9LCB7LTQ0LCAxNTMxMn0sIHstNDMsIDE1NDk4fSwKKyAgICAgICAgICAgIHstNDIsIDE1NjkxfSwgey00MSwgMTU4OTB9LCB7LTQwLCAxNjA5N30sIHstMzksIDE2MzExfSwgey0zOCwgMTY1MzR9LCB7LTM3LCAxNjc2Nn0sCisgICAgICAgICAgICB7LTM2LCAxNzAwN30sIHstMzUsIDE3MjU5fSwgey0zNCwgMTc1MjF9LCB7LTMzLCAxNzc5NX0sIHstMzIsIDE4MDgxfSwgey0zMSwgMTgzODF9LAorICAgICAgICAgICAgey0zMCwgMTg2OTZ9LCB7LTI5LCAxOTAyN30sIHstMjgsIDE5Mzc1fSwgey0yNywgMTk3NDJ9LCB7LTI2LCAyMDEyOX0sIHstMjUsIDIwNTQwfSwKKyAgICAgICAgICAgIHstMjQsIDIwOTc2fSwgey0yMywgMjE0Mzl9LCB7LTIyLCAyMTkzNH0sIHstMjEsIDIyNDYzfSwgey0yMCwgMjMwMzF9LCB7LTE5LCAyMzY0M30sCisgICAgICAgICAgICB7LTE4LCAyMzk5OX19OwogCi0gICAgZm9yKGkgPSAwOyBpIDwgOTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKEhmbGV2ZWwgPD0gTFBGQXJyYXlbaV0uUm9vbV9IRikKLSAgICAgICAgICAgIGJyZWFrOworICAgIGZvciAoaSA9IDA7IGkgPCA5NjsgaSsrKSB7CisgICAgICAgIGlmIChIZmxldmVsIDw9IExQRkFycmF5W2ldLlJvb21fSEYpIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gTFBGQXJyYXlbaV0uTFBGOwogfQpAQCAtODc5LDI2ICs4ODMsMjYgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBSZXZlcmJTZXRSb29tSGZMZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tSGZMZXZlbCBzdGFydCAoJWQpIiwgbGV2ZWwpOwordm9pZCBSZXZlcmJTZXRSb29tSGZMZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCBsZXZlbCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21IZkxldmVsIHN0YXJ0ICglZCkiLCBsZXZlbCk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwgU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSb29tSGZMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKIAogICAgIEFjdGl2ZVBhcmFtcy5MUEYgPSBSZXZlcmJDb252ZXJ0SGZMZXZlbChsZXZlbCk7CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSb29tSGZMZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29taGZMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSb29taGZMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKICAgICBwQ29udGV4dC0+U2F2ZWRIZkxldmVsID0gbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRIZlJvb21MZXZlbCBlbmQuLiBzYXZpbmcgJWQiLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRIZlJvb21MZXZlbCBlbmQuLiBzYXZpbmcgJWQiLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKICAgICByZXR1cm47CiB9CiAKQEAgLTkxMywzMCArOTE3LDMxIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDE2X3QgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworaW50MTZfdCBSZXZlcmJHZXRSb29tSGZMZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgewogICAgIGludDE2X3QgbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBzdGFydCwgc2F2ZWQgbGV2ZWwgaXMgJWQiLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBzdGFydCwgc2F2ZWQgbGV2ZWwgaXMgJWQiLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJHZXRSb29tSGZMZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYpOwogCiAgICAgbGV2ZWwgPSBSZXZlcmJDb252ZXJ0SGZMZXZlbChwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBBY3RpdmVQYXJhbXMuTFBGTCAlZCwgcENvbnRleHQtPlNhdmVkSGZMZXZlbDogJWQsICIKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIEFjdGl2ZVBhcmFtcy5MUEZMICVkLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsOiAlZCwgIgogICAgIC8vICAgICAiY29udmVydGVkIGxldmVsOiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRiwgcENvbnRleHQtPlNhdmVkSGZMZXZlbCwgbGV2ZWwpOwogCi0gICAgaWYoKGludDE2X3QpQWN0aXZlUGFyYW1zLkxQRiAhPSBsZXZlbCl7Ci0gICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJvb21IZkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAotICAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CisgICAgaWYgKChpbnQxNl90KUFjdGl2ZVBhcmFtcy5MUEYgIT0gbGV2ZWwpIHsKKyAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgIgorICAgICAgICAgICAgICAiJWRcbiIsCisgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwgZW5kIik7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWw7CiB9CiAKQEAgLTk1MiwzNSArOTU3LDM1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGludDE2X3QgbGV2ZWwpewotICAgIC8vQUxPR1YoIlxuXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCBzdGFydCAoJWQpIiwgbGV2ZWwpOwordm9pZCBSZXZlcmJTZXRSZXZlcmJMZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCBsZXZlbCkgeworICAgIC8vIEFMT0dWKCJcblx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldFJldmVyYkxldmVsIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKLSAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKS1MVlJFVl9NQVhfUkVWRVJCX0xFVkVMOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBDb21iaW5lZExldmVsIGlzICVkID0gJWQgKyAlZFxuIiwKKyAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKSAtIExWUkVWX01BWF9SRVZFUkJfTEVWRUw7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBDb21iaW5lZExldmVsIGlzICVkID0gJWQgKyAlZFxuIiwKICAgICAvLyAgICAgIENvbWJpbmVkTGV2ZWwsIGxldmVsLCBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwpOwogCiAgICAgQWN0aXZlUGFyYW1zLkxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIFRyeWluZyB0byBzZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBUcnlpbmcgdG8gc2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgPSBsZXZlbDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIGVuZCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCBpcyAlZFxuXG4iLAorICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIGVuZCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCBpcyAlZFxuXG4iLAogICAgIC8vICAgICBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCk7CiAgICAgcmV0dXJuOwogfQpAQCAtOTk2LDM3ICsxMDAxLDQwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDE2X3QgUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworaW50MTZfdCBSZXZlcmJHZXRSZXZlcmJMZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgewogICAgIGludDE2X3QgbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBzdGFydCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsIHN0YXJ0Iik7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDMyIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJHZXRSZXZlcmJMZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxldmVsKTsKIAogICAgIC8vIG5lZWRzIHRvIHN1YnRyYWN0IG1heCBsZXZlbHMgZm9yIGJvdGggUm9vbUxldmVsIGFuZCBSZXZlcmJMZXZlbAotICAgIENvbWJpbmVkTGV2ZWwgPSAocENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgKyBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwpLUxWUkVWX01BWF9SRVZFUkJfTEVWRUw7CisgICAgQ29tYmluZWRMZXZlbCA9CisgICAgICAgICAgICAocENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgKyBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwpIC0gTFZSRVZfTUFYX1JFVkVSQl9MRVZFTDsKIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKSBDb21iaW5lZExldmVsIGlzICVkID0gJWQgKyAlZFxuIiwKLSAgICAvL0NvbWJpbmVkTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLCBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsKCkgQ29tYmluZWRMZXZlbCBpcyAlZCA9ICVkICsgJWRcbiIsCisgICAgLy8gQ29tYmluZWRMZXZlbCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCk7CiAgICAgbGV2ZWwgPSBSZXZlcmJDb252ZXJ0TGV2ZWwoQ29tYmluZWRMZXZlbCk7CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsKCk6IEFjdGl2ZVBhcmFtcy5MZXZlbDogJWQsIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsOiAlZCwgIgorICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsKCk6IEFjdGl2ZVBhcmFtcy5MZXZlbDogJWQsIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsOiAlZCwgIgogICAgIC8vInBDb250ZXh0LT5TYXZlZFJvb21MZXZlbDogJWQsIENvbWJpbmVkTGV2ZWw6ICVkLCBjb252ZXJ0ZWQgbGV2ZWw6ICVkXG4iLAotICAgIC8vQWN0aXZlUGFyYW1zLkxldmVsLCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCxwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwsIENvbWJpbmVkTGV2ZWwsbGV2ZWwpOworICAgIC8vIEFjdGl2ZVBhcmFtcy5MZXZlbCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwscENvbnRleHQtPlNhdmVkUm9vbUxldmVsLAorICAgIC8vIENvbWJpbmVkTGV2ZWwsbGV2ZWwpOwogCi0gICAgaWYoQWN0aXZlUGFyYW1zLkxldmVsICE9IGxldmVsKXsKLSAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CisgICAgaWYgKEFjdGl2ZVBhcmFtcy5MZXZlbCAhPSBsZXZlbCkgeworICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAiCisgICAgICAgICAgICAgICIlZFxuIiwKKyAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBlbmRcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsIGVuZFxuIik7CiAKICAgICByZXR1cm4gcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWw7CiB9CkBAIC0xMDQzLDMwICsxMDUxLDMwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0Um9vbUxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCBzdGFydCAoJWQpIiwgbGV2ZWwpOwordm9pZCBSZXZlcmJTZXRSb29tTGV2ZWwoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIGludDE2X3QgbGV2ZWwpIHsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldFJvb21MZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKLSAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwpLUxWUkVWX01BWF9SRVZFUkJfTEVWRUw7CisgICAgQ29tYmluZWRMZXZlbCA9IChsZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsKSAtIExWUkVWX01BWF9SRVZFUkJfTEVWRUw7CiAgICAgQWN0aXZlUGFyYW1zLkxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUxldmVsIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsID0gbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIGVuZCIpOwogICAgIHJldHVybjsKIH0KIApAQCAtMTA4MSwzNSArMTA4OSwzNiBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQxNl90IFJldmVyYkdldFJvb21MZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CitpbnQxNl90IFJldmVyYkdldFJvb21MZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgewogICAgIGludDE2X3QgbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgc3RhcnQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgc3RhcnQiKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldFJvb21MZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKLSAgICBDb21iaW5lZExldmVsID0gKHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLUxWUkVWX01BWF9SRVZFUkJfTEVWRUwpOworICAgIENvbWJpbmVkTGV2ZWwgPQorICAgICAgICAgICAgKHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsIC0gTFZSRVZfTUFYX1JFVkVSQl9MRVZFTCk7CiAgICAgbGV2ZWwgPSBSZXZlcmJDb252ZXJ0TGV2ZWwoQ29tYmluZWRMZXZlbCk7CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCwgTGV2ZWwgPSAlZCwgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsID0gJWQsICIKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwsIExldmVsID0gJWQsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCA9ICVkLCAiCiAgICAgLy8gICAgICJwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCA9ICVkLCBDb21iaW5lZExldmVsID0gJWQsIGxldmVsID0gJWQiLAogICAgIC8vICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCwKICAgICAvLyAgICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwsIENvbWJpbmVkTGV2ZWwsIGxldmVsKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5MZXZlbCAhPSBsZXZlbCl7CisgICAgaWYgKEFjdGl2ZVBhcmFtcy5MZXZlbCAhPSBsZXZlbCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSb29tTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCiAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCBlbmQiKTsKICAgICByZXR1cm4gcENvbnRleHQtPlNhdmVkUm9vbUxldmVsOwogfQogCkBAIC0xMTI1LDM0ICsxMTM0LDM1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0RGVjYXlUaW1lKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCB0aW1lKXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBzdGFydCAoJWQpIiwgdGltZSk7Cit2b2lkIFJldmVyYlNldERlY2F5VGltZShSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgdGltZSkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBzdGFydCAoJWQpIiwgdGltZSk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVjYXlUaW1lIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlQ2MCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjApOwogCiAgICAgaWYgKHRpbWUgPD0gTFZSRVZfTUFYX1Q2MCkgewogICAgICAgICBBY3RpdmVQYXJhbXMuVDYwID0gKExWTV9VSU5UMTYpdGltZTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgICAgQWN0aXZlUGFyYW1zLlQ2MCA9IExWUkVWX01BWF9UNjA7CiAgICAgfQogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVjYXlUaW1lIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlQ2MCk7CiAKLSAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0gKEFjdGl2ZVBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkvMTAwMDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgU2V0IFNhbXBsZXNUb0V4aXRDb3VudC0+ICVkXG4iLHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQpOworICAgIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPQorICAgICAgICAgICAgKEFjdGl2ZVBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgLyAxMDAwOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgU2V0IFNhbXBsZXNUb0V4aXRDb3VudC0+CisgICAgLy8gJWRcbiIscENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCk7CiAgICAgcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lID0gKGludDE2X3QpdGltZTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUgZW5kIik7CiAgICAgcmV0dXJuOwogfQogCkBAIC0xMTY3LDI1ICsxMTc3LDI1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXVpbnQzMl90IFJldmVyYkdldERlY2F5VGltZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgc3RhcnQiKTsKK3VpbnQzMl90IFJldmVyYkdldERlY2F5VGltZShSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBzdGFydCIpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlY2F5VGltZSIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlUaW1lKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjApOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5UNjAgIT0gcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKXsKKyAgICBpZiAoQWN0aXZlUGFyYW1zLlQ2MCAhPSBwQ29udGV4dC0+U2F2ZWREZWNheVRpbWUpIHsKICAgICAgICAgLy8gVGhpcyB3aWxsIGZhaWwgaWYgdGhlIGRlY2F5IHRpbWUgaXMgc2V0IHRvIG1vcmUgdGhhbiA3MDAwCi0gICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERlY2F5VGltZSgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwKLSAgICAgICAgIEFjdGl2ZVBhcmFtcy5UNjAsIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSk7CisgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERlY2F5VGltZSgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwgQWN0aXZlUGFyYW1zLlQ2MCwKKyAgICAgICAgICAgICAgcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgZW5kIik7CiAgICAgcmV0dXJuICh1aW50MzJfdClBY3RpdmVQYXJhbXMuVDYwOwogfQogCkBAIC0xMjAxLDI3ICsxMjExLDI3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IHJhdGlvKXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpb2Ugc3RhcnQgKCVkKSIsIHJhdGlvKTsKK3ZvaWQgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IHJhdGlvKSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvZSBzdGFydCAoJWQpIiwgcmF0aW8pOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXREZWNheUhmUmF0aW8iKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbygpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKIAotICAgIEFjdGl2ZVBhcmFtcy5EYW1waW5nID0gKExWTV9JTlQxNikocmF0aW8vMjApOworICAgIEFjdGl2ZVBhcmFtcy5EYW1waW5nID0gKExWTV9JTlQxNikocmF0aW8gLyAyMCk7CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXREZWNheUhmUmF0aW8iKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZWNheUhmUmF0aW8oKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRhbXBpbmcpOwogCiAgICAgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvID0gcmF0aW87Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheUhmUmF0aW8gZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIGVuZCIpOwogICAgIHJldHVybjsKIH0KIApAQCAtMTIzNiwyNCArMTI0NiwyNCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQzMl90IFJldmVyYkdldERlY2F5SGZSYXRpbyhSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gc3RhcnQiKTsKK2ludDMyX3QgUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvIHN0YXJ0Iik7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlY2F5SGZSYXRpbyIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8oKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRhbXBpbmcpOwogCi0gICAgaWYoQWN0aXZlUGFyYW1zLkRhbXBpbmcgIT0gKExWTV9JTlQxNikocENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvIC8gMjApKXsKKyAgICBpZiAoQWN0aXZlUGFyYW1zLkRhbXBpbmcgIT0gKExWTV9JTlQxNikocENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvIC8gMjApKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERlY2F5SGZSYXRpbygpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwKLSAgICAgICAgIEFjdGl2ZVBhcmFtcy5EYW1waW5nLCBwQ29udGV4dC0+U2F2ZWREZWNheUhmUmF0aW8pOworICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuRGFtcGluZywgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlY2F5SGZSYXRpbyBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gZW5kIik7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbzsKIH0KIApAQCAtMTI2OSwyNyArMTI3OSwyNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYlNldERpZmZ1c2lvbihSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24gc3RhcnQgKCVkKSIsIGxldmVsKTsKK3ZvaWQgUmV2ZXJiU2V0RGlmZnVzaW9uKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IGxldmVsKSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIHN0YXJ0ICglZCkiLCBsZXZlbCk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGlmZnVzaW9uIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24oKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbiBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbigpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGVuc2l0eSk7CiAKLSAgICBBY3RpdmVQYXJhbXMuRGVuc2l0eSA9IChMVk1fSU5UMTYpKGxldmVsLzEwKTsKKyAgICBBY3RpdmVQYXJhbXMuRGVuc2l0eSA9IChMVk1fSU5UMTYpKGxldmVsIC8gMTApOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGlmZnVzaW9uIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbigpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGVuc2l0eSk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKIAogICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiA9IGxldmVsOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbiBlbmQiKTsKICAgICByZXR1cm47CiB9CiAKQEAgLTEzMDQsMjYgKzEzMTQsMjYgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MzJfdCBSZXZlcmJHZXREaWZmdXNpb24oUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIHN0YXJ0Iik7CitpbnQzMl90IFJldmVyYkdldERpZmZ1c2lvbihSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBzdGFydCIpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgVGVtcDsKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgVGVtcDsKIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJHZXREaWZmdXNpb24iKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOwogCi0gICAgVGVtcCA9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbi8xMCk7CisgICAgVGVtcCA9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiAvIDEwKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5EZW5zaXR5ICE9IFRlbXApeworICAgIGlmIChBY3RpdmVQYXJhbXMuRGVuc2l0eSAhPSBUZW1wKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERpZmZ1c2lvbiBpbnZhbGlkIHZhbHVlICVkICVkIiwgVGVtcCwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBlbmQiKTsKICAgICByZXR1cm4gcENvbnRleHQtPlNhdmVkRGlmZnVzaW9uOwogfQogCkBAIC0xMzM5LDI3ICsxMzQ5LDI3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0RGVuc2l0eShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IHN0YXJ0ICglZCkiLCBsZXZlbCk7Cit2b2lkIFJldmVyYlNldERlbnNpdHkoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIGludDE2X3QgbGV2ZWwpIHsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IHN0YXJ0ICglZCkiLCBsZXZlbCk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVuc2l0eSIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlbnNpdHkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlbnNpdHkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSk7CiAKICAgICBBY3RpdmVQYXJhbXMuUm9vbVNpemUgPSAoTFZNX0lOVDE2KSgoKGxldmVsICogOTkpIC8gMTAwMCkgKyAxKTsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlbnNpdHkiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOwogCiAgICAgcENvbnRleHQtPlNhdmVkRGVuc2l0eSA9IGxldmVsOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IGVuZCIpOwogICAgIHJldHVybjsKIH0KIApAQCAtMTM3NCwyNSArMTM4NCwyNSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQzMl90IFJldmVyYkdldERlbnNpdHkoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSBzdGFydCIpOworaW50MzJfdCBSZXZlcmJHZXREZW5zaXR5KFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSBzdGFydCIpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgVGVtcDsKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgVGVtcDsKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiR2V0RGVuc2l0eSIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlbnNpdHkoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOwogCiAgICAgVGVtcCA9IChMVk1fSU5UMTYpKCgocENvbnRleHQtPlNhdmVkRGVuc2l0eSAqIDk5KSAvIDEwMDApICsgMSk7CiAKLSAgICBpZihUZW1wICE9IEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSl7CisgICAgaWYgKFRlbXAgIT0gQWN0aXZlUGFyYW1zLlJvb21TaXplKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERlbnNpdHkgaW52YWxpZCB2YWx1ZSAlZCAlZCIsIFRlbXAsIEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSk7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlbnNpdHkgZW5kIik7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZERlbnNpdHk7CiB9CiAKQEAgLTE0MTAsMjAgKzE0MjAsMTkgQEAKIC8vIFNpZGUgRWZmZWN0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBSZXZlcmJfTG9hZFByZXNldChSZXZlcmJDb250ZXh0ICAgKnBDb250ZXh0KQotewotICAgIC8vVE9ETzogYWRkIHJlZmxlY3Rpb25zIGRlbGF5LCBsZXZlbCBhbmQgcmV2ZXJiIGRlbGF5IHdoZW4gZWFybHkgcmVmbGVjdGlvbnMgYXJlCitpbnQgUmV2ZXJiX0xvYWRQcmVzZXQoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKKyAgICAvLyBUT0RPOiBhZGQgcmVmbGVjdGlvbnMgZGVsYXksIGxldmVsIGFuZCByZXZlcmIgZGVsYXkgd2hlbiBlYXJseSByZWZsZWN0aW9ucyBhcmUKICAgICAvLyBpbXBsZW1lbnRlZAogICAgIHBDb250ZXh0LT5jdXJQcmVzZXQgPSBwQ29udGV4dC0+bmV4dFByZXNldDsKIAogICAgIGlmIChwQ29udGV4dC0+Y3VyUHJlc2V0ICE9IFJFVkVSQl9QUkVTRVRfTk9ORSkgewotICAgICAgICBjb25zdCB0X3JldmVyYl9zZXR0aW5ncyAqcHJlc2V0ID0gJnNSZXZlcmJQcmVzZXRzW3BDb250ZXh0LT5jdXJQcmVzZXRdOworICAgICAgICBjb25zdCB0X3JldmVyYl9zZXR0aW5ncyogcHJlc2V0ID0gJnNSZXZlcmJQcmVzZXRzW3BDb250ZXh0LT5jdXJQcmVzZXRdOwogICAgICAgICBSZXZlcmJTZXRSb29tTGV2ZWwocENvbnRleHQsIHByZXNldC0+cm9vbUxldmVsKTsKICAgICAgICAgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwocENvbnRleHQsIHByZXNldC0+cm9vbUhGTGV2ZWwpOwogICAgICAgICBSZXZlcmJTZXREZWNheVRpbWUocENvbnRleHQsIHByZXNldC0+ZGVjYXlUaW1lKTsKICAgICAgICAgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0LCBwcmVzZXQtPmRlY2F5SEZSYXRpbyk7Ci0gICAgICAgIC8vcmVmbGVjdGlvbnNMZXZlbAotICAgICAgICAvL3JlZmxlY3Rpb25zRGVsYXkKKyAgICAgICAgLy8gcmVmbGVjdGlvbnNMZXZlbAorICAgICAgICAvLyByZWZsZWN0aW9uc0RlbGF5CiAgICAgICAgIFJldmVyYlNldFJldmVyYkxldmVsKHBDb250ZXh0LCBwcmVzZXQtPnJldmVyYkxldmVsKTsKICAgICAgICAgLy8gcmV2ZXJiRGVsYXkKICAgICAgICAgUmV2ZXJiU2V0RGlmZnVzaW9uKHBDb250ZXh0LCBwcmVzZXQtPmRpZmZ1c2lvbik7CkBAIC0xNDU0LDk5ICsxNDYzLDk2IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSl7CitpbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgdm9pZCogcFBhcmFtLCB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBQYXJhbVRlbXAgPSAoaW50MzJfdCopcFBhcmFtOwogICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOwotICAgIHRfcmV2ZXJiX3NldHRpbmdzICpwUHJvcGVydGllczsKKyAgICB0X3JldmVyYl9zZXR0aW5ncyogcFByb3BlcnRpZXM7CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyIHN0YXJ0Iik7CiAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQpIHsKICAgICAgICAgaWYgKHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQgfHwgKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogCi0gICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSBwQ29udGV4dC0+bmV4dFByZXNldDsKKyAgICAgICAgKih1aW50MTZfdCopcFZhbHVlID0gcENvbnRleHQtPm5leHRQcmVzZXQ7CiAgICAgICAgIEFMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1BSRVNFVCwgcHJlc2V0ICVkIiwgcENvbnRleHQtPm5leHRQcmVzZXQpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMSAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMTIgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMyAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemU0ICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNSAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNiAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNyAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTggJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTkgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTEwICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodF9yZXZlcmJfc2V0dGluZ3MpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodF9yZXZlcmJfc2V0dGluZ3MpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTExICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQpAQCAtMTU1OCw5ICsxNTY0LDkgQEAKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHBQcm9wZXJ0aWVzID0gKHRfcmV2ZXJiX3NldHRpbmdzICopIHBWYWx1ZTsKKyAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyopcFZhbHVlOwogCi0gICAgc3dpdGNoIChwYXJhbSl7CisgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgogICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21MZXZlbCA9IFJldmVyYkdldFJvb21MZXZlbChwQ29udGV4dCk7CiAgICAgICAgICAgICBwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWwgPSBSZXZlcmJHZXRSb29tSGZMZXZlbChwQ29udGV4dCk7CkBAIC0xNTc0LDc0ICsxNTgwLDc0IEBACiAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVuc2l0eSA9IFJldmVyYkdldERlbnNpdHkocENvbnRleHQpOwogCiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcm9vbUxldmVsICAgICAgICAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21MZXZlbCk7CisgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cm9vbUxldmVsKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByb29tSEZMZXZlbCAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWwpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyBkZWNheVRpbWUgICAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVjYXlUaW1lKTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZWNheVRpbWUpOwogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIGRlY2F5SEZSYXRpbyAgICAgJWQiLAotICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW8pOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlY2F5SEZSYXRpbyk7CiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcmVmbGVjdGlvbnNMZXZlbCAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJlZmxlY3Rpb25zTGV2ZWwpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJlZmxlY3Rpb25zTGV2ZWwpOwogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIHJlZmxlY3Rpb25zRGVsYXkgJWQiLAotICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5KTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5KTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZXZlcmJEZWxheSAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmV2ZXJiRGVsYXkpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJldmVyYkRlbGF5KTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZXZlcmJMZXZlbCAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmV2ZXJiTGV2ZWwpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJldmVyYkxldmVsKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyBkaWZmdXNpb24gICAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGlmZnVzaW9uKTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kaWZmdXNpb24pOwogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIGRlbnNpdHkgICAgICAgICAgJWQiLAotICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZW5zaXR5KTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZW5zaXR5KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6Ci0gICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBSZXZlcmJHZXRSb29tTGV2ZWwocENvbnRleHQpOworICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSBSZXZlcmJHZXRSb29tTGV2ZWwocENvbnRleHQpOwogCi0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKLSAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJvb21IZkxldmVsKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gUmV2ZXJiR2V0Um9vbUhmTGV2ZWwocENvbnRleHQpOwogCi0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwgVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSBSZXZlcmJHZXREZWNheVRpbWUocENvbnRleHQpOworICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gUmV2ZXJiR2V0RGVjYXlUaW1lKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FIFZhbHVlIGlzICVkIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPTiBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPTiBWYWx1ZSBpcyAlZCIsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwocENvbnRleHQpOworICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSBSZXZlcmJHZXRSZXZlcmJMZXZlbChwQ29udGV4dCk7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwgVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0RGlmZnVzaW9uKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gUmV2ZXJiR2V0RGlmZnVzaW9uKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiBWYWx1ZSBpcyAlZCIsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0RGVuc2l0eShwQ29udGV4dCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVOU0lUWSBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IFJldmVyYkdldERlbnNpdHkocENvbnRleHQpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERU5TSVRZIFZhbHVlIGlzICVkIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKLSAgICAgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAwOworICAgICAgICAgICAgKih1aW50MTZfdCopcFZhbHVlID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgotICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE2NTAsNyArMTY1Niw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlciBlbmQiKTsKICAgICByZXR1cm4gc3RhdHVzOwogfSAvKiBlbmQgUmV2ZXJiX2dldFBhcmFtZXRlciAqLwogCkBAIC0xNjcwLDE2ICsxNjc2LDE2IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBSZXZlcmJfc2V0UGFyYW1ldGVyIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUsIGludCB2c2l6ZSl7CitpbnQgUmV2ZXJiX3NldFBhcmFtZXRlcihSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgdm9pZCogcFBhcmFtLCB2b2lkKiBwVmFsdWUsIGludCB2c2l6ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludDE2X3QgbGV2ZWw7CiAgICAgaW50MTZfdCByYXRpbzsKICAgICB1aW50MzJfdCB0aW1lOwotICAgIHRfcmV2ZXJiX3NldHRpbmdzICpwUHJvcGVydGllczsKLSAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CisgICAgdF9yZXZlcmJfc2V0dGluZ3MqIHBQcm9wZXJ0aWVzOworICAgIGludDMyX3QqIHBQYXJhbVRlbXAgPSAoaW50MzJfdCopcFBhcmFtOwogICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlciBzdGFydCIpOwogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0KSB7CiAgICAgICAgIGlmIChwYXJhbSAhPSBSRVZFUkJfUEFSQU1fUFJFU0VUKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE2ODksNyArMTY5NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQxNl90IHByZXNldCA9ICoodWludDE2X3QgKilwVmFsdWU7CisgICAgICAgIHVpbnQxNl90IHByZXNldCA9ICoodWludDE2X3QqKXBWYWx1ZTsKICAgICAgICAgQUxPR1YoInNldCBSRVZFUkJfUEFSQU1fUFJFU0VULCBwcmVzZXQgJWQiLCBwcmVzZXQpOwogICAgICAgICBpZiAocHJlc2V0ID4gUkVWRVJCX1BSRVNFVF9MQVNUKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE3MDMsMTAgKzE3MDksMTAgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgc3dpdGNoIChwYXJhbSl7CisgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIik7Ci0gICAgICAgICAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyAqKSBwVmFsdWU7CisgICAgICAgICAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyopcFZhbHVlOwogICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUxldmVsKHBDb250ZXh0LCBwUHJvcGVydGllcy0+cm9vbUxldmVsKTsKICAgICAgICAgICAgIFJldmVyYlNldFJvb21IZkxldmVsKHBDb250ZXh0LCBwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWwpOwogICAgICAgICAgICAgUmV2ZXJiU2V0RGVjYXlUaW1lKHBDb250ZXh0LCBwUHJvcGVydGllcy0+ZGVjYXlUaW1lKTsKQEAgLTE3MTYsNTUgKzE3MjIsNTUgQEAKICAgICAgICAgICAgIFJldmVyYlNldERlbnNpdHkocENvbnRleHQsIHBQcm9wZXJ0aWVzLT5kZW5zaXR5KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgotICAgICAgICAgICAgbGV2ZWwgPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0Um9vbUxldmVsIik7CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0Um9vbUxldmVsIik7CiAgICAgICAgICAgICBSZXZlcmJTZXRSb29tTGV2ZWwocENvbnRleHQsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXRSb29tTGV2ZWwiKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6Ci0gICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXRSb29tSGZMZXZlbCIpOwotICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwocENvbnRleHQsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXRSb29tSGZMZXZlbCIpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICAgICAgICAgIHRpbWUgPSAqKHVpbnQzMl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUgdmFsdWUgaXMgJWQiLCB0aW1lKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlUaW1lIik7Ci0gICAgICAgICAgICBSZXZlcmJTZXREZWNheVRpbWUocENvbnRleHQsIHRpbWUpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERlY2F5VGltZSIpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86Ci0gICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTyB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7Ci0gICAgICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHJhdGlvKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREZWNheUhmUmF0aW8iKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0Um9vbUxldmVsIik7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKLSAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKTsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwgdmFsdWUgaXMgJWQiLCBsZXZlbCk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXRSb29tSGZMZXZlbCIpOworICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwocENvbnRleHQsIGxldmVsKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICAgICAgdGltZSA9ICoodWludDMyX3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRSB2YWx1ZSBpcyAlZCIsIHRpbWUpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlUaW1lIik7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheVRpbWUocENvbnRleHQsIHRpbWUpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREZWNheVRpbWUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPIHZhbHVlIGlzICVkIiwgcmF0aW8pOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgbGV2ZWwgPSAqKGludDE2X3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKTsKICAgICAgICAgICAgIFJldmVyYlNldFJldmVyYkxldmVsKHBDb250ZXh0LCBsZXZlbCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKTsKLSAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJldmVyYkxldmVsIik7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgotICAgICAgICAgICAgcmF0aW8gPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfRElGRlVTSU9OIHZhbHVlIGlzICVkIiwgcmF0aW8pOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREaWZmdXNpb24iKTsKKyAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldERpZmZ1c2lvbiIpOwogICAgICAgICAgICAgUmV2ZXJiU2V0RGlmZnVzaW9uKHBDb250ZXh0LCByYXRpbyk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGlmZnVzaW9uIik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERpZmZ1c2lvbiIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFTlNJVFk6Ci0gICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9ERU5TSVRZIHZhbHVlIGlzICVkIiwgcmF0aW8pOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREZW5zaXR5Iik7CisgICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9ERU5TSVRZIHZhbHVlIGlzICVkIiwgcmF0aW8pOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVuc2l0eSIpOwogICAgICAgICAgICAgUmV2ZXJiU2V0RGVuc2l0eShwQ29udGV4dCwgcmF0aW8pOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERlbnNpdHkiKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGVuc2l0eSIpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgpAQCAtMTc3NCw3ICsxNzgwLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlciBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyIGVuZCIpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBSZXZlcmJfc2V0UGFyYW1ldGVyICovCiAKQEAgLTE3ODMsNTIgKzE3ODksNDYgQEAKICAqLwogaW50IFJldmVyYl9wYXJhbVZhbHVlU2l6ZShpbnQzMl90IHBhcmFtKSB7CiAgICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgIHJldHVybiBzaXplb2YoaW50MTZfdCk7IC8vIG1pbGxpYmVsCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6Ci0gICAgICAgIHJldHVybiBzaXplb2YodWludDMyX3QpOyAvLyBtaWxsaXNlY29uZHMKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKLSAgICAgICAgcmV0dXJuIHNpemVvZihpbnQxNl90KTsgLy8gcGVybWlsbGUKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgotICAgICAgICByZXR1cm4gc2l6ZW9mKHNfcmV2ZXJiX3NldHRpbmdzKTsgLy8gc3RydWN0IG9mIGFsbCByZXZlcmIgcHJvcGVydGllcworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihpbnQxNl90KTsgIC8vIG1pbGxpYmVsCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHVpbnQzMl90KTsgIC8vIG1pbGxpc2Vjb25kcworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihpbnQxNl90KTsgIC8vIHBlcm1pbGxlCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHNfcmV2ZXJiX3NldHRpbmdzKTsgIC8vIHN0cnVjdCBvZiBhbGwgcmV2ZXJiIHByb3BlcnRpZXMKICAgICB9CiAgICAgcmV0dXJuIHNpemVvZihpbnQzMl90KTsKIH0KIAotfSAvLyBuYW1lc3BhY2UKLX0gLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGV4dGVybiAiQyIgewogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBQcm9jZXNzICovCi1pbnQgUmV2ZXJiX3Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKLSAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKSBzZWxmOwotICAgIGludCAgICBzdGF0dXMgPSAwOworaW50IFJldmVyYl9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCogaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90KiBvdXRCdWZmZXIpIHsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0KiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0KilzZWxmOworICAgIGludCBzdGF0dXMgPSAwOwogCi0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9wcm9jZXNzKCkgRVJST1IgcENvbnRleHQgPT0gTlVMTCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCAgfHwKLSAgICAgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKLSAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCl7CisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8IG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9wcm9jZXNzKCkgRVJST1IgTlVMTCBJTlBVVCBQT0lOVEVSIE9SIEZSQU1FIENPVU5UIElTIFdST05HIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLSAgICAvL0FMT0dWKCJcdFJldmVyYl9wcm9jZXNzKCkgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZnJhbWVzIiwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfcHJvY2VzcygpIENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGZyYW1lcyIsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCi0gICAgc3RhdHVzID0gcHJvY2VzcyggICAgaW5CdWZmZXItPmYzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOworICAgIHN0YXR1cyA9IHByb2Nlc3MoaW5CdWZmZXItPmYzMiwgb3V0QnVmZmVyLT5mMzIsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwgcENvbnRleHQpOwogCiAgICAgaWYgKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UpIHsKICAgICAgICAgaWYgKHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKSB7CkBAIC0xODQwLDcyICsxODQwLDY3IEBACiAgICAgfQogCiAgICAgcmV0dXJuIHN0YXR1czsKLX0gICAvKiBlbmQgUmV2ZXJiX3Byb2Nlc3MgKi8KK30gLyogZW5kIFJldmVyYl9wcm9jZXNzICovCiAKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogQ29tbWFuZCAqLwotaW50IFJldmVyYl9jb21tYW5kKGVmZmVjdF9oYW5kbGVfdCAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcFJlcGx5RGF0YSl7Ci0gICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKikgc2VsZjsKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCitpbnQgUmV2ZXJiX2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQqIHBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiByZXBseVNpemUsIHZvaWQqIHBSZXBseURhdGEpIHsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0KiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0KilzZWxmOworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCi0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBJTlBVVFMgYXJlOiBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYl9jb21tYW5kIElOUFVUUyBhcmU6IGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CiAKLSAgICBzd2l0Y2ggKGNtZENvZGUpeworICAgIHN3aXRjaCAoY21kQ29kZSkgewogICAgICAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9JTklUIHN0YXJ0Iik7CiAKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfSU5JVDogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUc6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX0NPTkZJRyBzdGFydCIpOwotICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUc6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gYW5kcm9pZDo6UmV2ZXJiX3NldENvbmZpZyhwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlZmZlY3RfY29uZmlnX3QgKikgcENtZERhdGEpOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpSZXZlcmJfc2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190KilwQ21kRGF0YSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX0NPTkZJRzoKICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0NPTkZJRzogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfQ09ORklHOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhbmRyb2lkOjpSZXZlcmJfZ2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190ICopcFJlcGx5RGF0YSk7CisgICAgICAgICAgICBhbmRyb2lkOjpSZXZlcmJfZ2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190KilwUmVwbHlEYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9SRVNFVCBzdGFydCIpOwogICAgICAgICAgICAgUmV2ZXJiX3NldENvbmZpZyhwQ29udGV4dCwgJnBDb250ZXh0LT5jb25maWcpOwogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTTp7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOiB7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJcdExWTV9FUlJPUiA6IHBDbWREYXRhIGlzIE5VTEwiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE5MTQsMTYzICsxOTA5LDE1NiBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNDc1MDkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbWRTaXplIDwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fAotICAgICAgICAgICAgICAgICAgICBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSkgeworICAgICAgICAgICAgaWYgKGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8IGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fAorICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOwogCi0gICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKyAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBSZXBseURhdGE7CiAKICAgICAgICAgICAgIGludCB2b2Zmc2V0ID0gKChwLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpICsgMSkgKiBzaXplb2YoaW50MzJfdCk7CiAKLSAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlJldmVyYl9nZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlJldmVyYl9nZXRQYXJhbWV0ZXIocENvbnRleHQsICh2b2lkKilwLT5kYXRhLCAmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgogICAgICAgICAgICAgLy8gICAgICAgICIqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICVkICIsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCkpOwogCiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06ewotCi0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAogICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CiAKICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKIAotICAgICAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0NExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IsIHBzaXplIGlzIG5vdCBzaXplb2YoaW50MzJfdCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy9BTE9HVigiXHRuNVJldmVyYl9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdG41UmV2ZXJiX2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgogICAgICAgICAgICAgLy8gICAgICAgICJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCiAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+cHNpemUgaXMgJWRcbiIKICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT52c2l6ZSBpcyAlZCIKICAgICAgICAgICAgIC8vICAgICAgICAiXG4iLAogICAgICAgICAgICAgLy8gICAgICAgIGNtZFNpemUsIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIHAtPnBzaXplLCBwLT52c2l6ZSApOwogCi0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpSZXZlcmJfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSk7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlJldmVyYl9zZXRQYXJhbWV0ZXIocENvbnRleHQsICh2b2lkKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSwgcC0+dnNpemUpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFIHN0YXJ0Iik7CiAKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX1RSVUUpewotICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SLUVmZmVjdCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SLUVmZmVjdCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gMDsKICAgICAgICAgICAgIHBDb250ZXh0LT5iRW5hYmxlZCA9IExWTV9UUlVFOwogICAgICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJFRkZFQ1RfQ01EX0VOQUJMRSIpCiAgICAgICAgICAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0KLSAgICAgICAgICAgICAgICAgICAgKEFjdGl2ZVBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkvMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgKEFjdGl2ZVBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgLyAxMDAwOwogICAgICAgICAgICAgLy8gZm9yY2Ugbm8gdm9sdW1lIHJhbXAgZm9yIGZpcnN0IGJ1ZmZlciBwcm9jZXNzZWQgYWZ0ZXIgZW5hYmxpbmcgdGhlIGVmZmVjdAogICAgICAgICAgICAgcENvbnRleHQtPnZvbHVtZU1vZGUgPSBhbmRyb2lkOjpSRVZFUkJfVk9MVU1FX0ZMQVQ7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfRU5BQkxFIFNhbXBsZXNUb0V4aXRDb3VudCA9ICVkIiwgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFRkZFQ1RfQ01EX0VOQUJMRSBTYW1wbGVzVG9FeGl0Q291bnQgPSAlZCIsIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9ESVNBQkxFOgotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgogICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEUgc3RhcnQiKTsKIAotICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSl7Ci0gICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SLUVmZmVjdCBpcyBub3QgeWV0IGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1ItRWZmZWN0IGlzIG5vdCB5ZXQgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgcENvbnRleHQtPmJFbmFibGVkID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgIGNtZFNpemUgIT0gMiAqIHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gMiAqIHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1ZPTFVNRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gTlVMTCkgeyAvLyB3ZSBoYXZlIHZvbHVtZSBjb250cm9sCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPmxlZnRWb2x1bWUgPSAoTFZNX0lOVDE2KSgoKih1aW50MzJfdCAqKXBDbWREYXRhICsgKDEgPDwgMTEpKSA+PiAxMik7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gKExWTV9JTlQxNikoKCooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKSArICgxIDw8IDExKSkgPj4gMTIpOwotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gKDEgPDwgMjQpOwotICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopcFJlcGx5RGF0YSArIDEpID0gKDEgPDwgMjQpOworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gTlVMTCkgeyAgLy8gd2UgaGF2ZSB2b2x1bWUgY29udHJvbAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5sZWZ0Vm9sdW1lID0gKExWTV9JTlQxNikoKCoodWludDMyX3QqKXBDbWREYXRhICsgKDEgPDwgMTEpKSA+PiAxMik7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gKExWTV9JTlQxNikoKCooKHVpbnQzMl90KilwQ21kRGF0YSArIDEpICsgKDEgPDwgMTEpKSA+PiAxMik7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopcFJlcGx5RGF0YSA9ICgxIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopcFJlcGx5RGF0YSArIDEpID0gKDEgPDwgMjQpOwogICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+dm9sdW1lTW9kZSA9PSBhbmRyb2lkOjpSRVZFUkJfVk9MVU1FX09GRikgewogICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBubyB2b2x1bWUgcmFtcCBmb3IgZmlyc3QgYnVmZmVyIHByb2Nlc3NlZCBhZnRlciBnZXR0aW5nIHZvbHVtZSBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID0gYW5kcm9pZDo6UkVWRVJCX1ZPTFVNRV9GTEFUOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIHdlIGRvbid0IGhhdmUgdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB3ZSBkb24ndCBoYXZlIHZvbHVtZSBjb250cm9sCiAgICAgICAgICAgICAgICAgcENvbnRleHQtPmxlZnRWb2x1bWUgPSBSRVZFUkJfVU5JVF9WT0xVTUU7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID0gYW5kcm9pZDo6UkVWRVJCX1ZPTFVNRV9PRkY7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiRUZGRUNUX0NNRF9TRVRfVk9MVU1FIGxlZnQgJWQsIHJpZ2h0ICVkIG1vZGUgJWQiLAotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bGVmdFZvbHVtZSwgcENvbnRleHQtPnJpZ2h0Vm9sdW1lLCAgcENvbnRleHQtPnZvbHVtZU1vZGUpOworICAgICAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfU0VUX1ZPTFVNRSBsZWZ0ICVkLCByaWdodCAlZCBtb2RlICVkIiwgcENvbnRleHQtPmxlZnRWb2x1bWUsCisgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUsIHBDb250ZXh0LT52b2x1bWVNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6Ci0gICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfREVWSUNFL0VGRkVDVF9DTURfU0VUX1ZPTFVNRS9FRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFIHN0YXJ0Iik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfREVWSUNFL0VGRkVDVF9DTURfU0VUX1ZPTFVNRS9FRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFCisgICAgICAgICAgICAvLyAgICAgICAgc3RhcnQiKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgIkRFRkFVTFQgc3RhcnQgJWQgRVJST1IiLGNtZENvZGUpOworICAgICAgICAgICAgICAgICAgIkRFRkFVTFQgc3RhcnQgJWQgRVJST1IiLAorICAgICAgICAgICAgICAgICAgY21kQ29kZSk7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGVuZFxuXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBlbmRcblxuIik7CiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBSZXZlcmJfY29tbWFuZCAqLworfSAvKiBlbmQgUmV2ZXJiX2NvbW1hbmQgKi8KIAogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBnZXRfZGVzY3JpcHRvciAqLwotaW50IFJldmVyYl9nZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKLXsKLSAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKXNlbGY7Ci0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKK2ludCBSZXZlcmJfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIHsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0KiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0KilzZWxmOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2M7CiAKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJSZXZlcmJfZ2V0RGVzY3JpcHRvcigpIGludmFsaWQgcGFyYW0iKTsKQEAgLTIwOTQsMjYgKzIwODIsMjQgQEAKICAgICAqcERlc2NyaXB0b3IgPSAqZGVzYzsKIAogICAgIHJldHVybiAwOwotfSAgIC8qIGVuZCBSZXZlcmJfZ2V0RGVzY3JpcHRvciAqLworfSAvKiBlbmQgUmV2ZXJiX2dldERlc2NyaXB0b3IgKi8KIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgUmV2ZXJiIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlID0gewotICAgIFJldmVyYl9wcm9jZXNzLAotICAgIFJldmVyYl9jb21tYW5kLAotICAgIFJldmVyYl9nZXREZXNjcmlwdG9yLAotICAgIE5VTEwsCi19OyAgICAvKiBlbmQgZ1JldmVyYkludGVyZmFjZSAqLworICAgICAgICBSZXZlcmJfcHJvY2VzcywKKyAgICAgICAgUmV2ZXJiX2NvbW1hbmQsCisgICAgICAgIFJldmVyYl9nZXREZXNjcmlwdG9yLAorICAgICAgICBOVUxMLAorfTsgLyogZW5kIGdSZXZlcmJJbnRlcmZhY2UgKi8KIAogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAotX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKLSAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAotICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCi0gICAgLm5hbWUgPSAiUmV2ZXJiIExpYnJhcnkiLAotICAgIC5pbXBsZW1lbnRvciA9ICJOWFAgU29mdHdhcmUgTHRkLiIsCi0gICAgLmNyZWF0ZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCi0gICAgLnJlbGVhc2VfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKLSAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAorX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICAgICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICAgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAgICAgLm5hbWUgPSAiUmV2ZXJiIExpYnJhcnkiLAorICAgICAgICAuaW1wbGVtZW50b3IgPSAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorICAgICAgICAuY3JlYXRlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKKyAgICAgICAgLnJlbGVhc2VfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKKyAgICAgICAgLmdldF9kZXNjcmlwdG9yID0gYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKIH07Ci0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKaW5kZXggOTYyMjNhOC4uMjI3ZDk1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKQEAgLTIwLDE2ICsyMCwxNSBAQAogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2Vudmlyb25tZW50YWxyZXZlcmIuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9wcmVzZXRyZXZlcmIuaD4KIAotI2RlZmluZSBNQVhfTlVNX0JBTkRTICAgICAgICAgICA1Ci0jZGVmaW5lIE1BWF9DQUxMX1NJWkUgICAgICAgICAgIDI1NgotI2RlZmluZSBMVlJFVl9NQVhfVDYwICAgICAgICAgICA3MDAwCi0jZGVmaW5lIExWUkVWX01BWF9SRVZFUkJfTEVWRUwgIDIwMDAKLSNkZWZpbmUgTFZSRVZfTUFYX0ZSQU1FX1NJWkUgICAgMjU2MAotI2RlZmluZSBMVlJFVl9DVVBfTE9BRF9BUk05RSAgICA0NzAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCi0jZGVmaW5lIExWUkVWX01FTV9VU0FHRSAgICAgICAgICg3MSsoTFZSRVZfTUFYX0ZSQU1FX1NJWkU+PjcpKSAgICAgLy8gRXhwcmVzc2VkIGluIGtCCisjZGVmaW5lIE1BWF9OVU1fQkFORFMgNQorI2RlZmluZSBNQVhfQ0FMTF9TSVpFIDI1NgorI2RlZmluZSBMVlJFVl9NQVhfVDYwIDcwMDAKKyNkZWZpbmUgTFZSRVZfTUFYX1JFVkVSQl9MRVZFTCAyMDAwCisjZGVmaW5lIExWUkVWX01BWF9GUkFNRV9TSVpFIDI1NjAKKyNkZWZpbmUgTFZSRVZfQ1VQX0xPQURfQVJNOUUgNDcwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBMVlJFVl9NRU1fVVNBR0UgKDcxICsgKExWUkVWX01BWF9GUkFNRV9TSVpFID4+IDcpKSAgLy8gRXhwcmVzc2VkIGluIGtCCiAKLXR5cGVkZWYgc3RydWN0IF9MUEZQYWlyX3QKLXsKK3R5cGVkZWYgc3RydWN0IF9MUEZQYWlyX3QgewogICAgIGludDE2X3QgUm9vbV9IRjsKICAgICBpbnQxNl90IExQRjsKIH0gTFBGUGFpcl90OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nLy5jbGFuZy1mb3JtYXQgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mMWI0ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nLy5jbGFuZy1mb3JtYXQKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vYnVpbGQvc29vbmcvc2NyaXB0cy9zeXN0ZW0tY2xhbmctZm9ybWF0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5icAppbmRleCBjODc2MzVmLi41MjE3Y2Y5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5icApAQCAtMSw2ICsxLDYgQEAKIC8vIGF1ZGlvIHByZXByb2Nlc3Npbmcgd3JhcHBlcgogY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJhdWRpb3ByZXByb2Nlc3NpbmciLAorICAgIG5hbWU6ICJsaWJhdWRpb3ByZXByb2Nlc3NpbmdfbGVnYWN5IiwKIAogICAgIHZlbmRvcjogdHJ1ZSwKIApAQCAtOCwxMiArOCw2IEBACiAKICAgICBzcmNzOiBbIlByZVByb2Nlc3NpbmcuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL3dlYnJ0YyIsCi0gICAgICAgICJleHRlcm5hbC93ZWJydGMvd2VicnRjL21vZHVsZXMvaW5jbHVkZSIsCi0gICAgICAgICJleHRlcm5hbC93ZWJydGMvd2VicnRjL21vZHVsZXMvYXVkaW9fcHJvY2Vzc2luZy9pbmNsdWRlIiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYndlYnJ0Y19hdWRpb19wcmVwcm9jZXNzaW5nIiwKICAgICAgICAgImxpYnNwZWV4cmVzYW1wbGVyIiwKQEAgLTIzLDYgKzE3LDcgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURXRUJSVENfUE9TSVgiLAorICAgICAgICAiLURXRUJSVENfTEVHQUNZIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCkBAIC0zMywzICsyOCwzNCBAQAogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgXSwKIH0KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb3ByZXByb2Nlc3NpbmciLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKyAgICBzcmNzOiBbIlByZVByb2Nlc3NpbmcuY3BwIl0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAid2VicnRjX2F1ZGlvX3Byb2Nlc3NpbmciLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAorICAgICAgICAibGlid2VicnRjX2Fic2xfaGVhZGVycyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcAppbmRleCA1ZmFiNWJlLi4xYTU1NDdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCkBAIC0xOCwxNSArMTgsMjAgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNkZWZpbmUgTE9HX1RBRyAiUHJlUHJvY2Vzc2luZyIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2FnYzIuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+Ci0jaW5jbHVkZSA8bW9kdWxlX2NvbW1vbl90eXBlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3Byb2Nlc3NpbmcuaD4KKyNpbmNsdWRlIDxtb2R1bGVfY29tbW9uX3R5cGVzLmg+CisjaWZkZWYgV0VCUlRDX0xFR0FDWQogI2luY2x1ZGUgInNwZWV4L3NwZWV4X3Jlc2FtcGxlci5oIgorI2VuZGlmCiAKIC8vIHVuZGVmaW5lIHRvIHBlcmZvcm0gbXVsdGkgY2hhbm5lbHMgQVBJIGZ1bmN0aW9uYWwgdGVzdHMKIC8vI2RlZmluZSBEVUFMX01JQ19URVNUCkBAIC0zOSwyNiArNDQsMjggQEAKICNkZWZpbmUgUFJFUFJPQ19OVU1fU0VTU0lPTlMgOAogCiAvLyB0eXBlcyBvZiBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCi1lbnVtIHByZXByb2NfaWQKLXsKLSAgICBQUkVQUk9DX0FHQywgICAgICAgIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wKLSAgICBQUkVQUk9DX0FFQywgICAgICAgIC8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsZXIKLSAgICBQUkVQUk9DX05TLCAgICAgICAgIC8vIE5vaXNlIFN1cHByZXNzb3IKK2VudW0gcHJlcHJvY19pZCB7CisgICAgUFJFUFJPQ19BR0MsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCisjaWZuZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICBQUkVQUk9DX0FHQzIsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sIDIKKyNlbmRpZgorICAgIFBSRVBST0NfQUVDLCAgLy8gQWNvdXN0aWMgRWNobyBDYW5jZWxlcgorICAgIFBSRVBST0NfTlMsICAgLy8gTm9pc2UgU3VwcHJlc3NvcgogICAgIFBSRVBST0NfTlVNX0VGRkVDVFMKIH07CiAKIC8vIFNlc3Npb24gc3RhdGUKIGVudW0gcHJlcHJvY19zZXNzaW9uX3N0YXRlIHsKLSAgICBQUkVQUk9DX1NFU1NJT05fU1RBVEVfSU5JVCwgICAgICAgIC8vIGluaXRpYWxpemVkCi0gICAgUFJFUFJPQ19TRVNTSU9OX1NUQVRFX0NPTkZJRyAgICAgICAvLyBjb25maWd1cmF0aW9uIHJlY2VpdmVkCisgICAgUFJFUFJPQ19TRVNTSU9OX1NUQVRFX0lOSVQsICAgLy8gaW5pdGlhbGl6ZWQKKyAgICBQUkVQUk9DX1NFU1NJT05fU1RBVEVfQ09ORklHICAvLyBjb25maWd1cmF0aW9uIHJlY2VpdmVkCiB9OwogCiAvLyBFZmZlY3QvUHJlcHJvY2Vzc29yIHN0YXRlCiBlbnVtIHByZXByb2NfZWZmZWN0X3N0YXRlIHsKLSAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklULCAgICAgICAgIC8vIGluaXRpYWxpemVkCi0gICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRCwgICAgICAvLyB3ZWJSVEMgZW5naW5lIGNyZWF0ZWQKLSAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUcsICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gcmVjZWl2ZWQvZGlzYWJsZWQKLSAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkUgICAgICAgIC8vIGFjdGl2ZS9lbmFibGVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVCwgICAgIC8vIGluaXRpYWxpemVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRCwgIC8vIHdlYlJUQyBlbmdpbmUgY3JlYXRlZAorICAgIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRywgICAvLyBjb25maWd1cmF0aW9uIHJlY2VpdmVkL2Rpc2FibGVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFICAgIC8vIGFjdGl2ZS9lbmFibGVkCiB9OwogCiAvLyBoYW5kbGUgb24gd2ViUlRDIGVuZ2luZQpAQCAtNzEsNzQgKzc4LDk1IEBACiAvLyBFZmZlY3Qgb3BlcmF0aW9uIHRhYmxlLiBGdW5jdGlvbnMgZm9yIGFsbCBwcmUgcHJvY2Vzc29ycyBhcmUgZGVjbGFyZWQgaW4gc1ByZVByb2NPcHNbXSB0YWJsZS4KIC8vIEZ1bmN0aW9uIHBvaW50ZXIgY2FuIGJlIG51bGwgaWYgbm8gYWN0aW9uIHJlcXVpcmVkLgogc3RydWN0IHByZXByb2Nfb3BzX3MgewotICAgIGludCAoKiBjcmVhdGUpKHByZXByb2NfZWZmZWN0X3QgKmZ4KTsKLSAgICBpbnQgKCogaW5pdCkocHJlcHJvY19lZmZlY3RfdCAqZngpOwotICAgIGludCAoKiByZXNldCkocHJlcHJvY19lZmZlY3RfdCAqZngpOwotICAgIHZvaWQgKCogZW5hYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7Ci0gICAgdm9pZCAoKiBkaXNhYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7Ci0gICAgaW50ICgqIHNldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgdm9pZCAqdmFsdWUpOwotICAgIGludCAoKiBnZXRfcGFyYW1ldGVyKShwcmVwcm9jX2VmZmVjdF90ICpmeCwgdm9pZCAqcGFyYW0sIHVpbnQzMl90ICpzaXplLCB2b2lkICp2YWx1ZSk7Ci0gICAgaW50ICgqIHNldF9kZXZpY2UpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB1aW50MzJfdCBkZXZpY2UpOworICAgIGludCAoKmNyZWF0ZSkocHJlcHJvY19lZmZlY3RfdCogZngpOworICAgIGludCAoKmluaXQpKHByZXByb2NfZWZmZWN0X3QqIGZ4KTsKKyAgICBpbnQgKCpyZXNldCkocHJlcHJvY19lZmZlY3RfdCogZngpOworICAgIHZvaWQgKCplbmFibGUpKHByZXByb2NfZWZmZWN0X3QqIGZ4KTsKKyAgICB2b2lkICgqZGlzYWJsZSkocHJlcHJvY19lZmZlY3RfdCogZngpOworICAgIGludCAoKnNldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QqIGZ4LCB2b2lkKiBwYXJhbSwgdm9pZCogdmFsdWUpOworICAgIGludCAoKmdldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QqIGZ4LCB2b2lkKiBwYXJhbSwgdWludDMyX3QqIHNpemUsIHZvaWQqIHZhbHVlKTsKKyAgICBpbnQgKCpzZXRfZGV2aWNlKShwcmVwcm9jX2VmZmVjdF90KiBmeCwgdWludDMyX3QgZGV2aWNlKTsKIH07CiAKIC8vIEVmZmVjdCBjb250ZXh0CiBzdHJ1Y3QgcHJlcHJvY19lZmZlY3RfcyB7Ci0gICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKLSAgICB1aW50MzJfdCBwcm9jSWQ7ICAgICAgICAgICAgICAgIC8vIHR5cGUgb2YgcHJlIHByb2Nlc3NvciAoZW51bSBwcmVwcm9jX2lkKQotICAgIHVpbnQzMl90IHN0YXRlOyAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX2VmZmVjdF9zdGF0ZSkKLSAgICBwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbjsgICAgIC8vIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgotICAgIGNvbnN0IHByZXByb2Nfb3BzX3QgKm9wczsgICAgICAgLy8gZWZmZWN0IG9wcyB0YWJsZQotICAgIHByZXByb2NfZnhfaGFuZGxlX3QgZW5naW5lOyAgICAgLy8gaGFuZGxlIG9uIHdlYlJUQyBlbmdpbmUKLSAgICB1aW50MzJfdCB0eXBlOyAgICAgICAgICAgICAgICAgIC8vIHN1YnR5cGUgb2YgZWZmZWN0CisgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyogaXRmZTsKKyAgICB1aW50MzJfdCBwcm9jSWQ7ICAgICAgICAgICAgIC8vIHR5cGUgb2YgcHJlIHByb2Nlc3NvciAoZW51bSBwcmVwcm9jX2lkKQorICAgIHVpbnQzMl90IHN0YXRlOyAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX2VmZmVjdF9zdGF0ZSkKKyAgICBwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbjsgIC8vIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgIGNvbnN0IHByZXByb2Nfb3BzX3QqIG9wczsgICAgLy8gZWZmZWN0IG9wcyB0YWJsZQorICAgIHByZXByb2NfZnhfaGFuZGxlX3QgZW5naW5lOyAgLy8gaGFuZGxlIG9uIHdlYlJUQyBlbmdpbmUKKyAgICB1aW50MzJfdCB0eXBlOyAgICAgICAgICAgICAgIC8vIHN1YnR5cGUgb2YgZWZmZWN0CiAjaWZkZWYgRFVBTF9NSUNfVEVTVAotICAgIGJvb2wgYXV4X2NoYW5uZWxzX29uOyAgICAgICAgICAgLy8gc3VwcG9ydCBhdXhpbGlhcnkgY2hhbm5lbHMKLSAgICBzaXplX3QgY3VyX2NoYW5uZWxfY29uZmlnOyAgICAgIC8vIGN1cnJlbnQgYXVjaWxpYXJ5IGNoYW5uZWwgY29uZmlndXJhdGlvbgorICAgIGJvb2wgYXV4X2NoYW5uZWxzX29uOyAgICAgICAvLyBzdXBwb3J0IGF1eGlsaWFyeSBjaGFubmVscworICAgIHNpemVfdCBjdXJfY2hhbm5lbF9jb25maWc7ICAvLyBjdXJyZW50IGF1Y2lsaWFyeSBjaGFubmVsIGNvbmZpZ3VyYXRpb24KICNlbmRpZgogfTsKIAogLy8gU2Vzc2lvbiBjb250ZXh0CiBzdHJ1Y3QgcHJlcHJvY19zZXNzaW9uX3MgewotICAgIHN0cnVjdCBwcmVwcm9jX2VmZmVjdF9zIGVmZmVjdHNbUFJFUFJPQ19OVU1fRUZGRUNUU107IC8vIGVmZmVjdHMgaW4gdGhpcyBzZXNzaW9uCi0gICAgdWludDMyX3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX3Nlc3Npb25fc3RhdGUpCi0gICAgaW50IGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgIGludCBpbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBvZiBpbnB1dCBzdHJlYW0gdGhpcyBzZXNzaW9uIGlzIG9uCi0gICAgd2VicnRjOjpBdWRpb1Byb2Nlc3NpbmcqIGFwbTsgICAgICAgLy8gaGFuZGxlIG9uIHdlYlJUQyBhdWRpbyBwcm9jZXNzaW5nIG1vZHVsZSAoQVBNKQotICAgIHNpemVfdCBhcG1GcmFtZUNvdW50OyAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplIGZvciB3ZWJSVEMgcHJvY2VzcyAoMTAgbXMpCi0gICAgdWludDMyX3QgYXBtU2FtcGxpbmdSYXRlOyAgICAgICAgICAgLy8gd2ViUlRDIEFQTSBzYW1wbGluZyByYXRlICg4LzE2IG9yIDMyIGtIeikKLSAgICBzaXplX3QgZnJhbWVDb3VudDsgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgc2l6ZSBiZWZvcmUgaW5wdXQgcmVzYW1wbGVyICggPD0+IGFwbUZyYW1lQ291bnQpCi0gICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOyAgICAgICAgICAgICAgLy8gc2FtcGxpbmcgcmF0ZSBhdCBlZmZlY3QgcHJvY2VzcyBpbnRlcmZhY2UKLSAgICB1aW50MzJfdCBpbkNoYW5uZWxDb3VudDsgICAgICAgICAgICAvLyBpbnB1dCBjaGFubmVsIGNvdW50Ci0gICAgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50OyAgICAgICAgICAgLy8gb3V0cHV0IGNoYW5uZWwgY291bnQKLSAgICB1aW50MzJfdCBjcmVhdGVkTXNrOyAgICAgICAgICAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgY3Jlc3RlZCBwcmUgcHJvY2Vzc29ycwotICAgIHVpbnQzMl90IGVuYWJsZWRNc2s7ICAgICAgICAgICAgICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBlbmFibGVkIHByZSBwcm9jZXNzb3JzCi0gICAgdWludDMyX3QgcHJvY2Vzc2VkTXNrOyAgICAgICAgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIHByZSBwcm9jZXNzb3JzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3VuZAotICAgIHdlYnJ0Yzo6QXVkaW9GcmFtZSAqcHJvY0ZyYW1lOyAgICAgIC8vIGF1ZGlvIGZyYW1lIHBhc3NlZCB0byB3ZWJSVEMgQU1QIFByb2Nlc3NTdHJlYW0oKQotICAgIGludDE2X3QgKmluQnVmOyAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciB1c2VkIHdoZW4gcmVzYW1wbGluZwotICAgIHNpemVfdCBpbkJ1ZlNpemU7ICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBzaXplIGluIGZyYW1lcwotICAgIHNpemVfdCBmcmFtZXNJbjsgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgaW4gaW5wdXQgYnVmZmVyCi0gICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqaW5SZXNhbXBsZXI7ICAgLy8gaGFuZGxlIG9uIGlucHV0IHNwZWV4IHJlc2FtcGxlcgotICAgIGludDE2X3QgKm91dEJ1ZjsgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgdXNlZCB3aGVuIHJlc2FtcGxpbmcKLSAgICBzaXplX3Qgb3V0QnVmU2l6ZTsgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUgaW4gZnJhbWVzCi0gICAgc2l6ZV90IGZyYW1lc091dDsgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBvdXRwdXQgYnVmZmVyCi0gICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqb3V0UmVzYW1wbGVyOyAgLy8gaGFuZGxlIG9uIG91dHB1dCBzcGVleCByZXNhbXBsZXIKLSAgICB1aW50MzJfdCByZXZDaGFubmVsQ291bnQ7ICAgICAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMgb24gcmV2ZXJzZSBzdHJlYW0KLSAgICB1aW50MzJfdCByZXZFbmFibGVkTXNrOyAgICAgICAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgZW5hYmxlZCBwcmUgcHJvY2Vzc29ycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggcmV2ZXJzZSBjaGFubmVsCi0gICAgdWludDMyX3QgcmV2UHJvY2Vzc2VkTXNrOyAgICAgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIHByZSBwcm9jZXNzb3JzIHdpdGggcmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgYWxyZWFkeSBwcm9jZXNzZWQgaW4gY3VycmVudCByb3VuZAotICAgIHdlYnJ0Yzo6QXVkaW9GcmFtZSAqcmV2RnJhbWU7ICAgICAgIC8vIGF1ZGlvIGZyYW1lIHBhc3NlZCB0byB3ZWJSVEMgQU1QIEFuYWx5emVSZXZlcnNlU3RyZWFtKCkKLSAgICBpbnQxNl90ICpyZXZCdWY7ICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGNoYW5uZWwgaW5wdXQgYnVmZmVyCi0gICAgc2l6ZV90IHJldkJ1ZlNpemU7ICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBjaGFubmVsIGlucHV0IGJ1ZmZlciBzaXplCi0gICAgc2l6ZV90IGZyYW1lc1JldjsgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiByZXZlcnNlIGNoYW5uZWwgaW5wdXQgYnVmZmVyCi0gICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqcmV2UmVzYW1wbGVyOyAgLy8gaGFuZGxlIG9uIHJldmVyc2UgY2hhbm5lbCBpbnB1dCBzcGVleCByZXNhbXBsZXIKKyAgICBzdHJ1Y3QgcHJlcHJvY19lZmZlY3RfcyBlZmZlY3RzW1BSRVBST0NfTlVNX0VGRkVDVFNdOyAgLy8gZWZmZWN0cyBpbiB0aGlzIHNlc3Npb24KKyAgICB1aW50MzJfdCBzdGF0ZTsgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX3Nlc3Npb25fc3RhdGUpCisgICAgaW50IGlkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICBpbnQgaW87ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG9mIGlucHV0IHN0cmVhbSB0aGlzIHNlc3Npb24gaXMgb24KKyAgICB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZyogYXBtOyAgLy8gaGFuZGxlIG9uIHdlYlJUQyBhdWRpbyBwcm9jZXNzaW5nIG1vZHVsZSAoQVBNKQorI2lmbmRlZiBXRUJSVENfTEVHQUNZCisgICAgLy8gQXVkaW8gUHJvY2Vzc2luZyBtb2R1bGUgYnVpbGRlcgorICAgIHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nQnVpbGRlciBhcF9idWlsZGVyOworI2VuZGlmCisgICAgc2l6ZV90IGFwbUZyYW1lQ291bnQ7ICAgICAgLy8gYnVmZmVyIHNpemUgZm9yIHdlYlJUQyBwcm9jZXNzICgxMCBtcykKKyAgICB1aW50MzJfdCBhcG1TYW1wbGluZ1JhdGU7ICAvLyB3ZWJSVEMgQVBNIHNhbXBsaW5nIHJhdGUgKDgvMTYgb3IgMzIga0h6KQorICAgIHNpemVfdCBmcmFtZUNvdW50OyAgICAgICAgIC8vIGJ1ZmZlciBzaXplIGJlZm9yZSBpbnB1dCByZXNhbXBsZXIgKCA8PT4gYXBtRnJhbWVDb3VudCkKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGU7ICAgICAvLyBzYW1wbGluZyByYXRlIGF0IGVmZmVjdCBwcm9jZXNzIGludGVyZmFjZQorICAgIHVpbnQzMl90IGluQ2hhbm5lbENvdW50OyAgIC8vIGlucHV0IGNoYW5uZWwgY291bnQKKyAgICB1aW50MzJfdCBvdXRDaGFubmVsQ291bnQ7ICAvLyBvdXRwdXQgY2hhbm5lbCBjb3VudAorICAgIHVpbnQzMl90IGNyZWF0ZWRNc2s7ICAgICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBjcmVzdGVkIHByZSBwcm9jZXNzb3JzCisgICAgdWludDMyX3QgZW5hYmxlZE1zazsgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIGVuYWJsZWQgcHJlIHByb2Nlc3NvcnMKKyAgICB1aW50MzJfdCBwcm9jZXNzZWRNc2s7ICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgcHJlIHByb2Nlc3NvcnMgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdW5kCisjaWZkZWYgV0VCUlRDX0xFR0FDWQorICAgIHdlYnJ0Yzo6QXVkaW9GcmFtZSogcHJvY0ZyYW1lOyAgLy8gYXVkaW8gZnJhbWUgcGFzc2VkIHRvIHdlYlJUQyBBTVAgUHJvY2Vzc1N0cmVhbSgpCisjZWxzZQorICAgIC8vIGF1ZGlvIGNvbmZpZyBzdHJ1Y3V0cmUKKyAgICB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnIGNvbmZpZzsKKyAgICB3ZWJydGM6OlN0cmVhbUNvbmZpZyBpbnB1dENvbmZpZzsgICAvLyBpbnB1dCBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgIHdlYnJ0Yzo6U3RyZWFtQ29uZmlnIG91dHB1dENvbmZpZzsgIC8vIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbgorI2VuZGlmCisgICAgaW50MTZfdCogaW5CdWY7ICAgIC8vIGlucHV0IGJ1ZmZlciB1c2VkIHdoZW4gcmVzYW1wbGluZworICAgIHNpemVfdCBpbkJ1ZlNpemU7ICAvLyBpbnB1dCBidWZmZXIgc2l6ZSBpbiBmcmFtZXMKKyAgICBzaXplX3QgZnJhbWVzSW47ICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBpbnB1dCBidWZmZXIKKyNpZmRlZiBXRUJSVENfTEVHQUNZCisgICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSogaW5SZXNhbXBsZXI7ICAvLyBoYW5kbGUgb24gaW5wdXQgc3BlZXggcmVzYW1wbGVyCisjZW5kaWYKKyAgICBpbnQxNl90KiBvdXRCdWY7ICAgIC8vIG91dHB1dCBidWZmZXIgdXNlZCB3aGVuIHJlc2FtcGxpbmcKKyAgICBzaXplX3Qgb3V0QnVmU2l6ZTsgIC8vIG91dHB1dCBidWZmZXIgc2l6ZSBpbiBmcmFtZXMKKyAgICBzaXplX3QgZnJhbWVzT3V0OyAgIC8vIG51bWJlciBvZiBmcmFtZXMgaW4gb3V0cHV0IGJ1ZmZlcgorI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICBTcGVleFJlc2FtcGxlclN0YXRlKiBvdXRSZXNhbXBsZXI7ICAvLyBoYW5kbGUgb24gb3V0cHV0IHNwZWV4IHJlc2FtcGxlcgorI2VuZGlmCisgICAgdWludDMyX3QgcmV2Q2hhbm5lbENvdW50OyAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzIG9uIHJldmVyc2Ugc3RyZWFtCisgICAgdWludDMyX3QgcmV2RW5hYmxlZE1zazsgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIGVuYWJsZWQgcHJlIHByb2Nlc3NvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHJldmVyc2UgY2hhbm5lbAorICAgIHVpbnQzMl90IHJldlByb2Nlc3NlZE1zazsgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBwcmUgcHJvY2Vzc29ycyB3aXRoIHJldmVyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsIGFscmVhZHkgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm91bmQKKyNpZmRlZiBXRUJSVENfTEVHQUNZCisgICAgd2VicnRjOjpBdWRpb0ZyYW1lKiByZXZGcmFtZTsgIC8vIGF1ZGlvIGZyYW1lIHBhc3NlZCB0byB3ZWJSVEMgQU1QIEFuYWx5emVSZXZlcnNlU3RyZWFtKCkKKyNlbHNlCisgICAgd2VicnRjOjpTdHJlYW1Db25maWcgcmV2Q29uZmlnOyAgICAgLy8gcmV2ZXJzZSBzdHJlYW0gY29uZmlndXJhdGlvbi4KKyNlbmRpZgorICAgIGludDE2X3QqIHJldkJ1ZjsgICAgLy8gcmV2ZXJzZSBjaGFubmVsIGlucHV0IGJ1ZmZlcgorICAgIHNpemVfdCByZXZCdWZTaXplOyAgLy8gcmV2ZXJzZSBjaGFubmVsIGlucHV0IGJ1ZmZlciBzaXplCisgICAgc2l6ZV90IGZyYW1lc1JldjsgICAvLyBudW1iZXIgb2YgZnJhbWVzIGluIHJldmVyc2UgY2hhbm5lbCBpbnB1dCBidWZmZXIKKyNpZmRlZiBXRUJSVENfTEVHQUNZCisgICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSogcmV2UmVzYW1wbGVyOyAgLy8gaGFuZGxlIG9uIHJldmVyc2UgY2hhbm5lbCBpbnB1dCBzcGVleCByZXNhbXBsZXIKKyNlbmRpZgogfTsKIAogI2lmZGVmIERVQUxfTUlDX1RFU1QKIGVudW0gewotICAgIFBSRVBST0NfQ01EX0RVQUxfTUlDX0VOQUJMRSA9IEVGRkVDVF9DTURfRklSU1RfUFJPUFJJRVRBUlksIC8vIGVuYWJsZSBkdWFsIG1pYyBtb2RlCi0gICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgcGNtIGNhcHR1cmUKLSAgICBQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHBjbSBjYXB0dXJlCisgICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfRU5BQkxFID0gRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSwgIC8vIGVuYWJsZSBkdWFsIG1pYyBtb2RlCisgICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHBjbSBjYXB0dXJlCisgICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgcGNtIGNhcHR1cmUKIH07CiAKIGVudW0gewpAQCAtMTUxLDI0ICsxNzksMjIgQEAKIH07CiAKIGNvbnN0IGNoYW5uZWxfY29uZmlnX3Qgc0R1YWxNaWNDb25maWdzW0NIQU5ORUxfQ0ZHX0NOVF0gPSB7Ci0gICAgICAgIHtBVURJT19DSEFOTkVMX0lOX01PTk8gLCAwfSwKLSAgICAgICAge0FVRElPX0NIQU5ORUxfSU5fU1RFUkVPICwgMH0sCi0gICAgICAgIHtBVURJT19DSEFOTkVMX0lOX0ZST05UICwgQVVESU9fQ0hBTk5FTF9JTl9CQUNLfSwKLSAgICAgICAge0FVRElPX0NIQU5ORUxfSU5fU1RFUkVPICwgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVH0KLX07CisgICAgICAgIHtBVURJT19DSEFOTkVMX0lOX01PTk8sIDB9LAorICAgICAgICB7QVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sIDB9LAorICAgICAgICB7QVVESU9fQ0hBTk5FTF9JTl9GUk9OVCwgQVVESU9fQ0hBTk5FTF9JTl9CQUNLfSwKKyAgICAgICAge0FVRElPX0NIQU5ORUxfSU5fU1RFUkVPLCBBVURJT19DSEFOTkVMX0lOX1JJR0hUfX07CiAKIGJvb2wgc0hhc0F1eENoYW5uZWxzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0gewotICAgICAgICBmYWxzZSwgICAvLyBQUkVQUk9DX0FHQworICAgICAgICBmYWxzZSwgIC8vIFBSRVBST0NfQUdDCiAgICAgICAgIHRydWUsICAgLy8gUFJFUFJPQ19BRUMKICAgICAgICAgdHJ1ZSwgICAvLyBQUkVQUk9DX05TCiB9OwogCiBib29sIGdEdWFsTWljRW5hYmxlZDsKLUZJTEUgKmdQY21EdW1wRmg7CitGSUxFKiBnUGNtRHVtcEZoOwogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnUGNtRHVtcExvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogI2VuZGlmCiAKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdCBkZXNjcmlwdG9ycwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3OCw2OCArMjA0LDc1IEBACiAKIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wKIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IHNBZ2NEZXNjcmlwdG9yID0gewotICAgICAgICB7IDB4MGE4YWJmZTAsIDB4NjU0YywgMHgxMWUwLCAweGJhMjYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sIC8vIHR5cGUKLSAgICAgICAgeyAweGFhODEzMGUwLCAweDY2ZmMsIDB4MTFlMCwgMHhiYWQwLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB1dWlkCisgICAgICAgIHsweDBhOGFiZmUwLCAweDY1NGMsIDB4MTFlMCwgMHhiYTI2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdHlwZQorICAgICAgICB7MHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHV1aWQKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCi0gICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DfEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpLAotICAgICAgICAwLCAvL0ZJWE1FIGluZGljYXRlIENQVSBsb2FkCi0gICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBDUFUgbG9hZAorICAgICAgICAwLCAgLy8gRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCiAgICAgICAgICJBdXRvbWF0aWMgR2FpbiBDb250cm9sIiwKLSAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCi19OworICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCJ9OworCisjaWZuZGVmIFdFQlJUQ19MRUdBQ1kKKy8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgMgorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3Qgc0FnYzJEZXNjcmlwdG9yID0geworICAgICAgICB7MHhhZTNjNjUzYiwgMHhiZTE4LCAweDRhYjgsIDB4ODkzOCwgezB4NDEsIDB4OGYsIDB4MGEsIDB4N2YsIDB4MDYsIDB4YWN9fSwgIC8vIHR5cGUKKyAgICAgICAgezB4ODlmMzhlNjUsIDB4ZDRkMiwgMHg0ZDY0LCAweGFkMGUsIHsweDJiLCAweDNlLCAweDc5LCAweDllLCAweGE4LCAweDg2fX0sICAvLyB1dWlkCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQyB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpLAorICAgICAgICAwLCAgLy8gRklYTUUgaW5kaWNhdGUgQ1BVIGxvYWQKKyAgICAgICAgMCwgIC8vIEZJWE1FIGluZGljYXRlIG1lbW9yeSB1c2FnZQorICAgICAgICAiQXV0b21hdGljIEdhaW4gQ29udHJvbCAyIiwKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QifTsKKyNlbmRpZgogCiAvLyBBY291c3RpYyBFY2hvIENhbmNlbGxhdGlvbgogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3Qgc0FlY0Rlc2NyaXB0b3IgPSB7Ci0gICAgICAgIHsgMHg3YjQ5MTQ2MCwgMHg4ZDRkLCAweDExZTAsIDB4YmQ2MSwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwgLy8gdHlwZQotICAgICAgICB7IDB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sIC8vIHV1aWQKKyAgICAgICAgezB4N2I0OTE0NjAsIDB4OGQ0ZCwgMHgxMWUwLCAweGJkNjEsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB0eXBlCisgICAgICAgIHsweGJiMzkyZWMwLCAweDhkNGQsIDB4MTFlMCwgMHhhODk2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdXVpZAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKLSAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0N8RUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCi0gICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgQ1BVIGxvYWQKLSAgICAgICAgMCwgLy9GSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EKSwKKyAgICAgICAgMCwgIC8vIEZJWE1FIGluZGljYXRlIENQVSBsb2FkCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKICAgICAgICAgIkFjb3VzdGljIEVjaG8gQ2FuY2VsZXIiLAotICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKLX07CisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0In07CiAKIC8vIE5vaXNlIHN1cHByZXNzaW9uCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzTnNEZXNjcmlwdG9yID0gewotICAgICAgICB7IDB4NThiNGIyNjAsIDB4OGUwNiwgMHgxMWUwLCAweGFhOGUsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sIC8vIHR5cGUKLSAgICAgICAgeyAweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB1dWlkCisgICAgICAgIHsweDU4YjRiMjYwLCAweDhlMDYsIDB4MTFlMCwgMHhhYThlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdHlwZQorICAgICAgICB7MHhjMDZjODQwMCwgMHg4ZTA2LCAweDExZTAsIDB4OWNiNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHV1aWQKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCi0gICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DfEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpLAotICAgICAgICAwLCAvL0ZJWE1FIGluZGljYXRlIENQVSBsb2FkCi0gICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBDUFUgbG9hZAorICAgICAgICAwLCAgLy8gRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCiAgICAgICAgICJOb2lzZSBTdXBwcmVzc2lvbiIsCi0gICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgotfTsKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QifTsKIAotCi1zdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc0Rlc2NyaXB0b3JzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0gewotICAgICAgICAmc0FnY0Rlc2NyaXB0b3IsCi0gICAgICAgICZzQWVjRGVzY3JpcHRvciwKLSAgICAgICAgJnNOc0Rlc2NyaXB0b3IKLX07CitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCogc0Rlc2NyaXB0b3JzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0geyZzQWdjRGVzY3JpcHRvciwKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc0FnYzJEZXNjcmlwdG9yLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzQWVjRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNOc0Rlc2NyaXB0b3J9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSGVscGVyIGZ1bmN0aW9ucwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IHNVdWlkVG9QcmVQcm9jVGFibGVbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7Ci0gICAgICAgIEZYX0lJRF9BR0MsCi0gICAgICAgIEZYX0lJRF9BRUMsCi0gICAgICAgIEZYX0lJRF9OUwotfTsKK2NvbnN0IGVmZmVjdF91dWlkX3QqIGNvbnN0IHNVdWlkVG9QcmVQcm9jVGFibGVbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7RlhfSUlEX0FHQywKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JSURfQUdDMiwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JSURfQUVDLCBGWF9JSURfTlN9OwogCi0KLWNvbnN0IGVmZmVjdF91dWlkX3QgKiBQcm9jSWRUb1V1aWQoaW50IHByb2NJZCkKLXsKK2NvbnN0IGVmZmVjdF91dWlkX3QqIFByb2NJZFRvVXVpZChpbnQgcHJvY0lkKSB7CiAgICAgaWYgKHByb2NJZCA+PSBQUkVQUk9DX05VTV9FRkZFQ1RTKSB7CiAgICAgICAgIHJldHVybiBFRkZFQ1RfVVVJRF9OVUxMOwogICAgIH0KICAgICByZXR1cm4gc1V1aWRUb1ByZVByb2NUYWJsZVtwcm9jSWRdOwogfQogCi11aW50MzJfdCBVdWlkVG9Qcm9jSWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqIHV1aWQpCi17Cit1aW50MzJfdCBVdWlkVG9Qcm9jSWQoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCkgewogICAgIHNpemVfdCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9FRkZFQ1RTOyBpKyspIHsKICAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCBzVXVpZFRvUHJlUHJvY1RhYmxlW2ldLCBzaXplb2YoKnV1aWQpKSA9PSAwKSB7CkBAIC0yNDksMTUgKzI4MiwxMyBAQAogICAgIHJldHVybiBpOwogfQogCi1ib29sIEhhc1JldmVyc2VTdHJlYW0odWludDMyX3QgcHJvY0lkKQoteworYm9vbCBIYXNSZXZlcnNlU3RyZWFtKHVpbnQzMl90IHByb2NJZCkgewogICAgIGlmIChwcm9jSWQgPT0gUFJFUFJPQ19BRUMpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbCAoQUdDKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI2NiwzMDAgKzI5Nyw1NjkgQEAKIHN0YXRpYyBjb25zdCBpbnQga0FnY0RlZmF1bHRDb21wR2FpbiA9IDk7CiBzdGF0aWMgY29uc3QgYm9vbCBrQWdjRGVmYXVsdExpbWl0ZXIgPSB0cnVlOwogCi1pbnQgIEFnY0luaXQgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQoraW50IEFnYzJJbml0KHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworICAgIEFMT0dWKCJBZ2MySW5pdCIpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuZml4ZWRfZGlnaXRhbC5nYWluX2RiID0gMC5mOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5sZXZlbF9lc3RpbWF0b3IgPQorICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5rUm1zOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5leHRyYV9zYXR1cmF0aW9uX21hcmdpbl9kYiA9IDIuZjsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBBZ2NJbml0KHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgewogICAgIEFMT0dWKCJBZ2NJbml0Iik7Ci0gICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQorICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wqIGFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wqPihlZmZlY3QtPmVuZ2luZSk7CiAgICAgYWdjLT5zZXRfbW9kZSh3ZWJydGM6OkdhaW5Db250cm9sOjprRml4ZWREaWdpdGFsKTsKICAgICBhZ2MtPnNldF90YXJnZXRfbGV2ZWxfZGJmcyhrQWdjRGVmYXVsdFRhcmdldExldmVsKTsKICAgICBhZ2MtPnNldF9jb21wcmVzc2lvbl9nYWluX2RiKGtBZ2NEZWZhdWx0Q29tcEdhaW4pOwogICAgIGFnYy0+ZW5hYmxlX2xpbWl0ZXIoa0FnY0RlZmF1bHRMaW1pdGVyKTsKKyNlbHNlCisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS50YXJnZXRfbGV2ZWxfZGJmcyA9IGtBZ2NEZWZhdWx0VGFyZ2V0TGV2ZWw7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5jb21wcmVzc2lvbl9nYWluX2RiID0ga0FnY0RlZmF1bHRDb21wR2FpbjsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmVuYWJsZV9saW1pdGVyID0ga0FnY0RlZmF1bHRMaW1pdGVyOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CisjZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIAotaW50ICBBZ2NDcmVhdGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewotICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKmFnYyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5nYWluX2NvbnRyb2woKTsKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQoraW50IEFnYzJDcmVhdGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgQWdjMkluaXQoZWZmZWN0KTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgQWdjQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICB3ZWJydGM6OkdhaW5Db250cm9sKiBhZ2MgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+Z2Fpbl9jb250cm9sKCk7CiAgICAgQUxPR1YoIkFnY0NyZWF0ZSBnb3QgYWdjICVwIiwgYWdjKTsKICAgICBpZiAoYWdjID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coIkFnY0NyZWF0ZSBFcnJvciIpOwogICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICB9CiAgICAgZWZmZWN0LT5lbmdpbmUgPSBzdGF0aWNfY2FzdDxwcmVwcm9jX2Z4X2hhbmRsZV90PihhZ2MpOworI2VuZGlmCiAgICAgQWdjSW5pdChlZmZlY3QpOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgQWdjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFZhbHVlKQoteworI2lmbmRlZiBXRUJSVENfTEVHQUNZCitpbnQgQWdjMkdldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHZvaWQqIHBQYXJhbSwgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKLSAgICB0X2FnY19zZXR0aW5ncyAqcFByb3BlcnRpZXMgPSAodF9hZ2Nfc2V0dGluZ3MgKilwVmFsdWU7Ci0gICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgYWdjMl9zZXR0aW5nc190KiBwUHJvcGVydGllcyA9IChhZ2MyX3NldHRpbmdzX3QqKXBWYWx1ZTsKIAogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIEFHQ19QQVJBTV9UQVJHRVRfTEVWRUw6Ci0gICAgY2FzZSBBR0NfUEFSQU1fQ09NUF9HQUlOOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX0xJTUlURVJfRU5BOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoYm9vbCkpIHsKLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih0X2FnY19zZXR0aW5ncykpIHsKLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fRklYRURfRElHSVRBTF9HQUlOOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGZsb2F0KSkgeworICAgICAgICAgICAgICAgICpwVmFsdWVTaXplID0gMC5mOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9BREFQVF9ESUdJX0xFVkVMX0VTVElNQVRPUjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fQURBUFRfRElHSV9FWFRSQV9TQVRVUkFUSU9OX01BUkdJTjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDAuZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihhZ2MyX3NldHRpbmdzX3QpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiQWdjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IiwgcGFyYW0pOwotICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2MyR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX0ZJWEVEX0RJR0lUQUxfR0FJTjoKKyAgICAgICAgICAgICooZmxvYXQqKXBWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIChmbG9hdCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5maXhlZF9kaWdpdGFsLmdhaW5fZGIpOworICAgICAgICAgICAgQUxPR1YoIkFnYzJHZXRQYXJhbWV0ZXIoKSB0YXJnZXQgbGV2ZWwgJWYgZEIiLCAqKGZsb2F0KilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9BREFQVF9ESUdJX0xFVkVMX0VTVElNQVRPUjoKKyAgICAgICAgICAgICoodWludDMyX3QqKXBWYWx1ZSA9ICh1aW50MzJfdCkoCisgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5sZXZlbF9lc3RpbWF0b3IpOworICAgICAgICAgICAgQUxPR1YoIkFnYzJHZXRQYXJhbWV0ZXIoKSBsZXZlbCBlc3RpbWF0b3IgJWQiLAorICAgICAgICAgICAgICAgICAgKih3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnOjpHYWluQ29udHJvbGxlcjI6OkxldmVsRXN0aW1hdG9yKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9BREFQVF9ESUdJX0VYVFJBX1NBVFVSQVRJT05fTUFSR0lOOgorICAgICAgICAgICAgKihmbG9hdCopcFZhbHVlID0gKGZsb2F0KShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmFkYXB0aXZlX2RpZ2l0YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFfc2F0dXJhdGlvbl9tYXJnaW5fZGIpOworICAgICAgICAgICAgQUxPR1YoIkFnYzJHZXRQYXJhbWV0ZXIoKSBleHRyYSBzYXR1cmF0aW9uIG1hcmdpbiAlZiBkQiIsICooZmxvYXQqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBwUHJvcGVydGllcy0+Zml4ZWREaWdpdGFsR2FpbiA9CisgICAgICAgICAgICAgICAgICAgIChmbG9hdCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5maXhlZF9kaWdpdGFsLmdhaW5fZGIpOworICAgICAgICAgICAgcFByb3BlcnRpZXMtPmxldmVsX2VzdGltYXRvciA9ICh1aW50MzJfdCkoCisgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5sZXZlbF9lc3RpbWF0b3IpOworICAgICAgICAgICAgcFByb3BlcnRpZXMtPmV4dHJhU2F0dXJhdGlvbk1hcmdpbiA9CisgICAgICAgICAgICAgICAgICAgIChmbG9hdCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFfc2F0dXJhdGlvbl9tYXJnaW5fZGIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiQWdjMkdldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCitpbnQgQWdjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCwgdm9pZCogcFBhcmFtLCB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgdF9hZ2Nfc2V0dGluZ3MqIHBQcm9wZXJ0aWVzID0gKHRfYWdjX3NldHRpbmdzKilwVmFsdWU7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQorICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wqIGFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wqPihlZmZlY3QtPmVuZ2luZSk7CisjZW5kaWYKKwogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIEFHQ19QQVJBTV9UQVJHRVRfTEVWRUw6Ci0gICAgICAgICooaW50MTZfdCAqKSBwVmFsdWUgPSAoaW50MTZfdCkoYWdjLT50YXJnZXRfbGV2ZWxfZGJmcygpICogLTEwMCk7Ci0gICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSB0YXJnZXQgbGV2ZWwgJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopIHBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX0NPTVBfR0FJTjoKLSAgICAgICAgKihpbnQxNl90ICopIHBWYWx1ZSA9IChpbnQxNl90KShhZ2MtPmNvbXByZXNzaW9uX2dhaW5fZGIoKSAqIDEwMCk7Ci0gICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopIHBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX0xJTUlURVJfRU5BOgotICAgICAgICAqKGJvb2wgKikgcFZhbHVlID0gKGJvb2wpYWdjLT5pc19saW1pdGVyX2VuYWJsZWQoKTsKLSAgICAgICAgQUxPR1YoIkFnY0dldFBhcmFtZXRlcigpIGxpbWl0ZXIgZW5hYmxlZCAlcyIsCi0gICAgICAgICAgICAgKCooaW50MTZfdCAqKSBwVmFsdWUgIT0gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBR0NfUEFSQU1fUFJPUEVSVElFUzoKLSAgICAgICAgcFByb3BlcnRpZXMtPnRhcmdldExldmVsID0gKGludDE2X3QpKGFnYy0+dGFyZ2V0X2xldmVsX2RiZnMoKSAqIC0xMDApOwotICAgICAgICBwUHJvcGVydGllcy0+Y29tcEdhaW4gPSAoaW50MTZfdCkoYWdjLT5jb21wcmVzc2lvbl9nYWluX2RiKCkgKiAxMDApOwotICAgICAgICBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQgPSAoYm9vbClhZ2MtPmlzX2xpbWl0ZXJfZW5hYmxlZCgpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiQWdjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlZCIsIHBhcmFtKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1RBUkdFVF9MRVZFTDoKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fQ09NUF9HQUlOOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX0xJTUlURVJfRU5BOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGJvb2wpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodF9hZ2Nfc2V0dGluZ3MpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2NHZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHgiLCBwYXJhbSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQorCisjaWZkZWYgV0VCUlRDX0xFR0FDWQorICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgorICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSAoaW50MTZfdCkoYWdjLT50YXJnZXRfbGV2ZWxfZGJmcygpICogLTEwMCk7CisgICAgICAgICAgICBBTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGxldmVsICVkIG1pbGxpQmVscyIsICooaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IChpbnQxNl90KShhZ2MtPmNvbXByZXNzaW9uX2dhaW5fZGIoKSAqIDEwMCk7CisgICAgICAgICAgICBBTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgY29tcCBnYWluICVkIG1pbGxpQmVscyIsICooaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKKyAgICAgICAgICAgICooYm9vbCopcFZhbHVlID0gKGJvb2wpYWdjLT5pc19saW1pdGVyX2VuYWJsZWQoKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSBsaW1pdGVyIGVuYWJsZWQgJXMiLAorICAgICAgICAgICAgICAgICAgKCooaW50MTZfdCopcFZhbHVlICE9IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT50YXJnZXRMZXZlbCA9IChpbnQxNl90KShhZ2MtPnRhcmdldF9sZXZlbF9kYmZzKCkgKiAtMTAwKTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5jb21wR2FpbiA9IChpbnQxNl90KShhZ2MtPmNvbXByZXNzaW9uX2dhaW5fZGIoKSAqIDEwMCk7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQgPSAoYm9vbClhZ2MtPmlzX2xpbWl0ZXJfZW5hYmxlZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiQWdjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisjZWxzZQorICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgorICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS50YXJnZXRfbGV2ZWxfZGJmcyAqIC0xMDApOworICAgICAgICAgICAgQUxPR1YoIkFnY0dldFBhcmFtZXRlcigpIHRhcmdldCBsZXZlbCAlZCBtaWxsaUJlbHMiLCAqKGludDE2X3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fQ09NUF9HQUlOOgorICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5jb21wcmVzc2lvbl9nYWluX2RiICogLTEwMCk7CisgICAgICAgICAgICBBTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgY29tcCBnYWluICVkIG1pbGxpQmVscyIsICooaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKKyAgICAgICAgICAgICooYm9vbCopcFZhbHVlID0gKGJvb2wpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlX2xpbWl0ZXIpOworICAgICAgICAgICAgQUxPR1YoIkFnY0dldFBhcmFtZXRlcigpIGxpbWl0ZXIgZW5hYmxlZCAlcyIsCisgICAgICAgICAgICAgICAgICAoKihpbnQxNl90KilwVmFsdWUgIT0gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQ19QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcFByb3BlcnRpZXMtPnRhcmdldExldmVsID0KKyAgICAgICAgICAgICAgICAgICAgKGludDE2X3QpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEudGFyZ2V0X2xldmVsX2RiZnMgKiAtMTAwKTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5jb21wR2FpbiA9CisgICAgICAgICAgICAgICAgICAgIChpbnQxNl90KShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmNvbXByZXNzaW9uX2dhaW5fZGIgKiAtMTAwKTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5saW1pdGVyRW5hYmxlZCA9CisgICAgICAgICAgICAgICAgICAgIChib29sKShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmVuYWJsZV9saW1pdGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIkFnY0dldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IEFnY1NldFBhcmFtZXRlciAocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSkKLXsKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQoraW50IEFnYzJTZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKLSAgICB0X2FnY19zZXR0aW5ncyAqcFByb3BlcnRpZXMgPSAodF9hZ2Nfc2V0dGluZ3MgKilwVmFsdWU7Ci0gICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgZmxvYXQgdmFsdWVGbG9hdCA9IDAuZjsKKyAgICBhZ2MyX3NldHRpbmdzX3QqIHBQcm9wZXJ0aWVzID0gKGFnYzJfc2V0dGluZ3NfdCopcFZhbHVlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX0ZJWEVEX0RJR0lUQUxfR0FJTjoKKyAgICAgICAgICAgIHZhbHVlRmxvYXQgPSAoZmxvYXQpKCooaW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2MyU2V0UGFyYW1ldGVyKCkgZml4ZWQgZGlnaXRhbCBnYWluICVmIGRCIiwgdmFsdWVGbG9hdCk7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmZpeGVkX2RpZ2l0YWwuZ2Fpbl9kYiA9IHZhbHVlRmxvYXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX0FEQVBUX0RJR0lfTEVWRUxfRVNUSU1BVE9SOgorICAgICAgICAgICAgQUxPR1YoIkFnYzJTZXRQYXJhbWV0ZXIoKSBsZXZlbCBlc3RpbWF0b3IgJWQiLAorICAgICAgICAgICAgICAgICAgKih3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnOjpHYWluQ29udHJvbGxlcjI6OkxldmVsRXN0aW1hdG9yKilwVmFsdWUpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsLmxldmVsX2VzdGltYXRvciA9CisgICAgICAgICAgICAgICAgICAgICgqKHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpDb25maWc6OkdhaW5Db250cm9sbGVyMjo6TGV2ZWxFc3RpbWF0b3IqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX0FEQVBUX0RJR0lfRVhUUkFfU0FUVVJBVElPTl9NQVJHSU46CisgICAgICAgICAgICB2YWx1ZUZsb2F0ID0gKGZsb2F0KSgqKGludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBBTE9HVigiQWdjMlNldFBhcmFtZXRlcigpIGV4dHJhIHNhdHVyYXRpb24gbWFyZ2luICVmIGRCIiwgdmFsdWVGbG9hdCk7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmFkYXB0aXZlX2RpZ2l0YWwuZXh0cmFfc2F0dXJhdGlvbl9tYXJnaW5fZGIgPQorICAgICAgICAgICAgICAgICAgICB2YWx1ZUZsb2F0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgQUxPR1YoIkFnYzJTZXRQYXJhbWV0ZXIoKSBwcm9wZXJ0aWVzIGdhaW4gJWYsIGxldmVsICVkIG1hcmdpbiAlZiIsCisgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+Zml4ZWREaWdpdGFsR2FpbiwgcFByb3BlcnRpZXMtPmxldmVsX2VzdGltYXRvciwKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5leHRyYVNhdHVyYXRpb25NYXJnaW4pOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5maXhlZF9kaWdpdGFsLmdhaW5fZGIgPQorICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+Zml4ZWREaWdpdGFsR2FpbjsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5sZXZlbF9lc3RpbWF0b3IgPQorICAgICAgICAgICAgICAgICAgICAod2VicnRjOjpBdWRpb1Byb2Nlc3Npbmc6OkNvbmZpZzo6R2FpbkNvbnRyb2xsZXIyOjpMZXZlbEVzdGltYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+bGV2ZWxfZXN0aW1hdG9yOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsLmV4dHJhX3NhdHVyYXRpb25fbWFyZ2luX2RiID0KKyAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmV4dHJhU2F0dXJhdGlvbk1hcmdpbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIkFnYzJTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworCisgICAgQUxPR1YoIkFnYzJTZXRQYXJhbWV0ZXIoKSBkb25lIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK2ludCBBZ2NTZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSkgeworICAgIGludCBzdGF0dXMgPSAwOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QqKXBQYXJhbTsKKyAgICB0X2FnY19zZXR0aW5ncyogcFByb3BlcnRpZXMgPSAodF9hZ2Nfc2V0dGluZ3MqKXBWYWx1ZTsKKyAgICB3ZWJydGM6OkdhaW5Db250cm9sKiBhZ2MgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkdhaW5Db250cm9sKj4oZWZmZWN0LT5lbmdpbmUpOwogCiAgICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgQUdDX1BBUkFNX1RBUkdFVF9MRVZFTDoKLSAgICAgICAgQUxPR1YoIkFnY1NldFBhcmFtZXRlcigpIHRhcmdldCBsZXZlbCAlZCBtaWxsaUJlbHMiLCAqKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICBzdGF0dXMgPSBhZ2MtPnNldF90YXJnZXRfbGV2ZWxfZGJmcygtKCooaW50MTZfdCAqKXBWYWx1ZSAvIDEwMCkpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46Ci0gICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopcFZhbHVlKTsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfY29tcHJlc3Npb25fZ2Fpbl9kYigqKGludDE2X3QgKilwVmFsdWUgLyAxMDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKLSAgICAgICAgQUxPR1YoIkFnY1NldFBhcmFtZXRlcigpIGxpbWl0ZXIgZW5hYmxlZCAlcyIsICooYm9vbCAqKXBWYWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICBzdGF0dXMgPSBhZ2MtPmVuYWJsZV9saW1pdGVyKCooYm9vbCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBwcm9wZXJ0aWVzIGxldmVsICVkLCBnYWluICVkIGxpbWl0ZXIgJWQiLAotICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT50YXJnZXRMZXZlbCwKLSAgICAgICAgICAgICBwUHJvcGVydGllcy0+Y29tcEdhaW4sCi0gICAgICAgICAgICAgcFByb3BlcnRpZXMtPmxpbWl0ZXJFbmFibGVkKTsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfdGFyZ2V0X2xldmVsX2RiZnMoLShwUHJvcGVydGllcy0+dGFyZ2V0TGV2ZWwgLyAxMDApKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSBicmVhazsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfY29tcHJlc3Npb25fZ2Fpbl9kYihwUHJvcGVydGllcy0+Y29tcEdhaW4gLyAxMDApOwotICAgICAgICBpZiAoc3RhdHVzICE9IDApIGJyZWFrOwotICAgICAgICBzdGF0dXMgPSBhZ2MtPmVuYWJsZV9saW1pdGVyKHBQcm9wZXJ0aWVzLT5saW1pdGVyRW5hYmxlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJBZ2NTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1RBUkdFVF9MRVZFTDoKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSB0YXJnZXQgbGV2ZWwgJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90KilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfdGFyZ2V0X2xldmVsX2RiZnMoLSgqKGludDE2X3QqKXBWYWx1ZSAvIDEwMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX0NPTVBfR0FJTjoKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90KilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfY29tcHJlc3Npb25fZ2Fpbl9kYigqKGludDE2X3QqKXBWYWx1ZSAvIDEwMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fTElNSVRFUl9FTkE6CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgbGltaXRlciBlbmFibGVkICVzIiwgKihib29sKilwVmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGFnYy0+ZW5hYmxlX2xpbWl0ZXIoKihib29sKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgcHJvcGVydGllcyBsZXZlbCAlZCwgZ2FpbiAlZCBsaW1pdGVyICVkIiwKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT50YXJnZXRMZXZlbCwgcFByb3BlcnRpZXMtPmNvbXBHYWluLCBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQpOworICAgICAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfdGFyZ2V0X2xldmVsX2RiZnMoLShwUHJvcGVydGllcy0+dGFyZ2V0TGV2ZWwgLyAxMDApKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgYnJlYWs7CisgICAgICAgICAgICBzdGF0dXMgPSBhZ2MtPnNldF9jb21wcmVzc2lvbl9nYWluX2RiKHBQcm9wZXJ0aWVzLT5jb21wR2FpbiAvIDEwMCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIGJyZWFrOworICAgICAgICAgICAgc3RhdHVzID0gYWdjLT5lbmFibGVfbGltaXRlcihwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiQWdjU2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgKih1aW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKICAgICB9CisjZWxzZQorICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCopcFBhcmFtOworICAgIHRfYWdjX3NldHRpbmdzKiBwUHJvcGVydGllcyA9ICh0X2FnY19zZXR0aW5ncyopcFZhbHVlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgorICAgICAgICAgICAgQUxPR1YoIkFnY1NldFBhcmFtZXRlcigpIHRhcmdldCBsZXZlbCAlZCBtaWxsaUJlbHMiLCAqKGludDE2X3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLnRhcmdldF9sZXZlbF9kYmZzID0KKyAgICAgICAgICAgICAgICAgICAgKC0oKihpbnQxNl90KilwVmFsdWUgLyAxMDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgY29tcCBnYWluICVkIG1pbGxpQmVscyIsICooaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuY29tcHJlc3Npb25fZ2Fpbl9kYiA9CisgICAgICAgICAgICAgICAgICAgICgqKGludDE2X3QqKXBWYWx1ZSAvIDEwMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fTElNSVRFUl9FTkE6CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgbGltaXRlciBlbmFibGVkICVzIiwgKihib29sKilwVmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlX2xpbWl0ZXIgPSAoKihib29sKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgcHJvcGVydGllcyBsZXZlbCAlZCwgZ2FpbiAlZCBsaW1pdGVyICVkIiwKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT50YXJnZXRMZXZlbCwgcFByb3BlcnRpZXMtPmNvbXBHYWluLCBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS50YXJnZXRfbGV2ZWxfZGJmcyA9CisgICAgICAgICAgICAgICAgICAgIC0ocFByb3BlcnRpZXMtPnRhcmdldExldmVsIC8gMTAwKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuY29tcHJlc3Npb25fZ2Fpbl9kYiA9CisgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5jb21wR2FpbiAvIDEwMDsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlX2xpbWl0ZXIgPSBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2NTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworI2VuZGlmCiAKICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgZG9uZSBzdGF0dXMgJWQiLCBzdGF0dXMpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBZ2NFbmFibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewotICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKmFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKj4oZWZmZWN0LT5lbmdpbmUpOworI2lmbmRlZiBXRUJSVENfTEVHQUNZCit2b2lkIEFnYzJFbmFibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5lbmFibGVkID0gdHJ1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworfQorI2VuZGlmCisKK3ZvaWQgQWdjRW5hYmxlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICB3ZWJydGM6OkdhaW5Db250cm9sKiBhZ2MgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkdhaW5Db250cm9sKj4oZWZmZWN0LT5lbmdpbmUpOwogICAgIEFMT0dWKCJBZ2NFbmFibGUgYWdjICVwIiwgYWdjKTsKICAgICBhZ2MtPkVuYWJsZSh0cnVlKTsKKyNlbHNlCisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5lbmFibGVkID0gdHJ1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworI2VuZGlmCiB9CiAKLXZvaWQgQWdjRGlzYWJsZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17CisjaWZuZGVmIFdFQlJUQ19MRUdBQ1kKK3ZvaWQgQWdjMkRpc2FibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5lbmFibGVkID0gZmFsc2U7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKK30KKyNlbmRpZgorCit2b2lkIEFnY0Rpc2FibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQogICAgIEFMT0dWKCJBZ2NEaXNhYmxlIik7Ci0gICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7CisgICAgd2VicnRjOjpHYWluQ29udHJvbCogYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCo+KGVmZmVjdC0+ZW5naW5lKTsKICAgICBhZ2MtPkVuYWJsZShmYWxzZSk7CisjZWxzZQorICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlZCA9IGZhbHNlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CisjZW5kaWYKIH0KIAorc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc0FnY09wcyA9IHtBZ2NDcmVhdGUsICAgICAgIEFnY0luaXQsICAgICAgICAgTlVMTCwgQWdjRW5hYmxlLCBBZ2NEaXNhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2NTZXRQYXJhbWV0ZXIsIEFnY0dldFBhcmFtZXRlciwgTlVMTH07CiAKLXN0YXRpYyBjb25zdCBwcmVwcm9jX29wc190IHNBZ2NPcHMgPSB7Ci0gICAgICAgIEFnY0NyZWF0ZSwKLSAgICAgICAgQWdjSW5pdCwKLSAgICAgICAgTlVMTCwKLSAgICAgICAgQWdjRW5hYmxlLAotICAgICAgICBBZ2NEaXNhYmxlLAotICAgICAgICBBZ2NTZXRQYXJhbWV0ZXIsCi0gICAgICAgIEFnY0dldFBhcmFtZXRlciwKLSAgICAgICAgTlVMTAotfTsKLQorI2lmbmRlZiBXRUJSVENfTEVHQUNZCitzdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCBzQWdjMk9wcyA9IHtBZ2MyQ3JlYXRlLCAgICAgICBBZ2MySW5pdCwgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnYzJFbmFibGUsICAgICAgIEFnYzJEaXNhYmxlLCBBZ2MyU2V0UGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdjMkdldFBhcmFtZXRlciwgTlVMTH07CisjZW5kaWYKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsZXIgKEFFQykKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKyNpZmRlZiBXRUJSVENfTEVHQUNZCiBzdGF0aWMgY29uc3Qgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6Um91dGluZ01vZGUga0FlY0RlZmF1bHRNb2RlID0KICAgICAgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6a0VhcnBpZWNlOwogc3RhdGljIGNvbnN0IGJvb2wga0FlY0RlZmF1bHRDb21mb3J0Tm9pc2UgPSB0cnVlOworI2VuZGlmCiAKLWludCAgQWVjSW5pdCAocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQoteworaW50IEFlY0luaXQocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CiAgICAgQUxPR1YoIkFlY0luaXQiKTsKLSAgICB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlICphZWMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlICo+KGVmZmVjdC0+ZW5naW5lKTsKKyNpZmRlZiBXRUJSVENfTEVHQUNZCisgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSogYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSo+KGVmZmVjdC0+ZW5naW5lKTsKICAgICBhZWMtPnNldF9yb3V0aW5nX21vZGUoa0FlY0RlZmF1bHRNb2RlKTsKICAgICBhZWMtPmVuYWJsZV9jb21mb3J0X25vaXNlKGtBZWNEZWZhdWx0Q29tZm9ydE5vaXNlKTsKKyNlbHNlCisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZWNob19jYW5jZWxsZXIubW9iaWxlX21vZGUgPSB0cnVlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CisjZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIAotaW50ICBBZWNDcmVhdGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewotICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKmFlYyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5lY2hvX2NvbnRyb2xfbW9iaWxlKCk7CitpbnQgQWVjQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlKiBhZWMgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+ZWNob19jb250cm9sX21vYmlsZSgpOwogICAgIEFMT0dWKCJBZWNDcmVhdGUgZ290IGFlYyAlcCIsIGFlYyk7CiAgICAgaWYgKGFlYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJBZ2NDcmVhdGUgRXJyb3IiKTsKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgfQogICAgIGVmZmVjdC0+ZW5naW5lID0gc3RhdGljX2Nhc3Q8cHJlcHJvY19meF9oYW5kbGVfdD4oYWVjKTsKLSAgICBBZWNJbml0IChlZmZlY3QpOworI2VuZGlmCisgICAgQWVjSW5pdChlZmZlY3QpOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICplZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKQoteworaW50IEFlY0dldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHZvaWQqIHBQYXJhbSwgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QqKXBQYXJhbTsKIAogICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIEFFQ19QQVJBTV9FQ0hPX0RFTEFZOgotICAgIGNhc2UgQUVDX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAxMDAwICogZWZmZWN0LT5zZXNzaW9uLT5hcG0tPnN0cmVhbV9kZWxheV9tcygpOwotICAgICAgICBBTE9HVigiQWVjR2V0UGFyYW1ldGVyKCkgZWNobyBkZWxheSAlZCB1cyIsICoodWludDMyX3QgKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiQWVjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgKih1aW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFFQ19QQVJBTV9FQ0hPX0RFTEFZOgorICAgICAgICBjYXNlIEFFQ19QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gMTAwMCAqIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5zdHJlYW1fZGVsYXlfbXMoKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZWNHZXRQYXJhbWV0ZXIoKSBlY2hvIGRlbGF5ICVkIHVzIiwgKih1aW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBXRUJSVENfTEVHQUNZCisgICAgICAgIGNhc2UgQUVDX1BBUkFNX01PQklMRV9NT0RFOgorICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5lY2hvX2NhbmNlbGxlci5tb2JpbGVfbW9kZTsKKyAgICAgICAgICAgIEFMT0dWKCJBZWNHZXRQYXJhbWV0ZXIoKSBtb2JpbGUgbW9kZSAlZCB1cyIsICoodWludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIkFlY0dldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCB2YWx1ZSAlMDh4IiwgcGFyYW0sICoodWludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWludCBBZWNTZXRQYXJhbWV0ZXIgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpCi17CitpbnQgQWVjU2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCwgdm9pZCogcFBhcmFtLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QgKilwUGFyYW07Ci0gICAgdWludDMyX3QgdmFsdWUgPSAqKHVpbnQzMl90ICopcFZhbHVlOworICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCopcFBhcmFtOworICAgIHVpbnQzMl90IHZhbHVlID0gKih1aW50MzJfdCopcFZhbHVlOwogCiAgICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgQUVDX1BBUkFNX0VDSE9fREVMQVk6Ci0gICAgY2FzZSBBRUNfUEFSQU1fUFJPUEVSVElFUzoKLSAgICAgICAgc3RhdHVzID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPnNldF9zdHJlYW1fZGVsYXlfbXModmFsdWUvMTAwMCk7Ci0gICAgICAgIEFMT0dWKCJBZWNTZXRQYXJhbWV0ZXIoKSBlY2hvIGRlbGF5ICVkIHVzLCBzdGF0dXMgJWQiLCB2YWx1ZSwgc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIkFlY1NldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCB2YWx1ZSAlMDh4IiwgcGFyYW0sICoodWludDMyX3QgKilwVmFsdWUpOwotICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBRUNfUEFSQU1fRUNIT19ERUxBWToKKyAgICAgICAgY2FzZSBBRUNfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHN0YXR1cyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5zZXRfc3RyZWFtX2RlbGF5X21zKHZhbHVlIC8gMTAwMCk7CisgICAgICAgICAgICBBTE9HVigiQWVjU2V0UGFyYW1ldGVyKCkgZWNobyBkZWxheSAlZCB1cywgc3RhdHVzICVkIiwgdmFsdWUsIHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgICAgICBjYXNlIEFFQ19QQVJBTV9NT0JJTEVfTU9ERToKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZWNob19jYW5jZWxsZXIubW9iaWxlX21vZGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJBZWNTZXRQYXJhbWV0ZXIoKSBtb2JpbGUgbW9kZSAlZCB1cyIsIHZhbHVlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIkFlY1NldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCB2YWx1ZSAlMDh4IiwgcGFyYW0sICoodWludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQWVjRW5hYmxlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlICphZWMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlICo+KGVmZmVjdC0+ZW5naW5lKTsKK3ZvaWQgQWVjRW5hYmxlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlKiBhZWMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlKj4oZWZmZWN0LT5lbmdpbmUpOwogICAgIEFMT0dWKCJBZWNFbmFibGUgYWVjICVwIiwgYWVjKTsKICAgICBhZWMtPkVuYWJsZSh0cnVlKTsKKyNlbHNlCisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZWNob19jYW5jZWxsZXIuZW5hYmxlZCA9IHRydWU7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKKyNlbmRpZgogfQogCi12b2lkIEFlY0Rpc2FibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewordm9pZCBBZWNEaXNhYmxlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICBBTE9HVigiQWVjRGlzYWJsZSIpOwotICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKmFlYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKj4oZWZmZWN0LT5lbmdpbmUpOworICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUqIGFlYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUqPihlZmZlY3QtPmVuZ2luZSk7CiAgICAgYWVjLT5FbmFibGUoZmFsc2UpOworI2Vsc2UKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5lY2hvX2NhbmNlbGxlci5lbmFibGVkID0gZmFsc2U7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKKyNlbmRpZgogfQogCi1pbnQgQWVjU2V0RGV2aWNlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwgdWludDMyX3QgZGV2aWNlKQoteworaW50IEFlY1NldERldmljZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHVpbnQzMl90IGRldmljZSkgewogICAgIEFMT0dWKCJBZWNTZXREZXZpY2UgJTA4eCIsIGRldmljZSk7Ci0gICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6Um91dGluZ01vZGUgbW9kZSA9IHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OmtRdWlldEVhcnBpZWNlT3JIZWFkc2V0OworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlKiBhZWMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlKj4oZWZmZWN0LT5lbmdpbmUpOworICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OlJvdXRpbmdNb2RlIG1vZGUgPQorICAgICAgICAgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6a1F1aWV0RWFycGllY2VPckhlYWRzZXQ7CisjZW5kaWYKIAogICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBzd2l0Y2goZGV2aWNlKSB7Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFOgotICAgICAgICBtb2RlID0gd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6a0VhcnBpZWNlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKLSAgICAgICAgbW9kZSA9IHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OmtTcGVha2VycGhvbmU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICBzd2l0Y2ggKGRldmljZSkgeworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U6CisgICAgICAgICAgICBtb2RlID0gd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6a0VhcnBpZWNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgorICAgICAgICAgICAgbW9kZSA9IHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OmtTcGVha2VycGhvbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBhZWMtPnNldF9yb3V0aW5nX21vZGUobW9kZSk7CisjZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc0FlY09wcyA9IHsKLSAgICAgICAgQWVjQ3JlYXRlLAotICAgICAgICBBZWNJbml0LAotICAgICAgICBOVUxMLAotICAgICAgICBBZWNFbmFibGUsCi0gICAgICAgIEFlY0Rpc2FibGUsCi0gICAgICAgIEFlY1NldFBhcmFtZXRlciwKLSAgICAgICAgQWVjR2V0UGFyYW1ldGVyLAotICAgICAgICBBZWNTZXREZXZpY2UKLX07CitzdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCBzQWVjT3BzID0ge0FlY0NyZWF0ZSwgICAgICAgQWVjSW5pdCwgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFlY0VuYWJsZSwgICAgICAgQWVjRGlzYWJsZSwgIEFlY1NldFBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWVjR2V0UGFyYW1ldGVyLCBBZWNTZXREZXZpY2V9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTm9pc2UgU3VwcHJlc3Npb24gKE5TKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorI2lmZGVmIFdFQlJUQ19MRUdBQ1kKIHN0YXRpYyBjb25zdCB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb246OkxldmVsIGtOc0RlZmF1bHRMZXZlbCA9IHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbjo6a01vZGVyYXRlOworI2Vsc2UKK3N0YXRpYyBjb25zdCB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnOjpOb2lzZVN1cHByZXNzaW9uOjpMZXZlbCBrTnNEZWZhdWx0TGV2ZWwgPQorICAgICAgICB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnOjpOb2lzZVN1cHByZXNzaW9uOjprTW9kZXJhdGU7CisjZW5kaWYKIAotaW50ICBOc0luaXQgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKK2ludCBOc0luaXQocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CiAgICAgQUxPR1YoIk5zSW5pdCIpOwotICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKj4oZWZmZWN0LT5lbmdpbmUpOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24qIG5zID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpOb2lzZVN1cHByZXNzaW9uKj4oZWZmZWN0LT5lbmdpbmUpOwogICAgIG5zLT5zZXRfbGV2ZWwoa05zRGVmYXVsdExldmVsKTsKICAgICB3ZWJydGM6OkNvbmZpZyBjb25maWc7CiAgICAgc3RkOjp2ZWN0b3I8d2VicnRjOjpQb2ludD4gZ2VvbWV0cnk7CkBAIC01NjksNTUgKzg2OSw1NCBAQAogICAgIGdlb21ldHJ5LnB1c2hfYmFjayh3ZWJydGM6OlBvaW50KDAuMDFmLCAwLmYsIDAuZikpOwogICAgIGdlb21ldHJ5LnB1c2hfYmFjayh3ZWJydGM6OlBvaW50KDAuMDNmLCAwLmYsIDAuZikpOwogICAgIC8vIFRoZSBnZW9tZXRyeSBuZWVkcyB0byBiZSBzZXQgd2l0aCBCZWFtZm9ybWluZyBlbmFibGVkLgotICAgIGNvbmZpZy5TZXQ8d2VicnRjOjpCZWFtZm9ybWluZz4oCi0gICAgICAgICAgICBuZXcgd2VicnRjOjpCZWFtZm9ybWluZyh0cnVlLCBnZW9tZXRyeSkpOworICAgIGNvbmZpZy5TZXQ8d2VicnRjOjpCZWFtZm9ybWluZz4obmV3IHdlYnJ0Yzo6QmVhbWZvcm1pbmcodHJ1ZSwgZ2VvbWV0cnkpKTsKICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+U2V0RXh0cmFPcHRpb25zKGNvbmZpZyk7Ci0gICAgY29uZmlnLlNldDx3ZWJydGM6OkJlYW1mb3JtaW5nPigKLSAgICAgICAgICAgIG5ldyB3ZWJydGM6OkJlYW1mb3JtaW5nKGZhbHNlLCBnZW9tZXRyeSkpOworICAgIGNvbmZpZy5TZXQ8d2VicnRjOjpCZWFtZm9ybWluZz4obmV3IHdlYnJ0Yzo6QmVhbWZvcm1pbmcoZmFsc2UsIGdlb21ldHJ5KSk7CiAgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPlNldEV4dHJhT3B0aW9ucyhjb25maWcpOworI2Vsc2UKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5ub2lzZV9zdXBwcmVzc2lvbi5sZXZlbCA9IGtOc0RlZmF1bHRMZXZlbDsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworI2VuZGlmCiAgICAgZWZmZWN0LT50eXBlID0gTlNfVFlQRV9TSU5HTEVfQ0hBTk5FTDsKICAgICByZXR1cm4gMDsKIH0KIAotaW50ICBOc0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Ci0gICAgd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICpucyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5ub2lzZV9zdXBwcmVzc2lvbigpOworaW50IE5zQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24qIG5zID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPm5vaXNlX3N1cHByZXNzaW9uKCk7CiAgICAgQUxPR1YoIk5zQ3JlYXRlIGdvdCBucyAlcCIsIG5zKTsKICAgICBpZiAobnMgPT0gTlVMTCkgewogICAgICAgICBBTE9HVygiQWdjQ3JlYXRlIEVycm9yIik7CiAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgIH0KICAgICBlZmZlY3QtPmVuZ2luZSA9IHN0YXRpY19jYXN0PHByZXByb2NfZnhfaGFuZGxlX3Q+KG5zKTsKLSAgICBOc0luaXQgKGVmZmVjdCk7CisjZW5kaWYKKyAgICBOc0luaXQoZWZmZWN0KTsKICAgICByZXR1cm4gMDsKIH0KIAotaW50IE5zR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICplZmZlY3QgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAqcFZhbHVlU2l6ZSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlIF9fdW51c2VkKQoteworaW50IE5zR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCBfX3VudXNlZCwgdm9pZCogcFBhcmFtIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplIF9fdW51c2VkLCB2b2lkKiBwVmFsdWUgX191bnVzZWQpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgTnNTZXRQYXJhbWV0ZXIgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpCi17CitpbnQgTnNTZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKLSAgICB1aW50MzJfdCB2YWx1ZSA9ICoodWludDMyX3QgKilwVmFsdWU7Ci0gICAgc3dpdGNoKHBhcmFtKSB7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQorICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiogbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24qPihlZmZlY3QtPmVuZ2luZSk7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgdWludDMyX3QgdmFsdWUgPSAqKHVpbnQzMl90KilwVmFsdWU7CisgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIE5TX1BBUkFNX0xFVkVMOgogICAgICAgICAgICAgbnMtPnNldF9sZXZlbCgod2VicnRjOjpOb2lzZVN1cHByZXNzaW9uOjpMZXZlbCl2YWx1ZSk7CiAgICAgICAgICAgICBBTE9HVigiTnNTZXRQYXJhbWV0ZXIoKSBsZXZlbCAlZCIsIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5TX1BBUkFNX1RZUEU6Ci0gICAgICAgIHsKKyAgICAgICAgY2FzZSBOU19QQVJBTV9UWVBFOiB7CiAgICAgICAgICAgICB3ZWJydGM6OkNvbmZpZyBjb25maWc7CiAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3ZWJydGM6OlBvaW50PiBnZW9tZXRyeTsKLSAgICAgICAgICAgIGJvb2wgaXNfYmVhbWZvcm1pbmdfZW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID09IE5TX1RZUEVfTVVMVElfQ0hBTk5FTCAmJiBucy0+aXNfZW5hYmxlZCgpOworICAgICAgICAgICAgYm9vbCBpc19iZWFtZm9ybWluZ19lbmFibGVkID0gdmFsdWUgPT0gTlNfVFlQRV9NVUxUSV9DSEFOTkVMICYmIG5zLT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICBjb25maWcuU2V0PHdlYnJ0Yzo6QmVhbWZvcm1pbmc+KAogICAgICAgICAgICAgICAgICAgICBuZXcgd2VicnRjOjpCZWFtZm9ybWluZyhpc19iZWFtZm9ybWluZ19lbmFibGVkLCBnZW9tZXRyeSkpOwogICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPlNldEV4dHJhT3B0aW9ucyhjb25maWcpOwpAQCAtNjI5LDEzICs5MjgsMjkgQEAKICAgICAgICAgICAgIEFMT0dXKCJOc1NldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCB2YWx1ZSAlMDh4IiwgcGFyYW0sIHZhbHVlKTsKICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgfQorI2Vsc2UKKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QqKXBQYXJhbTsKKyAgICB1aW50MzJfdCB2YWx1ZSA9ICoodWludDMyX3QqKXBWYWx1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgICAgIGNhc2UgTlNfUEFSQU1fTEVWRUw6CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5ub2lzZV9zdXBwcmVzc2lvbi5sZXZlbCA9CisgICAgICAgICAgICAgICAgICAgICh3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnOjpOb2lzZVN1cHByZXNzaW9uOjpMZXZlbCl2YWx1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJOc1NldFBhcmFtZXRlcigpIGxldmVsICVkIiwgdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiTnNTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCB2YWx1ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgIH0KKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworI2VuZGlmCiAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIE5zRW5hYmxlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKm5zID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICo+KGVmZmVjdC0+ZW5naW5lKTsKK3ZvaWQgTnNFbmFibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQorICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiogbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24qPihlZmZlY3QtPmVuZ2luZSk7CiAgICAgQUxPR1YoIk5zRW5hYmxlIG5zICVwIiwgbnMpOwogICAgIG5zLT5FbmFibGUodHJ1ZSk7CiAgICAgaWYgKGVmZmVjdC0+dHlwZSA9PSBOU19UWVBFX01VTFRJX0NIQU5ORUwpIHsKQEAgLTY0NCwxMjEgKzk1OSwxMTkgQEAKICAgICAgICAgY29uZmlnLlNldDx3ZWJydGM6OkJlYW1mb3JtaW5nPihuZXcgd2VicnRjOjpCZWFtZm9ybWluZyh0cnVlLCBnZW9tZXRyeSkpOwogICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+U2V0RXh0cmFPcHRpb25zKGNvbmZpZyk7CiAgICAgfQorI2Vsc2UKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5ub2lzZV9zdXBwcmVzc2lvbi5lbmFibGVkID0gdHJ1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworI2VuZGlmCiB9CiAKLXZvaWQgTnNEaXNhYmxlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKK3ZvaWQgTnNEaXNhYmxlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgewogICAgIEFMT0dWKCJOc0Rpc2FibGUiKTsKLSAgICB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKm5zID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICo+KGVmZmVjdC0+ZW5naW5lKTsKKyNpZmRlZiBXRUJSVENfTEVHQUNZCisgICAgd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uKiBucyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbio+KGVmZmVjdC0+ZW5naW5lKTsKICAgICBucy0+RW5hYmxlKGZhbHNlKTsKICAgICB3ZWJydGM6OkNvbmZpZyBjb25maWc7CiAgICAgc3RkOjp2ZWN0b3I8d2VicnRjOjpQb2ludD4gZ2VvbWV0cnk7CiAgICAgY29uZmlnLlNldDx3ZWJydGM6OkJlYW1mb3JtaW5nPihuZXcgd2VicnRjOjpCZWFtZm9ybWluZyhmYWxzZSwgZ2VvbWV0cnkpKTsKICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+U2V0RXh0cmFPcHRpb25zKGNvbmZpZyk7CisjZWxzZQorICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLm5vaXNlX3N1cHByZXNzaW9uLmVuYWJsZWQgPSBmYWxzZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworI2VuZGlmCiB9CiAKLXN0YXRpYyBjb25zdCBwcmVwcm9jX29wc190IHNOc09wcyA9IHsKLSAgICAgICAgTnNDcmVhdGUsCi0gICAgICAgIE5zSW5pdCwKLSAgICAgICAgTlVMTCwKLSAgICAgICAgTnNFbmFibGUsCi0gICAgICAgIE5zRGlzYWJsZSwKLSAgICAgICAgTnNTZXRQYXJhbWV0ZXIsCi0gICAgICAgIE5zR2V0UGFyYW1ldGVyLAotICAgICAgICBOVUxMCi19Oworc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc05zT3BzID0ge05zQ3JlYXRlLCAgTnNJbml0LCAgICAgICAgIE5VTEwsICAgICAgICAgICBOc0VuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOc0Rpc2FibGUsIE5zU2V0UGFyYW1ldGVyLCBOc0dldFBhcmFtZXRlciwgTlVMTH07CiAKLQotc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3QgKnNQcmVQcm9jT3BzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0gewotICAgICAgICAmc0FnY09wcywKLSAgICAgICAgJnNBZWNPcHMsCi0gICAgICAgICZzTnNPcHMKLX07Ci0KK3N0YXRpYyBjb25zdCBwcmVwcm9jX29wc190KiBzUHJlUHJvY09wc1tQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsmc0FnY09wcywKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzQWdjMk9wcywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzQWVjT3BzLCAmc05zT3BzfTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdCBmdW5jdGlvbnMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgdWludDMyX3QgcHJvY0lkLCBib29sIGVuYWJsZWQpOwordm9pZCBTZXNzaW9uX1NldFByb2NFbmFibGVkKHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCB1aW50MzJfdCBwcm9jSWQsIGJvb2wgZW5hYmxlZCk7CiAKIGV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBzRWZmZWN0SW50ZXJmYWNlOwogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHNFZmZlY3RJbnRlcmZhY2VSZXZlcnNlOwogCi0jZGVmaW5lIEJBRF9TVEFURV9BQk9SVChmcm9tLCB0bykgXAotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJCYWQgc3RhdGUgdHJhbnNpdGlvbiBmcm9tICVkIHRvICVkIiwgZnJvbSwgdG8pOworI2RlZmluZSBCQURfU1RBVEVfQUJPUlQoZnJvbSwgdG8pIExPR19BTFdBWVNfRkFUQUwoIkJhZCBzdGF0ZSB0cmFuc2l0aW9uIGZyb20gJWQgdG8gJWQiLCBmcm9tLCB0byk7CiAKLWludCBFZmZlY3RfU2V0U3RhdGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LCB1aW50MzJfdCBzdGF0ZSkKLXsKK2ludCBFZmZlY3RfU2V0U3RhdGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB1aW50MzJfdCBzdGF0ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIEFMT0dWKCJFZmZlY3RfU2V0U3RhdGUgcHJvYyAlZCwgbmV3ICVkIG9sZCAlZCIsIGVmZmVjdC0+cHJvY0lkLCBzdGF0ZSwgZWZmZWN0LT5zdGF0ZSk7Ci0gICAgc3dpdGNoKHN0YXRlKSB7Ci0gICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUOgotICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgewotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5kaXNhYmxlKGVmZmVjdCk7Ci0gICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIGZhbHNlKTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZWZmZWN0LT5zdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZGlzYWJsZShlZmZlY3QpOworICAgICAgICAgICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6CisgICAgICAgICAgICBzd2l0Y2ggKGVmZmVjdC0+c3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVmZmVjdC0+b3BzLT5jcmVhdGUoZWZmZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRWZmZWN0X1NldFN0YXRlIGludmFsaWQgdHJhbnNpdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZWZmZWN0LT5zdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVmZmVjdF9TZXRTdGF0ZSBpbnZhbGlkIHRyYW5zaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVOT1NZUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5kaXNhYmxlKGVmZmVjdCk7CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQoZWZmZWN0LT5zZXNzaW9uLCBlZmZlY3QtPnByb2NJZCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBzd2l0Y2ggKGVmZmVjdC0+c3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRWZmZWN0X1NldFN0YXRlIGludmFsaWQgdHJhbnNpdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxpbmcgYW4gYWxyZWFkeSBlbmFibGVkIGVmZmVjdCBpcyBqdXN0IGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5lbmFibGUoZWZmZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChlZmZlY3QtPnNlc3Npb24sIGVmZmVjdC0+cHJvY0lkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgIHN3aXRjaChlZmZlY3QtPnN0YXRlKSB7Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKLSAgICAgICAgICAgIHN0YXR1cyA9IGVmZmVjdC0+b3BzLT5jcmVhdGUoZWZmZWN0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKLSAgICAgICAgICAgIEFMT0dFKCJFZmZlY3RfU2V0U3RhdGUgaW52YWxpZCB0cmFuc2l0aW9uIik7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgotICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgewotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6Ci0gICAgICAgICAgICBBTE9HRSgiRWZmZWN0X1NldFN0YXRlIGludmFsaWQgdHJhbnNpdGlvbiIpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVOT1NZUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5kaXNhYmxlKGVmZmVjdCk7Ci0gICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgotICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgewotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRDoKLSAgICAgICAgICAgIEFMT0dFKCJFZmZlY3RfU2V0U3RhdGUgaW52YWxpZCB0cmFuc2l0aW9uIik7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgotICAgICAgICAgICAgLy8gZW5hYmxpbmcgYW4gYWxyZWFkeSBlbmFibGVkIGVmZmVjdCBpcyBqdXN0IGlnbm9yZWQKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKLSAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5lbmFibGUoZWZmZWN0KTsKLSAgICAgICAgICAgIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQoZWZmZWN0LT5zZXNzaW9uLCBlZmZlY3QtPnByb2NJZCwgdHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CiAgICAgICAgIGVmZmVjdC0+c3RhdGUgPSBzdGF0ZTsKQEAgLTc2Niw4ICsxMDc5LDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgRWZmZWN0X0luaXQocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LCB1aW50MzJfdCBwcm9jSWQpCi17CitpbnQgRWZmZWN0X0luaXQocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB1aW50MzJfdCBwcm9jSWQpIHsKICAgICBpZiAoSGFzUmV2ZXJzZVN0cmVhbShwcm9jSWQpKSB7CiAgICAgICAgIGVmZmVjdC0+aXRmZSA9ICZzRWZmZWN0SW50ZXJmYWNlUmV2ZXJzZTsKICAgICB9IGVsc2UgewpAQCAtNzc5LDIxICsxMDkxLDE3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBFZmZlY3RfQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwKLSAgICAgICAgICAgICAgIHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLAotICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqaW50ZXJmYWNlKQoteworaW50IEVmZmVjdF9DcmVhdGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCBwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCogaW50ZXJmYWNlKSB7CiAgICAgZWZmZWN0LT5zZXNzaW9uID0gc2Vzc2lvbjsKICAgICAqaW50ZXJmYWNlID0gKGVmZmVjdF9oYW5kbGVfdCkmZWZmZWN0LT5pdGZlOwogICAgIHJldHVybiBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEKTsKIH0KIAotaW50IEVmZmVjdF9SZWxlYXNlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKK2ludCBFZmZlY3RfUmVsZWFzZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKICAgICByZXR1cm4gRWZmZWN0X1NldFN0YXRlKGVmZmVjdCwgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVCk7CiB9CiAKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFNlc3Npb24gZnVuY3Rpb25zCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODAzLDggKzExMTEsNyBAQAogc3RhdGljIGNvbnN0IGludCBrUHJlcHJvY0RlZmF1bHRTciA9IDE2MDAwOwogc3RhdGljIGNvbnN0IGludCBrUHJlUHJvY0RlZmF1bHRDbmwgPSAxOwogCi1pbnQgU2Vzc2lvbl9Jbml0KHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uKQoteworaW50IFNlc3Npb25fSW5pdChwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbikgewogICAgIHNpemVfdCBpOwogICAgIGludCBzdGF0dXMgPSAwOwogCkBAIC04MTIsMzMgKzExMTksMzMgQEAKICAgICBzZXNzaW9uLT5pZCA9IDA7CiAgICAgc2Vzc2lvbi0+aW8gPSAwOwogICAgIHNlc3Npb24tPmNyZWF0ZWRNc2sgPSAwOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOworI2VuZGlmCiAgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFMgJiYgc3RhdHVzID09IDA7IGkrKykgewogICAgICAgICBzdGF0dXMgPSBFZmZlY3RfSW5pdCgmc2Vzc2lvbi0+ZWZmZWN0c1tpXSwgaSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQotZXh0ZXJuICJDIiBpbnQgU2Vzc2lvbl9DcmVhdGVFZmZlY3QocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2NJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKmludGVyZmFjZSkKLXsKK2V4dGVybiAiQyIgaW50IFNlc3Npb25fQ3JlYXRlRWZmZWN0KHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCBpbnQzMl90IHByb2NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCogaW50ZXJmYWNlKSB7CiAgICAgaW50IHN0YXR1cyA9IC1FTk9NRU07CiAKICAgICBBTE9HVigiU2Vzc2lvbl9DcmVhdGVFZmZlY3QgcHJvY0lkICVkLCBjcmVhdGVkTXNrICUwOHgiLCBwcm9jSWQsIHNlc3Npb24tPmNyZWF0ZWRNc2spOwogCiAgICAgaWYgKHNlc3Npb24tPmNyZWF0ZWRNc2sgPT0gMCkgeworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICAgICAgc2Vzc2lvbi0+YXBtID0gd2VicnRjOjpBdWRpb1Byb2Nlc3Npbmc6OkNyZWF0ZSgpOwogICAgICAgICBpZiAoc2Vzc2lvbi0+YXBtID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dXKCJTZXNzaW9uX0NyZWF0ZUVmZmVjdCBjb3VsZCBub3QgZ2V0IGFwbSBlbmdpbmUiKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgd2VicnRjOjpQcm9jZXNzaW5nQ29uZmlnIHByb2Nlc3NpbmdfY29uZmlnID0gewotICAgICAgICAgICAge3trUHJlcHJvY0RlZmF1bHRTciwga1ByZVByb2NEZWZhdWx0Q25sfSwKLSAgICAgICAgICAgICB7a1ByZXByb2NEZWZhdWx0U3IsIGtQcmVQcm9jRGVmYXVsdENubH0sCi0gICAgICAgICAgICAge2tQcmVwcm9jRGVmYXVsdFNyLCBrUHJlUHJvY0RlZmF1bHRDbmx9LAotICAgICAgICAgICAgIHtrUHJlcHJvY0RlZmF1bHRTciwga1ByZVByb2NEZWZhdWx0Q25sfX19OworICAgICAgICAgICAgICAgIHt7a1ByZXByb2NEZWZhdWx0U3IsIGtQcmVQcm9jRGVmYXVsdENubH0sCisgICAgICAgICAgICAgICAgIHtrUHJlcHJvY0RlZmF1bHRTciwga1ByZVByb2NEZWZhdWx0Q25sfSwKKyAgICAgICAgICAgICAgICAge2tQcmVwcm9jRGVmYXVsdFNyLCBrUHJlUHJvY0RlZmF1bHRDbmx9LAorICAgICAgICAgICAgICAgICB7a1ByZXByb2NEZWZhdWx0U3IsIGtQcmVQcm9jRGVmYXVsdENubH19fTsKICAgICAgICAgc2Vzc2lvbi0+YXBtLT5Jbml0aWFsaXplKHByb2Nlc3NpbmdfY29uZmlnKTsKICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lID0gbmV3IHdlYnJ0Yzo6QXVkaW9GcmFtZSgpOwogICAgICAgICBpZiAoc2Vzc2lvbi0+cHJvY0ZyYW1lID09IE5VTEwpIHsKQEAgLTg1MCwyOCArMTE1Nyw1MyBAQAogICAgICAgICAgICAgQUxPR1coIlNlc3Npb25fQ3JlYXRlRWZmZWN0IGNvdWxkIG5vdCBhbGxvY2F0ZSByZXZlcnNlIGF1ZGlvIGZyYW1lIik7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CisjZWxzZQorICAgICAgICBzZXNzaW9uLT5hcG0gPSBzZXNzaW9uLT5hcF9idWlsZGVyLkNyZWF0ZSgpOworICAgICAgICBpZiAoc2Vzc2lvbi0+YXBtID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJTZXNzaW9uX0NyZWF0ZUVmZmVjdCBjb3VsZCBub3QgZ2V0IGFwbSBlbmdpbmUiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUgPSBrUHJlcHJvY0RlZmF1bHRTcjsKICAgICAgICAgc2Vzc2lvbi0+YXBtRnJhbWVDb3VudCA9IChrUHJlcHJvY0RlZmF1bHRTcikgLyAxMDA7CiAgICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwogICAgICAgICBzZXNzaW9uLT5zYW1wbGluZ1JhdGUgPSBrUHJlcHJvY0RlZmF1bHRTcjsKICAgICAgICAgc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPSBrUHJlUHJvY0RlZmF1bHRDbmw7CiAgICAgICAgIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCA9IGtQcmVQcm9jRGVmYXVsdENubDsKKyNpZmRlZiBXRUJSVENfTEVHQUNZCiAgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+c2FtcGxlX3JhdGVfaHpfID0ga1ByZXByb2NEZWZhdWx0U3I7CiAgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+bnVtX2NoYW5uZWxzXyA9IGtQcmVQcm9jRGVmYXVsdENubDsKKyNlbHNlCisgICAgICAgIHNlc3Npb24tPmlucHV0Q29uZmlnLnNldF9zYW1wbGVfcmF0ZV9oeihrUHJlcHJvY0RlZmF1bHRTcik7CisgICAgICAgIHNlc3Npb24tPmlucHV0Q29uZmlnLnNldF9udW1fY2hhbm5lbHMoa1ByZVByb2NEZWZhdWx0Q25sKTsKKyAgICAgICAgc2Vzc2lvbi0+b3V0cHV0Q29uZmlnLnNldF9zYW1wbGVfcmF0ZV9oeihrUHJlcHJvY0RlZmF1bHRTcik7CisgICAgICAgIHNlc3Npb24tPm91dHB1dENvbmZpZy5zZXRfbnVtX2NoYW5uZWxzKGtQcmVQcm9jRGVmYXVsdENubCk7CisjZW5kaWYKICAgICAgICAgc2Vzc2lvbi0+cmV2Q2hhbm5lbENvdW50ID0ga1ByZVByb2NEZWZhdWx0Q25sOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICAgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPnNhbXBsZV9yYXRlX2h6XyA9IGtQcmVwcm9jRGVmYXVsdFNyOwogICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+bnVtX2NoYW5uZWxzXyA9IGtQcmVQcm9jRGVmYXVsdENubDsKKyNlbHNlCisgICAgICAgIHNlc3Npb24tPnJldkNvbmZpZy5zZXRfc2FtcGxlX3JhdGVfaHooa1ByZXByb2NEZWZhdWx0U3IpOworICAgICAgICBzZXNzaW9uLT5yZXZDb25maWcuc2V0X251bV9jaGFubmVscyhrUHJlUHJvY0RlZmF1bHRDbmwpOworI2VuZGlmCiAgICAgICAgIHNlc3Npb24tPmVuYWJsZWRNc2sgPSAwOwogICAgICAgICBzZXNzaW9uLT5wcm9jZXNzZWRNc2sgPSAwOwogICAgICAgICBzZXNzaW9uLT5yZXZFbmFibGVkTXNrID0gMDsKICAgICAgICAgc2Vzc2lvbi0+cmV2UHJvY2Vzc2VkTXNrID0gMDsKKyNpZmRlZiBXRUJSVENfTEVHQUNZCiAgICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gTlVMTDsKKyNlbmRpZgogICAgICAgICBzZXNzaW9uLT5pbkJ1ZiA9IE5VTEw7CiAgICAgICAgIHNlc3Npb24tPmluQnVmU2l6ZSA9IDA7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQogICAgICAgICBzZXNzaW9uLT5vdXRSZXNhbXBsZXIgPSBOVUxMOworI2VuZGlmCiAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiA9IE5VTEw7CiAgICAgICAgIHNlc3Npb24tPm91dEJ1ZlNpemUgPSAwOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICAgICAgc2Vzc2lvbi0+cmV2UmVzYW1wbGVyID0gTlVMTDsKKyNlbmRpZgogICAgICAgICBzZXNzaW9uLT5yZXZCdWYgPSBOVUxMOwogICAgICAgICBzZXNzaW9uLT5yZXZCdWZTaXplID0gMDsKICAgICB9CkBAIC04ODAsMjcgKzEyMTIsMzEgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgQUxPR1YoIlNlc3Npb25fQ3JlYXRlRWZmZWN0IE9LIik7Ci0gICAgc2Vzc2lvbi0+Y3JlYXRlZE1zayB8PSAoMTw8cHJvY0lkKTsKKyAgICBzZXNzaW9uLT5jcmVhdGVkTXNrIHw9ICgxIDw8IHByb2NJZCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIAogZXJyb3I6CiAgICAgaWYgKHNlc3Npb24tPmNyZWF0ZWRNc2sgPT0gMCkgeworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICAgICAgZGVsZXRlIHNlc3Npb24tPnJldkZyYW1lOwogICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZSA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5wcm9jRnJhbWU7CiAgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZSA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5hcG07Ci0gICAgICAgIHNlc3Npb24tPmFwbSA9IE5VTEw7IC8vIE5PTElOVChjbGFuZy1hbmFseXplci1jcGx1c3BsdXMuTmV3RGVsZXRlKQorICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOyAgLy8gTk9MSU5UKGNsYW5nLWFuYWx5emVyLWNwbHVzcGx1cy5OZXdEZWxldGUpCisjZWxzZQorICAgICAgICBkZWxldGUgc2Vzc2lvbi0+YXBtOworICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOworI2VuZGlmCiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWludCBTZXNzaW9uX1JlbGVhc2VFZmZlY3QocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2NfZWZmZWN0X3QgKmZ4KQoteworaW50IFNlc3Npb25fUmVsZWFzZUVmZmVjdChwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwgcHJlcHJvY19lZmZlY3RfdCogZngpIHsKICAgICBBTE9HV19JRihFZmZlY3RfUmVsZWFzZShmeCkgIT0gMCwgIiBFZmZlY3RfUmVsZWFzZSgpIGZhaWxlZCBmb3IgcHJvYyBJRCAlZCIsIGZ4LT5wcm9jSWQpOwotICAgIHNlc3Npb24tPmNyZWF0ZWRNc2sgJj0gfigxPDxmeC0+cHJvY0lkKTsKKyAgICBzZXNzaW9uLT5jcmVhdGVkTXNrICY9IH4oMSA8PCBmeC0+cHJvY0lkKTsKICAgICBpZiAoc2Vzc2lvbi0+Y3JlYXRlZE1zayA9PSAwKSB7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQogICAgICAgICBkZWxldGUgc2Vzc2lvbi0+YXBtOwogICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOwogICAgICAgICBkZWxldGUgc2Vzc2lvbi0+cHJvY0ZyYW1lOwpAQCAtOTE5LDYgKzEyNTUsMTAgQEAKICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPnJldlJlc2FtcGxlcik7CiAgICAgICAgICAgICBzZXNzaW9uLT5yZXZSZXNhbXBsZXIgPSBOVUxMOwogICAgICAgICB9CisjZWxzZQorICAgICAgICBkZWxldGUgc2Vzc2lvbi0+YXBtOworICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOworI2VuZGlmCiAgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5pbkJ1ZjsKICAgICAgICAgc2Vzc2lvbi0+aW5CdWYgPSBOVUxMOwogICAgICAgICBkZWxldGUgc2Vzc2lvbi0+b3V0QnVmOwpAQCAtOTMyLDkgKzEyNzIsNyBAQAogICAgIHJldHVybiAwOwogfQogCi0KLWludCBTZXNzaW9uX1NldENvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190ICpjb25maWcpCi17CitpbnQgU2Vzc2lvbl9TZXRDb25maWcocHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24sIGVmZmVjdF9jb25maWdfdCogY29uZmlnKSB7CiAgICAgdWludDMyX3QgaW5DbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICB1aW50MzJfdCBvdXRDbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAKQEAgLTk0NCw0NiArMTI4Miw2NiBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBBTE9HVigiU2Vzc2lvbl9TZXRDb25maWcgc3IgJWQgY25sICUwOHgiLAotICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsIGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworICAgIEFMT0dWKCJTZXNzaW9uX1NldENvbmZpZyBzciAlZCBjbmwgJTA4eCIsIGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlLAorICAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICBpbnQgc3RhdHVzOworI2VuZGlmCiAKICAgICAvLyBBRUMgaW1wbGVtZW50YXRpb24gaXMgbGltaXRlZCB0byAxNmtIegogICAgIGlmIChjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA+PSAzMjAwMCAmJiAhKHNlc3Npb24tPmNyZWF0ZWRNc2sgJiAoMSA8PCBQUkVQUk9DX0FFQykpKSB7CiAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSA9IDMyMDAwOwotICAgIH0gZWxzZQotICAgIGlmIChjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA+PSAxNjAwMCkgeworICAgIH0gZWxzZSBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPj0gMTYwMDApIHsKICAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlID0gMTYwMDA7CiAgICAgfSBlbHNlIGlmIChjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA+PSA4MDAwKSB7CiAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSA9IDgwMDA7CiAgICAgfQogCisjaWZkZWYgV0VCUlRDX0xFR0FDWQogICAgIGNvbnN0IHdlYnJ0Yzo6UHJvY2Vzc2luZ0NvbmZpZyBwcm9jZXNzaW5nX2NvbmZpZyA9IHsKLSAgICAgIHt7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBpbkNubH0sCi0gICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgb3V0Q25sfSwKLSAgICAgICB7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBpbkNubH0sCi0gICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgaW5Dbmx9fX07CisgICAgICAgICAgICB7e3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgaW5Dbmx9LAorICAgICAgICAgICAgIHtzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIG91dENubH0sCisgICAgICAgICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgaW5Dbmx9LAorICAgICAgICAgICAgIHtzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIGluQ25sfX19OwogICAgIHN0YXR1cyA9IHNlc3Npb24tPmFwbS0+SW5pdGlhbGl6ZShwcm9jZXNzaW5nX2NvbmZpZyk7CiAgICAgaWYgKHN0YXR1cyA8IDApIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQorI2VuZGlmCiAKICAgICBzZXNzaW9uLT5zYW1wbGluZ1JhdGUgPSBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKICAgICBzZXNzaW9uLT5hcG1GcmFtZUNvdW50ID0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlIC8gMTAwOwogICAgIGlmIChzZXNzaW9uLT5zYW1wbGluZ1JhdGUgPT0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSB7CiAgICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSAoc2Vzc2lvbi0+YXBtRnJhbWVDb3VudCAqIHNlc3Npb24tPnNhbXBsaW5nUmF0ZSkgLwotICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSAgKyAxOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICAgICAgc2Vzc2lvbi0+ZnJhbWVDb3VudCA9CisgICAgICAgICAgICAgICAgKHNlc3Npb24tPmFwbUZyYW1lQ291bnQgKiBzZXNzaW9uLT5zYW1wbGluZ1JhdGUpIC8gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlICsgMTsKKyNlbHNlCisgICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPQorICAgICAgICAgICAgICAgIChzZXNzaW9uLT5hcG1GcmFtZUNvdW50ICogc2Vzc2lvbi0+c2FtcGxpbmdSYXRlKSAvIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZTsKKyNlbmRpZgogICAgIH0KICAgICBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9IGluQ25sOwogICAgIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCA9IG91dENubDsKKyNpZmRlZiBXRUJSVENfTEVHQUNZCiAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5udW1fY2hhbm5lbHNfID0gaW5Dbmw7CiAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5zYW1wbGVfcmF0ZV9oel8gPSBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGU7CisjZWxzZQorICAgIHNlc3Npb24tPmlucHV0Q29uZmlnLnNldF9zYW1wbGVfcmF0ZV9oeihzZXNzaW9uLT5zYW1wbGluZ1JhdGUpOworICAgIHNlc3Npb24tPmlucHV0Q29uZmlnLnNldF9udW1fY2hhbm5lbHMoaW5DbmwpOworICAgIHNlc3Npb24tPm91dHB1dENvbmZpZy5zZXRfc2FtcGxlX3JhdGVfaHooc2Vzc2lvbi0+c2FtcGxpbmdSYXRlKTsKKyAgICBzZXNzaW9uLT5vdXRwdXRDb25maWcuc2V0X251bV9jaGFubmVscyhpbkNubCk7CisjZW5kaWYKIAogICAgIHNlc3Npb24tPnJldkNoYW5uZWxDb3VudCA9IGluQ25sOworI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+bnVtX2NoYW5uZWxzXyA9IGluQ25sOwogICAgIHNlc3Npb24tPnJldkZyYW1lLT5zYW1wbGVfcmF0ZV9oel8gPSBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGU7CisjZWxzZQorICAgIHNlc3Npb24tPnJldkNvbmZpZy5zZXRfc2FtcGxlX3JhdGVfaHooc2Vzc2lvbi0+c2FtcGxpbmdSYXRlKTsKKyAgICBzZXNzaW9uLT5yZXZDb25maWcuc2V0X251bV9jaGFubmVscyhpbkNubCk7CisjZW5kaWYKIAogICAgIC8vIGZvcmNlIHByb2Nlc3MgYnVmZmVyIHJlYWxsb2NhdGlvbgogICAgIHNlc3Npb24tPmluQnVmU2l6ZSA9IDA7CkBAIC05OTEsNyArMTM0OSw3IEBACiAgICAgc2Vzc2lvbi0+ZnJhbWVzSW4gPSAwOwogICAgIHNlc3Npb24tPmZyYW1lc091dCA9IDA7CiAKLQorI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgIT0gTlVMTCkgewogICAgICAgICBzcGVleF9yZXNhbXBsZXJfZGVzdHJveShzZXNzaW9uLT5pblJlc2FtcGxlcik7CiAgICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gTlVMTDsKQEAgLTEwMDYsMzYgKzEzNjQsMzAgQEAKICAgICB9CiAgICAgaWYgKHNlc3Npb24tPnNhbXBsaW5nUmF0ZSAhPSBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpIHsKICAgICAgICAgaW50IGVycm9yOwotICAgICAgICBzZXNzaW9uLT5pblJlc2FtcGxlciA9IHNwZWV4X3Jlc2FtcGxlcl9pbml0KHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTQU1QTEVSX1FVQUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICAgICAgc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPQorICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9pbml0KHNlc3Npb24tPmluQ2hhbm5lbENvdW50LCBzZXNzaW9uLT5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlLCBSRVNBTVBMRVJfUVVBTElUWSwgJmVycm9yKTsKICAgICAgICAgaWYgKHNlc3Npb24tPmluUmVzYW1wbGVyID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dXKCJTZXNzaW9uX1NldENvbmZpZyBDYW5ub3QgY3JlYXRlIHNwZWV4IHJlc2FtcGxlcjogJXMiLAotICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfc3RyZXJyb3IoZXJyb3IpKTsKKyAgICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9zdHJlcnJvcihlcnJvcikpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi0+b3V0UmVzYW1wbGVyID0gc3BlZXhfcmVzYW1wbGVyX2luaXQoc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5zYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTQU1QTEVSX1FVQUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICAgICAgc2Vzc2lvbi0+b3V0UmVzYW1wbGVyID0KKyAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfaW5pdChzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5zYW1wbGluZ1JhdGUsIFJFU0FNUExFUl9RVUFMSVRZLCAmZXJyb3IpOwogICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dXKCJTZXNzaW9uX1NldENvbmZpZyBDYW5ub3QgY3JlYXRlIHNwZWV4IHJlc2FtcGxlcjogJXMiLAotICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfc3RyZXJyb3IoZXJyb3IpKTsKKyAgICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9zdHJlcnJvcihlcnJvcikpOwogICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOwogICAgICAgICAgICAgc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPSBOVUxMOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi0+cmV2UmVzYW1wbGVyID0gc3BlZXhfcmVzYW1wbGVyX2luaXQoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNBTVBMRVJfUVVBTElUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgICBzZXNzaW9uLT5yZXZSZXNhbXBsZXIgPQorICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9pbml0KHNlc3Npb24tPmluQ2hhbm5lbENvdW50LCBzZXNzaW9uLT5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlLCBSRVNBTVBMRVJfUVVBTElUWSwgJmVycm9yKTsKICAgICAgICAgaWYgKHNlc3Npb24tPnJldlJlc2FtcGxlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HVygiU2Vzc2lvbl9TZXRDb25maWcgQ2Fubm90IGNyZWF0ZSBzcGVleCByZXNhbXBsZXI6ICVzIiwKLSAgICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3N0cmVycm9yKGVycm9yKSk7CisgICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfc3RyZXJyb3IoZXJyb3IpKTsKICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPmluUmVzYW1wbGVyKTsKICAgICAgICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gTlVMTDsKICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPm91dFJlc2FtcGxlcik7CkBAIC0xMDQzLDEzICsxMzk1LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgIH0KKyNlbmRpZgogCiAgICAgc2Vzc2lvbi0+c3RhdGUgPSBQUkVQUk9DX1NFU1NJT05fU1RBVEVfQ09ORklHOwogICAgIHJldHVybiAwOwogfQogCi12b2lkIFNlc3Npb25fR2V0Q29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKLXsKK3ZvaWQgU2Vzc2lvbl9HZXRDb25maWcocHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24sIGVmZmVjdF9jb25maWdfdCogY29uZmlnKSB7CiAgICAgbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOwogICAgIGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gc2Vzc2lvbi0+c2FtcGxpbmdSYXRlOwogICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CkBAIC0xMDYwLDM3ICsxNDEyLDQwIEBACiAgICAgICAgICAgICAoRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfCBFRkZFQ1RfQ09ORklHX0ZPUk1BVCk7CiB9CiAKLWludCBTZXNzaW9uX1NldFJldmVyc2VDb25maWcocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sIGVmZmVjdF9jb25maWdfdCAqY29uZmlnKQoteworaW50IFNlc3Npb25fU2V0UmV2ZXJzZUNvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190KiBjb25maWcpIHsKICAgICBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gY29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlIHx8Ci0gICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBjb25maWctPm91dHB1dENmZy5mb3JtYXQgfHwKLSAgICAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCB8fAorICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBBTE9HVigiU2Vzc2lvbl9TZXRSZXZlcnNlQ29uZmlnIHNyICVkIGNubCAlMDh4IiwKLSAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlLCBjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBBTE9HVigiU2Vzc2lvbl9TZXRSZXZlcnNlQ29uZmlnIHNyICVkIGNubCAlMDh4IiwgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBpZiAoc2Vzc2lvbi0+c3RhdGUgPCBQUkVQUk9DX1NFU1NJT05fU1RBVEVfQ09ORklHKSB7CiAgICAgICAgIHJldHVybiAtRU5PU1lTOwogICAgIH0KICAgICBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gc2Vzc2lvbi0+c2FtcGxpbmdSYXRlIHx8Ci0gICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgdWludDMyX3QgaW5DbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQogICAgIGNvbnN0IHdlYnJ0Yzo6UHJvY2Vzc2luZ0NvbmZpZyBwcm9jZXNzaW5nX2NvbmZpZyA9IHsKLSAgICAgICB7e3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgc2Vzc2lvbi0+aW5DaGFubmVsQ291bnR9LAotICAgICAgICB7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnR9LAotICAgICAgICB7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBpbkNubH0sCi0gICAgICAgIHtzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIGluQ25sfX19OworICAgICAgICAgICAge3tzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIHNlc3Npb24tPmluQ2hhbm5lbENvdW50fSwKKyAgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnR9LAorICAgICAgICAgICAgIHtzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIGluQ25sfSwKKyAgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBpbkNubH19fTsKICAgICBpbnQgc3RhdHVzID0gc2Vzc2lvbi0+YXBtLT5Jbml0aWFsaXplKHByb2Nlc3NpbmdfY29uZmlnKTsKICAgICBpZiAoc3RhdHVzIDwgMCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CisjZW5kaWYKICAgICBzZXNzaW9uLT5yZXZDaGFubmVsQ291bnQgPSBpbkNubDsKKyNpZmRlZiBXRUJSVENfTEVHQUNZCiAgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPm51bV9jaGFubmVsc18gPSBpbkNubDsKICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+c2FtcGxlX3JhdGVfaHpfID0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlOworI2VuZGlmCiAgICAgLy8gZm9yY2UgcHJvY2VzcyBidWZmZXIgcmVhbGxvY2F0aW9uCiAgICAgc2Vzc2lvbi0+cmV2QnVmU2l6ZSA9IDA7CiAgICAgc2Vzc2lvbi0+ZnJhbWVzUmV2ID0gMDsKQEAgLTEwOTgsOCArMTQ1Myw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgU2Vzc2lvbl9HZXRSZXZlcnNlQ29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKLXsKK3ZvaWQgU2Vzc2lvbl9HZXRSZXZlcnNlQ29uZmlnKHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QqIGNvbmZpZykgewogICAgIG1lbXNldChjb25maWcsIDAsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKICAgICBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNlc3Npb24tPnNhbXBsaW5nUmF0ZTsKICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9IGNvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwpAQCAtMTEwOSwxMSArMTQ2MywxMSBAQAogICAgICAgICAgICAgKEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwgRUZGRUNUX0NPTkZJR19GT1JNQVQpOwogfQogCi12b2lkIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sIHVpbnQzMl90IHByb2NJZCwgYm9vbCBlbmFibGVkKQotewordm9pZCBTZXNzaW9uX1NldFByb2NFbmFibGVkKHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCB1aW50MzJfdCBwcm9jSWQsIGJvb2wgZW5hYmxlZCkgewogICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgIGlmKHNlc3Npb24tPmVuYWJsZWRNc2sgPT0gMCkgeworICAgICAgICBpZiAoc2Vzc2lvbi0+ZW5hYmxlZE1zayA9PSAwKSB7CiAgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiA9IDA7CisjaWZkZWYgV0VCUlRDX0xFR0FDWQogICAgICAgICAgICAgaWYgKHNlc3Npb24tPmluUmVzYW1wbGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcmVzZXRfbWVtKHNlc3Npb24tPmluUmVzYW1wbGVyKTsKICAgICAgICAgICAgIH0KQEAgLTExMjEsMTMgKzE0NzUsMTYgQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5vdXRSZXNhbXBsZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9yZXNldF9tZW0oc2Vzc2lvbi0+b3V0UmVzYW1wbGVyKTsKICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIHNlc3Npb24tPmVuYWJsZWRNc2sgfD0gKDEgPDwgcHJvY0lkKTsKICAgICAgICAgaWYgKEhhc1JldmVyc2VTdHJlYW0ocHJvY0lkKSkgewogICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzUmV2ID0gMDsKKyNpZmRlZiBXRUJSVENfTEVHQUNZCiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcmVzZXRfbWVtKHNlc3Npb24tPnJldlJlc2FtcGxlcik7CiAgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgICAgIHNlc3Npb24tPnJldkVuYWJsZWRNc2sgfD0gKDEgPDwgcHJvY0lkKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xMTM2LDggKzE0OTMsOCBAQAogICAgICAgICAgICAgc2Vzc2lvbi0+cmV2RW5hYmxlZE1zayAmPSB+KDEgPDwgcHJvY0lkKTsKICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigiU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZCBwcm9jICVkLCBlbmFibGVkICVkIGVuYWJsZWRNc2sgJTA4eCByZXZFbmFibGVkTXNrICUwOHgiLAotICAgICAgICAgcHJvY0lkLCBlbmFibGVkLCBzZXNzaW9uLT5lbmFibGVkTXNrLCBzZXNzaW9uLT5yZXZFbmFibGVkTXNrKTsKKyAgICBBTE9HVigiU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZCBwcm9jICVkLCBlbmFibGVkICVkIGVuYWJsZWRNc2sgJTA4eCByZXZFbmFibGVkTXNrICUwOHgiLCBwcm9jSWQsCisgICAgICAgICAgZW5hYmxlZCwgc2Vzc2lvbi0+ZW5hYmxlZE1zaywgc2Vzc2lvbi0+cmV2RW5hYmxlZE1zayk7CiAgICAgc2Vzc2lvbi0+cHJvY2Vzc2VkTXNrID0gMDsKICAgICBpZiAoSGFzUmV2ZXJzZVN0cmVhbShwcm9jSWQpKSB7CiAgICAgICAgIHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayA9IDA7CkBAIC0xMTUxLDggKzE1MDgsNyBAQAogc3RhdGljIGludCBzSW5pdFN0YXR1cyA9IDE7CiBzdGF0aWMgcHJlcHJvY19zZXNzaW9uX3Qgc1Nlc3Npb25zW1BSRVBST0NfTlVNX1NFU1NJT05TXTsKIAotcHJlcHJvY19zZXNzaW9uX3QgKlByZVByb2NfR2V0U2Vzc2lvbihpbnQzMl90IHByb2NJZCwgaW50MzJfdCAgc2Vzc2lvbklkLCBpbnQzMl90ICBpb0lkKQoteworcHJlcHJvY19zZXNzaW9uX3QqIFByZVByb2NfR2V0U2Vzc2lvbihpbnQzMl90IHByb2NJZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCkgewogICAgIHNpemVfdCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9TRVNTSU9OUzsgaSsrKSB7CiAgICAgICAgIGlmIChzU2Vzc2lvbnNbaV0uaWQgPT0gc2Vzc2lvbklkKSB7CkBAIC0xMTcyLDcgKzE1MjgsNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi0KIGludCBQcmVQcm9jX0luaXQoKSB7CiAgICAgc2l6ZV90IGk7CiAgICAgaW50IHN0YXR1cyA9IDA7CkBAIC0xMTg3LDggKzE1NDIsNyBAQAogICAgIHJldHVybiBzSW5pdFN0YXR1czsKIH0KIAotY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqUHJlUHJvY19HZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQpCi17Citjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBQcmVQcm9jX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCkgewogICAgIHNpemVfdCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9FRkZFQ1RTOyBpKyspIHsKICAgICAgICAgaWYgKG1lbWNtcCgmc0Rlc2NyaXB0b3JzW2ldLT51dWlkLCB1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKQEAgLTExOTgsMzUgKzE1NTIsMzEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotCiBleHRlcm4gIkMiIHsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAqaW5CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgKm91dEJ1ZmZlcikKLXsKLSAgICBwcmVwcm9jX2VmZmVjdF90ICogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QgKilzZWxmOworaW50IFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QqIG91dEJ1ZmZlcikgeworICAgIHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90KilzZWxmOwogCi0gICAgaWYgKGVmZmVjdCA9PSBOVUxMKXsKKyAgICBpZiAoZWZmZWN0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzKCkgRVJST1IgZWZmZWN0ID09IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgIHByZXByb2Nfc2Vzc2lvbl90ICogc2Vzc2lvbiA9IChwcmVwcm9jX3Nlc3Npb25fdCAqKWVmZmVjdC0+c2Vzc2lvbjsKKyAgICBwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiA9IChwcmVwcm9jX3Nlc3Npb25fdCopZWZmZWN0LT5zZXNzaW9uOwogCi0gICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCAgfHwKLSAgICAgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwpeworICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCB8fCBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcygpIEVSUk9SIGJhZCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHNlc3Npb24tPnByb2Nlc3NlZE1zayB8PSAoMTw8ZWZmZWN0LT5wcm9jSWQpOworICAgIHNlc3Npb24tPnByb2Nlc3NlZE1zayB8PSAoMSA8PCBlZmZlY3QtPnByb2NJZCk7CiAKLS8vICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcyBJbiAlZCBmcmFtZXMgZW5hYmxlZE1zayAlMDh4IHByb2Nlc3NlZE1zayAlMDh4IiwKLS8vICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIHNlc3Npb24tPmVuYWJsZWRNc2ssIHNlc3Npb24tPnByb2Nlc3NlZE1zayk7CisgICAgLy8gICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzIEluICVkIGZyYW1lcyBlbmFibGVkTXNrICUwOHggcHJvY2Vzc2VkTXNrICUwOHgiLAorICAgIC8vICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIHNlc3Npb24tPmVuYWJsZWRNc2ssIHNlc3Npb24tPnByb2Nlc3NlZE1zayk7CiAKICAgICBpZiAoKHNlc3Npb24tPnByb2Nlc3NlZE1zayAmIHNlc3Npb24tPmVuYWJsZWRNc2spID09IHNlc3Npb24tPmVuYWJsZWRNc2spIHsKICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5wcm9jZXNzZWRNc2sgPSAwOwpAQCAtMTIzNywxMiArMTU4NywxMCBAQAogICAgICAgICAgICAgaWYgKG91dEJ1ZmZlci0+ZnJhbWVDb3VudCA8IGZyKSB7CiAgICAgICAgICAgICAgICAgZnIgPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5zMTYsCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+b3V0QnVmLAotICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzT3V0IC0gZnIpICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnMxNiwgc2Vzc2lvbi0+b3V0QnVmLAorICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIG1lbW1vdmUoc2Vzc2lvbi0+b3V0QnVmLCBzZXNzaW9uLT5vdXRCdWYgKyBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgKHNlc3Npb24tPmZyYW1lc091dCAtIGZyKSAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgLT0gZnI7CiAgICAgICAgICAgICBmcmFtZXNXciArPSBmcjsKICAgICAgICAgfQpAQCAtMTI1MiwxNiArMTYwMCwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KIAorI2lmZGVmIFdFQlJUQ19MRUdBQ1kKICAgICAgICAgaWYgKHNlc3Npb24tPmluUmVzYW1wbGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lQ291bnQgLSBzZXNzaW9uLT5mcmFtZXNJbjsKICAgICAgICAgICAgIGlmIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCA8IGZyKSB7CiAgICAgICAgICAgICAgICAgZnIgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pbkJ1ZlNpemUgPCBzZXNzaW9uLT5mcmFtZXNJbiArIGZyKSB7Ci0gICAgICAgICAgICAgICAgaW50MTZfdCAqYnVmOworICAgICAgICAgICAgICAgIGludDE2X3QqIGJ1ZjsKICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZlNpemUgPSBzZXNzaW9uLT5mcmFtZXNJbiArIGZyOwotICAgICAgICAgICAgICAgIGJ1ZiA9IChpbnQxNl90ICopcmVhbGxvYyhzZXNzaW9uLT5pbkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmU2l6ZSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBidWYgPSAoaW50MTZfdCopcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWZTaXplICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUoc2Vzc2lvbi0+aW5CdWYpOwpAQCAtMTI3MCwxNCArMTYyMCwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZiA9IGJ1ZjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5pbkJ1ZiArIHNlc3Npb24tPmZyYW1lc0luICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgaW5CdWZmZXItPnMxNiwKKyAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5pbkJ1ZiArIHNlc3Npb24tPmZyYW1lc0luICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsIGluQnVmZmVyLT5zMTYsCiAgICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAjaWZkZWYgRFVBTF9NSUNfVEVTVAogICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnUGNtRHVtcExvY2spOwogICAgICAgICAgICAgaWYgKGdQY21EdW1wRmggIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZ3cml0ZShpbkJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpLCAxLCBnUGNtRHVtcEZoKTsKKyAgICAgICAgICAgICAgICBmd3JpdGUoaW5CdWZmZXItPnJhdywgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ1BjbUR1bXBGaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1BjbUR1bXBMb2NrKTsKICNlbmRpZgpAQCAtMTI5MCwyMiArMTYzOSwxNCBAQAogICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZySW4gPSBzZXNzaW9uLT5mcmFtZXNJbjsKICAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5pblJlc2FtcGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPmRhdGFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJPdXQpOworICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5pblJlc2FtcGxlciwgMCwgc2Vzc2lvbi0+aW5CdWYsICZmckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPmRhdGFfLCAmZnJPdXQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9pbnQoc2Vzc2lvbi0+aW5SZXNhbXBsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9pbnQoc2Vzc2lvbi0+aW5SZXNhbXBsZXIsIHNlc3Npb24tPmluQnVmLCAmZnJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5kYXRhXywgJmZyT3V0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5pbkJ1ZiwKLSAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZiArIGZySW4gKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzSW4gLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIG1lbW1vdmUoc2Vzc2lvbi0+aW5CdWYsIHNlc3Npb24tPmluQnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzSW4gLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc0luIC09IGZySW47CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZUNvdW50IC0gc2Vzc2lvbi0+ZnJhbWVzSW47CkBAIC0xMzEzLDE0ICsxNjU0LDEzIEBACiAgICAgICAgICAgICAgICAgZnIgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5wcm9jRnJhbWUtPmRhdGFfICsgc2Vzc2lvbi0+ZnJhbWVzSW4gKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+czE2LAotICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5zMTYsIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogCiAjaWZkZWYgRFVBTF9NSUNfVEVTVAogICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnUGNtRHVtcExvY2spOwogICAgICAgICAgICAgaWYgKGdQY21EdW1wRmggIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZ3cml0ZShpbkJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpLCAxLCBnUGNtRHVtcEZoKTsKKyAgICAgICAgICAgICAgICBmd3JpdGUoaW5CdWZmZXItPnJhdywgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ1BjbUR1bXBGaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1BjbUR1bXBMb2NrKTsKICNlbmRpZgpAQCAtMTMzNSwxMiArMTY3NSwzNSBAQAogICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPnNhbXBsZXNfcGVyX2NoYW5uZWxfID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKIAogICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+UHJvY2Vzc1N0cmVhbShzZXNzaW9uLT5wcm9jRnJhbWUpOworI2Vsc2UKKyAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVDb3VudCAtIHNlc3Npb24tPmZyYW1lc0luOworICAgICAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgPCBmcikgeworICAgICAgICAgICAgZnIgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiArPSBmcjsKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPSBmcjsKKyAgICAgICAgaWYgKHNlc3Npb24tPmZyYW1lc0luIDwgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzSW4gPSAwOworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5Qcm9jZXNzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCogY29uc3QpaW5CdWZmZXItPnMxNiwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHdlYnJ0Yzo6U3RyZWFtQ29uZmlnKWVmZmVjdC0+c2Vzc2lvbi0+aW5wdXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB3ZWJydGM6OlN0cmVhbUNvbmZpZyllZmZlY3QtPnNlc3Npb24tPm91dHB1dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgKGludDE2X3QqIGNvbnN0KW91dEJ1ZmZlci0+czE2KTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiUHJvY2VzcyBTdHJlYW0gZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGluQnVmZmVyLT5mcmFtZUNvdW50OworI2VuZGlmCiAKICAgICAgICAgaWYgKHNlc3Npb24tPm91dEJ1ZlNpemUgPCBzZXNzaW9uLT5mcmFtZXNPdXQgKyBzZXNzaW9uLT5mcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICBpbnQxNl90ICpidWY7CisgICAgICAgICAgICBpbnQxNl90KiBidWY7CiAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWZTaXplID0gc2Vzc2lvbi0+ZnJhbWVzT3V0ICsgc2Vzc2lvbi0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIGJ1ZiA9IChpbnQxNl90ICopcmVhbGxvYyhzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZlNpemUgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgYnVmID0gKGludDE2X3QqKXJlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmU2l6ZSAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgPSAwOwogICAgICAgICAgICAgICAgIGZyZWUoc2Vzc2lvbi0+b3V0QnVmKTsKQEAgLTEzNTAsMjIgKzE3MTMsMTggQEAKICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiA9IGJ1ZjsKICAgICAgICAgfQogCisjaWZkZWYgV0VCUlRDX0xFR0FDWQogICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIHNweF91aW50MzJfdCBmckluID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKICAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5vdXRSZXNhbXBsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgc2Vzc2lvbi0+ZnJhbWVzT3V0ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRSZXNhbXBsZXIsIDAsIHNlc3Npb24tPnByb2NGcmFtZS0+ZGF0YV8sICZmckluLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgc2Vzc2lvbi0+ZnJhbWVzT3V0ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LCAmZnJPdXQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9pbnQoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgc2Vzc2lvbi0+ZnJhbWVzT3V0ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9pbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRSZXNhbXBsZXIsIHNlc3Npb24tPnByb2NGcmFtZS0+ZGF0YV8sICZmckluLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgc2Vzc2lvbi0+ZnJhbWVzT3V0ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LCAmZnJPdXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0ICs9IGZyT3V0OwogICAgICAgICB9IGVsc2UgewpAQCAtMTM3NSwxNSArMTczNCwxNiBAQAogICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0ICs9IHNlc3Npb24tPmZyYW1lQ291bnQ7CiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVzT3V0OworI2Vsc2UKKyAgICAgICAgZnIgPSBzZXNzaW9uLT5mcmFtZXNPdXQ7CisjZW5kaWYKICAgICAgICAgaWYgKGZyYW1lc1JxIC0gZnJhbWVzV3IgPCBmcikgewogICAgICAgICAgICAgZnIgPSBmcmFtZXNScSAtIGZyYW1lc1dyOwogICAgICAgICB9Ci0gICAgICAgIG1lbWNweShvdXRCdWZmZXItPnMxNiArIGZyYW1lc1dyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgbWVtY3B5KHNlc3Npb24tPm91dEJ1ZiwKLSAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNPdXQgLSBmcikgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5zMTYgKyBmcmFtZXNXciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwgc2Vzc2lvbi0+b3V0QnVmLAorICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBtZW1tb3ZlKHNlc3Npb24tPm91dEJ1Ziwgc2Vzc2lvbi0+b3V0QnVmICsgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgKHNlc3Npb24tPmZyYW1lc091dCAtIGZyKSAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIHNlc3Npb24tPmZyYW1lc091dCAtPSBmcjsKICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICs9IGZyOwogCkBAIC0xMzkzLDM5ICsxNzUzLDMyIEBACiAgICAgfQogfQogCi1pbnQgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90ICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBSZXBseURhdGEpCi17Ci0gICAgcHJlcHJvY19lZmZlY3RfdCAqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90ICopIHNlbGY7CitpbnQgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcENtZERhdGEsIHVpbnQzMl90KiByZXBseVNpemUsIHZvaWQqIHBSZXBseURhdGEpIHsKKyAgICBwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCopc2VsZjsKIAotICAgIGlmIChlZmZlY3QgPT0gTlVMTCl7CisgICAgaWYgKGVmZmVjdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kOiBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworICAgIC8vIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZDogY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKIAotICAgIHN3aXRjaCAoY21kQ29kZSl7CisgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgotICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5pbml0KSB7CiAgICAgICAgICAgICAgICAgZWZmZWN0LT5vcHMtPmluaXQoZWZmZWN0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0NPTkZJRzogewotICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgID09IE5VTEx8fAotICAgICAgICAgICAgICAgIGNtZFNpemUgICAgICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpfHwKLSAgICAgICAgICAgICAgICBwUmVwbHlEYXRhICA9PSBOVUxMfHwKLSAgICAgICAgICAgICAgICAqcmVwbHlTaXplICAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUc6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAjaWZkZWYgRFVBTF9NSUNfVEVTVApAQCAtMTQzNiw1NSArMTc4OSw1MSBAQAogICAgICAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+ZW5hYmxlZE1zayA9IDA7CiAgICAgICAgICAgICB9CiAjZW5kaWYKLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IFNlc3Npb25fU2V0Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwgKGVmZmVjdF9jb25maWdfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gU2Vzc2lvbl9TZXRDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190KilwQ21kRGF0YSk7CiAjaWZkZWYgRFVBTF9NSUNfVEVTVAogICAgICAgICAgICAgaWYgKGdEdWFsTWljRW5hYmxlZCkgewogICAgICAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+ZW5hYmxlZE1zayA9IGVuYWJsZWRNc2s7CiAgICAgICAgICAgICB9CiAjZW5kaWYKLSAgICAgICAgICAgIGlmICgqKGludCAqKXBSZXBseURhdGEgIT0gMCkgeworICAgICAgICAgICAgaWYgKCooaW50KilwUmVwbHlEYXRhICE9IDApIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlZmZlY3QtPnN0YXRlICE9IFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRyk7CisgICAgICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUcpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX0NPTkZJRzoKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpKSB7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9DT05GSUc6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0NPTkZJRzogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU2Vzc2lvbl9HZXRDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190ICopcFJlcGx5RGF0YSk7CisgICAgICAgICAgICBTZXNzaW9uX0dldENvbmZpZyhlZmZlY3QtPnNlc3Npb24sIChlZmZlY3RfY29uZmlnX3QqKXBSZXBseURhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRToKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IFNlc3Npb25fU2V0UmV2ZXJzZUNvbmZpZyhlZmZlY3QtPnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9jb25maWdfdCAqKXBDbWREYXRhKTsKLSAgICAgICAgICAgIGlmICgqKGludCAqKXBSZXBseURhdGEgIT0gMCkgeworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPQorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uX1NldFJldmVyc2VDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190KilwQ21kRGF0YSk7CisgICAgICAgICAgICBpZiAoKihpbnQqKXBSZXBseURhdGEgIT0gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRToKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpKXsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0U6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uX0dldFJldmVyc2VDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190ICopcENtZERhdGEpOworICAgICAgICAgICAgU2Vzc2lvbl9HZXRSZXZlcnNlQ29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwgKGVmZmVjdF9jb25maWdfdCopcENtZERhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1JFU0VUOgpAQCAtMTQ5NCw4MCArMTg0Myw3NCBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTTogewotICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKIAogICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpeworICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSk7CiAKLSAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCopcFJlcGx5RGF0YTsKIAogICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKIAogICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gZWZmZWN0LT5vcHMtPmdldF9wYXJhbWV0ZXIoZWZmZWN0LCBwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKGVmZmVjdCwgcC0+ZGF0YSwgJnAtPnZzaXplLCBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTp7Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTHx8Ci0gICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBDbWREYXRhOwogCi0gICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKXsKKyAgICAgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SLCBwc2l6ZSBpcyBub3Qgc2l6ZW9mKGludDMyX3QpIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5zZXRfcGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gZWZmZWN0LT5vcHMtPnNldF9wYXJhbWV0ZXIoZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5zZXRfcGFyYW1ldGVyKGVmZmVjdCwgKHZvaWQqKXAtPmRhdGEsIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRSk7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgID0gRWZmZWN0X1NldFN0YXRlKGVmZmVjdCwgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gRWZmZWN0X1NldFN0YXRlKGVmZmVjdCwgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0lOUFVUX0RFVklDRToKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgY21kU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChlZmZlY3QtPm9wcy0+c2V0X2RldmljZSkgewotICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5zZXRfZGV2aWNlKGVmZmVjdCwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+c2V0X2RldmljZShlZmZlY3QsICoodWludDMyX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xNTc4LDMwICsxOTIxLDMwIEBACiAjaWZkZWYgRFVBTF9NSUNfVEVTVAogICAgICAgICAvLy8vLyB0ZXN0IGNvbW1hbmRzIHN0YXJ0CiAgICAgICAgIGNhc2UgUFJFUFJPQ19DTURfRFVBTF9NSUNfRU5BQkxFOiB7Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTHx8IGNtZFNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJQUkVQUk9DX0NNRF9EVUFMX01JQ19FTkFCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIlBSRVBST0NfQ01EX0RVQUxfTUlDX0VOQUJMRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdEdWFsTWljRW5hYmxlZCA9ICooYm9vbCAqKXBDbWREYXRhOworICAgICAgICAgICAgZ0R1YWxNaWNFbmFibGVkID0gKihib29sKilwQ21kRGF0YTsKICAgICAgICAgICAgIGlmIChnRHVhbE1pY0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICBlZmZlY3QtPmF1eF9jaGFubmVsc19vbiA9IHNIYXNBdXhDaGFubmVsc1tlZmZlY3QtPnByb2NJZF07CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uID0gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZyA9IChlZmZlY3QtPnNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9DRkdfTU9OTyA6IENIQU5ORUxfQ0ZHX1NURVJFTzsKKyAgICAgICAgICAgIGVmZmVjdC0+Y3VyX2NoYW5uZWxfY29uZmlnID0KKyAgICAgICAgICAgICAgICAgICAgKGVmZmVjdC0+c2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgPyBDSEFOTkVMX0NGR19NT05PIDogQ0hBTk5FTF9DRkdfU1RFUkVPOwogCiAgICAgICAgICAgICBBTE9HVigiUFJFUFJPQ19DTURfRFVBTF9NSUNfRU5BQkxFOiAlcyIsIGdEdWFsTWljRW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQ6IHsKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIlBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJUOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQpAQCAtMTYxMCwyMCArMTk1MywxOSBAQAogICAgICAgICAgICAgICAgIGZjbG9zZShnUGNtRHVtcEZoKTsKICAgICAgICAgICAgICAgICBnUGNtRHVtcEZoID0gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYXIgKnBhdGggPSBzdHJuZHVwKChjaGFyICopcENtZERhdGEsIGNtZFNpemUpOwotICAgICAgICAgICAgZ1BjbUR1bXBGaCA9IGZvcGVuKChjaGFyICopcGF0aCwgIndiIik7CisgICAgICAgICAgICBjaGFyKiBwYXRoID0gc3RybmR1cCgoY2hhciopcENtZERhdGEsIGNtZFNpemUpOworICAgICAgICAgICAgZ1BjbUR1bXBGaCA9IGZvcGVuKChjaGFyKilwYXRoLCAid2IiKTsKICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnUGNtRHVtcExvY2spOwotICAgICAgICAgICAgQUxPR1YoIlBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJUOiBwYXRoICVzIGdQY21EdW1wRmggJXAiLAotICAgICAgICAgICAgICAgICAgcGF0aCwgZ1BjbUR1bXBGaCk7CisgICAgICAgICAgICBBTE9HVigiUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQ6IHBhdGggJXMgZ1BjbUR1bXBGaCAlcCIsIHBhdGgsIGdQY21EdW1wRmgpOwogICAgICAgICAgICAgQUxPR0VfSUYoZ1BjbUR1bXBGaCA8PSAwLCAiZ1BjbUR1bXBGaCBvcGVuIGVycm9yICVkICVzIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICBmcmVlKHBhdGgpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RPUDogewogICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVE9QOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVE9QOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQpAQCAtMTYzNSwxMTggKzE5NzcsMTE2IEBACiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1BjbUR1bXBMb2NrKTsKICAgICAgICAgICAgIEFMT0dWKCJQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVE9QIik7CiAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOwotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgLy8vLy8gdGVzdCBjb21tYW5kcyBlbmQKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIC8vLy8vIHRlc3QgY29tbWFuZHMgZW5kCiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX1NVUFBPUlRFRF9DT05GSUdTOiB7Ci0gICAgICAgICAgICBpZighZ0R1YWxNaWNFbmFibGVkKSB7CisgICAgICAgICAgICBpZiAoIWdEdWFsTWljRW5hYmxlZCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEx8fCBjbWRTaXplICE9IDIgKiBzaXplb2YodWludDMyX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSAyICogc2l6ZW9mKHVpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX1NVUFBPUlRFRF9DT05GSUdTOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX1NVUFBPUlRFRF9DT05GSUdTOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCoodWludDMyX3QgKilwQ21kRGF0YSAhPSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgfHwKLSAgICAgICAgICAgICAgICAgICFlZmZlY3QtPmF1eF9jaGFubmVsc19vbikgeworICAgICAgICAgICAgaWYgKCoodWludDMyX3QqKXBDbWREYXRhICE9IEVGRkVDVF9GRUFUVVJFX0FVWF9DSEFOTkVMUyB8fCAhZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgZmVhdHVyZSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgbm90IHN1cHBvcnRlZCBieSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZnggJWQiLCBlZmZlY3QtPnByb2NJZCk7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAtRU5PU1lTOworICAgICAgICAgICAgICAgICAgICAgICIgZnggJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+cHJvY0lkKTsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilwUmVwbHlEYXRhID0gLUVOT1NZUzsKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBudW1fY29uZmlncyA9ICooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKTsKLSAgICAgICAgICAgIGlmICgqcmVwbHlTaXplIDwgKDIgKiBzaXplb2YodWludDMyX3QpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb25maWdzICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSkgeworICAgICAgICAgICAgc2l6ZV90IG51bV9jb25maWdzID0gKigodWludDMyX3QqKXBDbWREYXRhICsgMSk7CisgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA8ICgyICogc2l6ZW9mKHVpbnQzMl90KSArIG51bV9jb25maWdzICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSkgewogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAxKSA9IENIQU5ORUxfQ0ZHX0NOVDsKKyAgICAgICAgICAgICooKHVpbnQzMl90KilwUmVwbHlEYXRhICsgMSkgPSBDSEFOTkVMX0NGR19DTlQ7CiAgICAgICAgICAgICBpZiAobnVtX2NvbmZpZ3MgPCBDSEFOTkVMX0NGR19DTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8ICgyICogc2l6ZW9mKHVpbnQzMl90KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9DRkdfQ05UICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSkgewotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKDIgKiBzaXplb2YodWludDMyX3QpICsgQ0hBTk5FTF9DRkdfQ05UICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSkgeworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAtRU5PTUVNOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBudW1fY29uZmlncyA9IENIQU5ORUxfQ0ZHX0NOVDsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopcFJlcGx5RGF0YSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9TVVBQT1JURURfQ09ORklHUyBudW0gY29uZmlnICVkIiwKICAgICAgICAgICAgICAgICAgIG51bV9jb25maWdzKTsKIAogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IDIgKiBzaXplb2YodWludDMyX3QpICsgbnVtX2NvbmZpZ3MgKiBzaXplb2YoY2hhbm5lbF9jb25maWdfdCk7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAxKSA9IG51bV9jb25maWdzOwotICAgICAgICAgICAgbWVtY3B5KCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAyLCAmc0R1YWxNaWNDb25maWdzLCBudW1fY29uZmlncyAqIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgKigodWludDMyX3QqKXBSZXBseURhdGEgKyAxKSA9IG51bV9jb25maWdzOworICAgICAgICAgICAgbWVtY3B5KCh1aW50MzJfdCopcFJlcGx5RGF0YSArIDIsICZzRHVhbE1pY0NvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgbnVtX2NvbmZpZ3MgKiBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHOgotICAgICAgICAgICAgaWYoIWdEdWFsTWljRW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKCFnRHVhbE1pY0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMfHwgY21kU2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgPCBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX0NPTkZJRzogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgqKHVpbnQzMl90ICopcENtZERhdGEgIT0gRUZGRUNUX0ZFQVRVUkVfQVVYX0NIQU5ORUxTIHx8ICFlZmZlY3QtPmF1eF9jaGFubmVsc19vbikgewotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gLUVOT1NZUzsKKyAgICAgICAgICAgIGlmICgqKHVpbnQzMl90KilwQ21kRGF0YSAhPSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgfHwgIWVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKSB7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopcFJlcGx5RGF0YSA9IC1FTk9TWVM7CiAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9DT05GSUciKTsKLSAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YoY2hhbm5lbF9jb25maWdfdCk7Ci0gICAgICAgICAgICBtZW1jcHkoKHVpbnQzMl90ICopcFJlcGx5RGF0YSArIDEsCi0gICAgICAgICAgICAgICAgICAgJnNEdWFsTWljQ29uZmlnc1tlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZ10sCisgICAgICAgICAgICBtZW1jcHkoKHVpbnQzMl90KilwUmVwbHlEYXRhICsgMSwgJnNEdWFsTWljQ29uZmlnc1tlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZ10sCiAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHOiB7CiAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUc6ICIKLSAgICAgICAgICAgICAgICAgICAgImdEdWFsTWljRW5hYmxlZCAlZCBlZmZlY3QtPmF1eF9jaGFubmVsc19vbiAlZCIsCisgICAgICAgICAgICAgICAgICAiZ0R1YWxNaWNFbmFibGVkICVkIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uICVkIiwKICAgICAgICAgICAgICAgICAgIGdEdWFsTWljRW5hYmxlZCwgZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pOwotICAgICAgICAgICAgaWYoIWdEdWFsTWljRW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKCFnRHVhbE1pY0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMfHwgY21kU2l6ZSAhPSAoc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSB8fAorICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRzogRVJST1JcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJwQ21kRGF0YSAlcCBjbWRTaXplICVkIHBSZXBseURhdGEgJXAgcmVwbHlTaXplICVwICpyZXBseVNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcENtZERhdGEsIGNtZFNpemUsIHBSZXBseURhdGEsIHJlcGx5U2l6ZSwgcmVwbHlTaXplID8gKnJlcGx5U2l6ZSA6IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUc6IEVSUk9SXG4iCisgICAgICAgICAgICAgICAgICAgICAgInBDbWREYXRhICVwIGNtZFNpemUgJWQgcFJlcGx5RGF0YSAlcCByZXBseVNpemUgJXAgKnJlcGx5U2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgcENtZERhdGEsIGNtZFNpemUsIHBSZXBseURhdGEsIHJlcGx5U2l6ZSwgcmVwbHlTaXplID8gKnJlcGx5U2l6ZSA6IC0xKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICAgICAgaWYgKCoodWludDMyX3QgKilwQ21kRGF0YSAhPSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgfHwgIWVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKSB7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAtRU5PU1lTOworICAgICAgICAgICAgaWYgKCoodWludDMyX3QqKXBDbWREYXRhICE9IEVGRkVDVF9GRUFUVVJFX0FVWF9DSEFOTkVMUyB8fCAhZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pIHsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilwUmVwbHlEYXRhID0gLUVOT1NZUzsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHOiBFUlJPUlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbWREYXRhICVkIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcENtZERhdGEsIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUc6IEVSUk9SXG4iCisgICAgICAgICAgICAgICAgICAgICAgIkNtZERhdGEgJWQgZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBDbWREYXRhLCBlZmZlY3QtPmF1eF9jaGFubmVsc19vbik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzaXplX3QgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDSEFOTkVMX0NGR19DTlQ7aSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgodWludDMyX3QgKilwQ21kRGF0YSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmc0R1YWxNaWNDb25maWdzW2ldLCBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDSEFOTkVMX0NGR19DTlQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoKHVpbnQzMl90KilwQ21kRGF0YSArIDEsICZzRHVhbE1pY0NvbmZpZ3NbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGkgPT0gQ0hBTk5FTF9DRkdfQ05UKSB7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIEFMT0dXKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRyBpbnZhbGlkIGNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICJbJTA4eF0uWyUwOHhdIiwgKigodWludDMyX3QgKilwQ21kRGF0YSArIDEpLCAqKCh1aW50MzJfdCAqKXBDbWREYXRhICsgMikpOworICAgICAgICAgICAgICAgICAgICAgICJbJTA4eF0uWyUwOHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopcENtZERhdGEgKyAxKSwgKigodWludDMyX3QqKXBDbWREYXRhICsgMikpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZyA9IGk7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRyBOZXcgY29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgIlslMDh4XS5bJTA4eF0iLCBzRHVhbE1pY0NvbmZpZ3NbaV0ubWFpbl9jaGFubmVscywgc0R1YWxNaWNDb25maWdzW2ldLmF1eF9jaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgIlslMDh4XS5bJTA4eF0iLAorICAgICAgICAgICAgICAgICAgICAgIHNEdWFsTWljQ29uZmlnc1tpXS5tYWluX2NoYW5uZWxzLCBzRHVhbE1pY0NvbmZpZ3NbaV0uYXV4X2NoYW5uZWxzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH0gYnJlYWs7CiAjZW5kaWYKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTc1NCwxMSArMjA5NCw4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLQotaW50IFByZVByb2Nlc3NpbmdGeF9HZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCi17Ci0gICAgcHJlcHJvY19lZmZlY3RfdCAqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90ICopIHNlbGY7CitpbnQgUHJlUHJvY2Vzc2luZ0Z4X0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CisgICAgcHJlcHJvY19lZmZlY3RfdCogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QqKXNlbGY7CiAKICAgICBpZiAoZWZmZWN0ID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE3NjksNDEgKzIxMDYsNDEgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZShlZmZlY3RfaGFuZGxlX3QgICAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgKm91dEJ1ZmZlciBfX3VudXNlZCkKLXsKLSAgICBwcmVwcm9jX2VmZmVjdF90ICogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QgKilzZWxmOworaW50IFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZShlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QqIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCogb3V0QnVmZmVyIF9fdW51c2VkKSB7CisgICAgcHJlcHJvY19lZmZlY3RfdCogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QqKXNlbGY7CiAKLSAgICBpZiAoZWZmZWN0ID09IE5VTEwpeworICAgIGlmIChlZmZlY3QgPT0gTlVMTCkgewogICAgICAgICBBTE9HVygiUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3NSZXZlcnNlKCkgRVJST1IgZWZmZWN0ID09IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgIHByZXByb2Nfc2Vzc2lvbl90ICogc2Vzc2lvbiA9IChwcmVwcm9jX3Nlc3Npb25fdCAqKWVmZmVjdC0+c2Vzc2lvbjsKKyAgICBwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiA9IChwcmVwcm9jX3Nlc3Npb25fdCopZWZmZWN0LT5zZXNzaW9uOwogCi0gICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCl7CisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UoKSBFUlJPUiBiYWQgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgfD0gKDE8PGVmZmVjdC0+cHJvY0lkKTsKKyAgICBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgfD0gKDEgPDwgZWZmZWN0LT5wcm9jSWQpOwogCi0vLyAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3NSZXZlcnNlIEluICVkIGZyYW1lcyByZXZFbmFibGVkTXNrICUwOHggcmV2UHJvY2Vzc2VkTXNrICUwOHgiLAotLy8gICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCwgc2Vzc2lvbi0+cmV2RW5hYmxlZE1zaywgc2Vzc2lvbi0+cmV2UHJvY2Vzc2VkTXNrKTsKLQorICAgIC8vICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UgSW4gJWQgZnJhbWVzIHJldkVuYWJsZWRNc2sgJTA4eCByZXZQcm9jZXNzZWRNc2sKKyAgICAvLyAgICAlMDh4IiwKKyAgICAvLyAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50LCBzZXNzaW9uLT5yZXZFbmFibGVkTXNrLCBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2spOwogCiAgICAgaWYgKChzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgJiBzZXNzaW9uLT5yZXZFbmFibGVkTXNrKSA9PSBzZXNzaW9uLT5yZXZFbmFibGVkTXNrKSB7CiAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+cmV2UHJvY2Vzc2VkTXNrID0gMDsKKyNpZmRlZiBXRUJSVENfTEVHQUNZCiAgICAgICAgIGlmIChzZXNzaW9uLT5yZXZSZXNhbXBsZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVDb3VudCAtIHNlc3Npb24tPmZyYW1lc1JldjsKICAgICAgICAgICAgIGlmIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCA8IGZyKSB7CiAgICAgICAgICAgICAgICAgZnIgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5yZXZCdWZTaXplIDwgc2Vzc2lvbi0+ZnJhbWVzUmV2ICsgZnIpIHsKLSAgICAgICAgICAgICAgICBpbnQxNl90ICpidWY7CisgICAgICAgICAgICAgICAgaW50MTZfdCogYnVmOwogICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZlNpemUgPSBzZXNzaW9uLT5mcmFtZXNSZXYgKyBmcjsKLSAgICAgICAgICAgICAgICBidWYgPSAoaW50MTZfdCAqKXJlYWxsb2Moc2Vzc2lvbi0+cmV2QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmU2l6ZSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBidWYgPSAoaW50MTZfdCopcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZlNpemUgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUoc2Vzc2lvbi0+cmV2QnVmKTsKQEAgLTE4MTIsOCArMjE0OSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiA9IGJ1ZjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZCdWYgKyBzZXNzaW9uLT5mcmFtZXNSZXYgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+czE2LAorICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPnJldkJ1ZiArIHNlc3Npb24tPmZyYW1lc1JldiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LCBpbkJ1ZmZlci0+czE2LAogICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogCiAgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNSZXYgKz0gZnI7CkBAIC0xODI0LDIyICsyMTYwLDE0IEBACiAgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc1JldjsKICAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5yZXZSZXNhbXBsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnQoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyLCAwLCBzZXNzaW9uLT5yZXZCdWYsICZmckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+ZGF0YV8sICZmck91dCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludGVybGVhdmVkX2ludChzZXNzaW9uLT5yZXZSZXNhbXBsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9pbnQoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyLCBzZXNzaW9uLT5yZXZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLCBzZXNzaW9uLT5yZXZGcmFtZS0+ZGF0YV8sICZmck91dCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+cmV2QnVmLAotICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiArIGZySW4gKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzUmV2IC0gZnJJbikgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICBtZW1tb3ZlKHNlc3Npb24tPnJldkJ1Ziwgc2Vzc2lvbi0+cmV2QnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzUmV2IC0gZnJJbikgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNSZXYgLT0gZnJJbjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lQ291bnQgLSBzZXNzaW9uLT5mcmFtZXNSZXY7CkBAIC0xODQ3LDggKzIxNzUsNyBAQAogICAgICAgICAgICAgICAgIGZyID0gaW5CdWZmZXItPmZyYW1lQ291bnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+cmV2RnJhbWUtPmRhdGFfICsgc2Vzc2lvbi0+ZnJhbWVzUmV2ICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgaW5CdWZmZXItPnMxNiwKLSAgICAgICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+czE2LCBmciAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiArPSBmcjsKICAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnI7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+ZnJhbWVzUmV2IDwgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgewpAQCAtMTg1OCw0OCArMjE4NSw1OCBAQAogICAgICAgICB9CiAgICAgICAgIHNlc3Npb24tPnJldkZyYW1lLT5zYW1wbGVzX3Blcl9jaGFubmVsXyA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BbmFseXplUmV2ZXJzZVN0cmVhbShzZXNzaW9uLT5yZXZGcmFtZSk7CisjZWxzZQorICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZUNvdW50IC0gc2Vzc2lvbi0+ZnJhbWVzUmV2OworICAgICAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgPCBmcikgeworICAgICAgICAgICAgZnIgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLT5mcmFtZXNSZXYgKz0gZnI7CisgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnI7CisgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNSZXYgPCBzZXNzaW9uLT5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLT5mcmFtZXNSZXYgPSAwOworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5Qcm9jZXNzUmV2ZXJzZVN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QqIGNvbnN0KWluQnVmZmVyLT5zMTYsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB3ZWJydGM6OlN0cmVhbUNvbmZpZyllZmZlY3QtPnNlc3Npb24tPnJldkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHdlYnJ0Yzo6U3RyZWFtQ29uZmlnKWVmZmVjdC0+c2Vzc2lvbi0+cmV2Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCogY29uc3Qpb3V0QnVmZmVyLT5zMTYpOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJQcm9jZXNzIFJldmVyc2UgU3RyZWFtIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIHJldHVybiAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiAtRU5PREFUQTsKICAgICB9CiB9CiAKLQogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZWZmZWN0CiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHNFZmZlY3RJbnRlcmZhY2UgPSB7Ci0gICAgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MsCi0gICAgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQsCi0gICAgUHJlUHJvY2Vzc2luZ0Z4X0dldERlc2NyaXB0b3IsCi0gICAgTlVMTAotfTsKKyAgICAgICAgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MsIFByZVByb2Nlc3NpbmdGeF9Db21tYW5kLCBQcmVQcm9jZXNzaW5nRnhfR2V0RGVzY3JpcHRvciwgTlVMTH07CiAKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3Mgc0VmZmVjdEludGVyZmFjZVJldmVyc2UgPSB7Ci0gICAgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MsCi0gICAgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQsCi0gICAgUHJlUHJvY2Vzc2luZ0Z4X0dldERlc2NyaXB0b3IsCi0gICAgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3NSZXZlcnNlCi19OworICAgICAgICBQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcywgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQsIFByZVByb2Nlc3NpbmdGeF9HZXREZXNjcmlwdG9yLAorICAgICAgICBQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2V9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgUHJlUHJvY2Vzc2luZ0xpYl9DcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEludGVyZmFjZSkKLXsKK2ludCBQcmVQcm9jZXNzaW5nTGliX0NyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCogcEludGVyZmFjZSkgewogICAgIEFMT0dWKCJFZmZlY3RDcmVhdGU6IHV1aWQ6ICUwOHggc2Vzc2lvbiAlZCBJTzogJWQiLCB1dWlkLT50aW1lTG93LCBzZXNzaW9uSWQsIGlvSWQpOwogCiAgICAgaW50IHN0YXR1czsKLSAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjOwotICAgIHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2M7CisgICAgcHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb247CiAgICAgdWludDMyX3QgcHJvY0lkOwogCiAgICAgaWYgKFByZVByb2NfSW5pdCgpICE9IDApIHsKICAgICAgICAgcmV0dXJuIHNJbml0U3RhdHVzOwogICAgIH0KLSAgICBkZXNjID0gIFByZVByb2NfR2V0RGVzY3JpcHRvcih1dWlkKTsKKyAgICBkZXNjID0gUHJlUHJvY19HZXREZXNjcmlwdG9yKHV1aWQpOwogICAgIGlmIChkZXNjID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coIkVmZmVjdENyZWF0ZTogZnggbm90IGZvdW5kIHV1aWQ6ICUwOHgiLCB1dWlkLT50aW1lTG93KTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTIwLDE0ICsyMjU3LDEzIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IFByZVByb2Nlc3NpbmdMaWJfUmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlKQoteworaW50IFByZVByb2Nlc3NpbmdMaWJfUmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlKSB7CiAgICAgQUxPR1YoIkVmZmVjdFJlbGVhc2Ugc3RhcnQgJXAiLCBpbnRlcmZhY2UpOwogICAgIGlmIChQcmVQcm9jX0luaXQoKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBzSW5pdFN0YXR1czsKICAgICB9CiAKLSAgICBwcmVwcm9jX2VmZmVjdF90ICpmeCA9IChwcmVwcm9jX2VmZmVjdF90ICopaW50ZXJmYWNlOworICAgIHByZXByb2NfZWZmZWN0X3QqIGZ4ID0gKHByZXByb2NfZWZmZWN0X3QqKWludGVyZmFjZTsKIAogICAgIGlmIChmeC0+c2Vzc2lvbi0+aWQgPT0gMCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE5MzUsMTcgKzIyNzEsMTUgQEAKICAgICByZXR1cm4gU2Vzc2lvbl9SZWxlYXNlRWZmZWN0KGZ4LT5zZXNzaW9uLCBmeCk7CiB9CiAKLWludCBQcmVQcm9jZXNzaW5nTGliX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLQotICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CitpbnQgUHJlUHJvY2Vzc2luZ0xpYl9HZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MgPSBQcmVQcm9jX0dldERlc2NyaXB0b3IodXVpZCk7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCogZGVzYyA9IFByZVByb2NfR2V0RGVzY3JpcHRvcih1dWlkKTsKICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nTGliX0dldERlc2NyaXB0b3IoKSBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuICAtRUlOVkFMOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0xpYl9HZXREZXNjcmlwdG9yKCkgZ290IGZ4ICVzIiwgZGVzYy0+bmFtZSk7CkBAIC0xOTU1LDE1ICsyMjg5LDEzIEBACiB9CiAKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKLV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLWF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7Ci0gICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKLSAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAotICAgIC5uYW1lID0gIkF1ZGlvIFByZXByb2Nlc3NpbmcgTGlicmFyeSIsCi0gICAgLmltcGxlbWVudG9yID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgIC5jcmVhdGVfZWZmZWN0ID0gUHJlUHJvY2Vzc2luZ0xpYl9DcmVhdGUsCi0gICAgLnJlbGVhc2VfZWZmZWN0ID0gUHJlUHJvY2Vzc2luZ0xpYl9SZWxlYXNlLAotICAgIC5nZXRfZGVzY3JpcHRvciA9IFByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcgotfTsKK19fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgICAgIC5uYW1lID0gIkF1ZGlvIFByZXByb2Nlc3NpbmcgTGlicmFyeSIsCisgICAgICAgIC5pbXBsZW1lbnRvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICAgICAgLmNyZWF0ZV9lZmZlY3QgPSBQcmVQcm9jZXNzaW5nTGliX0NyZWF0ZSwKKyAgICAgICAgLnJlbGVhc2VfZWZmZWN0ID0gUHJlUHJvY2Vzc2luZ0xpYl9SZWxlYXNlLAorICAgICAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBQcmVQcm9jZXNzaW5nTGliX0dldERlc2NyaXB0b3J9OwogCi19OyAvLyBleHRlcm4gIkMiCit9OyAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL2JlbmNobWFya3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwODI5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorY2NfYmVuY2htYXJrIHsKKyAgICBuYW1lOiAicHJlcHJvY2Vzc2luZ19sZWdhY3lfYmVuY2htYXJrIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisgICAgc3JjczogWyJwcmVwcm9jZXNzaW5nX2JlbmNobWFyay5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wcmVwcm9jZXNzaW5nX2xlZ2FjeSIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ3ZWJydGNfYXVkaW9fcHJlcHJvY2Vzc2luZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EV0VCUlRDX1BPU0lYIiwKKyAgICAgICAgIi1EV0VCUlRDX0xFR0FDWSIsCisgICAgICAgICItZnZpc2liaWxpdHk9ZGVmYXVsdCIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYndlYnJ0Y19hYnNsX2hlYWRlcnMiLAorICAgIF0sCit9CisKK2NjX2JlbmNobWFyayB7CisgICAgbmFtZTogInByZXByb2Nlc3NpbmdfYmVuY2htYXJrIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisgICAgc3JjczogWyJwcmVwcm9jZXNzaW5nX2JlbmNobWFyay5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wcmVwcm9jZXNzaW5nIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURXRUJSVENfUE9TSVgiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWRlZmF1bHQiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ3ZWJydGNfYWJzbF9oZWFkZXJzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL2JlbmNobWFya3MvcHJlcHJvY2Vzc2luZ19iZW5jaG1hcmsuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL2JlbmNobWFya3MvcHJlcHJvY2Vzc2luZ19iZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMGFkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvYmVuY2htYXJrcy9wcmVwcm9jZXNzaW5nX2JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBIHRlc3QgcmVzdWx0IHJ1bm5pbmcgb24gUGl4ZWwgMyBmb3IgY29tcGFyaXNvbi4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBjaGFubmVsIG1hc2sgaW5kZXguCisgKiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGVmZmVjdCBpbmRleC4KKyAqIDA6IEF1dG9tYXRpYyBHYWluIENvbnRyb2wsCisgKiAxOiBBY291c3RpYyBFY2hvIENhbmNlbGVyLAorICogMjogTm9pc2UgU3VwcHJlc3NvciwKKyAqIDM6IEF1dG9tYXRpYyBHYWluIENvbnRyb2wgMgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCZW5jaG1hcmsgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgIENQVSAgIEl0ZXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQk1fUFJFUFJPQ0VTU0lORy8xLzAgICAgICA1OTgzNiBucyAgICAgICAgNTk2NTUgbnMgICAgICAgIDExNzMyCisgKiBCTV9QUkVQUk9DRVNTSU5HLzEvMSAgICAgIDY2ODQ4IG5zICAgICAgICA2NjY0MiBucyAgICAgICAgMTA1NTQKKyAqIEJNX1BSRVBST0NFU1NJTkcvMS8yICAgICAgMjA3MjYgbnMgICAgICAgIDIwNjU1IG5zICAgICAgICAzMzgyMgorICogQk1fUFJFUFJPQ0VTU0lORy8xLzMgICAgICAgNTA5MyBucyAgICAgICAgIDUwNzYgbnMgICAgICAgMTM3ODk3CisgKiBCTV9QUkVQUk9DRVNTSU5HLzIvMCAgICAgMTE3MDQwIG5zICAgICAgIDExNjY3MCBucyAgICAgICAgIDU5OTYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMi8xICAgICAxMjA2MDAgbnMgICAgICAgMTIwMjI1IG5zICAgICAgICAgNTg0NQorICogQk1fUFJFUFJPQ0VTU0lORy8yLzIgICAgICAzODQ2MCBucyAgICAgICAgMzgzMzAgbnMgICAgICAgIDE4MTkwCisgKiBCTV9QUkVQUk9DRVNTSU5HLzIvMyAgICAgICA2Mjk0IG5zICAgICAgICAgNjI3NCBucyAgICAgICAxMTE0ODgKKyAqIEJNX1BSRVBST0NFU1NJTkcvMy8wICAgICAyMzIyNzIgbnMgICAgICAgMjMxNTI4IG5zICAgICAgICAgMzAyNQorICogQk1fUFJFUFJPQ0VTU0lORy8zLzEgICAgIDIyNjM0NiBucyAgICAgICAyMjU2MjggbnMgICAgICAgICAzMTE3CisgKiBCTV9QUkVQUk9DRVNTSU5HLzMvMiAgICAgIDc1NDQyIG5zICAgICAgICA3NTIyNyBucyAgICAgICAgIDkxMDQKKyAqIEJNX1BSRVBST0NFU1NJTkcvMy8zICAgICAgIDk3ODIgbnMgICAgICAgICA5NzUwIG5zICAgICAgICA3MTgwNQorICogQk1fUFJFUFJPQ0VTU0lORy80LzAgICAgIDI5MDM4OCBucyAgICAgICAyODk0MjYgbnMgICAgICAgICAyMzg5CisgKiBCTV9QUkVQUk9DRVNTSU5HLzQvMSAgICAgMjc5Mzk0IG5zICAgICAgIDI3ODQ5OCBucyAgICAgICAgIDI1MjIKKyAqIEJNX1BSRVBST0NFU1NJTkcvNC8yICAgICAgOTQwMjkgbnMgICAgICAgIDkzNzU5IG5zICAgICAgICAgNzMwNworICogQk1fUFJFUFJPQ0VTU0lORy80LzMgICAgICAxMTQ4NyBucyAgICAgICAgMTE0NTAgbnMgICAgICAgIDYxMTI5CisgKiBCTV9QUkVQUk9DRVNTSU5HLzUvMCAgICAgMzQ3NzM2IG5zICAgICAgIDM0NjU4MCBucyAgICAgICAgIDIwMjAKKyAqIEJNX1BSRVBST0NFU1NJTkcvNS8xICAgICAzMzE4NTMgbnMgICAgICAgMzMwNzg4IG5zICAgICAgICAgMjEyMgorICogQk1fUFJFUFJPQ0VTU0lORy81LzIgICAgIDExMjU5NCBucyAgICAgICAxMTIyNjggbnMgICAgICAgICA2MTA1CisgKiBCTV9QUkVQUk9DRVNTSU5HLzUvMyAgICAgIDEzMjU0IG5zICAgICAgICAxMzIxMiBucyAgICAgICAgNTI5NzIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaWZuZGVmIFdFQlJUQ19MRUdBQ1kKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgorI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKK2NvbnN0ZXhwciBpbnQga1NhbXBsZVJhdGUgPSAxNjAwMDsKK2NvbnN0ZXhwciBmbG9hdCBrVGVuTWlsbGlTZWNWYWwgPSAwLjAxOworY29uc3RleHByIHVuc2lnbmVkIGludCBrU3RyZWFtRGVsYXlNcyA9IDA7Citjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBrRWZmZWN0VXVpZHNbXSA9IHsKKyAgICAgICAgLy8gYWdjIHV1aWQKKyAgICAgICAgezB4YWE4MTMwZTAsIDB4NjZmYywgMHgxMWUwLCAweGJhZDAsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIC8vIGFlYyB1dWlkCisgICAgICAgIHsweGJiMzkyZWMwLCAweDhkNGQsIDB4MTFlMCwgMHhhODk2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBucyAgdXVpZAorICAgICAgICB7MHhjMDZjODQwMCwgMHg4ZTA2LCAweDExZTAsIDB4OWNiNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgICAgICAvLyBhZ2MyIHV1aWQKKyAgICAgICAgezB4ODlmMzhlNjUsIDB4ZDRkMiwgMHg0ZDY0LCAweGFkMGUsIHsweDJiLCAweDNlLCAweDc5LCAweDllLCAweGE4LCAweDg2fX0sCisjZW5kaWYKK307Citjb25zdGV4cHIgc2l6ZV90IGtOdW1FZmZlY3RVdWlkcyA9IHN0ZDo6c2l6ZShrRWZmZWN0VXVpZHMpOworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtDaE1hc2tzW10gPSB7CisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX0lOXzYsCit9OworY29uc3RleHByIHNpemVfdCBrTnVtQ2hNYXNrcyA9IHN0ZDo6c2l6ZShrQ2hNYXNrcyk7CisKKy8vIHR5cGVzIG9mIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKK2VudW0gUHJlUHJvY0lkIHsKKyAgICBQUkVQUk9DX0FHQywgIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wKKyAgICBQUkVQUk9DX0FFQywgIC8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsZXIKKyAgICBQUkVQUk9DX05TLCAgIC8vIE5vaXNlIFN1cHByZXNzb3IKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgIFBSRVBST0NfQUdDMiwgIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgMgorI2VuZGlmCisgICAgUFJFUFJPQ19OVU1fRUZGRUNUUworfTsKKworaW50IHByZVByb2NDcmVhdGVFZmZlY3QoZWZmZWN0X2hhbmRsZV90KiBwRWZmZWN0SGFuZGxlLCB1aW50MzJfdCBlZmZlY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnLCBpbnQgc2Vzc2lvbklkLCBpbnQgaW9JZCkgeworICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdCgma0VmZmVjdFV1aWRzW2VmZmVjdFR5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGlvSWQsIHBFZmZlY3RIYW5kbGUpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW8gUHJlcHJvY2Vzc2luZyBjcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIGlmIChlZmZlY3RUeXBlID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZCgqcEVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksIHBDb25maWcsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlNldCBjb25maWcgcmV2ZXJzZSBjb21tYW5kIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbnQgc3RhdHVzID0gKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlNldCBjb25maWcgY29tbWFuZCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSwgdWludDMyX3QgcGFyYW1UeXBlLCB1aW50MzJfdCBwYXJhbVZhbHVlKSB7CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHtwYXJhbVR5cGUsIHBhcmFtVmFsdWV9OworICAgIGVmZmVjdF9wYXJhbV90KiBlZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCopbWFsbG9jKHNpemVvZigqZWZmZWN0UGFyYW0pICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZwYXJhbURhdGFbMF0sIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIGZyZWUoZWZmZWN0UGFyYW0pOworICAgIHJldHVybiByZXBseTsKK30KKworc2hvcnQgcHJlUHJvY0dldFNob3J0VmFsKGZsb2F0IHBhcmFtVmFsdWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2hvcnQ+KHBhcmFtVmFsdWUgKiBzdGQ6Om51bWVyaWNfbGltaXRzPHNob3J0Pjo6bWF4KCkpOworfQorCitzdGF0aWMgdm9pZCBCTV9QUkVQUk9DRVNTSU5HKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgY29uc3Qgc2l6ZV90IGNoTWFzayA9IGtDaE1hc2tzW3N0YXRlLnJhbmdlKDApIC0gMV07CisgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoTWFzayk7CisKKyAgICBQcmVQcm9jSWQgZWZmZWN0VHlwZSA9IChQcmVQcm9jSWQpc3RhdGUucmFuZ2UoMSk7CisKKyAgICBpbnQzMl90IHNlc3Npb25JZCA9IDE7CisgICAgaW50MzJfdCBpb0lkID0gMTsKKyAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlID0gbnVsbHB0cjsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlne307CisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0ga1NhbXBsZVJhdGU7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IGNoTWFzazsKKyAgICBjb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY0NyZWF0ZUVmZmVjdCgmZWZmZWN0SGFuZGxlLCBzdGF0ZS5yYW5nZSgxKSwgJmNvbmZpZywgc2Vzc2lvbklkLCBpb0lkKTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgaWYgKGludCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGlucHV0IGJ1ZmZlciB3aXRoIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSB2YWx1ZXMKKyAgICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSAoaW50KShrU2FtcGxlUmF0ZSAqIGtUZW5NaWxsaVNlY1ZhbCk7CisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4oY2hNYXNrKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBpbihmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgZm9yIChhdXRvJiBpIDogaW4pIHsKKyAgICAgICAgaSA9IHByZVByb2NHZXRTaG9ydFZhbChkaXMoZ2VuKSk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBmYXJJbihmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgZm9yIChhdXRvJiBpIDogZmFySW4pIHsKKyAgICAgICAgaSA9IHByZVByb2NHZXRTaG9ydFZhbChkaXMoZ2VuKSk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXQoZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgLy8gUnVuIHRoZSB0ZXN0CisgICAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoaW4uZGF0YSgpKTsKKyAgICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKG91dC5kYXRhKCkpOworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoZmFySW4uZGF0YSgpKTsKKworICAgICAgICBhdWRpb19idWZmZXJfdCBpbkJ1ZmZlciA9IHsuZnJhbWVDb3VudCA9IChzaXplX3QpZnJhbWVMZW5ndGgsIC5zMTYgPSBpbi5kYXRhKCl9OworICAgICAgICBhdWRpb19idWZmZXJfdCBvdXRCdWZmZXIgPSB7LmZyYW1lQ291bnQgPSAoc2l6ZV90KWZyYW1lTGVuZ3RoLCAuczE2ID0gb3V0LmRhdGEoKX07CisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGZhckluQnVmZmVyID0gey5mcmFtZUNvdW50ID0gKHNpemVfdClmcmFtZUxlbmd0aCwgLnMxNiA9IGZhckluLmRhdGEoKX07CisKKyAgICAgICAgaWYgKFBSRVBST0NfQUVDID09IGVmZmVjdFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZVByb2NTZXRDb25maWdQYXJhbShlZmZlY3RIYW5kbGUsIEFFQ19QQVJBTV9FQ0hPX0RFTEFZLCBrU3RyZWFtRGVsYXlNcyk7CisgICAgICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicHJlUHJvY1NldENvbmZpZ1BhcmFtIHJldHVybmVkIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlKS0+cHJvY2VzcyhlZmZlY3RIYW5kbGUsICZpbkJ1ZmZlciwgJm91dEJ1ZmZlcik7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFByb2Nlc3MgaSA9ICVkIHJldHVybmVkIHdpdGggZXJyb3IgJWRcbiIsIChpbnQpc3RhdGUucmFuZ2UoMSksIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBSRVBST0NfQUVDID09IGVmZmVjdFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqZWZmZWN0SGFuZGxlKS0+cHJvY2Vzc19yZXZlcnNlKGVmZmVjdEhhbmRsZSwgJmZhckluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBQcm9jZXNzIHJldmVyc2UgaSA9ICVkIHJldHVybmVkIHdpdGggZXJyb3IgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgKGludClzdGF0ZS5yYW5nZSgxKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYmVuY2htYXJrOjpDbG9iYmVyTWVtb3J5KCk7CisKKyAgICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7CisKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVwcm9jZXNzaW5nQXJncyhiZW5jaG1hcms6OmludGVybmFsOjpCZW5jaG1hcmsqIGIpIHsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8PSAoaW50KWtOdW1DaE1hc2tzOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KWtOdW1FZmZlY3RVdWlkczsgKytqKSB7CisgICAgICAgICAgICBiLT5BcmdzKHtpLCBqfSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0JFTkNITUFSSyhCTV9QUkVQUk9DRVNTSU5HKS0+QXBwbHkocHJlcHJvY2Vzc2luZ0FyZ3MpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDViMGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MyBAQAorLy8gYXVkaW8gcHJlcHJvY2Vzc2luZyB1bml0IHRlc3QKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJBdWRpb1ByZVByb2Nlc3NpbmdMZWdhY3lUZXN0IiwKKworICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgc3JjczogWyJQcmVQcm9jZXNzaW5nVGVzdC5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3ByZXByb2Nlc3NpbmdfbGVnYWN5IiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYndlYnJ0Y19hdWRpb19wcmVwcm9jZXNzaW5nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFdFQlJUQ19QT1NJWCIsCisgICAgICAgICItRFdFQlJUQ19MRUdBQ1kiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWRlZmF1bHQiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsiUHJlUHJvY2Vzc2luZ1Rlc3QuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wcmVwcm9jZXNzaW5nIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvUHJlUHJvY2Vzc2luZ1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Yjk0NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvUHJlUHJvY2Vzc2luZ1Rlc3QuY3BwCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjLmg+CisjaWZuZGVmIFdFQlJUQ19MRUdBQ1kKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBpbXBvcnRlZAorZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdHlwZXMgb2YgcHJlIHByb2Nlc3NpbmcgbW9kdWxlcworZW51bSBQcmVQcm9jSWQgeworICAgIFBSRVBST0NfQUdDLCAgLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbAorI2lmbmRlZiBXRUJSVENfTEVHQUNZCisgICAgUFJFUFJPQ19BR0MyLCAgLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbCAyCisjZW5kaWYKKyAgICBQUkVQUk9DX0FFQywgIC8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsZXIKKyAgICBQUkVQUk9DX05TLCAgIC8vIE5vaXNlIFN1cHByZXNzb3IKKyAgICBQUkVQUk9DX05VTV9FRkZFQ1RTCit9OworCitlbnVtIFByZVByb2NQYXJhbXMgeworICAgIEFSR19IRUxQID0gMSwKKyAgICBBUkdfSU5QVVQsCisgICAgQVJHX09VVFBVVCwKKyAgICBBUkdfRkFSLAorICAgIEFSR19GUywKKyAgICBBUkdfQ0hfTUFTSywKKyAgICBBUkdfQUdDX1RHVF9MVkwsCisgICAgQVJHX0FHQ19DT01QX0xWTCwKKyAgICBBUkdfQUVDX0RFTEFZLAorICAgIEFSR19OU19MVkwsCisjaWZuZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICBBUkdfQUdDMl9HQUlOLAorICAgIEFSR19BR0MyX0xWTCwKKyAgICBBUkdfQUdDMl9TQVRfTUdOCisjZW5kaWYKK307CisKK3N0cnVjdCBwcmVQcm9jQ29uZmlnUGFyYW1zX3QgeworICAgIGludCBzYW1wbGluZ0ZyZXEgPSAxNjAwMDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk87CisgICAgaW50IG5zTGV2ZWwgPSAwOyAgICAgICAgIC8vIGEgdmFsdWUgYmV0d2VlbiAwLTMKKyAgICBpbnQgYWdjVGFyZ2V0TGV2ZWwgPSAzOyAgLy8gaW4gZEIKKyAgICBpbnQgYWdjQ29tcExldmVsID0gOTsgICAgLy8gaW4gZEIKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgIGZsb2F0IGFnYzJHYWluID0gMC5mOyAgICAgICAgICAgICAgLy8gaW4gZEIKKyAgICBmbG9hdCBhZ2MyU2F0dXJhdGlvbk1hcmdpbiA9IDIuZjsgIC8vIGluIGRCCisgICAgaW50IGFnYzJMZXZlbCA9IDA7ICAgICAgICAgICAgICAgICAvLyBlaXRoZXIga1JtcygwKSBvciBrUGVhaygxKQorI2VuZGlmCisgICAgaW50IGFlY0RlbGF5ID0gMDsgIC8vIGluIG1zCit9OworCitjb25zdCBlZmZlY3RfdXVpZF90IGtQcmVQcm9jVXVpZHNbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7CisgICAgICAgIHsweGFhODEzMGUwLCAweDY2ZmMsIDB4MTFlMCwgMHhiYWQwLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gYWdjIHV1aWQKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgICAgICB7MHg4OWYzOGU2NSwgMHhkNGQyLCAweDRkNjQsIDB4YWQwZSwgezB4MmIsIDB4M2UsIDB4NzksIDB4OWUsIDB4YTgsIDB4ODZ9fSwgIC8vIGFnYzIgdXVpZAorI2VuZGlmCisgICAgICAgIHsweGJiMzkyZWMwLCAweDhkNGQsIDB4MTFlMCwgMHhhODk2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gYWVjIHV1aWQKKyAgICAgICAgezB4YzA2Yzg0MDAsIDB4OGUwNiwgMHgxMWUwLCAweDljYjYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBucyAgdXVpZAorfTsKKworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtQcmVQcm9jQ29uZmlnQ2hNYXNrW10gPSB7CisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl82LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDBQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMVBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDFQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTktfTU9OTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9DQUxMX01PTk8sCit9OworCitjb25zdGV4cHIgaW50IGtQcmVQcm9jQ29uZmlnQ2hNYXNrQ291bnQgPSBzdGQ6OnNpemUoa1ByZVByb2NDb25maWdDaE1hc2spOworCit2b2lkIHByaW50VXNhZ2UoKSB7CisgICAgcHJpbnRmKCJcblVzYWdlOiAiKTsKKyAgICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gW29wdGlvbnNdXG4iKTsKKyAgICBwcmludGYoIlxud2hlcmUgb3B0aW9ucyBhcmUsICIpOworICAgIHByaW50ZigiXG4gICAgIC0taW5wdXQgPGlucHV0ZmlsZT4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1vdXRwdXQgPG91dHB1dGZpbGU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgcGF0aCB0byB0aGUgb3V0cHV0IGZpbGUiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWhlbHAiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICAgIHByaW50ZigiXG4gICAgIC0tZnMgPHNhbXBsaW5nX2ZyZXE+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDE2MDAwLiIpOworICAgIHByaW50ZigiXG4gICAgIC1jaF9tYXNrIDxjaGFubmVsX21hc2s+XG4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMCAgLSBBVURJT19DSEFOTkVMX0lOX01PTk8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAyICAtIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAzICAtIEFVRElPX0NIQU5ORUxfSU5fNiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA1ICAtIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMVBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA2ICAtIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMFBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA4ICAtIEFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICA5ICAtIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LX01PTk8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxMSAtIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PICIpOworICAgIHByaW50ZigiXG4gICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWZhciA8ZmFyZW5kX2ZpbGU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgUGF0aCB0byBmYXItZW5kIGZpbGUgbmVlZGVkIGZvciBlY2hvIGNhbmNlbGxhdGlvbiIpOworICAgIHByaW50ZigiXG4gICAgIC0tYWVjIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVjaG8gQ2FuY2VsbGF0aW9uLCBkZWZhdWx0IGRpc2FibGVkIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1ucyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBOb2lzZSBTdXBwcmVzc2lvbiwgZGVmYXVsdCBkaXNhYmxlZCIpOworICAgIHByaW50ZigiXG4gICAgIC0tYWdjIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEdhaW4gQ29udHJvbCwgZGVmYXVsdCBkaXNhYmxlZCIpOworI2lmbmRlZiBXRUJSVENfTEVHQUNZCisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2MyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEdhaW4gQ29udHJvbGxlciAyLCBkZWZhdWx0IGRpc2FibGVkIik7CisjZW5kaWYKKyAgICBwcmludGYoIlxuICAgICAtLW5zX2x2bCA8bnNfbGV2ZWw+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgTm9pc2UgU3VwcHJlc3Npb24gbGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgMGRCIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2NfdGd0X2x2bCA8dGFyZ2V0X2xldmVsPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFHQyBUYXJnZXQgTGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgM2RCIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2NfY29tcF9sdmwgPGNvbXBfbGV2ZWw+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgQUdDIENvbXAgTGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgOWRCIik7CisjaWZuZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICBwcmludGYoIlxuICAgICAtLWFnYzJfZ2FpbiA8Zml4ZWRfZGlnaXRhbF9nYWluPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFHQyBGaXhlZCBEaWdpdGFsIEdhaW4gaW4gZEIsIGRlZmF1bHQgdmFsdWUgMGRCIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2MyX2x2bCA8bGV2ZWxfZXN0aW1hdG9yPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFHQyBBZGFwdGl2ZSBEaWdpdGFsIExldmVsIEVzdGltYXRvciwgZGVmYXVsdCB2YWx1ZSBrUm1zIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2MyX3NhdF9tZ24gPHNhdHVyYXRpb25fbWFyZ2luPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFHQyBBZGFwdGl2ZSBEaWdpdGFsIFNhdHVyYXRpb24gTWFyZ2luIGluIGRCLCBkZWZhdWx0IHZhbHVlIDJkQiIpOworI2VuZGlmCisgICAgcHJpbnRmKCJcbiAgICAgLS1hZWNfZGVsYXkgPGRlbGF5PiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFFQyBkZWxheSB2YWx1ZSBpbiBtcywgZGVmYXVsdCB2YWx1ZSAwbXMiKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK2NvbnN0ZXhwciBmbG9hdCBrVGVuTWlsbGlTZWNWYWwgPSAwLjAxOworCitpbnQgcHJlUHJvY0NyZWF0ZUVmZmVjdChlZmZlY3RfaGFuZGxlX3QqIHBFZmZlY3RIYW5kbGUsIHVpbnQzMl90IGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY29uZmlnX3QqIHBDb25maWcsIGludCBzZXNzaW9uSWQsIGludCBpb0lkKSB7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KCZrUHJlUHJvY1V1aWRzW2VmZmVjdFR5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGlvSWQsIHBFZmZlY3RIYW5kbGUpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW8gUHJlcHJvY2Vzc2luZyBjcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIGlmIChlZmZlY3RUeXBlID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgICgqKnBFZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSwgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWcsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgfQorICAgICgqKnBFZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJRywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksIHBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCBwcmVQcm9jU2V0Q29uZmlnUGFyYW0odWludDMyX3QgcGFyYW1UeXBlLCB1aW50MzJfdCBwYXJhbVZhbHVlLCBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlKSB7CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHtwYXJhbVR5cGUsIHBhcmFtVmFsdWV9OworICAgIGVmZmVjdF9wYXJhbV90KiBlZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCopbWFsbG9jKHNpemVvZigqZWZmZWN0UGFyYW0pICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZwYXJhbURhdGFbMF0sIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIGZyZWUoZWZmZWN0UGFyYW0pOworICAgIHJldHVybiByZXBseTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjID09IDEpIHsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBpbnB1dEZpbGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIG91dHB1dEZpbGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGZhckZpbGUgPSBudWxscHRyOworICAgIGludCBlZmZlY3RFbltQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHswfTsKKworICAgIGNvbnN0IG9wdGlvbiBsb25nX29wdHNbXSA9IHsKKyAgICAgICAgICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfSEVMUH0sCisgICAgICAgICAgICB7ImlucHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19JTlBVVH0sCisgICAgICAgICAgICB7Im91dHB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfT1VUUFVUfSwKKyAgICAgICAgICAgIHsiZmFyIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19GQVJ9LAorICAgICAgICAgICAgeyJmcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRlN9LAorICAgICAgICAgICAgeyJjaF9tYXNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19DSF9NQVNLfSwKKyAgICAgICAgICAgIHsiYWdjX3RndF9sdmwiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0FHQ19UR1RfTFZMfSwKKyAgICAgICAgICAgIHsiYWdjX2NvbXBfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0NfQ09NUF9MVkx9LAorI2lmbmRlZiBXRUJSVENfTEVHQUNZCisgICAgICAgICAgICB7ImFnYzJfZ2FpbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUdDMl9HQUlOfSwKKyAgICAgICAgICAgIHsiYWdjMl9sdmwiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0FHQzJfTFZMfSwKKyAgICAgICAgICAgIHsiYWdjMl9zYXRfbWduIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0MyX1NBVF9NR059LAorI2VuZGlmCisgICAgICAgICAgICB7ImFlY19kZWxheSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUVDX0RFTEFZfSwKKyAgICAgICAgICAgIHsibnNfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19OU19MVkx9LAorICAgICAgICAgICAgeyJhZWMiLCBub19hcmd1bWVudCwgJmVmZmVjdEVuW1BSRVBST0NfQUVDXSwgMX0sCisgICAgICAgICAgICB7ImFnYyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19BR0NdLCAxfSwKKyNpZm5kZWYgV0VCUlRDX0xFR0FDWQorICAgICAgICAgICAgeyJhZ2MyIiwgbm9fYXJndW1lbnQsICZlZmZlY3RFbltQUkVQUk9DX0FHQzJdLCAxfSwKKyNlbmRpZgorICAgICAgICAgICAgeyJucyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19OU10sIDF9LAorICAgICAgICAgICAge251bGxwdHIsIDAsIG51bGxwdHIsIDB9LAorICAgIH07CisgICAgc3RydWN0IHByZVByb2NDb25maWdQYXJhbXNfdCBwcmVQcm9jQ2ZnUGFyYW1zIHt9OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgY29uc3QgaW50IG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiwgImk6bzoiLCBsb25nX29wdHMsIG51bGxwdHIpOworICAgICAgICBpZiAob3B0ID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgY2FzZSBBUkdfSEVMUDoKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBjYXNlIEFSR19JTlBVVDogeworICAgICAgICAgICAgICAgIGlucHV0RmlsZSA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19PVVRQVVQ6IHsKKyAgICAgICAgICAgICAgICBvdXRwdXRGaWxlID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0ZBUjogeworICAgICAgICAgICAgICAgIGZhckZpbGUgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfRlM6IHsKKyAgICAgICAgICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0NIX01BU0s6IHsKKyAgICAgICAgICAgICAgICBpbnQgY2hNYXNrSWR4ID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGlmIChjaE1hc2tJZHggPCAwIG9yIGNoTWFza0lkeCA+IGtQcmVQcm9jQ29uZmlnQ2hNYXNrQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNoYW5uZWwgTWFzayBpbmRleCBub3QgaW4gY29ycmVjdCByYW5nZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5jaE1hc2sgPSBrUHJlUHJvY0NvbmZpZ0NoTWFza1tjaE1hc2tJZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQUdDX1RHVF9MVkw6IHsKKyAgICAgICAgICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLmFnY1RhcmdldExldmVsID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQUdDX0NPTVBfTFZMOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2NDb21wTGV2ZWwgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjaWZuZGVmIFdFQlJUQ19MRUdBQ1kKKyAgICAgICAgICAgIGNhc2UgQVJHX0FHQzJfR0FJTjogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWdjMkdhaW4gPSBhdG9mKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19BR0MyX0xWTDogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWdjMkxldmVsID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQUdDMl9TQVRfTUdOOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2MyU2F0dXJhdGlvbk1hcmdpbiA9IGF0b2Yob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgY2FzZSBBUkdfQUVDX0RFTEFZOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZWNEZWxheSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX05TX0xWTDogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMubnNMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIGlucHV0IGZpbGVcbiIpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBpbnB1dEZwKGZvcGVuKGlucHV0RmlsZSwgInJiIiksICZmY2xvc2UpOworICAgIGlmIChpbnB1dEZwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGlucHV0RmlsZSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBmYXJGcChmb3BlbihmYXJGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBvdXRwdXRGcChmb3BlbihvdXRwdXRGaWxlLCAid2IiKSwgJmZjbG9zZSk7CisgICAgaWYgKGVmZmVjdEVuW1BSRVBST0NfQUVDXSkgeworICAgICAgICBpZiAoZmFyRmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFyIGVuZCBzaWduYWwgZmlsZSByZXF1aXJlZCBmb3IgZWNobyBjYW5jZWxsYXRpb24gXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhckZwID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBmYXIgZW5kIHN0cmVhbSBmaWxlICVzXG4iLCBmYXJGaWxlKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0IHN0YXQgc3RhdElucHV0LCBzdGF0RmFyOworICAgICAgICAodm9pZClmc3RhdChmaWxlbm8oaW5wdXRGcC5nZXQoKSksICZzdGF0SW5wdXQpOworICAgICAgICAodm9pZClmc3RhdChmaWxlbm8oZmFyRnAuZ2V0KCkpLCAmc3RhdEZhcik7CisgICAgICAgIGlmIChzdGF0SW5wdXQuc3Rfc2l6ZSAhPSBzdGF0RmFyLnN0X3NpemUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJOZWFyIGFuZCBmYXIgZW5kIHNpZ25hbHMgYXJlIG9mIGRpZmZlcmVudCBzaXplcyIpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob3V0cHV0RmlsZSAhPSBudWxscHRyICYmIG91dHB1dEZwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRwdXRGaWxlKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlc3Npb25JZCA9IDE7CisgICAgaW50MzJfdCBpb0lkID0gMTsKKyAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlW1BSRVBST0NfTlVNX0VGRkVDVFNdID0ge251bGxwdHJ9OworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gcHJlUHJvY0NmZ1BhcmFtcy5zYW1wbGluZ0ZyZXE7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHByZVByb2NDZmdQYXJhbXMuY2hNYXNrOworICAgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCisgICAgLy8gQ3JlYXRlIGFsbCB0aGUgZWZmZWN0IGhhbmRsZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NDcmVhdGVFZmZlY3QoJmVmZmVjdEhhbmRsZVtpXSwgaSwgJmNvbmZpZywgc2Vzc2lvbklkLCBpb0lkKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3JlYXRlIGVmZmVjdCBjYWxsIHJldHVybmVkIGVycm9yICVpIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgICBpZiAoZWZmZWN0RW5baV0gPT0gMSkgeworICAgICAgICAgICAgaW50IHJlcGx5ID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgICAgICAgICAoKmVmZmVjdEhhbmRsZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZVtpXSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgICAgICBpZiAocmVwbHkgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCBDb25maWcgUGFyYW1zIG9mIHRoZSBlZmZlY3RzCisgICAgaWYgKGVmZmVjdEVuW1BSRVBST0NfQUdDXSkgeworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBR0NfUEFSQU1fVEFSR0VUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcHJlUHJvY0NmZ1BhcmFtcy5hZ2NUYXJnZXRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlW1BSRVBST0NfQUdDXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgQUdDIFRhcmdldCBMZXZlbC4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY1NldENvbmZpZ1BhcmFtKEFHQ19QQVJBTV9DT01QX0dBSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFnY0NvbXBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlW1BSRVBST0NfQUdDXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgQUdDIENvbXAgR2Fpbi4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorI2lmbmRlZiBXRUJSVENfTEVHQUNZCisgICAgaWYgKGVmZmVjdEVuW1BSRVBST0NfQUdDMl0pIHsKKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUdDMl9QQVJBTV9GSVhFRF9ESUdJVEFMX0dBSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClwcmVQcm9jQ2ZnUGFyYW1zLmFnYzJHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19BR0MyXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgQUdDMiBGaXhlZCBEaWdpdGFsIEdhaW4uIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBR0MyX1BBUkFNX0FEQVBUX0RJR0lfTEVWRUxfRVNUSU1BVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcHJlUHJvY0NmZ1BhcmFtcy5hZ2MyTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQzJdKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBBR0MyIExldmVsIEVzdGltYXRvci4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY1NldENvbmZpZ1BhcmFtKEFHQzJfUEFSQU1fQURBUFRfRElHSV9FWFRSQV9TQVRVUkFUSU9OX01BUkdJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KXByZVByb2NDZmdQYXJhbXMuYWdjMlNhdHVyYXRpb25NYXJnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQzJdKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBBR0MyIFNhdHVyYXRpb24gTWFyZ2luLiBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19OU10pIHsKKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oTlNfUEFSQU1fTEVWRUwsICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLm5zTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX05TXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgTm9pc2UgU3VwcHJlc3Npb24gbGV2ZWwgRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBDYWxsCisgICAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gKGludCkocHJlUHJvY0NmZ1BhcmFtcy5zYW1wbGluZ0ZyZXEgKiBrVGVuTWlsbGlTZWNWYWwpOworICAgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHByZVByb2NDZmdQYXJhbXMuY2hNYXNrKTsKKyAgICBjb25zdCBpbnQgaW9GcmFtZVNpemUgPSBpb0NoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7CisgICAgaW50IGZyYW1lQ291bnRlciA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogaW9DaGFubmVsQ291bnQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogaW9DaGFubmVsQ291bnQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gZmFySW4oZnJhbWVMZW5ndGggKiBpb0NoYW5uZWxDb3VudCk7CisgICAgICAgIHNpemVfdCBzYW1wbGVzUmVhZCA9IGZyZWFkKGluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBpbnB1dEZwLmdldCgpKTsKKyAgICAgICAgaWYgKHNhbXBsZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXI7CisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGZhckluQnVmZmVye307CisgICAgICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICAgICAgb3V0cHV0QnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICAgICAgaW5wdXRCdWZmZXIuczE2ID0gaW4uZGF0YSgpOworICAgICAgICBvdXRwdXRCdWZmZXIuczE2ID0gb3V0LmRhdGEoKTsKKworICAgICAgICBpZiAoZmFyRnAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2FtcGxlc1JlYWQgPSBmcmVhZChmYXJJbi5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZmFyRnAuZ2V0KCkpOworICAgICAgICAgICAgaWYgKHNhbXBsZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhckluQnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICAgICAgICAgIGZhckluQnVmZmVyLnMxNiA9IGZhckluLmRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZWZmZWN0RW5baV0gPT0gMSkgeworICAgICAgICAgICAgICAgIGlmIChpID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY1NldENvbmZpZ1BhcmFtKEFFQ19QQVJBTV9FQ0hPX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcHJlUHJvY0NmZ1BhcmFtcy5hZWNEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlW1BSRVBST0NfQUVDXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInByZVByb2NTZXRDb25maWdQYXJhbSByZXR1cm5lZCBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wcm9jZXNzKGVmZmVjdEhhbmRsZVtpXSwgJmlucHV0QnVmZmVyLCAmb3V0cHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFByb2Nlc3MgaSA9ICVkIHJldHVybmVkIHdpdGggZXJyb3IgJWRcbiIsIGksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnQgc3RhdHVzID0gKCplZmZlY3RIYW5kbGVbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnByb2Nlc3NfcmV2ZXJzZShlZmZlY3RIYW5kbGVbaV0sICZmYXJJbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBQcm9jZXNzIHJldmVyc2UgaSA9ICVkIHJldHVybmVkIHdpdGggZXJyb3IgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob3V0cHV0RnAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2l6ZV90IHNhbXBsZXNXcml0dGVuID0KKyAgICAgICAgICAgICAgICAgICAgZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCwgb3V0cHV0RnAuZ2V0KCkpOworICAgICAgICAgICAgaWYgKHNhbXBsZXNXcml0dGVuICE9IG91dHB1dEJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlxuRXJyb3I6IE91dHB1dCBmaWxlIHdyaXRpbmcgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOworICAgIH0KKyAgICAvLyBSZWxlYXNlIGFsbCB0aGUgZWZmZWN0IGhhbmRsZXMgY3JlYXRlZAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlW2ldKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQXVkaW8gUHJlcHJvY2Vzc2luZyByZWxlYXNlIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0VmZmVjdFByb3h5LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvRWZmZWN0UHJveHkuY3BwCmluZGV4IDQyZTQ0ZjAuLmMwMTBkNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvRWZmZWN0UHJveHkuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvRWZmZWN0UHJveHkuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gVGhpcyBpcyBhIGR1bW15IHByb3h5IGRlc2NyaXB0b3IganVzdCB0byByZXR1cm4gdG8gRmFjdG9yeSBkdXJpbmcgdGhlIGluaXRpYWwKKy8vIFRoaXMgaXMgYSBzdHViIHByb3h5IGRlc2NyaXB0b3IganVzdCB0byByZXR1cm4gdG8gRmFjdG9yeSBkdXJpbmcgdGhlIGluaXRpYWwKIC8vIEdldERlc2NyaXB0b3IgY2FsbC4gTGF0ZXIgaW4gdGhlIGZhY3RvcnksIGl0IGlzIHJlcGxhY2VkIHdpdGggdGhlCiAvLyBTVyBzdWIgZWZmZWN0IGRlc2NyaXB0b3IKIC8vIHByb3h5IFVVSUQgYWY4ZGE3ZTAtMmNhMS0xMWUzLWI3MWQtMDAwMmE1ZDVjNTFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzU4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDMyIEBACisvLyBWaXN1YWxpemVyIGxpYnJhcnkKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlidmlzdWFsaXplciIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJFZmZlY3RWaXN1YWxpemVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLU8yIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKKyAgICAgICAgIi1EU1VQUE9SVF9NQyIsCisKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHNfaGVhZGVycyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTJmM2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBWaXN1YWxpemVyIGxpYnJhcnkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlFZmZlY3RWaXN1YWxpemVyLmNwcAotCi1MT0NBTF9DRkxBR1MrPSAtTzIgLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX0NGTEFHUyArPSAtREJVSUxEX0ZMT0FUIC1EU1VQUE9SVF9NQwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYmxvZyBcCi0JbGliZGwKLQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKLQotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2hlYWRlcnMKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IDNmZDNmYzMuLmY2OGY2NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtNSwxOCArNSwzNiBAQAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImF2LWhlYWRlcnMiLAogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKICAgICAgICAgImxpYmd1aV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAiYXYtaGVhZGVycyIsCiAgICAgICAgICJsaWJndWlfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorfQorCiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJsaWJtZWRpYV9vbXhfYWlkbCIsCiAgICAgc3JjczogWwpAQCAtMzMsMjggKzUxLDYgQEAKICAgICBwYXRoOiAiYWlkbCIsCiB9CiAKLWZpbGVncm91cCB7Ci0gICAgbmFtZTogInJlc291cmNlbWFuYWdlcl9haWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlVHlwZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlUGFyY2VsLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWwuYWlkbCIsCi0gICAgXSwKLSAgICBwYXRoOiAiYWlkbCIsCi19Ci0KLWFpZGxfaW50ZXJmYWNlIHsKLSAgICBuYW1lOiAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlIiwKLSAgICB1bnN0YWJsZTogdHJ1ZSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpyZXNvdXJjZW1hbmFnZXJfYWlkbCIsCi0gICAgXSwKLX0KLQogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYV9vbXgiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0yMDMsNyArMTk5LDcgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCkBAIC0yMjAsNiArMjE2LDE0IEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC0zMDksMTUgKzMxMywxOSBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICAgICAgImpuaV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJqbmlfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICAgICAgImF2LXR5cGVzLWFpZGwtdW5zdGFibGUtY3BwIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKQEAgLTM3MiwzICszODAsMzYgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiB9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlibWVkaWFfbmRrZm9ybWF0cHJpdiIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0UHJpdi5jcHAiLAorICAgICAgICAiTmRrTWVkaWFFcnJvclByaXYuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBhcGV4X2F2YWlsYWJsZTogWyJjb20uYW5kcm9pZC5tZWRpYSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggMjBiYzIzZC4uOGE0YjE3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC00MCw2ICs0MCw3IEBACiAgICAgU0VUX0RBVEFfU09VUkNFX0ZELAogICAgIFNFVF9EQVRBX1NPVVJDRV9TVFJFQU0sCiAgICAgU0VUX0RBVEFfU09VUkNFX0NBTExCQUNLLAorICAgIFNFVF9EQVRBX1NPVVJDRV9SVFAsCiAgICAgU0VUX0JVRkZFUklOR19TRVRUSU5HUywKICAgICBHRVRfQlVGRkVSSU5HX1NFVFRJTkdTLAogICAgIFBSRVBBUkVfQVNZTkMsCkBAIC0xNjEsNiArMTYyLDE1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KHJ0cFBhcmFtcyk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREFUQV9TT1VSQ0VfUlRQLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIHRvIHRoZSBtZWRpYSBwbGF5ZXIgc2VydmljZQogICAgIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKQogICAgIHsKQEAgLTY4NSw2ICs2OTUsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQorICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9SVFA6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIFN0cmluZzggcnRwUGFyYW1zID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZShydHBQYXJhbXMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBjYXNlIFNFVF9WSURFT19TVVJGQUNFVEVYVFVSRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXIgPQpAQCAtOTU4LDcgKzk3NCw3IEBACiAgICAgICAgIGNhc2UgUFJFUEFSRV9EUk06IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgdWludDhfdCB1dWlkWzE2XTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXVpZFsxNl0gPSB7fTsKICAgICAgICAgICAgIGRhdGEucmVhZCh1dWlkLCBzaXplb2YodXVpZCkpOwogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGRybVNlc3Npb25JZDsKICAgICAgICAgICAgIHJlYWRWZWN0b3IoZGF0YSwgZHJtU2Vzc2lvbklkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggYmQxOGE0MC4uMTEwMDVjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTYyLDExICs2MiwxMyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCkgeworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb25JZCk7CisgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG9wUGFja2FnZU5hbWUuY19zdHIoKSk7CiAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKQEAgLTEyNyw3ICsxMjksMTIgQEAKICAgICAgICAgICAgIHNwPElNZWRpYVBsYXllckNsaWVudD4gY2xpZW50ID0KICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllciA9IGNyZWF0ZShjbGllbnQsIGF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG9wUGFja2FnZU5hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAob3BQYWNrYWdlTmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9wUGFja2FnZU5hbWVTdHIob3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllciA9IGNyZWF0ZShjbGllbnQsIGF1ZGlvU2Vzc2lvbklkLCBvcFBhY2thZ2VOYW1lU3RyKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihwbGF5ZXIpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggNjM3MzIyZi4uZTg4MzliYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaERpcnNbMV0gKyBmaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaERpcnNbMl0gKyBmaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaERpcnNbM10gKyBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0vZXRjL21lZGlhX3Byb2ZpbGVzX1YxXzAueG1sIiAvLyBTeXN0ZW0gZmFsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0vZXRjL21lZGlhX3Byb2ZpbGVzLnhtbCIgLy8gU3lzdGVtIGZhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgfSgpOwogICAgIHN0YXRpYyBzdGQ6OmFycmF5PGNoYXIgY29uc3QqLCA1PiBjb25zdCBjUGF0aHMgPSB7CkBAIC0yNDAsNyArMjQwLDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjIGZhaWxlZCB0byBsb2NhdGUgY29kZWMgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyhzdGF0aWNfY2FzdDx2aWRlb19lbmNvZGVyPihjb2RlYyksCkBAIC0yNjIsNyArMjY1LDEwIEBACiAgICAgICAgICAgIXN0cmNtcCgiY2hhbm5lbHMiLCAgIGF0dHNbNl0pKTsKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNBdWRpb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc0F1ZGlvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNBdWRpb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0NvZGVjIGZhaWxlZCB0byBsb2NhdGUgY29kZWMgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyhzdGF0aWNfY2FzdDxhdWRpb19lbmNvZGVyPihjb2RlYyksCkBAIC0yODIsNyArMjg4LDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNBdWRpb0RlY29kZXJOYW1lTWFwKS9zaXplb2Yoc0F1ZGlvRGVjb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNBdWRpb0RlY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0RlY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwKHN0YXRpY19jYXN0PGF1ZGlvX2RlY29kZXI+KGNvZGVjKSk7CkBAIC0yOTgsNyArMzA3LDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0RlY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRGVjb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0RlY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0RlY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6VmlkZW9EZWNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9EZWNvZGVyQ2FwKHN0YXRpY19jYXN0PHZpZGVvX2RlY29kZXI+KGNvZGVjKSk7CkBAIC0zMjIsNyArMzM0LDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0VuY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwKHN0YXRpY19jYXN0PHZpZGVvX2VuY29kZXI+KGNvZGVjKSwKQEAgLTM0Niw3ICszNjEsMTAgQEAKIAogICAgIGNvbnN0IHNpemVfdCBuTWFwcGluZ3MgPSBzaXplb2Yoc0F1ZGlvRW5jb2Rlck5hbWVNYXApL3NpemVvZihzQXVkaW9FbmNvZGVyTmFtZU1hcFswXSk7CiAgICAgY29uc3QgaW50IGNvZGVjID0gZmluZFRhZ0Zvck5hbWUoc0F1ZGlvRW5jb2Rlck5hbWVNYXAsIG5NYXBwaW5ncywgYXR0c1sxXSk7Ci0gICAgQ0hFQ0soY29kZWMgIT0gLTEpOworICAgIGlmIChjb2RlYyA9PSAtMSkgeworICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZUF1ZGlvRW5jb2RlckNhcCBmYWlsZWQgdG8gbG9jYXRlIGNvZGVjICVzIiwgYXR0c1sxXSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAKICAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAgKmNhcCA9CiAgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAoc3RhdGljX2Nhc3Q8YXVkaW9fZW5jb2Rlcj4oY29kZWMpLCBhdG9pKGF0dHNbNV0pLApAQCAtMzg2LDExICs0MDQsMTcgQEAKICAgICBjb25zdCBzaXplX3QgblByb2ZpbGVNYXBwaW5ncyA9IHNpemVvZihzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXApLwogICAgICAgICAgICAgc2l6ZW9mKHNDYW1jb3JkZXJRdWFsaXR5TmFtZU1hcFswXSk7CiAgICAgY29uc3QgaW50IHF1YWxpdHkgPSBmaW5kVGFnRm9yTmFtZShzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXAsIG5Qcm9maWxlTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKHF1YWxpdHkgIT0gLTEpOworICAgIGlmIChxdWFsaXR5ID09IC0xKSB7CisgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlQ2FtY29yZGVyUHJvZmlsZSBmYWlsZWQgdG8gbG9jYXRlIHF1YWxpdHkgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIGNvbnN0IHNpemVfdCBuRm9ybWF0TWFwcGluZ3MgPSBzaXplb2Yoc0ZpbGVGb3JtYXRNYXApL3NpemVvZihzRmlsZUZvcm1hdE1hcFswXSk7CiAgICAgY29uc3QgaW50IGZpbGVGb3JtYXQgPSBmaW5kVGFnRm9yTmFtZShzRmlsZUZvcm1hdE1hcCwgbkZvcm1hdE1hcHBpbmdzLCBhdHRzWzNdKTsKLSAgICBDSEVDSyhmaWxlRm9ybWF0ICE9IC0xKTsKKyAgICBpZiAoZmlsZUZvcm1hdCA9PSAtMSkgeworICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZUNhbWNvcmRlclByb2ZpbGUgZmFpbGVkIHRvIGxvY2F0ZSBmaWxlIGZvcm1hdCAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IGNhbWVyYUlkOwpAQCAtNDYyLDI0ICs0ODYsMzkgQEAKICAgICAgICAgY3JlYXRlQXVkaW9Db2RlYyhhdHRzLCBwcm9maWxlcyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIlZpZGVvRW5jb2RlckNhcCIsIG5hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0VuY29kZXJzLmFkZChjcmVhdGVWaWRlb0VuY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0VuY29kZXJDYXAqIGNhcCA9IGNyZWF0ZVZpZGVvRW5jb2RlckNhcChhdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0VuY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkF1ZGlvRW5jb2RlckNhcCIsIG5hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0VuY29kZXJzLmFkZChjcmVhdGVBdWRpb0VuY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAqIGNhcCA9IGNyZWF0ZUF1ZGlvRW5jb2RlckNhcChhdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0VuY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIlZpZGVvRGVjb2RlckNhcCIsIG5hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0RlY29kZXJzLmFkZChjcmVhdGVWaWRlb0RlY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAqIGNhcCA9IGNyZWF0ZVZpZGVvRGVjb2RlckNhcChhdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0RlY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkF1ZGlvRGVjb2RlckNhcCIsIG5hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0RlY29kZXJzLmFkZChjcmVhdGVBdWRpb0RlY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0RlY29kZXJDYXAqIGNhcCA9IGNyZWF0ZUF1ZGlvRGVjb2RlckNhcChhdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0RlY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkVuY29kZXJPdXRwdXRGaWxlRm9ybWF0IiwgbmFtZSkgPT0gMCkgewogICAgICAgICBwcm9maWxlcy0+bUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0cy5hZGQoY3JlYXRlRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQoYXR0cykpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJDYW1jb3JkZXJQcm9maWxlcyIsIG5hbWUpID09IDApIHsKICAgICAgICAgcHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQgPSBnZXRDYW1lcmFJZChhdHRzKTsKICAgICAgICAgcHJvZmlsZXMtPmFkZFN0YXJ0VGltZU9mZnNldChwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkVuY29kZXJQcm9maWxlIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZCgKLSAgICAgICAgICAgIGNyZWF0ZUNhbWNvcmRlclByb2ZpbGUocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMsIHByb2ZpbGVzLT5tQ2FtZXJhSWRzKSk7CisgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKiBwcm9maWxlID0gY3JlYXRlQ2FtY29yZGVyUHJvZmlsZSgKKyAgICAgICAgICBwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cywgcHJvZmlsZXMtPm1DYW1lcmFJZHMpOworICAgICAgaWYgKHByb2ZpbGUgIT0gbnVsbHB0cikgeworICAgICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiSW1hZ2VFbmNvZGluZyIsIG5hbWUpID09IDApIHsKICAgICAgICAgcHJvZmlsZXMtPmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKaW5kZXggMDkzNmE5OS4uZWM1MmE0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKICAgICB0aGlzLT52YWx1ZSA9IHZhbHVlOwogfQogCi1NZWRpYVJlc291cmNlOjpNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpIHsKK01lZGlhUmVzb3VyY2U6Ok1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpIHsKICAgICB0aGlzLT50eXBlID0gdHlwZTsKICAgICB0aGlzLT5zdWJUeXBlID0gU3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZTsKICAgICB0aGlzLT5pZCA9IGlkOwpAQCAtNDMsMTEgKzQzLDExIEBACiB9CiAKIC8vc3RhdGljCi1NZWRpYVJlc291cmNlIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIGJvb2wgdmlkZW8pIHsKK01lZGlhUmVzb3VyY2UgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShib29sIHNlY3VyZSwgYm9vbCB2aWRlbywgaW50NjRfdCBpbnN0YW5jZUNvdW50KSB7CiAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoCiAgICAgICAgICAgICBzZWN1cmUgPyBUeXBlOjprU2VjdXJlQ29kZWMgOiBUeXBlOjprTm9uU2VjdXJlQ29kZWMsCiAgICAgICAgICAgICB2aWRlbyA/IFN1YlR5cGU6OmtWaWRlb0NvZGVjIDogU3ViVHlwZTo6a0F1ZGlvQ29kZWMsCi0gICAgICAgICAgICAxKTsKKyAgICAgICAgICAgIGluc3RhbmNlQ291bnQpOwogfQogCiAvL3N0YXRpYwpAQCAtNjYsMTEgKzY2LDExIEBACiB9CiAKIC8vc3RhdGljCi1NZWRpYVJlc291cmNlIE1lZGlhUmVzb3VyY2U6OkRybVNlc3Npb25SZXNvdXJjZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSkgeworTWVkaWFSZXNvdXJjZSBNZWRpYVJlc291cmNlOjpEcm1TZXNzaW9uUmVzb3VyY2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKSB7CiAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoVHlwZTo6a0RybVNlc3Npb24sIGlkLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBTdHJpbmc4IGJ5dGVzVG9IZXhTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmYnl0ZXMpIHsKK3N0YXRpYyBTdHJpbmc4IGJ5dGVzVG9IZXhTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmJ5dGVzKSB7CiAgICAgU3RyaW5nOCBzdHI7CiAgICAgZm9yIChhdXRvICZiIDogYnl0ZXMpIHsKICAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJTAyeCIsIGIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcAppbmRleCBlNzFlYTJjLi5kYTI3MmUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcApAQCAtMTgsOCArMTgsOSBAQAogI2RlZmluZSBMT0dfVEFHICJNaWRpSW9XcmFwcGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCmluZGV4IDNhOWZiOGIuLjc5ODMxODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAotI2luY2x1ZGUgPGpuaS5oPgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlibWVkaWEvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzkwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw2IEBACisvLyB0ZXN0X21hcHBpbmcgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIkNvZGVjTGlzdFRlc3QiIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyZDUyMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuSVJlc291cmNlTWFuYWdlckNsaWVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVzb3VyY2VQYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJlc291cmNlUG9saWN5UGFyY2VsOwotCi0vKioKLSAqIFJlc291cmNlTWFuYWdlclNlcnZpY2UgaW50ZXJmYWNlIHRoYXQga2VlcHMgdHJhY2sgb2YgbWVkaWEgcmVzb3VyY2UKLSAqIG93bmVkIGJ5IGNsaWVudHMsIGFuZCByZWNsYWltcyByZXNvdXJjZXMgYmFzZWQgb24gY29uZmlndXJlZCBwb2xpY2llcwotICogd2hlbiBuZWNlc3NhcnkuCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSVJlc291cmNlTWFuYWdlclNlcnZpY2UgewotICAgIGNvbnN0IEB1dGY4SW5DcHAgU3RyaW5nIGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzCi0gICAgICAgICAgICA9ICJzdXBwb3J0cy1tdWx0aXBsZS1zZWN1cmUtY29kZWNzIjsKLSAgICBjb25zdCBAdXRmOEluQ3BwIFN0cmluZyBrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMKLSAgICAgICAgICAgID0gInN1cHBvcnRzLXNlY3VyZS13aXRoLW5vbi1zZWN1cmUtY29kZWMiOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIHRoZSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHRvIGFkb3B0ZWQgcGFydGljdWxhciBwb2xpY2llcyB3aGVuCi0gICAgICogbWFuYWdpbmcgdGhlIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb2xpY2llcyBhbiBhcnJheSBvZiBwb2xpY2llcyB0byBiZSBhZG9wdGVkLgotICAgICAqLwotICAgIHZvaWQgY29uZmlnKGluIE1lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWxbXSBwb2xpY2llcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjbGllbnQgdG8gYSBwcm9jZXNzIHdpdGggYSBsaXN0IG9mIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaWQgcGlkIG9mIHRoZSBjbGllbnQuCi0gICAgICogQHBhcmFtIHVpZCB1aWQgb2YgdGhlIGNsaWVudC4KLSAgICAgKiBAcGFyYW0gY2xpZW50SWQgYW4gaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNsaWVudCB3aXRoaW4gdGhlIHBpZC4KLSAgICAgKiBAcGFyYW0gY2xpZW50IGludGVyZmFjZSBmb3IgdGhlIFJlc291cmNlTWFuYWdlclNlcnZpY2UgdG8gY2FsbCB0aGUgY2xpZW50LgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgcmVzb3VyY2VzIHRvIGJlIGFkZGVkLgotICAgICAqLwotICAgIHZvaWQgYWRkUmVzb3VyY2UoCi0gICAgICAgICAgICBpbnQgcGlkLAotICAgICAgICAgICAgaW50IHVpZCwKLSAgICAgICAgICAgIGxvbmcgY2xpZW50SWQsCi0gICAgICAgICAgICBJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGNsaWVudCwKLSAgICAgICAgICAgIGluIE1lZGlhUmVzb3VyY2VQYXJjZWxbXSByZXNvdXJjZXMpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0ZWQgcmVzb3VyY2VzIGZyb20gYSBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGlkIHBpZCBmcm9tIHdoaWNoIHRoZSBsaXN0IG9mIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIGZyb20gd2hpY2ggdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHdpbGwgYmUgcmVtb3ZlZC4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIHJlc291cmNlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZVJlc291cmNlKGludCBwaWQsIGxvbmcgY2xpZW50SWQsIGluIE1lZGlhUmVzb3VyY2VQYXJjZWxbXSByZXNvdXJjZXMpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFsbCByZXNvdXJjZXMgZnJvbSBhIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaWQgcGlkIGZyb20gd2hpY2ggdGhlIGNsaWVudCdzIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIHRoYXQgd2lsbCBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGludCBwaWQsIGxvbmcgY2xpZW50SWQpOwotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gcmVjbGFpbSByZXNvdXJjZSBmcm9tIHByb2Nlc3NlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlCi0gICAgICogY2FsbGluZyBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsaW5nUGlkIHBpZCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgcmVzb3VyY2VzIHRvIGJlIHJlY2xhaW1lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjbGFpbSB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gcmVjbGFpbVJlc291cmNlKGludCBjYWxsaW5nUGlkLCBpbiBNZWRpYVJlc291cmNlUGFyY2VsW10gcmVzb3VyY2VzKTsKLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRoZSBwaWQgb2Ygb3JpZ2luYWwgY2FsbGluZyBwcm9jZXNzIHdpdGggdGhlIHBpZCBvZiB0aGUgcHJvY2VzcwotICAgICAqIHdobyBhY3R1YWxseSB1c2UgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxQaWQgcGlkIG9mIHRoZSBvcmlnaW5hbCBjYWxsaW5nIHByb2Nlc3MuCi0gICAgICogQHBhcmFtIG5ld1BpZCBwaWQgb2YgdGhlIGFjdHVhbCBwcm9jZXNzIHdobyB1c2UgdGhlIHJlc291cmNlcy4KLSAgICAgKiAgICAgICAgcmVtb3ZlIGV4aXN0aW5nIG92ZXJyaWRlIG9uIG9yaWdpbmFsUGlkIGlmIG5ld1BpZCBpcyAtMS4KLSAgICAgKi8KLSAgICB2b2lkIG92ZXJyaWRlUGlkKGludCBvcmlnaW5hbFBpZCwgaW50IG5ld1BpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrIGEgY2xpZW50IGZvciBwZW5kaW5nIHJlbW92YWwKLSAgICAgKgotICAgICAqIEBwYXJhbSBwaWQgcGlkIGZyb20gd2hpY2ggdGhlIGNsaWVudCdzIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIHRoYXQgd2lsbCBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHZvaWQgbWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGludCBwaWQsIGxvbmcgY2xpZW50SWQpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggYTRjMGVjNi4uMzU0OGExZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC01OSw2ICs1OSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4mIHNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRCdWZmZXJpbmdTZXR0aW5ncygKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggZjJlMjA2MC4uYTQyMDdlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oPgogCisjaW5jbHVkZSA8c3RyaW5nPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElNZWRpYVBsYXllcjsKQEAgLTQ3LDcgKzQ5LDggQEAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiBjcmVhdGVNZWRpYVJlY29yZGVyKGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gY3JlYXRlTWV0YWRhdGFSZXRyaWV2ZXIoKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSA9IDA7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb3BQYWNrYWdlID0gIiIpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0Q29kZWNMaXN0KCkgY29uc3QgPSAwOwogCiAgICAgLy8gQ29ubmVjdHMgdG8gYSByZW1vdGUgZGlzcGxheS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKaW5kZXggZTczNjJjMS4uNDcxMjUyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKQEAgLTM1LDEzICszNSwxMyBAQAogICAgIE1lZGlhUmVzb3VyY2UoKSA9IGRlbGV0ZTsKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgaW50NjRfdCB2YWx1ZSk7CiAgICAgTWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIFN1YlR5cGUgc3ViVHlwZSwgaW50NjRfdCB2YWx1ZSk7Ci0gICAgTWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKTsKKyAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKTsKIAotICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIGJvb2wgdmlkZW8pOworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIGJvb2wgdmlkZW8sIGludDY0X3QgaW5zdGFuY2VDb3VudCA9IDEpOwogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIEdyYXBoaWNNZW1vcnlSZXNvdXJjZShpbnQ2NF90IHZhbHVlKTsKICAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBDcHVCb29zdFJlc291cmNlKCk7CiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgVmlkZW9CYXR0ZXJ5UmVzb3VyY2UoKTsKLSAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBEcm1TZXNzaW9uUmVzb3VyY2UoY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpOworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIERybVNlc3Npb25SZXNvdXJjZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpOwogfTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhNZWRpYVJlc291cmNlOjpUeXBlIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggMTM4YTAxNC4uMWZlNmZmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTczLDYgKzczLDcgQEAKICAgICBNRVRBREFUQV9LRVlfQ09MT1JfUkFOR0UgICAgID0gMzcsCiAgICAgTUVUQURBVEFfS0VZX1NBTVBMRVJBVEUgICAgICA9IDM4LAogICAgIE1FVEFEQVRBX0tFWV9CSVRTX1BFUl9TQU1QTEUgPSAzOSwKKyAgICBNRVRBREFUQV9LRVlfVklERU9fQ09ERUNfTUlNRV9UWVBFID0gNDAsCiAKICAgICAvLyBBZGQgbW9yZSBoZXJlLi4uCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDIzMzVjNWEuLjcxYzBiYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAorI2luY2x1ZGUgPHN0cmluZz4KKwogc3RydWN0IEFOYXRpdmVXaW5kb3c7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTYwLDYgKzYyLDcgQEAKICAgICBNRURJQV9NRVRBX0RBVEEgICAgICAgICA9IDIwMiwKICAgICBNRURJQV9EUk1fSU5GTyAgICAgICAgICA9IDIxMCwKICAgICBNRURJQV9USU1FX0RJU0NPTlRJTlVJVFkgPSAyMTEsCisgICAgTUVESUFfSU1TX1JYX05PVElDRSAgICAgPSAzMDAsCiAgICAgTUVESUFfQVVESU9fUk9VVElOR19DSEFOR0VEID0gMTAwMDAsCiB9OwogCkBAIC0xNzcsNyArMTgwLDEwIEBACiAgICAgS0VZX1BBUkFNRVRFUl9QTEFZQkFDS19SQVRFX1BFUk1JTExFID0gMTMwMCwgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKIAogICAgIC8vIFNldCBhIFBhcmNlbCBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiBhIHBhcmNlbGxlZCBKYXZhIEF1ZGlvQXR0cmlidXRlIGluc3RhbmNlCi0gICAgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTID0gMTQwMCAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKyAgICBLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMgPSAxNDAwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKworICAgIC8vIFNldCBhIFBhcmNlbCBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgUlRQIGF0dHJpYnV0ZQorICAgIEtFWV9QQVJBTUVURVJfUlRQX0FUVFJJQlVURVMgPSAyMDAwICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb25seQogfTsKIAogLy8gS2VlcCBJTlZPS0VfSURfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIuamF2YS4KQEAgLTIwNSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBJTWVkaWFEZWF0aE5vdGlmaWVyCiB7CiBwdWJsaWM6Ci0gICAgTWVkaWFQbGF5ZXIoKTsKKyAgICBNZWRpYVBsYXllcihjb25zdCBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lID0gIiIpOwogICAgIH5NZWRpYVBsYXllcigpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGRpZWQoKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCk7CkBAIC0yMTcsNiArMjIzLDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3QgU3RyaW5nOCYgcnRwUGFyYW1zKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMaXN0ZW5lcihjb25zdCBzcDxNZWRpYVBsYXllckxpc3RlbmVyPiYgbGlzdGVuZXIpOwpAQCAtMzA4LDYgKzMxNSw3IEBACiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgIG1SZXRyYW5zbWl0RW5kcG9pbnQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCA2ZTJkOTRkLi5mYmNkYjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMjkxLDYgKzI5MSw4IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc091dHB1dEZpbGVTZXQ7CiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TG9jazsKKworICAgIG91dHB1dF9mb3JtYXQgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0OwogfTsKIAogfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggMWZhZGM5NC4uMzBjNTAwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtNDEsNyArNDEsNyBAQAogCiB1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOwogCi1NZWRpYVBsYXllcjo6TWVkaWFQbGF5ZXIoKQorTWVkaWFQbGF5ZXI6Ok1lZGlhUGxheWVyKGNvbnN0IHN0ZDo6c3RyaW5nIG9wUGFja2FnZU5hbWUpIDogbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKICAgICBtTGlzdGVuZXIgPSBOVUxMOwpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgaWYgKHVybCAhPSBOVUxMKSB7CiAgICAgICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UoZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOwogICAgICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkKSk7CisgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkLCBtT3BQYWNrYWdlTmFtZSkpOwogICAgICAgICAgICAgaWYgKChOT19FUlJPUiAhPSBkb1NldFJldHJhbnNtaXRFbmRwb2ludChwbGF5ZXIpKSB8fAogICAgICAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycykpKSB7CiAgICAgICAgICAgICAgICAgcGxheWVyLmNsZWFyKCk7CkBAIC0xNjksNyArMTY5LDcgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UoZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOwogICAgIGlmIChzZXJ2aWNlICE9IDApIHsKLSAgICAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIoc2VydmljZS0+Y3JlYXRlKHRoaXMsIG1BdWRpb1Nlc3Npb25JZCkpOworICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkLCBtT3BQYWNrYWdlTmFtZSkpOwogICAgICAgICBpZiAoKE5PX0VSUk9SICE9IGRvU2V0UmV0cmFuc21pdEVuZHBvaW50KHBsYXllcikpIHx8CiAgICAgICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpKSB7CiAgICAgICAgICAgICBwbGF5ZXIuY2xlYXIoKTsKQEAgLTE4NSw3ICsxODUsNyBAQAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZShnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkKSk7CisgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQsIG1PcFBhY2thZ2VOYW1lKSk7CiAgICAgICAgIGlmICgoTk9fRVJST1IgIT0gZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQocGxheWVyKSkgfHwKICAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2Uoc291cmNlKSkpIHsKICAgICAgICAgICAgIHBsYXllci5jbGVhcigpOwpAQCAtMTk1LDYgKzE5NSwyMiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyOjpzZXREYXRhU291cmNlKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykKK3sKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZShydHBQYXJhbXMpIik7CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKKyAgICBpZiAoc2VydmljZSAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQsIG1PcFBhY2thZ2VOYW1lKSk7CisgICAgICAgIGlmICgoTk9fRVJST1IgIT0gZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQocGxheWVyKSkgfHwKKyAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2UocnRwUGFyYW1zKSkpIHsKKyAgICAgICAgICAgIHBsYXllci5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVyciA9IGF0dGFjaE5ld1BsYXllcihwbGF5ZXIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6aW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtOTQzLDYgKzk1OSw5IEBACiAgICAgY2FzZSBNRURJQV9NRVRBX0RBVEE6CiAgICAgICAgIEFMT0dWKCJSZWNlaXZlZCB0aW1lZCBtZXRhZGF0YSBtZXNzYWdlIik7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfSU1TX1JYX05PVElDRToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIElNUyBSeCBub3RpY2UgbWVzc2FnZSIpOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVigidW5yZWNvZ25pemVkIG1lc3NhZ2U6ICglZCwgJWQsICVkKSIsIG1zZywgZXh0MSwgZXh0Mik7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCA3MDY1NWQ1Li5kOWQxZjI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtMjQ0LDYgKzI0NCw3IEBACiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9FUlJPUjsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CisgICAgbU91dHB1dEZvcm1hdCA9IChvdXRwdXRfZm9ybWF0KW9mOwogICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9EQVRBU09VUkNFX0NPTkZJR1VSRUQ7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTQ3OSw2ICs0ODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNRURJQV9SRUNPUkRFUl9QUkVQQVJFRCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9SRUNPUkRFUl9FUlJPUikpOworCisgICAgLy8gRm9yIFJUUCB2aWRlbywgcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgZHluYW1pY2FsbHkuCisgICAgaWYgKGlzSW52YWxpZFN0YXRlKSB7CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1JFQ09SREVSX1JFQ09SRElORyAmJgorICAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1JUUF9BVlApCisgICAgICAgICAgICBpc0ludmFsaWRTdGF0ZSA9IGZhbHNlOworICAgIH0KICAgICBpZiAoaXNJbnZhbGlkU3RhdGUpIHsKICAgICAgICAgQUxPR0UoInNldFBhcmFtZXRlcnMgaXMgY2FsbGVkIGluIGFuIGludmFsaWQgc3RhdGU6ICVkIiwgbUN1cnJlbnRTdGF0ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTczNyw2ICs3NDUsNyBAQAogICAgIG1Jc0F1ZGlvRW5jb2RlclNldCA9IGZhbHNlOwogICAgIG1Jc1ZpZGVvRW5jb2RlclNldCA9IGZhbHNlOwogICAgIG1Jc091dHB1dEZpbGVTZXQgICA9IGZhbHNlOworICAgIG1PdXRwdXRGb3JtYXQgICAgICA9IE9VVFBVVF9GT1JNQVRfREVGQVVMVDsKIH0KIAogLy8gUmVsZWFzZSBzaG91bGQgYmUgT0sgaW4gYW55IHN0YXRlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzBkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkNvZGVjTGlzdFRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQ29kZWNMaXN0VGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY2xpc3QiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQ29kZWNMaXN0VGVzdC5jcHAgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQ29kZWNMaXN0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYWRmNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9Db2RlY0xpc3RUZXN0LmNwcApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNMaXN0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CisKKyNkZWZpbmUga1N3Q29kZWNYbWxQYXRoICIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2V0Yy8iCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdHJ1Y3QgQ2RkUmVxIHsKKyAgICBDZGRSZXEoY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyKSB7CisgICAgICAgIG1lZGlhVHlwZSA9IHR5cGU7CisgICAgICAgIGlzRW5jb2RlciA9IGVuY29kZXI7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqbWVkaWFUeXBlOworICAgIGJvb2wgaXNFbmNvZGVyOworfTsKKworVEVTVChDb2RlY0xpc3RUZXN0LCBDb2RlY0xpc3RTYW5pdHlUZXN0KSB7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKGxpc3QsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IE1lZGlhQ29kZWNMaXN0IGluc3RhbmNlLiI7CisgICAgRVhQRUNUX0dUKGxpc3QtPmNvdW50Q29kZWNzKCksIDApIDw8ICJObyBjb2RlY3MgaW4gQ29kZWNMaXN0IjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3QtPmNvdW50Q29kZWNzKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpKTsKKyAgICAgICAgQVNTRVJUX05FKGluZm8sIG51bGxwdHIpIDw8ICJDb2RlY0luZm8gaXMgbnVsbCI7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBsaXN0LT5maW5kQ29kZWNCeU5hbWUoaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICBFWFBFQ1RfR0UoaW5kZXgsIDApIDw8ICJXYXNuJ3QgYWJsZSB0byBmaW5kIGV4aXN0aW5nIGNvZGVjOiAiIDw8IGluZm8tPmdldENvZGVjTmFtZSgpOworICAgIH0KK30KKworVEVTVChDb2RlY0xpc3RUZXN0LCBDb2RlY0xpc3RCeVR5cGVUZXN0KSB7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKGxpc3QsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IE1lZGlhQ29kZWNMaXN0IGluc3RhbmNlLiI7CisKKyAgICBzdGQ6OnZlY3RvcjxDZGRSZXE+IGNkZFJlcXsKKyAgICAgICAgICAgIC8vIG1lZGlhIHR5cGUsIGlzRW5jb2RlcgorICAgICAgICAgICAgQ2RkUmVxKE1JTUVUWVBFX0FVRElPX0FBQywgZmFsc2UpLAorICAgICAgICAgICAgQ2RkUmVxKE1JTUVUWVBFX0FVRElPX0FBQywgdHJ1ZSksCisKKyAgICAgICAgICAgIENkZFJlcShNSU1FVFlQRV9WSURFT19BVkMsIGZhbHNlKSwKKyAgICAgICAgICAgIENkZFJlcShNSU1FVFlQRV9WSURFT19IRVZDLCBmYWxzZSksCisgICAgICAgICAgICBDZGRSZXEoTUlNRVRZUEVfVklERU9fTVBFRzQsIGZhbHNlKSwKKyAgICAgICAgICAgIENkZFJlcShNSU1FVFlQRV9WSURFT19WUDgsIGZhbHNlKSwKKyAgICAgICAgICAgIENkZFJlcShNSU1FVFlQRV9WSURFT19WUDksIGZhbHNlKSwKKworICAgICAgICAgICAgQ2RkUmVxKE1JTUVUWVBFX1ZJREVPX0FWQywgdHJ1ZSksCisgICAgICAgICAgICBDZGRSZXEoTUlNRVRZUEVfVklERU9fVlA4LCB0cnVlKSwKKyAgICB9OworCisgICAgZm9yIChDZGRSZXEgY29kZWNSZXEgOiBjZGRSZXEpIHsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IGxpc3QtPmZpbmRDb2RlY0J5VHlwZShjb2RlY1JlcS5tZWRpYVR5cGUsIGNvZGVjUmVxLmlzRW5jb2Rlcik7CisgICAgICAgIEVYUEVDVF9HRShpbmRleCwgMCkgPDwgIldhc24ndCBhYmxlIHRvIGZpbmQgY29kZWMgZm9yIG1lZGlhIHR5cGU6ICIgPDwgY29kZWNSZXEubWVkaWFUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGNvZGVjUmVxLmlzRW5jb2RlciA/ICIgZW5jb2RlciIgOiAiIGRlY29kZXIiKTsKKyAgICB9Cit9CisKK1RFU1QoQ29kZWNJbmZvVGVzdCwgTGlzdEluZm9UZXN0KSB7CisgICAgQUxPR1YoIkNvbXBhcmUgQ29kZWNJbmZvIHdpdGggaW5mbyBpbiBYTUwiKTsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXI7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIlhNTCBQYXJzaW5nIGZhaWxlZCBmb3IgZGVmYXVsdCBwYXRocyI7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnhtbEZpbGVzID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldERlZmF1bHRYbWxOYW1lcygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmc2VhcmNoRGlyc0FwZXh7c3RkOjpzdHJpbmcoa1N3Q29kZWNYbWxQYXRoKX07CisgICAgc3RhdHVzID0gcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoeG1sRmlsZXMsIHNlYXJjaERpcnNBcGV4KTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIlhNTCBQYXJzaW5nIG9mICIgPDwga1N3Q29kZWNYbWxQYXRoIDw8ICIgZmFpbGVkIjsKKworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY01hcCBjb2RlY01hcCA9IHBhcnNlci5nZXRDb2RlY01hcCgpOworCisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKGxpc3QsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IE1lZGlhQ29kZWNMaXN0IGluc3RhbmNlIjsKKworICAgIC8vIENvbXBhcmUgQ29kZWNNYXAgZnJvbSBYTUwgdG8gQ29kZWNMaXN0CisgICAgZm9yIChhdXRvIG1hcEl0ZXIgOiBjb2RlY01hcCkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbGlzdC0+ZmluZENvZGVjQnlOYW1lKG1hcEl0ZXIuZmlyc3QuY19zdHIoKSk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdICIgPDwgbWFwSXRlci5maXJzdCA8PCAiIG5vdCBmb3VuZCBpbiBDb2RlY0xpc3QgXG4iOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpbmRleCk7CisgICAgICAgIEFTU0VSVF9ORShpbmZvLCBudWxscHRyKSA8PCAiQ29kZWNJbmZvIGlzIG51bGwiOworCisgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgY29kZWNQcm9wZXJ0aWVzID0gbWFwSXRlci5zZWNvbmQ7CisgICAgICAgIEFTU0VSVF9FUShjb2RlY1Byb3BlcnRpZXMuaXNFbmNvZGVyLCBpbmZvLT5pc0VuY29kZXIoKSkgPDwgIkVuY29kZXIgcHJvcGVydHkgbWlzbWF0Y2giOworCisgICAgICAgIEFMT0dWKCJjb2RlYyBuYW1lOiAlcyIsIGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgQUxPR1YoImNvZGVjIHJhbms6ICVkIiwgaW5mby0+Z2V0UmFuaygpKTsKKyAgICAgICAgQUxPR1YoImNvZGVjIG93bmVybmFtZTogJXMiLCBpbmZvLT5nZXRPd25lck5hbWUoKSk7CisgICAgICAgIEFMT0dWKCJjb2RlYyBpc0VuY29kZXI6ICVkIiwgaW5mby0+aXNFbmNvZGVyKCkpOworCisgICAgICAgIEFMT0dWKCJhdHRyaWJ1dGVGbGFnczoga0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQsIGtGbGFnSXNTb2Z0d2FyZU9ubHksIGtGbGFnSXNWZW5kb3IsICIKKyAgICAgICAgICAgICAgImtGbGFnSXNFbmNvZGVyIik7CisgICAgICAgIHN0ZDo6Yml0c2V0PDQ+IGF0dHIoaW5mby0+Z2V0QXR0cmlidXRlcygpKTsKKyAgICAgICAgQUxPR1YoImNvZGVjIGF0dHJpYnV0ZXM6ICVzIiwgYXR0ci50b19zdHJpbmcoKS5jX3N0cigpKTsKKworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIEFMT0dWKCJzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgY291bnQ6ICV6dSIsIG1lZGlhVHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKG1lZGlhVHlwZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIDw8ICJubyBtZWRpYSB0eXBlIHN1cHBvcnRlZCBieSBjb2RlYzogIiA8PCBpbmZvLT5nZXRDb2RlY05hbWUoKTsKKworICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6VHlwZU1hcCB0eXBlTWFwID0gY29kZWNQcm9wZXJ0aWVzLnR5cGVNYXA7CisgICAgICAgIGZvciAoYXV0byBtZWRpYVR5cGUgOiBtZWRpYVR5cGVzKSB7CisgICAgICAgICAgICBBTE9HVigiY29kZWMgbWVkaWFUeXBlczogJXMiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICBhdXRvIHNlYXJjaFR5cGVNYXAgPSB0eXBlTWFwLmZpbmQobWVkaWFUeXBlLmNfc3RyKCkpOworICAgICAgICAgICAgQVNTRVJUX05FKHNlYXJjaFR5cGVNYXAsIHR5cGVNYXAuZW5kKCkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb2RlY0xpc3QgZG9lc24ndCBjb250YWluIGNvZGVjIG1lZGlhIHR5cGU6ICIgPDwgbWVkaWFUeXBlLmNfc3RyKCk7CisgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwIGF0dHJpYnV0ZU1hcCA9IHNlYXJjaFR5cGVNYXAtPnNlY29uZDsKKworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcGFiaWxpdGllcyA9CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtZWRpYVR5cGUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gY29sb3JGb3JtYXRzOworICAgICAgICAgICAgY2FwYWJpbGl0aWVzLT5nZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoJmNvbG9yRm9ybWF0cyk7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29sb3JGb3JtYXQgOiBjb2xvckZvcm1hdHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic3VwcG9ydGVkIGNvbG9yIGZvcm1hdHM6ICVkIiwgY29sb3JGb3JtYXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgIGNhcGFiaWxpdGllcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7CisgICAgICAgICAgICBpZiAoIXByb2ZpbGVMZXZlbHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzdXBwb3J0ZWQgcHJvZmlsZWxldmVsIGZvciBtZWRpYSB0eXBlOiAlcyIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYXV0byBwcm9maWxlTGV2ZWwgOiBwcm9maWxlTGV2ZWxzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInByb2ZpbGU6ICVkLCBsZXZlbDogJWQiLCBwcm9maWxlTGV2ZWwubVByb2ZpbGUsIHByb2ZpbGVMZXZlbC5tTGV2ZWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IGNhcGFiaWxpdGllcy0+Z2V0RGV0YWlscygpOworICAgICAgICAgICAgQVNTRVJUX05FKGRldGFpbHMsIG51bGxwdHIpIDw8ICJEZXRhaWxzIGluIGNvZGVjIGNhcGFiaWxpdGllcyBpcyBudWxsIjsKKyAgICAgICAgICAgIEFMT0dWKCJuby4gb2YgZW50cmllcyBpbiBkZXRhaWxzOiAlenUiLCBkZXRhaWxzLT5jb3VudEVudHJpZXMoKSk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGlkeERldGFpbCA9IDA7IGlkeERldGFpbCA8IGRldGFpbHMtPmNvdW50RW50cmllcygpOyBpZHhEZXRhaWwrKykgeworICAgICAgICAgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGRldGFpbHMtPmdldEVudHJ5TmFtZUF0KGlkeERldGFpbCwgJnR5cGUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJkZXRhaWxzIGVudHJ5IG5hbWU6ICVzIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW1EYXRhID0gZGV0YWlscy0+Z2V0RW50cnlBdChpZHhEZXRhaWwpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtRGF0YS5maW5kKCZ2YWwzMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZW50cnkgaW50IHZhbDogJWQiLCB2YWwzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzZWFyY2hBdHRyID0gYXR0cmlidXRlTWFwLmZpbmQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaEF0dHIgPT0gYXR0cmlidXRlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJQYXJzZXIgZG9lc24ndCBoYXZlIGtleTogJXMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b2koc2VhcmNoQXR0ci0+c2Vjb25kKSAhPSB2YWwzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiVmFsdWVzIGRpZG4ndCBtYXRjaCBmb3Iga2V5OiAlcyIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmFsdWVzIGFjdC9leHA6ICVkIC8gJWQiLCB2YWwzMiwgc3RvaShzZWFyY2hBdHRyLT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQVN0cmluZyB2YWxTdHI7IGl0ZW1EYXRhLmZpbmQoJnZhbFN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZW50cnkgc3RyIHZhbDogJXMiLCB2YWxTdHIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzZWFyY2hBdHRyID0gYXR0cmlidXRlTWFwLmZpbmQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaEF0dHIgPT0gYXR0cmlidXRlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJQYXJzZXIgZG9lc24ndCBoYXZlIGtleTogJXMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaEF0dHItPnNlY29uZCAhPSB2YWxTdHIuY19zdHIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiVmFsdWVzIGRpZG4ndCBtYXRjaCBmb3Iga2V5OiAlcyIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmFsdWVzIGFjdC9leHA6ICVzIC8gJXMiLCB2YWxTdHIuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoQXR0ci0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImRhdGEgdHlwZTogJWQgc2hvdWxkbid0IGJlIHByZXNlbnQgaW4gZGV0YWlscyIsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsICpjb2RlY0luZm9QYXJjZWwgPSBuZXcgUGFyY2VsKCk7CisgICAgICAgIEFTU0VSVF9ORShjb2RlY0luZm9QYXJjZWwsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIHBhcmNlbCI7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5mby0+d3JpdGVUb1BhcmNlbChjb2RlY0luZm9QYXJjZWwpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIldyaXRpbmcgdG8gcGFyY2VsIGZhaWxlZCI7CisKKyAgICAgICAgY29kZWNJbmZvUGFyY2VsLT5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBwYXJjZWxDb2RlY0luZm8gPSBpbmZvLT5Gcm9tUGFyY2VsKCpjb2RlY0luZm9QYXJjZWwpOworICAgICAgICBBU1NFUlRfTkUocGFyY2VsQ29kZWNJbmZvLCBudWxscHRyKSA8PCAiQ29kZWNJbmZvIGZyb20gcGFyY2VsIGlzIG51bGwiOworICAgICAgICBkZWxldGUgY29kZWNJbmZvUGFyY2VsOworCisgICAgICAgIEVYUEVDVF9TVFJFUShpbmZvLT5nZXRDb2RlY05hbWUoKSwgcGFyY2VsQ29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiUmV0dXJuZWQgY29kZWMgbmFtZSBpbiBpbmZvIGRvZXNuJ3QgbWF0Y2giOworICAgICAgICBFWFBFQ1RfRVEoaW5mby0+Z2V0UmFuaygpLCBwYXJjZWxDb2RlY0luZm8tPmdldFJhbmsoKSkKKyAgICAgICAgICAgICAgICA8PCAiUmV0dXJuZWQgY29tcG9uZW50IHJhbmsgaW4gaW5mbyBkb2Vzbid0IG1hdGNoIjsKKyAgICB9Cit9CisKK1RFU1QoQ29kZWNMaXN0VGVzdCwgQ29kZWNMaXN0R2xvYmFsU2V0dGluZ3NUZXN0KSB7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKGxpc3QsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IE1lZGlhQ29kZWNMaXN0IGluc3RhbmNlIjsKKworICAgIHNwPEFNZXNzYWdlPiBnbG9iYWxTZXR0aW5ncyA9IGxpc3QtPmdldEdsb2JhbFNldHRpbmdzKCk7CisgICAgQVNTRVJUX05FKGdsb2JhbFNldHRpbmdzLCBudWxscHRyKSA8PCAiR2xvYmFsU2V0dGluZ3MgQU1lc3NhZ2UgaXMgbnVsbCI7CisgICAgQUxPR1YoImdsb2JhbCBzZXR0aW5nczogJXMiLCBnbG9iYWxTZXR0aW5ncy0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzM3NzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IFZ0c1ZhbGlkYXRlTWVkaWFQcm9maWxlcwotaW5jbHVkZSB0ZXN0L3Z0cy90b29scy9idWlsZC9BbmRyb2lkLmhvc3RfY29uZmlnLm1rCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZFRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjg3MjFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIFZUUyBWdHNWYWxpZGF0ZU1lZGlhUHJvZmlsZXMuIj4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9InBsYW4iIHZhbHVlPSJ2dHMtdHJlYmxlIiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuVnRzRmlsZVB1c2hlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYWJvcnQtb24tcHVzaC1mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWdyb3VwIiB2YWx1ZT0iSG9zdERyaXZlblRlc3QucHVzaCIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJEQVRBL2V0Yy9tZWRpYV9wcm9maWxlcy54c2QtPi9kYXRhL2xvY2FsL3RtcC9tZWRpYV9wcm9maWxlcy54c2QiLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuVnRzTXVsdGlEZXZpY2VUZXN0Ij4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LW1vZHVsZS1uYW1lIiB2YWx1ZT0iVnRzVmFsaWRhdGVNZWRpYVByb2ZpbGVzIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3Qtc291cmNlIiB2YWx1ZT0iXzMyYml0OjpEQVRBL25hdGl2ZXRlc3QvdnRzX21lZGlhUHJvZmlsZXNfdmFsaWRhdGVfdGVzdC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXNvdXJjZSIgdmFsdWU9Il82NGJpdDo6REFUQS9uYXRpdmV0ZXN0NjQvdnRzX21lZGlhUHJvZmlsZXNfdmFsaWRhdGVfdGVzdC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXR5cGUiIHZhbHVlPSJndGVzdCIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjMwcyIvPgotICAgIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IDZmY2JjN2IuLjg0OWRlYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icApAQCAtMyw2ICszLDE4IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMTIsNyArMjQsMTEgQEAKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKLSAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUGFyYW1ldGVyLmNwcCIsCisgICAgICAgICJBdWRpb1ZhbGlkYXRvci5jcHAiLAorICAgICAgICAiVHlwZUNvbnZlcnRlci5jcHAiLAorICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XZXh0cmEiLApAQCAtMjcsNCArNDMsMTAgQEAKICAgICAgICAgImxpYm1lZGlhX2hlbHBlcl9oZWFkZXJzIiwKICAgICBdLAogICAgIGNsYW5nOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1ZhbGlkYXRvci5jcHAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1ZhbGlkYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmZDhhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0F1ZGlvVmFsaWRhdG9yLmNwcApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZhbGlkYXRvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKiByZXR1cm5zIHRydWUgaWYgc3RyaW5nIGlzIG92ZXJmbG93ICovCit0ZW1wbGF0ZSA8c2l6ZV90IHNpemU+Citib29sIGNoZWNrU3RyaW5nT3ZlcmZsb3coY29uc3QgY2hhciAoJnMpW3NpemVdKSB7CisgICAgcmV0dXJuIHN0cm5sZW4ocywgc2l6ZSkgPj0gc2l6ZTsKK30KKworc3RhdHVzX3Qgc2FmZXR5TmV0TG9nKHN0YXR1c190IHN0YXR1cywgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIpIHsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmICFidWdOdW1iZXIuZW1wdHkoKSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgYnVnTnVtYmVyLmRhdGEoKSk7IC8vIFNhZmV0eU5ldCBsb2dnaW5nCisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlcikKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBjb25zdCBzaXplX3QgdGFnc01heFNpemUgPSBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkU7CisgICAgaWYgKHN0cm5sZW4oYXR0ci50YWdzLCB0YWdzTWF4U2l6ZSkgPj0gdGFnc01heFNpemUpIHsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gc2FmZXR5TmV0TG9nKHN0YXR1cywgYnVnTnVtYmVyKTsKK30KKworc3RhdHVzX3QgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlRWZmZWN0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCYgZGVzYywgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKGNoZWNrU3RyaW5nT3ZlcmZsb3coZGVzYy5uYW1lKQorICAgICAgICB8IC8qIGFsd2F5cyAqLyBjaGVja1N0cmluZ092ZXJmbG93KGRlc2MuaW1wbGVtZW50b3IpKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHNhZmV0eU5ldExvZyhzdGF0dXMsIGJ1Z051bWJlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnJiBjb25maWcsIHN0ZDo6c3RyaW5nX3ZpZXcgYnVnTnVtYmVyKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChjb25maWcudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgIGNoZWNrU3RyaW5nT3ZlcmZsb3coY29uZmlnLmV4dC5kZXZpY2UuYWRkcmVzcykpIHsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gc2FmZXR5TmV0TG9nKHN0YXR1cywgYnVnTnVtYmVyKTsKK30KKworbmFtZXNwYWNlIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIHN0cnVjdCBhdWRpb19wb3J0Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydF92Nz46OnZhbHVlLCBpbnQ+ID0gMD4KK3N0YXRpYyBzdGF0dXNfdCB2YWxpZGF0ZUF1ZGlvUG9ydEludGVybmFsKGNvbnN0IFQmIHBvcnQsIHN0ZDo6c3RyaW5nX3ZpZXcgYnVnTnVtYmVyID0ge30pIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoY2hlY2tTdHJpbmdPdmVyZmxvdyhwb3J0Lm5hbWUpKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydENvbmZpZyhwb3J0LmFjdGl2ZV9jb25maWcpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHBvcnQudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgIGNoZWNrU3RyaW5nT3ZlcmZsb3cocG9ydC5leHQuZGV2aWNlLmFkZHJlc3MpKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHNhZmV0eU5ldExvZyhzdGF0dXMsIGJ1Z051bWJlcik7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydCgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnQmIHBvcnQsIHN0ZDo6c3RyaW5nX3ZpZXcgYnVnTnVtYmVyKQoreworICAgIHJldHVybiB2YWxpZGF0ZUF1ZGlvUG9ydEludGVybmFsKHBvcnQsIGJ1Z051bWJlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydCgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcmIHBvcnQsIHN0ZDo6c3RyaW5nX3ZpZXcgYnVnTnVtYmVyKQoreworICAgIHJldHVybiB2YWxpZGF0ZUF1ZGlvUG9ydEludGVybmFsKHBvcnQsIGJ1Z051bWJlcik7Cit9CisKKy8qKiByZXR1cm5zIEJBRF9WQUxVRSBpZiBzYW5pdGl6YXRpb24gd2FzIHJlcXVpcmVkLiAqLworc3RhdHVzX3QgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoJiBwYXRjaCwgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKHBhdGNoLm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHBhdGNoLm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgeworICAgICAgICBpZiAodmFsaWRhdGVBdWRpb1BvcnRDb25maWcocGF0Y2guc291cmNlc1tpXSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgIGlmICh2YWxpZGF0ZUF1ZGlvUG9ydENvbmZpZyhwYXRjaC5zaW5rc1tpXSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FmZXR5TmV0TG9nKHN0YXR1cywgYnVnTnVtYmVyKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU5NGJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogImxpYm1lZGlhX2hlbHBlcl90ZXN0cyIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggNjM4MmNlNC4uZDNhNTE3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTE4LDMwNyArMTgsOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLSNkZWZpbmUgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKHN0cmluZykgeyAjc3RyaW5nLCBzdHJpbmcgfQorI2RlZmluZSBNQUtFX1NUUklOR19GUk9NX0VOVU0oZW51bXZhbCkgeyAjZW51bXZhbCwgZW51bXZhbCB9CiAjZGVmaW5lIFRFUk1JTkFUT1IgeyAubGl0ZXJhbCA9IG51bGxwdHIgfQogCi10ZW1wbGF0ZSA8PgotY29uc3QgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfTElORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRElGKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9GTSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0lQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CVVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1BST1hZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VDSE9fQ0FOQ0VMTEVSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSwKLSAgICAvLyBTVFVCIG11c3QgYmUgYWZ0ZXIgREVGQVVMVCwgc28gdGhlIGxhdHRlciBpcyBwaWNrZWQgdXAgYnkgdG9TdHJpbmcgZmlyc3QuCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfU1RVQiksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotdGVtcGxhdGUgPD4KLWNvbnN0IElucHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBJbnB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9OT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0NPTU1VTklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQUxMX1NDTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSV9BUkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQUxMX1VTQiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9UVl9UVU5FUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9MSU5FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1NQRElGKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0lQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JVUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9QUk9YWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpLAotICAgIC8vIFNUVUIgbXVzdCBiZSBhZnRlciBERUZBVUxULCBzbyB0aGUgbGF0dGVyIGlzIHBpY2tlZCB1cCBieSB0b1N0cmluZyBmaXJzdC4KLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1NUVUIpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLQotdGVtcGxhdGUgPD4KLWNvbnN0IE91dHB1dEZsYWdDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19OT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfVFRTKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUkFXKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfU1lOQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0lFQzk1OF9OT05BVURJTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ00pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQyksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotCi10ZW1wbGF0ZSA8PgotY29uc3QgSW5wdXRGbGFnQ29udmVydGVyOjpUYWJsZSBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX05PTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0ZBU1QpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX1JBVyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfU1lOQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBGb3JtYXRDb252ZXJ0ZXI6OlRhYmxlIEZvcm1hdENvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV84X0JJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FNUl9OQiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BTVJfV0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19NQUlOKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MVFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRVJMQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX1hIRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19NQUlOKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0xDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX1NTUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19MVFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfSEVfVjEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfU0NBTEFCTEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfRVJMQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19MRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19IRV9WMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19FTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfWEhFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9IRV9BQUNfVjEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUMzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VfQUMzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0RUUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9EVFNfSEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfSUVDNjE5MzcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VWUkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRVZSQ0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRVZSQ1dCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VWUkNOVyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURJRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9XTUEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfV01BX1BSTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BTVJfV0JfUExVUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NUDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUUNFTFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRFNEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0ZMQUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUxBQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfU0JDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQVFgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9IRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQzQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTERBQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRV9BQzNfSk9DKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8xXzApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8xKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0xDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0NFTFQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9BREFQVElWRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MSERDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0xIRENfTEwpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9UV1NQKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBPdXRwdXRDaGFubmVsQ29udmVydGVyOjpUYWJsZSBPdXRwdXRDaGFubmVsQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1RSSSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1RSSV9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5EKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF82UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQ0KSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPX0hBUFRJQ19BKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0FCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OT19IQVBUSUNfQUIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0FCKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OlRhYmxlIElucHV0Q2hhbm5lbENvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl82KSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LX01PTk8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTyksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotdGVtcGxhdGUgPD4KLWNvbnN0IENoYW5uZWxJbmRleENvbnZlcnRlcjo6VGFibGUgQ2hhbm5lbEluZGV4Q29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xIiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xKX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMiIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMil9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMpfSwKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180KX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSl9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYpfSwKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183KX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCl9LAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLQotdGVtcGxhdGUgPD4KLWNvbnN0IEdhaW5Nb2RlQ29udmVydGVyOjpUYWJsZSBHYWluTW9kZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9KT0lOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9SQU1QKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBTdHJlYW1UeXBlQ29udmVydGVyOjpUYWJsZSBTdHJlYW1UeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0RFRkFVTFQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9TWVNURU0pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fUklORyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9NVVNJQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9BTEFSTSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9EVE1GKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1RUUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0FTU0lTVEFOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9SRVJPVVRJTkcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fUEFUQ0gpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KIHRlbXBsYXRlPD4KIGNvbnN0IEF1ZGlvTW9kZUNvbnZlcnRlcjo6VGFibGUgQXVkaW9Nb2RlQ29udmVydGVyOjptVGFibGVbXSA9IHsKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTlZBTElEKSwKQEAgLTMzMSw2MiArMzMsNiBAQAogICAgIFRFUk1JTkFUT1IKIH07CiAKLXRlbXBsYXRlPD4KLWNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfTVVTSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfTU9WSUUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi10ZW1wbGF0ZSA8PgotY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9VTktOT1dOKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTUVESUEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQUxBUk0pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9HQU1FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9BU1NJU1RBTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0VNRVJHRU5DWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX1NBRkVUWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX1ZFSElDTEVfU1RBVFVTKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQU5OT1VOQ0VNRU5UKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi10ZW1wbGF0ZSA8PgotY29uc3QgU291cmNlVHlwZUNvbnZlcnRlcjo6VGFibGUgU291cmNlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX01JQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTkspLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkspLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9DQU1DT1JERVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0ZNX1RVTkVSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0hPVFdPUkQpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KIHRlbXBsYXRlIDw+CiBjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7CiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9ORSksCkBAIC00MDksNiArNTUsNyBAQAogCiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPE91dHB1dERldmljZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPElucHV0RGV2aWNlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8RGV2aWNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RmxhZ1RyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPElucHV0RmxhZ1RyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEZvcm1hdFRyYWl0cz47CkBAIC00MjIsMTEgKzY5LDYgQEAKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPjsKIAotYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSkgewotICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpIHx8Ci0gICAgICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKTsKLX0KLQogU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCkKIHsKQEAgLTQ0NiwyMSArODgsMjAgQEAKIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWxGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IGRlZmF1bHRGb3JtYXQpCiB7CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OwotICAgIGlmIChsaXRlcmFsRm9ybWF0LmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXQ7CisgICAgaWYgKCFsaXRlcmFsRm9ybWF0LmVtcHR5KCkgJiYgRm9ybWF0Q29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxGb3JtYXQsIGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdDsKICAgICB9Ci0gICAgRm9ybWF0Q29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxGb3JtYXQsIGZvcm1hdCk7Ci0gICAgcmV0dXJuIGZvcm1hdDsKKyAgICByZXR1cm4gZGVmYXVsdEZvcm1hdDsKIH0KIAogYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZsaXRlcmFsQ2hhbm5lbHMpCiB7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHM7Ci0gICAgaWYgKCFPdXRwdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxDaGFubmVscywgY2hhbm5lbHMpICYmCi0gICAgICAgICAgICAhSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxDaGFubmVscywgY2hhbm5lbHMpKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgaWYgKCFsaXRlcmFsQ2hhbm5lbHMuZW1wdHkoKSAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fc3RyaW5nKGxpdGVyYWxDaGFubmVscy5jX3N0cigpLCAmY2hhbm5lbHMpKSB7CisgICAgICAgIHJldHVybiBjaGFubmVsczsKICAgICB9Ci0gICAgcmV0dXJuIGNoYW5uZWxzOworICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOVkFMSUQ7CiB9CiAKIENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gY2hhbm5lbE1hc2tzRnJvbVN0cmluZygKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvQXVkaW9WYWxpZGF0b3IuaCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvQXVkaW9WYWxpZGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDg4NjhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9BdWRpb1ZhbGlkYXRvci5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fVkFMSURBVE9SX0hfCisjZGVmaW5lIEFORFJPSURfQVVESU9fVkFMSURBVE9SX0hfCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmdfdmlldz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEF1ZGlvVmFsaWRhdG9yIGlzIGEgY2xhc3MgdG8gdmFsaWRhdGUgYXVkaW8gZGF0YSBpbiBiaW5kZXIgY2FsbC4gTk9fRVJST1Igd2lsbCBiZSByZXR1cm5lZCBvbmx5CisgKiB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIHdpdGggdGhlIGRhdGEuCisgKi8KK2NsYXNzIEF1ZGlvVmFsaWRhdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTk9fRVJST1Igb25seSB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIHdpdGggdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm4gQkFEX1ZBTFVFLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCB2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIgPSB7fSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTk9fRVJST1Igb25seSB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIHdpdGggdGhlIGdpdmVuIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgICAqIE90aGVyd2lzZSwgcmV0dXJuIEJBRF9WQUxVRS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgdmFsaWRhdGVFZmZlY3REZXNjcmlwdG9yKAorICAgICAgICAgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCYgZGVzYywgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIgPSB7fSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTk9fRVJST1Igb25seSB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIHdpdGggdGhlIGdpdmVuIGF1ZGlvIHBvcnQgY29uZmlnLgorICAgICAqIE90aGVyd2lzZSwgcmV0dXJuIEJBRF9WQUxVRS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgdmFsaWRhdGVBdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcmIGNvbmZpZywgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIgPSB7fSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTk9fRVJST1Igb25seSB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIHdpdGggdGhlIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm4gQkFEX1ZBTFVFLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCB2YWxpZGF0ZUF1ZGlvUG9ydCgKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0JiBwb3J0LCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlciA9IHt9KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBOT19FUlJPUiBvbmx5IHdoZW4gdGhlcmUgaXMgbm8gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gYXVkaW9fcG9ydF92Ny4KKyAgICAgKiBPdGhlcndpc2UsIHJldHVybiBCQURfVkFMVUUuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHZhbGlkYXRlQXVkaW9Qb3J0KAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcmIHBvcnQsIHN0ZDo6c3RyaW5nX3ZpZXcgdWdOdW1iZXIgPSB7fSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTk9fRVJST1Igb25seSB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIHdpdGggdGhlIGdpdmVuIGF1ZGlvIHBhdGNoLgorICAgICAqIE90aGVyd2lzZSwgcmV0dXJuIEJBRF9WQUxVRS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgdmFsaWRhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoJiBwYXRjaCwgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIgPSB7fSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8qQU5EUk9JRF9BVURJT19WQUxJREFUT1JfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmggYi9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaAppbmRleCAwMTE0OThhLi40MmNjYjVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaApAQCAtMjQsOCArMjQsNiBAQAogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgImNvbnZlcnQuaCIKQEAgLTQzLDE2ICs0MSw2IEBACiAgICAgfQogfTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IFNvcnRlZFZlY3RvclRyYWl0cwotewotICAgIHR5cGVkZWYgVCBUeXBlOwotICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci0gICAgc3RhdGljIHZvaWQgYWRkKENvbGxlY3Rpb24gJmNvbGxlY3Rpb24sIFR5cGUgdmFsdWUpCi0gICAgewotICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7Ci0gICAgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IFNldFRyYWl0cwogewogICAgIHR5cGVkZWYgVCBUeXBlOwpAQCAtMTA4LDEzICs5NiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKIAotICAgIHN0YXRpYyB1aW50MzJfdCBtYXNrRnJvbVN0cmluZygKKyAgICBzdGF0aWMgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIG1hc2tGcm9tU3RyaW5nKAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKICAgICBzdGF0aWMgdm9pZCBtYXNrVG9TdHJpbmcoCi0gICAgICAgICAgICB1aW50MzJfdCBtYXNrLCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKKyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6VHlwZSBtYXNrLCBzdGQ6OnN0cmluZyAmc3RyLAorICAgICAgICAgICAgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKIHByb3RlY3RlZDoKKyAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9ucyB1c2UgbVRhYmxlIGZvciB0by9mcm9tIHN0cmluZyBjb252ZXJzaW9ucworICAgIC8vIG9mIGVhY2ggaW5kaXZpZHVhbCBlbnVtIHZhbHVlLgorICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgc3BlY2lhbGl6ZWQgdG8gdXNlIGV4dGVybmFsIGNvbnZlcnRlcnMgaW5zdGVhZC4KKyAgICBzdGF0aWMgYm9vbCB0b1N0cmluZ0ltcGwoY29uc3QgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cik7CisgICAgc3RhdGljIGJvb2wgZnJvbVN0cmluZ0ltcGwoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZyZXN1bHQpOworCiAgICAgc3RydWN0IFRhYmxlIHsKICAgICAgICAgY29uc3QgY2hhciAqbGl0ZXJhbDsKICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHZhbHVlOwpAQCAtMTI0LDI2ICsxMTksMjIgQEAKIH07CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+Ci1pbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFRyYWl0cz46OnRvU3RyaW5nKGNvbnN0IHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpCi17CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBtVGFibGVbaV0ubGl0ZXJhbDsgaSsrKSB7CiAgICAgICAgIGlmIChtVGFibGVbaV0udmFsdWUgPT0gdmFsdWUpIHsKICAgICAgICAgICAgIHN0ciA9IG1UYWJsZVtpXS5saXRlcmFsOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgY2hhciByZXN1bHRbNjRdOwotICAgIHNucHJpbnRmKHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksICJVbmtub3duIGVudW0gdmFsdWUgJWQiLCB2YWx1ZSk7Ci0gICAgc3RyID0gcmVzdWx0OwogICAgIHJldHVybiBmYWxzZTsKIH0KIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KLWlubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6ZnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnJlc3VsdCkKLXsKK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmcmVzdWx0KSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IG1UYWJsZVtpXS5saXRlcmFsOyBpKyspIHsKICAgICAgICAgaWYgKHN0cmNtcChtVGFibGVbaV0ubGl0ZXJhbCwgc3RyLmNfc3RyKCkpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdHJpbmdUb0VudW0oKSBmb3VuZCAlcyIsIG1UYWJsZVtpXS5saXRlcmFsKTsKICAgICAgICAgICAgIHJlc3VsdCA9IG1UYWJsZVtpXS52YWx1ZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC0xNTIsNiArMTQzLDI2IEBACiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFRyYWl0cz46OnRvU3RyaW5nKGNvbnN0IHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpCit7CisgICAgY29uc3QgYm9vbCBzdWNjZXNzID0gdG9TdHJpbmdJbXBsKHZhbHVlLCBzdHIpOworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICBjaGFyIHJlc3VsdFs2NF07CisgICAgICAgIHNucHJpbnRmKHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksICJVbmtub3duIGVudW0gdmFsdWUgJWQiLCB2YWx1ZSk7CisgICAgICAgIHN0ciA9IHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFRyYWl0cz46OmZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZyZXN1bHQpCit7CisgICAgY29uc3QgYm9vbCBzdWNjZXNzID0gZnJvbVN0cmluZ0ltcGwoc3RyLCByZXN1bHQpOworICAgIEFMT0dWX0lGKHN1Y2Nlc3MsICJzdHJpbmdUb0VudW0oKSBmb3VuZCAlcyIsIHN0ci5jX3N0cigpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KIGlubGluZSB2b2lkIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6Y29sbGVjdGlvbkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwKICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAogICAgICAgICBjb25zdCBjaGFyICpkZWwpCkBAIC0xNjgsNyArMTc5LDggQEAKIH0KIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KLWlubGluZSB1aW50MzJfdCBUeXBlQ29udmVydGVyPFRyYWl0cz46Om1hc2tGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKmRlbCkKK2lubGluZSB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgVHlwZUNvbnZlcnRlcjxUcmFpdHM+OjptYXNrRnJvbVN0cmluZygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3QgY2hhciAqZGVsKQogewogICAgIGNoYXIgKmxpdGVyYWwgPSBzdHJkdXAoc3RyLmNfc3RyKCkpOwogICAgIHVpbnQzMl90IHZhbHVlID0gMDsKQEAgLTE3OSwyMCArMTkxLDI0IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgZnJlZShsaXRlcmFsKTsKLSAgICByZXR1cm4gdmFsdWU7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIFRyYWl0czo6VHlwZT4odmFsdWUpOwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgotaW5saW5lIHZvaWQgVHlwZUNvbnZlcnRlcjxUcmFpdHM+OjptYXNrVG9TdHJpbmcodWludDMyX3QgbWFzaywgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3QgY2hhciAqZGVsKQoraW5saW5lIHZvaWQgVHlwZUNvbnZlcnRlcjxUcmFpdHM+OjptYXNrVG9TdHJpbmcoCisgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6VHlwZSBtYXNrLCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwpCiB7CiAgICAgaWYgKG1hc2sgIT0gMCkgewogICAgICAgICBib29sIGZpcnN0X2ZsYWcgPSB0cnVlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgbVRhYmxlW2ldLmxpdGVyYWw7IGkrKykgewotICAgICAgICAgICAgdWludDMyX3QgdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obVRhYmxlW2ldLnZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtVGFibGVbaV0udmFsdWUgIT0gMCAmJiAoKG1hc2sgJiB2YWx1ZSkgPT0gdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdF9mbGFnKSBzdHIgKz0gZGVsOwotICAgICAgICAgICAgICAgIGZpcnN0X2ZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdHIgKz0gbVRhYmxlW2ldLmxpdGVyYWw7CisgICAgICAgIGZvciAoc2l6ZV90IGJpdCA9IDA7IGJpdCA8IHNpemVvZih1aW50MzJfdCkgKiA4OyArK2JpdCkgeworICAgICAgICAgICAgdWludDMyX3QgZmxhZyA9IDF1IDw8IGJpdDsKKyAgICAgICAgICAgIGlmICgoZmxhZyAmIG1hc2spID09IGZsYWcpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmbGFnX3N0cjsKKyAgICAgICAgICAgICAgICBpZiAodG9TdHJpbmcoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgVHJhaXRzOjpUeXBlPihmbGFnKSwgZmxhZ19zdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RfZmxhZykgc3RyICs9IGRlbDsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RfZmxhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzdHIgKz0gZmxhZ19zdHI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTIwMCw2ICsyMTYsNyBAQAogICAgIH0KIH0KIAordHlwZWRlZiBUeXBlQ29udmVydGVyPERldmljZVRyYWl0cz4gRGV2aWNlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPE91dHB1dERldmljZVRyYWl0cz4gT3V0cHV0RGV2aWNlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPElucHV0RGV2aWNlVHJhaXRzPiBJbnB1dERldmljZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPiBPdXRwdXRGbGFnQ29udmVydGVyOwpAQCAtMjE2LDIzICsyMzMsMjI3IEBACiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPiBTb3VyY2VUeXBlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvRmxhZ1RyYWl0cz4gQXVkaW9GbGFnQ29udmVydGVyOwogCi10ZW1wbGF0ZTw+IGNvbnN0IE91dHB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgT3V0cHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgSW5wdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIElucHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6VGFibGUgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IElucHV0RmxhZ0NvbnZlcnRlcjo6VGFibGUgSW5wdXRGbGFnQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgRm9ybWF0Q29udmVydGVyOjpUYWJsZSBGb3JtYXRDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBPdXRwdXRDaGFubmVsQ29udmVydGVyOjpUYWJsZSBPdXRwdXRDaGFubmVsQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgSW5wdXRDaGFubmVsQ29udmVydGVyOjpUYWJsZSBJbnB1dENoYW5uZWxDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OlRhYmxlIENoYW5uZWxJbmRleENvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IEdhaW5Nb2RlQ29udmVydGVyOjpUYWJsZSBHYWluTW9kZUNvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFN0cmVhbVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBBdWRpb01vZGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvTW9kZUNvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFVzYWdlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IFNvdXJjZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFNvdXJjZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107CiAKLWJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpOwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8RGV2aWNlVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBEZXZpY2VUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fZGV2aWNlX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8RGV2aWNlVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIERldmljZVRyYWl0czo6VHlwZSAmcmVzdWx0KSB7CisgICAgcmV0dXJuIGF1ZGlvX2RldmljZV9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPE91dHB1dERldmljZVRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgT3V0cHV0RGV2aWNlVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKHZhbHVlKSkgeworICAgICAgICBzdHIgPSBhdWRpb19kZXZpY2VfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxPdXRwdXREZXZpY2VUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgT3V0cHV0RGV2aWNlVHJhaXRzOjpUeXBlICZyZXN1bHQpIHsKKyAgICBPdXRwdXREZXZpY2VUcmFpdHM6OlR5cGUgdGVtcDsKKyAgICBpZiAoYXVkaW9fZGV2aWNlX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmdGVtcCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodGVtcCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdGVtcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IElucHV0RGV2aWNlVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UodmFsdWUpKSB7CisgICAgICAgIHN0ciA9IGF1ZGlvX2RldmljZV90b19zdHJpbmcodmFsdWUpOworICAgICAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPElucHV0RGV2aWNlVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIElucHV0RGV2aWNlVHJhaXRzOjpUeXBlICZyZXN1bHQpIHsKKyAgICBJbnB1dERldmljZVRyYWl0czo6VHlwZSB0ZW1wOworICAgIGlmIChhdWRpb19kZXZpY2VfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZ0ZW1wKSAmJgorICAgICAgICAgICAgYXVkaW9faXNfaW5wdXRfZGV2aWNlKHRlbXApKSB7CisgICAgICAgIHJlc3VsdCA9IHRlbXA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPElucHV0RmxhZ1RyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19pbnB1dF9mbGFnX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8SW5wdXRGbGFnVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX2lucHV0X2ZsYWdzX3QgJnJlc3VsdCkgeworICAgIHJldHVybiBhdWRpb19pbnB1dF9mbGFnX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RmxhZ1RyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fb3V0cHV0X2ZsYWdfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX291dHB1dF9mbGFnc190ICZyZXN1bHQpIHsKKyAgICByZXR1cm4gYXVkaW9fb3V0cHV0X2ZsYWdfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxGb3JtYXRUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPEZvcm1hdFRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19mb3JtYXRfdCAmcmVzdWx0KSB7CisgICAgcmV0dXJuIGF1ZGlvX2Zvcm1hdF9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPE91dHB1dENoYW5uZWxUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxPdXRwdXRDaGFubmVsVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX2NoYW5uZWxfbWFza190ICZyZXN1bHQpIHsKKyAgICBPdXRwdXRDaGFubmVsVHJhaXRzOjpUeXBlIHRlbXA7CisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnRlbXApICYmCisgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfY2hhbm5lbCh0ZW1wKSkgeworICAgICAgICByZXN1bHQgPSB0ZW1wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxJbnB1dENoYW5uZWxUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza190b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPElucHV0Q2hhbm5lbFRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19jaGFubmVsX21hc2tfdCAmcmVzdWx0KSB7CisgICAgSW5wdXRDaGFubmVsVHJhaXRzOjpUeXBlIHRlbXA7CisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnRlbXApICYmCisgICAgICAgICAgICBhdWRpb19pc19pbnB1dF9jaGFubmVsKHRlbXApKSB7CisgICAgICAgIHJlc3VsdCA9IHRlbXA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPENoYW5uZWxJbmRleFRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fY2hhbm5lbF9pbmRleF9tYXNrX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8Q2hhbm5lbEluZGV4VHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX2NoYW5uZWxfbWFza190ICZyZXN1bHQpIHsKKyAgICBDaGFubmVsSW5kZXhUcmFpdHM6OlR5cGUgdGVtcDsKKyAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmdGVtcCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24odGVtcCkgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCkgeworICAgICAgICByZXN1bHQgPSB0ZW1wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxTdHJlYW1UcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fc3RyZWFtX3R5cGVfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxTdHJlYW1UcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fc3RyZWFtX3R5cGVfdCAmcmVzdWx0KQoreworICAgIHJldHVybiBhdWRpb19zdHJlYW1fdHlwZV9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPEdhaW5Nb2RlVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19nYWluX21vZGVfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19nYWluX21vZGVfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxHYWluTW9kZVRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19nYWluX21vZGVfdCAmcmVzdWx0KSB7CisgICAgcmV0dXJuIGF1ZGlvX2dhaW5fbW9kZV9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPEF1ZGlvQ29udGVudFRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9fY29udGVudF90eXBlX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fY29udGVudF90eXBlX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8QXVkaW9Db250ZW50VHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX2NvbnRlbnRfdHlwZV90ICZyZXN1bHQpIHsKKyAgICByZXR1cm4gYXVkaW9fY29udGVudF90eXBlX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpCit7CisgICAgc3RyID0gYXVkaW9fdXNhZ2VfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxVc2FnZVRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb191c2FnZV90ICZyZXN1bHQpIHsKKyAgICByZXR1cm4gYXVkaW9fdXNhZ2VfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoY29uc3QgYXVkaW9fc291cmNlX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKQoreworICAgIHN0ciA9IGF1ZGlvX3NvdXJjZV90b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19zb3VyY2VfdCAmcmVzdWx0KSB7CisgICAgcmV0dXJuIGF1ZGlvX3NvdXJjZV9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CiAKIFNhbXBsZVJhdGVUcmFpdHM6OkNvbGxlY3Rpb24gc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzYW1wbGluZ1JhdGVzLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKQEAgLTI1Niw2ICs0NzcsNyBAQAogCiAvLyBjb3VudGluZyBlbnVtZXJhdGlvbnMKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBhdWRpb19jb250ZW50X3R5cGVfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fZGV2aWNlc190Pjo6dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19tb2RlX3Q+Ojp2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX3NvdXJjZV90Pjo6dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19zdHJlYW1fdHlwZV90Pjo6dmFsdWUKQEAgLTI4MiwxNyArNTA0LDYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlcykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKChkZXZpY2VzICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgewotICAgICAgICBJbnB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgT3V0cHV0RGV2aWNlQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZGV2aWNlcywgcmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpCiB7CiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmExMjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJtZWRpYV9oZWxwZXJfdGVzdHMiLAorCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fVjdfMCJdLAorICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX1Y3XzAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJ4c2RjLXV0aWxzIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorCisgICAgc3JjczogWyJ0eXBlY29udmVydGVyX3Rlc3RzLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci90ZXN0cy90eXBlY29udmVydGVyX3Rlc3RzLmNwcCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL3Rlc3RzL3R5cGVjb252ZXJ0ZXJfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YmZiODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci90ZXN0cy90eXBlY29udmVydGVyX3Rlc3RzLmNwcApAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIExPR19UQUcgIlR5cGVDb252ZXJ0ZXJfVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX1Y3XzAuaD4KKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8eHNkYy9Yc2RjU3VwcG9ydC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK25hbWVzcGFjZSB4c2QgewordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvOjpwb2xpY3k6OmNvbmZpZ3VyYXRpb246OlY3XzA7Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VDaGFubmVsTWFza3MpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvQ2hhbm5lbE1hc2s+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2tGcm9tU3RyaW5nKHN0cmluZ1ZhbCk7CisgICAgICAgIEVYUEVDVF9FUShlbnVtVmFsICE9IHhzZDo6QXVkaW9DaGFubmVsTWFzazo6QVVESU9fQ0hBTk5FTF9OT05FLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19pc192YWxpZChjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgPDwgIlZhbGlkaXR5IG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGlzIG5vdCBhcyBleHBlY3RlZCI7CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlSW5wdXRPdXRwdXRJbmRleENoYW5uZWxNYXNrKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0NoYW5uZWxNYXNrPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgY2hhbm5lbE1hc2tCYWNrOworICAgICAgICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxCYWNrOworICAgICAgICBpZiAoc3RyaW5nVmFsLmZpbmQoIl9DSEFOTkVMX0lOXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgaW5wdXQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OnRvU3RyaW5nKGNoYW5uZWxNYXNrLCBzdHJpbmdWYWxCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgaW5wdXQgY2hhbm5lbCBtYXNrICIgPDwgY2hhbm5lbE1hc2sgPDwgIiBmYWlsZWQiOworICAgICAgICAgICAgLy8gRHVlIHRvIGFsaWFzZWQgdmFsdWVzLCB0aGUgcmVzdWx0IG9mICd0b1N0cmluZycgbWlnaHQgbm90IGJlIHRoZSBzYW1lCisgICAgICAgICAgICAvLyBhcyAnc3RyaW5nVmFsJywgdGh1cyB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnN0ZWFkLgorICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbEJhY2ssIGNoYW5uZWxNYXNrQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWxCYWNrIDw8ICJcIiBmYWlsZWQgKGFzIGlucHV0IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgRVhQRUNUX0VRKGNoYW5uZWxNYXNrLCBjaGFubmVsTWFza0JhY2spOworICAgICAgICB9IGVsc2UgaWYgKHN0cmluZ1ZhbC5maW5kKCJfQ0hBTk5FTF9PVVRfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgb3V0cHV0IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6dG9TdHJpbmcoY2hhbm5lbE1hc2ssIHN0cmluZ1ZhbEJhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBvdXRwdXQgY2hhbm5lbCBtYXNrICIgPDwgY2hhbm5lbE1hc2sgPDwgIiBmYWlsZWQiOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWxCYWNrLCBjaGFubmVsTWFza0JhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsQmFjayA8PCAiXCIgZmFpbGVkIChhcyBvdXRwdXQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoY2hhbm5lbE1hc2ssIGNoYW5uZWxNYXNrQmFjayk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsLmZpbmQoIl9DSEFOTkVMX0lOREVYXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgaW5kZXhlZCBjaGFubmVsIG1hc2spIjsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKENoYW5uZWxJbmRleENvbnZlcnRlcjo6dG9TdHJpbmcoY2hhbm5lbE1hc2ssIHN0cmluZ1ZhbEJhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBpbmRleGVkIGNoYW5uZWwgbWFzayAiIDw8IGNoYW5uZWxNYXNrIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHN0cmluZ1ZhbEJhY2spOworICAgICAgICB9IGVsc2UgaWYgKHN0cmluZ1ZhbCA9PSB0b1N0cmluZyh4c2Q6OkF1ZGlvQ2hhbm5lbE1hc2s6OkFVRElPX0NIQU5ORUxfTk9ORSkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIHN1Y2NlZWRlZCAoYXMgaW5wdXQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGNoYW5uZWxNYXNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgc3VjY2VlZGVkIChhcyBvdXRwdXQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoQ2hhbm5lbEluZGV4Q29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgY2hhbm5lbE1hc2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBzdWNjZWVkZWQgKGFzIGluZGV4IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgLy8gTm9uZSBvZiBDb252ZXJ0ZXJzIGNvdWxkIHBhcnNlIHRoaXMgYmVjYXVzZSAnTk9ORScgaXNuJ3QgYSAndmFsaWQnIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICAgICAgLy8gSG93ZXZlciB0aGV5IGFsbCBtdXN0IHN1Y2NlZWQgaW4gY29udmVydGluZyBpdCBiYWNrLgorICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXRDaGFubmVsQ29udmVydGVyOjp0b1N0cmluZyhjaGFubmVsTWFzaywgc3RyaW5nVmFsQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIGlucHV0IGNoYW5uZWwgbWFzayAiIDw8IGNoYW5uZWxNYXNrIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHN0cmluZ1ZhbEJhY2spOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6dG9TdHJpbmcoY2hhbm5lbE1hc2ssIHN0cmluZ1ZhbEJhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBvdXRwdXQgY2hhbm5lbCBtYXNrICIgPDwgY2hhbm5lbE1hc2sgPDwgIiBmYWlsZWQiOworICAgICAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgc3RyaW5nVmFsQmFjayk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OnRvU3RyaW5nKGNoYW5uZWxNYXNrLCBzdHJpbmdWYWxCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgaW5kZXhlZCBjaGFubmVsIG1hc2sgIiA8PCBjaGFubmVsTWFzayA8PCAiIGZhaWxlZCI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCBzdHJpbmdWYWxCYWNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiVW5yZWNvZ25pemVkIGNoYW5uZWwgbWFzayBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VDb250ZW50VHlwZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvQ29udGVudFR5cGU+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlOworICAgICAgICBFWFBFQ1RfVFJVRShBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgY29udGVudFR5cGUpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHRvU3RyaW5nKGNvbnRlbnRUeXBlKSk7CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlRGV2aWNlcykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9EZXZpY2U+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGRldmljZUJhY2s7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbEJhY2s7CisgICAgICAgIEVYUEVDVF9UUlVFKERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGRldmljZSkpCisgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIjsKKyAgICAgICAgaWYgKGVudW1WYWwgIT0geHNkOjpBdWRpb0RldmljZTo6QVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpIHx8IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkRldmljZSBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBpcyBuZWl0aGVyIGlucHV0LCBub3Igb3V0cHV0IGRldmljZSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRHVlIHRvIGFsaWFzZWQgdmFsdWVzLCB0aGUgcmVzdWx0IG9mICd0b1N0cmluZycgbWlnaHQgbm90IGJlIHRoZSBzYW1lCisgICAgICAgIC8vIGFzICdzdHJpbmdWYWwnLCB0aHVzIHdlIG5lZWQgdG8gY29tcGFyZSB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGluc3RlYWQuCisgICAgICAgIHN0cmluZ1ZhbEJhY2sgPSB0b1N0cmluZyhkZXZpY2UpOworICAgICAgICBFWFBFQ1RfVFJVRShEZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsQmFjaywgZGV2aWNlQmFjaykpCisgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbEJhY2sgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9FUShkZXZpY2UsIGRldmljZUJhY2spOworICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZUluT3V0RGV2aWNlcykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9EZXZpY2U+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGRldmljZUJhY2s7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbEJhY2s7CisgICAgICAgIGlmIChzdHJpbmdWYWwuZmluZCgiX0RFVklDRV9JTl8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBkZXZpY2UpKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQgKGFzIGlucHV0IGRldmljZSkiOworICAgICAgICAgICAgLy8gRHVlIHRvIGFsaWFzZWQgdmFsdWVzLCB0aGUgcmVzdWx0IG9mICd0b1N0cmluZycgbWlnaHQgbm90IGJlIHRoZSBzYW1lCisgICAgICAgICAgICAvLyBhcyAnc3RyaW5nVmFsJywgdGh1cyB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnN0ZWFkLgorICAgICAgICAgICAgc3RyaW5nVmFsQmFjayA9IHRvU3RyaW5nKGRldmljZSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWxCYWNrLCBkZXZpY2VCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbEJhY2sgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZGV2aWNlLCBkZXZpY2VCYWNrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWwuZmluZCgiX0RFVklDRV9PVVRfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKE91dHB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGRldmljZSkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgb3V0cHV0IGRldmljZSkiOworICAgICAgICAgICAgc3RyaW5nVmFsQmFjayA9IHRvU3RyaW5nKGRldmljZSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsQmFjaywgZGV2aWNlQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWxCYWNrIDw8ICJcIiBmYWlsZWQiOworICAgICAgICAgICAgRVhQRUNUX0VRKGRldmljZSwgZGV2aWNlQmFjayk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsID09IHRvU3RyaW5nKHhzZDo6QXVkaW9EZXZpY2U6OkFVRElPX0RFVklDRV9OT05FKSkgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKElucHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgZGV2aWNlKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgc3VjY2VlZGVkIChhcyBpbnB1dCBkZXZpY2UpIjsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBkZXZpY2UpKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBzdWNjZWVkZWQgKGFzIG91dHB1dCBkZXZpY2UpIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHRvU3RyaW5nKGRldmljZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRkFJTCgpIDw8ICJVbnJlY29nbml6ZWQgYXVkaW8gZGV2aWNlIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIjsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZUluT3V0RmxhZ3MpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvSW5PdXRGbGFnPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBpZiAoc3RyaW5nVmFsLmZpbmQoIl9JTlBVVF9GTEFHXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWc7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShJbnB1dEZsYWdDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBmbGFnKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIChhcyBpbnB1dCBmbGFnKSI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhmbGFnKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGZsYWcpKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQgKGFzIG91dHB1dCBmbGFnKSI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhmbGFnKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VGb3JtYXRzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0Zvcm1hdD57fSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdWYWwgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OworICAgICAgICBFWFBFQ1RfVFJVRShGb3JtYXRDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBmb3JtYXQpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9UUlVFKGF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJ0ZWQgZm9ybWF0IFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGlzIGludmFsaWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhmb3JtYXQpKTsKKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VHYWluTW9kZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvR2Fpbk1vZGU+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2dhaW5fbW9kZV90IGdhaW5Nb2RlOworICAgICAgICBFWFBFQ1RfVFJVRShHYWluTW9kZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGdhaW5Nb2RlKSkKKyAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhnYWluTW9kZSkpOworICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZVNvdXJjZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvU291cmNlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2U7CisgICAgICAgIEVYUEVDVF9UUlVFKFNvdXJjZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBzb3VyY2UpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9FUShzb3VyY2UgIT0gQVVESU9fU09VUkNFX0RFRkFVTFQsIGF1ZGlvX2lzX3ZhbGlkX2F1ZGlvX3NvdXJjZShzb3VyY2UpKQorICAgICAgICAgICAgICAgIDw8ICJWYWxpZGl0eSBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBpcyBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhzb3VyY2UpKTsKKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VTdHJlYW1UeXBlcykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9TdHJlYW1UeXBlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CisgICAgICAgIEVYUEVDVF9UUlVFKFN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBzdHJlYW1UeXBlKSkKKyAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhzdHJlYW1UeXBlKSk7CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlVXNhZ2VzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb1VzYWdlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlOworICAgICAgICBFWFBFQ1RfVFJVRShVc2FnZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCB1c2FnZSkpCisgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIjsKKyAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgdG9TdHJpbmcodXNhZ2UpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IGE2M2I4YjQuLmMyZTFkYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0zLDcgKzMsNyBAQAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFtZXRyaWNzIiwKIAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggNTMwMWY1Yy4uYjYyMzE3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTE1LDcgKzE1LDkgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImF2LXR5cGVzLWFpZGwtdW5zdGFibGUtY3BwIiwKICAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYW5kcm9pZF9uZXQiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBjMGRhMGNlLi40ZDkwZDk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNDgwLDE0ICs0ODAsMTQgQEAKIH0KIAogc3A8SU1lZGlhUGxheWVyPiBNZWRpYVBsYXllclNlcnZpY2U6OmNyZWF0ZShjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCkKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkLCBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lKQogewogICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBpbnQzMl90IGNvbm5JZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRDb25uSWQpOwogCiAgICAgc3A8Q2xpZW50PiBjID0gbmV3IENsaWVudCgKICAgICAgICAgICAgIHRoaXMsIHBpZCwgY29ubklkLCBjbGllbnQsIGF1ZGlvU2Vzc2lvbklkLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgb3BQYWNrYWdlTmFtZSk7CiAKICAgICBBTE9HVigiQ3JlYXRlIG5ldyBjbGllbnQoJWQpIGZyb20gcGlkICVkLCB1aWQgJWQsICIsIGNvbm5JZCwgcGlkLAogICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTczMyw3ICs3MzMsOCBAQAogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudCgKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwgcGlkX3QgcGlkLAogICAgICAgICBpbnQzMl90IGNvbm5JZCwgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQsIHVpZF90IHVpZCkKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkLCB1aWRfdCB1aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lKQorICAgICAgICA6IG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCiB7CiAgICAgQUxPR1YoIkNsaWVudCglZCkgY29uc3RydWN0b3IiLCBjb25uSWQpOwogICAgIG1QaWQgPSBwaWQ7CkBAIC05MjIsNyArOTIzLDcgQEAKIAogICAgIGlmICghcC0+aGFyZHdhcmVPdXRwdXQoKSkgewogICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksCi0gICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcywgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBtUGlkLCBtQXVkaW9BdHRyaWJ1dGVzLCBtQXVkaW9EZXZpY2VVcGRhdGVkTGlzdGVuZXIsIG1PcFBhY2thZ2VOYW1lKTsKICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwLmdldCgpKS0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CiAgICAgfQogCkBAIC0xMDYyLDYgKzEwNjMsMTcgQEAKICAgICByZXR1cm4gbVN0YXR1cyA9IHNldERhdGFTb3VyY2VfcG9zdChwLCBwLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykgeworICAgIHBsYXllcl90eXBlIHBsYXllclR5cGUgPSBOVV9QTEFZRVI7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gc2V0RGF0YVNvdXJjZV9wcmUocGxheWVyVHlwZSk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgLy8gbm93IHNldCBkYXRhIHNvdXJjZQorICAgIHJldHVybiBtU3RhdHVzID0gc2V0RGF0YVNvdXJjZV9wb3N0KHAsIHAtPnNldERhdGFTb3VyY2UocnRwUGFyYW1zKSk7Cit9CisKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpIHsKICAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3QoCkBAIC0xNzYxLDcgKzE3NzMsOCBAQAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TaW5rIgogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgdWlkX3QgdWlkLCBpbnQgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgZGV2aWNlQ2FsbGJhY2spCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUpCiAgICAgOiBtQ2FsbGJhY2soTlVMTCksCiAgICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCksCiAgICAgICBtQ2FsbGJhY2tEYXRhKE5VTEwpLApAQCAtMTc4Miw3ICsxNzk1LDggQEAKICAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAogICAgICAgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAogICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCi0gICAgICBtRGV2aWNlQ2FsbGJhY2soZGV2aWNlQ2FsbGJhY2spCisgICAgICBtRGV2aWNlQ2FsbGJhY2soZGV2aWNlQ2FsbGJhY2spLAorICAgICAgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKIHsKICAgICBBTE9HVigiQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CkBAIC0yMTc2LDcgKzIxOTAsOCBAQAogICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCi0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRPRE86IER1ZSB0byBidWZmZXIgbWVtb3J5IGNvbmNlcm5zLCB3ZSB1c2UgYSBtYXggdGFyZ2V0IHBsYXliYWNrIHNwZWVkCiAgICAgICAgICAgICAvLyBiYXNlZCBvbiBtUGxheWJhY2tSYXRlIGF0IHRoZSB0aW1lIG9mIG9wZW4gKGluc3RlYWQgb2Yga01heFJlcXVpcmVkU3BlZWQpLApAQCAtMjIwNCw3ICsyMjE5LDggQEAKICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAogICAgICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUpOwogICAgICAgICB9CiAgICAgICAgIC8vIFNldCBjYWxsZXIgbmFtZSBzbyBpdCBjYW4gYmUgbG9nZ2VkIGluIGRlc3RydWN0b3IuCiAgICAgICAgIC8vIE1lZGlhTWV0cmljc0NvbnN0YW50cy5oOiBBTUVESUFNRVRSSUNTX1BST1BfQ0FMTEVSTkFNRV9WQUxVRV9NRURJQQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDY0MzFjYTEuLmIyZjFiOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUlNFUlZJQ0VfSAogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtODEsNyArODIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5BdWRpb091dHB1dCgpOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlYWR5KCkgY29uc3QgeyByZXR1cm4gbVRyYWNrICE9IDA7IH0KQEAgLTE3OCw2ICsxODAsNyBAQAogICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkOwogICAgICAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gICAgICAgIG1EZXZpY2VDYWxsYmFjazsKICAgICAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICAgICAgIG1PcFBhY2thZ2VOYW1lOwogCiAgICAgICAgIC8vIHN0YXRpYyB2YXJpYWJsZXMgYmVsb3cgbm90IHByb3RlY3RlZCBieSBtdXRleAogICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwpAQCAtMjM1LDcgKzIzOCw4IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gY3JlYXRlTWV0YWRhdGFSZXRyaWV2ZXIoKTsKIAogICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiAgICBjcmVhdGUoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9wUGFja2FnZU5hbWUpOwogCiAgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0OwogCkBAIC0zNjgsNiArMzcyLDcgQEAKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpOwogCiAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgc2V0RGF0YVNvdXJjZV9wcmUocGxheWVyX3R5cGUgcGxheWVyVHlwZSk7CkBAIC00MTAsNyArNDE1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbm5JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50KCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5DbGllbnQoKTsKIApAQCAtNDY3LDYgKzQ3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZDsKICAgICAgICAgICAgICAgICAgICAgc3A8Q2xpZW50PiAgICAgICAgICAgICAgICAgICAgbU5leHRDbGllbnQ7CiAgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7CiAKICAgICAgICAgLy8gTWV0YWRhdGEgZmlsdGVycy4KICAgICAgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhQWxsb3c7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA5YjE5NzRiLi4xY2MyNTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKQEAgLTQyMywzMCArNDI0LDM1IEBACiAKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAKLSAgICAvLyBXT1JLQVJPVU5EOiBXZSBkb24ndCBrbm93IGlmIGNhbWVyYSBleGlzdHMgaGVyZSBhbmQgZ2V0U2VydmljZSBtaWdodCBibG9jayBmb3IgNSBzZWNvbmRzLgotICAgIC8vIFVzZSBjaGVja1NlcnZpY2UgZm9yIGNhbWVyYSBpZiB3ZSBkb24ndCBrbm93IGl0IGV4aXN0cy4KLSAgICBzdGF0aWMgc3RkOjphdG9taWM8Ym9vbD4gc0NhbWVyYUNoZWNrZWQoZmFsc2UpOyAgLy8gb25jZSB0cnVlIG5ldmVyIGJlY29tZXMgZmFsc2UuCi0gICAgc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IHNDYW1lcmFWZXJpZmllZChmYWxzZSk7IC8vIG9uY2UgdHJ1ZSBuZXZlciBiZWNvbWVzIGZhbHNlLgotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IChzQ2FtZXJhVmVyaWZpZWQgfHwgIXNDYW1lcmFDaGVja2VkKQotICAgICAgICA/IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSkgOiBzbS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSk7Ci0gICAgLy8gSWYgdGhlIGRldmljZSBkb2VzIG5vdCBoYXZlIGEgY2FtZXJhLCBkbyBub3QgY3JlYXRlIGEgZGVhdGggbGlzdGVuZXIgZm9yIGl0LgotICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewotICAgICAgICBzQ2FtZXJhVmVyaWZpZWQgPSB0cnVlOwotICAgICAgICBtRGVhdGhOb3RpZmllcnMuZW1wbGFjZV9iYWNrKAotICAgICAgICAgICAgICAgIGJpbmRlciwgW2wgPSB3cDxJTWVkaWFSZWNvcmRlckNsaWVudD4obGlzdGVuZXIpXSgpewotICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEuY2FtZXJhIHNlcnZpY2UgZGllZC4gIgotICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbi4iKTsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDQU1FUkFfUFJPQ0VTU19ERUFUSCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJtZWRpYS5jYW1lcmEgc2VydmljZSBkaWVkIHdpdGhvdXQgYSBkZWF0aCBoYW5kbGVyLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBzQ2FtZXJhRGlzYWJsZWQgPSBDYW1lcmFVdGlsczo6aXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKTsKKworICAgIGlmICghc0NhbWVyYURpc2FibGVkKSB7CisgICAgICAgIC8vIFdPUktBUk9VTkQ6IFdlIGRvbid0IGtub3cgaWYgY2FtZXJhIGV4aXN0cyBoZXJlIGFuZCBnZXRTZXJ2aWNlIG1pZ2h0IGJsb2NrIGZvciA1IHNlY29uZHMuCisgICAgICAgIC8vIFVzZSBjaGVja1NlcnZpY2UgZm9yIGNhbWVyYSBpZiB3ZSBkb24ndCBrbm93IGl0IGV4aXN0cy4KKyAgICAgICAgc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IHNDYW1lcmFDaGVja2VkKGZhbHNlKTsgIC8vIG9uY2UgdHJ1ZSBuZXZlciBiZWNvbWVzIGZhbHNlLgorICAgICAgICBzdGF0aWMgc3RkOjphdG9taWM8Ym9vbD4gc0NhbWVyYVZlcmlmaWVkKGZhbHNlKTsgLy8gb25jZSB0cnVlIG5ldmVyIGJlY29tZXMgZmFsc2UuCisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gKHNDYW1lcmFWZXJpZmllZCB8fCAhc0NhbWVyYUNoZWNrZWQpCisgICAgICAgICAgICA/IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSkgOiBzbS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSk7CisgICAgICAgIC8vIElmIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGNhbWVyYSwgZG8gbm90IGNyZWF0ZSBhIGRlYXRoIGxpc3RlbmVyIGZvciBpdC4KKyAgICAgICAgaWYgKGJpbmRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzQ2FtZXJhVmVyaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgbURlYXRoTm90aWZpZXJzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBbbCA9IHdwPElNZWRpYVJlY29yZGVyQ2xpZW50PihsaXN0ZW5lcildKCl7CisgICAgICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtZWRpYS5jYW1lcmEgc2VydmljZSBkaWVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfU0VSVkVSX0RJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDQU1FUkFfUFJPQ0VTU19ERUFUSCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIm1lZGlhLmNhbWVyYSBzZXJ2aWNlIGRpZWQgd2l0aG91dCBhIGRlYXRoIGhhbmRsZXIuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgc0NhbWVyYUNoZWNrZWQgPSB0cnVlOwogICAgIH0KLSAgICBzQ2FtZXJhQ2hlY2tlZCA9IHRydWU7CiAKICAgICB7CiAgICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggNDFiNmY3Mi4uMDJmYjZiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMTc0LDkgKzE3NCw3IEBACiAgICAgICAgIEFMT0dWKCJnZXR0aW5nIHRyYWNrICV6dSBvZiAlenUsIG1ldGE9JXMiLCBpLCBuLCBtZXRhLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgeworICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkgJiYgIXN0cm5jYXNlY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgewogICAgICAgICAgICAgaW50MzJfdCBpc1ByaW1hcnk7CiAgICAgICAgICAgICBpZiAoKGluZGV4IDwgMCAmJiBtZXRhLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlUcmFja0lzRGVmYXVsdCwgJmlzUHJpbWFyeSkgJiYgaXNQcmltYXJ5KQpAQCAtMjA4LDEyICsyMDYsMTkgQEAKICAgICB9CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIGlmICghdHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICBBTE9HRSgiaW1hZ2UgdHJhY2sgaGFzIG5vIG1pbWUgdHlwZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgQUxPR1YoImV4dHJhY3RpbmcgZnJvbSAlcyB0cmFjayIsIG1pbWUpOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7CiAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwogICAgICAgICB0cmFja01ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7CiAgICAgICAgIHRyYWNrTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikpIHsKKyAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKKyAgICAgICAgdHJhY2tNZXRhID0gbmV3IE1ldGFEYXRhKCp0cmFja01ldGEpOworICAgICAgICB0cmFja01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKICAgICB9CiAKICAgICBib29sIHByZWZlcmh3ID0gcHJvcGVydHlfZ2V0X2Jvb2woCkBAIC0yOTksOSArMzA0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkgJiYgIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzcsNyArMzQwLDEwIEBACiAgICAgfQogCiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgQUxPR0UoInZpZGVvIHRyYWNrIGhhcyBubyBtaW1lIGluZm9ybWF0aW9uLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBib29sIHByZWZlcmh3ID0gcHJvcGVydHlfZ2V0X2Jvb2woCiAgICAgICAgICAgICAibWVkaWEuc3RhZ2VmcmlnaHQudGh1bWJuYWlsLnByZWZlcl9od19jb2RlY3MiLCBmYWxzZSk7CkBAIC01MzEsMTQgKzUzNywxNCBAQAogICAgIGludDMyX3QgYXVkaW9CaXRyYXRlID0gLTE7CiAgICAgaW50MzJfdCByb3RhdGlvbkFuZ2xlID0gLTE7CiAgICAgaW50MzJfdCBpbWFnZUNvdW50ID0gMDsKLSAgICBpbnQzMl90IGltYWdlUHJpbWFyeSA9IDA7CisgICAgaW50MzJfdCBpbWFnZVByaW1hcnkgPSAtMTsKICAgICBpbnQzMl90IGltYWdlV2lkdGggPSAtMTsKICAgICBpbnQzMl90IGltYWdlSGVpZ2h0ID0gLTE7CiAgICAgaW50MzJfdCBpbWFnZVJvdGF0aW9uID0gLTE7CiAKICAgICAvLyBUaGUgb3ZlcmFsbCBkdXJhdGlvbiBpcyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3QgdHJhY2suCiAgICAgaW50NjRfdCBtYXhEdXJhdGlvblVzID0gMDsKLSAgICBTdHJpbmc4IHRpbWVkVGV4dExhbmc7CisgICAgU3RyaW5nOCB0aW1lZFRleHRMYW5nLCB2aWRlb01pbWU7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgewogICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKICAgICAgICAgaWYgKCF0cmFja01ldGEpIHsKQEAgLTU3NCwyOCArNTgwLDMzIEBACiAgICAgICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1NBTVBMRVJBVEUsIFN0cmluZzgodG1wKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzVmlkZW8gJiYgIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewotICAgICAgICAgICAgICAgIGhhc1ZpZGVvID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJnZpZGVvV2lkdGgpKTsKLSAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmdmlkZW9IZWlnaHQpKTsKICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uQW5nbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uQW5nbGUgPSAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZUNvdW50LCAmdmlkZW9GcmFtZUNvdW50KSkgewogICAgICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lQ291bnQgPSAwOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBhcnNlQ29sb3JBc3BlY3RzKHRyYWNrTWV0YSk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJnZpZGVvV2lkdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZ2aWRlb0hlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzVmlkZW8gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB2aWRlb01pbWUgPSBTdHJpbmc4KG1pbWUpOworICAgICAgICAgICAgICAgICAgICBwYXJzZUNvbG9yQXNwZWN0cyh0cmFja01ldGEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ2aWRlbyB0cmFjayBpZ25vcmVkIGZvciBtaXNzaW5nIGRpbWVuc2lvbnMiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaW1hZ2UvIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGlzUHJpbWFyeTsKICAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VHJhY2tJc0RlZmF1bHQsICZpc1ByaW1hcnkpICYmIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBpbWFnZVByaW1hcnkgPSBpbWFnZUNvdW50OwotICAgICAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZpbWFnZVdpZHRoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZpbWFnZUhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJmltYWdlUm90YXRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJvdGF0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmaW1hZ2VXaWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZpbWFnZUhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUHJpbWFyeSA9IGltYWdlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicHJpbWFyeSBpbWFnZSB0cmFjayBpZ25vcmVkIGZvciBtaXNzaW5nIGRpbWVuc2lvbnMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbWFnZUNvdW50Kys7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkpIHsKQEAgLTYyOCwyMiArNjM5LDI3IEBACiAgICAgaWYgKGhhc1ZpZGVvKSB7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0hBU19WSURFTywgU3RyaW5nOCgieWVzIikpOwogCisgICAgICAgIENIRUNLKHZpZGVvV2lkdGggPj0gMCk7CiAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCB2aWRlb1dpZHRoKTsKICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfVklERU9fV0lEVEgsIFN0cmluZzgodG1wKSk7CiAKKyAgICAgICAgQ0hFQ0sodmlkZW9IZWlnaHQgPj0gMCk7CiAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCB2aWRlb0hlaWdodCk7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX0hFSUdIVCwgU3RyaW5nOCh0bXApKTsKIAogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgcm90YXRpb25BbmdsZSk7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX1JPVEFUSU9OLCBTdHJpbmc4KHRtcCkpOwogCisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX0NPREVDX01JTUVfVFlQRSwgdmlkZW9NaW1lKTsKKwogICAgICAgICBpZiAodmlkZW9GcmFtZUNvdW50ID4gMCkgewogICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIHZpZGVvRnJhbWVDb3VudCk7CiAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9WSURFT19GUkFNRV9DT1VOVCwgU3RyaW5nOCh0bXApKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChpbWFnZUNvdW50ID4gMCkgeworICAgIC8vIG9ubHkgaWYgd2UgaGF2ZSBhIHByaW1hcnkgaW1hZ2UKKyAgICBpZiAoaW1hZ2VDb3VudCA+IDAgJiYgaW1hZ2VQcmltYXJ5ID49IDApIHsKICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSEFTX0lNQUdFLCBTdHJpbmc4KCJ5ZXMiKSk7CiAKICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlQ291bnQpOwpAQCAtNjUyLDkgKzY2OCwxMSBAQAogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VQcmltYXJ5KTsKICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSU1BR0VfUFJJTUFSWSwgU3RyaW5nOCh0bXApKTsKIAorICAgICAgICBDSEVDSyhpbWFnZVdpZHRoID49IDApOwogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VXaWR0aCk7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lNQUdFX1dJRFRILCBTdHJpbmc4KHRtcCkpOwogCisgICAgICAgIENIRUNLKGltYWdlSGVpZ2h0ID49IDApOwogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VIZWlnaHQpOwogICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9IRUlHSFQsIFN0cmluZzgodG1wKSk7CiAKQEAgLTY4MiwxMCArNzAwLDkgQEAKICAgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChmaWxlTUlNRSwgInZpZGVvL3gtbWF0cm9za2EiKSkgewogICAgICAgICAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoMCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFja01JTUU7Ci0gICAgICAgICAgICBpZiAodHJhY2tNZXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJnRyYWNrTUlNRSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgdHJhY2tNSU1FLCA2KSkgeworICAgICAgICAgICAgaWYgKHRyYWNrTWV0YSAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0cmFja01JTUUpCisgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKCJhdWRpby8iLCB0cmFja01JTUUsIDYpKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIG1hdHJvc2thIGZpbGUgb25seSBjb250YWlucyBhIHNpbmdsZSBhdWRpbyB0cmFjaywKICAgICAgICAgICAgICAgICAvLyByZXdyaXRlIGl0cyBtaW1lIHR5cGUuCiAgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCA3ODk3OTU5Li5iMmY2NDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0xNyw2ICsxNyw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0UmVjb3JkZXIiCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKy8vIFRPRE8vd29ya2Fyb3VuZDogaW5jbHVkaW5nIGJhc2UgbG9nZ2luZyBub3cgYXMgaXQgY29uZmxpY3RzIHdpdGggQURlYnVnLmgKKy8vIGFuZCBpdCBtdXN0IGJlIGluY2x1ZGVkIGZpcnN0LgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJXZWJtV3JpdGVyLmgiCkBAIC00NCw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgpAQCAtMTE3LDYgKzEyMSwxMSBAQAogICAgICAgbUF1ZGlvU291cmNlKChhdWRpb19zb3VyY2VfdClBVURJT19TT1VSQ0VfQ05UKSwgLy8gaW5pdGlhbGl6ZSB3aXRoIGludmFsaWQgdmFsdWUKICAgICAgIG1Qcml2YWN5U2Vuc2l0aXZlKFBSSVZBQ1lfU0VOU0lUSVZFX0RFRkFVTFQpLAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCisgICAgICBtUlRQQ1ZPRXh0TWFwKC0xKSwKKyAgICAgIG1SVFBDVk9EZWdyZWVzKDApLAorICAgICAgbVJUUFNvY2tEc2NwKDApLAorICAgICAgbVJUUFNvY2tOZXR3b3JrKDApLAorICAgICAgbUxhc3RTZXFObygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAogICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCkBAIC0xMjUsNiArMTM0LDcgQEAKIAogICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwogCisgICAgbU1ldHJpY3NJdGVtID0gTlVMTDsKICAgICBtQW5hbHl0aWNzRGlydHkgPSBmYWxzZTsKICAgICByZXNldCgpOwogfQpAQCAtMTk5LDEwICsyMDksMTIgQEAKIHZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Zmx1c2hBbmRSZXNldE1ldHJpY3MoYm9vbCByZWluaXRpYWxpemUpIHsKICAgICBBTE9HVigiZmx1c2hBbmRSZXNldE1ldHJpY3MiKTsKICAgICAvLyBmbHVzaCBhbnl0aGluZyB3ZSBoYXZlLCBtYXliZSBzZXR1cCBhIG5ldyByZWNvcmQKLSAgICBpZiAobUFuYWx5dGljc0RpcnR5ICYmIG1NZXRyaWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgIHVwZGF0ZU1ldHJpY3MoKTsKLSAgICAgICAgaWYgKG1NZXRyaWNzSXRlbS0+Y291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIG1NZXRyaWNzSXRlbS0+c2VsZnJlY29yZCgpOworICAgIGlmIChtTWV0cmljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICBpZiAobUFuYWx5dGljc0RpcnR5KSB7CisgICAgICAgICAgICB1cGRhdGVNZXRyaWNzKCk7CisgICAgICAgICAgICBpZiAobU1ldHJpY3NJdGVtLT5jb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIG1NZXRyaWNzSXRlbS0+c2VsZnJlY29yZCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBtTWV0cmljc0l0ZW07CiAgICAgICAgIG1NZXRyaWNzSXRlbSA9IE5VTEw7CkBAIC01NjcsNiArNTc5LDMyIEBACiAgICAgLy8gcmFuZ2UgdGhhdCBhIHNwZWNpZmljIGVuY29kZXIgc3VwcG9ydHMuIFRoZSBtaXNtYXRjaCBiZXR3ZWVuIHRoZQogICAgIC8vIHRoZSB0YXJnZXQgYW5kIHJlcXVlc3RlZCBiaXQgcmF0ZSB3aWxsIE5PVCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yLgogICAgIG1WaWRlb0JpdFJhdGUgPSBiaXRSYXRlOworCisgICAgLy8gQSBuZXcgYml0cmF0ZShUTU1CUikgc2hvdWxkIGJlIGFwcGxpZWQgb24gcnVudGltZSBhcyB3ZWxsIGlmIE91dHB1dEZvcm1hdCBpcyBSVFBfQVZQCisgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9SVFBfQVZQKSB7CisgICAgICAgIC8vIFJlZ3VsYXIgSSBmcmFtZXMgbWF5IG92ZXJsb2FkIHRoZSBuZXR3b3JrIHNvIHdlIHJlZHVjZSB0aGUgYml0cmF0ZSB0byBhbGxvdworICAgICAgICAvLyBtYXJnaW5zIGZvciB0aGUgSSBmcmFtZSBvdmVycnVucy4KKyAgICAgICAgLy8gU3RpbGwgc2VuZCByZXF1ZXN0ZWQgYml0cmF0ZSAoVE1NQlIpIGluIHRoZSByZXBseSAoVE1NQk4pLgorICAgICAgICBjb25zdCBmbG9hdCBjb2VmZmljaWVudCA9IDAuOGY7CisgICAgICAgIG1WaWRlb0JpdFJhdGUgPSAoYml0UmF0ZSAqIGNvZWZmaWNpZW50KSAvIDEwMDAgKiAxMDAwOworICAgIH0KKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1JUUF9BVlAgJiYgbVN0YXJ0ZWQgJiYgbVBhdXNlU3RhcnRUaW1lVXMgPT0gMCkgeworICAgICAgICBtVmlkZW9FbmNvZGVyU291cmNlLT5zZXRFbmNvZGluZ0JpdHJhdGUobVZpZGVvQml0UmF0ZSk7CisgICAgICAgIEFSVFBXcml0ZXIqIHJ0cFdyaXRlciAgPSBzdGF0aWNfY2FzdDxBUlRQV3JpdGVyKj4obVdyaXRlci5nZXQoKSk7CisgICAgICAgIHJ0cFdyaXRlci0+c2V0VE1NQk5JbmZvKG1PcHBvbmVudElELCBiaXRSYXRlKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9CaXRSYXRlTW9kZShpbnQzMl90IGJpdFJhdGVNb2RlKSB7CisgICAgQUxPR1YoInNldFBhcmFtVmlkZW9CaXRSYXRlTW9kZTogJWQiLCBiaXRSYXRlTW9kZSk7CisgICAgLy8gVE9ETzogY2xhcmlmeSB3aGF0IGJpdHJhdGUgbW9kZSBvZiAtMSBpcyBhcyB0aGVzZSBzdGFydCBmcm9tIDAKKyAgICBpZiAoYml0UmF0ZU1vZGUgPCAtMSkgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgdmlkZW8gYml0cmF0ZSBtb2RlOiAlZCIsIGJpdFJhdGVNb2RlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVZpZGVvQml0UmF0ZU1vZGUgPSBiaXRSYXRlTW9kZTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTc3Niw2ICs4MTQsMTA1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVJ0cExvY2FsSXAoY29uc3QgU3RyaW5nOCAmbG9jYWxJcCkgeworICAgIEFMT0dWKCJzZXRQYXJhbVZpZGVvTG9jYWxJcDogJXMiLCBsb2NhbElwLnN0cmluZygpKTsKKworICAgIG1Mb2NhbElwLnNldFRvKGxvY2FsSXAuc3RyaW5nKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1SdHBMb2NhbFBvcnQoaW50MzJfdCBsb2NhbFBvcnQpIHsKKyAgICBBTE9HVigic2V0UGFyYW1WaWRlb0xvY2FsUG9ydDogJWQiLCBsb2NhbFBvcnQpOworCisgICAgbUxvY2FsUG9ydCA9IGxvY2FsUG9ydDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtUnRwUmVtb3RlSXAoY29uc3QgU3RyaW5nOCAmcmVtb3RlSXApIHsKKyAgICBBTE9HVigic2V0UGFyYW1WaWRlb1JlbW90ZUlwOiAlcyIsIHJlbW90ZUlwLnN0cmluZygpKTsKKworICAgIG1SZW1vdGVJcC5zZXRUbyhyZW1vdGVJcC5zdHJpbmcoKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVJ0cFJlbW90ZVBvcnQoaW50MzJfdCByZW1vdGVQb3J0KSB7CisgICAgQUxPR1YoInNldFBhcmFtVmlkZW9SZW1vdGVQb3J0OiAlZCIsIHJlbW90ZVBvcnQpOworCisgICAgbVJlbW90ZVBvcnQgPSByZW1vdGVQb3J0OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1TZWxmSUQoaW50MzJfdCBzZWxmSUQpIHsKKyAgICBBTE9HVigic2V0UGFyYW1TZWxmSUQ6ICV4Iiwgc2VsZklEKTsKKworICAgIG1TZWxmSUQgPSBzZWxmSUQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvT3Bwb25lbnRJRChpbnQzMl90IG9wcG9uZW50SUQpIHsKKyAgICBtT3Bwb25lbnRJRCA9IG9wcG9uZW50SUQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVBheWxvYWRUeXBlKGludDMyX3QgcGF5bG9hZFR5cGUpIHsKKyAgICBBTE9HVigic2V0UGFyYW1QYXlsb2FkVHlwZTogJWQiLCBwYXlsb2FkVHlwZSk7CisKKyAgICBtUGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTsKKworICAgIGlmIChtU3RhcnRlZCAmJiBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCkgeworICAgICAgICBtV3JpdGVyLT51cGRhdGVQYXlsb2FkVHlwZShtUGF5bG9hZFR5cGUpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UlRQQ1ZPRXh0TWFwKGludDMyX3QgZXh0bWFwKSB7CisgICAgQUxPR1YoInNldFJ0cEN2b0V4dE1hcDogJWQiLCBleHRtYXApOworCisgICAgbVJUUENWT0V4dE1hcCA9IGV4dG1hcDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFJUUENWT0RlZ3JlZXMoaW50MzJfdCBjdm9EZWdyZWVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigic2V0UnRwQ3ZvRGVncmVlczogJWQiLCBjdm9EZWdyZWVzKTsKKworICAgIG1SVFBDVk9EZWdyZWVzID0gY3ZvRGVncmVlczsKKworICAgIGlmIChtU3RhcnRlZCAmJiBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCkgeworICAgICAgICBtV3JpdGVyLT51cGRhdGVDVk9EZWdyZWVzKG1SVFBDVk9EZWdyZWVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtUnRwRHNjcChpbnQzMl90IGRzY3ApIHsKKyAgICBBTE9HVigic2V0UGFyYW1SdHBEc2NwOiAlZCIsIGRzY3ApOworCisgICAgbVJUUFNvY2tEc2NwID0gZHNjcDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFNvY2tldE5ldHdvcmsoaW50NjRfdCBuZXR3b3JrSGFuZGxlKSB7CisgICAgQUxPR1YoInNldFNvY2tldE5ldHdvcms6ICVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKSBuZXR3b3JrSGFuZGxlKTsKKworICAgIG1SVFBTb2NrTmV0d29yayA9IG5ldHdvcmtIYW5kbGU7CisgICAgaWYgKG1TdGFydGVkICYmIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9SVFBfQVZQKSB7CisgICAgICAgIG1Xcml0ZXItPnVwZGF0ZVNvY2tldE5ldHdvcmsobVJUUFNvY2tOZXR3b3JrKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpyZXF1ZXN0SURSRnJhbWUoKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gQkFEX1ZBTFVFOworICAgIGlmIChtVmlkZW9FbmNvZGVyU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gbVZpZGVvRW5jb2RlclNvdXJjZS0+cmVxdWVzdElEUkZyYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJlcXVlc3RJRFJGcmFtZTogRW5jb2RlciBub3QgcmVhZHkiKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1ldGVyKAogICAgICAgICBjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKSB7CiAgICAgQUxPR1YoInNldFBhcmFtZXRlcjoga2V5ICglcykgPT4gdmFsdWUgKCVzKSIsIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCkpOwpAQCAtODQ0LDYgKzk4MSwxMSBAQAogICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnZpZGVvX2JpdHJhdGUpKSB7CiAgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb0VuY29kaW5nQml0UmF0ZSh2aWRlb19iaXRyYXRlKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1iaXRyYXRlLW1vZGUiKSB7CisgICAgICAgIGludDMyX3QgdmlkZW9fYml0cmF0ZV9tb2RlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnZpZGVvX2JpdHJhdGVfbW9kZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvQml0UmF0ZU1vZGUodmlkZW9fYml0cmF0ZV9tb2RlKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1yb3RhdGlvbi1hbmdsZS1kZWdyZWVzIikgewogICAgICAgICBpbnQzMl90IGRlZ3JlZXM7CiAgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmZGVncmVlcykpIHsKQEAgLTg4NCw2ICsxMDI2LDYxIEBACiAgICAgICAgIGlmIChzYWZlX3N0cnRvZCh2YWx1ZS5zdHJpbmcoKSwgJmZwcykpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUNhcHR1cmVGcHMoZnBzKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tbG9jYWwtaXAiKSB7CisgICAgICAgIHJldHVybiBzZXRQYXJhbVJ0cExvY2FsSXAodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tbG9jYWwtcG9ydCIpIHsKKyAgICAgICAgaW50MzJfdCBsb2NhbFBvcnQ7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmbG9jYWxQb3J0KSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtUnRwTG9jYWxQb3J0KGxvY2FsUG9ydCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXJlbW90ZS1pcCIpIHsKKyAgICAgICAgcmV0dXJuIHNldFBhcmFtUnRwUmVtb3RlSXAodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcmVtb3RlLXBvcnQiKSB7CisgICAgICAgIGludDMyX3QgcmVtb3RlUG9ydDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZyZW1vdGVQb3J0KSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtUnRwUmVtb3RlUG9ydChyZW1vdGVQb3J0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tc2VsZi1pZCIpIHsKKyAgICAgICAgaW50MzJfdCBzZWxmSUQ7CisgICAgICAgIGludDY0X3QgdGVtcDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0ZW1wKSkgeworICAgICAgICAgICAgc2VsZklEID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odGVtcCk7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1TZWxmSUQoc2VsZklEKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tb3Bwb25lbnQtaWQiKSB7CisgICAgICAgIGludDMyX3Qgb3BuSWQ7CisgICAgICAgIGludDY0X3QgdGVtcDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0ZW1wKSkgeworICAgICAgICAgICAgb3BuSWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0ZW1wKTsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvT3Bwb25lbnRJRChvcG5JZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXBheWxvYWQtdHlwZSIpIHsKKyAgICAgICAgaW50MzJfdCBwYXlsb2FkVHlwZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZwYXlsb2FkVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVBheWxvYWRUeXBlKHBheWxvYWRUeXBlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tZXh0LWN2by1leHRtYXAiKSB7CisgICAgICAgIGludDMyX3QgZXh0bWFwOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmV4dG1hcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRSVFBDVk9FeHRNYXAoZXh0bWFwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tZXh0LWN2by1kZWdyZWVzIikgeworICAgICAgICBpbnQzMl90IGRlZ3JlZXM7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmZGVncmVlcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRSVFBDVk9EZWdyZWVzKGRlZ3JlZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLXJlcXVlc3QtaS1mcmFtZSIpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RJRFJGcmFtZSgpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tc2V0LXNvY2tldC1kc2NwIikgeworICAgICAgICBpbnQzMl90IGRzY3A7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmZHNjcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVJ0cERzY3AoZHNjcCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXNldC1zb2NrZXQtbmV0d29yayIpIHsKKyAgICAgICAgaW50NjRfdCBuZXR3b3JrSGFuZGxlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJm5ldHdvcmtIYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0U29ja2V0TmV0d29yayhuZXR3b3JrSGFuZGxlKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CiAgICAgfQpAQCAtMTA1MCw2ICsxMjQ3LDE3IEBACiAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIHN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTZWxmSUQsIG1TZWxmSUQpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVBheWxvYWRUeXBlLCBtUGF5bG9hZFR5cGUpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleVNvY2tldE5ldHdvcmssIG1SVFBTb2NrTmV0d29yayk7CisgICAgICAgICAgICBpZiAobVJUUENWT0V4dE1hcCA+IDApIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5UnRwRXh0TWFwLCBtUlRQQ1ZPRXh0TWFwKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5UnRwQ3ZvRGVncmVlcywgbVJUUENWT0RlZ3JlZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SVFBTb2NrRHNjcCA+IDApIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5UnRwRHNjcCwgbVJUUFNvY2tEc2NwKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTExMyw3ICsxMzIxLDcgQEAKICAgICBpZiAobVByaXZhY3lTZW5zaXRpdmUgPT0gUFJJVkFDWV9TRU5TSVRJVkVfREVGQVVMVCkgewogICAgICAgICBpZiAoYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04KICAgICAgICAgICAgICAgICB8fCBhdHRyLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSKSB7Ci0gICAgICAgICAgICBhdHRyLmZsYWdzIHw9IEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFOworICAgICAgICAgICAgYXR0ci5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oYXR0ci5mbGFncyB8IEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFKTsKICAgICAgICAgICAgIG1Qcml2YWN5U2Vuc2l0aXZlID0gUFJJVkFDWV9TRU5TSVRJVkVfRU5BQkxFRDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1Qcml2YWN5U2Vuc2l0aXZlID0gUFJJVkFDWV9TRU5TSVRJVkVfRElTQUJMRUQ7CkBAIC0xMTI5LDcgKzEzMzcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Qcml2YWN5U2Vuc2l0aXZlID09IFBSSVZBQ1lfU0VOU0lUSVZFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIGF0dHIuZmxhZ3MgfD0gQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEU7CisgICAgICAgICAgICBhdHRyLmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihhdHRyLmZsYWdzIHwgQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzMwLDcgKzE1MzgsNyBAQAogICAgICAgICBtVmlkZW9FbmNvZGVyU291cmNlID0gc291cmNlOwogICAgIH0KIAotICAgIG1Xcml0ZXIgPSBuZXcgQVJUUFdyaXRlcihtT3V0cHV0RmQpOworICAgIG1Xcml0ZXIgPSBuZXcgQVJUUFdyaXRlcihtT3V0cHV0RmQsIG1Mb2NhbElwLCBtTG9jYWxQb3J0LCBtUmVtb3RlSXAsIG1SZW1vdGVQb3J0LCBtTGFzdFNlcU5vKTsKICAgICBtV3JpdGVyLT5hZGRTb3VyY2Uoc291cmNlKTsKICAgICBtV3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwogCkBAIC0xNzg0LDcgKzE5OTIsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCkgeworICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IGEgcmF3IGltYWdlIHByb3ZpZGVkIHRvIGVuY29kZXIgbmVlZHMgdG8gYmUgcm90YXRlZC4KKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicm90YXRpb24tZGVncmVlcyIsIG1Sb3RhdGlvbkRlZ3JlZXMpOworICAgIH0KKwogICAgIGZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlLW1vZGUiLCBtVmlkZW9CaXRSYXRlTW9kZSk7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIG1GcmFtZVJhdGUpOwogICAgIGZvcm1hdC0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCBtSUZyYW1lc0ludGVydmFsU2VjKTsKIApAQCAtMjEzMCw2ICsyMzQ0LDcgQEAKIAogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKICAgICAgICAgZXJyID0gbVdyaXRlci0+c3RvcCgpOworICAgICAgICBtTGFzdFNlcU5vID0gbVdyaXRlci0+Z2V0U2VxdWVuY2VOdW0oKTsKICAgICAgICAgbVdyaXRlci5jbGVhcigpOwogICAgIH0KIApAQCAtMjIwNiw2ICsyNDIxLDggQEAKICAgICBtVmlkZW9IZWlnaHQgICA9IDE0NDsKICAgICBtRnJhbWVSYXRlICAgICA9IC0xOwogICAgIG1WaWRlb0JpdFJhdGUgID0gMTkyMDAwOworICAgIC8vIEZvbGxvd2luZyBNZWRpYUNvZGVjJ3MgZGVmYXVsdAorICAgIG1WaWRlb0JpdFJhdGVNb2RlID0gQklUUkFURV9NT0RFX1ZCUjsKICAgICBtU2FtcGxlUmF0ZSAgICA9IDgwMDA7CiAgICAgbUF1ZGlvQ2hhbm5lbHMgPSAxOwogICAgIG1BdWRpb0JpdFJhdGUgID0gMTIyMDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBhNzI1YmVlLi4wMzYyZWRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTExOSw2ICsxMTksNyBAQAogICAgIGludDMyX3QgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodDsKICAgICBpbnQzMl90IG1GcmFtZVJhdGU7CiAgICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlOworICAgIGludDMyX3QgbVZpZGVvQml0UmF0ZU1vZGU7CiAgICAgaW50MzJfdCBtQXVkaW9CaXRSYXRlOwogICAgIGludDMyX3QgbUF1ZGlvQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKQEAgLTEzOCw2ICsxMzksMTggQEAKICAgICBpbnQzMl90IG1Mb25naXR1ZGV4MTAwMDA7CiAgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CiAgICAgaW50MzJfdCBtVG90YWxCaXRSYXRlOworICAgIFN0cmluZzggbUxvY2FsSXA7CisgICAgU3RyaW5nOCBtUmVtb3RlSXA7CisgICAgaW50MzJfdCBtTG9jYWxQb3J0OworICAgIGludDMyX3QgbVJlbW90ZVBvcnQ7CisgICAgaW50MzJfdCBtU2VsZklEOworICAgIGludDMyX3QgbU9wcG9uZW50SUQ7CisgICAgaW50MzJfdCBtUGF5bG9hZFR5cGU7CisgICAgaW50MzJfdCBtUlRQQ1ZPRXh0TWFwOworICAgIGludDMyX3QgbVJUUENWT0RlZ3JlZXM7CisgICAgaW50MzJfdCBtUlRQU29ja0RzY3A7CisgICAgaW50NjRfdCBtUlRQU29ja05ldHdvcms7CisgICAgdWludDMyX3QgbUxhc3RTZXFObzsKIAogICAgIGludDY0X3QgbUR1cmF0aW9uUmVjb3JkZWRVczsKICAgICBpbnQ2NF90IG1TdGFydGVkUmVjb3JkaW5nVXM7CkBAIC0yMDUsNiArMjE4LDcgQEAKICAgICBzdGF0dXNfdCBzZXRQYXJhbUNhcHR1cmVGcHNFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtQ2FwdHVyZUZwcyhkb3VibGUgZnBzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0JpdFJhdGVNb2RlKGludDMyX3QgYml0UmF0ZU1vZGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWwoaW50MzJfdCBzZWNvbmRzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoaW50MzJfdCBwcm9maWxlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RlckxldmVsKGludDMyX3QgbGV2ZWwpOwpAQCAtMjE5LDYgKzIzMywxOCBAQAogICAgIHN0YXR1c190IHNldFBhcmFtTW92aWVUaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtR2VvRGF0YUxvbmdpdHVkZShpbnQ2NF90IGxvbmdpdHVkZXgxMDAwMCk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1HZW9EYXRhTGF0aXR1ZGUoaW50NjRfdCBsYXRpdHVkZXgxMDAwMCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1SdHBMb2NhbElwKGNvbnN0IFN0cmluZzggJmxvY2FsSXApOworICAgIHN0YXR1c190IHNldFBhcmFtUnRwTG9jYWxQb3J0KGludDMyX3QgbG9jYWxQb3J0KTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVJ0cFJlbW90ZUlwKGNvbnN0IFN0cmluZzggJnJlbW90ZUlwKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVJ0cFJlbW90ZVBvcnQoaW50MzJfdCByZW1vdGVQb3J0KTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVNlbGZJRChpbnQzMl90IHNlbGZJRCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb09wcG9uZW50SUQoaW50MzJfdCBvcHBvbmVudElEKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVBheWxvYWRUeXBlKGludDMyX3QgcGF5bG9hZFR5cGUpOworICAgIHN0YXR1c190IHNldFJUUENWT0V4dE1hcChpbnQzMl90IGV4dG1hcCk7CisgICAgc3RhdHVzX3Qgc2V0UlRQQ1ZPRGVncmVlcyhpbnQzMl90IGN2b0RlZ3JlZXMpOworICAgIHN0YXR1c190IHNldFBhcmFtUnRwRHNjcChpbnQzMl90IGRzY3ApOworICAgIHN0YXR1c190IHNldFNvY2tldE5ldHdvcmsoaW50NjRfdCBuZXR3b3JrSGFuZGxlKTsKKyAgICBzdGF0dXNfdCByZXF1ZXN0SURSRnJhbWUoKTsKICAgICB2b2lkIGNsaXBWaWRlb0JpdFJhdGUoKTsKICAgICB2b2lkIGNsaXBWaWRlb0ZyYW1lUmF0ZSgpOwogICAgIHZvaWQgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggNDM2Y2IzMS4uOGQ5NDY5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC02MCw3ICs2MCw3IEBACiAjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX1NBTVBMRVJBVEUgNDQxMDAKIAogLy8gd2hlbiB0aGUgY2hhbm5lbCBtYXNrIGlzbid0IGtub3duLCB1c2UgdGhlIGNoYW5uZWwgY291bnQgdG8gZGVyaXZlIGEgbWFzayBpbiBBdWRpb1Npbms6Om9wZW4oKQotI2RlZmluZSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIgMAorI2RlZmluZSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIgQVVESU9fQ0hBTk5FTF9OT05FCiAKIC8vIGR1cmF0aW9uIGJlbG93IHdoaWNoIHdlIGRvIG5vdCBhbGxvdyBkZWVwIGF1ZGlvIGJ1ZmZlcmluZwogI2RlZmluZSBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUyA1MDAwMDAwCkBAIC0xODMsNiArMTgzLDEwIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoY29uc3QgU3RyaW5nOCYgLyogcnRwUGFyYW1zICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIHRvIHRoZSBtZWRpYSBwbGF5ZXIgc2VydmljZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCmluZGV4IDY4NGJhMmUuLjdiZWUwMDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCkBAIC01MiwxOCArNTIsMTkgQEAKICAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7CisgICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PG9zOjpJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOwogICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOwogICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCi0gICAgICAgICAgICAgICAgICAgIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKLSAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBTdHJpbmcxNigiQVdha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpKTsKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jaygKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJBV2FrZUxvY2siKSwgU3RyaW5nMTYoIm1lZGlhIiksCisgICAgICAgICAgICAgICAgICAgIHt9IC8qIHdvcmtTb3VyY2UgKi8sIHt9IC8qIGhpc3RvcnlUYWcgKi8pOwogICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewogICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOwogICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmgKaW5kZXggMzIzZTdkNy4uOGFhM2I0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBBX1dBS0VMT0NLX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL29zL0lQb3dlck1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM3LDcgKzM3LDcgQEAKICAgICB2aXJ0dWFsIH5BV2FrZUxvY2soKTsKIAogcHJpdmF0ZToKLSAgICBzcDxJUG93ZXJNYW5hZ2VyPiBtUG93ZXJNYW5hZ2VyOworICAgIHNwPG9zOjpJUG93ZXJNYW5hZ2VyPiBtUG93ZXJNYW5hZ2VyOwogICAgIHNwPElCaW5kZXI+ICAgICAgIG1XYWtlTG9ja1Rva2VuOwogICAgIHVpbnQzMl90ICAgICAgICAgIG1XYWtlTG9ja0NvdW50OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCmluZGV4IDMyYzk3Y2YuLmY1ZTQ0YzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgICAgICJOdVBsYXllclJlbmRlcmVyLmNwcCIsCiAgICAgICAgICJOdVBsYXllclN0cmVhbUxpc3RlbmVyLmNwcCIsCiAgICAgICAgICJSVFNQU291cmNlLmNwcCIsCisgICAgICAgICJSVFBTb3VyY2UuY3BwIiwKICAgICAgICAgIlN0cmVhbWluZ1NvdXJjZS5jcHAiLAogICAgIF0sCiAKQEAgLTMwLDYgKzMxLDcgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCBjMWM0YjU1Li40NzM2MmVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJOdVBsYXllckRyaXZlci5oIgogI2luY2x1ZGUgIk51UGxheWVyUmVuZGVyZXIuaCIKICNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgorI2luY2x1ZGUgIlJUUFNvdXJjZS5oIgogI2luY2x1ZGUgIlJUU1BTb3VyY2UuaCIKICNpbmNsdWRlICJTdHJlYW1pbmdTb3VyY2UuaCIKICNpbmNsdWRlICJHZW5lcmljU291cmNlLmgiCkBAIC0zNjgsNiArMzY5LDE4IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAordm9pZCBOdVBsYXllcjo6c2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykgeworICAgIEFMT0dEKCJzZXREYXRhU291cmNlQXN5bmMgZm9yIFJUUCA9ICVzIiwgcnRwUGFyYW1zLnN0cmluZygpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgdGhpcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCB0aGlzKTsKKyAgICBzcDxTb3VyY2U+IHNvdXJjZSA9IG5ldyBSVFBTb3VyY2Uobm90aWZ5LCBydHBQYXJhbXMpOworCisgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CisgICAgbXNnLT5wb3N0KCk7CisgICAgbURhdGFTb3VyY2VUeXBlID0gREFUQV9TT1VSQ0VfVFlQRV9SVFA7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OnByZXBhcmVBc3luYygpIHsKICAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7CiAKQEAgLTE2ODksNiArMTcwMiwxMiBAQAogICAgIHVwZGF0ZVJlYnVmZmVyaW5nVGltZXIoZmFsc2UgLyogc3RvcHBpbmcgKi8sIGZhbHNlIC8qIGV4aXRpbmcgKi8pOwogfQogCit2b2lkIE51UGxheWVyOjpzZXRUYXJnZXRCaXRyYXRlKGludCBiaXRyYXRlKSB7CisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtU291cmNlLT5zZXRUYXJnZXRCaXRyYXRlKGJpdHJhdGUpOworICAgIH0KK30KKwogdm9pZCBOdVBsYXllcjo6b25QYXVzZSgpIHsKIAogICAgIHVwZGF0ZVBsYXliYWNrVGltZXIodHJ1ZSAvKiBzdG9wcGluZyAqLywgIm9uUGF1c2UiKTsKQEAgLTE5MTUsNiArMTkzNCwxMSBAQAogCiAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJpb3JpdHkiLCAwIC8qIHJlYWx0aW1lICovKTsKIAorICAgIGlmIChtRGF0YVNvdXJjZVR5cGUgPT0gREFUQV9TT1VSQ0VfVFlQRV9SVFApIHsKKyAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2Rlcjogc2V0IGRlY29kZXIgZXJyb3IgZnJlZSBvbiBzdHJlYW0gY29ycnVwdC4iKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY29ycnVwdC1mcmVlIiwgdHJ1ZSk7CisgICAgfQorCiAgICAgaWYgKCFhdWRpbykgewogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CkBAIC0yNzE1LDYgKzI3MzksMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0SU1TUnhOb3RpY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBJTVNSeE5vdGljZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm1lc3NhZ2UiLCAmSU1TUnhOb3RpY2UpKTsKKyAgICAgICAgICAgIHNlbmRJTVNSeE5vdGljZShJTVNSeE5vdGljZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KQEAgLTI4MTcsMTEgKzI4NDksNzQgQEAKICAgICB9CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OnNlbmRJTVNSeE5vdGljZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgcGF5bG9hZFR5cGU7CisKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGF5bG9hZC10eXBlIiwgJnBheWxvYWRUeXBlKSk7CisKKyAgICBQYXJjZWwgaW47CisgICAgaW4ud3JpdGVJbnQzMihwYXlsb2FkVHlwZSk7CisKKyAgICBzd2l0Y2ggKHBheWxvYWRUeXBlKSB7CisgICAgICAgIGNhc2UgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6UlRDUF9UU0ZCOiAgIC8vIFJUQ1AgVFNGQgorICAgICAgICBjYXNlIE51UGxheWVyOjpSVFBTb3VyY2U6OlJUQ1BfUFNGQjogICAvLyBSVENQIFBTRkIKKyAgICAgICAgY2FzZSBOdVBsYXllcjo6UlRQU291cmNlOjpSVFBfQVVUT0RPV046CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZmVlZGJhY2tUeXBlLCBpZDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmZWVkYmFjay10eXBlIiwgJmZlZWRiYWNrVHlwZSkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbmRlciIsICZpZCkpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihmZWVkYmFja1R5cGUpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICBpZiAocGF5bG9hZFR5cGUgPT0gTnVQbGF5ZXI6OlJUUFNvdXJjZTo6UlRDUF9UU0ZCKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBiaXRyYXRlOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJiaXQtcmF0ZSIsICZiaXRyYXRlKSk7CisgICAgICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihiaXRyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6UlRQX1FVQUxJVFk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZmVlZGJhY2tUeXBlLCBiaXRyYXRlOworICAgICAgICAgICAgaW50MzJfdCBoaWdoZXN0U2VxTnVtLCBiYXNlU2VxTnVtLCBwcmV2RXhwZWN0ZWQ7CisgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZlJlY3YsIHByZXZOdW1CdWZSZWN2OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZlZWRiYWNrLXR5cGUiLCAmZmVlZGJhY2tUeXBlKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYml0LXJhdGUiLCAmYml0cmF0ZSkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhpZ2hlc3Qtc2VxLW51bSIsICZoaWdoZXN0U2VxTnVtKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYmFzZS1zZXEtbnVtIiwgJmJhc2VTZXFOdW0pKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwcmV2LWV4cGVjdGVkIiwgJnByZXZFeHBlY3RlZCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm51bS1idWYtcmVjdiIsICZudW1CdWZSZWN2KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicHJldi1udW0tYnVmLXJlY3YiLCAmcHJldk51bUJ1ZlJlY3YpKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoZmVlZGJhY2tUeXBlKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoYml0cmF0ZSk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGhpZ2hlc3RTZXFOdW0pOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihiYXNlU2VxTnVtKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocHJldkV4cGVjdGVkKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIobnVtQnVmUmVjdik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHByZXZOdW1CdWZSZWN2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6UlRQX0NWTzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBjdm87CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiY3ZvIiwgJmN2bykpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihjdm8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfSU1TX1JYX05PVElDRSwgMCwgMCwgJmluKTsKK30KKwogY29uc3QgY2hhciAqTnVQbGF5ZXI6OmdldERhdGFTb3VyY2VUeXBlKCkgewogICAgIHN3aXRjaCAobURhdGFTb3VyY2VUeXBlKSB7CiAgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkU6CiAgICAgICAgICAgICByZXR1cm4gIkhUVFBMaXZlIjsKIAorICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfUlRQOgorICAgICAgICAgICAgcmV0dXJuICJSVFAiOworCiAgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9SVFNQOgogICAgICAgICAgICAgcmV0dXJuICJSVFNQIjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAppbmRleCBlZjQzNTRjLi5hZGI3MDc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApAQCAtNTEsNiArNTEsOCBAQAogCiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CiAKKyAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpOworCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKTsKICAgICBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKTsKIApAQCAtMTAwLDYgKzEwMiw4IEBACiAKICAgICB2b2lkIHVwZGF0ZUludGVybmFsVGltZXJzKCk7CiAKKyAgICB2b2lkIHNldFRhcmdldEJpdHJhdGUoaW50IGJpdHJhdGUgLyogYnBzICovKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51UGxheWVyKCk7CiAKQEAgLTExNyw2ICsxMjEsNyBAQAogICAgIHN0cnVjdCBHZW5lcmljU291cmNlOwogICAgIHN0cnVjdCBIVFRQTGl2ZVNvdXJjZTsKICAgICBzdHJ1Y3QgUmVuZGVyZXI7CisgICAgc3RydWN0IFJUUFNvdXJjZTsKICAgICBzdHJ1Y3QgUlRTUFNvdXJjZTsKICAgICBzdHJ1Y3QgU3RyZWFtaW5nU291cmNlOwogICAgIHN0cnVjdCBBY3Rpb247CkBAIC0yNTcsNiArMjYyLDcgQEAKICAgICB0eXBlZGVmIGVudW0gewogICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX05PTkUsCiAgICAgICAgIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUUCwKICAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9SVFNQLAogICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMLAogICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQsCkBAIC0zMzQsNiArMzQwLDcgQEAKICAgICB2b2lkIHNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpOwogICAgIHZvaWQgc2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIHNlbmRJTVNSeE5vdGljZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCBmNzM0NDM5Li44NjI4ZWRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMTA1MCw3ICsxMDUwLDcgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKLSAgICAgICAgaW50MzJfdCBlb3MsIGNzZDsKKyAgICAgICAgaW50MzJfdCBlb3MsIGNzZCwgY3ZvOwogICAgICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IFNZTkNGUkFNRSBmb3IgZGVjb2RlcgogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CkBAIC0xMDU4LDYgKzEwNTgsMjQgQEAKICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsIChpbnQzMl90KikmY3ZvKSkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gY3ZvKCVkKSBmb3VuZCBhdCAlbGxkIHVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgY3ZvLCAobG9uZyBsb25nKXRpbWVVcyk7CisgICAgICAgICAgICBzd2l0Y2ggKGN2bykgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjdm8iLCBNZWRpYUNvZGVjOjpDVk9fREVHUkVFXzE4MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfMjcwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBNb2R1bGFyIERSTQogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmID0gTlVMTDsKICAgICAgICAgTnVQbGF5ZXJEcm06OkNyeXB0b0luZm8gKmNyeXB0SW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCBkYzE0NGIyLi4yYTUwZmMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTIxOCw2ICsyMTgsMjYgQEAKICAgICByZXR1cm4gbUFzeW5jUmVzdWx0OwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgcnRwIHNvdXJjZSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc7CisKKyAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmMocnRwUGFyYW1zKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIHJldHVybiBtQXN5bmNSZXN1bHQ7Cit9CisKKwogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgewogICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIHRoaXMpOwpAQCAtNzk3LDcgKzgxNywxMSBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKAotICAgICAgICBpbnQgLyoga2V5ICovLCBjb25zdCBQYXJjZWwgJiAvKiByZXF1ZXN0ICovKSB7CisgICAgICAgIGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCApIHsKKyAgICBpZiAoa2V5ID09IEtFWV9QQVJBTUVURVJfUlRQX0FUVFJJQlVURVMpIHsKKyAgICAgICAgbVBsYXllci0+c2V0VGFyZ2V0Qml0cmF0ZShyZXF1ZXN0LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggZjRiMTk2OC4uNTVhMGZhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTQzLDYgKzQzLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgU3RyaW5nOCYgcnRwUGFyYW1zKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCBjMzBmMDQ4Li42YThjNzA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC05MjIsNiArOTIyLDExIEBACiAgICAgICAgICAgICBmaXJzdEVudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZmlsbEF1ZGlvQnVmZmVyOiByZXNldCBuZWdhdGl2ZSBtZWRpYSB0aW1lICUuMmYgc2VjcyB0byB6ZXJvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzID0gMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IHJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7CiAgICAgICAgIH0KQEAgLTE5MjgsMTEgKzE5MzMsMTIgQEAKICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSk7CiAKLSAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwotICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKLSAgICAgICAgLy8gc2lnbmFsIHRvIHRoZSBBdWRpb1NpbmsgdG8gZGVyaXZlIHRoZSBtYXNrIGZyb20gY291bnQuCi0gICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOwotICAgIH0KKyAgICBpbnQzMl90IHJhd0NoYW5uZWxNYXNrOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmcmF3Q2hhbm5lbE1hc2spID8KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHJhd0NoYW5uZWxNYXNrKQorICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBkZXJpdmUgdGhlIG1hc2sgZnJvbSBjb3VudC4KKyAgICAgICAgICAgICAgICAgICAgOiBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7CiAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKaW5kZXggZjEzN2M1Mi4uYmY2YjUzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAga1doYXRJbnN0YW50aWF0ZVNlY3VyZURlY29kZXJzLAogICAgICAgICAvLyBNb2R1bGFyIERSTQogICAgICAgICBrV2hhdERybUluZm8sCisgICAgICAgIGtXaGF0SU1TUnhOb3RpY2UsCiAgICAgfTsKIAogICAgIC8vIFRoZSBwcm92aWRlcyBtZXNzYWdlIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBwbGF5ZXIgYWJvdXQgdmFyaW91cwpAQCAtMTMxLDYgKzEzMiw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0T2ZmbG9hZEF1ZGlvKGJvb2wgLyogb2ZmbG9hZCAqLykge30KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRUYXJnZXRCaXRyYXRlKGludDMyX3QpIHt9CisKICAgICAvLyBNb2R1bGFyIERSTQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybSgKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgLyp1dWlkKi9bMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJi8qZHJtU2Vzc2lvbklkKi8sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTAxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcApAQCAtMCwwICsxLDc5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUlRQU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiUlRQU291cmNlLmgiCisKKworCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGludDY0X3Qga05lYXJFT1NUaW1lb3V0VXMgPSAyMDAwMDAwbGw7IC8vIDIgc2Vjcworc3RhdGljIGludDMyX3Qga01heEFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID0gMjA7CisKK051UGxheWVyOjpSVFBTb3VyY2U6OlJUUFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykKKyAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbVJUUFBhcmFtcyhydHBQYXJhbXMpLAorICAgICAgbUZsYWdzKDApLAorICAgICAgbVN0YXRlKERJU0NPTk5FQ1RFRCksCisgICAgICBtRmluYWxSZXN1bHQoT0spLAorICAgICAgbUJ1ZmZlcmluZyhmYWxzZSksCisgICAgICBtSW5QcmVwYXJhdGlvblBoYXNlKHRydWUpLAorICAgICAgbVJUUENvbm4obmV3IEFSVFBDb25uZWN0aW9uKEFSVFBDb25uZWN0aW9uOjprVmlMVEVDb25uZWN0aW9uKSksCisgICAgICBtRU9TVGltZW91dEF1ZGlvKDApLAorICAgICAgbUVPU1RpbWVvdXRWaWRlbygwKSwKKyAgICAgIG1MYXN0Q1ZPVXBkYXRlZCgtMSkgeworICAgICAgQUxPR0QoIlJUUFNvdXJjZSBpbml0aWFsaXplZCB3aXRoIHJ0cFBhcmFtcz0lcyIsIHJ0cFBhcmFtcy5zdHJpbmcoKSk7Cit9CisKK051UGxheWVyOjpSVFBTb3VyY2U6On5SVFBTb3VyY2UoKSB7CisgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJUUENvbm4tPmlkKCkpOworICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UlRQU291cmNlOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nU2V0dGluZ3NMb2NrKTsKKyAgICAqYnVmZmVyaW5nID0gbUJ1ZmZlcmluZ1NldHRpbmdzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nU2V0dGluZ3NMb2NrKTsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MgPSBidWZmZXJpbmc7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRwIik7CisgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJUUENvbm4pOworICAgIH0KKworICAgIENIRUNLX0VRKG1TdGF0ZSwgKGludClESVNDT05ORUNURUQpOworICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7CisKKyAgICBzZXRQYXJhbWV0ZXJzKG1SVFBQYXJhbXMpOworCisgICAgVHJhY2tJbmZvICppbmZvID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBBU3RyaW5nIHNkcDsKKyAgICAgICAgQVNlc3Npb25EZXNjcmlwdGlvbjo6U0RQU3RyaW5nRmFjdG9yeShzZHAsIGluZm8tPm1Mb2NhbElwLAorICAgICAgICAgICAgICAgIGluZm8tPm1Jc0F1ZGlvLCBpbmZvLT5tTG9jYWxQb3J0LCBpbmZvLT5tUGF5bG9hZFR5cGUsIGluZm8tPm1BUywgaW5mby0+bUNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICBOVUxMLCBpbmZvLT5tV2lkdGgsIGluZm8tPm1IZWlnaHQsIGluZm8tPm1DVk9FeHRNYXApOworICAgICAgICBBTE9HRCgiUlRQU291cmNlIFNEUCA9PlxuJXMiLCBzZHAuY19zdHIoKSk7CisKKyAgICAgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gZGVzYyA9IG5ldyBBU2Vzc2lvbkRlc2NyaXB0aW9uOworICAgICAgICBib29sIGlzVmFsaWRTZHAgPSBkZXNjLT5zZXRUbyhzZHAuY19zdHIoKSwgc2RwLnNpemUoKSk7CisgICAgICAgIEFMT0dWKCJSVFBTb3VyY2UgaXNWYWxpZFNkcCA9PiAlZCIsIGlzVmFsaWRTZHApOworCisgICAgICAgIGludCBzb2NrUnRwLCBzb2NrUnRjcDsKKyAgICAgICAgQVJUUENvbm5lY3Rpb246Ok1ha2VSVFBTb2NrZXRQYWlyKCZzb2NrUnRwLCAmc29ja1J0Y3AsIGluZm8tPm1Mb2NhbElwLCBpbmZvLT5tUmVtb3RlSXAsCisgICAgICAgICAgICAgICAgaW5mby0+bUxvY2FsUG9ydCwgaW5mby0+bVJlbW90ZVBvcnQsIGluZm8tPm1Tb2NrZXROZXR3b3JrKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKCdhY2N1JywgdGhpcyk7CisKKyAgICAgICAgQUxPR1YoIlJUUFNvdXJjZSBhZGRTdHJlYW0uIHRyYWNrLWluZGV4PSVkIiwgaSk7CisgICAgICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIGkpOworICAgICAgICAvLyBpbmRleChpKSBzaG91bGQgYmUgc3RhcnRlZCBmcm9tIDEuIDAgaXMgcmVzZXJ2ZWQgZm9yIFtyb290XQorICAgICAgICBtUlRQQ29ubi0+YWRkU3RyZWFtKHNvY2tSdHAsIHNvY2tSdGNwLCBkZXNjLCBpICsgMSwgbm90aWZ5LCBmYWxzZSk7CisgICAgICAgIG1SVFBDb25uLT5zZXRTZWxmSUQoaW5mby0+bVNlbGZJRCk7CisgICAgICAgIG1SVFBDb25uLT5zZXRKYlRpbWUoCisgICAgICAgICAgICAgICAgKGluZm8tPm1KYlRpbWVNcyA8PSAzMDAwICYmIGluZm8tPm1KYlRpbWVNcyA+PSA0MCkgPyBpbmZvLT5tSmJUaW1lTXMgOiAzMDApOworCisgICAgICAgIGluZm8tPm1SVFBTb2NrZXQgPSBzb2NrUnRwOworICAgICAgICBpbmZvLT5tUlRDUFNvY2tldCA9IHNvY2tSdGNwOworICAgICAgICBpbmZvLT5tRmlyc3RTZXFOdW1JblNlZ21lbnQgPSAwOworICAgICAgICBpbmZvLT5tTmV3U2VnbWVudCA9IHRydWU7CisgICAgICAgIGluZm8tPm1BbGxvd2VkU3RhbGVBY2Nlc3NVbml0cyA9IGtNYXhBbGxvd2VkU3RhbGVBY2Nlc3NVbml0czsKKyAgICAgICAgaW5mby0+bVJUUEFuY2hvciA9IDA7CisgICAgICAgIGluZm8tPm1OVFBBbmNob3JVcyA9IC0xOworICAgICAgICBpbmZvLT5tTm9ybWFsUGxheVRpbWVSVFAgPSAwOworICAgICAgICBpbmZvLT5tTm9ybWFsUGxheVRpbWVVcyA9IDBsbDsKKworICAgICAgICAvLyBpbmRleChpKSBzaG91bGQgYmUgc3RhcnRlZCBmcm9tIDEuIDAgaXMgcmVzZXJ2ZWQgZm9yIFtyb290XQorICAgICAgICBpbmZvLT5tUGFja2V0U291cmNlID0gbmV3IEFQYWNrZXRTb3VyY2UoZGVzYywgaSArIDEpOworCisgICAgICAgIGludDMyX3QgdGltZVNjYWxlOworICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gZ2V0VHJhY2tGb3JtYXQoaSwgJnRpbWVTY2FsZSk7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKGZvcm1hdCk7CisKKyAgICAgICAgaWYgKGluZm8tPm1Jc0F1ZGlvKSB7CisgICAgICAgICAgICBtQXVkaW9UcmFjayA9IHNvdXJjZTsKKyAgICAgICAgICAgIGluZm8tPm1UaW1lU2NhbGUgPSAxNjAwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1WaWRlb1RyYWNrID0gc291cmNlOworICAgICAgICAgICAgaW5mby0+bVRpbWVTY2FsZSA9IDkwMDAwOworICAgICAgICB9CisKKyAgICAgICAgaW5mby0+bVNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgaW5mby0+bVJUUFRpbWUgPSAwOworICAgICAgICBpbmZvLT5tTm9ybWFsUGxheXRpbWVVcyA9IDA7CisgICAgICAgIGluZm8tPm1OUFRNYXBwaW5nVmFsaWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUluUHJlcGFyYXRpb25QaGFzZSkgeworICAgICAgICBtSW5QcmVwYXJhdGlvblBoYXNlID0gZmFsc2U7CisgICAgICAgIG5vdGlmeVByZXBhcmVkKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnN0YXJ0KCkgeworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnBhdXNlKCkgeworICAgIG1TdGF0ZSA9IFBBVVNFRDsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpyZXN1bWUoKSB7CisgICAgbVN0YXRlID0gQ09OTkVDVElORzsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpzdG9wKCkgeworICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgdGhpcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gZHVtbXk7CisgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmZHVtbXkpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UlRQU291cmNlOjpmZWVkTW9yZVRTRGF0YSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ0xvY2spOworICAgIHJldHVybiBtRmluYWxSZXN1bHQ7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjo6UlRQU291cmNlOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitib29sIE51UGxheWVyOjpSVFBTb3VyY2U6OmhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCkgeworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGJ1ZmZlciBhdCBsZWFzdCAyIHNlY3Mgd29ydGggZGF0YSBvbiBhbGwgdHJhY2tzIGJlZm9yZQorICAgIC8vIHN0YXJ0aW5nIHBsYXliYWNrIChib3RoIGF0IHN0YXJ0dXAgYW5kIGFmdGVyIGEgc2VlaykuCisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRHVyYXRpb25VcyA9IDIwMDAwMDBsbDsKKworICAgIGludDY0X3QgbWVkaWFEdXJhdGlvblVzID0gMDsKKyAgICBnZXREdXJhdGlvbigmbWVkaWFEdXJhdGlvblVzKTsKKyAgICBpZiAoKG1BdWRpb1RyYWNrICE9IE5VTEwgJiYgbUF1ZGlvVHJhY2stPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSkKKyAgICAgICAgICAgIHx8IChtVmlkZW9UcmFjayAhPSBOVUxMICYmIG1WaWRlb1RyYWNrLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIChkdXJhdGlvblVzID0gbUF1ZGlvVHJhY2stPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgPCBrTWluRHVyYXRpb25VcworICAgICAgICAgICAgJiYgZXJyID09IE9LKSB7CisgICAgICAgIEFMT0dWKCJhdWRpbyB0cmFjayBkb2Vzbid0IGhhdmUgZW5vdWdoIGRhdGEgeWV0LiAoJS4yZiBzZWNzIGJ1ZmZlcmVkKSIsCisgICAgICAgICAgICAgIGR1cmF0aW9uVXMgLyAxRTYpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIChkdXJhdGlvblVzID0gbVZpZGVvVHJhY2stPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgPCBrTWluRHVyYXRpb25VcworICAgICAgICAgICAgJiYgZXJyID09IE9LKSB7CisgICAgICAgIEFMT0dWKCJ2aWRlbyB0cmFjayBkb2Vzbid0IGhhdmUgZW5vdWdoIGRhdGEgeWV0LiAoJS4yZiBzZWNzIGJ1ZmZlcmVkKSIsCisgICAgICAgICAgICAgIGR1cmF0aW9uVXMgLyAxRTYpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSVFBTb3VyY2U6OmRlcXVldWVBY2Nlc3NVbml0KAorICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgeworCisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKworICAgIGlmIChtU3RhdGUgPT0gUEFVU0VEKSB7CisgICAgICAgIEFMT0dWKCItRVdPVUxEQkxPQ0siKTsKKyAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICBpZiAoIXNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhRHVyYXRpb25VcyA9IDA7CisgICAgICAgICAgICBnZXREdXJhdGlvbigmbWVkaWFEdXJhdGlvblVzKTsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG90aGVyU291cmNlID0gZ2V0U291cmNlKCFhdWRpbyk7CisgICAgICAgICAgICBzdGF0dXNfdCBvdGhlckZpbmFsUmVzdWx0OworCisgICAgICAgICAgICAvLyBJZiBvdGhlciBzb3VyY2UgYWxyZWFkeSBzaWduYWxlZCBFT1MsIHRoaXMgc291cmNlIHNob3VsZCBhbHNvIHNpZ25hbCBFT1MKKyAgICAgICAgICAgIGlmIChvdGhlclNvdXJjZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICFvdGhlclNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZvdGhlckZpbmFsUmVzdWx0KSAmJgorICAgICAgICAgICAgICAgICAgICBvdGhlckZpbmFsUmVzdWx0ID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhpcyBzb3VyY2UgaGFzIGRldGVjdGVkIG5lYXIgZW5kLCBnaXZlIGl0IHNvbWUgdGltZSB0byByZXRyaWV2ZSBtb3JlCisgICAgICAgICAgICAvLyBkYXRhIGJlZm9yZSBzaWduYWxpbmcgRU9TCisgICAgICAgICAgICBpZiAoc291cmNlLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGVvc1RpbWVvdXQgPSBhdWRpbyA/IG1FT1NUaW1lb3V0QXVkaW8gOiBtRU9TVGltZW91dFZpZGVvOworICAgICAgICAgICAgICAgIGlmIChlb3NUaW1lb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RU9TVGltZW91dChhdWRpbywgQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQUxvb3Blcjo6R2V0Tm93VXMoKSAtIGVvc1RpbWVvdXQpID4ga05lYXJFT1NUaW1lb3V0VXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RU9TVGltZW91dChhdWRpbywgMCk7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEob3RoZXJTb3VyY2UgIT0gTlVMTCAmJiBvdGhlclNvdXJjZS0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgZW50ZXIgYnVmZmVyaW5nIG1vZGUKKyAgICAgICAgICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIHNvdXJjZXMgYWxyZWFkeSBoYXZlIGRldGVjdGVkIEVPUy4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkcyB0byBiZSBjaGVja2VkIHdoZXRoZXIgYmVsb3cgbGluZSBpcyBuZWVkZWQgb3Igbm90LgorICAgICAgICAgICAgICAgIC8vIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQ7CisgICAgfQorCisgICAgc2V0RU9TVGltZW91dChhdWRpbywgMCk7CisKKyAgICBmaW5hbFJlc3VsdCA9IHNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7CisgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnQzMl90IGN2bzsKKyAgICBpZiAoKCphY2Nlc3NVbml0KSAhPSBOVUxMICYmICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJjdm8iLCAmY3ZvKSAmJgorICAgICAgICAgICAgY3ZvICE9IG1MYXN0Q1ZPVXBkYXRlZCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInBheWxvYWQtdHlwZSIsIE51UGxheWVyOjpSVFBTb3VyY2U6OlJUUF9DVk8pOworICAgICAgICBtc2ctPnNldEludDMyKCJjdm8iLCBjdm8pOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SU1TUnhOb3RpY2UpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoIm1lc3NhZ2UiLCBtc2cpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKworICAgICAgICBBTE9HVigibm90aWZ5IGN2byB1cGRhdGVkICglZCktPiglZCkgdG8gdXBwZXIgbGF5ZXIiLCBtTGFzdENWT1VwZGF0ZWQsIGN2byk7CisgICAgICAgIG1MYXN0Q1ZPVXBkYXRlZCA9IGN2bzsKKyAgICB9CisKKyAgICByZXR1cm4gZmluYWxSZXN1bHQ7Cit9CisKK3NwPEFub3RoZXJQYWNrZXRTb3VyY2U+IE51UGxheWVyOjpSVFBTb3VyY2U6OmdldFNvdXJjZShib29sIGF1ZGlvKSB7CisgICAgcmV0dXJuIGF1ZGlvID8gbUF1ZGlvVHJhY2sgOiBtVmlkZW9UcmFjazsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpzZXRFT1NUaW1lb3V0KGJvb2wgYXVkaW8sIGludDY0X3QgdGltZW91dCkgeworICAgIGlmIChhdWRpbykgeworICAgICAgICBtRU9TVGltZW91dEF1ZGlvID0gdGltZW91dDsKKyAgICB9IGVsc2UgeworICAgICAgICBtRU9TVGltZW91dFZpZGVvID0gdGltZW91dDsKKyAgICB9Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSVFBTb3VyY2U6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKKyAgICAqZHVyYXRpb25VcyA9IDBsbDsKKworICAgIGludDY0X3QgYXVkaW9EdXJhdGlvblVzOworICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMCisgICAgICAgICAgICAmJiBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICZhdWRpb0R1cmF0aW9uVXMpCisgICAgICAgICAgICAmJiBhdWRpb0R1cmF0aW9uVXMgPiAqZHVyYXRpb25VcykgeworICAgICAgICAqZHVyYXRpb25VcyA9IGF1ZGlvRHVyYXRpb25VczsKKyAgICB9CisKKyAgICBpbnQ2NF90IHZpZGVvRHVyYXRpb25VczsKKyAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTAorICAgICAgICAgICAgJiYgbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAmdmlkZW9EdXJhdGlvblVzKQorICAgICAgICAgICAgJiYgdmlkZW9EdXJhdGlvblVzID4gKmR1cmF0aW9uVXMpIHsKKyAgICAgICAgKmR1cmF0aW9uVXMgPSB2aWRlb0R1cmF0aW9uVXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UlRQU291cmNlOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigiUlRQU291cmNlOjpzZWVrVG89JWQsIG1vZGU9JWQiLCAoaW50KXNlZWtUaW1lVXMsIG1vZGUpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOworICAgIG1zZy0+cG9zdChrQnVmZmVyaW5nUG9sbEludGVydmFsVXMpOyAvLyAxIHNlY29uZCBpbnRlcnZhbHMKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpvblBvbGxCdWZmZXJpbmcoKSB7CisgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6aXNSZWFsVGltZSgpIGNvbnN0IHsKKyAgICBBTE9HRCgiUlRQU291cmNlOjppc1JlYWxUaW1lPSVkIiwgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigib25NZXNzYWdlUmVjZWl2ZWQgPSVkIiwgbXNnLT53aGF0KCkpOworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0QWNjZXNzVW5pdENvbXBsZXRlOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IENPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgdGltZVVwZGF0ZTsKKyAgICAgICAgICAgIC8vInRpbWUtdXBkYXRlIiByYWlzZWQgZnJvbSBBUlRQQ29ubmVjdGlvbjo6cGFyc2VTUigpCisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInRpbWUtdXBkYXRlIiwgJnRpbWVVcGRhdGUpICYmIHRpbWVVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgICAgICAgICAgICAgdWludDY0X3QgbnRwVGltZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm50cC10aW1lIiwgKGludDY0X3QgKikmbnRwVGltZSkpOworCisgICAgICAgICAgICAgICAgb25UaW1lVXBkYXRlKHRyYWNrSW5kZXgsIHJ0cFRpbWUsIG50cFRpbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IGZpcnN0UlRDUDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZmlyc3QtcnRjcCIsICZmaXJzdFJUQ1ApKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgd29uJ3QgYmUgYW4gYWNjZXNzIHVuaXQgaGVyZSwgaXQncyBqdXN0IGEgbm90aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgZGF0YSBjb21tdW5pY2F0aW9uIHdvcmtlZCBzaW5jZSB3ZSBnb3QgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgLy8gcnRjcCBwYWNrZXQuCisgICAgICAgICAgICAgICAgQUxPR1YoImZpcnN0LXJ0Y3AiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBJTVNSeE5vdGljZTsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicnRjcC1ldmVudCIsICZJTVNSeE5vdGljZSkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHBheWxvYWRUeXBlLCBmZWVkYmFja1R5cGU7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBheWxvYWQtdHlwZSIsICZwYXlsb2FkVHlwZSkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmZWVkYmFjay10eXBlIiwgJmZlZWRiYWNrVHlwZSkpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdElNU1J4Tm90aWNlKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoIm1lc3NhZ2UiLCBtc2cpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgICAgICAgICAgICAgQUxPR1YoIklNU1J4Tm90aWNlIFx0XHQgcGF5bG9hZCA6ICVkIGZlZWRiYWNrIDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRUeXBlLCBmZWVkYmFja1R5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzLXVuaXQiLCAmYWNjZXNzVW5pdCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBkYW1hZ2VkOworICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkYW1hZ2VkIiwgJmRhbWFnZWQpCisgICAgICAgICAgICAgICAgICAgICYmIGRhbWFnZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZHJvcHBpbmcgZGFtYWdlZCBhY2Nlc3MgdW5pdC4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW1wbGljaXRseSBhc3NlcnQgb24gdmFsaWQgdHJhY2tJbmRleCBoZXJlLCB3aGljaCB3ZSBlbnN1cmUgYnkKKyAgICAgICAgICAgIC8vIG5ldmVyIHJlbW92aW5nIHRyYWNrcy4KKyAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGluZm8tPm1Tb3VyY2U7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgICAgICAgICAgICAgIC8qIEFub3RoZXJQYWNrZXRTb3VyY2UgbWFrZSBhbiBhc3NlcnRpb24gaWYgdGhlcmUgaXMgbm8gbnRwIHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgUlRQU291cmNlIHNob3VsZCBwcm92aWRlIG50cFVzIGFsbCB0aGUgdGltZXMuCisgICAgICAgICAgICAgICAgaWYgKCFpbmZvLT5tTlBUTWFwcGluZ1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsaXZlIHN0cmVhbSwgd2UgZGlkbid0IHJlY2VpdmUgYW55IG5vcm1hbAorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5dGltZSBtYXBwaW5nLiBXZSB3b24ndCBtYXAgdG8gbnB0IHRpbWUuCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG5wdFVzID0KKyAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpcnRwVGltZSAtIChkb3VibGUpaW5mby0+bVJUUFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAvIGluZm8tPm1UaW1lU2NhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMDAwMGxsCisgICAgICAgICAgICAgICAgICAgICAgICArIGluZm8tPm1Ob3JtYWxQbGF5dGltZVVzOworCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKKworICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0RGlzY29ubmVjdDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5mby0+bUlzQXVkaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2sgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBBTE9HVigibUF1ZGlvVHJhY2sgZGlzY29ubmVjdGVkIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2stPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2sgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBBTE9HVigibVZpZGVvVHJhY2sgZGlzY29ubmVjdGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVJUUENvbm4tPnJlbW92ZVN0cmVhbShpbmZvLT5tUlRQU29ja2V0LCBpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgY2xvc2UoaW5mby0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgY2xvc2UoaW5mby0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVHJhY2tzLmNsZWFyKCk7CisgICAgICAgICAgICBtRmlyc3RBY2Nlc3NVbml0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BbGxUcmFja3NIYXZlVGltZSA9IGZhbHNlOworICAgICAgICAgICAgbU5UUEFuY2hvclVzID0gLTE7CisgICAgICAgICAgICBtTWVkaWFBbmNob3JVcyA9IC0xOworICAgICAgICAgICAgbUxhc3RNZWRpYVRpbWVVcyA9IC0xOworICAgICAgICAgICAgbU51bUFjY2Vzc1VuaXRzUmVjZWl2ZWQgPSAwOworICAgICAgICAgICAgbVJlY2VpdmVkRmlyc3RSVENQUGFja2V0ID0gZmFsc2U7CisgICAgICAgICAgICBtUmVjZWl2ZWRGaXJzdFJUUFBhY2tldCA9IGZhbHNlOworICAgICAgICAgICAgbVBhdXNpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QYXVzZUdlbmVyYXRpb24gPSAwOworCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UG9sbEJ1ZmZlcmluZzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c2V0VGFyZ2V0Qml0cmF0ZShpbnQzMl90IGJpdHJhdGUpIHsKKyAgICBtUlRQQ29ubi0+c2V0VGFyZ2V0Qml0cmF0ZShiaXRyYXRlKTsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpvblRpbWVVcGRhdGUoaW50MzJfdCB0cmFja0luZGV4LCB1aW50MzJfdCBydHBUaW1lLCB1aW50NjRfdCBudHBUaW1lKSB7CisgICAgQUxPR1YoIm9uVGltZVVwZGF0ZSB0cmFjayAlZCwgcnRwVGltZSA9IDB4JTA4eCwgbnRwVGltZSA9ICUjMDE2bGx4IiwKKyAgICAgICAgIHRyYWNrSW5kZXgsIHJ0cFRpbWUsIChsb25nIGxvbmcpbnRwVGltZSk7CisKKyAgICAvLyBjb252ZXJ0IG50cFRpbWUgaW4gUTMyIHNlY29uZHMgdG8gbWljcm9zZWNvbmRzLiBOb3RlOiB0aGlzIHdpbGwgbm90IGxvc2UgcHJlY2lzaW9uCisgICAgLy8gYmVjYXVzZSBudHBUaW1lVXMgaXMgYXQgbW9zdCA1MiBiaXRzIChkb3VibGUgaG9sZHMgNTMgYml0cykKKyAgICBpbnQ2NF90IG50cFRpbWVVcyA9IChpbnQ2NF90KShudHBUaW1lICogMUU2IC8gKDFsbCA8PCAzMikpOworCisgICAgVHJhY2tJbmZvICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICB0cmFjay0+bVJUUEFuY2hvciA9IHJ0cFRpbWU7CisgICAgdHJhY2stPm1OVFBBbmNob3JVcyA9IG50cFRpbWVVczsKKworICAgIGlmIChtTlRQQW5jaG9yVXMgPCAwKSB7CisgICAgICAgIG1OVFBBbmNob3JVcyA9IG50cFRpbWVVczsKKyAgICAgICAgbU1lZGlhQW5jaG9yVXMgPSBtTGFzdE1lZGlhVGltZVVzOworICAgIH0KKworICAgIGlmICghbUFsbFRyYWNrc0hhdmVUaW1lKSB7CisgICAgICAgIGJvb2wgYWxsVHJhY2tzSGF2ZVRpbWUgPSAobVRyYWNrcy5zaXplKCkgPiAwKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bU5UUEFuY2hvclVzIDwgMCkgeworICAgICAgICAgICAgICAgIGFsbFRyYWNrc0hhdmVUaW1lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsbFRyYWNrc0hhdmVUaW1lKSB7CisgICAgICAgICAgICBtQWxsVHJhY2tzSGF2ZVRpbWUgPSB0cnVlOworICAgICAgICAgICAgQUxPR0koIlRpbWUgbm93IGVzdGFibGlzaGVkIGZvciBhbGwgdHJhY2tzLiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtQWxsVHJhY2tzSGF2ZVRpbWUgJiYgZGF0YVJlY2VpdmVkT25BbGxDaGFubmVscygpKSB7CisgICAgICAgIC8vIFRpbWUgaXMgbm93IGVzdGFibGlzaGVkLCBsZXRzIHN0YXJ0IHRpbWVzdGFtcGluZyBpbW1lZGlhdGVseQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgIHdoaWxlICghdHJhY2tJbmZvLT5tUGFja2V0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9ICp0cmFja0luZm8tPm1QYWNrZXRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tUGFja2V0cy5lcmFzZSh0cmFja0luZm8tPm1QYWNrZXRzLmJlZ2luKCkpOworCisgICAgICAgICAgICAgICAgaWYgKGFkZE1lZGlhVGltZXN0YW1wKGksIHRyYWNrSW5mbywgYWNjZXNzVW5pdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFF1ZXVlQWNjZXNzVW5pdChpLCBhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6YWRkTWVkaWFUaW1lc3RhbXAoCisgICAgICAgIGludDMyX3QgdHJhY2tJbmRleCwgY29uc3QgVHJhY2tJbmZvICp0cmFjaywKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgaW50NjRfdCByZWxSdHBUaW1lVXMgPQorICAgICAgICAoKChpbnQ2NF90KXJ0cFRpbWUgLSAoaW50NjRfdCl0cmFjay0+bVJUUEFuY2hvcikgKiAxMDAwMDAwbGwpCisgICAgICAgIC8gdHJhY2stPm1UaW1lU2NhbGU7CisKKyAgICBpbnQ2NF90IG50cFRpbWVVcyA9IHRyYWNrLT5tTlRQQW5jaG9yVXMgKyByZWxSdHBUaW1lVXM7CisKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gbU1lZGlhQW5jaG9yVXMgKyBudHBUaW1lVXMgLSBtTlRQQW5jaG9yVXM7CisKKyAgICBpZiAobWVkaWFUaW1lVXMgPiBtTGFzdE1lZGlhVGltZVVzKSB7CisgICAgICAgIG1MYXN0TWVkaWFUaW1lVXMgPSBtZWRpYVRpbWVVczsKKyAgICB9CisKKyAgICBpZiAobWVkaWFUaW1lVXMgPCAwKSB7CisgICAgICAgIEFMT0dWKCJkcm9wcGluZyBlYXJseSBhY2Nlc3NVbml0LiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoInRyYWNrICVkIHJ0cFRpbWU9JXUgbWVkaWFUaW1lVXMgPSAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgIHRyYWNrSW5kZXgsIHJ0cFRpbWUsIChsb25nIGxvbmcpbWVkaWFUaW1lVXMsIG1lZGlhVGltZVVzIC8gMUU2KTsKKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIG1lZGlhVGltZVVzKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE51UGxheWVyOjpSVFBTb3VyY2U6OmRhdGFSZWNlaXZlZE9uQWxsQ2hhbm5lbHMoKSB7CisgICAgVHJhY2tJbmZvICp0cmFjazsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpwb3N0UXVldWVBY2Nlc3NVbml0KAorICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0QWNjZXNzVW5pdCwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QWNjZXNzVW5pdCk7CisgICAgbXNnLT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CisgICAgbXNnLT5zZXRCdWZmZXIoImFjY2Vzc1VuaXQiLCBhY2Nlc3NVbml0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpwb3N0UXVldWVFT1Moc2l6ZV90IHRyYWNrSW5kZXgsIHN0YXR1c190IGZpbmFsUmVzdWx0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPUywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKKyAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICBtc2ctPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyOjpSVFBTb3VyY2U6OmdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgaW50MzJfdCAqdGltZVNjYWxlKSB7CisgICAgQ0hFQ0tfR0UoaW5kZXgsIDB1KTsKKyAgICBDSEVDS19MVChpbmRleCwgbVRyYWNrcy5zaXplKCkpOworCisgICAgY29uc3QgVHJhY2tJbmZvICZpbmZvID0gbVRyYWNrcy5pdGVtQXQoaW5kZXgpOworCisgICAgKnRpbWVTY2FsZSA9IGluZm8ubVRpbWVTY2FsZTsKKworICAgIHJldHVybiBpbmZvLm1QYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6Om9uQ29ubmVjdGVkKCkgeworICAgIEFMT0dWKCJvbkNvbm5lY3RlZCIpOworICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpvbkRpc2Nvbm5lY3RlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtU3RhdGUgPT0gRElTQ09OTkVDVEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZlcnIpKTsKKyAgICBDSEVDS19ORShlcnIsIChzdGF0dXNfdClPSyk7CisKKy8vICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKy8vICAgIG1IYW5kbGVyLmNsZWFyKCk7CisKKyAgICBpZiAobVN0YXRlID09IENPTk5FQ1RJTkcpIHsKKyAgICAgICAgLy8gV2UncmUgc3RpbGwgaW4gdGhlIHByZXBhcmF0aW9uIHBoYXNlLCBzaWduYWwgdGhhdCBpdAorICAgICAgICAvLyBmYWlsZWQuCisgICAgICAgIG5vdGlmeVByZXBhcmVkKGVycik7CisgICAgfQorCisgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworLy8gICAgc2V0RXJyb3IoZXJyKTsKKworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UlRQU291cmNlOjpzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSkgeworICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6IGtleSAoJXMpID0+IHZhbHVlICglcykiLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpKTsKKworICAgIGJvb2wgaXNBdWRpb0tleSA9IGtleS5jb250YWlucygiYXVkaW8iKTsKKyAgICBUcmFja0luZm8gKmluZm8gPSBOVUxMOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworICAgICAgICBpZiAoaW5mbyAhPSBOVUxMICYmIGluZm8tPm1Jc0F1ZGlvID09IGlzQXVkaW9LZXkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6ICVzIHRyYWNrICglZCkgZm91bmQiLCBpc0F1ZGlvS2V5ID8gImF1ZGlvIiA6ICJ2aWRlbyIgLCBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgICAgICBUcmFja0luZm8gbmV3VHJhY2tJbmZvOworICAgICAgICBuZXdUcmFja0luZm8ubUlzQXVkaW8gPSBpc0F1ZGlvS2V5OworICAgICAgICBtVHJhY2tzLnB1c2gobmV3VHJhY2tJbmZvKTsKKyAgICAgICAgaW5mbyA9ICZtVHJhY2tzLmVkaXRUb3AoKTsKKyAgICAgICAgaW5mby0+bUpiVGltZU1zID0gMzAwOworICAgIH0KKworICAgIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1taW1lLXR5cGUiKSB7CisgICAgICAgIGluZm8tPm1NaW1lVHlwZSA9IHZhbHVlOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUgPSB2YWx1ZS5zdHJpbmcoKTsKKyAgICAgICAgY29uc3QgY2hhciAqZGVsaW1pdGVyID0gc3RyY2hyKG1pbWUsICcvJyk7CisgICAgICAgIGluZm8tPm1Db2RlY05hbWUgPSBkZWxpbWl0ZXIgPyAoZGVsaW1pdGVyICsgMSkgOiAiPG5vbmU+IjsKKworICAgICAgICBBTE9HVigicnRwLXBhcmFtLW1pbWUtdHlwZTogbU1pbWVUeXBlICglcykgPT4gbUNvZGVjTmFtZSAoJXMpIiwKKyAgICAgICAgICAgICAgICBpbmZvLT5tTWltZVR5cGUuc3RyaW5nKCksIGluZm8tPm1Db2RlY05hbWUuc3RyaW5nKCkpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1kZWNvZGVyLXByb2ZpbGUiKSB7CisgICAgICAgIGluZm8tPm1Db2RlY1Byb2ZpbGUgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tZGVjb2Rlci1sZXZlbCIpIHsKKyAgICAgICAgaW5mby0+bUNvZGVjTGV2ZWwgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0td2lkdGgiKSB7CisgICAgICAgIGluZm8tPm1XaWR0aCA9IGF0b2kodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1oZWlnaHQiKSB7CisgICAgICAgIGluZm8tPm1IZWlnaHQgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWxvY2FsLWlwIikgeworICAgICAgICBpbmZvLT5tTG9jYWxJcCA9IHZhbHVlOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tbG9jYWwtcG9ydCIpIHsKKyAgICAgICAgaW5mby0+bUxvY2FsUG9ydCA9IGF0b2kodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcmVtb3RlLWlwIikgeworICAgICAgICBpbmZvLT5tUmVtb3RlSXAgPSB2YWx1ZTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXJlbW90ZS1wb3J0IikgeworICAgICAgICBpbmZvLT5tUmVtb3RlUG9ydCA9IGF0b2kodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcGF5bG9hZC10eXBlIikgeworICAgICAgICBpbmZvLT5tUGF5bG9hZFR5cGUgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWFzIikgeworICAgICAgICAvL0FTIG1lYW5zIGd1YXJhbnRlZWQgYml0IHJhdGUgdGhhdCBuZWdvdGlhdGVkIGZyb20gc2RwLgorICAgICAgICBpbmZvLT5tQVMgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXJ0cC10aW1lb3V0IikgeworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcnRjcC10aW1lb3V0IikgeworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tdGltZS1zY2FsZSIpIHsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXNlbGYtaWQiKSB7CisgICAgICAgIGluZm8tPm1TZWxmSUQgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWV4dC1jdm8tZXh0bWFwIikgeworICAgICAgICBpbmZvLT5tQ1ZPRXh0TWFwID0gYXRvaSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1zZXQtc29ja2V0LW5ldHdvcmsiKSB7CisgICAgICAgIGludDY0X3QgbmV0d29ya0hhbmRsZSA9IGF0b2xsKHZhbHVlKTsKKyAgICAgICAgc2V0U29ja2V0TmV0d29yayhuZXR3b3JrSGFuZGxlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWppdHRlci1idWZmZXItdGltZSIpIHsKKyAgICAgICAgaW5mby0+bUpiVGltZU1zID0gYXRvaSh2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UlRQU291cmNlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzggJnBhcmFtcykgeworICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXJzOiAlcyIsIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgY29uc3QgY2hhciAqY3BhcmFtcyA9IHBhcmFtcy5zdHJpbmcoKTsKKyAgICBjb25zdCBjaGFyICprZXlfc3RhcnQgPSBjcGFyYW1zOworICAgIGZvciAoOzspIHsKKyAgICAgICAgY29uc3QgY2hhciAqZXF1YWxfcG9zID0gc3RyY2hyKGtleV9zdGFydCwgJz0nKTsKKyAgICAgICAgaWYgKGVxdWFsX3BvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiUGFyYW1ldGVycyAlcyBtaXNzIGEgdmFsdWUiLCBjcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBrZXkoa2V5X3N0YXJ0LCBlcXVhbF9wb3MgLSBrZXlfc3RhcnQpOworICAgICAgICBUcmltU3RyaW5nKCZrZXkpOworICAgICAgICBpZiAoa2V5Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJQYXJhbWV0ZXJzICVzIGNvbnRhaW5zIGFuIGVtcHR5IGtleSIsIGNwYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBjaGFyICp2YWx1ZV9zdGFydCA9IGVxdWFsX3BvcyArIDE7CisgICAgICAgIGNvbnN0IGNoYXIgKnNlbWljb2xvbl9wb3MgPSBzdHJjaHIodmFsdWVfc3RhcnQsICc7Jyk7CisgICAgICAgIFN0cmluZzggdmFsdWU7CisgICAgICAgIGlmIChzZW1pY29sb25fcG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIHZhbHVlLnNldFRvKHZhbHVlX3N0YXJ0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbHVlLnNldFRvKHZhbHVlX3N0YXJ0LCBzZW1pY29sb25fcG9zIC0gdmFsdWVfc3RhcnQpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRQYXJhbWV0ZXIoa2V5LCB2YWx1ZSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbWljb2xvbl9wb3MgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7ICAvLyBSZWFjaGVzIHRoZSBlbmQKKyAgICAgICAgfQorICAgICAgICBrZXlfc3RhcnQgPSBzZW1pY29sb25fcG9zICsgMTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnNldFNvY2tldE5ldHdvcmsoaW50NjRfdCBuZXR3b3JrSGFuZGxlKSB7CisgICAgQUxPR1YoInNldFNvY2tldE5ldHdvcms6ICVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKW5ldHdvcmtIYW5kbGUpOworCisgICAgVHJhY2tJbmZvICppbmZvID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgaWYgKGluZm8gPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGluZm8tPm1Tb2NrZXROZXR3b3JrID0gbmV0d29ya0hhbmRsZTsKKyAgICB9Cit9CisKKy8vIFRyaW0gYm90aCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KKy8vc3RhdGljCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OlRyaW1TdHJpbmcoU3RyaW5nOCAqcykgeworICAgIHNpemVfdCBudW1fYnl0ZXMgPSBzLT5ieXRlcygpOworICAgIGNvbnN0IGNoYXIgKmRhdGEgPSBzLT5zdHJpbmcoKTsKKworICAgIHNpemVfdCBsZWFkaW5nX3NwYWNlID0gMDsKKyAgICB3aGlsZSAobGVhZGluZ19zcGFjZSA8IG51bV9ieXRlcyAmJiBpc3NwYWNlKGRhdGFbbGVhZGluZ19zcGFjZV0pKSB7CisgICAgICAgICsrbGVhZGluZ19zcGFjZTsKKyAgICB9CisKKyAgICBzaXplX3QgaSA9IG51bV9ieXRlczsKKyAgICB3aGlsZSAoaSA+IGxlYWRpbmdfc3BhY2UgJiYgaXNzcGFjZShkYXRhW2kgLSAxXSkpIHsKKyAgICAgICAgLS1pOworICAgIH0KKworICAgIHMtPnNldFRvKFN0cmluZzgoJmRhdGFbbGVhZGluZ19zcGFjZV0sIGkgLSBsZWFkaW5nX3NwYWNlKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyZDNiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuaApAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUlRQX1NPVVJDRV9IXworCisjZGVmaW5lIFJUUF9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaD4KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgIkFQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgorCisKKworCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOworCitzdHJ1Y3QgTnVQbGF5ZXI6OlJUUFNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKKyAgICBSVFBTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcyk7CisKKyAgICBlbnVtIHsKKyAgICAgICAgUlRQX0ZJUlNUX1BBQ0tFVCA9IDEwMCwKKyAgICAgICAgUlRDUF9GSVJTVF9QQUNLRVQgPSAxMDEsCisgICAgICAgIFJUUF9RVUFMSVRZID0gMTAyLAorICAgICAgICBSVENQX1RTRkIgPSAyMDUsCisgICAgICAgIFJUQ1BfUFNGQiA9IDIwNiwKKyAgICAgICAgUlRQX0NWTyA9IDMwMCwKKyAgICAgICAgUlRQX0FVVE9ET1dOID0gNDAwLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYm9vbCBpc1JlYWxUaW1lKCkgY29uc3Q7CisKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRUYXJnZXRCaXRyYXRlKGludDMyX3QgYml0cmF0ZSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5SVFBTb3VyY2UoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0QWNjZXNzVW5pdCA9ICdhY2NVJywKKyAgICAgICAga1doYXRBY2Nlc3NVbml0Q29tcGxldGUgPSAnYWNjdScsCisgICAgICAgIGtXaGF0RGlzY29ubmVjdCA9ICdkaXNjJywKKyAgICAgICAga1doYXRFT1MgPSAnZW9zIScsCisgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZyA9ICdwb2xsJywKKyAgICAgICAga1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyA9ICdzQnVTJywKKyAgICB9OworCisgICAgY29uc3QgaW50NjRfdCBrQnVmZmVyaW5nUG9sbEludGVydmFsVXMgPSAxMDAwMDAwbGw7CisKKyAgICBlbnVtIFN0YXRlIHsKKyAgICAgICAgRElTQ09OTkVDVEVELAorICAgICAgICBDT05ORUNUSU5HLAorICAgICAgICBDT05ORUNURUQsCisgICAgICAgIFBBVVNFRCwKKyAgICB9OworCisgICAgc3RydWN0IFRyYWNrSW5mbyB7CisKKyAgICAgICAgLyogU0RQIG9mIHRyYWNrICovCisgICAgICAgIGJvb2wgbUlzQXVkaW87CisgICAgICAgIGludDMyX3QgbVBheWxvYWRUeXBlOworICAgICAgICBTdHJpbmc4IG1NaW1lVHlwZTsKKyAgICAgICAgU3RyaW5nOCBtQ29kZWNOYW1lOworICAgICAgICBpbnQzMl90IG1Db2RlY1Byb2ZpbGU7CisgICAgICAgIGludDMyX3QgbUNvZGVjTGV2ZWw7CisgICAgICAgIGludDMyX3QgbVdpZHRoOworICAgICAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgICAgIFN0cmluZzggbUxvY2FsSXA7CisgICAgICAgIFN0cmluZzggbVJlbW90ZUlwOworICAgICAgICBpbnQzMl90IG1Mb2NhbFBvcnQ7CisgICAgICAgIGludDMyX3QgbVJlbW90ZVBvcnQ7CisgICAgICAgIGludDY0X3QgbVNvY2tldE5ldHdvcms7CisgICAgICAgIGludDMyX3QgbVRpbWVTY2FsZTsKKyAgICAgICAgaW50MzJfdCBtQVM7CisKKyAgICAgICAgLyogUlRQIGppdHRlciBidWZmZXIgdGltZSBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICAgICAgdWludDMyX3QgbUpiVGltZU1zOworICAgICAgICAvKiBVbmlxdWUgSUQgaW5kaWNhdGVzIGl0c2VsZiAqLworICAgICAgICB1aW50MzJfdCBtU2VsZklEOworICAgICAgICAvKiBleHRtYXA6PHZhbHVlPiBmb3IgQ1ZPIHdpbGwgYmUgc2V0IHRvIGhlcmUgKi8KKyAgICAgICAgaW50MzJfdCBtQ1ZPRXh0TWFwOworCisgICAgICAgIC8qIGEgY29weSBvZiBUcmFja0luZm8gaW4gUlRTUFNvdXJjZSAqLworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtU291cmNlOworICAgICAgICB1aW50MzJfdCBtUlRQVGltZTsKKyAgICAgICAgaW50NjRfdCBtTm9ybWFsUGxheXRpbWVVczsKKyAgICAgICAgYm9vbCBtTlBUTWFwcGluZ1ZhbGlkOworCisgICAgICAgIC8qIGEgY29weSBvZiBUcmFja0luZm8gaW4gTXlIYW5kbGVyLmggKi8KKyAgICAgICAgaW50IG1SVFBTb2NrZXQ7CisgICAgICAgIGludCBtUlRDUFNvY2tldDsKKyAgICAgICAgdWludDMyX3QgbUZpcnN0U2VxTnVtSW5TZWdtZW50OworICAgICAgICBib29sIG1OZXdTZWdtZW50OworICAgICAgICBpbnQzMl90IG1BbGxvd2VkU3RhbGVBY2Nlc3NVbml0czsKKyAgICAgICAgdWludDMyX3QgbVJUUEFuY2hvcjsKKyAgICAgICAgaW50NjRfdCBtTlRQQW5jaG9yVXM7CisgICAgICAgIGJvb2wgbUVPU1JlY2VpdmVkOworICAgICAgICB1aW50MzJfdCBtTm9ybWFsUGxheVRpbWVSVFA7CisgICAgICAgIGludDY0X3QgbU5vcm1hbFBsYXlUaW1lVXM7CisgICAgICAgIHNwPEFQYWNrZXRTb3VyY2U+IG1QYWNrZXRTb3VyY2U7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4+IG1QYWNrZXRzOworICAgIH07CisKKyAgICBjb25zdCBTdHJpbmc4IG1SVFBQYXJhbXM7CisgICAgdWludDMyX3QgbUZsYWdzOworICAgIFN0YXRlIG1TdGF0ZTsKKyAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CisKKyAgICAvLyBiZWxvdyAzIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBjaGVja2VkIHdoZXRoZXIgaXQgbmVlZGVkIG9yIG5vdC4KKyAgICBNdXRleCBtQnVmZmVyaW5nTG9jazsKKyAgICBib29sIG1CdWZmZXJpbmc7CisgICAgYm9vbCBtSW5QcmVwYXJhdGlvblBoYXNlOworICAgIE11dGV4IG1CdWZmZXJpbmdTZXR0aW5nc0xvY2s7CisgICAgQnVmZmVyaW5nU2V0dGluZ3MgbUJ1ZmZlcmluZ1NldHRpbmdzOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKworICAgIHNwPEFSVFBDb25uZWN0aW9uPiBtUlRQQ29ubjsKKworICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbUF1ZGlvVHJhY2s7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVZpZGVvVHJhY2s7CisKKyAgICBpbnQ2NF90IG1FT1NUaW1lb3V0QXVkaW87CisgICAgaW50NjRfdCBtRU9TVGltZW91dFZpZGVvOworCisgICAgLyogTXlIYW5kbGVyLmggKi8KKyAgICBib29sIG1GaXJzdEFjY2Vzc1VuaXQ7CisgICAgYm9vbCBtQWxsVHJhY2tzSGF2ZVRpbWU7CisgICAgaW50NjRfdCBtTlRQQW5jaG9yVXM7CisgICAgaW50NjRfdCBtTWVkaWFBbmNob3JVczsKKyAgICBpbnQ2NF90IG1MYXN0TWVkaWFUaW1lVXM7CisgICAgaW50NjRfdCBtTnVtQWNjZXNzVW5pdHNSZWNlaXZlZDsKKyAgICBpbnQzMl90IG1MYXN0Q1ZPVXBkYXRlZDsKKyAgICBib29sIG1SZWNlaXZlZEZpcnN0UlRDUFBhY2tldDsKKyAgICBib29sIG1SZWNlaXZlZEZpcnN0UlRQUGFja2V0OworICAgIGJvb2wgbVBhdXNpbmc7CisgICAgaW50MzJfdCBtUGF1c2VHZW5lcmF0aW9uOworCisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZ2V0U291cmNlKGJvb2wgYXVkaW8pOworCisgICAgLyogTXlIYW5kbGVyLmggKi8KKyAgICB2b2lkIG9uVGltZVVwZGF0ZShpbnQzMl90IHRyYWNrSW5kZXgsIHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpOworICAgIGJvb2wgYWRkTWVkaWFUaW1lc3RhbXAoaW50MzJfdCB0cmFja0luZGV4LCBjb25zdCBUcmFja0luZm8gKnRyYWNrLAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIGJvb2wgZGF0YVJlY2VpdmVkT25BbGxDaGFubmVscygpOworICAgIHZvaWQgcG9zdFF1ZXVlQWNjZXNzVW5pdChzaXplX3QgdHJhY2tJbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIHZvaWQgcG9zdFF1ZXVlRU9TKHNpemVfdCB0cmFja0luZGV4LCBzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CisgICAgc3A8TWV0YURhdGE+IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgaW50MzJfdCAqdGltZVNjYWxlKTsKKyAgICB2b2lkIG9uQ29ubmVjdGVkKCk7CisgICAgdm9pZCBvbkRpc2Nvbm5lY3RlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2b2lkIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CisKKyAgICBib29sIGhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCk7CisKKyAgICB2b2lkIHNldEVPU1RpbWVvdXQoYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lb3V0KTsKKworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCAmcGFyYW1zKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CisgICAgdm9pZCBzZXRTb2NrZXROZXR3b3JrKGludDY0X3QgbmV0d29ya0hhbmRsZSk7CisgICAgc3RhdGljIHZvaWQgVHJpbVN0cmluZyhTdHJpbmc4ICpzKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJUUFNvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJUUF9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAppbmRleCA4M2RhMDkyLi45NTMzYWU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCkBAIC0xNDYsNyArMTQ2LDkgQEAKICAgICB9CiAKICAgICAvLyBDbG9zZSBzb2NrZXQgYmVmb3JlIHBvc3RpbmcgbWVzc2FnZSB0byBSVFNQU291cmNlIG1lc3NhZ2UgaGFuZGxlci4KLSAgICBjbG9zZShtSGFuZGxlci0+Z2V0QVJUU1BDb25uZWN0aW9uKCktPmdldFNvY2tldCgpKTsKKyAgICBpZiAobUhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICBjbG9zZShtSGFuZGxlci0+Z2V0QVJUU1BDb25uZWN0aW9uKCktPmdldFNvY2tldCgpKTsKKyAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgdGhpcyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcAppbmRleCBmMTE0MDQ2Li5jODFhNjU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCkBAIC02NSw2ICs2NSwxNCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbygKKyAgICAgICAgICAgIGludCAvKiBwaWQgKi8sIGludCAvKiBwcm9jU3RhdGUgKi8sIGludCAvKiBvb21TY29yZSAqLykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShpbnQgLyogcGlkICovKSB7CisgICAgfQorCiBwcml2YXRlOgogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZha2VQcm9jZXNzSW5mbyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1MmVhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJTdGFnZWZyaWdodFJlY29yZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTdGFnZWZyaWdodFJlY29yZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhcGxheWVyc2VydmljZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgXSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9TdGFnZWZyaWdodFJlY29yZGVyVGVzdC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9TdGFnZWZyaWdodFJlY29yZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1MTYzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL1N0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LmNwcApAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8TWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJTdGFnZWZyaWdodFJlY29yZGVyLmgiCisKKyNkZWZpbmUgT1VUUFVUX0lORk9fRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvc3RmcmVjb3JkZXJfYXVkaW8uaW5mbyIKKyNkZWZpbmUgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTyAiL2RhdGEvbG9jYWwvdG1wL3N0ZnJlY29yZGVyX2F1ZGlvLnJhdyIKKworY29uc3QgYm9vbCBrRGVidWcgPSBmYWxzZTsKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhMb29wQ291bnQgPSAxMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtDbGlwRHVyYXRpb25JblNlYyA9IDQ7Citjb25zdGV4cHIgaW50MzJfdCBrUGF1c2VUaW1lSW5TZWMgPSAyOworLy8gVG9sZXJhbmNlIHZhbHVlIGZvciBleHRyYWN0ZWQgY2xpcGR1cmF0aW9uIGlzIG1heGltdW0gMTAlIG9mIHRvdGFsIGNsaXBkdXJhdGlvbgorY29uc3RleHByIGludDMyX3Qga1RvbGVyYW5jZVZhbHVlSW5VcyA9IGtDbGlwRHVyYXRpb25JblNlYyAqIDEwMDAwMDsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjxvdXRwdXRfZm9ybWF0LCBhdWRpb19lbmNvZGVyPj4geworICBwdWJsaWM6CisgICAgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QoKSA6IG1TdGZSZWNvcmRlcihudWxscHRyKSwgbU91dHB1dEF1ZGlvRnAobnVsbHB0cikgeworICAgICAgICBtRXhwZWN0ZWREdXJhdGlvbkluTXMgPSAwOworICAgICAgICBtRXhwZWN0ZWRQYXVzZUluTXMgPSAwOworICAgIH0KKworICAgIH5TdGFnZWZyaWdodFJlY29yZGVyVGVzdCgpIHsKKyAgICAgICAgaWYgKG1TdGZSZWNvcmRlcikgZnJlZShtU3RmUmVjb3JkZXIpOworICAgICAgICBpZiAobU91dHB1dEF1ZGlvRnApIGZjbG9zZShtT3V0cHV0QXVkaW9GcCk7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbVN0ZlJlY29yZGVyID0gbmV3IFN0YWdlZnJpZ2h0UmVjb3JkZXIoU3RyaW5nMTYoTE9HX1RBRykpOworICAgICAgICBBU1NFUlRfTkUobVN0ZlJlY29yZGVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgaW5zdGFuY2Ugb2YgcmVjb3JkZXIiOworCisgICAgICAgIG1PdXRwdXRBdWRpb0ZwID0gZm9wZW4oT1VUUFVUX0ZJTEVfTkFNRV9BVURJTywgIndiIik7CisgICAgICAgIEFTU0VSVF9ORShtT3V0cHV0QXVkaW9GcCwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPIDw8ICIgZm9yIHN0YWdlZnJpZ2h0IHJlY29yZGVyIjsKKworICAgICAgICBpbnQzMl90IGZkID0gZmlsZW5vKG1PdXRwdXRBdWRpb0ZwKTsKKyAgICAgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgZmlsZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU87CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zZXRPdXRwdXRGaWxlKGZkKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc2V0IHRoZSBvdXRwdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIHN0YWdlZnJpZ2h0IHJlY29yZGVyIjsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU91dHB1dEF1ZGlvRnApIHsKKyAgICAgICAgICAgIGZjbG9zZShtT3V0cHV0QXVkaW9GcCk7CisgICAgICAgICAgICBtT3V0cHV0QXVkaW9GcCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFrRGVidWcpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhdHVzID0gcmVtb3ZlKE9VVFBVVF9GSUxFX05BTUVfQVVESU8pOworICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlVuYWJsZSB0byBkZWxldGUgdGhlIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0QXVkaW9SZWNvcmRlckZvcm1hdChvdXRwdXRfZm9ybWF0IG91dHB1dEZvcm1hdCwgYXVkaW9fZW5jb2RlciBlbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUKTsKKyAgICB2b2lkIHJlY29yZE1lZGlhKGJvb2wgaXNQYXVzZWQgPSBmYWxzZSwgaW50MzJfdCBudW1TdGFydCA9IDAsIGludDMyX3QgbnVtUGF1c2UgPSAwKTsKKyAgICB2b2lkIGR1bXBJbmZvKCk7CisgICAgdm9pZCBzZXR1cEV4dHJhY3RvcihBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwgaW50MzJfdCAmdHJhY2tDb3VudCk7CisgICAgdm9pZCB2YWxpZGF0ZU91dHB1dCgpOworCisgICAgTWVkaWFSZWNvcmRlckJhc2UgKm1TdGZSZWNvcmRlcjsKKyAgICBGSUxFICptT3V0cHV0QXVkaW9GcDsKKyAgICBkb3VibGUgbUV4cGVjdGVkRHVyYXRpb25Jbk1zOworICAgIGRvdWJsZSBtRXhwZWN0ZWRQYXVzZUluTXM7Cit9OworCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0OjpzZXRBdWRpb1JlY29yZGVyRm9ybWF0KG91dHB1dF9mb3JtYXQgb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19lbmNvZGVyIGVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zZXRBdWRpb1NvdXJjZShhdWRpb1NvdXJjZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc2V0IHRoZSBhdWRpbyBzb3VyY2U6ICIgPDwgYXVkaW9Tb3VyY2U7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnNldE91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHNldCB0aGUgb3V0cHV0IGZvcm1hdDogIiA8PCBvdXRwdXRGb3JtYXQ7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnNldEF1ZGlvRW5jb2RlcihlbmNvZGVyKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzZXQgdGhlIGF1ZGlvIGVuY29kZXI6ICIgPDwgZW5jb2RlcjsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6cmVjb3JkTWVkaWEoYm9vbCBpc1BhdXNlLCBpbnQzMl90IG51bVN0YXJ0LCBpbnQzMl90IG51bVBhdXNlKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5pbml0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzdGFnZWZyaWdodCByZWNvcmRlciI7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnByZXBhcmUoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBwcmVhcHJlIHRoZSByZW9yZGVyIjsKKworICAgIC8vIGZpcnN0IHN0YXJ0IHNob3VsZCBzdWNjZWVkLgorICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzdGFydCB0aGUgcmVjb3JkZXIiOworCisgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBudW1TdGFydDsgY291bnQrKykgeworICAgICAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0YXJ0KCk7CisgICAgfQorCisgICAgYXV0byB0U3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAvLyBSZWNvcmRpbmcgbWVkaWEgZm9yIDQgc2VjcworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyhrQ2xpcER1cmF0aW9uSW5TZWMpKTsKKyAgICBhdXRvIHRFbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICBtRXhwZWN0ZWREdXJhdGlvbkluTXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pbGxpPih0RW5kIC0gdFN0YXJ0KS5jb3VudCgpOworCisgICAgaWYgKGlzUGF1c2UpIHsKKyAgICAgICAgLy8gZmlyc3QgcGF1c2Ugc2hvdWxkIHN1Y2NlZWQuCisgICAgICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+cGF1c2UoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gcGF1c2UgdGhlIHJlY29yZGVyIjsKKworICAgICAgICB0U3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAgICAgLy8gUGF1c2VkIHJlY29yZGVyIGZvciAyIHNlY3MKKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGtQYXVzZVRpbWVJblNlYykpOworCisgICAgICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwgbnVtUGF1c2U7IGNvdW50KyspIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+cGF1c2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRFbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAgICAgbUV4cGVjdGVkUGF1c2VJbk1zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4odEVuZCAtIHRTdGFydCkuY291bnQoKTsKKworICAgICAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnJlc3VtZSgpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byByZXN1bWUgdGhlIHJlY29yZGVyIjsKKworICAgICAgICBhdXRvIHRTdGFydCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworICAgICAgICAvLyBSZWNvcmRpbmcgbWVkaWEgZm9yIDQgc2VjcworICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoa0NsaXBEdXJhdGlvbkluU2VjKSk7CisgICAgICAgIGF1dG8gdEVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworICAgICAgICBtRXhwZWN0ZWREdXJhdGlvbkluTXMgKz0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4odEVuZCAtIHRTdGFydCkuY291bnQoKTsKKyAgICB9CisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgcmVjb3JkZXIiOworfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0OjpkdW1wSW5mbygpIHsKKyAgICBGSUxFICpkdW1wT3V0cHV0ID0gZm9wZW4oT1VUUFVUX0lORk9fRklMRV9OQU1FLCAid2IiKTsKKyAgICBpbnQzMl90IGR1bXBGZCA9IGZpbGVubyhkdW1wT3V0cHV0KTsKKyAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5kdW1wKGR1bXBGZCwgYXJncyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gZHVtcCB0aGUgaW5mbyBmb3IgdGhlIHJlY29yZGVyIjsKKyAgICBmY2xvc2UoZHVtcE91dHB1dCk7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3Q6OnNldHVwRXh0cmFjdG9yKEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBpbnQzMl90ICZ0cmFja0NvdW50KSB7CisgICAgaW50MzJfdCBmZCA9IG9wZW4oT1VUUFVUX0ZJTEVfTkFNRV9BVURJTywgT19SRE9OTFkpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIHJlY29yZGVyJ3Mgb3V0cHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPCisgICAgICAgICAgICAgICAgICAgICA8PCAiIHRvIHZhbGlkYXRlIjsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpbnQzMl90IHN0YXR1cyA9IGZzdGF0KGZkLCAmYnVmKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgZXh0cmFjdG9yIjsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIEFTU0VSVF9HVChmaWxlU2l6ZSwgMCkgPDwgIlNpemUgb2YgaW5wdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdG8gZXh0cmFjdG9yIGNhbm5vdCBiZSB6ZXJvIjsKKyAgICBBTE9HVigiU2l6ZSBvZiBpbnB1dCBmaWxlIHRvIGV4dHJhY3RvcjogJXp1IiwgZmlsZVNpemUpOworCisgICAgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChleHRyYWN0b3IsIGZkLCAwLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSBmb3IgZXh0cmFjdG9yIjsKKworICAgIHRyYWNrQ291bnQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChleHRyYWN0b3IpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgdHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciA6ICVkIiwgdHJhY2tDb3VudCk7Cit9CisKKy8vIFZhbGlkYXRlIHJlY29kZXIncyBvdXRwdXQgdXNpbmcgZXh0cmFjdG9yCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0Ojp2YWxpZGF0ZU91dHB1dCgpIHsKKyAgICBpbnQzMl90IHRyYWNrQ291bnQgPSAtMTsKKyAgICBBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgICBBU1NFUlRfTkUoZXh0cmFjdG9yLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBleHRyYWN0b3IiOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldHVwRXh0cmFjdG9yKGV4dHJhY3RvciwgdHJhY2tDb3VudCkpOworICAgIEFTU0VSVF9FUSh0cmFja0NvdW50LCAxKSA8PCAiRXhwZWN0ZWQgMSB0cmFjaywgc2F3ICIgPDwgdHJhY2tDb3VudDsKKworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCB0cmFja0NvdW50OyBpZHgrKykgeworICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2soZXh0cmFjdG9yLCBpZHgpOworICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChleHRyYWN0b3IsIGlkeCk7CisgICAgICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJUcmFjayBmb3JtYXQgaXMgTlVMTCI7CisgICAgICAgIEFMT0dJKCJUcmFjayBmb3JtYXQgPSAlcyIsIEFNZWRpYUZvcm1hdF90b1N0cmluZyhmb3JtYXQpKTsKKworICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvblVzOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmY2xpcER1cmF0aW9uVXMpOworICAgICAgICBpbnQzMl90IGRpZmYgPSBhYnMoKG1FeHBlY3RlZER1cmF0aW9uSW5NcyAqIDEwMDApIC0gY2xpcER1cmF0aW9uVXMpOworICAgICAgICBBU1NFUlRfTEUoZGlmZiwga1RvbGVyYW5jZVZhbHVlSW5VcykKKyAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgZHVyYXRpb246ICIgPDwgKG1FeHBlY3RlZER1cmF0aW9uSW5NcyAqIDEwMDApCisgICAgICAgICAgICAgICAgPDwgIiBBY3R1YWwgZHVyYXRpb246ICIgPDwgY2xpcER1cmF0aW9uVXMgPDwgIiBEaWZmZXJlbmNlOiAiIDw8IGRpZmYKKyAgICAgICAgICAgICAgICA8PCAiIERpZmZlcmVuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgbGVzcyB0aGFuIHRvbGVyYW5jZSB2YWx1ZTogIiA8PCBrVG9sZXJhbmNlVmFsdWVJblVzOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBudWxscHRyOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgICAgIEFTU0VSVF9ORShtaW1lLCBudWxscHRyKSA8PCAiVHJhY2sgbWltZSBpcyBOVUxMIjsKKyAgICAgICAgQUxPR0koIlRyYWNrIG1pbWUgPSAlcyIsIG1pbWUpOworCisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBiaXRSYXRlOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZjaGFubmVsQ291bnQpOworICAgICAgICBBTE9HSSgiQ2hhbm5lbCBjb3VudCByZXBvcnRlZCBieSBleHRyYWN0b3I6ICVkIiwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpOworICAgICAgICBBTE9HSSgiU2FtcGxlIFJhdGUgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yOiAlZCIsIHNhbXBsZVJhdGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmYml0UmF0ZSk7CisgICAgICAgIEFMT0dJKCJCaXQgUmF0ZSByZXBvcnRlZCBieSBleHRyYWN0b3I6ICVkIiwgYml0UmF0ZSk7CisgICAgfQorfQorCitURVNUX0YoU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QsIFJlY29yZGluZ0F1ZGlvU2FuaXR5VGVzdCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQoT1VUUFVUX0ZPUk1BVF9ERUZBVUxULCBBVURJT19FTkNPREVSX0RFRkFVTFQpKTsKKworICAgIGludDMyX3QgbWF4QW1wbGl0dWRlID0gLTE7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5nZXRNYXhBbXBsaXR1ZGUoJm1heEFtcGxpdHVkZSk7CisgICAgQVNTRVJUX0VRKG1heEFtcGxpdHVkZSwgMCkgPDwgIkludmFsaWQgdmFsdWUgb2YgbWF4IGFtcGxpdHVkZSI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWNvcmRNZWRpYSgpKTsKKworICAgIC8vIFZlcmlmeSBnZXRNZXRyaWNzKCkgYmVoYXZpb3IKKyAgICBQYXJjZWwgcGFyY2VsOworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+Z2V0TWV0cmljcygmcGFyY2VsKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIHBhcmNlbCBmcm9tIGdldE1ldHJpY3MiOworICAgIEFMT0dWKCJTaXplIG9mIHRoZSBQYXJjZWwgcmV0dXJuZWQgYnkgZ2V0TWV0cmljczogJXp1IiwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgIEFTU0VSVF9HVChwYXJjZWwuZGF0YVNpemUoKSwgMCkgPDwgIlBhcmNlbCBzaXplIHJlcG9ydHMgZW1wdHkgcmVjb3JkIjsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh2YWxpZGF0ZU91dHB1dCgpKTsKKyAgICBpZiAoa0RlYnVnKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGR1bXBJbmZvKCkpOworICAgIH0KK30KKworVEVTVF9QKFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LCBNdWx0aUZvcm1hdEF1ZGlvUmVjb3JkVGVzdCkgeworICAgIG91dHB1dF9mb3JtYXQgb3V0cHV0Rm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBhdWRpb19lbmNvZGVyIGF1ZGlvRW5jb2RlciA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQob3V0cHV0Rm9ybWF0LCBhdWRpb0VuY29kZXIpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWNvcmRNZWRpYSgpKTsKKyAgICAvLyBUT0RPKGIvMTYxNjg3NzYxKQorICAgIC8vIFNraXAgZm9yIEFNUi1OQi9XQiBvdXRwdXQgZm9ybWF0CisgICAgaWYgKCEob3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8IG91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQikpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodmFsaWRhdGVPdXRwdXQoKSk7CisgICAgfQorICAgIGlmIChrRGVidWcpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZHVtcEluZm8oKSk7CisgICAgfQorfQorCitURVNUX0YoU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QsIEdldEFjdGl2ZU1pY3JvcGhvbmVzVGVzdCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgc2V0QXVkaW9SZWNvcmRlckZvcm1hdChPVVRQVVRfRk9STUFUX0RFRkFVTFQsIEFVRElPX0VOQ09ERVJfREVGQVVMVCwgQVVESU9fU09VUkNFX01JQykpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5pbml0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJJbml0IGZhaWxlZCBmb3Igc3RhZ2VmcmlnaHQgcmVjb3JkZXIiOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5wcmVwYXJlKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gcHJlYXByZSB0aGUgcmVvcmRlciI7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHJlY29yZGVyIjsKKworICAgIC8vIFJlY29yZCBtZWRpYSBmb3IgNCBzZWNzCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGtDbGlwRHVyYXRpb25JblNlYykpOworCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBhY3RpdmVNaWNyb3Bob25lc3t9OworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+Z2V0QWN0aXZlTWljcm9waG9uZXMoJmFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBnZXQgQWN0aXZlIE1pY3JvcGhvbmVzIjsKKyAgICBBU1NFUlRfR1QoYWN0aXZlTWljcm9waG9uZXMuc2l6ZSgpLCAwKSA8PCAiTm8gYWN0aXZlIG1pY3JvcGhvbmVzIGFyZSBmb3VuZCI7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSByZWNvcmRlciI7CisgICAgaWYgKGtEZWJ1ZykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkdW1wSW5mbygpKTsKKyAgICB9Cit9CisKK1RFU1RfRihTdGFnZWZyaWdodFJlY29yZGVyVGVzdCwgTXVsdGlTdGFydFBhdXNlVGVzdCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQoT1VUUFVUX0ZPUk1BVF9ERUZBVUxULCBBVURJT19FTkNPREVSX0RFRkFVTFQpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWNvcmRNZWRpYSh0cnVlLCBrTWF4TG9vcENvdW50LCBrTWF4TG9vcENvdW50KSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodmFsaWRhdGVPdXRwdXQoKSk7CisgICAgaWYgKGtEZWJ1ZykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkdW1wSW5mbygpKTsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3RBbGwsIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhzdGQ6Om1ha2VfcGFpcihPVVRQVVRfRk9STUFUX0FNUl9OQiwgQVVESU9fRU5DT0RFUl9BTVJfTkIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihPVVRQVVRfRk9STUFUX0FNUl9XQiwgQVVESU9fRU5DT0RFUl9BTVJfV0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihPVVRQVVRfRk9STUFUX0FBQ19BRFRTLCBBVURJT19FTkNPREVSX0FBQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKE9VVFBVVF9GT1JNQVRfT0dHLCBBVURJT19FTkNPREVSX09QVVMpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvLmNsYW5nLWZvcm1hdCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvLmNsYW5nLWZvcm1hdAppbmRleCAzMTk4ZDAwLi5mMjNiODQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nLy5jbGFuZy1mb3JtYXQKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy8uY2xhbmctZm9ybWF0CkBAIC0yNiw0ICsyNiwyNiBAQAogRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKIEluZGVudFdpZHRoOiA0CiBQb2ludGVyQWxpZ25tZW50OiBMZWZ0Ci1UYWJXaWR0aDogNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1RhYldpZHRoOiA0CisKKyMgRGV2aWF0aW9ucyBmcm9tIHRoZSBhYm92ZSBmaWxlOgorIyAiRG9uJ3QgaW5kZW50IHRoZSBzZWN0aW9uIGxhYmVsIgorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC00CisjICJFYWNoIGxpbmUgb2YgdGV4dCBpbiB5b3VyIGNvZGUgc2hvdWxkIGJlIGF0IG1vc3QgMTAwIGNvbHVtbnMgbG9uZy4iCitDb2x1bW5MaW1pdDogMTAwCisjICJDb25zdHJ1Y3RvciBpbml0aWFsaXplciBsaXN0cyBjYW4gYmUgYWxsIG9uIG9uZSBsaW5lIG9yIHdpdGggc3Vic2VxdWVudAorIyBsaW5lcyBpbmRlbnRlZCBlaWdodCBzcGFjZXMuIi4gY2xhbmctZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgaGF2aW5nIHRoZSBjb2xvbgorIyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLCBzbyB0aGlzIGlzIHRoZSBiZXN0CisjIGFwcHJveGltYXRpb24gb2YgdGhhdCBydWxlLCB3aGljaCBtYWtlcyBhbGwgZW50cmllcyBpbiB0aGUgbGlzdCAoZXhjZXB0IHRoZQorIyBmaXJzdCBvbmUpIGhhdmUgYW4gZWlnaHQgc3BhY2UgaW5kZW50YXRpb24uCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDYKKyMgVGhlcmUgaXMgbm90aGluZyBpbiBnby9kcm9pZGNwcHN0eWxlIGFib3V0IGNhc2UgbGFiZWxzLCBidXQgdGhlcmUgc2VlbXMgdG8gYmUKKyMgbW9yZSBjb2RlIHRoYXQgZG9lcyBub3QgaW5kZW50IHRoZSBjYXNlIGxhYmVscyBpbiBmcmFtZXdvcmtzL2Jhc2UuCitJbmRlbnRDYXNlTGFiZWxzOiBmYWxzZQorIyBUaGVyZSBoYXZlIGJlZW4gc29tZSBidWdzIGluIHdoaWNoIHN1YnNlcXVlbnQgZm9ybWF0dGluZyBvcGVyYXRpb25zIGludHJvZHVjZQorIyB3ZWlyZCBjb21tZW50IGp1bXBzLgorUmVmbG93Q29tbWVudHM6IGZhbHNlCisjIEFuZHJvaWQgc3VwcG9ydHMgQysrMTcgbm93LCBidXQgaXQgc2VlbXMgb25seSBDcHAxMSB3aWxsIHdvcmsgbm93LgorIyAiQ3BwMTEgaXMgYSBkZXByZWNhdGVkIGFsaWFzIGZvciBMYXRlc3QiIGFjY29yZGluZyB0bworIyBodHRwczovL2NsYW5nLmxsdm0ub3JnL2RvY3MvQ2xhbmdGb3JtYXRTdHlsZU9wdGlvbnMuaHRtbAorU3RhbmRhcmQ6IENwcDExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKaW5kZXggZjk0OGJkOC4uNzM1YWZjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icApAQCAtMTQsNDggKzE0LDc5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJsaWJtZWRpYXRyYW5zY29kaW5nX2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nRXJyb3JDb2RlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblN0YXRzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1ZpZGVvQ29kZWNUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVzdWx0UGFyY2VsLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVGVzdENvbmZpZy5haWRsIiwKKyAgICBdLAorICAgIHBhdGg6ICJhaWRsIiwKK30KKwogLy8gQUlETCBpbnRlcmZhY2VzIG9mIE1lZGlhVHJhbnNjb2RpbmcuCiBhaWRsX2ludGVyZmFjZSB7CiAgICAgbmFtZTogIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UiLAogICAgIHVuc3RhYmxlOiB0cnVlLAogICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCi0gICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVRyYW5zY29kaW5nU2VydmljZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nRXJyb3JDb2RlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nSm9iUHJpb3JpdHkuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdUeXBlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVmlkZW9Db2RlY1R5cGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdKb2JQYXJjZWwuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVzdWx0UGFyY2VsLmFpZGwiLAotICAgIF0sCisgICAgc3JjczogWyI6bGlibWVkaWF0cmFuc2NvZGluZ19haWRsIl0sCisgICAgYmFja2VuZDoKKyAgICB7CisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYXRyYW5zY29kaW5nIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIlRyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5jcHAiCisgICAgICAgICJUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuY3BwIiwKKyAgICAgICAgIlRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIuY3BwIiwKKyAgICAgICAgIlRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kuY3BwIiwKKyAgICAgICAgIlRyYW5zY29kaW5nVWlkUG9saWN5LmNwcCIsCisgICAgICAgICJUcmFuc2NvZGVyV3JhcHBlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYW5kcm9pZCIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWF0cmFuc2NvZGVyIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCiAgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZm9ybWF0IiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVd0aHJlYWQtc2FmZXR5IiwKKyAgICAgICAgIi1XdW51c2VkIiwKKyAgICAgICAgIi1XdW5yZWFjaGFibGUtY29kZSIsCiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL09XTkVSUyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvT1dORVJTCmluZGV4IDAyMjg3Y2IuLmIwOGQ1NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvT1dORVJTCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvT1dORVJTCkBAIC0xLDMgKzEsNSBAQAotYWtlcnN0ZW5AZ29vZ2xlLmNvbQorY2h6QGdvb2dsZS5jb20KK2dva3Jpc2huYW5AZ29vZ2xlLmNvbQogaGt1YW5nQGdvb2dsZS5jb20KIGxuaWxzc29uQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhOWRiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMzIgQEAKK3sKKyAgICAicHJlc3VibWl0IjogWworICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJNZWRpYVNhbXBsZVF1ZXVlVGVzdHMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIk1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIk1lZGlhU2FtcGxlV3JpdGVyVGVzdHMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIk1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIk1lZGlhVHJhbnNjb2RlclRlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJfdGVzdHMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIlRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJfdGVzdHMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIlZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMiCisgICAgICAgIH0KKyAgICBdCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RlcldyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGVyV3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4NjE4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RlcldyYXBwZXIuY3BwCkBAIC0wLDAgKzEsNTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUcmFuc2NvZGVyV3JhcHBlciIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0Vycm9yQ29kZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtDb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGVyV3JhcHBlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7Cit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nRXJyb3JDb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdWaWRlb0NvZGVjVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdDsKKworc3RhdGljIFRyYW5zY29kaW5nRXJyb3JDb2RlIHRvVHJhbnNjb2RpbmdFcnJvcihtZWRpYV9zdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgQU1FRElBX09LOgorICAgICAgICByZXR1cm4gVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtOb0Vycm9yOworICAgIGNhc2UgQU1FRElBQ09ERUNfRVJST1JfSU5TVUZGSUNJRU5UX1JFU09VUkNFOiAgLy8gRkFMTFRIUlUKKyAgICBjYXNlIEFNRURJQUNPREVDX0VSUk9SX1JFQ0xBSU1FRDoKKyAgICAgICAgcmV0dXJuIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprSW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgIGNhc2UgQU1FRElBX0VSUk9SX01BTEZPUk1FRDoKKyAgICAgICAgcmV0dXJuIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprTWFsZm9ybWVkOworICAgIGNhc2UgQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOgorICAgICAgICByZXR1cm4gVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbnN1cHBvcnRlZDsKKyAgICBjYXNlIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDogIC8vIEZBTExUSFJVCisgICAgY2FzZSBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI6CisgICAgICAgIHJldHVybiBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a0ludmFsaWRQYXJhbWV0ZXI7CisgICAgY2FzZSBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgIHJldHVybiBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a0ludmFsaWRPcGVyYXRpb247CisgICAgY2FzZSBBTUVESUFfRVJST1JfSU86CisgICAgICAgIHJldHVybiBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a0Vycm9ySU87CisgICAgY2FzZSBBTUVESUFfRVJST1JfVU5LTk9XTjogIC8vIEZBTExUSFJVCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bjsKKyAgICB9Cit9CisKK3N0YXRpYyBBTWVkaWFGb3JtYXQqIGdldFZpZGVvRm9ybWF0KAorICAgICAgICBjb25zdCBjaGFyKiBvcmlnaW5hbE1pbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8VHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0PiYgcmVxdWVzdGVkRm9ybWF0KSB7CisgICAgaWYgKHJlcXVlc3RlZEZvcm1hdCA9PSBzdGQ6Om51bGxvcHQpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKHJlcXVlc3RlZEZvcm1hdC0+Y29kZWNUeXBlID09IFRyYW5zY29kaW5nVmlkZW9Db2RlY1R5cGU6OmtIZXZjICYmCisgICAgICAgIHN0cmNtcChvcmlnaW5hbE1pbWUsIEFNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBBTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAocmVxdWVzdGVkRm9ybWF0LT5jb2RlY1R5cGUgPT0gVHJhbnNjb2RpbmdWaWRlb0NvZGVjVHlwZTo6a0F2YyAmJgorICAgICAgICAgICAgICAgc3RyY21wKG9yaWdpbmFsTWltZSwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICBpZiAocmVxdWVzdGVkRm9ybWF0LT5iaXRyYXRlQnBzID4gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCByZXF1ZXN0ZWRGb3JtYXQtPmJpdHJhdGVCcHMpOworICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgLy8gVE9ETzogdHJhbnNsYXRlIG90aGVyIGZpZWxkcyBmcm9tIHJlcXVlc3RlZEZvcm1hdCB0byB0aGUgZm9ybWF0IGZvciBNZWRpYVRyYW5zY29kZXIuCisgICAgLy8gQWxzbyBuZWVkIHRvIGRldGVybWluZSBtb3JlIHNldHRpbmdzIHRvIGV4cG9zZSBpbiBUcmFuc2NvZGluZ1ZpZGVvVHJhY2tGb3JtYXQuCisgICAgaWYgKCFjaGFuZ2VkKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKKyAgICAgICAgLy8gVXNlIG51bGwgZm9ybWF0IGZvciBwYXNzdGhydS4KKyAgICAgICAgZm9ybWF0ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworLy9zdGF0aWMKK3N0ZDo6c3RyaW5nIFRyYW5zY29kZXJXcmFwcGVyOjp0b1N0cmluZyhjb25zdCBFdmVudCYgZXZlbnQpIHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlU3RyOworICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgeworICAgIGNhc2UgRXZlbnQ6OlN0YXJ0OgorICAgICAgICB0eXBlU3RyID0gIlN0YXJ0IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdmVudDo6UGF1c2U6CisgICAgICAgIHR5cGVTdHIgPSAiUGF1c2UiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEV2ZW50OjpSZXN1bWU6CisgICAgICAgIHR5cGVTdHIgPSAiUmVzdW1lIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdmVudDo6U3RvcDoKKyAgICAgICAgdHlwZVN0ciA9ICJTdG9wIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdmVudDo6RmluaXNoOgorICAgICAgICB0eXBlU3RyID0gIkZpbmlzaCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZlbnQ6OkVycm9yOgorICAgICAgICB0eXBlU3RyID0gIkVycm9yIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdmVudDo6UHJvZ3Jlc3M6CisgICAgICAgIHR5cGVTdHIgPSAiUHJvZ3Jlc3MiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIih1bmtub3duKSI7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICByZXN1bHQgPSAic2Vzc2lvbiB7IiArIHN0ZDo6dG9fc3RyaW5nKGV2ZW50LmNsaWVudElkKSArICIsIiArIHN0ZDo6dG9fc3RyaW5nKGV2ZW50LnNlc3Npb25JZCkgKworICAgICAgICAgICAgICJ9OiAiICsgdHlwZVN0cjsKKyAgICBpZiAoZXZlbnQudHlwZSA9PSBFdmVudDo6RXJyb3IgfHwgZXZlbnQudHlwZSA9PSBFdmVudDo6UHJvZ3Jlc3MpIHsKKyAgICAgICAgcmVzdWx0ICs9ICIgIiArIHN0ZDo6dG9fc3RyaW5nKGV2ZW50LmFyZyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2NsYXNzIFRyYW5zY29kZXJXcmFwcGVyOjpDYWxsYmFja0ltcGwgOiBwdWJsaWMgTWVkaWFUcmFuc2NvZGVyOjpDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgQ2FsbGJhY2tJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVyV3JhcHBlcj4mIG93bmVyLCBDbGllbnRJZFR5cGUgY2xpZW50SWQsCisgICAgICAgICAgICAgICAgIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKQorICAgICAgICAgIDogbU93bmVyKG93bmVyKSwgbUNsaWVudElkKGNsaWVudElkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GaW5pc2hlZChjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBvd25lciA9IG1Pd25lci5sb2NrKCk7CisgICAgICAgIGlmIChvd25lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBvd25lci0+b25GaW5pc2gobUNsaWVudElkLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKGNvbnN0IE1lZGlhVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnJvcikgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIG93bmVyID0gbU93bmVyLmxvY2soKTsKKyAgICAgICAgaWYgKG93bmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG93bmVyLT5vbkVycm9yKG1DbGllbnRJZCwgbVNlc3Npb25JZCwgZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uUHJvZ3Jlc3NVcGRhdGUoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBvd25lciA9IG1Pd25lci5sb2NrKCk7CisgICAgICAgIGlmIChvd25lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBvd25lci0+b25Qcm9ncmVzcyhtQ2xpZW50SWQsIG1TZXNzaW9uSWQsIHByb2dyZXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkNvZGVjUmVzb3VyY2VMb3N0KGNvbnN0IE1lZGlhVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bmRrOjpTY29wZWRBUGFyY2VsPiYgcGF1c2VkU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dWKCIlczogc2Vzc2lvbiB7JWxsZCwgJWR9IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW1DbGllbnRJZCwgbVNlc3Npb25JZCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6d2Vha19wdHI8VHJhbnNjb2RlcldyYXBwZXI+IG1Pd25lcjsKKyAgICBDbGllbnRJZFR5cGUgbUNsaWVudElkOworICAgIFNlc3Npb25JZFR5cGUgbVNlc3Npb25JZDsKK307CisKK1RyYW5zY29kZXJXcmFwcGVyOjpUcmFuc2NvZGVyV3JhcHBlcigpIDogbUN1cnJlbnRDbGllbnRJZCgwKSwgbUN1cnJlbnRTZXNzaW9uSWQoLTEpIHsKKyAgICBzdGQ6OnRocmVhZCgmVHJhbnNjb2RlcldyYXBwZXI6OnRocmVhZExvb3AsIHRoaXMpLmRldGFjaCgpOworfQorCit2b2lkIFRyYW5zY29kZXJXcmFwcGVyOjpzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpIHsKKyAgICBtQ2FsbGJhY2sgPSBjYjsKK30KKworc3RhdGljIGJvb2wgaXNSZXNvdXJjZUVycm9yKG1lZGlhX3N0YXR1c190IGVycikgeworICAgIHJldHVybiBlcnIgPT0gQU1FRElBQ09ERUNfRVJST1JfUkVDTEFJTUVEIHx8IGVyciA9PSBBTUVESUFDT0RFQ19FUlJPUl9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0U7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6OnJlcG9ydEVycm9yKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIpIHsKKyAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoaXNSZXNvdXJjZUVycm9yKGVycikpIHsKKyAgICAgICAgICAgIC8vIEFkZCBhIHBsYWNlaG9sZGVyIHBhdXNlIHN0YXRlIHRvIG1QYXVzZWRTdGF0ZU1hcC4gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHJlc3VtaW5nLgorICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgd2hlbiB0cmFuc2NvZGVyIHBhdXNlL3Jlc3VtZSBsb2dpYyBpcyByZWFkeS4gTmV3IGxvZ2ljIHdpbGwKKyAgICAgICAgICAgIC8vIG5vIGxvbmdlciB1c2UgdGhlIHBhdXNlIHN0YXRlcy4KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtUGF1c2VkU3RhdGVNYXAuZmluZChTZXNzaW9uS2V5VHlwZShjbGllbnRJZCwgc2Vzc2lvbklkKSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gbVBhdXNlZFN0YXRlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbVBhdXNlZFN0YXRlTWFwLmVtcGxhY2UoU2Vzc2lvbktleVR5cGUoY2xpZW50SWQsIHNlc3Npb25JZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG5kazo6U2NvcGVkQVBhcmNlbCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FsbGJhY2stPm9uUmVzb3VyY2VMb3N0KGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoY2xpZW50SWQsIHNlc3Npb25JZCwgdG9UcmFuc2NvZGluZ0Vycm9yKGVycikpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRyYW5zY29kZXJXcmFwcGVyOjpzdGFydChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2IpIHsKKyAgICBxdWV1ZUV2ZW50KEV2ZW50OjpTdGFydCwgY2xpZW50SWQsIHNlc3Npb25JZCwgWz1dIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gaGFuZGxlU3RhcnQoY2xpZW50SWQsIHNlc3Npb25JZCwgcmVxdWVzdCwgY2xpZW50Q2IpOworCisgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICByZXBvcnRFcnJvcihjbGllbnRJZCwgc2Vzc2lvbklkLCBlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXV0byBjYWxsYmFjayA9IG1DYWxsYmFjay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vblN0YXJ0ZWQoY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBUcmFuc2NvZGVyV3JhcHBlcjo6cGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlBhdXNlLCBjbGllbnRJZCwgc2Vzc2lvbklkLCBbPV0geworICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBoYW5kbGVQYXVzZShjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBjbGVhbnVwKCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKGNsaWVudElkLCBzZXNzaW9uSWQsIGVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uUGF1c2VkKGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6OnJlc3VtZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYikgeworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlJlc3VtZSwgY2xpZW50SWQsIHNlc3Npb25JZCwgWz1dIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gaGFuZGxlUmVzdW1lKGNsaWVudElkLCBzZXNzaW9uSWQsIHJlcXVlc3QsIGNsaWVudENiKTsKKworICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgY2xlYW51cCgpOworICAgICAgICAgICAgcmVwb3J0RXJyb3IoY2xpZW50SWQsIHNlc3Npb25JZCwgZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25SZXN1bWVkKGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6OnN0b3AoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlN0b3AsIGNsaWVudElkLCBzZXNzaW9uSWQsIFs9XSB7CisgICAgICAgIGlmIChtVHJhbnNjb2RlciAhPSBudWxscHRyICYmIGNsaWVudElkID09IG1DdXJyZW50Q2xpZW50SWQgJiYKKyAgICAgICAgICAgIHNlc3Npb25JZCA9PSBtQ3VycmVudFNlc3Npb25JZCkgeworICAgICAgICAgICAgLy8gQ2FuY2VsbGluZyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc2Vzc2lvbi4KKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1UcmFuc2NvZGVyLT5jYW5jZWwoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBzdG9wIHRyYW5zY29kZXI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koInRyYW5zY29kZXIgc3RvcHBlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xlYW51cCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRm9yIHNlc3Npb25zIHRoYXQncyBub3QgY3VycmVudGx5IHJ1bm5pbmcsIHJlbGVhc2UgYW55IHBhdXNlZFN0YXRlIGZvciB0aGUgc2Vzc2lvbi4KKyAgICAgICAgICAgIG1QYXVzZWRTdGF0ZU1hcC5lcmFzZShTZXNzaW9uS2V5VHlwZShjbGllbnRJZCwgc2Vzc2lvbklkKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gY2FsbGJhY2sgbmVlZGVkIGZvciBzdG9wLgorICAgIH0pOworfQorCit2b2lkIFRyYW5zY29kZXJXcmFwcGVyOjpvbkZpbmlzaChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSB7CisgICAgcXVldWVFdmVudChFdmVudDo6RmluaXNoLCBjbGllbnRJZCwgc2Vzc2lvbklkLCBbPV0geworICAgICAgICBpZiAobVRyYW5zY29kZXIgIT0gbnVsbHB0ciAmJiBjbGllbnRJZCA9PSBtQ3VycmVudENsaWVudElkICYmCisgICAgICAgICAgICBzZXNzaW9uSWQgPT0gbUN1cnJlbnRTZXNzaW9uSWQpIHsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uRmluaXNoKGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6Om9uRXJyb3IoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyb3IpIHsKKyAgICBxdWV1ZUV2ZW50KAorICAgICAgICAgICAgRXZlbnQ6OkVycm9yLCBjbGllbnRJZCwgc2Vzc2lvbklkLAorICAgICAgICAgICAgWz1dIHsKKyAgICAgICAgICAgICAgICBpZiAobVRyYW5zY29kZXIgIT0gbnVsbHB0ciAmJiBjbGllbnRJZCA9PSBtQ3VycmVudENsaWVudElkICYmCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9PSBtQ3VycmVudFNlc3Npb25JZCkgeworICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKGNsaWVudElkLCBzZXNzaW9uSWQsIGVycm9yKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBlcnJvcik7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6Om9uUHJvZ3Jlc3MoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcm9ncmVzcykgeworICAgIHF1ZXVlRXZlbnQoCisgICAgICAgICAgICBFdmVudDo6UHJvZ3Jlc3MsIGNsaWVudElkLCBzZXNzaW9uSWQsCisgICAgICAgICAgICBbPV0geworICAgICAgICAgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vblByb2dyZXNzVXBkYXRlKGNsaWVudElkLCBzZXNzaW9uSWQsIHByb2dyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgcHJvZ3Jlc3MpOworfQorCittZWRpYV9zdGF0dXNfdCBUcmFuc2NvZGVyV3JhcHBlcjo6c2V0dXBUcmFuc2NvZGVyKAorICAgICAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNsaWVudENiLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bmRrOjpTY29wZWRBUGFyY2VsPiYgcGF1c2VkU3RhdGUpIHsKKyAgICBpZiAoY2xpZW50Q2IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiY2xpZW50IGNhbGxiYWNrIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAobVRyYW5zY29kZXIgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgidHJhbnNjb2RlciBhbHJlYWR5IHJ1bm5pbmciKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciBzcmNGZCwgZHN0RmQ7CisgICAgc3RhdHVzID0gY2xpZW50Q2ItPm9wZW5GaWxlRGVzY3JpcHRvcihyZXF1ZXN0LnNvdXJjZUZpbGVQYXRoLCAiciIsICZzcmNGZCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpIHx8IHNyY0ZkLmdldCgpIDwgMCkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIG9wZW4gc291cmNlIik7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgfQorCisgICAgLy8gT3BlbiBkZXN0IGZpbGUgd2l0aCAicnciLCBhcyB0aGUgdHJhbnNjb2RlciBjb3VsZCBwb3RlbnRpYWxseSByZXVzZSBwYXJ0IG9mIGl0CisgICAgLy8gZm9yIHJlc3VtZSBjYXNlLiBXZSBtaWdodCB3YW50IHRoZSBmdXJ0aGVyIGRpZmZlcmVudGlhdGUgYW5kIG9wZW4gd2l0aCAidyIgb25seQorICAgIC8vIGZvciBzdGFydC4KKyAgICBzdGF0dXMgPSBjbGllbnRDYi0+b3BlbkZpbGVEZXNjcmlwdG9yKHJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aCwgInJ3IiwgJmRzdEZkKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkgfHwgZHN0RmQuZ2V0KCkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gb3BlbiBkZXN0aW5hdGlvbiIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgIH0KKworICAgIG1DdXJyZW50Q2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICBtQ3VycmVudFNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBtVHJhbnNjb2RlckNiID0gc3RkOjptYWtlX3NoYXJlZDxDYWxsYmFja0ltcGw+KHNoYXJlZF9mcm9tX3RoaXMoKSwgY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgbVRyYW5zY29kZXIgPSBNZWRpYVRyYW5zY29kZXI6OmNyZWF0ZShtVHJhbnNjb2RlckNiLCByZXF1ZXN0LmNsaWVudFBpZCwgcmVxdWVzdC5jbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXVzZWRTdGF0ZSk7CisgICAgaWYgKG1UcmFuc2NvZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjcmVhdGUgdHJhbnNjb2RlciIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gbVRyYW5zY29kZXItPmNvbmZpZ3VyZVNvdXJjZShzcmNGZC5nZXQoKSk7CisgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjb25maWd1cmUgc291cmNlOiAlZCIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4+IHRyYWNrRm9ybWF0cyA9IG1UcmFuc2NvZGVyLT5nZXRUcmFja0Zvcm1hdHMoKTsKKyAgICBpZiAodHJhY2tGb3JtYXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2V0IHRyYWNrIGZvcm1hdHMhIik7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tGb3JtYXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdCogZm9ybWF0ID0gbnVsbHB0cjsKKyAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXRzW2ldLmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKworICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBnZXRWaWRlb0Zvcm1hdChtaW1lLCByZXF1ZXN0LnJlcXVlc3RlZFZpZGVvVHJhY2tGb3JtYXQpOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gbVRyYW5zY29kZXItPmNvbmZpZ3VyZVRyYWNrRm9ybWF0KGksIGZvcm1hdCk7CisgICAgICAgIGlmIChmb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNvbmZpZ3VyZSB0cmFjayBmb3JtYXQgZm9yIHRyYWNrICVkOiAlZCIsIGksIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyID0gbVRyYW5zY29kZXItPmNvbmZpZ3VyZURlc3RpbmF0aW9uKGRzdEZkLmdldCgpKTsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNvbmZpZ3VyZSBkZXN0OiAlZCIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgVHJhbnNjb2RlcldyYXBwZXI6OmhhbmRsZVN0YXJ0KAorICAgICAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNsaWVudENiKSB7CisgICAgQUxPR0koIiVzOiBzZXR0aW5nIHVwIHRyYW5zY29kZXIgZm9yIHN0YXJ0IiwgX19GVU5DVElPTl9fKTsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBzZXR1cFRyYW5zY29kZXIoY2xpZW50SWQsIHNlc3Npb25JZCwgcmVxdWVzdCwgY2xpZW50Q2IpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFMT0dJKCIlczogZmFpbGVkIHRvIHNldHVwIHRyYW5zY29kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG1UcmFuc2NvZGVyLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHN0YXJ0IHRyYW5zY29kZXI6ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIEFMT0dJKCIlczogdHJhbnNjb2RlciBzdGFydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBUcmFuc2NvZGVyV3JhcHBlcjo6aGFuZGxlUGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIGlmIChtVHJhbnNjb2RlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogdHJhbnNjb2RlciBpcyBub3QgcnVubmluZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGNsaWVudElkICE9IG1DdXJyZW50Q2xpZW50SWQgfHwgc2Vzc2lvbklkICE9IG1DdXJyZW50U2Vzc2lvbklkKSB7CisgICAgICAgIEFMT0dXKCIlczogc3RvcHBpbmcgc2Vzc2lvbiB7JWxsZCwgJWR9IHRoYXQncyBub3QgY3VycmVudCBzZXNzaW9uIHslbGxkLCAlZH0iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIChsb25nIGxvbmcpY2xpZW50SWQsIHNlc3Npb25JZCwgKGxvbmcgbG9uZyltQ3VycmVudENsaWVudElkLCBtQ3VycmVudFNlc3Npb25JZCk7CisgICAgfQorCisgICAgQUxPR0koIiVzOiBwYXVzaW5nIHRyYW5zY29kZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICAgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4gcGF1c2VTdGF0ZXM7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gbVRyYW5zY29kZXItPnBhdXNlKCZwYXVzZVN0YXRlcyk7CisgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcGF1c2UgdHJhbnNjb2RlcjogJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1QYXVzZWRTdGF0ZU1hcFtTZXNzaW9uS2V5VHlwZShjbGllbnRJZCwgc2Vzc2lvbklkKV0gPSBwYXVzZVN0YXRlczsKKworICAgIEFMT0dJKCIlczogdHJhbnNjb2RlciBwYXVzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK21lZGlhX3N0YXR1c190IFRyYW5zY29kZXJXcmFwcGVyOjpoYW5kbGVSZXN1bWUoCisgICAgICAgIENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8bmRrOjpTY29wZWRBUGFyY2VsPiBwYXVzZWRTdGF0ZTsKKyAgICBhdXRvIGl0ID0gbVBhdXNlZFN0YXRlTWFwLmZpbmQoU2Vzc2lvbktleVR5cGUoY2xpZW50SWQsIHNlc3Npb25JZCkpOworICAgIGlmIChpdCAhPSBtUGF1c2VkU3RhdGVNYXAuZW5kKCkpIHsKKyAgICAgICAgcGF1c2VkU3RhdGUgPSBpdC0+c2Vjb25kOworICAgICAgICBtUGF1c2VkU3RhdGVNYXAuZXJhc2UoaXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogY2FuJ3QgZmluZCBwYXVzZWQgc3RhdGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFMT0dJKCIlczogc2V0dGluZyB1cCB0cmFuc2NvZGVyIGZvciByZXN1bWUiLCBfX0ZVTkNUSU9OX18pOworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IHNldHVwVHJhbnNjb2RlcihjbGllbnRJZCwgc2Vzc2lvbklkLCByZXF1ZXN0LCBjbGllbnRDYiwgcGF1c2VkU3RhdGUpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHNldHVwIHRyYW5zY29kZXI6ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG1UcmFuc2NvZGVyLT5yZXN1bWUoKTsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZXN1bWUgdHJhbnNjb2RlcjogJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQUxPR0koIiVzOiB0cmFuc2NvZGVyIHJlc3VtZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6OmNsZWFudXAoKSB7CisgICAgbUN1cnJlbnRDbGllbnRJZCA9IDA7CisgICAgbUN1cnJlbnRTZXNzaW9uSWQgPSAtMTsKKyAgICBtVHJhbnNjb2RlckNiID0gbnVsbHB0cjsKKyAgICBtVHJhbnNjb2RlciA9IG51bGxwdHI7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6OnF1ZXVlRXZlbnQoRXZlbnQ6OlR5cGUgdHlwZSwgQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHJ1bm5hYmxlLCBpbnQzMl90IGFyZykgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICBtUXVldWUucHVzaF9iYWNrKHt0eXBlLCBjbGllbnRJZCwgc2Vzc2lvbklkLCBydW5uYWJsZSwgYXJnfSk7CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6OnRocmVhZExvb3AoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2Nre21Mb2NrfTsKKyAgICAvLyBUcmFuc2NvZGVyV3JhcHBlciBjdXJyZW50bHkgbGl2ZXMgaW4gdGhlIHRyYW5zY29kaW5nIHNlcnZpY2UsIGFzIGxvbmcgYXMKKyAgICAvLyBNZWRpYVRyYW5zY29kaW5nU2VydmljZSBpdHNlbGYuCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgZXZlbnQuCisgICAgICAgIHdoaWxlIChtUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KGxvY2spOworICAgICAgICB9CisKKyAgICAgICAgRXZlbnQgZXZlbnQgPSAqbVF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG1RdWV1ZS5wb3BfZnJvbnQoKTsKKworICAgICAgICBBTE9HRCgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCB0b1N0cmluZyhldmVudCkuY19zdHIoKSk7CisKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgZXZlbnQucnVubmFibGUoKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuY3BwCmluZGV4IDcyNTI0MzcuLmMwY2M4NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5jcHAKQEAgLTE3LDEyOSArMTcsMzc3IEBACiAvLyAjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIiCiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvQm5UcmFuc2NvZGluZ0NsaWVudC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9wZXJtaXNzaW9uX21hbmFnZXIuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nUmVxdWVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nVWlkUG9saWN5Lmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKENsaWVudElkVHlwZSkgPT0gc2l6ZW9mKHZvaWQqKSwgIkNsaWVudElkVHlwZSBzaG91bGQgYmUgcG9pbnRlci1zaXplZCIpOwogCi0vLyBzdGF0aWMKLVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciYgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKLSAgICBzdGF0aWMgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIGdJbnN0YW5jZXt9OwotICAgIHJldHVybiBnSW5zdGFuY2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblRyYW5zY29kaW5nQ2xpZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOyAgLy8gRm9yIHNlcnZpY2UgZXJyb3IgY29kZXMKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbDsKK3VzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgOjpuZGs6OlNwQUlCaW5kZXI7CisKKy8vc3RhdGljCitzdGQ6OmF0b21pYzxDbGllbnRJZFR5cGU+IFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6c0Nvb2tpZUNvdW50ZXIgPSAwOworLy9zdGF0aWMKK3N0ZDo6bXV0ZXggVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpzQ29va2llMkNsaWVudExvY2s7CisvL3N0YXRpYworc3RkOjptYXA8Q2xpZW50SWRUeXBlLCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsPj4KKyAgICAgICAgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpzQ29va2llMkNsaWVudDsKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29uc3RydWN0aW5nIGJpbmRlcjo6U3RhdHVzIG9iamVjdHMgZm9yIGVycm9yIHJldHVybnMKKyNkZWZpbmUgU1RBVFVTX0VSUk9SX0ZNVChlcnJvckNvZGUsIGVycm9yU3RyaW5nLCAuLi4pIFwKKyAgICBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcldpdGhNZXNzYWdlKCAgICAgIFwKKyAgICAgICAgICAgIGVycm9yQ29kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJXM6JWQ6ICIgZXJyb3JTdHJpbmcsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pKQorCisvKioKKyAqIENsaWVudEltcGwgaW1wbGVtZW50cyBhIHNpbmdsZSBjbGllbnQgYW5kIGNvbnRhaW5zIGFsbCBpdHMgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEltcGwgOiBwdWJsaWMgQm5UcmFuc2NvZGluZ0NsaWVudCB7CisgICAgLyogVGhlIHJlbW90ZSBjbGllbnQgY2FsbGJhY2sgdGhhdCB0aGlzIENsaWVudEluZm8gaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqIE9uY2UgdGhlIENsaWVudEluZm8gaXMgY3JlYXRlZCwgd2UgaG9sZCBhbiBTcEFJQmluZGVyIHNvIHRoYXQgdGhlIGJpbmRlcgorICAgICAqIG9iamVjdCBkb2Vzbid0IGdldCBjcmVhdGVkIGFnYWluLCBvdGhlcndpc2UgdGhlIGJpbmRlciBvYmplY3QgcG9pbnRlcgorICAgICAqIG1heSBub3QgYmUgdW5pcXVlLgorICAgICAqLworICAgIFNwQUlCaW5kZXIgbUNsaWVudEJpbmRlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+IG1DbGllbnRDYWxsYmFjazsKKyAgICAvKiBBIHVuaXF1ZSBpZCBhc3NpZ25lZCB0byB0aGUgY2xpZW50IGJ5IHRoZSBzZXJ2aWNlLiBUaGlzIG51bWJlciBpcyB1c2VkCisgICAgICogYnkgdGhlIHNlcnZpY2UgZm9yIGluZGV4aW5nLiBIZXJlIHdlIHVzZSB0aGUgYmluZGVyIG9iamVjdCdzIHBvaW50ZXIKKyAgICAgKiAoY2FzdGVkIHRvIGludDY0dF90KSBhcyB0aGUgY2xpZW50IGlkLgorICAgICAqLworICAgIENsaWVudElkVHlwZSBtQ2xpZW50SWQ7CisgICAgc3RkOjpzdHJpbmcgbUNsaWVudE5hbWU7CisgICAgc3RkOjpzdHJpbmcgbUNsaWVudE9wUGFja2FnZU5hbWU7CisKKyAgICAvLyBOZXh0IHNlc3Npb25JZCB0byBhc3NpZ24uCisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gbU5leHRTZXNzaW9uSWQ7CisgICAgLy8gV2hldGhlciB0aGlzIGNsaWVudCBoYXMgYmVlbiB1bnJlZ2lzdGVyZWQgYWxyZWFkeS4KKyAgICBzdGQ6OmF0b21pYzxib29sPiBtQWJhbmRvbmVkOworICAgIC8vIFdlYWsgcG9pbnRlciB0byB0aGUgY2xpZW50IG1hbmFnZXIgZm9yIHRoaXMgY2xpZW50LgorICAgIHN0ZDo6d2Vha19wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyPiBtT3duZXI7CisKKyAgICBDbGllbnRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNsaWVudE5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+JiBvd25lcik7CisKKyAgICBTdGF0dXMgc3VibWl0UmVxdWVzdChjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIC8qaW5fcmVxdWVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCogLypvdXRfc2Vzc2lvbiovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlOworCisgICAgU3RhdHVzIGNhbmNlbFNlc3Npb24oaW50MzJfdCAvKmluX3Nlc3Npb25JZCovLCBib29sKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyBnZXRTZXNzaW9uV2l0aElkKGludDMyX3QgLyppbl9zZXNzaW9uSWQqLywgVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsKiAvKm91dF9zZXNzaW9uKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgdW5yZWdpc3RlcigpIG92ZXJyaWRlOworfTsKKworVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsOjpDbGllbnRJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjYWxsYmFjaywgY29uc3Qgc3RkOjpzdHJpbmcmIGNsaWVudE5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6OndlYWtfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcj4mIG93bmVyKQorICAgICAgOiBtQ2xpZW50QmluZGVyKChjYWxsYmFjayAhPSBudWxscHRyKSA/IGNhbGxiYWNrLT5hc0JpbmRlcigpIDogbnVsbHB0ciksCisgICAgICAgIG1DbGllbnRDYWxsYmFjayhjYWxsYmFjayksCisgICAgICAgIG1DbGllbnRJZChzQ29va2llQ291bnRlci5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpLAorICAgICAgICBtQ2xpZW50TmFtZShjbGllbnROYW1lKSwKKyAgICAgICAgbUNsaWVudE9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCisgICAgICAgIG1OZXh0U2Vzc2lvbklkKDApLAorICAgICAgICBtQWJhbmRvbmVkKGZhbHNlKSwKKyAgICAgICAgbU93bmVyKG93bmVyKSB7fQorCitTdGF0dXMgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsOjpzdWJtaXRSZXF1ZXN0KAorICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIGluX3JlcXVlc3QsIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCogb3V0X3Nlc3Npb24sCisgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG93bmVyOworICAgIGlmIChtQWJhbmRvbmVkIHx8IChvd25lciA9IG1Pd25lci5sb2NrKCkpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBpZiAoaW5fcmVxdWVzdC5zb3VyY2VGaWxlUGF0aC5lbXB0eSgpIHx8IGluX3JlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludDMyX3QgY2FsbGluZ1VpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKKyAgICBpbnQzMl90IGluX2NsaWVudFVpZCA9IGluX3JlcXVlc3QuY2xpZW50VWlkOworICAgIGludDMyX3QgaW5fY2xpZW50UGlkID0gaW5fcmVxdWVzdC5jbGllbnRQaWQ7CisKKyAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkLiBPbmx5IHByaXZpbGVnZSBjYWxsZXIgY291bGQgZm9yd2FyZCB0aGUKKyAgICAvLyB1aWQgb24gYXBwIGNsaWVudCdzIGJlaGFsZi4KKyAgICBpZiAoaW5fY2xpZW50VWlkID09IElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6VVNFX0NBTExJTkdfVUlEKSB7CisgICAgICAgIGluX2NsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CisgICAgfSBlbHNlIGlmIChpbl9jbGllbnRVaWQgPCAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfSBlbHNlIGlmIChpbl9jbGllbnRVaWQgIT0gY2FsbGluZ1VpZCAmJiAhb3duZXItPmlzVHJ1c3RlZENhbGxlcihjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKSkgeworICAgICAgICBBTE9HRSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OnJlZ2lzdGVyQ2xpZW50IHJlamVjdGVkIChjbGllbnRQaWQgJWQsIGNsaWVudFVpZCAlZCkgIgorICAgICAgICAgICAgICAiKGRvbid0IHRydXN0IGNhbGxpbmdVaWQgJWQpIiwKKyAgICAgICAgICAgICAgaW5fY2xpZW50UGlkLCBpbl9jbGllbnRVaWQsIGNhbGxpbmdVaWQpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVCgKKyAgICAgICAgICAgICAgICBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX1BFUk1JU1NJT05fREVOSUVELAorICAgICAgICAgICAgICAgICJNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6cmVnaXN0ZXJDbGllbnQgcmVqZWN0ZWQgKGNsaWVudFBpZCAlZCwgY2xpZW50VWlkICVkKSAiCisgICAgICAgICAgICAgICAgIihkb24ndCB0cnVzdCBjYWxsaW5nVWlkICVkKSIsCisgICAgICAgICAgICAgICAgaW5fY2xpZW50UGlkLCBpbl9jbGllbnRVaWQsIGNhbGxpbmdVaWQpOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBjbGllbnRQaWQuIE9ubHkgcHJpdmlsZWdlIGNhbGxlciBjb3VsZCBmb3J3YXJkIHRoZQorICAgIC8vIHBpZCBvbiBhcHAgY2xpZW50J3MgYmVoYWxmLgorICAgIGlmIChpbl9jbGllbnRQaWQgPT0gSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpVU0VfQ0FMTElOR19QSUQpIHsKKyAgICAgICAgaW5fY2xpZW50UGlkID0gY2FsbGluZ1BpZDsKKyAgICB9IGVsc2UgaWYgKGluX2NsaWVudFBpZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9IGVsc2UgaWYgKGluX2NsaWVudFBpZCAhPSBjYWxsaW5nUGlkICYmICFvd25lci0+aXNUcnVzdGVkQ2FsbGVyKGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgIEFMT0dFKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6cmVnaXN0ZXJDbGllbnQgcmVqZWN0ZWQgKGNsaWVudFBpZCAlZCwgY2xpZW50VWlkICVkKSAiCisgICAgICAgICAgICAgICIoZG9uJ3QgdHJ1c3QgY2FsbGluZ1VpZCAlZCkiLAorICAgICAgICAgICAgICBpbl9jbGllbnRQaWQsIGluX2NsaWVudFVpZCwgY2FsbGluZ1VpZCk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKAorICAgICAgICAgICAgICAgIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpyZWdpc3RlckNsaWVudCByZWplY3RlZCAoY2xpZW50UGlkICVkLCBjbGllbnRVaWQgJWQpICIKKyAgICAgICAgICAgICAgICAiKGRvbid0IHRydXN0IGNhbGxpbmdVaWQgJWQpIiwKKyAgICAgICAgICAgICAgICBpbl9jbGllbnRQaWQsIGluX2NsaWVudFVpZCwgY2FsbGluZ1VpZCk7CisgICAgfQorCisgICAgaW50MzJfdCBzZXNzaW9uSWQgPSBtTmV4dFNlc3Npb25JZC5mZXRjaF9hZGQoMSk7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gb3duZXItPm1TZXNzaW9uQ29udHJvbGxlci0+c3VibWl0KG1DbGllbnRJZCwgc2Vzc2lvbklkLCBpbl9jbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9yZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2spOworCisgICAgaWYgKCpfYWlkbF9yZXR1cm4pIHsKKyAgICAgICAgb3V0X3Nlc3Npb24tPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworICAgICAgICAvLyBUT0RPKGNoeik6IGlzIHNvbWUgb2YgdGhpcyBjb21pbmcgZnJvbSBTZXNzaW9uQ29udHJvbGxlcj8KKyAgICAgICAgKihUcmFuc2NvZGluZ1JlcXVlc3QqKSZvdXRfc2Vzc2lvbi0+cmVxdWVzdCA9IGluX3JlcXVlc3Q7CisgICAgICAgIG91dF9zZXNzaW9uLT5hd2FpdE51bWJlck9mU2Vzc2lvbnMgPSAwOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEltcGw6OmNhbmNlbFNlc3Npb24oaW50MzJfdCBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG93bmVyOworICAgIGlmIChtQWJhbmRvbmVkIHx8IChvd25lciA9IG1Pd25lci5sb2NrKCkpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBpZiAoaW5fc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSBvd25lci0+bVNlc3Npb25Db250cm9sbGVyLT5jYW5jZWwobUNsaWVudElkLCBpbl9zZXNzaW9uSWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEltcGw6OmdldFNlc3Npb25XaXRoSWQoaW50MzJfdCBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCogb3V0X3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG93bmVyOworICAgIGlmIChtQWJhbmRvbmVkIHx8IChvd25lciA9IG1Pd25lci5sb2NrKCkpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBpZiAoaW5fc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPQorICAgICAgICAgICAgb3duZXItPm1TZXNzaW9uQ29udHJvbGxlci0+Z2V0U2Vzc2lvbihtQ2xpZW50SWQsIGluX3Nlc3Npb25JZCwgJm91dF9zZXNzaW9uLT5yZXF1ZXN0KTsKKworICAgIGlmICgqX2FpZGxfcmV0dXJuKSB7CisgICAgICAgIG91dF9zZXNzaW9uLT5zZXNzaW9uSWQgPSBpbl9zZXNzaW9uSWQ7CisgICAgICAgIG91dF9zZXNzaW9uLT5hd2FpdE51bWJlck9mU2Vzc2lvbnMgPSAwOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsOjp1bnJlZ2lzdGVyKCkgeworICAgIGJvb2wgYWJhbmRvbmVkID0gbUFiYW5kb25lZC5leGNoYW5nZSh0cnVlKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG93bmVyOworICAgIGlmIChhYmFuZG9uZWQgfHwgKG93bmVyID0gbU93bmVyLmxvY2soKSkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworICAgIH0KKworICAgIC8vIFVzZSBzZXNzaW9uSWQgPT0gLTEgdG8gY2FuY2VsIGFsbCByZWFsdGltZSBzZXNzaW9ucyBmb3IgdGhpcyBjbGllbnQgd2l0aCB0aGUgY29udHJvbGxlci4KKyAgICBvd25lci0+bVNlc3Npb25Db250cm9sbGVyLT5jYW5jZWwobUNsaWVudElkLCAtMSk7CisgICAgb3duZXItPnJlbW92ZUNsaWVudChtQ2xpZW50SWQpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCiAvLyBzdGF0aWMKIHZvaWQgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKSB7Ci0gICAgaW50MzJfdCBjbGllbnRJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGNvb2tpZSkpOwotICAgIEFMT0dEKCJDbGllbnQgJSIgUFJJZDMyICIgaXMgZGVhZCIsIGNsaWVudElkKTsKLSAgICAvLyBEb24ndCBjaGVjayBmb3IgcGlkIHZhbGlkaXR5IHNpbmNlIHdlIGtub3cgaXQncyBhbHJlYWR5IGRlYWQuCi0gICAgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyJiBtYW5hZ2VyID0gVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOwotICAgIG1hbmFnZXIucmVtb3ZlQ2xpZW50KGNsaWVudElkKTsKKyAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQgPSByZWludGVycHJldF9jYXN0PENsaWVudElkVHlwZT4oY29va2llKTsKKworICAgIEFMT0dEKCJDbGllbnQgJWxsZCBpcyBkZWFkIiwgKGxvbmcgbG9uZyljbGllbnRJZCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50SW1wbD4gY2xpZW50OworCisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7c0Nvb2tpZTJDbGllbnRMb2NrfTsKKworICAgICAgICBhdXRvIGl0ID0gc0Nvb2tpZTJDbGllbnQuZmluZChjbGllbnRJZCk7CisgICAgICAgIGlmIChpdCAhPSBzQ29va2llMkNsaWVudC5lbmQoKSkgeworICAgICAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjbGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICBjbGllbnQtPnVucmVnaXN0ZXIoKTsKKyAgICB9CiB9CiAKLVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyKCkKLSAgICA6IG1EZWF0aFJlY2lwaWVudChBSUJpbmRlcl9EZWF0aFJlY2lwaWVudF9uZXcoQmluZGVyRGllZENhbGxiYWNrKSkgeworVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb250cm9sbGVyQ2xpZW50SW50ZXJmYWNlPiYgY29udHJvbGxlcikKKyAgICAgIDogbURlYXRoUmVjaXBpZW50KEFJQmluZGVyX0RlYXRoUmVjaXBpZW50X25ldyhCaW5kZXJEaWVkQ2FsbGJhY2spKSwKKyAgICAgICAgbVNlc3Npb25Db250cm9sbGVyKGNvbnRyb2xsZXIpIHsKICAgICBBTE9HRCgiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIHN0YXJ0ZWQiKTsKKyAgICBmb3IgKHVpZF90IHVpZCA6IHtBSURfUk9PVCwgQUlEX1NZU1RFTSwgQUlEX1NIRUxMLCBBSURfTUVESUF9KSB7CisgICAgICAgIG1UcnVzdGVkVWlkcy5pbnNlcnQodWlkKTsKKyAgICB9CiB9CiAKIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6flRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcigpIHsKICAgICBBTE9HRCgiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIGV4aXRlZCIpOwogfQogCi1ib29sIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6aXNDbGllbnRJZFJlZ2lzdGVyZWQoaW50MzJfdCBjbGllbnRJZCkgY29uc3QgewotICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307Ci0gICAgcmV0dXJuIG1DbGllbnRJZFRvQ2xpZW50SW5mb01hcC5maW5kKGNsaWVudElkKSAhPSBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuZW5kKCk7Ci19Ci0KIHZvaWQgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpkdW1wQWxsQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgVG90YWwgbnVtIG9mIENsaWVudHM6ICV6dVxuIiwgbUNsaWVudElkVG9DbGllbnRJbmZvTWFwLnNpemUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgaWYgKG1DbGllbnRJZFRvQ2xpZW50SW5mb01hcC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIj09PT09PT09PT0gRHVtcGluZyBhbGwgY2xpZW50cyA9PT09PT09PT1cbiIpOworICAgIGlmIChtQ2xpZW50SWRUb0NsaWVudE1hcC5zaXplKCkgPiAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuPT09PT09PT09PSBEdW1waW5nIGFsbCBjbGllbnRzID09PT09PT09PVxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXApIHsKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGl0ZXIuc2Vjb25kLT5tQ2xpZW50OwotICAgICAgICBzdGQ6OnN0cmluZyBjbGllbnROYW1lOwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gY2xpZW50LT5nZXROYW1lKCZjbGllbnROYW1lKTsKLSAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBjbGllbnQ6ICVkIGluZm9ybWF0aW9uIiwgaXRlci5maXJzdCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLS0gQ2xpZW50czogJWQgIG5hbWU6ICVzXG4iLCBpdGVyLmZpcnN0LCBjbGllbnROYW1lLmNfc3RyKCkpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVG90YWwgbnVtIG9mIENsaWVudHM6ICV6dVxuIiwgbUNsaWVudElkVG9DbGllbnRNYXAuc2l6ZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBtQ2xpZW50SWRUb0NsaWVudE1hcCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgQ2xpZW50ICVsbGQ6ICBwa2c6ICVzXG4iLCAobG9uZyBsb25nKWl0ZXIuZmlyc3QsCisgICAgICAgICAgICAgICAgIGl0ZXIuc2Vjb25kLT5tQ2xpZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KIAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCi1zdGF0dXNfdCBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OmFkZENsaWVudChzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50SW5mbz4gY2xpZW50KSB7Ci0gICAgLy8gVmFsaWRhdGUgdGhlIGNsaWVudC4KLSAgICBpZiAoY2xpZW50ID09IG51bGxwdHIgfHwgY2xpZW50LT5tQ2xpZW50SWQgPCAwIHx8IGNsaWVudC0+bUNsaWVudFBpZCA8IDAgfHwKLSAgICAgICAgY2xpZW50LT5tQ2xpZW50VWlkIDwgMCB8fCBjbGllbnQtPm1DbGllbnRPcFBhY2thZ2VOYW1lLmVtcHR5KCkgfHwKLSAgICAgICAgY2xpZW50LT5tQ2xpZW50T3BQYWNrYWdlTmFtZSA9PSAiIikgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjbGllbnQiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKK2Jvb2wgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjppc1RydXN0ZWRDYWxsZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAodWlkID4gMCAmJiBtVHJ1c3RlZFVpZHMuY291bnQodWlkKSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgaW50MzJfdCByZXN1bHQ7CisgICAgaWYgKEFQZXJtaXNzaW9uTWFuYWdlcl9jaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9NRURJQV9TVE9SQUdFIiwgcGlkLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkgPT0gUEVSTUlTU0lPTl9NQU5BR0VSX1NUQVRVU19PSyAmJgorICAgICAgICByZXN1bHQgPT0gUEVSTUlTU0lPTl9NQU5BR0VSX1BFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICBtVHJ1c3RlZFVpZHMuaW5zZXJ0KHVpZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjphZGRDbGllbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNhbGxiYWNrLCBjb25zdCBzdGQ6OnN0cmluZyYgY2xpZW50TmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+KiBvdXRDbGllbnQpIHsKKyAgICAvLyBWYWxpZGF0ZSB0aGUgY2xpZW50LgorICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyIHx8IGNsaWVudE5hbWUuZW1wdHkoKSB8fCBvcFBhY2thZ2VOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgY2xpZW50Iik7CisgICAgICAgIHJldHVybiBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorCisgICAgU3BBSUJpbmRlciBiaW5kZXIgPSBjYWxsYmFjay0+YXNCaW5kZXIoKTsKKwogICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CiAKLSAgICAvLyBDaGVjayBpZiB0aGUgY2xpZW50IGFscmVhZHkgZXhpc3RzLgotICAgIGlmIChtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuY291bnQoY2xpZW50LT5tQ2xpZW50SWQpICE9IDApIHsKLSAgICAgICAgQUxPR1coIkNsaWVudCBhbHJlYWR5IGV4aXN0cy4iKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIC8vIENoZWNrcyBpZiB0aGUgY2xpZW50IGFscmVhZHkgcmVnaXN0ZXJzLgorICAgIGlmIChtUmVnaXN0ZXJlZENhbGxiYWNrcy5jb3VudCgodWludHB0cl90KWJpbmRlci5nZXQoKSkgPiAwKSB7CisgICAgICAgIHJldHVybiBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0FMUkVBRFlfRVhJU1RTOwogICAgIH0KIAotICAgIEFMT0dEKCJBZGRpbmcgY2xpZW50IGlkICVkIHBpZDogJWQgdWlkOiAlZCAlcyIsIGNsaWVudC0+bUNsaWVudElkLCBjbGllbnQtPm1DbGllbnRQaWQsCi0gICAgICAgICAgY2xpZW50LT5tQ2xpZW50VWlkLCBjbGllbnQtPm1DbGllbnRPcFBhY2thZ2VOYW1lLmNfc3RyKCkpOworICAgIC8vIENyZWF0ZXMgdGhlIGNsaWVudCAod2l0aCB0aGUgaWQgYXNzaWduZWQgYnkgQ2xpZW50SW1wbCkuCisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudEltcGw+IGNsaWVudCA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPENsaWVudEltcGw+KAorICAgICAgICAgICAgY2FsbGJhY2ssIGNsaWVudE5hbWUsIG9wUGFja2FnZU5hbWUsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CiAKLSAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChjbGllbnQtPm1DbGllbnQtPmFzQmluZGVyKCkuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwKKyAgICBBTE9HRCgiQWRkaW5nIGNsaWVudCBpZCAlbGxkLCBuYW1lICVzLCBwYWNrYWdlICVzIiwgKGxvbmcgbG9uZyljbGllbnQtPm1DbGllbnRJZCwKKyAgICAgICAgICBjbGllbnQtPm1DbGllbnROYW1lLmNfc3RyKCksIGNsaWVudC0+bUNsaWVudE9wUGFja2FnZU5hbWUuY19zdHIoKSk7CisKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzQ29va2llMkNsaWVudExvY2t9OworICAgICAgICBzQ29va2llMkNsaWVudC5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGNsaWVudC0+bUNsaWVudElkLCBjbGllbnQpKTsKKyAgICB9CisKKyAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChiaW5kZXIuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihjbGllbnQtPm1DbGllbnRJZCkpOwogCiAgICAgLy8gQWRkcyB0aGUgbmV3IGNsaWVudCB0byB0aGUgbWFwLgotICAgIG1DbGllbnRJZFRvQ2xpZW50SW5mb01hcFtjbGllbnQtPm1DbGllbnRJZF0gPSBzdGQ6Om1vdmUoY2xpZW50KTsKKyAgICBtUmVnaXN0ZXJlZENhbGxiYWNrcy5pbnNlcnQoKHVpbnRwdHJfdCliaW5kZXIuZ2V0KCkpOworICAgIG1DbGllbnRJZFRvQ2xpZW50TWFwW2NsaWVudC0+bUNsaWVudElkXSA9IGNsaWVudDsKKworICAgICpvdXRDbGllbnQgPSBjbGllbnQ7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6cmVtb3ZlQ2xpZW50KGludDMyX3QgY2xpZW50SWQpIHsKLSAgICBBTE9HRCgiUmVtb3ZpbmcgY2xpZW50IGlkICVkIiwgY2xpZW50SWQpOworc3RhdHVzX3QgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpyZW1vdmVDbGllbnQoQ2xpZW50SWRUeXBlIGNsaWVudElkKSB7CisgICAgQUxPR0QoIlJlbW92aW5nIGNsaWVudCBpZCAlbGxkIiwgKGxvbmcgbG9uZyljbGllbnRJZCk7CiAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKIAogICAgIC8vIENoZWNrcyBpZiB0aGUgY2xpZW50IGlzIHZhbGlkLgotICAgIGF1dG8gaXQgPSBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuZmluZChjbGllbnRJZCk7Ci0gICAgaWYgKGl0ID09IG1DbGllbnRJZFRvQ2xpZW50SW5mb01hcC5lbmQoKSkgewotICAgICAgICBBTE9HRSgiQ2xpZW50IGlkICVkIGRvZXMgbm90IGV4aXN0IiwgY2xpZW50SWQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgYXV0byBpdCA9IG1DbGllbnRJZFRvQ2xpZW50TWFwLmZpbmQoY2xpZW50SWQpOworICAgIGlmIChpdCA9PSBtQ2xpZW50SWRUb0NsaWVudE1hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiQ2xpZW50IGlkICVsbGQgZG9lcyBub3QgZXhpc3QiLCAobG9uZyBsb25nKWNsaWVudElkKTsKKyAgICAgICAgcmV0dXJuIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQtPm1DbGllbnQ7CisgICAgU3BBSUJpbmRlciBiaW5kZXIgPSBpdC0+c2Vjb25kLT5tQ2xpZW50QmluZGVyOwogCiAgICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWVudCBzdGlsbCBsaXZlLiBJZiBhbGl2ZSwgdW5saW5rIHRoZSBkZWF0aC4KLSAgICBpZiAoY2xpZW50KSB7Ci0gICAgICAgIEFJQmluZGVyX3VubGlua1RvRGVhdGgoY2xpZW50LT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oY2xpZW50SWQpKTsKKyAgICBpZiAoYmluZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUlCaW5kZXJfdW5saW5rVG9EZWF0aChiaW5kZXIuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihpdC0+c2Vjb25kLT5tQ2xpZW50SWQpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzQ29va2llMkNsaWVudExvY2t9OworICAgICAgICBzQ29va2llMkNsaWVudC5lcmFzZShpdC0+c2Vjb25kLT5tQ2xpZW50SWQpOwogICAgIH0KIAogICAgIC8vIEVyYXNlIHRoZSBlbnRyeS4KLSAgICBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuZXJhc2UoaXQpOworICAgIG1DbGllbnRJZFRvQ2xpZW50TWFwLmVyYXNlKGl0KTsKKyAgICBtUmVnaXN0ZXJlZENhbGxiYWNrcy5lcmFzZSgodWludHB0cl90KWJpbmRlci5nZXQoKSk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHNpemVfdCBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OmdldE51bU9mQ2xpZW50cygpIGNvbnN0IHsKICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUxvY2t9OwotICAgIHJldHVybiBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuc2l6ZSgpOworICAgIHJldHVybiBtQ2xpZW50SWRUb0NsaWVudE1hcC5zaXplKCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjUzZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5LmNwcApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeSIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlT2JzZXJ2ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYU9ic2VydmFibGVFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZUZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZVBhcmNlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZVR5cGU7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBNZWRpYU9ic2VydmFibGVQYXJjZWwmIG9ic2VydmFibGUpIHsKKyAgICByZXR1cm4gInsiICsgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dG9TdHJpbmcob2JzZXJ2YWJsZS50eXBlKSArICIsICIgKworICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhvYnNlcnZhYmxlLnZhbHVlKSArICJ9IjsKK30KKworc3RydWN0IFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6OlJlc291cmNlT2JzZXJ2ZXIgOiBwdWJsaWMgQm5SZXNvdXJjZU9ic2VydmVyIHsKKyAgICBleHBsaWNpdCBSZXNvdXJjZU9ic2VydmVyKFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kqIG93bmVyKSA6IG1Pd25lcihvd25lcikge30KKworICAgIC8vIElSZXNvdXJjZU9ic2VydmVyCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb25TdGF0dXNDaGFuZ2VkKAorICAgICAgICAgICAgTWVkaWFPYnNlcnZhYmxlRXZlbnQgZXZlbnQsIGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4mIG9ic2VydmFibGVzKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dEKCIlczogJXMsIHVpZCAlZCwgcGlkICVkLCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dG9TdHJpbmcoZXZlbnQpLmNfc3RyKCksIHVpZCwgcGlkLAorICAgICAgICAgICAgICB0b1N0cmluZyhvYnNlcnZhYmxlc1swXSkuY19zdHIoKSk7CisKKyAgICAgICAgLy8gT25seSByZXBvcnQga0lkbGUgZXZlbnQuCisgICAgICAgIGlmICgoKHVpbnQ2NF90KWV2ZW50ICYgKHVpbnQ2NF90KU1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprSWRsZSkgIT0gMCkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBvYnNlcnZhYmxlIDogb2JzZXJ2YWJsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JzZXJ2YWJsZS50eXBlID09IE1lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjIHx8CisgICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUudHlwZSA9PSBNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYykgeworICAgICAgICAgICAgICAgICAgICBtT3duZXItPm9uUmVzb3VyY2VBdmFpbGFibGUocGlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5KiBtT3duZXI7Cit9OworCisvLyBzdGF0aWMKK3ZvaWQgVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeTo6QmluZGVyRGllZENhbGxiYWNrKHZvaWQqIGNvb2tpZSkgeworICAgIFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kqIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5Kj4oY29va2llKTsKKyAgICBpZiAob3duZXIgIT0gbnVsbHB0cikgeworICAgICAgICBvd25lci0+dW5yZWdpc3RlclNlbGYoKTsKKyAgICB9CisgICAgLy8gVE9ETyhjaHopOiByZXRyeSB0byBjb25uZWN0aW5nIHRvIElSZXNvdXJjZU9ic2VydmVyU2VydmljZSBhZnRlciBmYWlsdXJlLgorICAgIC8vIEFsc28gbmVlZCB0byBoYXZlIGJhY2stdXAgbG9naWMgaWYgSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGlzIG9mZmxpbmUgZm9yCisgICAgLy8gUHJvbG9uZ2VkIHBlcmlvZCBvZiB0aW1lLiBBIHBvc3NpYmxlIGFsdGVybmF0aXZlIGNvdWxkIGJlLCBkdXJpbmcgcGVyaW9kIHdoZXJlCisgICAgLy8gSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUsIHRyaWdnZXIgb25SZXNvdXJjZUF2YWlsYWJsZSgpIGV2ZXJ5dGltZQorICAgIC8vIHdoZW4gdG9wIHVpZCBjaGFuZ2VzIChpbiBob3BlIHRoYXQnbGwgZnJlZSB1cCBzb21lIGNvZGVjIGluc3RhbmNlcyB0aGF0IHdlIGNvdWxkCisgICAgLy8gcmVjbGFpbSkuCit9CisKK1RyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6OlRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3koKQorICAgICAgOiBtUmVnaXN0ZXJlZChmYWxzZSksCisgICAgICAgIG1SZXNvdXJjZUxvc3RQaWQoLTEpLAorICAgICAgICBtRGVhdGhSZWNpcGllbnQoQUlCaW5kZXJfRGVhdGhSZWNpcGllbnRfbmV3KEJpbmRlckRpZWRDYWxsYmFjaykpIHsKKyAgICByZWdpc3RlclNlbGYoKTsKK30KKworVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeTo6flRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3koKSB7CisgICAgdW5yZWdpc3RlclNlbGYoKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgQUxPR0koIlRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6IHJlZ2lzdGVyU2VsZiIpOworCisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKCJtZWRpYS5yZXNvdXJjZV9vYnNlcnZlciIpKTsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttUmVnaXN0ZXJlZExvY2t9OworCisgICAgaWYgKG1SZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUT0RPKGNoeik6IHJldHJ5IHRvIGNvbm5lY3RpbmcgdG8gSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGFmdGVyIGZhaWx1cmUuCisgICAgbVNlcnZpY2UgPSBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgICBpZiAobVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9ubHkgcmVnaXN0ZXIgZmlsdGVycyBmb3IgY29kZWMgcmVzb3VyY2UgYXZhaWxhYmxlLgorICAgIG1PYnNlcnZlciA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlT2JzZXJ2ZXI+KHRoaXMpOworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZUZpbHRlcj4gZmlsdGVycyA9IHsKKyAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgTWVkaWFPYnNlcnZhYmxlRXZlbnQ6OmtJZGxlfSwKKyAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgTWVkaWFPYnNlcnZhYmxlRXZlbnQ6OmtJZGxlfX07CisKKyAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyT2JzZXJ2ZXIobU9ic2VydmVyLCBmaWx0ZXJzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWdpc3RlcjogZXJyb3IgJWQiLCBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIG1TZXJ2aWNlID0gbnVsbHB0cjsKKyAgICAgICAgbU9ic2VydmVyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFJQmluZGVyX2xpbmtUb0RlYXRoKGJpbmRlci5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCByZWludGVycHJldF9jYXN0PHZvaWQqPih0aGlzKSk7CisKKyAgICBBTE9HRCgiQEBAIHJlZ2lzdGVyZWQgb2JzZXJ2ZXIiKTsKKyAgICBtUmVnaXN0ZXJlZCA9IHRydWU7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgQUxPR0koIlRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6IHVucmVnaXN0ZXJTZWxmIik7CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVJlZ2lzdGVyZWRMb2NrfTsKKworICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciA9IG1TZXJ2aWNlLT5hc0JpbmRlcigpOworICAgIGlmIChiaW5kZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnVucmVnaXN0ZXJPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICBBSUJpbmRlcl91bmxpbmtUb0RlYXRoKGJpbmRlci5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCByZWludGVycHJldF9jYXN0PHZvaWQqPih0aGlzKSk7CisgICAgfQorCisgICAgbVNlcnZpY2UgPSBudWxscHRyOworICAgIG1PYnNlcnZlciA9IG51bGxwdHI7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5OjpzZXRDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYikgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttQ2FsbGJhY2tMb2NrfTsKKyAgICBtUmVzb3VyY2VQb2xpY3lDYWxsYmFjayA9IGNiOworfQorCit2b2lkIFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6OnNldFBpZFJlc291cmNlTG9zdChwaWRfdCBwaWQpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUNhbGxiYWNrTG9ja307CisgICAgbVJlc291cmNlTG9zdFBpZCA9IHBpZDsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5OjpvblJlc291cmNlQXZhaWxhYmxlKHBpZF90IHBpZCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiBjYjsKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttQ2FsbGJhY2tMb2NrfTsKKyAgICAgICAgLy8gT25seSBjYWxsYmFjayBpZiBjb2RlYyByZXNvdXJjZSBpcyByZWxlYXNlZCBmcm9tIG90aGVyIHByb2Nlc3Nlcy4KKyAgICAgICAgaWYgKG1SZXNvdXJjZUxvc3RQaWQgIT0gLTEgJiYgbVJlc291cmNlTG9zdFBpZCAhPSBwaWQpIHsKKyAgICAgICAgICAgIGNiID0gbVJlc291cmNlUG9saWN5Q2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgbVJlc291cmNlTG9zdFBpZCA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNiICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2ItPm9uUmVzb3VyY2VBdmFpbGFibGUoKTsKKyAgICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhNzA4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5jcHAKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIiCisKKyNkZWZpbmUgVkFMSURBVEVfU1RBVEUgMQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdVaWRQb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljX2Fzc2VydCgoU2Vzc2lvbklkVHlwZSktMSA8IDAsICJTZXNzaW9uSWRUeXBlIHNob3VsZCBiZSBzaWduZWQiKTsKKworY29uc3RleHByIHN0YXRpYyB1aWRfdCBPRkZMSU5FX1VJRCA9IC0xOworCisvL3N0YXRpYworU3RyaW5nOCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpzZXNzaW9uVG9TdHJpbmcoY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICByZXR1cm4gU3RyaW5nODo6Zm9ybWF0KCJ7Y2xpZW50OiVsbGQsIHNlc3Npb246JWR9IiwgKGxvbmcgbG9uZylzZXNzaW9uS2V5LmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbktleS5zZWNvbmQpOworfQorCisvL3N0YXRpYworY29uc3QgY2hhciogVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6c2Vzc2lvblN0YXRlVG9TdHJpbmcoY29uc3QgU2Vzc2lvbjo6U3RhdGUgc2Vzc2lvblN0YXRlKSB7CisgICAgc3dpdGNoIChzZXNzaW9uU3RhdGUpIHsKKyAgICBjYXNlIFNlc3Npb246OlN0YXRlOjpOT1RfU1RBUlRFRDoKKyAgICAgICAgcmV0dXJuICJOT1RfU1RBUlRFRCI7CisgICAgY2FzZSBTZXNzaW9uOjpTdGF0ZTo6UlVOTklORzoKKyAgICAgICAgcmV0dXJuICJSVU5OSU5HIjsKKyAgICBjYXNlIFNlc3Npb246OlN0YXRlOjpQQVVTRUQ6CisgICAgICAgIHJldHVybiAiUEFVU0VEIjsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuICIodW5rbm93bikiOworfQorCitUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckludGVyZmFjZT4mIHRyYW5zY29kZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxVaWRQb2xpY3lJbnRlcmZhY2U+JiB1aWRQb2xpY3ksCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUludGVyZmFjZT4mIHJlc291cmNlUG9saWN5KQorICAgICAgOiBtVHJhbnNjb2Rlcih0cmFuc2NvZGVyKSwKKyAgICAgICAgbVVpZFBvbGljeSh1aWRQb2xpY3kpLAorICAgICAgICBtUmVzb3VyY2VQb2xpY3kocmVzb3VyY2VQb2xpY3kpLAorICAgICAgICBtQ3VycmVudFNlc3Npb24obnVsbHB0ciksCisgICAgICAgIG1SZXNvdXJjZUxvc3QoZmFsc2UpIHsKKyAgICAvLyBPbmx5IHB1c2ggZW1wdHkgb2ZmbGluZSBxdWV1ZSBpbml0aWFsbHkuIFJlYWx0aW1lIHF1ZXVlcyBhcmUgYWRkZWQgd2hlbiByZXF1ZXN0cyBjb21lIGluLgorICAgIG1VaWRTb3J0ZWRMaXN0LnB1c2hfYmFjayhPRkZMSU5FX1VJRCk7CisgICAgbU9mZmxpbmVVaWRJdGVyYXRvciA9IG1VaWRTb3J0ZWRMaXN0LmJlZ2luKCk7CisgICAgbVNlc3Npb25RdWV1ZXMuZW1wbGFjZShPRkZMSU5FX1VJRCwgU2Vzc2lvblF1ZXVlVHlwZSgpKTsKKyAgICBtVWlkUGFja2FnZU5hbWVzW09GRkxJTkVfVUlEXSA9ICIob2ZmbGluZSkiOworfQorCitUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjp+VHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcigpIHt9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6ZHVtcEFsbFNlc3Npb25zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuPT09PT09PT09PSBEdW1waW5nIGFsbCBzZXNzaW9ucyBxdWV1ZXMgPT09PT09PT09XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUb3RhbCBudW0gb2YgU2Vzc2lvbnM6ICV6dVxuIiwgbVNlc3Npb25NYXAuc2l6ZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB1aWRzKG1VaWRTb3J0ZWRMaXN0LmJlZ2luKCksIG1VaWRTb3J0ZWRMaXN0LmVuZCgpKTsKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHVpZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gdWlkc1tpXTsKKworICAgICAgICBpZiAobVNlc3Npb25RdWV1ZXNbdWlkXS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgVWlkOiAlZCwgcGtnOiAlc1xuIiwgdWlkLAorICAgICAgICAgICAgICAgICBtVWlkUGFja2FnZU5hbWVzLmNvdW50KHVpZCkgPiAwID8gbVVpZFBhY2thZ2VOYW1lc1t1aWRdLmNfc3RyKCkgOiAiKHVua25vd24pIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgTnVtIG9mIHNlc3Npb25zOiAlenVcbiIsIG1TZXNzaW9uUXVldWVzW3VpZF0uc2l6ZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKGF1dG8mIHNlc3Npb25LZXkgOiBtU2Vzc2lvblF1ZXVlc1t1aWRdKSB7CisgICAgICAgICAgICBhdXRvIHNlc3Npb25JdCA9IG1TZXNzaW9uTWFwLmZpbmQoc2Vzc2lvbktleSk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbkl0ID09IG1TZXNzaW9uTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRmFpbGVkIHRvIGxvb2sgdXAgU2Vzc2lvbiAlcyAgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZXNzaW9uJiBzZXNzaW9uID0gc2Vzc2lvbkl0LT5zZWNvbmQ7CisgICAgICAgICAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QgPSBzZXNzaW9uLnJlcXVlc3Q7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICBTZXNzaW9uOiAlcywgJXMsICVkJSVcbiIsCisgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uVG9TdHJpbmcoc2Vzc2lvbktleSkuY19zdHIoKSwgc2Vzc2lvblN0YXRlVG9TdHJpbmcoc2Vzc2lvbi5zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmxhc3RQcm9ncmVzcyk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgIFNyYzogJXNcbiIsIHJlcXVlc3Quc291cmNlRmlsZVBhdGguY19zdHIoKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgIERzdDogJXNcbiIsIHJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIC8vIEZvciB0aGUgb2ZmbGluZSBxdWV1ZSwgcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCBjbGllbnQuCisgICAgICAgICAgICBpZiAodWlkID09IE9GRkxJTkVfVUlEKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgICBPcmlnaW5hbCBDbGllbnQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuY2xpZW50UGFja2FnZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OlNlc3Npb24qIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OmdldFRvcFNlc3Npb25fbCgpIHsKKyAgICBpZiAobVNlc3Npb25NYXAuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgdWlkX3QgdG9wVWlkID0gKm1VaWRTb3J0ZWRMaXN0LmJlZ2luKCk7CisgICAgU2Vzc2lvbktleVR5cGUgdG9wU2Vzc2lvbktleSA9ICptU2Vzc2lvblF1ZXVlc1t0b3BVaWRdLmJlZ2luKCk7CisgICAgcmV0dXJuICZtU2Vzc2lvbk1hcFt0b3BTZXNzaW9uS2V5XTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjp1cGRhdGVDdXJyZW50U2Vzc2lvbl9sKCkgeworICAgIFNlc3Npb24qIHRvcFNlc3Npb24gPSBnZXRUb3BTZXNzaW9uX2woKTsKKyAgICBTZXNzaW9uKiBjdXJTZXNzaW9uID0gbUN1cnJlbnRTZXNzaW9uOworICAgIEFMT0dWKCJ1cGRhdGVDdXJyZW50U2Vzc2lvbjogdG9wU2Vzc2lvbiBpcyAlcywgY3VyU2Vzc2lvbiBpcyAlcyIsCisgICAgICAgICAgdG9wU2Vzc2lvbiA9PSBudWxscHRyID8gIm51bGwiIDogc2Vzc2lvblRvU3RyaW5nKHRvcFNlc3Npb24tPmtleSkuY19zdHIoKSwKKyAgICAgICAgICBjdXJTZXNzaW9uID09IG51bGxwdHIgPyAibnVsbCIgOiBzZXNzaW9uVG9TdHJpbmcoY3VyU2Vzc2lvbi0+a2V5KS5jX3N0cigpKTsKKworICAgIC8vIElmIHdlIGZvdW5kIGEgdG9wU2Vzc2lvbiB0aGF0IHNob3VsZCBiZSBydW4sIGFuZCBpdCdzIG5vdCBhbHJlYWR5IHJ1bm5pbmcsCisgICAgLy8gdGFrZSBzb21lIGFjdGlvbnMgdG8gZW5zdXJlIGl0J3MgcnVubmluZy4KKyAgICBpZiAodG9wU2Vzc2lvbiAhPSBudWxscHRyICYmCisgICAgICAgICh0b3BTZXNzaW9uICE9IGN1clNlc3Npb24gfHwgdG9wU2Vzc2lvbi0+c3RhdGUgIT0gU2Vzc2lvbjo6UlVOTklORykpIHsKKyAgICAgICAgLy8gSWYgYW5vdGhlciBzZXNzaW9uIGlzIGN1cnJlbnRseSBydW5uaW5nLCBwYXVzZSBpdCBmaXJzdC4KKyAgICAgICAgaWYgKGN1clNlc3Npb24gIT0gbnVsbHB0ciAmJiBjdXJTZXNzaW9uLT5zdGF0ZSA9PSBTZXNzaW9uOjpSVU5OSU5HKSB7CisgICAgICAgICAgICBtVHJhbnNjb2Rlci0+cGF1c2UoY3VyU2Vzc2lvbi0+a2V5LmZpcnN0LCBjdXJTZXNzaW9uLT5rZXkuc2Vjb25kKTsKKyAgICAgICAgICAgIGN1clNlc3Npb24tPnN0YXRlID0gU2Vzc2lvbjo6UEFVU0VEOworICAgICAgICB9CisgICAgICAgIC8vIElmIHdlIGFyZSBub3QgZXhwZXJpZW5jaW5nIHJlc291cmNlIGxvc3MsIHdlIGNhbiBzdGFydCBvciByZXN1bWUKKyAgICAgICAgLy8gdGhlIHRvcFNlc3Npb24gbm93LgorICAgICAgICBpZiAoIW1SZXNvdXJjZUxvc3QpIHsKKyAgICAgICAgICAgIGlmICh0b3BTZXNzaW9uLT5zdGF0ZSA9PSBTZXNzaW9uOjpOT1RfU1RBUlRFRCkgeworICAgICAgICAgICAgICAgIG1UcmFuc2NvZGVyLT5zdGFydCh0b3BTZXNzaW9uLT5rZXkuZmlyc3QsIHRvcFNlc3Npb24tPmtleS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFNlc3Npb24tPnJlcXVlc3QsIHRvcFNlc3Npb24tPmNhbGxiYWNrLmxvY2soKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvcFNlc3Npb24tPnN0YXRlID09IFNlc3Npb246OlBBVVNFRCkgeworICAgICAgICAgICAgICAgIG1UcmFuc2NvZGVyLT5yZXN1bWUodG9wU2Vzc2lvbi0+a2V5LmZpcnN0LCB0b3BTZXNzaW9uLT5rZXkuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wU2Vzc2lvbi0+cmVxdWVzdCwgdG9wU2Vzc2lvbi0+Y2FsbGJhY2subG9jaygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvcFNlc3Npb24tPnN0YXRlID0gU2Vzc2lvbjo6UlVOTklORzsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ3VycmVudFNlc3Npb24gPSB0b3BTZXNzaW9uOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OnJlbW92ZVNlc3Npb25fbChjb25zdCBTZXNzaW9uS2V5VHlwZSYgc2Vzc2lvbktleSkgeworICAgIEFMT0dWKCIlczogc2Vzc2lvbiAlcyIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworCisgICAgaWYgKG1TZXNzaW9uTWFwLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgQUxPR0UoInNlc3Npb24gJXMgZG9lc24ndCBleGlzdCIsIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFJlbW92ZSBzZXNzaW9uIGZyb20gdWlkJ3MgcXVldWUuCisgICAgY29uc3QgdWlkX3QgdWlkID0gbVNlc3Npb25NYXBbc2Vzc2lvbktleV0udWlkOworICAgIFNlc3Npb25RdWV1ZVR5cGUmIHNlc3Npb25RdWV1ZSA9IG1TZXNzaW9uUXVldWVzW3VpZF07CisgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChzZXNzaW9uUXVldWUuYmVnaW4oKSwgc2Vzc2lvblF1ZXVlLmVuZCgpLCBzZXNzaW9uS2V5KTsKKyAgICBpZiAoaXQgPT0gc2Vzc2lvblF1ZXVlLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBmaW5kIHNlc3Npb24gJXMgaW4gcXVldWUgZm9yIHVpZCAlZCIsIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpLAorICAgICAgICAgICAgICB1aWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNlc3Npb25RdWV1ZS5lcmFzZShpdCk7CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IHNlc3Npb24gaW4gYSByZWFsLXRpbWUgcXVldWUsIHJlbW92ZSB0aGlzIHVpZCdzIHF1ZXVlLgorICAgIGlmICh1aWQgIT0gT0ZGTElORV9VSUQgJiYgc2Vzc2lvblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgbVVpZFNvcnRlZExpc3QucmVtb3ZlKHVpZCk7CisgICAgICAgIG1TZXNzaW9uUXVldWVzLmVyYXNlKHVpZCk7CisgICAgICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZCk7CisKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiB0b3BVaWRzID0gbVVpZFBvbGljeS0+Z2V0VG9wVWlkcygpOworICAgICAgICBtb3ZlVWlkc1RvVG9wX2wodG9wVWlkcywgZmFsc2UgLypwcmVzZXJ2ZVRvcFVpZCovKTsKKyAgICB9CisKKyAgICAvLyBDbGVhciBjdXJyZW50IHNlc3Npb24uCisgICAgaWYgKG1DdXJyZW50U2Vzc2lvbiA9PSAmbVNlc3Npb25NYXBbc2Vzc2lvbktleV0pIHsKKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgc2Vzc2lvbiBmcm9tIHNlc3Npb24gbWFwLgorICAgIG1TZXNzaW9uTWFwLmVyYXNlKHNlc3Npb25LZXkpOworfQorCisvKioKKyAqIE1vdmVzIHRoZSBzZXQgb2YgdWlkcyB0byB0aGUgZnJvbnQgb2YgbVVpZFNvcnRlZExpc3QgKHdoaWNoIGlzIHVzZWQgdG8gcGljaworICogdGhlIG5leHQgc2Vzc2lvbiB0byBydW4pLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gMSkgd2UgcmVjZWl2ZWQgYSBvblRvcFVpZHNDaGFuZ2VkKCkgY2FsbGJhY2sgZnJvbSBVaWRQb2xpY3ksCisgKiBvciAyKSB3ZSByZW1vdmVkIHRoZSBzZXNzaW9uIHF1ZXVlIGZvciBhIHVpZCBiZWNhdXNlIGl0IGJlY29tZXMgZW1wdHkuCisgKgorICogSW4gY2FzZSBvZiAxKSwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHVpZHMgaW4gdGhlIHNldCwgYW5kIHRoZSBjdXJyZW50IGZyb250CisgKiB1aWQgaW4gbVVpZFNvcnRlZExpc3QgaXMgc3RpbGwgaW4gdGhlIHNldCwgd2UgdHJ5IHRvIGtlZXAgdGhhdCB1aWQgYXQgZnJvbnQKKyAqIHNvIHRoYXQgY3VycmVudCBzZXNzaW9uIHJ1biBpcyBub3QgaW50ZXJydXB0ZWQuIChUaGlzIGlzIG5vdCBhIGNvbmNlcm4gZm9yIGNhc2UgMikKKyAqIGJlY2F1c2UgdGhlIHF1ZXVlIGZvciBhIHVpZCB3YXMganVzdCByZW1vdmVkIGVudGlyZWx5LikKKyAqLwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjptb3ZlVWlkc1RvVG9wX2woY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiYgdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlc2VydmVUb3BVaWQpIHsKKyAgICAvLyBJZiB1aWQgc2V0IGlzIGVtcHR5LCBub3RoaW5nIHRvIGRvLiBEbyBub3QgY2hhbmdlIHRoZSBxdWV1ZSBzdGF0dXMuCisgICAgaWYgKHVpZHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gU2F2ZSB0aGUgY3VycmVudCB0b3AgdWlkLgorICAgIHVpZF90IGN1clRvcFVpZCA9ICptVWlkU29ydGVkTGlzdC5iZWdpbigpOworICAgIGJvb2wgcHVzaEN1clRvcFRvRnJvbnQgPSBmYWxzZTsKKyAgICBpbnQzMl90IG51bVVpZHNNb3ZlZCA9IDA7CisKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBzb3J0ZWQgdWlkIGxpc3Qgb25jZSwgYW5kIG1vdmUgdGhlIG9uZXMgaW4gdG9wIHNldCB0byBmcm9udC4KKyAgICBmb3IgKGF1dG8gaXQgPSBtVWlkU29ydGVkTGlzdC5iZWdpbigpOyBpdCAhPSBtVWlkU29ydGVkTGlzdC5lbmQoKTspIHsKKyAgICAgICAgdWlkX3QgdWlkID0gKml0OworCisgICAgICAgIGlmICh1aWQgIT0gT0ZGTElORV9VSUQgJiYgdWlkcy5jb3VudCh1aWQpID4gMCkgeworICAgICAgICAgICAgaXQgPSBtVWlkU29ydGVkTGlzdC5lcmFzZShpdCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIHRvcCB3ZSdyZSBwcmVzZXJ2aW5nLCBkb24ndCBwdXNoIGl0IGhlcmUsIHB1c2gKKyAgICAgICAgICAgIC8vIGl0IGFmdGVyIHRoZSBmb3ItbG9vcC4KKyAgICAgICAgICAgIGlmICh1aWQgPT0gY3VyVG9wVWlkICYmIHByZXNlcnZlVG9wVWlkKSB7CisgICAgICAgICAgICAgICAgcHVzaEN1clRvcFRvRnJvbnQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVWlkU29ydGVkTGlzdC5wdXNoX2Zyb250KHVpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGFsbCB1aWRzIGluIHRoZSBzZXQsIGJyZWFrIG91dC4KKyAgICAgICAgICAgIGlmICgrK251bVVpZHNNb3ZlZCA9PSB1aWRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwdXNoQ3VyVG9wVG9Gcm9udCkgeworICAgICAgICBtVWlkU29ydGVkTGlzdC5wdXNoX2Zyb250KGN1clRvcFVpZCk7CisgICAgfQorfQorCitib29sIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OnN1Ym1pdCgKKyAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgdWlkX3QgdWlkLAorICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgeworICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIEFMT0dWKCIlczogc2Vzc2lvbiAlcywgdWlkICVkLCBwcmlvaXJ0eSAlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCksCisgICAgICAgICAgdWlkLCAoaW50MzJfdClyZXF1ZXN0LnByaW9yaXR5KTsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICBpZiAobVNlc3Npb25NYXAuY291bnQoc2Vzc2lvbktleSkgPiAwKSB7CisgICAgICAgIEFMT0dFKCJzZXNzaW9uICVzIGFscmVhZHkgZXhpc3RzIiwgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQWRkIHRoZSB1aWQgcGFja2FnZSBuYW1lIHRvIHRoZSBzdG9yZSBvZiBwYWNrYWdlIG5hbWVzIHdlIGFscmVhZHkga25vdy4KKyAgICBpZiAobVVpZFBhY2thZ2VOYW1lcy5jb3VudCh1aWQpID09IDApIHsKKyAgICAgICAgbVVpZFBhY2thZ2VOYW1lcy5lbXBsYWNlKHVpZCwgcmVxdWVzdC5jbGllbnRQYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgLy8gVE9ETyhjaHopOiBvbmx5IHN1cHBvcnQgb2ZmbGluZSB2cyByZWFsLXRpbWUgZm9yIG5vdy4gQWxsIGtVbnNwZWNpZmllZCBzZXNzaW9ucworICAgIC8vIGdvIHRvIG9mZmxpbmUgcXVldWUuCisgICAgaWYgKHJlcXVlc3QucHJpb3JpdHkgPT0gVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtVbnNwZWNpZmllZCkgeworICAgICAgICB1aWQgPSBPRkZMSU5FX1VJRDsKKyAgICB9CisKKyAgICAvLyBBZGQgc2Vzc2lvbiB0byBzZXNzaW9uIG1hcC4KKyAgICBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5rZXkgPSBzZXNzaW9uS2V5OworICAgIG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLnVpZCA9IHVpZDsKKyAgICBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5zdGF0ZSA9IFNlc3Npb246Ok5PVF9TVEFSVEVEOworICAgIG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLmxhc3RQcm9ncmVzcyA9IDA7CisgICAgbVNlc3Npb25NYXBbc2Vzc2lvbktleV0ucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgbVNlc3Npb25NYXBbc2Vzc2lvbktleV0uY2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgIC8vIElmIGl0J3MgYW4gb2ZmbGluZSBzZXNzaW9uLCB0aGUgcXVldWUgd2FzIGFscmVhZHkgYWRkZWQgaW4gY29uc3RydWN0b3IuCisgICAgLy8gSWYgaXQncyBhIHJlYWwtdGltZSBzZXNzaW9ucywgY2hlY2sgaWYgYSBxdWV1ZSBpcyBhbHJlYWR5IHByZXNlbnQgZm9yIHRoZSB1aWQsCisgICAgLy8gYW5kIGFkZCBhIG5ldyBxdWV1ZSBpZiBuZWVkZWQuCisgICAgaWYgKHVpZCAhPSBPRkZMSU5FX1VJRCkgeworICAgICAgICBpZiAobVNlc3Npb25RdWV1ZXMuY291bnQodWlkKSA9PSAwKSB7CisgICAgICAgICAgICBtVWlkUG9saWN5LT5yZWdpc3Rlck1vbml0b3JVaWQodWlkKTsKKyAgICAgICAgICAgIGlmIChtVWlkUG9saWN5LT5pc1VpZE9uVG9wKHVpZCkpIHsKKyAgICAgICAgICAgICAgICBtVWlkU29ydGVkTGlzdC5wdXNoX2Zyb250KHVpZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNob3VsZG4ndCBiZSBzdWJtaXR0aW5nIHJlYWwtdGltZSByZXF1ZXN0cyBmcm9tIG5vbi10b3AgYXBwLAorICAgICAgICAgICAgICAgIC8vIHB1dCBpdCBpbiBmcm9udCBvZiB0aGUgb2ZmbGluZSBxdWV1ZS4KKyAgICAgICAgICAgICAgICBtVWlkU29ydGVkTGlzdC5pbnNlcnQobU9mZmxpbmVVaWRJdGVyYXRvciwgdWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh1aWQgIT0gKm1VaWRTb3J0ZWRMaXN0LmJlZ2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtVWlkUG9saWN5LT5pc1VpZE9uVG9wKHVpZCkpIHsKKyAgICAgICAgICAgICAgICBtVWlkU29ydGVkTGlzdC5yZW1vdmUodWlkKTsKKyAgICAgICAgICAgICAgICBtVWlkU29ydGVkTGlzdC5wdXNoX2Zyb250KHVpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQXBwZW5kIHRoaXMgc2Vzc2lvbiB0byB0aGUgdWlkJ3MgcXVldWUuCisgICAgbVNlc3Npb25RdWV1ZXNbdWlkXS5wdXNoX2JhY2soc2Vzc2lvbktleSk7CisKKyAgICB1cGRhdGVDdXJyZW50U2Vzc2lvbl9sKCk7CisKKyAgICB2YWxpZGF0ZVN0YXRlX2woKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpjYW5jZWwoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIEFMT0dWKCIlczogc2Vzc2lvbiAlcyIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworCisgICAgc3RkOjpsaXN0PFNlc3Npb25LZXlUeXBlPiBzZXNzaW9uc1RvUmVtb3ZlOworCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1TZXNzaW9uTWFwLmJlZ2luKCk7IGl0ICE9IG1TZXNzaW9uTWFwLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPmZpcnN0LmZpcnN0ID09IGNsaWVudElkICYmIGl0LT5zZWNvbmQudWlkICE9IE9GRkxJTkVfVUlEKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbnNUb1JlbW92ZS5wdXNoX2JhY2soaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU2Vzc2lvbk1hcC5jb3VudChzZXNzaW9uS2V5KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgic2Vzc2lvbiAlcyBkb2Vzbid0IGV4aXN0Iiwgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHNlc3Npb25zVG9SZW1vdmUucHVzaF9iYWNrKHNlc3Npb25LZXkpOworICAgIH0KKworICAgIGZvciAoYXV0byBpdCA9IHNlc3Npb25zVG9SZW1vdmUuYmVnaW4oKTsgaXQgIT0gc2Vzc2lvbnNUb1JlbW92ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBJZiB0aGUgc2Vzc2lvbiBoYXMgZXZlciBiZWVuIHN0YXJ0ZWQsIHN0b3AgaXQgbm93LgorICAgICAgICAvLyBOb3RlIHRoYXQgc3RvcCgpIGlzIG5lZWRlZCBldmVuIGlmIHRoZSBzZXNzaW9uIGlzIGN1cnJlbnRseSBwYXVzZWQuIFRoaXMgaW5zdHJ1Y3RzCisgICAgICAgIC8vIHRoZSB0cmFuc2NvZGVyIHRvIGRpc2NhcmQgYW55IHN0YXRlcyBmb3IgdGhlIHNlc3Npb24sIG90aGVyd2lzZSB0aGUgc3RhdGVzIG1heQorICAgICAgICAvLyBuZXZlciBiZSBkaXNjYXJkZWQuCisgICAgICAgIGlmIChtU2Vzc2lvbk1hcFsqaXRdLnN0YXRlICE9IFNlc3Npb246Ok5PVF9TVEFSVEVEKSB7CisgICAgICAgICAgICBtVHJhbnNjb2Rlci0+c3RvcChpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBzZXNzaW9uLgorICAgICAgICByZW1vdmVTZXNzaW9uX2woKml0KTsKKyAgICB9CisKKyAgICAvLyBTdGFydCBuZXh0IHNlc3Npb24uCisgICAgdXBkYXRlQ3VycmVudFNlc3Npb25fbCgpOworCisgICAgdmFsaWRhdGVTdGF0ZV9sKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6Z2V0U2Vzc2lvbihDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCogcmVxdWVzdCkgeworICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICBpZiAobVNlc3Npb25NYXAuY291bnQoc2Vzc2lvbktleSkgPT0gMCkgeworICAgICAgICBBTE9HRSgic2Vzc2lvbiAlcyBkb2Vzbid0IGV4aXN0Iiwgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKihUcmFuc2NvZGluZ1JlcXVlc3QqKXJlcXVlc3QgPSBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5yZXF1ZXN0OworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6Om5vdGlmeUNsaWVudChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFNlc3Npb25LZXlUeXBlJik+IGZ1bmMpIHsKKyAgICBTZXNzaW9uS2V5VHlwZSBzZXNzaW9uS2V5ID0gc3RkOjptYWtlX3BhaXIoY2xpZW50SWQsIHNlc3Npb25JZCk7CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUxvY2t9OworCisgICAgaWYgKG1TZXNzaW9uTWFwLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBpZ25vcmluZyAlcyBmb3Igc2Vzc2lvbiAlcyB0aGF0IGRvZXNuJ3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIHJlYXNvbiwKKyAgICAgICAgICAgICAgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT25seSBpZ25vcmUgaWYgc2Vzc2lvbiB3YXMgbmV2ZXIgc3RhcnRlZC4gSW4gcGFydGljdWxhciwgcHJvcGFnYXRlIHRoZSBzdGF0dXMKKyAgICAvLyB0byBjbGllbnQgaWYgdGhlIHNlc3Npb24gaXMgcGF1c2VkLiBUcmFuc2NvZGVyIGNvdWxkIGhhdmUgcG9zdGVkIGZpbmlzaCB3aGVuCisgICAgLy8gd2UncmUgcGF1c2luZyBpdCwgYW5kIHRoZSBmaW5pc2ggYXJyaXZlZCBhZnRlciB3ZSBjaGFuZ2VkIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICBpZiAobVNlc3Npb25NYXBbc2Vzc2lvbktleV0uc3RhdGUgPT0gU2Vzc2lvbjo6Tk9UX1NUQVJURUQpIHsKKyAgICAgICAgQUxPR1coIiVzOiBpZ25vcmluZyAlcyBmb3Igc2Vzc2lvbiAlcyB0aGF0IHdhcyBuZXZlciBzdGFydGVkIiwgX19GVU5DVElPTl9fLCByZWFzb24sCisgICAgICAgICAgICAgIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCIlczogc2Vzc2lvbiAlcyAlcyIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCksIHJlYXNvbik7CisgICAgZnVuYyhzZXNzaW9uS2V5KTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvblN0YXJ0ZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIG5vdGlmeUNsaWVudChjbGllbnRJZCwgc2Vzc2lvbklkLCAic3RhcnRlZCIsIFs9XShjb25zdCBTZXNzaW9uS2V5VHlwZSYgc2Vzc2lvbktleSkgeworICAgICAgICBhdXRvIGNhbGxiYWNrID0gbVNlc3Npb25NYXBbc2Vzc2lvbktleV0uY2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uVHJhbnNjb2RpbmdTdGFydGVkKHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvblBhdXNlZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSB7CisgICAgbm90aWZ5Q2xpZW50KGNsaWVudElkLCBzZXNzaW9uSWQsICJwYXVzZWQiLCBbPV0oY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICAgICAgYXV0byBjYWxsYmFjayA9IG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLmNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vblRyYW5zY29kaW5nUGF1c2VkKHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvblJlc3VtZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIG5vdGlmeUNsaWVudChjbGllbnRJZCwgc2Vzc2lvbklkLCAicmVzdW1lZCIsIFs9XShjb25zdCBTZXNzaW9uS2V5VHlwZSYgc2Vzc2lvbktleSkgeworICAgICAgICBhdXRvIGNhbGxiYWNrID0gbVNlc3Npb25NYXBbc2Vzc2lvbktleV0uY2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uVHJhbnNjb2RpbmdSZXN1bWVkKHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvbkZpbmlzaChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSB7CisgICAgbm90aWZ5Q2xpZW50KGNsaWVudElkLCBzZXNzaW9uSWQsICJmaW5pc2giLCBbPV0oY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLmNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2stPm9uVHJhbnNjb2RpbmdGaW5pc2hlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwoe3Nlc3Npb25JZCwgLTEgLyphY3R1YWxCaXRyYXRlQnBzKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bGxvcHQgLypzZXNzaW9uU3RhdHMqL30pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgc2Vzc2lvbi4KKyAgICAgICAgcmVtb3ZlU2Vzc2lvbl9sKHNlc3Npb25LZXkpOworCisgICAgICAgIC8vIFN0YXJ0IG5leHQgc2Vzc2lvbi4KKyAgICAgICAgdXBkYXRlQ3VycmVudFNlc3Npb25fbCgpOworCisgICAgICAgIHZhbGlkYXRlU3RhdGVfbCgpOworICAgIH0pOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6Om9uRXJyb3IoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ0Vycm9yQ29kZSBlcnIpIHsKKyAgICBub3RpZnlDbGllbnQoY2xpZW50SWQsIHNlc3Npb25JZCwgImVycm9yIiwgWz1dKGNvbnN0IFNlc3Npb25LZXlUeXBlJiBzZXNzaW9uS2V5KSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gY2xpZW50Q2FsbGJhY2sgPSBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5jYWxsYmFjay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50Q2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrLT5vblRyYW5zY29kaW5nRmFpbGVkKHNlc3Npb25JZCwgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgc2Vzc2lvbi4KKyAgICAgICAgcmVtb3ZlU2Vzc2lvbl9sKHNlc3Npb25LZXkpOworCisgICAgICAgIC8vIFN0YXJ0IG5leHQgc2Vzc2lvbi4KKyAgICAgICAgdXBkYXRlQ3VycmVudFNlc3Npb25fbCgpOworCisgICAgICAgIHZhbGlkYXRlU3RhdGVfbCgpOworICAgIH0pOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6Om9uUHJvZ3Jlc3NVcGRhdGUoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2dyZXNzKSB7CisgICAgbm90aWZ5Q2xpZW50KGNsaWVudElkLCBzZXNzaW9uSWQsICJwcm9ncmVzcyIsIFs9XShjb25zdCBTZXNzaW9uS2V5VHlwZSYgc2Vzc2lvbktleSkgeworICAgICAgICBhdXRvIGNhbGxiYWNrID0gbVNlc3Npb25NYXBbc2Vzc2lvbktleV0uY2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uUHJvZ3Jlc3NVcGRhdGUoc2Vzc2lvbklkLCBwcm9ncmVzcyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb25NYXBbc2Vzc2lvbktleV0ubGFzdFByb2dyZXNzID0gcHJvZ3Jlc3M7CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6b25SZXNvdXJjZUxvc3QoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIEFMT0dJKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBub3RpZnlDbGllbnQoY2xpZW50SWQsIHNlc3Npb25JZCwgInJlc291cmNlX2xvc3QiLCBbPV0oY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICAgICAgaWYgKG1SZXNvdXJjZUxvc3QpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNlc3Npb24qIHJlc291cmNlTG9zdFNlc3Npb24gPSAmbVNlc3Npb25NYXBbc2Vzc2lvbktleV07CisgICAgICAgIGlmIChyZXNvdXJjZUxvc3RTZXNzaW9uLT5zdGF0ZSAhPSBTZXNzaW9uOjpSVU5OSU5HKSB7CisgICAgICAgICAgICBBTE9HVygic2Vzc2lvbiAlcyBsb3N0IHJlc291cmNlIGJ1dCBpcyBubyBsb25nZXIgcnVubmluZyIsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSByZWNlaXZlIGEgcmVzb3VyY2UgbG9zcyBldmVudCwgdGhlIHRyYW5zY29kZXIgYWxyZWFkeSBwYXVzZWQgdGhlIHRyYW5zY29kaW5nLAorICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhbGwgb25QYXVzZWQoKSB0byBwYXVzZSBpdC4gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBub3RpZnkKKyAgICAgICAgLy8gdGhlIGNsaWVudCBhbmQgdXBkYXRlIHRoZSBzZXNzaW9uIHN0YXRlIGhlcmUuCisgICAgICAgIHJlc291cmNlTG9zdFNlc3Npb24tPnN0YXRlID0gU2Vzc2lvbjo6UEFVU0VEOworICAgICAgICAvLyBOb3RpZnkgdGhlIGNsaWVudCBhcyBhIHBhdXNlZCBldmVudC4KKyAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IHJlc291cmNlTG9zdFNlc3Npb24tPmNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNsaWVudENhbGxiYWNrLT5vblRyYW5zY29kaW5nUGF1c2VkKHNlc3Npb25LZXkuc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBtUmVzb3VyY2VQb2xpY3ktPnNldFBpZFJlc291cmNlTG9zdChyZXNvdXJjZUxvc3RTZXNzaW9uLT5yZXF1ZXN0LmNsaWVudFBpZCk7CisgICAgICAgIG1SZXNvdXJjZUxvc3QgPSB0cnVlOworCisgICAgICAgIHZhbGlkYXRlU3RhdGVfbCgpOworICAgIH0pOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6Om9uVG9wVWlkc0NoYW5nZWQoY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiYgdWlkcykgeworICAgIGlmICh1aWRzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBpZ25vcmluZyBlbXB0eSB1aWRzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHVpZFN0cjsKKyAgICBmb3IgKGF1dG8gaXQgPSB1aWRzLmJlZ2luKCk7IGl0ICE9IHVpZHMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKCF1aWRTdHIuZW1wdHkoKSkgeworICAgICAgICAgICAgdWlkU3RyICs9ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgdWlkU3RyICs9IHN0ZDo6dG9fc3RyaW5nKCppdCk7CisgICAgfQorCisgICAgQUxPR0QoIiVzOiB0b3BVaWRzOiBzaXplICV6dSwgdWlkczogJXMiLCBfX0ZVTkNUSU9OX18sIHVpZHMuc2l6ZSgpLCB1aWRTdHIuY19zdHIoKSk7CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUxvY2t9OworCisgICAgbW92ZVVpZHNUb1RvcF9sKHVpZHMsIHRydWUgLypwcmVzZXJ2ZVRvcFVpZCovKTsKKworICAgIHVwZGF0ZUN1cnJlbnRTZXNzaW9uX2woKTsKKworICAgIHZhbGlkYXRlU3RhdGVfbCgpOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6Om9uUmVzb3VyY2VBdmFpbGFibGUoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIGlmICghbVJlc291cmNlTG9zdCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIG1SZXNvdXJjZUxvc3QgPSBmYWxzZTsKKyAgICB1cGRhdGVDdXJyZW50U2Vzc2lvbl9sKCk7CisKKyAgICB2YWxpZGF0ZVN0YXRlX2woKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjp2YWxpZGF0ZVN0YXRlX2woKSB7CisjaWZkZWYgVkFMSURBVEVfU1RBVEUKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1TZXNzaW9uUXVldWVzLmNvdW50KE9GRkxJTkVfVUlEKSAhPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1TZXNzaW9uUXVldWVzIG9mZmxpbmUgcXVldWUgbnVtYmVyIGlzIG5vdCAxIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRigqbU9mZmxpbmVVaWRJdGVyYXRvciAhPSBPRkZMSU5FX1VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtT2ZmbGluZVVpZEl0ZXJhdG9yIG5vdCBwb2ludGluZyB0byBvZmZsaW5lIHVpZCIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVVpZFNvcnRlZExpc3Quc2l6ZSgpICE9IG1TZXNzaW9uUXVldWVzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtVWlkTGlzdCBhbmQgbVNlc3Npb25RdWV1ZXMgc2l6ZSBtaXNtYXRjaCIpOworCisgICAgaW50MzJfdCB0b3RhbFNlc3Npb25zID0gMDsKKyAgICBmb3IgKGF1dG8gdWlkIDogbVVpZFNvcnRlZExpc3QpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2Vzc2lvblF1ZXVlcy5jb3VudCh1aWQpICE9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1TZXNzaW9uUXVldWVzIGNvdW50IGZvciB1aWQgJWQgaXMgbm90IDEiLCB1aWQpOworICAgICAgICBmb3IgKGF1dG8mIHNlc3Npb25LZXkgOiBtU2Vzc2lvblF1ZXVlc1t1aWRdKSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1TZXNzaW9uTWFwLmNvdW50KHNlc3Npb25LZXkpICE9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtU2Vzc2lvbnMgY291bnQgZm9yIHNlc3Npb24gJXMgaXMgbm90IDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uVG9TdHJpbmcoc2Vzc2lvbktleSkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICB0b3RhbFNlc3Npb25zICs9IG1TZXNzaW9uUXVldWVzW3VpZF0uc2l6ZSgpOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1TZXNzaW9uTWFwLnNpemUoKSAhPSB0b3RhbFNlc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1TZXNzaW9ucyBzaXplIGRvZXNuJ3QgbWF0Y2ggdG90YWwgc2Vzc2lvbnMgY291bnRlZCBmcm9tIHVpZCBxdWV1ZXMiKTsKKyNlbmRpZiAgLy8gVkFMSURBVEVfU1RBVEUKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdVaWRQb2xpY3kuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1VpZFBvbGljeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyNTM4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdVaWRQb2xpY3kuY3BwCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUcmFuc2NvZGluZ1VpZFBvbGljeSIKKworI2luY2x1ZGUgPGFuZHJvaWQvYWN0aXZpdHlfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1VpZFBvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgc3RhdGljIHVpZF90IE9GRkxJTkVfVUlEID0gLTE7Citjb25zdGV4cHIgc3RhdGljIGludDMyX3QgSU1QT1JUQU5DRV9VTktOT1dOID0gSU5UMzJfTUFYOworCitUcmFuc2NvZGluZ1VpZFBvbGljeTo6VHJhbnNjb2RpbmdVaWRQb2xpY3koKQorICAgICAgOiBtVWlkT2JzZXJ2ZXIobnVsbHB0ciksCisgICAgICAgIG1SZWdpc3RlcmVkKGZhbHNlKSwKKyAgICAgICAgbVRvcFVpZFN0YXRlKElNUE9SVEFOQ0VfVU5LTk9XTikgeworICAgIHJlZ2lzdGVyU2VsZigpOworfQorCitUcmFuc2NvZGluZ1VpZFBvbGljeTo6flRyYW5zY29kaW5nVWlkUG9saWN5KCkgeworICAgIHVucmVnaXN0ZXJTZWxmKCk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdVaWRQb2xpY3k6Ok9uVWlkSW1wb3J0YW5jZSh1aWRfdCB1aWQsIGludDMyX3QgdWlkSW1wb3J0YW5jZSwgdm9pZCogY29va2llKSB7CisgICAgVHJhbnNjb2RpbmdVaWRQb2xpY3kqIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxUcmFuc2NvZGluZ1VpZFBvbGljeSo+KGNvb2tpZSk7CisgICAgb3duZXItPm9uVWlkU3RhdGVDaGFuZ2VkKHVpZCwgdWlkSW1wb3J0YW5jZSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdVaWRQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBtVWlkT2JzZXJ2ZXIgPSBBQWN0aXZpdHlNYW5hZ2VyX2FkZFVpZEltcG9ydGFuY2VMaXN0ZW5lcigKKyAgICAgICAgICAgICZPblVpZEltcG9ydGFuY2UsIC0xLCAodm9pZCopdGhpcyk7CisKKyAgICBpZiAobVVpZE9ic2VydmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWdpc3RlciB1aWQgb2JzZXJ2ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgbVJlZ2lzdGVyZWQgPSB0cnVlOworICAgIEFMT0dJKCJSZWdpc3RlcmVkIHVpZCBvYnNlcnZlciIpOworfQorCit2b2lkIFRyYW5zY29kaW5nVWlkUG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKKyAgICBBQWN0aXZpdHlNYW5hZ2VyX3JlbW92ZVVpZEltcG9ydGFuY2VMaXN0ZW5lcihtVWlkT2JzZXJ2ZXIpOworICAgIG1VaWRPYnNlcnZlciA9IG51bGxwdHI7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgQUxPR0koIlVucmVnaXN0ZXJlZCB1aWQgb2JzZXJ2ZXIiKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6c2V0Q2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFVpZFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpIHsKKyAgICBtVWlkUG9saWN5Q2FsbGJhY2sgPSBjYjsKK30KKwordm9pZCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6cmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgaWYgKHVpZCA9PSBPRkZMSU5FX1VJRCkgeworICAgICAgICBBTE9HVygiSWdub3JpbmcgdGhlIG9mZmxpbmUgdWlkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1VaWRTdGF0ZU1hcC5maW5kKHVpZCkgIT0gbVVpZFN0YXRlTWFwLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIHJlZ2lzdGVyIHVpZDogJWQgd2hpY2ggaXMgYWxyZWFkeSBtb25pdG9yZWQhIiwgX19GVU5DVElPTl9fLCB1aWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBzdGF0ZSA9IElNUE9SVEFOQ0VfVU5LTk9XTjsKKyAgICBpZiAobVJlZ2lzdGVyZWQgJiYgQUFjdGl2aXR5TWFuYWdlcl9pc1VpZEFjdGl2ZSh1aWQpKSB7CisgICAgICAgIHN0YXRlID0gQUFjdGl2aXR5TWFuYWdlcl9nZXRVaWRJbXBvcnRhbmNlKHVpZCk7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBpbnNlcnRpbmcgbmV3IHVpZDogJXUsIHByb2NTdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgdWlkLCBzdGF0ZSk7CisKKyAgICBtVWlkU3RhdGVNYXAuZW1wbGFjZShzdGQ6OnBhaXI8dWlkX3QsIGludDMyX3Q+KHVpZCwgc3RhdGUpKTsKKyAgICBtU3RhdGVVaWRNYXBbc3RhdGVdLmluc2VydCh1aWQpOworCisgICAgdXBkYXRlVG9wVWlkX2woKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6dW5yZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKworICAgIGF1dG8gaXQgPSBtVWlkU3RhdGVNYXAuZmluZCh1aWQpOworICAgIGlmIChpdCA9PSBtVWlkU3RhdGVNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gdW5yZWdpc3RlciB1aWQ6ICVkIHdoaWNoIGlzIG5vdCBtb25pdG9yZWQhIiwgX19GVU5DVElPTl9fLCB1aWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBzdGF0ZUl0ID0gbVN0YXRlVWlkTWFwLmZpbmQoaXQtPnNlY29uZCk7CisgICAgaWYgKHN0YXRlSXQgIT0gbVN0YXRlVWlkTWFwLmVuZCgpKSB7CisgICAgICAgIHN0YXRlSXQtPnNlY29uZC5lcmFzZSh1aWQpOworICAgICAgICBpZiAoc3RhdGVJdC0+c2Vjb25kLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1TdGF0ZVVpZE1hcC5lcmFzZShzdGF0ZUl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtVWlkU3RhdGVNYXAuZXJhc2UoaXQpOworCisgICAgdXBkYXRlVG9wVWlkX2woKTsKK30KKworYm9vbCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6aXNVaWRPblRvcCh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworCisgICAgcmV0dXJuIG1Ub3BVaWRTdGF0ZSAhPSBJTVBPUlRBTkNFX1VOS05PV04gJiYKKyAgICAgICAgICAgbVRvcFVpZFN0YXRlID09IGdldFByb2NTdGF0ZV9sKHVpZCk7Cit9CisKK3N0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gVHJhbnNjb2RpbmdVaWRQb2xpY3k6OmdldFRvcFVpZHMoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKworICAgIGlmIChtVG9wVWlkU3RhdGUgPT0gSU1QT1JUQU5DRV9VTktOT1dOKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+KCk7CisgICAgfQorCisgICAgcmV0dXJuIG1TdGF0ZVVpZE1hcC5hdChtVG9wVWlkU3RhdGUpOworfQorCit2b2lkIFRyYW5zY29kaW5nVWlkUG9saWN5OjpvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlKSB7CisgICAgQUxPR1YoIm9uVWlkU3RhdGVDaGFuZ2VkOiAldSwgcHJvY1N0YXRlICVkIiwgdWlkLCBwcm9jU3RhdGUpOworCisgICAgYm9vbCB0b3BVaWRTZXRDaGFuZ2VkID0gZmFsc2U7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiB0b3BVaWRzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICAgICAgYXV0byBpdCA9IG1VaWRTdGF0ZU1hcC5maW5kKHVpZCk7CisgICAgICAgIGlmIChpdCAhPSBtVWlkU3RhdGVNYXAuZW5kKCkgJiYgaXQtPnNlY29uZCAhPSBwcm9jU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIFRvcCBzZXQgY2hhbmdlZCBpZiAxKSB0aGUgdWlkIGlzIGluIHRoZSBjdXJyZW50IHRvcCB1aWQgc2V0LCBvciAyKSB0aGUKKyAgICAgICAgICAgIC8vIG5ldyBwcm9jU3RhdGUgaXMgYXQgbGVhc3QgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhlIGN1cnJlbnQgdG9wIHVpZCBzdGF0ZS4KKyAgICAgICAgICAgIGJvb2wgaXNVaWRDdXJyZW50VG9wID0KKyAgICAgICAgICAgICAgICAgICAgbVRvcFVpZFN0YXRlICE9IElNUE9SVEFOQ0VfVU5LTk9XTiAmJgorICAgICAgICAgICAgICAgICAgICBtU3RhdGVVaWRNYXBbbVRvcFVpZFN0YXRlXS5jb3VudCh1aWQpID4gMDsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdTdGF0ZUhpZ2hlclRoYW5Ub3AgPQorICAgICAgICAgICAgICAgICAgICBwcm9jU3RhdGUgIT0gSU1QT1JUQU5DRV9VTktOT1dOICYmCisgICAgICAgICAgICAgICAgICAgIChwcm9jU3RhdGUgPD0gbVRvcFVpZFN0YXRlIHx8CisgICAgICAgICAgICAgICAgICAgICBtVG9wVWlkU3RhdGUgPT0gSU1QT1JUQU5DRV9VTktOT1dOKTsKKyAgICAgICAgICAgIHRvcFVpZFNldENoYW5nZWQgPSAoaXNVaWRDdXJyZW50VG9wIHx8IGlzTmV3U3RhdGVIaWdoZXJUaGFuVG9wKTsKKworICAgICAgICAgICAgLy8gTW92ZSB1aWQgdG8gdGhlIG5ldyBwcm9jU3RhdGUuCisgICAgICAgICAgICBtU3RhdGVVaWRNYXBbaXQtPnNlY29uZF0uZXJhc2UodWlkKTsKKyAgICAgICAgICAgIG1TdGF0ZVVpZE1hcFtwcm9jU3RhdGVdLmluc2VydCh1aWQpOworICAgICAgICAgICAgaXQtPnNlY29uZCA9IHByb2NTdGF0ZTsKKworICAgICAgICAgICAgaWYgKHRvcFVpZFNldENoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVUb3BVaWRfbCgpOworCisgICAgICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIHVpZCBzZXQgZm9yIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgIHRvcFVpZHMgPSBtU3RhdGVVaWRNYXBbbVRvcFVpZFN0YXRlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJ0b3BVaWRTZXRDaGFuZ2VkOiAlZCIsIHRvcFVpZFNldENoYW5nZWQpOworCisgICAgaWYgKHRvcFVpZFNldENoYW5nZWQpIHsKKyAgICAgICAgYXV0byBjYWxsYmFjayA9IG1VaWRQb2xpY3lDYWxsYmFjay5sb2NrKCk7CisgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjYWxsYmFjay0+b25Ub3BVaWRzQ2hhbmdlZCh0b3BVaWRzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6dXBkYXRlVG9wVWlkX2woKSB7CisgICAgbVRvcFVpZFN0YXRlID0gSU1QT1JUQU5DRV9VTktOT1dOOworCisgICAgLy8gRmluZCB0aGUgbG93ZXN0IHVpZCBzdGF0ZSAoaWdub3JpbmcgUFJPQ0VTU19TVEFURV9VTktOT1dOKSB3aXRoIHNvbWUgbW9uaXRvcmVkIHVpZHMuCisgICAgZm9yIChhdXRvIHN0YXRlSXQgPSBtU3RhdGVVaWRNYXAuYmVnaW4oKTsgc3RhdGVJdCAhPSBtU3RhdGVVaWRNYXAuZW5kKCk7IHN0YXRlSXQrKykgeworICAgICAgICBpZiAoc3RhdGVJdC0+Zmlyc3QgIT0gSU1QT1JUQU5DRV9VTktOT1dOICYmCisgICAgICAgICAgICAhc3RhdGVJdC0+c2Vjb25kLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Ub3BVaWRTdGF0ZSA9IHN0YXRlSXQtPmZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiJXM6IHRvcCB1aWQgc3RhdGUgaXMgJWQiLCBfX0ZVTkNUSU9OX18sIG1Ub3BVaWRTdGF0ZSk7Cit9CisKK2ludDMyX3QgVHJhbnNjb2RpbmdVaWRQb2xpY3k6OmdldFByb2NTdGF0ZV9sKHVpZF90IHVpZCkgeworICAgIGF1dG8gaXQgPSBtVWlkU3RhdGVNYXAuZmluZCh1aWQpOworICAgIGlmIChpdCAhPSBtVWlkU3RhdGVNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBJTVBPUlRBTkNFX1VOS05PV047Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVRyYW5zY29kaW5nU2VydmljZS5haWRsCmluZGV4IDA3YjZjMWEuLmFkMjM1OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVRyYW5zY29kaW5nU2VydmljZS5haWRsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVRyYW5zY29kaW5nU2VydmljZS5haWRsCkBAIC0xNiw5ICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nSm9iUGFyY2VsOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSVRyYW5zY29kaW5nQ2xpZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuSVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50OwogCiAvKioKICAqIEJpbmRlciBpbnRlcmZhY2UgZm9yIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgpAQCAtNDgsNjQgKzQ5LDI1IEBACiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KICAgICAgKgotICAgICAqIENsaWVudCBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciBpdHNlbGYgd2l0aCB0aGUgc2VydmljZSBpbiBvcmRlciB0byBwZXJmb3JtCi0gICAgICogdHJhbnNjb2RpbmcuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSB1bmlxdWUgcG9zaXRpdmUgSWQgYXNzaWduZWQgYnkgdGhlIHNlcnZpY2UuCi0gICAgICogQ2xpZW50IHNob3VsZCBzYXZlIHRoaXMgSWQgYW5kIHVzZSBpdCBmb3IgYWxsIHRoZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBzZXJ2aWNlLgorICAgICAqIENsaWVudCBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciBpdHNlbGYgd2l0aCB0aGUgc2VydmljZSBpbgorICAgICAqIG9yZGVyIHRvIHBlcmZvcm0gdHJhbnNjb2RpbmcgdGFza3MuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4KKyAgICAgKiBJVHJhbnNjb2RpbmdDbGllbnQgaW50ZXJmYWNlIG9iamVjdC4gVGhlIGNsaWVudCBzaG91bGQgc2F2ZSBhbmQgdXNlIGl0CisgICAgICogZm9yIGFsbCBmdXR1cmUgdHJhbnNhY3Rpb25zIHdpdGggdGhlIHNlcnZpY2UuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gY2xpZW50IGludGVyZmFjZSBmb3IgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHRvIGNhbGwgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgY2xpZW50IGludGVyZmFjZSBmb3IgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHRvIGNhbGwKKyAgICAgKiAgICAgICAgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gY2xpZW50TmFtZSBuYW1lIG9mIHRoZSBjbGllbnQuCiAgICAgICogQHBhcmFtIG9wUGFja2FnZU5hbWUgb3AgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGllbnQuCi0gICAgICogQHBhcmFtIGNsaWVudFVpZCB1c2VyIGlkIG9mIHRoZSBjbGllbnQuCi0gICAgICogQHBhcmFtIGNsaWVudFBpZCBwcm9jZXNzIGlkIG9mIHRoZSBjbGllbnQuCi0gICAgICogQHJldHVybiBhIHVuaXF1ZSBwb3NpdGl2ZSBJZCBhc3NpZ25lZCB0byB0aGUgY2xpZW50IGJ5IHRoZSBzZXJ2aWNlLCAtMSAgbWVhbnMgZmFpbGVkIHRvCi0gICAgICogcmVnaXN0ZXIuCisgICAgICogQHJldHVybiBhbiBJVHJhbnNjb2RpbmdDbGllbnQgaW50ZXJmYWNlIG9iamVjdCwgd2l0aCBudWxscHRyIGluZGljYXRpbmcKKyAgICAgKiAgICAgICAgIGZhaWx1cmUgdG8gcmVnaXN0ZXIuCiAgICAgICovCi0gICAgaW50IHJlZ2lzdGVyQ2xpZW50KGluIElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpbiBTdHJpbmcgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IGNsaWVudFBpZCk7Ci0KLSAgICAvKioKLSAgICAqIFVucmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KLSAgICAqCi0gICAgKiBDbGllbnQgd2lsbCBub3QgYmUgYWJsZSB0byBwZXJmb3JtIGFueSBtb3JlIHRyYW5zY29kaW5nIGFmdGVyIHVucmVnaXN0ZXIuCi0gICAgKgotICAgICogQHBhcmFtIGNsaWVudElkIGFzc2lnbmVkIElkIG9mIHRoZSBjbGllbnQuCi0gICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VlZHMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAqLwotICAgIGJvb2xlYW4gdW5yZWdpc3RlckNsaWVudChpbiBpbnQgY2xpZW50SWQpOworICAgIElUcmFuc2NvZGluZ0NsaWVudCByZWdpc3RlckNsaWVudCgKKyAgICAgICAgICAgIGluIElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgaW4gU3RyaW5nIGNsaWVudE5hbWUsCisgICAgICAgICAgICBpbiBTdHJpbmcgb3BQYWNrYWdlTmFtZSk7CiAKICAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjbGllbnRzLiBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZy4KICAgICAqLwogICAgIGludCBnZXROdW1PZkNsaWVudHMoKTsKLQotICAgIC8qKgotICAgICAqIFN1Ym1pdHMgYSB0cmFuc2NvZGluZyByZXF1ZXN0IHRvIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudElkIGFzc2lnbmVkIElkIG9mIHRoZSBjbGllbnQuCi0gICAgICogQHBhcmFtIHJlcXVlc3QgYSBUcmFuc2NvZGluZ1JlcXVlc3QgY29udGFpbnMgdHJhbnNjb2RpbmcgY29uZmlndXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gam9iKG91dHB1dCB2YXJpYWJsZSkgYSBUcmFuc2NvZGluZ0pvYiBnZW5lcmF0ZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgotICAgICAqIEByZXR1cm4gYSB1bmlxdWUgcG9zaXRpdmUgam9iSWQgZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSwgLTEgbWVhbnMgZmFpbHVyZS4KLSAgICAgKi8KLSAgICBpbnQgc3VibWl0UmVxdWVzdChpbiBpbnQgY2xpZW50SWQsCi0gICAgICAgICAgICAgICAgICAgICAgaW4gVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0IFRyYW5zY29kaW5nSm9iUGFyY2VsIGpvYik7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGEgdHJhbnNjb2Rpbmcgam9iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudElkIGFzc2lnbmVkIGlkIG9mIHRoZSBjbGllbnQuCi0gICAgICogQHBhcmFtIGpvYklkIGEgVHJhbnNjb2RpbmdKb2IgZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VlZHMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGNhbmNlbEpvYihpbiBpbnQgY2xpZW50SWQsIGluIGludCBqb2JJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSBqb2IgZGV0YWlsIGFzc29jaWF0ZWQgd2l0aCBhIGpvYklkLgotICAgICAqCi0gICAgICogQHBhcmFtIGpvYklkIGEgVHJhbnNjb2RpbmdKb2IgZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KLSAgICAgKiBAcGFyYW0gam9iKG91dHB1dCB2YXJpYWJsZSkgdGhlIFRyYW5zY29kaW5nSm9iIGFzc29jaWF0ZWQgd2l0aCB0aGUgam9iSWQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBnZXRKb2JXaXRoSWQoaW4gaW50IGpvYklkLCBvdXQgVHJhbnNjb2RpbmdKb2JQYXJjZWwgam9iKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudC5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxZTNkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudC5haWRsCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWw7CisKKy8qKgorICogSVRyYW5zY29kaW5nQ2xpZW50CisgKgorICogSW50ZXJmYWNlIGZvciBhIGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElUcmFuc2NvZGluZ0NsaWVudCB7CisgICAgLyoqCisgICAgICogU3VibWl0cyBhIHRyYW5zY29kaW5nIHJlcXVlc3QgdG8gTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBhIFRyYW5zY29kaW5nUmVxdWVzdCBjb250YWlucyB0cmFuc2NvZGluZyBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBzZXNzaW9uKG91dHB1dCB2YXJpYWJsZSkgYSBUcmFuc2NvZGluZ1Nlc3Npb24gZ2VuZXJhdGVkIGJ5IE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBzdWJtaXRSZXF1ZXN0KGluIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsIHNlc3Npb24pOworCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhIHRyYW5zY29kaW5nIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIGEgVHJhbnNjb2RpbmdTZXNzaW9uIGdlbmVyYXRlZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBjYW5jZWxTZXNzaW9uKGluIGludCBzZXNzaW9uSWQpOworCisgICAgLyoqCisgICAgICogUXVlcmllcyB0aGUgc2Vzc2lvbiBkZXRhaWwgYXNzb2NpYXRlZCB3aXRoIGEgc2Vzc2lvbklkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25JZCBhIFRyYW5zY29kaW5nU2Vzc2lvbiBnZW5lcmF0ZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorICAgICAqIEBwYXJhbSBzZXNzaW9uKG91dHB1dCB2YXJpYWJsZSkgdGhlIFRyYW5zY29kaW5nU2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb25JZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VlZHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGdldFNlc3Npb25XaXRoSWQoaW4gaW50IHNlc3Npb25JZCwgb3V0IFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCBzZXNzaW9uKTsKKworICAgIC8qKgorICAgICogVW5yZWdpc3RlciB0aGUgY2xpZW50IHdpdGggdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorICAgICoKKyAgICAqIENsaWVudCB3aWxsIG5vdCBiZSBhYmxlIHRvIHBlcmZvcm0gYW55IG1vcmUgdHJhbnNjb2RpbmcgYWZ0ZXIgdW5yZWdpc3Rlci4KKyAgICAqLworICAgIHZvaWQgdW5yZWdpc3RlcigpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2suYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkOWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ0Vycm9yQ29kZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nUmVzdWx0UGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CisKKy8qKgorICogSVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2sKKyAqCisgKiBJbnRlcmZhY2UgZm9yIHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjbGllbnQuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2sgeworICAgIC8qKgorICAgICogQ2FsbGVkIHRvIG9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgVVJJCisgICAgKgorICAgICogQHBhcmFtIGZpbGVVcmkgVGhlIHBhdGggb2YgdGhlIGZpbGVuYW1lLgorICAgICogQHBhcmFtIG1vZGUgVGhlIGZpbGUgbW9kZSB0byB1c2UuIE11c3QgYmUgb25lIG9mICgiciwgInciLCAicnciKQorICAgICogQHJldHVybiBQYXJjZWxGaWxlRGVzY3JpcHRvciBpZiBvcGVuIHRoZSBmaWxlIHN1Y2Nlc3NmdWxseSwgbnVsbCBvdGhlcndpc2UuCisgICAgKi8KKyAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZURlc2NyaXB0b3IoaW4gQHV0ZjhJbkNwcCBTdHJpbmcgZmlsZVVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQHV0ZjhJbkNwcCBTdHJpbmcgbW9kZSk7CisKKyAgICAvKioKKyAgICAqIENhbGxlZCB3aGVuIHRoZSB0cmFuc2NvZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb25JZCBmaW5pc2hlZC4KKyAgICAqIFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBjbGllbnQgcmVxdWVzdCB0byBnZXQgYWxsIHRoZSBzdGF0dXMgb2YgdGhlIHNlc3Npb24uCisgICAgKgorICAgICogQHBhcmFtIHNlc3Npb25JZCBzZXNzaW9uSWQgYXNzaWduZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIHJlcXVlc3QuCisgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvblRyYW5zY29kaW5nU3RhcnRlZChpbiBpbnQgc2Vzc2lvbklkKTsKKworICAgIC8qKgorICAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYW5zY29kaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbklkIGlzIHBhdXNlZC4KKyAgICAqIFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBjbGllbnQgcmVxdWVzdCB0byBnZXQgYWxsIHRoZSBzdGF0dXMgb2YgdGhlIHNlc3Npb24uCisgICAgKgorICAgICogQHBhcmFtIHNlc3Npb25JZCBzZXNzaW9uSWQgYXNzaWduZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIHJlcXVlc3QuCisgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvblRyYW5zY29kaW5nUGF1c2VkKGluIGludCBzZXNzaW9uSWQpOworCisgICAgLyoqCisgICAgKiBDYWxsZWQgd2hlbiB0aGUgdHJhbnNjb2RpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uSWQgaXMgcmVzdW1lZC4KKyAgICAqIFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBjbGllbnQgcmVxdWVzdCB0byBnZXQgYWxsIHRoZSBzdGF0dXMgb2YgdGhlIHNlc3Npb24uCisgICAgKgorICAgICogQHBhcmFtIHNlc3Npb25JZCBzZXNzaW9uSWQgYXNzaWduZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIHJlcXVlc3QuCisgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvblRyYW5zY29kaW5nUmVzdW1lZChpbiBpbnQgc2Vzc2lvbklkKTsKKworICAgIC8qKgorICAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYW5zY29kaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbklkIGZpbmlzaGVkLgorICAgICoKKyAgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgorICAgICogQHBhcmFtIHJlc3VsdCBjb250YWlucyB0aGUgdHJhbnNjb2RlZCBmaWxlIHN0YXRzIGFuZCBvdGhlciB0cmFuc2NvZGluZyBtZXRyaWNzIGlmIHJlcXVlc3RlZC4KKyAgICAqLworICAgIG9uZXdheSB2b2lkIG9uVHJhbnNjb2RpbmdGaW5pc2hlZChpbiBpbnQgc2Vzc2lvbklkLCBpbiBUcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbCByZXN1bHQpOworCisgICAgLyoqCisgICAgKiBDYWxsZWQgd2hlbiB0aGUgdHJhbnNjb2RpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uSWQgZmFpbGVkLgorICAgICoKKyAgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgorICAgICogQHBhcmFtIGVycm9yQ29kZSBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBlcnJvci4KKyAgICAqLworICAgIG9uZXdheSB2b2lkIG9uVHJhbnNjb2RpbmdGYWlsZWQoaW4gaW50IHNlc3Npb25JZCwgaW4gVHJhbnNjb2RpbmdFcnJvckNvZGUgZXJyb3JDb2RlKTsKKworICAgIC8qKgorICAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYW5zY29kaW5nIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uSWQgZ2V0cyB1cGRhdGVkLCBpLmUuIHdhaXQKKyAgICAqIG51bWJlciBpbiB0aGUgc2Vzc2lvbiBxdWV1ZS4KKyAgICAqCisgICAgKiA8cD4gVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIGNsaWVudCBzZXQgcmVxdWVzdFVwZGF0ZSB0byBiZSB0cnVlIGluIHRoZSBUcmFuc2NvZGluZ1JlcXVlc3QKKyAgICAqIHN1Ym1pdHRlZCB0byB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCisgICAgKgorICAgICogQHBhcmFtIHNlc3Npb25JZCBzZXNzaW9uSWQgYXNzaWduZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIHJlcXVlc3QuCisgICAgKiBAcGFyYW0gb2xkQXdhaXROdW1iZXIgcHJldmlvdXMgbnVtYmVyIG9mIHNlc3Npb25zIGFoZWFkIG9mIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICAqIEBwYXJhbSBuZXdBd2FpdE51bWJlciB1cGRhdGVkIG51bWJlciBvZiBzZXNzaW9ucyBhaGVhZCBvZiBjdXJyZW50IHNlc3Npb24uCisgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvbkF3YWl0TnVtYmVyT2ZTZXNzaW9uc0NoYW5nZWQoaW4gaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgb2xkQXdhaXROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IG5ld0F3YWl0TnVtYmVyKTsKKworICAgIC8qKgorICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gdXBkYXRlIG9uIHRoZSBwcm9ncmVzcyBvZiB0aGUgVHJhbnNjb2RpbmdTZXNzaW9uLgorICAgICoKKyAgICAqIDxwPiBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY2xpZW50IHNldCByZXF1ZXN0VXBkYXRlIHRvIGJlIHRydWUgaW4gdGhlIFRyYW5zY29kaW5nUmVxdWVzdAorICAgICogc3VibWl0dGVkIHRvIHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKyAgICAqCisgICAgKiBAcGFyYW0gc2Vzc2lvbklkIHNlc3Npb25JZCBhc3NpZ25lZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdXBvbiByZWNlaXZpbmcgcmVxdWVzdC4KKyAgICAqIEBwYXJhbSBwcm9ncmVzcyBhbiBpbnRlZ2VyIG51bWJlciByYW5naW5nIGZyb20gMCB+IDEwMCBpbmNsdXNpdmUuCisgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvblByb2dyZXNzVXBkYXRlKGluIGludCBzZXNzaW9uSWQsIGluIGludCBwcm9ncmVzcyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50LmFpZGwgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2M4MzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nU2VydmljZUNsaWVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nRXJyb3JDb2RlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdKb2JQYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbDsKLQotLyoqCi0gKiBJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50IGludGVyZmFjZSBmb3IgdGhlIE1lZGlhVHJhbnNjb2RpbmdlcnZpY2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKLSAqIGNsaWVudC4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLS8vVE9ETyhoa3VhbmcpOiBJbXBsZW1lbnQgdGhlIGludGVyZmFjZS4KLWludGVyZmFjZSBJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50IHsKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBAdXRmOEluQ3BwIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAqIENhbGxlZCB3aGVuIHRoZSB0cmFuc2NvZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGpvYklkIGZpbmlzaGVkLgotICAgICoKLSAgICAqIEBwYXJhbSBqb2JJZCBqb2JJZCBhc3NpZ25lZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdXBvbiByZWNlaXZpbmcgcmVxdWVzdC4KLSAgICAqIEBwYXJhbSByZXN1bHQgY29udGFpbnMgdGhlIHRyYW5zY29kZWQgZmlsZSBzdGF0cyBhbmQgb3RoZXIgdHJhbnNjb2RpbmcgbWV0cmljcyBpZiByZXF1ZXN0ZWQuCi0gICAgKi8KLSAgICBvbmV3YXkgdm9pZCBvblRyYW5zY29kaW5nRmluaXNoZWQoaW4gaW50IGpvYklkLCBpbiBUcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbCByZXN1bHQpOwotCi0gICAgLyoqCi0gICAgKiBDYWxsZWQgd2hlbiB0aGUgdHJhbnNjb2RpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBqb2JJZCBmYWlsZWQuCi0gICAgKgotICAgICogQHBhcmFtIGpvYklkIGpvYklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgotICAgICogQHBhcmFtIGVycm9yQ29kZSBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBlcnJvci4KLSAgICAqLwotICAgIG9uZXdheSB2b2lkIG9uVHJhbnNjb2RpbmdGYWlsZWQoaW4gaW50IGpvYklkLCBpbiBUcmFuc2NvZGluZ0Vycm9yQ29kZSBlcnJvckNvZGUpOwotCi0gICAgLyoqCi0gICAgKiBDYWxsZWQgd2hlbiB0aGUgdHJhbnNjb2RpbmcgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGpvYklkIGdldHMgdXBkYXRlZCwgaS5lLiB3YWl0Ci0gICAgKiBudW1iZXIgaW4gdGhlIGpvYiBxdWV1ZS4KLSAgICAqCi0gICAgKiA8cD4gVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIGNsaWVudCBzZXQgcmVxdWVzdFVwZGF0ZSB0byBiZSB0cnVlIGluIHRoZSBUcmFuc2NvZGluZ1JlcXVlc3QKLSAgICAqIHN1Ym1pdHRlZCB0byB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCi0gICAgKgotICAgICogQHBhcmFtIGpvYklkIGpvYklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgotICAgICogQHBhcmFtIG9sZEF3YWl0TnVtYmVyIHByZXZpb3VzIG51bWJlciBvZiBqb2JzIGFoZWFkIG9mIGN1cnJlbnQgam9iLgotICAgICogQHBhcmFtIG5ld0F3YWl0TnVtYmVyIHVwZGF0ZWQgbnVtYmVyIG9mIGpvYnMgYWhlYWQgb2YgY3VycmVudCBqb2IuCi0gICAgKi8KLSAgICBvbmV3YXkgdm9pZCBvbkF3YWl0TnVtYmVyT2ZKb2JzQ2hhbmdlZChpbiBpbnQgam9iSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IG9sZEF3YWl0TnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBuZXdBd2FpdE51bWJlcik7Ci0KLSAgICAvKioKLSAgICAqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIHVwZGF0ZSBvbiB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIFRyYW5zY29kaW5nSm9iLgotICAgICoKLSAgICAqIDxwPiBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY2xpZW50IHNldCByZXF1ZXN0VXBkYXRlIHRvIGJlIHRydWUgaW4gdGhlIFRyYW5zY29kaW5nUmVxdWVzdAotICAgICogc3VibWl0dGVkIHRvIHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KLSAgICAqCi0gICAgKiBAcGFyYW0gam9iSWQgam9iSWQgYXNzaWduZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIHJlcXVlc3QuCi0gICAgKiBAcGFyYW0gcHJvZ3Jlc3MgYW4gaW50ZWdlciBudW1iZXIgcmFuZ2luZyBmcm9tIDAgfiAxMDAgaW5jbHVzaXZlLgotICAgICovCi0gICAgb25ld2F5IHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShpbiBpbnQgam9iSWQsIGluIGludCBwcm9ncmVzcyk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0Vycm9yQ29kZS5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdFcnJvckNvZGUuYWlkbAppbmRleCA3ZjQ3ZmRjLi5iMDQ0ZDQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0Vycm9yQ29kZS5haWRsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nRXJyb3JDb2RlLmFpZGwKQEAgLTIzLDExICsyMywxMiBAQAogICovCiBAQmFja2luZyh0eXBlID0gImludCIpCiBlbnVtIFRyYW5zY29kaW5nRXJyb3JDb2RlIHsKLSAgICBrVW5rbm93biA9IDAsCi0gICAga1Vuc3VwcG9ydGVkID0gMSwKLSAgICBrRGVjb2RlckVycm9yID0gMiwKLSAgICBrRW5jb2RlckVycm9yID0gMywKLSAgICBrRXh0cmFjdG9yRXJyb3IgPSA0LAotICAgIGtNdXhlckVycm9yID0gNSwKLSAgICBrSW52YWxpZEJpdHN0cmVhbSA9IDYKKyAgICBrTm9FcnJvciA9IDAsCisgICAga1Vua25vd24gPSAxLAorICAgIGtNYWxmb3JtZWQgPSAyLAorICAgIGtVbnN1cHBvcnRlZCA9IDMsCisgICAga0ludmFsaWRQYXJhbWV0ZXIgPSA0LAorICAgIGtJbnZhbGlkT3BlcmF0aW9uID0gNSwKKyAgICBrRXJyb3JJTyA9IDYsCisgICAga0luc3VmZmljaWVudFJlc291cmNlcyA9IDcsCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdKb2JQYXJjZWwuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nSm9iUGFyY2VsLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTJjMzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdKb2JQYXJjZWwuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbDsKLQotLyoqCi0gKiBUcmFuc2NvZGluZ0pvYiBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIGEgVHJhbnNjb2RpbmdSZXF1ZXN0LgotICogSXQgY29udGFpbnMgYWxsIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIGZvciB0aGUKLSAqIFRyYW5zY29kaW5nUmVxdWVzdC4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLS8vVE9ETyhoa3VhbmcpOiBJbXBsZW1lbnQgdGhlIHBhcmNlbGFibGUuCi1wYXJjZWxhYmxlIFRyYW5zY29kaW5nSm9iUGFyY2VsIHsKLSAgICAvKioKLSAgICAgKiBBIHVuaXF1ZSBwb3NpdGl2ZSBJZCBnZW5lcmF0ZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgotICAgICAqLwotICAgIGludCBqb2JJZDsKLQotICAgIC8qKgotICAgICAqIFRoZSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgVHJhbnNjb2RpbmdKb2IuCi0gICAgICovCi0gICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHJlcXVlc3Q7Ci0KLSAgICAvKioKLSAgICAqIEN1cnJlbnQgbnVtYmVyIG9mIGpvYnMgYWhlYWQgb2YgdGhpcyBqb2IuIFRoZSBzZXJ2aWNlIHNjaGVkdWxlcyB0aGUgam9iIGJhc2VkIG9uIHRoZSBwcmlvcml0eQotICAgICogcGFzc2VkIGZyb20gdGhlIGNsaWVudC4gQ2xpZW50IGNvdWxkIHNwZWNpZnkgd2hldGhlciB0byByZWNlaXZlIHVwZGF0ZXMgd2hlbiB0aGUKLSAgICAqIGF3YWl0TnVtYmVyT2ZKb2JzIGNoYW5nZXMgdGhyb3VnaCBzZXR0aW5nIHJlcXVlc3RQcm9ncmVzc1VwZGF0ZSBpbiB0aGUgVHJhbnNjb2RpbmdSZXF1ZXN0LgotICAgICovCi0gICAgaW50IGF3YWl0TnVtYmVyT2ZKb2JzOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdKb2JQcmlvcml0eS5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdKb2JQcmlvcml0eS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVkODFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nSm9iUHJpb3JpdHkuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICogUHJpb3JpdHkgb2YgYSB0cmFuc2NvZGluZyBqb2IuCi0gKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBUcmFuc2NvZGluZ0pvYlByaW9yaXR5IHsKLSAgICAvLyBUT0RPKGhrdWFuZyk6IGRlZmluZSB3aGF0IGVhY2ggcHJpb3JpdHkgbGV2ZWwgYWN0dWFsbHkgbWVhbi4KLSAgICBrVW5zcGVjaWZpZWQgPSAwLAotICAgIGtMb3cgPSAxLAotICAgIC8qKgotICAgICAqIDIgfiAyMCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLSAgICAgKi8KLSAgICBrTm9ybWFsID0gMjEsCi0gICAgLyoqCi0gICAgICogMjIgfiAzMCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLSAgICAgKi8KLSAgICBrSGlnaCA9IDMxLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLmFpZGwKaW5kZXggN2I3OTg2ZC4uNGIxOWY2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLmFpZGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLmFpZGwKQEAgLTE2LDggKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdKb2JQcmlvcml0eTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdUZXN0Q29uZmlnOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0OwogCiAvKioKICAqIFRyYW5zY29kaW5nUmVxdWVzdCBjb250YWlucyB0aGUgZGVzaXJlZCBjb25maWd1cmF0aW9uIGZvciB0aGUgdHJhbnNjb2RpbmcuCkBAIC0yNyw5ICsyOSwzMyBAQAogLy9UT0RPKGhrdWFuZyk6IEltcGxlbWVudCB0aGUgcGFyY2VsYWJsZS4KIHBhcmNlbGFibGUgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHsKICAgICAvKioKLSAgICAgKiBOYW1lIG9mIGZpbGUgdG8gYmUgdHJhbnNjb2RlZC4KKyAgICAgKiBUaGUgYWJzb2x1dGUgZmlsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZS4KICAgICAgKi8KLSAgICBAdXRmOEluQ3BwIFN0cmluZyBmaWxlTmFtZTsKKyAgICBAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VGaWxlUGF0aDsKKworICAgIC8qKgorICAgICAqIFRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggb2YgdGhlIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICovCisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgZGVzdGluYXRpb25GaWxlUGF0aDsKKworICAgIC8qKgorICAgICAqIFRoZSBVSUQgb2YgdGhlIGNsaWVudCB0aGF0IHRoaXMgdHJhbnNjb2RpbmcgcmVxdWVzdCBpcyBmb3IuIE9ubHkgcHJpdmlsZWdlZCBjYWxsZXIgY291bGQKKyAgICAgKiBzZXQgdGhpcyBVaWQgYXMgb25seSB0aGV5IGNvdWxkIGRvIHRoZSB0cmFuc2NvZGluZyBvbiBiZWhhbGYgb2YgdGhlIGNsaWVudC4KKyAgICAgKiAtMSBtZWFucyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIGludCBjbGllbnRVaWQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBQSUQgb2YgdGhlIGNsaWVudCB0aGF0IHRoaXMgdHJhbnNjb2RpbmcgcmVxdWVzdCBpcyBmb3IuIE9ubHkgcHJpdmlsZWdlZCBjYWxsZXIgY291bGQKKyAgICAgKiBzZXQgdGhpcyBVaWQgYXMgb25seSB0aGV5IGNvdWxkIGRvIHRoZSB0cmFuc2NvZGluZyBvbiBiZWhhbGYgb2YgdGhlIGNsaWVudC4KKyAgICAgKiAtMSBtZWFucyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIGludCBjbGllbnRQaWQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsaWVudCB3aG9tIHRoaXMgdHJhbnNjb2RpbmcgcmVxdWVzdCBpcyBmb3IuCisgICAgICovCisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgY2xpZW50UGFja2FnZU5hbWU7CiAKICAgICAvKioKICAgICAgKiBUeXBlIG9mIHRoZSB0cmFuc2NvZGluZy4KQEAgLTM3LDIyICs2Myw0NCBAQAogICAgIFRyYW5zY29kaW5nVHlwZSB0cmFuc2NvZGluZ1R5cGU7CiAKICAgICAvKioKLSAgICAgKiBJbnB1dCBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqIFJlcXVlc3RlZCB2aWRlbyB0cmFjayBmb3JtYXQgZm9yIHRoZSB0cmFuc2NvZGluZy4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHRyYW5zY29kaW5nIHNlcnZpY2Ugd2lsbCB0cnkgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdGVkIGZvcm1hdCBhcyBtdWNoIGFzCisgICAgICogcG9zc2JpbGUsIHdoaWxlIHN1YmplY3QgdG8gaGFyZHdhcmUgYW5kIHNvZnR3YXJlIGxpbWl0YXRpb24uIFRoZSBmaW5hbCB2aWRlbyB0cmFjayBmb3JtYXQKKyAgICAgKiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsIHdoZW4gdGhlIHNlc3Npb24gaXMgZmluaXNoZWQuCiAgICAgICovCi0gICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgaW5GZDsKLQotICAgIC8qKgotICAgICAqIE91dHB1dCB0cmFuc2NvZGVkIGZpbGUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBvdXRGZDsKKyAgICBAbnVsbGFibGUgVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0IHJlcXVlc3RlZFZpZGVvVHJhY2tGb3JtYXQ7CiAKICAgICAvKioKICAgICAgKiBQcmlvcml0eSBvZiB0aGlzIHRyYW5zY29kaW5nLiBTZXJ2aWNlIHdpbGwgc2NoZWR1bGUgdGhlIHRyYW5zY29kaW5nIGJhc2VkIG9uIHRoZSBwcmlvcml0eS4KICAgICAgKi8KLSAgICBUcmFuc2NvZGluZ0pvYlByaW9yaXR5IHByaW9yaXR5OworICAgIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5IHByaW9yaXR5OwogCiAgICAgLyoqCi0gICAgICogV2hldGhlciB0byByZWNlaXZlIHVwZGF0ZSBvbiBwcm9ncmVzcyBhbmQgY2hhbmdlIG9mIGF3YWl0TnVtSm9icy4KKyAgICAgKiBXaGV0aGVyIHRvIHJlY2VpdmUgdXBkYXRlIG9uIHByb2dyZXNzIGFuZCBjaGFuZ2Ugb2YgYXdhaXROdW1TZXNzaW9ucy4KKyAgICAgKiBEZWZhdWx0IHRvIGZhbHNlLgogICAgICAqLwotICAgIGJvb2xlYW4gcmVxdWVzdFVwZGF0ZTsKKyAgICBib29sZWFuIHJlcXVlc3RQcm9ncmVzc1VwZGF0ZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZWNlaXZlIHVwZGF0ZSBvbiBzZXNzaW9uJ3Mgc3RhcnQvc3RvcC9wYXVzZS9yZXN1bWUuCisgICAgICogRGVmYXVsdCB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIHJlcXVlc3RTZXNzaW9uRXZlbnRVcGRhdGUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyByZXF1ZXN0IGlzIGZvciB0ZXN0aW5nLgorICAgICAqLworICAgIGJvb2xlYW4gaXNGb3JUZXN0aW5nID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNvbmZpZ3VyYXRpb24uIFRoaXMgd2lsbCBiZSBhdmFpbGFibGUgb25seSB3aGVuIGlzRm9yVGVzdGluZyBpcyBzZXQgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBAbnVsbGFibGUgVHJhbnNjb2RpbmdUZXN0Q29uZmlnIHRlc3RDb25maWc7CisKKyAgICAgLyoqCisgICAgICAqIFdoZXRoZXIgdG8gZ2V0IHRoZSBzdGF0cyBvZiB0aGUgdHJhbnNjb2RpbmcuCisgICAgICAqIElmIHRoaXMgaXMgZW5hYmxlZCwgdGhlIFRyYW5zY29kaW5nU2Vzc2lvblN0YXRzIHdpbGwgYmUgcmV0dXJuZWQgaW4gVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwKKyAgICAgICogdXBvbiB0cmFuc2NvZGluZyBmaW5pc2hlcy4KKyAgICAgICovCisgICAgYm9vbGVhbiBlbmFibGVTdGF0cyA9IGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVzdWx0UGFyY2VsLmFpZGwKaW5kZXggNjVjNDllNy4uNzgyNmUyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwuYWlkbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbC5haWRsCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAoraW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdTZXNzaW9uU3RhdHM7CisKIC8qKgogICogUmVzdWx0IG9mIHRoZSB0cmFuc2NvZGluZy4KICAqCkBAIC0yNCw5ICsyNiw5IEBACiAvL1RPRE8oaGt1YW5nKTogSW1wbGVtZW50IHRoZSBwYXJjZWxhYmxlLgogcGFyY2VsYWJsZSBUcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbCB7CiAgICAgLyoqCi0gICAgICogVGhlIGpvYklkIGFzc29jaWF0ZWQgd2l0aCB0aGUgVHJhbnNjb2RpbmdSZXN1bHQuCisgICAgICogVGhlIHNlc3Npb25JZCBhc3NvY2lhdGVkIHdpdGggdGhlIFRyYW5zY29kaW5nUmVzdWx0LgogICAgICAqLwotICAgIGludCBqb2JJZDsKKyAgICBpbnQgc2Vzc2lvbklkOwogCiAgICAgLyoqCiAgICAgICogQWN0dWFsIGJpdHJhdGUgb2YgdGhlIHRyYW5zY29kZWQgdmlkZW8gaW4gYml0cyBwZXIgc2Vjb25kLiBUaGlzIHdpbGwgb25seSBwcmVzZW50IGZvciB2aWRlbwpAQCAtMzQsNSArMzYsOSBAQAogICAgICAqLwogICAgIGludCBhY3R1YWxCaXRyYXRlQnBzOwogCi0gICAgLy8gVE9ETyhoa3VhbmcpOiBBZGQgbW9yZSBmaWVsZHMuCisgICAgLyoqCisgICAgICogU3RhdHMgb2YgdGhlIHRyYW5zY29kaW5nIHNlc3Npb24uIFRoaXMgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSB3aGVuIGNsaWVudCByZXF1ZXN0cyB0byBnZXQgdGhlCisgICAgICogc3RhdHMgaW4gVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLgorICAgICAqLworICAgIEBudWxsYWJsZSBUcmFuc2NvZGluZ1Nlc3Npb25TdGF0cyBzZXNzaW9uU3RhdHM7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsLmFpZGwgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRhNTAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsLmFpZGwKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0OworCisvKioKKyAqIFRyYW5zY29kaW5nU2Vzc2lvbiBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIGEKKyAqIFRyYW5zY29kaW5nUmVxdWVzdC4gSXQgY29udGFpbnMgYWxsIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBnZW5lcmF0ZWQgYnkgdGhlCisgKiBNZWRpYVRyYW5zY29kaW5nU2VydmljZSBmb3IgdGhlIFRyYW5zY29kaW5nUmVxdWVzdC4KKyAqCisgKiB7QGhpZGV9CisgKi8KKy8vVE9ETyhoa3VhbmcpOiBJbXBsZW1lbnQgdGhlIHBhcmNlbGFibGUuCitwYXJjZWxhYmxlIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCB7CisgICAgLyoqCisgICAgICogQSB1bmlxdWUgcG9zaXRpdmUgSWQgZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKyAgICAgKi8KKyAgICBpbnQgc2Vzc2lvbklkOworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBUcmFuc2NvZGluZ1Nlc3Npb24uCisgICAgICovCisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHJlcXVlc3Q7CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgdmlkZW8gdHJhY2sncyBmb3JtYXQuIFRoaXMgd2lsbCBvbmx5IGJlIGF2YWlhYmxlIGZvciB2aWRlbyB0cmFuc2NvZGluZyBhbmQgaXQgd2lsbAorICAgICAqIGJlIGF2YWlhYmxlIHdoZW4gdGhlIHNlc3Npb24gaXMgZmluaXNoZWQuCisgICAgICovCisgICAgQG51bGxhYmxlIFRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdCB2aWRlb1RyYWNrRm9ybWF0OworCisgICAgLyoqCisgICAgKiBDdXJyZW50IG51bWJlciBvZiBzZXNzaW9ucyBhaGVhZCBvZiB0aGlzIHNlc3Npb24uIFRoZSBzZXJ2aWNlIHNjaGVkdWxlcyB0aGUgc2Vzc2lvbiBiYXNlZCBvbgorICAgICogdGhlIHByaW9yaXR5IHBhc3NlZCBmcm9tIHRoZSBjbGllbnQuIENsaWVudCBjb3VsZCBzcGVjaWZ5IHdoZXRoZXIgdG8gcmVjZWl2ZSB1cGRhdGVzIHdoZW4gdGhlCisgICAgKiBhd2FpdE51bWJlck9mU2Vzc2lvbnMgY2hhbmdlcyB0aHJvdWdoIHNldHRpbmcgcmVxdWVzdFByb2dyZXNzVXBkYXRlIGluIHRoZSBUcmFuc2NvZGluZ1JlcXVlc3QuCisgICAgKi8KKyAgICBpbnQgYXdhaXROdW1iZXJPZlNlc3Npb25zOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHkuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwMTQ4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5LmFpZGwKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBQcmlvcml0eSBvZiBhIHRyYW5zY29kaW5nIHNlc3Npb24uCisgKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eSB7CisgICAgLy8gVE9ETyhoa3VhbmcpOiBkZWZpbmUgd2hhdCBlYWNoIHByaW9yaXR5IGxldmVsIGFjdHVhbGx5IG1lYW4uCisgICAga1Vuc3BlY2lmaWVkID0gMCwKKyAgICBrTG93ID0gMSwKKyAgICAvKioKKyAgICAgKiAyIH4gMjAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgICAgICovCisgICAga05vcm1hbCA9IDIxLAorICAgIC8qKgorICAgICAqIDIyIH4gMzAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgICAgICovCisgICAga0hpZ2ggPSAzMSwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25TdGF0cy5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uU3RhdHMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U3ZWVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uU3RhdHMuYWlkbApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFRyYW5zY29kaW5nU2Vzc2lvblN0YXRzIGVuY2Fwc3VsYXRlZCB0aGUgc3RhdHMgb2YgdGhlIGEgVHJhbnNjb2RpbmdTZXNzaW9uLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUcmFuc2NvZGluZ1Nlc3Npb25TdGF0cyB7CisgICAgLyoqCisgICAgICogU3lzdGVtIHRpbWUgb2Ygd2hlbiB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLgorICAgICAqLworICAgIGxvbmcgc2Vzc2lvbkNyZWF0ZWRUaW1lVXM7CisKKyAgICAvKioKKyAgICAgKiBTeXN0ZW0gdGltZSBvZiB3aGVuIHRoZSBzZXNzaW9uIGlzIGZpbmlzaGVkLgorICAgICAqLworICAgIGxvbmcgc2Vzc2lvbkZpbmlzaGVkVGltZVVzOworCisgICAgLyoqCisgICAgICogVG90YWwgdGltZSBzcGVuZCBvbiB0cmFuc2NvZGluZywgZXhjbHVkZSB0aGUgdGltZSBpbiBwYXVzZS4KKyAgICAgKi8KKyAgICBsb25nIHRvdGFsUHJvY2Vzc2luZ1RpbWVVczsKKworICAgIC8qKgorICAgICAqIFRvdGFsIHRpbWUgc3BlbmQgb24gaGFuZGxpbmcgdGhlIHNlc3Npb24sIGluY2x1ZGUgdGhlIHRpbWUgaW4gcGF1c2UuCisgICAgICogVGhlIHRvdGFsdGltZVVzIGlzIGFjdHVhbGx5IHRoZSBzYW1lIGFzIHNlc3Npb25GaW5pc2hlZFRpbWVVcyAtIHNlc3Npb25DcmVhdGVkVGltZVVzLgorICAgICAqLworICAgIGxvbmcgdG90YWxUaW1lVXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Rlc3RDb25maWcuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVGVzdENvbmZpZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZTBlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Rlc3RDb25maWcuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworIC8qKgorICAqIFRyYW5zY29kaW5nVGVzdENvbmZpZyBjb250YWlucyB0aGUgdGVzdCBjb25maWd1cmVhdGlvbiB1c2VkIGluIHRlc3RpbmcuCisgICoKKyAgKiB7QGhpZGV9CisgICovCitwYXJjZWxhYmxlIFRyYW5zY29kaW5nVGVzdENvbmZpZyB7CisgICAgLyoqCisgICAgICogV2hldGhlciB0byB1c2UgU2ltdWxhdGVkVHJhbnNjb2RlciBmb3IgdGVzdGluZy4gTm90ZSB0aGF0IFNpbXVsYXRlZFRyYW5zY29kZXIgZG9lcyBub3Qgc2VuZAorICAgICAqIHRyYW5zY29kaW5nIHNlc3Npb25zIHRvIHJlYWwgTWVkaWFUcmFuc2NvZGVyLgorICAgICAqLworICAgIGJvb2xlYW4gdXNlU2ltdWxhdGVkVHJhbnNjb2RlciA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogUGFzc3Rocm91Z2ggbW9kZSB1c2VkIGZvciB0ZXN0aW5nLiBUaGUgdHJhbnNjb2Rpbmcgc2VydmljZSB3aWxsIGFzc3VtZSB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBwYXRoIGFscmVhZHkgY29udGFpbnMgdGhlIHRyYW5zY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgcmV0dXJuIGl0IHRvIGNsaWVudCBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBib29sZWFuIHBhc3NUaHJvdWdoTW9kZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGltZSBvZiBwcm9jZXNzaW5nIHRoZSBzZXNzaW9uIGluIG1pbGxpc2Vjb25kcy4gU2VydmljZSB3aWxsIHJldHVybiB0aGUgc2Vzc2lvbiByZXN1bHQgYXQKKyAgICAgKiBsZWFzdCBhZnRlciBwcm9jZXNzaW5nVG90YWxUaW1lTXMgZnJvbSB0aGUgdGltZSBpdCBzdGFydHMgdG8gcHJvY2VzcyB0aGUgc2Vzc2lvbi4gTm90ZSB0aGF0CisgICAgICogaWYgc2VydmljZSB1c2VzIHJlYWwgTWVkaWFUcmFuc2NvZGVyIHRvIGRvIHRyYW5zY29kaW5nLCB0aGUgdGltZSBzcGVudCBvbiB0cmFuc2NvZGluZyBtYXkgYmUKKyAgICAgKiBtb3JlIHRoYW4gdGhhdC4KKyAgICAgKi8KKyAgICBpbnQgcHJvY2Vzc2luZ1RvdGFsVGltZU1zID0gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdC5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkMjQxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdC5haWRsCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1ZpZGVvQ29kZWNUeXBlOworCisvKioKKyAqIFRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdCBjb250YWlucyB0aGUgdmlkZW8gdHJhY2sgZm9ybWF0IG9mIGEgdmlkZW8uCisgKgorICogVE9ETyhoa3VhbmcpOiBTd2l0Y2ggdG8gUGVyc2lzdGFibGVCdW5kbGUgd2hlbiBiLzE1NjQyODczNSBpcyBmaXhlZCBvciBhZnRlciB3ZSByZW1vdmUKKyAqIGFpZGxfaW50ZXJmYWNlCisgKgorICogTm90ZSB0aGF0IFRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdCBpcyB1c2VkIGluIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCBmb3IgdGhlICBjbGllbnQgdG8KKyAqIHNwZWNpZnkgdGhlIGRlc2lyZWQgdHJhbnNjb2RlZCB2aWRlbyBmb3JtYXQsIGFuZCBpcyBhbHNvIHVzZWQgaW4gVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsIGZvciB0aGUKKyAqIHNlcnZpY2UgdG8gbm90aWZ5IGNsaWVudCBvZiB0aGUgZmluYWwgdmlkZW8gZm9ybWF0IGZvciB0cmFuc2NvZGluZy4KKyAqIFdoZW4gdXNlZCBhcyBpbnB1dCBpbiBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwsIHRoZSBjbGllbnQgb25seSBuZWVkcyB0byBzcGVjaWZ5IHRoZSBjb25maWcgdGhhdAorICogdGhleSB3YW50IHRvIGNoYW5nZSwgZS5nLiBjb2RlYyBvciByZXNvbHV0aW9uLCBhbmQgYWxsIHRoZSBtaXNzaW5nIGNvbmZpZ3Mgd2lsbCBiZSBleHRyYWN0ZWQKKyAqIGZyb20gdGhlIHNvdXJjZSB2aWRlbyBhbmQgYXBwbGllZCB0byB0aGUgZGVzdGluYXRpb24gdmlkZW8uCisgKiBXaGVuIHVzZWQgYXMgb3V0cHV0IGluIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCwgYWxsIHRoZSBjb25maWdzIHdpbGwgYmUgcG9wdWxhdGVkIHRvIGluZGljYXRlCisgKiB0aGUgZmluYWwgZW5jb2RlciBjb25maWdzIHVzZWQgZm9yIHRyYW5zY29kaW5nLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUcmFuc2NvZGluZ1ZpZGVvVHJhY2tGb3JtYXQgeworICAgIC8qKgorICAgICAqIFZpZGVvIENvZGVjIHR5cGUuCisgICAgICovCisgICAgVHJhbnNjb2RpbmdWaWRlb0NvZGVjVHlwZSBjb2RlY1R5cGU7IC8vIFRyYW5zY29kaW5nVmlkZW9Db2RlY1R5cGU6OmtVbnNwZWNpZmllZDsKKworICAgIC8qKgorICAgICAqIFdpZHRoIG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMuIC0xIG1lYW5zIHVuYXZhaWxhYmxlLgorICAgICAqLworICAgIGludCB3aWR0aCA9IC0xOworCisgICAgLyoqCisgICAgICogSGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMuIC0xIG1lYW5zIHVuYXZhaWxhYmxlLgorICAgICAqLworICAgIGludCBoZWlnaHQgPSAtMTsKKworICAgIC8qKgorICAgICAqIEJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLiAtMSBtZWFucyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgYml0cmF0ZUJwcyA9IC0xOworCisgICAgLyoqCisgICAgICogQ29kZWMgcHJvZmlsZS4gVGhpcyBtdXN0IGJlIHRoZSBzYW1lIGNvbnN0YW50IGFzIHVzZWQgaW4gTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuCisgICAgICogLTEgbWVhbnMgdW5hdmFpbGFibGUuCisgICAgICovCisgICAgaW50IHByb2ZpbGUgPSAtMTsKKworICAgIC8qKgorICAgICAqIENvZGVjIGxldmVsLiBUaGlzIG11c3QgYmUgdGhlIHNhbWUgY29uc3RhbnQgYXMgdXNlZCBpbiBNZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbC4KKyAgICAgKiAtMSBtZWFucyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgbGV2ZWwgPSAtMTsKKworICAgIC8qKgorICAgICAqIERlY29kZXIgb3BlcmF0aW5nIHJhdGUuIFRoaXMgaXMgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IHZlbmRvciBkb2VzIG5vdCBib29zdCB0aGUKKyAgICAgKiBoYXJkd2FyZSB0byBtYXhpbXVtIHNwZWVkIGluIHRyYW5zY29kaW5nIHVzYWdlIGNhc2UuIFRoaXMgb3BlcmF0aW5nIHJhdGUgd2lsbCBiZSBhcHBsaWVkCisgICAgICogdG8gZGVjb2RlciBpbnNpZGUgTWVkaWFUcmFuc2NvZGVyLiAtMSBtZWFucyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgZGVjb2Rlck9wZXJhdGluZ1JhdGUgPSAtMTsKKworICAgIC8qKgorICAgICAqIEVuY29kZXIgb3BlcmF0aW5nIHJhdGUuIFRoaXMgaXMgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IHZlbmRvciBkb2VzIG5vdCBib29zdCB0aGUKKyAgICAgKiBoYXJkd2FyZSB0byBtYXhpbXVtIHNwZWVkIGluIHRyYW5zY29kaW5nIHVzYWdlIGNhc2UuIFRoaXMgb3BlcmF0aW5nIHJhdGUgd2lsbCBiZSBhcHBsaWVkCisgICAgICogdG8gZW5jb2RlciBpbnNpZGUgTWVkaWFUcmFuc2NvZGVyLiAtMSBtZWFucyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgZW5jb2Rlck9wZXJhdGluZ1JhdGUgPSAtMTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODhlMmVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFNjcmlwdCB0byBydW4gYWxsIHRyYW5zY29kaW5nIHJlbGF0ZWQgdGVzdHMgZnJvbSBzdWJmb2xkZXJzLgorIyBSdW4gc2NyaXB0IGZyb20gdGhpcyBmb2xkZXIuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbQorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudCAmJiBhZGIgc3luYworU1lOQ19GSU5JU0hFRD10cnVlCisKKyMgUnVuIHRoZSB0cmFuc2NvZGluZyBzZXJ2aWNlIHRlc3RzLgorcHVzaGQgdGVzdHMKKy4gYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorcG9wZAorCisjIFJ1biB0aGUgdHJhbnNjb2RlciB0ZXN0cy4KK3B1c2hkIHRyYW5zY29kZXIvdGVzdHMvCisuIGJ1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKK3BvcGQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUuaAppbmRleCAwZThkY2ZkLi41YmExZWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUuaAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUuaApAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvKgotICogQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUgaXMgYSBjdXN0b20gbWF4IHByaW9yaXR5IHF1ZXVlIHRoYXQgaGVscHMgbWFuYWdpbmcgam9icyBmb3IKKyAqIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlIGlzIGEgY3VzdG9tIG1heCBwcmlvcml0eSBxdWV1ZSB0aGF0IGhlbHBzIG1hbmFnaW5nIHNlc3Npb25zIGZvcgogICogTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCiAgKgogICogQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUgaXMgYSB3cmFwcGVyIHRlbXBsYXRlIGFyb3VuZCB0aGUgU1RMJ3MgKl9oZWFwKCkgZnVuY3Rpb25zLgpAQCAtMzgsNyArMzgsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ29tcGFyYXRvciA9IHN0ZDo6bGVzczxUPj4KIGNsYXNzIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlIHsKLSAgIHB1YmxpYzoKK3B1YmxpYzoKICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+OjppdGVyYXRvciBpdGVyYXRvcjsKICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKIApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgLyogUmV0dXJuIHRoZSBiYWNrYm9uZSBzdG9yYWdlIG9mIHRoaXMgUHJpb3JpdHlRdWV1ZS4gTWFpbmx5IHVzZWQgZm9yIGRlYnVnZ2luZy4gKi8KICAgICBjb25zdCBzdGQ6OnZlY3RvcjxUPiYgZ2V0U3RvcmFnZSgpIGNvbnN0IHsgcmV0dXJuIG1IZWFwOyB9OwogCi0gICBwcml2YXRlOgorcHJpdmF0ZToKICAgICBzdGQ6OnZlY3RvcjxUPiBtSGVhcDsKIAogICAgIC8qIEltcGxlbWVudGF0aW9uIHNoYXJlZCBieSBib3RoIHB1YmxpYyBwdXNoKCkgbWV0aG9kcy4gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDRmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfQ09OVFJPTExFUl9DTElFTlRfSU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9DT05UUk9MTEVSX0NMSUVOVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nRGVmcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworCisvLyBJbnRlcmZhY2UgZm9yIGEgY2xpZW50IHRvIGNhbGwgdGhlIGNvbnRyb2xsZXIgdG8gc2NoZWR1bGUgb3IgcmV0cmlldmUKKy8vIHRoZSBzdGF0dXMgb2YgYSBzZXNzaW9uLgorY2xhc3MgQ29udHJvbGxlckNsaWVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogU3VibWl0cyBvbmUgcmVxdWVzdCB0byB0aGUgY29udHJvbGxlci4KKyAgICAgKgorICAgICAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBmYWlsdXJlLiBUaGlzIGNhbGwgd2lsbCBmYWlsIGlzIGEgc2Vzc2lvbiBpZGVudGlmaWVkCisgICAgICogYnkgPGNsaWVudElkLCBzZXNzaW9uSWQ+IGFscmVhZHkgZXhpc3RzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzdWJtaXQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNsaWVudENhbGxiYWNrKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGEgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5IDxjbGllbnRJZCwgc2Vzc2lvbklkPi4KKyAgICAgKgorICAgICAqIElmIHNlc3Npb25JZCBpcyBuZWdhdGl2ZSAoPDApLCBhbGwgc2Vzc2lvbnMgd2l0aCBhIHNwZWNpZmllZCBwcmlvcml0eSAodGhhdCdzIG5vdAorICAgICAqIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprVW5zcGVjaWZpZWQpIHdpbGwgYmUgY2FuY2VsbGVkLiBPdGhlcndpc2UsIG9ubHkgdGhlIHNpbmdsZQorICAgICAqIHNlc3Npb24gPGNsaWVudElkLCBzZXNzaW9uSWQ+IHdpbGwgYmUgY2FuY2VsbGVkLgorICAgICAqCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBhIHNpbmdsZSBzZXNzaW9uIGlzIGJlaW5nIGNhbmNlbGxlZCBidXQgaXQgZG9lc24ndCBleGlzdC4gUmV0dXJucworICAgICAqIHRydWUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjYW5jZWwoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIFJldHVybnMgdHJ1ZSBhbmQgdGhlIHNlc3Npb24gaWYgaXQgZXhpc3RzLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBnZXRTZXNzaW9uKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsKiByZXF1ZXN0KSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9DT05UUk9MTEVSX0NMSUVOVF9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1Jlc291cmNlUG9saWN5SW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvUmVzb3VyY2VQb2xpY3lJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2NlMjUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1Jlc291cmNlUG9saWN5SW50ZXJmYWNlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9QT0xJQ1lfSU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9QT0xJQ1lfSU5URVJGQUNFX0gKKyNpbmNsdWRlIDxtZW1vcnk+CituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFJlc291cmNlUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U7CisKKy8vIEludGVyZmFjZSBmb3IgdGhlIFNlc3Npb25Db250cm9sbGVyIHRvIGNvbnRyb2wgdGhlIHJlc291cmNlIHN0YXR1cyB1cGRhdGVzLgorY2xhc3MgUmVzb3VyY2VQb2xpY3lJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIFNldCB0aGUgYXNzb2NpYXRlZCBjYWxsYmFjayBpbnRlcmZhY2UgdG8gc2VuZCB0aGUgZXZlbnRzIHdoZW4gcmVzb3VyY2UKKyAgICAvLyBzdGF0dXMgY2hhbmdlcy4gKFNldCB0byBudWxscHRyIHdpbGwgc3RvcCB0aGUgdXBkYXRlcy4pCisgICAgdmlydHVhbCB2b2lkIHNldENhbGxiYWNrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGlkUmVzb3VyY2VMb3N0KHBpZF90IHBpZCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+UmVzb3VyY2VQb2xpY3lJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Cit9OworCisvLyBJbnRlcmZhY2UgZm9yIG5vdGlmeWluZyB0aGUgU2Vzc2lvbkNvbnRyb2xsZXIgb2YgYSBjaGFuZ2UgaW4gcmVzb3VyY2Ugc3RhdHVzLgorY2xhc3MgUmVzb3VyY2VQb2xpY3lDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gQ2FsbGVkIHdoZW4gY29kZWMgcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUuIFRoZSBjb250cm9sbGVyIG1heSB1c2UgdGhpcworICAgIC8vIGFzIGEgc2lnbmFsIHRvIGF0dGVtcHQgcmVzdGFydCB0cmFuc2NvZGluZyBzZXNzaW9ucyB0aGF0IHdlcmUgcHJldmlvdXNseQorICAgIC8vIHBhdXNlZCBkdWUgdG8gdGVtcG9yYXJ5IHJlc291cmNlIGxvc3MuCisgICAgdmlydHVhbCB2b2lkIG9uUmVzb3VyY2VBdmFpbGFibGUoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5SZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9QT0xJQ1lfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGVySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RlckludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjhhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RlckludGVyZmFjZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RFUl9JTlRFUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RSQU5TQ09ERVJfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0Vycm9yQ29kZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ0RlZnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nRXJyb3JDb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworY2xhc3MgVHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlOworCisvLyBJbnRlcmZhY2UgZm9yIHRoZSBjb250cm9sbGVyIHRvIGNhbGwgdGhlIHRyYW5zY29kZXIgdG8gdGFrZSBhY3Rpb25zLgorY2xhc3MgVHJhbnNjb2RlckludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHNldENhbGxiYWNrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2U+JiBjYikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzdGFydChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNsaWVudENhbGxiYWNrKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYWxsYmFjaykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflRyYW5zY29kZXJJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Cit9OworCisvLyBJbnRlcmZhY2UgZm9yIHRoZSB0cmFuc2NvZGVyIHRvIG5vdGlmeSB0aGUgY29udHJvbGxlciBvZiB0aGUgc3RhdHVzIG9mCisvLyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc2Vzc2lvbiwgb3IgdGVtcG9yYXJ5IGxvc3Mgb2YgdHJhbnNjb2RpbmcgcmVzb3VyY2VzLgorY2xhc3MgVHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICAvLyBUT0RPKGNoeik6IGRldGVybWluZSB3aGF0IHBhcmFtZXRlcnMgYXJlIG5lZWRlZCBoZXJlLgorICAgIHZpcnR1YWwgdm9pZCBvblN0YXJ0ZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblBhdXNlZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uRmluaXNoKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcihDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlIGVycikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblByb2dyZXNzVXBkYXRlKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcm9ncmVzcykgPSAwOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdHJhbnNjb2RpbmcgYmVjb21lcyB0ZW1wb3JhcmlseSBpbmFjY2Vzc2libGUgZHVlIHRvIGxvc3Mgb2YgcmVzb3VyY2UuCisgICAgLy8gSWYgdGhlcmUgaXMgYW55IHNlc3Npb24gY3VycmVudGx5IHJ1bm5pbmcsIGl0IHdpbGwgYmUgcGF1c2VkLiBXaGVuIHJlc291cmNlIGNvbnRlbnRpb24KKyAgICAvLyBpcyBzb2x2ZWQsIHRoZSBjb250cm9sbGVyIHNob3VsZCBjYWxsIFRyYW5zY29kZXJJbnRlcmZhY2UncyB0byBlaXRoZXIgc3RhcnQgYSBuZXcgc2Vzc2lvbiwKKyAgICAvLyBvciByZXN1bWUgYSBwYXVzZWQgc2Vzc2lvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNvdXJjZUxvc3QoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFOU0NPREVSX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RlcldyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGVyV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzMyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RlcldyYXBwZXIuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1RSQU5TQ09ERVJfV1JBUFBFUl9ICisjZGVmaW5lIEFORFJPSURfVFJBTlNDT0RFUl9XUkFQUEVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RlckludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFUcmFuc2NvZGVyOworY2xhc3MgUGFyY2VsYWJsZTsKKworLyoKKyAqIFdyYXBwZXIgY2xhc3MgYXJvdW5kIE1lZGlhVHJhbnNjb2Rlci4KKyAqIEltcGxlbWVudHMgVHJhbnNjb2RlckludGVyZmFjZSBmb3IgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlciB0byB1c2UuCisgKi8KK2NsYXNzIFRyYW5zY29kZXJXcmFwcGVyIDogcHVibGljIFRyYW5zY29kZXJJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFRyYW5zY29kZXJXcmFwcGVyPiB7CitwdWJsaWM6CisgICAgVHJhbnNjb2RlcldyYXBwZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzdGFydChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNsaWVudENhbGxiYWNrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGNsYXNzIENhbGxiYWNrSW1wbDsKKyAgICBzdHJ1Y3QgRXZlbnQgeworICAgICAgICBlbnVtIFR5cGUgeyBOb0V2ZW50LCBTdGFydCwgUGF1c2UsIFJlc3VtZSwgU3RvcCwgRmluaXNoLCBFcnJvciwgUHJvZ3Jlc3MgfSB0eXBlOworICAgICAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQ7CisgICAgICAgIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkOworICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcnVubmFibGU7CisgICAgICAgIGludDMyX3QgYXJnOworICAgIH07CisgICAgdXNpbmcgU2Vzc2lvbktleVR5cGUgPSBzdGQ6OnBhaXI8Q2xpZW50SWRUeXBlLCBTZXNzaW9uSWRUeXBlPjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYWxsYmFja0ltcGw+IG1UcmFuc2NvZGVyQ2I7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhbnNjb2Rlcj4gbVRyYW5zY29kZXI7CisgICAgc3RkOjp3ZWFrX3B0cjxUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2U+IG1DYWxsYmFjazsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgc3RkOjpsaXN0PEV2ZW50PiBtUXVldWU7ICAvLyBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICBzdGQ6Om1hcDxTZXNzaW9uS2V5VHlwZSwgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4+IG1QYXVzZWRTdGF0ZU1hcDsKKyAgICBDbGllbnRJZFR5cGUgbUN1cnJlbnRDbGllbnRJZDsKKyAgICBTZXNzaW9uSWRUeXBlIG1DdXJyZW50U2Vzc2lvbklkOworCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IEV2ZW50JiBldmVudCk7CisgICAgdm9pZCBvbkZpbmlzaChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKTsKKyAgICB2b2lkIG9uRXJyb3IoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICB2b2lkIG9uUHJvZ3Jlc3MoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgaW50MzJfdCBwcm9ncmVzcyk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCBoYW5kbGVTdGFydChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgbWVkaWFfc3RhdHVzX3QgaGFuZGxlUGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCk7CisgICAgbWVkaWFfc3RhdHVzX3QgaGFuZGxlUmVzdW1lKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIG1lZGlhX3N0YXR1c190IHNldHVwVHJhbnNjb2RlcigKKyAgICAgICAgICAgIENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4mIHBhdXNlZFN0YXRlID0gbnVsbHB0cik7CisKKyAgICB2b2lkIGNsZWFudXAoKTsKKyAgICB2b2lkIHJlcG9ydEVycm9yKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIG1lZGlhX3N0YXR1c190IGVycik7CisgICAgdm9pZCBxdWV1ZUV2ZW50KEV2ZW50OjpUeXBlIHR5cGUsIENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBydW5uYWJsZSwgaW50MzJfdCBhcmcgPSAwKTsKKyAgICB2b2lkIHRocmVhZExvb3AoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfVFJBTlNDT0RFUl9XUkFQUEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuaAppbmRleCBlZWMxMjBhLi5iZTU1Yzc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmgKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5oCkBAIC0xNyw3MyArMTcsNzcgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19DTElFTlRfTUFOQUdFUl9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfQ0xJRU5UX01BTkFHRVJfSAogCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2suaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgIkNvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50OwotCi1jbGFzcyBNZWRpYVRyYW5zY29kaW5nU2VydmljZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOwogCiAvKgogICogVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIG1hbmFnZXMgYWxsIHRoZSB0cmFuc2NvZGluZyBjbGllbnRzIGFjcm9zcyBkaWZmZXJlbnQgcHJvY2Vzc2VzLgogICoKLSAqIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciBpcyBhIGdsb2JhbCBzaW5nbGV0b24gdGhhdCBjb3VsZCBvbmx5IGFjcXVpcmVkIGJ5Ci0gKiBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4gSXQgbWFuYWdlcyBhbGwgdGhlIGNsaWVudHMncyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gYW5kIGNsaWVudHMnCi0gKiBpbmZvcm1hdGlvbi4gSXQgYWxzbyBib29ra2VlcHMgYWxsIHRoZSBjbGllbnRzJyBpbmZvcm1hdGlvbi4gSXQgYWxzbyBtb25pdG9ycyB0byB0aGUgZGVhdGggb2YgdGhlCisgKiBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIgbWFuYWdlcyBhbGwgdGhlIGNsaWVudHMncyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gYW5kIGNsaWVudHMnCisgKiBpbmZvcm1hdGlvbi4gSXQgYWxzbyBib29ra2VlcHMgYWxsIHRoZSBjbGllbnRzJyBpbmZvcm1hdGlvbi4gSXQgYWxzbyBtb25pdG9ycyB0aGUgZGVhdGggb2YgdGhlCiAgKiBjbGllbnRzLiBVcG9uIGNsaWVudCdzIGRlYXRoLCBpdCB3aWxsIHJlbW92ZSB0aGUgY2xpZW50IGZyb20gaXQuCiAgKgogICogVE9ETyhoa3VhbmcpOiBIb29rIHVwIHdpdGggUmVzb3VyY2VNYW5hZ2VyIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50LgogICogVE9ETyhoa3VhbmcpOiBIb29rIHVwIHdpdGggTWVkaWFNZXRyaWNzIHRvIGxvZyBhbGwgdGhlIHRyYW5zYWN0aW9ucy4KICAqLwotY2xhc3MgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIHsKLSAgIHB1YmxpYzoKK2NsYXNzIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcj4geworcHVibGljOgogICAgIHZpcnR1YWwgflRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcigpOwogCiAgICAgLyoqCi0gICAgICogQ2xpZW50SW5mbyBjb250YWlucyBhIHNpbmdsZSBjbGllbnQncyBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBzdHJ1Y3QgQ2xpZW50SW5mbyB7Ci0gICAgICAgIC8qIFRoZSByZW1vdGUgY2xpZW50IHRoYXQgdGhpcyBDbGllbnRJbmZvIGlzIGFzc29jaWF0ZWQgd2l0aC4gKi8KLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IG1DbGllbnQ7Ci0gICAgICAgIC8qIEEgdW5pcXVlIHBvc2l0aXZlIElkIGFzc2lnbmVkIHRvIHRoZSBjbGllbnQgYnkgdGhlIHNlcnZpY2UuICovCi0gICAgICAgIGludDMyX3QgbUNsaWVudElkOwotICAgICAgICAvKiBQcm9jZXNzIGlkIG9mIHRoZSBjbGllbnQgKi8KLSAgICAgICAgaW50MzJfdCBtQ2xpZW50UGlkOwotICAgICAgICAvKiBVc2VyIGlkIG9mIHRoZSBjbGllbnQuICovCi0gICAgICAgIGludDMyX3QgbUNsaWVudFVpZDsKLSAgICAgICAgLyogUGFja2FnZSBuYW1lIG9mIHRoZSBjbGllbnQuICovCi0gICAgICAgIHN0ZDo6c3RyaW5nIG1DbGllbnRPcFBhY2thZ2VOYW1lOwotCi0gICAgICAgIENsaWVudEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+JiBjbGllbnQsIGludDY0X3QgY2xpZW50SWQsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBwaWQsIGludDMyX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZSkKLSAgICAgICAgICAgIDogbUNsaWVudChjbGllbnQpLAotICAgICAgICAgICAgICBtQ2xpZW50SWQoY2xpZW50SWQpLAotICAgICAgICAgICAgICBtQ2xpZW50UGlkKHBpZCksCi0gICAgICAgICAgICAgIG1DbGllbnRVaWQodWlkKSwKLSAgICAgICAgICAgICAgbUNsaWVudE9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkge30KLSAgICB9OwotCi0gICAgLyoqCiAgICAgICogQWRkcyBhIG5ldyBjbGllbnQgdG8gdGhlIG1hbmFnZXIuCiAgICAgICoKLSAgICAgKiBUaGUgY2xpZW50IG11c3QgaGF2ZSB2YWxpZCBjbGllbnRJZCwgcGlkLCB1aWQgYW5kIG9wUGFja2FnZU5hbWUsIG90aGVyd2lzZSwgdGhpcyB3aWxsIHJldHVybgotICAgICAqIGEgbm9uLXplcm8gZXJyb3Jjb2RlLiBJZiB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIGl0IHdpbGwgYWxzbyByZXR1cm4gbm9uLXplcm8KLSAgICAgKiBlcnJvcmNvZGUuCisgICAgICogVGhlIGNsaWVudCBtdXN0IGhhdmUgdmFsaWQgY2FsbGJhY2ssIHBpZCwgdWlkLCBjbGllbnROYW1lIGFuZCBvcFBhY2thZ2VOYW1lLgorICAgICAqIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJldHVybiBhIG5vbi16ZXJvIGVycm9yY29kZS4gSWYgdGhlIGNsaWVudCBjYWxsYmFjayBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gYWRkZWQsIGl0IHdpbGwgYWxzbyByZXR1cm4gbm9uLXplcm8gZXJyb3Jjb2RlLgogICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudCB0byBiZSBhZGRlZCB0byB0aGUgbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgY2xpZW50IGNhbGxiYWNrIGZvciB0aGUgc2VydmljZSB0byBjYWxsIHRoaXMgY2xpZW50LgorICAgICAqIEBwYXJhbSBjbGllbnROYW1lIGNsaWVudCdzIG5hbWUuCisgICAgICogQHBhcmFtIG9wUGFja2FnZU5hbWUgY2xpZW50J3MgcGFja2FnZSBuYW1lLgorICAgICAqIEBwYXJhbSBjbGllbnQgb3V0cHV0IGhvbGRpbmcgdGhlIElUcmFuc2NvZGluZ0NsaWVudCBpbnRlcmZhY2UgZm9yIHRoZSBjbGllbnQKKyAgICAgKiAgICAgICAgdG8gdXNlIGZvciBzdWJzZXF1ZW50IGNvbW11bmljYXRpb25zIHdpdGggdGhlIHNlcnZpY2UuCiAgICAgICogQHJldHVybiAwIGlmIGNsaWVudCBpcyBhZGRlZCBzdWNjZXNzZnVsbHksIG5vbi16ZXJvIGVycm9yY29kZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgc3RhdHVzX3QgYWRkQ2xpZW50KHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRJbmZvPiBjbGllbnQpOworICAgIHN0YXR1c190IGFkZENsaWVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNsaWVudE5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiogY2xpZW50KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjbGllbnRzLgorICAgICAqLworICAgIHNpemVfdCBnZXROdW1PZkNsaWVudHMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIER1bXAgYWxsIHRoZSBjbGllbnQgaW5mb3JtYXRpb24gdG8gdGhlIGZkLgorICAgICAqLworICAgIHZvaWQgZHVtcEFsbENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U7CisgICAgZnJpZW5kIGNsYXNzIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3Q7CisgICAgc3RydWN0IENsaWVudEltcGw7CisKKyAgICAvLyBPbmx5IGFsbG93IE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIGFuZCB1bml0IHRlc3RzIHRvIGluc3RhbnRpYXRlLgorICAgIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29udHJvbGxlckNsaWVudEludGVyZmFjZT4mIGNvbnRyb2xsZXIpOworCisgICAgLy8gQ2hlY2tzIGlmIGEgdXNlciBpcyB0cnVzdGVkIChhbmQgYWxsb3dlZCB0byBzdWJtaXQgc2Vzc2lvbnMgb24gYmVoYWxmIG9mIG90aGVyIHVpZHMpCisgICAgYm9vbCBpc1RydXN0ZWRDYWxsZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbiBleGlzdGluZyBjbGllbnQgZnJvbSB0aGUgbWFuYWdlci4KQEAgLTkzLDM5ICs5NywyNCBAQAogICAgICAqIEBwYXJhbSBjbGllbnRJZCBpZCBvZiB0aGUgY2xpZW50IHRvIGJlIHJlbW92ZWQuLgogICAgICAqIEByZXR1cm4gMCBpZiBjbGllbnQgaXMgcmVtb3ZlZCBzdWNjZXNzZnVsbHksIG5vbi16ZXJvIGVycm9yY29kZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVtb3ZlQ2xpZW50KGludDMyX3QgY2xpZW50SWQpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNsaWVudHMuCi0gICAgICovCi0gICAgc2l6ZV90IGdldE51bU9mQ2xpZW50cygpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgY2xpZW50IHdpdGggY2xpZW50SWQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICAgICAqLwotICAgIGJvb2wgaXNDbGllbnRJZFJlZ2lzdGVyZWQoaW50MzJfdCBjbGllbnRJZCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBEdW1wIGFsbCB0aGUgY2xpZW50IGluZm9ybWF0aW9uIHRvIHRoZSBmZC4KLSAgICAgKi8KLSAgICB2b2lkIGR1bXBBbGxDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOwotICAgIGZyaWVuZCBjbGFzcyBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0OwotCi0gICAgLyoqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuICovCi0gICAgc3RhdGljIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciYgZ2V0SW5zdGFuY2UoKTsKLQotICAgIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcigpOworICAgIHN0YXR1c190IHJlbW92ZUNsaWVudChDbGllbnRJZFR5cGUgY2xpZW50SWQpOwogCiAgICAgc3RhdGljIHZvaWQgQmluZGVyRGllZENhbGxiYWNrKHZvaWQqIGNvb2tpZSk7CiAKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7Ci0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDMyX3QsIHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRJbmZvPj4gbUNsaWVudElkVG9DbGllbnRJbmZvTWFwCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPENsaWVudElkVHlwZSwgc3RkOjpzaGFyZWRfcHRyPENsaWVudEltcGw+PiBtQ2xpZW50SWRUb0NsaWVudE1hcAogICAgICAgICAgICAgR1VBUkRFRF9CWShtTG9jayk7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnRwdHJfdD4gbVJlZ2lzdGVyZWRDYWxsYmFja3MgR1VBUkRFRF9CWShtTG9jayk7CiAKICAgICA6Om5kazo6U2NvcGVkQUlCaW5kZXJfRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2U+IG1TZXNzaW9uQ29udHJvbGxlcjsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IG1UcnVzdGVkVWlkczsKKworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxDbGllbnRJZFR5cGU+IHNDb29raWVDb3VudGVyOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNDb29raWUyQ2xpZW50TG9jazsKKyAgICBzdGF0aWMgc3RkOjptYXA8Q2xpZW50SWRUeXBlLCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50SW1wbD4+IHNDb29raWUyQ2xpZW50CisgICAgICAgICAgICBHVUFSREVEX0JZKHNDb29raWUyQ2xpZW50TG9jayk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nRGVmcy5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nRGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDJkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdEZWZzLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19ERUZTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19ERUZTX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBDbGllbnRJZFR5cGUgPSB1aW50cHRyX3Q7Cit1c2luZyBTZXNzaW9uSWRUeXBlID0gaW50MzJfdDsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19ERUZTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3QuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODU0MDNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfUkVRVUVTVF9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfUkVRVUVTVF9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworCisvLyBIZWxwZXIgY2xhc3MgZm9yIGR1cGxpY2F0aW5nIGEgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsCitjbGFzcyBUcmFuc2NvZGluZ1JlcXVlc3QgOiBwdWJsaWMgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHsKK3B1YmxpYzoKKyAgICBUcmFuc2NvZGluZ1JlcXVlc3QoKSA9IGRlZmF1bHQ7CisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0KGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcGFyY2VsKSB7IHNldFRvKHBhcmNlbCk7IH0KKyAgICBUcmFuc2NvZGluZ1JlcXVlc3QmIG9wZXJhdG9yPShjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3QmIHJlcXVlc3QpIHsKKyAgICAgICAgc2V0VG8ocmVxdWVzdCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXRUbyhjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHBhcmNlbCkgeworICAgICAgICBzb3VyY2VGaWxlUGF0aCA9IHBhcmNlbC5zb3VyY2VGaWxlUGF0aDsKKyAgICAgICAgZGVzdGluYXRpb25GaWxlUGF0aCA9IHBhcmNlbC5kZXN0aW5hdGlvbkZpbGVQYXRoOworICAgICAgICBjbGllbnRVaWQgPSBwYXJjZWwuY2xpZW50VWlkOworICAgICAgICBjbGllbnRQaWQgPSBwYXJjZWwuY2xpZW50UGlkOworICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSA9IHBhcmNlbC5jbGllbnRQYWNrYWdlTmFtZTsKKyAgICAgICAgdHJhbnNjb2RpbmdUeXBlID0gcGFyY2VsLnRyYW5zY29kaW5nVHlwZTsKKyAgICAgICAgcmVxdWVzdGVkVmlkZW9UcmFja0Zvcm1hdCA9IHBhcmNlbC5yZXF1ZXN0ZWRWaWRlb1RyYWNrRm9ybWF0OworICAgICAgICBwcmlvcml0eSA9IHBhcmNlbC5wcmlvcml0eTsKKyAgICAgICAgcmVxdWVzdFByb2dyZXNzVXBkYXRlID0gcGFyY2VsLnJlcXVlc3RQcm9ncmVzc1VwZGF0ZTsKKyAgICAgICAgcmVxdWVzdFNlc3Npb25FdmVudFVwZGF0ZSA9IHBhcmNlbC5yZXF1ZXN0U2Vzc2lvbkV2ZW50VXBkYXRlOworICAgICAgICBpc0ZvclRlc3RpbmcgPSBwYXJjZWwuaXNGb3JUZXN0aW5nOworICAgICAgICB0ZXN0Q29uZmlnID0gcGFyY2VsLnRlc3RDb25maWc7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19SRVFVRVNUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5LmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjMyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfUkVTT1VSQ0VfUE9MSUNZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19SRVNPVVJDRV9QT0xJQ1lfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL1Jlc291cmNlUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisKKyNpbmNsdWRlIDxtdXRleD4KK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CitjbGFzcyBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U7CisKK2NsYXNzIFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kgOiBwdWJsaWMgUmVzb3VyY2VQb2xpY3lJbnRlcmZhY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3koKTsKKyAgICB+VHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeSgpOworCisgICAgdm9pZCBzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VQb2xpY3lDYWxsYmFja0ludGVyZmFjZT4mIGNiKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBpZFJlc291cmNlTG9zdChwaWRfdCBwaWQpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0cnVjdCBSZXNvdXJjZU9ic2VydmVyOworICAgIG11dGFibGUgc3RkOjptdXRleCBtUmVnaXN0ZXJlZExvY2s7CisgICAgYm9vbCBtUmVnaXN0ZXJlZCBHVUFSREVEX0JZKG1SZWdpc3RlcmVkTG9jayk7CisgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU9ic2VydmVyU2VydmljZT4gbVNlcnZpY2UgR1VBUkRFRF9CWShtUmVnaXN0ZXJlZExvY2spOworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyPiBtT2JzZXJ2ZXI7CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUNhbGxiYWNrTG9jazsKKyAgICBzdGQ6OndlYWtfcHRyPFJlc291cmNlUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+IG1SZXNvdXJjZVBvbGljeUNhbGxiYWNrCisgICAgICAgICAgICBHVUFSREVEX0JZKG1DYWxsYmFja0xvY2spOworICAgIHBpZF90IG1SZXNvdXJjZUxvc3RQaWQgR1VBUkRFRF9CWShtQ2FsbGJhY2tMb2NrKTsKKworICAgIDo6bmRrOjpTY29wZWRBSUJpbmRlcl9EZWF0aFJlY2lwaWVudCBtRGVhdGhSZWNpcGllbnQ7CisKKyAgICBzdGF0aWMgdm9pZCBCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKTsKKworICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CisgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworICAgIHZvaWQgb25SZXNvdXJjZUF2YWlsYWJsZShwaWRfdCBwaWQpOworfTsgIC8vIGNsYXNzIFRyYW5zY29kaW5nVWlkUG9saWN5CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfUkVTT1VSQ0VfUE9MSUNZX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTVlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fQ09OVFJPTExFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfU0VTU0lPTl9DT05UUk9MTEVSX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eS5oPgorI2luY2x1ZGUgPG1lZGlhL0NvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9SZXNvdXJjZVBvbGljeUludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9VaWRQb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgewordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXN1bHRQYXJjZWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTsKKworY2xhc3MgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlciA6IHB1YmxpYyBVaWRQb2xpY3lDYWxsYmFja0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29udHJvbGxlckNsaWVudEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyKCk7CisKKyAgICAvLyBDb250cm9sbGVyQ2xpZW50SW50ZXJmYWNlCisgICAgYm9vbCBzdWJtaXQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spIG92ZXJyaWRlOworICAgIGJvb2wgY2FuY2VsKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIG92ZXJyaWRlOworICAgIGJvb2wgZ2V0U2Vzc2lvbihDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwqIHJlcXVlc3QpIG92ZXJyaWRlOworICAgIC8vIH5Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlCisKKyAgICAvLyBUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2UKKyAgICB2b2lkIG9uU3RhcnRlZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUGF1c2VkKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXN1bWVkKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIG92ZXJyaWRlOworICAgIHZvaWQgb25GaW5pc2goQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkVycm9yKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIFRyYW5zY29kaW5nRXJyb3JDb2RlIGVycikgb3ZlcnJpZGU7CisgICAgdm9pZCBvblByb2dyZXNzVXBkYXRlKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNvdXJjZUxvc3QoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgLy8gflRyYW5zY29kZXJDYWxsYmFja0ludGVyZmFjZQorCisgICAgLy8gVWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2UKKyAgICB2b2lkIG9uVG9wVWlkc0NoYW5nZWQoY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiYgdWlkcykgb3ZlcnJpZGU7CisgICAgLy8gflVpZFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlCisKKyAgICAvLyBSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlCisgICAgdm9pZCBvblJlc291cmNlQXZhaWxhYmxlKCkgb3ZlcnJpZGU7CisgICAgLy8gflJlc291cmNlUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2UKKworICAgIC8qKgorICAgICAqIER1bXAgYWxsIHRoZSBzZXNzaW9uIGluZm9ybWF0aW9uIHRvIHRoZSBmZC4KKyAgICAgKi8KKyAgICB2b2lkIGR1bXBBbGxTZXNzaW9ucyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBNZWRpYVRyYW5zY29kaW5nU2VydmljZTsKKyAgICBmcmllbmQgY2xhc3MgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3Q7CisKKyAgICB1c2luZyBTZXNzaW9uS2V5VHlwZSA9IHN0ZDo6cGFpcjxDbGllbnRJZFR5cGUsIFNlc3Npb25JZFR5cGU+OworICAgIHVzaW5nIFNlc3Npb25RdWV1ZVR5cGUgPSBzdGQ6Omxpc3Q8U2Vzc2lvbktleVR5cGU+OworCisgICAgc3RydWN0IFNlc3Npb24geworICAgICAgICBTZXNzaW9uS2V5VHlwZSBrZXk7CisgICAgICAgIHVpZF90IHVpZDsKKyAgICAgICAgZW51bSBTdGF0ZSB7CisgICAgICAgICAgICBOT1RfU1RBUlRFRCwKKyAgICAgICAgICAgIFJVTk5JTkcsCisgICAgICAgICAgICBQQVVTRUQsCisgICAgICAgIH0gc3RhdGU7CisgICAgICAgIGludDMyX3QgbGFzdFByb2dyZXNzOworICAgICAgICBUcmFuc2NvZGluZ1JlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4gY2FsbGJhY2s7CisgICAgfTsKKworICAgIC8vIFRPRE8oY2h6KTogY2FsbCB0cmFuc2NvZGVyIHdpdGhvdXQgZ2xvYmFsIGxvY2suCisgICAgLy8gVXNlIG1Mb2NrIGZvciBhbGwgZW50cnlwb2ludHMgZm9yIG5vdy4KKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisKKyAgICBzdGQ6Om1hcDxTZXNzaW9uS2V5VHlwZSwgU2Vzc2lvbj4gbVNlc3Npb25NYXA7CisKKyAgICAvLyB1aWQtPlNlc3Npb25RdWV1ZSBtYXAgKHVpZCA9PSAtMTogb2ZmbGluZSBxdWV1ZSkKKyAgICBzdGQ6Om1hcDx1aWRfdCwgU2Vzc2lvblF1ZXVlVHlwZT4gbVNlc3Npb25RdWV1ZXM7CisKKyAgICAvLyB1aWRzLCB3aXRoIHRoZSBoZWFkIGJlaW5nIHRoZSBtb3N0LXJlY2VudGx5LXRvcCBhcHAsIDJuZCBpdGVtIGlzIHRoZQorICAgIC8vIHByZXZpb3VzIHRvcCBhcHAsIGV0Yy4KKyAgICBzdGQ6Omxpc3Q8dWlkX3Q+IG1VaWRTb3J0ZWRMaXN0OworICAgIHN0ZDo6bGlzdDx1aWRfdD46Oml0ZXJhdG9yIG1PZmZsaW5lVWlkSXRlcmF0b3I7CisgICAgc3RkOjptYXA8dWlkX3QsIHN0ZDo6c3RyaW5nPiBtVWlkUGFja2FnZU5hbWVzOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zY29kZXJJbnRlcmZhY2U+IG1UcmFuc2NvZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxVaWRQb2xpY3lJbnRlcmZhY2U+IG1VaWRQb2xpY3k7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlUG9saWN5SW50ZXJmYWNlPiBtUmVzb3VyY2VQb2xpY3k7CisKKyAgICBTZXNzaW9uKiBtQ3VycmVudFNlc3Npb247CisgICAgYm9vbCBtUmVzb3VyY2VMb3N0OworCisgICAgLy8gT25seSBhbGxvdyBNZWRpYVRyYW5zY29kaW5nU2VydmljZSBhbmQgdW5pdCB0ZXN0cyB0byBpbnN0YW50aWF0ZS4KKyAgICBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVySW50ZXJmYWNlPiYgdHJhbnNjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxVaWRQb2xpY3lJbnRlcmZhY2U+JiB1aWRQb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VQb2xpY3lJbnRlcmZhY2U+JiByZXNvdXJjZVBvbGljeSk7CisKKyAgICBTZXNzaW9uKiBnZXRUb3BTZXNzaW9uX2woKTsKKyAgICB2b2lkIHVwZGF0ZUN1cnJlbnRTZXNzaW9uX2woKTsKKyAgICB2b2lkIHJlbW92ZVNlc3Npb25fbChjb25zdCBTZXNzaW9uS2V5VHlwZSYgc2Vzc2lvbktleSk7CisgICAgdm9pZCBtb3ZlVWlkc1RvVG9wX2woY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiYgdWlkcywgYm9vbCBwcmVzZXJ2ZVRvcFVpZCk7CisgICAgdm9pZCBub3RpZnlDbGllbnQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgY29uc3QgY2hhciogcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBTZXNzaW9uS2V5VHlwZSYpPiBmdW5jKTsKKyAgICAvLyBJbnRlcm5hbCBzdGF0ZSB2ZXJpZmllciAoZGVidWcgb25seSkKKyAgICB2b2lkIHZhbGlkYXRlU3RhdGVfbCgpOworCisgICAgc3RhdGljIFN0cmluZzggc2Vzc2lvblRvU3RyaW5nKGNvbnN0IFNlc3Npb25LZXlUeXBlJiBzZXNzaW9uS2V5KTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogc2Vzc2lvblN0YXRlVG9TdHJpbmcoY29uc3QgU2Vzc2lvbjo6U3RhdGUgc2Vzc2lvblN0YXRlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfU0VTU0lPTl9DT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1VpZFBvbGljeS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nVWlkUG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkZTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1VpZFBvbGljeS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfVUlEX1BPTElDWV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfVUlEX1BPTElDWV9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvVWlkUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCitzdHJ1Y3QgQUFjdGl2aXR5TWFuYWdlcl9VaWRJbXBvcnRhbmNlTGlzdGVuZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gT2JzZXJ2ZXIgZm9yIFVJRCBsaWZlY3ljbGUgYW5kIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVpZCdzIGFwcAorLy8gcHJpb3JpdHkgdXNlZCBieSB0aGUgc2Vzc2lvbiBjb250cm9sbGVyLgorY2xhc3MgVHJhbnNjb2RpbmdVaWRQb2xpY3kgOiBwdWJsaWMgVWlkUG9saWN5SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBUcmFuc2NvZGluZ1VpZFBvbGljeSgpOworICAgIH5UcmFuc2NvZGluZ1VpZFBvbGljeSgpOworCisgICAgLy8gVWlkUG9saWN5SW50ZXJmYWNlCisgICAgYm9vbCBpc1VpZE9uVG9wKHVpZF90IHVpZCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKSBvdmVycmlkZTsKKyAgICB2b2lkIHVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgb3ZlcnJpZGU7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiBnZXRUb3BVaWRzKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYikgb3ZlcnJpZGU7CisgICAgLy8gflVpZFBvbGljeUludGVyZmFjZQorCitwcml2YXRlOgorICAgIHZvaWQgb25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLCBpbnQzMl90IHByb2NTdGF0ZSk7CisgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisgICAgaW50MzJfdCBnZXRQcm9jU3RhdGVfbCh1aWRfdCB1aWQpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVM7CisgICAgdm9pZCB1cGRhdGVUb3BVaWRfbCgpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVM7CisKKyAgICBzdGF0aWMgdm9pZCBPblVpZEltcG9ydGFuY2UodWlkX3QgdWlkLCBpbnQzMl90IHVpZEltcG9ydGFuY2UsIHZvaWQqIGNvb2tpZSk7CisKKyAgICBzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworICAgIG11dGFibGUgTXV0ZXggbVVpZExvY2s7CisgICAgQUFjdGl2aXR5TWFuYWdlcl9VaWRJbXBvcnRhbmNlTGlzdGVuZXIqIG1VaWRPYnNlcnZlcjsKKworICAgIGJvb2wgbVJlZ2lzdGVyZWQgR1VBUkRFRF9CWShtVWlkTG9jayk7CisgICAgaW50MzJfdCBtVG9wVWlkU3RhdGUgR1VBUkRFRF9CWShtVWlkTG9jayk7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBpbnQzMl90PiBtVWlkU3RhdGVNYXAgR1VBUkRFRF9CWShtVWlkTG9jayk7CisgICAgc3RkOjptYXA8aW50MzJfdCwgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90Pj4gbVN0YXRlVWlkTWFwIEdVQVJERURfQlkobVVpZExvY2spOworICAgIHN0ZDo6d2Vha19wdHI8VWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+IG1VaWRQb2xpY3lDYWxsYmFjazsKK307ICAvLyBjbGFzcyBUcmFuc2NvZGluZ1VpZFBvbGljeQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1VpZFBvbGljeUludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1VpZFBvbGljeUludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDhkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVWlkUG9saWN5SW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9VSURfUE9MSUNZX0lOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVUlEX1BPTElDWV9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBVaWRQb2xpY3lDYWxsYmFja0ludGVyZmFjZTsKKworLy8gSW50ZXJmYWNlIGZvciB0aGUgY29udHJvbGxlciB0byBxdWVyeSBhIHVpZCdzIGluZm8uCitjbGFzcyBVaWRQb2xpY3lJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIEluc3RydWN0IHRoZSB1aWQgcG9saWN5IHRvIHN0YXJ0IG1vbml0b3JpbmcgYSB1aWQuCisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpID0gMDsKKyAgICAvLyBJbnN0cnVjdCB0aGUgdWlkIHBvbGljeSB0byBzdG9wIG1vbml0b3JpbmcgYSB1aWQuCisgICAgdmlydHVhbCB2b2lkIHVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgPSAwOworICAgIC8vIFdoZXRoZXIgYSB1aWQgaXMgYW1vbmcgdGhlIHNldCBvZiB1aWRzIHRoYXQncyBjdXJyZW50bHkgdG9wIHByaW9yaXR5LgorICAgIHZpcnR1YWwgYm9vbCBpc1VpZE9uVG9wKHVpZF90IHVpZCkgPSAwOworICAgIC8vIFJldHJpZXZlcyB0aGUgc2V0IG9mIHVpZHMgdGhhdCdzIGN1cnJlbnRseSB0b3AgcHJpb3JpdHkuCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IGdldFRvcFVpZHMoKSBjb25zdCA9IDA7CisgICAgLy8gU2V0IHRoZSBhc3NvY2lhdGVkIGNhbGxiYWNrIGludGVyZmFjZSB0byBzZW5kIHRoZSBldmVudHMgd2hlbiB1aWQgc3RhdGVzIGNoYW5nZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFVpZFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflVpZFBvbGljeUludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKKy8vIEludGVyZmFjZSBmb3Igbm90aWZ5aW5nIHRoZSBjb250cm9sbGVyIG9mIGEgY2hhbmdlIGluIHVpZCBzdGF0ZXMuCitjbGFzcyBVaWRQb2xpY3lDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIHNldCBvZiB1aWRzIHRoYXQncyB0b3AgcHJpb3JpdHkgYW1vbmcgdGhlIHVpZHMgb2YgaW50ZXJlc3QKKyAgICAvLyBoYXMgY2hhbmdlZC4gVGhlIHJlY2VpdmVyIG9mIHRoaXMgY2FsbGJhY2sgc2hvdWxkIGFkanVzdCBhY2NvcmRpbmdseS4KKyAgICB2aXJ0dWFsIHZvaWQgb25Ub3BVaWRzQ2hhbmdlZChjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+JiB1aWRzKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5VaWRQb2xpY3lDYWxsYmFja0ludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVUlEX1BPTElDWV9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZV90ZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlX3Rlc3RzLmNwcAppbmRleCBkNThhZjRlLi5hMzVjYTUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlX3Rlc3RzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlX3Rlc3RzLmNwcApAQCAtMzYsNyArMzYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJbnRVbmlxdWVQdHJDb21wIHsKLSAgIHB1YmxpYzoKK3B1YmxpYzoKICAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPGludD4mIGxocywgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPGludD4mIHJocykgY29uc3QgewogICAgICAgICByZXR1cm4gKmxocyA8ICpyaHM7CiAgICAgfQpAQCAtMjIzLDE5ICsyMjMsMTkgQEAKIH0KIAogLy8gVGVzdCB0aGUgaGVhcCBwcm9wZXJ0eSBhbmQgbWFrZSBzdXJlIGl0IGlzIHRoZSBzYW1lIGFzIHN0ZDo6cHJpb3JpdHlfcXVldWUuCi1URVNUKEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlVGVzdCwgVHJhbnNjb2RpbmdKb2JUZXN0KSB7Ci0gICAgLy8gVGVzdCBkYXRhIHN0cnVjdHVyZSB0aGF0IG1pbWljcyB0aGUgVHJhbnNjb2Rpbmcgam9iLgotICAgIHN0cnVjdCBUcmFuc2NvZGluZ0pvYiB7CitURVNUKEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlVGVzdCwgVHJhbnNjb2RpbmdTZXNzaW9uVGVzdCkgeworICAgIC8vIFRlc3QgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBtaW1pY3MgdGhlIFRyYW5zY29kaW5nIHNlc3Npb24uCisgICAgc3RydWN0IFRyYW5zY29kaW5nU2Vzc2lvbiB7CiAgICAgICAgIGludDMyX3QgcHJpb3JpdHk7CiAgICAgICAgIGludDY0X3QgY3JlYXRlVGltZVVzOwogICAgIH07CiAKLSAgICAvLyBUaGUgam9iIGlzIGFycmFuZ2luZyBhY2NvcmRpbmcgdG8gcHJpb3JpdHkgd2l0aCBoaWdoZXN0IHByaW9yaXR5IGNvbWVzIGZpcnN0LgotICAgIC8vIEZvciB0aGUgam9iIHdpdGggdGhlIHNhbWUgcHJpb3JpdHksIHRoZSBqb2Igd2l0aCBlYXJseSBjcmVhdGVUaW1lIHdpbGwgY29tZSBmaXJzdC4KLSAgICBjbGFzcyBUcmFuc2NvZGluZ0pvYkNvbXAgewotICAgICAgIHB1YmxpYzoKLSAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0pvYj4mIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0pvYj4mIHJocykgY29uc3QgeworICAgIC8vIFRoZSBzZXNzaW9uIGlzIGFycmFuZ2luZyBhY2NvcmRpbmcgdG8gcHJpb3JpdHkgd2l0aCBoaWdoZXN0IHByaW9yaXR5IGNvbWVzIGZpcnN0LgorICAgIC8vIEZvciB0aGUgc2Vzc2lvbiB3aXRoIHRoZSBzYW1lIHByaW9yaXR5LCB0aGUgc2Vzc2lvbiB3aXRoIGVhcmx5IGNyZWF0ZVRpbWUgd2lsbCBjb21lIGZpcnN0LgorICAgIGNsYXNzIFRyYW5zY29kaW5nU2Vzc2lvbkNvbXAgeworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ1Nlc3Npb24+JiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdTZXNzaW9uPiYgcmhzKSBjb25zdCB7CiAgICAgICAgICAgICBpZiAobGhzLT5wcmlvcml0eSAhPSByaHMtPnByaW9yaXR5KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGxocy0+cHJpb3JpdHkgPCByaHMtPnByaW9yaXR5OwogICAgICAgICAgICAgfQpAQCAtMjQ0LDQ2ICsyNDQsNDcgQEAKICAgICB9OwogCiAgICAgLy8gTWFwIHRvIHNhdmUgZWFjaCB2YWx1ZSdzIHBvc2l0aW9uIGluIHRoZSBoZWFwLgotICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIFRyYW5zY29kaW5nSm9iKj4gam9iSWRUb0pvYk1hcDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBUcmFuc2NvZGluZ1Nlc3Npb24qPiBzZXNzaW9uSWRUb1Nlc3Npb25NYXA7CiAKLSAgICBUcmFuc2NvZGluZ0pvYiB0ZXN0Sm9ic1tdID0gewotICAgICAgICAgICAgezEgLypwcmlvcml0eSovLCA2NiAvKmNyZWF0ZVRpbWVVcyovfSwgIC8vIEZpcnN0IGpvYiwKLSAgICAgICAgICAgIHsyIC8qcHJpb3JpdHkqLywgNjcgLypjcmVhdGVUaW1lVXMqL30sICAvLyBTZWNvbmQgam9iLAotICAgICAgICAgICAgezIgLypwcmlvcml0eSovLCA2NiAvKmNyZWF0ZVRpbWVVcyovfSwgIC8vIFRoaXJkIGpvYiwKLSAgICAgICAgICAgIHszIC8qcHJpb3JpdHkqLywgNjggLypjcmVhdGVUaW1lVXMqL30sICAvLyBGb3VydGggam9iLgorICAgIFRyYW5zY29kaW5nU2Vzc2lvbiB0ZXN0U2Vzc2lvbnNbXSA9IHsKKyAgICAgICAgICAgIHsxIC8qcHJpb3JpdHkqLywgNjYgLypjcmVhdGVUaW1lVXMqL30sICAvLyBGaXJzdCBzZXNzaW9uLAorICAgICAgICAgICAgezIgLypwcmlvcml0eSovLCA2NyAvKmNyZWF0ZVRpbWVVcyovfSwgIC8vIFNlY29uZCBzZXNzaW9uLAorICAgICAgICAgICAgezIgLypwcmlvcml0eSovLCA2NiAvKmNyZWF0ZVRpbWVVcyovfSwgIC8vIFRoaXJkIHNlc3Npb24sCisgICAgICAgICAgICB7MyAvKnByaW9yaXR5Ki8sIDY4IC8qY3JlYXRlVGltZVVzKi99LCAgLy8gRm91cnRoIHNlc3Npb24uCiAgICAgfTsKIAotICAgIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0pvYj4sIFRyYW5zY29kaW5nSm9iQ29tcD4gam9iUXVldWU7CisgICAgQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWU8c3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nU2Vzc2lvbj4sIFRyYW5zY29kaW5nU2Vzc2lvbkNvbXA+CisgICAgICAgICAgICBzZXNzaW9uUXVldWU7CiAKLSAgICAvLyBQdXNoZXMgYWxsIHRoZSBqb2JzIGludG8gdGhlIGhlYXAuCi0gICAgZm9yIChpbnQgam9iSWQgPSAwOyBqb2JJZCA8IDQ7ICsram9iSWQpIHsKLSAgICAgICAgYXV0byBuZXdKb2IgPSBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nSm9iPih0ZXN0Sm9ic1tqb2JJZF0pOwotICAgICAgICBqb2JJZFRvSm9iTWFwW2pvYklkXSA9IG5ld0pvYi5nZXQoKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoam9iUXVldWUucHVzaChzdGQ6Om1vdmUobmV3Sm9iKSkpOworICAgIC8vIFB1c2hlcyBhbGwgdGhlIHNlc3Npb25zIGludG8gdGhlIGhlYXAuCisgICAgZm9yIChpbnQgc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgNDsgKytzZXNzaW9uSWQpIHsKKyAgICAgICAgYXV0byBuZXdTZXNzaW9uID0gc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ1Nlc3Npb24+KHRlc3RTZXNzaW9uc1tzZXNzaW9uSWRdKTsKKyAgICAgICAgc2Vzc2lvbklkVG9TZXNzaW9uTWFwW3Nlc3Npb25JZF0gPSBuZXdTZXNzaW9uLmdldCgpOworICAgICAgICBFWFBFQ1RfVFJVRShzZXNzaW9uUXVldWUucHVzaChzdGQ6Om1vdmUobmV3U2Vzc2lvbikpKTsKICAgICB9CiAKLSAgICAvLyBDaGVjayB0aGUgam9iIHF1ZXVlIHNpemUuCi0gICAgRVhQRUNUX0VRKDQsIGpvYlF1ZXVlLnNpemUoKSk7CisgICAgLy8gQ2hlY2sgdGhlIHNlc3Npb24gcXVldWUgc2l6ZS4KKyAgICBFWFBFQ1RfRVEoNCwgc2Vzc2lvblF1ZXVlLnNpemUoKSk7CiAKLSAgICAvLyBDaGVjayB0aGUgdG9wIGFuZCBpdCBzaG91bGQgYmUgRm9ydGggam9iOiAoMywgNjgpCi0gICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nSm9iPiYgdG9wSm9iID0gam9iUXVldWUudG9wKCk7Ci0gICAgRVhQRUNUX0VRKDMsIHRvcEpvYi0+cHJpb3JpdHkpOwotICAgIEVYUEVDVF9FUSg2OCwgdG9wSm9iLT5jcmVhdGVUaW1lVXMpOworICAgIC8vIENoZWNrIHRoZSB0b3AgYW5kIGl0IHNob3VsZCBiZSBGb3J0aCBzZXNzaW9uOiAoMywgNjgpCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nU2Vzc2lvbj4mIHRvcFNlc3Npb24gPSBzZXNzaW9uUXVldWUudG9wKCk7CisgICAgRVhQRUNUX0VRKDMsIHRvcFNlc3Npb24tPnByaW9yaXR5KTsKKyAgICBFWFBFQ1RfRVEoNjgsIHRvcFNlc3Npb24tPmNyZWF0ZVRpbWVVcyk7CiAKICAgICAvLyBDb25zdW1lIHRoZSB0b3AuCi0gICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nSm9iPiBjb25zdW1lSm9iID0gam9iUXVldWUuY29uc3VtZV90b3AoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdTZXNzaW9uPiBjb25zdW1lU2Vzc2lvbiA9IHNlc3Npb25RdWV1ZS5jb25zdW1lX3RvcCgpOwogCi0gICAgLy8gQ2hlY2sgdGhlIHRvcCBhbmQgaXQgc2hvdWxkIGJlIFRoaXJkIEpvYiAoMiwgNjYpCi0gICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nSm9iPiYgdG9wSm9iMiA9IGpvYlF1ZXVlLnRvcCgpOwotICAgIEVYUEVDVF9FUSgyLCB0b3BKb2IyLT5wcmlvcml0eSk7Ci0gICAgRVhQRUNUX0VRKDY2LCB0b3BKb2IyLT5jcmVhdGVUaW1lVXMpOworICAgIC8vIENoZWNrIHRoZSB0b3AgYW5kIGl0IHNob3VsZCBiZSBUaGlyZCBTZXNzaW9uICgyLCA2NikKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdTZXNzaW9uPiYgdG9wU2Vzc2lvbjIgPSBzZXNzaW9uUXVldWUudG9wKCk7CisgICAgRVhQRUNUX0VRKDIsIHRvcFNlc3Npb24yLT5wcmlvcml0eSk7CisgICAgRVhQRUNUX0VRKDY2LCB0b3BTZXNzaW9uMi0+Y3JlYXRlVGltZVVzKTsKIAotICAgIC8vIENoYW5nZSB0aGUgU2Vjb25kIGpvYidzIHByaW9yaXR5IHRvIDQgZnJvbSAoMiwgNjcpIC0+ICg0LCA2NykuIEl0IHNob3VsZCBiZWNvbWVzIHRvcCBvZiB0aGUKLSAgICAvLyBxdWV1ZS4KLSAgICBqb2JJZFRvSm9iTWFwWzFdLT5wcmlvcml0eSA9IDQ7Ci0gICAgam9iUXVldWUucmVidWlsZCgpOwotICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0pvYj4mIHRvcEpvYjMgPSBqb2JRdWV1ZS50b3AoKTsKLSAgICBFWFBFQ1RfRVEoNCwgdG9wSm9iMy0+cHJpb3JpdHkpOwotICAgIEVYUEVDVF9FUSg2NywgdG9wSm9iMy0+Y3JlYXRlVGltZVVzKTsKKyAgICAvLyBDaGFuZ2UgdGhlIFNlY29uZCBzZXNzaW9uJ3MgcHJpb3JpdHkgdG8gNCBmcm9tICgyLCA2NykgLT4gKDQsIDY3KS4gSXQgc2hvdWxkIGJlY29tZXMKKyAgICAvLyB0b3Agb2YgdGhlIHF1ZXVlLgorICAgIHNlc3Npb25JZFRvU2Vzc2lvbk1hcFsxXS0+cHJpb3JpdHkgPSA0OworICAgIHNlc3Npb25RdWV1ZS5yZWJ1aWxkKCk7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nU2Vzc2lvbj4mIHRvcFNlc3Npb24zID0gc2Vzc2lvblF1ZXVlLnRvcCgpOworICAgIEVYUEVDVF9FUSg0LCB0b3BTZXNzaW9uMy0+cHJpb3JpdHkpOworICAgIEVYUEVDVF9FUSg2NywgdG9wU2Vzc2lvbjMtPmNyZWF0ZVRpbWVVcyk7CiB9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAppbmRleCA4MTkxYjAwLi5lNDlkZjM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMTAgQEAKIC8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBsaWJtZWRpYXRyYW5zY29kaW5nLgorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAidGVzdF9hc3NldHMiLAorICAgIHBhdGg6ICJhc3NldHMiLAorICAgIHNyY3M6IFsiYXNzZXRzLyoqLyoiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJtZWRpYXRyYW5zY29kaW5nX3Rlc3RfZGVmYXVsdHMiLAogCkBAIC0zOCw2ICs0NCwxNiBAQAogfQogCiAvLworLy8gVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlciB1bml0IHRlc3QKKy8vCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcl90ZXN0cyIsCisgICAgZGVmYXVsdHM6IFsibGlibWVkaWF0cmFuc2NvZGluZ190ZXN0X2RlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbIlRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJfdGVzdHMuY3BwIl0sCit9CisKKy8vCiAvLyBBZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZSB1bml0IHRlc3QKIC8vCiBjY190ZXN0IHsKQEAgLTQ1LDQgKzYxLDQgQEAKICAgICBkZWZhdWx0czogWyJsaWJtZWRpYXRyYW5zY29kaW5nX3Rlc3RfZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWVfdGVzdHMuY3BwIl0sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJfdGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJfdGVzdHMuY3BwCmluZGV4IDVkMjQxOWQuLjFhNTA5MjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlcl90ZXN0cy5jcHAKQEAgLTE5LDI2MiArMTksNTIyIEBACiAvLyAjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0IgogCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nU2VydmljZUNsaWVudC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0NvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3QuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGxpc3Q+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Ci11c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5UcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ7Ci11c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOwotdXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ0Vycm9yQ29kZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nUmVzdWx0UGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk7CiAKLWNvbnN0ZXhwciBpbnQzMl90IGtJbnZhbGlkQ2xpZW50SWQgPSAtMTsKLWNvbnN0ZXhwciBpbnQzMl90IGtJbnZhbGlkQ2xpZW50UGlkID0gLTE7Ci1jb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZENsaWVudFVpZCA9IC0xOwotY29uc3RleHByIGNvbnN0IGNoYXIqIGtJbnZhbGlkQ2xpZW50T3BQYWNrYWdlTmFtZSA9ICIiOworY29uc3RleHByIHBpZF90IGtJbnZhbGlkQ2xpZW50UGlkID0gLTU7Citjb25zdGV4cHIgcGlkX3Qga0ludmFsaWRDbGllbnRVaWQgPSAtMTA7Citjb25zdGV4cHIgY29uc3QgY2hhcioga0ludmFsaWRDbGllbnROYW1lID0gIiI7Citjb25zdGV4cHIgY29uc3QgY2hhcioga0ludmFsaWRDbGllbnRQYWNrYWdlID0gIiI7CiAKLWNvbnN0ZXhwciBpbnQzMl90IGtDbGllbnRJZCA9IDE7Ci1jb25zdGV4cHIgaW50MzJfdCBrQ2xpZW50UGlkID0gMjsKLWNvbnN0ZXhwciBpbnQzMl90IGtDbGllbnRVaWQgPSAzOwotY29uc3RleHByIGNvbnN0IGNoYXIqIGtDbGllbnRPcFBhY2thZ2VOYW1lID0gIlRlc3RDbGllbnQiOworY29uc3RleHByIGNvbnN0IGNoYXIqIGtDbGllbnROYW1lID0gIlRlc3RDbGllbnROYW1lIjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50UGFja2FnZSA9ICJUZXN0Q2xpZW50UGFja2FnZSI7CiAKLXN0cnVjdCBUZXN0Q2xpZW50IDogcHVibGljIEJuVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50IHsKLSAgICBUZXN0Q2xpZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+JiBzZXJ2aWNlKSA6IG1TZXJ2aWNlKHNlcnZpY2UpIHsKLSAgICAgICAgQUxPR0QoIlRlc3RDbGllbnQgQ3JlYXRlZCIpOwotICAgIH0KKyNkZWZpbmUgU0VTU0lPTihuKSAobikKIAotICAgIFN0YXR1cyBnZXROYW1lKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9ICJ0ZXN0X2NsaWVudCI7CitzdHJ1Y3QgVGVzdENsaWVudENhbGxiYWNrIDogcHVibGljIEJuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjayB7CisgICAgVGVzdENsaWVudENhbGxiYWNrKCkgeyBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrIENyZWF0ZWQiKTsgfQorCisgICAgdmlydHVhbCB+VGVzdENsaWVudENhbGxiYWNrKCkgeyBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrIGRlc3Ryb3llZCIpOyB9OworCisgICAgU3RhdHVzIG9wZW5GaWxlRGVzY3JpcHRvcihjb25zdCBzdGQ6OnN0cmluZyYgLyppbl9maWxlVXJpKi8sIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX21vZGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgIH0KIAotICAgIFN0YXR1cyBvblRyYW5zY29kaW5nRmluaXNoZWQoCi0gICAgICAgICAgICBpbnQzMl90IC8qIGluX2pvYklkICovLAotICAgICAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwmIC8qIGluX3Jlc3VsdCAqLykgb3ZlcnJpZGUgeworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nU3RhcnRlZChpbnQzMl90IC8qaW5fc2Vzc2lvbklkKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0YXR1czo6b2soKTsgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdQYXVzZWQoaW50MzJfdCAvKmluX3Nlc3Npb25JZCovKSBvdmVycmlkZSB7IHJldHVybiBTdGF0dXM6Om9rKCk7IH0KKworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nUmVzdW1lZChpbnQzMl90IC8qaW5fc2Vzc2lvbklkKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0YXR1czo6b2soKTsgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdGaW5pc2hlZChpbnQzMl90IGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVzdWx0UGFyY2VsJiBpbl9yZXN1bHQpIG92ZXJyaWRlIHsKKyAgICAgICAgRVhQRUNUX0VRKGluX3Nlc3Npb25JZCwgaW5fcmVzdWx0LnNlc3Npb25JZCk7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhGaW5pc2hlZChpbl9zZXNzaW9uSWQpKTsKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICBTdGF0dXMgb25UcmFuc2NvZGluZ0ZhaWxlZCgKLSAgICAgICAgICAgIGludDMyX3QgLyogaW5fam9iSWQgKi8sCi0gICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ0Vycm9yQ29kZSAvKmluX2Vycm9yQ29kZSAqLykgb3ZlcnJpZGUgeworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nRmFpbGVkKGludDMyX3QgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlIC8qaW5fZXJyb3JDb2RlICovKSBvdmVycmlkZSB7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhGYWlsZWQoaW5fc2Vzc2lvbklkKSk7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQogCi0gICAgU3RhdHVzIG9uQXdhaXROdW1iZXJPZkpvYnNDaGFuZ2VkKGludDMyX3QgLyogaW5fam9iSWQgKi8sIGludDMyX3QgLyogaW5fb2xkQXdhaXROdW1iZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLyogaW5fbmV3QXdhaXROdW1iZXIgKi8pIG92ZXJyaWRlIHsKKyAgICBTdGF0dXMgb25Bd2FpdE51bWJlck9mU2Vzc2lvbnNDaGFuZ2VkKGludDMyX3QgLyogaW5fc2Vzc2lvbklkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9vbGRBd2FpdE51bWJlciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLyogaW5fbmV3QXdhaXROdW1iZXIgKi8pIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICBTdGF0dXMgb25Qcm9ncmVzc1VwZGF0ZShpbnQzMl90IC8qIGluX2pvYklkICovLCBpbnQzMl90IC8qIGluX3Byb2dyZXNzICovKSBvdmVycmlkZSB7CisgICAgU3RhdHVzIG9uUHJvZ3Jlc3NVcGRhdGUoaW50MzJfdCAvKiBpbl9zZXNzaW9uSWQgKi8sIGludDMyX3QgLyogaW5fcHJvZ3Jlc3MgKi8pIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkgeyBBTE9HSSgiVGVzdENsaWVudCBkZXN0cm95ZWQiKTsgfTsKKyAgICBzdHJ1Y3QgRXZlbnQgeworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIE5vRXZlbnQsCisgICAgICAgICAgICBGaW5pc2hlZCwKKyAgICAgICAgICAgIEZhaWxlZCwKKyAgICAgICAgfSB0eXBlOworICAgICAgICBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZDsKKyAgICB9OwogCi0gICBwcml2YXRlOgotICAgIHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+IG1TZXJ2aWNlOwotICAgIFRlc3RDbGllbnQoY29uc3QgVGVzdENsaWVudCYpID0gZGVsZXRlOwotICAgIFRlc3RDbGllbnQmIG9wZXJhdG9yPShjb25zdCBUZXN0Q2xpZW50JikgPSBkZWxldGU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBFdmVudCBOb0V2ZW50ID0ge0V2ZW50OjpOb0V2ZW50LCAwfTsKKyNkZWZpbmUgREVDTEFSRV9FVkVOVChhY3Rpb24pIFwKKyAgICBzdGF0aWMgRXZlbnQgYWN0aW9uKFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSB7IHJldHVybiB7RXZlbnQ6OmFjdGlvbiwgc2Vzc2lvbklkfTsgfQorCisgICAgREVDTEFSRV9FVkVOVChGaW5pc2hlZCk7CisgICAgREVDTEFSRV9FVkVOVChGYWlsZWQpOworCisgICAgY29uc3QgRXZlbnQmIHBvcEV2ZW50KCkgeworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gTm9FdmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9ICptRXZlbnRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUV2ZW50UXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Qb3BwZWRFdmVudDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRXZlbnQgbVBvcHBlZEV2ZW50OworICAgIHN0ZDo6bGlzdDxFdmVudD4gbUV2ZW50UXVldWU7CisKKyAgICBUZXN0Q2xpZW50Q2FsbGJhY2soY29uc3QgVGVzdENsaWVudENhbGxiYWNrJikgPSBkZWxldGU7CisgICAgVGVzdENsaWVudENhbGxiYWNrJiBvcGVyYXRvcj0oY29uc3QgVGVzdENsaWVudENhbGxiYWNrJikgPSBkZWxldGU7Cit9OworCitib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdENsaWVudENhbGxiYWNrOjpFdmVudCYgbGhzLCBjb25zdCBUZXN0Q2xpZW50Q2FsbGJhY2s6OkV2ZW50JiByaHMpIHsKKyAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLnNlc3Npb25JZCA9PSByaHMuc2Vzc2lvbklkOworfQorCitzdHJ1Y3QgVGVzdENvbnRyb2xsZXIgOiBwdWJsaWMgQ29udHJvbGxlckNsaWVudEludGVyZmFjZSB7CisgICAgVGVzdENvbnRyb2xsZXIoKSB7IEFMT0dJKCJUZXN0Q29udHJvbGxlciBDcmVhdGVkIik7IH0KKworICAgIHZpcnR1YWwgflRlc3RDb250cm9sbGVyKCkgeyBBTE9HSSgiVGVzdENvbnRyb2xsZXIgRGVzdHJveWVkIik7IH0KKworICAgIGJvb2wgc3VibWl0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIHVpZF90IC8qdWlkKi8sCisgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYWxsYmFjaykgb3ZlcnJpZGUgeworICAgICAgICBTZXNzaW9uS2V5VHlwZSBzZXNzaW9uS2V5ID0gc3RkOjptYWtlX3BhaXIoY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgICAgIGlmIChtU2Vzc2lvbnMuY291bnQoc2Vzc2lvbktleSkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWNyZXQgbmFtZSB3ZSdsbCBjaGVjaywgdG8gdGVzdCBlcnJvciBwcm9wYWdhdGlvbiBmcm9tCisgICAgICAgIC8vIHRoZSBjb250cm9sbGVyIGJhY2sgdG8gY2xpZW50LgorICAgICAgICBpZiAocmVxdWVzdC5zb3VyY2VGaWxlUGF0aCA9PSAiYmFkX3NvdXJjZV9maWxlIikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVNlc3Npb25zW3Nlc3Npb25LZXldLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICBtU2Vzc2lvbnNbc2Vzc2lvbktleV0uY2FsbGJhY2sgPSBjbGllbnRDYWxsYmFjazsKKworICAgICAgICBtTGFzdFNlc3Npb24gPSBzZXNzaW9uS2V5OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGNhbmNlbChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSBvdmVycmlkZSB7CisgICAgICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBpZiAobVNlc3Npb25zLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvbnMuZXJhc2Uoc2Vzc2lvbktleSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0U2Vzc2lvbihDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwqIHJlcXVlc3QpIG92ZXJyaWRlIHsKKyAgICAgICAgU2Vzc2lvbktleVR5cGUgc2Vzc2lvbktleSA9IHN0ZDo6bWFrZV9wYWlyKGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICBpZiAobVNlc3Npb25zLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICooVHJhbnNjb2RpbmdSZXF1ZXN0KilyZXF1ZXN0ID0gbVNlc3Npb25zW3Nlc3Npb25LZXldLnJlcXVlc3Q7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgZmluaXNoTGFzdFNlc3Npb24oKSB7CisgICAgICAgIGF1dG8gaXQgPSBtU2Vzc2lvbnMuZmluZChtTGFzdFNlc3Npb24pOworICAgICAgICBpZiAoaXQgPT0gbVNlc3Npb25zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IGl0LT5zZWNvbmQuY2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjay0+b25UcmFuc2NvZGluZ0ZpbmlzaGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RTZXNzaW9uLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nUmVzdWx0UGFyY2VsKHttTGFzdFNlc3Npb24uc2Vjb25kLCAwLCBzdGQ6Om51bGxvcHR9KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb25zLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB2b2lkIGFib3J0TGFzdFNlc3Npb24oKSB7CisgICAgICAgIGF1dG8gaXQgPSBtU2Vzc2lvbnMuZmluZChtTGFzdFNlc3Npb24pOworICAgICAgICBpZiAoaXQgPT0gbVNlc3Npb25zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IGl0LT5zZWNvbmQuY2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjay0+b25UcmFuc2NvZGluZ0ZhaWxlZChtTGFzdFNlc3Npb24uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb25zLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgU2Vzc2lvbiB7CisgICAgICAgIFRyYW5zY29kaW5nUmVxdWVzdCByZXF1ZXN0OworICAgICAgICBzdGQ6OndlYWtfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiBjYWxsYmFjazsKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Q2xpZW50SWRUeXBlLCBTZXNzaW9uSWRUeXBlPiBTZXNzaW9uS2V5VHlwZTsKKyAgICBzdGQ6Om1hcDxTZXNzaW9uS2V5VHlwZSwgU2Vzc2lvbj4gbVNlc3Npb25zOworICAgIFNlc3Npb25LZXlUeXBlIG1MYXN0U2Vzc2lvbjsKIH07CiAKIGNsYXNzIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSAgIHB1YmxpYzoKLSAgICBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0KCkgOiBtQ2xpZW50TWFuYWdlcihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkpIHsKK3B1YmxpYzoKKyAgICBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0KCkKKyAgICAgICAgICA6IG1Db250cm9sbGVyKG5ldyBUZXN0Q29udHJvbGxlcigpKSwKKyAgICAgICAgICAgIG1DbGllbnRNYW5hZ2VyKG5ldyBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIobUNvbnRyb2xsZXIpKSB7CiAgICAgICAgIEFMT0dEKCJUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0IGNyZWF0ZWQiKTsKICAgICB9CiAKICAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoIm1lZGlhLnRyYW5zY29kaW5nIikpOwotICAgICAgICBtU2VydmljZSA9IElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6ZnJvbUJpbmRlcihiaW5kZXIpOwotICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBtZWRpYS50cmFzY29kaW5nIHNlcnZpY2UuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVzdENsaWVudCA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKKyAgICAgICAgbUNsaWVudENhbGxiYWNrMSA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnRDYWxsYmFjaz4oKTsKKyAgICAgICAgbUNsaWVudENhbGxiYWNrMiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnRDYWxsYmFjaz4oKTsKKyAgICAgICAgbUNsaWVudENhbGxiYWNrMyA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnRDYWxsYmFjaz4oKTsKICAgICB9CiAKLSAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgICAgICBBTE9HSSgiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCB0ZWFyIGRvd24iKTsKLSAgICAgICAgbVNlcnZpY2UgPSBudWxscHRyOwotICAgIH0KKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBBTE9HSSgiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCB0ZWFyIGRvd24iKTsgfQogCiAgICAgflRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QoKSB7IEFMT0dEKCJUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0IGRlc3Ryb3llZCIpOyB9CiAKLSAgICBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXImIG1DbGllbnRNYW5hZ2VyOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBtVGVzdENsaWVudCA9IG51bGxwdHI7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElNZWRpYVRyYW5zY29kaW5nU2VydmljZT4gbVNlcnZpY2UgPSBudWxscHRyOworICAgIHZvaWQgYWRkTXVsdGlwbGVDbGllbnRzKCkgeworICAgICAgICBFWFBFQ1RfRVEoCisgICAgICAgICAgICAgICAgbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2sxLCBrQ2xpZW50TmFtZSwga0NsaWVudFBhY2thZ2UsICZtQ2xpZW50MSksCisgICAgICAgICAgICAgICAgT0spOworICAgICAgICBFWFBFQ1RfTkUobUNsaWVudDEsIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgKKyAgICAgICAgICAgICAgICBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazIsIGtDbGllbnROYW1lLCBrQ2xpZW50UGFja2FnZSwgJm1DbGllbnQyKSwKKyAgICAgICAgICAgICAgICBPSyk7CisgICAgICAgIEVYUEVDVF9ORShtQ2xpZW50MiwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKAorICAgICAgICAgICAgICAgIG1DbGllbnRNYW5hZ2VyLT5hZGRDbGllbnQobUNsaWVudENhbGxiYWNrMywga0NsaWVudE5hbWUsIGtDbGllbnRQYWNrYWdlLCAmbUNsaWVudDMpLAorICAgICAgICAgICAgICAgIE9LKTsKKyAgICAgICAgRVhQRUNUX05FKG1DbGllbnQzLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEobUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpLCAzKTsKKyAgICB9CisKKyAgICB2b2lkIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT51bnJlZ2lzdGVyKCkuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobUNsaWVudDItPnVucmVnaXN0ZXIoKS5pc09rKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtQ2xpZW50My0+dW5yZWdpc3RlcigpLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9FUShtQ2xpZW50TWFuYWdlci0+Z2V0TnVtT2ZDbGllbnRzKCksIDApOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q29udHJvbGxlcj4gbUNvbnRyb2xsZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcj4gbUNsaWVudE1hbmFnZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gbUNsaWVudDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gbUNsaWVudDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gbUNsaWVudDM7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDbGllbnRDYWxsYmFjaz4gbUNsaWVudENhbGxiYWNrMTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiBtQ2xpZW50Q2FsbGJhY2syOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+IG1DbGllbnRDYWxsYmFjazM7CiB9OwogCi1URVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdEFkZGluZ1dpdGhJbnZhbGlkQ2xpZW50SWQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKLQotICAgIC8vIENyZWF0ZSBhIGNsaWVudCB3aXRoIGludmFsaWQgY2xpZW50IGlkLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8gPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQsIGtJbnZhbGlkQ2xpZW50SWQsIGtDbGllbnRQaWQsIGtDbGllbnRVaWQsIGtDbGllbnRPcFBhY2thZ2VOYW1lKTsKLQotICAgIC8vIEFkZCB0aGUgY2xpZW50IHRvIHRoZSBtYW5hZ2VyIGFuZCBleHBlY3QgZmFpbHVyZS4KLSAgICBzdGF0dXNfdCBlcnIgPSBtQ2xpZW50TWFuYWdlci5hZGRDbGllbnQoc3RkOjptb3ZlKGNsaWVudEluZm8pKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgIT0gT0spOworVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RBZGRpbmdXaXRoSW52YWxpZENsaWVudENhbGxiYWNrKSB7CisgICAgLy8gQWRkIGEgY2xpZW50IHdpdGggbnVsbCBjYWxsYmFjayBhbmQgZXhwZWN0IGZhaWx1cmUuCisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworICAgIHN0YXR1c190IGVyciA9IG1DbGllbnRNYW5hZ2VyLT5hZGRDbGllbnQobnVsbHB0ciwga0NsaWVudE5hbWUsIGtDbGllbnRQYWNrYWdlLCAmY2xpZW50KTsKKyAgICBFWFBFQ1RfRVEoZXJyLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQpOwogfQorLy8KKy8vVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RBZGRpbmdXaXRoSW52YWxpZENsaWVudFBpZCkgeworLy8gICAgLy8gQWRkIGEgY2xpZW50IHdpdGggaW52YWxpZCBQaWQgYW5kIGV4cGVjdCBmYWlsdXJlLgorLy8gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworLy8gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2sxLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50TmFtZSwga0NsaWVudFBhY2thZ2UsICZjbGllbnQpOworLy8gICAgRVhQRUNUX0VRKGVyciwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UKTsKKy8vfQogCi1URVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdEFkZGluZ1dpdGhJbnZhbGlkQ2xpZW50UGlkKSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBjbGllbnQgd2l0aCBpbnZhbGlkIFBpZC4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPiBjbGllbnRJbmZvID0KLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPigKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBrQ2xpZW50SWQsIGtJbnZhbGlkQ2xpZW50UGlkLCBrQ2xpZW50VWlkLCBrQ2xpZW50T3BQYWNrYWdlTmFtZSk7Ci0KLSAgICAvLyBBZGQgdGhlIGNsaWVudCB0byB0aGUgbWFuYWdlciBhbmQgZXhwZWN0IGZhaWx1cmUuCi0gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvKSk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyICE9IE9LKTsKLX0KLQotVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RBZGRpbmdXaXRoSW52YWxpZENsaWVudFVpZCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotCi0gICAgLy8gQ3JlYXRlIGEgY2xpZW50IHdpdGggaW52YWxpZCBVaWQuCi0gICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4gY2xpZW50SW5mbyA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4oCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudCwga0NsaWVudElkLCBrQ2xpZW50UGlkLCBrSW52YWxpZENsaWVudFVpZCwga0NsaWVudE9wUGFja2FnZU5hbWUpOwotCi0gICAgLy8gQWRkIHRoZSBjbGllbnQgdG8gdGhlIG1hbmFnZXIgYW5kIGV4cGVjdCBmYWlsdXJlLgotICAgIHN0YXR1c190IGVyciA9IG1DbGllbnRNYW5hZ2VyLmFkZENsaWVudChzdGQ6Om1vdmUoY2xpZW50SW5mbykpOwotICAgIEVYUEVDVF9UUlVFKGVyciAhPSBPSyk7CitURVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdEFkZGluZ1dpdGhJbnZhbGlkQ2xpZW50TmFtZSkgeworICAgIC8vIEFkZCBhIGNsaWVudCB3aXRoIGludmFsaWQgbmFtZSBhbmQgZXhwZWN0IGZhaWx1cmUuCisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworICAgIHN0YXR1c190IGVyciA9IG1DbGllbnRNYW5hZ2VyLT5hZGRDbGllbnQobUNsaWVudENhbGxiYWNrMSwga0ludmFsaWRDbGllbnROYW1lLCBrQ2xpZW50UGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnQpOworICAgIEVYUEVDVF9FUShlcnIsIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCk7CiB9CiAKIFRFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0QWRkaW5nV2l0aEludmFsaWRDbGllbnRQYWNrYWdlTmFtZSkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotCi0gICAgLy8gQ3JlYXRlIGEgY2xpZW50IHdpdGggaW52YWxpZCBwYWNrYWdlbmFtZS4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPiBjbGllbnRJbmZvID0KLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPigKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBrQ2xpZW50SWQsIGtDbGllbnRQaWQsIGtDbGllbnRVaWQsIGtJbnZhbGlkQ2xpZW50T3BQYWNrYWdlTmFtZSk7Ci0KLSAgICAvLyBBZGQgdGhlIGNsaWVudCB0byB0aGUgbWFuYWdlciBhbmQgZXhwZWN0IGZhaWx1cmUuCi0gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvKSk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyICE9IE9LKTsKKyAgICAvLyBBZGQgYSBjbGllbnQgd2l0aCBpbnZhbGlkIHBhY2thZ2VuYW1lIGFuZCBleHBlY3QgZmFpbHVyZS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7CisgICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2sxLCBrQ2xpZW50TmFtZSwga0ludmFsaWRDbGllbnRQYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaWVudCk7CisgICAgRVhQRUNUX0VRKGVyciwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UKTsKIH0KIAogVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RBZGRpbmdWYWxpZENsaWVudCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQxID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKKyAgICAvLyBBZGQgYSB2YWxpZCBjbGllbnQsIHNob3VsZCBzdWNjZWVkLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKyAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2sxLCBrQ2xpZW50TmFtZSwga0NsaWVudFBhY2thZ2UsICZjbGllbnQpOworICAgIEVYUEVDVF9FUShlcnIsIE9LKTsKKyAgICBFWFBFQ1RfTkUoY2xpZW50LmdldCgpLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpLCAxKTsKIAotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8gPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQxLCBrQ2xpZW50SWQsIGtDbGllbnRQaWQsIGtDbGllbnRVaWQsIGtDbGllbnRPcFBhY2thZ2VOYW1lKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1DbGllbnRNYW5hZ2VyLmFkZENsaWVudChzdGQ6Om1vdmUoY2xpZW50SW5mbykpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7Ci0KLSAgICBzaXplX3QgbnVtT2ZDbGllbnRzID0gbUNsaWVudE1hbmFnZXIuZ2V0TnVtT2ZDbGllbnRzKCk7Ci0gICAgRVhQRUNUX0VRKG51bU9mQ2xpZW50cywgMSk7Ci0KLSAgICBlcnIgPSBtQ2xpZW50TWFuYWdlci5yZW1vdmVDbGllbnQoa0NsaWVudElkKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgPT0gT0spOworICAgIC8vIFVucmVnaXN0ZXIgY2xpZW50LCBzaG91bGQgc3VjY2VlZC4KKyAgICBTdGF0dXMgc3RhdHVzID0gY2xpZW50LT51bnJlZ2lzdGVyKCk7CisgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnRNYW5hZ2VyLT5nZXROdW1PZkNsaWVudHMoKSwgMCk7CiB9CiAKIFRFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0QWRkaW5nRHVwbGlhY3RlQ2xpZW50KSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudDEgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKyAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2sxLCBrQ2xpZW50TmFtZSwga0NsaWVudFBhY2thZ2UsICZjbGllbnQpOworICAgIEVYUEVDVF9FUShlcnIsIE9LKTsKKyAgICBFWFBFQ1RfTkUoY2xpZW50LmdldCgpLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpLCAxKTsKIAotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8gPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQxLCBrQ2xpZW50SWQsIGtDbGllbnRQaWQsIGtDbGllbnRVaWQsIGtDbGllbnRPcFBhY2thZ2VOYW1lKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBkdXBDbGllbnQ7CisgICAgZXJyID0gbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2sxLCAiZHVwQ2xpZW50IiwgImR1cFBhY2thZ2UiLCAmZHVwQ2xpZW50KTsKKyAgICBFWFBFQ1RfRVEoZXJyLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0FMUkVBRFlfRVhJU1RTKTsKKyAgICBFWFBFQ1RfRVEoZHVwQ2xpZW50LmdldCgpLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpLCAxKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1DbGllbnRNYW5hZ2VyLmFkZENsaWVudChzdGQ6Om1vdmUoY2xpZW50SW5mbykpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7CisgICAgU3RhdHVzIHN0YXR1cyA9IGNsaWVudC0+dW5yZWdpc3RlcigpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50TWFuYWdlci0+Z2V0TnVtT2ZDbGllbnRzKCksIDApOwogCi0gICAgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvKSk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyICE9IE9LKTsKKyAgICBlcnIgPSBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazEsICJkdXBDbGllbnQiLCAiZHVwUGFja2FnZSIsICZkdXBDbGllbnQpOworICAgIEVYUEVDVF9FUShlcnIsIE9LKTsKKyAgICBFWFBFQ1RfTkUoZHVwQ2xpZW50LmdldCgpLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpLCAxKTsKIAotICAgIGVyciA9IG1DbGllbnRNYW5hZ2VyLnJlbW92ZUNsaWVudChrQ2xpZW50SWQpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7CisgICAgc3RhdHVzID0gZHVwQ2xpZW50LT51bnJlZ2lzdGVyKCk7CisgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnRNYW5hZ2VyLT5nZXROdW1PZkNsaWVudHMoKSwgMCk7CiB9CiAKIFRFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0QWRkaW5nTXVsdGlwbGVDbGllbnQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50MSA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPiBjbGllbnRJbmZvMSA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4oCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudDEsIGtDbGllbnRJZCwga0NsaWVudFBpZCwga0NsaWVudFVpZCwga0NsaWVudE9wUGFja2FnZU5hbWUpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvMSkpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50MiA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPiBjbGllbnRJbmZvMiA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4oCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudDIsIGtDbGllbnRJZCArIDEsIGtDbGllbnRQaWQsIGtDbGllbnRVaWQsIGtDbGllbnRPcFBhY2thZ2VOYW1lKTsKLQotICAgIGVyciA9IG1DbGllbnRNYW5hZ2VyLmFkZENsaWVudChzdGQ6Om1vdmUoY2xpZW50SW5mbzIpKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgPT0gT0spOwotCi0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudDMgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotCi0gICAgLy8gQ3JlYXRlIGEgY2xpZW50IHdpdGggaW52YWxpZCBwYWNrYWdlbmFtZS4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPiBjbGllbnRJbmZvMyA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4oCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudDMsIGtDbGllbnRJZCArIDIsIGtDbGllbnRQaWQsIGtDbGllbnRVaWQsIGtDbGllbnRPcFBhY2thZ2VOYW1lKTsKLQotICAgIGVyciA9IG1DbGllbnRNYW5hZ2VyLmFkZENsaWVudChzdGQ6Om1vdmUoY2xpZW50SW5mbzMpKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgPT0gT0spOwotCi0gICAgc2l6ZV90IG51bU9mQ2xpZW50cyA9IG1DbGllbnRNYW5hZ2VyLmdldE51bU9mQ2xpZW50cygpOwotICAgIEVYUEVDVF9FUShudW1PZkNsaWVudHMsIDMpOwotCi0gICAgZXJyID0gbUNsaWVudE1hbmFnZXIucmVtb3ZlQ2xpZW50KGtDbGllbnRJZCk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyID09IE9LKTsKLQotICAgIGVyciA9IG1DbGllbnRNYW5hZ2VyLnJlbW92ZUNsaWVudChrQ2xpZW50SWQgKyAxKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgPT0gT0spOwotCi0gICAgZXJyID0gbUNsaWVudE1hbmFnZXIucmVtb3ZlQ2xpZW50KGtDbGllbnRJZCArIDIpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7CisgICAgYWRkTXVsdGlwbGVDbGllbnRzKCk7CisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOwogfQogCi1URVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdFJlbW92aW5nTm9uRXhpc3RDbGllbnQpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBtQ2xpZW50TWFuYWdlci5yZW1vdmVDbGllbnQoa0ludmFsaWRDbGllbnRJZCk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyICE9IE9LKTsKK1RFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0U3VibWl0Q2FuY2VsR2V0U2Vzc2lvbnMpIHsKKyAgICBhZGRNdWx0aXBsZUNsaWVudHMoKTsKIAotICAgIGVyciA9IG1DbGllbnRNYW5hZ2VyLnJlbW92ZUNsaWVudCgxMDAwIC8qIGNsaWVudElkICovKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgIT0gT0spOworICAgIC8vIFRlc3Qgc2Vzc2lvbklkIGFzc2lnbm1lbnQuCisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHJlcXVlc3Q7CisgICAgcmVxdWVzdC5zb3VyY2VGaWxlUGF0aCA9ICJ0ZXN0X3NvdXJjZV9maWxlXzAiOworICAgIHJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aCA9ICJ0ZXN0X2Rlc2ludGFpb25fZmlsZV8wIjsKKyAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbjsKKyAgICBib29sIHJlc3VsdDsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigwKSk7CisKKyAgICByZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gInRlc3Rfc291cmNlX2ZpbGVfMSI7CisgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkZpbGVQYXRoID0gInRlc3RfZGVzaW50YWlvbl9maWxlXzEiOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDEpKTsKKworICAgIHJlcXVlc3Quc291cmNlRmlsZVBhdGggPSAidGVzdF9zb3VyY2VfZmlsZV8yIjsKKyAgICByZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPSAidGVzdF9kZXNpbnRhaW9uX2ZpbGVfMiI7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5zZXNzaW9uSWQsIFNFU1NJT04oMikpOworCisgICAgLy8gVGVzdCBzdWJtaXQgYmFkIHJlcXVlc3QgKG5vIHZhbGlkIHNvdXJjZUZpbGVQYXRoKSBmYWlscy4KKyAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwgYmFkUmVxdWVzdDsKKyAgICBiYWRSZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gImJhZF9zb3VyY2VfZmlsZSI7CisgICAgYmFkUmVxdWVzdC5kZXN0aW5hdGlvbkZpbGVQYXRoID0gImJhZF9kZXN0aW5hdGlvbl9maWxlIjsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0UmVxdWVzdChiYWRSZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsKKworICAgIC8vIFRlc3Qgc3VibWl0IHdpdGggYmFkIHBpZC91aWQuCisgICAgYmFkUmVxdWVzdC5zb3VyY2VGaWxlUGF0aCA9ICJ0ZXN0X3NvdXJjZV9maWxlXzMiOworICAgIGJhZFJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aCA9ICJ0ZXN0X2Rlc2ludGFpb25fZmlsZV8zIjsKKyAgICBiYWRSZXF1ZXN0LmNsaWVudFBpZCA9IGtJbnZhbGlkQ2xpZW50UGlkOworICAgIGJhZFJlcXVlc3QuY2xpZW50VWlkID0ga0ludmFsaWRDbGllbnRVaWQ7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdFJlcXVlc3QoYmFkUmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX0ZBTFNFKHJlc3VsdCk7CisKKyAgICAvLyBUZXN0IGdldCBzZXNzaW9ucyBieSBpZC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbldpdGhJZChTRVNTSU9OKDIpLCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5zZXNzaW9uSWQsIFNFU1NJT04oMikpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnJlcXVlc3Quc291cmNlRmlsZVBhdGgsICJ0ZXN0X3NvdXJjZV9maWxlXzIiKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworCisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbnMgYnkgaW52YWxpZCBpZCBmYWlscy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbldpdGhJZChTRVNTSU9OKDEwMCksICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9GQUxTRShyZXN1bHQpOworCisgICAgLy8gVGVzdCBjYW5jZWwgbm9uLWV4aXN0ZW50IHNlc3Npb24gZmFpbC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+Y2FuY2VsU2Vzc2lvbihTRVNTSU9OKDEwMCksICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX0ZBTFNFKHJlc3VsdCk7CisKKyAgICAvLyBUZXN0IGNhbmNlbCB2YWxpZCBzZXNzaW9uSWQgaW4gYXJiaXRyYXJ5IG9yZGVyLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWxTZXNzaW9uKFNFU1NJT04oMiksICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKKworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWxTZXNzaW9uKFNFU1NJT04oMCksICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKKworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWxTZXNzaW9uKFNFU1NJT04oMSksICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKKworICAgIC8vIFRlc3QgY2FuY2VsIHNlc3Npb24gYWdhaW4gZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbFNlc3Npb24oU0VTU0lPTigxKSwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsKKworICAgIC8vIFRlc3QgZ2V0IHNlc3Npb24gYWZ0ZXIgY2FuY2VsIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uV2l0aElkKFNFU1NJT04oMiksICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9GQUxTRShyZXN1bHQpOworCisgICAgLy8gVGVzdCBzZXNzaW9uSWQgaW5kZXBlbmRlbmNlIGZvciBlYWNoIGNsaWVudC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigwKSk7CisKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigxKSk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CiB9CiAKLVRFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0Q2hlY2tDbGllbnRXaXRoQ2xpZW50SWQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKK1RFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0Q2xpZW50Q2FsbGJhY2spIHsKKyAgICBhZGRNdWx0aXBsZUNsaWVudHMoKTsKIAotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8gPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQsIGtDbGllbnRJZCwga0NsaWVudFBpZCwga0NsaWVudFVpZCwga0NsaWVudE9wUGFja2FnZU5hbWUpOworICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCByZXF1ZXN0OworICAgIHJlcXVlc3Quc291cmNlRmlsZVBhdGggPSAidGVzdF9zb3VyY2VfZmlsZV9uYW1lIjsKKyAgICByZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPSAidGVzdF9kZXN0aW5hdGlvbl9maWxlX25hbWUiOworICAgIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCBzZXNzaW9uOworICAgIGJvb2wgcmVzdWx0OworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDApKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1DbGllbnRNYW5hZ2VyLmFkZENsaWVudChzdGQ6Om1vdmUoY2xpZW50SW5mbykpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7CisgICAgbUNvbnRyb2xsZXItPmZpbmlzaExhc3RTZXNzaW9uKCk7CisgICAgRVhQRUNUX0VRKG1DbGllbnRDYWxsYmFjazEtPnBvcEV2ZW50KCksIFRlc3RDbGllbnRDYWxsYmFjazo6RmluaXNoZWQoc2Vzc2lvbi5zZXNzaW9uSWQpKTsKIAotICAgIGJvb2wgcmVzID0gbUNsaWVudE1hbmFnZXIuaXNDbGllbnRJZFJlZ2lzdGVyZWQoa0NsaWVudElkKTsKLSAgICBFWFBFQ1RfVFJVRShyZXMpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDEpKTsKIAotICAgIHJlcyA9IG1DbGllbnRNYW5hZ2VyLmlzQ2xpZW50SWRSZWdpc3RlcmVkKGtJbnZhbGlkQ2xpZW50SWQpOwotICAgIEVYUEVDVF9GQUxTRShyZXMpOworICAgIG1Db250cm9sbGVyLT5hYm9ydExhc3RTZXNzaW9uKCk7CisgICAgRVhQRUNUX0VRKG1DbGllbnRDYWxsYmFjazEtPnBvcEV2ZW50KCksIFRlc3RDbGllbnRDYWxsYmFjazo6RmFpbGVkKHNlc3Npb24uc2Vzc2lvbklkKSk7CisKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigyKSk7CisKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigwKSk7CisKKyAgICBtQ29udHJvbGxlci0+ZmluaXNoTGFzdFNlc3Npb24oKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudENhbGxiYWNrMi0+cG9wRXZlbnQoKSwgVGVzdENsaWVudENhbGxiYWNrOjpGaW5pc2hlZChzZXNzaW9uLnNlc3Npb25JZCkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOwogfQogCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1RFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0VXNlQWZ0ZXJVbnJlZ2lzdGVyKSB7CisgICAgLy8gQWRkIGEgY2xpZW50LgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKyAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2sxLCBrQ2xpZW50TmFtZSwga0NsaWVudFBhY2thZ2UsICZjbGllbnQpOworICAgIEVYUEVDVF9FUShlcnIsIE9LKTsKKyAgICBFWFBFQ1RfTkUoY2xpZW50LmdldCgpLCBudWxscHRyKTsKKworICAgIC8vIFN1Ym1pdCAyIHJlcXVlc3RzLCAxIG9mZmxpbmUgYW5kIDEgcmVhbHRpbWUuCisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHJlcXVlc3Q7CisgICAgVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsIHNlc3Npb247CisgICAgYm9vbCByZXN1bHQ7CisKKyAgICByZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gInRlc3Rfc291cmNlX2ZpbGVfMCI7CisgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkZpbGVQYXRoID0gInRlc3RfZGVzdGluYXRpb25fZmlsZV8wIjsKKyAgICByZXF1ZXN0LnByaW9yaXR5ID0gVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtVbnNwZWNpZmllZDsKKyAgICBFWFBFQ1RfVFJVRShjbGllbnQtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSAmJiByZXN1bHQpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigwKSk7CisKKyAgICByZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gInRlc3Rfc291cmNlX2ZpbGVfMSI7CisgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkZpbGVQYXRoID0gInRlc3RfZGVzdGluYXRpb25fZmlsZV8xIjsKKyAgICByZXF1ZXN0LnByaW9yaXR5ID0gVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWw7CisgICAgRVhQRUNUX1RSVUUoY2xpZW50LT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkgJiYgcmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5zZXNzaW9uSWQsIFNFU1NJT04oMSkpOworCisgICAgLy8gVW5yZWdpc3RlciBjbGllbnQsIHNob3VsZCBzdWNjZWVkLgorICAgIFN0YXR1cyBzdGF0dXMgPSBjbGllbnQtPnVucmVnaXN0ZXIoKTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKworICAgIC8vIFRlc3Qgc3VibWl0IG5ldyByZXF1ZXN0IGFmdGVyIHVucmVnaXN0ZXIsIHNob3VsZCBmYWlsIHdpdGggRVJST1JfRElTQ09OTkVDVEVELgorICAgIHJlcXVlc3Quc291cmNlRmlsZVBhdGggPSAidGVzdF9zb3VyY2VfZmlsZV8yIjsKKyAgICByZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPSAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzIiOworICAgIHJlcXVlc3QucHJpb3JpdHkgPSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbDsKKyAgICBzdGF0dXMgPSBjbGllbnQtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKworICAgIC8vIFRlc3QgY2FuY2VsIHNlc3Npb25zIGFmdGVyIHVucmVnaXN0ZXIsIHNob3VsZCBmYWlsIHdpdGggRVJST1JfRElTQ09OTkVDVEVECisgICAgLy8gcmVnYXJkbGVzcyBvZiByZWFsdGltZSBvciBvZmZsaW5lIHNlc3Npb24sIG9yIHdoZXRoZXIgdGhlIHNlc3Npb25JZCBpcyB2YWxpZC4KKyAgICBzdGF0dXMgPSBjbGllbnQtPmNhbmNlbFNlc3Npb24oU0VTU0lPTigwKSwgJnJlc3VsdCk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworCisgICAgc3RhdHVzID0gY2xpZW50LT5jYW5jZWxTZXNzaW9uKFNFU1NJT04oMSksICZyZXN1bHQpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKworICAgIHN0YXR1cyA9IGNsaWVudC0+Y2FuY2VsU2Vzc2lvbihTRVNTSU9OKDIpLCAmcmVzdWx0KTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCk7CisKKyAgICAvLyBUZXN0IGdldCBzZXNzaW9ucywgc2hvdWxkIGZhaWwgd2l0aCBFUlJPUl9ESVNDT05ORUNURUQgcmVnYXJkbGVzcyBvZiByZWFsdGltZQorICAgIC8vIG9yIG9mZmxpbmUgc2Vzc2lvbiwgb3Igd2hldGhlciB0aGUgc2Vzc2lvbklkIGlzIHZhbGlkLgorICAgIHN0YXR1cyA9IGNsaWVudC0+Z2V0U2Vzc2lvbldpdGhJZChTRVNTSU9OKDApLCAmc2Vzc2lvbiwgJnJlc3VsdCk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworCisgICAgc3RhdHVzID0gY2xpZW50LT5nZXRTZXNzaW9uV2l0aElkKFNFU1NJT04oMSksICZzZXNzaW9uLCAmcmVzdWx0KTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCk7CisKKyAgICBzdGF0dXMgPSBjbGllbnQtPmdldFNlc3Npb25XaXRoSWQoU0VTU0lPTigyKSwgJnNlc3Npb24sICZyZXN1bHQpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcl90ZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNTJmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNjU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCBUZXN0IGZvciBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0IgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudDsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWw7CisKK2NvbnN0ZXhwciBDbGllbnRJZFR5cGUga0NsaWVudElkID0gMTAwMDsKK2NvbnN0ZXhwciBTZXNzaW9uSWRUeXBlIGtDbGllbnRTZXNzaW9uSWQgPSAwOworY29uc3RleHByIHVpZF90IGtDbGllbnRVaWQgPSA1MDAwOworY29uc3RleHByIHBpZF90IGtDbGllbnRQaWQgPSAxMDAwMDsKK2NvbnN0ZXhwciB1aWRfdCBrSW52YWxpZFVpZCA9ICh1aWRfdCktMTsKK2NvbnN0ZXhwciBwaWRfdCBrSW52YWxpZFBpZCA9IChwaWRfdCktMTsKKworI2RlZmluZSBDTElFTlQobikgKGtDbGllbnRJZCArIChuKSkKKyNkZWZpbmUgU0VTU0lPTihuKSAoa0NsaWVudFNlc3Npb25JZCArIChuKSkKKyNkZWZpbmUgVUlEKG4pIChrQ2xpZW50VWlkICsgKG4pKQorI2RlZmluZSBQSUQobikgKGtDbGllbnRQaWQgKyAobikpCisKK2NsYXNzIFRlc3RVaWRQb2xpY3kgOiBwdWJsaWMgVWlkUG9saWN5SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBUZXN0VWlkUG9saWN5KCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgflRlc3RVaWRQb2xpY3koKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBVaWRQb2xpY3lJbnRlcmZhY2UKKyAgICB2b2lkIHJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCAvKnVpZCovKSBvdmVycmlkZSB7fQorICAgIHZvaWQgdW5yZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgLyp1aWQqLykgb3ZlcnJpZGUge30KKyAgICBib29sIGlzVWlkT25Ub3AodWlkX3QgdWlkKSBvdmVycmlkZSB7IHJldHVybiBtVG9wVWlkcy5jb3VudCh1aWQpID4gMDsgfQorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gZ2V0VG9wVWlkcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1Ub3BVaWRzOyB9CisgICAgdm9pZCBzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYikgb3ZlcnJpZGUgeworICAgICAgICBtVWlkUG9saWN5Q2FsbGJhY2sgPSBjYjsKKyAgICB9CisgICAgdm9pZCBzZXRUb3AodWlkX3QgdWlkKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gdWlkcyA9IHt1aWR9OworICAgICAgICBzZXRUb3AodWlkcyk7CisgICAgfQorICAgIHZvaWQgc2V0VG9wKGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4mIHVpZHMpIHsKKyAgICAgICAgbVRvcFVpZHMgPSB1aWRzOworICAgICAgICBhdXRvIHVpZFBvbGljeUNiID0gbVVpZFBvbGljeUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKHVpZFBvbGljeUNiICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHVpZFBvbGljeUNiLT5vblRvcFVpZHNDaGFuZ2VkKG1Ub3BVaWRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gbVRvcFVpZHM7CisgICAgc3RkOjp3ZWFrX3B0cjxVaWRQb2xpY3lDYWxsYmFja0ludGVyZmFjZT4gbVVpZFBvbGljeUNhbGxiYWNrOworfTsKKworY2xhc3MgVGVzdFJlc291cmNlUG9saWN5IDogcHVibGljIFJlc291cmNlUG9saWN5SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBUZXN0UmVzb3VyY2VQb2xpY3koKSB7IHJlc2V0KCk7IH0KKyAgICB2aXJ0dWFsIH5UZXN0UmVzb3VyY2VQb2xpY3koKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBSZXNvdXJjZVBvbGljeUludGVyZmFjZQorICAgIHZvaWQgc2V0Q2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+JiAvKmNiKi8pIG92ZXJyaWRlIHt9CisgICAgdm9pZCBzZXRQaWRSZXNvdXJjZUxvc3QocGlkX3QgcGlkKSBvdmVycmlkZSB7CisgICAgICAgIG1SZXNvdXJjZUxvc3RQaWQgPSBwaWQ7CisgICAgfQorICAgIC8vIH5SZXNvdXJjZVBvbGljeUludGVyZmFjZQorCisgICAgcGlkX3QgZ2V0UGlkKCkgeworICAgICAgICBwaWRfdCByZXN1bHQgPSBtUmVzb3VyY2VMb3N0UGlkOworICAgICAgICByZXNldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUmVzb3VyY2VMb3N0UGlkID0ga0ludmFsaWRQaWQ7CisgICAgfQorICAgIHBpZF90IG1SZXNvdXJjZUxvc3RQaWQ7Cit9OworCitjbGFzcyBUZXN0VHJhbnNjb2RlciA6IHB1YmxpYyBUcmFuc2NvZGVySW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBUZXN0VHJhbnNjb2RlcigpIDogbUxhc3RFcnJvcihUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1Vua25vd24pIHt9CisgICAgdmlydHVhbCB+VGVzdFRyYW5zY29kZXIoKSB7fQorCisgICAgLy8gVHJhbnNjb2RlckludGVyZmFjZQorICAgIHZvaWQgc2V0Q2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYW5zY29kZXJDYWxsYmFja0ludGVyZmFjZT4mIC8qY2IqLykgb3ZlcnJpZGUge30KKworICAgIHZvaWQgc3RhcnQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgLypyZXF1ZXN0Ki8sCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiAvKmNsaWVudENhbGxiYWNrKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgbUV2ZW50UXVldWUucHVzaF9iYWNrKFN0YXJ0KGNsaWVudElkLCBzZXNzaW9uSWQpKTsKKyAgICB9CisgICAgdm9pZCBwYXVzZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSBvdmVycmlkZSB7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhQYXVzZShjbGllbnRJZCwgc2Vzc2lvbklkKSk7CisgICAgfQorICAgIHZvaWQgcmVzdW1lKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiAvKnJlcXVlc3QqLywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiAvKmNsaWVudENhbGxiYWNrKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgbUV2ZW50UXVldWUucHVzaF9iYWNrKFJlc3VtZShjbGllbnRJZCwgc2Vzc2lvbklkKSk7CisgICAgfQorICAgIHZvaWQgc3RvcChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSBvdmVycmlkZSB7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhTdG9wKGNsaWVudElkLCBzZXNzaW9uSWQpKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRmluaXNoZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgICAgICBtRXZlbnRRdWV1ZS5wdXNoX2JhY2soRmluaXNoZWQoY2xpZW50SWQsIHNlc3Npb25JZCkpOworICAgIH0KKworICAgIHZvaWQgb25GYWlsZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgVHJhbnNjb2RpbmdFcnJvckNvZGUgZXJyKSB7CisgICAgICAgIG1MYXN0RXJyb3IgPSBlcnI7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhGYWlsZWQoY2xpZW50SWQsIHNlc3Npb25JZCkpOworICAgIH0KKworICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlIGdldExhc3RFcnJvcigpIHsKKyAgICAgICAgVHJhbnNjb2RpbmdFcnJvckNvZGUgcmVzdWx0ID0gbUxhc3RFcnJvcjsKKyAgICAgICAgbUxhc3RFcnJvciA9IFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdHJ1Y3QgRXZlbnQgeworICAgICAgICBlbnVtIHsgTm9FdmVudCwgU3RhcnQsIFBhdXNlLCBSZXN1bWUsIFN0b3AsIEZpbmlzaGVkLCBGYWlsZWQgfSB0eXBlOworICAgICAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQ7CisgICAgICAgIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3RleHByIEV2ZW50IE5vRXZlbnQgPSB7RXZlbnQ6Ok5vRXZlbnQsIDAsIDB9OworCisjZGVmaW5lIERFQ0xBUkVfRVZFTlQoYWN0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgRXZlbnQgYWN0aW9uKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIHsgXAorICAgICAgICByZXR1cm4ge0V2ZW50OjphY3Rpb24sIGNsaWVudElkLCBzZXNzaW9uSWR9OyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgREVDTEFSRV9FVkVOVChTdGFydCk7CisgICAgREVDTEFSRV9FVkVOVChQYXVzZSk7CisgICAgREVDTEFSRV9FVkVOVChSZXN1bWUpOworICAgIERFQ0xBUkVfRVZFTlQoU3RvcCk7CisgICAgREVDTEFSRV9FVkVOVChGaW5pc2hlZCk7CisgICAgREVDTEFSRV9FVkVOVChGYWlsZWQpOworCisgICAgY29uc3QgRXZlbnQmIHBvcEV2ZW50KCkgeworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gTm9FdmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9ICptRXZlbnRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUV2ZW50UXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Qb3BwZWRFdmVudDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRXZlbnQgbVBvcHBlZEV2ZW50OworICAgIHN0ZDo6bGlzdDxFdmVudD4gbUV2ZW50UXVldWU7CisgICAgVHJhbnNjb2RpbmdFcnJvckNvZGUgbUxhc3RFcnJvcjsKK307CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBUZXN0VHJhbnNjb2Rlcjo6RXZlbnQmIGxocywgY29uc3QgVGVzdFRyYW5zY29kZXI6OkV2ZW50JiByaHMpIHsKKyAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLmNsaWVudElkID09IHJocy5jbGllbnRJZCAmJiBsaHMuc2Vzc2lvbklkID09IHJocy5zZXNzaW9uSWQ7Cit9CisKK3N0cnVjdCBUZXN0Q2xpZW50Q2FsbGJhY2sgOiBwdWJsaWMgQm5UcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrIHsKKyAgICBUZXN0Q2xpZW50Q2FsbGJhY2soVGVzdFRyYW5zY29kZXIqIG93bmVyLCBpbnQ2NF90IGNsaWVudElkKQorICAgICAgICAgIDogbU93bmVyKG93bmVyKSwgbUNsaWVudElkKGNsaWVudElkKSB7CisgICAgICAgIEFMT0dEKCJUZXN0Q2xpZW50IENyZWF0ZWQiKTsKKyAgICB9CisKKyAgICBTdGF0dXMgb3BlbkZpbGVEZXNjcmlwdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX2ZpbGVVcmkqLywgY29uc3Qgc3RkOjpzdHJpbmcmIC8qaW5fbW9kZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdTdGFydGVkKGludDMyX3QgLyppbl9zZXNzaW9uSWQqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RhdHVzOjpvaygpOyB9CisKKyAgICBTdGF0dXMgb25UcmFuc2NvZGluZ1BhdXNlZChpbnQzMl90IC8qaW5fc2Vzc2lvbklkKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0YXR1czo6b2soKTsgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdSZXN1bWVkKGludDMyX3QgLyppbl9zZXNzaW9uSWQqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RhdHVzOjpvaygpOyB9CisKKyAgICBTdGF0dXMgb25UcmFuc2NvZGluZ0ZpbmlzaGVkKGludDMyX3QgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwmIGluX3Jlc3VsdCkgb3ZlcnJpZGUgeworICAgICAgICBFWFBFQ1RfRVEoaW5fc2Vzc2lvbklkLCBpbl9yZXN1bHQuc2Vzc2lvbklkKTsKKyAgICAgICAgQUxPR0QoIlRlc3RDbGllbnRDYWxsYmFjazogcmVjZWl2ZWQgb25UcmFuc2NvZGluZ0ZpbmlzaGVkIik7CisgICAgICAgIG1Pd25lci0+b25GaW5pc2hlZChtQ2xpZW50SWQsIGluX3Nlc3Npb25JZCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdGYWlsZWQoaW50MzJfdCBpbl9zZXNzaW9uSWQsIFRyYW5zY29kaW5nRXJyb3JDb2RlIGluX2Vycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBtT3duZXItPm9uRmFpbGVkKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkLCBpbl9lcnJvckNvZGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvbkF3YWl0TnVtYmVyT2ZTZXNzaW9uc0NoYW5nZWQoaW50MzJfdCAvKiBpbl9zZXNzaW9uSWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIGluX29sZEF3YWl0TnVtYmVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9uZXdBd2FpdE51bWJlciAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblByb2dyZXNzVXBkYXRlKGludDMyX3QgLyogaW5fc2Vzc2lvbklkICovLCBpbnQzMl90IC8qIGluX3Byb2dyZXNzICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgdmlydHVhbCB+VGVzdENsaWVudENhbGxiYWNrKCkgeyBBTE9HSSgiVGVzdENsaWVudCBkZXN0cm95ZWQiKTsgfTsKKworcHJpdmF0ZToKKyAgICBUZXN0VHJhbnNjb2RlciogbU93bmVyOworICAgIGludDY0X3QgbUNsaWVudElkOworICAgIFRlc3RDbGllbnRDYWxsYmFjayhjb25zdCBUZXN0Q2xpZW50Q2FsbGJhY2smKSA9IGRlbGV0ZTsKKyAgICBUZXN0Q2xpZW50Q2FsbGJhY2smIG9wZXJhdG9yPShjb25zdCBUZXN0Q2xpZW50Q2FsbGJhY2smKSA9IGRlbGV0ZTsKK307CisKK2NsYXNzIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QoKSB7IEFMT0dJKCJUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCBjcmVhdGVkIik7IH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dJKCJUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCBzZXQgdXAiKTsKKyAgICAgICAgbVRyYW5zY29kZXIucmVzZXQobmV3IFRlc3RUcmFuc2NvZGVyKCkpOworICAgICAgICBtVWlkUG9saWN5LnJlc2V0KG5ldyBUZXN0VWlkUG9saWN5KCkpOworICAgICAgICBtUmVzb3VyY2VQb2xpY3kucmVzZXQobmV3IFRlc3RSZXNvdXJjZVBvbGljeSgpKTsKKyAgICAgICAgbUNvbnRyb2xsZXIucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIobVRyYW5zY29kZXIsIG1VaWRQb2xpY3ksIG1SZXNvdXJjZVBvbGljeSkpOworICAgICAgICBtVWlkUG9saWN5LT5zZXRDYWxsYmFjayhtQ29udHJvbGxlcik7CisKKyAgICAgICAgLy8gU2V0IHByaW9yaXR5IG9ubHksIGlnbm9yZSBvdGhlciBmaWVsZHMgZm9yIG5vdy4KKyAgICAgICAgbU9mZmxpbmVSZXF1ZXN0LnByaW9yaXR5ID0gVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtVbnNwZWNpZmllZDsKKyAgICAgICAgbVJlYWx0aW1lUmVxdWVzdC5wcmlvcml0eSA9IFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprSGlnaDsKKyAgICAgICAgbUNsaWVudENhbGxiYWNrMCA9CisgICAgICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPihtVHJhbnNjb2Rlci5nZXQoKSwgQ0xJRU5UKDApKTsKKyAgICAgICAgbUNsaWVudENhbGxiYWNrMSA9CisgICAgICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPihtVHJhbnNjb2Rlci5nZXQoKSwgQ0xJRU5UKDEpKTsKKyAgICAgICAgbUNsaWVudENhbGxiYWNrMiA9CisgICAgICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPihtVHJhbnNjb2Rlci5nZXQoKSwgQ0xJRU5UKDIpKTsKKyAgICAgICAgbUNsaWVudENhbGxiYWNrMyA9CisgICAgICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPihtVHJhbnNjb2Rlci5nZXQoKSwgQ0xJRU5UKDMpKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBBTE9HSSgiVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QgdGVhciBkb3duIik7IH0KKworICAgIH5UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCgpIHsgQUxPR0QoIlRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0IGRlc3Ryb3llZCIpOyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdFRyYW5zY29kZXI+IG1UcmFuc2NvZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0UmVzb3VyY2VQb2xpY3k+IG1SZXNvdXJjZVBvbGljeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcj4gbUNvbnRyb2xsZXI7CisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIG1PZmZsaW5lUmVxdWVzdDsKKyAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwgbVJlYWx0aW1lUmVxdWVzdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiBtQ2xpZW50Q2FsbGJhY2swOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+IG1DbGllbnRDYWxsYmFjazE7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDbGllbnRDYWxsYmFjaz4gbUNsaWVudENhbGxiYWNrMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiBtQ2xpZW50Q2FsbGJhY2szOworfTsKKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0U3VibWl0U2Vzc2lvbikgeworICAgIEFMT0dEKCJUZXN0U3VibWl0U2Vzc2lvbiIpOworCisgICAgLy8gU3RhcnQgd2l0aCBVSUQoMSkgb24gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMSkpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiB0byBDTElFTlQoMCkgaW4gVUlEKDApLgorICAgIC8vIFNob3VsZCBzdGFydCBpbW1lZGlhdGVseSAoYmVjYXVzZSB0aGlzIGlzIHRoZSBvbmx5IHNlc3Npb24pLgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCAwKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDApLgorICAgIC8vIFNob3VsZCBwYXVzZSBvZmZsaW5lIHNlc3Npb24gYW5kIHN0YXJ0IG5ldyBzZXNzaW9uLCAgZXZlbiBpZiBVSUQoMCkgaXMgbm90IG9uIHRvcC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNob3VsZCBiZSBxdWV1ZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHNlc3Npb24uCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMiksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDEpIGluIHNhbWUgdWlkLCBzaG91bGQgYmUgcXVldWVkIGFmdGVyIHRoZSBwcmV2aW91cworICAgIC8vIHNlc3Npb24uCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMSksIFNFU1NJT04oMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDIpIGluIFVJRCgxKS4KKyAgICAvLyBTaG91bGQgcGF1c2UgcHJldmlvdXMgc2Vzc2lvbiBhbmQgc3RhcnQgbmV3IHNlc3Npb24sIGJlY2F1c2UgVUlEKDEpIGlzIChoYXMgYmVlbikgdG9wLgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDIpLCBTRVNTSU9OKDApLCBVSUQoMSksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazIpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiwgc2hvdWxkbid0IGdlbmVyYXRlIGFueSBldmVudC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgyKSwgU0VTU0lPTigxKSwgVUlEKDEpLCBtT2ZmbGluZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazIpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gQnJpbmcgVUlEKDApIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDApKTsKKyAgICAvLyBTaG91bGQgcGF1c2UgY3VycmVudCBzZXNzaW9uLCBhbmQgcmVzdW1lIGxhc3Qgc2Vzc2lvbiBpbiBVSUQoMCkuCisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworfQorCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RDYW5jZWxTZXNzaW9uKSB7CisgICAgQUxPR0QoIlRlc3RDYW5jZWxTZXNzaW9uIik7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigwKSwgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIFNFU1NJT04oMSksIHNob3VsZCBub3Qgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMSksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIFNFU1NJT04oMiksIHNob3VsZCBub3Qgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMiksIFVJRCgwKSwgbU9mZmxpbmVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIENhbmNlbCBxdWV1ZWQgcmVhbC10aW1lIHNlc3Npb24uCisgICAgLy8gQ2FuY2VsIHJlYWwtdGltZSBzZXNzaW9uIFNFU1NJT04oMSksIHNob3VsZCBiZSBjYW5jZWxsZWQuCisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmNhbmNlbChDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKworICAgIC8vIENhbmNlbCBxdWV1ZWQgb2ZmbGluZSBzZXNzaW9uLgorICAgIC8vIENhbmNlbCBvZmZsaW5lIHNlc3Npb24gU0VTU0lPTigyKSwgc2hvdWxkIGJlIGNhbmNlbGxlZC4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+Y2FuY2VsKENMSUVOVCgwKSwgU0VTU0lPTigyKSkpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiBTRVNTSU9OKDMpLCBzaG91bGRuJ3QgY2F1c2UgYW55IGV2ZW50LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDMpLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBDYW5jZWwgcnVubmluZyByZWFsLXRpbWUgc2Vzc2lvbiBTRVNTSU9OKDApLgorICAgIC8vIC0gU2hvdWxkIGJlIHN0b3BwZWQgZmlyc3QgdGhlbiBjYW5jZWxsZWQuCisgICAgLy8gLSBTaG91bGQgYWxzbyBzdGFydCBvZmZsaW5lIHNlc3Npb24gU0VTU0lPTigyKSBiZWNhdXNlIHJlYWwtdGltZSBxdWV1ZSBpcyBlbXB0eS4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+Y2FuY2VsKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0b3AoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDMpKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTig0KSwgb2ZmbGluZSBTRVNTSU9OKDMpIHNob3VsZCBwYXVzZSBhbmQgU0VTU0lPTig0KQorICAgIC8vIHNob3VsZCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTig0KSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMykpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oNCkpKTsKKworICAgIC8vIENhbmNlbCBwYXVzZWQgU0VTU0lPTigzKS4gU0VTU0lPTigzKSBzaG91bGQgYmUgc3RvcHBlZC4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+Y2FuY2VsKENMSUVOVCgwKSwgU0VTU0lPTigzKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0b3AoQ0xJRU5UKDApLCBTRVNTSU9OKDMpKSk7Cit9CisKK1RFU1RfRihUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCwgVGVzdEZpbmlzaFNlc3Npb24pIHsKKyAgICBBTE9HRCgiVGVzdEZpbmlzaFNlc3Npb24iKTsKKworICAgIC8vIFN0YXJ0IHdpdGggdW5zcGVjaWZpZWQgdG9wIFVJRC4KKyAgICAvLyBGaW5pc2ggd2l0aG91dCBhbnkgc2Vzc2lvbnMgc3VibWl0dGVkLCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDApLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFN1Ym1pdCBvZmZsaW5lIHNlc3Npb24gU0VTU0lPTigwKSwgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigxKSwgc2hvdWxkIHBhdXNlIG9mZmxpbmUgc2Vzc2lvbiBhbmQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMSksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigyKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigyKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIEZpbmlzaCB3aGVuIHRoZSBzZXNzaW9uIG5ldmVyIHN0YXJ0ZWQsIHNob3VsZCBiZSBpZ25vcmVkLgorICAgIG1Db250cm9sbGVyLT5vbkZpbmlzaChDTElFTlQoMCksIFNFU1NJT04oMikpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gVUlEKDEpIG1vdmVzIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDEpKTsKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDEpIGluIFVJRCgxKSwgc2hvdWxkIHBhdXNlIHByZXZpb3VzIHNlc3Npb24gYW5kIHN0YXJ0CisgICAgLy8gbmV3IHNlc3Npb24uCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMSksIFNFU1NJT04oMCksIFVJRCgxKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTaW11bGF0ZSBGaW5pc2ggdGhhdCBhcnJpdmVkIGxhdGUsIGFmdGVyIHBhdXNlIGlzc3VlZCBieSBjb250cm9sbGVyLgorICAgIC8vIFNob3VsZCBzdGlsbCBiZSBwcm9wYWdhdGVkIHRvIGNsaWVudCwgYnV0IHNob3VsZG4ndCB0cmlnZ2VyIGFueSBuZXcgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgwKSwgU0VTU0lPTigxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisKKyAgICAvLyBGaW5pc2ggcnVubmluZyByZWFsLXRpbWUgc2Vzc2lvbiwgc2hvdWxkIHN0YXJ0IG5leHQgcmVhbC10aW1lIHNlc3Npb24gaW4gcXVldWUuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgxKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisKKyAgICAvLyBGaW5pc2ggcnVubmluZyByZWFsLXRpbWUgc2Vzc2lvbiwgc2hvdWxkIHJlc3VtZSBuZXh0IHNlc3Npb24gKG9mZmxpbmUgc2Vzc2lvbikgaW4gcXVldWUuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgwKSwgU0VTU0lPTigyKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gRmluaXNoIHJ1bm5pbmcgb2ZmbGluZSBzZXNzaW9uLgorICAgIG1Db250cm9sbGVyLT5vbkZpbmlzaChDTElFTlQoMCksIFNFU1NJT04oMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZpbmlzaGVkKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gRHVwbGljYXRlIGZpbmlzaCBmb3IgbGFzdCBzZXNzaW9uLCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDApLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0RmFpbFNlc3Npb24pIHsKKyAgICBBTE9HRCgiVGVzdEZhaWxTZXNzaW9uIik7CisKKyAgICAvLyBTdGFydCB3aXRoIHVuc3BlY2lmaWVkIHRvcCBVSUQuCisgICAgLy8gRmFpbCB3aXRob3V0IGFueSBzZXNzaW9ucyBzdWJtaXR0ZWQsIHNob3VsZCBiZSBpZ25vcmVkLgorICAgIG1Db250cm9sbGVyLT5vbkVycm9yKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbmtub3duKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFN1Ym1pdCBvZmZsaW5lIHNlc3Npb24gU0VTU0lPTigwKSwgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigxKSwgc2hvdWxkIHBhdXNlIG9mZmxpbmUgc2Vzc2lvbiBhbmQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMSksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigyKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigyKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIEZhaWwgd2hlbiB0aGUgc2Vzc2lvbiBuZXZlciBzdGFydGVkLCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICBtQ29udHJvbGxlci0+b25FcnJvcihDTElFTlQoMCksIFNFU1NJT04oMiksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBVSUQoMSkgbW92ZXMgdG8gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMSkpOworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMSkgaW4gVUlEKDEpLCBzaG91bGQgcGF1c2UgcHJldmlvdXMgc2Vzc2lvbiBhbmQgc3RhcnQKKyAgICAvLyBuZXcgc2Vzc2lvbi4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgxKSwgU0VTU0lPTigwKSwgVUlEKDEpLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2sxKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMSksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFNpbXVsYXRlIEZhaWwgdGhhdCBhcnJpdmVkIGxhdGUsIGFmdGVyIHBhdXNlIGlzc3VlZCBieSBjb250cm9sbGVyLgorICAgIC8vIFNob3VsZCBzdGlsbCBiZSBwcm9wYWdhdGVkIHRvIGNsaWVudCwgYnV0IHNob3VsZG4ndCB0cmlnZ2VyIGFueSBuZXcgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPm9uRXJyb3IoQ0xJRU5UKDApLCBTRVNTSU9OKDEpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1Vua25vd24pOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZhaWxlZChDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKworICAgIC8vIEZhaWwgcnVubmluZyByZWFsLXRpbWUgc2Vzc2lvbiwgc2hvdWxkIHN0YXJ0IG5leHQgcmVhbC10aW1lIHNlc3Npb24gaW4gcXVldWUuCisgICAgbUNvbnRyb2xsZXItPm9uRXJyb3IoQ0xJRU5UKDEpLCBTRVNTSU9OKDApLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1Vua25vd24pOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZhaWxlZChDTElFTlQoMSksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMikpKTsKKworICAgIC8vIEZhaWwgcnVubmluZyByZWFsLXRpbWUgc2Vzc2lvbiwgc2hvdWxkIHJlc3VtZSBuZXh0IHNlc3Npb24gKG9mZmxpbmUgc2Vzc2lvbikgaW4gcXVldWUuCisgICAgbUNvbnRyb2xsZXItPm9uRXJyb3IoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1Vua25vd24pOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZhaWxlZChDTElFTlQoMCksIFNFU1NJT04oMikpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBGYWlsIHJ1bm5pbmcgb2ZmbGluZSBzZXNzaW9uLCBhbmQgdGVzdCBlcnJvciBjb2RlIHByb3BhZ2F0aW9uLgorICAgIG1Db250cm9sbGVyLT5vbkVycm9yKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtJbnZhbGlkT3BlcmF0aW9uKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGYWlsZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtJbnZhbGlkT3BlcmF0aW9uKTsKKworICAgIC8vIER1cGxpY2F0ZSBmYWlsIGZvciBsYXN0IHNlc3Npb24sIHNob3VsZCBiZSBpZ25vcmVkLgorICAgIG1Db250cm9sbGVyLT5vbkVycm9yKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbmtub3duKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VG9wVWlkQ2hhbmdlZCkgeworICAgIEFMT0dEKCJUZXN0VG9wVWlkQ2hhbmdlZCIpOworCisgICAgLy8gU3RhcnQgd2l0aCB1bnNwZWNpZmllZCB0b3AgVUlELgorICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNlc3Npb24gc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNob3VsZCBub3Qgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMSksIFNFU1NJT04oMCksIFVJRCgwKSwgbU9mZmxpbmVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2sxKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIE1vdmUgVUlEKDEpIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDEpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMikgaW4gZGlmZmVyZW50IHVpZCBVSUQoMSkuCisgICAgLy8gU2hvdWxkIHBhdXNlIHByZXZpb3VzIHNlc3Npb24gYW5kIHN0YXJ0IG5ldyBzZXNzaW9uLgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDIpLCBTRVNTSU9OKDApLCBVSUQoMSksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazIpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gQnJpbmcgVUlEKDApIGJhY2sgdG8gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIEJyaW5nIGludmFsaWQgdWlkIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3Aoa0ludmFsaWRVaWQpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gRmluaXNoIHNlc3Npb24sIG5leHQgcmVhbC10aW1lIHNlc3Npb24gc2hvdWxkIHJlc3VtZS4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDApLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGaW5pc2hlZChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBGaW5pc2ggc2Vzc2lvbiwgb2ZmbGluZSBzZXNzaW9uIHNob3VsZCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDIpLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGaW5pc2hlZChDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMSksIFNFU1NJT04oMCkpKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VG9wVWlkU2V0Q2hhbmdlZCkgeworICAgIEFMT0dEKCJUZXN0VG9wVWlkQ2hhbmdlZF9NdWx0aXBsZVVpZHMiKTsKKworICAgIC8vIFN0YXJ0IHdpdGggdW5zcGVjaWZpZWQgdG9wIFVJRC4KKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDApLCBzZXNzaW9uIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFN1Ym1pdCBvZmZsaW5lIHNlc3Npb24gdG8gQ0xJRU5UKDApLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTZXQgVUlEKDApLCBVSUQoMSkgdG8gdG9wIHNldC4KKyAgICAvLyBVSUQoMCkgc2hvdWxkIGNvbnRpbnVlIHRvIHJ1bi4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3Aoe1VJRCgwKSwgVUlEKDEpfSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDIpIGluIGRpZmZlcmVudCB1aWQgVUlEKDEpLgorICAgIC8vIFVJRCgwKSBzaG91bGQgcGF1c2UgYW5kIFVJRCgxKSBzaG91bGQgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMiksIFNFU1NJT04oMCksIFVJRCgxKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBSZW1vdmUgVUlEKDApIGZyb20gdG9wIHNldCwgYW5kIG9ubHkgbGVhdmUgVUlEKDEpIGluIHRoZSBzZXQuCisgICAgLy8gVUlEKDEpIHNob3VsZCBjb250aW51ZSB0byBydW4uCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTZXQgVUlEKDApLCBVSUQoMikgdG8gdG9wIHNldC4KKyAgICAvLyBVSUQoMSkgc2hvdWxkIGNvbnRpbnVlIHRvIHJ1bi4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3Aoe1VJRCgxKSwgVUlEKDIpfSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBCcmluZyBVSUQoMCkgYmFjayB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgwKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gQnJpbmcgaW52YWxpZCB1aWQgdG8gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChrSW52YWxpZFVpZCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBGaW5pc2ggc2Vzc2lvbiwgbmV4dCByZWFsLXRpbWUgc2Vzc2lvbiBmcm9tIFVJRCgxKSBzaG91bGQgcmVzdW1lLCBldmVuIGlmIFVJRCgxKQorICAgIC8vIG5vIGxvbmdlciB0b3AuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgwKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gRmluaXNoIHNlc3Npb24sIG9mZmxpbmUgc2Vzc2lvbiBzaG91bGQgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgyKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApKSk7Cit9CisKK1RFU1RfRihUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCwgVGVzdFJlc291cmNlTG9zdCkgeworICAgIEFMT0dEKCJUZXN0UmVzb3VyY2VMb3N0Iik7CisKKyAgICAvLyBTdGFydCB3aXRoIHVuc3BlY2lmaWVkIHRvcCBVSUQuCisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIHRvIENMSUVOVCgwKSwgc2Vzc2lvbiBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgbVJlYWx0aW1lUmVxdWVzdC5jbGllbnRQaWQgPSBQSUQoMCk7CisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIHRvIENMSUVOVCgwKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtT2ZmbGluZVJlcXVlc3QuY2xpZW50UGlkID0gUElEKDApOworICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBNb3ZlIFVJRCgxKSB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDIpIGluIGRpZmZlcmVudCB1aWQgVUlEKDEpLgorICAgIC8vIFNob3VsZCBwYXVzZSBwcmV2aW91cyBzZXNzaW9uIGFuZCBzdGFydCBuZXcgc2Vzc2lvbi4KKyAgICBtUmVhbHRpbWVSZXF1ZXN0LmNsaWVudFBpZCA9IFBJRCgxKTsKKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgyKSwgU0VTU0lPTigwKSwgVUlEKDEpLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2syKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFRlc3QgMDogTm8gY2FsbCBpbnRvIFJlc291cmNlUG9saWN5IGlmIHJlc291cmNlIGxvc3QgaXMgZnJvbSBhIG5vbi1ydW5uaW5nCisgICAgLy8gb3Igbm9uLWV4aXN0ZW50IHNlc3Npb24uCisgICAgbUNvbnRyb2xsZXItPm9uUmVzb3VyY2VMb3N0KENMSUVOVCgwKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1SZXNvdXJjZVBvbGljeS0+Z2V0UGlkKCksIGtJbnZhbGlkUGlkKTsKKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUxvc3QoQ0xJRU5UKDMpLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVJlc291cmNlUG9saWN5LT5nZXRQaWQoKSwga0ludmFsaWRQaWQpOworCisgICAgLy8gVGVzdCAxOiBObyBxdWV1ZSBjaGFuZ2UgZHVyaW5nIHJlc291cmNlIGxvc3MuCisgICAgLy8gU2lnbmFsIHJlc291cmNlIGxvc3QuCisgICAgbUNvbnRyb2xsZXItPm9uUmVzb3VyY2VMb3N0KENMSUVOVCgyKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1SZXNvdXJjZVBvbGljeS0+Z2V0UGlkKCksIFBJRCgxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTaWduYWwgcmVzb3VyY2UgYXZhaWxhYmxlLCBDTElFTlQoMikgc2hvdWxkIHJlc3VtZS4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUF2YWlsYWJsZSgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFRlc3QgMjogQ2hhbmdlIG9mIHF1ZXVlIG9yZGVyIGR1cmluZyByZXNvdXJjZSBsb3NzLgorICAgIC8vIFNpZ25hbCByZXNvdXJjZSBsb3N0LgorICAgIG1Db250cm9sbGVyLT5vblJlc291cmNlTG9zdChDTElFTlQoMiksIFNFU1NJT04oMCkpOworICAgIEVYUEVDVF9FUShtUmVzb3VyY2VQb2xpY3ktPmdldFBpZCgpLCBQSUQoMSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gTW92ZSBVSUQoMCkgYmFjayB0byB0b3AsIHNob3VsZCBoYXZlIG5vIHJlc3VtZSBkdWUgdG8gbm8gcmVzb3VyY2UuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgwKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTaWduYWwgcmVzb3VyY2UgYXZhaWxhYmxlLCBDTElFTlQoMCkgc2hvdWxkIHJlc3VtZS4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUF2YWlsYWJsZSgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFRlc3QgMzogQWRkaW5nIG5ldyBxdWV1ZSBkdXJpbmcgcmVzb3VyY2UgbG9zcy4KKyAgICAvLyBTaWduYWwgcmVzb3VyY2UgbG9zdC4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUxvc3QoQ0xJRU5UKDApLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVJlc291cmNlUG9saWN5LT5nZXRQaWQoKSwgUElEKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIE1vdmUgVUlEKDIpIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDIpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMykgaW4gVUlEKDIpLCBzZXNzaW9uIHNob3VsZG4ndCBzdGFydCBkdWUgdG8gbm8gcmVzb3VyY2UuCisgICAgbVJlYWx0aW1lUmVxdWVzdC5jbGllbnRQaWQgPSBQSUQoMik7CisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMyksIFNFU1NJT04oMCksIFVJRCgyKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMyk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTaWduYWwgcmVzb3VyY2UgYXZhaWxhYmxlLCBDTElFTlQoMykncyBzZXNzaW9uIHNob3VsZCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUF2YWlsYWJsZSgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgzKSwgU0VTU0lPTigwKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2JhY2t5YXJkX2hldmNfMTkyMHgxMDgwXzIwTWJwcy5tcDQgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2Fzc2V0cy9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvYmFja3lhcmRfaGV2Y18xOTIweDEwODBfMjBNYnBzLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQxZWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2JhY2t5YXJkX2hldmNfMTkyMHgxMDgwXzIwTWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2N1YmljbGVfYXZjXzQ4MHgyNDBfYWFjXzI0S0h6Lm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3ZTFiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2Rlc2tfaGV2Y18xOTIweDEwODBfYWFjXzQ4S0h6X3JvdDkwLm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9kZXNrX2hldmNfMTkyMHgxMDgwX2FhY180OEtIel9yb3Q5MC5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0MmExNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9kZXNrX2hldmNfMTkyMHgxMDgwX2FhY180OEtIel9yb3Q5MC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2pldHNfaGV2Y18xMjgweDcyMF8yME1icHMubXA0IGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2pldHNfaGV2Y18xMjgweDcyMF8yME1icHMubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTRiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2Fzc2V0cy9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvamV0c19oZXZjXzEyODB4NzIwXzIwTWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2Fzc2V0cy9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBkOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL3BsZXhfaGV2Y18zODQweDIxNjBfMTJNYnBzLm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9wbGV4X2hldmNfMzg0MHgyMTYwXzEyTWJwcy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkZGEzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9wbGV4X2hldmNfMzg0MHgyMTYwXzEyTWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL3BsZXhfaGV2Y18zODQweDIxNjBfMjBNYnBzLm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9wbGV4X2hldmNfMzg0MHgyMTYwXzIwTWJwcy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlMzdiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9wbGV4X2hldmNfMzg0MHgyMTYwXzIwTWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCmluZGV4IGQ4ZTQ4MzAuLjVkYjkyNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTMsMjQgKzMsMzIgQEAKICMgUnVuIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5LgogIwogCi1pZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KLSAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCi0gICAgZXhpdCAtMQoraWYgWyAiJFNZTkNfRklOSVNIRUQiICE9IHRydWUgXTsgdGhlbgorICBpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICAgIGV4aXQgLTEKKyAgZmkKKworICAjIGVuc3VyZSB3ZSBoYXZlIG1tCisgIC4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKKyAgbW0KKworICBlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKKyAgYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50ICYmIGFkYiBzeW5jCiBmaQogCi0jIGVuc3VyZSB3ZSBoYXZlIG1tCi0uICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAotCi1tbQotCi1lY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCi0KLWFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudCAmJiBhZGIgc3luYwotCiBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogCiBlY2hvICJ0ZXN0aW5nIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciIKLWFkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlcl90ZXN0cworI2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlcl90ZXN0cworYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlcl90ZXN0cwogCiBlY2hvICJ0ZXN0aW5nIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlIgotYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9BZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZV90ZXN0cy9BZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZV90ZXN0cworI2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWVfdGVzdHMvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWVfdGVzdHMKK2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0L0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlX3Rlc3RzL0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlX3Rlc3RzCisKK2VjaG8gInRlc3RpbmcgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlciIKKyNhZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJfdGVzdHMvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcl90ZXN0cworYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcl90ZXN0cy9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyX3Rlc3RzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL3B1c2hfYXNzZXRzLnNoIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9wdXNoX2Fzc2V0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYzcxNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9wdXNoX2Fzc2V0cy5zaApAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vYmFzaAorIworIyBQdXNoZXMgdGhlIGFzc2V0cyB0byB0aGUgL2RhdGEvbG9jYWwvdG1wLgorIworCitpZiBbICIkU1lOQ19GSU5JU0hFRCIgIT0gdHJ1ZSBdOyB0aGVuCisgIGlmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgICAgZXhpdCAtMQorICBmaQorCisgICMgZW5zdXJlIHdlIGhhdmUgbW0KKyAgLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworICBtbQorCisgIGVjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKKworICBhZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKK2ZpCisKK2VjaG8gIkNvcHlpbmcgZmlsZXMgdG8gZGV2aWNlIgorCithZGIgc2hlbGwgbWtkaXIgLXAgL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cworCitGSUxFUz0kQU5EUk9JRF9CVUlMRF9UT1AvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2Fzc2V0cy9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvKgorZm9yIGZpbGUgaW4gJEZJTEVTCitkbyAKK2FkYiBwdXNoIC0tc3luYyAkZmlsZSAvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzCitkb25lCisKK2VjaG8gIkNvcHkgZG9uZSIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3Y2RkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogIm1lZGlhdHJhbnNjb2Rlcl9kZWZhdWx0cyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYVNhbXBsZVF1ZXVlLmNwcCIsCisgICAgICAgICJNZWRpYVNhbXBsZVJlYWRlck5ESy5jcHAiLAorICAgICAgICAiTWVkaWFTYW1wbGVXcml0ZXIuY3BwIiwKKyAgICAgICAgIk1lZGlhVHJhY2tUcmFuc2NvZGVyLmNwcCIsCisgICAgICAgICJNZWRpYVRyYW5zY29kZXIuY3BwIiwKKyAgICAgICAgIk5ka0NvbW1vbi5jcHAiLAorICAgICAgICAiUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIuY3BwIiwKKyAgICAgICAgIlZpZGVvVHJhY2tUcmFuc2NvZGVyLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdmb3JtYXQiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV3RocmVhZC1zYWZldHkiLAorICAgICAgICAiLVd1bnVzZWQiLAorICAgICAgICAiLVd1bnJlYWNoYWJsZS1jb2RlIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWF0cmFuc2NvZGVyIiwKKyAgICBkZWZhdWx0czogWyJtZWRpYXRyYW5zY29kZXJfZGVmYXVsdHMiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlUXVldWUuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlUXVldWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODVjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFTYW1wbGVRdWV1ZS5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU2FtcGxlUXVldWUiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUXVldWUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIE1lZGlhU2FtcGxlUXVldWU6OmVucXVldWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKCFtQWJvcnRlZCkgeworICAgICAgICBtU2FtcGxlUXVldWUucHVzaChzYW1wbGUpOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisgICAgcmV0dXJuIG1BYm9ydGVkOworfQorCisvLyBVbmZvcnR1bmF0ZWx5IHN0ZDo6dW5pcXVlX2xvY2sgaXMgaW5jb21wYXRpYmxlIHdpdGggLVd0aHJlYWQtc2FmZXR5Citib29sIE1lZGlhU2FtcGxlUXVldWU6OmRlcXVldWUoc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiogc2FtcGxlKSBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICB3aGlsZSAobVNhbXBsZVF1ZXVlLmVtcHR5KCkgJiYgIW1BYm9ydGVkKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICB9CisKKyAgICBpZiAoIW1BYm9ydGVkKSB7CisgICAgICAgIGlmIChzYW1wbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKnNhbXBsZSA9IG1TYW1wbGVRdWV1ZS5mcm9udCgpOworICAgICAgICB9CisgICAgICAgIG1TYW1wbGVRdWV1ZS5wb3AoKTsKKyAgICB9CisgICAgcmV0dXJuIG1BYm9ydGVkOworfQorCitib29sIE1lZGlhU2FtcGxlUXVldWU6OmlzRW1wdHkoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIG1TYW1wbGVRdWV1ZS5lbXB0eSgpOworfQorCit2b2lkIE1lZGlhU2FtcGxlUXVldWU6OmFib3J0KCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIC8vIENsZWFyIHRoZSBxdWV1ZSBhbmQgbm90aWZ5IGNvbnN1bWVycy4KKyAgICBzdGQ6OnF1ZXVlPHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4+IGVtcHR5ID0ge307CisgICAgc3RkOjpzd2FwKG1TYW1wbGVRdWV1ZSwgZW1wdHkpOworICAgIG1BYm9ydGVkID0gdHJ1ZTsKKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlUmVhZGVyTkRLLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVNhbXBsZVJlYWRlck5ESy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiYTgxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVNhbXBsZVJlYWRlck5ESy5jcHAKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVNhbXBsZVJlYWRlciIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDaGVjayB0aGF0IHRoZSBleHRyYWN0b3Igc2FtcGxlIGZsYWdzIGhhdmUgdGhlIGV4cGVjdGVkIE5ESyBtZWFuaW5nLgorc3RhdGljX2Fzc2VydChTQU1QTEVfRkxBR19TWU5DX1NBTVBMRSA9PSBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfU1lOQywKKyAgICAgICAgICAgICAgIlNhbXBsZSBmbGFnIG1pc21hdGNoOiBTWU5DX1NBTVBMRSIpOworCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChpbnQgZmQsIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgICBBTWVkaWFFeHRyYWN0b3IqIGV4dHJhY3RvciA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIEFNZWRpYUV4dHJhY3RvciI7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoZXh0cmFjdG9yLCBmZCwgb2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkIHJldHVybmVkIGVycm9yOiAiIDw8IHN0YXR1czsKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShleHRyYWN0b3IpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBhdXRvIHNhbXBsZVJlYWRlciA9IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlck5ESz4obmV3IE1lZGlhU2FtcGxlUmVhZGVyTkRLKGV4dHJhY3RvcikpOworICAgIHJldHVybiBzYW1wbGVSZWFkZXI7Cit9CisKK01lZGlhU2FtcGxlUmVhZGVyTkRLOjpNZWRpYVNhbXBsZVJlYWRlck5ESyhBTWVkaWFFeHRyYWN0b3IqIGV4dHJhY3RvcikKKyAgICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLCBtVHJhY2tDb3VudChBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChtRXh0cmFjdG9yKSkgeworICAgIGlmIChtVHJhY2tDb3VudCA+IDApIHsKKyAgICAgICAgbVRyYWNrQ3Vyc29ycy5yZXNpemUobVRyYWNrQ291bnQpOworICAgIH0KK30KKworTWVkaWFTYW1wbGVSZWFkZXJOREs6On5NZWRpYVNhbXBsZVJlYWRlck5ESygpIHsKKyAgICBpZiAobUV4dHJhY3RvciAhPSBudWxscHRyKSB7CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUV4dHJhY3Rvcik7CisgICAgfQorfQorCit2b2lkIE1lZGlhU2FtcGxlUmVhZGVyTkRLOjphZHZhbmNlVHJhY2tfbChpbnQgdHJhY2tJbmRleCkgeworICAgIGlmICghbUVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKSB7CisgICAgICAgIC8vIE5vdGU6IFBvc2l0aW9uaW5nIHRoZSBleHRyYWN0b3IgYmVmb3JlIGFkdmFuY2luZyB0aGUgdHJhY2sgaXMgbmVlZGVkIGZvciB0d28gcmVhc29uczoKKyAgICAgICAgLy8gMS4gVG8gZW5hYmxlIG11bHRpcGxlIGFkdmFuY2VzIHdpdGhvdXQgZXhwbGljaXRseSBsZXR0aW5nIHRoZSBleHRyYWN0b3IgY2F0Y2ggdXAuCisgICAgICAgIC8vIDIuIFRvIHByZXZlbnQgdGhlIGV4dHJhY3RvciBmcm9tIGJlaW5nIGZhcnRoZXIgdGhhbiAibmV4dCIuCisgICAgICAgICh2b2lkKW1vdmVUb1RyYWNrX2wodHJhY2tJbmRleCk7CisgICAgfQorCisgICAgU2FtcGxlQ3Vyc29yJiBjdXJzb3IgPSBtVHJhY2tDdXJzb3JzW3RyYWNrSW5kZXhdOworICAgIGN1cnNvci5wcmV2aW91cyA9IGN1cnNvci5jdXJyZW50OworICAgIGN1cnNvci5jdXJyZW50ID0gY3Vyc29yLm5leHQ7CisgICAgY3Vyc29yLm5leHQucmVzZXQoKTsKKworICAgIGlmIChtRW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MgJiYgdHJhY2tJbmRleCA9PSBtRXh0cmFjdG9yVHJhY2tJbmRleCkgeworICAgICAgICB3aGlsZSAoYWR2YW5jZUV4dHJhY3Rvcl9sKCkpIHsKKyAgICAgICAgICAgIFNhbXBsZUN1cnNvciYgY3Vyc29yID0gbVRyYWNrQ3Vyc29yc1ttRXh0cmFjdG9yVHJhY2tJbmRleF07CisgICAgICAgICAgICBpZiAoY3Vyc29yLmN1cnJlbnQuaXNTZXQgJiYgY3Vyc29yLmN1cnJlbnQuaW5kZXggPT0gbUV4dHJhY3RvclNhbXBsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKG1FeHRyYWN0b3JUcmFja0luZGV4ICE9IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRyYWNrU2lnbmFsc1ttRXh0cmFjdG9yVHJhY2tJbmRleF0ubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK2Jvb2wgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmFkdmFuY2VFeHRyYWN0b3JfbCgpIHsKKyAgICAvLyBSZXNldCB0aGUgIm5leHQiIHNhbXBsZSB0aW1lIHdoZW5ldmVyIHRoZSBleHRyYWN0b3IgYWR2YW5jZXMgcGFzdCBhIHNhbXBsZSB0aGF0IGlzIGN1cnJlbnQsCisgICAgLy8gdG8gZW5zdXJlIHRoYXQgIm5leHQiIGlzIGFwcHJvcHJpYXRlbHkgdXBkYXRlZCB3aGVuIHRoZSBleHRyYWN0b3IgYWR2YW5jZXMgb3ZlciB0aGUgbmV4dAorICAgIC8vIHNhbXBsZSBvZiB0aGF0IHRyYWNrLgorICAgIGlmIChtVHJhY2tDdXJzb3JzW21FeHRyYWN0b3JUcmFja0luZGV4XS5jdXJyZW50LmlzU2V0ICYmCisgICAgICAgIG1UcmFja0N1cnNvcnNbbUV4dHJhY3RvclRyYWNrSW5kZXhdLmN1cnJlbnQuaW5kZXggPT0gbUV4dHJhY3RvclNhbXBsZUluZGV4KSB7CisgICAgICAgIG1UcmFja0N1cnNvcnNbbUV4dHJhY3RvclRyYWNrSW5kZXhdLm5leHQucmVzZXQoKTsKKyAgICB9CisKKyAgICBpZiAoIUFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIiAgRU9TIGluIGFkdmFuY2VFeHRyYWN0b3JfbCI7CisgICAgICAgIG1Fb3NSZWFjaGVkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbVRyYWNrU2lnbmFscy5iZWdpbigpOyBpdCAhPSBtVHJhY2tTaWduYWxzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUV4dHJhY3RvclRyYWNrSW5kZXggPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtRXh0cmFjdG9yKTsKKyAgICBtRXh0cmFjdG9yU2FtcGxlSW5kZXgrKzsKKworICAgIFNhbXBsZUN1cnNvciYgY3Vyc29yID0gbVRyYWNrQ3Vyc29yc1ttRXh0cmFjdG9yVHJhY2tJbmRleF07CisgICAgaWYgKG1FeHRyYWN0b3JTYW1wbGVJbmRleCA+IGN1cnNvci5wcmV2aW91cy5pbmRleCkgeworICAgICAgICBpZiAoIWN1cnNvci5jdXJyZW50LmlzU2V0KSB7CisgICAgICAgICAgICBjdXJzb3IuY3VycmVudC5zZXQobUV4dHJhY3RvclNhbXBsZUluZGV4LCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWN1cnNvci5uZXh0LmlzU2V0ICYmIG1FeHRyYWN0b3JTYW1wbGVJbmRleCA+IGN1cnNvci5jdXJyZW50LmluZGV4KSB7CisgICAgICAgICAgICBjdXJzb3IubmV4dC5zZXQobUV4dHJhY3RvclNhbXBsZUluZGV4LCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OnNlZWtFeHRyYWN0b3JCYWNrd2FyZHNfbChpbnQ2NF90IHRhcmdldFRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldFRyYWNrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRhcmdldFNhbXBsZUluZGV4KSB7CisgICAgaWYgKHRhcmdldFNhbXBsZUluZGV4ID4gbUV4dHJhY3RvclNhbXBsZUluZGV4KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yOiBGb3J3YXJkIHNlZWsgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gQU1lZGlhRXh0cmFjdG9yIHN1cHBvcnRzIHJlYWRpbmcgbmVnYXRpdmUgdGltZXN0YW1wcyBidXQgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nIHRvIHRoZW0uCisgICAgY29uc3QgaW50NjRfdCBzZWVrVG9UaW1lVXMgPSBzdGQ6Om1heCh0YXJnZXRUaW1lVXMsIChpbnQ2NF90KTApOworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKG1FeHRyYWN0b3IsIHNlZWtUb1RpbWVVcywgQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHNlZWsgdG8gIiA8PCBzZWVrVG9UaW1lVXMgPDwgIiwgdGFyZ2V0ICIgPDwgdGFyZ2V0VGltZVVzOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIG1Fb3NSZWFjaGVkID0gZmFsc2U7CisgICAgbUV4dHJhY3RvclRyYWNrSW5kZXggPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtRXh0cmFjdG9yKTsKKyAgICBpbnQ2NF90IHNhbXBsZVRpbWVVcyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKG1FeHRyYWN0b3IpOworCisgICAgd2hpbGUgKHNhbXBsZVRpbWVVcyAhPSB0YXJnZXRUaW1lVXMgfHwgbUV4dHJhY3RvclRyYWNrSW5kZXggIT0gdGFyZ2V0VHJhY2tJbmRleCkgeworICAgICAgICBpZiAoIUFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgbUV4dHJhY3RvclRyYWNrSW5kZXggPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtRXh0cmFjdG9yKTsKKyAgICAgICAgc2FtcGxlVGltZVVzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUobUV4dHJhY3Rvcik7CisgICAgfQorICAgIG1FeHRyYWN0b3JTYW1wbGVJbmRleCA9IHRhcmdldFNhbXBsZUluZGV4OworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjptb3ZlVG9TYW1wbGVfbChTYW1wbGVQb3NpdGlvbiYgcG9zLCBpbnQgdHJhY2tJbmRleCkgeworICAgIC8vIFNlZWsgYmFja3dhcmRzIGlmIHRoZSBleHRyYWN0b3IgaXMgYWhlYWQgb2YgdGhlIHNhbXBsZS4KKyAgICBpZiAocG9zLmlzU2V0ICYmIG1FeHRyYWN0b3JTYW1wbGVJbmRleCA+IHBvcy5pbmRleCkgeworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBzZWVrRXh0cmFjdG9yQmFja3dhcmRzX2wocG9zLnRpbWVTdGFtcFVzLCB0cmFja0luZGV4LCBwb3MuaW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHVudGlsIGV4dHJhY3RvciBwb2ludHMgdG8gdGhlIHNhbXBsZS4KKyAgICB3aGlsZSAoIShwb3MuaXNTZXQgJiYgcG9zLmluZGV4ID09IG1FeHRyYWN0b3JTYW1wbGVJbmRleCkpIHsKKyAgICAgICAgaWYgKCFhZHZhbmNlRXh0cmFjdG9yX2woKSkgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6Om1vdmVUb1RyYWNrX2woaW50IHRyYWNrSW5kZXgpIHsKKyAgICByZXR1cm4gbW92ZVRvU2FtcGxlX2wobVRyYWNrQ3Vyc29yc1t0cmFja0luZGV4XS5jdXJyZW50LCB0cmFja0luZGV4KTsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OndhaXRGb3JUcmFja19sKGludCB0cmFja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4mIGxvY2tIZWxkKSB7CisgICAgd2hpbGUgKHRyYWNrSW5kZXggIT0gbUV4dHJhY3RvclRyYWNrSW5kZXggJiYgIW1Fb3NSZWFjaGVkICYmIG1FbmZvcmNlU2VxdWVudGlhbEFjY2VzcykgeworICAgICAgICBtVHJhY2tTaWduYWxzW3RyYWNrSW5kZXhdLndhaXQobG9ja0hlbGQpOworICAgIH0KKworICAgIGlmIChtRW9zUmVhY2hlZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgaWYgKCFtRW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MpIHsKKyAgICAgICAgcmV0dXJuIG1vdmVUb1RyYWNrX2wodHJhY2tJbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OnByaW1lRXh0cmFjdG9yRm9yVHJhY2tfbCgKKyAgICAgICAgaW50IHRyYWNrSW5kZXgsIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4mIGxvY2tIZWxkKSB7CisgICAgaWYgKG1FeHRyYWN0b3JUcmFja0luZGV4IDwgMCkgeworICAgICAgICBtRXh0cmFjdG9yVHJhY2tJbmRleCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KG1FeHRyYWN0b3IpOworICAgICAgICBpZiAobUV4dHJhY3RvclRyYWNrSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgbVRyYWNrQ3Vyc29yc1ttRXh0cmFjdG9yVHJhY2tJbmRleF0uY3VycmVudC5zZXQobUV4dHJhY3RvclNhbXBsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKSk7CisgICAgfQorCisgICAgaWYgKG1FbmZvcmNlU2VxdWVudGlhbEFjY2VzcykgeworICAgICAgICByZXR1cm4gd2FpdEZvclRyYWNrX2wodHJhY2tJbmRleCwgbG9ja0hlbGQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtb3ZlVG9UcmFja19sKHRyYWNrSW5kZXgpOworICAgIH0KK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OnNlbGVjdFRyYWNrKGludCB0cmFja0luZGV4KSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1FeHRyYWN0b3JNdXRleCk7CisKKyAgICBpZiAodHJhY2tJbmRleCA8IDAgfHwgdHJhY2tJbmRleCA+PSBtVHJhY2tDb3VudCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHRyYWNrSW5kZXggIiA8PCB0cmFja0luZGV4IDw8ICIgZm9yIHRyYWNrQ291bnQgIiA8PCBtVHJhY2tDb3VudDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9IGVsc2UgaWYgKG1UcmFja1NpZ25hbHMuZmluZCh0cmFja0luZGV4KSAhPSBtVHJhY2tTaWduYWxzLmVuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrSW5kZXggIiA8PCB0cmFja0luZGV4IDw8ICIgYWxyZWFkeSBzZWxlY3RlZCI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfSBlbHNlIGlmIChtRXh0cmFjdG9yVHJhY2tJbmRleCA+PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrcyBtdXN0IGJlIHNlbGVjdGVkIGJlZm9yZSBzYW1wbGUgcmVhZGluZyBiZWdpbnMuIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2sobUV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrIHJldHVybmVkIGVycm9yOiAiIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBtVHJhY2tTaWduYWxzLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUodHJhY2tJbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBNZWRpYVNhbXBsZVJlYWRlck5ESzo6c2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MoYm9vbCBlbmZvcmNlKSB7CisgICAgTE9HKERFQlVHKSA8PCAic2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MoICIgPDwgZW5mb3JjZSA8PCAiICkiOworCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1FeHRyYWN0b3JNdXRleCk7CisKKyAgICBpZiAobUVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzICYmICFlbmZvcmNlKSB7CisgICAgICAgIC8vIElmIHN3aXRjaGluZyBmcm9tIGVuZm9yY2luZyB0byBub3QgZW5mb3JjaW5nIHNlcXVlbnRpYWwgYWNjZXNzIHRoZXJlIG1heSBiZSB0aHJlYWRzCisgICAgICAgIC8vIHdhaXRpbmcgdGhhdCBuZWVkcyB0byBiZSB3b2tlbiB1cC4KKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbVRyYWNrU2lnbmFscy5iZWdpbigpOyBpdCAhPSBtVHJhY2tTaWduYWxzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIW1FbmZvcmNlU2VxdWVudGlhbEFjY2VzcyAmJiBlbmZvcmNlICYmIG1FeHRyYWN0b3JUcmFja0luZGV4ID49IDApIHsKKyAgICAgICAgLy8gSWYgc3dpdGNoaW5nIGZyb20gbm90IGVuZm9yY2luZyB0byBlbmZvcmNpbmcgc2VxdWVudGlhbCBhY2Nlc3MgdGhlIGV4dHJhY3RvciBuZWVkcyB0byBiZQorICAgICAgICAvLyBwb3NpdGlvbmVkIGZvciB0aGUgdHJhY2sgZmFydGhlc3QgYmVoaW5kIHNvIHRoYXQgaXQgd29uJ3QgZ2V0IHN0dWNrIHdhaXRpbmcuCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBTYW1wbGVQb3NpdGlvbiogcG9zID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gLTE7CisgICAgICAgIH0gZWFybGllc3RTYW1wbGU7CisKKyAgICAgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgKyt0cmFja0luZGV4KSB7CisgICAgICAgICAgICBTYW1wbGVQb3NpdGlvbiYgbGFzdEtub3duVHJhY2tQb3NpdGlvbiA9IG1UcmFja0N1cnNvcnNbdHJhY2tJbmRleF0uY3VycmVudC5pc1NldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbVRyYWNrQ3Vyc29yc1t0cmFja0luZGV4XS5jdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtVHJhY2tDdXJzb3JzW3RyYWNrSW5kZXhdLnByZXZpb3VzOworCisgICAgICAgICAgICBpZiAobGFzdEtub3duVHJhY2tQb3NpdGlvbi5pc1NldCkgeworICAgICAgICAgICAgICAgIGlmIChlYXJsaWVzdFNhbXBsZS5wb3MgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgICAgICAgICBlYXJsaWVzdFNhbXBsZS5wb3MtPmluZGV4ID4gbGFzdEtub3duVHJhY2tQb3NpdGlvbi5pbmRleCkgeworICAgICAgICAgICAgICAgICAgICBlYXJsaWVzdFNhbXBsZS5wb3MgPSAmbGFzdEtub3duVHJhY2tQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgZWFybGllc3RTYW1wbGUudHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVhcmxpZXN0U2FtcGxlLnBvcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBrbm93biBzYW1wbGUgcG9zaXRpb24gZm91bmQiOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gbW92ZVRvU2FtcGxlX2woKmVhcmxpZXN0U2FtcGxlLnBvcywgZWFybGllc3RTYW1wbGUudHJhY2tJbmRleCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSByZXR1cm4gc3RhdHVzOworCisgICAgICAgIHdoaWxlICghKG1UcmFja0N1cnNvcnNbbUV4dHJhY3RvclRyYWNrSW5kZXhdLmN1cnJlbnQuaXNTZXQgJiYKKyAgICAgICAgICAgICAgICAgbVRyYWNrQ3Vyc29yc1ttRXh0cmFjdG9yVHJhY2tJbmRleF0uY3VycmVudC5pbmRleCA9PSBtRXh0cmFjdG9yU2FtcGxlSW5kZXgpKSB7CisgICAgICAgICAgICBpZiAoIWFkdmFuY2VFeHRyYWN0b3JfbCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbUVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzID0gZW5mb3JjZTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBNZWRpYVNhbXBsZVJlYWRlck5ESzo6Z2V0RXN0aW1hdGVkQml0cmF0ZUZvclRyYWNrKGludCB0cmFja0luZGV4LCBpbnQzMl90KiBiaXRyYXRlKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1FeHRyYWN0b3JNdXRleCk7CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1FRElBX09LOworCisgICAgaWYgKG1UcmFja1NpZ25hbHMuZmluZCh0cmFja0luZGV4KSA9PSBtVHJhY2tTaWduYWxzLmVuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrIGlzIG5vdCBzZWxlY3RlZC4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0gZWxzZSBpZiAoYml0cmF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImJpdHJhdGUgcG9pbnRlciBpcyBOVUxMLiI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfSBlbHNlIGlmIChtRXh0cmFjdG9yVHJhY2tJbmRleCA+PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImdldEVzdGltYXRlZEJpdHJhdGVGb3JUcmFjayBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc2FtcGxlIHJlYWRpbmcgYmVnaW5zLiI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gU2FtcGxlIHRoZSB0cmFjay4KKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1NhbXBsaW5nRHVyYXRpb25VcyA9IDEwICogMTAwMCAqIDEwMDA7ICAvLyAxMCBzZWNvbmRzCisgICAgc2l6ZV90IGxhc3RTYW1wbGVTaXplID0gMDsKKyAgICBzaXplX3QgdG90YWxTYW1wbGVTaXplID0gMDsKKyAgICBpbnQ2NF90IGZpcnN0U2FtcGxlVGltZVVzID0gMDsKKyAgICBpbnQ2NF90IGxhc3RTYW1wbGVUaW1lVXMgPSAwOworCisgICAgZG8geworICAgICAgICBpZiAoQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgobUV4dHJhY3RvcikgPT0gdHJhY2tJbmRleCkgeworICAgICAgICAgICAgbGFzdFNhbXBsZVRpbWVVcyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKG1FeHRyYWN0b3IpOworICAgICAgICAgICAgaWYgKHRvdGFsU2FtcGxlU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZmlyc3RTYW1wbGVUaW1lVXMgPSBsYXN0U2FtcGxlVGltZVVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXN0U2FtcGxlU2l6ZSA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplKG1FeHRyYWN0b3IpOworICAgICAgICAgICAgdG90YWxTYW1wbGVTaXplICs9IGxhc3RTYW1wbGVTaXplOworICAgICAgICB9CisgICAgfSB3aGlsZSAoKGxhc3RTYW1wbGVUaW1lVXMgLSBmaXJzdFNhbXBsZVRpbWVVcykgPCBrU2FtcGxpbmdEdXJhdGlvblVzICYmCisgICAgICAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UobUV4dHJhY3RvcikpOworCisgICAgLy8gUmVzZXQgdGhlIGV4dHJhY3RvciB0byB0aGUgYmVnaW5uaW5nLgorICAgIHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8obUV4dHJhY3RvciwgMCwgQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHJlc2V0IGV4dHJhY3RvcjogIiA8PCBzdGF0dXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMDsKKyAgICBjb25zdCBpbnQ2NF90IHNhbXBsZWREdXJhdGlvblVzID0gbGFzdFNhbXBsZVRpbWVVcyAtIGZpcnN0U2FtcGxlVGltZVVzOworCisgICAgaWYgKHNhbXBsZWREdXJhdGlvblVzIDwga1NhbXBsaW5nRHVyYXRpb25VcykgeworICAgICAgICAvLyBUcmFjayBpcyBzaG9ydGVyIHRoYW4gdGhlIHNhbXBsaW5nIGR1cmF0aW9uIHNvIHVzZSB0aGUgZnVsbCB0cmFjayBkdXJhdGlvbiB0byBnZXQgYmV0dGVyCisgICAgICAgIC8vIGFjY3VyYWN5IChpLmUuIGRvbid0IHNraXAgdGhlIGxhc3Qgc2FtcGxlKS4KKyAgICAgICAgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCA9IGdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICBkdXJhdGlvblVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKKyAgICB9CisKKyAgICBpZiAoZHVyYXRpb25VcyA9PSAwKSB7CisgICAgICAgIC8vIFRoZSBzYW1wbGVkIGR1cmF0aW9uIGRvZXMgbm90IGFjY291bnQgZm9yIHRoZSBsYXN0IHNhbXBsZSdzIGR1cmF0aW9uIHNvIGl0cyBzaXplIHNob3VsZAorICAgICAgICAvLyBub3QgYmUgaW5jbHVkZWQgZWl0aGVyLgorICAgICAgICB0b3RhbFNhbXBsZVNpemUgLT0gbGFzdFNhbXBsZVNpemU7CisgICAgICAgIGR1cmF0aW9uVXMgPSBzYW1wbGVkRHVyYXRpb25VczsKKyAgICB9CisKKyAgICBpZiAodG90YWxTYW1wbGVTaXplID09IDAgfHwgZHVyYXRpb25VcyA8PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBlc3RpbWF0ZSB0cmFjayBiaXRyYXRlIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKmJpdHJhdGUgPSByb3VuZGYoKGZsb2F0KXRvdGFsU2FtcGxlU2l6ZSAqIDggKiAxMDAwMDAwIC8gZHVyYXRpb25Vcyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmdldFNhbXBsZUluZm9Gb3JUcmFjayhpbnQgdHJhY2tJbmRleCwgTWVkaWFTYW1wbGVJbmZvKiBpbmZvKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1FeHRyYWN0b3JNdXRleCk7CisKKyAgICBpZiAobVRyYWNrU2lnbmFscy5maW5kKHRyYWNrSW5kZXgpID09IG1UcmFja1NpZ25hbHMuZW5kKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJhY2sgbm90IHNlbGVjdGVkLiI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfSBlbHNlIGlmIChpbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWVkaWFTYW1wbGVJbmZvIHBvaW50ZXIgaXMgTlVMTC4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IHByaW1lRXh0cmFjdG9yRm9yVHJhY2tfbCh0cmFja0luZGV4LCBsb2NrKTsKKyAgICBpZiAoc3RhdHVzID09IEFNRURJQV9PSykgeworICAgICAgICBpbmZvLT5wcmVzZW50YXRpb25UaW1lVXMgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKTsKKyAgICAgICAgaW5mby0+ZmxhZ3MgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MobUV4dHJhY3Rvcik7CisgICAgICAgIGluZm8tPnNpemUgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShtRXh0cmFjdG9yKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBpbmZvLT5wcmVzZW50YXRpb25UaW1lVXMgPSAwOworICAgICAgICBpbmZvLT5mbGFncyA9IFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIGluZm8tPnNpemUgPSAwOworICAgICAgICBMT0coREVCVUcpIDw8ICIgIGdldFNhbXBsZUluZm9Gb3JUcmFjayAjIiA8PCB0cmFja0luZGV4IDw8ICI6IEVuZCBPZiBTdHJlYW0iOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIiAgZ2V0U2FtcGxlSW5mb0ZvclRyYWNrICMiIDw8IHRyYWNrSW5kZXggPDwgIjogRXJyb3IgIiA8PCBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OnJlYWRTYW1wbGVEYXRhRm9yVHJhY2soaW50IHRyYWNrSW5kZXgsIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1FeHRyYWN0b3JNdXRleCk7CisKKyAgICBpZiAobVRyYWNrU2lnbmFscy5maW5kKHRyYWNrSW5kZXgpID09IG1UcmFja1NpZ25hbHMuZW5kKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJhY2sgbm90IHNlbGVjdGVkLiI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfSBlbHNlIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJidWZmZXIgcG9pbnRlciBpcyBOVUxMIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBwcmltZUV4dHJhY3RvckZvclRyYWNrX2wodHJhY2tJbmRleCwgbG9jayk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzc2l6ZV90IHNhbXBsZVNpemUgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShtRXh0cmFjdG9yKTsKKyAgICBpZiAoYnVmZmVyU2l6ZSA8IHNhbXBsZVNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQnVmZmVyIGlzIHRvbyBzbWFsbCBmb3Igc2FtcGxlLCAiIDw8IGJ1ZmZlclNpemUgPDwgIiB2cyAiIDw8IHNhbXBsZVNpemU7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgc3NpemVfdCBieXRlc1JlYWQgPSBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEobUV4dHJhY3RvciwgYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICBpZiAoYnl0ZXNSZWFkIDwgc2FtcGxlU2l6ZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmVhZCBmdWxsIHNhbXBsZSwgIiA8PCBieXRlc1JlYWQgPDwgIiB2cyAiIDw8IHNhbXBsZVNpemU7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgYWR2YW5jZVRyYWNrX2wodHJhY2tJbmRleCk7CisKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCit2b2lkIE1lZGlhU2FtcGxlUmVhZGVyTkRLOjphZHZhbmNlVHJhY2soaW50IHRyYWNrSW5kZXgpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobUV4dHJhY3Rvck11dGV4KTsKKworICAgIGlmIChtVHJhY2tTaWduYWxzLmZpbmQodHJhY2tJbmRleCkgIT0gbVRyYWNrU2lnbmFscy5lbmQoKSkgeworICAgICAgICBhZHZhbmNlVHJhY2tfbCh0cmFja0luZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJUcnlpbmcgdG8gYWR2YW5jZSBhIHRyYWNrIHRoYXQgaXMgbm90IHNlbGVjdGVkICgjIiA8PCB0cmFja0luZGV4IDw8ICIpIjsKKyAgICB9Cit9CisKK0FNZWRpYUZvcm1hdCogTWVkaWFTYW1wbGVSZWFkZXJOREs6OmdldEZpbGVGb3JtYXQoKSB7CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRGaWxlRm9ybWF0KG1FeHRyYWN0b3IpOworfQorCitzaXplX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UcmFja0NvdW50OworfQorCitBTWVkaWFGb3JtYXQqIE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpnZXRUcmFja0Zvcm1hdChpbnQgdHJhY2tJbmRleCkgeworICAgIGlmICh0cmFja0luZGV4IDwgMCB8fCB0cmFja0luZGV4ID49IG1UcmFja0NvdW50KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgdHJhY2tJbmRleCAiIDw8IHRyYWNrSW5kZXggPDwgIiBmb3IgdHJhY2tDb3VudCAiIDw8IG1UcmFja0NvdW50OworICAgICAgICByZXR1cm4gQU1lZGlhRm9ybWF0X25ldygpOworICAgIH0KKworICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQobUV4dHJhY3RvciwgdHJhY2tJbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFTYW1wbGVXcml0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODliOTQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlV3JpdGVyLmNwcApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU2FtcGxlV3JpdGVyIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhTXV4ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZWZhdWx0TXV4ZXIgOiBwdWJsaWMgTWVkaWFTYW1wbGVXcml0ZXJNdXhlckludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gTWVkaWFTYW1wbGVXcml0ZXJNdXhlckludGVyZmFjZQorICAgIHNzaXplX3QgYWRkVHJhY2soQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBJZiB0aGUgdHJhY2sgZm9ybWF0IGhhcyByb3RhdGlvbiwgbmVlZCB0byBjYWxsIEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludAorICAgICAgICAvLyB0byBzZXQgdGhlIHJvdGF0aW9uLiBNdXhlciBkb2Vzbid0IHRha2Ugcm90YXRpb24gc3BlY2lmaWVkIG9uIHRoZSB0cmFjay4KKyAgICAgICAgY29uc3QgY2hhciogbWltZTsKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpICYmCisgICAgICAgICAgICBzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHJvdGF0aW9uOworICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgJnJvdGF0aW9uKSAmJgorICAgICAgICAgICAgICAgIChyb3RhdGlvbiAhPSAwKSkgeworICAgICAgICAgICAgICAgIEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludChtTXV4ZXIsIHJvdGF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBBTWVkaWFNdXhlcl9hZGRUcmFjayhtTXV4ZXIsIHRyYWNrRm9ybWF0KTsKKyAgICB9CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7IHJldHVybiBBTWVkaWFNdXhlcl9zdGFydChtTXV4ZXIpOyB9CisgICAgbWVkaWFfc3RhdHVzX3Qgd3JpdGVTYW1wbGVEYXRhKHNpemVfdCB0cmFja0luZGV4LCBjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8qIGluZm8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEFNZWRpYU11eGVyX3dyaXRlU2FtcGxlRGF0YShtTXV4ZXIsIHRyYWNrSW5kZXgsIGRhdGEsIGluZm8pOworICAgIH0KKyAgICBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGUgeyByZXR1cm4gQU1lZGlhTXV4ZXJfc3RvcChtTXV4ZXIpOyB9CisgICAgLy8gfk1lZGlhU2FtcGxlV3JpdGVyTXV4ZXJJbnRlcmZhY2UKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RGVmYXVsdE11eGVyPiBjcmVhdGUoaW50IGZkKSB7CisgICAgICAgIEFNZWRpYU11eGVyKiBuZGtNdXhlciA9IEFNZWRpYU11eGVyX25ldyhmZCwgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICBpZiAobmRrTXV4ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBBTWVkaWFNdXhlciI7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPERlZmF1bHRNdXhlcj4obmRrTXV4ZXIpOworICAgIH0KKworICAgIH5EZWZhdWx0TXV4ZXIoKSB7CisgICAgICAgIGlmIChtTXV4ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQU1lZGlhTXV4ZXJfZGVsZXRlKG1NdXhlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEZWZhdWx0TXV4ZXIoQU1lZGlhTXV4ZXIqIG11eGVyKSA6IG1NdXhlcihtdXhlcil7fTsKKyAgICBEZWZhdWx0TXV4ZXIoKSA9IGRlbGV0ZTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFNdXhlciogbU11eGVyOworfTsKKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4obmV3IE1lZGlhU2FtcGxlV3JpdGVyKCkpOworfQorCitNZWRpYVNhbXBsZVdyaXRlcjo6fk1lZGlhU2FtcGxlV3JpdGVyKCkgeworICAgIGlmIChtU3RhdGUgPT0gU1RBUlRFRCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorfQorCitib29sIE1lZGlhU2FtcGxlV3JpdGVyOjppbml0KGludCBmZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDYWxsYmFja0ludGVyZmFjZT4mIGNhbGxiYWNrcykgeworICAgIHJldHVybiBpbml0KERlZmF1bHRNdXhlcjo6Y3JlYXRlKGZkKSwgY2FsbGJhY2tzKTsKK30KKworYm9vbCBNZWRpYVNhbXBsZVdyaXRlcjo6aW5pdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXJNdXhlckludGVyZmFjZT4mIG11eGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2tzKSB7CisgICAgaWYgKGNhbGxiYWNrcy5sb2NrKCkgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYWxsYmFjayBvYmplY3QgY2Fubm90IGJlIG51bGwiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChtdXhlciA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk11eGVyIGNhbm5vdCBiZSBudWxsIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJTYW1wbGUgd3JpdGVyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CisgICAgbU11eGVyID0gbXV4ZXI7CisgICAgbUNhbGxiYWNrcyA9IGNhbGxiYWNrczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTWVkaWFTYW1wbGVXcml0ZXI6Ok1lZGlhU2FtcGxlQ29uc3VtZXJGdW5jdGlvbiBNZWRpYVNhbXBsZVdyaXRlcjo6YWRkVHJhY2soCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+JiB0cmFja0Zvcm1hdCkgeworICAgIGlmICh0cmFja0Zvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrIGZvcm1hdCBtdXN0IGJlIG5vbi1udWxsIjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1TdGF0ZSAhPSBJTklUSUFMSVpFRCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJNdXhlciBuZWVkcyB0byBiZSBpbml0aWFsaXplZCB3aGVuIGFkZGluZyB0cmFja3MuIjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNzaXplX3QgdHJhY2tJbmRleE9yRXJyb3IgPSBtTXV4ZXItPmFkZFRyYWNrKHRyYWNrRm9ybWF0LmdldCgpKTsKKyAgICBpZiAodHJhY2tJbmRleE9yRXJyb3IgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhZGQgbWVkaWEgdHJhY2sgdG8gbXV4ZXI6ICIgPDwgdHJhY2tJbmRleE9yRXJyb3I7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgdHJhY2tJbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4odHJhY2tJbmRleE9yRXJyb3IpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrRm9ybWF0LmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgZHVyYXRpb25VcyA9IDA7CisgICAgfQorCisgICAgbVRyYWNrcy5lbXBsYWNlKHRyYWNrSW5kZXgsIGR1cmF0aW9uVXMpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gdGhpc1dyaXRlciA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKworICAgIHJldHVybiBbc2VsZiA9IHNoYXJlZF9mcm9tX3RoaXMoKSwgdHJhY2tJbmRleF0oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKSB7CisgICAgICAgIHNlbGYtPmFkZFNhbXBsZVRvVHJhY2sodHJhY2tJbmRleCwgc2FtcGxlKTsKKyAgICB9OworfQorCit2b2lkIE1lZGlhU2FtcGxlV3JpdGVyOjphZGRTYW1wbGVUb1RyYWNrKHNpemVfdCB0cmFja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+JiBzYW1wbGUpIHsKKyAgICBpZiAoc2FtcGxlID09IG51bGxwdHIpIHJldHVybjsKKworICAgIGJvb2wgd2FzRW1wdHk7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgd2FzRW1wdHkgPSBtU2FtcGxlUXVldWUuZW1wdHkoKTsKKyAgICAgICAgbVNhbXBsZVF1ZXVlLnB1c2goc3RkOjptYWtlX3BhaXIodHJhY2tJbmRleCwgc2FtcGxlKSk7CisgICAgfQorCisgICAgaWYgKHdhc0VtcHR5KSB7CisgICAgICAgIG1TYW1wbGVTaWduYWwubm90aWZ5X29uZSgpOworICAgIH0KK30KKworYm9vbCBNZWRpYVNhbXBsZVdyaXRlcjo6c3RhcnQoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICBpZiAobVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyB0cmFja3MgdG8gd3JpdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVEKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlNhbXBsZSB3cml0ZXIgaXMgbm90IGluaXRpYWxpemVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVJURUQ7CisgICAgc3RkOjp0aHJlYWQoW3RoaXNdIHsKKyAgICAgICAgYm9vbCB3YXNTdG9wcGVkID0gZmFsc2U7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IHdyaXRlU2FtcGxlcygmd2FzU3RvcHBlZCk7CisgICAgICAgIGlmIChhdXRvIGNhbGxiYWNrcyA9IG1DYWxsYmFja3MubG9jaygpKSB7CisgICAgICAgICAgICBpZiAod2FzU3RvcHBlZCAmJiBzdGF0dXMgPT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5vblN0b3BwZWQodGhpcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrcy0+b25GaW5pc2hlZCh0aGlzLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSkuZGV0YWNoKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVkaWFTYW1wbGVXcml0ZXI6OnN0b3AoKSB7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTYW1wbGUgd3JpdGVyIGlzIG5vdCBzdGFydGVkLiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKKyAgICB9CisKKyAgICBtU2FtcGxlU2lnbmFsLm5vdGlmeV9hbGwoKTsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVXcml0ZXI6OndyaXRlU2FtcGxlcyhib29sKiB3YXNTdG9wcGVkKSB7CisgICAgbWVkaWFfc3RhdHVzX3QgbXV4ZXJTdGF0dXMgPSBtTXV4ZXItPnN0YXJ0KCk7CisgICAgaWYgKG11eGVyU3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciBzdGFydGluZyBtdXhlcjogIiA8PCBtdXhlclN0YXR1czsKKyAgICAgICAgcmV0dXJuIG11eGVyU3RhdHVzOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHdyaXRlU3RhdHVzID0gcnVuV3JpdGVyTG9vcCh3YXNTdG9wcGVkKTsKKyAgICBpZiAod3JpdGVTdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yIHdyaXRpbmcgc2FtcGxlczogIiA8PCB3cml0ZVN0YXR1czsKKyAgICB9CisKKyAgICBtdXhlclN0YXR1cyA9IG1NdXhlci0+c3RvcCgpOworICAgIGlmIChtdXhlclN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXJyb3Igc3RvcHBpbmcgbXV4ZXI6ICIgPDwgbXV4ZXJTdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHdyaXRlU3RhdHVzICE9IEFNRURJQV9PSyA/IHdyaXRlU3RhdHVzIDogbXV4ZXJTdGF0dXM7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhU2FtcGxlV3JpdGVyOjpydW5Xcml0ZXJMb29wKGJvb2wqIHdhc1N0b3BwZWQpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgeworICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvOworICAgIGludDMyX3QgbGFzdFByb2dyZXNzVXBkYXRlID0gMDsKKyAgICBpbnQgdHJhY2tFb3NDb3VudCA9IDA7CisKKyAgICAvLyBTZXQgdGhlICJwcmltYXJ5IiB0cmFjayB0aGF0IHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgcHJvZ3Jlc3MgdG8gdGhlIHRyYWNrIHdpdGggbG9uZ2VzdAorICAgIC8vIGR1cmF0aW9uLgorICAgIGludCBwcmltYXJ5VHJhY2tJbmRleCA9IC0xOworICAgIGludDY0X3QgbG9uZ2VzdER1cmF0aW9uVXMgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1UcmFja3MuYmVnaW4oKTsgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQtPnNlY29uZC5tRHVyYXRpb25VcyA+IGxvbmdlc3REdXJhdGlvblVzKSB7CisgICAgICAgICAgICBwcmltYXJ5VHJhY2tJbmRleCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIGxvbmdlc3REdXJhdGlvblVzID0gaXQtPnNlY29uZC5tRHVyYXRpb25VczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICh0cmFja0Vvc0NvdW50ID49IG1UcmFja3Muc2l6ZSgpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IHNhbXBsZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICB3aGlsZSAobVNhbXBsZVF1ZXVlLmVtcHR5KCkgJiYgbVN0YXRlID09IFNUQVJURUQpIHsKKyAgICAgICAgICAgICAgICBtU2FtcGxlU2lnbmFsLndhaXQobG9jayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBFRCkgeworICAgICAgICAgICAgICAgICp3YXNTdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvJiB0b3BFbnRyeSA9IG1TYW1wbGVRdWV1ZS50b3AoKTsKKyAgICAgICAgICAgIHRyYWNrSW5kZXggPSB0b3BFbnRyeS5maXJzdDsKKyAgICAgICAgICAgIHNhbXBsZSA9IHRvcEVudHJ5LnNlY29uZDsKKyAgICAgICAgICAgIG1TYW1wbGVRdWV1ZS5wb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNrUmVjb3JkJiB0cmFjayA9IG1UcmFja3NbdHJhY2tJbmRleF07CisKKyAgICAgICAgaWYgKHNhbXBsZS0+aW5mby5mbGFncyAmIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGlmICh0cmFjay5tUmVhY2hlZEVvcykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFjayByZWFjaGVkIGVuZCBvZiBzdHJlYW0uCisgICAgICAgICAgICB0cmFjay5tUmVhY2hlZEVvcyA9IHRydWU7CisgICAgICAgICAgICB0cmFja0Vvc0NvdW50Kys7CisKKyAgICAgICAgICAgIC8vIFByZXNlcnZlIHNvdXJjZSB0cmFjayBkdXJhdGlvbiBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSB0aW1lc3RhbXAgb24gdGhlCisgICAgICAgICAgICAvLyBlbXB0eSBFbmQtT2YtU3RyZWFtIHNhbXBsZS4KKyAgICAgICAgICAgIGlmICh0cmFjay5tRHVyYXRpb25VcyA+IDAgJiYgdHJhY2subUZpcnN0U2FtcGxlVGltZVNldCkgeworICAgICAgICAgICAgICAgIHNhbXBsZS0+aW5mby5wcmVzZW50YXRpb25UaW1lVXMgPSB0cmFjay5tRHVyYXRpb25VcyArIHRyYWNrLm1GaXJzdFNhbXBsZVRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyYWNrLm1QcmV2U2FtcGxlVGltZVVzID0gc2FtcGxlLT5pbmZvLnByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgaWYgKCF0cmFjay5tRmlyc3RTYW1wbGVUaW1lU2V0KSB7CisgICAgICAgICAgICAvLyBSZWNvcmQgdGhlIGZpcnN0IHNhbXBsZSdzIHRpbWVzdGFtcCBpbiBvcmRlciB0byB0cmFuc2xhdGUgZHVyYXRpb24gdG8gRU9TCisgICAgICAgICAgICAvLyB0aW1lIGZvciB0cmFja3MgdGhhdCBkb2VzIG5vdCBzdGFydCBhdCAwLgorICAgICAgICAgICAgdHJhY2subUZpcnN0U2FtcGxlVGltZVVzID0gc2FtcGxlLT5pbmZvLnByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgICAgIHRyYWNrLm1GaXJzdFNhbXBsZVRpbWVTZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVySW5mby5vZmZzZXQgPSBzYW1wbGUtPmRhdGFPZmZzZXQ7CisgICAgICAgIGJ1ZmZlckluZm8uc2l6ZSA9IHNhbXBsZS0+aW5mby5zaXplOworICAgICAgICBidWZmZXJJbmZvLmZsYWdzID0gc2FtcGxlLT5pbmZvLmZsYWdzOworICAgICAgICBidWZmZXJJbmZvLnByZXNlbnRhdGlvblRpbWVVcyA9IHNhbXBsZS0+aW5mby5wcmVzZW50YXRpb25UaW1lVXM7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gbU11eGVyLT53cml0ZVNhbXBsZURhdGEodHJhY2tJbmRleCwgc2FtcGxlLT5idWZmZXIsICZidWZmZXJJbmZvKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIndyaXRlU2FtcGxlRGF0YSByZXR1cm5lZCAiIDw8IHN0YXR1czsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxlLnJlc2V0KCk7CisKKyAgICAgICAgLy8gVE9ETyhsbmlsc3Nvbik6IEFkZCBvcHRpb24gdG8gdG9nZ2xlIHByb2dyZXNzIHJlcG9ydGluZyBvbi9vZmYuCisgICAgICAgIGlmICh0cmFja0luZGV4ID09IHByaW1hcnlUcmFja0luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGVsYXBzZWQgPSB0cmFjay5tUHJldlNhbXBsZVRpbWVVcyAtIHRyYWNrLm1GaXJzdFNhbXBsZVRpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MgPSAoZWxhcHNlZCAqIDEwMCkgLyB0cmFjay5tRHVyYXRpb25VczsKKyAgICAgICAgICAgIHByb2dyZXNzID0gc3RkOjpjbGFtcChwcm9ncmVzcywgMCwgMTAwKTsKKworICAgICAgICAgICAgaWYgKHByb2dyZXNzID4gbGFzdFByb2dyZXNzVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKGF1dG8gY2FsbGJhY2tzID0gbUNhbGxiYWNrcy5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5vblByb2dyZXNzVXBkYXRlKHRoaXMsIHByb2dyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdFByb2dyZXNzVXBkYXRlID0gcHJvZ3Jlc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYWNrVHJhbnNjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFUcmFja1RyYW5zY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Zjc0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFUcmFja1RyYW5zY29kZXIuY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFUcmFja1RyYW5zY29kZXIiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK21lZGlhX3N0YXR1c190IE1lZGlhVHJhY2tUcmFuc2NvZGVyOjpjb25maWd1cmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4mIG1lZGlhU2FtcGxlUmVhZGVyLCBpbnQgdHJhY2tJbmRleCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIGRlc3RpbmF0aW9uRm9ybWF0KSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21TdGF0ZU11dGV4fTsKKworICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb25maWd1cmUgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGlmIChtZWRpYVNhbXBsZVJlYWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk1lZGlhU2FtcGxlUmVhZGVyIGlzIG51bGwiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBpZiAodHJhY2tJbmRleCA8IDAgfHwgdHJhY2tJbmRleCA+PSBtZWRpYVNhbXBsZVJlYWRlci0+Z2V0VHJhY2tDb3VudCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrSW5kZXggaXMgaW52YWxpZCAiIDw8IHRyYWNrSW5kZXg7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgbU1lZGlhU2FtcGxlUmVhZGVyID0gbWVkaWFTYW1wbGVSZWFkZXI7CisgICAgbVRyYWNrSW5kZXggPSB0cmFja0luZGV4OworCisgICAgbVNvdXJjZUZvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KG1NZWRpYVNhbXBsZVJlYWRlci0+Z2V0VHJhY2tGb3JtYXQobVRyYWNrSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgaWYgKG1Tb3VyY2VGb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZ2V0IGZvcm1hdCBmb3IgdHJhY2sgIyIgPDwgbVRyYWNrSW5kZXg7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IGNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0KGRlc3RpbmF0aW9uRm9ybWF0KTsKKyAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25maWd1cmUgZmFpbGVkIHdpdGggZXJyb3IgIiA8PCBzdGF0dXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgbVN0YXRlID0gQ09ORklHVVJFRDsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitib29sIE1lZGlhVHJhY2tUcmFuc2NvZGVyOjpzdGFydCgpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVN0YXRlTXV0ZXh9OworCisgICAgaWYgKG1TdGF0ZSAhPSBDT05GSUdVUkVEKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrVHJhbnNjb2RlciBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIHN0YXJ0ZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1TdGF0ZSA9IFNUQVJURUQ7CisKKyAgICBzdGQ6OnRocmVhZChbdGhpc10geworICAgICAgICBib29sIHN0b3BwZWQgPSBmYWxzZTsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gcnVuVHJhbnNjb2RlTG9vcCgmc3RvcHBlZCk7CisKKyAgICAgICAgLy8gT3V0cHV0IGFuIEVPUyBzYW1wbGUgaWYgdGhlIHRyYW5zY29kZXIgd2FzIHN0b3BwZWQuCisgICAgICAgIGlmIChzdG9wcGVkKSB7CisgICAgICAgICAgICBhdXRvIHNhbXBsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWVkaWFTYW1wbGU+KCk7CisgICAgICAgICAgICBzYW1wbGUtPmluZm8uZmxhZ3MgPSBTQU1QTEVfRkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgb25PdXRwdXRTYW1wbGVBdmFpbGFibGUoc2FtcGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50LgorICAgICAgICBpZiAoYXV0byBjYWxsYmFja3MgPSBtVHJhbnNjb2RlckNhbGxiYWNrLmxvY2soKSkgeworICAgICAgICAgICAgaWYgKHN0b3BwZWQpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja3MtPm9uVHJhY2tTdG9wcGVkKHRoaXMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5vblRyYWNrRmluaXNoZWQodGhpcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrcy0+b25UcmFja0Vycm9yKHRoaXMsIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KS5kZXRhY2goKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE1lZGlhVHJhY2tUcmFuc2NvZGVyOjpzdG9wKGJvb2wgc3RvcE9uU3luY1NhbXBsZSkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttU3RhdGVNdXRleH07CisKKyAgICBpZiAobVN0YXRlID09IFNUQVJURUQgfHwgKG1TdG9wUmVxdWVzdCA9PSBTVE9QX09OX1NZTkMgJiYgIXN0b3BPblN5bmNTYW1wbGUpKSB7CisgICAgICAgIG1TdG9wUmVxdWVzdCA9IHN0b3BPblN5bmNTYW1wbGUgPyBTVE9QX09OX1NZTkMgOiBTVE9QX05PVzsKKyAgICAgICAgYWJvcnRUcmFuc2NvZGVMb29wKCk7CisgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJUcmFja1RyYW5zY29kZXIgbXVzdCBiZSBzdGFydGVkIGJlZm9yZSBzdG9wcGVkIjsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFUcmFja1RyYW5zY29kZXI6Om5vdGlmeVRyYWNrRm9ybWF0QXZhaWxhYmxlKCkgeworICAgIGlmIChhdXRvIGNhbGxiYWNrcyA9IG1UcmFuc2NvZGVyQ2FsbGJhY2subG9jaygpKSB7CisgICAgICAgIGNhbGxiYWNrcy0+b25UcmFja0Zvcm1hdEF2YWlsYWJsZSh0aGlzKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFUcmFja1RyYW5zY29kZXI6Om9uT3V0cHV0U2FtcGxlQXZhaWxhYmxlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttU2FtcGxlTXV0ZXh9OworICAgIGlmIChtU2FtcGxlQ29uc3VtZXIgPT0gbnVsbHB0cikgeworICAgICAgICBtU2FtcGxlUXVldWUuZW5xdWV1ZShzYW1wbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TYW1wbGVDb25zdW1lcihzYW1wbGUpOworICAgIH0KK30KKwordm9pZCBNZWRpYVRyYWNrVHJhbnNjb2Rlcjo6c2V0U2FtcGxlQ29uc3VtZXIoCisgICAgICAgIGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyOjpNZWRpYVNhbXBsZUNvbnN1bWVyRnVuY3Rpb24mIHNhbXBsZUNvbnN1bWVyKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21TYW1wbGVNdXRleH07CisgICAgbVNhbXBsZUNvbnN1bWVyID0gc2FtcGxlQ29uc3VtZXI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IHNhbXBsZTsKKyAgICB3aGlsZSAoIW1TYW1wbGVRdWV1ZS5pc0VtcHR5KCkgJiYgIW1TYW1wbGVRdWV1ZS5kZXF1ZXVlKCZzYW1wbGUpKSB7CisgICAgICAgIG1TYW1wbGVDb25zdW1lcihzYW1wbGUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYW5zY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhVHJhbnNjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOWEzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYW5zY29kZXIuY3BwCkBAIC0wLDAgKzEsNDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFUcmFuc2NvZGVyIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUmVhZGVyTkRLLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtDb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL1ZpZGVvVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIEFNZWRpYUZvcm1hdCogbWVyZ2VNZWRpYUZvcm1hdHMoQU1lZGlhRm9ybWF0KiBiYXNlLCBBTWVkaWFGb3JtYXQqIG92ZXJsYXkpIHsKKyAgICBpZiAoYmFzZSA9PSBudWxscHRyIHx8IG92ZXJsYXkgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgbWVyZ2UgbnVsbCBmb3JtYXRzIjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9jb3B5KGZvcm1hdCwgYmFzZSkgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLy8gTm90ZTogQU1lZGlhRm9ybWF0IGRvZXMgbm90IGV4cG9zZSBhIGZ1bmN0aW9uIGZvciBhcHBlbmRpbmcgdmFsdWVzIGZyb20gYW5vdGhlciBmb3JtYXQgb3IgZm9yCisgICAgLy8gaXRlcmF0aW5nIG92ZXIgYWxsIHZhbHVlcyBhbmQga2V5cyBpbiBhIGZvcm1hdC4gSW5zdGVhZCB3ZSBkZWZpbmUgYSBzdGF0aWMgbGlzdCBvZiBrbm93biBrZXlzCisgICAgLy8gYWxvbmcgd2l0aCB0aGVpciB2YWx1ZSB0eXBlcyBhbmQgY29weSB0aGUgb25lcyB0aGF0IGFyZSBwcmVzZW50LiBBIGJldHRlciBzb2x1dGlvbiB3b3VsZCBiZQorICAgIC8vIHRvIGVpdGhlciBpbXBsZW1lbnQgcmVxdWlyZWQgZnVuY3Rpb25zIGluIE5ESyBvciB0byBwYXJzZSB0aGUgb3ZlcmxheSBmb3JtYXQncyBzdHJpbmcKKyAgICAvLyByZXByZXNlbnRhdGlvbiBhbmQgY29weSBhbGwgZXhpc3Rpbmcga2V5cy4KKyAgICBzdGF0aWMgY29uc3QgQU1lZGlhRm9ybWF0VXRpbHM6OkVudHJ5Q29waWVyIGtTdXBwb3J0ZWRGb3JtYXRFbnRyaWVzW10gPSB7CisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9NSU1FLCBTdHJpbmcpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIEludDY0KSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgSW50MzIpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgSW50MzIpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSwgSW50MzIpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSMihBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLCBGbG9hdCwgSW50MzIpLAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGVudHJ5Q291bnQgPSBzaXplb2Yoa1N1cHBvcnRlZEZvcm1hdEVudHJpZXMpIC8gc2l6ZW9mKGtTdXBwb3J0ZWRGb3JtYXRFbnRyaWVzWzBdKTsKKworICAgIEFNZWRpYUZvcm1hdFV0aWxzOjpDb3B5Rm9ybWF0RW50cmllcyhvdmVybGF5LCBmb3JtYXQsIGtTdXBwb3J0ZWRGb3JtYXRFbnRyaWVzLCBlbnRyeUNvdW50KTsKKyAgICByZXR1cm4gZm9ybWF0OworfQorCit2b2lkIE1lZGlhVHJhbnNjb2Rlcjo6b25UaHJlYWRGaW5pc2hlZChjb25zdCB2b2lkKiB0aHJlYWQsIG1lZGlhX3N0YXR1c190IHRocmVhZFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkU3RvcHBlZCkgeworICAgIExPRyhERUJVRykgPDwgIlRocmVhZCAiIDw8IHRocmVhZCA8PCAiIGZpbmlzaGVkIHdpdGggc3RhdHVzICIgPDwgdGhyZWFkU3RhdHVzIDw8ICIgc3RvcHBlZCAiCisgICAgICAgICAgICAgICA8PCB0aHJlYWRTdG9wcGVkOworCisgICAgLy8gU3RvcCBhbGwgdGhyZWFkcyBpZiBvbmUgcmVwb3J0cyBhbiBlcnJvci4KKyAgICBpZiAodGhyZWFkU3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICByZXF1ZXN0U3RvcChmYWxzZSAvKiBzdG9wT25TeW5jICovKTsKKyAgICB9CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVRocmVhZFN0YXRlTXV0ZXh9OworCisgICAgLy8gUmVjb3JkIHRoZSBjaGFuZ2UuCisgICAgbVRocmVhZFN0YXRlc1t0aHJlYWRdID0gRE9ORTsKKyAgICBpZiAodGhyZWFkU3RhdHVzICE9IEFNRURJQV9PSyAmJiBtVHJhbnNjb2RlclN0YXR1cyA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgbVRyYW5zY29kZXJTdGF0dXMgPSB0aHJlYWRTdGF0dXM7CisgICAgfQorCisgICAgbVRyYW5zY29kZXJTdG9wcGVkIHw9IHRocmVhZFN0b3BwZWQ7CisKKyAgICAvLyBDaGVjayBpZiBhbGwgdGhyZWFkcyBhcmUgZG9uZS4gTm90ZSB0aGF0IGlmIGFsbCB0cmFuc2NvZGVycyBoYXZlIHN0b3BwZWQgYnV0IHRoZSBzYW1wbGUKKyAgICAvLyB3cml0ZXIgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgaXQgbmV2ZXIgd2lsbC4KKyAgICBib29sIHRyYW5zY29kZXJzRG9uZSA9IHRydWU7CisgICAgVGhyZWFkU3RhdGUgc2FtcGxlV3JpdGVyU3RhdGUgPSBQRU5ESU5HOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtVGhyZWFkU3RhdGVzKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIiAgVGhyZWFkICIgPDwgaXQuZmlyc3QgPDwgIiBzdGF0ZSIgPDwgaXQuc2Vjb25kOworICAgICAgICBpZiAoaXQuZmlyc3QgPT0gc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KG1TYW1wbGVXcml0ZXIuZ2V0KCkpKSB7CisgICAgICAgICAgICBzYW1wbGVXcml0ZXJTdGF0ZSA9IGl0LnNlY29uZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYW5zY29kZXJzRG9uZSAmPSAoaXQuc2Vjb25kID09IERPTkUpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghdHJhbnNjb2RlcnNEb25lIHx8IHNhbXBsZVdyaXRlclN0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFsbCBkb25lLiBTZW5kIGNhbGxiYWNrIGFzeW5jaHJvbm91c2x5IGFuZCB3YWtlIHVwIHRocmVhZHMgd2FpdGluZyBpbiBjYW5jZWwvcGF1c2UuCisgICAgbVRocmVhZHNEb25lID0gdHJ1ZTsKKyAgICBpZiAoIW1DYWxsYmFja1NlbnQpIHsKKyAgICAgICAgc3RkOjp0aHJlYWQgYXN5bmNOb3RpZmljYXRpb25UaHJlYWR7W3RoaXMsIHNlbGYgPSBzaGFyZWRfZnJvbV90aGlzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBtVHJhbnNjb2RlclN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BwZWQgPSBtVHJhbnNjb2RlclN0b3BwZWRdIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSB0cmFuc2NvZGVyIHdhcyBzdG9wcGVkIHRoYXQgbWVhbnMgYSBjYWxsZXIgaXMgd2FpdGluZyBpbiBzdG9wIG9yIHBhdXNlCisgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIGRvbid0IHNlbmQgYSBjYWxsYmFjay4KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy0+b25FcnJvcih0aGlzLCBzdGF0dXMpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RvcHBlZCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPm9uRmluaXNoZWQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVGhyZWFkc0RvbmVTaWduYWwubm90aWZ5X2FsbCgpOworICAgICAgICB9fTsKKyAgICAgICAgYXN5bmNOb3RpZmljYXRpb25UaHJlYWQuZGV0YWNoKCk7CisgICAgICAgIG1DYWxsYmFja1NlbnQgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBNZWRpYVRyYW5zY29kZXI6Om9uVHJhY2tGb3JtYXRBdmFpbGFibGUoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUcmFja1RyYW5zY29kZXIgIiA8PCB0cmFuc2NvZGVyIDw8ICIgZm9ybWF0IGF2YWlsYWJsZS4iOworCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21UcmFja3NBZGRlZE11dGV4fTsKKyAgICBjb25zdCB2b2lkKiBzYW1wbGVXcml0ZXJQdHIgPSBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4obVNhbXBsZVdyaXRlci5nZXQoKSk7CisKKyAgICAvLyBJZ25vcmUgZHVwbGljYXRlIGZvcm1hdCBjaGFuZ2UuCisgICAgaWYgKG1UcmFja3NBZGRlZC5jb3VudCh0cmFuc2NvZGVyKSA+IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFkZCB0cmFjayB0byB0aGUgd3JpdGVyLgorICAgIGF1dG8gY29uc3VtZXIgPSBtU2FtcGxlV3JpdGVyLT5hZGRUcmFjayh0cmFuc2NvZGVyLT5nZXRPdXRwdXRGb3JtYXQoKSk7CisgICAgaWYgKGNvbnN1bWVyID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGFkZCB0cmFjayB0byBzYW1wbGUgd3JpdGVyLiI7CisgICAgICAgIG9uVGhyZWFkRmluaXNoZWQoc2FtcGxlV3JpdGVyUHRyLCBBTUVESUFfRVJST1JfVU5LTk9XTiwgZmFsc2UgLyogc3RvcHBlZCAqLyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNZWRpYVRyYWNrVHJhbnNjb2RlciogbXV0YWJsZVRyYW5zY29kZXIgPSBjb25zdF9jYXN0PE1lZGlhVHJhY2tUcmFuc2NvZGVyKj4odHJhbnNjb2Rlcik7CisgICAgbXV0YWJsZVRyYW5zY29kZXItPnNldFNhbXBsZUNvbnN1bWVyKGNvbnN1bWVyKTsKKworICAgIG1UcmFja3NBZGRlZC5pbnNlcnQodHJhbnNjb2Rlcik7CisgICAgYm9vbCBlcnJvclN0YXJ0aW5nID0gZmFsc2U7CisgICAgaWYgKG1UcmFja3NBZGRlZC5zaXplKCkgPT0gbVRyYWNrVHJhbnNjb2RlcnMuc2l6ZSgpKSB7CisgICAgICAgIC8vIEVuYWJsZSBzZXF1ZW50aWFsIGFjY2VzcyBtb2RlIG9uIHRoZSBzYW1wbGUgcmVhZGVyIHRvIGFjaGlldmUgb3B0aW1hbCByZWFkIHBlcmZvcm1hbmNlLgorICAgICAgICAvLyBUaGlzIGhhcyB0byB3YWl0IHVudGlsIGFsbCB0cmFja3MgaGF2ZSBkZWxpdmVyZWQgdGhlaXIgb3V0cHV0IGZvcm1hdHMgYW5kIHRoZSBzYW1wbGUKKyAgICAgICAgLy8gd3JpdGVyIGlzIHN0YXJ0ZWQuIE90aGVyd2lzZSB0aGUgdHJhY2tzIHdpbGwgbm90IGdldCB0aGVpciBvdXRwdXQgc2FtcGxlIHF1ZXVlcyBkcmFpbmVkCisgICAgICAgIC8vIGFuZCB0aGUgdHJhbnNjb2RlciBjb3VsZCBoYW5nIGR1ZSB0byBvbmUgdHJhY2sgcnVubmluZyBvdXQgb2YgYnVmZmVycyBhbmQgYmxvY2tpbmcgdGhlCisgICAgICAgIC8vIG90aGVyIHRyYWNrcyBmcm9tIHJlYWRpbmcgc291cmNlIHNhbXBsZXMgYmVmb3JlIHRoZXkgY291bGQgb3V0cHV0IHRoZWlyIGZvcm1hdHMuCisKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21UaHJlYWRTdGF0ZU11dGV4fTsKKyAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgdGhlIHNhbXBsZSB3cml0ZXIgaWYgYSBzdG9wIGFscmVhZHkgaGFzIGJlZW4gcmVxdWVzdGVkLgorICAgICAgICBpZiAoIW1TYW1wbGVXcml0ZXJTdG9wcGVkKSB7CisgICAgICAgICAgICBpZiAoIW1DYW5jZWxsZWQpIHsKKyAgICAgICAgICAgICAgICBtU2FtcGxlUmVhZGVyLT5zZXRFbmZvcmNlU2VxdWVudGlhbEFjY2Vzcyh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlN0YXJ0aW5nIHNhbXBsZSB3cml0ZXIuIjsKKyAgICAgICAgICAgIGVycm9yU3RhcnRpbmcgPSAhbVNhbXBsZVdyaXRlci0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmICghZXJyb3JTdGFydGluZykgeworICAgICAgICAgICAgICAgIG1UaHJlYWRTdGF0ZXNbc2FtcGxlV3JpdGVyUHRyXSA9IFJVTk5JTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyb3JTdGFydGluZykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc3RhcnQgc2FtcGxlIHdyaXRlci4iOworICAgICAgICBvblRocmVhZEZpbmlzaGVkKHNhbXBsZVdyaXRlclB0ciwgQU1FRElBX0VSUk9SX1VOS05PV04sIGZhbHNlIC8qIHN0b3BwZWQgKi8pOworICAgIH0KK30KKwordm9pZCBNZWRpYVRyYW5zY29kZXI6Om9uVHJhY2tGaW5pc2hlZChjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlcikgeworICAgIExPRyhERUJVRykgPDwgIlRyYWNrVHJhbnNjb2RlciAiIDw8IHRyYW5zY29kZXIgPDwgIiBmaW5pc2hlZCI7CisgICAgb25UaHJlYWRGaW5pc2hlZChzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odHJhbnNjb2RlciksIEFNRURJQV9PSywgZmFsc2UgLyogc3RvcHBlZCAqLyk7Cit9CisKK3ZvaWQgTWVkaWFUcmFuc2NvZGVyOjpvblRyYWNrU3RvcHBlZChjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlcikgeworICAgIExPRyhERUJVRykgPDwgIlRyYWNrVHJhbnNjb2RlciAiIDw8IHRyYW5zY29kZXIgPDwgIiBzdG9wcGVkIjsKKyAgICBvblRocmVhZEZpbmlzaGVkKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0cmFuc2NvZGVyKSwgQU1FRElBX09LLCB0cnVlIC8qIHN0b3BwZWQgKi8pOworfQorCit2b2lkIE1lZGlhVHJhbnNjb2Rlcjo6b25UcmFja0Vycm9yKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyLCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBMT0coRVJST1IpIDw8ICJUcmFja1RyYW5zY29kZXIgIiA8PCB0cmFuc2NvZGVyIDw8ICIgcmV0dXJuZWQgZXJyb3IgIiA8PCBzdGF0dXM7CisgICAgb25UaHJlYWRGaW5pc2hlZChzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odHJhbnNjb2RlciksIHN0YXR1cywgZmFsc2UgLyogc3RvcHBlZCAqLyk7Cit9CisKK3ZvaWQgTWVkaWFUcmFuc2NvZGVyOjpvbkZpbmlzaGVkKGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyKiB3cml0ZXIsIG1lZGlhX3N0YXR1c190IHN0YXR1cykgeworICAgIExPRyhzdGF0dXMgPT0gQU1FRElBX09LID8gREVCVUcgOiBFUlJPUikgPDwgIlNhbXBsZSB3cml0ZXIgZmluaXNoZWQgd2l0aCBzdGF0dXMgIiA8PCBzdGF0dXM7CisgICAgb25UaHJlYWRGaW5pc2hlZChzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4od3JpdGVyKSwgc3RhdHVzLCBmYWxzZSAvKiBzdG9wcGVkICovKTsKK30KKwordm9pZCBNZWRpYVRyYW5zY29kZXI6Om9uU3RvcHBlZChjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyKSB7CisgICAgTE9HKERFQlVHKSA8PCAiU2FtcGxlIHdyaXRlciAiIDw8IHdyaXRlciA8PCAiIHN0b3BwZWQiOworICAgIG9uVGhyZWFkRmluaXNoZWQoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHdyaXRlciksIEFNRURJQV9PSywgdHJ1ZSAvKiBzdG9wcGVkICovKTsKK30KKwordm9pZCBNZWRpYVRyYW5zY29kZXI6Om9uUHJvZ3Jlc3NVcGRhdGUoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXIqIHdyaXRlciBfX3VudXNlZCwgaW50MzJfdCBwcm9ncmVzcykgeworICAgIC8vIERpc3BhdGNoIHByb2dyZXNzIHVwZGF0ZWQgdG8gdGhlIGNsaWVudC4KKyAgICBtQ2FsbGJhY2tzLT5vblByb2dyZXNzVXBkYXRlKHRoaXMsIHByb2dyZXNzKTsKK30KKworTWVkaWFUcmFuc2NvZGVyOjpNZWRpYVRyYW5zY29kZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2tzLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgICA6IG1DYWxsYmFja3MoY2FsbGJhY2tzKSwgbVBpZChwaWQpLCBtVWlkKHVpZCkge30KKworc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhbnNjb2Rlcj4gTWVkaWFUcmFuc2NvZGVyOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDYWxsYmFja0ludGVyZmFjZT4mIGNhbGxiYWNrcywgcGlkX3QgcGlkLCB1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+JiBwYXVzZWRTdGF0ZSkgeworICAgIGlmIChwYXVzZWRTdGF0ZSAhPSBudWxscHRyKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiSW5pdGlhbGl6aW5nIGZyb20gcGF1c2VkIHN0YXRlLiI7CisgICAgfQorICAgIGlmIChjYWxsYmFja3MgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYWxsYmFja3MgY2Fubm90IGJlIG51bGwiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhbnNjb2Rlcj4obmV3IE1lZGlhVHJhbnNjb2RlcihjYWxsYmFja3MsIHBpZCwgdWlkKSk7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhVHJhbnNjb2Rlcjo6Y29uZmlndXJlU291cmNlKGludCBmZCkgeworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBzb3VyY2UgZmQ6ICIgPDwgZmQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IGZpbGVTaXplID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKyAgICBsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCisgICAgbVNhbXBsZVJlYWRlciA9IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpjcmVhdGVGcm9tRmQoZmQsIDAgLyogb2Zmc2V0ICovLCBmaWxlU2l6ZSk7CisKKyAgICBpZiAobVNhbXBsZVJlYWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBwYXJzZSBzb3VyY2UgZmQ6ICIgPDwgZmQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IHRyYWNrQ291bnQgPSBtU2FtcGxlUmVhZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCA9IG1TYW1wbGVSZWFkZXItPmdldFRyYWNrRm9ybWF0KHN0YXRpY19jYXN0PGludD4odHJhY2tJbmRleCkpOworICAgICAgICBpZiAodHJhY2tGb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJhY2sgIyIgPDwgdHJhY2tJbmRleCA8PCAiIGhhcyBubyBmb3JtYXQiOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBtU291cmNlVHJhY2tGb3JtYXRzLmVtcGxhY2VfYmFjayh0cmFja0Zvcm1hdCwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgIH0KKworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+PiBNZWRpYVRyYW5zY29kZXI6OmdldFRyYWNrRm9ybWF0cygpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhlIGZvcm1hdHMgdG8gYXZvaWQgdGhlIGNhbGxlciBtb2RpZnlpbmcgb3VyIGludGVybmFsIGZvcm1hdHMuCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4+IHRyYWNrRm9ybWF0czsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+JiBzb3VyY2VGb3JtYXQgOiBtU291cmNlVHJhY2tGb3JtYXRzKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdCogY29weSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NvcHkoY29weSwgc291cmNlRm9ybWF0LmdldCgpKTsKKyAgICAgICAgdHJhY2tGb3JtYXRzLmVtcGxhY2VfYmFjayhjb3B5LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgfQorICAgIHJldHVybiB0cmFja0Zvcm1hdHM7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhVHJhbnNjb2Rlcjo6Y29uZmlndXJlVHJhY2tGb3JtYXQoc2l6ZV90IHRyYWNrSW5kZXgsIEFNZWRpYUZvcm1hdCogdHJhY2tGb3JtYXQpIHsKKyAgICBpZiAobVNhbXBsZVJlYWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlNvdXJjZSBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIHRyYWNrcyI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmICh0cmFja0luZGV4ID49IG1Tb3VyY2VUcmFja0Zvcm1hdHMuc2l6ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrIGluZGV4ICIgPDwgdHJhY2tJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgb3V0IG9mIGJvdW5kcy4gVHJhY2sgY291bnQ6ICIgPDwgbVNvdXJjZVRyYWNrRm9ybWF0cy5zaXplKCk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gbVNhbXBsZVJlYWRlci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHNlbGVjdCB0cmFjayAiIDw8IHRyYWNrSW5kZXg7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyPiB0cmFuc2NvZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IGZvcm1hdDsKKworICAgIGlmICh0cmFja0Zvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgIHRyYW5zY29kZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyPihzaGFyZWRfZnJvbV90aGlzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNyY01pbWUgPSBudWxscHRyOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobVNvdXJjZVRyYWNrRm9ybWF0c1t0cmFja0luZGV4XS5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY01pbWUpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTb3VyY2UgdHJhY2sgIyIgPDwgdHJhY2tJbmRleCA8PCAiIGhhcyBubyBtaW1lIHR5cGUiOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RybmNtcChzcmNNaW1lLCAidmlkZW8vIiwgNikgIT0gMCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiT25seSB2aWRlbyB0cmFja3MgYXJlIHN1cHBvcnRlZCBmb3IgdHJhbnNjb2RpbmcuIFVuYWJsZSB0byBjb25maWd1cmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2sgIyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgdHJhY2tJbmRleCA8PCAiIHdpdGggbWltZSAiIDw8IHNyY01pbWU7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciogZHN0TWltZSA9IG51bGxwdHI7CisgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZkc3RNaW1lKSkgeworICAgICAgICAgICAgaWYgKHN0cm5jbXAoZHN0TWltZSwgInZpZGVvLyIsIDYpICE9IDApIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY29udmVydCBtZWRpYSB0eXBlcyBmb3IgdHJhY2sgIyIgPDwgdHJhY2tJbmRleCA8PCAiLCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHNyY01pbWUgPDwgIiB0byAiIDw8IGRzdE1pbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyYW5zY29kZXIgPSBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Y3JlYXRlKHNoYXJlZF9mcm9tX3RoaXMoKSwgbVBpZCwgbVVpZCk7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0KiBtZXJnZWRGb3JtYXQgPQorICAgICAgICAgICAgICAgIG1lcmdlTWVkaWFGb3JtYXRzKG1Tb3VyY2VUcmFja0Zvcm1hdHNbdHJhY2tJbmRleF0uZ2V0KCksIHRyYWNrRm9ybWF0KTsKKyAgICAgICAgaWYgKG1lcmdlZEZvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gbWVyZ2Ugc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmb3JtYXRzIjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgICAgIGZvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KG1lcmdlZEZvcm1hdCwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgIH0KKworICAgIHN0YXR1cyA9IHRyYW5zY29kZXItPmNvbmZpZ3VyZShtU2FtcGxlUmVhZGVyLCB0cmFja0luZGV4LCBmb3JtYXQpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbmZpZ3VyZSB0cmFjayB0cmFuc2NvZGVyIGZvciB0cmFjayAjIiA8PCB0cmFja0luZGV4IDw8ICIgcmV0dXJuZWQgZXJyb3IgIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVRocmVhZFN0YXRlTXV0ZXh9OworICAgIG1UaHJlYWRTdGF0ZXNbc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRyYW5zY29kZXIuZ2V0KCkpXSA9IFBFTkRJTkc7CisKKyAgICBtVHJhY2tUcmFuc2NvZGVycy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHRyYW5zY29kZXIpKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBNZWRpYVRyYW5zY29kZXI6OmNvbmZpZ3VyZURlc3RpbmF0aW9uKGludCBmZCkgeworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBkZXN0aW5hdGlvbiBmZDogIiA8PCBmZDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAobVNhbXBsZVdyaXRlciAhPSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkRlc3RpbmF0aW9uIGlzIGFscmVhZHkgY29uZmlndXJlZC4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TYW1wbGVXcml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisgICAgY29uc3QgYm9vbCBpbml0T2sgPSBtU2FtcGxlV3JpdGVyLT5pbml0KGZkLCBzaGFyZWRfZnJvbV90aGlzKCkpOworCisgICAgaWYgKCFpbml0T2spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgc2FtcGxlIHdyaXRlciB3aXRoIGRlc3RpbmF0aW9uIGZkOiAiIDw8IGZkOworICAgICAgICBtU2FtcGxlV3JpdGVyLnJlc2V0KCk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVRocmVhZFN0YXRlTXV0ZXh9OworICAgIG1UaHJlYWRTdGF0ZXNbc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KG1TYW1wbGVXcml0ZXIuZ2V0KCkpXSA9IFBFTkRJTkc7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFUcmFuc2NvZGVyOjpzdGFydCgpIHsKKyAgICBpZiAobVRyYWNrVHJhbnNjb2RlcnMuc2l6ZSgpIDwgMSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc3RhcnQsIG5vIHRyYWNrcyBhcmUgY29uZmlndXJlZC4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSBpZiAobVNhbXBsZVdyaXRlciA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzdGFydCwgZGVzdGluYXRpb24gaXMgbm90IGNvbmZpZ3VyZWQiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFN0YXJ0IHRyYW5zY29kZXJzCisgICAgYm9vbCBzdGFydGVkID0gdHJ1ZTsKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttVGhyZWFkU3RhdGVNdXRleH07CisgICAgICAgIGZvciAoYXV0byYgdHJhbnNjb2RlciA6IG1UcmFja1RyYW5zY29kZXJzKSB7CisgICAgICAgICAgICBpZiAoIShzdGFydGVkID0gdHJhbnNjb2Rlci0+c3RhcnQoKSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UaHJlYWRTdGF0ZXNbc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRyYW5zY29kZXIuZ2V0KCkpXSA9IFJVTk5JTkc7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdGFydGVkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzdGFydCB0cmFjayB0cmFuc2NvZGVyLiI7CisgICAgICAgIGNhbmNlbCgpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhVHJhbnNjb2Rlcjo6cmVxdWVzdFN0b3AoYm9vbCBzdG9wT25TeW5jKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21UaHJlYWRTdGF0ZU11dGV4fTsKKyAgICBpZiAobUNhbmNlbGxlZCkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJNZWRpYVRyYW5zY29kZXIgYWxyZWFkeSBjYW5jZWxsZWQiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGlmICghc3RvcE9uU3luYykgeworICAgICAgICBtU2FtcGxlV3JpdGVyU3RvcHBlZCA9IHRydWU7CisgICAgICAgIG1TYW1wbGVXcml0ZXItPnN0b3AoKTsKKyAgICB9CisKKyAgICBtU2FtcGxlUmVhZGVyLT5zZXRFbmZvcmNlU2VxdWVudGlhbEFjY2VzcyhmYWxzZSk7CisgICAgZm9yIChhdXRvJiB0cmFuc2NvZGVyIDogbVRyYWNrVHJhbnNjb2RlcnMpIHsKKyAgICAgICAgdHJhbnNjb2Rlci0+c3RvcChzdG9wT25TeW5jKTsKKyAgICB9CisKKyAgICBtQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCit2b2lkIE1lZGlhVHJhbnNjb2Rlcjo6d2FpdEZvclRocmVhZHMoKSBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2t7bVRocmVhZFN0YXRlTXV0ZXh9OworICAgIHdoaWxlICghbVRocmVhZHNEb25lKSB7CisgICAgICAgIG1UaHJlYWRzRG9uZVNpZ25hbC53YWl0KGxvY2spOworICAgIH0KK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFUcmFuc2NvZGVyOjpwYXVzZShzdGQ6OnNoYXJlZF9wdHI8bmRrOjpTY29wZWRBUGFyY2VsPiogcGF1c2VkU3RhdGUpIHsKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSByZXF1ZXN0U3RvcCh0cnVlIC8qIHN0b3BPblN5bmMgKi8pOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgd2FpdEZvclRocmVhZHMoKTsKKworICAgIC8vIFRPRE86IHdyaXRlIGludGVybmFsIHN0YXRlcyB0byBwYXJjZWwuCisgICAgKnBhdXNlZFN0YXRlID0gc3RkOjpzaGFyZWRfcHRyPDo6bmRrOjpTY29wZWRBUGFyY2VsPihuZXcgOjpuZGs6OlNjb3BlZEFQYXJjZWwoKSk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFUcmFuc2NvZGVyOjpjYW5jZWwoKSB7CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gcmVxdWVzdFN0b3AoZmFsc2UgLyogc3RvcE9uU3luYyAqLyk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB3YWl0Rm9yVGhyZWFkcygpOworCisgICAgLy8gVE9ETzogUmVsZWFzZSB0cmFuc2NvZGVycz8KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBNZWRpYVRyYW5zY29kZXI6OnJlc3VtZSgpIHsKKyAgICAvLyBUT0RPOiByZXN0b3JlIGludGVybmFsIHN0YXRlcyBmcm9tIHBhcmNlbC4KKyAgICByZXR1cm4gc3RhcnQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9OZGtDb21tb24uY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL05ka0NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiNzlkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9OZGtDb21tb24uY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtDb21tb24iCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0NvbW1vbi5oPgorCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworLyogVE9ETyhiLzE1MzU5MjI4MSkKKyAqIE5vdGU6IGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBuYXRpdmUgbWVkaWEgdGVzdHMgYnV0IG5vdCBhdmFpbGFibGUgaW4gbWVkaWEgbmRrIGFwaQorICovCitjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fVlA4ID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOworY29uc3QgY2hhciogQU1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSA9ICJ2aWRlby94LXZuZC5vbjIudnA5IjsKK2NvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19BVjEgPSAidmlkZW8vYXYwMSI7Citjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7Citjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyA9ICJ2aWRlby9oZXZjIjsKK2NvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKK2NvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzID0gInZpZGVvLzNncHAiOworCisvKiBUT0RPKGIvMTUzNTkyMjgxKSAqLworY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfQUxMT1dfRlJBTUVfRFJPUCA9ICJhbGxvdy1mcmFtZS1kcm9wIjsKK2NvbnN0IGNoYXIqIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSA9ICJyZXF1ZXN0LXN5bmMiOworY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSA9ICJ2aWRlby1iaXRyYXRlIjsKK2NvbnN0IGNoYXIqIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX01BWF9CX0ZSQU1FUyA9ICJtYXgtYmZyYW1lcyI7CisKK25hbWVzcGFjZSBBTWVkaWFGb3JtYXRVdGlscyB7CisKKyNkZWZpbmUgREVGSU5FX0ZPUk1BVF9WQUxVRV9DT1BZX0ZVTkMoX3R5cGUsIF90eXBlTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIENvcHlGb3JtYXRFbnRyeSMjX3R5cGVOYW1lKGNvbnN0IGNoYXIqIGtleSwgQU1lZGlhRm9ybWF0KiBmcm9tLCBBTWVkaWFGb3JtYXQqIHRvKSB7IFwKKyAgICAgICAgX3R5cGUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXQjI190eXBlTmFtZShmcm9tLCBrZXksICZ2YWx1ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXQjI190eXBlTmFtZSh0bywga2V5LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK0RFRklORV9GT1JNQVRfVkFMVUVfQ09QWV9GVU5DKGNvbnN0IGNoYXIqLCBTdHJpbmcpOworREVGSU5FX0ZPUk1BVF9WQUxVRV9DT1BZX0ZVTkMoaW50NjRfdCwgSW50NjQpOworREVGSU5FX0ZPUk1BVF9WQUxVRV9DT1BZX0ZVTkMoaW50MzJfdCwgSW50MzIpOworREVGSU5FX0ZPUk1BVF9WQUxVRV9DT1BZX0ZVTkMoZmxvYXQsIEZsb2F0KTsKKwordm9pZCBDb3B5Rm9ybWF0RW50cmllcyhBTWVkaWFGb3JtYXQqIGZyb20sIEFNZWRpYUZvcm1hdCogdG8sIGNvbnN0IEVudHJ5Q29waWVyKiBlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW50cnlDb3VudCkgeworICAgIGlmIChmcm9tID09IG51bGxwdHIgfHwgdG8gPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY29weSBudWxsIGZvcm1hdHMiOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChlbnRyaWVzID09IG51bGxwdHIgfHwgZW50cnlDb3VudCA8IDEpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJObyBlbnRyaWVzIHRvIGNvcHkiOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKCFlbnRyaWVzW2ldLmNvcHkoZW50cmllc1tpXS5rZXksIGZyb20sIHRvKSAmJiBlbnRyaWVzW2ldLmNvcHkyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGVudHJpZXNbaV0uY29weTIoZW50cmllc1tpXS5rZXksIGZyb20sIHRvKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2RlZmluZSBERUZJTkVfU0VUX0RFRkFVTFRfRk9STUFUX1ZBTFVFX0ZVTkMoX3R5cGUsIF90eXBlTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgU2V0RGVmYXVsdEZvcm1hdFZhbHVlIyNfdHlwZU5hbWUoY29uc3QgY2hhcioga2V5LCBBTWVkaWFGb3JtYXQqIGZvcm1hdCwgX3R5cGUgdmFsdWUpIHsgXAorICAgICAgICBfdHlwZSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXQjI190eXBlTmFtZShmb3JtYXQsIGtleSwgJnRtcCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldCMjX3R5cGVOYW1lKGZvcm1hdCwga2V5LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworREVGSU5FX1NFVF9ERUZBVUxUX0ZPUk1BVF9WQUxVRV9GVU5DKGZsb2F0LCBGbG9hdCk7CitERUZJTkVfU0VUX0RFRkFVTFRfRk9STUFUX1ZBTFVFX0ZVTkMoaW50MzJfdCwgSW50MzIpOworCit9ICAvLyBuYW1lc3BhY2UgQU1lZGlhRm9ybWF0VXRpbHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTVlMjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyOjpCdWZmZXJQb29sOjp+QnVmZmVyUG9vbCgpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQWRkcmVzc1NpemVNYXAuYmVnaW4oKTsgaXQgIT0gbUFkZHJlc3NTaXplTWFwLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGRlbGV0ZVtdIGl0LT5maXJzdDsKKyAgICB9Cit9CisKK3VpbnQ4X3QqIFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyOjpCdWZmZXJQb29sOjpnZXRCdWZmZXJXaXRoU2l6ZShzaXplX3QgbWluaW11bUJ1ZmZlclNpemUpCisgICAgICAgIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgeworICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgLy8gV2FpdCBpZiBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgYnV0IG5vbmUgYXJlIGZyZWUuCisgICAgd2hpbGUgKG1BZGRyZXNzU2l6ZU1hcC5zaXplKCkgPj0gbU1heEJ1ZmZlckNvdW50ICYmIG1GcmVlQnVmZmVyTWFwLmVtcHR5KCkgJiYgIW1BYm9ydGVkKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICB9CisKKyAgICBpZiAobUFib3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdGhlIGZyZWUgbGlzdCBjb250YWlucyBhIGxhcmdlIGVub3VnaCBidWZmZXIuCisgICAgYXV0byBpdCA9IG1GcmVlQnVmZmVyTWFwLmxvd2VyX2JvdW5kKG1pbmltdW1CdWZmZXJTaXplKTsKKyAgICBpZiAoaXQgIT0gbUZyZWVCdWZmZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgdWludDhfdCogYnVmZmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUZyZWVCdWZmZXJNYXAuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKworICAgIC8vIElmIHRoZSBtYXhpbXVtIGJ1ZmZlciBjb3VudCBpcyByZWFjaGVkLCByZW1vdmUgYW4gZXhpc3RpbmcgZnJlZSBidWZmZXIuCisgICAgaWYgKG1BZGRyZXNzU2l6ZU1hcC5zaXplKCkgPj0gbU1heEJ1ZmZlckNvdW50KSB7CisgICAgICAgIGF1dG8gaXQgPSBtRnJlZUJ1ZmZlck1hcC5iZWdpbigpOworICAgICAgICBtQWRkcmVzc1NpemVNYXAuZXJhc2UoaXQtPnNlY29uZCk7CisgICAgICAgIGRlbGV0ZVtdIGl0LT5zZWNvbmQ7CisgICAgICAgIG1GcmVlQnVmZmVyTWFwLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgICAgdWludDhfdCogYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbbWluaW11bUJ1ZmZlclNpemVdOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gYWxsb2NhdGUgbmV3IGJ1ZmZlciBvZiBzaXplOiAiIDw8IG1pbmltdW1CdWZmZXJTaXplOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIGJ1ZmZlciB0byB0aGUgdHJhY2tpbmcgc2V0LgorICAgIG1BZGRyZXNzU2l6ZU1hcC5lbXBsYWNlKGJ1ZmZlciwgbWluaW11bUJ1ZmZlclNpemUpOworICAgIHJldHVybiBidWZmZXI7Cit9CisKK3ZvaWQgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI6OkJ1ZmZlclBvb2w6OnJldHVybkJ1ZmZlcih1aW50OF90KiBidWZmZXIpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0ciB8fCBtQWRkcmVzc1NpemVNYXAuZmluZChidWZmZXIpID09IG1BZGRyZXNzU2l6ZU1hcC5lbmQoKSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgIklnbm9yaW5nIHVudHJhY2tlZCBidWZmZXIgIiA8PCBidWZmZXI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRnJlZUJ1ZmZlck1hcC5lbXBsYWNlKG1BZGRyZXNzU2l6ZU1hcFtidWZmZXJdLCBidWZmZXIpOworICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworfQorCit2b2lkIFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyOjpCdWZmZXJQb29sOjphYm9ydCgpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBtQWJvcnRlZCA9IHRydWU7CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7Cit9CisKK21lZGlhX3N0YXR1c190IFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyOjpjb25maWd1cmVEZXN0aW5hdGlvbkZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIGRlc3RpbmF0aW9uRm9ybWF0IF9fdW51c2VkKSB7CisgICAgLy8gQ2FsbGVkIGJ5IE1lZGlhVHJhY2tUcmFuc2NvZGVyLiBQYXNzdGhyb3VnaCBkb2Vzbid0IGNhcmUgYWJvdXQgZGVzdGluYXRpb24gc28ganVzdCByZXR1cm4gb2suCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI6OnJ1blRyYW5zY29kZUxvb3AoYm9vbCogc3RvcHBlZCkgeworICAgIE1lZGlhU2FtcGxlSW5mbyBpbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgIGJvb2wgZW9zUmVhY2hlZCA9IGZhbHNlOworCisgICAgLy8gTm90aWZ5IHRoZSB0cmFjayBmb3JtYXQgYXMgc29vbiBhcyB3ZSBzdGFydC4gSXQncyBzYW1lIGFzIHRoZSBzb3VyY2UgZm9ybWF0LgorICAgIG5vdGlmeVRyYWNrRm9ybWF0QXZhaWxhYmxlKCk7CisKKyAgICBNZWRpYVNhbXBsZTo6T25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIGJ1ZmZlclJlbGVhc2VDYWxsYmFjayA9CisgICAgICAgICAgICBbYnVmZmVyUG9vbCA9IG1CdWZmZXJQb29sXShNZWRpYVNhbXBsZSogc2FtcGxlKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbC0+cmV0dXJuQnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHNhbXBsZS0+YnVmZmVyKSk7CisgICAgICAgICAgICB9OworCisgICAgLy8gTW92ZSBzYW1wbGVzIHVudGlsIEVPUyBpcyByZWFjaGVkIG9yIHRyYW5zY29kaW5nIGlzIHN0b3BwZWQuCisgICAgd2hpbGUgKG1TdG9wUmVxdWVzdCAhPSBTVE9QX05PVyAmJiAhZW9zUmVhY2hlZCkgeworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBtTWVkaWFTYW1wbGVSZWFkZXItPmdldFNhbXBsZUluZm9Gb3JUcmFjayhtVHJhY2tJbmRleCwgJmluZm8pOworCisgICAgICAgIGlmIChzdGF0dXMgPT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICB1aW50OF90KiBidWZmZXIgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoaW5mby5zaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGlmIChtU3RvcFJlcXVlc3QgPT0gU1RPUF9OT1cpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGdldCBidWZmZXIgZnJvbSBwb29sIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNhbXBsZSA9IE1lZGlhU2FtcGxlOjpjcmVhdGVXaXRoUmVsZWFzZUNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIDAgLyogb2Zmc2V0ICovLCAwIC8qIGJ1ZmZlcklkICovLCBidWZmZXJSZWxlYXNlQ2FsbGJhY2spOworCisgICAgICAgICAgICBzdGF0dXMgPSBtTWVkaWFTYW1wbGVSZWFkZXItPnJlYWRTYW1wbGVEYXRhRm9yVHJhY2sobVRyYWNrSW5kZXgsIGJ1ZmZlciwgaW5mby5zaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHJlYWQgbmV4dCBzYW1wbGUgZGF0YS4gQWJvcnRpbmcgdHJhbnNjb2RlLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgc2FtcGxlID0gc3RkOjptYWtlX3NoYXJlZDxNZWRpYVNhbXBsZT4oKTsKKyAgICAgICAgICAgIGVvc1JlYWNoZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGdldCBuZXh0IHNhbXBsZSBpbmZvLiBBYm9ydGluZyB0cmFuc2NvZGUuIjsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBzYW1wbGUtPmluZm8gPSBpbmZvOworICAgICAgICBvbk91dHB1dFNhbXBsZUF2YWlsYWJsZShzYW1wbGUpOworCisgICAgICAgIGlmIChtU3RvcFJlcXVlc3QgPT0gU1RPUF9PTl9TWU5DICYmIGluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19TWU5DX1NBTVBMRSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVN0b3BSZXF1ZXN0ICE9IE5PTkUgJiYgIWVvc1JlYWNoZWQpIHsKKyAgICAgICAgKnN0b3BwZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCit2b2lkIFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyOjphYm9ydFRyYW5zY29kZUxvb3AoKSB7CisgICAgaWYgKG1TdG9wUmVxdWVzdCA9PSBTVE9QX05PVykgeworICAgICAgICBtQnVmZmVyUG9vbC0+YWJvcnQoKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyOjpnZXRPdXRwdXRGb3JtYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Tb3VyY2VGb3JtYXQ7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL1ZpZGVvVHJhY2tUcmFuc2NvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9WaWRlb1RyYWNrVHJhbnNjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjNWUwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9WaWRlb1RyYWNrVHJhbnNjb2Rlci5jcHAKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb1RyYWNrVHJhbnNjb2RlciIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrQ29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvVmlkZW9UcmFja1RyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9BbmRyb2lkVGhyZWFkcy5oPgorCit1c2luZyBuYW1lc3BhY2UgQU1lZGlhRm9ybWF0VXRpbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQ2hlY2sgdGhhdCB0aGUgY29kZWMgc2FtcGxlIGZsYWdzIGhhdmUgdGhlIGV4cGVjdGVkIE5ESyBtZWFuaW5nLgorc3RhdGljX2Fzc2VydChTQU1QTEVfRkxBR19DT0RFQ19DT05GSUcgPT0gQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHLAorICAgICAgICAgICAgICAiU2FtcGxlIGZsYWcgbWlzbWF0Y2g6IENPREVDX0NPTkZJRyIpOworc3RhdGljX2Fzc2VydChTQU1QTEVfRkxBR19FTkRfT0ZfU1RSRUFNID09IEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0sCisgICAgICAgICAgICAgICJTYW1wbGUgZmxhZyBtaXNtYXRjaDogRU5EX09GX1NUUkVBTSIpOworc3RhdGljX2Fzc2VydChTQU1QTEVfRkxBR19QQVJUSUFMX0ZSQU1FID09IEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX1BBUlRJQUxfRlJBTUUsCisgICAgICAgICAgICAgICJTYW1wbGUgZmxhZyBtaXNtYXRjaDogUEFSVElBTF9GUkFNRSIpOworCisvLyBDb2xvciBmb3JtYXQgZGVmaW5lZCBieSBzdXJmYWNlLiAoU2VlIE1lZGlhQ29kZWNJbmZvLkNvZGVjQ2FwYWJpbGl0aWVzI0NPTE9SX0Zvcm1hdFN1cmZhY2UuKQorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtDb2xvckZvcm1hdFN1cmZhY2UgPSAweDdmMDAwNzg5OworLy8gRGVmYXVsdCBrZXkgZnJhbWUgaW50ZXJ2YWwgaW4gc2Vjb25kcy4KK3N0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRLZXlGcmFtZUludGVydmFsU2Vjb25kcyA9IDEuMGY7CisvLyBEZWZhdWx0IGNvZGVjIG9wZXJhdGluZyByYXRlLgorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0Q29kZWNPcGVyYXRpbmdSYXRlID0gMjQwOworLy8gRGVmYXVsdCBjb2RlYyBwcmlvcml0eS4KK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdENvZGVjUHJpb3JpdHkgPSAxOworLy8gRGVmYXVsdCBiaXRyYXRlLCBpbiBjYXNlIHNvdXJjZSBlc3RpbWF0aW9uIGZhaWxzLgorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0Qml0cmF0ZU1icHMgPSAxMCAqIDEwMDAgKiAxMDAwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVmlkZW9UcmFja1RyYW5zY29kZXI6OkJsb2NraW5nUXVldWU8VD46OnB1c2goVCBjb25zdCYgdmFsdWUsIGJvb2wgZnJvbnQpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobUFib3J0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcm9udCkgeworICAgICAgICAgICAgbVF1ZXVlLnB1c2hfZnJvbnQodmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6QmxvY2tpbmdRdWV1ZTxUPjo6cG9wKCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTXV0ZXgpOworICAgIHdoaWxlIChtUXVldWUuZW1wdHkoKSkgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobG9jayk7CisgICAgfQorICAgIFQgdmFsdWUgPSBtUXVldWUuZnJvbnQoKTsKKyAgICBtUXVldWUucG9wX2Zyb250KCk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCisvLyBOb3RlOiBEbyBub3QgY2FsbCBpZiBhbm90aGVyIHRocmVhZCBtaWdodCB3YWl0aW5nIGluIHBvcC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6QmxvY2tpbmdRdWV1ZTxUPjo6YWJvcnQoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisgICAgbUFib3J0ZWQgPSB0cnVlOworICAgIG1RdWV1ZS5jbGVhcigpOworfQorCisvLyBUaGUgQ29kZWNXcmFwcGVyIGNsYXNzIGlzIHVzZWQgdG8gbGV0IEFNZWRpYUNvZGVjIGluc3RhbmNlcyBvdXRsaXZlIHRoZSB0cmFuc2NvZGVyIG9iamVjdCBpdHNlbGYKKy8vIGJ5IGdpdmluZyB0aGUgY29kZWMgYSB3ZWFrIHBvaW50ZXIgdG8gdGhlIHRyYW5zY29kZXIuIENvZGVjcyB3cmFwcGVkIGluIHRoaXMgb2JqZWN0IGFyZSBrZXB0CisvLyBhbGl2ZSBieSB0aGUgdHJhbnNjb2RlciBhbmQgdGhlIGNvZGVjJ3Mgb3V0c3RhbmRpbmcgYnVmZmVycy4gT25jZSB0aGUgdHJhbnNjb2RlciBzdG9wcyBhbmQgYWxsCisvLyBvdXRwdXQgYnVmZmVycyBoYXZlIGJlZW4gcmVsZWFzZWQgYnkgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoZSBjb2RlYyB3aWxsIGFsc28gYmUgcmVsZWFzZWQuCitjbGFzcyBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Q29kZWNXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBDb2RlY1dyYXBwZXIoQU1lZGlhQ29kZWMqIGNvZGVjLCBjb25zdCBzdGQ6OndlYWtfcHRyPFZpZGVvVHJhY2tUcmFuc2NvZGVyPiYgdHJhbnNjb2RlcikKKyAgICAgICAgICA6IG1Db2RlYyhjb2RlYyksIG1UcmFuc2NvZGVyKHRyYW5zY29kZXIpLCBtQ29kZWNTdGFydGVkKGZhbHNlKSB7fQorICAgIH5Db2RlY1dyYXBwZXIoKSB7CisgICAgICAgIGlmIChtQ29kZWNTdGFydGVkKSB7CisgICAgICAgICAgICBBTWVkaWFDb2RlY19zdG9wKG1Db2RlYyk7CisgICAgICAgIH0KKyAgICAgICAgQU1lZGlhQ29kZWNfZGVsZXRlKG1Db2RlYyk7CisgICAgfQorCisgICAgQU1lZGlhQ29kZWMqIGdldENvZGVjKCkgeyByZXR1cm4gbUNvZGVjOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPFZpZGVvVHJhY2tUcmFuc2NvZGVyPiBnZXRUcmFuc2NvZGVyKCkgY29uc3QgeyByZXR1cm4gbVRyYW5zY29kZXIubG9jaygpOyB9OworICAgIHZvaWQgc2V0U3RhcnRlZCgpIHsgbUNvZGVjU3RhcnRlZCA9IHRydWU7IH0KKworcHJpdmF0ZToKKyAgICBBTWVkaWFDb2RlYyogbUNvZGVjOworICAgIHN0ZDo6d2Vha19wdHI8VmlkZW9UcmFja1RyYW5zY29kZXI+IG1UcmFuc2NvZGVyOworICAgIGJvb2wgbUNvZGVjU3RhcnRlZDsKK307CisKKy8vIERpc3BhdGNoIHJlc3BvbnNlcyB0byBjb2RlYyBjYWxsYmFja3Mgb250byB0aGUgbWVzc2FnZSBxdWV1ZS4KK3N0cnVjdCBBc3luY0NvZGVjQ2FsbGJhY2tEaXNwYXRjaCB7CisgICAgc3RhdGljIHZvaWQgb25Bc3luY0lucHV0QXZhaWxhYmxlKEFNZWRpYUNvZGVjKiBjb2RlYywgdm9pZCogdXNlcmRhdGEsIGludDMyX3QgaW5kZXgpIHsKKyAgICAgICAgVmlkZW9UcmFja1RyYW5zY29kZXI6OkNvZGVjV3JhcHBlciogd3JhcHBlciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VmlkZW9UcmFja1RyYW5zY29kZXI6OkNvZGVjV3JhcHBlcio+KHVzZXJkYXRhKTsKKyAgICAgICAgaWYgKGF1dG8gdHJhbnNjb2RlciA9IHdyYXBwZXItPmdldFRyYW5zY29kZXIoKSkgeworICAgICAgICAgICAgaWYgKGNvZGVjID09IHRyYW5zY29kZXItPm1EZWNvZGVyKSB7CisgICAgICAgICAgICAgICAgdHJhbnNjb2Rlci0+bUNvZGVjTWVzc2FnZVF1ZXVlLnB1c2goCisgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNjb2RlciwgaW5kZXhdIHsgdHJhbnNjb2Rlci0+ZW5xdWV1ZUlucHV0U2FtcGxlKGluZGV4KTsgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkFzeW5jT3V0cHV0QXZhaWxhYmxlKEFNZWRpYUNvZGVjKiBjb2RlYywgdm9pZCogdXNlcmRhdGEsIGludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8qIGJ1ZmZlckluZm9QdHIpIHsKKyAgICAgICAgVmlkZW9UcmFja1RyYW5zY29kZXI6OkNvZGVjV3JhcHBlciogd3JhcHBlciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VmlkZW9UcmFja1RyYW5zY29kZXI6OkNvZGVjV3JhcHBlcio+KHVzZXJkYXRhKTsKKyAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvIGJ1ZmZlckluZm8gPSAqYnVmZmVySW5mb1B0cjsKKyAgICAgICAgaWYgKGF1dG8gdHJhbnNjb2RlciA9IHdyYXBwZXItPmdldFRyYW5zY29kZXIoKSkgeworICAgICAgICAgICAgdHJhbnNjb2Rlci0+bUNvZGVjTWVzc2FnZVF1ZXVlLnB1c2goW3RyYW5zY29kZXIsIGluZGV4LCBjb2RlYywgYnVmZmVySW5mb10geworICAgICAgICAgICAgICAgIGlmIChjb2RlYyA9PSB0cmFuc2NvZGVyLT5tRGVjb2RlcikgeworICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVyLT50cmFuc2ZlckJ1ZmZlcihpbmRleCwgYnVmZmVySW5mbyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlYyA9PSB0cmFuc2NvZGVyLT5tRW5jb2Rlci0+Z2V0Q29kZWMoKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVyLT5kZXF1ZXVlT3V0cHV0U2FtcGxlKGluZGV4LCBidWZmZXJJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uQXN5bmNGb3JtYXRDaGFuZ2VkKEFNZWRpYUNvZGVjKiBjb2RlYywgdm9pZCogdXNlcmRhdGEsIEFNZWRpYUZvcm1hdCogZm9ybWF0KSB7CisgICAgICAgIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpDb2RlY1dyYXBwZXIqIHdyYXBwZXIgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpDb2RlY1dyYXBwZXIqPih1c2VyZGF0YSk7CisgICAgICAgIGlmIChhdXRvIHRyYW5zY29kZXIgPSB3cmFwcGVyLT5nZXRUcmFuc2NvZGVyKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtDb2RlY05hbWUgPSAoY29kZWMgPT0gdHJhbnNjb2Rlci0+bURlY29kZXIgPyAiRGVjb2RlciIgOiAiRW5jb2RlciIpOworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCBrQ29kZWNOYW1lIDw8ICIgZm9ybWF0IGNoYW5nZWQ6ICIgPDwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKGZvcm1hdCk7CisgICAgICAgICAgICBpZiAoY29kZWMgPT0gdHJhbnNjb2Rlci0+bUVuY29kZXItPmdldENvZGVjKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFuc2NvZGVyLT5tQ29kZWNNZXNzYWdlUXVldWUucHVzaCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2NvZGVyLCBmb3JtYXRdIHsgdHJhbnNjb2Rlci0+dXBkYXRlVHJhY2tGb3JtYXQoZm9ybWF0KTsgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkFzeW5jRXJyb3IoQU1lZGlhQ29kZWMqIGNvZGVjLCB2b2lkKiB1c2VyZGF0YSwgbWVkaWFfc3RhdHVzX3QgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWN0aW9uQ29kZSwgY29uc3QgY2hhciogZGV0YWlsKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yIGZyb20gY29kZWMgIiA8PCBjb2RlYyA8PCAiLCB1c2VyZGF0YSAiIDw8IHVzZXJkYXRhIDw8ICIsIGVycm9yICIKKyAgICAgICAgICAgICAgICAgICA8PCBlcnJvciA8PCAiLCBhY3Rpb24gIiA8PCBhY3Rpb25Db2RlIDw8ICIsIGRldGFpbCAiIDw8IGRldGFpbDsKKyAgICAgICAgVmlkZW9UcmFja1RyYW5zY29kZXI6OkNvZGVjV3JhcHBlciogd3JhcHBlciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VmlkZW9UcmFja1RyYW5zY29kZXI6OkNvZGVjV3JhcHBlcio+KHVzZXJkYXRhKTsKKyAgICAgICAgaWYgKGF1dG8gdHJhbnNjb2RlciA9IHdyYXBwZXItPmdldFRyYW5zY29kZXIoKSkgeworICAgICAgICAgICAgdHJhbnNjb2Rlci0+bUNvZGVjTWVzc2FnZVF1ZXVlLnB1c2goCisgICAgICAgICAgICAgICAgICAgIFt0cmFuc2NvZGVyLCBlcnJvcl0geyB0cmFuc2NvZGVyLT5tU3RhdHVzID0gZXJyb3I7IH0sIHRydWUpOworICAgICAgICB9CisgICAgfQorfTsKKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8VmlkZW9UcmFja1RyYW5zY29kZXI+IFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8TWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjaz4mIHRyYW5zY29kZXJDYWxsYmFjaywgcGlkX3QgcGlkLAorICAgICAgICB1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFZpZGVvVHJhY2tUcmFuc2NvZGVyPigKKyAgICAgICAgICAgIG5ldyBWaWRlb1RyYWNrVHJhbnNjb2Rlcih0cmFuc2NvZGVyQ2FsbGJhY2ssIHBpZCwgdWlkKSk7Cit9CisKK1ZpZGVvVHJhY2tUcmFuc2NvZGVyOjp+VmlkZW9UcmFja1RyYW5zY29kZXIoKSB7CisgICAgaWYgKG1EZWNvZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgQU1lZGlhQ29kZWNfZGVsZXRlKG1EZWNvZGVyKTsKKyAgICB9CisKKyAgICBpZiAobVN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBBTmF0aXZlV2luZG93X3JlbGVhc2UobVN1cmZhY2UpOworICAgIH0KK30KKworLy8gQ3JlYXRlcyBhbmQgY29uZmlndXJlcyB0aGUgY29kZWNzLgorbWVkaWFfc3RhdHVzX3QgVmlkZW9UcmFja1RyYW5zY29kZXI6OmNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiYgZGVzdGluYXRpb25Gb3JtYXQpIHsKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTUVESUFfT0s7CisKKyAgICBpZiAoZGVzdGluYXRpb25Gb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJEZXN0aW5hdGlvbiBmb3JtYXQgaXMgbnVsbCwgdXNlIHBhc3N0aHJvdWdoIHRyYW5zY29kZXIiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdCogZW5jb2RlckZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBpZiAoIWVuY29kZXJGb3JtYXQgfHwgQU1lZGlhRm9ybWF0X2NvcHkoZW5jb2RlckZvcm1hdCwgZGVzdGluYXRpb25Gb3JtYXQuZ2V0KCkpICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY29weSBkZXN0aW5hdGlvbiBmb3JtYXQiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihlbmNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgc3RhdHVzID0gbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRFc3RpbWF0ZWRCaXRyYXRlRm9yVHJhY2sobVRyYWNrSW5kZXgsICZiaXRyYXRlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBlc3RpbWF0ZSBiaXRyYXRlLiBVc2luZyBkZWZhdWx0ICIgPDwga0RlZmF1bHRCaXRyYXRlTWJwczsKKyAgICAgICAgICAgIGJpdHJhdGUgPSBrRGVmYXVsdEJpdHJhdGVNYnBzOworICAgICAgICB9CisKKyAgICAgICAgTE9HKElORk8pIDw8ICJDb25maWd1cmluZyBiaXRyYXRlICIgPDwgYml0cmF0ZTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGVuY29kZXJGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUpOworICAgIH0KKworICAgIFNldERlZmF1bHRGb3JtYXRWYWx1ZUZsb2F0KEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwgZW5jb2RlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdEtleUZyYW1lSW50ZXJ2YWxTZWNvbmRzKTsKKyAgICBTZXREZWZhdWx0Rm9ybWF0VmFsdWVJbnQzMihBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLCBlbmNvZGVyRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0Q29kZWNPcGVyYXRpbmdSYXRlKTsKKyAgICBTZXREZWZhdWx0Rm9ybWF0VmFsdWVJbnQzMihBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZLCBlbmNvZGVyRm9ybWF0LCBrRGVmYXVsdENvZGVjUHJpb3JpdHkpOworCisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGVuY29kZXJGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULCBrQ29sb3JGb3JtYXRTdXJmYWNlKTsKKworICAgIC8vIEFsd2F5cyBlbmNvZGUgd2l0aG91dCByb3RhdGlvbi4gVGhlIHJvdGF0aW9uIGRlZ3JlZSB3aWxsIGJlIHRyYW5zZmVycmVkIGRpcmVjdGx5IHRvCisgICAgLy8gTWVkaWFTYW1wbGVXcml0ZXIgdHJhY2sgZm9ybWF0LCBhbmQgTWVkaWFTYW1wbGVXcml0ZXIgd2lsbCBjYWxsIEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludC4KKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZW5jb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgMCk7CisKKyAgICBtRGVzdGluYXRpb25Gb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PihlbmNvZGVyRm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisKKyAgICAvLyBDcmVhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgZW5jb2Rlci4KKyAgICBjb25zdCBjaGFyKiBkZXN0aW5hdGlvbk1pbWUgPSBudWxscHRyOworICAgIGJvb2wgb2sgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1EZXN0aW5hdGlvbkZvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0aW5hdGlvbk1pbWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGVzdGluYXRpb24gTUlNRSB0eXBlIGlzIHJlcXVpcmVkIGZvciB0cmFuc2NvZGluZy4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIEFNZWRpYUNvZGVjKiBlbmNvZGVyID0gQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZUZvckNsaWVudChkZXN0aW5hdGlvbk1pbWUsIG1QaWQsIG1VaWQpOworICAgIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBlbmNvZGVyIGZvciB0eXBlICIgPDwgZGVzdGluYXRpb25NaW1lOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBtRW5jb2RlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWNXcmFwcGVyPihlbmNvZGVyLCBzaGFyZWRfZnJvbV90aGlzKCkpOworCisgICAgc3RhdHVzID0gQU1lZGlhQ29kZWNfY29uZmlndXJlKG1FbmNvZGVyLT5nZXRDb2RlYygpLCBtRGVzdGluYXRpb25Gb3JtYXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogc3VyZmFjZSAqLywgTlVMTCAvKiBjcnlwdG8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUNPREVDX0NPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSB2aWRlbyBlbmNvZGVyOiAiIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBBTWVkaWFDb2RlY19jcmVhdGVJbnB1dFN1cmZhY2UobUVuY29kZXItPmdldENvZGVjKCksICZtU3VyZmFjZSk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhbiBlbmNvZGVyIGlucHV0IHN1cmZhY2U6ICVkIiA8PCBzdGF0dXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGFuZCBjb25maWd1cmUgdGhlIGRlY29kZXIuCisgICAgY29uc3QgY2hhciogc291cmNlTWltZSA9IG51bGxwdHI7CisgICAgb2sgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1Tb3VyY2VGb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJnNvdXJjZU1pbWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiU291cmNlIE1JTUUgdHlwZSBpcyByZXF1aXJlZCBmb3IgdHJhbnNjb2RpbmcuIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBtRGVjb2RlciA9IEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGVGb3JDbGllbnQoc291cmNlTWltZSwgbVBpZCwgbVVpZCk7CisgICAgaWYgKG1EZWNvZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBkZWNvZGVyIGZvciB0eXBlICIgPDwgc291cmNlTWltZTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBhdXRvIGRlY29kZXJGb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PihBTWVkaWFGb3JtYXRfbmV3KCksICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICBpZiAoIWRlY29kZXJGb3JtYXQgfHwKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NvcHkoZGVjb2RlckZvcm1hdC5nZXQoKSwgbVNvdXJjZUZvcm1hdC5nZXQoKSkgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBjb3B5IHNvdXJjZSBmb3JtYXQiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIC8vIFByZXZlbnQgZGVjb2RlciBmcm9tIG92ZXJ3cml0aW5nIGZyYW1lcyB0aGF0IHRoZSBlbmNvZGVyIGhhcyBub3QgeWV0IGNvbnN1bWVkLgorICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihkZWNvZGVyRm9ybWF0LmdldCgpLCBUQkRfQU1FRElBQ09ERUNfUEFSQU1FVEVSX0tFWV9BTExPV19GUkFNRV9EUk9QLCAwKTsKKworICAgIC8vIENvcHkgb3ZlciBjb25maWd1cmF0aW9ucyB0aGF0IGFwcGx5IHRvIGJvdGggZW5jb2RlciBhbmQgZGVjb2Rlci4KKyAgICBzdGF0aWMgY29uc3QgRW50cnlDb3BpZXIga0VuY29kZXJFbnRyaWVzVG9Db3B5W10gPSB7CisgICAgICAgICAgICBFTlRSWV9DT1BJRVIyKEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEUsIEZsb2F0LCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSwgSW50MzIpLAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGVudHJ5Q291bnQgPSBzaXplb2Yoa0VuY29kZXJFbnRyaWVzVG9Db3B5KSAvIHNpemVvZihrRW5jb2RlckVudHJpZXNUb0NvcHlbMF0pOworICAgIENvcHlGb3JtYXRFbnRyaWVzKG1EZXN0aW5hdGlvbkZvcm1hdC5nZXQoKSwgZGVjb2RlckZvcm1hdC5nZXQoKSwga0VuY29kZXJFbnRyaWVzVG9Db3B5LAorICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Q291bnQpOworCisgICAgc3RhdHVzID0gQU1lZGlhQ29kZWNfY29uZmlndXJlKG1EZWNvZGVyLCBkZWNvZGVyRm9ybWF0LmdldCgpLCBtU3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBjb25maWd1cmUgdmlkZW8gZGVjb2RlcjogIiA8PCBzdGF0dXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gQ29uZmlndXJlIGNvZGVjcyB0byBydW4gaW4gYXN5bmMgbW9kZS4KKyAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBhc3luY0NvZGVjQ2FsbGJhY2tzID0geworICAgICAgICAgICAgLm9uQXN5bmNJbnB1dEF2YWlsYWJsZSA9IEFzeW5jQ29kZWNDYWxsYmFja0Rpc3BhdGNoOjpvbkFzeW5jSW5wdXRBdmFpbGFibGUsCisgICAgICAgICAgICAub25Bc3luY091dHB1dEF2YWlsYWJsZSA9IEFzeW5jQ29kZWNDYWxsYmFja0Rpc3BhdGNoOjpvbkFzeW5jT3V0cHV0QXZhaWxhYmxlLAorICAgICAgICAgICAgLm9uQXN5bmNGb3JtYXRDaGFuZ2VkID0gQXN5bmNDb2RlY0NhbGxiYWNrRGlzcGF0Y2g6Om9uQXN5bmNGb3JtYXRDaGFuZ2VkLAorICAgICAgICAgICAgLm9uQXN5bmNFcnJvciA9IEFzeW5jQ29kZWNDYWxsYmFja0Rpc3BhdGNoOjpvbkFzeW5jRXJyb3J9OworCisgICAgLy8gTm90ZTogVGhlIGRlY29kZXIgZG9lcyBub3QgbmVlZCBpdHMgb3duIHdyYXBwZXIgYmVjYXVzZSBpdHMgbGlmZXRpbWUgaXMgdGllZCB0byB0aGUKKyAgICAvLyB0cmFuc2NvZGVyLiBCdXQgdGhlIHNhbWUgY2FsbGJhY2tzIGFyZSByZXVzZWQgZm9yIGRlY29kZXIgYW5kIGVuY29kZXIgc28gd2UgcGFzcyB0aGUgZW5jb2RlcgorICAgIC8vIHdyYXBwZXIgYXMgdXNlcmRhdGEgaGVyZSBidXQgbmV2ZXIgcmVhZCB0aGUgY29kZWMgZnJvbSBpdCBpbiB0aGUgY2FsbGJhY2suCisgICAgc3RhdHVzID0gQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjayhtRGVjb2RlciwgYXN5bmNDb2RlY0NhbGxiYWNrcywgbUVuY29kZXIuZ2V0KCkpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzZXQgZGVjb2RlciB0byBhc3luYyBtb2RlOiAiIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrKG1FbmNvZGVyLT5nZXRDb2RlYygpLCBhc3luY0NvZGVjQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuY29kZXIuZ2V0KCkpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzZXQgZW5jb2RlciB0byBhc3luYyBtb2RlOiAiIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCit2b2lkIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjplbnF1ZXVlSW5wdXRTYW1wbGUoaW50MzJfdCBidWZmZXJJbmRleCkgeworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNRURJQV9PSzsKKworICAgIGlmIChtRW9zRnJvbVNvdXJjZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRTYW1wbGVJbmZvRm9yVHJhY2sobVRyYWNrSW5kZXgsICZtU2FtcGxlSW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0sgJiYgc3RhdHVzICE9IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yIGdldHRpbmcgbmV4dCBzYW1wbGUgaW5mbzogIiA8PCBzdGF0dXM7CisgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgYm9vbCBlbmRPZlN0cmVhbSA9IChzdGF0dXMgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pOworCisgICAgaWYgKCFlbmRPZlN0cmVhbSkgeworICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgIHVpbnQ4X3QqIHNvdXJjZUJ1ZmZlciA9IEFNZWRpYUNvZGVjX2dldElucHV0QnVmZmVyKG1EZWNvZGVyLCBidWZmZXJJbmRleCwgJmJ1ZmZlclNpemUpOworICAgICAgICBpZiAoc291cmNlQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkRlY29kZXIgcmV0dXJuZWQgYSBOVUxMIGlucHV0IGJ1ZmZlci4iOworICAgICAgICAgICAgbVN0YXR1cyA9IEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlclNpemUgPCBtU2FtcGxlSW5mby5zaXplKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJEZWNvZGVyIHJldHVybmVkIGFuIGlucHV0IGJ1ZmZlciB0aGF0IGlzIHNtYWxsZXIgdGhhbiB0aGUgc2FtcGxlLiI7CisgICAgICAgICAgICBtU3RhdHVzID0gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBtTWVkaWFTYW1wbGVSZWFkZXItPnJlYWRTYW1wbGVEYXRhRm9yVHJhY2sobVRyYWNrSW5kZXgsIHNvdXJjZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLnNpemUpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHJlYWQgbmV4dCBzYW1wbGUgZGF0YS4gQWJvcnRpbmcgdHJhbnNjb2RlLiI7CisgICAgICAgICAgICBtU3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiRU9TIGZyb20gc291cmNlLiI7CisgICAgICAgIG1Fb3NGcm9tU291cmNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKG1EZWNvZGVyLCBidWZmZXJJbmRleCwgMCwgbVNhbXBsZUluZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLnByZXNlbnRhdGlvblRpbWVVcywgbVNhbXBsZUluZm8uZmxhZ3MpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBxdWV1ZSBpbnB1dCBidWZmZXIgZm9yIGRlY29kZTogIiA8PCBzdGF0dXM7CisgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9UcmFja1RyYW5zY29kZXI6OnRyYW5zZmVyQnVmZmVyKGludDMyX3QgYnVmZmVySW5kZXgsIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvKSB7CisgICAgaWYgKGJ1ZmZlckluZGV4ID49IDApIHsKKyAgICAgICAgYm9vbCBuZWVkc1JlbmRlciA9IGJ1ZmZlckluZm8uc2l6ZSA+IDA7CisgICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIobURlY29kZXIsIGJ1ZmZlckluZGV4LCBuZWVkc1JlbmRlcik7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlckluZm8uZmxhZ3MgJiBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkVPUyBmcm9tIGRlY29kZXIuIjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhQ29kZWNfc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShtRW5jb2Rlci0+Z2V0Q29kZWMoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTaWduYWxFT1Mgb24gZW5jb2RlciByZXR1cm5lZCBlcnJvcjogIiA8PCBzdGF0dXM7CisgICAgICAgICAgICBtU3RhdHVzID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpkZXF1ZXVlT3V0cHV0U2FtcGxlKGludDMyX3QgYnVmZmVySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvKSB7CisgICAgaWYgKGJ1ZmZlckluZGV4ID49IDApIHsKKyAgICAgICAgc2l6ZV90IHNhbXBsZVNpemUgPSAwOworICAgICAgICB1aW50OF90KiBidWZmZXIgPQorICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihtRW5jb2Rlci0+Z2V0Q29kZWMoKSwgYnVmZmVySW5kZXgsICZzYW1wbGVTaXplKTsKKworICAgICAgICBNZWRpYVNhbXBsZTo6T25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIGJ1ZmZlclJlbGVhc2VDYWxsYmFjayA9CisgICAgICAgICAgICAgICAgW2VuY29kZXIgPSBtRW5jb2Rlcl0oTWVkaWFTYW1wbGUqIHNhbXBsZSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKGVuY29kZXItPmdldENvZGVjKCksIHNhbXBsZS0+YnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogcmVuZGVyICovKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlID0gTWVkaWFTYW1wbGU6OmNyZWF0ZVdpdGhSZWxlYXNlQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJJbmZvLm9mZnNldCwgYnVmZmVySW5kZXgsIGJ1ZmZlclJlbGVhc2VDYWxsYmFjayk7CisgICAgICAgIHNhbXBsZS0+aW5mby5zaXplID0gYnVmZmVySW5mby5zaXplOworICAgICAgICBzYW1wbGUtPmluZm8uZmxhZ3MgPSBidWZmZXJJbmZvLmZsYWdzOworICAgICAgICBzYW1wbGUtPmluZm8ucHJlc2VudGF0aW9uVGltZVVzID0gYnVmZmVySW5mby5wcmVzZW50YXRpb25UaW1lVXM7CisKKyAgICAgICAgb25PdXRwdXRTYW1wbGVBdmFpbGFibGUoc2FtcGxlKTsKKworICAgICAgICBtTGFzdFNhbXBsZVdhc1N5bmMgPSBzYW1wbGUtPmluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19TWU5DX1NBTVBMRTsKKyAgICB9IGVsc2UgaWYgKGJ1ZmZlckluZGV4ID09IEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdCogbmV3Rm9ybWF0ID0gQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KG1FbmNvZGVyLT5nZXRDb2RlYygpKTsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiRW5jb2RlciBvdXRwdXQgZm9ybWF0IGNoYW5nZWQ6ICIgPDwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKG5ld0Zvcm1hdCk7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlckluZm8uZmxhZ3MgJiBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkVPUyBmcm9tIGVuY29kZXIuIjsKKyAgICAgICAgbUVvc0Zyb21FbmNvZGVyID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9UcmFja1RyYW5zY29kZXI6OnVwZGF0ZVRyYWNrRm9ybWF0KEFNZWRpYUZvcm1hdCogb3V0cHV0Rm9ybWF0KSB7CisgICAgaWYgKG1BY3R1YWxPdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBMT0coV0FSTklORykgPDwgIklnbm9yaW5nIGR1cGxpY2F0ZSBmb3JtYXQgY2hhbmdlLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTWVkaWFGb3JtYXQqIGZvcm1hdENvcHkgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgaWYgKCFmb3JtYXRDb3B5IHx8IEFNZWRpYUZvcm1hdF9jb3B5KGZvcm1hdENvcHksIG91dHB1dEZvcm1hdCkgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBjb3B5IG91dHB1dEZvcm1hdCI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0Q29weSk7CisgICAgICAgIG1TdGF0dXMgPSBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgYWN0dWFsIHRyYWNrIGZvcm1hdCBmb3IgbXV4ZXIgYmFzZWQgb24gdGhlIGVuY29kZXIgb3V0cHV0IGZvcm1hdCwKKyAgICAvLyBzaW5jZSBtYW55IHZpdGFsIGluZm9ybWF0aW9uIGNvbWVzIGluIHRoZSBlbmNvZGVyIGZvcm1hdCAoZWcuIENTRCkuCisgICAgLy8gVHJhbnNmZXIgbmVjZXNzYXJ5IGZpZWxkcyBmcm9tIHRoZSB1c2VyLWNvbmZpZ3VyZWQgdHJhY2sgZm9ybWF0IChkZXJpdmVkIGZyb20KKyAgICAvLyBzb3VyY2UgdHJhY2sgZm9ybWF0IGFuZCB1c2VyIHRyYW5zY29kaW5nIHJlcXVlc3QpIHdoZXJlIG5lZWRlZC4KKworICAgIC8vIFRyYW5zZmVyIFNBUiBzZXR0aW5nczoKKyAgICAvLyBJZiBtRGVzdGluYXRpb25Gb3JtYXQgaGFzIFNBUiBzZXQsIGl0IG1lYW5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgaGFzIFNBUiBzcGVjaWZpZWQKKyAgICAvLyBhdCBjb250YWluZXIgbGV2ZWwuIFRoaXMgaXMgc3VwcG9zZWQgdG8gb3ZlcnJpZGUgYW55IFNBUiBzZXR0aW5ncyBpbiB0aGUgYml0c3RyZWFtLAorICAgIC8vIHRodXMgc2hvdWxkIGFsd2F5cyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgY29udGFpbmVyIG9mIHRoZSB0cmFuc2NvZGVkIGZpbGUuCisgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIobVNvdXJjZUZvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEgsICZzYXJXaWR0aCkgJiYKKyAgICAgICAgKHNhcldpZHRoID4gMCkgJiYKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Tb3VyY2VGb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCwgJnNhckhlaWdodCkgJiYKKyAgICAgICAgKHNhckhlaWdodCA+IDApKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXRDb3B5LCBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCwgc2FyV2lkdGgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0Q29weSwgQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hULCBzYXJIZWlnaHQpOworICAgIH0KKyAgICAvLyBUcmFuc2ZlciBEQVIgc2V0dGluZ3MuCisgICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtU291cmNlRm9ybWF0LmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsICZkaXNwbGF5V2lkdGgpICYmCisgICAgICAgIChkaXNwbGF5V2lkdGggPiAwKSAmJgorICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobVNvdXJjZUZvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5SGVpZ2h0KSAmJgorICAgICAgICAoZGlzcGxheUhlaWdodCA+IDApKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXRDb3B5LCBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsIGRpc3BsYXlXaWR0aCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXRDb3B5LCBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9CisKKyAgICAvLyBUcmFuc2ZlciByb3RhdGlvbiBzZXR0aW5ncy4KKyAgICAvLyBOb3RlIHRoYXQgbXV4ZXIgaXRzZWxmIGRvZXNuJ3QgdGFrZSByb3RhdGlvbiBmcm9tIHRoZSB0cmFjayBmb3JtYXQuIEl0IHJlcXVpcmVzCisgICAgLy8gQU1lZGlhTXV4ZXJfc2V0T3JpZW50YXRpb25IaW50IHRvIHNldCB0aGUgcm90YXRpb24uIEhlcmUgd2UgcGFzcyB0aGUgcm90YXRpb24gdG8KKyAgICAvLyBNZWRpYVNhbXBsZVdyaXRlciB1c2luZyB0aGUgdHJhY2sgZm9ybWF0LiBNZWRpYVNhbXBsZVdyaXRlciB3aWxsIHRoZW4gY2FsbAorICAgIC8vIEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludCBhcyBuZWVkZWQuCisgICAgaW50MzJfdCByb3RhdGlvbjsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1Tb3VyY2VGb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04sICZyb3RhdGlvbikgJiYKKyAgICAgICAgKHJvdGF0aW9uICE9IDApKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXRDb3B5LCBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLCByb3RhdGlvbik7CisgICAgfQorCisgICAgLy8gVHJhbnNmZXIgdHJhY2sgZHVyYXRpb24uCisgICAgLy8gUHJlc2VydmUgdGhlIHNvdXJjZSB0cmFjayBkdXJhdGlvbiBieSBzZW5kaW5nIGl0IHRvIE1lZGlhU2FtcGxlV3JpdGVyLgorICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KG1Tb3VyY2VGb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvblVzKSAmJgorICAgICAgICBkdXJhdGlvblVzID4gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoZm9ybWF0Q29weSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgLy8gVE9ETzogdHJhbnNmZXIgb3RoZXIgZmllbGRzIGFzIHJlcXVpcmVkLgorCisgICAgbUFjdHVhbE91dHB1dEZvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KGZvcm1hdENvcHksICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKworICAgIG5vdGlmeVRyYWNrRm9ybWF0QXZhaWxhYmxlKCk7Cit9CisKK21lZGlhX3N0YXR1c190IFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpydW5UcmFuc2NvZGVMb29wKGJvb2wqIHN0b3BwZWQpIHsKKyAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoMCAvKiB0aWQgKDAgPSBjdXJyZW50KSAqLywgQU5EUk9JRF9QUklPUklUWV9WSURFTyk7CisKKyAgICAvLyBQdXNoIHN0YXJ0IGRlY29kZXIgYW5kIGVuY29kZXIgYXMgdHdvIG1lc3NhZ2VzLCBzbyB0aGF0IHRoZXNlIGFyZSBzdWJqZWN0IHRvIHRoZQorICAgIC8vIHN0b3AgcmVxdWVzdCBhcyB3ZWxsLiBJZiB0aGUgc2Vzc2lvbiBpcyBjYW5jZWxsZWQgKG9yIHBhdXNlZCkgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQsCisgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byB3YXN0ZSB0aW1lIHN0YXJ0IHRoZW4gc3RvcCB0aGUgY29kZWNzLgorICAgIG1Db2RlY01lc3NhZ2VRdWV1ZS5wdXNoKFt0aGlzXSB7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUNvZGVjX3N0YXJ0KG1EZWNvZGVyKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzdGFydCB2aWRlbyBkZWNvZGVyOiAiIDw8IHN0YXR1czsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIG1Db2RlY01lc3NhZ2VRdWV1ZS5wdXNoKFt0aGlzXSB7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUNvZGVjX3N0YXJ0KG1FbmNvZGVyLT5nZXRDb2RlYygpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzdGFydCB2aWRlbyBlbmNvZGVyOiAiIDw8IHN0YXR1czsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgbUVuY29kZXItPnNldFN0YXJ0ZWQoKTsKKyAgICB9KTsKKworICAgIC8vIFByb2Nlc3MgY29kZWMgZXZlbnRzIHVudGlsIEVPUyBpcyByZWFjaGVkLCB0cmFuc2NvZGluZyBpcyBzdG9wcGVkIG9yIGFuIGVycm9yIG9jY3Vycy4KKyAgICB3aGlsZSAobVN0b3BSZXF1ZXN0ICE9IFNUT1BfTk9XICYmICFtRW9zRnJvbUVuY29kZXIgJiYgbVN0YXR1cyA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IG1lc3NhZ2UgPSBtQ29kZWNNZXNzYWdlUXVldWUucG9wKCk7CisgICAgICAgIG1lc3NhZ2UoKTsKKworICAgICAgICBpZiAobVN0b3BSZXF1ZXN0ID09IFNUT1BfT05fU1lOQyAmJiBtTGFzdFNhbXBsZVdhc1N5bmMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgbUNvZGVjTWVzc2FnZVF1ZXVlLmFib3J0KCk7CisgICAgQU1lZGlhQ29kZWNfc3RvcChtRGVjb2Rlcik7CisKKyAgICAvLyBTaWduYWwgaWYgdHJhbnNjb2Rpbmcgd2FzIHN0b3BwZWQgYmVmb3JlIGl0IGZpbmlzaGVkLgorICAgIGlmIChtU3RvcFJlcXVlc3QgIT0gTk9ORSAmJiAhbUVvc0Zyb21FbmNvZGVyICYmIG1TdGF0dXMgPT0gQU1FRElBX09LKSB7CisgICAgICAgICpzdG9wcGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gbVN0YXR1czsKK30KKwordm9pZCBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6YWJvcnRUcmFuc2NvZGVMb29wKCkgeworICAgIGlmIChtU3RvcFJlcXVlc3QgPT0gU1RPUF9OT1cpIHsKKyAgICAgICAgLy8gV2FrZSB1cCB0cmFuc2NvZGVyIHRocmVhZC4KKyAgICAgICAgbUNvZGVjTWVzc2FnZVF1ZXVlLnB1c2goW10ge30sIHRydWUgLyogZnJvbnQgKi8pOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gVmlkZW9UcmFja1RyYW5zY29kZXI6OmdldE91dHB1dEZvcm1hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFjdHVhbE91dHB1dEZvcm1hdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM0NzAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjMgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYmVuY2htYXJrZGVmYXVsdHMiLAorICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhdHJhbnNjb2RlciIsICJsaWJtZWRpYW5kayIsICJsaWJiYXNlIiwgImxpYmJpbmRlcl9uZGsiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJnb29nbGUtYmVuY2htYXJrIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNZWRpYVRyYW5zY29kZXJCZW5jaG1hcmsiLAorICAgIHNyY3M6IFsiTWVkaWFUcmFuc2NvZGVyQmVuY2htYXJrLmNwcCJdLAorICAgIGRlZmF1bHRzOiBbImJlbmNobWFya2RlZmF1bHRzIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNZWRpYVNhbXBsZVJlYWRlckJlbmNobWFyayIsCisgICAgc3JjczogWyJNZWRpYVNhbXBsZVJlYWRlckJlbmNobWFyay5jcHAiXSwKKyAgICBkZWZhdWx0czogWyJiZW5jaG1hcmtkZWZhdWx0cyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFUcmFja1RyYW5zY29kZXJCZW5jaG1hcmsiLAorICAgIHNyY3M6IFsiTWVkaWFUcmFja1RyYW5zY29kZXJCZW5jaG1hcmsuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsiYmVuY2htYXJrZGVmYXVsdHMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvTWVkaWFTYW1wbGVSZWFkZXJCZW5jaG1hcmsuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9NZWRpYVNhbXBsZVJlYWRlckJlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiOTMwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvTWVkaWFTYW1wbGVSZWFkZXJCZW5jaG1hcmsuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBNZWRpYVNhbXBsZVJlYWRlciBiZW5jaG1hcmsgdGVzdHMuCisgKgorICogSG93IHRvIHJ1biB0aGUgYmVuY2htYXJrOgorICoKKyAqIDEuIERvd25sb2FkIHRoZSBtZWRpYSBhc3NldHMgZnJvbSBodHRwOi8vZ28vdHJhbnNjb2RpbmdiZW5jaG1hcmsgYW5kIHB1c2ggdGhlIGRpcmVjdG9yeQorICogICAgKCJUcmFuc2NvZGluZ0JlbmNobWFyayIpIHRvIC9kYXRhL2xvY2FsL3RtcC4KKyAqCisgKiAyLiBDb21waWxlIHRoZSBiZW5jaG1hcmsgYW5kIHN5bmMgdG8gZGV2aWNlOgorICogICAgICAkIG1tIC1qNzIgJiYgYWRiIHN5bmMKKyAqCisgKiAzLiBSdW46CisgKiAgICAgICQgYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9NZWRpYVNhbXBsZVJlYWRlckJlbmNobWFyay9NZWRpYVNhbXBsZVJlYWRlckJlbmNobWFyaworICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTYW1wbGVSZWFkZXJCZW5jaG1hcmsiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUmVhZGVyTkRLLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx0aHJlYWQ+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgdm9pZCBSZWFkTWVkaWFTYW1wbGVzKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3JjRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZEF1ZGlvLCBib29sIHNlcXVlbnRpYWxBY2Nlc3MgPSBmYWxzZSkgeworICAgIC8vIEFzc2V0IGRpcmVjdG9yeS4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0Fzc2V0RGlyZWN0b3J5ID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ0JlbmNobWFyay8iOworCisgICAgaW50IHNyY0ZkID0gMDsKKyAgICBzdGQ6OnN0cmluZyBzcmNQYXRoID0ga0Fzc2V0RGlyZWN0b3J5ICsgc3JjRmlsZU5hbWU7CisKKyAgICBpZiAoKHNyY0ZkID0gb3BlbihzcmNQYXRoLmNfc3RyKCksIE9fUkRPTkxZKSkgPCAwKSB7CisgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBvcGVuIHNvdXJjZSBmaWxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgZmlsZVNpemUgPSBsc2VlayhzcmNGZCwgMCwgU0VFS19FTkQpOworICAgIGxzZWVrKHNyY0ZkLCAwLCBTRUVLX1NFVCk7CisKKyAgICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgICAgIGF1dG8gc2FtcGxlUmVhZGVyID0gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChzcmNGZCwgMCwgZmlsZVNpemUpOworICAgICAgICBpZiAoc2FtcGxlUmVhZGVyLT5zZXRFbmZvcmNlU2VxdWVudGlhbEFjY2VzcyhzZXF1ZW50aWFsQWNjZXNzKSAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoInNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2VsZWN0IHRyYWNrcy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB0cmFja0luZGljZXM7CisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgc2FtcGxlUmVhZGVyLT5nZXRUcmFja0NvdW50KCk7ICsrdHJhY2tJbmRleCkgeworICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogdHJhY2tGb3JtYXQgPSBzYW1wbGVSZWFkZXItPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZUNvdW50OworICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQsICZmcmFtZUNvdW50KSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jb3VudGVyc1siVmlkZW9GcmFtZVJhdGUiXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVuY2htYXJrOjpDb3VudGVyKGZyYW1lQ291bnQsIGJlbmNobWFyazo6Q291bnRlcjo6a0lzUmF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghcmVhZEF1ZGlvICYmIHN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhY2tJbmRpY2VzLnB1c2hfYmFjayh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIHNhbXBsZVJlYWRlci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB0aHJlYWRzLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnRocmVhZD4gdHJhY2tUaHJlYWRzOworICAgICAgICBmb3IgKGF1dG8gdHJhY2tJbmRleCA6IHRyYWNrSW5kaWNlcykgeworICAgICAgICAgICAgdHJhY2tUaHJlYWRzLmVtcGxhY2VfYmFjayhbdHJhY2tJbmRleCwgc2FtcGxlUmVhZGVyLCAmc3RhdGVdIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlRyYWNrICIgPDwgdHJhY2tJbmRleCA8PCAiIHN0YXJ0ZWQiOworICAgICAgICAgICAgICAgIE1lZGlhU2FtcGxlSW5mbyBpbmZvOworCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAwOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IHNhbXBsZVJlYWRlci0+Z2V0U2FtcGxlSW5mb0ZvclRyYWNrKHRyYWNrSW5kZXgsICZpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5zaXplID4gYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IGluZm8uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNldChuZXcgdWludDhfdFtidWZmZXJTaXplXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzYW1wbGVSZWFkZXItPnJlYWRTYW1wbGVEYXRhRm9yVHJhY2sodHJhY2tJbmRleCwgYnVmZmVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJFcnJvciByZWFkaW5nIHNhbXBsZSBkYXRhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVHJhY2sgIiA8PCB0cmFja0luZGV4IDw8ICIgZmluaXNoZWQiOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBKb2luIHRocmVhZHMuCisgICAgICAgIGZvciAoYXV0byYgdGhyZWFkIDogdHJhY2tUaHJlYWRzKSB7CisgICAgICAgICAgICB0aHJlYWQuam9pbigpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xvc2Uoc3JjRmQpOworfQorCisvLyBCZW5jaG1hcmsgcmVnaXN0cmF0aW9uIHdyYXBwZXIgZm9yIHRyYW5zY29kaW5nLgorI2RlZmluZSBUUkFOU0NPREVSX0JFTkNITUFSSyhmdW5jKSBcCisgICAgQkVOQ0hNQVJLKGZ1bmMpLT5Vc2VSZWFsVGltZSgpLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKS0+VW5pdChiZW5jaG1hcms6OmtNaWxsaXNlY29uZCkKKworc3RhdGljIHZvaWQgQk1fTWVkaWFTYW1wbGVSZWFkZXJfQXVkaW9WaWRlb19QYXJhbGxlbChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFJlYWRNZWRpYVNhbXBsZXMoc3RhdGUsICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX2FhYy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZWFkQXVkaW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV9NZWRpYVNhbXBsZVJlYWRlcl9BdWRpb1ZpZGVvX1NlcXVlbnRpYWwoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBSZWFkTWVkaWFTYW1wbGVzKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogcmVhZEF1ZGlvICovLCB0cnVlIC8qIHNlcXVlbnRpYWxBY2Nlc3MgKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV9NZWRpYVNhbXBsZVJlYWRlcl9WaWRlbyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFJlYWRNZWRpYVNhbXBsZXMoc3RhdGUsICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX2FhYy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogcmVhZEF1ZGlvICovKTsKK30KKworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fTWVkaWFTYW1wbGVSZWFkZXJfQXVkaW9WaWRlb19QYXJhbGxlbCk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV9NZWRpYVNhbXBsZVJlYWRlcl9BdWRpb1ZpZGVvX1NlcXVlbnRpYWwpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fTWVkaWFTYW1wbGVSZWFkZXJfVmlkZW8pOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9NZWRpYVRyYWNrVHJhbnNjb2RlckJlbmNobWFyay5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvYmVuY2htYXJrL01lZGlhVHJhY2tUcmFuc2NvZGVyQmVuY2htYXJrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTFkODBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9NZWRpYVRyYWNrVHJhbnNjb2RlckJlbmNobWFyay5jcHAKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIE5hdGl2ZSBtZWRpYSB0cmFjayB0cmFuc2NvZGVyIGJlbmNobWFyayB0ZXN0cy4KKyAqCisgKiBIb3cgdG8gcnVuIHRoZSBiZW5jaG1hcms6CisgKgorICogMS4gRG93bmxvYWQgdGhlIG1lZGlhIGFzc2V0cyBmcm9tIGh0dHA6Ly9nby90cmFuc2NvZGluZ2JlbmNobWFyayBhbmQgcHVzaCB0aGUgZGlyZWN0b3J5CisgKiAgICAoIlRyYW5zY29kaW5nQmVuY2htYXJrIikgdG8gL2RhdGEvbG9jYWwvdG1wLgorICoKKyAqIDIuIENvbXBpbGUgdGhlIGJlbmNobWFyayBhbmQgc3luYyB0byBkZXZpY2U6CisgKiAgICAgICQgbW0gLWo3MiAmJiBhZGIgc3luYworICoKKyAqIDMuIFJ1bjoKKyAqICAgICAgJCBhZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L01lZGlhVHJhY2tUcmFuc2NvZGVyQmVuY2htYXJrL01lZGlhVHJhY2tUcmFuc2NvZGVyQmVuY2htYXJrCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFUcmFja1RyYW5zY29kZXJCZW5jaG1hcmsiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxiZW5jaG1hcmsvYmVuY2htYXJrLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUmVhZGVyTkRLLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrQ29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9WaWRlb1RyYWNrVHJhbnNjb2Rlci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBrVmlkZW8sCisgICAga0F1ZGlvLAorfSBNZWRpYVR5cGU7CisKK2NsYXNzIFRyYWNrVHJhbnNjb2RlckNhbGxiYWNrcyA6IHB1YmxpYyBNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmFja0Zvcm1hdEF2YWlsYWJsZShjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCkgb3ZlcnJpZGUge30KKworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrRmluaXNoZWQoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrU3RvcHBlZChjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tFcnJvcihjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdm9pZCB3YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlICghbUZpbmlzaGVkKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBtU3RhdHVzID0gQU1FRElBX09LOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgYm9vbCBtRmluaXNoZWQgPSBmYWxzZTsKK307CisKKy8qKgorICogTW9ja1NhbXBsZVJlYWRlciBob2xkcyBhIHJpbmdidWZmZXIgb2YgdGhlIGZpcnN0IHNhbXBsZXMgaW4gdGhlIHByb3ZpZGVkIHNvdXJjZSB0cmFjay4gU2FtcGxlcworICogYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgZnJvbSB0aGUgcmluZ2J1ZmZlciBpbiBhIHJvdW5kLXJvYmluIGZhc2hpb24gd2l0aCBpbmNyZWFzaW5nCisgKiB0aW1lc3RhbXBzLiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYmVmb3JlIEVPUyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBzb3VyY2UKKyAqIHRyYWNrLgorICovCitjbGFzcyBNb2NrU2FtcGxlUmVhZGVyIDogcHVibGljIE1lZGlhU2FtcGxlUmVhZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBjcmVhdGVGcm9tRmQoaW50IGZkLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBBTWVkaWFFeHRyYWN0b3IqIGV4dHJhY3RvciA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChleHRyYWN0b3IsIGZkLCBvZmZzZXQsIHNpemUpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgYXV0byBzYW1wbGVSZWFkZXIgPSBzdGQ6OnNoYXJlZF9wdHI8TW9ja1NhbXBsZVJlYWRlcj4obmV3IE1vY2tTYW1wbGVSZWFkZXIoZXh0cmFjdG9yKSk7CisgICAgICAgIHJldHVybiBzYW1wbGVSZWFkZXI7CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0KiBnZXRGaWxlRm9ybWF0KCkgb3ZlcnJpZGUgeyByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldEZpbGVGb3JtYXQobUV4dHJhY3Rvcik7IH0KKworICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQobUV4dHJhY3Rvcik7IH0KKworICAgIEFNZWRpYUZvcm1hdCogZ2V0VHJhY2tGb3JtYXQoaW50IHRyYWNrSW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChtRXh0cmFjdG9yLCB0cmFja0luZGV4KTsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzZWxlY3RUcmFjayhpbnQgdHJhY2tJbmRleCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPj0gMCkgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSB0cmFja0luZGV4OworCisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhtRXh0cmFjdG9yLCB0cmFja0luZGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHJldHVybiBzdGF0dXM7CisKKyAgICAgICAgLy8gR2V0IHRoZSBzYW1wbGUgY291bnQuCisgICAgICAgIEFNZWRpYUZvcm1hdCogZm9ybWF0ID0gZ2V0VHJhY2tGb3JtYXQodHJhY2tJbmRleCk7CisgICAgICAgIGNvbnN0IGJvb2wgaGF2ZVNhbXBsZUNvdW50ID0KKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5ULCAmbVNhbXBsZUNvdW50KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOworCisgICAgICAgIGlmICghaGF2ZVNhbXBsZUNvdW50KSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBzYW1wbGUgY291bnQgaW4gdHJhY2sgZm9ybWF0LiI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgLy8gQnVmZmVyIHNhbXBsZXMuCisgICAgICAgIGNvbnN0IGludDMyX3QgdGFyZ2V0QnVmZmVyQ291bnQgPSA2MDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYnVmZmVyOworICAgICAgICBNZWRpYVNhbXBsZUluZm8gaW5mbzsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGluZm8ucHJlc2VudGF0aW9uVGltZVVzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUobUV4dHJhY3Rvcik7CisgICAgICAgICAgICBpbmZvLmZsYWdzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKG1FeHRyYWN0b3IpOworICAgICAgICAgICAgaW5mby5zaXplID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUobUV4dHJhY3Rvcik7CisKKyAgICAgICAgICAgIC8vIEZpbmlzaCBidWZmZXJpbmcgYWZ0ZXIgZWl0aGVyIHJlYWRpbmcgYWxsIHRoZSBzYW1wbGVzIGluIHRoZSB0cmFjayBvciBhZnRlcgorICAgICAgICAgICAgLy8gY29tcGxldGluZyB0aGUgR09QIHNhdGlzZnlpbmcgdGhlIHRhcmdldCBjb3VudC4KKyAgICAgICAgICAgIGlmIChtU2FtcGxlcy5zaXplKCkgPT0gbVNhbXBsZUNvdW50IHx8CisgICAgICAgICAgICAgICAgKG1TYW1wbGVzLnNpemUoKSA+PSB0YXJnZXRCdWZmZXJDb3VudCAmJiBpbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfU1lOQ19TQU1QTEUpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci5yZXNldChuZXcgdWludDhfdFtpbmZvLnNpemVdKTsKKworICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEobUV4dHJhY3RvciwgYnVmZmVyLmdldCgpLCBpbmZvLnNpemUpOworICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSBpbmZvLnNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TYW1wbGVzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoYnVmZmVyKSwgaW5mbyk7CisKKyAgICAgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgbUZpcnN0UHRzVXMgPSBtU2FtcGxlc1swXS5zZWNvbmQucHJlc2VudGF0aW9uVGltZVVzOworICAgICAgICBtUHRzRGlmZiA9IG1TYW1wbGVzWzFdLnNlY29uZC5wcmVzZW50YXRpb25UaW1lVXMgLSBtU2FtcGxlc1swXS5zZWNvbmQucHJlc2VudGF0aW9uVGltZVVzOworCisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3Qgc2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MoYm9vbCBlbmZvcmNlIF9fdW51c2VkKSBvdmVycmlkZSB7IHJldHVybiBBTUVESUFfT0s7IH0KKworICAgIG1lZGlhX3N0YXR1c190IGdldEVzdGltYXRlZEJpdHJhdGVGb3JUcmFjayhpbnQgdHJhY2tJbmRleCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYml0cmF0ZSBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IGdldFNhbXBsZUluZm9Gb3JUcmFjayhpbnQgdHJhY2tJbmRleCwgTWVkaWFTYW1wbGVJbmZvKiBpbmZvKSBvdmVycmlkZSB7CisgICAgICAgIGlmICh0cmFja0luZGV4ICE9IG1TZWxlY3RlZFRyYWNrKSByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworCisgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1TYW1wbGVDb3VudCkgeworICAgICAgICAgICAgaW5mby0+cHJlc2VudGF0aW9uVGltZVVzID0gMDsKKyAgICAgICAgICAgIGluZm8tPnNpemUgPSAwOworICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBTQU1QTEVfRkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKKyAgICAgICAgKmluZm8gPSBtU2FtcGxlc1ttQ3VycmVudFNhbXBsZUluZGV4ICUgbVNhbXBsZXMuc2l6ZSgpXS5zZWNvbmQ7CisgICAgICAgIGluZm8tPnByZXNlbnRhdGlvblRpbWVVcyA9IG1GaXJzdFB0c1VzICsgbUN1cnJlbnRTYW1wbGVJbmRleCAqIG1QdHNEaWZmOworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHJlYWRTYW1wbGVEYXRhRm9yVHJhY2soaW50IHRyYWNrSW5kZXgsIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplKSBvdmVycmlkZSB7CisgICAgICAgIGlmICh0cmFja0luZGV4ICE9IG1TZWxlY3RlZFRyYWNrKSByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworCisgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1TYW1wbGVDb3VudCkgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworCisgICAgICAgIGF1dG8mIHAgPSBtU2FtcGxlc1ttQ3VycmVudFNhbXBsZUluZGV4ICUgbVNhbXBsZXMuc2l6ZSgpXTsKKworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8IHAuc2Vjb25kLnNpemUpIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIG1lbWNweShidWZmZXIsIHAuZmlyc3QuZ2V0KCksIHAuc2Vjb25kLnNpemUpOworCisgICAgICAgIGFkdmFuY2VUcmFjayh0cmFja0luZGV4KTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisKKyAgICB2b2lkIGFkdmFuY2VUcmFjayhpbnQgdHJhY2tJbmRleCkgeworICAgICAgICBpZiAodHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRUcmFjaykgcmV0dXJuOworICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisgICAgfQorCisgICAgdmlydHVhbCB+TW9ja1NhbXBsZVJlYWRlcigpIG92ZXJyaWRlIHsgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShtRXh0cmFjdG9yKTsgfQorCitwcml2YXRlOgorICAgIE1vY2tTYW1wbGVSZWFkZXIoQU1lZGlhRXh0cmFjdG9yKiBleHRyYWN0b3IpIDogbUV4dHJhY3RvcihleHRyYWN0b3IpIHt9CisgICAgQU1lZGlhRXh0cmFjdG9yKiBtRXh0cmFjdG9yID0gbnVsbHB0cjsKKyAgICBpbnQzMl90IG1TYW1wbGVDb3VudCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+LCBNZWRpYVNhbXBsZUluZm8+PiBtU2FtcGxlczsKKyAgICBpbnQgbVNlbGVjdGVkVHJhY2sgPSAtMTsKKyAgICBpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgIGludDY0X3QgbUZpcnN0UHRzVXMgPSAwOworICAgIGludDY0X3QgbVB0c0RpZmYgPSAwOworfTsKKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IEdldERlZmF1bHRUcmFja0Zvcm1hdChNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHNvdXJjZUZvcm1hdCkgeworICAgIC8vIERlZmF1bHQgdmlkZW8gY29uZmlnLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrVmlkZW9CaXRSYXRlID0gMjAgKiAxMDAwICogMTAwMDsgIC8vIDIwIG1icHMKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtWaWRlb0ZyYW1lUmF0ZSA9IDMwLjBmOyAgICAgICAgICAgICAvLyAzMCBmcHMKKworICAgIEFNZWRpYUZvcm1hdCogZm9ybWF0ID0gbnVsbHB0cjsKKworICAgIGlmIChtZWRpYVR5cGUgPT0ga1ZpZGVvKSB7CisgICAgICAgIGZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NvcHkoZm9ybWF0LCBzb3VyY2VGb3JtYXQpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwga1ZpZGVvQml0UmF0ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwga1ZpZGVvRnJhbWVSYXRlKTsKKyAgICB9CisgICAgLy8gbm90aGluZyBmb3IgYXVkaW8uCisKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4oZm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7Cit9CisKKy8qKiBHZXRzIGEgTWVkaWFTYW1wbGVSZWFkZXIgZm9yIHRoZSBzb3VyY2UgZmlsZSAqLworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gR2V0U2FtcGxlUmVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmNGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1vY2spIHsKKyAgICAvLyBBc3NldCBkaXJlY3RvcnkKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0Fzc2V0RGlyZWN0b3J5ID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ0JlbmNobWFyay8iOworCisgICAgaW50IHNyY0ZkID0gMDsKKyAgICBzdGQ6OnN0cmluZyBzcmNQYXRoID0ga0Fzc2V0RGlyZWN0b3J5ICsgc3JjRmlsZU5hbWU7CisKKyAgICBpZiAoKHNyY0ZkID0gb3BlbihzcmNQYXRoLmNfc3RyKCksIE9fUkRPTkxZKSkgPCAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBmaWxlU2l6ZSA9IGxzZWVrKHNyY0ZkLCAwLCBTRUVLX0VORCk7CisgICAgbHNlZWsoc3JjRmQsIDAsIFNFRUtfU0VUKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gc2FtcGxlUmVhZGVyOworCisgICAgaWYgKG1vY2spIHsKKyAgICAgICAgc2FtcGxlUmVhZGVyID0gTW9ja1NhbXBsZVJlYWRlcjo6Y3JlYXRlRnJvbUZkKHNyY0ZkLCAwIC8qIG9mZnNldCAqLywgZmlsZVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsZVJlYWRlciA9IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpjcmVhdGVGcm9tRmQoc3JjRmQsIDAgLyogb2Zmc2V0ICovLCBmaWxlU2l6ZSk7CisgICAgfQorCisgICAgaWYgKHNyY0ZkID4gMCkgY2xvc2Uoc3JjRmQpOworICAgIHJldHVybiBzYW1wbGVSZWFkZXI7Cit9CisKKy8qKgorICogQ29uZmlndXJlcyBhIE1lZGlhVHJhY2tUcmFuc2NvZGVyIHdpdGggYW4gZW1wdHkgc2FtcGxlIGNvbnN1bWVyIHNvIHRoYXQgdGhlIHNhbXBsZXMgYXJlIHJldHVybmVkCisgKiB0byB0aGUgdHJhbnNjb2RlciBpbW1lZGlhdGVseS4KKyAqLworc3RhdGljIHZvaWQgQ29uZmlndXJlRW1wdHlTYW1wbGVDb25zdW1lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFUcmFja1RyYW5zY29kZXI+JiB0cmFuc2NvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxlQ291bnQpIHsKKyAgICB0cmFuc2NvZGVyLT5zZXRTYW1wbGVDb25zdW1lcihbJnNhbXBsZUNvdW50XShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+JiBzYW1wbGUpIHsKKyAgICAgICAgaWYgKCEoc2FtcGxlLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfQ09ERUNfQ09ORklHKSAmJiBzYW1wbGUtPmluZm8uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICsrc2FtcGxlQ291bnQ7CisgICAgICAgIH0KKyAgICB9KTsKK30KKworLyoqCisgKiBDYWxsYmFjayB0byBlZGl0IHRyYWNrIGZvcm1hdCBmb3IgdHJhbnNjb2RpbmcuCisgKiBAcGFyYW0gZHN0Rm9ybWF0IFRoZSBkZWZhdWx0IHRyYWNrIGZvcm1hdCBmb3IgdGhlIHRyYWNrIHR5cGUuCisgKi8KK3VzaW5nIFRyYWNrRm9ybWF0RWRpdENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKEFNZWRpYUZvcm1hdCogZHN0Rm9ybWF0KT47CisKKy8qKgorICogQ29uZmlndXJlcyBhIE1lZGlhVHJhY2tUcmFuc2NvZGVyIHdpdGggdGhlIHByb3ZpZGVkIE1lZGlhU2FtcGxlUmVhZGVyLCByZWFkaW5nIGZyb20gdGhlIGZpcnN0CisgKiB0cmFjayB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBtZWRpYSB0eXBlLgorICovCitzdGF0aWMgYm9vbCBDb25maWd1cmVTYW1wbGVSZWFkZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyPiYgdHJhbnNjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVSZWFkZXI+JiBzYW1wbGVSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFja0Zvcm1hdEVkaXRDYWxsYmFjayYgZm9ybWF0RWRpdG9yKSB7CisgICAgaW50IHNyY1RyYWNrSW5kZXggPSAtMTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBzcmNUcmFja0Zvcm1hdCA9IG51bGxwdHI7CisKKyAgICBmb3IgKGludCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHNhbXBsZVJlYWRlci0+Z2V0VHJhY2tDb3VudCgpOyArK3RyYWNrSW5kZXgpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCA9IHNhbXBsZVJlYWRlci0+Z2V0VHJhY2tGb3JtYXQodHJhY2tJbmRleCk7CisKKyAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworCisgICAgICAgIGlmICgobWVkaWFUeXBlID09IGtWaWRlbyAmJiBzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB8fAorICAgICAgICAgICAgKG1lZGlhVHlwZSA9PSBrQXVkaW8gJiYgc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikgPT0gMCkpIHsKKyAgICAgICAgICAgIHNyY1RyYWNrSW5kZXggPSB0cmFja0luZGV4OworICAgICAgICAgICAgc3JjVHJhY2tGb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pih0cmFja0Zvcm1hdCwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7CisgICAgfQorCisgICAgaWYgKHNyY1RyYWNrSW5kZXggPT0gLTEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gbWF0Y2hpbmcgc291cmNlIHRyYWNrIGZvdW5kIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IHNhbXBsZVJlYWRlci0+c2VsZWN0VHJhY2soc3JjVHJhY2tJbmRleCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHNlbGVjdCB0cmFjayI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIGRlc3RpbmF0aW9uRm9ybWF0ID0gR2V0RGVmYXVsdFRyYWNrRm9ybWF0KG1lZGlhVHlwZSwgc3JjVHJhY2tGb3JtYXQuZ2V0KCkpOworICAgIGlmIChmb3JtYXRFZGl0b3IgIT0gbnVsbHB0cikgeworICAgICAgICBmb3JtYXRFZGl0b3IoZGVzdGluYXRpb25Gb3JtYXQuZ2V0KCkpOworICAgIH0KKyAgICBzdGF0dXMgPSB0cmFuc2NvZGVyLT5jb25maWd1cmUoc2FtcGxlUmVhZGVyLCBzcmNUcmFja0luZGV4LCBkZXN0aW5hdGlvbkZvcm1hdCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAidHJhbnNjb2RlciBjb25maWd1cmUgcmV0dXJuZWQgIiA8PCBzdGF0dXM7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgQmVuY2htYXJrVHJhbnNjb2RlcihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNyY0ZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1vY2tSZWFkZXIsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrRm9ybWF0RWRpdENhbGxiYWNrJiBmb3JtYXRFZGl0b3IgPSBudWxscHRyKSB7CisgICAgc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKyAgICBwdGhyZWFkX29uY2UoJm9uY2UsIEFCaW5kZXJQcm9jZXNzX3N0YXJ0VGhyZWFkUG9vbCk7CisKKyAgICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFja1RyYW5zY29kZXJDYWxsYmFja3M+IGNhbGxiYWNrcyA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxUcmFja1RyYW5zY29kZXJDYWxsYmFja3M+KCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2Rlcj4gdHJhbnNjb2RlcjsKKworICAgICAgICBpZiAobWVkaWFUeXBlID09IGtWaWRlbykgeworICAgICAgICAgICAgdHJhbnNjb2RlciA9IFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpjcmVhdGUoY2FsbGJhY2tzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYW5zY29kZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyPihjYWxsYmFja3MpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBzYW1wbGVSZWFkZXIgPSBHZXRTYW1wbGVSZWFkZXIoc3JjRmlsZU5hbWUsIG1vY2tSZWFkZXIpOworICAgICAgICBpZiAoc2FtcGxlUmVhZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgc2FtcGxlIHJlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFDb25maWd1cmVTYW1wbGVSZWFkZXIodHJhbnNjb2Rlciwgc2FtcGxlUmVhZGVyLCBtZWRpYVR5cGUsIGZvcm1hdEVkaXRvcikpIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBjb25maWd1cmUgdGhlIHRyYW5zY29kZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gMDsKKyAgICAgICAgQ29uZmlndXJlRW1wdHlTYW1wbGVDb25zdW1lcih0cmFuc2NvZGVyLCBzYW1wbGVDb3VudCk7CisKKyAgICAgICAgaWYgKCF0cmFuc2NvZGVyLT5zdGFydCgpKSB7CisgICAgICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJVbmFibGUgdG8gc3RhcnQgdGhlIHRyYW5zY29kZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNhbGxiYWNrcy0+d2FpdEZvclRyYW5zY29kaW5nRmluaXNoZWQoKTsKKyAgICAgICAgdHJhbnNjb2Rlci0+c3RvcCgpOworCisgICAgICAgIGlmIChjYWxsYmFja3MtPm1TdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJUcmFuc2NvZGVyIGZhaWxlZCB3aXRoIGVycm9yIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMT0coREVCVUcpIDw8ICJOdW1iZXIgb2Ygc2FtcGxlcyByZWNlaXZlZDogIiA8PCBzYW1wbGVDb3VudDsKKyAgICAgICAgc3RhdGUuY291bnRlcnNbIkZyYW1lUmF0ZSJdID0gYmVuY2htYXJrOjpDb3VudGVyKHNhbXBsZUNvdW50LCBiZW5jaG1hcms6OkNvdW50ZXI6OmtJc1JhdGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgQmVuY2htYXJrVHJhbnNjb2RlcldpdGhPcGVyYXRpbmdSYXRlKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmNGaWxlLCBib29sIG1vY2tSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgIFRyYWNrRm9ybWF0RWRpdENhbGxiYWNrIGVkaXRvcjsKKyAgICBjb25zdCBpbnQzMl90IG9wZXJhdGluZ1JhdGUgPSBzdGF0ZS5yYW5nZSgwKTsKKyAgICBjb25zdCBpbnQzMl90IHByaW9yaXR5ID0gc3RhdGUucmFuZ2UoMSk7CisKKyAgICBpZiAob3BlcmF0aW5nUmF0ZSA+PSAwICYmIHByaW9yaXR5ID49IDApIHsKKyAgICAgICAgZWRpdG9yID0gW29wZXJhdGluZ1JhdGUsIHByaW9yaXR5XShBTWVkaWFGb3JtYXQqIGZvcm1hdCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSwgb3BlcmF0aW5nUmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZLCBwcmlvcml0eSk7CisgICAgICAgIH07CisgICAgfQorICAgIEJlbmNobWFya1RyYW5zY29kZXIoc3RhdGUsIHNyY0ZpbGUsIG1vY2tSZWFkZXIsIG1lZGlhVHlwZSwgZWRpdG9yKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBVkMgdG8gQVZDIEJlbmNobWFya3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBCTV9WaWRlb1RyYW5zY29kZV9BVkMyQVZDKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgY29uc3QgY2hhciogc3JjRmlsZSA9ICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX2FhYy5tcDQiOworICAgIEJlbmNobWFya1RyYW5zY29kZXJXaXRoT3BlcmF0aW5nUmF0ZShzdGF0ZSwgc3JjRmlsZSwgZmFsc2UgLyogbW9ja1JlYWRlciAqLywga1ZpZGVvKTsKK30KKworc3RhdGljIHZvaWQgQk1fVmlkZW9UcmFuc2NvZGVfQVZDMkFWQ19Ob0V4dHJhY3RvcihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIGNvbnN0IGNoYXIqIHNyY0ZpbGUgPSAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc19hYWMubXA0IjsKKyAgICBCZW5jaG1hcmtUcmFuc2NvZGVyV2l0aE9wZXJhdGluZ1JhdGUoc3RhdGUsIHNyY0ZpbGUsIHRydWUgLyogbW9ja1JlYWRlciAqLywga1ZpZGVvKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIRVZDIHRvIEFWQyBCZW5jaG1hcmtzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBCTV9WaWRlb1RyYW5zY29kZV9IRVZDMkFWQyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIGNvbnN0IGNoYXIqIHNyY0ZpbGUgPSAidmlkZW9fMTkyMHgxMDgwXzM4NjNmcmFtZV9oZXZjXzRNYnBzXzMwZnBzX2FhYy5tcDQiOworICAgIEJlbmNobWFya1RyYW5zY29kZXJXaXRoT3BlcmF0aW5nUmF0ZShzdGF0ZSwgc3JjRmlsZSwgZmFsc2UgLyogbW9ja1JlYWRlciAqLywga1ZpZGVvKTsKK30KKworc3RhdGljIHZvaWQgQk1fVmlkZW9UcmFuc2NvZGVfSEVWQzJBVkNfTm9FeHRyYWN0b3IoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNGaWxlID0gInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwc19hYWMubXA0IjsKKyAgICBCZW5jaG1hcmtUcmFuc2NvZGVyV2l0aE9wZXJhdGluZ1JhdGUoc3RhdGUsIHNyY0ZpbGUsIHRydWUgLyogbW9ja1JlYWRlciAqLywga1ZpZGVvKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZW5jaG1hcmsgUmVnaXN0cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBCZW5jaG1hcmsgcmVnaXN0cmF0aW9uIHdyYXBwZXIgZm9yIHRyYW5zY29kaW5nLgorI2RlZmluZSBUUkFOU0NPREVSX0JFTkNITUFSSyhmdW5jKSBcCisgICAgQkVOQ0hNQVJLKGZ1bmMpLT5Vc2VSZWFsVGltZSgpLT5NZWFzdXJlUHJvY2Vzc0NQVVRpbWUoKS0+VW5pdChiZW5jaG1hcms6OmtNaWxsaXNlY29uZCkKKworLy8gQmVuY2htYXJrIHJlZ2lzdHJhdGlvbiBmb3IgdGVzdGluZyBkaWZmZXJlbnQgb3BlcmF0aW5nIHJhdGUgYW5kIHByaW9yaXR5IGNvbWJpbmF0aW9ucy4KKyNkZWZpbmUgVFJBTlNDT0RFUl9PUEVSQVRJTkdfUkFURV9CRU5DSE1BUksoZnVuYykgIFwKKyAgICBUUkFOU0NPREVSX0JFTkNITUFSSyhmdW5jKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC0+QXJncyh7LTEsIC0xfSkgLyogPC0tIFVzZSBkZWZhdWx0ICovIFwKKyAgICAgICAgICAgIC0+QXJncyh7MjQwLCAwfSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC0+QXJncyh7SU5UMzJfTUFYLCAwfSkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC0+QXJncyh7MjQwLCAxfSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC0+QXJncyh7SU5UMzJfTUFYLCAxfSkKKworVFJBTlNDT0RFUl9PUEVSQVRJTkdfUkFURV9CRU5DSE1BUksoQk1fVmlkZW9UcmFuc2NvZGVfQVZDMkFWQyk7CitUUkFOU0NPREVSX09QRVJBVElOR19SQVRFX0JFTkNITUFSSyhCTV9WaWRlb1RyYW5zY29kZV9BVkMyQVZDX05vRXh0cmFjdG9yKTsKKworVFJBTlNDT0RFUl9PUEVSQVRJTkdfUkFURV9CRU5DSE1BUksoQk1fVmlkZW9UcmFuc2NvZGVfSEVWQzJBVkMpOworVFJBTlNDT0RFUl9PUEVSQVRJTkdfUkFURV9CRU5DSE1BUksoQk1fVmlkZW9UcmFuc2NvZGVfSEVWQzJBVkNfTm9FeHRyYWN0b3IpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9NZWRpYVRyYW5zY29kZXJCZW5jaG1hcmsuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9NZWRpYVRyYW5zY29kZXJCZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTA4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvYmVuY2htYXJrL01lZGlhVHJhbnNjb2RlckJlbmNobWFyay5jcHAKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIE5hdGl2ZSBtZWRpYSB0cmFuc2NvZGVyIGxpYnJhcnkgYmVuY2htYXJrIHRlc3RzLgorICoKKyAqIEhvdyB0byBydW4gdGhlIGJlbmNobWFyazoKKyAqCisgKiAxLiBEb3dubG9hZCB0aGUgbWVkaWEgYXNzZXRzIGZyb20gaHR0cDovL2dvL3RyYW5zY29kaW5nYmVuY2htYXJrIGFuZCBwdXNoIHRoZSBkaXJlY3RvcnkKKyAqICAgICgiVHJhbnNjb2RpbmdCZW5jaG1hcmsiKSB0byAvZGF0YS9sb2NhbC90bXAuCisgKgorICogMi4gQ29tcGlsZSB0aGUgYmVuY2htYXJrIGFuZCBzeW5jIHRvIGRldmljZToKKyAqICAgICAgJCBtbSAtajcyICYmIGFkYiBzeW5jCisgKgorICogMy4gUnVuOgorICogICAgICAkIGFkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvTWVkaWFUcmFuc2NvZGVyQmVuY2htYXJrL01lZGlhVHJhbnNjb2RlckJlbmNobWFyaworICovCisKKyNpbmNsdWRlIDxiZW5jaG1hcmsvYmVuY2htYXJrLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYW5zY29kZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIFRyYW5zY29kZXJDYWxsYmFja3MgOiBwdWJsaWMgTWVkaWFUcmFuc2NvZGVyOjpDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG9uRmluaXNoZWQoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcihjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyb3IpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1TdGF0dXMgPSBlcnJvcjsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uUHJvZ3Jlc3NVcGRhdGUoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MgX191bnVzZWQpIG92ZXJyaWRlIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Db2RlY1Jlc291cmNlTG9zdChjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4mIHBhdXNlZFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3VudXNlZCkgb3ZlcnJpZGUge30KKworICAgIGJvb2wgd2FpdEZvclRyYW5zY29kaW5nRmluaXNoZWQoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICB3aGlsZSAoIW1GaW5pc2hlZCkgeworICAgICAgICAgICAgaWYgKG1Db25kaXRpb24ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pbnV0ZXMoNSkpID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IG1TdGF0dXMgPSBBTUVESUFfT0s7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKyAgICBib29sIG1GaW5pc2hlZCA9IGZhbHNlOworfTsKKworc3RhdGljIEFNZWRpYUZvcm1hdCogQ3JlYXRlRGVmYXVsdFZpZGVvRm9ybWF0KCkgeworICAgIC8vIERlZmF1bHQgYml0cmF0ZQorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrVmlkZW9CaXRSYXRlID0gMjAgKiAxMDAwICogMTAwMDsgIC8vIDIwTWJzCisKKyAgICBBTWVkaWFGb3JtYXQqIHZpZGVvRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMih2aWRlb0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwga1ZpZGVvQml0UmF0ZSk7CisgICAgcmV0dXJuIHZpZGVvRm9ybWF0OworfQorCisvKioKKyAqIENhbGxiYWNrIHRvIGNvbmZpZ3VyZSB0cmFja3MgZm9yIHRyYW5zY29kaW5nLgorICogQHBhcmFtIG1pbWUgVGhlIHNvdXJjZSB0cmFjayBtaW1lIHR5cGUuCisgKiBAcGFyYW0gZHN0Rm9ybWF0IFRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgaWYgdGhlIHRyYWNrIHNob3VsZCBiZSB0cmFuc2NvZGVkIG9yIG51bGxwdHIgaWYgdGhlIHRyYWNrCisgKiBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2guCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYWNrIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCisgKi8KK3VzaW5nIFRyYWNrU2VsZWN0aW9uQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgY2hhciogbWltZSwgQU1lZGlhRm9ybWF0KiogZHN0Rm9ybWF0KT47CisKK3N0YXRpYyB2b2lkIFRyYW5zY29kZU1lZGlhRmlsZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNyY0ZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkc3RGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja1NlbGVjdGlvbkNhbGxiYWNrIHRyYWNrU2VsZWN0aW9uQ2FsbGJhY2spIHsKKyAgICAvLyBXcml0ZS1vbmx5LCBjcmVhdGUgZmlsZSBpZiBub24tZXhpc3RlbnQuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0RzdE9wZW5GbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVDsKKyAgICAvLyBVc2VyIFIrVyBwZXJtaXNzaW9uLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtEc3RGaWxlTW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSOworICAgIC8vIEFzc2V0IGRpcmVjdG9yeQorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQXNzZXREaXJlY3RvcnkgPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nQmVuY2htYXJrLyI7CisKKyAgICBpbnQgc3JjRmQgPSAwOworICAgIGludCBkc3RGZCA9IDA7CisKKyAgICBzdGQ6OnN0cmluZyBzcmNQYXRoID0ga0Fzc2V0RGlyZWN0b3J5ICsgc3JjRmlsZU5hbWU7CisgICAgc3RkOjpzdHJpbmcgZHN0UGF0aCA9IGtBc3NldERpcmVjdG9yeSArIGRzdEZpbGVOYW1lOworCisgICAgYXV0byBjYWxsYmFja3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYW5zY29kZXJDYWxsYmFja3M+KCk7CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1FRElBX09LOworCisgICAgaWYgKChzcmNGZCA9IG9wZW4oc3JjUGF0aC5jX3N0cigpLCBPX1JET05MWSkpIDwgMCkgeworICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJVbmFibGUgdG8gb3BlbiBzb3VyY2UgZmlsZSIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIGlmICgoZHN0RmQgPSBvcGVuKGRzdFBhdGguY19zdHIoKSwga0RzdE9wZW5GbGFncywga0RzdEZpbGVNb2RlKSkgPCAwKSB7CisgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBvcGVuIGRlc3RpbmF0aW9uIGZpbGUiKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAgICAgYXV0byB0cmFuc2NvZGVyID0gTWVkaWFUcmFuc2NvZGVyOjpjcmVhdGUoY2FsbGJhY2tzKTsKKworICAgICAgICBzdGF0dXMgPSB0cmFuc2NvZGVyLT5jb25maWd1cmVTb3VyY2Uoc3JjRmQpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiVW5hYmxlIHRvIGNvbmZpZ3VyZSB0cmFuc2NvZGVyIHNvdXJjZSIpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gdHJhbnNjb2Rlci0+Y29uZmlndXJlRGVzdGluYXRpb24oZHN0RmQpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiVW5hYmxlIHRvIGNvbmZpZ3VyZSB0cmFuc2NvZGVyIGRlc3RpbmF0aW9uIik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pj4gdHJhY2tGb3JtYXRzID0gdHJhbnNjb2Rlci0+Z2V0VHJhY2tGb3JtYXRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tGb3JtYXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHNyY0Zvcm1hdCA9IHRyYWNrRm9ybWF0c1tpXS5nZXQoKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogZHN0Rm9ybWF0ID0gbnVsbHB0cjsKKworICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoc3JjRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSkgeworICAgICAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlNvdXJjZSB0cmFjayBmb3JtYXQgZG9lcyBub3QgaGF2ZSBNSU1FIHR5cGUiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZUNvdW50OworICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIoc3JjRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5ULCAmZnJhbWVDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuY291bnRlcnNbIlZpZGVvRnJhbWVSYXRlIl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmNobWFyazo6Q291bnRlcihmcmFtZUNvdW50LCBiZW5jaG1hcms6OkNvdW50ZXI6OmtJc1JhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYWNrU2VsZWN0aW9uQ2FsbGJhY2sobWltZSwgJmRzdEZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0cmFuc2NvZGVyLT5jb25maWd1cmVUcmFja0Zvcm1hdChpLCBkc3RGb3JtYXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZHN0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGRzdEZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBjb25maWd1cmUgdHJhY2siKTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSB0cmFuc2NvZGVyLT5zdGFydCgpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHRyYW5zY29kZXIiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2FsbGJhY2tzLT53YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpKSB7CisgICAgICAgICAgICB0cmFuc2NvZGVyLT5jYW5jZWwoKTsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlRyYW5zY29kZXIgdGltZWQgb3V0Iik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrcy0+bVN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlRyYW5zY29kZXIgZXJyb3Igd2hlbiBydW5uaW5nIik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisKK2V4aXQ6CisgICAgaWYgKHNyY0ZkID4gMCkgY2xvc2Uoc3JjRmQpOworICAgIGlmIChkc3RGZCA+IDApIGNsb3NlKGRzdEZkKTsKK30KKworLyoqCisgKiBDYWxsYmFjayB0byBlZGl0IHRyYWNrIGZvcm1hdCBmb3IgdHJhbnNjb2RpbmcuCisgKiBAcGFyYW0gZHN0Rm9ybWF0IFRoZSBkZWZhdWx0IHRyYWNrIGZvcm1hdCBmb3IgdGhlIHRyYWNrIHR5cGUuCisgKi8KK3VzaW5nIFRyYWNrRm9ybWF0RWRpdENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKEFNZWRpYUZvcm1hdCogZHN0Rm9ybWF0KT47CisKK3N0YXRpYyB2b2lkIFRyYW5zY29kZU1lZGlhRmlsZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNyY0ZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkc3RGaWxlTmFtZSwgYm9vbCBpbmNsdWRlQXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0cmFuc2NvZGVWaWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFja0Zvcm1hdEVkaXRDYWxsYmFjayYgdmlkZW9Gb3JtYXRFZGl0b3IgPSBudWxscHRyKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCBzcmNGaWxlTmFtZSwgZHN0RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFs9XShjb25zdCBjaGFyKiBtaW1lLCBBTWVkaWFGb3JtYXQqKiBkc3RGb3JtYXRPdXQpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRzdEZvcm1hdE91dCA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikgPT0gMCAmJiB0cmFuc2NvZGVWaWRlbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkc3RGb3JtYXRPdXQgPSBDcmVhdGVEZWZhdWx0VmlkZW9Gb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9Gb3JtYXRFZGl0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0Zvcm1hdEVkaXRvcigqZHN0Rm9ybWF0T3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpID09IDAgJiYgIWluY2x1ZGVBdWRpbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICB9KTsKK30KKworc3RhdGljIHZvaWQgU2V0TWF4T3BlcmF0aW5nUmF0ZShBTWVkaWFGb3JtYXQqIGZvcm1hdCkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEUsIElOVDMyX01BWCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSwgMSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVZDIHRvIEFWQyBCZW5jaG1hcmtzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlQXZjMkF2Y0F1ZGlvVmlkZW8yQXVkaW9WaWRlbyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX2FhY190cmFuc2NvZGVkX0FWLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovKTsKK30KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlQXZjMkF2Y1ZpZGVvMlZpZGVvKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc190cmFuc2NvZGVkX1YubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovKTsKK30KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlQXZjMkF2Y0FWMkFWTWF4T3BlcmF0aW5nUmF0ZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX2FhY190cmFuc2NvZGVkX0FWLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovLCBTZXRNYXhPcGVyYXRpbmdSYXRlKTsKK30KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlQXZjMkF2Y1YyVk1heE9wZXJhdGluZ1JhdGUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX3RyYW5zY29kZWRfVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sIFNldE1heE9wZXJhdGluZ1JhdGUpOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVBdmMyQXZjQVYyQVY3MjBQKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidmlkZW9fMTI4MHg3MjBfMzY0OGZyYW1lX2gyNjRfMTZNYnBzXzMwZnBzX2FhYy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTI4MHg3MjBfMzY0OGZyYW1lX2gyNjRfMTZNYnBzXzMwZnBzX2FhY190cmFuc2NvZGVkX0FWLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovKTsKK30KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlQXZjMkF2Y0FWMkFWNzIwUE1heE9wZXJhdGluZ1JhdGUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xMjgweDcyMF8zNjQ4ZnJhbWVfaDI2NF8xNk1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xMjgweDcyMF8zNjQ4ZnJhbWVfaDI2NF8xNk1icHNfMzBmcHNfYWFjX3RyYW5zY29kZWRfQVYubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sIFNldE1heE9wZXJhdGluZ1JhdGUpOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIRVZDIHRvIEFWQyBCZW5jaG1hcmtzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVIZXZjMkF2Y0F1ZGlvVmlkZW8yQXVkaW9WaWRlbyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwc19hYWNfdHJhbnNjb2RlZF9BVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLyk7Cit9CisKK3N0YXRpYyB2b2lkIEJNX1RyYW5zY29kZUhldmMyQXZjVmlkZW8yVmlkZW8oYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xOTIweDEwODBfMzg2M2ZyYW1lX2hldmNfNE1icHNfMzBmcHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwc190cmFuc2NvZGVkX1YubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovKTsKK30KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlSGV2YzJBdmNBVjJBVk1heE9wZXJhdGluZ1JhdGUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xOTIweDEwODBfMzg2M2ZyYW1lX2hldmNfNE1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xOTIweDEwODBfMzg2M2ZyYW1lX2hldmNfNE1icHNfMzBmcHNfYWFjX3RyYW5zY29kZWRfQVYubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sIFNldE1heE9wZXJhdGluZ1JhdGUpOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVIZXZjMkF2Y1YyVk1heE9wZXJhdGluZ1JhdGUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xOTIweDEwODBfMzg2M2ZyYW1lX2hldmNfNE1icHNfMzBmcHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwc190cmFuc2NvZGVkX1YubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovLCBTZXRNYXhPcGVyYXRpbmdSYXRlKTsKK30KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlSGV2YzJBdmNBVjJBVjcyMFAoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xMjgweDcyMF8zODYzZnJhbWVfaGV2Y18xNk1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xMjgweDcyMF8zODYzZnJhbWVfaGV2Y18xNk1icHNfMzBmcHNfYWFjX3RyYW5zY29kZWRfQVYubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVIZXZjMkF2Y0FWMkFWNzIwUE1heE9wZXJhdGluZ1JhdGUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xMjgweDcyMF8zODYzZnJhbWVfaGV2Y18xNk1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xMjgweDcyMF8zODYzZnJhbWVfaGV2Y18xNk1icHNfMzBmcHNfYWFjX3RyYW5zY29kZWRfQVYubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sIFNldE1heE9wZXJhdGluZ1JhdGUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhc3N0aHJvdWdoIEJlbmNobWFya3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEJNX1RyYW5zY29kZUF1ZGlvVmlkZW9QYXNzdGhyb3VnaChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX2FhY19wYXNzdGhyb3VnaF9BVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVBdWRpbyAqLywgZmFsc2UgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlVmlkZW9QYXNzdGhyb3VnaChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfcGFzc3Rocm91Z2hfQVYubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCBmYWxzZSAvKiB0cmFuc2NvZGVWaWRlbyAqLyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVuY2htYXJrIFJlZ2lzdHJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQmVuY2htYXJrIHJlZ2lzdHJhdGlvbiB3cmFwcGVyIGZvciB0cmFuc2NvZGluZy4KKyNkZWZpbmUgVFJBTlNDT0RFUl9CRU5DSE1BUksoZnVuYykgXAorICAgIEJFTkNITUFSSyhmdW5jKS0+VXNlUmVhbFRpbWUoKS0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCktPlVuaXQoYmVuY2htYXJrOjprTWlsbGlzZWNvbmQpCisKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUF2YzJBdmNBdWRpb1ZpZGVvMkF1ZGlvVmlkZW8pOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlQXZjMkF2Y1ZpZGVvMlZpZGVvKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUF2YzJBdmNBVjJBVk1heE9wZXJhdGluZ1JhdGUpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlQXZjMkF2Y1YyVk1heE9wZXJhdGluZ1JhdGUpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlQXZjMkF2Y0FWMkFWNzIwUCk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV9UcmFuc2NvZGVBdmMyQXZjQVYyQVY3MjBQTWF4T3BlcmF0aW5nUmF0ZSk7CisKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUhldmMyQXZjQXVkaW9WaWRlbzJBdWRpb1ZpZGVvKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUhldmMyQXZjVmlkZW8yVmlkZW8pOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlSGV2YzJBdmNBVjJBVk1heE9wZXJhdGluZ1JhdGUpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlSGV2YzJBdmNWMlZNYXhPcGVyYXRpbmdSYXRlKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUhldmMyQXZjQVYyQVY3MjBQKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUhldmMyQXZjQVYyQVY3MjBQTWF4T3BlcmF0aW5nUmF0ZSk7CisKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUF1ZGlvVmlkZW9QYXNzdGhyb3VnaCk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV9UcmFuc2NvZGVWaWRlb1Bhc3N0aHJvdWdoKTsKKworQkVOQ0hNQVJLX01BSU4oKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhU2FtcGxlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjM5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1NBTVBMRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfU0FNUExFX0gKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBNZWRpYSBzYW1wbGUgZmxhZ3MuCisgKiBUaGVzZSBmbGFncyBwdXJwb3NlbHkgbWF0Y2ggdGhlIG1lZGlhIE5ESydzIGJ1ZmZlciBhbmQgZXh0cmFjdG9yIGZsYWdzIHdpdGggb25lIGV4Y2VwdGlvbi4gVGhlCisgKiBOREsgZXh0cmFjdG9yJ3MgZmxhZyBmb3IgZW5jcnlwdGVkIHNhbXBsZXMgKEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19FTkNSWVBURUQpIGlzIGVxdWFsIHRvIDIsCisgKiBpLmUuIHRoZSBzYW1lIGFzIFNBTVBMRV9GTEFHX0NPREVDX0NPTkZJRyBiZWxvdyBhbmQgTkRLJ3MgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHLgorICogU2FtcGxlIHByb2R1Y2VycyBiYXNlZCBvbiB0aGUgTkRLJ3MgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIGZvciBjYXRjaGluZyB0aG9zZSB2YWx1ZXMuCisgKiBOb3RlIHRoYXQgY3VycmVudGx5IHRoZSBtZWRpYSB0cmFuc2NvZGVyIGRvZXMgbm90IHN1cHBvcnQgZW5jcnlwdGVkIHNhbXBsZXMuCisgKi8KK2VudW0gOiB1aW50MzJfdCB7CisgICAgU0FNUExFX0ZMQUdfU1lOQ19TQU1QTEUgPSAxLAorICAgIFNBTVBMRV9GTEFHX0NPREVDX0NPTkZJRyA9IDIsCisgICAgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSA9IDQsCisgICAgU0FNUExFX0ZMQUdfUEFSVElBTF9GUkFNRSA9IDgsCit9OworCisvKioKKyAqIE1lZGlhU2FtcGxlSW5mbyBpcyBhbiBvYmplY3QgdGhhdCBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgY29tcHJlc3NlZCBtZWRpYSBzYW1wbGUgd2l0aG91dAorICogaG9sZGluZyBhbnkgc2FtcGxlIGRhdGEuCisgKi8KK3N0cnVjdCBNZWRpYVNhbXBsZUluZm8geworICAgIC8qKiBUaGUgc2FtcGxlJ3MgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMuICovCisgICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXMgPSAwOworCisgICAgLyoqIFRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIHNhbXBsZSBkYXRhIGluIGJ5dGVzLiAqLworICAgIHNpemVfdCBzaXplID0gMDsKKworICAgIC8qKiBTYW1wbGUgZmxhZ3MuICovCisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworfTsKKworLyoqCisgKiBNZWRpYVNhbXBsZSBob2xkcyBhIGNvbXByZXNzZWQgbWVkaWEgc2FtcGxlIGluIG1lbW9yeS4KKyAqLworc3RydWN0IE1lZGlhU2FtcGxlIHsKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB0byBub3RpZnkgdGhhdCBhIG1lZGlhIHNhbXBsZSBpcyBhYm91dCB0byBiZSByZWxlYXNlZCwgZ2l2aW5nIHRoZSBjcmVhdG9yIGEgY2hhbmNlCisgICAgICogdG8gcmVjbGFpbSB0aGUgZGF0YSBidWZmZXIgYmFja2luZyB0aGUgc2FtcGxlLiBPbmNlIHRoaXMgY2FsbGJhY2sgcmV0dXJucywgdGhlIG1lZGlhIHNhbXBsZQorICAgICAqIGluc3RhbmNlICp3aWxsKiBiZSByZWxlYXNlZCBzbyBpdCBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBjYWxsYmFjay4gVG8gZW5hYmxlIHRoZQorICAgICAqIGNhbGxiYWNrLCBjcmVhdGUgdGhlIG1lZGlhIHNhbXBsZSB3aXRoIHtAbGluayAjY3JlYXRlV2l0aFJlbGVhc2VDYWxsYmFja30uCisgICAgICogQHBhcmFtIHNhbXBsZSBUaGUgc2FtcGxlIHRvIGJlIHJlbGVhc2VkLgorICAgICAqLworICAgIHVzaW5nIE9uU2FtcGxlUmVsZWFzZWRDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChNZWRpYVNhbXBsZSogc2FtcGxlKT47CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IG1lZGlhIHNhbXBsZSBpbnN0YW5jZSB3aXRoIGEgcmVnaXN0ZXJlZCByZWxlYXNlIGNhbGxiYWNrLiBUaGUgcmVsZWFzZSBjYWxsYmFjaworICAgICAqIHdpbGwgZ2V0IGNhbGxlZCByaWdodCBiZWZvcmUgdGhlIG1lZGlhIHNhbXBsZSBpcyByZWxlYXNlZCBnaXZpbmcgdGhlIGNyZWF0b3IgYSBjaGFuY2UgdG8KKyAgICAgKiByZWNsYWltIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIGJ1ZmZlciBCeXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzYW1wbGUncyBjb21wcmVzc2VkIGRhdGEuCisgICAgICogQHBhcmFtIGRhdGFPZmZzZXQgT2Zmc2V0LCBpbiBieXRlcywgdG8gdGhlIHNhbXBsZSdzIGNvbXByZXNzZWQgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgQnVmZmVyIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgYnVmZmVyIG9uIHJlbGVhc2UuCisgICAgICogQHBhcmFtIHJlbGVhc2VDYWxsYmFjayBUaGUgc2FtcGxlIHJlbGVhc2UgY2FsbGJhY2suCisgICAgICogQHJldHVybiBBIG5ldyBtZWRpYSBzYW1wbGUgaW5zdGFuY2UuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gY3JlYXRlV2l0aFJlbGVhc2VDYWxsYmFjaygKKyAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGRhdGFPZmZzZXQsIHVpbnQzMl90IGJ1ZmZlcklkLAorICAgICAgICAgICAgT25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIHJlbGVhc2VDYWxsYmFjaykgeworICAgICAgICBNZWRpYVNhbXBsZSogc2FtcGxlID0gbmV3IE1lZGlhU2FtcGxlKGJ1ZmZlciwgZGF0YU9mZnNldCwgYnVmZmVySWQsIHJlbGVhc2VDYWxsYmFjayk7CisgICAgICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+KAorICAgICAgICAgICAgICAgIHNhbXBsZSwgc3RkOjpiaW5kKCZNZWRpYVNhbXBsZTo6cmVsZWFzZVNhbXBsZSwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2FtcGxlJ3MgY29tcHJlc3NlZCBkYXRhLiBUaGUgbWVkaWEgc2FtcGxlIGluc3RhbmNlIGRvZXMgbm90IHRha2UKKyAgICAgKiBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlciBhbmQgd2lsbCBub3QgYXV0b21hdGljYWxseSByZWxlYXNlIHRoZSBtZW1vcnksIGJ1dCB0aGUgY2FsbGVyIGNhbgorICAgICAqIHJlZ2lzdGVyIGEgcmVsZWFzZSBjYWxsYmFjayBieSBjcmVhdGluZyB0aGUgbWVkaWEgc2FtcGxlIHdpdGgKKyAgICAgKiB7QGxpbmsgI2NyZWF0ZVdpdGhSZWxlYXNlQ2FsbGJhY2t9LgorICAgICAqLworICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICAvKiogT2Zmc2V0LCBpbiBieXRlcywgdG8gdGhlIHNhbXBsZSdzIGNvbXByZXNzZWQgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlci4gKi8KKyAgICBzaXplX3QgZGF0YU9mZnNldCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgaWRlbnRpZmllci4gVGhpcyBpZGVudGlmaWVyIGlzIGxpa2VseSBvbmx5IG1lYW5pbmdmdWwgdG8gdGhlIHNhbXBsZSBkYXRhIHByb2R1Y2VyIGFuZAorICAgICAqIGNhbiBiZSB1c2VkIGZvciByZWNsYWltaW5nIHRoZSBidWZmZXIgb25jZSBhIGNvbnN1bWVyIGlzIGRvbmUgcHJvY2Vzc2luZyBpdC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBidWZmZXJJZCA9IDB4QkFBREYwMEQ7CisKKyAgICAvKiogTWVkaWEgc2FtcGxlIGluZm9ybWF0aW9uLiAqLworICAgIE1lZGlhU2FtcGxlSW5mbyBpbmZvOworCisgICAgTWVkaWFTYW1wbGUoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgTWVkaWFTYW1wbGUodWludDhfdCogYnVmZmVyLCBzaXplX3QgZGF0YU9mZnNldCwgdWludDMyX3QgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgT25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIHJlbGVhc2VDYWxsYmFjaykKKyAgICAgICAgICA6IGJ1ZmZlcihidWZmZXIpLAorICAgICAgICAgICAgZGF0YU9mZnNldChkYXRhT2Zmc2V0KSwKKyAgICAgICAgICAgIGJ1ZmZlcklkKGJ1ZmZlcklkKSwKKyAgICAgICAgICAgIG1SZWxlYXNlQ2FsbGJhY2socmVsZWFzZUNhbGxiYWNrKXt9OworCisgICAgc3RhdGljIHZvaWQgcmVsZWFzZVNhbXBsZShNZWRpYVNhbXBsZSogc2FtcGxlKSB7CisgICAgICAgIGlmIChzYW1wbGUtPm1SZWxlYXNlQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2FtcGxlLT5tUmVsZWFzZUNhbGxiYWNrKHNhbXBsZSk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIHNhbXBsZTsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgY29weWluZyB0byBwcmV2ZW50IGRhbmdsaW5nIHBvaW50ZXJzIGluIHRoZSBjb3BpZWQgb2JqZWN0IGFmdGVyIHRoZSBvcmlnaW5hbCBpcworICAgIC8vIHJlbGVhc2VkLgorICAgIE1lZGlhU2FtcGxlKGNvbnN0IE1lZGlhU2FtcGxlJikgPSBkZWxldGU7CisgICAgTWVkaWFTYW1wbGUmIG9wZXJhdG9yPShjb25zdCBNZWRpYVNhbXBsZSYpID0gZGVsZXRlOworCisgICAgY29uc3QgT25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIG1SZWxlYXNlQ2FsbGJhY2sgPSBudWxscHRyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9TQU1QTEVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVRdWV1ZS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Y2YxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZVF1ZXVlLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9TQU1QTEVfUVVFVUVfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1NBTVBMRV9RVUVVRV9ICisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBNZWRpYVNhbXBsZVF1ZXVlIGFzeW5jaHJvbm91c2x5IGNvbm5lY3RzIGEgcHJvZHVjZXIgYW5kIGEgY29uc3VtZXIgb2YgbWVkaWEgc2FtcGxlcy4KKyAqIE1lZGlhIHNhbXBsZXMgZmxvd3MgdGhyb3VnaCB0aGUgcXVldWUgaW4gRklGTyBvcmRlci4gSWYgdGhlIHF1ZXVlIGlzIGVtcHR5IHRoZSBjb25zdW1lciB3aWxsIGJlCisgKiBibG9ja2VkIHVudGlsIGEgbmV3IG1lZGlhIHNhbXBsZSBpcyBhZGRlZCBvciB1bnRpbCB0aGUgcHJvZHVjZXIgYWJvcnRzIHRoZSBxdWV1ZSBvcGVyYXRpb24uCisgKi8KK2NsYXNzIE1lZGlhU2FtcGxlUXVldWUgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEVucXVldWVzIGEgbWVkaWEgc2FtcGxlIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlIGFuZCBub3RpZmllcyBwb3RlbnRpYWxseSB3YWl0aW5nIGNvbnN1bWVycy4KKyAgICAgKiBJZiB0aGUgcXVldWUgaGFzIHByZXZpb3VzbHkgYmVlbiBhYm9ydGVkIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICAgKiBAcGFyYW0gc2FtcGxlIFRoZSBtZWRpYSBzYW1wbGUgdG8gZW5xdWV1ZS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHF1ZXVlIGhhcyBiZWVuIGFib3J0ZWQuCisgICAgICovCisgICAgYm9vbCBlbnF1ZXVlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBuZXh0IG1lZGlhIHNhbXBsZSBmcm9tIHRoZSBxdWV1ZSBhbmQgcmV0dXJucyBpdC4gSWYgdGhlIHF1ZXVlIGhhcyBwcmV2aW91c2x5IGJlZW4KKyAgICAgKiBhYm9ydGVkIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgd2hpbGUgdGhlIHF1ZXVlIGlzIGVtcHR5LgorICAgICAqIEBwYXJhbVtvdXRdIHNhbXBsZSBUaGUgbmV4dCBtZWRpYSBzYW1wbGUgaW4gdGhlIHF1ZXVlLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcXVldWUgaGFzIGJlZW4gYWJvcnRlZC4KKyAgICAgKi8KKyAgICBib29sIGRlcXVldWUoc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiogc2FtcGxlIC8qIG5vbm51bGwgKi8pOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBxdWV1ZSBjdXJyZW50bHkgaG9sZHMgYW55IG1lZGlhIHNhbXBsZXMuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBoYXMgYmVlbiBhYm9ydGVkLiBGYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBpc0VtcHR5KCk7CisKKyAgICAvKioKKyAgICAgKiBBYm9ydHMgdGhlIHF1ZXVlIG9wZXJhdGlvbi4gVGhpcyBjbGVhcnMgdGhlIHF1ZXVlIGFuZCBub3RpZmllcyB3YWl0aW5nIGNvbnN1bWVycy4gQWZ0ZXIgdGhlCisgICAgICogaGFzIGJlZW4gYWJvcnRlZCBpdCBpcyBub3QgcG9zc2libGUgdG8gZW5xdWV1ZSBtb3JlIHNhbXBsZXMsIGFuZCBkZXF1ZXVlIHdpbGwgcmV0dXJuIG51bGwuCisgICAgICovCisgICAgdm9pZCBhYm9ydCgpOworCitwcml2YXRlOgorICAgIHN0ZDo6cXVldWU8c3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPj4gbVNhbXBsZVF1ZXVlIEdVQVJERURfQlkobU11dGV4KTsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgIGJvb2wgbUFib3J0ZWQgR1VBUkRFRF9CWShtTXV0ZXgpID0gZmFsc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1NBTVBMRV9RVUVVRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZVJlYWRlci5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZmYmVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVSZWFkZXIuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9TQU1QTEVfUkVBREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9TQU1QTEVfUkVBREVSX0gKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBNZWRpYVNhbXBsZVJlYWRlciBpcyBhbiBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgbWVkaWEgc2FtcGxlcyBmcm9tIGEgY29udGFpbmVyLiBNZWRpYVNhbXBsZVJlYWRlcgorICogYWxsb3dzIGZvciByZWFkaW5nIHNhbXBsZXMgZnJvbSBtdWx0aXBsZSB0cmFja3Mgb24gaW5kaXZpZHVhbCB0aHJlYWRzIGluZGVwZW5kZW50bHkgb2YgZWFjaCBvdGhlcgorICogd2hpbGUgcHJlc2VydmluZyB0aGUgb3JkZXIgb2Ygc2FtcGxlcy4gRHVlIHRvIHBvb3Igbm9uLXNlcXVlbnRpYWwgYWNjZXNzIHBlcmZvcm1hbmNlIG9mIHRoZQorICogdW5kZXJseWluZyBleHRyYWN0b3IsIE1lZGlhU2FtcGxlUmVhZGVyIGNhbiBvcHRpb25hbGx5IGVuZm9yY2Ugc2VxdWVudGlhbCBzYW1wbGUgYWNjZXNzIGJ5CisgKiBibG9ja2luZyByZXF1ZXN0cyBmb3IgdHJhY2tzIHRoYXQgdGhlIHVuZGVybHlpbmcgZXh0cmFjdG9yIGRvZXMgbm90IGN1cnJlbnRseSBwb2ludCB0by4gV2FpdGluZworICogdGhyZWFkcyBhcmUgc2VydmljZWQgb25jZSB0aGUgcmVhZGVyIGFkdmFuY2VzIHRvIGEgc2FtcGxlIGZyb20gdGhlIHNwZWNpZmllZCB0cmFjay4gRHVlIHRvIHRoaXMKKyAqIGl0IGlzIGltcG9ydGFudCB0byByZWFkIHNhbXBsZXMgYW5kIGFkdmFuY2UgdGhlIHJlYWRlciBmcm9tIGFsbCBzZWxlY3RlZCB0cmFja3MgdG8gYXZvaWQgaGFuZ2luZworICogb3RoZXIgdHJhY2tzLiBNZWRpYVNhbXBsZVJlYWRlciBpbXBsZW1lbnRhdGlvbnMgYXJlIHRocmVhZCBzYWZlIGFuZCBzYW1wbGUgYWNjZXNzIHNob3VsZCBiZSBkb25lCisgKiBvbiBvbmUgdGhyZWFkIHBlciBzZWxlY3RlZCB0cmFjay4KKyAqLworY2xhc3MgTWVkaWFTYW1wbGVSZWFkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpbGUgZm9ybWF0IG9mIHRoZSBtZWRpYSBjb250YWluZXIgYXMgYSBBTWVkaWFGb3JtYXQuCisgICAgICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBmb3JtYXQgd2hlbiBmaW5pc2hlZCB3aXRoIGl0IHVzaW5nCisgICAgICogQU1lZGlhRm9ybWF0X2RlbGV0ZSgpLgorICAgICAqIEByZXR1cm4gVGhlIGZpbGUgbWVkaWEgZm9ybWF0LgorICAgICAqLworICAgIHZpcnR1YWwgQU1lZGlhRm9ybWF0KiBnZXRGaWxlRm9ybWF0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRyYWNrcyBpbiB0aGUgbWVkaWEgY29udGFpbmVyLgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0cmFja3MuCisgICAgICovCisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lZGlhIGZvcm1hdCBvZiBhIHNwZWNpZmljIHRyYWNrIGFzIGEgQU1lZGlhRm9ybWF0LgorICAgICAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgZm9ybWF0IHdoZW4gZmluaXNoZWQgd2l0aCBpdCB1c2luZworICAgICAqIEFNZWRpYUZvcm1hdF9kZWxldGUoKS4KKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCBUaGUgdHJhY2sgaW5kZXggKHplcm8tYmFzZWQpLgorICAgICAqIEByZXR1cm4gVGhlIHRyYWNrIG1lZGlhIGZvcm1hdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEFNZWRpYUZvcm1hdCogZ2V0VHJhY2tGb3JtYXQoaW50IHRyYWNrSW5kZXgpID0gMDsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCBhIHRyYWNrIGZvciBzYW1wbGUgYWNjZXNzLiBUcmFja3MgbXVzdCBiZSBzZWxlY3RlZCBpbiBvcmRlciBmb3Igc2FtcGxlIGluZm9ybWF0aW9uIGFuZAorICAgICAqIHNhbXBsZSBkYXRhIHRvIGJlIGF2YWlsYWJsZSBmb3IgdGhhdCB0cmFjay4gU2FtcGxlcyBmb3Igc2VsZWN0ZWQgdHJhY2tzIG11c3QgYmUgYWNjZXNzZWQgb24KKyAgICAgKiBpdHMgb3duIHRocmVhZCB0byBhdm9pZCBibG9ja2luZyBvdGhlciB0cmFja3MuCisgICAgICogQHBhcmFtIHRyYWNrSW5kZXggVGhlIHRyYWNrIHRvIHNlbGVjdC4KKyAgICAgKiBAcmV0dXJuIEFNRURJQV9PSyBvbiBzdWNjZXNzLgorICAgICAqLworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc2VsZWN0VHJhY2soaW50IHRyYWNrSW5kZXgpID0gMDsKKworICAgIC8qKgorICAgICAqIFRvZ2dsZXMgc2VxdWVudGlhbCBhY2Nlc3MgZW5mb3JjZW1lbnQgb24gb3Igb2ZmLiBXaGVuIHRoZSByZWFkZXIgZW5mb3JjZXMgc2VxdWVudGlhbCBhY2Nlc3MKKyAgICAgKiBjYWxscyB0byByZWFkIHNhbXBsZSBpbmZvcm1hdGlvbiB3aWxsIGJsb2NrIHVubGVzcyB0aGUgdW5kZXJseWluZyBleHRyYWN0b3IgcG9pbnRzIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCB0cmFjay4KKyAgICAgKiBAcGFyYW0gZW5mb3JjZSBUcnVlIHRvIGVuZm9yY2Ugc2VxdWVudGlhbCBhY2Nlc3MuCisgICAgICogQHJldHVybiBBTUVESUFfT0sgb24gc3VjY2Vzcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKGJvb2wgZW5mb3JjZSkgPSAwOworCisgICAgLyoqCisgICAgICogRXN0aW1hdGVzIHRoZSBiaXRyYXRlIG9mIGEgc291cmNlIHRyYWNrIGJ5IHNhbXBsaW5nIHNhbXBsZSBzaXplcy4gVGhlIGJpdHJhdGUgaXMgcmV0dXJuZWQgaW4KKyAgICAgKiBtZWdhYml0cyBwZXIgc2Vjb25kIChNYnBzKS4gVGhpcyBtZXRob2Qgd2lsbCBmYWlsIGlmIHRoZSB0cmFjayBvbmx5IGNvbnRhaW5zIGEgc2luZ2xlIHNhbXBsZQorICAgICAqIGFuZCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgZHVyYXRpb24uCisgICAgICogQHBhcmFtIHRyYWNrSW5kZXggVGhlIHNvdXJjZSB0cmFjayBpbmRleC4KKyAgICAgKiBAcGFyYW0gYml0cmF0ZSBPdXRwdXQgcGFyYW0gZm9yIHRoZSBiaXRyYXRlLgorICAgICAqIEByZXR1cm4gQU1FRElBX09LIG9uIHN1Y2Nlc3MuCisgICAgICovCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRFc3RpbWF0ZWRCaXRyYXRlRm9yVHJhY2soaW50IHRyYWNrSW5kZXgsIGludDMyX3QqIGJpdHJhdGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2FtcGxlIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBzYW1wbGUgaW4gdGhlIHNwZWNpZmllZCB0cmFjay4gTm90ZSB0aGF0IHRoaXMKKyAgICAgKiBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCB0aGUgcmVhZGVyIGFkdmFuY2VzIHRvIGEgc2FtcGxlIGJlbG9uZ2luZyB0byB0aGUgcmVxdWVzdGVkIHRyYWNrIGlmCisgICAgICogdGhlIHJlYWRlciBpcyBpbiBzZXF1ZW50aWFsIGFjY2VzcyBtb2RlLgorICAgICAqIEBwYXJhbSB0cmFja0luZGV4IFRoZSB0cmFjayBpbmRleCAoemVyby1iYXNlZCkuCisgICAgICogQHBhcmFtIGluZm8gUG9pbnRlciB0byBhIE1lZGlhU2FtcGxlSW5mbyBvYmplY3Qgd2hlcmUgdGhlIHNhbXBsZSBpbmZvcm1hdGlvbiBpcyB3cml0dGVuLgorICAgICAqIEByZXR1cm4gQU1FRElBX09LIG9uIHN1Y2Nlc3MsIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNIGlmIHRoZXJlIGFyZSBubyBtb3JlIHNhbXBsZXMgdG8gcmVhZAorICAgICAqIGZyb20gdGhlIHRyYWNrIGFuZCBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgaWYgdHJhY2tJbmRleCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZQorICAgICAqIGluZm8gcG9pbnRlciBpcyBOVUxMLiBPdGhlciBBTUVESUFfRVJST1JfKiByZXR1cm4gdmFsdWVzIG1heSBub3QgYmUgcmVjb3ZlcmFibGUuCisgICAgICovCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRTYW1wbGVJbmZvRm9yVHJhY2soaW50IHRyYWNrSW5kZXgsIE1lZGlhU2FtcGxlSW5mbyogaW5mbykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2FtcGxlIGRhdGEgZm9yIHRoZSBjdXJyZW50IHNhbXBsZSBpbiB0aGUgc3BlY2lmaWVkIHRyYWNrIGludG8gdGhlIHN1cHBsaWVkCisgICAgICogYnVmZmVyLiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCB0aGUgcmVhZGVyIGFkdmFuY2VzIHRvIGEgc2FtcGxlIGJlbG9uZ2luZyB0bworICAgICAqIHRoZSByZXF1ZXN0ZWQgdHJhY2sgaWYgdGhlIHJlYWRlciBpcyBpbiBzZXF1ZW50aWFsIGFjY2VzcyBtb2RlLiBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuIHRoaXMKKyAgICAgKiBtZXRob2Qgd2lsbCBhbHNvIGFkdmFuY2UgdGhlIHNwZWNpZmllZCB0cmFjayB0byB0aGUgbmV4dCBzYW1wbGUuCisgICAgICogQHBhcmFtIHRyYWNrSW5kZXggVGhlIHRyYWNrIGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgdG8gd3JpdGUgdGhlIHNhbXBsZSdzIGRhdGEgdG8uCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemUgVGhlIHNpemUgb2YgdGhlIHN1cHBsaWVkIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIEFNRURJQV9PSyBvbiBzdWNjZXNzLCBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBzYW1wbGVzIHRvIHJlYWQKKyAgICAgKiBmcm9tIHRoZSB0cmFjayBhbmQgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSIGlmIHRyYWNrSW5kZXggaXMgb3V0IG9mIGJvdW5kcywgaWYgdGhlCisgICAgICogYnVmZmVyIHBvaW50ZXIgaXMgTlVMTCBvciBpZiBidWZmZXJTaXplIGlzIHRvbyBzbWFsbCBmb3IgdGhlIHNhbXBsZS4gT3RoZXIgQU1FRElBX0VSUk9SXyoKKyAgICAgKiByZXR1cm4gdmFsdWVzIG1heSBub3QgYmUgcmVjb3ZlcmFibGUuCisgICAgICovCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkU2FtcGxlRGF0YUZvclRyYWNrKGludCB0cmFja0luZGV4LCB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBZHZhbmNlIHRoZSBzcGVjaWZpZWQgdHJhY2sgdG8gdGhlIG5leHQgc2FtcGxlLiBJZiB0aGUgcmVhZGVyIGlzIGluIHNlcXVlbnRpYWwgYWNjZXNzIG1vZGUKKyAgICAgKiBhbmQgdGhlIGN1cnJlbnQgc2FtcGxlIGJlbG9uZ3MgdG8gdGhlIHNwZWNpZmllZCB0cmFjaywgdGhlIHJlYWRlciB3aWxsIGFsc28gYWR2YW5jZSB0byB0aGUKKyAgICAgKiBuZXh0IHNhbXBsZSBhbmQgd2FrZSB1cCBhbnkgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBuZXcgdHJhY2suCisgICAgICogQHBhcmFtIHRyYWNrSW5kZXggVGhlIHRyYWNrIGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZVRyYWNrKGludCB0cmFja0luZGV4KSA9IDA7CisKKyAgICAvKiogRGVzdHJ1Y3Rvci4gKi8KKyAgICB2aXJ0dWFsIH5NZWRpYVNhbXBsZVJlYWRlcigpID0gZGVmYXVsdDsKKworICAgIC8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgICBNZWRpYVNhbXBsZVJlYWRlcigpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBNZWRpYVNhbXBsZVJlYWRlcihjb25zdCBNZWRpYVNhbXBsZVJlYWRlciYpID0gZGVsZXRlOworICAgIE1lZGlhU2FtcGxlUmVhZGVyJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFTYW1wbGVSZWFkZXImKSA9IGRlbGV0ZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfU0FNUExFX1JFQURFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZVJlYWRlck5ESy5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDMyZGVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9TQU1QTEVfUkVBREVSX05ES19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfU0FNUExFX1JFQURFUl9OREtfSAorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBNZWRpYVNhbXBsZVJlYWRlck5ESyBpcyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNZWRpYVNhbXBsZVJlYWRlciBpbnRlcmZhY2UgYmFzZWQgb24gdGhlCisgKiBtZWRpYSBOREsgZXh0cmFjdG9yLgorICovCitjbGFzcyBNZWRpYVNhbXBsZVJlYWRlck5ESyA6IHB1YmxpYyBNZWRpYVNhbXBsZVJlYWRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBNZWRpYVNhbXBsZVJlYWRlck5ESyBpbnN0YW5jZSB3cmFwcGVkIGluIGEgc2hhcmVkIHBvaW50ZXIuCisgICAgICogQHBhcmFtIGZkIFNvdXJjZSBmaWxlIGRlc2NyaXB0b3IuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIGZkIGFuZCBpdCBpcyBzYWZlCisgICAgICogICAgICAgICAgIHRvIGRvIHNvIHdoZW4gdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFNvdXJjZSBkYXRhIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gc2l6ZSBTb3VyY2UgZGF0YSBzaXplLgorICAgICAqIEByZXR1cm4gQSBzaGFyZWQgcG9pbnRlciByZWZlcmVuY2luZyB0aGUgbmV3IE1lZGlhU2FtcGxlUmVhZGVyTkRLIGluc3RhbmNlIG9uIHN1Y2Nlc3MsIG9yIGFuCisgICAgICogICAgICAgICBlbXB0eSBzaGFyZWQgcG9pbnRlciBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBjcmVhdGVGcm9tRmQoaW50IGZkLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBBTWVkaWFGb3JtYXQqIGdldEZpbGVGb3JtYXQoKSBvdmVycmlkZTsKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICAgIEFNZWRpYUZvcm1hdCogZ2V0VHJhY2tGb3JtYXQoaW50IHRyYWNrSW5kZXgpIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IHNlbGVjdFRyYWNrKGludCB0cmFja0luZGV4KSBvdmVycmlkZTsKKyAgICBtZWRpYV9zdGF0dXNfdCBzZXRFbmZvcmNlU2VxdWVudGlhbEFjY2Vzcyhib29sIGVuZm9yY2UpIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IGdldEVzdGltYXRlZEJpdHJhdGVGb3JUcmFjayhpbnQgdHJhY2tJbmRleCwgaW50MzJfdCogYml0cmF0ZSkgb3ZlcnJpZGU7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0U2FtcGxlSW5mb0ZvclRyYWNrKGludCB0cmFja0luZGV4LCBNZWRpYVNhbXBsZUluZm8qIGluZm8pIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IHJlYWRTYW1wbGVEYXRhRm9yVHJhY2soaW50IHRyYWNrSW5kZXgsIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplKSBvdmVycmlkZTsKKyAgICB2b2lkIGFkdmFuY2VUcmFjayhpbnQgdHJhY2tJbmRleCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIH5NZWRpYVNhbXBsZVJlYWRlck5ESygpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFNhbXBsZVBvc2l0aW9uIGRlc2NyaWJlcyB0aGUgcG9zaXRpb24gb2YgYSBzaW5nbGUgc2FtcGxlIGluIHRoZSBtZWRpYSBmaWxlIHVzaW5nIGl0cworICAgICAqIHRpbWVzdGFtcCBhbmQgaW5kZXggaW4gdGhlIGZpbGUuCisgICAgICovCisgICAgc3RydWN0IFNhbXBsZVBvc2l0aW9uIHsKKyAgICAgICAgdWludDY0X3QgaW5kZXggPSAwOworICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcFVzID0gMDsKKyAgICAgICAgYm9vbCBpc1NldCA9IGZhbHNlOworCisgICAgICAgIHZvaWQgc2V0KHVpbnQ2NF90IHNhbXBsZUluZGV4LCBpbnQ2NF90IHNhbXBsZVRpbWVVcykgeworICAgICAgICAgICAgaW5kZXggPSBzYW1wbGVJbmRleDsKKyAgICAgICAgICAgIHRpbWVTdGFtcFVzID0gc2FtcGxlVGltZVVzOworICAgICAgICAgICAgaXNTZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNldCgpIHsgaXNTZXQgPSBmYWxzZTsgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBTYW1wbGVDdXJzb3Iga2VlcHMgdHJhY2sgb2YgdGhlIHNhbXBsZSBwb3NpdGlvbiBmb3IgYSBzcGVjaWZpYyB0cmFjay4gV2hlbiB0aGUgdHJhY2sgaXMKKyAgICAgKiBhZHZhbmNlZCwgcHJldmlvdXMgaXMgc2V0IHRvIGN1cnJlbnQsIGN1cnJlbnQgdG8gbmV4dCBhbmQgbmV4dCBpcyByZXNldC4gQXMgdGhlIGV4dHJhY3RvcgorICAgICAqIGFkdmFuY2VzIG92ZXIgdGhlIGNvbWJpbmVkIHRpbWVsaW5lIG9mIHRyYWNrcywgaXQgdXBkYXRlcyBjdXJyZW50IGFuZCBuZXh0IGZvciB0aGUgdHJhY2sgaXQKKyAgICAgKiBwb2ludHMgdG8gaWYgdGhleSBhcmUgbm90IGFscmVhZHkgc2V0LgorICAgICAqLworICAgIHN0cnVjdCBTYW1wbGVDdXJzb3IgeworICAgICAgICBTYW1wbGVQb3NpdGlvbiBwcmV2aW91czsKKyAgICAgICAgU2FtcGxlUG9zaXRpb24gY3VycmVudDsKKyAgICAgICAgU2FtcGxlUG9zaXRpb24gbmV4dDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBNZWRpYVNhbXBsZVJlYWRlck5ESyBvYmplY3QgZnJvbSBhbiBBTWVkaWFFeHRyYWN0b3IuIFRoZSBleHRyYWN0b3IgbmVlZHMgdG8gYmUKKyAgICAgKiBpbml0aWFsaXplZCB3aXRoIGEgdmFsaWQgZGF0YSBzb3VyY2UgYmVmb3JlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIGEgTWVkaWFTYW1wbGVSZWFkZXJOREsuCisgICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgaW5pdGlhbGl6ZWQgbWVkaWEgZXh0cmFjdG9yLgorICAgICAqLworICAgIE1lZGlhU2FtcGxlUmVhZGVyTkRLKEFNZWRpYUV4dHJhY3RvciogZXh0cmFjdG9yKTsKKworICAgIC8qKiBBZHZhbmNlcyB0aGUgdHJhY2sgdG8gbmV4dCBzYW1wbGUuICovCisgICAgdm9pZCBhZHZhbmNlVHJhY2tfbChpbnQgdHJhY2tJbmRleCk7CisKKyAgICAvKiogQWR2YW5jZXMgdGhlIGV4dHJhY3RvciB0byBuZXh0IHNhbXBsZS4gKi8KKyAgICBib29sIGFkdmFuY2VFeHRyYWN0b3JfbCgpOworCisgICAgLyoqIE1vdmVzIHRoZSBleHRyYWN0b3IgYmFja3dhcmRzIHRvIHRoZSBzcGVjaWZpZWQgc2FtcGxlLiAqLworICAgIG1lZGlhX3N0YXR1c190IHNlZWtFeHRyYWN0b3JCYWNrd2FyZHNfbChpbnQ2NF90IHRhcmdldFRpbWVVcywgaW50IHRhcmdldFRyYWNrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRhcmdldFNhbXBsZUluZGV4KTsKKworICAgIC8qKiBNb3ZlcyB0aGUgZXh0cmFjdG9yIHRvIHRoZSBzcGVjaWZpZWQgc2FtcGxlLiAqLworICAgIG1lZGlhX3N0YXR1c190IG1vdmVUb1NhbXBsZV9sKFNhbXBsZVBvc2l0aW9uJiBwb3MsIGludCB0cmFja0luZGV4KTsKKworICAgIC8qKiBNb3ZlcyB0aGUgZXh0cmFjdG9yIHRvIHRoZSBuZXh0IHNhbXBsZSBvZiB0aGUgc3BlY2lmaWVkIHRyYWNrLiAqLworICAgIG1lZGlhX3N0YXR1c190IG1vdmVUb1RyYWNrX2woaW50IHRyYWNrSW5kZXgpOworCisgICAgLyoqIEluIHNlcXVlbnRpYWwgbW9kZSwgd2FpdHMgZm9yIHRoZSBleHRyYWN0b3IgdG8gcmVhY2ggdGhlIG5leHQgc2FtcGxlIGZvciB0aGUgdHJhY2suICovCisgICAgbWVkaWFfc3RhdHVzX3Qgd2FpdEZvclRyYWNrX2woaW50IHRyYWNrSW5kZXgsIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4mIGxvY2tIZWxkKTsKKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhlIGV4dHJhY3RvciBpcyByZWFkeSBmb3IgdGhlIG5leHQgc2FtcGxlIG9mIHRoZSB0cmFjayByZWdhcmRsZXNzIG9mIGFjY2VzcyBtb2RlLgorICAgICAqLworICAgIG1lZGlhX3N0YXR1c190IHByaW1lRXh0cmFjdG9yRm9yVHJhY2tfbChpbnQgdHJhY2tJbmRleCwgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiYgbG9ja0hlbGQpOworCisgICAgQU1lZGlhRXh0cmFjdG9yKiBtRXh0cmFjdG9yID0gbnVsbHB0cjsKKyAgICBzdGQ6Om11dGV4IG1FeHRyYWN0b3JNdXRleDsKKyAgICBjb25zdCBzaXplX3QgbVRyYWNrQ291bnQ7CisKKyAgICBpbnQgbUV4dHJhY3RvclRyYWNrSW5kZXggPSAtMTsKKyAgICB1aW50NjRfdCBtRXh0cmFjdG9yU2FtcGxlSW5kZXggPSAwOworCisgICAgYm9vbCBtRW9zUmVhY2hlZCA9IGZhbHNlOworICAgIGJvb2wgbUVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzID0gZmFsc2U7CisKKyAgICAvLyBNYXBzIHNlbGVjdGVkIHRyYWNrIGluZGljZXMgdG8gY29uZGl0aW9uIHZhcmlhYmxlcyBmb3Igc2VxdWVudGlhbCBzYW1wbGUgYWNjZXNzIGNvbnRyb2wuCisgICAgc3RkOjptYXA8aW50LCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZT4gbVRyYWNrU2lnbmFsczsKKworICAgIC8vIFNhbXBsZXMgY3Vyc29yIGZvciBlYWNoIHRyYWNrIGluIHRoZSBmaWxlLgorICAgIHN0ZDo6dmVjdG9yPFNhbXBsZUN1cnNvcj4gbVRyYWNrQ3Vyc29yczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfU0FNUExFX1JFQURFUl9OREtfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVXcml0ZXIuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhU2FtcGxlV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwZjJiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhU2FtcGxlV3JpdGVyLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfU0FNUExFX1dSSVRFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfU0FNUExFX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogTXV4ZXIgaW50ZXJmYWNlIHVzZWQgYnkgTWVkaWFTYW1wbGVXcml0ZXIuCisgKiBNZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBzZXF1ZW50aWFsbHkgYnkgTWVkaWFTYW1wbGVXcml0ZXIuCisgKi8KK2NsYXNzIE1lZGlhU2FtcGxlV3JpdGVyTXV4ZXJJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgdHJhY2sgdG8gdGhlIG11eGVyLgorICAgICAqIEBwYXJhbSB0cmFja0Zvcm1hdCBGb3JtYXQgb2YgdGhlIG5ldyB0cmFjay4KKyAgICAgKiBAcmV0dXJuIEEgbm9uLW5lZ2F0aXZlIHRyYWNrIGluZGV4IG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgICAgICovCisgICAgdmlydHVhbCBzc2l6ZV90IGFkZFRyYWNrKEFNZWRpYUZvcm1hdCogdHJhY2tGb3JtYXQpID0gMDsKKworICAgIC8qKiBTdGFydHMgdGhlIG11eGVyLiAqLworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgLyoqCisgICAgICogV3JpdGVzIHNhbXBsZSBkYXRhIHRvIGEgcHJldmlvdXNseSBhZGRlZCB0cmFjay4KKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCBJbmRleCBvZiB0aGUgdHJhY2sgdGhlIHNhbXBsZSBkYXRhIGJlbG9uZ3MgdG8uCisgICAgICogQHBhcmFtIGRhdGEgVGhlIHNhbXBsZSBkYXRhLgorICAgICAqIEBwYXJhbSBpbmZvIFRoZSBzYW1wbGUgaW5mb3JtYXRpb24uCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgICovCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB3cml0ZVNhbXBsZURhdGEoc2l6ZV90IHRyYWNrSW5kZXgsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQU1lZGlhQ29kZWNCdWZmZXJJbmZvKiBpbmZvKSA9IDA7CisKKyAgICAvKiogU3RvcHMgdGhlIG11eGVyLiAqLworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpID0gMDsKKyAgICB2aXJ0dWFsIH5NZWRpYVNhbXBsZVdyaXRlck11eGVySW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBNZWRpYVNhbXBsZVdyaXRlciBpcyBhIHdyYXBwZXIgYXJvdW5kIGEgbXV4ZXIuIFRoZSBzYW1wbGUgd3JpdGVyIHB1dHMgc2FtcGxlcyBvbiBhIHF1ZXVlIHRoYXQKKyAqIGlzIHNlcnZpY2VkIGJ5IGFuIGludGVybmFsIHRocmVhZCB0byBtaW5pbWl6ZSBibG9ja2luZyB0aW1lIGZvciBjbGllbnRzLiBNZWRpYVNhbXBsZVdyaXRlciBhbHNvCisgKiBwcm92aWRlcyBwcm9ncmVzcyByZXBvcnRpbmcuIFRoZSBkZWZhdWx0IG11eGVyIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZAorICogZGlyZWN0bHkgb24gQU1lZGlhTXV4ZXIuCisgKi8KK2NsYXNzIE1lZGlhU2FtcGxlV3JpdGVyIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8TWVkaWFTYW1wbGVXcml0ZXI+IHsKK3B1YmxpYzoKKyAgICAvKiogRnVuY3Rpb24gcHJvdG90eXBlIGZvciBkZWxpdmVyaW5nIG1lZGlhIHNhbXBsZXMgdG8gdGhlIHdyaXRlci4gKi8KKyAgICB1c2luZyBNZWRpYVNhbXBsZUNvbnN1bWVyRnVuY3Rpb24gPQorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSk+OworCisgICAgLyoqIENhbGxiYWNrIGludGVyZmFjZS4gKi8KKyAgICBjbGFzcyBDYWxsYmFja0ludGVyZmFjZSB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogU2FtcGxlIHdyaXRlciBmaW5pc2hlZC4gVGhlIGZpbmlzaGVkIGNhbGxiYWNrIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHRoZSBzYW1wbGUgd3JpdGVyIGhhcworICAgICAgICAgKiBiZWVuIHN1Y2Nlc3NmdWxseSBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRmluaXNoZWQoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXIqIHdyaXRlciwgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzKSA9IDA7CisKKyAgICAgICAgLyoqIFNhbXBsZSB3cml0ZXIgd2FzIHN0b3BwZWQgYmVmb3JlIGl0IHdhcyBmaW5pc2hlZC4gKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uU3RvcHBlZChjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyKSA9IDA7CisKKyAgICAgICAgLyoqIFNhbXBsZSB3cml0ZXIgcHJvZ3Jlc3MgdXBkYXRlIGluIHBlcmNlbnQuICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblByb2dyZXNzVXBkYXRlKGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyKiB3cml0ZXIsIGludDMyX3QgcHJvZ3Jlc3MpID0gMDsKKworICAgICAgICB2aXJ0dWFsIH5DYWxsYmFja0ludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gQ3JlYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgc2FtcGxlIHdyaXRlciB3aXRoIGl0cyBkZWZhdWx0IG11eGVyIGltcGxlbWVudGF0aW9uLiBNZWRpYVNhbXBsZVdyaXRlciBuZWVkcworICAgICAqIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSB0cmFja3MgYXJlIGFkZGVkIGFuZCBjYW4gb25seSBiZSBpbml0aWFsaXplZCBvbmNlLgorICAgICAqIEBwYXJhbSBmZCBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0by4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGlzCisgICAgICogICAgICAgIGZpbGUgZGVzY3JpcHRvciBhbmQgaXQgaXMgc2FmZSB0byBkbyBzbyBvbmNlIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICogQHBhcmFtIGNhbGxiYWNrcyBDbGllbnQgY2FsbGJhY2sgb2JqZWN0IHRoYXQgZ2V0cyBjYWxsZWQgYnkgdGhlIHNhbXBsZSB3cml0ZXIuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB3cml0ZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICBib29sIGluaXQoaW50IGZkLCBjb25zdCBzdGQ6OndlYWtfcHRyPENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2tzIC8qIG5vbm51bGwgKi8pOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIHNhbXBsZSB3cml0ZXIgd2l0aCBhIGN1c3RvbSBtdXhlciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uCisgICAgICogQHBhcmFtIG11eGVyIFRoZSBjdXN0b20gbXV4ZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBAcGFyYW0gY2FsbGJhY2tzIENsaWVudCBjYWxsYmFjayBvYmplY3QgdGhhdCBnZXRzIGNhbGxlZCBieSB0aGUgc2FtcGxlIHdyaXRlci4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHdyaXRlciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLgorICAgICAqLworICAgIGJvb2wgaW5pdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXJNdXhlckludGVyZmFjZT4mIG11eGVyIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYWxsYmFja3MgLyogbm9ubnVsbCAqLyk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IHRyYWNrIHRvIHRoZSBzYW1wbGUgd3JpdGVyLiBUcmFja3MgbXVzdCBiZSBhZGRlZCBhZnRlciB0aGUgc2FtcGxlIHdyaXRlciBoYXMgYmVlbgorICAgICAqIGluaXRpYWxpemVkIGFuZCBiZWZvcmUgaXQgaXMgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gdHJhY2tGb3JtYXQgVGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdG8gYWRkLgorICAgICAqIEByZXR1cm4gQSBzYW1wbGUgY29uc3VtZXIgdG8gYWRkIHNhbXBsZXMgdG8gaWYgdGhlIHRyYWNrIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIG9yIG51bGxwdHIKKyAgICAgKiBpZiB0aGUgdHJhY2sgY291bGQgbm90IGJlIGFkZGVkLgorICAgICAqLworICAgIE1lZGlhU2FtcGxlQ29uc3VtZXJGdW5jdGlvbiBhZGRUcmFjaygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+JiB0cmFja0Zvcm1hdCAvKiBub25udWxsICovKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgc2FtcGxlIHdyaXRlci4gVGhlIHNhbXBsZSB3cml0ZXIgd2lsbCBzdGFydCBwcm9jZXNzaW5nIHNhbXBsZXMgYW5kIHdyaXRpbmcgdGhlbSB0bworICAgICAqIGl0cyBtdXhlciBvbiBhbiBpbnRlcm5hbCB0aHJlYWQuIE1lZGlhU2FtcGxlV3JpdGVyIGNhbiBvbmx5IGJlIHN0YXJ0ZWQgb25jZS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNhbXBsZSB3cml0ZXIgd2FzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLgorICAgICAqLworICAgIGJvb2wgc3RhcnQoKTsKKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzYW1wbGUgd3JpdGVyLiBJZiB0aGUgc2FtcGxlIHdyaXRlciBpcyBub3QgeWV0IGZpbmlzaGVkLCBpdHMgb3BlcmF0aW9uIHdpbGwgYmUKKyAgICAgKiBhYm9ydGVkIGFuZCB0aGUgb25TdG9wcGVkIGNhbGxiYWNrIHdpbGwgZmlyZS4gSWYgdGhlIHNhbXBsZSB3cml0ZXIgaGFzIGFscmVhZHkgZmluaXNoZWQgYW5kCisgICAgICogdGhlIG9uRmluaXNoZWQgY2FsbGJhY2sgaGFzIGZpcmVkIHRoZSB3cml0ZXIgaGFzIGFscmVhZHkgYXV0b21hdGljYWxseSBzdG9wcGVkIGFuZCB0aGVyZSBpcworICAgICAqIG5vIG5lZWQgdG8gY2FsbCBzdG9wIG1hbnVhbGx5LiBPbmNlIHRoZSBzYW1wbGUgd3JpdGVyIGhhcyBiZWVuIHN0b3BwZWQgaXQgY2Fubm90IGJlCisgICAgICogcmVzdGFydGVkLiBUaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMgYW5kIHdpbGwgbm90IHdhaXQgZm9yIHRoZSBzYW1wbGUgd3JpdGVyIHRvIHN0b3AgYmVmb3JlCisgICAgICogcmV0dXJuaW5nLgorICAgICAqLworICAgIHZvaWQgc3RvcCgpOworCisgICAgLyoqIERlc3RydWN0b3IuICovCisgICAgfk1lZGlhU2FtcGxlV3JpdGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFRyYWNrUmVjb3JkIHsKKyAgICAgICAgVHJhY2tSZWNvcmQoaW50NjRfdCBkdXJhdGlvblVzKQorICAgICAgICAgICAgICA6IG1EdXJhdGlvblVzKGR1cmF0aW9uVXMpLAorICAgICAgICAgICAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcygwKSwKKyAgICAgICAgICAgICAgICBtUHJldlNhbXBsZVRpbWVVcyhJTlQ2NF9NSU4pLAorICAgICAgICAgICAgICAgIG1GaXJzdFNhbXBsZVRpbWVTZXQoZmFsc2UpLAorICAgICAgICAgICAgICAgIG1SZWFjaGVkRW9zKGZhbHNlKXt9OworCisgICAgICAgIFRyYWNrUmVjb3JkKCkgOiBUcmFja1JlY29yZCgwKXt9OworCisgICAgICAgIGludDY0X3QgbUR1cmF0aW9uVXM7CisgICAgICAgIGludDY0X3QgbUZpcnN0U2FtcGxlVGltZVVzOworICAgICAgICBpbnQ2NF90IG1QcmV2U2FtcGxlVGltZVVzOworICAgICAgICBib29sIG1GaXJzdFNhbXBsZVRpbWVTZXQ7CisgICAgICAgIGJvb2wgbVJlYWNoZWRFb3M7CisgICAgfTsKKworICAgIC8vIFRyYWNrIGluZGV4IGFuZCBzYW1wbGUuCisgICAgdXNpbmcgU2FtcGxlRW50cnkgPSBzdGQ6OnBhaXI8c2l6ZV90LCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+PjsKKworICAgIHN0cnVjdCBTYW1wbGVDb21wYXJhdG9yIHsKKyAgICAgICAgLy8gUmV0dXJuIHRydWUgaWYgbGhzIHNob3VsZCBjb21lIGFmdGVyIHJocyBpbiB0aGUgc2FtcGxlIHF1ZXVlLgorICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgU2FtcGxlRW50cnkmIGxocywgY29uc3QgU2FtcGxlRW50cnkmIHJocykgeworICAgICAgICAgICAgY29uc3QgYm9vbCBsaHNFb3MgPSBsaHMuc2Vjb25kLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgcmhzRW9zID0gcmhzLnNlY29uZC0+aW5mby5mbGFncyAmIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgICAgIGlmIChsaHNFb3MgJiYgIXJoc0VvcykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghbGhzRW9zICYmIHJoc0VvcykgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGhzRW9zICYmIHJoc0VvcykgeworICAgICAgICAgICAgICAgIHJldHVybiBsaHMuZmlyc3QgPiByaHMuZmlyc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBsaHMuc2Vjb25kLT5pbmZvLnByZXNlbnRhdGlvblRpbWVVcyA+IHJocy5zZWNvbmQtPmluZm8ucHJlc2VudGF0aW9uVGltZVVzOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0ZDo6d2Vha19wdHI8Q2FsbGJhY2tJbnRlcmZhY2U+IG1DYWxsYmFja3M7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyTXV4ZXJJbnRlcmZhY2U+IG1NdXhlcjsKKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OyAgLy8gUHJvdGVjdHMgc2FtcGxlIHF1ZXVlIGFuZCBzdGF0ZS4KKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtU2FtcGxlU2lnbmFsOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzaXplX3QsIFRyYWNrUmVjb3JkPiBtVHJhY2tzOworICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8U2FtcGxlRW50cnksIHN0ZDo6dmVjdG9yPFNhbXBsZUVudHJ5PiwgU2FtcGxlQ29tcGFyYXRvcj4gbVNhbXBsZVF1ZXVlCisgICAgICAgICAgICBHVUFSREVEX0JZKG1NdXRleCk7CisKKyAgICBlbnVtIDogaW50IHsKKyAgICAgICAgVU5JTklUSUFMSVpFRCwKKyAgICAgICAgSU5JVElBTElaRUQsCisgICAgICAgIFNUQVJURUQsCisgICAgICAgIFNUT1BQRUQsCisgICAgfSBtU3RhdGUgR1VBUkRFRF9CWShtTXV0ZXgpOworCisgICAgTWVkaWFTYW1wbGVXcml0ZXIoKSA6IG1TdGF0ZShVTklOSVRJQUxJWkVEKXt9OworICAgIHZvaWQgYWRkU2FtcGxlVG9UcmFjayhzaXplX3QgdHJhY2tJbmRleCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKTsKKyAgICBtZWRpYV9zdGF0dXNfdCB3cml0ZVNhbXBsZXMoYm9vbCogd2FzU3RvcHBlZCk7CisgICAgbWVkaWFfc3RhdHVzX3QgcnVuV3JpdGVyTG9vcChib29sKiB3YXNTdG9wcGVkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfU0FNUExFX1dSSVRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrVHJhbnNjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjRiOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXIuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFDS19UUkFOU0NPREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFDS19UUkFOU0NPREVSX0gKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0cmFjayB0cmFuc2NvZGVycy4gTWVkaWFUcmFja1RyYW5zY29kZXIgb3BlcmF0ZXMgYXN5bmNocm9ub3VzbHkgb24gYW4gaW50ZXJuYWwKKyAqIHRocmVhZCBhbmQgY29tbXVuaWNhdGVzIHRocm91Z2ggYSBNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrIGluc3RhbmNlLiBUcmFuc2NvZGVkIHNhbXBsZXMgYXJlCisgKiBlbnF1ZXVlZCBvbiB0aGUgTWVkaWFUcmFja1RyYW5zY29kZXIncyBvdXRwdXQgcXVldWUuIFNhbXBsZXMgbmVlZCB0byBiZSBkZXF1ZXVlZCBmcm9tIHRoZSBvdXRwdXQKKyAqIHF1ZXVlIG9yIHRoZSB0cmFuc2NvZGVyIHdpbGwgcnVuIG91dCBvZiBidWZmZXJzIGFuZCBzdGFsbC4gT25jZSB0aGUgY29uc3VtZXIgaXMgZG9uZSB3aXRoIGEKKyAqIHRyYW5zY29kZWQgc2FtcGxlIGl0IGlzIHRoZSBjb25zdW1lcidzIHJlc3BvbnNpYmlsaXR5IHRvIGFzIHNvb24gYXMgcG9zc2libGUgcmVsZWFzZSBhbGwKKyAqIHJlZmVyZW5jZXMgdG8gdGhhdCBzYW1wbGUgaW4gb3JkZXIgdG8gcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIHRyYW5zY29kZXIuIE1lZGlhVHJhY2tUcmFuc2NvZGVyCisgKiBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIHRocm91Z2ggb25lIG9mIHRoZSBjb25jcmV0ZSBzdWJjbGFzc2VzLgorICoKKyAqIFRoZSBiYXNlIGNsYXNzIE1lZGlhVHJhY2tUcmFuc2NvZGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0aHJlYWQgYW5kIHN0YXRlIG1hbmFnZW1lbnQgYW5kIGd1YXJhbnRlZXMKKyAqIHRoYXQgb3BlcmF0aW9ucyB7Y29uZmlndXJlLCBzdGFydCwgc3RvcH0gYXJlIHNlbnQgdG8gdGhlIGRlcml2ZWQgY2xhc3MgaW4gY29ycmVjdCBvcmRlci4KKyAqIE1lZGlhVHJhY2tUcmFuc2NvZGVyIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGRlbGl2ZXJpbmcgY2FsbGJhY2sgbm90aWZpY2F0aW9ucyBvbmNlIHRoZQorICogdHJhbnNjb2RlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3RhcnRlZC4KKyAqLworY2xhc3MgTWVkaWFUcmFja1RyYW5zY29kZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgdGhlIHRyYWNrIHRyYW5zY29kZXIgd2l0aCBhbiBpbnB1dCBNZWRpYVNhbXBsZVJlYWRlciBhbmQgYSBkZXN0aW5hdGlvbiBmb3JtYXQuCisgICAgICogQSB0cmFjayB0cmFuc2NvZGVyIGhhdmUgdG8gYmUgY29uZmlndXJlZCBiZWZvcmUgaXQgaXMgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gbWVkaWFTYW1wbGVSZWFkZXIgVGhlIE1lZGlhU2FtcGxlUmVhZGVyIHRvIHJlYWQgaW5wdXQgc2FtcGxlcyBmcm9tLgorICAgICAqIEBwYXJhbSB0cmFja0luZGV4IFRoZSBpbmRleCBvZiB0aGUgdHJhY2sgdG8gdHJhbnNjb2RlIGluIG1lZGlhU2FtcGxlUmVhZGVyLgorICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkZvcm1hdCBUaGUgZGVzdGluYXRpb24gZm9ybWF0LgorICAgICAqIEByZXR1cm4gQU1FRElBX09LIGlmIHRoZSB0cmFjayB0cmFuc2NvZGVyIHdhcyBzdWNjZXNzZnVsbHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBtZWRpYV9zdGF0dXNfdCBjb25maWd1cmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiYgbWVkaWFTYW1wbGVSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiYgZGVzdGluYXRpb25Gb3JtYXQpOworCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSB0cmFjayB0cmFuc2NvZGVyLiBBZnRlciB0aGUgdHJhY2sgdHJhbnNjb2RlciBpcyBzdWNjZXNzZnVsbHkgc3RhcnRlZCBpdCB3aWxsIHJ1bgorICAgICAqIHVudGlsIGEgY2FsbGJhY2sgc2lnbmFscyB0aGF0IHRyYW5zY29kaW5nIGhhcyBlbmRlZC4gU3RhcnQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB0cmFjayB0cmFuc2NvZGVyIHN0YXJ0ZWQsIG9yIGZhbHNlIGlmIGl0IGhhZCBhbHJlYWR5IGJlZW4gc3RhcnRlZC4KKyAgICAgKi8KKyAgICBib29sIHN0YXJ0KCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgdHJhY2sgdHJhbnNjb2Rlci4gT25jZSB0aGUgdHJhbnNjb2RpbmcgaGFzIGJlZW4gc3RvcHBlZCBpdCBjYW5ub3QgYmUgcmVzdGFydGVkCisgICAgICogYWdhaW4uIEl0IGlzIHNhZmUgdG8gY2FsbCBzdG9wIG11bHRpcGxlIHRpbWVzLiBTdG9wIGlzIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIE9uY2UgdGhlCisgICAgICogdHJhY2sgdHJhbnNjb2RlciBoYXMgc3RvcHBlZCB0aGUgb25UcmFja1N0b3BwZWQgY2FsbGJhY2sgd2lsbCBnZXQgY2FsbGVkLCB1bmxlc3MgdGhlCisgICAgICogdHJhbnNjb2RpbmcgZmluaXNoZWQgb3IgZW5jb3VudGVyZWQgYW4gZXJyb3IgYmVmb3JlIGl0IGNvdWxkIGJlIHN0b3BwZWQgaW4gd2hpY2ggY2FzZSB0aGUKKyAgICAgKiBjYWxsYmFja3MgY29ycmVzcG9uZGluZyB0byB0aG9zZSBldmVudHMgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZC4KKyAgICAgKiBAcGFyYW0gc3RvcE9uU3luY1NhbXBsZSBSZXF1ZXN0IHRoZSB0cmFuc2NvZGVyIHRvIHN0b3AgYWZ0ZXIgZW1pdHRpbmcgYSBzeW5jIHNhbXBsZS4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoYm9vbCBzdG9wT25TeW5jU2FtcGxlID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzYW1wbGUgY29uc3VtZXIgZnVuY3Rpb24uIFRoZSBNZWRpYVRyYWNrVHJhbnNjb2RlciB3aWxsIGRlbGl2ZXIgdHJhbnNjb2RlZCBzYW1wbGVzIHRvCisgICAgICogdGhpcyBmdW5jdGlvbi4gSWYgdGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyIGlzIHN0YXJ0ZWQgYmVmb3JlIGEgY29uc3VtZXIgaXMgc2V0IHRoZSB0cmFuc2NvZGVyCisgICAgICogd2lsbCBidWZmZXIgYSBsaW1pdGVkIG51bWJlciBvZiBzYW1wbGVzIGludGVybmFsbHkgYmVmb3JlIHN0YWxsaW5nLiBPbmNlIGEgY29uc3VtZXIgaGFzIGJlZW4KKyAgICAgKiBzZXQgdGhlIGludGVybmFsbHkgYnVmZmVyZWQgc2FtcGxlcyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgY29uc3VtZXIuCisgICAgICogQHBhcmFtIHNhbXBsZUNvbnN1bWVyIFRoZSBzYW1wbGUgY29uc3VtZXIgZnVuY3Rpb24uCisgICAgICovCisgICAgdm9pZCBzZXRTYW1wbGVDb25zdW1lcihjb25zdCBNZWRpYVNhbXBsZVdyaXRlcjo6TWVkaWFTYW1wbGVDb25zdW1lckZ1bmN0aW9uJiBzYW1wbGVDb25zdW1lcik7CisKKyAgICAvKioKKyAgICAgICogUmV0cmlldmVzIHRoZSB0cmFjayB0cmFuc2NvZGVyJ3MgZmluYWwgb3V0cHV0IGZvcm1hdC4gVGhlIG91dHB1dCBpcyBhdmFpbGFibGUgYWZ0ZXIgdGhlCisgICAgICAqIHRyYWNrIHRyYW5zY29kZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQuCisgICAgICAqIEByZXR1cm4gVGhlIHRyYWNrIG91dHB1dCBmb3JtYXQuCisgICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gZ2V0T3V0cHV0Rm9ybWF0KCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+TWVkaWFUcmFja1RyYW5zY29kZXIoKSA9IGRlZmF1bHQ7CisKK3Byb3RlY3RlZDoKKyAgICBNZWRpYVRyYWNrVHJhbnNjb2Rlcihjb25zdCBzdGQ6OndlYWtfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2s+JiB0cmFuc2NvZGVyQ2FsbGJhY2spCisgICAgICAgICAgOiBtVHJhbnNjb2RlckNhbGxiYWNrKHRyYW5zY29kZXJDYWxsYmFjayl7fTsKKworICAgIC8vIENhbGxlZCBieSBzdWJjbGFzc2VzIHdoZW4gdGhlIGFjdHVhbCB0cmFjayBmb3JtYXQgYmVjb21lcyBhdmFpbGFibGUuCisgICAgdm9pZCBub3RpZnlUcmFja0Zvcm1hdEF2YWlsYWJsZSgpOworCisgICAgLy8gQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgd2hlbiBhIHRyYW5zY29kZWQgc2FtcGxlIGlzIGF2YWlsYWJsZS4gU2FtcGxlcyBtdXN0IG5vdCBob2xkIGEgc3Ryb25nCisgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSB0cmFjayB0cmFuc2NvZGVyIGluIG9yZGVyIHRvIGF2b2lkIHJldGFpbiBjeWNsZXMgdGhyb3VnaCB0aGUgdHJhY2sKKyAgICAvLyB0cmFuc2NvZGVyJ3Mgc2FtcGxlIHF1ZXVlLgorICAgIHZvaWQgb25PdXRwdXRTYW1wbGVBdmFpbGFibGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKTsKKworICAgIC8vIGNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0IG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMsIGFuZCBnZXRzIGNhbGxlZCBvbiBhbgorICAgIC8vIGV4dGVybmFsIHRocmVhZCBiZWZvcmUgc3RhcnQuCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBjb25maWd1cmVEZXN0aW5hdGlvbkZvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+JiBkZXN0aW5hdGlvbkZvcm1hdCkgPSAwOworCisgICAgLy8gcnVuVHJhbnNjb2RlTG9vcCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLCBhbmQgZ2V0cyBjYWxsZWQgb24KKyAgICAvLyBNZWRpYVRyYWNrVHJhbnNjb2RlcidzIGludGVybmFsIHRocmVhZCB3aGVuIHRoZSB0cmFjayB0cmFuc2NvZGVyIGlzIHN0YXJ0ZWQuCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBydW5UcmFuc2NvZGVMb29wKGJvb2wqIHN0b3BwZWQpID0gMDsKKworICAgIC8vIGFib3J0VHJhbnNjb2RlTG9vcCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLCBhbmQgc2hvdWxkIHJlcXVlc3QgdHJhbnNjb2RpbmcgdG8KKyAgICAvLyBiZSBhYm9ydGVkIGFzIHNvb24gYXMgcG9zc2libGUuIEl0IHNob3VsZCBiZSBzYWZlIHRvIGNhbGwgYWJvcnRUcmFuc2NvZGVMb29wIG11bHRpcGxlIHRpbWVzLgorICAgIHZpcnR1YWwgdm9pZCBhYm9ydFRyYW5zY29kZUxvb3AoKSA9IDA7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVSZWFkZXI+IG1NZWRpYVNhbXBsZVJlYWRlcjsKKyAgICBpbnQgbVRyYWNrSW5kZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbVNvdXJjZUZvcm1hdDsKKworICAgIGVudW0gU3RvcFJlcXVlc3QgeworICAgICAgICBOT05FLAorICAgICAgICBTVE9QX05PVywKKyAgICAgICAgU1RPUF9PTl9TWU5DLAorICAgIH07CisgICAgc3RkOjphdG9taWM8U3RvcFJlcXVlc3Q+IG1TdG9wUmVxdWVzdCA9IE5PTkU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtU2FtcGxlTXV0ZXg7CisgICAgLy8gU2FtcGxlUXVldWUgZm9yIGJ1ZmZlcmluZyBvdXRwdXQgc2FtcGxlcyBiZWZvcmUgYSBzYW1wbGUgY29uc3VtZXIgaGFzIGJlZW4gc2V0LgorICAgIE1lZGlhU2FtcGxlUXVldWUgbVNhbXBsZVF1ZXVlIEdVQVJERURfQlkobVNhbXBsZU11dGV4KTsKKyAgICBNZWRpYVNhbXBsZVdyaXRlcjo6TWVkaWFTYW1wbGVDb25zdW1lckZ1bmN0aW9uIG1TYW1wbGVDb25zdW1lciBHVUFSREVEX0JZKG1TYW1wbGVNdXRleCk7CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrPiBtVHJhbnNjb2RlckNhbGxiYWNrOworICAgIHN0ZDo6bXV0ZXggbVN0YXRlTXV0ZXg7CisgICAgZW51bSB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIENPTkZJR1VSRUQsCisgICAgICAgIFNUQVJURUQsCisgICAgICAgIFNUT1BQRUQsCisgICAgfSBtU3RhdGUgR1VBUkRFRF9CWShtU3RhdGVNdXRleCkgPSBVTklOSVRJQUxJWkVEOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFDS19UUkFOU0NPREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2suaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjYyZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjay5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBQ0tfVFJBTlNDT0RFUl9DQUxMQkFDS19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBQ0tfVFJBTlNDT0RFUl9DQUxMQkFDS19ICisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFUcmFja1RyYW5zY29kZXI7CisKKy8qKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIE1lZGlhVHJhY2tUcmFuc2NvZGVyLiAqLworY2xhc3MgTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjayB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyJ3MgYWN0dWFsIHRyYWNrIGZvcm1hdCBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICAgKiBAcGFyYW0gdHJhbnNjb2RlciBUaGUgTWVkaWFUcmFja1RyYW5zY29kZXIgd2hvc2UgdHJhY2sgZm9ybWF0IGJlY29tZXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrRm9ybWF0QXZhaWxhYmxlKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyKTsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgTWVkaWFUcmFja1RyYW5zY29kZXIgaW5zdGFuY2UgaGF2ZSBmaW5pc2hlZCB0cmFuc2NvZGluZyBhbGwgbWVkaWEgc2FtcGxlcworICAgICAqIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBAcGFyYW0gdHJhbnNjb2RlciBUaGUgTWVkaWFUcmFja1RyYW5zY29kZXIgdGhhdCBmaW5pc2hlZCB0aGUgdHJhbnNjb2RpbmcuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tGaW5pc2hlZChjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2Rlcik7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgTWVkaWFUcmFja1RyYW5zY29kZXIgaW5zdGFuY2Ugd2FzIGV4cGxpY2l0bHkgc3RvcHBlZCBiZWZvcmUgaXQgd2FzIGZpbmlzaGVkLgorICAgICAqIEBwYXJhbSB0cmFuc2NvZGVyIFRoZSBNZWRpYVRyYWNrVHJhbnNjb2RlciB0aGF0IHdhcyBzdG9wcGVkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrU3RvcHBlZChjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2Rlcik7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgTWVkaWFUcmFja1RyYW5zY29kZXIgaW5zdGFuY2UgZW5jb3VudGVyZWQgYW4gZXJyb3IgaXQgY291bGQgbm90IHJlY292ZXIgZnJvbS4KKyAgICAgKiBAcGFyYW0gdHJhbnNjb2RlciBUaGUgTWVkaWFUcmFja1RyYW5zY29kZXIgdGhhdCBlbmNvdW50ZXJlZCB0aGUgZXJyb3IuCisgICAgICogQHBhcmFtIHN0YXR1cyBUaGUgbm9uLXplcm8gZXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSBlbmNvdW50ZXJlZCBlcnJvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25UcmFja0Vycm9yKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyLCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjaygpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFJBQ0tfVFJBTlNDT0RFUl9DQUxMQkFDS19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYW5zY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhVHJhbnNjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTFlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYW5zY29kZXIuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFOU0NPREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPREVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjUGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhU2FtcGxlUmVhZGVyOworCitjbGFzcyBNZWRpYVRyYW5zY29kZXIgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxNZWRpYVRyYW5zY29kZXI+LAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFTYW1wbGVXcml0ZXI6OkNhbGxiYWNrSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICAvKiogQ2FsbGJhY2tzIGZyb20gdHJhbnNjb2RlciB0byBjbGllbnQuICovCisgICAgY2xhc3MgQ2FsbGJhY2tJbnRlcmZhY2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIFRyYW5zY29kZXIgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaW5pc2hlZChjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIpID0gMDsKKworICAgICAgICAvKiogVHJhbnNjb2RlciBlbmNvdW50ZXJlZCBhbiB1bnJlY292ZXJhYmxlIGVycm9yLiAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcihjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIsIG1lZGlhX3N0YXR1c190IGVycm9yKSA9IDA7CisKKyAgICAgICAgLyoqIFRyYW5zY29kZXIgcHJvZ3Jlc3MgdXBkYXRlIHJlcG9ydGVkIGluIHBlcmNlbnQgZnJvbSAwIHRvIDEwMC4gKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uUHJvZ3Jlc3NVcGRhdGUoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyLCBpbnQzMl90IHByb2dyZXNzKSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zY29kZXIgbG9zdCBjb2RlYyByZXNvdXJjZXMgYW5kIHBhdXNlZCBvcGVyYXRpb25zLiBUaGUgY2xpZW50IGNhbiByZXN1bWUgdHJhbnNjb2RpbmcKKyAgICAgICAgICogYWdhaW4gd2hlbiByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSBieSBlaXRoZXI6CisgICAgICAgICAqICAgMSkgQ2FsbGluZyByZXN1bWUgb24gdGhlIHNhbWUgTWVkaWFUcmFuc2NvZGVyIGluc3RhbmNlLgorICAgICAgICAgKiAgIDIpIENyZWF0aW5nIGEgbmV3IE1lZGlhVHJhbnNjb2RpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgcGF1c2VkIHN0YXRlIGFuZCB0aGVuIGNhbGxpbmcKKyAgICAgICAgICogICAgICByZXN1bWUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25Db2RlY1Jlc291cmNlTG9zdCgKKyAgICAgICAgICAgICAgICBjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4mIHBhdXNlZFN0YXRlKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB+Q2FsbGJhY2tJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgTWVkaWFUcmFuc2NvZGVyIGluc3RhbmNlLiBJZiB0aGUgc3VwcGxpZWQgcGF1c2VkIHN0YXRlIGlzIHZhbGlkLCB0aGUgdHJhbnNjb2RlcgorICAgICAqIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcGF1c2VkIHN0YXRlIGFuZCBiZSByZWFkeSB0byBiZSByZXN1bWVkIHJpZ2h0IGF3YXkuIEl0IGlzIG5vdAorICAgICAqIHBvc3NpYmxlIHRvIGNoYW5nZSBhbnkgY29uZmlndXJhdGlvbnMgb24gYSBwYXVzZWQgdHJhbnNjb2Rlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhbnNjb2Rlcj4gY3JlYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2tzLAorICAgICAgICAgICAgcGlkX3QgcGlkID0gQU1FRElBQ09ERUNfQ0FMTElOR19QSUQsIHVpZF90IHVpZCA9IEFNRURJQUNPREVDX0NBTExJTkdfVUlELAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4mIHBhdXNlZFN0YXRlID0gbnVsbHB0cik7CisKKyAgICAvKiogQ29uZmlndXJlcyBzb3VyY2UgZnJvbSBwYXRoIGZkLiAqLworICAgIG1lZGlhX3N0YXR1c190IGNvbmZpZ3VyZVNvdXJjZShpbnQgZmQpOworCisgICAgLyoqIEdldHMgdGhlIG1lZGlhIGZvcm1hdHMgb2YgYWxsIHRyYWNrcyBpbiB0aGUgZmlsZS4gKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pj4gZ2V0VHJhY2tGb3JtYXRzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRyYW5zY29kaW5nIG9mIGEgdHJhY2suIFRyYWNrcyB0aGF0IGFyZSBub3QgY29uZmlndXJlZCB3aWxsIG5vdCBwcmVzZW50IGluIHRoZQorICAgICAqIGZpbmFsIHRyYW5zY29kZWQgZmlsZSwgaS5lLiB0cmFja3Mgd2lsbCBiZSBkcm9wcGVkIGJ5IGRlZmF1bHQuIFBhc3NpbmcgbnVsbHB0ciBmb3IKKyAgICAgKiB0cmFja0Zvcm1hdCBtZWFucyB0aGUgdHJhY2sgd2lsbCBiZSBjb3BpZWQgdW5jaGFuZ2VkICgicGFzc3Rocm91Z2giKSB0byB0aGUgZGVzdGluYXRpb24uCisgICAgICogVHJhY2sgY29uZmlndXJhdGlvbnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBzb3VyY2UgaGFzIGJlZW4gY29uZmlndXJlZC4KKyAgICAgKiBOb3RlOiB0cmFja0Zvcm1hdCBpcyBub3QgbW9kaWZpZWQgYnV0IGNhbm5vdCBiZSBjb25zdC4KKyAgICAgKi8KKyAgICBtZWRpYV9zdGF0dXNfdCBjb25maWd1cmVUcmFja0Zvcm1hdChzaXplX3QgdHJhY2tJbmRleCwgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCk7CisKKyAgICAvKiogQ29uZmlndXJlcyBkZXN0aW5hdGlvbiBmcm9tIGZkLiAqLworICAgIG1lZGlhX3N0YXR1c190IGNvbmZpZ3VyZURlc3RpbmF0aW9uKGludCBmZCk7CisKKyAgICAvKiogU3RhcnRzIHRyYW5zY29kaW5nLiBObyBjb25maWd1cmF0aW9ucyBjYW4gYmUgbWFkZSBvbmNlIHRoZSB0cmFuc2NvZGVyIGhhcyBzdGFydGVkLiAqLworICAgIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvKioKKyAgICAgKiBQYXVzZXMgdHJhbnNjb2RpbmcgYW5kIGZpbmFsaXplcyB0aGUgcGFydGlhbCB0cmFuc2NvZGVkIGZpbGUgdG8gZGlzay4gUGF1c2UgaXMgYSBzeW5jaHJvbm91cworICAgICAqIG9wZXJhdGlvbiBhbmQgd2lsbCB3YWl0IHVudGlsIGFsbCBpbnRlcm5hbCBjb21wb25lbnRzIGFyZSBkb25lLiBPbmNlIHRoaXMgbWV0aG9kIHJldHVybnMgaXQKKyAgICAgKiBpcyBzYWZlIHRvIHJlbGVhc2UgdGhlIHRyYW5zY29kZXIgaW5zdGFuY2UuIE5vIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGlmIHRoZSB0cmFuc2NvZGVyIHdhcworICAgICAqIHBhdXNlZCBzdWNjZXNzZnVsbHkuIEJ1dCBpZiB0aGUgdHJhbnNjb2RpbmcgZmluaXNoZXMgb3IgZW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIHBhdXNlLAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkLgorICAgICAqLworICAgIG1lZGlhX3N0YXR1c190IHBhdXNlKHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+KiBwYXVzZWRTdGF0ZSk7CisKKyAgICAvKiogUmVzdW1lcyBhIHBhdXNlZCB0cmFuc2NvZGluZy4gKi8KKyAgICBtZWRpYV9zdGF0dXNfdCByZXN1bWUoKTsKKworICAgIC8qKgorICAgICAqIENhbmNlbHMgdGhlIHRyYW5zY29kaW5nLiBPbmNlIGNhbmNlbGVkIHRoZSB0cmFuc2NvZGluZyBjYW4gbm90IGJlIHJlc3RhcnRlZC4gQ2xpZW50CisgICAgICogd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgY2xlYW5pbmcgdXAgdGhlIGFiYW5kb25lZCBmaWxlLiBDYW5jZWwgaXMgYSBzeW5jaHJvbm91cyBvcGVyYXRpb24gYW5kCisgICAgICogd2lsbCB3YWl0IHVudGlsIGFsbCBpbnRlcm5hbCBjb21wb25lbnRzIGFyZSBkb25lLiBPbmNlIHRoaXMgbWV0aG9kIHJldHVybnMgaXQgaXMgc2FmZSB0bworICAgICAqIHJlbGVhc2UgdGhlIHRyYW5zY29kZXIgaW5zdGFuY2UuIE5vcm1hbGx5IG5vIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHRyYW5zY29kZXIgaXMKKyAgICAgKiBjYW5jZWxsZWQuIEJ1dCBpZiB0aGUgdHJhbnNjb2RpbmcgZmluaXNoZXMgb3IgZW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIGNhbmNlbCwgdGhlCisgICAgICogY29ycmVzcG9uZGluZyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4KKyAgICAgKi8KKyAgICBtZWRpYV9zdGF0dXNfdCBjYW5jZWwoKTsKKworICAgIHZpcnR1YWwgfk1lZGlhVHJhbnNjb2RlcigpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBNZWRpYVRyYW5zY29kZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2tzLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisKKyAgICAvLyBNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrCisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tGb3JtYXRBdmFpbGFibGUoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrRmluaXNoZWQoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrU3RvcHBlZChjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2Rlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tFcnJvcihjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cykgb3ZlcnJpZGU7CisgICAgLy8gfk1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2sKKworICAgIC8vIE1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZQorICAgIHZpcnR1YWwgdm9pZCBvbkZpbmlzaGVkKGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyKiB3cml0ZXIsIG1lZGlhX3N0YXR1c190IHN0YXR1cykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIG9uU3RvcHBlZChjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyLCBpbnQzMl90IHByb2dyZXNzKSBvdmVycmlkZTsKKyAgICAvLyB+TWVkaWFTYW1wbGVXcml0ZXI6OkNhbGxiYWNrSW50ZXJmYWNlCisKKyAgICB2b2lkIG9uVGhyZWFkRmluaXNoZWQoY29uc3Qgdm9pZCogdGhyZWFkLCBtZWRpYV9zdGF0dXNfdCB0aHJlYWRTdGF0dXMsIGJvb2wgdGhyZWFkU3RvcHBlZCk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmVxdWVzdFN0b3AoYm9vbCBzdG9wT25TeW5jKTsKKyAgICB2b2lkIHdhaXRGb3JUaHJlYWRzKCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FsbGJhY2tJbnRlcmZhY2U+IG1DYWxsYmFja3M7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBtU2FtcGxlUmVhZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gbVNhbXBsZVdyaXRlcjsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pj4gbVNvdXJjZVRyYWNrRm9ybWF0czsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TWVkaWFUcmFja1RyYW5zY29kZXI+PiBtVHJhY2tUcmFuc2NvZGVyczsKKyAgICBzdGQ6Om11dGV4IG1UcmFja3NBZGRlZE11dGV4OworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2Rlcio+IG1UcmFja3NBZGRlZCBHVUFSREVEX0JZKG1UcmFja3NBZGRlZE11dGV4KTsKKyAgICBwaWRfdCBtUGlkOworICAgIHVpZF90IG1VaWQ7CisKKyAgICBlbnVtIFRocmVhZFN0YXRlIHsKKyAgICAgICAgUEVORElORyA9IDAsICAvLyBOb3QgeWV0IHN0YXJ0ZWQuCisgICAgICAgIFJVTk5JTkcsICAgICAgLy8gQ3VycmVudGx5IHJ1bm5pbmcuCisgICAgICAgIERPTkUsICAgICAgICAgLy8gRG9uZSBydW5uaW5nIChjYW4gYmUgZmluaXNoZWQsIHN0b3BwZWQgb3IgZXJyb3IpLgorICAgIH07CisgICAgc3RkOjptdXRleCBtVGhyZWFkU3RhdGVNdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtVGhyZWFkc0RvbmVTaWduYWw7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IHZvaWQqLCBUaHJlYWRTdGF0ZT4gbVRocmVhZFN0YXRlcyBHVUFSREVEX0JZKG1UaHJlYWRTdGF0ZU11dGV4KTsKKyAgICBtZWRpYV9zdGF0dXNfdCBtVHJhbnNjb2RlclN0YXR1cyBHVUFSREVEX0JZKG1UaHJlYWRTdGF0ZU11dGV4KSA9IEFNRURJQV9PSzsKKyAgICBib29sIG1UcmFuc2NvZGVyU3RvcHBlZCBHVUFSREVEX0JZKG1UaHJlYWRTdGF0ZU11dGV4KSA9IGZhbHNlOworICAgIGJvb2wgbVRocmVhZHNEb25lIEdVQVJERURfQlkobVRocmVhZFN0YXRlTXV0ZXgpID0gZmFsc2U7CisgICAgYm9vbCBtQ2FsbGJhY2tTZW50IEdVQVJERURfQlkobVRocmVhZFN0YXRlTXV0ZXgpID0gZmFsc2U7CisgICAgYm9vbCBtU2FtcGxlV3JpdGVyU3RvcHBlZCBHVUFSREVEX0JZKG1UaHJlYWRTdGF0ZU11dGV4KSA9IGZhbHNlOworCisgICAgc3RkOjphdG9taWNfYm9vbCBtQ2FuY2VsbGVkID0gZmFsc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQU5TQ09ERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTmRrQ29tbW9uLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9OZGtDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTcyYmUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTmRrQ29tbW9uLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19OREtfQ09NTU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19OREtfQ09NTU9OX0gKKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKKworLy8gVE9ETyhiLzE0NjQyMDk5MCkKKy8vIFRPRE86IG1ha2UgTWVkaWFUcmFuc2NvZGVyIHVzZSB0aGUgY29uc3RzIGZyb20gdGhpcyBoZWFkZXIuCit0eXBlZGVmIGVudW0geworICAgIE9VVFBVVF9GT1JNQVRfU1RBUlQgPSAwLAorICAgIE9VVFBVVF9GT1JNQVRfTVBFR180ID0gT1VUUFVUX0ZPUk1BVF9TVEFSVCwKKyAgICBPVVRQVVRfRk9STUFUX1dFQk0gPSBPVVRQVVRfRk9STUFUX1NUQVJUICsgMSwKKyAgICBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCA9IE9VVFBVVF9GT1JNQVRfU1RBUlQgKyAyLAorICAgIE9VVFBVVF9GT1JNQVRfSEVJRiA9IE9VVFBVVF9GT1JNQVRfU1RBUlQgKyAzLAorICAgIE9VVFBVVF9GT1JNQVRfT0dHID0gT1VUUFVUX0ZPUk1BVF9TVEFSVCArIDQsCisgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCA9IE9VVFBVVF9GT1JNQVRfU1RBUlQgKyA0LAorfSBNdXhlckZvcm1hdDsKKworLy8gQ29sb3IgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgZW5jb2RlciAtIHNob3VsZCBtaXJyb3Igc3VwcG9ydGVkQ29sb3JMaXN0CisvLyBmcm9tIE1lZGlhQ29kZWNDb25zdGFudHMuaCAoYXJlIHRoZXNlIGdvaW5nIHRvIGJlIGRlcHJlY2F0ZWQpCitzdGF0aWMgY29uc3RleHByIGludCBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyID0gMjE7CitzdGF0aWMgY29uc3RleHByIGludCBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSA9IDB4N0Y0MjA4ODg7CitzdGF0aWMgY29uc3RleHByIGludCBDT0xPUl9Gb3JtYXRTdXJmYWNlID0gMHg3ZjAwMDc4OTsKKworLy8gY29uc3RhbnRzIG5vdCBkZWZpbmVkIGluIE5ESworZXh0ZXJuIGNvbnN0IGNoYXIqIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX0FMTE9XX0ZSQU1FX0RST1A7CitleHRlcm4gY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FOworZXh0ZXJuIGNvbnN0IGNoYXIqIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEU7CitleHRlcm4gY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfTUFYX0JfRlJBTUVTOworc3RhdGljIGNvbnN0ZXhwciBpbnQgVEJEX0FNRURJQUNPREVDX0JVRkZFUl9GTEFHX0tFWV9GUkFNRSA9IDB4MTsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga0JpdHJhdGVNb2RlQ29uc3RhbnQgPSAyOworCituYW1lc3BhY2UgQU1lZGlhRm9ybWF0VXRpbHMgeworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhcioga2V5OworICAgIGJvb2wgKCpjb3B5KShjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZnJvbSwgQU1lZGlhRm9ybWF0KiB0byk7CisgICAgYm9vbCAoKmNvcHkyKShjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZnJvbSwgQU1lZGlhRm9ybWF0KiB0byk7Cit9IEVudHJ5Q29waWVyOworCisjZGVmaW5lIEVOVFJZX0NPUElFUihrZXlOYW1lLCB0eXBlTmFtZSkgXAorICAgIHsga2V5TmFtZSwgQU1lZGlhRm9ybWF0VXRpbHM6OkNvcHlGb3JtYXRFbnRyeSMjdHlwZU5hbWUsIG51bGxwdHIgfQorI2RlZmluZSBFTlRSWV9DT1BJRVIyKGtleU5hbWUsIHR5cGVOYW1lLCB0eXBlTmFtZTIpICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrZXlOYW1lLCBBTWVkaWFGb3JtYXRVdGlsczo6Q29weUZvcm1hdEVudHJ5IyN0eXBlTmFtZSwgXAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdFV0aWxzOjpDb3B5Rm9ybWF0RW50cnkjI3R5cGVOYW1lMiAgXAorICAgIH0KKworYm9vbCBDb3B5Rm9ybWF0RW50cnlTdHJpbmcoY29uc3QgY2hhcioga2V5LCBBTWVkaWFGb3JtYXQqIGZyb20sIEFNZWRpYUZvcm1hdCogdG8pOworYm9vbCBDb3B5Rm9ybWF0RW50cnlJbnQ2NChjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZnJvbSwgQU1lZGlhRm9ybWF0KiB0byk7Citib29sIENvcHlGb3JtYXRFbnRyeUludDMyKGNvbnN0IGNoYXIqIGtleSwgQU1lZGlhRm9ybWF0KiBmcm9tLCBBTWVkaWFGb3JtYXQqIHRvKTsKK2Jvb2wgQ29weUZvcm1hdEVudHJ5RmxvYXQoY29uc3QgY2hhcioga2V5LCBBTWVkaWFGb3JtYXQqIGZyb20sIEFNZWRpYUZvcm1hdCogdG8pOworCit2b2lkIENvcHlGb3JtYXRFbnRyaWVzKEFNZWRpYUZvcm1hdCogZnJvbSwgQU1lZGlhRm9ybWF0KiB0bywgY29uc3QgRW50cnlDb3BpZXIqIGVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbnRyeUNvdW50KTsKKworYm9vbCBTZXREZWZhdWx0Rm9ybWF0VmFsdWVGbG9hdChjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZm9ybWF0LCBmbG9hdCB2YWx1ZSk7Citib29sIFNldERlZmF1bHRGb3JtYXRWYWx1ZUludDMyKGNvbnN0IGNoYXIqIGtleSwgQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGludDMyX3QgdmFsdWUpOworCit9ICAvLyBuYW1lc3BhY2UgQU1lZGlhRm9ybWF0VXRpbHMKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19OREtfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlci5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1BBU1NUSFJPVUdIX1RSQUNLX1RSQU5TQ09ERVJfSAorI2RlZmluZSBBTkRST0lEX1BBU1NUSFJPVUdIX1RSQUNLX1RSQU5TQ09ERVJfSAorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVHJhY2sgdHJhbnNjb2RlciBmb3IgcGFzc3Rocm91Z2ggbW9kZS4gUGFzc3Rocm91Z2ggbW9kZSBjb3BpZXMgc2FtcGxlIGRhdGEgZnJvbSBhIHRyYWNrIHVuY2hhbmdlZAorICogZnJvbSBzb3VyY2UgZmlsZSB0byBkZXN0aW5hdGlvbiBmaWxlLiBUaGlzIHRyYWNrIHRyYW5zY29kZXIgdXNlcyBhbiBpbnRlcm5hbCBwb29sIG9mIGJ1ZmZlcnMuCisgKiBXaGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgYW5kIGFsbCBvZiB0aGVtIGFyZSB3YWl0aW5nIG9uIHRoZSBvdXRwdXQgcXVldWUKKyAqIHRoZSB0cmFuc2NvZGVyIHdpbGwgc3RhbGwgdW50aWwgc2FtcGxlcyBhcmUgZGVxdWV1ZWQgZnJvbSB0aGUgb3V0cHV0IHF1ZXVlIGFuZCByZWxlYXNlZC4KKyAqLworY2xhc3MgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIgOiBwdWJsaWMgTWVkaWFUcmFja1RyYW5zY29kZXIgeworcHVibGljOgorICAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZCBhdCBhIGdpdmVuIHRpbWUuICovCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEJ1ZmZlckNvdW50RGVmYXVsdCA9IDE2OworCisgICAgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2s+JiB0cmFuc2NvZGVyQ2FsbGJhY2spCisgICAgICAgICAgOiBNZWRpYVRyYWNrVHJhbnNjb2Rlcih0cmFuc2NvZGVyQ2FsbGJhY2spLAorICAgICAgICAgICAgbUJ1ZmZlclBvb2woc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sPihrTWF4QnVmZmVyQ291bnREZWZhdWx0KSl7fTsKKyAgICB2aXJ0dWFsIH5QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQnVmZmVyUG9vbFRlc3RzOworCisgICAgLyoqIENsYXNzIHRvIHBvb2wgYW5kIHJldXNlIGJ1ZmZlcnMuICovCisgICAgY2xhc3MgQnVmZmVyUG9vbCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBCdWZmZXJQb29sKGludCBtYXhCdWZmZXJDb3VudCkgOiBtTWF4QnVmZmVyQ291bnQobWF4QnVmZmVyQ291bnQpe307CisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIGEgYnVmZmVyIGZyb20gdGhlIHBvb2wuIEJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBvbiBkZW1hbmQuIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgICAgICogaWYgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgcmVhY2hlZCBhbmQgdGhlcmUgYXJlIG5vIGZyZWUgYnVmZmVycyBhdmFpbGFibGUuCisgICAgICAgICAqIEBwYXJhbSBtaW5pbXVtQnVmZmVyU2l6ZSBUaGUgbWluaW11bSBzaXplIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1ZmZlciBvciBudWxscHRyIGlmIGFsbG9jYXRpb24gZmFpbGVkIG9yIHRoZSBwb29sIHdhcyBhYm9ydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdWludDhfdCogZ2V0QnVmZmVyV2l0aFNpemUoc2l6ZV90IG1pbmltdW1CdWZmZXJTaXplKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgYnVmZmVyIHRvIHRoZSBwb29sLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgdG8gcmV0dXJuLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZXR1cm5CdWZmZXIodWludDhfdCogYnVmZmVyKTsKKworICAgICAgICAvKiogV2FrZXMgdXAgdGhyZWFkcyB3YWl0aW5nIG9uIGJ1ZmZlcnMgYW5kIHByZXZlbnRzIG5ldyBidWZmZXJzIGZyb20gYmVpbmcgcmV0dXJuZWQuICovCisgICAgICAgIHZvaWQgYWJvcnQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBidWZmZXJzIGF0IGEgdGltZS4KKyAgICAgICAgY29uc3QgaW50IG1NYXhCdWZmZXJDb3VudDsKKworICAgICAgICAvLyBNYXAgY29udGFpbmluZyBhbGwgdHJhY2tlZCBidWZmZXJzLgorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDhfdCosIHNpemVfdD4gbUFkZHJlc3NTaXplTWFwIEdVQVJERURfQlkobU11dGV4KTsKKworICAgICAgICAvLyBNYXAgY29udGFpbmluZyB0aGUgY3VycmVudGx5IGZyZWUgYnVmZmVycy4KKyAgICAgICAgc3RkOjptdWx0aW1hcDxzaXplX3QsIHVpbnQ4X3QqPiBtRnJlZUJ1ZmZlck1hcCBHVUFSREVEX0JZKG1NdXRleCk7CisKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgICAgIGJvb2wgbUFib3J0ZWQgR1VBUkRFRF9CWShtTXV0ZXgpID0gZmFsc2U7CisgICAgfTsKKworICAgIC8vIE1lZGlhVHJhY2tUcmFuc2NvZGVyCisgICAgbWVkaWFfc3RhdHVzX3QgcnVuVHJhbnNjb2RlTG9vcChib29sKiBzdG9wcGVkKSBvdmVycmlkZTsKKyAgICB2b2lkIGFib3J0VHJhbnNjb2RlTG9vcCgpIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IGNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIGRlc3RpbmF0aW9uRm9ybWF0KSBvdmVycmlkZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBnZXRPdXRwdXRGb3JtYXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAvLyB+TWVkaWFUcmFja1RyYW5zY29kZXIKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sPiBtQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfUEFTU1RIUk9VR0hfVFJBQ0tfVFJBTlNDT0RFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9WaWRlb1RyYWNrVHJhbnNjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvVmlkZW9UcmFja1RyYW5zY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZmYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvVmlkZW9UcmFja1RyYW5zY29kZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9WSURFT19UUkFDS19UUkFOU0NPREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9WSURFT19UUkFDS19UUkFOU0NPREVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlY1BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRyYWNrIHRyYW5zY29kZXIgZm9yIHZpZGVvIHRyYWNrcy4gVmlkZW9UcmFja1RyYW5zY29kZXIgdXNlcyBBTWVkaWFDb2RlYyBmcm9tIHRoZSBNZWRpYSBOREsKKyAqIGludGVybmFsbHkuIFRoZSB0d28gbWVkaWEgY29kZWNzIGFyZSBydW4gaW4gYXN5bmNocm9ub3VzIG1vZGUgYW5kIHNoYXJlcyB1bmNvbXByZXNzZWQgYnVmZmVycworICogdXNpbmcgYSBuYXRpdmUgc3VyZmFjZSAoQU5hdGl2ZVdpbmRvdykuIENvZGVjIGNhbGxiYWNrIGV2ZW50cyBhcmUgcGxhY2VkIG9uIGEgbWVzc2FnZSBxdWV1ZSBhbmQKKyAqIHNlcnZpY2VkIGluIG9yZGVyIG9uIHRoZSB0cmFuc2NvZGluZyB0aHJlYWQgbWFuYWdlZCBieSBNZWRpYVRyYWNrVHJhbnNjb2Rlci4KKyAqLworY2xhc3MgVmlkZW9UcmFja1RyYW5zY29kZXIgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxWaWRlb1RyYWNrVHJhbnNjb2Rlcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYVRyYWNrVHJhbnNjb2RlciB7CitwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxWaWRlb1RyYWNrVHJhbnNjb2Rlcj4gY3JlYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrPiYgdHJhbnNjb2RlckNhbGxiYWNrLAorICAgICAgICAgICAgcGlkX3QgcGlkID0gQU1FRElBQ09ERUNfQ0FMTElOR19QSUQsIHVpZF90IHVpZCA9IEFNRURJQUNPREVDX0NBTExJTkdfVUlEKTsKKworICAgIHZpcnR1YWwgflZpZGVvVHJhY2tUcmFuc2NvZGVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBBc3luY0NvZGVjQ2FsbGJhY2tEaXNwYXRjaDsKKworICAgIC8vIE1pbmltYWwgYmxvY2tpbmcgcXVldWUgdXNlZCBhcyBhIG1lc3NhZ2UgcXVldWUgYnkgVmlkZW9UcmFja1RyYW5zY29kZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgQmxvY2tpbmdRdWV1ZSB7CisgICAgcHVibGljOgorICAgICAgICB2b2lkIHB1c2goVCBjb25zdCYgdmFsdWUsIGJvb2wgZnJvbnQgPSBmYWxzZSk7CisgICAgICAgIFQgcG9wKCk7CisgICAgICAgIHZvaWQgYWJvcnQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgICAgICBzdGQ6OmRlcXVlPFQ+IG1RdWV1ZTsKKyAgICAgICAgYm9vbCBtQWJvcnRlZCA9IGZhbHNlOworICAgIH07CisgICAgY2xhc3MgQ29kZWNXcmFwcGVyOworCisgICAgVmlkZW9UcmFja1RyYW5zY29kZXIoY29uc3Qgc3RkOjp3ZWFrX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrPiYgdHJhbnNjb2RlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwgdWlkX3QgdWlkKQorICAgICAgICAgIDogTWVkaWFUcmFja1RyYW5zY29kZXIodHJhbnNjb2RlckNhbGxiYWNrKSwgbVBpZChwaWQpLCBtVWlkKHVpZCl7fTsKKworICAgIC8vIE1lZGlhVHJhY2tUcmFuc2NvZGVyCisgICAgbWVkaWFfc3RhdHVzX3QgcnVuVHJhbnNjb2RlTG9vcChib29sKiBzdG9wcGVkKSBvdmVycmlkZTsKKyAgICB2b2lkIGFib3J0VHJhbnNjb2RlTG9vcCgpIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IGNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIGRlc3RpbmF0aW9uRm9ybWF0KSBvdmVycmlkZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBnZXRPdXRwdXRGb3JtYXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAvLyB+TWVkaWFUcmFja1RyYW5zY29kZXIKKworICAgIC8vIEVucXVldWVzIGFuIGlucHV0IHNhbXBsZSB3aXRoIHRoZSBkZWNvZGVyLgorICAgIHZvaWQgZW5xdWV1ZUlucHV0U2FtcGxlKGludDMyX3QgYnVmZmVySW5kZXgpOworCisgICAgLy8gTW92ZXMgYSBkZWNvZGVkIGJ1ZmZlciBmcm9tIHRoZSBkZWNvZGVyJ3Mgb3V0cHV0IHRvIHRoZSBlbmNvZGVyJ3MgaW5wdXQuCisgICAgdm9pZCB0cmFuc2ZlckJ1ZmZlcihpbnQzMl90IGJ1ZmZlckluZGV4LCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gYnVmZmVySW5mbyk7CisKKyAgICAvLyBEZXF1ZXVlcyBhbiBlbmNvZGVkIGJ1ZmZlciBmcm9tIHRoZSBlbmNvZGVyIGFuZCBhZGRzIGl0IHRvIHRoZSBvdXRwdXQgcXVldWUuCisgICAgdm9pZCBkZXF1ZXVlT3V0cHV0U2FtcGxlKGludDMyX3QgYnVmZmVySW5kZXgsIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvKTsKKworICAgIC8vIFVwZGF0ZXMgdGhlIHZpZGVvIHRyYWNrJ3MgYWN0dWFsIGZvcm1hdCBiYXNlZCBvbiBlbmNvZGVyIG91dHB1dCBmb3JtYXQuCisgICAgdm9pZCB1cGRhdGVUcmFja0Zvcm1hdChBTWVkaWFGb3JtYXQqIG91dHB1dEZvcm1hdCk7CisKKyAgICBBTWVkaWFDb2RlYyogbURlY29kZXIgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlY1dyYXBwZXI+IG1FbmNvZGVyOworICAgIEFOYXRpdmVXaW5kb3cqIG1TdXJmYWNlID0gbnVsbHB0cjsKKyAgICBib29sIG1Fb3NGcm9tU291cmNlID0gZmFsc2U7CisgICAgYm9vbCBtRW9zRnJvbUVuY29kZXIgPSBmYWxzZTsKKyAgICBib29sIG1MYXN0U2FtcGxlV2FzU3luYyA9IGZhbHNlOworICAgIG1lZGlhX3N0YXR1c190IG1TdGF0dXMgPSBBTUVESUFfT0s7CisgICAgTWVkaWFTYW1wbGVJbmZvIG1TYW1wbGVJbmZvOworICAgIEJsb2NraW5nUXVldWU8c3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBtQ29kZWNNZXNzYWdlUXVldWU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbURlc3RpbmF0aW9uRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IG1BY3R1YWxPdXRwdXRGb3JtYXQ7CisgICAgcGlkX3QgbVBpZDsKKyAgICB1aWRfdCBtVWlkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9WSURFT19UUkFDS19UUkFOU0NPREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlYTgwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsODggQEAKKy8vIFVuaXQgdGVzdHMgZm9yIGxpYm1lZGlhdHJhbnNjb2Rlci4KK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAidGVzdGRlZmF1bHRzIiwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXRyYW5zY29kZXIiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGRhdGE6IFsiOnRlc3RfYXNzZXRzIl0sCisgICAgdGVzdF9jb25maWdfdGVtcGxhdGU6ICJBbmRyb2lkVGVzdFRlbXBsYXRlLnhtbCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIiwgIlRyYW5zY29kZXJUZXN0cyJdLAorfQorCisvLyBNZWRpYVNhbXBsZVJlYWRlck5ESyB1bml0IHRlc3QKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0ZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIk1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMuY3BwIl0sCit9CisKKy8vIE1lZGlhU2FtcGxlUXVldWUgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFTYW1wbGVRdWV1ZVRlc3RzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0ZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIk1lZGlhU2FtcGxlUXVldWVUZXN0cy5jcHAiXSwKK30KKworLy8gTWVkaWFUcmFja1RyYW5zY29kZXIgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyIsCisgICAgZGVmYXVsdHM6IFsidGVzdGRlZmF1bHRzIl0sCisgICAgc3JjczogWyJNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLmNwcCJdLAorfQorCisvLyBWaWRlb1RyYWNrVHJhbnNjb2RlciB1bml0IHRlc3QKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0ZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwIl0sCit9CisKKy8vIFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyIHVuaXQgdGVzdAorY2NfdGVzdCB7CisgICAgbmFtZTogIlBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMiLAorICAgIGRlZmF1bHRzOiBbInRlc3RkZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cy5jcHAiXSwKK30KKworLy8gTWVkaWFTYW1wbGVXcml0ZXIgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFTYW1wbGVXcml0ZXJUZXN0cyIsCisgICAgZGVmYXVsdHM6IFsidGVzdGRlZmF1bHRzIl0sCisgICAgc3JjczogWyJNZWRpYVNhbXBsZVdyaXRlclRlc3RzLmNwcCJdLAorfQorCisvLyBNZWRpYVRyYW5zY29kZXIgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFUcmFuc2NvZGVyVGVzdHMiLAorICAgIGRlZmF1bHRzOiBbInRlc3RkZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiTWVkaWFUcmFuc2NvZGVyVGVzdHMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3ODFjZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9BbmRyb2lkVGVzdFRlbXBsYXRlLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlVuaXQgdGVzdCBjb25maWd1cmF0aW9uIGZvciB7TU9EVUxFfSI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IlRyYW5zY29kZXJUZXN0cyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0iVHJhbnNjb2RpbmdUZXN0QXNzZXRzIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0ie01PRFVMRX0iIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAve01PRFVMRX0iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IntNT0RVTEV9IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhU2FtcGxlUXVldWVUZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVRdWV1ZVRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzU3ZTRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhU2FtcGxlUXVldWVUZXN0cy5jcHAKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIE1lZGlhU2FtcGxlUXVldWUKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTYW1wbGVRdWV1ZVRlc3RzIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUXVldWUuaD4KKworI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiogRHVyYXRpb24gdG8gdXNlIHdoZW4gZGVsYXlpbmcgdGhyZWFkcyB0byBvcmRlciBvcGVyYXRpb25zLiAqLworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtUaHJlYWREZWxheUR1cmF0aW9uTXMgPSAxMDA7CisKK2NsYXNzIE1lZGlhU2FtcGxlUXVldWVUZXN0cyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIE1lZGlhU2FtcGxlUXVldWVUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFTYW1wbGVRdWV1ZVRlc3RzIGNyZWF0ZWQiOyB9CisgICAgfk1lZGlhU2FtcGxlUXVldWVUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFTYW1wbGVRdWV1ZVRlc3RzIGRlc3Ryb3llZCI7IH0KK307CisKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IG5ld1NhbXBsZSh1aW50MzJfdCBpZCkgeworICAgIHJldHVybiBNZWRpYVNhbXBsZTo6Y3JlYXRlV2l0aFJlbGVhc2VDYWxsYmFjayhudWxscHRyIC8qIGJ1ZmZlciAqLywgMCAvKiBvZmZzZXQgKi8sIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGNhbGxiYWNrICovKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUXVldWVUZXN0cywgVGVzdFNlcXVlbnRpYWxEZXF1ZXVlT3JkZXIpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0U2VxdWVudGlhbERlcXVldWVPcmRlciBTdGFydHMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga051bVNhbXBsZXMgPSA0OworICAgIE1lZGlhU2FtcGxlUXVldWUgc2FtcGxlUXVldWU7CisgICAgRVhQRUNUX1RSVUUoc2FtcGxlUXVldWUuaXNFbXB0eSgpKTsKKworICAgIC8vIEVucXVldWUgbG9vcC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgc2FtcGxlUXVldWUuZW5xdWV1ZShuZXdTYW1wbGUoaSkpOworICAgICAgICBFWFBFQ1RfRkFMU0Uoc2FtcGxlUXVldWUuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvLyBEZXF1ZXVlIGxvb3AuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgKytpKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgICAgICBib29sIGFib3J0ZWQgPSBzYW1wbGVRdWV1ZS5kZXF1ZXVlKCZzYW1wbGUpOworICAgICAgICBFWFBFQ1RfTkUoc2FtcGxlLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKHNhbXBsZS0+YnVmZmVySWQsIGkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7CisgICAgfQorICAgIEVYUEVDVF9UUlVFKHNhbXBsZVF1ZXVlLmlzRW1wdHkoKSk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVF1ZXVlVGVzdHMsIFRlc3RJbnRlcmxlYXZlZERlcXVldWVPcmRlcikgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RJbnRlcmxlYXZlZERlcXVldWVPcmRlciBTdGFydHMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga051bVNhbXBsZXMgPSA0OworICAgIE1lZGlhU2FtcGxlUXVldWUgc2FtcGxlUXVldWU7CisKKyAgICAvLyBFbnF1ZXVlIGFuZCBkZXF1ZXVlLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7ICsraSkgeworICAgICAgICBzYW1wbGVRdWV1ZS5lbnF1ZXVlKG5ld1NhbXBsZShpKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShzYW1wbGVRdWV1ZS5pc0VtcHR5KCkpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgICAgICBib29sIGFib3J0ZWQgPSBzYW1wbGVRdWV1ZS5kZXF1ZXVlKCZzYW1wbGUpOworICAgICAgICBFWFBFQ1RfTkUoc2FtcGxlLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKHNhbXBsZS0+YnVmZmVySWQsIGkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7CisgICAgICAgIEVYUEVDVF9UUlVFKHNhbXBsZVF1ZXVlLmlzRW1wdHkoKSk7CisgICAgfQorfQorCitURVNUX0YoTWVkaWFTYW1wbGVRdWV1ZVRlc3RzLCBUZXN0QmxvY2tpbmdEZXF1ZXVlKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdEJsb2NraW5nRGVxdWV1ZSBTdGFydHMiOworCisgICAgTWVkaWFTYW1wbGVRdWV1ZSBzYW1wbGVRdWV1ZTsKKworICAgIHN0ZDo6dGhyZWFkIGVucXVldWVUaHJlYWQoWyZzYW1wbGVRdWV1ZV0geworICAgICAgICAvLyBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGEgYml0IHJhY3kuIEFueSBhbW91bnQgb2Ygc2xlZXAgd2lsbCBub3QgZ3VhcmFudGVlIHRoYXQgdGhlCisgICAgICAgIC8vIG1haW4gdGhyZWFkIHdpbGwgYmUgYmxvY2tlZCBvbiB0aGUgc2FtcGxlIHF1ZXVlIGJ5IHRoZSB0aW1lIHRoaXMgdGhyZWFkIGNhbGxzIGVucXVldWUuCisgICAgICAgIC8vIEJ1dCB3ZSBjYW4gc2F5IHdpdGggaGlnaCBjb25maWRlbmNlIHRoYXQgaXQgd2lsbCBhbmQgdGhlIHRlc3Qgd2lsbCBub3QgZmFpbCByZWdhcmRsZXNzLgorICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhrVGhyZWFkRGVsYXlEdXJhdGlvbk1zKSk7CisgICAgICAgIHNhbXBsZVF1ZXVlLmVucXVldWUobmV3U2FtcGxlKDEpKTsKKyAgICB9KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgIGJvb2wgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmRlcXVldWUoJnNhbXBsZSk7CisgICAgRVhQRUNUX05FKHNhbXBsZSwgbnVsbHB0cik7CisgICAgRVhQRUNUX0VRKHNhbXBsZS0+YnVmZmVySWQsIDEpOworICAgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKKyAgICBFWFBFQ1RfVFJVRShzYW1wbGVRdWV1ZS5pc0VtcHR5KCkpOworCisgICAgZW5xdWV1ZVRocmVhZC5qb2luKCk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVF1ZXVlVGVzdHMsIFRlc3REZXF1ZXVlQnVmZmVyUmVsZWFzZSkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3REZXF1ZXVlQnVmZmVyUmVsZWFzZSBTdGFydHMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga051bVNhbXBsZXMgPSA0OworICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGJ1ZmZlclJlbGVhc2VkKGtOdW1TYW1wbGVzLCBmYWxzZSk7CisKKyAgICBNZWRpYVNhbXBsZTo6T25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIGNhbGxiYWNrID0gWyZidWZmZXJSZWxlYXNlZF0oTWVkaWFTYW1wbGUqIHNhbXBsZSkgeworICAgICAgICBidWZmZXJSZWxlYXNlZFtzYW1wbGUtPmJ1ZmZlcklkXSA9IHRydWU7CisgICAgfTsKKworICAgIE1lZGlhU2FtcGxlUXVldWUgc2FtcGxlUXVldWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgKytpKSB7CisgICAgICAgIGJvb2wgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmVucXVldWUoCisgICAgICAgICAgICAgICAgTWVkaWFTYW1wbGU6OmNyZWF0ZVdpdGhSZWxlYXNlQ2FsbGJhY2sobnVsbHB0ciwgMCwgaSwgY2FsbGJhY2spKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGFib3J0ZWQpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7ICsraSkgeworICAgICAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyUmVsZWFzZWRbaV0pOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7ICsraSkgeworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IHNhbXBsZTsKKyAgICAgICAgICAgIGJvb2wgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmRlcXVldWUoJnNhbXBsZSk7CisgICAgICAgICAgICBFWFBFQ1RfTkUoc2FtcGxlLCBudWxscHRyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzYW1wbGUtPmJ1ZmZlcklkLCBpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShidWZmZXJSZWxlYXNlZFtpXSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtOdW1TYW1wbGVzOyArK2opIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShidWZmZXJSZWxlYXNlZFtqXSwgaiA8PSBpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUXVldWVUZXN0cywgVGVzdEFib3J0QnVmZmVyUmVsZWFzZSkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RBYm9ydEJ1ZmZlclJlbGVhc2UgU3RhcnRzIjsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1TYW1wbGVzID0gNDsKKyAgICBzdGQ6OnZlY3Rvcjxib29sPiBidWZmZXJSZWxlYXNlZChrTnVtU2FtcGxlcywgZmFsc2UpOworCisgICAgTWVkaWFTYW1wbGU6Ok9uU2FtcGxlUmVsZWFzZWRDYWxsYmFjayBjYWxsYmFjayA9IFsmYnVmZmVyUmVsZWFzZWRdKE1lZGlhU2FtcGxlKiBzYW1wbGUpIHsKKyAgICAgICAgYnVmZmVyUmVsZWFzZWRbc2FtcGxlLT5idWZmZXJJZF0gPSB0cnVlOworICAgIH07CisKKyAgICBNZWRpYVNhbXBsZVF1ZXVlIHNhbXBsZVF1ZXVlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7ICsraSkgeworICAgICAgICBib29sIGFib3J0ZWQgPSBzYW1wbGVRdWV1ZS5lbnF1ZXVlKAorICAgICAgICAgICAgICAgIE1lZGlhU2FtcGxlOjpjcmVhdGVXaXRoUmVsZWFzZUNhbGxiYWNrKG51bGxwdHIsIDAsIGksIGNhbGxiYWNrKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlclJlbGVhc2VkW2ldKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRkFMU0Uoc2FtcGxlUXVldWUuaXNFbXB0eSgpKTsKKyAgICBzYW1wbGVRdWV1ZS5hYm9ydCgpOworICAgIEVYUEVDVF9UUlVFKHNhbXBsZVF1ZXVlLmlzRW1wdHkoKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoYnVmZmVyUmVsZWFzZWRbaV0pOworICAgIH0KK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUXVldWVUZXN0cywgVGVzdE5vbkVtcHR5QWJvcnQpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0Tm9uRW1wdHlBYm9ydCBTdGFydHMiOworCisgICAgTWVkaWFTYW1wbGVRdWV1ZSBzYW1wbGVRdWV1ZTsKKyAgICBib29sIGFib3J0ZWQgPSBzYW1wbGVRdWV1ZS5lbnF1ZXVlKG5ld1NhbXBsZSgxKSk7CisgICAgRVhQRUNUX0ZBTFNFKGFib3J0ZWQpOworCisgICAgc2FtcGxlUXVldWUuYWJvcnQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgIGFib3J0ZWQgPSBzYW1wbGVRdWV1ZS5kZXF1ZXVlKCZzYW1wbGUpOworICAgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworICAgIEVYUEVDVF9FUShzYW1wbGUsIG51bGxwdHIpOworCisgICAgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmVucXVldWUoc2FtcGxlKTsKKyAgICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUXVldWVUZXN0cywgVGVzdEVtcHR5QWJvcnQpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0RW1wdHlBYm9ydCBTdGFydHMiOworCisgICAgTWVkaWFTYW1wbGVRdWV1ZSBzYW1wbGVRdWV1ZTsKKyAgICBzYW1wbGVRdWV1ZS5hYm9ydCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBzYW1wbGU7CisgICAgYm9vbCBhYm9ydGVkID0gc2FtcGxlUXVldWUuZGVxdWV1ZSgmc2FtcGxlKTsKKyAgICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKKyAgICBFWFBFQ1RfRVEoc2FtcGxlLCBudWxscHRyKTsKKworICAgIGFib3J0ZWQgPSBzYW1wbGVRdWV1ZS5lbnF1ZXVlKHNhbXBsZSk7CisgICAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVF1ZXVlVGVzdHMsIFRlc3RCbG9ja2luZ0Fib3J0KSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdEJsb2NraW5nQWJvcnQgU3RhcnRzIjsKKworICAgIE1lZGlhU2FtcGxlUXVldWUgc2FtcGxlUXVldWU7CisKKyAgICBzdGQ6OnRocmVhZCBhYm9ydGluZ1RocmVhZChbJnNhbXBsZVF1ZXVlXSB7CisgICAgICAgIC8vIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBiaXQgcmFjeS4gQW55IGFtb3VudCBvZiBzbGVlcCB3aWxsIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUKKyAgICAgICAgLy8gbWFpbiB0aHJlYWQgd2lsbCBiZSBibG9ja2VkIG9uIHRoZSBzYW1wbGUgcXVldWUgYnkgdGhlIHRpbWUgdGhpcyB0aHJlYWQgY2FsbHMgYWJvcnQuCisgICAgICAgIC8vIEJ1dCB3ZSBjYW4gc2F5IHdpdGggaGlnaCBjb25maWRlbmNlIHRoYXQgaXQgd2lsbCBhbmQgdGhlIHRlc3Qgd2lsbCBub3QgZmFpbCByZWdhcmRsZXNzLgorICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhrVGhyZWFkRGVsYXlEdXJhdGlvbk1zKSk7CisgICAgICAgIHNhbXBsZVF1ZXVlLmFib3J0KCk7CisgICAgfSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IHNhbXBsZTsKKyAgICBib29sIGFib3J0ZWQgPSBzYW1wbGVRdWV1ZS5kZXF1ZXVlKCZzYW1wbGUpOworICAgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworICAgIEVYUEVDVF9FUShzYW1wbGUsIG51bGxwdHIpOworCisgICAgYWJvcnRpbmdUaHJlYWQuam9pbigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYWYwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cy5jcHAKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIE1lZGlhU2FtcGxlUmVhZGVyTkRLCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUmVhZGVyTkRLLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworLy8gVE9ETyhiLzE1MzQ1MzM5Mik6IFRlc3QgbW9yZSBhc3NldCB0eXBlcyAoZnJhbWUgcmVvcmRlcmluZz8pLgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgU0VDX1RPX1VTRUMocykgKChzKSoxMDAwICogMTAwMCkKKworLyoqIEhlbHBlciBjbGFzcyBmb3IgY29tcGFyaW5nIHNhbXBsZSBkYXRhIHVzaW5nIGNoZWNrc3Vtcy4gKi8KK2NsYXNzIFNhbXBsZSB7CitwdWJsaWM6CisgICAgU2FtcGxlKHVpbnQzMl90IGZsYWdzLCBpbnQ2NF90IHRpbWVzdGFtcCwgc2l6ZV90IHNpemUsIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlcikKKyAgICAgICAgICA6IG1GbGFnc3tmbGFnc30sIG1UaW1lc3RhbXB7dGltZXN0YW1wfSwgbVNpemV7c2l6ZX0geworICAgICAgICBpbml0Q2hlY2tzdW0oYnVmZmVyKTsKKyAgICB9CisKKyAgICBTYW1wbGUoQU1lZGlhRXh0cmFjdG9yKiBleHRyYWN0b3IpIHsKKyAgICAgICAgbUZsYWdzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKGV4dHJhY3Rvcik7CisgICAgICAgIG1UaW1lc3RhbXAgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShleHRyYWN0b3IpOworICAgICAgICBtU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoZXh0cmFjdG9yKSk7CisKKyAgICAgICAgYXV0byBidWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4obVNpemUpOworICAgICAgICBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEoZXh0cmFjdG9yLCBidWZmZXIuZ2V0KCksIG1TaXplKTsKKworICAgICAgICBpbml0Q2hlY2tzdW0oYnVmZmVyLmdldCgpKTsKKyAgICB9CisKKyAgICB2b2lkIGluaXRDaGVja3N1bShjb25zdCB1aW50OF90KiBidWZmZXIpIHsKKyAgICAgICAgTUQ1X0NUWCBtZDVDdHg7CisgICAgICAgIE1ENV9Jbml0KCZtZDVDdHgpOworICAgICAgICBNRDVfVXBkYXRlKCZtZDVDdHgsIGJ1ZmZlciwgbVNpemUpOworICAgICAgICBNRDVfRmluYWwobUNoZWNrc3VtLCAmbWQ1Q3R4KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2FtcGxlJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplID09IHJocy5tU2l6ZSAmJiBtRmxhZ3MgPT0gcmhzLm1GbGFncyAmJiBtVGltZXN0YW1wID09IHJocy5tVGltZXN0YW1wICYmCisgICAgICAgICAgICAgICBtZW1jbXAobUNoZWNrc3VtLCByaHMubUNoZWNrc3VtLCBNRDVfRElHRVNUX0xFTkdUSCkgPT0gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgaW50NjRfdCBtVGltZXN0YW1wOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICB1aW50OF90IG1DaGVja3N1bVtNRDVfRElHRVNUX0xFTkdUSF07Cit9OworCisvKiogQ29uc3RhbnQgZm9yIHNlbGVjdGluZyBhbGwgc2FtcGxlcy4gKi8KK3N0YXRpYyBjb25zdGV4cHIgaW50IFNBTVBMRV9DT1VOVF9BTEwgPSAtMTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIHRlc3QgZGlmZmVyZW50IHNhbXBsZSBhY2Nlc3MgcGF0dGVybnMgY29tYmluZWQgd2l0aCBzZXF1ZW50aWFsIG9yIHBhcmFsbGVsCisgKiBzYW1wbGUgYWNjZXNzIG1vZGVzLgorICovCitjbGFzcyBTYW1wbGVBY2Nlc3NUZXN0ZXIgeworcHVibGljOgorICAgIFNhbXBsZUFjY2Vzc1Rlc3RlcihpbnQgc291cmNlRmQsIHNpemVfdCBmaWxlU2l6ZSkgeworICAgICAgICBtU2FtcGxlUmVhZGVyID0gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChzb3VyY2VGZCwgMCwgZmlsZVNpemUpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2FtcGxlUmVhZGVyKTsKKworICAgICAgICBtVHJhY2tDb3VudCA9IG1TYW1wbGVSZWFkZXItPmdldFRyYWNrQ291bnQoKTsKKworICAgICAgICBmb3IgKGludCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IG1UcmFja0NvdW50OyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtU2FtcGxlUmVhZGVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4KSwgQU1FRElBX09LKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TYW1wbGVzLnJlc2l6ZShtVHJhY2tDb3VudCk7CisgICAgICAgIG1UcmFja1RocmVhZHMucmVzaXplKG1UcmFja0NvdW50KTsKKyAgICB9CisKKyAgICB2b2lkIGdldFNhbXBsZUluZm8oaW50IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgTWVkaWFTYW1wbGVJbmZvIGluZm87CisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IG1TYW1wbGVSZWFkZXItPmdldFNhbXBsZUluZm9Gb3JUcmFjayh0cmFja0luZGV4LCAmaW5mbyk7CisgICAgICAgIEVYUEVDVF9FUShzdGF0dXMsIEFNRURJQV9PSyk7CisgICAgfQorCisgICAgdm9pZCByZWFkU2FtcGxlc0FzeW5jKGludCB0cmFja0luZGV4LCBpbnQgc2FtcGxlQ291bnQpIHsKKyAgICAgICAgbVRyYWNrVGhyZWFkc1t0cmFja0luZGV4XSA9IHN0ZDo6dGhyZWFke1t0aGlzLCB0cmFja0luZGV4LCBzYW1wbGVDb3VudF0geworICAgICAgICAgICAgaW50IHNhbXBsZXNSZWFkID0gMDsKKyAgICAgICAgICAgIE1lZGlhU2FtcGxlSW5mbyBpbmZvOworICAgICAgICAgICAgd2hpbGUgKHNhbXBsZXNSZWFkIDwgc2FtcGxlQ291bnQgfHwgc2FtcGxlQ291bnQgPT0gU0FNUExFX0NPVU5UX0FMTCkgeworICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IG1TYW1wbGVSZWFkZXItPmdldFNhbXBsZUluZm9Gb3JUcmFjayh0cmFja0luZGV4LCAmaW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHN0YXR1cywgQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoaW5mby5mbGFncyAmIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoKGluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19FTkRfT0ZfU1RSRUFNKSA9PSAwKTsKKworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KGluZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gbVNhbXBsZVJlYWRlci0+cmVhZFNhbXBsZURhdGFGb3JUcmFjayh0cmFja0luZGV4LCBidWZmZXIuZ2V0KCksIGluZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHN0YXR1cywgQU1FRElBX09LKTsKKworICAgICAgICAgICAgICAgIG1TYW1wbGVNdXRleC5sb2NrKCk7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmZmVyUHRyID0gYnVmZmVyLmdldCgpOworICAgICAgICAgICAgICAgIG1TYW1wbGVzW3RyYWNrSW5kZXhdLmVtcGxhY2VfYmFjayhpbmZvLmZsYWdzLCBpbmZvLnByZXNlbnRhdGlvblRpbWVVcywgaW5mby5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJQdHIpOworICAgICAgICAgICAgICAgIG1TYW1wbGVNdXRleC51bmxvY2soKTsKKyAgICAgICAgICAgICAgICArK3NhbXBsZXNSZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9fTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWRTYW1wbGVzQXN5bmMoaW50IHNhbXBsZUNvdW50KSB7CisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICAgICAgcmVhZFNhbXBsZXNBc3luYyh0cmFja0luZGV4LCBzYW1wbGVDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHdhaXRGb3JUcmFjayhpbnQgdHJhY2tJbmRleCkgeworICAgICAgICBBU1NFUlRfVFJVRShtVHJhY2tUaHJlYWRzW3RyYWNrSW5kZXhdLmpvaW5hYmxlKCkpOworICAgICAgICBtVHJhY2tUaHJlYWRzW3RyYWNrSW5kZXhdLmpvaW4oKTsKKyAgICB9CisKKyAgICB2b2lkIHdhaXRGb3JUcmFja3MoKSB7CisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICAgICAgd2FpdEZvclRyYWNrKHRyYWNrSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRFbmZvcmNlU2VxdWVudGlhbEFjY2Vzcyhib29sIGVuZm9yY2UpIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gbVNhbXBsZVJlYWRlci0+c2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MoZW5mb3JjZSk7CisgICAgICAgIEVYUEVDVF9FUShzdGF0dXMsIEFNRURJQV9PSyk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8U2FtcGxlPj4mIGdldFNhbXBsZXMoKSB7IHJldHVybiBtU2FtcGxlczsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBtU2FtcGxlUmVhZGVyOworICAgIHNpemVfdCBtVHJhY2tDb3VudDsKKyAgICBzdGQ6Om11dGV4IG1TYW1wbGVNdXRleDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnRocmVhZD4gbVRyYWNrVGhyZWFkczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxTYW1wbGU+PiBtU2FtcGxlczsKK307CisKK2NsYXNzIE1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzIGNyZWF0ZWQiOyB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzIHNldCB1cCI7CisKKyAgICAgICAgLy8gTmVlZCB0byBzdGFydCBhIHRocmVhZCBwb29sIHRvIHByZXZlbnQgQU1lZGlhRXh0cmFjdG9yIGJpbmRlciBjYWxscyBmcm9tIHN0YXJ2aW5nCisgICAgICAgIC8vIChiLzE1NTY2MzU2MSkuCisgICAgICAgIEFCaW5kZXJQcm9jZXNzX3N0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgICAgIGNvbnN0IGNoYXIqIHNvdXJjZVBhdGggPQorICAgICAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2N1YmljbGVfYXZjXzQ4MHgyNDBfYWFjXzI0S0h6Lm1wNCI7CisKKyAgICAgICAgbVNvdXJjZUZkID0gb3Blbihzb3VyY2VQYXRoLCBPX1JET05MWSk7CisgICAgICAgIEFTU0VSVF9HVChtU291cmNlRmQsIDApOworCisgICAgICAgIG1GaWxlU2l6ZSA9IGxzZWVrKG1Tb3VyY2VGZCwgMCwgU0VFS19FTkQpOworICAgICAgICBsc2VlayhtU291cmNlRmQsIDAsIFNFRUtfU0VUKTsKKworICAgICAgICBtRXh0cmFjdG9yID0gQU1lZGlhRXh0cmFjdG9yX25ldygpOworICAgICAgICBBU1NFUlRfTkUobUV4dHJhY3RvciwgbnVsbHB0cik7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKG1FeHRyYWN0b3IsIG1Tb3VyY2VGZCwgMCwgbUZpbGVTaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKTsKKworICAgICAgICBtVHJhY2tDb3VudCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KG1FeHRyYWN0b3IpOworICAgICAgICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IG1UcmFja0NvdW50OyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhtRXh0cmFjdG9yLCB0cmFja0luZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgaW5pdEV4dHJhY3RvclNhbXBsZXMoKSB7CisgICAgICAgIGlmIChtRXh0cmFjdG9yU2FtcGxlcy5zaXplKCkgPT0gbVRyYWNrQ291bnQpIHJldHVybjsKKworICAgICAgICAvLyBTYXZlIHNhbXBsZSBpbmZvcm1hdGlvbiwgcGVyIHRyYWNrLCBhcyByZXBvcnRlZCBieSB0aGUgZXh0cmFjdG9yLgorICAgICAgICBtRXh0cmFjdG9yU2FtcGxlcy5yZXNpemUobVRyYWNrQ291bnQpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjb25zdCBpbnQgdHJhY2tJbmRleCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KG1FeHRyYWN0b3IpOworICAgICAgICAgICAgbUV4dHJhY3RvclNhbXBsZXNbdHJhY2tJbmRleF0uZW1wbGFjZV9iYWNrKG1FeHRyYWN0b3IpOworICAgICAgICB9IHdoaWxlIChBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShtRXh0cmFjdG9yKSk7CisKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhtRXh0cmFjdG9yLCAwLCBBTUVESUFFWFRSQUNUT1JfU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBnZXRUcmFja0JpdHJhdGVzKCkgeworICAgICAgICBzaXplX3QgdG90YWxTaXplW21UcmFja0NvdW50XTsKKyAgICAgICAgbWVtc2V0KHRvdGFsU2l6ZSwgMCwgc2l6ZW9mKHRvdGFsU2l6ZSkpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB0cmFja0luZGV4ID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgobUV4dHJhY3Rvcik7CisgICAgICAgICAgICB0b3RhbFNpemVbdHJhY2tJbmRleF0gKz0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUobUV4dHJhY3Rvcik7CisgICAgICAgIH0gd2hpbGUgKEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpKTsKKworICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKG1FeHRyYWN0b3IsIDAsIEFNRURJQUVYVFJBQ1RPUl9TRUVLX1BSRVZJT1VTX1NZTkMpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGJpdHJhdGVzOworICAgICAgICBmb3IgKGludCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IG1UcmFja0NvdW50OyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogdHJhY2tGb3JtYXQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQobUV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICBFWFBFQ1RfTkUodHJhY2tGb3JtYXQsIG51bGxwdHIpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb25VcykpOworICAgICAgICAgICAgYml0cmF0ZXMucHVzaF9iYWNrKHJvdW5kZigoZmxvYXQpdG90YWxTaXplW3RyYWNrSW5kZXhdICogOCAqIDEwMDAwMDAgLyBkdXJhdGlvblVzKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYml0cmF0ZXM7CisgICAgfQorCisgICAgdm9pZCBjb21wYXJlU2FtcGxlcyhzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxTYW1wbGU+PiYgcmVhZGVyU2FtcGxlcykgeworICAgICAgICBpbml0RXh0cmFjdG9yU2FtcGxlcygpOworICAgICAgICBFWFBFQ1RfRVEocmVhZGVyU2FtcGxlcy5zaXplKCksIG1UcmFja0NvdW50KTsKKworICAgICAgICBmb3IgKGludCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IG1UcmFja0NvdW50OyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlRyYWNrICIgPDwgdHJhY2tJbmRleCA8PCAiLCBjb21wYXJpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCByZWFkZXJTYW1wbGVzW3RyYWNrSW5kZXhdLnNpemUoKSA8PCAiIHNhbXBsZXMuIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShyZWFkZXJTYW1wbGVzW3RyYWNrSW5kZXhdLnNpemUoKSwgbUV4dHJhY3RvclNhbXBsZXNbdHJhY2tJbmRleF0uc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCByZWFkZXJTYW1wbGVzW3RyYWNrSW5kZXhdLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgrKykgeworICAgICAgICAgICAgICAgIEVYUEVDVF9FUShyZWFkZXJTYW1wbGVzW3RyYWNrSW5kZXhdW3NhbXBsZUluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUV4dHJhY3RvclNhbXBsZXNbdHJhY2tJbmRleF1bc2FtcGxlSW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIk1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMgdGVhciBkb3duIjsKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShtRXh0cmFjdG9yKTsKKyAgICAgICAgY2xvc2UobVNvdXJjZUZkKTsKKyAgICB9CisKKyAgICB+TWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cyBkZXN0cm95ZWQiOyB9CisKKyAgICBBTWVkaWFFeHRyYWN0b3IqIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgIHNpemVfdCBtVHJhY2tDb3VudDsKKyAgICBpbnQgbVNvdXJjZUZkOworICAgIHNpemVfdCBtRmlsZVNpemU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8U2FtcGxlPj4gbUV4dHJhY3RvclNhbXBsZXM7Cit9OworCisvKiogUmVhZHMgYWxsIHNhbXBsZXMgZnJvbSBhbGwgdHJhY2tzIGluIHBhcmFsbGVsLiAqLworVEVTVF9GKE1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMsIFRlc3RQYXJhbGxlbFNhbXBsZUFjY2VzcykgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RQYXJhbGxlbFNhbXBsZUFjY2VzcyBTdGFydHMiOworCisgICAgU2FtcGxlQWNjZXNzVGVzdGVyIHRlc3RlcnttU291cmNlRmQsIG1GaWxlU2l6ZX07CisgICAgdGVzdGVyLnJlYWRTYW1wbGVzQXN5bmMoU0FNUExFX0NPVU5UX0FMTCk7CisgICAgdGVzdGVyLndhaXRGb3JUcmFja3MoKTsKKyAgICBjb21wYXJlU2FtcGxlcyh0ZXN0ZXIuZ2V0U2FtcGxlcygpKTsKK30KKworLyoqIFJlYWRzIGFsbCBzYW1wbGVzIGZyb20gYWxsIHRyYWNrcyBzZXF1ZW50aWFsbHkuICovCitURVNUX0YoTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cywgVGVzdFNlcXVlbnRpYWxTYW1wbGVBY2Nlc3MpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0U2VxdWVudGlhbFNhbXBsZUFjY2VzcyBTdGFydHMiOworCisgICAgU2FtcGxlQWNjZXNzVGVzdGVyIHRlc3RlcnttU291cmNlRmQsIG1GaWxlU2l6ZX07CisgICAgdGVzdGVyLnNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKHRydWUpOworICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKFNBTVBMRV9DT1VOVF9BTEwpOworICAgIHRlc3Rlci53YWl0Rm9yVHJhY2tzKCk7CisgICAgY29tcGFyZVNhbXBsZXModGVzdGVyLmdldFNhbXBsZXMoKSk7Cit9CisKKy8qKiBSZWFkcyBhbGwgc2FtcGxlcyBmcm9tIG9uZSB0cmFjayBpbiBwYXJhbGxlbCBtb2RlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc2VxdWVudGlhbCBtb2RlLiAqLworVEVTVF9GKE1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMsIFRlc3RNaXhlZFNhbXBsZUFjY2Vzc1RyYWNrRU9TKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdE1peGVkU2FtcGxlQWNjZXNzVHJhY2tFT1MgU3RhcnRzIjsKKworICAgIGZvciAoaW50IHJlYWRTYW1wbGVJbmZvRmxhZyA9IDA7IHJlYWRTYW1wbGVJbmZvRmxhZyA8PSAxOyByZWFkU2FtcGxlSW5mb0ZsYWcrKykgeworICAgICAgICBmb3IgKGludCB0cmFja0luZFRvRU9TID0gMDsgdHJhY2tJbmRUb0VPUyA8IG1UcmFja0NvdW50OyArK3RyYWNrSW5kVG9FT1MpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgRU9TIG9mIHRyYWNrICIgPDwgdHJhY2tJbmRUb0VPUzsKKworICAgICAgICAgICAgU2FtcGxlQWNjZXNzVGVzdGVyIHRlc3RlcnttU291cmNlRmQsIG1GaWxlU2l6ZX07CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBmbGFnIGlzIHNldCwgcmVhZCBzYW1wbGUgaW5mbyBmcm9tIGEgZGlmZmVyZW50IHRyYWNrIGJlZm9yZSBkcmFpbmluZyB0aGUgdHJhY2sKKyAgICAgICAgICAgIC8vIHVuZGVyIHRlc3QgdG8gZm9yY2UgdGhlIHJlYWRlciB0byBzYXZlIHRoZSBleHRyYWN0b3IgcG9zaXRpb24uCisgICAgICAgICAgICBpZiAocmVhZFNhbXBsZUluZm9GbGFnKSB7CisgICAgICAgICAgICAgICAgdGVzdGVyLmdldFNhbXBsZUluZm8oKHRyYWNrSW5kVG9FT1MgKyAxKSAlIG1UcmFja0NvdW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZCBhbGwgc2FtcGxlcyBmcm9tIG9uZSB0cmFjayBiZWZvcmUgZW5hYmxpbmcgc2VxdWVudGlhbCBhY2Nlc3MKKyAgICAgICAgICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKHRyYWNrSW5kVG9FT1MsIFNBTVBMRV9DT1VOVF9BTEwpOworICAgICAgICAgICAgdGVzdGVyLndhaXRGb3JUcmFjayh0cmFja0luZFRvRU9TKTsKKyAgICAgICAgICAgIHRlc3Rlci5zZXRFbmZvcmNlU2VxdWVudGlhbEFjY2Vzcyh0cnVlKTsKKworICAgICAgICAgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgKyt0cmFja0luZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPT0gdHJhY2tJbmRUb0VPUykgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB0ZXN0ZXIucmVhZFNhbXBsZXNBc3luYyh0cmFja0luZGV4LCBTQU1QTEVfQ09VTlRfQUxMKTsKKyAgICAgICAgICAgICAgICB0ZXN0ZXIud2FpdEZvclRyYWNrKHRyYWNrSW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb21wYXJlU2FtcGxlcyh0ZXN0ZXIuZ2V0U2FtcGxlcygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBSZWFkcyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHNhbXBsZSBjb3VudHMgZnJvbSBhbGwgdHJhY2tzIGluIHBhcmFsbGVsIG1vZGUgYmVmb3JlIHN3aXRjaGluZworICogdG8gc2VxdWVudGlhbCBtb2RlIGFuZCByZWFkaW5nIHRoZSByZXN0IG9mIHRoZSBzYW1wbGVzLgorICovCitURVNUX0YoTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cywgVGVzdE1peGVkU2FtcGxlQWNjZXNzKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdE1peGVkU2FtcGxlQWNjZXNzIFN0YXJ0cyI7CisgICAgaW5pdEV4dHJhY3RvclNhbXBsZXMoKTsKKworICAgIGZvciAoaW50IHRyYWNrSW5kVG9UZXN0ID0gMDsgdHJhY2tJbmRUb1Rlc3QgPCBtVHJhY2tDb3VudDsgKyt0cmFja0luZFRvVGVzdCkgeworICAgICAgICBmb3IgKGludCBzYW1wbGVDb3VudCA9IDA7IHNhbXBsZUNvdW50IDw9IChtRXh0cmFjdG9yU2FtcGxlc1t0cmFja0luZFRvVGVzdF0uc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgKytzYW1wbGVDb3VudCkgeworICAgICAgICAgICAgU2FtcGxlQWNjZXNzVGVzdGVyIHRlc3RlcnttU291cmNlRmQsIG1GaWxlU2l6ZX07CisKKyAgICAgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgICAgICAgICAgICAgIGlmICh0cmFja0luZGV4ID09IHRyYWNrSW5kVG9UZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKHRyYWNrSW5kZXgsIHNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZXN0ZXIucmVhZFNhbXBsZXNBc3luYyh0cmFja0luZGV4LCBtRXh0cmFjdG9yU2FtcGxlc1t0cmFja0luZGV4XS5zaXplKCkgLyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlc3Rlci53YWl0Rm9yVHJhY2tzKCk7CisgICAgICAgICAgICB0ZXN0ZXIuc2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3ModHJ1ZSk7CisKKyAgICAgICAgICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKFNBTVBMRV9DT1VOVF9BTEwpOworICAgICAgICAgICAgdGVzdGVyLndhaXRGb3JUcmFja3MoKTsKKworICAgICAgICAgICAgY29tcGFyZVNhbXBsZXModGVzdGVyLmdldFNhbXBsZXMoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzLCBUZXN0RXN0aW1hdGVkQml0cmF0ZUFjY3VyYWN5KSB7CisgICAgLy8gSnVzdCBwdXQgYSBzb21ld2hhdCByZWFzb25hYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBlc3RpbWF0ZWQgYml0cmF0ZSBleHBlY3RlZCBpbiBvdXIgdGVzdAorICAgIC8vIGFzc2V0cy4gVGhpcyBpcyBtb3N0bHkgdG8gbWFrZSBzdXJlIHRoZSBlc3RpbWF0aW9uIGlzIG5vdCB3YXkgb2ZmLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrTWF4RXN0aW1hdGVkQml0cmF0ZSA9IDEwMCAqIDEwMDAgKiAxMDAwOyAgLy8gMTAwIE1icHMKKworICAgIGF1dG8gc2FtcGxlUmVhZGVyID0gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChtU291cmNlRmQsIDAsIG1GaWxlU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc2FtcGxlUmVhZGVyKTsKKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGFjdHVhbFRyYWNrQml0cmF0ZXMgPSBnZXRUcmFja0JpdHJhdGVzKCk7CisgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgKyt0cmFja0luZGV4KSB7CisgICAgICAgIEVYUEVDVF9FUShzYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgpLCBBTUVESUFfT0spOworCisgICAgICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgRVhQRUNUX0VRKHNhbXBsZVJlYWRlci0+Z2V0RXN0aW1hdGVkQml0cmF0ZUZvclRyYWNrKHRyYWNrSW5kZXgsICZiaXRyYXRlKSwgQU1FRElBX09LKTsKKyAgICAgICAgRVhQRUNUX0dUKGJpdHJhdGUsIDApOworICAgICAgICBFWFBFQ1RfTFQoYml0cmF0ZSwga01heEVzdGltYXRlZEJpdHJhdGUpOworCisgICAgICAgIC8vIE5vdGU6IFRoZSB0ZXN0IGFzc2V0IGN1cnJlbnRseSB1c2VkIGluIHRoaXMgdGVzdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNhbXBsaW5nIGR1cmF0aW9uCisgICAgICAgIC8vIHVzZWQgdG8gZXN0aW1hdGUgdGhlIGJpdHJhdGUgaW4gdGhlIHNhbXBsZSByZWFkZXIuIFNvIGZvciBub3cgdGhlIGVzdGltYXRpb24gc2hvdWxkIGJlCisgICAgICAgIC8vIGV4YWN0IGJ1dCBpZi93aGVuIGEgbG9uZ2VyIGFzc2V0IGlzIHVzZWQgYSByZWFzb25hYmxlIGRlbHRhIG5lZWRzIHRvIGJlIGRlZmluZWQuCisgICAgICAgIEVYUEVDVF9FUShiaXRyYXRlLCBhY3R1YWxUcmFja0JpdHJhdGVzW3RyYWNrSW5kZXhdKTsKKyAgICB9Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzLCBUZXN0SW52YWxpZEZkKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBzYW1wbGVSZWFkZXIgPQorICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZCgwLCAwLCBtRmlsZVNpemUpOworICAgIEFTU0VSVF9UUlVFKHNhbXBsZVJlYWRlciA9PSBudWxscHRyKTsKKworICAgIHNhbXBsZVJlYWRlciA9IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpjcmVhdGVGcm9tRmQoLTEsIDAsIG1GaWxlU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc2FtcGxlUmVhZGVyID09IG51bGxwdHIpOworfQorCitURVNUX0YoTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cywgVGVzdFplcm9TaXplKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBzYW1wbGVSZWFkZXIgPQorICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChtU291cmNlRmQsIDAsIDApOworICAgIEFTU0VSVF9UUlVFKHNhbXBsZVJlYWRlciA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMsIFRlc3RJbnZhbGlkT2Zmc2V0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBzYW1wbGVSZWFkZXIgPQorICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChtU291cmNlRmQsIG1GaWxlU2l6ZSwgbUZpbGVTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzYW1wbGVSZWFkZXIgPT0gbnVsbHB0cik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVXcml0ZXJUZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVXcml0ZXJUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0MWIwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9NZWRpYVNhbXBsZVdyaXRlclRlc3RzLmNwcApAQCAtMCwwICsxLDU5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgTWVkaWFTYW1wbGVXcml0ZXIKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTYW1wbGVXcml0ZXJUZXN0cyIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiogTXV4ZXIgaW50ZXJmYWNlIHRvIGVuYWJsZSBNZWRpYVNhbXBsZVdyaXRlciB0ZXN0aW5nLiAqLworY2xhc3MgVGVzdE11eGVyIDogcHVibGljIE1lZGlhU2FtcGxlV3JpdGVyTXV4ZXJJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIE11eGVySW50ZXJmYWNlCisgICAgc3NpemVfdCBhZGRUcmFjayhBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0KSBvdmVycmlkZSB7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhBZGRUcmFjayh0cmFja0Zvcm1hdCkpOworICAgICAgICByZXR1cm4gbVRyYWNrQ291bnQrKzsKKyAgICB9CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhTdGFydCgpKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCB3cml0ZVNhbXBsZURhdGEoc2l6ZV90IHRyYWNrSW5kZXgsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyogaW5mbykgb3ZlcnJpZGUgeworICAgICAgICBtRXZlbnRRdWV1ZS5wdXNoX2JhY2soV3JpdGVTYW1wbGUodHJhY2tJbmRleCwgZGF0YSwgaW5mbykpOworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGUgeworICAgICAgICBtRXZlbnRRdWV1ZS5wdXNoX2JhY2soU3RvcCgpKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgLy8gfk11eGVySW50ZXJmYWNlCisKKyAgICBzdHJ1Y3QgRXZlbnQgeworICAgICAgICBlbnVtIHsgTm9FdmVudCwgQWRkVHJhY2ssIFN0YXJ0LCBXcml0ZVNhbXBsZSwgU3RvcCB9IHR5cGUgPSBOb0V2ZW50OworICAgICAgICBjb25zdCBBTWVkaWFGb3JtYXQqIGZvcm1hdCA9IG51bGxwdHI7CisgICAgICAgIHNpemVfdCB0cmFja0luZGV4ID0gMDsKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSA9IG51bGxwdHI7CisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZve307CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgRXZlbnQgTm9FdmVudCA9IHtFdmVudDo6Tm9FdmVudCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwge319OworCisgICAgc3RhdGljIEV2ZW50IEFkZFRyYWNrKGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0KSB7CisgICAgICAgIHJldHVybiB7LnR5cGUgPSBFdmVudDo6QWRkVHJhY2ssIC5mb3JtYXQgPSBmb3JtYXR9OworICAgIH0KKworICAgIHN0YXRpYyBFdmVudCBTdGFydCgpIHsgcmV0dXJuIHsudHlwZSA9IEV2ZW50OjpTdGFydH07IH0KKyAgICBzdGF0aWMgRXZlbnQgU3RvcCgpIHsgcmV0dXJuIHsudHlwZSA9IEV2ZW50OjpTdG9wfTsgfQorCisgICAgc3RhdGljIEV2ZW50IFdyaXRlU2FtcGxlKHNpemVfdCB0cmFja0luZGV4LCBjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8qIGluZm8pIHsKKyAgICAgICAgcmV0dXJuIHsudHlwZSA9IEV2ZW50OjpXcml0ZVNhbXBsZSwgLnRyYWNrSW5kZXggPSB0cmFja0luZGV4LCAuZGF0YSA9IGRhdGEsIC5pbmZvID0gKmluZm99OworICAgIH0KKworICAgIHN0YXRpYyBFdmVudCBXcml0ZVNhbXBsZVdpdGhQdHMoc2l6ZV90IHRyYWNrSW5kZXgsIGludDY0X3QgcHRzKSB7CisgICAgICAgIHJldHVybiB7LnR5cGUgPSBFdmVudDo6V3JpdGVTYW1wbGUsIC50cmFja0luZGV4ID0gdHJhY2tJbmRleCwgLmluZm8gPSB7MCwgMCwgcHRzLCAwfX07CisgICAgfQorCisgICAgdm9pZCBwdXNoRXZlbnQoY29uc3QgRXZlbnQmIGUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhlKTsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgY29uc3QgRXZlbnQmIHBvcEV2ZW50KGJvb2wgd2FpdCA9IGZhbHNlKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICB3aGlsZSAod2FpdCAmJiBtRXZlbnRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gTm9FdmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9ICptRXZlbnRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUV2ZW50UXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Qb3BwZWRFdmVudDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRXZlbnQgbVBvcHBlZEV2ZW50OworICAgIHN0ZDo6bGlzdDxFdmVudD4gbUV2ZW50UXVldWU7CisgICAgc3NpemVfdCBtVHJhY2tDb3VudCA9IDA7CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKK307CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8mIGxocywgY29uc3QgQU1lZGlhQ29kZWNCdWZmZXJJbmZvJiByaHMpIHsKKyAgICByZXR1cm4gbGhzLm9mZnNldCA9PSByaHMub2Zmc2V0ICYmIGxocy5zaXplID09IHJocy5zaXplICYmCisgICAgICAgICAgIGxocy5wcmVzZW50YXRpb25UaW1lVXMgPT0gcmhzLnByZXNlbnRhdGlvblRpbWVVcyAmJiBsaHMuZmxhZ3MgPT0gcmhzLmZsYWdzOworfQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdE11eGVyOjpFdmVudCYgbGhzLCBjb25zdCBUZXN0TXV4ZXI6OkV2ZW50JiByaHMpIHsKKyAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLmZvcm1hdCA9PSByaHMuZm9ybWF0ICYmIGxocy50cmFja0luZGV4ID09IHJocy50cmFja0luZGV4ICYmCisgICAgICAgICAgIGxocy5kYXRhID09IHJocy5kYXRhICYmIGxocy5pbmZvID09IHJocy5pbmZvOworfQorCisvKiogUmVwcmVzZW50cyBhIG1lZGlhIHNvdXJjZSBmaWxlLiAqLworY2xhc3MgVGVzdE1lZGlhU291cmNlIHsKK3B1YmxpYzoKKyAgICB2b2lkIGluaXQoKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBzb3VyY2VQYXRoID0KKyAgICAgICAgICAgICAgICAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQiOworCisgICAgICAgIG1FeHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShtRXh0cmFjdG9yLCBudWxscHRyKTsKKworICAgICAgICBpbnQgc291cmNlRmQgPSBvcGVuKHNvdXJjZVBhdGgsIE9fUkRPTkxZKTsKKyAgICAgICAgQVNTRVJUX0dUKHNvdXJjZUZkLCAwKTsKKworICAgICAgICBvZmZfdCBmaWxlU2l6ZSA9IGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX1NFVCk7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChtRXh0cmFjdG9yLCBzb3VyY2VGZCwgMCwgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spOworICAgICAgICBjbG9zZShzb3VyY2VGZCk7CisKKyAgICAgICAgbVRyYWNrQ291bnQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChtRXh0cmFjdG9yKTsKKyAgICAgICAgQVNTRVJUX0dUKG1UcmFja0NvdW50LCAxKTsKKyAgICAgICAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgdHJhY2tJbmRleCsrKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KG1FeHRyYWN0b3IsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKTsKKworICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0luZGV4ID0gdHJhY2tJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVRyYWNrRm9ybWF0cy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KHRyYWNrRm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSkpOworCisgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2sobUV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgRVhQRUNUX0dFKG1WaWRlb1RyYWNrSW5kZXgsIDApOworICAgICAgICBFWFBFQ1RfR0UobUF1ZGlvVHJhY2tJbmRleCwgMCk7CisgICAgfQorCisgICAgdm9pZCByZXNldCgpIGNvbnN0IHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhtRXh0cmFjdG9yLCAwIC8qIHNlZWtQb3NVcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKTsKKyAgICB9CisKKyAgICBBTWVkaWFFeHRyYWN0b3IqIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgIHNpemVfdCBtVHJhY2tDb3VudCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4+IG1UcmFja0Zvcm1hdHM7CisgICAgaW50IG1WaWRlb1RyYWNrSW5kZXggPSAtMTsKKyAgICBpbnQgbUF1ZGlvVHJhY2tJbmRleCA9IC0xOworfTsKKworY2xhc3MgVGVzdENhbGxiYWNrcyA6IHB1YmxpYyBNZWRpYVNhbXBsZVdyaXRlcjo6Q2FsbGJhY2tJbnRlcmZhY2UgeworcHVibGljOgorICAgIGJvb2wgaGFzRmluaXNoZWQoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICByZXR1cm4gbUZpbmlzaGVkOworICAgIH0KKworICAgIC8vIE1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZQorICAgIHZpcnR1YWwgdm9pZCBvbkZpbmlzaGVkKGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyKiB3cml0ZXIgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBFWFBFQ1RfRkFMU0UobUZpbmlzaGVkKTsKKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uU3RvcHBlZChjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyIF9fdW51c2VkKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBFWFBFQ1RfRkFMU0UobUZpbmlzaGVkKTsKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MpIG92ZXJyaWRlIHsKKyAgICAgICAgRVhQRUNUX0dUKHByb2dyZXNzLCBtTGFzdFByb2dyZXNzKTsKKyAgICAgICAgRVhQRUNUX0dFKHByb2dyZXNzLCAwKTsKKyAgICAgICAgRVhQRUNUX0xFKHByb2dyZXNzLCAxMDApOworCisgICAgICAgIG1MYXN0UHJvZ3Jlc3MgPSBwcm9ncmVzczsKKyAgICAgICAgbVByb2dyZXNzVXBkYXRlQ291bnQrKzsKKyAgICB9CisgICAgLy8gfk1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZQorCisgICAgdm9pZCB3YWl0Rm9yV3JpdGluZ0ZpbmlzaGVkKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKCFtRmluaXNoZWQgJiYgIW1TdG9wcGVkKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRQcm9ncmVzc1VwZGF0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbVByb2dyZXNzVXBkYXRlQ291bnQ7IH0KKyAgICBib29sIHdhc1N0b3BwZWQoKSBjb25zdCB7IHJldHVybiBtU3RvcHBlZDsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgYm9vbCBtRmluaXNoZWQgPSBmYWxzZTsKKyAgICBib29sIG1TdG9wcGVkID0gZmFsc2U7CisgICAgbWVkaWFfc3RhdHVzX3QgbVN0YXR1cyA9IEFNRURJQV9PSzsKKyAgICBpbnQzMl90IG1MYXN0UHJvZ3Jlc3MgPSAtMTsKKyAgICB1aW50MzJfdCBtUHJvZ3Jlc3NVcGRhdGVDb3VudCA9IDA7Cit9OworCitjbGFzcyBNZWRpYVNhbXBsZVdyaXRlclRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFTYW1wbGVXcml0ZXJUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFTYW1wbGVXcml0ZXJUZXN0cyBjcmVhdGVkIjsgfQorICAgIH5NZWRpYVNhbXBsZVdyaXRlclRlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVdyaXRlclRlc3RzIGRlc3Ryb3llZCI7IH0KKworICAgIHN0YXRpYyBjb25zdCBUZXN0TWVkaWFTb3VyY2UmIGdldE1lZGlhU291cmNlKCkgeworICAgICAgICBzdGF0aWMgVGVzdE1lZGlhU291cmNlIHNNZWRpYVNvdXJjZTsKKyAgICAgICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIHNPbmNlVG9rZW47CisKKyAgICAgICAgc3RkOjpjYWxsX29uY2Uoc09uY2VUb2tlbiwgW10geyBzTWVkaWFTb3VyY2UuaW5pdCgpOyB9KTsKKworICAgICAgICBzTWVkaWFTb3VyY2UucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHNNZWRpYVNvdXJjZTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBuZXdTYW1wbGUoaW50NjRfdCBwdHNVcywgdWludDMyX3QgZmxhZ3MsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBjb25zdCB1aW50OF90KiBidWZmZXIpIHsKKyAgICAgICAgYXV0byBzYW1wbGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1lZGlhU2FtcGxlPigpOworICAgICAgICBzYW1wbGUtPmluZm8ucHJlc2VudGF0aW9uVGltZVVzID0gcHRzVXM7CisgICAgICAgIHNhbXBsZS0+aW5mby5mbGFncyA9IGZsYWdzOworICAgICAgICBzYW1wbGUtPmluZm8uc2l6ZSA9IHNpemU7CisgICAgICAgIHNhbXBsZS0+ZGF0YU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgc2FtcGxlLT5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHJldHVybiBzYW1wbGU7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gbmV3U2FtcGxlRW9zKCkgeworICAgICAgICByZXR1cm4gbmV3U2FtcGxlKDAsIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0sIDAsIDAsIG51bGxwdHIpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IG5ld1NhbXBsZVdpdGhQdHMoaW50NjRfdCBwdHNVcykgeworICAgICAgICBzdGF0aWMgdWludDMyX3Qgc2FtcGxlQ291bnQgPSAwOworCisgICAgICAgIC8vIFVzZSBzYW1wbGVDb3VudCB0byBnZXQgYSB1bmlxdWUgbW9jayBzYW1wbGUuCisgICAgICAgIHVpbnQzMl90IHNhbXBsZUlkID0gKytzYW1wbGVDb3VudDsKKyAgICAgICAgcmV0dXJuIG5ld1NhbXBsZShwdHNVcywgMCwgc2FtcGxlSWQsIHNhbXBsZUlkLCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzYW1wbGVJZCkpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IG5ld1NhbXBsZVdpdGhQdHNPbmx5KGludDY0X3QgcHRzVXMpIHsKKyAgICAgICAgcmV0dXJuIG5ld1NhbXBsZShwdHNVcywgMCwgMCwgMCwgbnVsbHB0cik7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTWVkaWFTYW1wbGVXcml0ZXJUZXN0cyBzZXQgdXAiOworICAgICAgICBtVGVzdE11eGVyID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0TXV4ZXI+KCk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTWVkaWFTYW1wbGVXcml0ZXJUZXN0cyB0ZWFyIGRvd24iOworICAgICAgICBtVGVzdE11eGVyLnJlc2V0KCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RNdXhlcj4gbVRlc3RNdXhlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENhbGxiYWNrcz4gbVRlc3RDYWxsYmFja3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYWxsYmFja3M+KCk7Cit9OworCitURVNUX0YoTWVkaWFTYW1wbGVXcml0ZXJUZXN0cywgVGVzdEFkZFRyYWNrV2l0aG91dEluaXQpIHsKKyAgICBjb25zdCBUZXN0TWVkaWFTb3VyY2UmIG1lZGlhU291cmNlID0gZ2V0TWVkaWFTb3VyY2UoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gd3JpdGVyID0gTWVkaWFTYW1wbGVXcml0ZXI6OkNyZWF0ZSgpOworICAgIEVYUEVDVF9FUSh3cml0ZXItPmFkZFRyYWNrKG1lZGlhU291cmNlLm1UcmFja0Zvcm1hdHNbMF0pLCBudWxscHRyKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMsIFRlc3RTdGFydFdpdGhvdXRJbml0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiB3cml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisgICAgRVhQRUNUX0ZBTFNFKHdyaXRlci0+c3RhcnQoKSk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVdyaXRlclRlc3RzLCBUZXN0U3RhcnRXaXRob3V0VHJhY2tzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiB3cml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisgICAgRVhQRUNUX1RSVUUod3JpdGVyLT5pbml0KG1UZXN0TXV4ZXIsIG1UZXN0Q2FsbGJhY2tzKSk7CisgICAgRVhQRUNUX0ZBTFNFKHdyaXRlci0+c3RhcnQoKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0TXV4ZXItPnBvcEV2ZW50KCksIFRlc3RNdXhlcjo6Tm9FdmVudCk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVdyaXRlclRlc3RzLCBUZXN0QWRkSW52YWxpZFRyYWNrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiB3cml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisgICAgRVhQRUNUX1RSVUUod3JpdGVyLT5pbml0KG1UZXN0TXV4ZXIsIG1UZXN0Q2FsbGJhY2tzKSk7CisKKyAgICBFWFBFQ1RfRVEod3JpdGVyLT5hZGRUcmFjayhudWxscHRyKSwgbnVsbHB0cik7CisgICAgRVhQRUNUX0VRKG1UZXN0TXV4ZXItPnBvcEV2ZW50KCksIFRlc3RNdXhlcjo6Tm9FdmVudCk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVdyaXRlclRlc3RzLCBUZXN0RG91YmxlU3RhcnRTdG9wKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiB3cml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENhbGxiYWNrcz4gY2FsbGJhY2tzID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0Q2FsbGJhY2tzPigpOworICAgIEVYUEVDVF9UUlVFKHdyaXRlci0+aW5pdChtVGVzdE11eGVyLCBjYWxsYmFja3MpKTsKKworICAgIGNvbnN0IFRlc3RNZWRpYVNvdXJjZSYgbWVkaWFTb3VyY2UgPSBnZXRNZWRpYVNvdXJjZSgpOworICAgIEVYUEVDVF9ORSh3cml0ZXItPmFkZFRyYWNrKG1lZGlhU291cmNlLm1UcmFja0Zvcm1hdHNbMF0pLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RNdXhlci0+cG9wRXZlbnQoKSwgVGVzdE11eGVyOjpBZGRUcmFjayhtZWRpYVNvdXJjZS5tVHJhY2tGb3JtYXRzWzBdLmdldCgpKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPnN0YXJ0KCkpOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXItPnN0YXJ0KCkpOworCisgICAgd3JpdGVyLT5zdG9wKCk7CisgICAgd3JpdGVyLT5zdG9wKCk7CisgICAgY2FsbGJhY2tzLT53YWl0Rm9yV3JpdGluZ0ZpbmlzaGVkKCk7CisgICAgRVhQRUNUX1RSVUUoY2FsbGJhY2tzLT53YXNTdG9wcGVkKCkpOworfQorCitURVNUX0YoTWVkaWFTYW1wbGVXcml0ZXJUZXN0cywgVGVzdFN0b3BXaXRob3V0U3RhcnQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IHdyaXRlciA9IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKTsKKyAgICBFWFBFQ1RfVFJVRSh3cml0ZXItPmluaXQobVRlc3RNdXhlciwgbVRlc3RDYWxsYmFja3MpKTsKKworICAgIGNvbnN0IFRlc3RNZWRpYVNvdXJjZSYgbWVkaWFTb3VyY2UgPSBnZXRNZWRpYVNvdXJjZSgpOworICAgIEVYUEVDVF9ORSh3cml0ZXItPmFkZFRyYWNrKG1lZGlhU291cmNlLm1UcmFja0Zvcm1hdHNbMF0pLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RNdXhlci0+cG9wRXZlbnQoKSwgVGVzdE11eGVyOjpBZGRUcmFjayhtZWRpYVNvdXJjZS5tVHJhY2tGb3JtYXRzWzBdLmdldCgpKSk7CisKKyAgICB3cml0ZXItPnN0b3AoKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RNdXhlci0+cG9wRXZlbnQoKSwgVGVzdE11eGVyOjpOb0V2ZW50KTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMsIFRlc3RTdGFydFdpdGhvdXRDYWxsYmFjaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gd3JpdGVyID0gTWVkaWFTYW1wbGVXcml0ZXI6OkNyZWF0ZSgpOworCisgICAgc3RkOjp3ZWFrX3B0cjxNZWRpYVNhbXBsZVdyaXRlcjo6Q2FsbGJhY2tJbnRlcmZhY2U+IHVuYXNzaWduZWRXcDsKKyAgICBFWFBFQ1RfRkFMU0Uod3JpdGVyLT5pbml0KG1UZXN0TXV4ZXIsIHVuYXNzaWduZWRXcCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZT4gdW5hc3NpZ25lZFNwOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXItPmluaXQobVRlc3RNdXhlciwgdW5hc3NpZ25lZFNwKSk7CisKKyAgICBjb25zdCBUZXN0TWVkaWFTb3VyY2UmIG1lZGlhU291cmNlID0gZ2V0TWVkaWFTb3VyY2UoKTsKKyAgICBFWFBFQ1RfRVEod3JpdGVyLT5hZGRUcmFjayhtZWRpYVNvdXJjZS5tVHJhY2tGb3JtYXRzWzBdKSwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKHdyaXRlci0+c3RhcnQoKSk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVdyaXRlclRlc3RzLCBUZXN0UHJvZ3Jlc3NVcGRhdGUpIHsKKyAgICBjb25zdCBUZXN0TWVkaWFTb3VyY2UmIG1lZGlhU291cmNlID0gZ2V0TWVkaWFTb3VyY2UoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gd3JpdGVyID0gTWVkaWFTYW1wbGVXcml0ZXI6OkNyZWF0ZSgpOworICAgIEVYUEVDVF9UUlVFKHdyaXRlci0+aW5pdChtVGVzdE11eGVyLCBtVGVzdENhbGxiYWNrcykpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gdmlkZW9Gb3JtYXQgPQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4oQU1lZGlhRm9ybWF0X25ldygpLCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkodmlkZW9Gb3JtYXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgbWVkaWFTb3VyY2UubVRyYWNrRm9ybWF0c1ttZWRpYVNvdXJjZS5tVmlkZW9UcmFja0luZGV4XS5nZXQoKSk7CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQodmlkZW9Gb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIDEwMCk7CisgICAgYXV0byBzYW1wbGVDb25zdW1lciA9IHdyaXRlci0+YWRkVHJhY2sodmlkZW9Gb3JtYXQpOworICAgIEVYUEVDVF9ORShzYW1wbGVDb25zdW1lciwgbnVsbHB0cik7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5zdGFydCgpKTsKKworICAgIGZvciAoaW50NjRfdCBwdHMgPSAwOyBwdHMgPCAxMDA7ICsrcHRzKSB7CisgICAgICAgIHNhbXBsZUNvbnN1bWVyKG5ld1NhbXBsZVdpdGhQdHMocHRzKSk7CisgICAgfQorICAgIHNhbXBsZUNvbnN1bWVyKG5ld1NhbXBsZUVvcygpKTsKKyAgICBtVGVzdENhbGxiYWNrcy0+d2FpdEZvcldyaXRpbmdGaW5pc2hlZCgpOworCisgICAgRVhQRUNUX0VRKG1UZXN0Q2FsbGJhY2tzLT5nZXRQcm9ncmVzc1VwZGF0ZUNvdW50KCksIDEwMCk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVdyaXRlclRlc3RzLCBUZXN0SW50ZXJsZWF2aW5nKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiB3cml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisgICAgRVhQRUNUX1RSVUUod3JpdGVyLT5pbml0KG1UZXN0TXV4ZXIsIG1UZXN0Q2FsbGJhY2tzKSk7CisKKyAgICAvLyBVc2UgdHdvIHRyYWNrcyBmb3IgdGhpcyB0ZXN0LgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1UcmFja3MgPSAyOworICAgIE1lZGlhU2FtcGxlV3JpdGVyOjpNZWRpYVNhbXBsZUNvbnN1bWVyRnVuY3Rpb24gc2FtcGxlQ29uc3VtZXJzW2tOdW1UcmFja3NdOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+LCBzaXplX3Q+PiBhZGRlZFNhbXBsZXM7CisgICAgY29uc3QgVGVzdE1lZGlhU291cmNlJiBtZWRpYVNvdXJjZSA9IGdldE1lZGlhU291cmNlKCk7CisKKyAgICBmb3IgKGludCB0cmFja0lkeCA9IDA7IHRyYWNrSWR4IDwga051bVRyYWNrczsgKyt0cmFja0lkeCkgeworICAgICAgICBhdXRvIHRyYWNrRm9ybWF0ID0gbWVkaWFTb3VyY2UubVRyYWNrRm9ybWF0c1t0cmFja0lkeCAlIG1lZGlhU291cmNlLm1UcmFja0NvdW50XTsKKyAgICAgICAgc2FtcGxlQ29uc3VtZXJzW3RyYWNrSWR4XSA9IHdyaXRlci0+YWRkVHJhY2sodHJhY2tGb3JtYXQpOworICAgICAgICBFWFBFQ1RfTkUoc2FtcGxlQ29uc3VtZXJzW3RyYWNrSWR4XSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShtVGVzdE11eGVyLT5wb3BFdmVudCgpLCBUZXN0TXV4ZXI6OkFkZFRyYWNrKHRyYWNrRm9ybWF0LmdldCgpKSk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHNhbXBsZXMgaW4gdGhlIGV4cGVjdGVkIGludGVybGVhdmVkIG9yZGVyIGZvciBlYXN5IHZlcmlmaWNhdGlvbi4KKyAgICBhdXRvIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzID0gWyZhZGRlZFNhbXBsZXMsICZzYW1wbGVDb25zdW1lcnNdKGludCB0cmFja0luZGV4LCBpbnQ2NF90IHB0cykgeworICAgICAgICBhdXRvIHNhbXBsZSA9IG5ld1NhbXBsZVdpdGhQdHMocHRzKTsKKyAgICAgICAgc2FtcGxlQ29uc3VtZXJzW3RyYWNrSW5kZXhdKHNhbXBsZSk7CisgICAgICAgIGFkZGVkU2FtcGxlcy5lbXBsYWNlX2JhY2soc2FtcGxlLCB0cmFja0luZGV4KTsKKyAgICB9OworCisgICAgYWRkU2FtcGxlVG9UcmFja1dpdGhQdHMoMCwgMCk7CisgICAgYWRkU2FtcGxlVG9UcmFja1dpdGhQdHMoMSwgNCk7CisKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygwLCAxKTsKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygwLCAyKTsKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygwLCAzKTsKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygwLCAxMCk7CisKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygxLCA1KTsKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygxLCA2KTsKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygxLCAxMSk7CisKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygwLCAxMik7CisgICAgYWRkU2FtcGxlVG9UcmFja1dpdGhQdHMoMSwgMTMpOworCisgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBrTnVtVHJhY2tzOyArK3RyYWNrSW5kZXgpIHsKKyAgICAgICAgc2FtcGxlQ29uc3VtZXJzW3RyYWNrSW5kZXhdKG5ld1NhbXBsZUVvcygpKTsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0aGUgd3JpdGVyLgorICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+c3RhcnQoKSk7CisKKyAgICAvLyBXYWl0IGZvciB3cml0ZXIgdG8gY29tcGxldGUuCisgICAgbVRlc3RDYWxsYmFja3MtPndhaXRGb3JXcml0aW5nRmluaXNoZWQoKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RNdXhlci0+cG9wRXZlbnQoKSwgVGVzdE11eGVyOjpTdGFydCgpKTsKKworICAgIHN0ZDo6c29ydChhZGRlZFNhbXBsZXMuYmVnaW4oKSwgYWRkZWRTYW1wbGVzLmVuZCgpLAorICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnBhaXI8c3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiwgc2l6ZV90PiYgbGVmdCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4sIHNpemVfdD4mIHJpZ2h0KSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdC5maXJzdC0+aW5mby5wcmVzZW50YXRpb25UaW1lVXMgPCByaWdodC5maXJzdC0+aW5mby5wcmVzZW50YXRpb25UaW1lVXM7CisgICAgICAgICAgICAgIH0pOworCisgICAgLy8gVmVyaWZ5IHNhbXBsZSBvcmRlci4KKyAgICBmb3IgKGF1dG8gZW50cnkgOiBhZGRlZFNhbXBsZXMpIHsKKyAgICAgICAgYXV0byBzYW1wbGUgPSBlbnRyeS5maXJzdDsKKyAgICAgICAgYXV0byB0cmFja0luZGV4ID0gZW50cnkuc2Vjb25kOworCisgICAgICAgIGNvbnN0IFRlc3RNdXhlcjo6RXZlbnQmIGV2ZW50ID0gbVRlc3RNdXhlci0+cG9wRXZlbnQoKTsKKyAgICAgICAgRVhQRUNUX0VRKGV2ZW50LnR5cGUsIFRlc3RNdXhlcjo6RXZlbnQ6OldyaXRlU2FtcGxlKTsKKyAgICAgICAgRVhQRUNUX0VRKGV2ZW50LnRyYWNrSW5kZXgsIHRyYWNrSW5kZXgpOworICAgICAgICBFWFBFQ1RfRVEoZXZlbnQuZGF0YSwgc2FtcGxlLT5idWZmZXIpOworICAgICAgICBFWFBFQ1RfRVEoZXZlbnQuaW5mby5vZmZzZXQsIHNhbXBsZS0+ZGF0YU9mZnNldCk7CisgICAgICAgIEVYUEVDVF9FUShldmVudC5pbmZvLnNpemUsIHNhbXBsZS0+aW5mby5zaXplKTsKKyAgICAgICAgRVhQRUNUX0VRKGV2ZW50LmluZm8ucHJlc2VudGF0aW9uVGltZVVzLCBzYW1wbGUtPmluZm8ucHJlc2VudGF0aW9uVGltZVVzKTsKKyAgICAgICAgRVhQRUNUX0VRKGV2ZW50LmluZm8uZmxhZ3MsIHNhbXBsZS0+aW5mby5mbGFncyk7CisgICAgfQorCisgICAgLy8gVmVyaWZ5IEVPUyBzYW1wbGVzLgorICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwga051bVRyYWNrczsgKyt0cmFja0luZGV4KSB7CisgICAgICAgIGF1dG8gdHJhY2tGb3JtYXQgPSBtZWRpYVNvdXJjZS5tVHJhY2tGb3JtYXRzW3RyYWNrSW5kZXggJSBtZWRpYVNvdXJjZS5tVHJhY2tDb3VudF07CisgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2tGb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbik7CisKKyAgICAgICAgLy8gRU9TIHRpbWVzdGFtcCA9IGZpcnN0IHNhbXBsZSB0aW1lc3RhbXAgKyBkdXJhdGlvbi4KKyAgICAgICAgY29uc3QgaW50NjRfdCBlbmRUaW1lID0gZHVyYXRpb24gKyAodHJhY2tJbmRleCA9PSAxID8gNCA6IDApOworICAgICAgICBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbyA9IHswLCAwLCBlbmRUaW1lLCBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNfTsKKworICAgICAgICBFWFBFQ1RfRVEobVRlc3RNdXhlci0+cG9wRXZlbnQoKSwgVGVzdE11eGVyOjpXcml0ZVNhbXBsZSh0cmFja0luZGV4LCBudWxscHRyLCAmaW5mbykpOworICAgIH0KKworICAgIEVYUEVDVF9FUShtVGVzdE11eGVyLT5wb3BFdmVudCgpLCBUZXN0TXV4ZXI6OlN0b3AoKSk7CisgICAgRVhQRUNUX1RSVUUobVRlc3RDYWxsYmFja3MtPmhhc0ZpbmlzaGVkKCkpOworfQorCisvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmVhZGluZyBhIHNhbXBsZSBmcm9tIGFuIEFNZWRpYUV4dHJhY3RvciByZXByZXNlbnRlZCBhcyBhIE1lZGlhU2FtcGxlLgorc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gcmVhZFNhbXBsZUFuZEFkdmFuY2UoQU1lZGlhRXh0cmFjdG9yKiBleHRyYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHRyYWNrSW5kZXhPdXQpIHsKKyAgICBpbnQgdHJhY2tJbmRleCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KGV4dHJhY3Rvcik7CisgICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGlmICh0cmFja0luZGV4T3V0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnRyYWNrSW5kZXhPdXQgPSB0cmFja0luZGV4OworICAgIH0KKworICAgIHNzaXplX3Qgc2FtcGxlU2l6ZSA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplKGV4dHJhY3Rvcik7CisgICAgaW50NjRfdCBzYW1wbGVUaW1lVXMgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShleHRyYWN0b3IpOworICAgIHVpbnQzMl90IGZsYWdzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKGV4dHJhY3Rvcik7CisKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oc2FtcGxlU2l6ZSk7CisgICAgdWludDhfdCogYnVmZmVyID0gbmV3IHVpbnQ4X3RbYnVmZmVyU2l6ZV07CisKKyAgICBzc2l6ZV90IGRhdGFSZWFkID0gQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKGV4dHJhY3RvciwgYnVmZmVyLCBidWZmZXJTaXplKTsKKyAgICBFWFBFQ1RfRVEoZGF0YVJlYWQsIHNhbXBsZVNpemUpOworCisgICAgYXV0byBzYW1wbGUgPSBNZWRpYVNhbXBsZTo6Y3JlYXRlV2l0aFJlbGVhc2VDYWxsYmFjaygKKyAgICAgICAgICAgIGJ1ZmZlciwgMCAvKiBvZmZzZXQgKi8sIDAgLyogaWQgKi8sIFtidWZmZXJdKE1lZGlhU2FtcGxlKikgeyBkZWxldGVbXSBidWZmZXI7IH0pOworICAgIHNhbXBsZS0+aW5mby5zaXplID0gYnVmZmVyU2l6ZTsKKyAgICBzYW1wbGUtPmluZm8ucHJlc2VudGF0aW9uVGltZVVzID0gc2FtcGxlVGltZVVzOworICAgIHNhbXBsZS0+aW5mby5mbGFncyA9IGZsYWdzOworCisgICAgKHZvaWQpQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoZXh0cmFjdG9yKTsKKyAgICByZXR1cm4gc2FtcGxlOworfQorCitURVNUX0YoTWVkaWFTYW1wbGVXcml0ZXJUZXN0cywgVGVzdERlZmF1bHRNdXhlcikgeworICAgIC8vIFdyaXRlIHNhbXBsZXMgc3RyYWlnaHQgZnJvbSBhbiBleHRyYWN0b3IgYW5kIHZhbGlkYXRlIG91dHB1dCBmaWxlLgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXN0aW5hdGlvblBhdGggPQorICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9NZWRpYVNhbXBsZVdyaXRlclRlc3RzX1Rlc3REZWZhdWx0TXV4ZXJfb3V0cHV0Lk1QNCI7CisgICAgY29uc3QgaW50IGRlc3RpbmF0aW9uRmQgPQorICAgICAgICAgICAgb3BlbihkZXN0aW5hdGlvblBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lST1RIKTsKKyAgICBBU1NFUlRfR1QoZGVzdGluYXRpb25GZCwgMCk7CisKKyAgICAvLyBJbml0aWFsaXplIHdyaXRlci4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IHdyaXRlciA9IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKTsKKyAgICBFWFBFQ1RfVFJVRSh3cml0ZXItPmluaXQoZGVzdGluYXRpb25GZCwgbVRlc3RDYWxsYmFja3MpKTsKKyAgICBjbG9zZShkZXN0aW5hdGlvbkZkKTsKKworICAgIC8vIEFkZCB0cmFja3MuCisgICAgY29uc3QgVGVzdE1lZGlhU291cmNlJiBtZWRpYVNvdXJjZSA9IGdldE1lZGlhU291cmNlKCk7CisgICAgc3RkOjp2ZWN0b3I8TWVkaWFTYW1wbGVXcml0ZXI6Ok1lZGlhU2FtcGxlQ29uc3VtZXJGdW5jdGlvbj4gc2FtcGxlQ29uc3VtZXJzOworCisgICAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtZWRpYVNvdXJjZS5tVHJhY2tDb3VudDsgdHJhY2tJbmRleCsrKSB7CisgICAgICAgIGF1dG8gY29uc3VtZXIgPSB3cml0ZXItPmFkZFRyYWNrKG1lZGlhU291cmNlLm1UcmFja0Zvcm1hdHNbdHJhY2tJbmRleF0pOworICAgICAgICBzYW1wbGVDb25zdW1lcnMucHVzaF9iYWNrKGNvbnN1bWVyKTsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0aGUgd3JpdGVyLgorICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+c3RhcnQoKSk7CisKKyAgICAvLyBFbnF1ZXVlIHNhbXBsZXMgYW5kIGZpbmFsbHkgRW5kIE9mIFN0cmVhbS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IHNhbXBsZTsKKyAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICB3aGlsZSAoKHNhbXBsZSA9IHJlYWRTYW1wbGVBbmRBZHZhbmNlKG1lZGlhU291cmNlLm1FeHRyYWN0b3IsICZ0cmFja0luZGV4KSkgIT0gbnVsbHB0cikgeworICAgICAgICBzYW1wbGVDb25zdW1lcnNbdHJhY2tJbmRleF0oc2FtcGxlKTsKKyAgICB9CisgICAgZm9yICh0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IG1lZGlhU291cmNlLm1UcmFja0NvdW50OyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgc2FtcGxlQ29uc3VtZXJzW3RyYWNrSW5kZXhdKG5ld1NhbXBsZUVvcygpKTsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciB3cml0ZXIuCisgICAgbVRlc3RDYWxsYmFja3MtPndhaXRGb3JXcml0aW5nRmluaXNoZWQoKTsKKworICAgIC8vIENvbXBhcmUgb3V0cHV0IGZpbGUgd2l0aCBzb3VyY2UuCisgICAgbWVkaWFTb3VyY2UucmVzZXQoKTsKKworICAgIEFNZWRpYUV4dHJhY3RvciogZXh0cmFjdG9yID0gQU1lZGlhRXh0cmFjdG9yX25ldygpOworICAgIEFTU0VSVF9ORShleHRyYWN0b3IsIG51bGxwdHIpOworCisgICAgaW50IHNvdXJjZUZkID0gb3BlbihkZXN0aW5hdGlvblBhdGgsIE9fUkRPTkxZKTsKKyAgICBBU1NFUlRfR1Qoc291cmNlRmQsIDApOworCisgICAgb2ZmX3QgZmlsZVNpemUgPSBsc2Vlayhzb3VyY2VGZCwgMCwgU0VFS19FTkQpOworICAgIGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX1NFVCk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKGV4dHJhY3Rvciwgc291cmNlRmQsIDAsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spOworICAgIGNsb3NlKHNvdXJjZUZkKTsKKworICAgIHNpemVfdCB0cmFja0NvdW50ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoZXh0cmFjdG9yKTsKKyAgICBFWFBFQ1RfRVEodHJhY2tDb3VudCwgbWVkaWFTb3VyY2UubVRyYWNrQ291bnQpOworCisgICAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChleHRyYWN0b3IsIHRyYWNrSW5kZXgpOworICAgICAgICBBU1NFUlRfTkUodHJhY2tGb3JtYXQsIG51bGxwdHIpOworCisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhleHRyYWN0b3IsIHRyYWNrSW5kZXgpOworICAgIH0KKworICAgIC8vIENvbXBhcmUgc2FtcGxlcy4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IHNhbXBsZTEgPSByZWFkU2FtcGxlQW5kQWR2YW5jZShtZWRpYVNvdXJjZS5tRXh0cmFjdG9yLCBudWxscHRyKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IHNhbXBsZTIgPSByZWFkU2FtcGxlQW5kQWR2YW5jZShleHRyYWN0b3IsIG51bGxwdHIpOworCisgICAgd2hpbGUgKHNhbXBsZTEgIT0gbnVsbHB0ciAmJiBzYW1wbGUyICE9IG51bGxwdHIpIHsKKyAgICAgICAgRVhQRUNUX0VRKHNhbXBsZTEtPmluZm8ucHJlc2VudGF0aW9uVGltZVVzLCBzYW1wbGUyLT5pbmZvLnByZXNlbnRhdGlvblRpbWVVcyk7CisgICAgICAgIEVYUEVDVF9FUShzYW1wbGUxLT5pbmZvLnNpemUsIHNhbXBsZTItPmluZm8uc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShzYW1wbGUxLT5pbmZvLmZsYWdzLCBzYW1wbGUyLT5pbmZvLmZsYWdzKTsKKworICAgICAgICBFWFBFQ1RfRVEobWVtY21wKHNhbXBsZTEtPmJ1ZmZlciwgc2FtcGxlMi0+YnVmZmVyLCBzYW1wbGUxLT5pbmZvLnNpemUpLCAwKTsKKworICAgICAgICBzYW1wbGUxID0gcmVhZFNhbXBsZUFuZEFkdmFuY2UobWVkaWFTb3VyY2UubUV4dHJhY3RvciwgbnVsbHB0cik7CisgICAgICAgIHNhbXBsZTIgPSByZWFkU2FtcGxlQW5kQWR2YW5jZShleHRyYWN0b3IsIG51bGxwdHIpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoc2FtcGxlMSwgbnVsbHB0cik7CisgICAgRVhQRUNUX0VRKHNhbXBsZTIsIG51bGxwdHIpOworCisgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShleHRyYWN0b3IpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjBiODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cy5jcHAKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIE1lZGlhVHJhY2tUcmFuc2NvZGVyCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrVHJhbnNjb2Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvVmlkZW9UcmFja1RyYW5zY29kZXIuaD4KKworI2luY2x1ZGUgIlRyYWNrVHJhbnNjb2RlclRlc3RVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKiBUcmFja1RyYW5zY29kZXIgdHlwZXMgdG8gdGVzdC4gKi8KK2VudW0gVHJhY2tUcmFuc2NvZGVyVHlwZSB7CisgICAgVklERU8sCisgICAgUEFTU1RIUk9VR0gsCit9OworCitjbGFzcyBNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUcmFja1RyYW5zY29kZXJUeXBlPiB7CitwdWJsaWM6CisgICAgTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyBjcmVhdGVkIjsgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyBzZXQgdXAiOworCisgICAgICAgIC8vIE5lZWQgdG8gc3RhcnQgYSB0aHJlYWQgcG9vbCB0byBwcmV2ZW50IEFNZWRpYUV4dHJhY3RvciBiaW5kZXIgY2FsbHMgZnJvbSBzdGFydmluZworICAgICAgICAvLyAoYi8xNTU2NjM1NjEpLgorICAgICAgICBBQmluZGVyUHJvY2Vzc19zdGFydFRocmVhZFBvb2woKTsKKworICAgICAgICBtQ2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYWxsYmFjaz4oKTsKKworICAgICAgICBzd2l0Y2ggKEdldFBhcmFtKCkpIHsKKyAgICAgICAgY2FzZSBWSURFTzoKKyAgICAgICAgICAgIG1UcmFuc2NvZGVyID0gVmlkZW9UcmFja1RyYW5zY29kZXI6OmNyZWF0ZShtQ2FsbGJhY2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEFTU1RIUk9VR0g6CisgICAgICAgICAgICBtVHJhbnNjb2RlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI+KG1DYWxsYmFjayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTkUobVRyYW5zY29kZXIsIG51bGxwdHIpOworCisgICAgICAgIGluaXRTYW1wbGVSZWFkZXIoIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0Iik7CisgICAgfQorCisgICAgdm9pZCBpbml0U2FtcGxlUmVhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZVBhdGgpIHsKKyAgICAgICAgY29uc3QgaW50IHNvdXJjZUZkID0gb3Blbihzb3VyY2VQYXRoLCBPX1JET05MWSk7CisgICAgICAgIEFTU0VSVF9HVChzb3VyY2VGZCwgMCk7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGZpbGVTaXplID0gbHNlZWsoc291cmNlRmQsIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgbHNlZWsoc291cmNlRmQsIDAsIFNFRUtfU0VUKTsKKworICAgICAgICBtTWVkaWFTYW1wbGVSZWFkZXIgPSBNZWRpYVNhbXBsZVJlYWRlck5ESzo6Y3JlYXRlRnJvbUZkKHNvdXJjZUZkLCAwIC8qIG9mZnNldCAqLywgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUobU1lZGlhU2FtcGxlUmVhZGVyLCBudWxscHRyKTsKKyAgICAgICAgY2xvc2Uoc291cmNlRmQpOworCisgICAgICAgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgKyt0cmFja0luZGV4KSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgICAgICAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGlmIChHZXRQYXJhbSgpID09IFZJREVPICYmIHN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7CisKKyAgICAgICAgICAgICAgICBtU291cmNlRm9ybWF0ID0gc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4odHJhY2tGb3JtYXQsICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUobVNvdXJjZUZvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBtRGVzdGluYXRpb25Gb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tUcmFuc2NvZGVyVGVzdFV0aWxzOjpnZXREZWZhdWx0VmlkZW9EZXN0aW5hdGlvbkZvcm1hdCh0cmFja0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKG1EZXN0aW5hdGlvbkZvcm1hdCwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEdldFBhcmFtKCkgPT0gUEFTU1RIUk9VR0ggJiYgc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8obG5pbHNzb24pOiBUZXN0IG1ldGFkYXRhIHRyYWNrIHBhc3N0aHJvdWdoIGFmdGVyIGhrdWFuZ0AgcHJvdmlkZXMgc2FtcGxlLgorICAgICAgICAgICAgICAgIG1UcmFja0luZGV4ID0gdHJhY2tJbmRleDsKKworICAgICAgICAgICAgICAgIG1Tb3VyY2VGb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pih0cmFja0Zvcm1hdCwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShtU291cmNlRm9ybWF0LCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlRfTkUobVNvdXJjZUZvcm1hdCwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShtTWVkaWFTYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKG1UcmFja0luZGV4KSwgQU1FRElBX09LKTsKKyAgICB9CisKKyAgICAvLyBEcmFpbnMgdGhlIHRyYW5zY29kZXIncyBvdXRwdXQgcXVldWUgaW4gYSBsb29wLgorICAgIHZvaWQgZHJhaW5PdXRwdXRTYW1wbGVzKGludCBudW1TYW1wbGVzVG9TYXZlID0gMCkgeworICAgICAgICBtVHJhbnNjb2Rlci0+c2V0U2FtcGxlQ29uc3VtZXIoCisgICAgICAgICAgICAgICAgW3RoaXMsIG51bVNhbXBsZXNUb1NhdmVdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSkgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTkUoc2FtcGxlLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgICAgICBtR290RW5kT2ZTdHJlYW0gPSAoc2FtcGxlLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobVNhdmVkU2FtcGxlcy5zaXplKCkgPCBudW1TYW1wbGVzVG9TYXZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2F2ZWRTYW1wbGVzLnB1c2hfYmFjayhzYW1wbGUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TYXZlZFNhbXBsZXMuc2l6ZSgpID09IG51bVNhbXBsZXNUb1NhdmUgfHwgbUdvdEVuZE9mU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1NhdmVkU2VtYXBob3JlLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyB0ZWFyIGRvd24iOyB9CisKKyAgICB+TWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyBkZXN0cm95ZWQiOyB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFUcmFja1RyYW5zY29kZXI+IG1UcmFuc2NvZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2FsbGJhY2s+IG1DYWxsYmFjazsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gbU1lZGlhU2FtcGxlUmVhZGVyOworICAgIGludCBtVHJhY2tJbmRleDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IG1Tb3VyY2VGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbURlc3RpbmF0aW9uRm9ybWF0OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPj4gbVNhdmVkU2FtcGxlczsKKyAgICBPbmVTaG90U2VtYXBob3JlIG1TYW1wbGVzU2F2ZWRTZW1hcGhvcmU7CisgICAgYm9vbCBtR290RW5kT2ZTdHJlYW0gPSBmYWxzZTsKK307CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBXYWl0Tm9ybWFsT3BlcmF0aW9uKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBXYWl0Tm9ybWFsT3BlcmF0aW9uIjsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmNvbmZpZ3VyZShtTWVkaWFTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBtRGVzdGluYXRpb25Gb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgIEFTU0VSVF9UUlVFKG1UcmFuc2NvZGVyLT5zdGFydCgpKTsKKyAgICBkcmFpbk91dHB1dFNhbXBsZXMoKTsKKyAgICBFWFBFQ1RfRVEobUNhbGxiYWNrLT53YWl0VW50aWxGaW5pc2hlZCgpLCBBTUVESUFfT0spOworICAgIEVYUEVDVF9UUlVFKG1DYWxsYmFjay0+dHJhbnNjb2RpbmdGaW5pc2hlZCgpKTsKKyAgICBFWFBFQ1RfVFJVRShtR290RW5kT2ZTdHJlYW0pOworfQorCitURVNUX1AoTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cywgU3RvcE5vcm1hbE9wZXJhdGlvbikgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgU3RvcE5vcm1hbE9wZXJhdGlvbiI7CisKKyAgICAvLyBVc2UgYSBsb25nZXIgdGVzdCBhc3NldCB0byBtYWtlIHN1cmUgdGhhdCB0cmFuc2NvZGluZyBjYW4gYmUgc3RvcHBlZC4KKyAgICBpbml0U2FtcGxlUmVhZGVyKCIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQiKTsKKworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgRVhQRUNUX1RSVUUobVRyYW5zY29kZXItPnN0YXJ0KCkpOworICAgIG1DYWxsYmFjay0+d2FpdFVudGlsVHJhY2tGb3JtYXRBdmFpbGFibGUoKTsKKyAgICBtVHJhbnNjb2Rlci0+c3RvcCgpOworICAgIEVYUEVDVF9FUShtQ2FsbGJhY2stPndhaXRVbnRpbEZpbmlzaGVkKCksIEFNRURJQV9PSyk7CisgICAgRVhQRUNUX1RSVUUobUNhbGxiYWNrLT50cmFuc2NvZGluZ1dhc1N0b3BwZWQoKSk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBTdGFydFdpdGhvdXRDb25maWd1cmUpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFN0YXJ0V2l0aG91dENvbmZpZ3VyZSI7CisgICAgRVhQRUNUX0ZBTFNFKG1UcmFuc2NvZGVyLT5zdGFydCgpKTsKK30KKworVEVTVF9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsIFN0b3BXaXRob3V0U3RhcnQpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFN0b3BXaXRob3V0U3RhcnQiOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgbVRyYW5zY29kZXItPnN0b3AoKTsKK30KKworVEVTVF9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsIERvdWJsZVN0YXJ0U3RvcCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgRG91YmxlU3RhcnRTdG9wIjsKKworICAgIC8vIFVzZSBhIGxvbmdlciB0ZXN0IGFzc2V0IHRvIG1ha2Ugc3VyZSB0aGF0IHRyYW5zY29kaW5nIGNhbiBiZSBzdG9wcGVkLgorICAgIGluaXRTYW1wbGVSZWFkZXIoIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNCIpOworCisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfVFJVRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1UcmFuc2NvZGVyLT5zdGFydCgpKTsKKyAgICBtVHJhbnNjb2Rlci0+c3RvcCgpOworICAgIG1UcmFuc2NvZGVyLT5zdG9wKCk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2FsbGJhY2stPnRyYW5zY29kaW5nV2FzU3RvcHBlZCgpKTsKK30KKworVEVTVF9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsIERvdWJsZUNvbmZpZ3VyZSkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgRG91YmxlQ29uZmlndXJlIjsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmNvbmZpZ3VyZShtTWVkaWFTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBtRGVzdGluYXRpb25Gb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRCk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBDb25maWd1cmVBZnRlckZhaWwpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIENvbmZpZ3VyZUFmdGVyRmFpbCI7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCAtMSwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmNvbmZpZ3VyZShtTWVkaWFTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBtRGVzdGluYXRpb25Gb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworfQorCitURVNUX1AoTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cywgUmVzdGFydEFmdGVyU3RvcCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgUmVzdGFydEFmdGVyU3RvcCI7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfVFJVRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgbVRyYW5zY29kZXItPnN0b3AoKTsKKyAgICBFWFBFQ1RfRVEobUNhbGxiYWNrLT53YWl0VW50aWxGaW5pc2hlZCgpLCBBTUVESUFfT0spOworICAgIEVYUEVDVF9GQUxTRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBSZXN0YXJ0QWZ0ZXJGaW5pc2gpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFJlc3RhcnRBZnRlckZpbmlzaCI7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBBU1NFUlRfVFJVRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgZHJhaW5PdXRwdXRTYW1wbGVzKCk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKyAgICBtVHJhbnNjb2Rlci0+c3RvcCgpOworICAgIEVYUEVDVF9GQUxTRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgRVhQRUNUX1RSVUUobUdvdEVuZE9mU3RyZWFtKTsKK30KKworVEVTVF9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsIEhvbGRTYW1wbGVBZnRlclRyYW5zY29kZXJSZWxlYXNlKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBIb2xkU2FtcGxlQWZ0ZXJUcmFuc2NvZGVyUmVsZWFzZSI7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBBU1NFUlRfVFJVRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgZHJhaW5PdXRwdXRTYW1wbGVzKDEgLyogbnVtU2FtcGxlc1RvU2F2ZSAqLyk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKyAgICBtVHJhbnNjb2Rlci0+c3RvcCgpOworICAgIEVYUEVDVF9UUlVFKG1Hb3RFbmRPZlN0cmVhbSk7CisKKyAgICBtVHJhbnNjb2Rlci5yZXNldCgpOworCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKKyAgICBtU2F2ZWRTYW1wbGVzLmNsZWFyKCk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBIb2xkU2FtcGxlQWZ0ZXJUcmFuc2NvZGVyU3RvcCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgSG9sZFNhbXBsZUFmdGVyVHJhbnNjb2RlclN0b3AiOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgQVNTRVJUX1RSVUUobVRyYW5zY29kZXItPnN0YXJ0KCkpOworICAgIGRyYWluT3V0cHV0U2FtcGxlcygxIC8qIG51bVNhbXBsZXNUb1NhdmUgKi8pOworICAgIG1TYW1wbGVzU2F2ZWRTZW1hcGhvcmUud2FpdCgpOworICAgIG1UcmFuc2NvZGVyLT5zdG9wKCk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7CisgICAgbVNhdmVkU2FtcGxlcy5jbGVhcigpOworfQorCitURVNUX1AoTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cywgTnVsbFNhbXBsZVJlYWRlcikgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgTnVsbFNhbXBsZVJlYWRlciI7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBudWxsU2FtcGxlUmVhZGVyOworICAgIEVYUEVDVF9ORShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG51bGxTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBtRGVzdGluYXRpb25Gb3JtYXQpLCBBTUVESUFfT0spOworICAgIEFTU0VSVF9GQUxTRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBJbnZhbGlkVHJhY2tJbmRleCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgSW52YWxpZFRyYWNrSW5kZXgiOworICAgIEVYUEVDVF9ORShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgLTEsIG1EZXN0aW5hdGlvbkZvcm1hdCksIEFNRURJQV9PSyk7CisgICAgRVhQRUNUX05FKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtTWVkaWFTYW1wbGVSZWFkZXItPmdldFRyYWNrQ291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVzdGluYXRpb25Gb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworfQorCitURVNUX1AoTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cywgU3RvcE9uU3luYykgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgU3RvcE9uU3luYyI7CisKKyAgICAvLyBVc2UgYSBsb25nZXIgdGVzdCBhc3NldCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgYSBHT1AgdG8gZmluaXNoLgorICAgIGluaXRTYW1wbGVSZWFkZXIoIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNCIpOworCisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKworICAgIGJvb2wgbGFzdFNhbXBsZVdhc0VvcyA9IGZhbHNlOworICAgIGJvb2wgbGFzdFJlYWxTYW1wbGVXYXNTeW5jID0gZmFsc2U7CisgICAgT25lU2hvdFNlbWFwaG9yZSBzYW1wbGVzUmVjZWl2ZWRTZW1hcGhvcmU7CisgICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSAwOworCisgICAgbVRyYW5zY29kZXItPnNldFNhbXBsZUNvbnN1bWVyKFsmXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+JiBzYW1wbGUpIHsKKyAgICAgICAgQVNTRVJUX05FKHNhbXBsZSwgbnVsbHB0cik7CisKKyAgICAgICAgaWYgKChsYXN0U2FtcGxlV2FzRW9zID0gc2FtcGxlLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIHNhbXBsZXNSZWNlaXZlZFNlbWFwaG9yZS5zaWduYWwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsYXN0UmVhbFNhbXBsZVdhc1N5bmMgPSBzYW1wbGUtPmluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19TWU5DX1NBTVBMRTsKKworICAgICAgICBpZiAoKytzYW1wbGVDb3VudCA+PSAxMCkgeyAgLy8gV2FpdCBmb3IgYSBmZXcgc2FtcGxlcyBiZWZvcmUgc3RvcHBpbmcuCisgICAgICAgICAgICBzYW1wbGVzUmVjZWl2ZWRTZW1hcGhvcmUuc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIEFTU0VSVF9UUlVFKG1UcmFuc2NvZGVyLT5zdGFydCgpKTsKKyAgICBzYW1wbGVzUmVjZWl2ZWRTZW1hcGhvcmUud2FpdCgpOworICAgIG1UcmFuc2NvZGVyLT5zdG9wKHRydWUgLyogc3RvcE9uU3luYyAqLyk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKworICAgIEVYUEVDVF9UUlVFKGxhc3RTYW1wbGVXYXNFb3MpOworICAgIEVYUEVDVF9UUlVFKGxhc3RSZWFsU2FtcGxlV2FzU3luYyk7CisgICAgRVhQRUNUX1RSVUUobUNhbGxiYWNrLT50cmFuc2NvZGluZ1dhc1N0b3BwZWQoKSk7Cit9CisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHNBbGwsIE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoVklERU8sIFBBU1NUSFJPVUdIKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFUcmFuc2NvZGVyVGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhVHJhbnNjb2RlclRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU5OTkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhVHJhbnNjb2RlclRlc3RzLmNwcApAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgTWVkaWFUcmFuc2NvZGVyCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhVHJhbnNjb2RlclRlc3RzIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUmVhZGVyTkRLLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrQ29tbW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBERUZJTkVfRk9STUFUX1ZBTFVFX0VRVUFMX0ZVTkMoX3R5cGUsIF90eXBlTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBib29sIGVxdWFsIyNfdHlwZU5hbWUoY29uc3QgY2hhcioga2V5LCBBTWVkaWFGb3JtYXQqIHNyYywgQU1lZGlhRm9ybWF0KiBkc3QpIHsgXAorICAgICAgICBfdHlwZSBzcmNWYWwsIGRzdFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBib29sIHNyY1ByZXNlbnQgPSBBTWVkaWFGb3JtYXRfZ2V0IyNfdHlwZU5hbWUoc3JjLCBrZXksICZzcmNWYWwpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBib29sIGRzdFByZXNlbnQgPSBBTWVkaWFGb3JtYXRfZ2V0IyNfdHlwZU5hbWUoZHN0LCBrZXksICZkc3RWYWwpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gKHNyY1ByZXNlbnQgPT0gZHN0UHJlc2VudCkgJiYgKCFzcmNQcmVzZW50IHx8IChzcmNWYWwgPT0gZHN0VmFsKSk7ICAgICAgICAgXAorICAgIH0KKworREVGSU5FX0ZPUk1BVF9WQUxVRV9FUVVBTF9GVU5DKGludDY0X3QsIEludDY0KTsKK0RFRklORV9GT1JNQVRfVkFMVUVfRVFVQUxfRlVOQyhpbnQzMl90LCBJbnQzMik7CisKK3N0cnVjdCBGb3JtYXRWZXJpZmllckVudHJ5IHsKKyAgICBjb25zdCBjaGFyKiBrZXk7CisgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IGNoYXIqLCBBTWVkaWFGb3JtYXQqLCBBTWVkaWFGb3JtYXQqKT4gZXF1YWw7Cit9OworCitzdGF0aWMgY29uc3QgRm9ybWF0VmVyaWZpZXJFbnRyeSBrRmllbGRzVG9QcmVzZXJ2ZVtdID0geworICAgICAgICB7QU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZXF1YWxJbnQ2NH0sICAgICAgIHtBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBlcXVhbEludDMyfSwKKyAgICAgICAge0FNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBlcXVhbEludDMyfSwgICAgICAgICB7QU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBlcXVhbEludDMyfSwKKyAgICAgICAge0FNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQsIGVxdWFsSW50MzJ9LCAgICB7QU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCBlcXVhbEludDMyfSwKKyAgICAgICAge0FNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIGVxdWFsSW50MzJ9LCB7QU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEgsIGVxdWFsSW50MzJ9LAorICAgICAgICB7QU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hULCBlcXVhbEludDMyfSwgICAgIHtBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLCBlcXVhbEludDMyfSwKK307CisKK2NsYXNzIFRlc3RDYWxsYmFja3MgOiBwdWJsaWMgTWVkaWFUcmFuc2NvZGVyOjpDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG9uRmluaXNoZWQoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBFWFBFQ1RfRkFMU0UobUZpbmlzaGVkKTsKKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycm9yKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBFWFBFQ1RfTkUoZXJyb3IsIEFNRURJQV9PSyk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtRmluaXNoZWQpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtU3RhdHVzID0gZXJyb3I7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblByb2dyZXNzVXBkYXRlKGNvbnN0IE1lZGlhVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2dyZXNzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAocHJvZ3Jlc3MgPiAwICYmICFtUHJvZ3Jlc3NNYWRlKSB7CisgICAgICAgICAgICBtUHJvZ3Jlc3NNYWRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uQ29kZWNSZXNvdXJjZUxvc3QoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+JiBwYXVzZWRTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191bnVzZWQpIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHdhaXRGb3JUcmFuc2NvZGluZ0ZpbmlzaGVkKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKCFtRmluaXNoZWQpIHsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgd2FpdEZvclByb2dyZXNzTWFkZSgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlICghbVByb2dyZXNzTWFkZSAmJiAhbUZpbmlzaGVkKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVkaWFfc3RhdHVzX3QgbVN0YXR1cyA9IEFNRURJQV9PSzsKKyAgICBib29sIG1GaW5pc2hlZCA9IGZhbHNlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgYm9vbCBtUHJvZ3Jlc3NNYWRlID0gZmFsc2U7Cit9OworCisvLyBXcml0ZS1vbmx5LCBjcmVhdGUgZmlsZSBpZiBub24tZXhpc3RlbnQsIGRvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlLgorc3RhdGljIGNvbnN0ZXhwciBpbnQga09wZW5GbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTDsKKy8vIFVzZXIgUitXIHBlcm1pc3Npb24uCitzdGF0aWMgY29uc3RleHByIGludCBrRmlsZU1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUjsKKworY2xhc3MgTWVkaWFUcmFuc2NvZGVyVGVzdHMgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBNZWRpYVRyYW5zY29kZXJUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFuc2NvZGVyVGVzdHMgY3JlYXRlZCI7IH0KKyAgICB+TWVkaWFUcmFuc2NvZGVyVGVzdHMoKSB7IExPRyhERUJVRykgPDwgIk1lZGlhVHJhbnNjb2RlclRlc3RzIGRlc3Ryb3llZCI7IH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIk1lZGlhVHJhbnNjb2RlclRlc3RzIHNldCB1cCI7CisgICAgICAgIG1DYWxsYmFja3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYWxsYmFja3M+KCk7CisgICAgICAgIEFCaW5kZXJQcm9jZXNzX3N0YXJ0VGhyZWFkUG9vbCgpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIk1lZGlhVHJhbnNjb2RlclRlc3RzIHRlYXIgZG93biI7CisgICAgICAgIG1DYWxsYmFja3MucmVzZXQoKTsKKyAgICB9CisKKyAgICB2b2lkIGRlbGV0ZUZpbGUoY29uc3QgY2hhciogcGF0aCkgeyB1bmxpbmsocGF0aCk7IH0KKworICAgIGZsb2F0IGdldEZpbGVTaXplRGlmZlBlcmNlbnQoY29uc3QgY2hhciogcGF0aDEsIGNvbnN0IGNoYXIqIHBhdGgyLCBib29sIGFic29sdXRlID0gZmFsc2UpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgczEsIHMyOworICAgICAgICBFWFBFQ1RfRVEoc3RhdChwYXRoMSwgJnMxKSwgMCk7CisgICAgICAgIEVYUEVDVF9FUShzdGF0KHBhdGgyLCAmczIpLCAwKTsKKworICAgICAgICBpbnQ2NF90IGRpZmYgPSBzMi5zdF9zaXplIC0gczEuc3Rfc2l6ZTsKKyAgICAgICAgaWYgKGFic29sdXRlICYmIGRpZmYgPCAwKSBkaWZmID0gLWRpZmY7CisKKyAgICAgICAgcmV0dXJuIChmbG9hdClkaWZmICogMTAwLjBmIC8gczEuc3Rfc2l6ZTsKKyAgICB9CisKKyAgICB0eXBlZGVmIGVudW0geworICAgICAgICBrUnVuVG9Db21wbGV0aW9uLAorICAgICAgICBrQ2FuY2VsQWZ0ZXJQcm9ncmVzcywKKyAgICAgICAga0NhbmNlbEFmdGVyU3RhcnQsCisgICAgICAgIGtQYXVzZUFmdGVyUHJvZ3Jlc3MsCisgICAgICAgIGtQYXVzZUFmdGVyU3RhcnQsCisgICAgfSBUcmFuc2NvZGVFeGVjdXRpb25Db250cm9sOworCisgICAgdXNpbmcgRm9ybWF0Q29uZmlndXJhdGlvbkNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjxBTWVkaWFGb3JtYXQqKEFNZWRpYUZvcm1hdCopPjsKKyAgICBtZWRpYV9zdGF0dXNfdCB0cmFuc2NvZGVIZWxwZXIoY29uc3QgY2hhciogc3JjUGF0aCwgY29uc3QgY2hhciogZGVzdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdENvbmZpZ3VyYXRpb25DYWxsYmFjayBmb3JtYXRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RlRXhlY3V0aW9uQ29udHJvbCBleGVjdXRpb25Db250cm9sID0ga1J1blRvQ29tcGxldGlvbikgeworICAgICAgICBhdXRvIHRyYW5zY29kZXIgPSBNZWRpYVRyYW5zY29kZXI6OmNyZWF0ZShtQ2FsbGJhY2tzKTsKKyAgICAgICAgRVhQRUNUX05FKHRyYW5zY29kZXIsIG51bGxwdHIpOworCisgICAgICAgIGNvbnN0IGludCBzcmNGZCA9IG9wZW4oc3JjUGF0aCwgT19SRE9OTFkpOworICAgICAgICBFWFBFQ1RfRVEodHJhbnNjb2Rlci0+Y29uZmlndXJlU291cmNlKHNyY0ZkKSwgQU1FRElBX09LKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pj4gdHJhY2tGb3JtYXRzID0gdHJhbnNjb2Rlci0+Z2V0VHJhY2tGb3JtYXRzKCk7CisgICAgICAgIEVYUEVDVF9HVCh0cmFja0Zvcm1hdHMuc2l6ZSgpLCAwKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrRm9ybWF0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBmb3JtYXRDYWxsYmFjayh0cmFja0Zvcm1hdHNbaV0uZ2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZXItPmNvbmZpZ3VyZVRyYWNrRm9ybWF0KGksIGZvcm1hdCksIEFNRURJQV9PSyk7CisKKyAgICAgICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmlkZW8gdHJhY2sgZm9ybWF0IGZvciB2ZXJpZmljYXRpb24uCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXRzW2ldLmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZVZpZGVvRm9ybWF0ID0gdHJhY2tGb3JtYXRzW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlRmlsZShkZXN0UGF0aCk7CisgICAgICAgIGNvbnN0IGludCBkc3RGZCA9IG9wZW4oZGVzdFBhdGgsIGtPcGVuRmxhZ3MsIGtGaWxlTW9kZSk7CisgICAgICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVyLT5jb25maWd1cmVEZXN0aW5hdGlvbihkc3RGZCksIEFNRURJQV9PSyk7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhcnRTdGF0dXMgPSB0cmFuc2NvZGVyLT5zdGFydCgpOworICAgICAgICBFWFBFQ1RfRVEoc3RhcnRTdGF0dXMsIEFNRURJQV9PSyk7CisKKyAgICAgICAgaWYgKHN0YXJ0U3RhdHVzID09IEFNRURJQV9PSykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4gcGF1c2VkU3RhdGU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZXhlY3V0aW9uQ29udHJvbCkgeworICAgICAgICAgICAgY2FzZSBrQ2FuY2VsQWZ0ZXJQcm9ncmVzczoKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT53YWl0Rm9yUHJvZ3Jlc3NNYWRlKCk7CisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBjYXNlIGtDYW5jZWxBZnRlclN0YXJ0OgorICAgICAgICAgICAgICAgIHRyYW5zY29kZXItPmNhbmNlbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrUGF1c2VBZnRlclByb2dyZXNzOgorICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPndhaXRGb3JQcm9ncmVzc01hZGUoKTsKKyAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGNhc2Uga1BhdXNlQWZ0ZXJTdGFydDoKKyAgICAgICAgICAgICAgICB0cmFuc2NvZGVyLT5wYXVzZSgmcGF1c2VkU3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrUnVuVG9Db21wbGV0aW9uOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT53YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb3NlKHNyY0ZkKTsKKyAgICAgICAgY2xvc2UoZHN0RmQpOworCisgICAgICAgIHJldHVybiBtQ2FsbGJhY2tzLT5tU3RhdHVzOworICAgIH0KKworICAgIHZvaWQgdGVzdFRyYW5zY29kZVZpZGVvKGNvbnN0IGNoYXIqIHNyY1BhdGgsIGNvbnN0IGNoYXIqIGRlc3RQYXRoLCBjb25zdCBjaGFyKiBkc3RNaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cmF0ZSA9IDApIHsKKyAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZUhlbHBlcihzcmNQYXRoLCBkZXN0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZHN0TWltZSwgYml0cmF0ZV0oQU1lZGlhRm9ybWF0KiBzb3VyY2VGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhzb3VyY2VGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWltZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXRyYXRlID4gMCB8fCBkc3RNaW1lICE9IG51bGxwdHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRyYXRlID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgYml0cmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc3RNaW1lICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TWltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisKKyAgICAgICAgaWYgKGRzdE1pbWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Rm9ybWF0VmVyaWZpZXJFbnRyeT4gZXh0cmFWZXJpZmllcnMgPSB7CisgICAgICAgICAgICAgICAgICAgIHtBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgICAgICAgICAgICAgICBbZHN0TWltZV0oY29uc3QgY2hhcioga2V5LCBBTWVkaWFGb3JtYXQqIHNyYyBfX3VudXNlZCwgQU1lZGlhRm9ybWF0KiBkc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGRzdCwga2V5LCAmbWltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFzdHJjbXAobWltZSwgZHN0TWltZSk7CisgICAgICAgICAgICAgICAgICAgICB9fSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2ZXJpZnlPdXRwdXRGb3JtYXQoZGVzdFBhdGgsICZleHRyYVZlcmlmaWVycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ZXJpZnlPdXRwdXRGb3JtYXQoZGVzdFBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB2ZXJpZnlPdXRwdXRGb3JtYXQoY29uc3QgY2hhciogZGVzdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Rm9ybWF0VmVyaWZpZXJFbnRyeT4qIGV4dHJhVmVyaWZpZXJzID0gbnVsbHB0cikgeworICAgICAgICBpbnQgZHN0RmQgPSBvcGVuKGRlc3RQYXRoLCBPX1JET05MWSk7CisgICAgICAgIEVYUEVDVF9HVChkc3RGZCwgMCk7CisgICAgICAgIHNzaXplX3QgZmlsZVNpemUgPSBsc2Vlayhkc3RGZCwgMCwgU0VFS19FTkQpOworICAgICAgICBsc2Vlayhkc3RGZCwgMCwgU0VFS19TRVQpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gc2FtcGxlUmVhZGVyID0KKyAgICAgICAgICAgICAgICBNZWRpYVNhbXBsZVJlYWRlck5ESzo6Y3JlYXRlRnJvbUZkKGRzdEZkLCAwLCBmaWxlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShzYW1wbGVSZWFkZXIsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IHZpZGVvRm9ybWF0OworICAgICAgICBjb25zdCBzaXplX3QgdHJhY2tDb3VudCA9IHNhbXBsZVJlYWRlci0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCA9IHNhbXBsZVJlYWRlci0+Z2V0VHJhY2tGb3JtYXQoc3RhdGljX2Nhc3Q8aW50Pih0cmFja0luZGV4KSk7CisgICAgICAgICAgICBpZiAodHJhY2tGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworCisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJUcmFjayAjICIgPDwgdHJhY2tJbmRleCA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcodHJhY2tGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICB2aWRlb0Zvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KHRyYWNrRm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEVYUEVDVF9ORSh2aWRlb0Zvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgTE9HKElORk8pIDw8ICJzb3VyY2UgdmlkZW8gZm9ybWF0OiAiIDw8IEFNZWRpYUZvcm1hdF90b1N0cmluZyhtU291cmNlVmlkZW9Gb3JtYXQuZ2V0KCkpOworICAgICAgICBMT0coSU5GTykgPDwgInRyYW5zY29kZWQgdmlkZW8gZm9ybWF0OiAiIDw8IEFNZWRpYUZvcm1hdF90b1N0cmluZyh2aWRlb0Zvcm1hdC5nZXQoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoc2l6ZW9mKGtGaWVsZHNUb1ByZXNlcnZlKSAvIHNpemVvZihrRmllbGRzVG9QcmVzZXJ2ZVswXSkpOyArK2kpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKGtGaWVsZHNUb1ByZXNlcnZlW2ldLmVxdWFsKGtGaWVsZHNUb1ByZXNlcnZlW2ldLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VWaWRlb0Zvcm1hdC5nZXQoKSwgdmlkZW9Gb3JtYXQuZ2V0KCkpKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIGF0IGtleSAiIDw8IGtGaWVsZHNUb1ByZXNlcnZlW2ldLmtleTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHRyYVZlcmlmaWVycyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhVmVyaWZpZXJzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFZlcmlmaWVyRW50cnkmIGVudHJ5ID0gKCpleHRyYVZlcmlmaWVycylbaV07CisgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoZW50cnkuZXF1YWwoZW50cnkua2V5LCBtU291cmNlVmlkZW9Gb3JtYXQuZ2V0KCksIHZpZGVvRm9ybWF0LmdldCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbG9zZShkc3RGZCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDYWxsYmFja3M+IG1DYWxsYmFja3M7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbVNvdXJjZVZpZGVvRm9ybWF0OworfTsKKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0UGFzc3Rocm91Z2gpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1Bhc3N0aHJvdWdoLk1QNCI7CisgICAgdGVzdFRyYW5zY29kZVZpZGVvKHNyY1BhdGgsIGRlc3RQYXRoLCBudWxscHRyKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0VmlkZW9UcmFuc2NvZGVfQXZjVG9BdmNfQmFzaWMpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1ZpZGVvVHJhbnNjb2RlX0F2Y1RvQXZjX0Jhc2ljLk1QNCI7CisgICAgdGVzdFRyYW5zY29kZVZpZGVvKHNyY1BhdGgsIGRlc3RQYXRoLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0VmlkZW9UcmFuc2NvZGVfSGV2Y1RvQXZjX0Jhc2ljKSB7CisgICAgY29uc3QgY2hhciogc3JjUGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2pldHNfaGV2Y18xMjgweDcyMF8yME1icHMubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1ZpZGVvVHJhbnNjb2RlX0hldmNUb0F2Y19CYXNpYy5NUDQiOworICAgIHRlc3RUcmFuc2NvZGVWaWRlbyhzcmNQYXRoLCBkZXN0UGF0aCwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kZXJUZXN0cywgVGVzdFZpZGVvVHJhbnNjb2RlX0hldmNUb0F2Y19Sb3RhdGlvbikgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPQorICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvZGVza19oZXZjXzE5MjB4MTA4MF9hYWNfNDhLSHpfcm90OTAubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1ZpZGVvVHJhbnNjb2RlX0hldmNUb0F2Y19Sb3RhdGlvbi5NUDQiOworICAgIHRlc3RUcmFuc2NvZGVWaWRlbyhzcmNQYXRoLCBkZXN0UGF0aCwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kZXJUZXN0cywgVGVzdFByZXNlcnZlQml0cmF0ZSkgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQiOworICAgIGNvbnN0IGNoYXIqIGRlc3RQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9NZWRpYVRyYW5zY29kZXJfUHJlc2VydmVCaXRyYXRlLk1QNCI7CisgICAgdGVzdFRyYW5zY29kZVZpZGVvKHNyY1BhdGgsIGRlc3RQYXRoLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIC8vIFJlcXVpcmUgbWF4aW11bSBvZiAyNSUgZGlmZmVyZW5jZSBpbiBmaWxlIHNpemUuCisgICAgLy8gVE9ETyhiLzE3NDY3ODMzNik6IEZpbmQgYSBiZXR0ZXIgdGVzdCBhc3NldCB0byB0aWdodGVuIHRoZSB0aHJlc2hvbGQuCisgICAgRVhQRUNUX0xUKGdldEZpbGVTaXplRGlmZlBlcmNlbnQoc3JjUGF0aCwgZGVzdFBhdGgsIHRydWUgLyogYWJzb2x1dGUqLyksIDI1KTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0Q3VzdG9tQml0cmF0ZSkgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQiOworICAgIGNvbnN0IGNoYXIqIGRlc3RQYXRoMSA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX0N1c3RvbUJpdHJhdGVfMk1icHMuTVA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aDIgPSAiL2RhdGEvbG9jYWwvdG1wL01lZGlhVHJhbnNjb2Rlcl9DdXN0b21CaXRyYXRlXzhNYnBzLk1QNCI7CisgICAgdGVzdFRyYW5zY29kZVZpZGVvKHNyY1BhdGgsIGRlc3RQYXRoMSwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgMiAqIDEwMDAgKiAxMDAwKTsKKyAgICBtQ2FsbGJhY2tzID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0Q2FsbGJhY2tzPigpOworICAgIHRlc3RUcmFuc2NvZGVWaWRlbyhzcmNQYXRoLCBkZXN0UGF0aDIsIEFNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIDggKiAxMDAwICogMTAwMCk7CisKKyAgICAvLyBUaGUgc291cmNlIGFzc2V0IGlzIHZlcnkgc2hvcnQgYW5kIGhlYXZpbHkgY29tcHJlc3NlZCBmcm9tIHRoZSBiZWdpbm5pbmcgc28gZG9uJ3QgZXhwZWN0IHRoZQorICAgIC8vIHJlcXVlc3RlZCBiaXRyYXRlIHRvIGJlIGV4YWN0bHkgbWF0Y2hlZC4gSG93ZXZlciB0aGUgOG1icHMgc2hvdWxkIGF0IGxlYXN0IGJlIGxhcmdlci4KKyAgICAvLyBUT0RPKGIvMTc0Njc4MzM2KTogRmluZCBhIGJldHRlciB0ZXN0IGFzc2V0IHRvIHRpZ2h0ZW4gdGhlIHRocmVzaG9sZC4KKyAgICBFWFBFQ1RfR1QoZ2V0RmlsZVNpemVEaWZmUGVyY2VudChkZXN0UGF0aDEsIGRlc3RQYXRoMiksIDEwKTsKK30KKworc3RhdGljIEFNZWRpYUZvcm1hdCogZ2V0QVZDVmlkZW9Gb3JtYXQoQU1lZGlhRm9ybWF0KiBzb3VyY2VGb3JtYXQpIHsKKyAgICBBTWVkaWFGb3JtYXQqIGZvcm1hdCA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhzb3VyY2VGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworCisgICAgaWYgKHN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9ybWF0OworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGVyVGVzdHMsIFRlc3RDYW5jZWxBZnRlclByb2dyZXNzKSB7CisgICAgY29uc3QgY2hhciogc3JjUGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQiOworICAgIGNvbnN0IGNoYXIqIGRlc3RQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9NZWRpYVRyYW5zY29kZXJfQ2FuY2VsLk1QNCI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZUhlbHBlcihzcmNQYXRoLCBkZXN0UGF0aCwgZ2V0QVZDVmlkZW9Gb3JtYXQsIGtDYW5jZWxBZnRlclByb2dyZXNzKSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtQ2FsbGJhY2tzLT5tRmluaXNoZWQpOworICAgICAgICBtQ2FsbGJhY2tzID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0Q2FsbGJhY2tzPigpOworICAgIH0KK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0Q2FuY2VsQWZ0ZXJTdGFydCkgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9sb25ndGVzdF8xNXMubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX0NhbmNlbC5NUDQiOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVIZWxwZXIoc3JjUGF0aCwgZGVzdFBhdGgsIGdldEFWQ1ZpZGVvRm9ybWF0LCBrQ2FuY2VsQWZ0ZXJTdGFydCksCisgICAgICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgICAgICBFWFBFQ1RfRkFMU0UobUNhbGxiYWNrcy0+bUZpbmlzaGVkKTsKKyAgICAgICAgbUNhbGxiYWNrcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdENhbGxiYWNrcz4oKTsKKyAgICB9Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kZXJUZXN0cywgVGVzdFBhdXNlQWZ0ZXJQcm9ncmVzcykgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9sb25ndGVzdF8xNXMubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1BhdXNlLk1QNCI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZUhlbHBlcihzcmNQYXRoLCBkZXN0UGF0aCwgZ2V0QVZDVmlkZW9Gb3JtYXQsIGtQYXVzZUFmdGVyUHJvZ3Jlc3MpLAorICAgICAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1DYWxsYmFja3MtPm1GaW5pc2hlZCk7CisgICAgICAgIG1DYWxsYmFja3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYWxsYmFja3M+KCk7CisgICAgfQorfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGVyVGVzdHMsIFRlc3RQYXVzZUFmdGVyU3RhcnQpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNCI7CisgICAgY29uc3QgY2hhciogZGVzdFBhdGggPSAiL2RhdGEvbG9jYWwvdG1wL01lZGlhVHJhbnNjb2Rlcl9QYXVzZS5NUDQiOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVIZWxwZXIoc3JjUGF0aCwgZGVzdFBhdGgsIGdldEFWQ1ZpZGVvRm9ybWF0LCBrUGF1c2VBZnRlclN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtQ2FsbGJhY2tzLT5tRmluaXNoZWQpOworICAgICAgICBtQ2FsbGJhY2tzID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0Q2FsbGJhY2tzPigpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDcxZWZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCBUZXN0IGZvciBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlcgorCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIlRyYWNrVHJhbnNjb2RlclRlc3RVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzIGNyZWF0ZWQiOyB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBMT0coREVCVUcpIDw8ICJQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzIHNldCB1cCI7IH0KKworICAgIHZvaWQgaW5pdFNvdXJjZUFuZEV4dHJhY3RvcigpIHsKKyAgICAgICAgY29uc3QgY2hhciogc291cmNlUGF0aCA9CisgICAgICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKKworICAgICAgICBtRXh0cmFjdG9yID0gQU1lZGlhRXh0cmFjdG9yX25ldygpOworICAgICAgICBBU1NFUlRfTkUobUV4dHJhY3RvciwgbnVsbHB0cik7CisKKyAgICAgICAgbVNvdXJjZUZkID0gb3Blbihzb3VyY2VQYXRoLCBPX1JET05MWSk7CisgICAgICAgIEFTU0VSVF9HVChtU291cmNlRmQsIDApOworCisgICAgICAgIG1Tb3VyY2VGaWxlU2l6ZSA9IGxzZWVrKG1Tb3VyY2VGZCwgMCwgU0VFS19FTkQpOworICAgICAgICBsc2VlayhtU291cmNlRmQsIDAsIFNFRUtfU0VUKTsKKworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQobUV4dHJhY3RvciwgbVNvdXJjZUZkLCAwLCBtU291cmNlRmlsZVNpemUpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spOworCisgICAgICAgIGNvbnN0IHNpemVfdCB0cmFja0NvdW50ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQobUV4dHJhY3Rvcik7CisgICAgICAgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgdHJhY2tDb3VudDsgdHJhY2tJbmRleCsrKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KG1FeHRyYWN0b3IsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKTsKKworICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShtaW1lLCBudWxscHRyKTsKKworICAgICAgICAgICAgaWYgKHN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgICAgICAgICAgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKG1FeHRyYWN0b3IsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIlBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMgdGVhciBkb3duIjsKKyAgICAgICAgaWYgKG1FeHRyYWN0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShtRXh0cmFjdG9yKTsKKyAgICAgICAgICAgIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtU291cmNlRmQgPiAwKSB7CisgICAgICAgICAgICBjbG9zZShtU291cmNlRmQpOworICAgICAgICAgICAgbVNvdXJjZUZkID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+UGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cygpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cyBkZXN0cm95ZWQiOworICAgIH0KKworICAgIGludCBtU291cmNlRmQgPSAtMTsKKyAgICBzaXplX3QgbVNvdXJjZUZpbGVTaXplOworICAgIGludCBtVHJhY2tJbmRleDsKKyAgICBBTWVkaWFFeHRyYWN0b3IqIG1FeHRyYWN0b3IgPSBudWxscHRyOworfTsKKworLyoqIEhlbHBlciBjbGFzcyBmb3IgY29tcGFyaW5nIHNhbXBsZSBkYXRhIHVzaW5nIGNoZWNrc3Vtcy4gKi8KK2NsYXNzIFNhbXBsZUlEIHsKK3B1YmxpYzoKKyAgICBTYW1wbGVJRChjb25zdCB1aW50OF90KiBzYW1wbGVEYXRhLCBzc2l6ZV90IHNhbXBsZVNpemUpIDogbVNpemV7c2FtcGxlU2l6ZX0geworICAgICAgICBNRDVfQ1RYIG1kNUN0eDsKKyAgICAgICAgTUQ1X0luaXQoJm1kNUN0eCk7CisgICAgICAgIE1ENV9VcGRhdGUoJm1kNUN0eCwgc2FtcGxlRGF0YSwgc2FtcGxlU2l6ZSk7CisgICAgICAgIE1ENV9GaW5hbChtQ2hlY2tzdW0sICZtZDVDdHgpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTYW1wbGVJRCYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2l6ZSA9PSByaHMubVNpemUgJiYgbWVtY21wKG1DaGVja3N1bSwgcmhzLm1DaGVja3N1bSwgTUQ1X0RJR0VTVF9MRU5HVEgpID09IDA7CisgICAgfQorCisgICAgdWludDhfdCBtQ2hlY2tzdW1bTUQ1X0RJR0VTVF9MRU5HVEhdOworICAgIHNzaXplX3QgbVNpemU7Cit9OworCisvKioKKyAqIFRlc3RzIHRoYXQgdGhlIG91dHB1dCBzYW1wbGVzIG9mIFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyIGFyZSBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBzYW1wbGVzCisgKiBhbmQgaW4gY29ycmVjdCBvcmRlci4KKyAqLworVEVTVF9GKFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMsIFNhbXBsZUVxdWFsaXR5KSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBTYW1wbGVFcXVhbGl0eSI7CisKKyAgICBzc2l6ZV90IGJ1ZmZlclNpemUgPSAxMDI0OworICAgIGF1dG8gYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KGJ1ZmZlclNpemUpOworCisgICAgaW5pdFNvdXJjZUFuZEV4dHJhY3RvcigpOworCisgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzYW1wbGVzIG9mIGEgdHJhY2sgYW5kIHN0b3JlIHNpemUgYW5kIGNoZWNrc3Vtcy4KKyAgICBzdGQ6OnZlY3RvcjxTYW1wbGVJRD4gc2FtcGxlQ2hlY2tzdW1zOworCisgICAgaW50NjRfdCBzYW1wbGVUaW1lID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUobUV4dHJhY3Rvcik7CisgICAgd2hpbGUgKHNhbXBsZVRpbWUgIT0gLTEpIHsKKyAgICAgICAgaWYgKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KG1FeHRyYWN0b3IpID09IG1UcmFja0luZGV4KSB7CisgICAgICAgICAgICBzc2l6ZV90IHNhbXBsZVNpemUgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShtRXh0cmFjdG9yKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJTaXplIDwgc2FtcGxlU2l6ZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBzYW1wbGVTaXplOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPQorICAgICAgICAgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEobUV4dHJhY3RvciwgYnVmZmVyLmdldCgpLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShieXRlc1JlYWQsIHNhbXBsZVNpemUpOworCisgICAgICAgICAgICBTYW1wbGVJRCBzYW1wbGVJZHtidWZmZXIuZ2V0KCksIHNhbXBsZVNpemV9OworICAgICAgICAgICAgc2FtcGxlQ2hlY2tzdW1zLnB1c2hfYmFjayhzYW1wbGVJZCk7CisgICAgICAgIH0KKworICAgICAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShtRXh0cmFjdG9yKTsKKyAgICAgICAgc2FtcGxlVGltZSA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKG1FeHRyYWN0b3IpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhbmQgc3RhcnQgdGhlIHRyYW5zY29kZXIuCisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDYWxsYmFjaz4gY2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYWxsYmFjaz4oKTsKKyAgICBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlciB0cmFuc2NvZGVye2NhbGxiYWNrfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gbWVkaWFTYW1wbGVSZWFkZXIgPQorICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChtU291cmNlRmQsIDAsIG1Tb3VyY2VGaWxlU2l6ZSk7CisgICAgRVhQRUNUX05FKG1lZGlhU2FtcGxlUmVhZGVyLCBudWxscHRyKTsKKworICAgIEVYUEVDVF9FUShtZWRpYVNhbXBsZVJlYWRlci0+c2VsZWN0VHJhY2sobVRyYWNrSW5kZXgpLCBBTUVESUFfT0spOworICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVyLmNvbmZpZ3VyZShtZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG51bGxwdHIgLyogZGVzdGluYXRpb25Gb3JtYXQgKi8pLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgIEFTU0VSVF9UUlVFKHRyYW5zY29kZXIuc3RhcnQoKSk7CisKKyAgICAvLyBQdWxsIHRyYW5zY29kZXIncyBvdXRwdXQgc2FtcGxlcyBhbmQgY29tcGFyZSBhZ2FpbnN0IGlucHV0IGNoZWNrc3Vtcy4KKyAgICBib29sIGVvcyA9IGZhbHNlOworICAgIHVpbnQ2NF90IHNhbXBsZUNvdW50ID0gMDsKKyAgICB0cmFuc2NvZGVyLnNldFNhbXBsZUNvbnN1bWVyKAorICAgICAgICAgICAgWyZzYW1wbGVDb3VudCwgJnNhbXBsZUNoZWNrc3VtcywgJmVvc10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHNhbXBsZSwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGVvcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNhbXBsZUlEIHNhbXBsZUlke3NhbXBsZS0+YnVmZmVyLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihzYW1wbGUtPmluZm8uc2l6ZSl9OworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShzYW1wbGVJZCA9PSBzYW1wbGVDaGVja3N1bXNbc2FtcGxlQ291bnRdKTsKKyAgICAgICAgICAgICAgICAgICAgKytzYW1wbGVDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgIGNhbGxiYWNrLT53YWl0VW50aWxGaW5pc2hlZCgpOworICAgIEVYUEVDVF9FUShzYW1wbGVDb3VudCwgc2FtcGxlQ2hlY2tzdW1zLnNpemUoKSk7Cit9CisKKy8qKiBDbGFzcyBmb3IgdGVzdGluZyBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlcidzIGJ1aWx0IGluIGJ1ZmZlciBwb29sLiAqLworY2xhc3MgQnVmZmVyUG9vbFRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEJ1ZmZlcnMgPSA1OworCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiQnVmZmVyUG9vbFRlc3RzIHNldCB1cCI7CisgICAgICAgIG1CdWZmZXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlcjo6QnVmZmVyUG9vbD4oa01heEJ1ZmZlcnMpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkJ1ZmZlclBvb2xUZXN0cyB0ZWFyIGRvd24iOworICAgICAgICBtQnVmZmVyUG9vbC5yZXNldCgpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlcjo6QnVmZmVyUG9vbD4gbUJ1ZmZlclBvb2w7Cit9OworCitURVNUX0YoQnVmZmVyUG9vbFRlc3RzLCBCdWZmZXJSZXVzZSkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgQnVmZmVyUmV1c2UiOworCisgICAgdWludDhfdCogYnVmZmVyMSA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZSgxMCk7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjEsIG51bGxwdHIpOworCisgICAgdWludDhfdCogYnVmZmVyMiA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZSgxMCk7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjIsIG51bGxwdHIpOworICAgIEVYUEVDVF9ORShidWZmZXIyLCBidWZmZXIxKTsKKworICAgIG1CdWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoYnVmZmVyMSk7CisKKyAgICB1aW50OF90KiBidWZmZXIzID0gbUJ1ZmZlclBvb2wtPmdldEJ1ZmZlcldpdGhTaXplKDEwKTsKKyAgICBFWFBFQ1RfTkUoYnVmZmVyMywgbnVsbHB0cik7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjMsIGJ1ZmZlcjIpOworICAgIEVYUEVDVF9FUShidWZmZXIzLCBidWZmZXIxKTsKKworICAgIG1CdWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoYnVmZmVyMik7CisKKyAgICB1aW50OF90KiBidWZmZXI0ID0gbUJ1ZmZlclBvb2wtPmdldEJ1ZmZlcldpdGhTaXplKDEwKTsKKyAgICBFWFBFQ1RfTkUoYnVmZmVyNCwgbnVsbHB0cik7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjQsIGJ1ZmZlcjEpOworICAgIEVYUEVDVF9FUShidWZmZXI0LCBidWZmZXIyKTsKK30KKworVEVTVF9GKEJ1ZmZlclBvb2xUZXN0cywgU21hbGxlc3RBdmFpbGFibGVCdWZmZXIpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFNtYWxsZXN0QXZhaWxhYmxlQnVmZmVyIjsKKworICAgIHVpbnQ4X3QqIGJ1ZmZlcjEgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoMTApOworICAgIEVYUEVDVF9ORShidWZmZXIxLCBudWxscHRyKTsKKworICAgIHVpbnQ4X3QqIGJ1ZmZlcjIgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoMTUpOworICAgIEVYUEVDVF9ORShidWZmZXIyLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfTkUoYnVmZmVyMiwgYnVmZmVyMSk7CisKKyAgICB1aW50OF90KiBidWZmZXIzID0gbUJ1ZmZlclBvb2wtPmdldEJ1ZmZlcldpdGhTaXplKDIwKTsKKyAgICBFWFBFQ1RfTkUoYnVmZmVyMywgbnVsbHB0cik7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjMsIGJ1ZmZlcjEpOworICAgIEVYUEVDVF9ORShidWZmZXIzLCBidWZmZXIyKTsKKworICAgIG1CdWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoYnVmZmVyMSk7CisgICAgbUJ1ZmZlclBvb2wtPnJldHVybkJ1ZmZlcihidWZmZXIyKTsKKyAgICBtQnVmZmVyUG9vbC0+cmV0dXJuQnVmZmVyKGJ1ZmZlcjMpOworCisgICAgdWludDhfdCogYnVmZmVyNCA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZSgxMSk7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjQsIG51bGxwdHIpOworICAgIEVYUEVDVF9FUShidWZmZXI0LCBidWZmZXIyKTsKKworICAgIHVpbnQ4X3QqIGJ1ZmZlcjUgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoMTEpOworICAgIEVYUEVDVF9ORShidWZmZXI1LCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEoYnVmZmVyNSwgYnVmZmVyMyk7Cit9CisKK1RFU1RfRihCdWZmZXJQb29sVGVzdHMsIEFkZEFmdGVyQWJvcnQpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIEFkZEFmdGVyQWJvcnQiOworCisgICAgdWludDhfdCogYnVmZmVyMSA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZSgxMCk7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjEsIG51bGxwdHIpOworICAgIG1CdWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoYnVmZmVyMSk7CisKKyAgICBtQnVmZmVyUG9vbC0+YWJvcnQoKTsKKyAgICB1aW50OF90KiBidWZmZXIyID0gbUJ1ZmZlclBvb2wtPmdldEJ1ZmZlcldpdGhTaXplKDEwKTsKKyAgICBFWFBFQ1RfRVEoYnVmZmVyMiwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihCdWZmZXJQb29sVGVzdHMsIE1heGltdW1CdWZmZXJzKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBNYXhpbXVtQnVmZmVycyI7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrQnVmZmVyQmFzZVNpemUgPSAxMDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDhfdCosIHNpemVfdD4gYWRkcmVzc1NpemVNYXA7CisKKyAgICAvLyBHZXQga01heEJ1ZmZlcnMgKiAyIG5ldyBidWZmZXJzIHdpdGggaW5jcmVhc2luZyBzaXplLgorICAgIC8vIChOb3RlOiBPbmNlIGtNYXhCdWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQsIHRoZSBwb29sIHdpbGwgZGVsZXRlIG9sZCBidWZmZXJzIHRvIGFjY29tbW9kYXRlCisgICAgLy8gbmV3IG9uZXMgbWFraW5nIHRoZSBkZWxldGVkIGJ1ZmZlcnMgZnJlZSB0byBiZSByZXVzZWQgYnkgdGhlIHN5c3RlbSdzIGhlYXAgbWVtb3J5IGFsbG9jYXRvci4KKyAgICAvLyBTbyB3ZSBjYW5ub3QgdGVzdCB0aGF0IGVhY2ggbmV3IHBvaW50ZXIgaXMgdW5pcXVlIGhlcmUuKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heEJ1ZmZlcnMgKiAyOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBrQnVmZmVyQmFzZVNpemUgKyBpOworICAgICAgICB1aW50OF90KiBidWZmZXIgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoc2l6ZSk7CisgICAgICAgIEVYUEVDVF9ORShidWZmZXIsIG51bGxwdHIpOworICAgICAgICBhZGRyZXNzU2l6ZU1hcFtidWZmZXJdID0gc2l6ZTsKKyAgICAgICAgbUJ1ZmZlclBvb2wtPnJldHVybkJ1ZmZlcihidWZmZXIpOworICAgIH0KKworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBwb29sIG5vdyBjb250YWlucyB0aGUga01heEJ1ZmZlcnMgbGFyZ2VzdCBidWZmZXJzIGFsbG9jYXRlZCBhYm92ZSBhbmQgdGhhdAorICAgIC8vIHRoZSBidWZmZXIgb2YgbWF0Y2hpbmcgc2l6ZSBpcyByZXR1cm5lZC4KKyAgICBmb3IgKGludCBpID0ga01heEJ1ZmZlcnM7IGkgPCBrTWF4QnVmZmVycyAqIDI7IGkrKykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IGtCdWZmZXJCYXNlU2l6ZSArIGk7CisgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZShzaXplKTsKKyAgICAgICAgRVhQRUNUX05FKGJ1ZmZlciwgbnVsbHB0cik7CisKKyAgICAgICAgYXV0byBpdCA9IGFkZHJlc3NTaXplTWFwLmZpbmQoYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX05FKGl0LCBhZGRyZXNzU2l6ZU1hcC5lbmQoKSk7CisgICAgICAgIEVYUEVDVF9FUShpdC0+c2Vjb25kLCBzaXplKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wtPnJldHVybkJ1ZmZlcihidWZmZXIpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9SRUFETUUubWQgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDE3YjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQgQEAKKyMjIFRyYW5zY29kZXIgVGVzdGluZyAjIworLS0tCisjIyMjIFRyYW5zY29kZXIgdW5pdCB0ZXN0cyA6CitUbyBydW4gYWxsIHRyYW5zY29kZXIgdW5pdCB0ZXN0cywgcnVuIHRoZSBzdXBwbGllZCBzY3JpcHQgZnJvbSB0aGlzIGZvbGRlcjoKKworYGBgCisuL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKK2BgYAorCitUbyBydW4gaW5kaXZpZHVhbCB1bml0IHRlc3QgbW9kdWxlcywgdXNlIGF0ZXN0OgorCitgYGAKK2F0ZXN0IE1lZGlhU2FtcGxlUmVhZGVyTkRLCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9UcmFja1RyYW5zY29kZXJUZXN0VXRpbHMuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9UcmFja1RyYW5zY29kZXJUZXN0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzgyZjcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL1RyYWNrVHJhbnNjb2RlclRlc3RVdGlscy5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjay5oPgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRlc3QgdXRpbGl0aWVzIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSB0cmFjayB0cmFuc2NvZGVyIHRlc3QuCisvLworCitjbGFzcyBUcmFja1RyYW5zY29kZXJUZXN0VXRpbHMgeworcHVibGljOgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBnZXREZWZhdWx0VmlkZW9EZXN0aW5hdGlvbkZvcm1hdCgKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogc291cmNlRm9ybWF0LCBib29sIGluY2x1ZGVCaXRyYXRlID0gdHJ1ZSkgeworICAgICAgICAvLyBEZWZhdWx0IHZpZGVvIGRlc3RpbmF0aW9uIGZvcm1hdCBzZXR1cC4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRnJhbWVSYXRlID0gMzAuMGY7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrQml0UmF0ZSA9IDIgKiAxMDAwICogMTAwMDsKKworICAgICAgICBBTWVkaWFGb3JtYXQqIGRlc3RpbmF0aW9uRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBTWVkaWFGb3JtYXRfY29weShkZXN0aW5hdGlvbkZvcm1hdCwgc291cmNlRm9ybWF0KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KGRlc3RpbmF0aW9uRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGtGcmFtZVJhdGUpOworICAgICAgICBpZiAoaW5jbHVkZUJpdHJhdGUpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihkZXN0aW5hdGlvbkZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwga0JpdFJhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KGRlc3RpbmF0aW9uRm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgfQorfTsKKworY2xhc3MgVGVzdENhbGxiYWNrIDogcHVibGljIE1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2sgeworcHVibGljOgorICAgIFRlc3RDYWxsYmFjaygpID0gZGVmYXVsdDsKKyAgICB+VGVzdENhbGxiYWNrKCkgPSBkZWZhdWx0OworCisgICAgLy8gTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjaworICAgIHZvaWQgb25UcmFja0Zvcm1hdEF2YWlsYWJsZShjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVRyYWNrRm9ybWF0QXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgbVRyYWNrRm9ybWF0QXZhaWxhYmxlQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uVHJhY2tGaW5pc2hlZChjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVRyYW5zY29kaW5nRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtVHJhbnNjb2RpbmdGaW5pc2hlZENvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tTdG9wcGVkKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtVHJhbnNjb2RpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1UcmFuc2NvZGluZ1N0b3BwZWQgPSB0cnVlOworICAgICAgICBtVHJhbnNjb2RpbmdGaW5pc2hlZENvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdm9pZCBvblRyYWNrRXJyb3IoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQsIG1lZGlhX3N0YXR1c190IHN0YXR1cykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVRyYW5zY29kaW5nRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtU3RhdHVzID0gc3RhdHVzOworICAgICAgICBtVHJhbnNjb2RpbmdGaW5pc2hlZENvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorICAgIC8vIH5NZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrCisKKyAgICBtZWRpYV9zdGF0dXNfdCB3YWl0VW50aWxGaW5pc2hlZCgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlICghbVRyYW5zY29kaW5nRmluaXNoZWQpIHsKKyAgICAgICAgICAgIG1UcmFuc2NvZGluZ0ZpbmlzaGVkQ29uZGl0aW9uLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdGF0dXM7CisgICAgfQorCisgICAgdm9pZCB3YWl0VW50aWxUcmFja0Zvcm1hdEF2YWlsYWJsZSgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlICghbVRyYWNrRm9ybWF0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBtVHJhY2tGb3JtYXRBdmFpbGFibGVDb25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgdHJhbnNjb2RpbmdXYXNTdG9wcGVkKCkgY29uc3QgeyByZXR1cm4gbVRyYW5zY29kaW5nRmluaXNoZWQgJiYgbVRyYW5zY29kaW5nU3RvcHBlZDsgfQorICAgIGJvb2wgdHJhbnNjb2RpbmdGaW5pc2hlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2NvZGluZ0ZpbmlzaGVkICYmICFtVHJhbnNjb2RpbmdTdG9wcGVkICYmIG1TdGF0dXMgPT0gQU1FRElBX09LOworICAgIH0KKworcHJpdmF0ZToKKyAgICBtZWRpYV9zdGF0dXNfdCBtU3RhdHVzID0gQU1FRElBX09LOworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1UcmFuc2NvZGluZ0ZpbmlzaGVkQ29uZGl0aW9uOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1UcmFja0Zvcm1hdEF2YWlsYWJsZUNvbmRpdGlvbjsKKyAgICBib29sIG1UcmFuc2NvZGluZ0ZpbmlzaGVkID0gZmFsc2U7CisgICAgYm9vbCBtVHJhbnNjb2RpbmdTdG9wcGVkID0gZmFsc2U7CisgICAgYm9vbCBtVHJhY2tGb3JtYXRBdmFpbGFibGUgPSBmYWxzZTsKK307CisKK2NsYXNzIE9uZVNob3RTZW1hcGhvcmUgeworcHVibGljOgorICAgIHZvaWQgd2FpdCgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlICghbVNpZ25hbGVkKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNpZ25hbCgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1TaWduYWxlZCA9IHRydWU7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgIGJvb2wgbVNpZ25hbGVkID0gZmFsc2U7Cit9OworCit9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9WaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9WaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWRlOTdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL1ZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCBUZXN0IGZvciBWaWRlb1RyYWNrVHJhbnNjb2RlcgorCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtDb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9WaWRlb1RyYWNrVHJhbnNjb2Rlci5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSAiVHJhY2tUcmFuc2NvZGVyVGVzdFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVE9ETyhiLzE1NTMwNDQyMSk6IEltcGxlbWVudCBtb3JlIGFkdmFuY2VkIHZpZGVvIHNwZWNpZmljIHRlc3RzOgorLy8gIC0gQ29kZWMgY29udmVyc2lvbnMgKEhFVkMgLT4gQVZDKS4KKy8vICAtIEJpdHJhdGUgdmFsaWRhdGlvbi4KKy8vICAtIE91dHB1dCBmcmFtZSB2YWxpZGF0aW9uIHRocm91Z2ggUFNOUi4KKworY2xhc3MgVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMoKSB7IExPRyhERUJVRykgPDwgIlZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMgY3JlYXRlZCI7IH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIlZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMgc2V0IHVwIjsKKyAgICAgICAgY29uc3QgY2hhciogc291cmNlUGF0aCA9CisgICAgICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKKworICAgICAgICBjb25zdCBpbnQgc291cmNlRmQgPSBvcGVuKHNvdXJjZVBhdGgsIE9fUkRPTkxZKTsKKyAgICAgICAgQVNTRVJUX0dUKHNvdXJjZUZkLCAwKTsKKworICAgICAgICBjb25zdCBvZmZfdCBmaWxlU2l6ZSA9IGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX1NFVCk7CisKKyAgICAgICAgbU1lZGlhU2FtcGxlUmVhZGVyID0gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChzb3VyY2VGZCwgMCwgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUobU1lZGlhU2FtcGxlUmVhZGVyLCBudWxscHRyKTsKKyAgICAgICAgY2xvc2Uoc291cmNlRmQpOworCisgICAgICAgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgKyt0cmFja0luZGV4KSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgICAgICAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrSW5kZXggPSB0cmFja0luZGV4OworCisgICAgICAgICAgICAgICAgbVNvdXJjZUZvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KHRyYWNrRm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKG1Tb3VyY2VGb3JtYXQsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgbURlc3RpbmF0aW9uRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrVHJhbnNjb2RlclRlc3RVdGlsczo6Z2V0RGVmYXVsdFZpZGVvRGVzdGluYXRpb25Gb3JtYXQodHJhY2tGb3JtYXQpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShtRGVzdGluYXRpb25Gb3JtYXQsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9ORShtU291cmNlRm9ybWF0LCBudWxscHRyKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBMT0coREVCVUcpIDw8ICJWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzIHRlYXIgZG93biI7IH0KKworICAgIH5WaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzIGRlc3Ryb3llZCI7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gbU1lZGlhU2FtcGxlUmVhZGVyOworICAgIGludCBtVHJhY2tJbmRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBtU291cmNlRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IG1EZXN0aW5hdGlvbkZvcm1hdDsKK307CisKK1RFU1RfRihWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzLCBTYW1wbGVTb3VuZG5lc3MpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFNhbXBsZVNvdW5kbmVzcyI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDYWxsYmFjaz4gY2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYWxsYmFjaz4oKTsKKyAgICBhdXRvIHRyYW5zY29kZXIgPSBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Y3JlYXRlKGNhbGxiYWNrKTsKKworICAgIEVYUEVDVF9FUShtTWVkaWFTYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKG1UcmFja0luZGV4KSwgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfRVEodHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgQVNTRVJUX1RSVUUodHJhbnNjb2Rlci0+c3RhcnQoKSk7CisKKyAgICBib29sIGVvcyA9IGZhbHNlOworICAgIHVpbnQ2NF90IHNhbXBsZUNvdW50ID0gMDsKKyAgICB0cmFuc2NvZGVyLT5zZXRTYW1wbGVDb25zdW1lcihbJnNhbXBsZUNvdW50LCAmZW9zXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+JiBzYW1wbGUpIHsKKyAgICAgICAgQVNTRVJUX05FKHNhbXBsZSwgbnVsbHB0cik7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGZsYWdzID0gc2FtcGxlLT5pbmZvLmZsYWdzOworCisgICAgICAgIGlmIChzYW1wbGVDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAvLyBFeHBlY3QgZmlyc3Qgc2FtcGxlIHRvIGJlIGEgY29kZWMgY29uZmlnLgorICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGZsYWdzICYgU0FNUExFX0ZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChmbGFncyAmIFNBTVBMRV9GTEFHX1NZTkNfU0FNUExFKSA9PSAwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChmbGFncyAmIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0pID09IDApOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGZsYWdzICYgU0FNUExFX0ZMQUdfUEFSVElBTF9GUkFNRSkgPT0gMCk7CisgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlQ291bnQgPT0gMSkgeworICAgICAgICAgICAgLy8gRXhwZWN0IHNlY29uZCBzYW1wbGUgdG8gYmUgYSBzeW5jIHNhbXBsZS4KKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChmbGFncyAmIFNBTVBMRV9GTEFHX0NPREVDX0NPTkZJRykgPT0gMCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoZmxhZ3MgJiBTQU1QTEVfRkxBR19TWU5DX1NBTVBMRSkgIT0gMCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoZmxhZ3MgJiBTQU1QTEVfRkxBR19FTkRfT0ZfU1RSRUFNKSA9PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdCBhIHZhbGlkIGJ1ZmZlciB1bmxlc3MgaXQgaXMgRU9TLgorICAgICAgICAgICAgRVhQRUNUX05FKHNhbXBsZS0+YnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgICAgIEVYUEVDVF9ORShzYW1wbGUtPmJ1ZmZlcklkLCAweEJBQURGMDBEKTsKKyAgICAgICAgICAgIEVYUEVDVF9HVChzYW1wbGUtPmluZm8uc2l6ZSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoZW9zKTsKKyAgICAgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICArK3NhbXBsZUNvdW50OworICAgIH0pOworCisgICAgRVhQRUNUX0VRKGNhbGxiYWNrLT53YWl0VW50aWxGaW5pc2hlZCgpLCBBTUVESUFfT0spOworfQorCitURVNUX0YoVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cywgUHJlc2VydmVCaXRyYXRlKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBQcmVzZXJ2ZUJpdHJhdGUiOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2FsbGJhY2s+IGNhbGxiYWNrID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0Q2FsbGJhY2s+KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyPiB0cmFuc2NvZGVyID0gVmlkZW9UcmFja1RyYW5zY29kZXI6OmNyZWF0ZShjYWxsYmFjayk7CisKKyAgICBhdXRvIGRlc3RGb3JtYXQgPSBUcmFja1RyYW5zY29kZXJUZXN0VXRpbHM6OmdldERlZmF1bHRWaWRlb0Rlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICAgICAgbVNvdXJjZUZvcm1hdC5nZXQoKSwgZmFsc2UgLyogaW5jbHVkZUJpdHJhdGUqLyk7CisgICAgRVhQRUNUX05FKGRlc3RGb3JtYXQsIG51bGxwdHIpOworCisgICAgRVhQRUNUX0VRKG1NZWRpYVNhbXBsZVJlYWRlci0+c2VsZWN0VHJhY2sobVRyYWNrSW5kZXgpLCBBTUVESUFfT0spOworCisgICAgaW50MzJfdCBzcmNCaXRyYXRlOworICAgIEVYUEVDVF9FUShtTWVkaWFTYW1wbGVSZWFkZXItPmdldEVzdGltYXRlZEJpdHJhdGVGb3JUcmFjayhtVHJhY2tJbmRleCwgJnNyY0JpdHJhdGUpLCBBTUVESUFfT0spOworCisgICAgQVNTRVJUX0VRKHRyYW5zY29kZXItPmNvbmZpZ3VyZShtTWVkaWFTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBkZXN0Rm9ybWF0KSwgQU1FRElBX09LKTsKKyAgICBBU1NFUlRfVFJVRSh0cmFuc2NvZGVyLT5zdGFydCgpKTsKKworICAgIGNhbGxiYWNrLT53YWl0VW50aWxUcmFja0Zvcm1hdEF2YWlsYWJsZSgpOworCisgICAgYXV0byBvdXRwdXRGb3JtYXQgPSB0cmFuc2NvZGVyLT5nZXRPdXRwdXRGb3JtYXQoKTsKKyAgICBBU1NFUlRfTkUob3V0cHV0Rm9ybWF0LCBudWxscHRyKTsKKworICAgIHRyYW5zY29kZXItPnN0b3AoKTsKKyAgICBFWFBFQ1RfRVEoY2FsbGJhY2stPndhaXRVbnRpbEZpbmlzaGVkKCksIEFNRURJQV9PSyk7CisKKyAgICBpbnQzMl90IG91dEJpdHJhdGU7CisgICAgRVhQRUNUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKG91dHB1dEZvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJm91dEJpdHJhdGUpKTsKKworICAgIEVYUEVDVF9FUShzcmNCaXRyYXRlLCBvdXRCaXRyYXRlKTsKK30KKworLy8gVmlkZW9UcmFja1RyYW5zY29kZXIgbmVlZHMgYSB2YWxpZCBkZXN0aW5hdGlvbiBmb3JtYXQuCitURVNUX0YoVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cywgTnVsbERlc3RpbmF0aW9uRm9ybWF0KSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBOdWxsRGVzdGluYXRpb25Gb3JtYXQiOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2FsbGJhY2s+IGNhbGxiYWNrID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0Q2FsbGJhY2s+KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbnVsbEZvcm1hdDsKKworICAgIGF1dG8gdHJhbnNjb2RlciA9IFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpjcmVhdGUoY2FsbGJhY2spOworICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCAwIC8qIHRyYWNrSW5kZXggKi8sIG51bGxGb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOworfQorCitURVNUX0YoVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cywgTGluZ2VyaW5nRW5jb2RlcikgeworICAgIE9uZVNob3RTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIGF1dG8gY2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYWxsYmFjaz4oKTsKKyAgICBhdXRvIHRyYW5zY29kZXIgPSBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Y3JlYXRlKGNhbGxiYWNrKTsKKworICAgIEVYUEVDVF9FUShtTWVkaWFTYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKG1UcmFja0luZGV4KSwgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfRVEodHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgQVNTRVJUX1RSVUUodHJhbnNjb2Rlci0+c3RhcnQoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+PiBzYW1wbGVzOworICAgIHRyYW5zY29kZXItPnNldFNhbXBsZUNvbnN1bWVyKAorICAgICAgICAgICAgWyZzYW1wbGVzLCAmc2VtYXBob3JlXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+JiBzYW1wbGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlcy5zaXplKCkgPj0gNCkgcmV0dXJuOworCisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHNhbXBsZSwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgc2FtcGxlcy5wdXNoX2JhY2soc2FtcGxlKTsKKworICAgICAgICAgICAgICAgIGlmIChzYW1wbGVzLnNpemUoKSA9PSA0IHx8IHNhbXBsZS0+aW5mby5mbGFncyAmIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgLy8gV2FpdCBmb3IgdGhlIGVuY29kZXIgdG8gb3V0cHV0IHNhbXBsZXMgYmVmb3JlIHN0b3BwaW5nIGFuZCByZWxlYXNpbmcgdGhlIHRyYW5zY29kZXIuCisgICAgc2VtYXBob3JlLndhaXQoKTsKKworICAgIHRyYW5zY29kZXItPnN0b3AoKTsKKyAgICBFWFBFQ1RfRVEoY2FsbGJhY2stPndhaXRVbnRpbEZpbmlzaGVkKCksIEFNRURJQV9PSyk7CisgICAgdHJhbnNjb2Rlci5yZXNldCgpOworCisgICAgLy8gUmV0dXJuIGJ1ZmZlcnMgdG8gdGhlIGNvZGVjIHNvIHRoYXQgaXQgY2FuIHJlc3VtZSBwcm9jZXNzaW5nLCBidXQga2VlcCBvbmUgYnVmZmVyIHRvIGF2b2lkCisgICAgLy8gdGhlIGNvZGVjIGJlaW5nIHJlbGVhc2VkLgorICAgIHNhbXBsZXMucmVzaXplKDEpOworCisgICAgLy8gV2FpdCBmb3IgYXN5bmMgY29kZWMgZXZlbnRzLgorICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5MmM1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vYmFzaAorIworIyBSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgIiRTWU5DX0ZJTklTSEVEIiAhPSB0cnVlIF07IHRoZW4KKyAgaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgICBleGl0IC0xCisgIGZpCisKKyAgIyBlbnN1cmUgd2UgaGF2ZSBtbQorICAuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCisgIG1tCisKKyAgZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCisgIGFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudCAmJiBhZGIgc3luYworZmkKKworIyBQdXNoIHRoZSBmaWxlcyBvbnRvIHRoZSBkZXZpY2UuCisuICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvcHVzaF9hc3NldHMuc2gKKworZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKworZWNobyAidGVzdGluZyBNZWRpYVNhbXBsZVJlYWRlck5ESyIKK2FkYiBzaGVsbCBBU0FOX09QVElPTlM9ZGV0ZWN0X2NvbnRhaW5lcl9vdmVyZmxvdz0wIC9kYXRhL25hdGl2ZXRlc3Q2NC9NZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzL01lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMKKworZWNobyAidGVzdGluZyBNZWRpYVNhbXBsZVF1ZXVlIgorYWRiIHNoZWxsIEFTQU5fT1BUSU9OUz1kZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAgL2RhdGEvbmF0aXZldGVzdDY0L01lZGlhU2FtcGxlUXVldWVUZXN0cy9NZWRpYVNhbXBsZVF1ZXVlVGVzdHMKKworZWNobyAidGVzdGluZyBNZWRpYVRyYWNrVHJhbnNjb2RlciIKK2FkYiBzaGVsbCBBU0FOX09QVElPTlM9ZGV0ZWN0X2NvbnRhaW5lcl9vdmVyZmxvdz0wIC9kYXRhL25hdGl2ZXRlc3Q2NC9NZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzL01lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMKKworZWNobyAidGVzdGluZyBWaWRlb1RyYWNrVHJhbnNjb2RlciIKK2FkYiBzaGVsbCBBU0FOX09QVElPTlM9ZGV0ZWN0X2NvbnRhaW5lcl9vdmVyZmxvdz0wIC9kYXRhL25hdGl2ZXRlc3Q2NC9WaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzL1ZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMKKworZWNobyAidGVzdGluZyBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlciIKK2FkYiBzaGVsbCBBU0FOX09QVElPTlM9ZGV0ZWN0X2NvbnRhaW5lcl9vdmVyZmxvdz0wIC9kYXRhL25hdGl2ZXRlc3Q2NC9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMKKworZWNobyAidGVzdGluZyBNZWRpYVNhbXBsZVdyaXRlciIKK2FkYiBzaGVsbCBBU0FOX09QVElPTlM9ZGV0ZWN0X2NvbnRhaW5lcl9vdmVyZmxvdz0wIC9kYXRhL25hdGl2ZXRlc3Q2NC9NZWRpYVNhbXBsZVdyaXRlclRlc3RzL01lZGlhU2FtcGxlV3JpdGVyVGVzdHMKKworZWNobyAidGVzdGluZyBNZWRpYVRyYW5zY29kZXIiCithZGIgc2hlbGwgQVNBTl9PUFRJT05TPWRldGVjdF9jb250YWluZXJfb3ZlcmZsb3c9MCAvZGF0YS9uYXRpdmV0ZXN0NjQvTWVkaWFUcmFuc2NvZGVyVGVzdHMvTWVkaWFUcmFuc2NvZGVyVGVzdHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKaW5kZXggMDQzMTk3Ni4uNTRkYzA4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKQEAgLTIzLDcgKzIzLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gUGlwZSBpcyBtdWx0aS10aHJlYWQgc2FmZSBmb3IgcmVhZGVycyAoc2VlIFBpcGVSZWFkZXIpLCBidXQgc2FmZSBmb3Igb25seSBhIHNpbmdsZSB3cml0ZXIgdGhyZWFkLgotLy8gSXQgY2Fubm90IFVOREVSUlVOIG9uIHdyaXRlLCB1bmxlc3Mgd2UgYWxsb3cgZGVzaWduYXRpb24gb2YgYSBtYXN0ZXIgcmVhZGVyIHRoYXQgcHJvdmlkZXMgdGhlCisvLyBJdCBjYW5ub3QgVU5ERVJSVU4gb24gd3JpdGUsIHVubGVzcyB3ZSBhbGxvdyBkZXNpZ25hdGlvbiBvZiBhIHByaW1hcnkgcmVhZGVyIHRoYXQgcHJvdmlkZXMgdGhlCiAvLyB0aW1lLWJhc2UuIFJlYWRlcnMgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGR5bmFtaWNhbGx5LCBhbmQgaXQncyBPSyB0byBoYXZlIG5vIHJlYWRlcnMuCiBjbGFzcyBQaXBlIDogcHVibGljIE5CQUlPX1NpbmsgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzaG1lbS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic2htZW0vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjc4NGVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vQW5kcm9pZC5icApAQCAtMCwwICsxLDcwIEBACithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9TaGFyZWRGaWxlUmVnaW9uLmFpZGwiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzaG1lbWNvbXBhdCIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgc3JjczogWyJTaG1lbUNvbXBhdC5jcHAiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnNobWVtdXRpbCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbC11bnN0YWJsZS1jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLXVuc3RhYmxlLWNwcCIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic2htZW11dGlsIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbIlNobWVtVXRpbC5jcHAiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLXVuc3RhYmxlLWNwcCIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAic2htZW1UZXN0IiwKKyAgICBzcmNzOiBbIlNobWVtVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzaG1lbWNvbXBhdCIsCisgICAgICAgICJsaWJzaG1lbXV0aWwiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic2htZW0vT1dORVJTIGIvbWVkaWEvbGlic2htZW0vT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZmEyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzaG1lbS9PV05FUlMKQEAgLTAsMCArMSwzIEBACit5dGFpQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KK2VsYXVyZW50QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnNobWVtL1JFQURNRS5tZCBiL21lZGlhL2xpYnNobWVtL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjVmYTdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vUkVBRE1FLm1kCkBAIC0wLDAgKzEsNiBAQAorIyBsaWJzaG1lbQorCitUaGlzIGxpYnJhcnkgcHJvdmlkZXMgZmFjaWxpdGllcyBmb3Igc2hhcmluZyBtZW1vcnkgYWNyb3NzIHByb2Nlc3NlcyBvdmVyIChzdGFibGUpIEFJREwuIFRoZSBtYWluCitmZWF0dXJlIGlzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBgYW5kcm9pZC5tZWRpYS5TaGFyZWRNZW1vcnlgIEFJREwgdHlwZSwgd2hpY2ggcmVwcmVzZW50cyBhIGJsb2NrIG9mCittZW1vcnkgdGhhdCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzLiBJbiBhZGRpdGlvbiwgYSBmZXcgdXRpbGl0aWVzIGFyZSBwcm92aWRlZCB0byBmYWNpbGl0YXRlCit0aGUgdXNlIG9mIHNoYXJlZCBtZW1vcnkgYW5kIHRvIGludGVncmF0ZSB3aXRoIGxlZ2FjeSBjb2RlIHRoYXQgdXNlcyBvbGRlciBmYWNpbGl0aWVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnNobWVtL1NobWVtQ29tcGF0LmNwcCBiL21lZGlhL2xpYnNobWVtL1NobWVtQ29tcGF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZjYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vU2htZW1Db21wYXQuY3BwCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJtZWRpYS9TaG1lbUNvbXBhdC5oIgorCisjaW5jbHVkZSAiYmluZGVyL01lbW9yeUJhc2UuaCIKKyNpbmNsdWRlICJiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaCIKKyNpbmNsdWRlICJtZWRpYS9TaG1lbVV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworYm9vbCBjb252ZXJ0U2hhcmVkRmlsZVJlZ2lvblRvSU1lbW9yeShjb25zdCBTaGFyZWRGaWxlUmVnaW9uJiBzaG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4qIHJlc3VsdCkgeworICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbHB0cik7CisKKyAgICBpZiAoIXZhbGlkYXRlU2hhcmVkRmlsZVJlZ2lvbihzaG1lbSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEhlYXAgb2Zmc2V0IGFuZCBzaXplIG11c3QgYmUgcGFnZSBhbGlnbmVkLgorICAgIGNvbnN0IHNpemVfdCBwYWdlU2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgY29uc3Qgc2l6ZV90IHBhZ2VNYXNrID0gfihwYWdlU2l6ZSAtIDEpOworCisgICAgLy8gT0sgaWYgdGhpcyB3cmFwcy4KKyAgICBjb25zdCB1aW50NjRfdCBlbmRPZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc2htZW0ub2Zmc2V0KSArCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc2htZW0uc2l6ZSk7CisKKyAgICAvLyBSb3VuZCBkb3duIHRvIHBhZ2UgYm91bmRhcnkuCisgICAgY29uc3QgdWludDY0X3QgaGVhcFN0YXJ0T2Zmc2V0ID0gc2htZW0ub2Zmc2V0ICYgcGFnZU1hc2s7CisgICAgLy8gUm91bmQgdXAgdG8gcGFnZSBib3VuZGFyeS4KKyAgICBjb25zdCB1aW50NjRfdCBoZWFwRW5kT2Zmc2V0ID0gKGVuZE9mZnNldCArIHBhZ2VTaXplIC0gMSkgJiBwYWdlTWFzazsKKyAgICBjb25zdCB1aW50NjRfdCBoZWFwU2l6ZSA9IGhlYXBFbmRPZmZzZXQgLSBoZWFwU3RhcnRPZmZzZXQ7CisKKyAgICBpZiAoaGVhcFN0YXJ0T2Zmc2V0ID4gc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSB8fAorICAgICAgICBoZWFwU2l6ZSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IGZsYWdzID0gIXNobWVtLndyaXRlYWJsZSA/IElNZW1vcnlIZWFwOjpSRUFEX09OTFkgOiAwOworCisgICAgY29uc3Qgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPQorICAgICAgICAgICAgbmV3IE1lbW9yeUhlYXBCYXNlKHNobWVtLmZkLmdldCgpLCBoZWFwU2l6ZSwgZmxhZ3MsIGhlYXBTdGFydE9mZnNldCk7CisgICAgKnJlc3VsdCA9IHNwPE1lbW9yeUJhc2U+OjptYWtlKGhlYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNobWVtLm9mZnNldCAtIGhlYXBTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2htZW0uc2l6ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgY29udmVydElNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24oY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkRmlsZVJlZ2lvbiogcmVzdWx0KSB7CisgICAgYXNzZXJ0KG1lbSAhPSBudWxscHRyKTsKKyAgICBhc3NlcnQocmVzdWx0ICE9IG51bGxwdHIpOworCisgICAgKnJlc3VsdCA9IFNoYXJlZEZpbGVSZWdpb24oKTsKKworICAgIHNzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworCisgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIGlmIChoZWFwID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG9mZnNldCBhbmQgc2l6ZSBkbyBub3Qgb3ZlcmZsb3cgZnJvbSBpbnQ2NCBib3VuZGFyaWVzLgorICAgICAgICBpZiAoc2l6ZSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpIHx8CisgICAgICAgICAgICAgICAgb2Zmc2V0ID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCkgfHwKKyAgICAgICAgICAgICAgICBoZWFwLT5nZXRPZmZzZXQoKSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpIHx8CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGhlYXAtPmdldE9mZnNldCgpKSArCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGludCBmZCA9IGZjbnRsKGhlYXAtPmdldEhlYXBJRCgpLCBGX0RVUEZEX0NMT0VYRUMsIDApOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LT5mZC5yZXNldChiYXNlOjp1bmlxdWVfZmQoZmQpKTsKKyAgICAgICAgcmVzdWx0LT5zaXplID0gc2l6ZTsKKyAgICAgICAgcmVzdWx0LT5vZmZzZXQgPSBoZWFwLT5nZXRPZmZzZXQoKSArIG9mZnNldDsKKyAgICAgICAgcmVzdWx0LT53cml0ZWFibGUgPSAoaGVhcC0+Z2V0RmxhZ3MoKSAmIElNZW1vcnlIZWFwOjpSRUFEX09OTFkpID09IDA7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGNvbnZlcnROdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25Ub0lNZW1vcnkoY29uc3Qgc3RkOjpvcHRpb25hbDxTaGFyZWRGaWxlUmVnaW9uPiYgc2htZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4qIHJlc3VsdCkgeworICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbHB0cik7CisKKyAgICBpZiAoIXNobWVtLmhhc192YWx1ZSgpKSB7CisgICAgICAgIHJlc3VsdC0+Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnZlcnRTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KHNobWVtLnZhbHVlKCksIHJlc3VsdCk7Cit9CisKK2Jvb2wgY29udmVydE51bGxhYmxlSU1lbW9yeVRvU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8U2hhcmVkRmlsZVJlZ2lvbj4qIHJlc3VsdCkgeworICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbHB0cik7CisKKyAgICBpZiAobWVtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmVzdWx0LT5yZXNldCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN1bHQtPmVtcGxhY2UoKTsKKyAgICByZXR1cm4gY29udmVydElNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24obWVtLCAmcmVzdWx0LT52YWx1ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic2htZW0vU2htZW1UZXN0LmNwcCBiL21lZGlhL2xpYnNobWVtL1NobWVtVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0ZjM0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnNobWVtL1NobWVtVGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJiaW5kZXIvTWVtb3J5QmFzZS5oIgorI2luY2x1ZGUgImJpbmRlci9NZW1vcnlIZWFwQmFzZS5oIgorI2luY2x1ZGUgImN1dGlscy9hc2htZW0uaCIKKyNpbmNsdWRlICJtZWRpYS9TaG1lbUNvbXBhdC5oIgorI2luY2x1ZGUgIm1lZGlhL1NobWVtVXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKworLy8gQ3JlYXRlcyBhIFNoYXJlZEZpbGVSZWdpb24gaW5zdGFuY2UuCitTaGFyZWRGaWxlUmVnaW9uIG1ha2VTaGFyZWRGaWxlUmVnaW9uKGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IHNpemUpIHsKKyAgICBTaGFyZWRGaWxlUmVnaW9uIHNobWVtOworICAgIHNobWVtLm9mZnNldCA9IG9mZnNldDsKKyAgICBzaG1lbS5zaXplID0gc2l6ZTsKKyAgICBpbnQgZmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbigiIiwgc2l6ZSArIG9mZnNldCk7CisgICAgYXNzZXJ0KGZkID49IDApOworICAgIHNobWVtLmZkID0gb3M6OlBhcmNlbEZpbGVEZXNjcmlwdG9yKGJhc2U6OnVuaXF1ZV9mZChmZCkpOworICAgIHJldHVybiBzaG1lbTsKK30KKworLy8gQ3JlYXRlcyBhIFNoYXJlZEZpbGVSZWdpb24gaW5zdGFuY2Ugd2l0aCBhbiBpbnZhbGlkIEZELgorU2hhcmVkRmlsZVJlZ2lvbiBtYWtlSW52YWxpZFNoYXJlZEZpbGVSZWdpb24oaW50NjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSkgeworICAgIFNoYXJlZEZpbGVSZWdpb24gc2htZW07CisgICAgc2htZW0ub2Zmc2V0ID0gb2Zmc2V0OworICAgIHNobWVtLnNpemUgPSBzaXplOworICAgIHJldHVybiBzaG1lbTsKK30KKworc3A8SU1lbW9yeT4gbWFrZUlNZW1vcnkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNvbnRlbnQsIGJvb2wgd3JpdGVhYmxlID0gdHJ1ZSkgeworICAgIGNvbnN0ZXhwciBzaXplX3Qga09mZnNldCA9IDE5OworCisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoY29udGVudC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXdyaXRlYWJsZSA/IElNZW1vcnlIZWFwOjpSRUFEX09OTFkgOiAwKTsKKyAgICBzcDxJTWVtb3J5PiByZXN1bHQgPSBzcDxNZW1vcnlCYXNlPjo6bWFrZShoZWFwLCBrT2Zmc2V0LCBjb250ZW50LnNpemUoKSk7CisgICAgbWVtY3B5KHJlc3VsdC0+dW5zZWN1cmVQb2ludGVyKCksIGNvbnRlbnQuZGF0YSgpLCBjb250ZW50LnNpemUoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVChTaG1lbVRlc3QsIFZhbGlkYXRlKSB7CisgICAgRVhQRUNUX1RSVUUodmFsaWRhdGVTaGFyZWRGaWxlUmVnaW9uKG1ha2VTaGFyZWRGaWxlUmVnaW9uKDAsIDApKSk7CisgICAgRVhQRUNUX1RSVUUodmFsaWRhdGVTaGFyZWRGaWxlUmVnaW9uKG1ha2VTaGFyZWRGaWxlUmVnaW9uKDEsIDIpKSk7CisgICAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRlU2hhcmVkRmlsZVJlZ2lvbihtYWtlU2hhcmVkRmlsZVJlZ2lvbigtMSwgMikpKTsKKyAgICBFWFBFQ1RfRkFMU0UodmFsaWRhdGVTaGFyZWRGaWxlUmVnaW9uKG1ha2VTaGFyZWRGaWxlUmVnaW9uKDIsIC0xKSkpOworICAgIEVYUEVDVF9GQUxTRSh2YWxpZGF0ZVNoYXJlZEZpbGVSZWdpb24obWFrZUludmFsaWRTaGFyZWRGaWxlUmVnaW9uKDEsIDIpKSk7Cit9CisKK1RFU1QoU2htZW1UZXN0LCBDb252ZXJzaW9uKSB7CisgICAgc3A8SU1lbW9yeT4gcmVjb25zdHJ1Y3RlZDsKKyAgICB7CisgICAgICAgIFNoYXJlZEZpbGVSZWdpb24gc2htZW07CisgICAgICAgIHNwPElNZW1vcnk+IGltZW0gPSBtYWtlSU1lbW9yeSh7NiwgNSwgM30pOworICAgICAgICBBU1NFUlRfVFJVRShjb252ZXJ0SU1lbW9yeVRvU2hhcmVkRmlsZVJlZ2lvbihpbWVtLCAmc2htZW0pKTsKKyAgICAgICAgQVNTRVJUX0VRKDMsIHNobWVtLnNpemUpOworICAgICAgICBBU1NFUlRfR0Uoc2htZW0uZmQuZ2V0KCksIDApOworICAgICAgICBBU1NFUlRfVFJVRShzaG1lbS53cml0ZWFibGUpOworICAgICAgICBBU1NFUlRfVFJVRShjb252ZXJ0U2hhcmVkRmlsZVJlZ2lvblRvSU1lbW9yeShzaG1lbSwgJnJlY29uc3RydWN0ZWQpKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKDMsIHJlY29uc3RydWN0ZWQtPnNpemUoKSk7CisgICAgQVNTRVJUX0VRKHJlY29uc3RydWN0ZWQtPmdldE1lbW9yeSgpLT5nZXRGbGFncygpICYgSU1lbW9yeUhlYXA6OlJFQURfT05MWSwgIDApOworICAgIGNvbnN0IHVpbnQ4X3QqIHAgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVjb25zdHJ1Y3RlZC0+dW5zZWN1cmVQb2ludGVyKCkpOworICAgIEVYUEVDVF9FUSg2LCBwWzBdKTsKKyAgICBFWFBFQ1RfRVEoNSwgcFsxXSk7CisgICAgRVhQRUNUX0VRKDMsIHBbMl0pOworfQorCitURVNUKFNobWVtVGVzdCwgQ29udmVyc2lvblJlYWRPbmx5KSB7CisgICAgc3A8SU1lbW9yeT4gcmVjb25zdHJ1Y3RlZDsKKyAgICB7CisgICAgICAgIFNoYXJlZEZpbGVSZWdpb24gc2htZW07CisgICAgICAgIHNwPElNZW1vcnk+IGltZW0gPSBtYWtlSU1lbW9yeSh7NiwgNSwgM30sIGZhbHNlKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoY29udmVydElNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24oaW1lbSwgJnNobWVtKSk7CisgICAgICAgIEFTU0VSVF9FUSgzLCBzaG1lbS5zaXplKTsKKyAgICAgICAgQVNTRVJUX0dFKHNobWVtLmZkLmdldCgpLCAwKTsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKHNobWVtLndyaXRlYWJsZSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGNvbnZlcnRTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KHNobWVtLCAmcmVjb25zdHJ1Y3RlZCkpOworICAgIH0KKyAgICBBU1NFUlRfRVEoMywgcmVjb25zdHJ1Y3RlZC0+c2l6ZSgpKTsKKyAgICBBU1NFUlRfTkUocmVjb25zdHJ1Y3RlZC0+Z2V0TWVtb3J5KCktPmdldEZsYWdzKCkgJiBJTWVtb3J5SGVhcDo6UkVBRF9PTkxZLCAgMCk7CisgICAgY29uc3QgdWludDhfdCogcCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyZWNvbnN0cnVjdGVkLT51bnNlY3VyZVBvaW50ZXIoKSk7CisgICAgRVhQRUNUX0VRKDYsIHBbMF0pOworICAgIEVYUEVDVF9FUSg1LCBwWzFdKTsKKyAgICBFWFBFQ1RfRVEoMywgcFsyXSk7Cit9CisKK1RFU1QoU2htZW1UZXN0LCBOdWxsQ29udmVyc2lvbikgeworICAgIHNwPElNZW1vcnk+IHJlY29uc3RydWN0ZWQ7CisgICAgeworICAgICAgICBzdGQ6Om9wdGlvbmFsPFNoYXJlZEZpbGVSZWdpb24+IHNobWVtOworICAgICAgICBzcDxJTWVtb3J5PiBpbWVtOworICAgICAgICBBU1NFUlRfVFJVRShjb252ZXJ0TnVsbGFibGVJTWVtb3J5VG9TaGFyZWRGaWxlUmVnaW9uKGltZW0sICZzaG1lbSkpOworICAgICAgICBBU1NFUlRfRkFMU0Uoc2htZW0uaGFzX3ZhbHVlKCkpOworICAgICAgICBBU1NFUlRfVFJVRShjb252ZXJ0TnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KHNobWVtLCAmcmVjb25zdHJ1Y3RlZCkpOworICAgIH0KKyAgICBBU1NFUlRfRVEobnVsbHB0ciwgcmVjb25zdHJ1Y3RlZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic2htZW0vU2htZW1VdGlsLmNwcCBiL21lZGlhL2xpYnNobWVtL1NobWVtVXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3NTM0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnNobWVtL1NobWVtVXRpbC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAibWVkaWEvU2htZW1VdGlsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK2Jvb2wgdmFsaWRhdGVTaGFyZWRGaWxlUmVnaW9uKGNvbnN0IFNoYXJlZEZpbGVSZWdpb24mIHNobWVtKSB7CisgICAgLy8gRkQgbXVzdCBiZSB2YWxpZC4KKyAgICBpZiAoc2htZW0uZmQuZ2V0KCkgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTaXplIGFuZCBvZmZzZXQgbXVzdCBiZSBub24tbmVnYXRpdmUuCisgICAgaWYgKHNobWVtLnNpemUgPCAwIHx8IHNobWVtLm9mZnNldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ2NF90IHNpemUgPSBzaG1lbS5zaXplOworICAgIHVpbnQ2NF90IG9mZnNldCA9IHNobWVtLm9mZnNldDsKKworICAgIC8vIE11c3Qgbm90IHdyYXAuCisgICAgaWYgKG9mZnNldCA+IG9mZnNldCArIHNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzaG1lbS9haWRsL2FuZHJvaWQvbWVkaWEvU2hhcmVkRmlsZVJlZ2lvbi5haWRsIGIvbWVkaWEvbGlic2htZW0vYWlkbC9hbmRyb2lkL21lZGlhL1NoYXJlZEZpbGVSZWdpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTliNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vYWlkbC9hbmRyb2lkL21lZGlhL1NoYXJlZEZpbGVSZWdpb24uYWlkbApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIEEgc2hhcmVkIGZpbGUgcmVnaW9uLgorICoKKyAqIFRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gdG8gc2hhcmUgYSByZWdpb24gb2YgYSBmaWxlIGJldHdlZW4gcHJvY2Vzc2VzIG92ZXIKKyAqIEFJREwuCisgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgcmVwcmVzZW50cyBhIHZhbGlkIEZELiBGb3IgcmVwcmVzZW50aW5nIGEgbnVsbCBTaGFyZWRGaWxlUmVnaW9uLCB1c2UgYQorICogQG51bGxhYmxlIFNoYXJlZEZpbGVSZWdpb24uCisgKiBQcmltYXJpbHksIHRoaXMgaXMgaW50ZW5kZWQgZm9yIHNoYXJlZCBtZW1vcnkgYmxvY2tzLgorICoKKyAqIEBoaWRlCisgKi8KK3BhcmNlbGFibGUgU2hhcmVkRmlsZVJlZ2lvbiB7CisgICAgLyoqIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcmVnaW9uLiBNdXN0IGJlIHZhbGlkLiAqLworICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkOworICAgIC8qKiBPZmZzZXQsIGluIGJ5dGVzIHdpdGhpbiB0aGUgZmlsZSBvZiB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbi4gTXVzdCBiZSBub24tbmVnYXRpdmUuICovCisgICAgbG9uZyBvZmZzZXQ7CisgICAgLyoqIFNpemUsIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVnaW9uLiBNdXN0IGJlIG5vbi1uZWdhdGl2ZS4gKi8KKyAgICBsb25nIHNpemU7CisgICAgLyoqIFdoZXRoZXIgdGhlIHJlZ2lvbiBpcyB3cml0ZWFibGUuICovCisgICAgYm9vbGVhbiB3cml0ZWFibGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzaG1lbS9pbmNsdWRlL21lZGlhL1NobWVtQ29tcGF0LmggYi9tZWRpYS9saWJzaG1lbS9pbmNsdWRlL21lZGlhL1NobWVtQ29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1OWYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnNobWVtL2luY2x1ZGUvbWVkaWEvU2htZW1Db21wYXQuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKy8vIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHV0aWxpdGllcyBmb3IgaW50ZXJmYWNpbmcgYmV0d2VlbiBsZWdhY3kgY29kZSB0aGF0IGlzIHVzaW5nIElNZW1vcnkgYW5kIG5ldworLy8gY29kZSB0aGF0IGlzIHVzaW5nIGFuZHJvaWQub3MuU2hhcmVkRmlsZVJlZ2lvbi4KKworI2luY2x1ZGUgPG9wdGlvbmFsPgorCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9TaGFyZWRGaWxlUmVnaW9uLmgiCisjaW5jbHVkZSAiYmluZGVyL0lNZW1vcnkuaCIKKyNpbmNsdWRlICJ1dGlscy9TdHJvbmdQb2ludGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8qKgorICogQ29udmVydHMgYSBTaGFyZWRGaWxlUmVnaW9uIHBhcmNlbGFibGUgdG8gYW4gSU1lbW9yeSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBzaG1lbSBUaGUgU2hhcmVkRmlsZVJlZ2lvbiBpbnN0YW5jZS4KKyAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdGluZyBJTWVtb3J5IGluc3RhbmNlLiBNYXkgbm90IGJlIG51bGwuCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnZlcnNpb24gaXMgc3VjY2Vzc2Z1bCAoc2hvdWxkIGFsd2F5cyBzdWNjZWVkIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLAorICogICAgICAgICBmYWlsdXJlIHVzdWFsbHkgbWVhbnMgY29ycnVwdCBkYXRhKS4KKyAqLworYm9vbCBjb252ZXJ0U2hhcmVkRmlsZVJlZ2lvblRvSU1lbW9yeShjb25zdCBTaGFyZWRGaWxlUmVnaW9uJiBzaG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4qIHJlc3VsdCk7CisKKy8qKgorICogQ29udmVydHMgYSBudWxsYWJsZSBTaGFyZWRGaWxlUmVnaW9uIHBhcmNlbGFibGUgdG8gYW4gSU1lbW9yeSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBzaG1lbSBUaGUgU2hhcmVkRmlsZVJlZ2lvbiBpbnN0YW5jZS4KKyAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdGluZyBJTWVtb3J5IGluc3RhbmNlLiBNYXkgbm90IGJlIG51bGwuIFBvaW50ZWUgYXNzaWduZWQgdG8gbnVsbCwKKyAqICAgICAgICAgICAgICAgaWYgdGhlIGlucHV0IGlzIG51bGwuCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnZlcnNpb24gaXMgc3VjY2Vzc2Z1bCAoc2hvdWxkIGFsd2F5cyBzdWNjZWVkIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLAorICogICAgICAgICBmYWlsdXJlIHVzdWFsbHkgbWVhbnMgY29ycnVwdCBkYXRhKS4KKyAqLworYm9vbCBjb252ZXJ0TnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8U2hhcmVkRmlsZVJlZ2lvbj4mIHNobWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+KiByZXN1bHQpOworCisvKioKKyAqIENvbnZlcnRzIGFuIElNZW1vcnkgaW5zdGFuY2UgdG8gU2hhcmVkRmlsZVJlZ2lvbi4KKyAqIEBwYXJhbSBtZW0gVGhlIElNZW1vcnkgaW5zdGFuY2UuIE1heSBub3QgYmUgbnVsbC4KKyAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdGluZyBTaGFyZWRGaWxlUmVnaW9uIGluc3RhbmNlLgorICogQHJldHVybiB0cnVlIGlmIHRoZSBjb252ZXJzaW9uIGlzIHN1Y2Nlc3NmdWwgKHNob3VsZCBhbHdheXMgc3VjY2VlZCB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywKKyAqICAgICAgICAgZmFpbHVyZSB1c3VhbGx5IG1lYW5zIGNvcnJ1cHQgZGF0YSkuCisgKi8KK2Jvb2wgY29udmVydElNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24oY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkRmlsZVJlZ2lvbiogcmVzdWx0KTsKKworLyoqCisgKiBDb252ZXJ0cyBhIG51bGxhYmxlIElNZW1vcnkgaW5zdGFuY2UgdG8gYSBudWxsYWJsZSBTaGFyZWRGaWxlUmVnaW9uLgorICogQHBhcmFtIG1lbSBUaGUgSU1lbW9yeSBpbnN0YW5jZS4gTWF5IGJlIG51bGwuCisgKiBAcGFyYW0gcmVzdWx0IFRoZSByZXN1bHRpbmcgU2hhcmVkRmlsZVJlZ2lvbiBpbnN0YW5jZS4gTWF5IG5vdCBiZSBudWxsLiBBc3NpZ25lZCB0byBlbXB0eSwKKyAqICAgICAgICAgICAgICAgaWYgdGhlIGlucHV0IGlzIG51bGwuCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnZlcnNpb24gaXMgc3VjY2Vzc2Z1bCAoc2hvdWxkIGFsd2F5cyBzdWNjZWVkIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLAorICogICAgICAgICBmYWlsdXJlIHVzdWFsbHkgbWVhbnMgY29ycnVwdCBkYXRhKS4KKyAqLworYm9vbCBjb252ZXJ0TnVsbGFibGVJTWVtb3J5VG9TaGFyZWRGaWxlUmVnaW9uKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxTaGFyZWRGaWxlUmVnaW9uPiogcmVzdWx0KTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic2htZW0vaW5jbHVkZS9tZWRpYS9TaG1lbVV0aWwuaCBiL21lZGlhL2xpYnNobWVtL2luY2x1ZGUvbWVkaWEvU2htZW1VdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3YTVhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnNobWVtL2luY2x1ZGUvbWVkaWEvU2htZW1VdGlsLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisvLyBUaGlzIG1vZHVsZSBjb250YWlucyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBhbmRyb2lkLm9zLlNoYXJlZEZpbGVSZWdpb24uCisKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL1NoYXJlZEZpbGVSZWdpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIFNoYXJlZEZpbGVSZWdpb24gaW5zdGFuY2UgaXMgdmFsaWQgKGFsbCB0aGUgZmllbGRzIGhhdmUgc2FuZSB2YWx1ZXMpLgorICovCitib29sIHZhbGlkYXRlU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBTaGFyZWRGaWxlUmVnaW9uJiBzaG1lbSk7CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDYzYWI2NTQuLjcxYzFiMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtMjc5LDYgKzI3OSwxMyBAQAogCiAgICAgdm9pZCBwb3N0RmlsbFRoaXNCdWZmZXIoQnVmZmVySW5mbyAqaW5mbyk7CiAKKyAgICB2b2lkIG1heWJlUG9zdEV4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0KCkgeworICAgICAgICBpZiAoIW1QZW5kaW5nRXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3QpIHsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdWJtaXRFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyLCBtQ29kZWMpKS0+cG9zdCgpOworICAgICAgICAgICAgbVBlbmRpbmdFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKIHByaXZhdGU6CiAgICAgLy8gSGFuZGxlcyBhbiBPTVggbWVzc2FnZS4gUmV0dXJucyB0cnVlIGlmZiBtZXNzYWdlIHdhcyBoYW5kbGVkLgogICAgIGJvb2wgb25PTVhNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTMwMiw2ICszMDksOCBAQAogCiAgICAgdm9pZCBnZXRNb3JlSW5wdXREYXRhSWZQb3NzaWJsZSgpOwogCisgICAgYm9vbCBtUGVuZGluZ0V4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQmFzZVN0YXRlKTsKIH07CiAKQEAgLTU1NSw2ICs1NjQsOCBAQAogICAgICAgbVNodXRkb3duSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtRXhwbGljaXRTaHV0ZG93bihmYWxzZSksCiAgICAgICBtSXNMZWdhY3lWUDlEZWNvZGVyKGZhbHNlKSwKKyAgICAgIG1Jc1N0cmVhbUNvcnJ1cHRGcmVlKGZhbHNlKSwKKyAgICAgIG1Jc0xvd0xhdGVuY3koZmFsc2UpLAogICAgICAgbUVuY29kZXJEZWxheSgwKSwKICAgICAgIG1FbmNvZGVyUGFkZGluZygwKSwKICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMoMCksCkBAIC04ODcsNyArODk4LDcgQEAKIAogICAgICAgICAgICAgc3A8RGF0YUNvbnZlcnRlcj4gY29udmVydGVyID0gbUNvbnZlcnRlcltwb3J0SW5kZXhdOwogICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBhc3N1bWUgc2FuZSBjb252ZXJzaW9ucyBvZiBtYXggNDoxLCBzbyByZXN1bHQgZml0cyBpbiBpbnQzMgorICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UgYXNzdW1lIGNvbnZlcnNpb25zIG9mIG1heCA0OjEsIHNvIHJlc3VsdCBmaXRzIGluIGludDMyCiAgICAgICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpIHsKICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlclNpemUgPSBjb252ZXJ0ZXItPnNvdXJjZVNpemUoYnVmU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTIyMzcsNiArMjI0OCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gc2V0dXBHNzExQ29kZWMoZW5jb2Rlciwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSkgeworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMSwgc2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpICYmCisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIGVyciA9IHNldHVwT3B1c0NvZGVjKGVuY29kZXIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpIHsKICAgICAgICAgLy8gbnVtQ2hhbm5lbHMgbmVlZHMgdG8gYmUgc2V0IHRvIHByb3Blcmx5IGNvbW11bmljYXRlIFBDTSB2YWx1ZXMuCiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAyLCBzYW1wbGVSYXRlID0gNDQxMDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKQEAgLTIzMjMsNiArMjM0MCwxMiBAQAogICAgICAgICBtQ2hhbm5lbE1hc2tQcmVzZW50ID0gZmFsc2U7CiAgICAgfQogCisgICAgaW50MzJfdCBpc0NvcnJ1cHRGcmVlID0gMDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImNvcnJ1cHQtZnJlZSIsICZpc0NvcnJ1cHRGcmVlKSkgeworICAgICAgICBtSXNTdHJlYW1Db3JydXB0RnJlZSA9IGlzQ29ycnVwdEZyZWUgPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgQUxPR1YoImNvcnJ1cHQtZnJlZT1bJWRdIiwgbUlzU3RyZWFtQ29ycnVwdEZyZWUpOworICAgIH0KKwogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIGlmIChtc2ctPmZpbmRJbnQzMigibWF4LWlucHV0LXNpemUiLCAmbWF4SW5wdXRTaXplKSkgewogICAgICAgICBlcnIgPSBzZXRNaW5CdWZmZXJTaXplKGtQb3J0SW5kZXhJbnB1dCwgKHNpemVfdCltYXhJbnB1dFNpemUpOwpAQCAtMjQwOSw2ICsyNDMyLDcgQEAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJkZWNvZGVyIGNhbiBub3Qgc2V0IGxvdy1sYXRlbmN5IHRvICVkIChlcnIgJWQpIiwgbG93TGF0ZW5jeSwgZXJyKTsKICAgICB9CisgICAgbUlzTG93TGF0ZW5jeSA9IChsb3dMYXRlbmN5ICYmIGVyciA9PSBPSyk7CiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMjYwMiwxNSArMjYyNiwxNSBAQAogICAgIHVuc2lnbmVkIGludCBudW1MYXllcnMgPSAwOwogICAgIHVuc2lnbmVkIGludCBudW1CTGF5ZXJzID0gMDsKICAgICBpbnQgdGFnczsKLSAgICBjaGFyIGR1bW15OworICAgIGNoYXIgdG1wOwogICAgIE9NWF9WSURFT19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdQQVRURVJOVFlQRSBwYXR0ZXJuID0KICAgICAgICAgT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybk5vbmU7Ci0gICAgaWYgKHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgaWYgKHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJnRtcCkgPT0gMQogICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgewogICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybldlYlJUQzsKICAgICB9IGVsc2UgaWYgKCh0YWdzID0gc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAotICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmZHVtbXksICZudW1CTGF5ZXJzLCAmZHVtbXkpKQotICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIGR1bW15ID09ICcrJykpCisgICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZ0bXAsICZudW1CTGF5ZXJzLCAmdG1wKSkKKyAgICAgICAgICAgICYmICh0YWdzID09IDEgfHwgKHRhZ3MgPT0gMyAmJiB0bXAgPT0gJysnKSkKICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDAgJiYgbnVtTGF5ZXJzIDwgVUlOVDMyX01BWCAtIG51bUJMYXllcnMpIHsKICAgICAgICAgbnVtTGF5ZXJzICs9IG51bUJMYXllcnM7CiAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuQW5kcm9pZDsKQEAgLTMxMTAsNiArMzEzNCwyNiBAQAogICAgICAgICAgICAga1BvcnRJbmRleElucHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBPcHVzQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXMsICZkZWYsIHNpemVvZihkZWYpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJzZXR1cE9wdXNDb2RlYygpOiBFcnJvciAlZCBnZXR0aW5nIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cyBwYXJhbWV0ZXIiLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBkZWYublNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIGRlZi5uQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKyAgICBlcnIgPSBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXMsICZkZWYsIHNpemVvZihkZWYpKTsKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwRmxhY0NvZGVjKAogICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsLAogICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKSB7CkBAIC00MTI3LDYgKzQxNzEsMjkgQEAKICAgICAgICAgQUxPR0koInNldHVwVmlkZW9FbmNvZGVyIHN1Y2NlZWRlZCIpOwogICAgIH0KIAorICAgIC8vIFZpZGVvIHNob3VsZCBiZSBlbmNvZGVkIGFzIHN0YW5kIHN0cmFpZ2h0IGJlY2F1c2UgUlRQIHByb3RvY29sCisgICAgLy8gY2FuIHByb3ZpZGUgcm90YXRpb24gaW5mb3JtYXRpb24gb25seSBpZiBDVk8gaXMgc3VwcG9ydGVkLgorICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgYWRkZWQgdG8gc3VwcG9ydCBub24tQ1ZPIGNhc2UgZm9yIHZpZGVvIHN0cmVhbWluZyBzY2VuYXJpby4KKyAgICBpbnQzMl90IHJvdGF0aW9uID0gMDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb24pKSB7CisgICAgICAgIE9NWF9DT05GSUdfUk9UQVRJT05UWVBFIGNvbmZpZzsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmY29uZmlnKTsKKyAgICAgICAgY29uZmlnLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+Z2V0Q29uZmlnKAorICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGdldENvbmZpZyBvZiBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGUoZXJyICVkKSIsIGVycik7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnLm5Sb3RhdGlvbiA9IHJvdGF0aW9uOworICAgICAgICBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworCisgICAgICAgIEFMT0dEKCJBcHBseWluZyBlbmNvZGVyLXJvdGF0aW9uPVslZF0gdG8gdmlkZW8gZW5jb2Rlci4iLCBjb25maWcublJvdGF0aW9uKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBzZXRDb25maWcgb2YgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlKGVyciAlZCkiLCBlcnIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtNDc1NywxNSArNDgyNCwxNSBAQAogICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGF5ZXJzID0gMDsKICAgICAgICAgdW5zaWduZWQgaW50IG51bUJMYXllcnMgPSAwOwogICAgICAgICBpbnQgdGFnczsKLSAgICAgICAgY2hhciBkdW1teTsKLSAgICAgICAgaWYgKHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgICAgIGNoYXIgdG1wOworICAgICAgICBpZiAoc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmdG1wKSA9PSAxCiAgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgewogICAgICAgICAgICAgcGF0dGVybiA9IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQzsKICAgICAgICAgICAgIHRzVHlwZSA9IE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5XZWJSVEM7CiAgICAgICAgICAgICB0c0xheWVycyA9IG51bUxheWVyczsKICAgICAgICAgfSBlbHNlIGlmICgodGFncyA9IHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAiYW5kcm9pZC5nZW5lcmljLiV1JWMldSVjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZkdW1teSwgJm51bUJMYXllcnMsICZkdW1teSkpCi0gICAgICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIGR1bW15ID09ICcrJykpCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmdG1wLCAmbnVtQkxheWVycywgJnRtcCkpCisgICAgICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIHRtcCA9PSAnKycpKQogICAgICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDAgJiYgbnVtTGF5ZXJzIDwgVUlOVDMyX01BWCAtIG51bUJMYXllcnMpIHsKICAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CiAgICAgICAgICAgICAvLyBWUFggZG9lcyBub3QgaGF2ZSBhIGNvbmNlcHQgb2YgQi1mcmFtZXMsIHNvIGp1c3QgY291bnQgYWxsIGxheWVycwpAQCAtNTI4Myw2ICs1MzUwLDM0IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbE1hc2tQcmVzZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLW1hc2siLCBtQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtSXNFbmNvZGVyICYmIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbmZpZ0Zvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUuY19zdHIoKSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ0RSQ1BSRVNFTlRBVElPTlRZUEUgcHJlc2VudGF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnByZXNlbnRhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvbiwgc2l6ZW9mKHByZXNlbnRhdGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWVuY29kZWQtdGFyZ2V0LWxldmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRW5jb2RlZFRhcmdldExldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWN1dC1sZXZlbCIsIHByZXNlbnRhdGlvbi5uRHJjQ3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWJvb3N0LWxldmVsIiwgcHJlc2VudGF0aW9uLm5EcmNCb29zdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkhlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy10YXJnZXQtcmVmLWxldmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtZWZmZWN0LXR5cGUiLCBwcmVzZW50YXRpb24ubkRyY0VmZmVjdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtYWxidW0tbW9kZSIsIHByZXNlbnRhdGlvbi5uRHJjQWxidW1Nb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLW91dHB1dC1sb3VkbmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY091dHB1dExvdWRuZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTU3MjIsNyArNTgxNyw4IEBACiAKIEFDb2RlYzo6QmFzZVN0YXRlOjpCYXNlU3RhdGUoQUNvZGVjICpjb2RlYywgY29uc3Qgc3A8QVN0YXRlPiAmcGFyZW50U3RhdGUpCiAgICAgOiBBU3RhdGUocGFyZW50U3RhdGUpLAotICAgICAgbUNvZGVjKGNvZGVjKSB7CisgICAgICBtQ29kZWMoY29kZWMpLAorICAgICAgbVBlbmRpbmdFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdChmYWxzZSkgewogfQogCiBBQ29kZWM6OkJhc2VTdGF0ZTo6UG9ydE1vZGUgQUNvZGVjOjpCYXNlU3RhdGU6OmdldFBvcnRNb2RlKApAQCAtNTc2NiwxNyArNTg2MiwxOSBAQAogCiAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNldFN1cmZhY2U6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInN1cmZhY2UiLCAmb2JqKSk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+aGFuZGxlU2V0U3VyZmFjZShzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSkpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBpZiAobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNTgyMyw2ICs1OTIxLDIxIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTdWJtaXRFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyOiB7CisgICAgICAgICAgICBtUGVuZGluZ0V4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZ2V0UG9ydE1vZGUoa1BvcnRJbmRleE91dHB1dCkgPT0gUkVTVUJNSVRfQlVGRkVSUyAmJiBtQ29kZWMtPm1Jc0xvd0xhdGVuY3kpIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGVycyBvZnRlbiBuZWVkIG1vcmUgdGhhbiBvbmUgb3V0cHV0IGJ1ZmZlciB0byBiZQorICAgICAgICAgICAgICAgIC8vIHN1Ym1pdHRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIHNpbmdsZSBpbnB1dCBidWZmZXIuCisgICAgICAgICAgICAgICAgLy8gRm9yIGxvdyBsYXRlbmN5IGNvZGVjcywgd2UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciBtb3JlIGlucHV0CisgICAgICAgICAgICAgICAgLy8gdG8gYmUgcXVldWVkIHRvIGdldCB0aG9zZSBvdXRwdXQgYnVmZmVycyBzdWJtaXR0ZWQuCisgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXIoKSA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUNvZGVjLT5tTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1heWJlUG9zdEV4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTU5NzQsNiArNjA4NywxMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgaWYgKG1Db2RlYy0+bUlzU3RyZWFtQ29ycnVwdEZyZWUgJiYgZGF0YTEgPT0gKE9NWF9VMzIpT01YX0Vycm9yU3RyZWFtQ29ycnVwdCkgeworICAgICAgICBBTE9HVigiWyVzXSBoYW5kbGUgT01YX0Vycm9yU3RyZWFtQ29ycnVwdCBhcyBhIG5vcm1hbCBvcGVyYXRpb24iLAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIEFMT0dFKCJbJXNdIEVSUk9SKDB4JTA4eCkiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGRhdGExKTsKIAogICAgIC8vIHZlcmlmeSBPTVggY29tcG9uZW50IHNlbmRzIGJhY2sgYW4gZXJyb3Igd2UgZXhwZWN0LgpAQCAtNjA4MSw2ICs2MjAwLDEzIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBpbnQzMl90IGN2bzsKKyAgICBpZiAobUNvZGVjLT5tTmF0aXZlV2luZG93ICE9IE5VTEwgJiYgYnVmZmVyICE9IE5VTEwgJiYKKyAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pKSB7CisgICAgICAgIEFMT0dWKCJjdm8oJWQpIGZvdW5kIGluIGJ1ZmZlciAjJXUiLCBjdm8sIGJ1ZmZlcklEKTsKKyAgICAgICAgc2V0TmF0aXZlV2luZG93Um90YXRpb24obUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLCBjdm8pOworICAgIH0KKwogICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKICAgICBpbmZvLT5tRGF0YSA9IGJ1ZmZlcjsKIApAQCAtNjE3OSw3ICs2MzA1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dE1vZGUgPT0gRlJFRV9CVUZGRVJTID8gIkZSRUUiIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TW9kZSA9PSBLRUVQX0JVRkZFUlMgPyAiS0VFUCIgOiAiUkVTVUJNSVQiKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRNb2RlID09IFJFU1VCTUlUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Jc0xvd0xhdGVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXJyID09IE9LCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Db2RlYy0+bU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlUG9zdEV4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5mby0+Y2hlY2tSZWFkRmVuY2UoIm9uSW5wdXRCdWZmZXJGaWxsZWQiKTsKQEAgLTczMjUsNiArNzQ1Niw5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKG1Db2RlYy0+bUlzTG93TGF0ZW5jeSkgeworICAgICAgICBtYXliZVBvc3RFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCgpOworICAgIH0KIAogICAgIC8vICoqKiBOT1RFOiBUSEUgRk9MTE9XSU5HIFdPUktBUk9VTkQgV0lMTCBCRSBSRU1PVkVEICoqKgogICAgIG1Db2RlYy0+c2lnbmFsU3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXJJZkVPU193b3JrYXJvdW5kKCk7CkBAIC03NjMxLDggKzc3NjUsOCBAQAogICAgICAgICBtSW5wdXRGb3JtYXQtPnNldEludDY0KCJhbmRyb2lkLl9zdG9wLXRpbWUtb2Zmc2V0LXVzIiwgc3RvcFRpbWVPZmZzZXRVcyk7CiAgICAgfQogCi0gICAgaW50MzJfdCBkdW1teTsKLSAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoInJlcXVlc3Qtc3luYyIsICZkdW1teSkpIHsKKyAgICBpbnQzMl90IHRtcDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoInJlcXVlc3Qtc3luYyIsICZ0bXApKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcXVlc3RJRFJGcmFtZSgpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTc3MDQsNiArNzgzOCw1OCBAQAogICAgIC8vIElnbm9yZSBlcnJvcnMgYXMgZmFpbHVyZSBpcyBleHBlY3RlZCBmb3IgY29kZWNzIHRoYXQgYXJlbid0IHZpZGVvIGVuY29kZXJzLgogICAgICh2b2lkKWNvbmZpZ3VyZVRlbXBvcmFsTGF5ZXJzKHBhcmFtcywgZmFsc2UgLyogaW5Db25maWd1cmUgKi8sIG1PdXRwdXRGb3JtYXQpOwogCisgICAgQVN0cmluZyBtaW1lOworICAgIGlmICghbUlzRW5jb2RlcgorICAgICAgICAgICAgJiYgKG1Db25maWdGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpCisgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUuY19zdHIoKSkpIHsKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDRFJDUFJFU0VOVEFUSU9OVFlQRSBwcmVzZW50YXRpb247CisgICAgICAgIEluaXRPTVhQYXJhbXMoJnByZXNlbnRhdGlvbik7CisgICAgICAgIG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAmcHJlc2VudGF0aW9uLCBzaXplb2YocHJlc2VudGF0aW9uKSk7CisgICAgICAgIGludDMyX3QgdmFsdWUzMiA9IDA7CisgICAgICAgIGJvb2wgdXBkYXRlZCA9IGZhbHNlOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImFhYy1wY20tbGltaXRlci1lbmFibGUiLCAmdmFsdWUzMikpIHsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uUENNTGltaXRlckVuYWJsZSA9IHZhbHVlMzI7CisgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImFhYy1lbmNvZGVkLXRhcmdldC1sZXZlbCIsICZ2YWx1ZTMyKSkgeworICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPSB2YWx1ZTMyOworICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhYWMtZHJjLWN1dC1sZXZlbCIsICZ2YWx1ZTMyKSkgeworICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5EcmNDdXQgPSB2YWx1ZTMyOworICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhYWMtZHJjLWJvb3N0LWxldmVsIiwgJnZhbHVlMzIpKSB7CisgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY0Jvb3N0ID0gdmFsdWUzMjsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsICZ2YWx1ZTMyKSkgeworICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5IZWF2eUNvbXByZXNzaW9uID0gdmFsdWUzMjsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYWFjLXRhcmdldC1yZWYtbGV2ZWwiLCAmdmFsdWUzMikpIHsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgPSB2YWx1ZTMyOworICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhYWMtZHJjLWVmZmVjdC10eXBlIiwgJnZhbHVlMzIpKSB7CisgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY0VmZmVjdFR5cGUgPSB2YWx1ZTMyOworICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhYWMtZHJjLWFsYnVtLW1vZGUiLCAmdmFsdWUzMikpIHsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRHJjQWxidW1Nb2RlID0gdmFsdWUzMjsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghcGFyYW1zLT5maW5kSW50MzIoImFhYy1kcmMtb3V0cHV0LWxvdWRuZXNzIiwgJnZhbHVlMzIpKSB7CisgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY091dHB1dExvdWRuZXNzID0gdmFsdWUzMjsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh1cGRhdGVkKSB7CisgICAgICAgICAgICBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICZwcmVzZW50YXRpb24sIHNpemVvZihwcmVzZW50YXRpb24pKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gc2V0VmVuZG9yUGFyYW1ldGVycyhwYXJhbXMpOwogfQogCkBAIC04MjA3LDE3ICs4MzkzLDM4IEBACiAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgotICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgewotICAgICAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0UmVzdW1lKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlslc10gRGVmZXJyaW5nIHJlc3VtZSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiWyVzXSBEZWZlcnJpbmcgcmVzdW1lIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKIAogICAgICAgICAgICAgbUNvZGVjLT5kZWZlck1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInBhcmFtcyIsICZwYXJhbXMpKTsKKworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgICAgIGlmIChwYXJhbXMtPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKSkgeworICAgICAgICAgICAgICAgIGlmIChoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAodm9pZCltQ29kZWMtPnNldEhkcjEwUGx1c0luZm8oaGRyMTBQbHVzSW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcmFtcy0+cmVtb3ZlRW50cnlBdChwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZSgiaGRyMTAtcGx1cy1pbmZvIikpOworCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy0+Y291bnRFbnRyaWVzKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInBhcmFtcyIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtc2ctPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+ZGVmZXJNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdEZvcmNlU3RhdGVUcmFuc2l0aW9uOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOwpAQCAtODIyOCw2ICs4NDM1LDIzIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTZXRTdXJmYWNlOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBEZWZlcnJpbmcgc2V0U3VyZmFjZSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIE9LKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOwpAQCAtODMyOCw2ICs4NTUyLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9FdmVudENvbmZpZ1VwZGF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKWtQb3J0SW5kZXhPdXRwdXQpOworCisgICAgICAgICAgICBtQ29kZWMtPm9uQ29uZmlnVXBkYXRlKChPTVhfSU5ERVhUWVBFKWRhdGEyKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJhc2VTdGF0ZTo6b25PTVhFdmVudChldmVudCwgZGF0YTEsIGRhdGEyKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCAzYmNjYjdiLi4xNjk3N2Q3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTgsNiArOCwxMiBAQAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewpAQCAtMzQsNiArNDAsMTIgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiCiAgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7CkBAIC01OCw5ICs3MCwxOCBAQAogICAgIH0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWFuZGsiXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIApAQCAtMTMyLDggKzE1MywxMCBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0xNTAsNiArMTczLDE4IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgIH0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgbGludXg6IHsKKyAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICItRERJU0FCTEVfQVVESU9fU1lTVEVNX09GRkxPQUQiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfQorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTE3Niw3ICsyMTEsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlicmVuZGVyZW5naW5lIiwKKyAgICAgICAgImxpYnJlbmRlcmZyaWdodCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDliM2Y0MjAuLmJjZjQxOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtNDYsODggKzQ2LDYgQEAKIAogc3RhdGljIGNvbnN0IGludDY0X3QgQ0FNRVJBX1NPVVJDRV9USU1FT1VUX05TID0gMzAwMDAwMDAwMExMOwogCi1zdHJ1Y3QgQ2FtZXJhU291cmNlTGlzdGVuZXIgOiBwdWJsaWMgQ2FtZXJhTGlzdGVuZXIgewotICAgIGV4cGxpY2l0IENhbWVyYVNvdXJjZUxpc3RlbmVyKGNvbnN0IHNwPENhbWVyYVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpOwotICAgIHZpcnR1YWwgdm9pZCBwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpOwotCi0gICAgdmlydHVhbCB2b2lkIHBvc3REYXRhVGltZXN0YW1wKAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpOwotCi0gICAgdmlydHVhbCB2b2lkIHBvc3RSZWNvcmRpbmdGcmFtZUhhbmRsZVRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOwotCi0gICAgdmlydHVhbCB2b2lkIHBvc3RSZWNvcmRpbmdGcmFtZUhhbmRsZVRpbWVzdGFtcEJhdGNoKAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5zZWNzX3Q+JiB0aW1lc3RhbXBzLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkNhbWVyYVNvdXJjZUxpc3RlbmVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgd3A8Q2FtZXJhU291cmNlPiBtU291cmNlOwotCi0gICAgQ2FtZXJhU291cmNlTGlzdGVuZXIoY29uc3QgQ2FtZXJhU291cmNlTGlzdGVuZXIgJik7Ci0gICAgQ2FtZXJhU291cmNlTGlzdGVuZXIgJm9wZXJhdG9yPShjb25zdCBDYW1lcmFTb3VyY2VMaXN0ZW5lciAmKTsKLX07Ci0KLUNhbWVyYVNvdXJjZUxpc3RlbmVyOjpDYW1lcmFTb3VyY2VMaXN0ZW5lcihjb25zdCBzcDxDYW1lcmFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSkgewotfQotCi1DYW1lcmFTb3VyY2VMaXN0ZW5lcjo6fkNhbWVyYVNvdXJjZUxpc3RlbmVyKCkgewotfQotCi12b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpub3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgewotICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShtc2dUeXBlKTsKLSAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoZXh0MSk7Ci0gICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGV4dDIpOwotICAgIEFMT0dWKCJub3RpZnkoJWQsICVkLCAlZCkiLCBtc2dUeXBlLCBleHQxLCBleHQyKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICogLyogbWV0YWRhdGEgKi8pIHsKLSAgICBBTE9HVigicG9zdERhdGEoJWQsIHB0cjolcCwgc2l6ZTolenUpIiwKLSAgICAgICAgIG1zZ1R5cGUsIGRhdGFQdHItPnVuc2VjdXJlUG9pbnRlcigpLCBkYXRhUHRyLT5zaXplKCkpOwotCi0gICAgc3A8Q2FtZXJhU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKLSAgICBpZiAoc291cmNlLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgc291cmNlLT5kYXRhQ2FsbGJhY2sobXNnVHlwZSwgZGF0YVB0cik7Ci0gICAgfQotfQotCi12b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0RGF0YVRpbWVzdGFtcCgKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpIHsKLQotICAgIHNwPENhbWVyYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZS5wcm9tb3RlKCk7Ci0gICAgaWYgKHNvdXJjZS5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHNvdXJjZS0+ZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcC8xMDAwLCBtc2dUeXBlLCBkYXRhUHRyKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3RSZWNvcmRpbmdGcmFtZUhhbmRsZVRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIHsKLSAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOwotICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICBzb3VyY2UtPnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLzEwMDAsIGhhbmRsZSk7Ci0gICAgfQotfQotCi12b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0UmVjb3JkaW5nRnJhbWVIYW5kbGVUaW1lc3RhbXBCYXRjaCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bnNlY3NfdD4mIHRpbWVzdGFtcHMsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSB7Ci0gICAgc3A8Q2FtZXJhU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKLSAgICBpZiAoc291cmNlLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgaW50IG4gPSB0aW1lc3RhbXBzLnNpemUoKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8bnNlY3NfdD4gbW9kaWZpZWRUaW1lc3RhbXBzKG4pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgbW9kaWZpZWRUaW1lc3RhbXBzW2ldID0gdGltZXN0YW1wc1tpXSAvIDEwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgc291cmNlLT5yZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2gobW9kaWZpZWRUaW1lc3RhbXBzLCBoYW5kbGVzKTsKLSAgICB9Ci19Ci0KIHN0YXRpYyBpbnQzMl90IGdldENvbG9yRm9ybWF0KGNvbnN0IGNoYXIqIGNvbG9yRm9ybWF0KSB7CiAgICAgaWYgKCFjb2xvckZvcm1hdCkgewogICAgICAgICBBTE9HRSgiSW52YWxpZCBjb2xvciBmb3JtYXQiKTsKQEAgLTE2OSwxNiArODcsNiBAQAogICAgIHJldHVybiAtMTsKIH0KIAotQ2FtZXJhU291cmNlICpDYW1lcmFTb3VyY2U6OkNyZWF0ZShjb25zdCBTdHJpbmcxNiAmY2xpZW50TmFtZSkgewotICAgIFNpemUgc2l6ZTsKLSAgICBzaXplLndpZHRoID0gLTE7Ci0gICAgc2l6ZS5oZWlnaHQgPSAtMTsKLQotICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhPiBjYW1lcmE7Ci0gICAgcmV0dXJuIG5ldyBDYW1lcmFTb3VyY2UoY2FtZXJhLCBOVUxMLCAwLCBjbGllbnROYW1lLCBDYW1lcmE6OlVTRV9DQUxMSU5HX1VJRCwKLSAgICAgICAgICAgIENhbWVyYTo6VVNFX0NBTExJTkdfUElELCBzaXplLCAtMSwgTlVMTCwgZmFsc2UpOwotfQotCiAvLyBzdGF0aWMKIENhbWVyYVNvdXJjZSAqQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKAogICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhPiYgY2FtZXJhLApAQCAtMTg5LDEyICs5NywxMCBAQAogICAgIHBpZF90IGNsaWVudFBpZCwKICAgICBTaXplIHZpZGVvU2l6ZSwKICAgICBpbnQzMl90IGZyYW1lUmF0ZSwKLSAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycykgeworICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlKSB7CiAKICAgICBDYW1lcmFTb3VyY2UgKnNvdXJjZSA9IG5ldyBDYW1lcmFTb3VyY2UoY2FtZXJhLCBwcm94eSwgY2FtZXJhSWQsCi0gICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgdmlkZW9TaXplLCBmcmFtZVJhdGUsIHN1cmZhY2UsCi0gICAgICAgICAgICBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIHZpZGVvU2l6ZSwgZnJhbWVSYXRlLCBzdXJmYWNlKTsKICAgICByZXR1cm4gc291cmNlOwogfQogCkBAIC0yMDcsOCArMTEzLDcgQEAKICAgICBwaWRfdCBjbGllbnRQaWQsCiAgICAgU2l6ZSB2aWRlb1NpemUsCiAgICAgaW50MzJfdCBmcmFtZVJhdGUsCi0gICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCi0gICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpCisgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpCiAgICAgOiBtQ2FtZXJhRmxhZ3MoMCksCiAgICAgICBtTnVtSW5wdXRCdWZmZXJzKDApLAogICAgICAgbVZpZGVvRnJhbWVSYXRlKC0xKSwKQEAgLTIzMSw4ICsxMzYsNyBAQAogCiAgICAgbUluaXRDaGVjayA9IGluaXQoY2FtZXJhLCBwcm94eSwgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgY2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgICB2aWRlb1NpemUsIGZyYW1lUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9TaXplLCBmcmFtZVJhdGUpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSByZWxlYXNlQ2FtZXJhKCk7CiB9CiAKQEAgLTUzMSwxNSArNDM1LDEzIEBACiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgcGlkX3QgY2xpZW50UGlkLAogICAgICAgICBTaXplIHZpZGVvU2l6ZSwKLSAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCi0gICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKSB7CisgICAgICAgIGludDMyX3QgZnJhbWVSYXRlKSB7CiAKICAgICBBTE9HVigiaW5pdCIpOwogICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIGVyciA9IGluaXRXaXRoQ2FtZXJhQWNjZXNzKGNhbWVyYSwgcHJveHksIGNhbWVyYUlkLCBjbGllbnROYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NpemUsIGZyYW1lUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgZnJhbWVSYXRlKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICByZXR1cm4gZXJyOwogfQpAQCAtNjI2LDggKzUyOCw3IEBACiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgcGlkX3QgY2xpZW50UGlkLAogICAgICAgICBTaXplIHZpZGVvU2l6ZSwKLSAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCi0gICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKSB7CisgICAgICAgIGludDMyX3QgZnJhbWVSYXRlKSB7CiAgICAgQUxPR1YoImluaXRXaXRoQ2FtZXJhQWNjZXNzIik7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKQEAgLTY2NywyNCArNTY4LDEyIEBACiAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNhbWVyYS0+c2V0UHJldmlld1RhcmdldChtU3VyZmFjZSkpOwogICAgIH0KIAotICAgIC8vIEJ5IGRlZmF1bHQsIHN0b3JlIHJlYWwgZGF0YSBpbiB2aWRlbyBidWZmZXJzLgotICAgIG1WaWRlb0J1ZmZlck1vZGUgPSBoYXJkd2FyZTo6SUNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19ZVVY7Ci0gICAgaWYgKHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycykgewotICAgICAgICBpZiAoT0sgPT0gbUNhbWVyYS0+c2V0VmlkZW9CdWZmZXJNb2RlKGhhcmR3YXJlOjpJQ2FtZXJhOjpWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUpKSB7Ci0gICAgICAgICAgICBtVmlkZW9CdWZmZXJNb2RlID0gaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRTsKLSAgICAgICAgfSBlbHNlIGlmIChPSyA9PSBtQ2FtZXJhLT5zZXRWaWRlb0J1ZmZlck1vZGUoCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEEpKSB7Ci0gICAgICAgICAgICBtVmlkZW9CdWZmZXJNb2RlID0gaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvQnVmZmVyTW9kZSA9PSBoYXJkd2FyZTo6SUNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19ZVVYpIHsKLSAgICAgICAgZXJyID0gbUNhbWVyYS0+c2V0VmlkZW9CdWZmZXJNb2RlKGhhcmR3YXJlOjpJQ2FtZXJhOjpWSURFT19CVUZGRVJfTU9ERV9EQVRBX0NBTExCQUNLX1lVVik7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU2V0dGluZyB2aWRlbyBidWZmZXIgbW9kZSB0byBWSURFT19CVUZGRVJfTU9ERV9EQVRBX0NBTExCQUNLX1lVViBmYWlsZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgIiVzIChlcnI9JWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KKyAgICAvLyBVc2UgYnVmZmVyIHF1ZXVlIHRvIHJlY2VpdmUgdmlkZW8gYnVmZmVycyBmcm9tIGNhbWVyYQorICAgIGVyciA9IG1DYW1lcmEtPnNldFZpZGVvQnVmZmVyTW9kZShoYXJkd2FyZTo6SUNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfQlVGRkVSX1FVRVVFKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU2V0dGluZyB2aWRlbyBidWZmZXIgbW9kZSB0byBWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgIiVzIChlcnI9JWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKICAgICBpbnQ2NF90IGdsaXRjaER1cmF0aW9uVXMgPSAoMTAwMDAwMExMIC8gbVZpZGVvRnJhbWVSYXRlKTsKQEAgLTcyNCw1NCArNjEzLDI2IEBACiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgc3RhdHVzX3QgZXJyOwogCi0gICAgaWYgKG1WaWRlb0J1ZmZlck1vZGUgPT0gaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRSkgewotICAgICAgICAvLyBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZS4KLSAgICAgICAgZXJyID0gaW5pdEJ1ZmZlclF1ZXVlKG1WaWRlb1NpemUud2lkdGgsIG1WaWRlb1NpemUuaGVpZ2h0LCBtRW5jb2RlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAoYW5kcm9pZF9kYXRhc3BhY2VfdCltRW5jb2RlckRhdGFTcGFjZSwKLSAgICAgICAgICAgICAgICBtTnVtSW5wdXRCdWZmZXJzID4gMCA/IG1OdW1JbnB1dEJ1ZmZlcnMgOiAxKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBidWZmZXIgcXVldWU6ICVzIChlcnI9JWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobU51bUlucHV0QnVmZmVycyA+IDApIHsKLSAgICAgICAgICAgIGVyciA9IG1DYW1lcmEtPnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgIENBTUVSQV9DTURfU0VUX1ZJREVPX0JVRkZFUl9DT1VOVCwgbU51bUlucHV0QnVmZmVycywgMCk7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGZvciBDYW1lcmFIQUwxIGNsaWVudHM7IHRodXMgdGhlIGZhaWx1cmUgaXMKLSAgICAgICAgICAgIC8vIG5vdCBhIGZhdGFsIGVycm9yCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBzZXQgdmlkZW8gYnVmZmVyIGNvdW50IHRvICVkIGR1ZSB0byAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1OdW1JbnB1dEJ1ZmZlcnMsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBtQ2FtZXJhLT5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgIENBTUVSQV9DTURfU0VUX1ZJREVPX0ZPUk1BVCwgbUVuY29kZXJGb3JtYXQsIG1FbmNvZGVyRGF0YVNwYWNlKTsKLQotICAgICAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBmb3IgQ2FtZXJhSEFMMSBjbGllbnRzOyB0aHVzIHRoZSBmYWlsdXJlIGlzCi0gICAgICAgIC8vIG5vdCBhIGZhdGFsIGVycm9yCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gc2V0IHZpZGVvIGVuY29kZXIgZm9ybWF0L2RhdGFzcGFjZSB0byAlZCwgJWQgZHVlIHRvICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJGb3JtYXQsIG1FbmNvZGVyRGF0YVNwYWNlLCBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG1lbW9yeSBoZWFwIHRvIHN0b3JlIGJ1ZmZlcnMgYXMgVmlkZW9OYXRpdmVNZXRhZGF0YS4KLSAgICAgICAgY3JlYXRlVmlkZW9CdWZmZXJNZW1vcnlIZWFwKHNpemVvZihWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKSwga0RlZmF1bHRWaWRlb0J1ZmZlckNvdW50KTsKKyAgICAvLyBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZS4KKyAgICBlcnIgPSBpbml0QnVmZmVyUXVldWUobVZpZGVvU2l6ZS53aWR0aCwgbVZpZGVvU2l6ZS5oZWlnaHQsIG1FbmNvZGVyRm9ybWF0LAorICAgICAgICAgICAgKGFuZHJvaWRfZGF0YXNwYWNlX3QpbUVuY29kZXJEYXRhU3BhY2UsCisgICAgICAgICAgICBtTnVtSW5wdXRCdWZmZXJzID4gMCA/IG1OdW1JbnB1dEJ1ZmZlcnMgOiAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgYnVmZmVyIHF1ZXVlOiAlcyAoZXJyPSVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICAvLyBTdGFydCBkYXRhIGZsb3cKICAgICBlcnIgPSBPSzsKICAgICBpZiAobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgewogICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKICAgICAgICAgbUNhbWVyYS5jbGVhcigpOwotICAgICAgICBpZiAoKGVyciA9IG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcoCi0gICAgICAgICAgICAgICAgbmV3IFByb3h5TGlzdGVuZXIodGhpcykpKSAhPSBPSykgeworICAgICAgICBpZiAoKGVyciA9IG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcoKSkgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgcmVjb3JkaW5nLCByZWNlaXZlZCBlcnJvcjogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIobmV3IENhbWVyYVNvdXJjZUxpc3RlbmVyKHRoaXMpKTsKICAgICAgICAgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKTsKICAgICAgICAgaWYgKCFtQ2FtZXJhLT5yZWNvcmRpbmdFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7CkBAIC04MzYsNyArNjk3LDYgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtQ2FtZXJhICE9IDApIHsKLSAgICAgICAgICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOwogICAgICAgICAgICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOwogICAgICAgICB9CiAgICAgfQpAQCAtOTM1LDk3ICs3OTUsMzEgQEAKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CiAgICAgQUxPR1YoInJlbGVhc2VSZWNvcmRpbmdGcmFtZSIpOwogCi0gICAgaWYgKG1WaWRlb0J1ZmZlck1vZGUgPT0gaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRSkgewotICAgICAgICAvLyBSZXR1cm4gdGhlIGJ1ZmZlciB0byBidWZmZXIgcXVldWUgaW4gVklERU9fQlVGRkVSX01PREVfQlVGRkVSX1FVRVVFIG1vZGUuCi0gICAgICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBmcmFtZS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgaWYgKGhlYXAtPmdldEhlYXBJRCgpICE9IG1NZW1vcnlIZWFwQmFzZS0+Z2V0SGVhcElEKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogTWlzbWF0Y2hlZCBoZWFwIElELCBpZ25vcmluZyByZWxlYXNlIChnb3QgJXgsIGV4cGVjdGVkICV4KSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgaGVhcC0+Z2V0SGVhcElEKCksIG1NZW1vcnlIZWFwQmFzZS0+Z2V0SGVhcElEKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqcGF5bG9hZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmlkZW9OYXRpdmVNZXRhZGF0YSo+KAotICAgICAgICAgICAgICAgICh1aW50OF90KiloZWFwLT5nZXRCYXNlKCkgKyBvZmZzZXQpOwotCi0gICAgICAgIC8vIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgYnVmZmVyIGl0ZW0gZm9yIHRoZSBuYXRpdmUgd2luZG93IGJ1ZmZlci4KLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1SZWNlaXZlZEJ1ZmZlckl0ZW1NYXAuaW5kZXhPZktleShwYXlsb2FkLT5wQnVmZmVyKTsKLSAgICAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkbid0IGZpbmQgYnVmZmVyIGl0ZW0gZm9yICVwIiwgX19GVU5DVElPTl9fLCBwYXlsb2FkLT5wQnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlckl0ZW0gYnVmZmVyID0gbVJlY2VpdmVkQnVmZmVySXRlbU1hcC52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgbVJlY2VpdmVkQnVmZmVySXRlbU1hcC5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgbVZpZGVvQnVmZmVyQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKLSAgICAgICAgbU1lbW9yeUJhc2VzLnB1c2hfYmFjayhmcmFtZSk7Ci0gICAgICAgIG1NZW1vcnlCYXNlQXZhaWxhYmxlQ29uZC5zaWduYWwoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgZnJhbWUgY29udGFpbnMgYSBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhLgotICAgICAgICBpZiAoZnJhbWUtPnNpemUoKSA9PSBzaXplb2YoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSkpIHsKLSAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCi0gICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCi0gICAgICAgICAgLy8gICAgICAgRWl0aGVyIGRvY3VtZW50IHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgY2FzZSBvciBhZGRyZXNzIHRoZQotICAgICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgotICAgICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhICptZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShmcmFtZS0+dW5zZWN1cmVQb2ludGVyKCkpOwotICAgICAgICAgICAgaWYgKG1ldGFkYXRhLT5lVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlID0gbWV0YWRhdGEtPnBIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGZyYW1lLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotICAgICAgICAgICAgaWYgKGhlYXAtPmdldEhlYXBJRCgpICE9IG1NZW1vcnlIZWFwQmFzZS0+Z2V0SGVhcElEKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1pc21hdGNoZWQgaGVhcCBJRCwgaWdub3JpbmcgcmVsZWFzZSAoZ290ICV4LCBleHBlY3RlZCAleCkiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgaGVhcC0+Z2V0SGVhcElEKCksIG1NZW1vcnlIZWFwQmFzZS0+Z2V0SGVhcElEKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IGJhdGNoU2l6ZSA9IDA7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CYXRjaExvY2spOwotICAgICAgICAgICAgICAgIGlmIChtSW5mbGlnaHRCYXRjaFNpemVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gbUluZmxpZ2h0QmF0Y2hTaXplc1swXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYmF0Y2hTaXplID09IDApIHsgLy8gcmV0dXJuIGJ1ZmZlcnMgb25lIGJ5IG9uZQotICAgICAgICAgICAgICAgIC8vIEZyYW1lIGNvbnRhaW5zIGEgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YS4gU2VuZCB0aGUgaGFuZGxlIGJhY2sgdG8gY2FtZXJhLgotICAgICAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgICAgIG1NZW1vcnlCYXNlcy5wdXNoX2JhY2soZnJhbWUpOwotICAgICAgICAgICAgICAgIG1NZW1vcnlCYXNlQXZhaWxhYmxlQ29uZC5zaWduYWwoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIEdyb3VwIGJ1ZmZlcnMgaW4gYmF0Y2ggdGhlbiByZXR1cm4KLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJhdGNoTG9jayk7Ci0gICAgICAgICAgICAgICAgbUluZmxpZ2h0UmV0dXJuZWRIYW5kbGVzLnB1c2hfYmFjayhoYW5kbGUpOwotICAgICAgICAgICAgICAgIG1JbmZsaWdodFJldHVybmVkTWVtb3J5cy5wdXNoX2JhY2soZnJhbWUpOwotICAgICAgICAgICAgICAgIGlmIChtSW5mbGlnaHRSZXR1cm5lZEhhbmRsZXMuc2l6ZSgpID09IGJhdGNoU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaChtSW5mbGlnaHRSZXR1cm5lZEhhbmRsZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIG1JbmZsaWdodEJhdGNoU2l6ZXMucG9wX2Zyb250KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbmZsaWdodFJldHVybmVkSGFuZGxlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG1lbSA6IG1JbmZsaWdodFJldHVybmVkTWVtb3J5cykgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lbW9yeUJhc2VzLnB1c2hfYmFjayhtZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lbW9yeUJhc2VBdmFpbGFibGVDb25kLnNpZ25hbCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1JbmZsaWdodFJldHVybmVkTWVtb3J5cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBtQ2FtZXJhIGlzIGNyZWF0ZWQgYnkgYXBwbGljYXRpb24uIFJldHVybiB0aGUgZnJhbWUgYmFjayB0byBjYW1lcmEgdmlhIGNhbWVyYQotICAgICAgICAgICAgLy8gcmVjb3JkaW5nIHByb3h5LgotICAgICAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOwotICAgICAgICB9IGVsc2UgaWYgKG1DYW1lcmEgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gbUNhbWVyYSBpcyBjcmVhdGVkIGJ5IENhbWVyYVNvdXJjZS4gUmV0dXJuIHRoZSBmcmFtZSBkaXJlY3RseSBiYWNrIHRvIGNhbWVyYS4KLSAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICB9CisgICAgLy8gUmV0dXJuIHRoZSBidWZmZXIgdG8gYnVmZmVyIHF1ZXVlIGluIFZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRSBtb2RlLgorICAgIHNzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gZnJhbWUtPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CisgICAgaWYgKGhlYXAtPmdldEhlYXBJRCgpICE9IG1NZW1vcnlIZWFwQmFzZS0+Z2V0SGVhcElEKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBNaXNtYXRjaGVkIGhlYXAgSUQsIGlnbm9yaW5nIHJlbGVhc2UgKGdvdCAleCwgZXhwZWN0ZWQgJXgpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGhlYXAtPmdldEhlYXBJRCgpLCBtTWVtb3J5SGVhcEJhc2UtPmdldEhlYXBJRCgpKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKnBheWxvYWQgPSByZWludGVycHJldF9jYXN0PFZpZGVvTmF0aXZlTWV0YWRhdGEqPigKKyAgICAgICAgKHVpbnQ4X3QqKWhlYXAtPmdldEJhc2UoKSArIG9mZnNldCk7CisKKyAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGJ1ZmZlciBpdGVtIGZvciB0aGUgbmF0aXZlIHdpbmRvdyBidWZmZXIuCisgICAgc3NpemVfdCBpbmRleCA9IG1SZWNlaXZlZEJ1ZmZlckl0ZW1NYXAuaW5kZXhPZktleShwYXlsb2FkLT5wQnVmZmVyKTsKKyAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZG4ndCBmaW5kIGJ1ZmZlciBpdGVtIGZvciAlcCIsIF9fRlVOQ1RJT05fXywgcGF5bG9hZC0+cEJ1ZmZlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCdWZmZXJJdGVtIGJ1ZmZlciA9IG1SZWNlaXZlZEJ1ZmZlckl0ZW1NYXAudmFsdWVBdChpbmRleCk7CisgICAgbVJlY2VpdmVkQnVmZmVySXRlbU1hcC5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICBtVmlkZW9CdWZmZXJDb25zdW1lci0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworICAgIG1NZW1vcnlCYXNlcy5wdXNoX2JhY2soZnJhbWUpOworICAgIG1NZW1vcnlCYXNlQXZhaWxhYmxlQ29uZC5zaWduYWwoKTsKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VRdWV1ZWRGcmFtZXMoKSB7CkBAIC0xMTgxLDE1MiArOTc1LDYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKLSAgICAgICAgaW50MzJfdCBtc2dUeXBlIF9fdW51c2VkLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgewotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6IHRpbWVzdGFtcCAlbGxkIHVzIiwgKGxvbmcgbG9uZyl0aW1lc3RhbXBVcyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChzaG91bGRTa2lwRnJhbWVMb2NrZWQodGltZXN0YW1wVXMpKSB7Ci0gICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShkYXRhKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgICsrbU51bUZyYW1lc1JlY2VpdmVkOwotCi0gICAgQ0hFQ0soZGF0YSAhPSBOVUxMICYmIGRhdGEtPnNpemUoKSA+IDApOwotICAgIG1GcmFtZXNSZWNlaXZlZC5wdXNoX2JhY2soZGF0YSk7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAodGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7Ci0gICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7Ci0gICAgQUxPR1YoImluaXRpYWwgZGVsYXk6ICUiIFBSSWQ2NCAiLCBjdXJyZW50IHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwKLSAgICAgICAgbVN0YXJ0VGltZVVzLCB0aW1lVXMpOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgewotICAgIGlmIChtQ2FtZXJhUmVjb3JkaW5nUHJveHkgIT0gbnVsbHB0cikgewotICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShoYW5kbGUpOwotICAgIH0gZWxzZSBpZiAobUNhbWVyYSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSB7Ci0gICAgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goaGFuZGxlcyk7Ci0gICAgfSBlbHNlIGlmIChtQ2FtZXJhICE9IG51bGxwdHIpIHsKLSAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKGhhbmRsZXMpOwotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXMpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsCi0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIHsKLSAgICBBTE9HVigiJXM6IHRpbWVzdGFtcCAlbGxkIHVzIiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKXRpbWVzdGFtcFVzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgaWYgKHNob3VsZFNraXBGcmFtZUxvY2tlZCh0aW1lc3RhbXBVcykpIHsKLSAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobU1lbW9yeUJhc2VzLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKG1NZW1vcnlCYXNlQXZhaWxhYmxlQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtNZW1vcnlCYXNlQXZhaWxhYmxlVGltZW91dE5zKSA9PQotICAgICAgICAgICAgICAgIFRJTUVEX09VVCkgewotICAgICAgICAgICAgQUxPR1coIldhaXRpbmcgb24gYW4gYXZhaWxhYmxlIG1lbW9yeSBiYXNlIHRpbWVkIG91dC4gRHJvcHBpbmcgYSByZWNvcmRpbmcgZnJhbWUuIik7Ci0gICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgICsrbU51bUZyYW1lc1JlY2VpdmVkOwotCi0gICAgc3A8SU1lbW9yeT4gZGF0YSA9ICptTWVtb3J5QmFzZXMuYmVnaW4oKTsKLSAgICBtTWVtb3J5QmFzZXMuZXJhc2UobU1lbW9yeUJhc2VzLmJlZ2luKCkpOwotCi0gICAgLy8gV3JhcCBuYXRpdmUgaGFuZGxlIGluIHNwPElNZW1vcnk+IHNvIGl0IGNhbiBiZSBwdXNoZWQgdG8gbUZyYW1lc1JlY2VpdmVkLgotICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgKm1ldGFkYXRhID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShkYXRhLT51bnNlY3VyZVBvaW50ZXIoKSk7Ci0gICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKLSAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKLQotICAgIG1GcmFtZXNSZWNlaXZlZC5wdXNoX2JhY2soZGF0YSk7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAodGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7Ci0gICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7Ci0gICAgQUxPR1YoImluaXRpYWwgZGVsYXk6ICUiIFBSSWQ2NCAiLCBjdXJyZW50IHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgbVN0YXJ0VGltZVVzLCB0aW1lVXMpOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIHRpbWVzdGFtcHNVcywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKLSAgICBzaXplX3QgbiA9IHRpbWVzdGFtcHNVcy5zaXplKCk7Ci0gICAgaWYgKG4gIT0gaGFuZGxlcy5zaXplKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiB0aW1lc3RhbXBzVXMoJXp1KSBhbmQgaGFuZGxlcyglenUpIHNpemUgbWlzbWF0Y2ghIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRpbWVzdGFtcHNVcy5zaXplKCksIGhhbmRsZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGludCBiYXRjaFNpemUgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMgPSB0aW1lc3RhbXBzVXNbaV07Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gaGFuZGxlc1tpXTsKLQotICAgICAgICBBTE9HVigiJXM6IHRpbWVzdGFtcCAlbGxkIHVzIiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKXRpbWVzdGFtcFVzKTsKLSAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSBjb250aW51ZTsKLQotICAgICAgICBpZiAoc2hvdWxkU2tpcEZyYW1lTG9ja2VkKHRpbWVzdGFtcFVzKSkgewotICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChtTWVtb3J5QmFzZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1NZW1vcnlCYXNlQXZhaWxhYmxlQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtNZW1vcnlCYXNlQXZhaWxhYmxlVGltZW91dE5zKSA9PQotICAgICAgICAgICAgICAgICAgICBUSU1FRF9PVVQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiV2FpdGluZyBvbiBhbiBhdmFpbGFibGUgbWVtb3J5IGJhc2UgdGltZWQgb3V0LiBEcm9wcGluZyBhIHJlY29yZGluZyBmcmFtZS4iKTsKLSAgICAgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICArK2JhdGNoU2l6ZTsKLSAgICAgICAgKyttTnVtRnJhbWVzUmVjZWl2ZWQ7Ci0gICAgICAgIHNwPElNZW1vcnk+IGRhdGEgPSAqbU1lbW9yeUJhc2VzLmJlZ2luKCk7Ci0gICAgICAgIG1NZW1vcnlCYXNlcy5lcmFzZShtTWVtb3J5QmFzZXMuYmVnaW4oKSk7Ci0KLSAgICAgICAgLy8gV3JhcCBuYXRpdmUgaGFuZGxlIGluIHNwPElNZW1vcnk+IHNvIGl0IGNhbiBiZSBwdXNoZWQgdG8gbUZyYW1lc1JlY2VpdmVkLgotICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCi0gICAgICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MgdGhlCi0gICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgotICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhICptZXRhZGF0YSA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoZGF0YS0+dW5zZWN1cmVQb2ludGVyKCkpOwotICAgICAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOwotICAgICAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKLQotICAgICAgICBtRnJhbWVzUmVjZWl2ZWQucHVzaF9iYWNrKGRhdGEpOwotICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TdGFydFRpbWVVcyArICh0aW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKLSAgICAgICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7Ci0gICAgICAgIEFMT0dWKCJpbml0aWFsIGRlbGF5OiAlIiBQUklkNjQgIiwgY3VycmVudCB0aW1lIHN0YW1wOiAlIiBQUklkNjQsIG1TdGFydFRpbWVVcywgdGltZVVzKTsKLQotICAgIH0KLSAgICBpZiAoYmF0Y2hTaXplID4gMCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJhdGNoTG9jayk7Ci0gICAgICAgIG1JbmZsaWdodEJhdGNoU2l6ZXMucHVzaF9iYWNrKGJhdGNoU2l6ZSk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKLSAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIH0KLX0KLQogQ2FtZXJhU291cmNlOjpCdWZmZXJRdWV1ZUxpc3RlbmVyOjpCdWZmZXJRdWV1ZUxpc3RlbmVyKGNvbnN0IHNwPEJ1ZmZlckl0ZW1Db25zdW1lcj4mIGNvbnN1bWVyLAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTb3VyY2U+JiBjYW1lcmFTb3VyY2UpIHsKICAgICBtQ29uc3VtZXIgPSBjb25zdW1lcjsKQEAgLTE0MTcsNDEgKzEwNjUsNyBAQAogTWV0YWRhdGFCdWZmZXJUeXBlIENhbWVyYVNvdXJjZTo6bWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0IHsKICAgICBBTE9HVigibWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyIpOwogCi0gICAgLy8gT3V0cHV0IGJ1ZmZlcnMgd2lsbCBjb250YWluIG1ldGFkYXRhIGlmIGNhbWVyYSBzZW5kcyB1cyBidWZmZXIgaW4gbWV0YWRhdGEgbW9kZSBvciB2aWEKLSAgICAvLyBidWZmZXIgcXVldWUuCi0gICAgc3dpdGNoIChtVmlkZW9CdWZmZXJNb2RlKSB7Ci0gICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEE6Ci0gICAgICAgICAgICByZXR1cm4ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKLSAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfQlVGRkVSX1FVRVVFOgotICAgICAgICAgICAgcmV0dXJuIGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7Ci0gICAgfQotfQotCi1DYW1lcmFTb3VyY2U6OlByb3h5TGlzdGVuZXI6OlByb3h5TGlzdGVuZXIoY29uc3Qgc3A8Q2FtZXJhU291cmNlPiYgc291cmNlKSB7Ci0gICAgbVNvdXJjZSA9IHNvdXJjZTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OlByb3h5TGlzdGVuZXI6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCgKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpIHsKLSAgICBtU291cmNlLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wIC8gMTAwMCwgbXNnVHlwZSwgZGF0YVB0cik7Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlOjpQcm94eUxpc3RlbmVyOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgewotICAgIG1Tb3VyY2UtPnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wIC8gMTAwMCwgaGFuZGxlKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OlByb3h5TGlzdGVuZXI6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIHRpbWVzdGFtcHNVcywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKLSAgICBpbnQgbiA9IHRpbWVzdGFtcHNVcy5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8bnNlY3NfdD4gbW9kaWZpZWRUaW1lc3RhbXBzKG4pOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIG1vZGlmaWVkVGltZXN0YW1wc1tpXSA9IHRpbWVzdGFtcHNVc1tpXSAvIDEwMDA7Ci0gICAgfQotICAgIG1Tb3VyY2UtPnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaChtb2RpZmllZFRpbWVzdGFtcHMsIGhhbmRsZXMpOworICAgIHJldHVybiBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOwogfQogCiB2b2lkIENhbWVyYVNvdXJjZTo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAppbmRleCBlMGE2ZWIzLi41MGE1MTJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKQEAgLTQ1LDE1ICs0NSwxMyBAQAogICAgICAgICBTaXplIHZpZGVvU2l6ZSwKICAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSwKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCi0gICAgICAgIGludDY0X3QgdGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcywKLSAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzKSB7CiAKICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IG5ldwogICAgICAgICAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNhbWVyYSwgcHJveHksIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgdmlkZW9GcmFtZVJhdGUsIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgdGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcywKLSAgICAgICAgICAgICAgICBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXMpOwogCiAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CkBAIC03NCwxMSArNzIsOSBAQAogICAgICAgICBTaXplIHZpZGVvU2l6ZSwKICAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSwKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCi0gICAgICAgIGludDY0X3QgdGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcywKLSAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcykKICAgICAgIDogQ2FtZXJhU291cmNlKGNhbWVyYSwgcHJveHksIGNhbWVyYUlkLCBjbGllbnROYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICB2aWRlb1NpemUsIHZpZGVvRnJhbWVSYXRlLCBzdXJmYWNlLAotICAgICAgICAgICAgICAgIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyksCisgICAgICAgICAgICAgICAgdmlkZW9TaXplLCB2aWRlb0ZyYW1lUmF0ZSwgc3VyZmFjZSksCiAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzKDFFNi92aWRlb0ZyYW1lUmF0ZSksCiAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzKDApLAogICAgICAgbVNraXBDdXJyZW50RnJhbWUoZmFsc2UpIHsKQEAgLTE3MywxMiArMTY5LDYgQEAKICAgICBBTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVF1aWNrU3RvcExvY2spOwogICAgIGlmIChtUXVpY2tTdG9wICYmIChidWZmZXIgPT0gbUxhc3RSZWFkQnVmZmVyQ29weSkpIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9ICgKLSAgICAgICAgICAgICAgICAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKG1MYXN0UmVhZEJ1ZmZlckNvcHktPmRhdGEoKSkpLT5wSGFuZGxlOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICAgICAgfQogICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKE5VTEwpOwogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgbUxhc3RSZWFkQnVmZmVyQ29weSA9IE5VTEw7CkBAIC0xOTEsOCArMTgxLDcgQEAKIHZvaWQgY3JlYXRlTWVkaWFCdWZmZXJDb3B5KAogICAgICAgICBjb25zdCBNZWRpYUJ1ZmZlckJhc2UmIHNvdXJjZUJ1ZmZlciwKICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWUsCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm5ld0J1ZmZlciwKLSAgICAgICAgaW50MzJfdCB2aWRlb0J1ZmZlck1vZGUpIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqbmV3QnVmZmVyKSB7CiAKICAgICBBTE9HVigiY3JlYXRlTWVkaWFCdWZmZXJDb3B5Iik7CiAgICAgc2l6ZV90IHNvdXJjZVNpemUgPSBzb3VyY2VCdWZmZXIuc2l6ZSgpOwpAQCAtMjAzLDE5ICsxOTIsMTMgQEAKIAogICAgICgqbmV3QnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7CiAKLSAgICBpZiAodmlkZW9CdWZmZXJNb2RlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgKChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoKCpuZXdCdWZmZXIpLT5kYXRhKCkpKS0+cEhhbmRsZSA9Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb25lKAotICAgICAgICAgICAgICAgICgoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKHNvdXJjZUJ1ZmZlci5kYXRhKCkpKS0+cEhhbmRsZSk7Ci0gICAgfQogfQogCiB2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZmlsbExhc3RSZWFkQnVmZmVyQ29weShNZWRpYUJ1ZmZlckJhc2UmIHNvdXJjZUJ1ZmZlcikgewogICAgIEFMT0dWKCJmaWxsTGFzdFJlYWRCdWZmZXJDb3B5Iik7CiAgICAgaW50NjRfdCBmcmFtZVRpbWU7CiAgICAgQ0hFQ0soc291cmNlQnVmZmVyLm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJmZyYW1lVGltZSkpOwotICAgIGNyZWF0ZU1lZGlhQnVmZmVyQ29weShzb3VyY2VCdWZmZXIsIGZyYW1lVGltZSwgJm1MYXN0UmVhZEJ1ZmZlckNvcHksCi0gICAgICAgIG1ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSk7CisgICAgY3JlYXRlTWVkaWFCdWZmZXJDb3B5KHNvdXJjZUJ1ZmZlciwgZnJhbWVUaW1lLCAmbUxhc3RSZWFkQnVmZmVyQ29weSk7CiAgICAgbUxhc3RSZWFkQnVmZmVyQ29weS0+YWRkX3JlZigpOwogICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHktPnNldE9ic2VydmVyKHRoaXMpOwogfQpAQCAtMjQwLDE5ICsyMjMsNiBAQAogICAgIH0KIH0KIAotc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcmVhdGVJTWVtb3J5Q29weSgKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKSB7Ci0KLSAgICBBTE9HVigiY3JlYXRlSU1lbW9yeUNvcHkiKTsKLSAgICBzaXplX3Qgc291cmNlX3NpemUgPSBzb3VyY2VfZGF0YS0+c2l6ZSgpOwotICAgIHZvaWQqIHNvdXJjZV9wb2ludGVyID0gc291cmNlX2RhdGEtPnVuc2VjdXJlUG9pbnRlcigpOwotCi0gICAgc3A8TWVtb3J5SGVhcEJhc2U+IG5ld01lbW9yeUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc291cmNlX3NpemUpOwotICAgIHNwPE1lbW9yeUJhc2U+IG5ld01lbW9yeSA9IG5ldyBNZW1vcnlCYXNlKG5ld01lbW9yeUhlYXAsIDAsIHNvdXJjZV9zaXplKTsKLSAgICBtZW1jcHkobmV3TWVtb3J5LT51bnNlY3VyZVBvaW50ZXIoKSwgc291cmNlX3BvaW50ZXIsIHNvdXJjZV9zaXplKTsKLSAgICByZXR1cm4gbmV3TWVtb3J5OwotfQotCiBib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IC8qIHRpbWVzdGFtcFVzICovKSB7CiAgICAgQUxPR1YoInNraXBDdXJyZW50RnJhbWUiKTsKICAgICBpZiAobVNraXBDdXJyZW50RnJhbWUpIHsKQEAgLTMxOCwzMSArMjg4LDYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKLSAgICBBTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIik7Ci0gICAgbVNraXBDdXJyZW50RnJhbWUgPSBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoJnRpbWVzdGFtcFVzKTsKLSAgICBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgZGF0YSk7Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsCi0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgewotICAgIEFMT0dWKCJyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wIik7Ci0gICAgbVNraXBDdXJyZW50RnJhbWUgPSBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoJnRpbWVzdGFtcFVzKTsKLSAgICBDYW1lcmFTb3VyY2U6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIGhhbmRsZSk7Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiB0aW1lc3RhbXBzVXMsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSB7Ci0gICAgQUxPR1YoInJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCIpOwotICAgIGludCBuID0gdGltZXN0YW1wc1VzLnNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAvLyBEb24ndCBkbyBiYXRjaGluZyBmb3IgQ2FtZXJhU291cmNlVGltZUxhcHNlIGZvciBub3cKLSAgICAgICAgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBzVXNbaV0sIGhhbmRsZXNbaV0pOwotICAgIH0KLX0KLQogdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnByb2Nlc3NCdWZmZXJRdWV1ZUZyYW1lKEJ1ZmZlckl0ZW0mIGJ1ZmZlcikgewogICAgIEFMT0dWKCJwcm9jZXNzQnVmZmVyUXVldWVGcmFtZSIpOwogICAgIGludDY0X3QgdGltZXN0YW1wVXMgPSBidWZmZXIubVRpbWVzdGFtcCAvIDEwMDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZUNhcHR1cmVQcm9jZXNzb3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVDYXB0dXJlUHJvY2Vzc29yLmNwcAppbmRleCA5NmMxMTk1Li44Y2Q3ZjgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZUNhcHR1cmVQcm9jZXNzb3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lQ2FwdHVyZVByb2Nlc3Nvci5jcHAKQEAgLTE2NCwxNCArMTY0LDE1IEBACiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJkcmF3TGF5ZXJzIHJldHVybmVkIGVyciAlZCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gZmVuY2UtPndhaXQoNTAwKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIndhaXQgZm9yIGZlbmNlIHJldHVybmVkIGVyciAlZCIsIGVycik7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfQogICAgIH0KLQotICAgIGVyciA9IGZlbmNlLT53YWl0KDUwMCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygid2FpdCBmb3IgZmVuY2UgcmV0dXJuZWQgZXJyICVkIiwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOworICAgIG1SRS0+Y2xlYW51cFBvc3RSZW5kZXIocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU6OkNsZWFudXBNb2RlOjpDTEVBTl9BTEwpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHZvaWQgRnJhbWVDYXB0dXJlUHJvY2Vzc29yOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKaW5kZXggNzM0ZjViYi4uZDExNDA4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL0ZyYW1lRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvRnJhbWVDYXB0dXJlTGF5ZXIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KQEAgLTQzLDcgKzQ0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGludDY0X3Qga0J1ZmZlclRpbWVPdXRVcyA9IDEwMDAwTEw7IC8vIDEwIG1zZWMKLXN0YXRpYyBjb25zdCBzaXplX3Qga1JldHJ5Q291bnQgPSA1MDsgLy8gbXVzdCBiZSA+MAorc3RhdGljIGNvbnN0IHNpemVfdCBrUmV0cnlDb3VudCA9IDEwMDsgLy8gbXVzdCBiZSA+MAogc3RhdGljIGNvbnN0IGludDY0X3Qga0RlZmF1bHRTYW1wbGVEdXJhdGlvblVzID0gMzMzMzNMTDsgLy8gMzNtcwogCiBzcDxJTWVtb3J5PiBhbGxvY1ZpZGVvRnJhbWUoY29uc3Qgc3A8TWV0YURhdGE+JiB0cmFja01ldGEsCkBAIC0xMjAsMTUgKzEyMSwyMyBAQAogICAgICAgICAgICAgZmFsc2UgLyphbGxvY1JvdGF0ZWQqLywgdHJ1ZSAvKm1ldGFPbmx5Ki8pOwogfQogCitib29sIGlzQXZpZihjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSkgeworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgcmV0dXJuIHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgJiYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkKKyAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FWSUYpKTsKK30KKwogYm9vbCBmaW5kVGh1bWJuYWlsSW5mbygKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQsCiAgICAgICAgIHVpbnQzMl90ICp0eXBlID0gTlVMTCwgY29uc3Qgdm9pZCAqKmRhdGEgPSBOVUxMLCBzaXplX3QgKnNpemUgPSBOVUxMKSB7CiAgICAgdWludDMyX3QgZHVtbXlUeXBlOwogICAgIGNvbnN0IHZvaWQgKmR1bW15RGF0YTsKICAgICBzaXplX3QgZHVtbXlTaXplOworICAgIGludCBjb2RlY0NvbmZpZ0tleSA9IGlzQXZpZih0cmFja01ldGEpID8ga0tleVRodW1ibmFpbEFWMUMgOiBrS2V5VGh1bWJuYWlsSFZDQzsKICAgICByZXR1cm4gdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCB3aWR0aCkKICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgaGVpZ2h0KQotICAgICAgICAmJiB0cmFja01ldGEtPmZpbmREYXRhKGtLZXlUaHVtYm5haWxIVkNDLAorICAgICAgICAmJiB0cmFja01ldGEtPmZpbmREYXRhKGNvZGVjQ29uZmlnS2V5LAogICAgICAgICAgICAgICAgIHR5cGUgPzogJmR1bW15VHlwZSwgZGF0YSA/OiAmZHVtbXlEYXRhLCBzaXplID86ICZkdW1teVNpemUpOwogfQogCkBAIC00NTYsNyArNDY1LDggQEAKICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKQogICAgIDogRnJhbWVEZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKSwKICAgICAgIG1GcmFtZShOVUxMKSwKLSAgICAgIG1Jc0F2Y09ySGV2YyhmYWxzZSksCisgICAgICBtSXNBdmMoZmFsc2UpLAorICAgICAgbUlzSGV2YyhmYWxzZSksCiAgICAgICBtU2Vla01vZGUoTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpLAogICAgICAgbVRhcmdldFRpbWVVcygtMUxMKSwKICAgICAgIG1EZWZhdWx0U2FtcGxlRHVyYXRpb25VcygwKSB7CkBAIC00NzksOCArNDg5LDggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgbUlzQXZjT3JIZXZjID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgbUlzQXZjID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBtSXNIZXZjID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CiAKICAgICBpZiAoZnJhbWVUaW1lVXMgPCAwKSB7CiAgICAgICAgIGludDY0X3QgdGh1bWJOYWlsVGltZSA9IC0xbGw7CkBAIC01NDMsOCArNTUzLDEwIEBACiAgICAgICAgIEFMT0dWKCJTZWVraW5nIGNsb3Nlc3Q6IHRhcmdldFRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZyltVGFyZ2V0VGltZVVzKTsKICAgICB9CiAKLSAgICBpZiAobUlzQXZjT3JIZXZjICYmICFpc1NlZWtpbmdDbG9zZXN0Ci0gICAgICAgICAgICAmJiBJc0lEUihjb2RlY0J1ZmZlci0+ZGF0YSgpLCBjb2RlY0J1ZmZlci0+c2l6ZSgpKSkgeworICAgIGlmICghaXNTZWVraW5nQ2xvc2VzdAorICAgICAgICAgICAgJiYgKChtSXNBdmMgJiYgSXNJRFIoY29kZWNCdWZmZXItPmRhdGEoKSwgY29kZWNCdWZmZXItPnNpemUoKSkpCisgICAgICAgICAgICB8fCAobUlzSGV2YyAmJiBJc0lEUigKKyAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5kYXRhKCksIGNvZGVjQnVmZmVyLT5zaXplKCkpKSkpIHsKICAgICAgICAgLy8gT25seSBuZWVkIHRvIGRlY29kZSBvbmUgSURSIGZyYW1lLCB1bmxlc3Mgd2UncmUgc2Vla2luZyB3aXRoIENMT1NFU1QKICAgICAgICAgLy8gb3B0aW9uLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gYWN0dWFsbHkgZGVjb2RlIHRvIHRhcmdldFRpbWVVcy4KICAgICAgICAgKmZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKQEAgLTc0OCw3ICs3NjAsMTAgQEAKICAgICAgICAgb3ZlcnJpZGVNZXRhLT5yZW1vdmUoa0tleURpc3BsYXlIZWlnaHQpOwogICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKLSAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXREYXRhKGtLZXlIVkNDLCB0eXBlLCBkYXRhLCBzaXplKTsKKyAgICAgICAgLy8gVGhlIEFWMSBjb2RlYyBjb25maWd1cmF0aW9uIGRhdGEgaXMgcGFzc2VkIHZpYSBDU0QwIHRvIHRoZSBBVjEKKyAgICAgICAgLy8gZGVjb2Rlci4KKyAgICAgICAgY29uc3QgaW50IGNvZGVjQ29uZmlnS2V5ID0gaXNBdmlmKHRyYWNrTWV0YSgpKSA/IGtLZXlPcGFxdWVDU0QwIDoga0tleUhWQ0M7CisgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0RGF0YShjb2RlY0NvbmZpZ0tleSwgdHlwZSwgZGF0YSwgc2l6ZSk7CiAgICAgICAgIG9wdGlvbnMtPnNldFNlZWtUbygtMSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhKCktPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtV2lkdGgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCmluZGV4IGIzNDc0NTMuLjVmOWMyMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcApAQCAtMzAsOSArMzAsMTQgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKKyNkZWZpbmUgVU5VU0VEX1BBUkFNIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0hldmNOYWxVbml0VHlwZXNbNV0gPSB7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSGV2Y05hbFVuaXRUeXBlc1s4XSA9IHsKKyAgICBrSGV2Y05hbFVuaXRUeXBlQ29kZWRTbGljZUlkciwKKyAgICBrSGV2Y05hbFVuaXRUeXBlQ29kZWRTbGljZUlkck5vTFAsCisgICAga0hldmNOYWxVbml0VHlwZUNvZGVkU2xpY2VDcmEsCiAgICAga0hldmNOYWxVbml0VHlwZVZwcywKICAgICBrSGV2Y05hbFVuaXRUeXBlU3BzLAogICAgIGtIZXZjTmFsVW5pdFR5cGVQcHMsCkBAIC0zNzUsOCArMzgwLDU2IEBACiAgICAgcmV0dXJuIHJlYWRlci5vdmVyUmVhZCgpID8gRVJST1JfTUFMRk9STUVEIDogT0s7CiB9CiAKK3ZvaWQgSGV2Y1BhcmFtZXRlclNldHM6OkZpbmRIRVZDRGltZW5zaW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmU3BzQnVmZmVyLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KQoreworICAgIEFMT0dEKCJGaW5kSEVWQ0RpbWVuc2lvbnMiKTsKKyAgICAvLyBTZWUgUmVjLiBJVFUtVCBILjI2NSB2MyAoMDQvMjAxNSkgQ2hhcHRlciA3LjMuMi4yIGZvciByZWZlcmVuY2UKKyAgICBBQml0UmVhZGVyIHJlYWRlcihTcHNCdWZmZXItPmRhdGEoKSArIDEsIFNwc0J1ZmZlci0+c2l6ZSgpIC0gMSk7CisgICAgLy8gU2tpcCBzcHNfdmlkZW9fcGFyYW1ldGVyX3NldF9pZAorICAgIHJlYWRlci5za2lwQml0cyg0KTsKKyAgICB1aW50OF90IG1heFN1YkxheWVyc01pbnVzMSA9IHJlYWRlci5nZXRCaXRzV2l0aEZhbGxiYWNrKDMsIDApOworICAgIC8vIFNraXAgc3BzX3RlbXBvcmFsX2lkX25lc3RpbmdfZmxhZzsKKyAgICByZWFkZXIuc2tpcEJpdHMoMSk7CisgICAgLy8gU2tpcCBnZW5lcmFsIHByb2ZpbGUKKyAgICByZWFkZXIuc2tpcEJpdHMoOTYpOworICAgIGlmIChtYXhTdWJMYXllcnNNaW51czEgPiAwKSB7CisgICAgICAgIGJvb2wgc3ViTGF5ZXJQcm9maWxlUHJlc2VudEZsYWdbOF07CisgICAgICAgIGJvb2wgc3ViTGF5ZXJMZXZlbFByZXNlbnRGbGFnWzhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFN1YkxheWVyc01pbnVzMTsgKytpKSB7CisgICAgICAgICAgICBzdWJMYXllclByb2ZpbGVQcmVzZW50RmxhZ1tpXSA9IHJlYWRlci5nZXRCaXRzV2l0aEZhbGxiYWNrKDEsIDApOworICAgICAgICAgICAgc3ViTGF5ZXJMZXZlbFByZXNlbnRGbGFnW2ldID0gcmVhZGVyLmdldEJpdHNXaXRoRmFsbGJhY2soMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2tpcCByZXNlcnZlZAorICAgICAgICByZWFkZXIuc2tpcEJpdHMoMiAqICg4IC0gbWF4U3ViTGF5ZXJzTWludXMxKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U3ViTGF5ZXJzTWludXMxOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdWJMYXllclByb2ZpbGVQcmVzZW50RmxhZ1tpXSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgcHJvZmlsZQorICAgICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cyg4OCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3ViTGF5ZXJMZXZlbFByZXNlbnRGbGFnW2ldKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCBzdWJfbGF5ZXJfbGV2ZWxfaWRjW2ldCisgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBCaXRzKDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNraXAgc3BzX3NlcV9wYXJhbWV0ZXJfc2V0X2lkCisgICAgc2tpcFVFKCZyZWFkZXIpOworICAgIHVpbnQ4X3QgY2hyb21hRm9ybWF0SWRjID0gcGFyc2VVRVdpdGhGYWxsYmFjaygmcmVhZGVyLCAwKTsKKyAgICBpZiAoY2hyb21hRm9ybWF0SWRjID09IDMpIHsKKyAgICAgICAgLy8gU2tpcCBzZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZworICAgICAgICByZWFkZXIuc2tpcEJpdHMoMSk7CisgICAgfQorICAgIHNraXBVRSgmcmVhZGVyKTsKKyAgICBza2lwVUUoJnJlYWRlcik7CisKKyAgICAvLyBwaWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzCisgICAgKndpZHRoID0gcGFyc2VVRVdpdGhGYWxsYmFjaygmcmVhZGVyLCAwKTsKKyAgICAvLyBwaWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcworICAgICpoZWlnaHQgPSBwYXJzZVVFV2l0aEZhbGxiYWNrKCZyZWFkZXIsIDApOworfQorCiBzdGF0dXNfdCBIZXZjUGFyYW1ldGVyU2V0czo6cGFyc2VQcHMoCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgX191bnVzZWQsIHNpemVfdCBzaXplIF9fdW51c2VkKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgVU5VU0VEX1BBUkFNLCBzaXplX3Qgc2l6ZSBVTlVTRURfUEFSQU0pIHsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTQ4OSw0ICs1NDIsMjYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2Jvb2wgSGV2Y1BhcmFtZXRlclNldHM6OklzSGV2Y0lEUihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGJvb2wgZm91bmRJRFIgPSBmYWxzZTsKKyAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICBzaXplX3QgbmFsU2l6ZTsKKyAgICB3aGlsZSAoIWZvdW5kSURSICYmIGdldE5leHROQUxVbml0KCZkYXRhLCAmc2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkgPT0gT0spIHsKKyAgICAgICAgaWYgKG5hbFNpemUgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIHplcm8tbGVuZ3RoIEhFVkMgTkFMIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90IG5hbFR5cGUgPSAobmFsU3RhcnRbMF0gJiAweDdFKSA+PiAxOworICAgICAgICBzd2l0Y2gobmFsVHlwZSkgeworICAgICAgICAgICAgY2FzZSBrSGV2Y05hbFVuaXRUeXBlQ29kZWRTbGljZUlkcjoKKyAgICAgICAgICAgIGNhc2Uga0hldmNOYWxVbml0VHlwZUNvZGVkU2xpY2VJZHJOb0xQOgorICAgICAgICAgICAgY2FzZSBrSGV2Y05hbFVuaXRUeXBlQ29kZWRTbGljZUNyYToKKyAgICAgICAgICAgICAgICBmb3VuZElEUiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZm91bmRJRFI7Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDhmN2Q0YmYuLjBhZjk3ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTU0Miw2ICs1NDIsNyBAQAogICAgIG1OdW1HcmlkcyA9IDA7CiAgICAgbU5leHRJdGVtSWQgPSBrSXRlbUlkQmFzZTsKICAgICBtSGFzUmVmcyA9IGZhbHNlOworICAgIG1SZXNldFN0YXR1cyA9IE9LOwogICAgIG1QcmVBbGxvY0ZpcnN0VGltZSA9IHRydWU7CiAgICAgbVByZXZBbGxUcmFja3NUb3RhbE1ldGFEYXRhU2l6ZUVzdGltYXRlID0gMDsKIApAQCAtMTAyNyw2ICsxMDI4LDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c3RvcCgpIHsKKyAgICAvLyBJZiByZXNldCB3YXMgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLgorICAgIHJldHVybiByZXNldCh0cnVlLCB0cnVlKTsKK30KKwogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnBhdXNlKCkgewogICAgIEFMT0dXKCJNUEVHNFdyaXRlcjogcGF1c2UgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTExNTksOCArMTE2NSwxMiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXZvaWQgTVBFRzRXcml0ZXI6OmZpbmlzaEN1cnJlbnRTZXNzaW9uKCkgewotICAgIHJlc2V0KGZhbHNlIC8qIHN0b3BTb3VyY2UgKi8pOworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OmZpbmlzaEN1cnJlbnRTZXNzaW9uKCkgeworICAgIEFMT0dWKCJmaW5pc2hDdXJyZW50U2Vzc2lvbiIpOworICAgIC8qIERvbid0IHdhaXQgaWYgcmVzZXQgaXMgaW4gcHJvZ3Jlc3MgYWxyZWFkeSwgdGhhdCBhdm9pZHMgZGVhZGxvY2sKKyAgICAgKiBhcyBmaW5pc2hDdXJyZW50U2Vzc2lvbigpIGlzIGNhbGxlZCBmcm9tIGNvbnRyb2wgbG9vcGVyIHRocmVhZC4KKyAgICAgKi8KKyAgICByZXR1cm4gcmVzZXQoZmFsc2UsIGZhbHNlKTsKIH0KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN3aXRjaEZkKCkgewpAQCAtMTE4MiwxMSArMTE5MiwzMiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE1QRUc0V3JpdGVyOjpyZXNldChib29sIHN0b3BTb3VyY2UpIHsKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpyZXNldChib29sIHN0b3BTb3VyY2UsIGJvb2wgd2FpdEZvckFueVByZXZpb3VzQ2FsbFRvQ29tcGxldGUpIHsKICAgICBBTE9HRCgicmVzZXQoKSIpOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1SZXNldE11dGV4KTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKG1SZXNldE11dGV4LCBzdGQ6OmRlZmVyX2xvY2spOworICAgIGlmICh3YWl0Rm9yQW55UHJldmlvdXNDYWxsVG9Db21wbGV0ZSkgeworICAgICAgICAvKiBzdG9wPT5yZXNldCBmcm9tIGNsaWVudCBuZWVkcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHJlc2V0IGNhbGwsIGhlbmNlIHdhaXQgaGVyZQorICAgICAgICAgKiBpZiBhIHJlc2V0IHdhcyBpbiBwcm9jZXNzIGFscmVhZHkuCisgICAgICAgICAqLworICAgICAgICBsay5sb2NrKCk7CisgICAgfSBlbHNlIGlmICghbGsudHJ5X2xvY2soKSkgeworICAgICAgICAvKiBJbnRlcm5hbCByZXNldCBmcm9tIGNvbnRyb2wgbG9vcGVyIHRocmVhZCBzaG91bGRuJ3Qgd2FpdCBmb3IgYW55IHJlc2V0IGluCisgICAgICAgICAqIHByb2Nlc3MgYWxyZWFkeS4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVJlc2V0U3RhdHVzICE9IE9LKSB7CisgICAgICAgIC8qIERvbid0IGhhdmUgdG8gcHJvY2VlZCBpZiByZXNldCBoYXMgZmluaXNoZWQgd2l0aCBhbiBlcnJvciBiZWZvcmUuCisgICAgICAgICAqIElmIHRoZXJlIHdhcyBubyBlcnJvciBiZWZvcmUsIHByb2NlZWRpbmcgcmVzZXQgd291bGQgYmUgaGFybWxlc3MsIGFzIHRoZQorICAgICAgICAgKiB0aGUgY2FsbCB3b3VsZCByZXR1cm4gZnJvbSB0aGUgbUluaXRDaGVjayBjb25kaXRpb24gYmVsb3cuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gbVJlc2V0U3RhdHVzOworICAgIH0KKwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgbVJlc2V0U3RhdHVzID0gT0s7CisgICAgICAgIHJldHVybiBtUmVzZXRTdGF0dXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFtV3JpdGVyVGhyZWFkU3RhcnRlZCB8fAogICAgICAgICAgICAgIW1TdGFydGVkKSB7CkBAIC0xMTk4LDcgKzEyMjksOCBAQAogICAgICAgICAgICAgaWYgKHdyaXRlckVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldEVyciA9IHdyaXRlckVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXRFcnI7CisgICAgICAgICAgICBtUmVzZXRTdGF0dXMgPSByZXRFcnI7CisgICAgICAgICAgICByZXR1cm4gbVJlc2V0U3RhdHVzOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjQ1LDcgKzEyNzcsOCBAQAogICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX01BTEZPUk1FRCkgewogICAgICAgICAvLyBJZ25vcmluZyByZWxlYXNlKCkgcmV0dXJuIHZhbHVlIGFzIHRoZXJlIHdhcyBhbiAiZXJyIiBhbHJlYWR5LgogICAgICAgICByZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIG1SZXNldFN0YXR1cyA9IGVycjsKKyAgICAgICAgcmV0dXJuIG1SZXNldFN0YXR1czsKICAgICB9CiAKICAgICAvLyBGaXggdXAgdGhlIHNpemUgb2YgdGhlICdtZGF0JyBjaHVuay4KQEAgLTEzMDMsNyArMTMzNiw4IEBACiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBlcnIgPSBlcnJSZWxlYXNlOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIG1SZXNldFN0YXR1cyA9IGVycjsKKyAgICByZXR1cm4gbVJlc2V0U3RhdHVzOwogfQogCiAvKgpAQCAtMjQ1NCwzMSArMjQ4OCwyNyBAQAogICAgICAgICAgICAgaW50IGZkID0gbU5leHRGZDsKICAgICAgICAgICAgIG1OZXh0RmQgPSAtMTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgZmluaXNoQ3VycmVudFNlc3Npb24oKTsKLSAgICAgICAgICAgIGluaXRJbnRlcm5hbChmZCwgZmFsc2UgLyppc0ZpcnN0U2Vzc2lvbiovKTsKLSAgICAgICAgICAgIHN0YXJ0KG1TdGFydE1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgbVN3aXRjaFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX05FWFRfT1VUUFVUX0ZJTEVfU1RBUlRFRCwgMCk7CisgICAgICAgICAgICBpZiAoZmluaXNoQ3VycmVudFNlc3Npb24oKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGluaXRJbnRlcm5hbChmZCwgZmFsc2UgLyppc0ZpcnN0U2Vzc2lvbiovKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydChtU3RhcnRNZXRhLmdldCgpKTsKKyAgICAgICAgICAgICAgICBtU3dpdGNoUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spICB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUkVDT1JERVJfSU5GT19ORVhUX09VVFBVVF9GSUxFX1NUQVJURUQsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIDo6d3JpdGUoKSBvciBsc2VlazY0KCkgd2Fzbid0IGEgc3VjY2VzcywgZmlsZSBjb3VsZCBiZSBtYWxmb3JtZWQKKyAgICAgICAgLyogOjp3cml0ZSgpIG9yIGxzZWVrNjQoKSB3YXNuJ3QgYSBzdWNjZXNzLCBmaWxlIGNvdWxkIGJlIG1hbGZvcm1lZC4KKyAgICAgICAgICogT3IgZmFsbG9jYXRlKCkgZmFpbGVkLiByZXNldCgpIGFuZCBub3RpZnkgY2xpZW50IG9uIGJvdGggdGhlIGNhc2VzLgorICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBrV2hhdEZhbGxvY2F0ZUVycm9yOiAvLyBmYWxsdGhyb3VnaAogICAgICAgICBjYXNlIGtXaGF0SU9FcnJvcjogewotICAgICAgICAgICAgQUxPR0UoImtXaGF0SU9FcnJvciIpOwogICAgICAgICAgICAgaW50MzJfdCBlcnI7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgICAgICAgICAgLy8gU3RvcCB0cmFja3MnIHRocmVhZHMgYW5kIG1haW4gd3JpdGVyIHRocmVhZC4KLSAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9FUlJPUiwgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTiwgZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZhbGxvY2F0ZSgpIGZhaWxlZCwgaGVuY2Ugc3RvcCgpIGFuZCBub3RpZnkgYXBwLgotICAgICAgICBjYXNlIGtXaGF0RmFsbG9jYXRlRXJyb3I6IHsKLSAgICAgICAgICAgIEFMT0dFKCJrV2hhdEZhbGxvY2F0ZUVycm9yIik7Ci0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0gICAgICAgICAgICAvLyBTdG9wIHRyYWNrcycgdGhyZWFkcyBhbmQgbWFpbiB3cml0ZXIgdGhyZWFkLgotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgLy9UT0RPOiBpbnRyb2R1Y2UgYSBzdWl0YWJsZSBNRURJQV9SRUNPUkRFUl9FUlJPUl8qIGluc3RlYWQgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTj8KKyAgICAgICAgICAgIC8vIElmIHJlc2V0IGFscmVhZHkgaW4gcHJvY2VzcywgZG9uJ3Qgd2FpdCBmb3IgaXQgY29tcGxldGUgdG8gYXZvaWQgZGVhZGxvY2suCisgICAgICAgICAgICByZXNldCh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAvL1RPRE86IG5ldyBNRURJQV9SRUNPUkRFUl9FUlJPUl8qKioqIGluc3RlYWQgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTiA/CiAgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfRVJST1IsIE1FRElBX1JFQ09SREVSX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjQ4Niw3ICsyNTE2LDcgQEAKICAgICAgICAgICogUmVzcG9uZGluZyB3aXRoIG90aGVyIG9wdGlvbnMgY291bGQgYmUgYWRkZWQgbGF0ZXIgaWYgcmVxdWlyZWQuCiAgICAgICAgICAqLwogICAgICAgICBjYXNlIGtXaGF0Tm9JT0Vycm9yU29GYXI6IHsKLSAgICAgICAgICAgIEFMT0dEKCJrV2hhdE5vSU9FcnJvclNvRmFyIik7CisgICAgICAgICAgICBBTE9HVigia1doYXROb0lPRXJyb3JTb0ZhciIpOwogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBPSyk7CiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKQEAgLTI3NzQsNyArMjgwNCw3IEBACiAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIGZpbGUgaXMgd2VsbC1mb3JtZWQgYW5kIHRoZSBwcmltYXJ5IHBpY3R1cmUgaXMgY29ycmVjdC4KIAogICAgICAgICAvLyBSZXNlcnZlIGl0ZW0gaWRzIGZvciBzYW1wbGVzICsgZ3JpZAotICAgICAgICBzaXplX3QgbnVtSXRlbXNUb1Jlc2VydmUgPSBtTnVtVGlsZXMgKyAobU51bVRpbGVzID4gMSk7CisgICAgICAgIHNpemVfdCBudW1JdGVtc1RvUmVzZXJ2ZSA9IG1OdW1UaWxlcyArIChtTnVtVGlsZXMgPiAwKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbU93bmVyLT5yZXNlcnZlSXRlbUlkX2wobnVtSXRlbXNUb1Jlc2VydmUsICZtSXRlbUlkQmFzZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC00NzE1LDEwICs0NzQ1LDE4IEBACiAKIC8vIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBwaXhlbCBpcyBub3Qgc3F1YXJlCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVQYXNwQm94KCkgewotICAgIG1Pd25lci0+YmVnaW5Cb3goInBhc3AiKTsKLSAgICBtT3duZXItPndyaXRlSW50MzIoMSA8PCAxNik7ICAvLyBoc3BhY2luZwotICAgIG1Pd25lci0+d3JpdGVJbnQzMigxIDw8IDE2KTsgIC8vIHZzcGFjaW5nCi0gICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHBhc3AKKyAgICAvLyBEbyBub3Qgd3JpdGUgJ3Bhc3AnIGJveCB1bmxlc3MgdGhlIHRyYWNrIGZvcm1hdCBzcGVjaWZpZXMgaXQuCisgICAgLy8gQWNjb3JkaW5nIHRvIElTTy9JRUMgMTQ0OTYtMTIgKElTTyBiYXNlIG1lZGlhIGZpbGUgZm9ybWF0KSwgJ3Bhc3AnIGJveAorICAgIC8vIGlzIG9wdGlvbmFsLiBJZiBwcmVzZW50LCBpdCBvdmVycmlkZXMgdGhlIFNBUiBmcm9tIHRoZSB2aWRlbyBDU0QuIE9ubHkKKyAgICAvLyBzZXQgaXQgaWYgdGhlIHRyYWNrIGZvcm1hdCBzcGVjaWZpY2FsbHkgcmVxdWVzdHMgdGhhdC4KKyAgICBpbnQzMl90IGhTcGFjaW5nLCB2U3BhY2luZzsKKyAgICBpZiAobU1ldGEtPmZpbmRJbnQzMihrS2V5U0FSV2lkdGgsICZoU3BhY2luZykgJiYgKGhTcGFjaW5nID4gMCkKKyAgICAgICAgICAgICYmIG1NZXRhLT5maW5kSW50MzIoa0tleVNBUkhlaWdodCwgJnZTcGFjaW5nKSAmJiAodlNwYWNpbmcgPiAwKSkgeworICAgICAgICBtT3duZXItPmJlZ2luQm94KCJwYXNwIik7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihoU3BhY2luZyk7ICAvLyBoc3BhY2luZworICAgICAgICBtT3duZXItPndyaXRlSW50MzIodlNwYWNpbmcpOyAgLy8gdnNwYWNpbmcKKyAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHBhc3AKKyAgICB9CiB9CiAKIGludDY0X3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcAppbmRleCBmMWI2ZThjLi41YTJhOTEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKQEAgLTExNCw2ICsxMTQsMTMgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgLyogQXMgbUFkYXB0ZXJMb2NrIGlzIHVubG9ja2VkIHdoaWxlIHdhaXRpbmcgZm9yIHNpZ25hbEJ1ZmZlclJldHVybmVkLAorICAgICAqIGEgbmV3IGJ1ZmZlciBmb3IgdGhlIHNhbWUgdHJhY2sgY291bGQgYmUgcHVzaGVkIGZyb20gYW5vdGhlciB0aHJlYWQKKyAgICAgKiBpbiB0aGUgY2xpZW50IHByb2Nlc3MsIG1CdWZmZXJHYXRpbmdNdXRleCB3aWxsIGhlbHAgdG8gaG9sZCB0aGF0CisgICAgICogdW50aWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBwcm9jZXNzZWQuCisgICAgICovCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhtQnVmZmVyR2F0aW5nTXV0ZXgpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1BZGFwdGVyTG9jayk7CiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HRSgicHVzaEJ1ZmZlciBjYWxsZWQgYmVmb3JlIHN0YXJ0Iik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IDk0YzBiODQuLmRhOGYwMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRmlsdGVyLmg+CkBAIC0yNDEsNiArMjQyLDkgQEAKICAgICB9CiAKICAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChtU2VydmljZS0+YXNCaW5kZXIoKS5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCB0aGlzKTsKKworICAgIC8vIEtpbGwgY2xpZW50cyBwZW5kaW5nIHJlbW92YWwuCisgICAgbVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKG1QaWQpOwogfQogCiAvL3N0YXRpYwpAQCAtNjE1LDcgKzYxOSwxMCBAQAogICAgIHJldHVybiBuZXcgUGVyc2lzdGVudFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIGJ1ZmZlclNvdXJjZSk7CiB9CiAKLU1lZGlhQ29kZWM6Ok1lZGlhQ29kZWMoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpCitNZWRpYUNvZGVjOjpNZWRpYUNvZGVjKAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBwaWRfdCBwaWQsIHVpZF90IHVpZCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKT4gZ2V0Q29kZWNCYXNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8pCiAgICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCksCiAgICAgICBtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcihmYWxzZSksCiAgICAgICBtTG9vcGVyKGxvb3BlciksCkBAIC02MzIsNiArNjM5LDkgQEAKICAgICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEKDApLAogICAgICAgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCgwKSwKKyAgICAgIG1UdW5uZWxlZElucHV0V2lkdGgoMCksCisgICAgICBtVHVubmVsZWRJbnB1dEhlaWdodCgwKSwKKyAgICAgIG1UdW5uZWxlZChmYWxzZSksCiAgICAgICBtSGF2ZUlucHV0U3VyZmFjZShmYWxzZSksCiAgICAgICBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMoZmFsc2UpLAogICAgICAgbUNwdUJvb3N0UmVxdWVzdGVkKGZhbHNlKSwKQEAgLTY0MCw3ICs2NTAsOSBAQAogICAgICAgbU51bUxvd0xhdGVuY3lEaXNhYmxlcygwKSwKICAgICAgIG1Jc0xvd0xhdGVuY3lNb2RlT24oZmFsc2UpLAogICAgICAgbUluZGV4T2ZGaXJzdEZyYW1lV2hlbkxvd0xhdGVuY3lPbigtMSksCi0gICAgICBtSW5wdXRCdWZmZXJDb3VudGVyKDApIHsKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50ZXIoMCksCisgICAgICBtR2V0Q29kZWNCYXNlKGdldENvZGVjQmFzZSksCisgICAgICBtR2V0Q29kZWNJbmZvKGdldENvZGVjSW5mbykgewogICAgIGlmICh1aWQgPT0ga05vVWlkKSB7CiAgICAgICAgIG1VaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7CiAgICAgfSBlbHNlIHsKQEAgLTY0OCw2ICs2NjAsMzMgQEAKICAgICB9CiAgICAgbVJlc291cmNlTWFuYWdlclByb3h5ID0gbmV3IFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eShwaWQsIG1VaWQsCiAgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KHRoaXMpKTsKKyAgICBpZiAoIW1HZXRDb2RlY0Jhc2UpIHsKKyAgICAgICAgbUdldENvZGVjQmFzZSA9IFtdKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyKSB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q29kZWNCYXNlKG5hbWUsIG93bmVyKTsKKyAgICAgICAgfTsKKyAgICB9CisgICAgaWYgKCFtR2V0Q29kZWNJbmZvKSB7CisgICAgICAgIG1HZXRDb2RlY0luZm8gPSBbXShjb25zdCBBU3RyaW5nICZuYW1lLCBzcDxNZWRpYUNvZGVjSW5mbz4gKmluZm8pIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICppbmZvID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbWNsID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAoIW1jbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOyAgLy8gaWYgY2FsbGVkIGZyb20gSmF2YSBzaG91bGQgcmFpc2UgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTdHJpbmcgdG1wID0gbmFtZTsKKyAgICAgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoIi5zZWN1cmUiKSkgeworICAgICAgICAgICAgICAgIHRtcC5lcmFzZSh0bXAuc2l6ZSgpIC0gNywgNyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmNvZGVjTmFtZSA6IHsgbmFtZSwgdG1wIH0pIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGNvZGVjSWR4ID0gbWNsLT5maW5kQ29kZWNCeU5hbWUoY29kZWNOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmIChjb2RlY0lkeCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfTsKKyAgICB9CiAKICAgICBpbml0TWVkaWFtZXRyaWNzKCk7CiB9CkBAIC0xMDA5LDYgKzEwNDgsMTIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCit2b2lkIE1lZGlhQ29kZWM6OlBvc3RSZXBseVdpdGhFcnJvcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50MzJfdCBlcnIpIHsKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7Cit9CisKIHZvaWQgTWVkaWFDb2RlYzo6UG9zdFJlcGx5V2l0aEVycm9yKGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlJRCwgaW50MzJfdCBlcnIpIHsKICAgICBpbnQzMl90IGZpbmFsRXJyID0gZXJyOwogICAgIGlmIChtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcikgewpAQCAtMTA4NSw0MCArMTEzMCwzMCBAQAogICAgIGJvb2wgc2VjdXJlQ29kZWMgPSBmYWxzZTsKICAgICBjb25zdCBjaGFyICpvd25lciA9ICIiOwogICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCJhbmRyb2lkLmZpbHRlci4iKSkgewotICAgICAgICBBU3RyaW5nIHRtcCA9IG5hbWU7Ci0gICAgICAgIGlmICh0bXAuZW5kc1dpdGgoIi5zZWN1cmUiKSkgewotICAgICAgICAgICAgc2VjdXJlQ29kZWMgPSB0cnVlOwotICAgICAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IG1jbCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwotICAgICAgICBpZiAobWNsID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUdldENvZGVjSW5mbyhuYW1lLCAmbUNvZGVjSW5mbyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIG1Db2RlYyA9IE5VTEw7ICAvLyByZW1vdmUgdGhlIGNvZGVjLgotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7IC8vIGlmIGNhbGxlZCBmcm9tIEphdmEgc2hvdWxkIHJhaXNlIElPRXhjZXB0aW9uCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBBU3RyaW5nICZjb2RlY05hbWUgOiB7IG5hbWUsIHRtcCB9KSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGNvZGVjSWR4ID0gbWNsLT5maW5kQ29kZWNCeU5hbWUoY29kZWNOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgaWYgKGNvZGVjSWR4IDwgMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvZGVjSW5mbyA9IG1jbC0+Z2V0Q29kZWNJbmZvKGNvZGVjSWR4KTsKLSAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtZWRpYVR5cGVzOwotICAgICAgICAgICAgbUNvZGVjSW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhVHlwZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobWVkaWFUeXBlc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICBtSXNWaWRlbyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICBpZiAobUNvZGVjSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0dGluZyBjb2RlYyBpbmZvIHdpdGggbmFtZSAnJXMnIGZhaWxlZCIsIG5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgICAgIH0KKyAgICAgICAgc2VjdXJlQ29kZWMgPSBuYW1lLmVuZHNXaXRoKCIuc2VjdXJlIik7CisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtZWRpYVR5cGVzOworICAgICAgICBtQ29kZWNJbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZtZWRpYVR5cGVzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZWRpYVR5cGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBvd25lciA9IG1Db2RlY0luZm8tPmdldE93bmVyTmFtZSgpOwogICAgIH0KIAotICAgIG1Db2RlYyA9IEdldENvZGVjQmFzZShuYW1lLCBvd25lcik7CisgICAgbUNvZGVjID0gbUdldENvZGVjQmFzZShuYW1lLCBvd25lcik7CiAgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJHZXR0aW5nIGNvZGVjIGJhc2Ugd2l0aCBuYW1lICclcycgKG93bmVyPSclcycpIGZhaWxlZCIsIG5hbWUuY19zdHIoKSwgb3duZXIpOwogICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogCkBAIC0xNTEyLDcgKzE1NDcsNiBAQAogICAgIG1TdGlja3lFcnJvciA9IE9LOwogCiAgICAgLy8gcmVzZXQgc3RhdGUgbm90IHJlc2V0IGJ5IHNldFN0YXRlKFVOSU5JVElBTElaRUQpCi0gICAgbVJlcGx5SUQgPSAwOwogICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEID0gMDsKICAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQgPSAwOwogICAgIG1EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbiA9IDA7CkBAIC0yMDQ0LDIwICsyMDc4LDI1IEBACiAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkKSB7CiAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnT3V0cHV0QnVmZmVyc0NoYW5nZWQ7Ci0gICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQpIHsKLSAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElORk9fRk9STUFUX0NIQU5HRUQpOwotICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKICAgICB9IGVsc2UgewogICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBkZXF1ZXVlUG9ydEJ1ZmZlcihrUG9ydEluZGV4T3V0cHV0KTsKLQotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBDSEVDS19FUShpbmRleCwgLUVBR0FJTik7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSBwZWVrTmV4dFBvcnRCdWZmZXIoa1BvcnRJbmRleE91dHB1dCk7CisgICAgICAgIGlmICghaW5mbykgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciA9Ci0gICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF1baW5kZXhdLm1EYXRhOworICAgICAgICAvLyBJbiBzeW5jaHJvbm91cyBtb2RlLCBvdXRwdXQgZm9ybWF0IGNoYW5nZSBzaG91bGQgYmUgaGFuZGxlZAorICAgICAgICAvLyBhdCBkZXF1ZXVlIHRvIHB1dCB0aGUgZXZlbnQgYXQgdGhlIGNvcnJlY3Qgb3JkZXIuCisKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciA9IGluZm8tPm1EYXRhOworICAgICAgICBoYW5kbGVPdXRwdXRGb3JtYXRDaGFuZ2VJZk5lZWRlZChidWZmZXIpOworICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5GT19GT1JNQVRfQ0hBTkdFRCk7CisgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IGRlcXVldWVQb3J0QnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQpOwogCiAgICAgICAgIHJlc3BvbnNlLT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKICAgICAgICAgcmVzcG9uc2UtPnNldFNpemUoIm9mZnNldCIsIGJ1ZmZlci0+b2Zmc2V0KCkpOwpAQCAtMjA5NCwxNCArMjEzMywxNiBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYWN0aW9uQ29kZSIsICZhY3Rpb25Db2RlKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVyciAlI3gsIGFjdGlvbkNvZGUgJWQsIHdoaWxlIGluIHN0YXRlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGFjdGlvbkNvZGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnIgJSN4LCBhY3Rpb25Db2RlICVkLCB3aGlsZSBpbiBzdGF0ZSAlZC8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1Nhd01lZGlhU2VydmVyRGllOwogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW5kRXJyb3JSZXNwb25zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9yaWdpbnsia1doYXRFcnJvcjoifTsKKyAgICAgICAgICAgICAgICAgICAgb3JpZ2luICs9IHN0YXRlU3RyaW5nKG1TdGF0ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5JVElBTElaSU5HOgpAQCAtMjE1MywxNCArMjE5NCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBhIHNodXRkb3duIGNvbXBsZXRlIG5vdGlmaWNhdGlvbiBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwuCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlJ3JlIGRpcmVjdGx5IGdvaW5nIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIG1heSBiZSBkaXJlY3RseSBnb2luZyBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNUT1BQSU5HLT5VTklOSVRJQUxJWkVELCBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c3VhbCBTVE9QUElORy0+SU5JVElBTElaRUQgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhvcmlnaW4gKyAiOmRlYWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yMTg2LDcgKzIyMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSAobVJlcGx5SUQgIT0gbnVsbHB0cik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGlja3lFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKQEAgLTIyMTYsNyArMjI1Nyw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IChtUmVwbHlJRCAhPSBudWxscHRyKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0aWNreUVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwpAQCAtMjI0Myw3ICsyMjg0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAoc2VuZEVycm9yUmVzcG9uc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtUmVwbHlJRCwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRSSUNLWTogcmVwbGljYXRlIFBvc3RSZXBseVdpdGhFcnJvciBsb2dpYyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgZXJyIGNvZGUgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmluYWxFcnIgPSBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVycmlkZSB0aGUgZXJyIGNvZGUgaWYgTWVkaWFDb2RlYyBoYXMgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VkIGJ5IFJlc291cmNlTWFuYWdlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbEVyciA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhvcmlnaW4sIGZpbmFsRXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0yMjUzLDggKzIzMDIsOCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyB8fCBtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGtXaGF0RXJyb3Igb3Iga1doYXRSZWxlYXNlIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhbGxvY2F0ZSBpbnRlcnJ1cHRlZCBieSBlcnJvciBvciByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWxsb2NhdGUgaW50ZXJydXB0ZWQgYnkgZXJyb3Igb3IgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZC8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIElOSVRJQUxJWklORyk7CkBAIC0yMjkxLDcgKzIzNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsIG1Jc1ZpZGVvKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRDb21wb25lbnRBbGxvY2F0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yMzAwLDggKzIzNDksOCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyB8fCBtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gSU5JVElBTElaRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG9yIGtXaGF0UmVsZWFzZSBtZXNzYWdlIGNhbWUgaW4gYW5kIHJlcGxpZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb2cgYSB3YXJuaW5nIGFuZCBpZ25vcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlndXJlIGludGVycnVwdGVkIGJ5IGVycm9yIG9yIHJlbGVhc2UsIGN1cnJlbnQgc3RhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWd1cmUgaW50ZXJydXB0ZWQgYnkgZXJyb3Igb3IgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZC8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIENPTkZJR1VSSU5HKTsKQEAgLTIzMTYsNyArMjM2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBudWxscHRyICYmICFtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgZnJhbWUgZHJvcHBpbmcgbW9kZSBpbiB0aGUgaW5wdXQgZm9ybWF0IGFzIHRoaXMgbWF5IGFsc28gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYW5pbmdmdWwgYW5kIGNvbmZ1c2luZyBmb3IgYW4gZW5jb2RlciBpbiBhIHRyYW5zY29kZXIgc2NlbmFyaW8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoImFsbG93LWZyYW1lLWRyb3AiLCBtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0FMTE9XX0ZSQU1FX0RST1AsIG1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbnRlcmVzdGluZ0Zvcm1hdCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSXNFbmNvZGVyKSA/IG1PdXRwdXRGb3JtYXQgOiBtSW5wdXRGb3JtYXQ7CkBAIC0yMzMwLDcgKzIzNzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnVXNlc1NvZnR3YXJlUmVuZGVyZXI7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCJrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQiKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBhdWdtZW50IG91ciBtZWRpYSBtZXRyaWNzIGluZm8sIG5vdyB0aGF0IHdlIGtub3cgbW9yZSB0aGluZ3MKICAgICAgICAgICAgICAgICAgICAgLy8gc3VjaCBhcyB3aGF0IHRoZSBjb2RlYyBleHRyYWN0ZWQgZnJvbSBhbnkgQ1NEIHBhc3NlZCBpbi4KQEAgLTIzNzUsNiArMjQyNCwxMiBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQ6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlIHRyYW5zaXRpb25lZCB1bmV4cGVjdGVkbHk7IHdlIHNob3VsZCBoYXZlIHJlcGxpZWQgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJyZWNlaXZlZCBrV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQgbWVzc2FnZSBpbiBzdGF0ZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpCiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC0yMzkzLDEyICsyNDQ4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdElucHV0U3VyZmFjZUFjY2VwdGVkOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05GSUdVUkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSB0cmFuc2l0aW9uZWQgdW5leHBlY3RlZGx5OyB3ZSBzaG91bGQgaGF2ZSByZXBsaWVkIGFscmVhZHkuCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVjZWl2ZWQga1doYXRJbnB1dFN1cmZhY2VBY2NlcHRlZCBtZXNzYWdlIGluIHN0YXRlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIGluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKCkKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZSgpOwpAQCAtMjQwOSwxOSArMjQ3MCwyNSBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCJrV2hhdElucHV0U3VyZmFjZUFjY2VwdGVkIiwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0U2lnbmFsZWRJbnB1dEVPUzoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgdHJhbnNpdGlvbmVkIHVuZXhwZWN0ZWRseTsgd2Ugc2hvdWxkIGhhdmUgcmVwbGllZCBhbHJlYWR5LgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoInJlY2VpdmVkIGtXaGF0U2lnbmFsZWRJbnB1dEVPUyBtZXNzYWdlIGluIHN0YXRlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKQogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCJrV2hhdFNpZ25hbGVkSW5wdXRFT1MiLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjQzMCw3ICsyNDk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcgfHwgbVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdFJlbGVhc2UgbWVzc2FnZSBjYW1lIGluIGFuZCByZXBsaWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9nIGEgd2FybmluZyBhbmQgaWdub3JlLgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0IGludGVycnVwdGVkIGJ5IHJlbGVhc2UsIGN1cnJlbnQgc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0IGludGVycnVwdGVkIGJ5IHJlbGVhc2UsIGN1cnJlbnQgc3RhdGUgJWQvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjQ0MCw3ICsyNTA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6R3JhcGhpY01lbW9yeVJlc291cmNlKGdldEdyYXBoaWNCdWZmZXJTaXplKCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0U3RhcnRDb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNTQxLDEwNyArMjYwOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiYnVmZmVyIiwgJm9iaikpOwotICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjQnVmZmVyICo+KG9iai5nZXQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQgIT0gYnVmZmVyLT5mb3JtYXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnVXNlQmxvY2tNb2RlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBkaWZmMSA9IG1PdXRwdXRGb3JtYXQtPmNoYW5nZXNGcm9tKGJ1ZmZlci0+Zm9ybWF0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBkaWZmMiA9IGJ1ZmZlci0+Zm9ybWF0KCktPmNoYW5nZXNGcm9tKG1PdXRwdXRGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrZXlzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1FbnRyaWVzID0gZGlmZjEtPmNvdW50RW50cmllcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5lbXBsYWNlKGRpZmYxLT5nZXRFbnRyeU5hbWVBdChpLCAmdHlwZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1FbnRyaWVzID0gZGlmZjItPmNvdW50RW50cmllcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRW50cmllczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuZW1wbGFjZShkaWZmMi0+Z2V0RW50cnlOYW1lQXQoaSwgJnR5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8V3JhcHBlck9iamVjdDxzdGQ6OnNldDxzdGQ6OnN0cmluZz4+PiBjaGFuZ2VkS2V5c3sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdyYXBwZXJPYmplY3Q8c3RkOjpzZXQ8c3RkOjpzdHJpbmc+PntzdGQ6Om1vdmUoa2V5cyl9fTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0T2JqZWN0KCJjaGFuZ2VkS2V5cyIsIGNoYW5nZWRLZXlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPSBidWZmZXItPmZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNvZnRSZW5kZXJlciA9PSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnVXNlc1NvZnR3YXJlUmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcHJvcGFnYXRlIGNvbG9yIGFzcGVjdHMgdG8gc29mdHdhcmUgcmVuZGVyZXIgdG8gYWxsb3cgYmV0dGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgY29udmVyc2lvbiB0byBSR0IuIEZvciBub3csIGp1c3QgbWFyayBkYXRhc3BhY2UgZm9yIFlVVgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFTcGFjZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAmZGF0YVNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBzZXR0aW5nIGRhdGFzcGFjZSBvbiBvdXRwdXQgc3VyZmFjZSB0byAjJXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGRhdGFTcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RhdGFfc3BhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIChhbmRyb2lkX2RhdGFzcGFjZSlkYXRhU3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gMCwgImZhaWxlZCB0byBzZXQgZGF0YXNwYWNlIG9uIHN1cmZhY2UgKCVkKSIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERSU3RhdGljSW5mbyBpbmZvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobU91dHB1dEZvcm1hdCwgJmluZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShtU3VyZmFjZS5nZXQoKSwgJmluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+c2l6ZSgpLCBoZHIxMFBsdXNJbmZvLT5kYXRhKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZS0+c2V0RGVxdWV1ZVRpbWVvdXQoLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobVN1cmZhY2UsIG1Sb3RhdGlvbkRlZ3JlZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENwdUJvb3N0SWZOZWVkZWQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNFbmNvZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmVmb3JlIHdlIGFubm91bmNlIHRoZSBmb3JtYXQgY2hhbmdlIHdlIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgY29kZWMgc3BlY2lmaWMgZGF0YSBhbmQgYW1lbmQgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdCBhcyBuZWNlc3NhcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgQlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpICYmICEobUZsYWdzICYga0ZsYWdJc1NlY3VyZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtZW5kT3V0cHV0Rm9ybWF0V2l0aENvZGVjU3BlY2lmaWNEYXRhKGJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHNwaXQgb3V0IG1hbGZvcm1lZCBjb2RlYyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWMgZGF0YSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBtQ3J5cHRvIG9mIHZpZGVvIHJlc29sdXRpb24gY2hhbmdlcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DcnlwdG8tPm5vdGlmeVJlc29sdXRpb24ocmlnaHQgLSBsZWZ0ICsgMSwgYm90dG9tIC0gdG9wICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3J5cHRvLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiYnVmZmVyIiwgJm9iaikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0J1ZmZlciAqPihvYmouZ2V0KCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBhc3luY2hyb25vdXMgbW9kZSwgb3V0cHV0IGZvcm1hdCBjaGFuZ2UgaXMgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlSWZOZWVkZWQoYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcihtRGVxdWV1ZU91dHB1dFJlcGx5SUQpKTsKQEAgLTI2NjYsMTggKzI2NDAsMjYgQEAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0U3RvcENvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RPUFBJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNlaXZlZCBrV2hhdFN0b3BDb21wbGV0ZWQgaW4gc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmVkIGtXaGF0U3RvcENvbXBsZXRlZCBpbiBzdGF0ZSAlZC8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0U3RvcENvbXBsZXRlZCIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImtXaGF0U3RvcENvbXBsZXRlZDogcHJlc3VtYWJseSBhbiBlcnJvciBvY2N1cnJlZCBlYXJsaWVyLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHRoZSBvcGVyYXRpb24gY29tcGxldGVkIGFueXdheS4gKGxhc3QgcmVwbHkgb3JpZ2luPSVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFJlcGx5T3JpZ2luLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlQ29tcGxldGVkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBSRUxFQVNJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNlaXZlZCBrV2hhdFJlbGVhc2VDb21wbGV0ZWQgaW4gc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmVkIGtXaGF0UmVsZWFzZUNvbXBsZXRlZCBpbiBzdGF0ZSAlZC8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKQEAgLTI2OTQsNyArMjY3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNlU3VyZmFjZS5yZXNldCgpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVwbHlJRCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0UmVsZWFzZUNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChtQXN5bmNSZWxlYXNlQ29tcGxldGVOb3RpZmljYXRpb24gIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hNZWRpYW1ldHJpY3MoKTsKQEAgLTI3MDcsOCArMjY4OSw4IEBACiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdEZsdXNoQ29tcGxldGVkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBGTFVTSElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlY2VpdmVkIEZsdXNoQ29tcGxldGVkIG1lc3NhZ2UgaW4gc3RhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlY2VpdmVkIEZsdXNoQ29tcGxldGVkIG1lc3NhZ2UgaW4gc3RhdGUgJWQvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0yNzE5LDcgKzI3MDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCJrV2hhdEZsdXNoQ29tcGxldGVkIik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjczMSwxNCArMjcxMywxOCBAQAogCiAgICAgICAgIGNhc2Uga1doYXRJbml0OgogICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBVTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobXNnLCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtUmVwbHlJRCkgeworICAgICAgICAgICAgICAgIG1EZWZlcnJlZE1lc3NhZ2VzLnB1c2hfYmFjayhtc2cpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKICAgICAgICAgICAgIG1SZXBseUlEID0gcmVwbHlJRDsKICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWklORyk7CiAKQEAgLTI4MDAsMTQgKzI3ODYsMTggQEAKIAogICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgogICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBJTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCiAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInN1cmZhY2UiLCAmb2JqKSk7CiAKQEAgLTI4MjAsNyArMjgxMCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImFsbG93LWZyYW1lLWRyb3AiLCAmbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKEtFWV9BTExPV19GUkFNRV9EUk9QLCAmbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZnJhbWUgZHJvcHBpbmcgYnkgc3VyZmFjZSBieSBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgIG1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4ODAsNiArMjg3MCwxNCBAQAogCiAgICAgICAgICAgICBleHRyYWN0Q1NEKGZvcm1hdCk7CiAKKyAgICAgICAgICAgIGludDMyX3QgdHVubmVsZWQ7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImZlYXR1cmUtdHVubmVsZWQtcGxheWJhY2siLCAmdHVubmVsZWQpICYmIHR1bm5lbGVkICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgVFVOTkVMRUQgdmlkZW8gcGxheWJhY2suIik7CisgICAgICAgICAgICAgICAgbVR1bm5lbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVR1bm5lbGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1Db2RlYy0+aW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoZm9ybWF0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yOTQ1LDE1ICsyOTQzLDE5IEBACiAgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6CiAgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICAvLyBNdXN0IGJlIGNvbmZpZ3VyZWQsIGJ1dCBjYW4ndCBoYXZlIGJlZW4gc3RhcnRlZCB5ZXQuCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgbURlZmVycmVkTWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKwogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOwpAQCAtMjk2OCw5ICsyOTcwLDYgQEAKICAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNIRUQpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKICAgICAgICAgICAgICAgICBpZiAobUhhdmVQZW5kaW5nSW5wdXRCdWZmZXJzKSB7CkBAIC0yOTc4LDEzICsyOTc3LDIwIEBACiAgICAgICAgICAgICAgICAgICAgIG1IYXZlUGVuZGluZ0lucHV0QnVmZmVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBPSyk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgT0spOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVElORyk7CiAKQEAgLTI5OTIsMTUgKzI5OTgsNDIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdFN0b3A6CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZToKICAgICAgICAgewogICAgICAgICAgICAgU3RhdGUgdGFyZ2V0U3RhdGUgPQogICAgICAgICAgICAgICAgIChtc2ctPndoYXQoKSA9PSBrV2hhdFN0b3ApID8gSU5JVElBTElaRUQgOiBVTklOSVRJQUxJWkVEOwogCisgICAgICAgICAgICBpZiAoKG1TdGF0ZSA9PSBSRUxFQVNJTkcgJiYgdGFyZ2V0U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKG1TdGF0ZSA9PSBTVE9QUElORyAmJiB0YXJnZXRTdGF0ZSA9PSBJTklUSUFMSVpFRCkpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBhc3luY05vdGlmeTsKKyAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZE1lc3NhZ2UoImFzeW5jIiwgJmFzeW5jTm90aWZ5KTsKKyAgICAgICAgICAgIC8vIHBvc3QgYXN5bmNOb3RpZnkgaWYgZ29pbmcgb3V0IG9mIHNjb3BlLgorICAgICAgICAgICAgc3RydWN0IEFzeW5jTm90aWZ5UG9zdCB7CisgICAgICAgICAgICAgICAgQXN5bmNOb3RpZnlQb3N0KGNvbnN0IHNwPEFNZXNzYWdlPiAmYXN5bmNOb3RpZnkpIDogbUFzeW5jTm90aWZ5KGFzeW5jTm90aWZ5KSB7fQorICAgICAgICAgICAgICAgIH5Bc3luY05vdGlmeVBvc3QoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXN5bmNOb3RpZnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Bc3luY05vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvaWQgY2xlYXIoKSB7IG1Bc3luY05vdGlmeS5jbGVhcigpOyB9CisgICAgICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtQXN5bmNOb3RpZnk7CisgICAgICAgICAgICB9IGFzeW5jTm90aWZ5UG9zdHthc3luY05vdGlmeX07CisKICAgICAgICAgICAgIC8vIGFscmVhZHkgc3RvcHBlZC9yZWxlYXNlZAogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEICYmIG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyKSB7CiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwpAQCAtMzAxMiw3ICszMDQ1LDEzIEBACiAgICAgICAgICAgICBpbnQzMl90IHJlY2xhaW1lZCA9IDA7CiAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigicmVjbGFpbWVkIiwgJnJlY2xhaW1lZCk7CiAgICAgICAgICAgICBpZiAocmVjbGFpbWVkKSB7Ci0gICAgICAgICAgICAgICAgbVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICghbVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBhc3luYyBjbGllbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihERUFEX09CSkVDVCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQzMl90IGZvcmNlID0gMDsKICAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZm9yY2UiLCAmZm9yY2UpOwpAQCAtMzAyNCwxMCArMzA2Myw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgV09VTERfQkxPQ0spOwogICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgYXN5bmMgY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoREVBRF9PQkpFQ1QsIEFDVElPTl9DT0RFX0ZBVEFMKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zMDY0LDEyICszMDk5LDE1IEBACiAgICAgICAgICAgICAvLyBhZnRlciB0aGlzLCBhbmQgd2UnbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gcmVwbHkuCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HIHx8IG1TdGF0ZSA9PSBTVE9QUElORwogICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQ09ORklHVVJJTkcgfHwgbVN0YXRlID09IFNUQVJUSU5HKSB7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgLy8gbVJlcGx5IGlzIGFsd2F5cyBzZXQgaWYgaW4gdGhlc2Ugc3RhdGVzLgorICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygia1doYXRSZWxlYXNlOiIpICsgc3RhdGVTdHJpbmcobVN0YXRlKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllKSB7CiAgICAgICAgICAgICAgICAgLy8gSXQncyBkZWFkLCBKaW0uIERvbid0IGV4cGVjdCBpbml0aWF0ZVNodXRkb3duIHRvIHlpZWxkCiAgICAgICAgICAgICAgICAgLy8gYW55IHVzZWZ1bCByZXN1bHRzIG5vdy4uLgorICAgICAgICAgICAgICAgIC8vIEFueSBwZW5kaW5nIHJlcGx5IHdvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGF0IGtXaGF0RXJyb3IuCiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKQEAgLTMwODMsMTIgKzMxMjEsMTIgQEAKICAgICAgICAgICAgIC8vIHJlcGx5IG5vdyB3aXRoIGFuIGVycm9yIHRvIHVuYmxvY2sgdGhlIGNsaWVudCwgY2xpZW50IGNhbgogICAgICAgICAgICAgLy8gcmVsZWFzZSBhZnRlciB0aGUgZmFpbHVyZSAoaW5zdGVhZCBvZiBBTlIpLgogICAgICAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U3RvcCAmJiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKKyAgICAgICAgICAgICAgICAvLyBBbnkgcGVuZGluZyByZXBseSB3b3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBhdCBrV2hhdEVycm9yLgogICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGFzeW5jTm90aWZ5OwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoImFzeW5jIiwgJmFzeW5jTm90aWZ5KSAmJiBhc3luY05vdGlmeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVJlbGVhc2VTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSA9IDA7CkBAIC0zMTEyLDYgKzMxNTAsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtUmVwbHlJRCkgeworICAgICAgICAgICAgICAgIC8vIFN0YXRlIHRyYW5zaXRpb24gcmVwbGllcyBhcmUgaGFuZGxlZCBhYm92ZSwgc28gdGhpcyByZXBseQorICAgICAgICAgICAgICAgIC8vIHdvdWxkIG5vdCBiZSByZWxhdGVkIHRvIHN0YXRlIHRyYW5zaXRpb24uIEFzIHdlIGFyZQorICAgICAgICAgICAgICAgIC8vIHNodXR0aW5nIGRvd24gdGhlIGNvbXBvbmVudCwganVzdCBmYWlsIHRoZSBvcGVyYXRpb24uCisgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRSZWxlYXNlOnJlcGx5IiwgVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShtc2ctPndoYXQoKSA9PSBrV2hhdFN0b3AgPyBTVE9QUElORyA6IFJFTEVBU0lORyk7CiAKQEAgLTMxMjYsOCArMzE3MCw4IEBACiAKICAgICAgICAgICAgIGlmIChhc3luY05vdGlmeSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgbVJlc291cmNlTWFuYWdlclByb3h5LT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoKTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKLSAgICAgICAgICAgICAgICBtUmVwbHlJRCA9IDA7CisgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRSZWxlYXNlOmFzeW5jIik7CisgICAgICAgICAgICAgICAgYXN5bmNOb3RpZnlQb3N0LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgbUFzeW5jUmVsZWFzZUNvbXBsZXRlTm90aWZpY2F0aW9uID0gYXN5bmNOb3RpZnk7CiAgICAgICAgICAgICB9CiAKQEAgLTMyOTgsMTcgKzMzNDIsMjEgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbToKICAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KICAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAhbUhhdmVJbnB1dFN1cmZhY2UpIHsKLSAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobXNnLCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgbURlZmVycmVkTWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKwogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTMzNTAsMTcgKzMzOTgsMjEgQEAKIAogICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobXNnLCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgbURlZmVycmVkTWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKwogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgLy8gVE9ETzogc2tpcCBmbHVzaGluZyBpZiBhbHJlYWR5IEZMVVNIRUQKICAgICAgICAgICAgIHNldFN0YXRlKEZMVVNISU5HKTsKQEAgLTM0NzQsNiArMzUyNiwxMDYgQEAKICAgICB9CiB9CiAKK3ZvaWQgTWVkaWFDb2RlYzo6aGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlSWZOZWVkZWQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBidWZmZXItPmZvcm1hdCgpOworICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IGZvcm1hdCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1VzZUJsb2NrTW9kZWwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGRpZmYxID0gbU91dHB1dEZvcm1hdC0+Y2hhbmdlc0Zyb20oZm9ybWF0KTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGRpZmYyID0gZm9ybWF0LT5jaGFuZ2VzRnJvbShtT3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtleXM7CisgICAgICAgIHNpemVfdCBudW1FbnRyaWVzID0gZGlmZjEtPmNvdW50RW50cmllcygpOworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7ICsraSkgeworICAgICAgICAgICAga2V5cy5lbXBsYWNlKGRpZmYxLT5nZXRFbnRyeU5hbWVBdChpLCAmdHlwZSkpOworICAgICAgICB9CisgICAgICAgIG51bUVudHJpZXMgPSBkaWZmMi0+Y291bnRFbnRyaWVzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRW50cmllczsgKytpKSB7CisgICAgICAgICAgICBrZXlzLmVtcGxhY2UoZGlmZjItPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgc3A8V3JhcHBlck9iamVjdDxzdGQ6OnNldDxzdGQ6OnN0cmluZz4+PiBjaGFuZ2VkS2V5c3sKKyAgICAgICAgICAgIG5ldyBXcmFwcGVyT2JqZWN0PHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj57c3RkOjptb3ZlKGtleXMpfX07CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRPYmplY3QoImNoYW5nZWRLZXlzIiwgY2hhbmdlZEtleXMpOworICAgIH0KKyAgICBtT3V0cHV0Rm9ybWF0ID0gZm9ybWF0OworICAgIEFMT0dWKCJbJXNdIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0bzogJXMiLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSk7CisKKyAgICBpZiAobVNvZnRSZW5kZXJlciA9PSBOVUxMICYmCisgICAgICAgICAgICBtU3VyZmFjZSAhPSBOVUxMICYmCisgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcikpIHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgICAgICAvLyBUT0RPOiBwcm9wYWdhdGUgY29sb3IgYXNwZWN0cyB0byBzb2Z0d2FyZSByZW5kZXJlciB0byBhbGxvdyBiZXR0ZXIKKyAgICAgICAgLy8gY29sb3IgY29udmVyc2lvbiB0byBSR0IuIEZvciBub3csIGp1c3QgbWFyayBkYXRhc3BhY2UgZm9yIFlVVgorICAgICAgICAvLyByZW5kZXJpbmcuCisgICAgICAgIGludDMyX3QgZGF0YVNwYWNlOworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAmZGF0YVNwYWNlKSkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gc2V0dGluZyBkYXRhc3BhY2Ugb24gb3V0cHV0IHN1cmZhY2UgdG8gIyV4IiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZGF0YVNwYWNlKTsKKyAgICAgICAgICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RhdGFfc3BhY2UoCisgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpLCAoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiZmFpbGVkIHRvIHNldCBkYXRhc3BhY2Ugb24gc3VyZmFjZSAoJWQpIiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpKSB7CisgICAgICAgICAgICBIRFJTdGF0aWNJbmZvIGluZm87CisgICAgICAgICAgICBpZiAoQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobU91dHB1dEZvcm1hdCwgJmluZm8pKSB7CisgICAgICAgICAgICAgICAgc2V0TmF0aXZlV2luZG93SGRyTWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksICZpbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykKKyAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKKyAgICAgICAgICAgIG1TdXJmYWNlLT5zZXREZXF1ZXVlVGltZW91dCgtMSk7CisgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobVN1cmZhY2UsIG1Sb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVxdWVzdENwdUJvb3N0SWZOZWVkZWQoKTsKKworICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzRW5jb2RlcikgeworICAgICAgICAvLyBCZWZvcmUgd2UgYW5ub3VuY2UgdGhlIGZvcm1hdCBjaGFuZ2Ugd2Ugc2hvdWxkCisgICAgICAgIC8vIGNvbGxlY3QgY29kZWMgc3BlY2lmaWMgZGF0YSBhbmQgYW1lbmQgdGhlIG91dHB1dAorICAgICAgICAvLyBmb3JtYXQgYXMgbmVjZXNzYXJ5LgorICAgICAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgKHZvaWQpIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSAmJiAhKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIGFtZW5kT3V0cHV0Rm9ybWF0V2l0aENvZGVjU3BlY2lmaWNEYXRhKGJ1ZmZlcik7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgc3BpdCBvdXQgbWFsZm9ybWVkIGNvZGVjICIKKyAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWMgZGF0YSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgIG9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1GbGFncyB8PSBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CisgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKKyAgICB9CisKKyAgICAvLyBOb3RpZnkgbUNyeXB0byBvZiB2aWRlbyByZXNvbHV0aW9uIGNoYW5nZXMKKyAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgbUNyeXB0by0+bm90aWZ5UmVzb2x1dGlvbihyaWdodCAtIGxlZnQgKyAxLCBib3R0b20gLSB0b3AgKyAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1DcnlwdG8tPm5vdGlmeVJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgTWVkaWFDb2RlYzo6ZXh0cmFjdENTRChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewogICAgIG1DU0QuY2xlYXIoKTsKIApAQCAtMzgxMSw3ICszOTYzLDE4IEBACiAgICAgaWYgKGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSAmJiAhYzJCdWZmZXIgJiYgIW1lbW9yeSkgewogICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZzsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZXJyb3JEZXRhaWxNc2ciLCAodm9pZCAqKikmZXJyb3JEZXRhaWxNc2cpKTsKLQorICAgICAgICAvLyBOb3RpZnkgbUNyeXB0byBvZiB2aWRlbyByZXNvbHV0aW9uIGNoYW5nZXMKKyAgICAgICAgaWYgKG1UdW5uZWxlZCAmJiBtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgIGlmIChtSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmCisgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoICE9IG1UdW5uZWxlZElucHV0V2lkdGggfHwgaGVpZ2h0ICE9IG1UdW5uZWxlZElucHV0SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1UdW5uZWxlZElucHV0V2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbVR1bm5lbGVkSW5wdXRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIG1DcnlwdG8tPm5vdGlmeVJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGVyciA9IG1CdWZmZXJDaGFubmVsLT5xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAogICAgICAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJc1NlY3VyZSksCkBAIC0zOTM5LDE5ICs0MTAyLDMxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zc2l6ZV90IE1lZGlhQ29kZWM6OmRlcXVldWVQb3J0QnVmZmVyKGludDMyX3QgcG9ydEluZGV4KSB7CitNZWRpYUNvZGVjOjpCdWZmZXJJbmZvICpNZWRpYUNvZGVjOjpwZWVrTmV4dFBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpIHsKICAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKIAogICAgIExpc3Q8c2l6ZV90PiAqYXZhaWxCdWZmZXJzID0gJm1BdmFpbFBvcnRCdWZmZXJzW3BvcnRJbmRleF07CiAKICAgICBpZiAoYXZhaWxCdWZmZXJzLT5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF1bKmF2YWlsQnVmZmVycy0+YmVnaW4oKV07Cit9CisKK3NzaXplX3QgTWVkaWFDb2RlYzo6ZGVxdWV1ZVBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpIHsKKyAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKKworICAgIEJ1ZmZlckluZm8gKmluZm8gPSBwZWVrTmV4dFBvcnRCdWZmZXIocG9ydEluZGV4KTsKKyAgICBpZiAoIWluZm8pIHsKICAgICAgICAgcmV0dXJuIC1FQUdBSU47CiAgICAgfQogCisgICAgTGlzdDxzaXplX3Q+ICphdmFpbEJ1ZmZlcnMgPSAmbUF2YWlsUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XTsKICAgICBzaXplX3QgaW5kZXggPSAqYXZhaWxCdWZmZXJzLT5iZWdpbigpOworICAgIENIRUNLX0VRKGluZm8sICZtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XVtpbmRleF0pOwogICAgIGF2YWlsQnVmZmVycy0+ZXJhc2UoYXZhaWxCdWZmZXJzLT5iZWdpbigpKTsKIAotICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF1baW5kZXhdOwogICAgIENIRUNLKCFpbmZvLT5tT3duZWRCeUNsaWVudCk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOwpAQCAtNDE5Myw2ICs0MzY4LDMzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1lZGlhQ29kZWM6OnBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoCisgICAgICAgIHN0ZDo6c3RyaW5nIG9yaWdpbiwgc3RhdHVzX3QgZXJyIC8qID0gT0sgKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2V7bmV3IEFNZXNzYWdlfTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICB9CisgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhvcmlnaW4sIHJlc3BvbnNlKTsKK30KKwordm9pZCBNZWRpYUNvZGVjOjpwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKAorICAgICAgICBzdGQ6OnN0cmluZyBvcmlnaW4sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVzcG9uc2UpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKAorICAgICAgICAgICAgIW1SZXBseUlELAorICAgICAgICAgICAgInBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXM6IG1SZXBseUlEID09IG51bGwsIGZyb20gJXMgZm9sbG93aW5nICVzIiwKKyAgICAgICAgICAgIG9yaWdpbi5jX3N0cigpLAorICAgICAgICAgICAgbUxhc3RSZXBseU9yaWdpbi5jX3N0cigpKTsKKyAgICBtTGFzdFJlcGx5T3JpZ2luID0gb3JpZ2luOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgIG1SZXBseUlELmNsZWFyKCk7CisgICAgQUxPR1ZfSUYoIW1EZWZlcnJlZE1lc3NhZ2VzLmVtcHR5KCksCisgICAgICAgICAgICAicG9zdGluZyAlenUgZGVmZXJyZWQgbWVzc2FnZXMiLCBtRGVmZXJyZWRNZXNzYWdlcy5zaXplKCkpOworICAgIGZvciAoc3A8QU1lc3NhZ2U+IG1zZyA6IG1EZWZlcnJlZE1lc3NhZ2VzKSB7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKyAgICBtRGVmZXJyZWRNZXNzYWdlcy5jbGVhcigpOworfQorCiBzdGQ6OnN0cmluZyBNZWRpYUNvZGVjOjpzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSkgewogICAgIGNvbnN0IGNoYXIgKnJ2YWwgPSBOVUxMOwogICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgLy8gcm9vbSBmb3IgIiVkIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcAppbmRleCAxMzk1YzI3Li5iYzY1NmEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcApAQCAtNDM1LDYgKzQzNSwzMCBAQAogICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzZXRFbmNvZGluZ0JpdHJhdGUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgQUxPR1YoInNldEVuY29kaW5nQml0cmF0ZSAoJWQpIiwgYml0UmF0ZSk7CisKKyAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygic2V0RW5jb2RpbmdCaXRyYXRlICglZCkgOiBtRW5jb2RlciBpcyBudWxsIiwgYml0UmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKKyAgICBwYXJhbXMtPnNldEludDMyKCJ2aWRlby1iaXRyYXRlIiwgYml0UmF0ZSk7CisKKyAgICByZXR1cm4gbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cmVxdWVzdElEUkZyYW1lKCkgeworICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJyZXF1ZXN0SURSRnJhbWUgOiBtRW5jb2RlciBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuY29kZXItPnJlcXVlc3RJRFJGcmFtZSgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCiBNZWRpYUNvZGVjU291cmNlOjpNZWRpYUNvZGVjU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCmluZGV4IGM2ZTc1M2QuLjdjOTgxYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApAQCAtNTksNyArNTksNyBAQAogICAgICAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleDsKICAgICAgICAgICAgIG1lZGlhRXhTZXJ2aWNlLT5tYWtlRXh0cmFjdG9yKAogICAgICAgICAgICAgICAgICAgICBDcmVhdGVJRGF0YVNvdXJjZUZyb21EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgIG1pbWUgPyBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPihtaW1lKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIG1pbWUgPyBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPihtaW1lKSA6IHN0ZDo6bnVsbG9wdCwKICAgICAgICAgICAgICAgICAgICAgJmV4KTsKICAgICAgICAgICAgIHJldHVybiBleDsKICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggY2FiNGViZC4uYzkxMzg2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTkyLDcgKzkyLDkgQEAKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShmb3JtYXQsIHRyYWNrTWV0YSk7CisgICAgaWYgKGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShmb3JtYXQsIHRyYWNrTWV0YSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNZWRpYUFkYXB0ZXI+IG5ld1RyYWNrID0gbmV3IE1lZGlhQWRhcHRlcih0cmFja01ldGEpOwogICAgIHN0YXR1c190IHJlc3VsdCA9IG1Xcml0ZXItPmFkZFNvdXJjZShuZXdUcmFjayk7CkBAIC0xNzUsMTYgKzE3NywyMyBAQAogCiBzdGF0dXNfdCBNZWRpYU11eGVyOjp3cml0ZVNhbXBsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgc2l6ZV90IHRyYWNrSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXhlckxvY2spOwotCiAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJXcml0ZVNhbXBsZURhdGEoKSBnZXQgYW4gTlVMTCBidWZmZXIuIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLQotICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgewotICAgICAgICBBTE9HRSgiV3JpdGVTYW1wbGVEYXRhKCkgaXMgY2FsbGVkIGluIGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgeworICAgICAgICAvKiBBcyBNZWRpYU11eGVyJ3Mgd3JpdGVTYW1wbGVEYXRhIGhhbmRsZXMgaW5wdXRzIGZyb20gbXVsdGlwbGUgdHJhY2tzLAorICAgICAgICAgKiBsaW1pdGVkIHRoZSBzY29wZSBvZiBtTXV4ZXJMb2NrIHRvIHRoaXMgaW5uZXIgYmxvY2sgc28gdGhhdCB0aGUKKyAgICAgICAgICogY3VycmVudCB0cmFjaydzIGJ1ZmZlciBkb2VzIG5vdCB3YWl0IHVudGlsIHRoZSBjb21wbGV0aW9uCisgICAgICAgICAqIG9mIHByb2Nlc3Npbmcgb2YgcHJldmlvdXMgYnVmZmVyIG9mIHRoZSBzYW1lIG9yIGFub3RoZXIgdHJhY2suCisgICAgICAgICAqIEl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGluZGl2aWR1YWwgdHJhY2sgLSBNZWRpYUFkYXB0ZXIgb2JqZWN0CisgICAgICAgICAqIHRvIGdhdGUgaXRzIGJ1ZmZlcnMuCisgICAgICAgICAqLworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11eGVyTG9jayk7CisgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICAgICAgQUxPR0UoIldyaXRlU2FtcGxlRGF0YSgpIGlzIGNhbGxlZCBpbiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja0xpc3Quc2l6ZSgpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDA1MGQ3YzIuLjYyNDUwMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0zMTIsNiArMzEyLDI3IEBACiAgICAgICAgICgqZm9ybWF0KS0+c2V0QnVmZmVyKCJwc3NoIiwgYnVmKTsKICAgICB9CiAKKyAgICAvLyBDb3B5IG92ZXIgdGhlIHNsb3ctbW90aW9uIHJlbGF0ZWQgbWV0YWRhdGEKKyAgICBjb25zdCB2b2lkICpzbG9tb01hcmtlcnM7CisgICAgc2l6ZV90IHNsb21vTWFya2Vyc1NpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlTbG93TW90aW9uTWFya2VycywgJnR5cGUsICZzbG9tb01hcmtlcnMsICZzbG9tb01hcmtlcnNTaXplKQorICAgICAgICAgICAgJiYgc2xvbW9NYXJrZXJzU2l6ZSA+IDApIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2xvbW9NYXJrZXJzU2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmRhdGEoKSwgc2xvbW9NYXJrZXJzLCBzbG9tb01hcmtlcnNTaXplKTsKKyAgICAgICAgKCpmb3JtYXQpLT5zZXRCdWZmZXIoInNsb3ctbW90aW9uLW1hcmtlcnMiLCBidWYpOworICAgIH0KKworICAgIGludDMyX3QgdGVtcG9yYWxMYXllckNvdW50OworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgJnRlbXBvcmFsTGF5ZXJDb3VudCkKKyAgICAgICAgICAgICYmIHRlbXBvcmFsTGF5ZXJDb3VudCA+IDApIHsKKyAgICAgICAgKCpmb3JtYXQpLT5zZXRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCB0ZW1wb3JhbExheWVyQ291bnQpOworICAgIH0KKworICAgIGZsb2F0IGNhcHR1cmVGcHM7CisgICAgaWYgKG1ldGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmNhcHR1cmVGcHMpICYmIGNhcHR1cmVGcHMgPiAwLjBmKSB7CisgICAgICAgICgqZm9ybWF0KS0+c2V0RmxvYXQoImNhcHR1cmUtcmF0ZSIsIGNhcHR1cmVGcHMpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT1dORVJTIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTM4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PV05FUlMKQEAgLTAsMCArMSw3IEBACitzZXQgbm9wYXJlbnQKK2NoekBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcAppbmRleCA0Yzk0YmFhLi4xZjU2OWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAKQEAgLTEzMiwzNyArMTMyLDYzIEBACiB9CiAKIHZvaWQgc2V0TmF0aXZlV2luZG93SGRyTWV0YWRhdGEoQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93LCBIRFJTdGF0aWNJbmZvICppbmZvKSB7Ci0gICAgc3RydWN0IGFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIHNtcHRlMjA4Nl9tZXRhID0gewotICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5UmVkID0gewotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubVIueCAqIDAuMDAwMDJmLAotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubVIueSAqIDAuMDAwMDJmCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5R3JlZW4gPSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tRy54ICogMC4wMDAwMmYsCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tRy55ICogMC4wMDAwMmYKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAuZGlzcGxheVByaW1hcnlCbHVlID0gewotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubUIueCAqIDAuMDAwMDJmLAotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubUIueSAqIDAuMDAwMDJmCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLndoaXRlUG9pbnQgPSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tVy54ICogMC4wMDAwMmYsCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tVy55ICogMC4wMDAwMmYKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAubWF4THVtaW5hbmNlID0gKGZsb2F0KSBpbmZvLT5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UsCi0gICAgICAgICAgICAubWluTHVtaW5hbmNlID0gaW5mby0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlICogMC4wMDAxZgotICAgIH07CisgICAgLy8gSWYgbWFzdGVyaW5nIG1heCBhbmQgbWluIGx1bWluYW5jZSBmaWVsZHMgYXJlIDAsIGRvIG5vdCB1c2UgdGhlbS4KKyAgICAvLyBJdCBpbmRpY2F0ZXMgdGhlIHZhbHVlIG1heSBub3QgYmUgcHJlc2VudCBpbiB0aGUgc3RyZWFtLgorICAgIGlmICgoZmxvYXQpaW5mby0+c1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID4gMC4wZiAmJgorICAgICAgICAoaW5mby0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlICogMC4wMDAxZikgPiAwLjBmKSB7CisgICAgICAgIHN0cnVjdCBhbmRyb2lkX3NtcHRlMjA4Nl9tZXRhZGF0YSBzbXB0ZTIwODZfbWV0YSA9IHsKKyAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlSZWQgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubVIueCAqIDAuMDAwMDJmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1SLnkgKiAwLjAwMDAyZgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5R3JlZW4gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubUcueCAqIDAuMDAwMDJmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyZgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5Qmx1ZSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tQi54ICogMC4wMDAwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubUIueSAqIDAuMDAwMDJmCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAud2hpdGVQb2ludCA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tVy54ICogMC4wMDAwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubVcueSAqIDAuMDAwMDJmCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAubWF4THVtaW5hbmNlID0gKGZsb2F0KSBpbmZvLT5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IGluZm8tPnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSAqIDAuMDAwMWYKKyAgICAgICAgfTsKIAotICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3NtcHRlMjA4Nl9tZXRhZGF0YShuYXRpdmVXaW5kb3csICZzbXB0ZTIwODZfbWV0YSk7Ci0gICAgQUxPR1dfSUYoZXJyICE9IDAsICJmYWlsZWQgdG8gc2V0IHNtcHRlMjA4NiBtZXRhZGF0YSBvbiBzdXJmYWNlICglZCkiLCBlcnIpOworICAgICAgICBpbnQgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19zbXB0ZTIwODZfbWV0YWRhdGEobmF0aXZlV2luZG93LCAmc21wdGUyMDg2X21ldGEpOworICAgICAgICBBTE9HV19JRihlcnIgIT0gMCwgImZhaWxlZCB0byBzZXQgc21wdGUyMDg2IG1ldGFkYXRhIG9uIHN1cmZhY2UgKCVkKSIsIGVycik7CisgICAgfQogCi0gICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7Ci0gICAgICAgICAgICAubWF4Q29udGVudExpZ2h0TGV2ZWwgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwsCi0gICAgICAgICAgICAubWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IChmbG9hdCkgaW5mby0+c1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsCi0gICAgfTsKKyAgICAvLyBJZiB0aGUgY29udGVudCBsaWdodCBsZXZlbCBmaWVsZHMgYXJlIDAsIGRvIG5vdCB1c2UgdGhlbSwgaXQKKyAgICAvLyBpbmRpY2F0ZXMgdGhlIHZhbHVlIG1heSBub3QgYmUgcHJlc2VudCBpbiB0aGUgc3RyZWFtLgorICAgIGlmICgoZmxvYXQpaW5mby0+c1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCA+IDAuMGYgJiYKKyAgICAgICAgKGZsb2F0KWluZm8tPnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA+IDAuMGYpIHsKKyAgICAgICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7CisgICAgICAgICAgICAgICAgLm1heENvbnRlbnRMaWdodExldmVsID0gKGZsb2F0KSBpbmZvLT5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsLAorICAgICAgICAgICAgICAgIC5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gKGZsb2F0KSBpbmZvLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwKKyAgICAgICAgfTsKIAotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfY3RhODYxXzNfbWV0YWRhdGEobmF0aXZlV2luZG93LCAmY3RhODYxX21ldGEpOwotICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiZmFpbGVkIHRvIHNldCBjdGE4NjFfMyBtZXRhZGF0YSBvbiBzdXJmYWNlICglZCkiLCBlcnIpOworICAgICAgICBpbnQgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19jdGE4NjFfM19tZXRhZGF0YShuYXRpdmVXaW5kb3csICZjdGE4NjFfbWV0YSk7CisgICAgICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiZmFpbGVkIHRvIHNldCBjdGE4NjFfMyBtZXRhZGF0YSBvbiBzdXJmYWNlICglZCkiLCBlcnIpOworICAgIH0KK30KKworc3RhdHVzX3Qgc2V0TmF0aXZlV2luZG93Um90YXRpb24oCisgICAgICAgIEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovLCBpbnQgcm90YXRpb24pIHsKKworICAgIGludCB0cmFuc2Zvcm0gPSAwOworICAgIGlmICgocm90YXRpb24gJSA5MCkgPT0gMCkgeworICAgICAgICBzd2l0Y2ggKChyb3RhdGlvbiAvIDkwKSAmIDMpIHsKKyAgICAgICAgICAgIGNhc2UgMTogIHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8xODA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiAgdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMjcwOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHRyYW5zZm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0obmF0aXZlV2luZG93LCB0cmFuc2Zvcm0pOwogfQogCiBzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwppbmRleCA4YjM2ZWE1Li43NmZjNzRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCkBAIC0xLDQgKzEsMTYgQEAKIHsKKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisgICAgLy8gd3JpdGVyVGVzdCBmYWlscyBhYm91dCA1IG91dCBvZiA2NgorICAgIC8vIHsgIm5hbWUiOiAid3JpdGVyVGVzdCIgfSwKKworICAgIHsgIm5hbWUiOiAiSEVWQ1V0aWxzVW5pdFRlc3QiIH0sCisgICAgeyAibmFtZSI6ICJFeHRyYWN0b3JGYWN0b3J5VGVzdCIgfQorCisgIF0sCisKICAgInByZXN1Ym1pdCI6IFsKICAgICB7CiAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCkBAIC0xNyw2ICsyOSw5IEBACiAgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkF1ZGlvUmVjb3JkVGVzdCIKICAgICAgICAgfQogICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAibWVkaWFjb2RlY1Rlc3QiCiAgICAgfQogICBdLAogICAicG9zdHN1Ym1pdCI6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCBhMWU0ZDQzLi40OGIzMjU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC03NjksNiArNzY5LDggQEAKICAgICAgICAgeyAic2VpIiwga0tleVNFSSB9LAogICAgICAgICB7ICJ0ZXh0LWZvcm1hdC1kYXRhIiwga0tleVRleHRGb3JtYXREYXRhIH0sCiAgICAgICAgIHsgInRodW1ibmFpbC1jc2QtaGV2YyIsIGtLZXlUaHVtYm5haWxIVkNDIH0sCisgICAgICAgIHsgInNsb3ctbW90aW9uLW1hcmtlcnMiLCBrS2V5U2xvd01vdGlvbk1hcmtlcnMgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWNzZC1hdjFjIiwga0tleVRodW1ibmFpbEFWMUMgfSwKICAgICB9CiB9OwogCkBAIC0xMTM1LDcgKzExMzcsNyBAQAogICAgICAgICAvLyBhc3NlcnRpb24sIGxldCdzIGJlIGxlbmllbnQgZm9yIG5vdy4uLgogICAgICAgICAvLyBDSEVDSygocHRyWzRdID4+IDIpID09IDB4M2YpOyAgLy8gcmVzZXJ2ZWQKIAotICAgICAgICBzaXplX3QgbGVuZ3RoU2l6ZSBfX3VudXNlZCA9IDEgKyAocHRyWzRdICYgMyk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgbGVuZ3RoU2l6ZSB2YWx1ZSBmcm9tIDEgKyAocHRyWzRdICYgMykKIAogICAgICAgICAvLyBjb21tZW50ZWQgb3V0IGNoZWNrIGJlbG93IGFzIEgyNjRfUVZHQV81MDBfTk9fQVVESU8uM2dwCiAgICAgICAgIC8vIHZpb2xhdGVzIGl0Li4uCkBAIC0xNjYzLDEzICsxNjY1LDE2IEBACiAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgY29sb3JBc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwogICAgIH0KIH0KLQotdm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgeworLyogQ29udmVydHMga2V5IGFuZCB2YWx1ZSBwYWlycyBpbiBBTWVzc2FnZSBmb3JtYXQgdG8gTWV0YURhdGEgZm9ybWF0LgorICogQWxzbyBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiByZXF1aXJlZCBrZXlzLgorICovCitzdGF0dXNfdCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgewogICAgIEFTdHJpbmcgbWltZTsKICAgICBpZiAobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CiAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJkaWQgbm90IGZpbmQgbWltZSB0eXBlIik7CisgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgbWltZSB0eXBlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhRnJvbU1hcHBpbmdzKG1zZywgbWV0YSk7CkBAIC0xNzE4LDcgKzE3MjMsOCBAQAogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoImRpZCBub3QgZmluZCB3aWR0aCBhbmQvb3IgaGVpZ2h0Iik7CisgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CkBAIC0xODAzLDE0ICsxODA5LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKLSAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSkgewotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSB8fAorICAgICAgICAgICAgICAgICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgY2hhbm5lbC1jb3VudCBhbmQvb3Igc2FtcGxlLXJhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCAmYml0c1BlclNhbXBsZSkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKQEAgLTE5MDAsNyArMTkwNiw4IEBACiAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBodmNjKGNzZDBzaXplICsgMTAyNCk7CiAgICAgICAgICAgICBzaXplX3Qgb3V0c2l6ZSA9IHJlYXNzZW1ibGVIVkNDKGNzZDAsIGh2Y2MuZGF0YSgpLCBodmNjLnNpemUoKSwgNCk7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKLSAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkgeworICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxIHx8CisgICAgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pIHsKICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0yIiwgJmNzZDIpKSB7CkBAIC0xOTI1LDcgKzE5MzIsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiV2UgbmVlZCBjc2QtMiEhLiAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiV2UgbmVlZCBjc2QtMiEhLiAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKQEAgLTE5OTEsNiArMTk5OSw3IEBACiAgICAgQUxPR0koImNvbnZlcnRlZCAlcyB0bzoiLCBtc2ctPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOwogICAgIG1ldGEtPmR1bXBUb0xvZygpOwogI2VuZGlmCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBzZW5kTWV0YURhdGFUb0hhbChzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4mIHNpbmssCkBAIC0yMTM2LDggKzIxNDUsMTAgQEAKICAgICB9CiAgICAgaW5mby0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKIAotICAgIGludDMyX3QgY21hc2sgPSAwOwotICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNtYXNrKSB8fCBjbWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKKyAgICBpbnQzMl90IHJhd0NoYW5uZWxNYXNrOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNtYXNrID0gbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJnJhd0NoYW5uZWxNYXNrKSA/CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4ocmF3Q2hhbm5lbE1hc2spIDogQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOworICAgIGlmIChjbWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGNoYW5uZWwgbWFzayIsIG1pbWUpOwogCiAgICAgICAgIC8vIFRyeSBhIGNoYW5uZWwgY291bnQgaW5zdGVhZApAQCAtMjE3OCw3ICsyMTg5LDExIEBACiAgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZworI2lmZGVmIERJU0FCTEVfQVVESU9fU1lTVEVNX09GRkxPQUQKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOworI2VuZGlmCiB9CiAKIEhMU1RpbWU6OkhMU1RpbWUoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtZXRhKSA6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmMmZkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDYgQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyCit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJGcmFtZURyb3BwZXJfdGVzdCJ9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5oCmluZGV4IDRlODMwNTkuLjdlMjkwOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9GcmFtZURyb3BwZXIuaApAQCAtMzAsNiArMzAsOCBAQAogICAgIEZyYW1lRHJvcHBlcigpOwogCiAgICAgLy8gbWF4RnJhbWVSYXRlIHJlcXVpcmVkIHRvIGJlIHBvc2l0aXZlLgorICAgIC8vIG1heEZyYW1lUmF0ZSBuZWdhdGl2ZSBjYXVzZXMgc2hvdWxkRHJvcCgpIHRvIGFsd2F5cyByZXR1cm4gZmFsc2UKKyAgICAvLyBtYXhGcmFtZVJhdGUgPT0gMCBpcyBpbGxlZ2FsCiAgICAgc3RhdHVzX3Qgc2V0TWF4RnJhbWVSYXRlKGZsb2F0IG1heEZyYW1lUmF0ZSk7CiAKICAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1heCBmcmFtZSByYXRlIGhhcyBub3QgYmVlbiBzZXQgdmlhIHNldE1heEZyYW1lUmF0ZS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDJmYmMzZDYuLjM4OTc2ODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJGcmFtZURyb3BwZXJfdGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAKICAgICBzcmNzOiBbIkZyYW1lRHJvcHBlcl90ZXN0LmNwcCJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAKaW5kZXggNTVhZTc3Yy4uYjE4MDY3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiB9OwogCiBURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdEludmFsaWRNYXhGcmFtZVJhdGUpIHsKLSAgICBFWFBFQ1RfTkUoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgtMS4wKSk7CisgICAgRVhQRUNUX0VRKE9LLCBtRnJhbWVEcm9wcGVyLT5zZXRNYXhGcmFtZVJhdGUoLTEuMCkpOwogICAgIEVYUEVDVF9ORShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKDApKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCmluZGV4IDE2OGQxNDAuLjE1N2NhYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UgeyAvLyBoYW5kbGUgb3RoZXIgdXNlZCBlbmNvZGVyIHRhcmdldCBsZXZlbHMKIAotICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgaXMgb25seSBzcGVjaWZpZWQgZm9yIG1heC4gNS4xIGNoYW5uZWxzCisgICAgICAgICAgICAvLyBWYWxpZGF0aW9uIGNoZWNrOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgaXMgb25seSBzcGVjaWZpZWQgZm9yIG1heC4gNS4xIGNoYW5uZWxzCiAgICAgICAgICAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiA+IDYpIHsKICAgICAgICAgICAgICAgICBkcmNQcmVzTW9kZSA9IDA7CiAgICAgICAgICAgICB9CkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICAgICAgICAgIH0gLy8gc3dpdGNoKCkKICAgICAgICAgfSAvLyBpZiAobUVuY29kZXJUYXJnZXQgID09IEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCkKIAotICAgICAgICAvLyBzYW5pdHkgYWdhaW4KKyAgICAgICAgLy8gdmFsaWRhdGlvbiBjaGVjayBhZ2FpbgogICAgICAgICBpZiAobmV3SGVhdnkgPT0gMSkgewogICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3I9MTI3OyAvLyBub3QgcmVhbGx5IG5lZWRlZCBhcyB0aGUgc2FtZSB3b3VsZCBiZSBkb25lIGJ5IHRoZSBkZWNvZGVyIGFueXdheQogICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAppbmRleCAyYWVkZGQ3Li4yOGE3YTFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcApAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIDEgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19BTEJVTSAwICAvKiBNUEVHLUQgRFJDIGFsYnVtIG1vZGU7IDAgPT4gYWxidW0gbW9kZSBpcyBkaXNhYmxlZCwgMSA9PiBhbGJ1bSBtb2RlIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX09VVFBVVF9MT1VETkVTUyAtMSAvKiBkZWNvZGVyIG91dHB1dCBsb3VkbmVzczsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKC0xKSAvKiBlbmNvZGVyIHRhcmdldCBsZXZlbDsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCiAjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLwogLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncwpAQCAtMjMwLDYgKzIzMSwxNSBAQAogICAgIC8vIEZvciBzZXZlbiBhbmQgZWlnaHQgY2hhbm5lbCBpbnB1dCBzdHJlYW1zLCBlbmFibGUgNi4xIGFuZCA3LjEgY2hhbm5lbCBvdXRwdXQKICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMsIC0xKTsKIAorICAgIG1EcmNDb21wcmVzc01vZGUgPSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZOworICAgIG1EcmNUYXJnZXRSZWZMZXZlbCA9IERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUw7CisgICAgbURyY0VuY1RhcmdldExldmVsID0gRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTDsKKyAgICBtRHJjQm9vc3RGYWN0b3IgPSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUOworICAgIG1EcmNBdHRlbnVhdGlvbkZhY3RvciA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUOworICAgIG1EcmNFZmZlY3RUeXBlID0gRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1Q7CisgICAgbURyY0FsYnVtTW9kZSA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfQUxCVU07CisgICAgbURyY091dHB1dExvdWRuZXNzID0gRFJDX0RFRkFVTFRfTU9CSUxFX09VVFBVVF9MT1VETkVTUzsKKwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM1OCw2ICszNjgsMjcgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY0RyY1ByZXNlbnRhdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ0RSQ1BSRVNFTlRBVElPTlRZUEUgKmFhY1ByZXNQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDRFJDUFJFU0VOVEFUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgQUxPR0QoImdldCBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY0RyY1ByZXNlbnRhdGlvbiIpOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQcmVzUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRHJjRWZmZWN0VHlwZSA9IG1EcmNFZmZlY3RUeXBlOworICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkRyY0FsYnVtTW9kZSA9IG1EcmNBbGJ1bU1vZGU7CisgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QgPSAgbURyY0Jvb3N0RmFjdG9yOworICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCA9IG1EcmNBdHRlbnVhdGlvbkZhY3RvcjsKKyAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5IZWF2eUNvbXByZXNzaW9uID0gbURyY0NvbXByZXNzTW9kZTsKKyAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCA9IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPSBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgICAgICAgICBhYWNQcmVzUGFyYW1zIC0+bkRyY091dHB1dExvdWRuZXNzID0gbURyY091dHB1dExvdWRuZXNzOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOwogICAgIH0KQEAgLTQ2NCwxMSArNDk1LDEzIEBACiAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkRyY0VmZmVjdFR5cGUgPj0gLTEpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5EcmNFZmZlY3RUeXBlPSVkIiwgYWFjUHJlc1BhcmFtcy0+bkRyY0VmZmVjdFR5cGUpOwogICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19VTklEUkNfU0VUX0VGRkVDVCwgYWFjUHJlc1BhcmFtcy0+bkRyY0VmZmVjdFR5cGUpOworICAgICAgICAgICAgICAgIG1EcmNFZmZlY3RUeXBlID0gYWFjUHJlc1BhcmFtcy0+bkRyY0VmZmVjdFR5cGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkRyY0FsYnVtTW9kZSA+PSAtMSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkRyY0FsYnVtTW9kZT0lZCIsIGFhY1ByZXNQYXJhbXMtPm5EcmNBbGJ1bU1vZGUpOwogICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19VTklEUkNfQUxCVU1fTU9ERSwKICAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5EcmNBbGJ1bU1vZGUpOworICAgICAgICAgICAgICAgIG1EcmNBbGJ1bU1vZGUgPSBhYWNQcmVzUGFyYW1zLT5uRHJjQWxidW1Nb2RlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYm9vbCB1cGRhdGVEcmNXcmFwcGVyID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkRyY0Jvb3N0ID49IDApIHsKQEAgLTQ3NiwzNCArNTA5LDQyIEBACiAgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SLAogICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkRyY0Jvb3N0KTsKICAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRHJjQm9vc3RGYWN0b3IgPSBhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRHJjQ3V0PSVkIiwgYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCk7CiAgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCk7CiAgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICAgICAgbURyY0F0dGVudWF0aW9uRmFjdG9yID0gYWFjUHJlc1BhcmFtcy0+bkRyY0N1dDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uSGVhdnlDb21wcmVzc2lvbiA+PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuSGVhdnlDb21wcmVzc2lvbj0lZCIsIGFhY1ByZXNQYXJhbXMtPm5IZWF2eUNvbXByZXNzaW9uKTsKICAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSwKICAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5IZWF2eUNvbXByZXNzaW9uKTsKICAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRHJjQ29tcHJlc3NNb2RlID0gYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb247CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsID49IC0xKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuVGFyZ2V0UmVmZXJlbmNlTGV2ZWw9JWQiLCBhYWNQcmVzUGFyYW1zLT5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOwogICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwKICAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7CiAgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICAgICAgbURyY1RhcmdldFJlZkxldmVsID0gYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPj0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkVuY29kZWRUYXJnZXRMZXZlbD0lZCIsIGFhY1ByZXNQYXJhbXMtPm5FbmNvZGVkVGFyZ2V0TGV2ZWwpOwogICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCwKICAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5FbmNvZGVkVGFyZ2V0TGV2ZWwpOwogICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIG1EcmNFbmNUYXJnZXRMZXZlbCA9IGFhY1ByZXNQYXJhbXMtPm5FbmNvZGVkVGFyZ2V0TGV2ZWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+blBDTUxpbWl0ZXJFbmFibGUgPj0gMCkgewogICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAoYWFjUHJlc1BhcmFtcy0+blBDTUxpbWl0ZXJFbmFibGUgIT0gMCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMgLT5uRHJjT3V0cHV0TG91ZG5lc3MgIT0gRFJDX0RFRkFVTFRfTU9CSUxFX09VVFBVVF9MT1VETkVTUykgeworICAgICAgICAgICAgICAgIG1EcmNPdXRwdXRMb3VkbmVzcyA9IGFhY1ByZXNQYXJhbXMgLT5uRHJjT3V0cHV0TG91ZG5lc3M7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodXBkYXRlRHJjV3JhcHBlcikgewogICAgICAgICAgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOwogICAgICAgICAgICAgfQpAQCAtODU0LDYgKzg5NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAoIG1EcmNPdXRwdXRMb3VkbmVzcyAhPSBtU3RyZWFtSW5mby0+b3V0cHV0TG91ZG5lc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInVwZGF0ZSBMb3VkbmVzcywgYmVmb3JlID0gJWQsIG5vdyA9ICVkIiwgbURyY091dHB1dExvdWRuZXNzLCBtU3RyZWFtSW5mby0+b3V0cHV0TG91ZG5lc3MpOworICAgICAgICAgICAgICAgICAgICBtRHJjT3V0cHV0TG91ZG5lc3MgPSBtU3RyZWFtSW5mby0+b3V0cHV0TG91ZG5lc3M7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKICAgICAgICAgICAgICAgICAgKiBvciBpbXBsaWNpdGx5LCBhY2NvcmRpbmcgdG8gTVBFRzQgc3BlYy4gQUFDKy9lQUFDKyBpcyBhIGR1YWwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAppbmRleCA1YmVlNzEwLi45Zjk4YWExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCkBAIC04NSw2ICs4NSwxNyBAQAogICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOwogICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3M7CiAgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworCisgICAgLy9kcmMKKyAgICBpbnQzMl90IG1EcmNDb21wcmVzc01vZGU7CisgICAgaW50MzJfdCBtRHJjVGFyZ2V0UmVmTGV2ZWw7CisgICAgaW50MzJfdCBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgaW50MzJfdCBtRHJjQm9vc3RGYWN0b3I7CisgICAgaW50MzJfdCBtRHJjQXR0ZW51YXRpb25GYWN0b3I7CisgICAgaW50MzJfdCBtRHJjRWZmZWN0VHlwZTsKKyAgICBpbnQzMl90IG1EcmNBbGJ1bU1vZGU7CisgICAgaW50MzJfdCBtRHJjT3V0cHV0TG91ZG5lc3M7CisKICAgICBib29sIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOwogICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CiAgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKaW5kZXggYjhlMDBiMy4uOWQwZGExNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApAQCAtMSw3NiArMSwzIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9hX3JlZmwuY3BwIiwKLSAgICAgICAgInNyYy9hZ2MuY3BwIiwKLSAgICAgICAgInNyYy9hbXJkZWNvZGUuY3BwIiwKLSAgICAgICAgInNyYy9iX2NuX2NvZC5jcHAiLAotICAgICAgICAic3JjL2JnbnNjZC5jcHAiLAotICAgICAgICAic3JjL2NfZ19hdmVyLmNwcCIsCi0gICAgICAgICJzcmMvZDEwMzVwZi5jcHAiLAotICAgICAgICAic3JjL2QyXzExcGYuY3BwIiwKLSAgICAgICAgInNyYy9kMl85cGYuY3BwIiwKLSAgICAgICAgInNyYy9kM18xNHBmLmNwcCIsCi0gICAgICAgICJzcmMvZDRfMTdwZi5jcHAiLAotICAgICAgICAic3JjL2Q4XzMxcGYuY3BwIiwKLSAgICAgICAgInNyYy9kX2dhaW5fYy5jcHAiLAotICAgICAgICAic3JjL2RfZ2Fpbl9wLmNwcCIsCi0gICAgICAgICJzcmMvZF9wbHNmLmNwcCIsCi0gICAgICAgICJzcmMvZF9wbHNmXzMuY3BwIiwKLSAgICAgICAgInNyYy9kX3Bsc2ZfNS5jcHAiLAotICAgICAgICAic3JjL2RlY19hbXIuY3BwIiwKLSAgICAgICAgInNyYy9kZWNfZ2Fpbi5jcHAiLAotICAgICAgICAic3JjL2RlY19pbnB1dF9mb3JtYXRfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvZGVjX2xhZzMuY3BwIiwKLSAgICAgICAgInNyYy9kZWNfbGFnNi5jcHAiLAotICAgICAgICAic3JjL2R0eF9kZWMuY3BwIiwKLSAgICAgICAgInNyYy9lY19nYWlucy5jcHAiLAotICAgICAgICAic3JjL2V4X2N0cmwuY3BwIiwKLSAgICAgICAgInNyYy9pZjJfdG9fZXRzLmNwcCIsCi0gICAgICAgICJzcmMvaW50X2xzZi5jcHAiLAotICAgICAgICAic3JjL2xzcF9hdmcuY3BwIiwKLSAgICAgICAgInNyYy9waF9kaXNwLmNwcCIsCi0gICAgICAgICJzcmMvcG9zdF9wcm8uY3BwIiwKLSAgICAgICAgInNyYy9wcmVlbXBoLmNwcCIsCi0gICAgICAgICJzcmMvcHN0ZmlsdC5jcHAiLAotICAgICAgICAic3JjL3FnYWluNDc1X3RhYi5jcHAiLAotICAgICAgICAic3JjL3NwX2RlYy5jcHAiLAotICAgICAgICAic3JjL3dtZl90b19ldHMuY3BwIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKLSAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCi0KLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKLQotICAgIC8vc2FuaXRpemU6IHsKLSAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgIC8vICAgIF0sCi0gICAgLy99LAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICB9LAotfQotCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtNzksOCArNiw2IEBACiAKICAgICBzcmNzOiBbIlNvZnRBTVIuY3BwIl0sCiAKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCiAgICAgXSwKQEAgLTEwNCwzOCArMjksMyBAQAogICAgIF0sCiB9CiAKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY2NfdGVzdCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjX3Rlc3QiLAotICAgIGd0ZXN0OiBmYWxzZSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQotICAgIHNyY3M6IFsidGVzdC9hbXJuYmRlY190ZXN0LmNwcCJdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCi0gICAgICAgICJsaWJzbmRmaWxlIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi0KLSAgICAvL3Nhbml0aXplOiB7Ci0gICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAvLyAgICBdLAotICAgIC8vfSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOTVjZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkFtcm5iRGVjb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotCi0gICAgc3JjczogWwotICAgICAgICAiQW1ybmJEZWNvZGVyVGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgICAgICAibGlic25kZmlsZSIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlMTNhZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMgTWVkaWEgVGVzdGluZyAjIwotLS0tCi0jIyMjIEFNUi1OQiBEZWNvZGVyIDoKLVRoZSBBbXItTmIgRGVjb2RlciBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgYW1ybmIgZGVjb2RlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCi0KLVJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgotYGBgCi1tIEFtcm5iRGVjb2RlclRlc3QKLWBgYAotCi1UaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LwotCi1UaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCi0KLVRvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgotYGBgCi1hZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KLWBgYAotCi1UbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCi1gYGAKLWFkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KLWBgYAotCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9kcml2ZS9mb2xkZXJzLzEzY000dEFhVkZybXItekdGcWFBekZCYktzNzVwbm05YikuIFB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCi1Eb3dubG9hZCBhbXItbmIgZm9sZGVyIGFuZCBwdXNoIGFsbCB0aGUgZmlsZXMgaW4gdGhpcyBmb2xkZXIgdG8gL2RhdGEvbG9jYWwvdG1wLyBvbiB0aGUgZGV2aWNlLgotYGBgCi1hZGIgcHVzaCBhbXItbmIvLiAvZGF0YS9sb2NhbC90bXAvCi1gYGAKLQotdXNhZ2U6IEFtcm5iRGVjb2RlclRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+Ci1gYGAKLWFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvCi1gYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAppbmRleCA3M2ExZDRiLi5iZGQxY2RmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDg3ICsxLDMgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2FtcmVuY29kZS5jcHAiLAotICAgICAgICAic3JjL2F1dG9jb3JyLmNwcCIsCi0gICAgICAgICJzcmMvYzEwMzVwZi5jcHAiLAotICAgICAgICAic3JjL2MyXzExcGYuY3BwIiwKLSAgICAgICAgInNyYy9jMl85cGYuY3BwIiwKLSAgICAgICAgInNyYy9jM18xNHBmLmNwcCIsCi0gICAgICAgICJzcmMvYzRfMTdwZi5jcHAiLAotICAgICAgICAic3JjL2M4XzMxcGYuY3BwIiwKLSAgICAgICAgInNyYy9jYWxjX2Nvci5jcHAiLAotICAgICAgICAic3JjL2NhbGNfZW4uY3BwIiwKLSAgICAgICAgInNyYy9jYnNlYXJjaC5jcHAiLAotICAgICAgICAic3JjL2NsX2x0cC5jcHAiLAotICAgICAgICAic3JjL2NvZF9hbXIuY3BwIiwKLSAgICAgICAgInNyYy9jb252b2x2ZS5jcHAiLAotICAgICAgICAic3JjL2Nvcl9oLmNwcCIsCi0gICAgICAgICJzcmMvY29yX2hfeC5jcHAiLAotICAgICAgICAic3JjL2Nvcl9oX3gyLmNwcCIsCi0gICAgICAgICJzcmMvY29ycndnaHRfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvZHR4X2VuYy5jcHAiLAotICAgICAgICAic3JjL2VuY19sYWczLmNwcCIsCi0gICAgICAgICJzcmMvZW5jX2xhZzYuY3BwIiwKLSAgICAgICAgInNyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwIiwKLSAgICAgICAgInNyYy9ldHNfdG9faWYyLmNwcCIsCi0gICAgICAgICJzcmMvZXRzX3RvX3dtZi5jcHAiLAotICAgICAgICAic3JjL2dfYWRhcHQuY3BwIiwKLSAgICAgICAgInNyYy9nX2NvZGUuY3BwIiwKLSAgICAgICAgInNyYy9nX3BpdGNoLmNwcCIsCi0gICAgICAgICJzcmMvZ2Fpbl9xLmNwcCIsCi0gICAgICAgICJzcmMvaHBfbWF4LmNwcCIsCi0gICAgICAgICJzcmMvaW50ZXJfMzYuY3BwIiwKLSAgICAgICAgInNyYy9pbnRlcl8zNl90YWIuY3BwIiwKLSAgICAgICAgInNyYy9sX2NvbXAuY3BwIiwKLSAgICAgICAgInNyYy9sX2V4dHJhY3QuY3BwIiwKLSAgICAgICAgInNyYy9sX25lZ2F0ZS5jcHAiLAotICAgICAgICAic3JjL2xhZ193aW5kLmNwcCIsCi0gICAgICAgICJzcmMvbGFnX3dpbmRfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvbGV2aW5zb24uY3BwIiwKLSAgICAgICAgInNyYy9scGMuY3BwIiwKLSAgICAgICAgInNyYy9vbF9sdHAuY3BwIiwKLSAgICAgICAgInNyYy9wX29sX3dnaC5jcHAiLAotICAgICAgICAic3JjL3BpdGNoX2ZyLmNwcCIsCi0gICAgICAgICJzcmMvcGl0Y2hfb2wuY3BwIiwKLSAgICAgICAgInNyYy9wcmVfYmlnLmNwcCIsCi0gICAgICAgICJzcmMvcHJlX3Byb2MuY3BwIiwKLSAgICAgICAgInNyYy9wcm0yYml0cy5jcHAiLAotICAgICAgICAic3JjL3FfZ2Fpbl9jLmNwcCIsCi0gICAgICAgICJzcmMvcV9nYWluX3AuY3BwIiwKLSAgICAgICAgInNyYy9xZ2FpbjQ3NS5jcHAiLAotICAgICAgICAic3JjL3FnYWluNzk1LmNwcCIsCi0gICAgICAgICJzcmMvcXVhX2dhaW4uY3BwIiwKLSAgICAgICAgInNyYy9zMTBfOHBmLmNwcCIsCi0gICAgICAgICJzcmMvc2V0X3NpZ24uY3BwIiwKLSAgICAgICAgInNyYy9zaWRfc3luYy5jcHAiLAotICAgICAgICAic3JjL3NwX2VuYy5jcHAiLAotICAgICAgICAic3JjL3NwcmVwcm9jLmNwcCIsCi0gICAgICAgICJzcmMvc3BzdHByb2MuY3BwIiwKLSAgICAgICAgInNyYy90b25fc3RhYi5jcHAiLAotICAgIF0sCi0KLSAgICBoZWFkZXJfbGliczogWyJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKLQotICAgIC8vYWRkcmVzc2luZyBiLzI1NDA5NzQ0Ci0gICAgLy9zYW5pdGl6ZTogewotICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgLy8gICAgXSwKLSAgICAvL30sCi0KLSAgICBzaGFyZWRfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iXSwKLX0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTkxLDggKzcsNiBAQAogCiAgICAgc3JjczogWyJTb2Z0QU1STkJFbmNvZGVyLmNwcCJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotCiAgICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKICAgICAvL3Nhbml0aXplOiB7CiAgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKQEAgLTEwNywyNiArMjEsMyBAQAogICAgIF0sCiB9CiAKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmNfdGVzdCIsCi0gICAgZ3Rlc3Q6IGZhbHNlLAotCi0gICAgc3JjczogWyJ0ZXN0L2Ftcm5iX2VuY190ZXN0LmNwcCJdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIl0sCi0KLSAgICBzaGFyZWRfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iXSwKLQotICAgIC8vYWRkcmVzc2luZyBiLzI1NDA5NzQ0Ci0gICAgLy9zYW5pdGl6ZTogewotICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgLy8gICAgXSwKLSAgICAvL30sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZGE1ODkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgM0dQUCBzdGFuZGFyZDoKLQotICAgIDNHUFAgVFMgMjYuMDczCi0gICAgQU5TSS1DIGNvZGUgZm9yIHRoZSBBZGFwdGl2ZSBNdWx0aS1SYXRlIChBTVIpIHNwZWVjaCBjb2RlYwotICAgIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuM2dwcC5vcmcKLQotKEMpIDIwMDQsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRUQSwgVFRDKQotUGVybWlzc2lvbiB0byBkaXN0cmlidXRlLCBtb2RpZnkgYW5kIHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHN0YW5kYXJkIGxpY2Vuc2UKLXRlcm1zIGxpc3RlZCBhYm92ZSBoYXMgYmVlbiBvYnRhaW5lZCBmcm9tIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0KLSBQYXRobmFtZTogLi9hdWRpby9nc20tYW1yL2Mvc3JjL3FnYWluNDc1LmMKLSBGdW50aW9uczogTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cwotICAgICAgICAgICBNUjQ3NV91cGRhdGVfdW5xX3ByZWQKLSAgICAgICAgICAgTVI0NzVfZ2Fpbl9xdWFudAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBNT0RVTEUgREVTQ1JJUFRJT04KLQotIFRoZXNlIG1vZHVsZXMgaGFuZGxlIHRoZSBxdWFudGl6YXRpb24gb2YgcGl0Y2ggYW5kIGNvZGVib29rIGdhaW5zIGZvciBNUjQ3NS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAicWdhaW40NzUuaCIKLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJtb2RlLmgiCi0jaW5jbHVkZSAiY25zdC5oIgotI2luY2x1ZGUgInBvdzIuaCIKLSNpbmNsdWRlICJsb2cyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBNUjQ3NV9WUV9TSVpFIDI1NgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFZBUklBQkxFIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGUgdGFibGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkYXRhOgotICoKLSAqICAgIGdfcGl0Y2goMCkgICAgICAgIChRMTQpIC8vIGZvciBzdWItCi0gKiAgICBnX2ZhYygwKSAgICAgICAgICAoUTEyKSAvLyBmcmFtZSAwIGFuZCAyCi0gKiAgICBnX3BpdGNoKDEpICAgICAgICAoUTE0KSAvLyBmb3Igc3ViLQotICogICAgZ19mYWMoMikgICAgICAgICAgKFExMikgLy8gZnJhbWUgMSBhbmQgMwotICoKLSAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiB0YWJsZV9nYWluX01SNDc1W01SNDc1X1ZRX1NJWkUqNF0gPQotewotICAgIC8qZ19waXQoMCksIGdfZmFjKDApLCAgICAgIGdfcGl0KDEpLCBnX2ZhYygxKSAqLwotICAgIDgxMiwgICAgICAgICAgMTI4LCAgICAgICAgICAgNTQyLCAgICAgIDE0MCwKLSAgICAyODczLCAgICAgICAgIDExMzUsICAgICAgICAgIDIyNjYsICAgICAzNDAyLAotICAgIDIwNjcsICAgICAgICAgIDU2MywgICAgICAgICAxMjY3NywgICAgICA2NDcsCi0gICAgNDEzMiwgICAgICAgICAxNzk4LCAgICAgICAgICA1NjAxLCAgICAgNTI4NSwKLSAgICA3Njg5LCAgICAgICAgICAzNzQsICAgICAgICAgIDM3MzUsICAgICAgNDQxLAotICAgIDEwOTEyLCAgICAgICAgIDI2MzgsICAgICAgICAgMTE4MDcsICAgICAyNDk0LAotICAgIDIwNDkwLCAgICAgICAgICA3OTcsICAgICAgICAgIDUyMTgsICAgICAgNjc1LAotICAgIDY3MjQsICAgICAgICAgODM1NCwgICAgICAgICAgNTI4MiwgICAgIDE2OTYsCi0gICAgMTQ4OCwgICAgICAgICAgNDI4LCAgICAgICAgICA1ODgyLCAgICAgIDQ1MiwKLSAgICA1MzMyLCAgICAgICAgIDQwNzIsICAgICAgICAgIDM1ODMsICAgICAxMjY4LAotICAgIDI0NjksICAgICAgICAgIDkwMSwgICAgICAgICAxNTg5NCwgICAgIDEwMDUsCi0gICAgMTQ5ODIsICAgICAgICAgMzI3MSwgICAgICAgICAxMDMzMSwgICAgIDQ4NTgsCi0gICAgMzYzNSwgICAgICAgICAyMDIxLCAgICAgICAgICAyNTk2LCAgICAgIDgzNSwKLSAgICAxMjM2MCwgICAgICAgICA0ODkyLCAgICAgICAgIDEyMjA2LCAgICAgMTcwNCwKLSAgICAxMzQzMiwgICAgICAgICAxNjA0LCAgICAgICAgICA5MTE4LCAgICAgMjM0MSwKLSAgICAzOTY4LCAgICAgICAgIDE1MzgsICAgICAgICAgIDU0NzksICAgICA5OTM2LAotICAgIDM3OTUsICAgICAgICAgIDQxNywgICAgICAgICAgMTM1OSwgICAgICA0MTQsCi0gICAgMzY0MCwgICAgICAgICAxNTY5LCAgICAgICAgICA3OTk1LCAgICAgMzU0MSwKLSAgICAxMTQwNSwgICAgICAgICAgNjQ1LCAgICAgICAgICA4NTUyLCAgICAgIDYzNSwKLSAgICA0MDU2LCAgICAgICAgIDEzNzcsICAgICAgICAgMTY2MDgsICAgICA2MTI0LAotICAgIDExNDIwLCAgICAgICAgICA3MDAsICAgICAgICAgIDIwMDcsICAgICAgNjA3LAotICAgIDEyNDE1LCAgICAgICAgIDE1NzgsICAgICAgICAgMTExMTksICAgICA0NjU0LAotICAgIDEzNjgwLCAgICAgICAgIDE3MDgsICAgICAgICAgMTE5OTAsICAgICAxMjI5LAotICAgIDc5OTYsICAgICAgICAgNzI5NywgICAgICAgICAxMzIzMSwgICAgIDU3MTUsCi0gICAgMjQyOCwgICAgICAgICAxMTU5LCAgICAgICAgICAyMDczLCAgICAgMTk0MSwKLSAgICA2MjE4LCAgICAgICAgIDYxMjEsICAgICAgICAgIDM1NDYsICAgICAxODA0LAotICAgIDg5MjUsICAgICAgICAgMTgwMiwgICAgICAgICAgODY3OSwgICAgIDE1ODAsCi0gICAgMTM5MzUsICAgICAgICAgMzU3NiwgICAgICAgICAxMzMxMywgICAgIDYyMzcsCi0gICAgNjE0MiwgICAgICAgICAxMTMwLCAgICAgICAgICA1OTk0LCAgICAgMTczNCwKLSAgICAxNDE0MSwgICAgICAgICA0NjYyLCAgICAgICAgIDExMjcxLCAgICAgMzMyMSwKLSAgICAxMjIyNiwgICAgICAgICAxNTUxLCAgICAgICAgIDEzOTMxLCAgICAgMzAxNSwKLSAgICA1MDgxLCAgICAgICAgMTA0NjQsICAgICAgICAgIDk0NDQsICAgICA2NzA2LAotICAgIDE2ODksICAgICAgICAgIDY4MywgICAgICAgICAgMTQzNiwgICAgIDEzMDYsCi0gICAgNzIxMiwgICAgICAgICAzOTMzLCAgICAgICAgICA0MDgyLCAgICAgMjcxMywKLSAgICA3NzkzLCAgICAgICAgICA3MDQsICAgICAgICAgMTUwNzAsICAgICAgODAyLAotICAgIDYyOTksICAgICAgICAgNTIxMiwgICAgICAgICAgNDMzNywgICAgIDUzNTcsCi0gICAgNjY3NiwgICAgICAgICAgNTQxLCAgICAgICAgICA2MDYyLCAgICAgIDYyNiwKLSAgICAxMzY1MSwgICAgICAgICAzNzAwLCAgICAgICAgIDExNDk4LCAgICAgMjQwOCwKLSAgICAxNjE1NiwgICAgICAgICAgNzE2LCAgICAgICAgIDEyMTc3LCAgICAgIDc1MSwKLSAgICA4MDY1LCAgICAgICAgMTE0ODksICAgICAgICAgIDYzMTQsICAgICAyMjU2LAotICAgIDQ0NjYsICAgICAgICAgIDQ5NiwgICAgICAgICAgNzI5MywgICAgICA1MjMsCi0gICAgMTAyMTMsICAgICAgICAgMzgzMywgICAgICAgICAgODM5NCwgICAgIDMwMzcsCi0gICAgODQwMywgICAgICAgICAgOTY2LCAgICAgICAgIDE0MjI4LCAgICAgMTg4MCwKLSAgICA4NzAzLCAgICAgICAgIDU0MDksICAgICAgICAgMTYzOTUsICAgICA0ODYzLAotICAgIDc0MjAsICAgICAgICAgMTk3OSwgICAgICAgICAgNjA4OSwgICAgIDEyMzAsCi0gICAgOTM3MSwgICAgICAgICA0Mzk4LCAgICAgICAgIDE0NTU4LCAgICAgMzM2MywKLSAgICAxMzU1OSwgICAgICAgICAyODczLCAgICAgICAgIDEzMTYzLCAgICAgMTQ2NSwKLSAgICA1NTM0LCAgICAgICAgIDE2NzgsICAgICAgICAgMTMxMzgsICAgIDE0NzcxLAotICAgIDczMzgsICAgICAgICAgIDYwMCwgICAgICAgICAgMTMxOCwgICAgICA1NDgsCi0gICAgNDI1MiwgICAgICAgICAzNTM5LCAgICAgICAgIDEwMDQ0LCAgICAgMjM2NCwKLSAgICAxMDU4NywgICAgICAgICAgNjIyLCAgICAgICAgIDEzMDg4LCAgICAgIDY2OSwKLSAgICAxNDEyNiwgICAgICAgICAzNTI2LCAgICAgICAgICA1MDM5LCAgICAgOTc4NCwKLSAgICAxNTMzOCwgICAgICAgICAgNjE5LCAgICAgICAgICAzMTE1LCAgICAgIDU5MCwKLSAgICAxNjQ0MiwgICAgICAgICAzMDEzLCAgICAgICAgIDE1NTQyLCAgICAgNDE2OCwKLSAgICAxNTUzNywgICAgICAgICAxNjExLCAgICAgICAgIDE1NDA1LCAgICAgMTIyOCwKLSAgICAxNjAyMywgICAgICAgICA5Mjk5LCAgICAgICAgICA3NTM0LCAgICAgNDk3NiwKLSAgICAxOTkwLCAgICAgICAgIDEyMTMsICAgICAgICAgMTE0NDcsICAgICAxMTU3LAotICAgIDEyNTEyLCAgICAgICAgIDU1MTksICAgICAgICAgIDk0NzUsICAgICAyNjQ0LAotICAgIDc3MTYsICAgICAgICAgMjAzNCwgICAgICAgICAxMzI4MCwgICAgIDIyMzksCi0gICAgMTYwMTEsICAgICAgICAgNTA5MywgICAgICAgICAgODA2NiwgICAgIDY3NjEsCi0gICAgMTAwODMsICAgICAgICAgMTQxMywgICAgICAgICAgNTAwMiwgICAgIDIzNDcsCi0gICAgMTI1MjMsICAgICAgICAgNTk3NSwgICAgICAgICAxNTEyNiwgICAgIDI4OTksCi0gICAgMTgyNjQsICAgICAgICAgMjI4OSwgICAgICAgICAxNTgyNywgICAgIDI1MjcsCi0gICAgMTYyNjUsICAgICAgICAxMDI1NCwgICAgICAgICAxNDY1MSwgICAgMTEzMTksCi0gICAgMTc5NywgICAgICAgICAgMzM3LCAgICAgICAgICAzMTE1LCAgICAgIDM5NywKLSAgICAzNTEwLCAgICAgICAgIDI5MjgsICAgICAgICAgIDQ1OTIsICAgICAyNjcwLAotICAgIDc1MTksICAgICAgICAgIDYyOCwgICAgICAgICAxMTQxNSwgICAgICA2NTYsCi0gICAgNTk0NiwgICAgICAgICAyNDM1LCAgICAgICAgICA2NTQ0LCAgICAgNzM2NywKLSAgICA4MjM4LCAgICAgICAgICA4MjksICAgICAgICAgIDQwMDAsICAgICAgODYzLAotICAgIDEwMDMyLCAgICAgICAgIDI0OTIsICAgICAgICAgMTYwNTcsICAgICAzNTUxLAotICAgIDE4MjA0LCAgICAgICAgIDEwNTQsICAgICAgICAgIDYxMDMsICAgICAxNDU0LAotICAgIDU4ODQsICAgICAgICAgNzkwMCwgICAgICAgICAxODc1MiwgICAgIDM0NjgsCi0gICAgMTg2NCwgICAgICAgICAgNTQ0LCAgICAgICAgICA5MTk4LCAgICAgIDY4MywKLSAgICAxMTYyMywgICAgICAgICA0MTYwLCAgICAgICAgICA0NTk0LCAgICAgMTY0NCwKLSAgICAzMTU4LCAgICAgICAgIDExNTcsICAgICAgICAgMTU5NTMsICAgICAyNTYwLAotICAgIDEyMzQ5LCAgICAgICAgIDM3MzMsICAgICAgICAgMTc0MjAsICAgICA1MjYwLAotICAgIDYxMDYsICAgICAgICAgMjAwNCwgICAgICAgICAgMjkxNywgICAgIDE3NDIsCi0gICAgMTY0NjcsICAgICAgICAgNTI1NywgICAgICAgICAxNjc4NywgICAgIDE2ODAsCi0gICAgMTcyMDUsICAgICAgICAgMTc1OSwgICAgICAgICAgNDc3MywgICAgIDMyMzEsCi0gICAgNzM4NiwgICAgICAgICA2MDM1LCAgICAgICAgIDE0MzQyLCAgICAxMDAxMiwKLSAgICA0MDM1LCAgICAgICAgICA0NDIsICAgICAgICAgIDQxOTQsICAgICAgNDU4LAotICAgIDkyMTQsICAgICAgICAgMjI0MiwgICAgICAgICAgNzQyNywgICAgIDQyMTcsCi0gICAgMTI4NjAsICAgICAgICAgIDgwMSwgICAgICAgICAxMTE4NiwgICAgICA4MjUsCi0gICAgMTI2NDgsICAgICAgICAgMjA4NCwgICAgICAgICAxMjk1NiwgICAgIDY1NTQsCi0gICAgOTUwNSwgICAgICAgICAgOTk2LCAgICAgICAgICA2NjI5LCAgICAgIDk4NSwKLSAgICAxMDUzNywgICAgICAgICAyNTAyLCAgICAgICAgIDE1Mjg5LCAgICAgNTAwNiwKLSAgICAxMjYwMiwgICAgICAgICAyMDU1LCAgICAgICAgIDE1NDg0LCAgICAgMTY1MywKLSAgICAxNjE5NCwgICAgICAgICA2OTIxLCAgICAgICAgIDE0MjMxLCAgICAgNTc5MCwKLSAgICAyNjI2LCAgICAgICAgICA4MjgsICAgICAgICAgIDU2MTUsICAgICAxNjg2LAotICAgIDEzNjYzLCAgICAgICAgIDU3NzgsICAgICAgICAgIDM2NjgsICAgICAxNTU0LAotICAgIDExMzEzLCAgICAgICAgIDI2MzMsICAgICAgICAgIDk3NzAsICAgICAxNDU5LAotICAgIDE0MDAzLCAgICAgICAgIDQ3MzMsICAgICAgICAgMTU4OTcsICAgICA2MjkxLAotICAgIDYyNzgsICAgICAgICAgMTg3MCwgICAgICAgICAgNzkxMCwgICAgIDIyODUsCi0gICAgMTY5NzgsICAgICAgICAgNDU3MSwgICAgICAgICAxNjU3NiwgICAgIDM4NDksCi0gICAgMTUyNDgsICAgICAgICAgMjMxMSwgICAgICAgICAxNjAyMywgICAgIDMyNDQsCi0gICAgMTQ0NTksICAgICAgICAxNzgwOCwgICAgICAgICAxMTg0NywgICAgIDI3NjMsCi0gICAgMTk4MSwgICAgICAgICAxNDA3LCAgICAgICAgICAxNDAwLCAgICAgIDg3NiwKLSAgICA0MzM1LCAgICAgICAgIDM1NDcsICAgICAgICAgIDQzOTEsICAgICA0MjEwLAotICAgIDU0MDUsICAgICAgICAgIDY4MCwgICAgICAgICAxNzQ2MSwgICAgICA3ODEsCi0gICAgNjUwMSwgICAgICAgICA1MTE4LCAgICAgICAgICA4MDkxLCAgICAgNzY3NywKLSAgICA3MzU1LCAgICAgICAgICA3OTQsICAgICAgICAgIDgzMzMsICAgICAxMTgyLAotICAgIDE1MDQxLCAgICAgICAgIDMxNjAsICAgICAgICAgMTQ5MjgsICAgICAzMDM5LAotICAgIDIwNDIxLCAgICAgICAgICA4ODAsICAgICAgICAgMTQ1NDUsICAgICAgODUyLAotICAgIDEyMzM3LCAgICAgICAgMTQ3MDgsICAgICAgICAgIDY5MDQsICAgICAxOTIwLAotICAgIDQyMjUsICAgICAgICAgIDkzMywgICAgICAgICAgODIxOCwgICAgIDEwODcsCi0gICAgMTA2NTksICAgICAgICAgNDA4NCwgICAgICAgICAxMDA4MiwgICAgIDQ1MzMsCi0gICAgMjczNSwgICAgICAgICAgODQwLCAgICAgICAgIDIwNjU3LCAgICAgMTA4MSwKLSAgICAxNjcxMSwgICAgICAgICA1OTY2LCAgICAgICAgIDE1ODczLCAgICAgNDU3OCwKLSAgICAxMDg3MSwgICAgICAgICAyNTc0LCAgICAgICAgICAzNzczLCAgICAgMTE2NiwKLSAgICAxNDUxOSwgICAgICAgICA0MDQ0LCAgICAgICAgIDIwNjk5LCAgICAgMjYyNywKLSAgICAxNTIxOSwgICAgICAgICAyNzM0LCAgICAgICAgIDE1Mjc0LCAgICAgMjE4NiwKLSAgICA2MjU3LCAgICAgICAgIDMyMjYsICAgICAgICAgMTMxMjUsICAgIDE5NDgwLAotICAgIDcxOTYsICAgICAgICAgIDkzMCwgICAgICAgICAgMjQ2MiwgICAgIDE2MTgsCi0gICAgNDUxNSwgICAgICAgICAzMDkyLCAgICAgICAgIDEzODUyLCAgICAgNDI3NywKLSAgICAxMDQ2MCwgICAgICAgICAgODMzLCAgICAgICAgIDE3MzM5LCAgICAgIDgxMCwKLSAgICAxNjg5MSwgICAgICAgICAyMjg5LCAgICAgICAgIDE1NTQ2LCAgICAgODIxNywKLSAgICAxMzYwMywgICAgICAgICAxNjg0LCAgICAgICAgICAzMTk3LCAgICAgMTgzNCwKLSAgICAxNTk0OCwgICAgICAgICAyODIwLCAgICAgICAgIDE1ODEyLCAgICAgNTMyNywKLSAgICAxNzAwNiwgICAgICAgICAyNDM4LCAgICAgICAgIDE2Nzg4LCAgICAgMTMyNiwKLSAgICAxNTY3MSwgICAgICAgICA4MTU2LCAgICAgICAgIDExNzI2LCAgICAgODU1NiwKLSAgICAzNzYyLCAgICAgICAgIDIwNTMsICAgICAgICAgIDk1NjMsICAgICAxMzE3LAotICAgIDEzNTYxLCAgICAgICAgIDY3OTAsICAgICAgICAgMTIyMjcsICAgICAxOTM2LAotICAgIDgxODAsICAgICAgICAgMzU1MCwgICAgICAgICAxMzI4NywgICAgIDE3NzgsCi0gICAgMTYyOTksICAgICAgICAgNjU5OSwgICAgICAgICAxNjI5MSwgICAgIDc3NTgsCi0gICAgODUyMSwgICAgICAgICAyNTUxLCAgICAgICAgICA3MjI1LCAgICAgMjY0NSwKLSAgICAxODI2OSwgICAgICAgICA3NDg5LCAgICAgICAgIDE2ODg1LCAgICAgMjI0OCwKLSAgICAxNzg4MiwgICAgICAgICAyODg0LCAgICAgICAgIDE3MjY1LCAgICAgMzMyOCwKLSAgICA5NDE3LCAgICAgICAgMjAxNjIsICAgICAgICAgMTEwNDIsICAgICA4MzIwLAotICAgIDEyODYsICAgICAgICAgIDYyMCwgICAgICAgICAgMTQzMSwgICAgICA1ODMsCi0gICAgNTk5MywgICAgICAgICAyMjg5LCAgICAgICAgICAzOTc4LCAgICAgMzYyNiwKLSAgICA1MTQ0LCAgICAgICAgICA3NTIsICAgICAgICAgMTM0MDksICAgICAgODMwLAotICAgIDU1NTMsICAgICAgICAgMjg2MCwgICAgICAgICAxMTc2NCwgICAgIDU5MDgsCi0gICAgMTA3MzcsICAgICAgICAgIDU2MCwgICAgICAgICAgNTQ0NiwgICAgICA1NjQsCi0gICAgMTMzMjEsICAgICAgICAgMzAwOCwgICAgICAgICAxMTk0NiwgICAgIDM2ODMsCi0gICAgMTk4ODcsICAgICAgICAgIDc5OCwgICAgICAgICAgOTgyNSwgICAgICA3MjgsCi0gICAgMTM2NjMsICAgICAgICAgODc0OCwgICAgICAgICAgNzM5MSwgICAgIDMwNTMsCi0gICAgMjUxNSwgICAgICAgICAgNzc4LCAgICAgICAgICA2MDUwLCAgICAgIDgzMywKLSAgICA2NDY5LCAgICAgICAgIDUwNzQsICAgICAgICAgIDgzMDUsICAgICAyNDYzLAotICAgIDYxNDEsICAgICAgICAgMTg2NSwgICAgICAgICAxNTMwOCwgICAgIDEyNjIsCi0gICAgMTQ0MDgsICAgICAgICAgNDU0NywgICAgICAgICAxMzY2MywgICAgIDQ1MTUsCi0gICAgMzEzNywgICAgICAgICAyOTgzLCAgICAgICAgICAyNDc5LCAgICAgMTI1OSwKLSAgICAxNTA4OCwgICAgICAgICA0NjQ3LCAgICAgICAgIDE1MzgyLCAgICAgMjYwNywKLSAgICAxNDQ5MiwgICAgICAgICAyMzkyLCAgICAgICAgIDEyNDYyLCAgICAgMjUzNywKLSAgICA3NTM5LCAgICAgICAgIDI5NDksICAgICAgICAgMTI5MDksICAgIDEyMDYwLAotICAgIDU0NjgsICAgICAgICAgIDY4NCwgICAgICAgICAgMzE0MSwgICAgICA3MjIsCi0gICAgNTA4MSwgICAgICAgICAxMjc0LCAgICAgICAgIDEyNzMyLCAgICAgNDIwMCwKLSAgICAxNTMwMiwgICAgICAgICAgNjgxLCAgICAgICAgICA3ODE5LCAgICAgIDU5MiwKLSAgICA2NTM0LCAgICAgICAgIDIwMjEsICAgICAgICAgMTY0NzgsICAgICA4NzM3LAotICAgIDEzMzY0LCAgICAgICAgICA4ODIsICAgICAgICAgIDUzOTcsICAgICAgODk5LAotICAgIDE0NjU2LCAgICAgICAgIDIxNzgsICAgICAgICAgMTQ3NDEsICAgICA0MjI3LAotICAgIDE0MjcwLCAgICAgICAgIDEyOTgsICAgICAgICAgMTM5MjksICAgICAyMDI5LAotICAgIDE1NDc3LCAgICAgICAgIDc0ODIsICAgICAgICAgMTU4MTUsICAgICA0NTcyLAotICAgIDI1MjEsICAgICAgICAgMjAxMywgICAgICAgICAgNTA2MiwgICAgIDE4MDQsCi0gICAgNTE1OSwgICAgICAgICA2NTgyLCAgICAgICAgICA3MTMwLCAgICAgMzU5NywKLSAgICAxMDkyMCwgICAgICAgICAxNjExLCAgICAgICAgIDExNzI5LCAgICAgMTcwOCwKLSAgICAxNjkwMywgICAgICAgICAzNDU1LCAgICAgICAgIDE2MjY4LCAgICAgNjY0MCwKLSAgICA5MzA2LCAgICAgICAgIDEwMDcsICAgICAgICAgIDkzNjksICAgICAyMTA2LAotICAgIDE5MTgyLCAgICAgICAgIDUwMzcsICAgICAgICAgMTI0NDEsICAgICA0MjY5LAotICAgIDE1OTE5LCAgICAgICAgIDEzMzIsICAgICAgICAgMTUzNTcsICAgICAzNTEyLAotICAgIDExODk4LCAgICAgICAgMTQxNDEsICAgICAgICAgMTYxMDEsICAgICA2ODU0LAotICAgIDIwMTAsICAgICAgICAgIDczNywgICAgICAgICAgMzc3OSwgICAgICA4NjEsCi0gICAgMTE0NTQsICAgICAgICAgMjg4MCwgICAgICAgICAgMzU2NCwgICAgIDM1NDAsCi0gICAgOTA1NywgICAgICAgICAxMjQxLCAgICAgICAgIDEyMzkxLCAgICAgIDg5NiwKLSAgICA4NTQ2LCAgICAgICAgIDQ2MjksICAgICAgICAgMTE1NjEsICAgICA1Nzc2LAotICAgIDgxMjksICAgICAgICAgIDU4OSwgICAgICAgICAgODIxOCwgICAgICA1ODgsCi0gICAgMTg3MjgsICAgICAgICAgMzc1NSwgICAgICAgICAxMjk3MywgICAgIDMxNDksCi0gICAgMTU3MjksICAgICAgICAgIDc1OCwgICAgICAgICAxNjYzNCwgICAgICA3NTQsCi0gICAgMTUyMjIsICAgICAgICAxMTEzOCwgICAgICAgICAxNTg3MSwgICAgIDIyMDgsCi0gICAgNDY3MywgICAgICAgICAgNjEwLCAgICAgICAgIDEwMjE4LCAgICAgIDY3OCwKLSAgICAxNTI1NywgICAgICAgICA0MTQ2LCAgICAgICAgICA1NzI5LCAgICAgMzMyNywKLSAgICA4Mzc3LCAgICAgICAgIDE2NzAsICAgICAgICAgMTk4NjIsICAgICAyMzIxLAotICAgIDE1NDUwLCAgICAgICAgIDU1MTEsICAgICAgICAgMTQwNTQsICAgICA1NDgxLAotICAgIDU3MjgsICAgICAgICAgMjg4OCwgICAgICAgICAgNzU4MCwgICAgIDEzNDYsCi0gICAgMTQzODQsICAgICAgICAgNTMyNSwgICAgICAgICAxNjIzNiwgICAgIDM5NTAsCi0gICAgMTUxMTgsICAgICAgICAgMzc0NCwgICAgICAgICAxNTMwNiwgICAgIDE0MzUsCi0gICAgMTQ1OTcsICAgICAgICAgNDA3MCwgICAgICAgICAxMjMwMSwgICAgMTU2OTYsCi0gICAgNzYxNywgICAgICAgICAxNjk5LCAgICAgICAgICAyMTcwLCAgICAgIDg4NCwKLSAgICA0NDU5LCAgICAgICAgIDQ1NjcsICAgICAgICAgMTgwOTQsICAgICAzMzA2LAotICAgIDEyNzQyLCAgICAgICAgICA4MTUsICAgICAgICAgMTQ5MjYsICAgICAgOTA3LAotICAgIDE1MDE2LCAgICAgICAgIDQyODEsICAgICAgICAgMTU1MTgsICAgICA4MzY4LAotICAgIDE3OTk0LCAgICAgICAgIDEwODcsICAgICAgICAgIDIzNTgsICAgICAgODY1LAotICAgIDE2MjgxLCAgICAgICAgIDM3ODcsICAgICAgICAgMTU2NzksICAgICA0NTk2LAotICAgIDE2MzU2LCAgICAgICAgIDE1MzQsICAgICAgICAgMTY1ODQsICAgICAyMjEwLAotICAgIDE2ODMzLCAgICAgICAgIDk2OTcsICAgICAgICAgMTU5MjksICAgICA0NTEzLAotICAgIDMyNzcsICAgICAgICAgMTA4NSwgICAgICAgICAgOTY0MywgICAgIDIxODcsCi0gICAgMTE5NzMsICAgICAgICAgNjA2OCwgICAgICAgICAgOTE5OSwgICAgIDQ0NjIsCi0gICAgODk1NSwgICAgICAgICAxNjI5LCAgICAgICAgIDEwMjg5LCAgICAgMzA2MiwKLSAgICAxNjQ4MSwgICAgICAgICA1MTU1LCAgICAgICAgIDE1NDY2LCAgICAgNzA2NiwKLSAgICAxMzY3OCwgICAgICAgICAyNTQzLCAgICAgICAgICA1MjczLCAgICAgMjI3NywKLSAgICAxNjc0NiwgICAgICAgICA2MjEzLCAgICAgICAgIDE2NjU1LCAgICAgMzQwOCwKLSAgICAyMDMwNCwgICAgICAgICAzMzYzLCAgICAgICAgIDE4Njg4LCAgICAgMTk4NSwKLSAgICAxNDE3MiwgICAgICAgIDEyODY3LCAgICAgICAgIDE1MTU0LCAgICAxNTcwMywKLSAgICA0NDczLCAgICAgICAgIDEwMjAsICAgICAgICAgIDE2ODEsICAgICAgODg2LAotICAgIDQzMTEsICAgICAgICAgNDMwMSwgICAgICAgICAgODk1MiwgICAgIDM2NTcsCi0gICAgNTg5MywgICAgICAgICAxMTQ3LCAgICAgICAgIDExNjQ3LCAgICAgMTQ1MiwKLSAgICAxNTg4NiwgICAgICAgICAyMjI3LCAgICAgICAgICA0NTgyLCAgICAgNjY0NCwKLSAgICA2OTI5LCAgICAgICAgIDEyMDUsICAgICAgICAgIDYyMjAsICAgICAgNzk5LAotICAgIDEyNDE1LCAgICAgICAgIDM0MDksICAgICAgICAgMTU5NjgsICAgICAzODc3LAotICAgIDE5ODU5LCAgICAgICAgIDIxMDksICAgICAgICAgIDk2ODksICAgICAyMTQxLAotICAgIDE0NzQyLCAgICAgICAgIDg4MzAsICAgICAgICAgMTQ0ODAsICAgICAyNTk5LAotICAgIDE4MTcsICAgICAgICAgMTIzOCwgICAgICAgICAgNzc3MSwgICAgICA4MTMsCi0gICAgMTkwNzksICAgICAgICAgNDQxMCwgICAgICAgICAgNTU1NCwgICAgIDIwNjQsCi0gICAgMzY4NywgICAgICAgICAyODQ0LCAgICAgICAgIDE3NDM1LCAgICAgMjI1NiwKLSAgICAxNjY5NywgICAgICAgICA0NDg2LCAgICAgICAgIDE2MTk5LCAgICAgNTM4OCwKLSAgICA4MDI4LCAgICAgICAgIDI3NjMsICAgICAgICAgIDM0MDUsICAgICAyMTE5LAotICAgIDE3NDI2LCAgICAgICAgIDU0NzcsICAgICAgICAgMTM2OTgsICAgICAyNzg2LAotICAgIDE5ODc5LCAgICAgICAgIDI3MjAsICAgICAgICAgIDkwOTgsICAgICAzODgwLAotICAgIDE4MTcyLCAgICAgICAgIDQ4MzMsICAgICAgICAgMTczMzYsICAgIDEyMjA3LAotICAgIDUxMTYsICAgICAgICAgIDk5NiwgICAgICAgICAgNDkzNSwgICAgICA5ODgsCi0gICAgOTg4OCwgICAgICAgICAzMDgxLCAgICAgICAgICA2MDE0LCAgICAgNTM3MSwKLSAgICAxNTg4MSwgICAgICAgICAxNjY3LCAgICAgICAgICA4NDA1LCAgICAgMTE4MywKLSAgICAxNTA4NywgICAgICAgICAyMzY2LCAgICAgICAgIDE5Nzc3LCAgICAgNzAwMiwKLSAgICAxMTk2MywgICAgICAgICAxNTYyLCAgICAgICAgICA3Mjc5LCAgICAgMTEyOCwKLSAgICAxNjg1OSwgICAgICAgICAxNTMyLCAgICAgICAgIDE1NzYyLCAgICAgNTM4MSwKLSAgICAxNDcwOCwgICAgICAgICAyMDY1LCAgICAgICAgIDIwMTA1LCAgICAgMjE1NSwKLSAgICAxNzE1OCwgICAgICAgICA4MjQ1LCAgICAgICAgIDE3OTExLCAgICAgNjMxOCwKLSAgICA1NDY3LCAgICAgICAgIDE1MDQsICAgICAgICAgIDQxMDAsICAgICAyNTc0LAotICAgIDE3NDIxLCAgICAgICAgIDY4MTAsICAgICAgICAgIDU2NzMsICAgICAyODg4LAotICAgIDE2NjM2LCAgICAgICAgIDMzODIsICAgICAgICAgIDg5NzUsICAgICAxODMxLAotICAgIDIwMTU5LCAgICAgICAgIDQ3MzcsICAgICAgICAgMTk1NTAsICAgICA3Mjk0LAotICAgIDY2NTgsICAgICAgICAgMjc4MSwgICAgICAgICAxMTQ3MiwgICAgIDMzMjEsCi0gICAgMTkzOTcsICAgICAgICAgNTA1NCwgICAgICAgICAxODg3OCwgICAgIDQ3MjIsCi0gICAgMTY0MzksICAgICAgICAgMjM3MywgICAgICAgICAyMDQzMCwgICAgIDQzODYsCi0gICAgMTEzNTMsICAgICAgICAyNjUyNiwgICAgICAgICAxMTU5MywgICAgIDMwNjgsCi0gICAgMjg2NiwgICAgICAgICAxNTY2LCAgICAgICAgICA1MTA4LCAgICAgMTA3MCwKLSAgICA5NjE0LCAgICAgICAgIDQ5MTUsICAgICAgICAgIDQ5MzksICAgICAzNTM2LAotICAgIDc1NDEsICAgICAgICAgIDg3OCwgICAgICAgICAyMDcxNywgICAgICA4NTEsCi0gICAgNjkzOCwgICAgICAgICA0Mzk1LCAgICAgICAgIDE2Nzk5LCAgICAgNzczMywKLSAgICAxMDEzNywgICAgICAgICAxMDE5LCAgICAgICAgICA5ODQ1LCAgICAgIDk2NCwKLSAgICAxNTQ5NCwgICAgICAgICAzOTU1LCAgICAgICAgIDE1NDU5LCAgICAgMzQzMCwKLSAgICAxODg2MywgICAgICAgICAgOTgyLCAgICAgICAgIDIwMTIwLCAgICAgIDk2MywKLSAgICAxNjg3NiwgICAgICAgIDEyODg3LCAgICAgICAgIDE0MzM0LCAgICAgNDIwMCwKLSAgICA2NTk5LCAgICAgICAgIDEyMjAsICAgICAgICAgIDkyMjIsICAgICAgODE0LAotICAgIDE2OTQyLCAgICAgICAgIDUxMzQsICAgICAgICAgIDU2NjEsICAgICA0ODk4LAotICAgIDU0ODgsICAgICAgICAgMTc5OCwgICAgICAgICAyMDI1OCwgICAgIDM5NjIsCi0gICAgMTcwMDUsICAgICAgICAgNjE3OCwgICAgICAgICAxNzkyOSwgICAgIDU5MjksCi0gICAgOTM2NSwgICAgICAgICAzNDIwLCAgICAgICAgICA3NDc0LCAgICAgMTk3MSwKLSAgICAxOTUzNywgICAgICAgICA1MTc3LCAgICAgICAgIDE5MDAzLCAgICAgMzAwNiwKLSAgICAxNjQ1NCwgICAgICAgICAzNzg4LCAgICAgICAgIDE2MDcwLCAgICAgMjM2NywKLSAgICA4NjY0LCAgICAgICAgIDI3NDMsICAgICAgICAgIDk0NDUsICAgIDI2MzU4LAotICAgIDEwODU2LCAgICAgICAgIDEyODcsICAgICAgICAgIDM1NTUsICAgICAxMDA5LAotICAgIDU2MDYsICAgICAgICAgMzYyMiwgICAgICAgICAxOTQ1MywgICAgIDU1MTIsCi0gICAgMTI0NTMsICAgICAgICAgIDc5NywgICAgICAgICAyMDYzNCwgICAgICA5MTEsCi0gICAgMTU0MjcsICAgICAgICAgMzA2NiwgICAgICAgICAxNzAzNywgICAgMTAyNzUsCi0gICAgMTg4ODMsICAgICAgICAgMjYzMywgICAgICAgICAgMzkxMywgICAgIDEyNjgsCi0gICAgMTk1MTksICAgICAgICAgMzM3MSwgICAgICAgICAxODA1MiwgICAgIDUyMzAsCi0gICAgMTkyOTEsICAgICAgICAgMTY3OCwgICAgICAgICAxOTUwOCwgICAgIDMxNzIsCi0gICAgMTgwNzIsICAgICAgICAxMDc1NCwgICAgICAgICAxNjYyNSwgICAgIDY4NDUsCi0gICAgMzEzNCwgICAgICAgICAyMjk4LCAgICAgICAgIDEwODY5LCAgICAgMjQzNywKLSAgICAxNTU4MCwgICAgICAgICA2OTEzLCAgICAgICAgIDEyNTk3LCAgICAgMzM4MSwKLSAgICAxMTExNiwgICAgICAgICAzMjk3LCAgICAgICAgIDE2NzYyLCAgICAgMjQyNCwKLSAgICAxODg1MywgICAgICAgICA2NzE1LCAgICAgICAgIDE3MTcxLCAgICAgOTg4NywKLSAgICAxMjc0MywgICAgICAgICAyNjA1LCAgICAgICAgICA4OTM3LCAgICAgMzE0MCwKLSAgICAxOTAzMywgICAgICAgICA3NzY0LCAgICAgICAgIDE4MzQ3LCAgICAgMzg4MCwKLSAgICAyMDQ3NSwgICAgICAgICAzNjgyLCAgICAgICAgIDE5NjAyLCAgICAgMzM4MCwKLSAgICAxMzA0NCwgICAgICAgIDE5MzczLCAgICAgICAgIDEwNTI2LCAgICAyMzEyNAotfTsKLQotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIE5BTUU6IE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBwID0gcG9pbnRlciB0byBzZWxlY3RlZCBxdWFudGl6ZXIgdGFibGUgZW50cnkgKGNvbnN0IFdvcmQxNikKLSAgICBnY29kZTAgPSBwcmVkaWN0ZWQgQ0IgZ2FpbiAoV29yZDE2KQotICAgIGV4cF9nY29kZTAgPSBleHBvbmVudCBvZiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoV29yZDE2KQotICAgIGdhaW5fcGl0ID0gcG9pbnRlciB0byBQaXRjaCBnYWluIChXb3JkMTYpCi0gICAgZ2Fpbl9jb2QgPSBwb2ludGVyIHRvIENvZGUgZ2FpbiAoV29yZDE2KQotCi0gT3V0cHV0czoKLSAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBnYWluX3BpdCBwb2ludHMgdG8gUGl0Y2ggZ2FpbgotICAgIGdhaW5fY29kIHBvaW50cyB0byBDb2RlIGdhaW4KLSAgICBwT3ZlcmZsb3cgcG9pbnRzIHRvIG92ZXJmbG93IGluZGljYXRvciAoRmxhZykKLQotIFJldHVybnM6Ci0gICAgTm9uZS4KLQotIEdsb2JhbCBWYXJpYWJsZXMgVXNlZDoKLSAgICBOb25lLgotCi0gTG9jYWwgVmFyaWFibGVzIE5lZWRlZDoKLSAgICBOb25lLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBmaW5hbCBmaXhlZCBjb2RlYm9vayBnYWluIGFuZCB0aGUgcHJlZGljdG9yCi0gdXBkYXRlIHZhbHVlcywgYW5kIHVwZGF0ZXMgdGhlIGdhaW4gcHJlZGljdG9yLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMKLQotIE5vbmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFRkVSRU5DRVMKLQotIHFnYWluNDc1LmMsIFVNVFMgR1NNIEFNUiBzcGVlY2ggY29kZWMsIFI5OSAtIFZlcnNpb24gMy4yLjAsIE1hcmNoIDIsIDIwMDEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUFNFVURPLUNPREUKLQotc3RhdGljIHZvaWQgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cygKLQotICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLy8gaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QKLSAgICBjb25zdCBXb3JkMTYgKnAsICAgICAgIC8vIGkgIDogcG9pbnRlciB0byBzZWxlY3RlZCBxdWFudGl6ZXIgdGFibGUgZW50cnkKLSAgICBXb3JkMTYgZ2NvZGUwLCAgICAgICAgIC8vIGkgIDogcHJlZGljdGVkIENCIGdhaW4sICAgICBRKDE0IC0gZXhwX2djb2RlMCkKLSAgICBXb3JkMTYgZXhwX2djb2RlMCwgICAgIC8vIGkgIDogZXhwb25lbnQgb2YgcHJlZGljdGVkIENCIGdhaW4sICAgICAgICBRMAotICAgIFdvcmQxNiAqZ2Fpbl9waXQsICAgICAgLy8gbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFExNAotICAgIFdvcmQxNiAqZ2Fpbl9jb2QgICAgICAgLy8gbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExCi0pCi17Ci0KLSAgICBXb3JkMTYgZ19jb2RlLCBleHAsIGZyYWMsIHRtcDsKLSAgICBXb3JkMzIgTF90bXA7Ci0KLSAgICBXb3JkMTYgcXVhX2VuZXJfTVIxMjI7IC8vIG8gIDogcXVhbnRpemVkIGVuZXJneSBlcnJvciwgTVIxMjIgdmVyc2lvbiBRMTAKLSAgICBXb3JkMTYgcXVhX2VuZXI7ICAgICAgIC8vIG8gIDogcXVhbnRpemVkIGVuZXJneSBlcnJvciwgICAgICAgICAgICAgICBRMTAKLQotICAgIC8vIFJlYWQgdGhlIHF1YW50aXplZCBnYWlucwotICAgICpnYWluX3BpdCA9ICpwKys7Ci0gICAgZ19jb2RlID0gKnArKzsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBjYWxjdWxhdGUgZmluYWwgZml4ZWQgY29kZWJvb2sgZ2FpbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgZ2MgPSBnYzAgKiBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBMX3RtcCA9IExfbXVsdChnX2NvZGUsIGdjb2RlMCk7Ci0gICAgTF90bXAgPSBMX3NocihMX3RtcCwgc3ViKDEwLCBleHBfZ2NvZGUwKSk7Ci0gICAgKmdhaW5fY29kID0gZXh0cmFjdF9oKExfdG1wKTsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBjYWxjdWxhdGUgcHJlZGljdG9yIHVwZGF0ZSB2YWx1ZXMgYW5kIHVwZGF0ZSBnYWluIHByZWRpY3RvcjogICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgcXVhX2VuZXIgICAgICAgPSBsb2cyKGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSAyMCpsb2cxMChnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBMb2cyIChMX2RlcG9zaXRfbCAoZ19jb2RlKSwgJmV4cCwgJmZyYWMpOyAvLyBMb2cyKHggUTEyKSA9IGxvZzIoeCkgKyAxMgotICAgIGV4cCA9IHN1YihleHAsIDEyKTsKLQotICAgIHRtcCA9IHNocl9yIChmcmFjLCA1KTsKLSAgICBxdWFfZW5lcl9NUjEyMiA9IGFkZCAodG1wLCBzaGwgKGV4cCwgMTApKTsKLQotICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjApOyAvLyAyNDY2MCBRMTIgfj0gNi4wMjA2ID0gMjAqbG9nMTAoMikKLSAgICBxdWFfZW5lciA9IHB2X3JvdW5kIChMX3NobCAoTF90bXAsIDEzKSk7IC8vIFExMiAqIFEwID0gUTEzIC0+IFExMAotCi0gICAgZ2NfcHJlZF91cGRhdGUocHJlZF9zdCwgcXVhX2VuZXJfTVIxMjIsIHF1YV9lbmVyKTsKLX0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVTT1VSQ0VTIFVTRUQgW29wdGlvbmFsXQotCi0gV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCi0gdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gSEVBUCBNRU1PUlkgVVNFRDogeCBieXRlcwotCi0gU1RBQ0sgTUVNT1JZIFVTRUQ6IHggYnl0ZXMKLQotIENMT0NLIENZQ0xFUzogKGN5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uKSArICh2YXJpYWJsZQotICAgICAgICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKLSAgICAgICAgICAgICAgICBjYWxsZWQpCi0gICAgIHdoZXJlOiAoY3ljbGUgY291bnQgdmFyaWFibGUpID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQ0FVVElPTiBbb3B0aW9uYWxdCi0gW1N0YXRlIGFueSBzcGVjaWFsIG5vdGVzLCBjb25zdHJhaW50cyBvciBjYXV0aW9ucyBmb3IgdXNlcnMgb2YgdGhpcyBmdW5jdGlvbl0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi1zdGF0aWMgdm9pZCBNUjQ3NV9xdWFudF9zdG9yZV9yZXN1bHRzKAotICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAgICAqLwotICAgIGNvbnN0IFdvcmQxNiAqcCwgICAgICAgLyogaSAgOiBwb2ludGVyIHRvIHNlbGVjdGVkIHF1YW50aXplciB0YWJsZSBlbnRyeSAqLwotICAgIFdvcmQxNiBnY29kZTAsICAgICAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiwgICAgIFEoMTQgLSBleHBfZ2NvZGUwKSAqLwotICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLyogaSAgOiBleHBvbmVudCBvZiBwcmVkaWN0ZWQgQ0IgZ2FpbiwgICAgICAgIFEwICAqLwotICAgIFdvcmQxNiAqZ2Fpbl9waXQsICAgICAgLyogbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFExNCAqLwotICAgIFdvcmQxNiAqZ2Fpbl9jb2QsICAgICAgLyogbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExICAqLwotICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgLyogbyAgOiBvdmVyZmxvdyBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAqLwotKQotewotICAgIFdvcmQxNiBnX2NvZGU7Ci0gICAgV29yZDE2IGV4cDsKLSAgICBXb3JkMTYgZnJhYzsKLSAgICBXb3JkMTYgdG1wOwotICAgIFdvcmQzMiBMX3RtcDsKLQotICAgIFdvcmQxNiBxdWFfZW5lcl9NUjEyMjsgLyogbyAgOiBxdWFudGl6ZWQgZW5lcmd5IGVycm9yLCBNUjEyMiB2ZXJzaW9uIFExMCAqLwotICAgIFdvcmQxNiBxdWFfZW5lcjsgICAgICAgLyogbyAgOiBxdWFudGl6ZWQgZW5lcmd5IGVycm9yLCAgICAgICAgICAgICAgIFExMCAqLwotCi0KLSAgICAvKiBSZWFkIHRoZSBxdWFudGl6ZWQgZ2FpbnMgKi8KLSAgICAqZ2Fpbl9waXQgPSAqcCsrOwotICAgIGdfY29kZSA9ICpwKys7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiAgY2FsY3VsYXRlIGZpbmFsIGZpeGVkIGNvZGVib29rIGdhaW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgIGdjID0gZ2MwICogZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBMX3RtcCA9ICgoV29yZDMyKSBnX2NvZGUgKiBnY29kZTApIDw8IDE7Ci0gICAgdG1wICAgPSAxMCAtIGV4cF9nY29kZTA7Ci0gICAgTF90bXAgPSBMX3NocihMX3RtcCwgdG1wLCBwT3ZlcmZsb3cpOwotICAgICpnYWluX2NvZCA9IChXb3JkMTYpKExfdG1wID4+IDE2KTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBjYWxjdWxhdGUgcHJlZGljdG9yIHVwZGF0ZSB2YWx1ZXMgYW5kIHVwZGF0ZSBnYWluIHByZWRpY3RvcjogICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgcXVhX2VuZXIgICAgICAgPSBsb2cyKGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSAyMCpsb2cxMChnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIC8qIExvZzIoeCBRMTIpID0gbG9nMih4KSArIDEyICovCi0gICAgTG9nMigoV29yZDMyKSBnX2NvZGUsICZleHAsICZmcmFjLCBwT3ZlcmZsb3cpOwotICAgIGV4cCAtPSAxMjsKLQotICAgIHRtcCA9IHNocl9yKGZyYWMsIDUsIHBPdmVyZmxvdyk7Ci0gICAgcXVhX2VuZXJfTVIxMjIgPSBleHAgPDwgMTA7Ci0gICAgcXVhX2VuZXJfTVIxMjIgPSB0bXAgKyBxdWFfZW5lcl9NUjEyMjsKLQotICAgIC8qIDI0NjYwIFExMiB+PSA2LjAyMDYgPSAyMCpsb2cxMCgyKSAqLwotICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjAsIHBPdmVyZmxvdyk7Ci0gICAgTF90bXAgPSBMX3RtcCA8PCAxMzsKLQotICAgIC8qIFExMiAqIFEwID0gUTEzIC0+IFExMCAqLwotICAgIHF1YV9lbmVyID0gKFdvcmQxNikoKExfdG1wICsgKFdvcmQzMikgMHgwMDAwODAwMEwpID4+IDE2KTsKLQotICAgIGdjX3ByZWRfdXBkYXRlKHByZWRfc3QsIHF1YV9lbmVyX01SMTIyLCBxdWFfZW5lcik7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBOQU1FOiBNUjQ3NV91cGRhdGVfdW5xX3ByZWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBleHBfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGV4cG9uZW50IE1TVykgKFdvcmQxNikKLSAgICBmcmFjX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBMU1cpIChXb3JkMTYpCi0gICAgY29kX2dhaW5fZXhwID0gb3B0aW11bSBjb2RlYm9vayBnYWluIChleHBvbmVudCkoV29yZDE2KQotICAgIGNvZF9nYWluX2ZyYWMgPSBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGZyYWN0aW9uKSAoV29yZDE2KQotCi0gT3V0cHV0czoKLSAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBwT3ZlcmZsb3cgcG9pbnRzIHRvIG92ZXJmbG93IGluZGljYXRvciAoRmxhZykKLQotIFJldHVybnM6Ci0gICAgTm9uZS4KLQotIEdsb2JhbCBWYXJpYWJsZXMgVXNlZDoKLSAgICBOb25lLgotCi0gTG9jYWwgVmFyaWFibGVzIE5lZWRlZDoKLSAgICBOb25lLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBtb2R1bGUgdXNlcyB0aGUgb3B0aW11bSBjb2RlYm9vayBnYWluIGFuZCB1cGRhdGVzIHRoZSAidW5xdWFudGl6ZWQiCi0gZ2FpbiBwcmVkaWN0b3Igd2l0aCB0aGUgKGJvdW5kZWQpIHByZWRpY3Rpb24gZXJyb3IuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUwotCi0gTm9uZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gcWdhaW40NzUuYywgVU1UUyBHU00gQU1SIHNwZWVjaCBjb2RlYywgUjk5IC0gVmVyc2lvbiAzLjIuMCwgTWFyY2ggMiwgMjAwMQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi12b2lkCi1NUjQ3NV91cGRhdGVfdW5xX3ByZWQoCi0gICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAvLyBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdAotICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTVNXKSwgIFEwCi0gICAgV29yZDE2IGZyYWNfZ2NvZGUwLCAgICAvLyBpICA6IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBMU1cpLCAgUTE1Ci0gICAgV29yZDE2IGNvZF9nYWluX2V4cCwgICAvLyBpICA6IG9wdGltdW0gY29kZWJvb2sgZ2FpbiAoZXhwb25lbnQpLCAgUTAKLSAgICBXb3JkMTYgY29kX2dhaW5fZnJhYyAgIC8vIGkgIDogb3B0aW11bSBjb2RlYm9vayBnYWluIChmcmFjdGlvbiksICBRMTUKLSkKLXsKLSAgICBXb3JkMTYgdG1wLCBleHAsIGZyYWM7Ci0gICAgV29yZDE2IHF1YV9lbmVyLCBxdWFfZW5lcl9NUjEyMjsKLSAgICBXb3JkMzIgTF90bXA7Ci0KLSAgICAvLyBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciBmYWN0b3IgKGdpdmVuIG9wdGltdW0gQ0IgZ2FpbiBnY3UpOgotICAgIC8vICAgcHJlZEVyckZhY3QgPSBnY3UgLyBnY29kZTAKLSAgICAvLyAgIChsaW1pdCB0byBNSU5fUFJFRF9FUlJfRkFDVCA8PSBwcmVkRXJyRmFjdCA8PSBNQVhfUFJFRF9FUlJfRkFDVAotICAgIC8vICAgIC0+IGxpbWl0IHF1YV9lbmVyKikKLSAgICAvLwotICAgIC8vIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIChsb2cpOgotICAgIC8vCi0gICAgLy8gICBxdWFfZW5lcl9NUjEyMiA9IGxvZzIocHJlZEVyckZhY3QpCi0gICAgLy8gICBxdWFfZW5lciAgICAgICA9IDIwKmxvZzEwKHByZWRFcnJGYWN0KQotCi0gICAgaWYgKGNvZF9nYWluX2ZyYWMgPD0gMCkKLSAgICB7Ci0gICAgICAgIC8vIGlmIGdjdSA8PSAwIC0+IHByZWRFcnJGYWN0ID0gMCA8IE1JTl9QUkVEX0VSUl9GQUNUCi0gICAgICAgIC8vIC0+IHNldCBxdWFfZW5lcihfTVIxMjIpIGRpcmVjdGx5Ci0gICAgICAgIHF1YV9lbmVyID0gTUlOX1FVQV9FTkVSOwotICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gY29udmVydCBnY29kZTAgZnJvbSBEUEYgdG8gc3RhbmRhcmQgZnJhY3Rpb24vZXhwb25lbnQgZm9ybWF0Ci0gICAgICAgIC8vIHdpdGggbm9ybWFsaXplZCBmcmFjLCBpLmUuIDE2Mzg0IDw9IGZyYWMgPD0gMzI3NjcKLSAgICAgICAgLy8gTm90ZTogZXhwb25lbnQgY29ycmVjdGlvbiAoZXhwPWV4cC0xNCkgaXMgZG9uZSBhZnRlciBkaXZfcwotICAgICAgICBmcmFjX2djb2RlMCA9IGV4dHJhY3RfbCAoUG93MiAoMTQsIGZyYWNfZ2NvZGUwKSk7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIGNvZF9nYWluX2ZyYWMgPCBmcmFjX2djb2RlMCAgZm9yIGRpdl9zCi0gICAgICAgIGlmIChzdWIoY29kX2dhaW5fZnJhYywgZnJhY19nY29kZTApID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZF9nYWluX2ZyYWMgPSBzaHIgKGNvZF9nYWluX2ZyYWMsIDEpOwotICAgICAgICAgICAgY29kX2dhaW5fZXhwID0gYWRkIChjb2RfZ2Fpbl9leHAsIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJlZEVyckZhY3QKLSAgICAgICAgLy8gICA9IGdjdSAvIGdjb2RlMAotICAgICAgICAvLyAgID0gY29kX2dhaW5fZnJhYy9mcmFjX2djb2RlMCAqIDJeKGNvZF9nYWluX2V4cC0oZXhwX2djb2RlMC0xNCkpCi0gICAgICAgIC8vICAgPSBkaXZfcyAoY19nX2YsIGZyYWNfZ2NvZGUwKSoyXi0xNSAqIDJeKGNfZ19lLWV4cF9nY29kZTArMTQpCi0gICAgICAgIC8vICAgPSBkaXZfcyAqIDJeKGNvZF9nYWluX2V4cC1leHBfZ2NvZGUwIC0gMSkKLQotICAgICAgICBmcmFjID0gZGl2X3MgKGNvZF9nYWluX2ZyYWMsIGZyYWNfZ2NvZGUwKTsKLSAgICAgICAgdG1wID0gc3ViIChzdWIgKGNvZF9nYWluX2V4cCwgZXhwX2djb2RlMCksIDEpOwotCi0gICAgICAgIExvZzIgKExfZGVwb3NpdF9sIChmcmFjKSwgJmV4cCwgJmZyYWMpOwotICAgICAgICBleHAgPSBhZGQgKGV4cCwgdG1wKTsKLQotICAgICAgICAvLyBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAobG9nMiwgUTEwKQotICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IHNocl9yIChmcmFjLCA1KTsKLSAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBhZGQgKHF1YV9lbmVyX01SMTIyLCBzaGwgKGV4cCwgMTApKTsKLQotICAgICAgICBpZiAoc3ViKHF1YV9lbmVyX01SMTIyLCBNSU5fUVVBX0VORVJfTVIxMjIpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgcXVhX2VuZXIgPSBNSU5fUVVBX0VORVI7Ci0gICAgICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdWIocXVhX2VuZXJfTVIxMjIsIE1BWF9RVUFfRU5FUl9NUjEyMikgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBxdWFfZW5lciA9IE1BWF9RVUFfRU5FUjsKLSAgICAgICAgICAgIHF1YV9lbmVyX01SMTIyID0gTUFYX1FVQV9FTkVSX01SMTIyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHByZWRpY3Rpb24gZXJyb3IgKDIwKmxvZzEwLCBRMTApCi0gICAgICAgICAgICBMX3RtcCA9IE1weV8zMl8xNihleHAsIGZyYWMsIDI0NjYwKTsKLSAgICAgICAgICAgIC8vIDI0NjYwIFExMiB+PSA2LjAyMDYgPSAyMCpsb2cxMCgyKQotICAgICAgICAgICAgcXVhX2VuZXIgPSBwdl9yb3VuZCAoTF9zaGwgKExfdG1wLCAxMykpOwotICAgICAgICAgICAgLy8gUTEyICogUTAgPSBRMTMgLT4gUTI2IC0+IFExMAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIE1BIHByZWRpY3RvciBtZW1vcnkKLSAgICBnY19wcmVkX3VwZGF0ZShwcmVkX3N0LCBxdWFfZW5lcl9NUjEyMiwgcXVhX2VuZXIpOwotfQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCi0KLSBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLSBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCi0KLSBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcwotCi0gQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICAgICAgIGNhbGxlZCkKLSAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBDQVVUSU9OIFtvcHRpb25hbF0KLSBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLXZvaWQgTVI0NzVfdXBkYXRlX3VucV9wcmVkKAotICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAqLwotICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTVNXKSwgIFEwICAqLwotICAgIFdvcmQxNiBmcmFjX2djb2RlMCwgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTFNXKSwgIFExNSAqLwotICAgIFdvcmQxNiBjb2RfZ2Fpbl9leHAsICAgLyogaSAgOiBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGV4cG9uZW50KSwgIFEwICAqLwotICAgIFdvcmQxNiBjb2RfZ2Fpbl9mcmFjLCAgLyogaSAgOiBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGZyYWN0aW9uKSwgIFExNSAqLwotICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgLyogbyAgOiBvdmVyZmxvdyBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAqLwotKQotewotICAgIFdvcmQxNiB0bXA7Ci0gICAgV29yZDE2IGV4cDsKLSAgICBXb3JkMTYgZnJhYzsKLSAgICBXb3JkMTYgcXVhX2VuZXI7Ci0gICAgV29yZDE2IHF1YV9lbmVyX01SMTIyOwotICAgIFdvcmQzMiBMX3RtcDsKLQotICAgIC8qIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIGZhY3RvciAoZ2l2ZW4gb3B0aW11bSBDQiBnYWluIGdjdSk6Ci0gICAgICoKLSAgICAgKiAgIHByZWRFcnJGYWN0ID0gZ2N1IC8gZ2NvZGUwCi0gICAgICogICAobGltaXQgdG8gTUlOX1BSRURfRVJSX0ZBQ1QgPD0gcHJlZEVyckZhY3QgPD0gTUFYX1BSRURfRVJSX0ZBQ1QKLSAgICAgKiAgICAtPiBsaW1pdCBxdWFfZW5lciopCi0gICAgICoKLSAgICAgKiBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAobG9nKToKLSAgICAgKgotICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSBsb2cyKHByZWRFcnJGYWN0KQotICAgICAqICAgcXVhX2VuZXIgICAgICAgPSAyMCpsb2cxMChwcmVkRXJyRmFjdCkKLSAgICAgKgotICAgICAqLwotCi0gICAgaWYgKGNvZF9nYWluX2ZyYWMgPD0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGlmIGdjdSA8PSAwIC0+IHByZWRFcnJGYWN0ID0gMCA8IE1JTl9QUkVEX0VSUl9GQUNUICovCi0gICAgICAgIC8qIC0+IHNldCBxdWFfZW5lcihfTVIxMjIpIGRpcmVjdGx5ICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHF1YV9lbmVyID0gTUlOX1FVQV9FTkVSOwotICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29udmVydCBnY29kZTAgZnJvbSBEUEYgdG8gc3RhbmRhcmQgZnJhY3Rpb24vZXhwb25lbnQgZm9ybWF0ICovCi0gICAgICAgIC8qIHdpdGggbm9ybWFsaXplZCBmcmFjLCBpLmUuIDE2Mzg0IDw9IGZyYWMgPD0gMzI3NjcgICAgICAgICAgICAqLwotICAgICAgICAvKiBOb3RlOiBleHBvbmVudCBjb3JyZWN0aW9uIChleHA9ZXhwLTE0KSBpcyBkb25lIGFmdGVyIGRpdl9zICAgKi8KLSAgICAgICAgZnJhY19nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBmcmFjX2djb2RlMCwgcE92ZXJmbG93KSk7Ci0KLSAgICAgICAgLyogbWFrZSBzdXJlIGNvZF9nYWluX2ZyYWMgPCBmcmFjX2djb2RlMCAgZm9yIGRpdl9zICovCi0gICAgICAgIGlmIChjb2RfZ2Fpbl9mcmFjID49IGZyYWNfZ2NvZGUwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2RfZ2Fpbl9mcmFjID4+PSAxOwotICAgICAgICAgICAgY29kX2dhaW5fZXhwICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgIHByZWRFcnJGYWN0Ci0gICAgICAgICAgICAgPSBnY3UgLyBnY29kZTAKLSAgICAgICAgICAgICA9IGNvZF9nYWluX2ZyYWMvZnJhY19nY29kZTAgKiAyXihjb2RfZ2Fpbl9leHAtKGV4cF9nY29kZTAtMTQpKQotICAgICAgICAgICAgID0gZGl2X3MgKGNfZ19mLCBmcmFjX2djb2RlMCkqMl4tMTUgKiAyXihjX2dfZS1leHBfZ2NvZGUwKzE0KQotICAgICAgICAgICAgID0gZGl2X3MgKiAyXihjb2RfZ2Fpbl9leHAtZXhwX2djb2RlMCAtIDEpCi0gICAgICAgICovCi0gICAgICAgIGZyYWMgPSBkaXZfcyhjb2RfZ2Fpbl9mcmFjLCBmcmFjX2djb2RlMCk7Ci0gICAgICAgIHRtcCA9IGNvZF9nYWluX2V4cCAtIGV4cF9nY29kZTA7Ci0gICAgICAgIHRtcCAtPSAxOwotCi0gICAgICAgIExvZzIoKFdvcmQzMikgZnJhYywgJmV4cCwgJmZyYWMsIHBPdmVyZmxvdyk7Ci0gICAgICAgIGV4cCArPSB0bXA7Ci0KLSAgICAgICAgLyogY2FsY3VsYXRlIHByZWRpY3Rpb24gZXJyb3IgKGxvZzIsIFExMCkgKi8KLSAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBzaHJfcihmcmFjLCA1LCBwT3ZlcmZsb3cpOwotICAgICAgICB0bXAgPSBleHAgPDwgMTA7Ci0gICAgICAgIHF1YV9lbmVyX01SMTIyICs9IHRtcDsKLQotICAgICAgICBpZiAocXVhX2VuZXJfTVIxMjIgPiBNQVhfUVVBX0VORVJfTVIxMjIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHF1YV9lbmVyID0gTUFYX1FVQV9FTkVSOwotICAgICAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBNQVhfUVVBX0VORVJfTVIxMjI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAoMjAqbG9nMTAsIFExMCkgKi8KLSAgICAgICAgICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjAsIHBPdmVyZmxvdyk7Ci0gICAgICAgICAgICAvKiAyNDY2MCBRMTIgfj0gNi4wMjA2ID0gMjAqbG9nMTAoMikgKi8KLSAgICAgICAgICAgIExfdG1wID0gIExfc2hsKExfdG1wLCAxMywgcE92ZXJmbG93KTsKLSAgICAgICAgICAgIHF1YV9lbmVyID0gcHZfcm91bmQoTF90bXAsIHBPdmVyZmxvdyk7Ci0KLSAgICAgICAgICAgIC8qIFExMiAqIFEwID0gUTEzIC0+IFEyNiAtPiBRMTAgICAgICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB1cGRhdGUgTUEgcHJlZGljdG9yIG1lbW9yeSAqLwotICAgIGdjX3ByZWRfdXBkYXRlKHByZWRfc3QsIHF1YV9lbmVyX01SMTIyLCBxdWFfZW5lcik7Ci0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIE5BTUU6IE1SNDc1X2dhaW5fcXVhbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBzZjBfZXhwX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCkgKFdvcmQxNikKLSAgICBmMF9mcmFjX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChmcmFjdGlvbikgKFdvcmQxNikKLSAgICBzZjBfZXhwX2NvZWZmID0gZW5lcmd5IGNvZWZmLiAoZXhwb25lbnQgcGFydCkgKFdvcmQxNikKLSAgICBzZjBfZnJhY19jb2VmZiA9IGVuZXJneSBjb2VmZi4gKChmcmFjdGlvbiBwYXJ0KSAoV29yZDE2KQotICAgIHNmMF9leHBfdGFyZ2V0X2VuID0gZXhwb25lbnQgb2YgdGFyZ2V0IGVuZXJneSAoV29yZDE2KQotICAgIHNmMF9mcmFjX3RhcmdldF9lbiA9IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3kgKFdvcmQxNikKLSAgICBzZjFfY29kZV9ub3NoYXJwID0gaW5ub3ZhdGl2ZSBjb2RlYm9vayB2ZWN0b3IgIChXb3JkMTYpCi0gICAgc2YxX2V4cF9nY29kZTAgPSBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpIChXb3JkMTYpCi0gICAgc2YxX2ZyYWNfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSAoV29yZDE2KQotICAgIHNmMV9leHBfY29lZmYgPSBlbmVyZ3kgY29lZmYuIChleHBvbmVudCBwYXJ0KSAoV29yZDE2KQotICAgIHNmMV9mcmFjX2NvZWZmID0gZW5lcmd5IGNvZWZmLiAoZnJhY3Rpb24gcGFydCkgKFdvcmQxNikKLSAgICBzZjFfZXhwX3RhcmdldF9lbiA9IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3kgKFdvcmQxNikKLSAgICBzZjFfZnJhY190YXJnZXRfZW4gPSBmcmFjdGlvbiBvZiB0YXJnZXQgZW5lcmd5IChXb3JkMTYpCi0gICAgZ3BfbGltaXQgPSBwaXRjaCBnYWluIGxpbWl0IChXb3JkMTYpCi0gICAgc2YwX2dhaW5fcGl0ID0gcG9pbnRlciB0byBQaXRjaCBnYWluIChXb3JkMTYpCi0gICAgc2YwX2dhaW5fY29kID0gcG9pbnRlciB0byBDb2RlIGdhaW4gKFdvcmQxNikKLSAgICBzZjFfZ2Fpbl9waXQgPSBwb2ludGVyIHRvIFBpdGNoIGdhaW4gKFdvcmQxNikKLSAgICBzZjFfZ2Fpbl9jb2QgPSBwb2ludGVyIHRvIENvZGUgZ2FpbiAoV29yZDE2KQotCi0gT3V0cHV0czoKLSAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBzZjBfZ2Fpbl9waXQgcG9pbnRzIHRvIFBpdGNoIGdhaW4KLSAgICBzZjBfZ2Fpbl9jb2QgcG9pbnRzIHRvIENvZGUgZ2FpbgotICAgIHNmMV9nYWluX3BpdCBwb2ludHMgdG8gUGl0Y2ggZ2FpbgotICAgIHNmMV9nYWluX2NvZCBwb2ludHMgdG8gQ29kZSBnYWluCi0KLSBSZXR1cm5zOgotICAgIGluZGV4ID0gaW5kZXggb2YgcXVhbnRpemF0aW9uCi0KLSBHbG9iYWwgVmFyaWFibGVzIFVzZWQ6Ci0gICAgTm9uZS4KLQotIExvY2FsIFZhcmlhYmxlcyBOZWVkZWQ6Ci0gICAgTm9uZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHF1YW50aXphdGlvbiBvZiBwaXRjaCBhbmQgY29kZWJvb2sgZ2FpbnMgZm9yIHR3bwotIHN1YmZyYW1lcyB1c2luZyB0aGUgcHJlZGljdGVkIGNvZGVib29rIGdhaW4uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUwotCi0gTm9uZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gcWdhaW40NzUuYywgVU1UUyBHU00gQU1SIHNwZWVjaCBjb2RlYywgUjk5IC0gVmVyc2lvbiAzLjIuMCwgTWFyY2ggMiwgMjAwMQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi1Xb3JkMTYKLU1SNDc1X2dhaW5fcXVhbnQoICAgICAgICAgICAgICAvLyBvICA6IGluZGV4IG9mIHF1YW50aXphdGlvbi4KLSAgICBnY19wcmVkU3RhdGUgKnByZWRfc3QsICAgICAvLyBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBmcm9tIHN1YmZyYW1lIDAgKG9yIDIpCi0gICAgV29yZDE2IHNmMF9leHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwCi0gICAgV29yZDE2IHNmMF9mcmFjX2djb2RlMCwgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZnJhY3Rpb24pLCAgICAgIFExNQotICAgIFdvcmQxNiBzZjBfZXhwX2NvZWZmW10sICAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGV4cG9uZW50IHBhcnQsICBRMAotICAgIFdvcmQxNiBzZjBfZnJhY19jb2VmZltdLCAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGZyYWN0aW9uIHBhcnQsICBRMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIChmcmFjX2NvZWZmIGFuZCBleHBfY29lZmYgY29tcHV0ZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkKLSAgICBXb3JkMTYgc2YwX2V4cF90YXJnZXRfZW4sICAvLyBpICA6IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTAKLSAgICBXb3JkMTYgc2YwX2ZyYWNfdGFyZ2V0X2VuLCAvLyBpICA6IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTE1Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGZyb20gc3ViZnJhbWUgMSAob3IgMykKLSAgICBXb3JkMTYgc2YxX2NvZGVfbm9zaGFycFtdLCAvLyBpICA6IGlubm92YXRpdmUgY29kZWJvb2sgdmVjdG9yIChMX1NVQkZSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgKHdoaXRob3V0IHBpdGNoIHNoYXJwZW5pbmcpCi0gICAgV29yZDE2IHNmMV9leHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwCi0gICAgV29yZDE2IHNmMV9mcmFjX2djb2RlMCwgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZnJhY3Rpb24pLCAgICAgIFExNQotICAgIFdvcmQxNiBzZjFfZXhwX2NvZWZmW10sICAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGV4cG9uZW50IHBhcnQsICBRMAotICAgIFdvcmQxNiBzZjFfZnJhY19jb2VmZltdLCAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGZyYWN0aW9uIHBhcnQsICBRMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIChmcmFjX2NvZWZmIGFuZCBleHBfY29lZmYgY29tcHV0ZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkKLSAgICBXb3JkMTYgc2YxX2V4cF90YXJnZXRfZW4sICAvLyBpICA6IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTAKLSAgICBXb3JkMTYgc2YxX2ZyYWNfdGFyZ2V0X2VuLCAvLyBpICA6IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTE1Ci0KLSAgICBXb3JkMTYgZ3BfbGltaXQsICAgICAgICAgICAvLyBpICA6IHBpdGNoIGdhaW4gbGltaXQKLQotICAgIFdvcmQxNiAqc2YwX2dhaW5fcGl0LCAgICAgIC8vIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQKLSAgICBXb3JkMTYgKnNmMF9nYWluX2NvZCwgICAgICAvLyBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEKLQotICAgIFdvcmQxNiAqc2YxX2dhaW5fcGl0LCAgICAgIC8vIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQKLSAgICBXb3JkMTYgKnNmMV9nYWluX2NvZCAgICAgICAvLyBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEKLSkKLXsKLSAgICBjb25zdCBXb3JkMTYgKnA7Ci0gICAgV29yZDE2IGksIGluZGV4ID0gMDsKLSAgICBXb3JkMTYgdG1wOwotICAgIFdvcmQxNiBleHA7Ci0gICAgV29yZDE2IHNmMF9nY29kZTAsIHNmMV9nY29kZTA7Ci0gICAgV29yZDE2IGdfcGl0Y2gsIGcyX3BpdGNoLCBnX2NvZGUsIGcyX2NvZGUsIGdfcGl0X2NvZDsKLSAgICBXb3JkMTYgY29lZmZbMTBdLCBjb2VmZl9sb1sxMF0sIGV4cF9tYXhbMTBdOyAgLy8gMC4uNDogc2YwOyA1Li45OiBzZjEKLSAgICBXb3JkMzIgTF90bXAsIGRpc3RfbWluOwotCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBwcmVkaWN0ZWQgY29kZWJvb2sgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIGdjMCAgICAgPSAyXmV4cF9nY29kZTAgKyAyXmZyYWNfZ2NvZGUwICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgZ2NvZGUwIChRMTQpID0gMl4xNCoyXmZyYWNfZ2NvZGUwID0gZ2MwICogMl4oMTQtZXhwX2djb2RlMCkgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotCi0gICAgc2YwX2djb2RlMCA9IGV4dHJhY3RfbChQb3cyKDE0LCBzZjBfZnJhY19nY29kZTApKTsKLSAgICBzZjFfZ2NvZGUwID0gZXh0cmFjdF9sKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCkpOwotCi0gICAgICogRm9yIGVhY2ggc3ViZnJhbWUsIHRoZSBlcnJvciBlbmVyZ3kgKHN1bSkgdG8gYmUgbWluaW1pemVkIGNvbnNpc3RzCi0gICAgICogb2YgZml2ZSB0ZXJtcywgdFswLi40XS4KLSAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbMF0gPSAgICBncF4yICAqIDx5MSB5MT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzFdID0gLTIqZ3AgICAgKiA8eG4geTE+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgdFsyXSA9ICAgIGdjXjIgICogPHkyIHkyPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbM10gPSAtMipnYyAgICAqIDx4biB5Mj4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzRdID0gIDIqZ3AqZ2MgKiA8eTEgeTI+Ci0gICAgICoKLQotICAgIC8vIHNmIDAKLSAgICAvLyBkZXRlcm1pbmUgdGhlIHNjYWxpbmcgZXhwb25lbnQgZm9yIGdfY29kZTogZWMgPSBlYzAgLSAxMQotICAgIGV4cCA9IHN1YihzZjBfZXhwX2djb2RlMCwgMTEpOwotCi0gICAgLy8gY2FsY3VsYXRlIGV4cF9tYXhbaV0gPSBzW2ldLTEKLSAgICBleHBfbWF4WzBdID0gc3ViKHNmMF9leHBfY29lZmZbMF0sIDEzKTsKLSAgICBleHBfbWF4WzFdID0gc3ViKHNmMF9leHBfY29lZmZbMV0sIDE0KTsKLSAgICBleHBfbWF4WzJdID0gYWRkKHNmMF9leHBfY29lZmZbMl0sIGFkZCgxNSwgc2hsKGV4cCwgMSkpKTsKLSAgICBleHBfbWF4WzNdID0gYWRkKHNmMF9leHBfY29lZmZbM10sIGV4cCk7Ci0gICAgZXhwX21heFs0XSA9IGFkZChzZjBfZXhwX2NvZWZmWzRdLCBhZGQoMSwgZXhwKSk7Ci0KLSAgICAvLyBzZiAxCi0gICAgLy8gZGV0ZXJtaW5lIHRoZSBzY2FsaW5nIGV4cG9uZW50IGZvciBnX2NvZGU6IGVjID0gZWMwIC0gMTEKLSAgICBleHAgPSBzdWIoc2YxX2V4cF9nY29kZTAsIDExKTsKLQotICAgIC8vIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xCi0gICAgZXhwX21heFs1XSA9IHN1YihzZjFfZXhwX2NvZWZmWzBdLCAxMyk7Ci0gICAgZXhwX21heFs2XSA9IHN1YihzZjFfZXhwX2NvZWZmWzFdLCAxNCk7Ci0gICAgZXhwX21heFs3XSA9IGFkZChzZjFfZXhwX2NvZWZmWzJdLCBhZGQoMTUsIHNobChleHAsIDEpKSk7Ci0gICAgZXhwX21heFs4XSA9IGFkZChzZjFfZXhwX2NvZWZmWzNdLCBleHApOwotICAgIGV4cF9tYXhbOV0gPSBhZGQoc2YxX2V4cF9jb2VmZls0XSwgYWRkKDEsIGV4cCkpOwotCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBHYWluIHNlYXJjaCBlcXVhbGlzYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIFRoZSBNU0UgZm9yIHRoZSB0d28gc3ViZnJhbWVzIGlzIHdlaWdodGVkIGRpZmZlcmVudGx5IGlmIHRoZXJlICAgKgotICAgICAqICBpcyBhIGJpZyBkaWZmZXJlbmNlIGluIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldCBlbmVyZ2llcyAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0KLSAgICAvLyBtYWtlIHRoZSB0YXJnZXQgZW5lcmd5IGV4cG9uZW50cyB0aGUgc2FtZSBieSBkZS1ub3JtYWxpemluZyB0aGUKLSAgICAvLyBmcmFjdGlvbiBvZiB0aGUgc21hbGxlciBvbmUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGJlIGFibGUgdG8gY29tcGFyZQotICAgIC8vIHRoZW0KLQotICAgIGV4cCA9IHNmMF9leHBfdGFyZ2V0X2VuIC0gc2YxX2V4cF90YXJnZXRfZW47Ci0gICAgaWYgKGV4cCA+IDApCi0gICAgewotICAgICAgICBzZjFfZnJhY190YXJnZXRfZW4gPSBzaHIgKHNmMV9mcmFjX3RhcmdldF9lbiwgZXhwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2YwX2ZyYWNfdGFyZ2V0X2VuID0gc2hsIChzZjBfZnJhY190YXJnZXRfZW4sIGV4cCk7Ci0gICAgfQotCi0gICAgLy8gYXNzdW1lIG5vIGNoYW5nZSBvZiBleHBvbmVudHMKLSAgICBleHAgPSAwOwotCi0gICAgLy8gdGVzdCBmb3IgdGFyZ2V0IGVuZXJneSBkaWZmZXJlbmNlOyBzZXQgZXhwIHRvICsxIG9yIC0xIHRvIHNjYWxlCi0gICAgLy8gdXAvZG93biBjb2VmZmljaWVudHMgZm9yIHNmIDEKLQotICAgIHRtcCA9IHNocl9yIChzZjFfZnJhY190YXJnZXRfZW4sIDEpOyAgIC8vIHRtcCA9IGNlaWwoMC41KmVuKHNmMSkpCi0gICAgaWYgKHN1YiAodG1wLCBzZjBfZnJhY190YXJnZXRfZW4pID4gMCkgLy8gdG1wID4gZW4oc2YwKT8KLSAgICB7Ci0gICAgICAgIC8vIHRhcmdldF9lbmVyZ3koc2YxKSA+IDIqdGFyZ2V0X2VuZXJneShzZjApCi0gICAgICAgIC8vICAgLT4gc2NhbGUgdXAgTVNFKHNmMCkgYnkgMiBieSBhZGRpbmcgMSB0byBleHBvbmVudHMgMC4uNAotICAgICAgICBleHAgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSBzaHIgKGFkZCAoc2YwX2ZyYWNfdGFyZ2V0X2VuLCAzKSwgMik7IC8vIHRtcD1jZWlsKDAuMjUqZW4oc2YwKSkKLSAgICAgICAgaWYgKHN1YiAodG1wLCBzZjFfZnJhY190YXJnZXRfZW4pID4gMCkgICAgICAvLyB0bXAgPiBlbihzZjEpPwotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0YXJnZXRfZW5lcmd5KHNmMSkgPCAwLjI1KnRhcmdldF9lbmVyZ3koc2YwKQotICAgICAgICAgICAgLy8gICAtPiBzY2FsZSBkb3duIE1TRShzZjApIGJ5IDAuNSBieSBzdWJ0cmFjdGluZyAxIGZyb20KLSAgICAgICAgICAgIC8vICAgICAgY29lZmZpY2llbnRzIDAuLjQKLSAgICAgICAgICAgIGV4cCA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLSAgICB7Ci0gICAgICAgIGV4cF9tYXhbaV0gPSBhZGQgKGV4cF9tYXhbaV0sIGV4cCk7Ci0gICAgfQotCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBGaW5kIG1heGltdW0gZXhwb25lbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICBGb3IgdGhlIHN1bSBvcGVyYXRpb24sIGFsbCB0ZXJtcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2NhbGluZzsgICAgICoKLSAgICAgKiAgdGhhdCBzY2FsaW5nIHNob3VsZCBiZSBsb3cgZW5vdWdoIHRvIHByZXZlbnQgb3ZlcmZsb3cuIFRoZXJlLSAgICAqCi0gICAgICogIGZvcmUsIHRoZSBtYXhpbXVtIHNjYWxlIGlzIGRldGVybWluZWQgYW5kIGFsbCBjb2VmZmljaWVudHMgYXJlICAgKgotICAgICAqICByZS1zY2FsZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogICAgZXhwID0gbWF4KGV4cF9tYXhbaV0pICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgIGUgPSBleHBfbWF4W2ldLWV4cDsgICAgICAgICBlIDw9IDAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICBjW2ldID0gY1tpXSoyXmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotCi0gICAgZXhwID0gZXhwX21heFswXTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChzdWIoZXhwX21heFtpXSwgZXhwKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cCA9IGV4cF9tYXhbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZXhwID0gYWRkKGV4cCwgMSk7ICAgICAgLy8gVG8gYXZvaWQgb3ZlcmZsb3cKLQotICAgIHAgPSAmc2YwX2ZyYWNfY29lZmZbMF07Ci0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICB0bXAgPSBzdWIoZXhwLCBleHBfbWF4W2ldKTsKLSAgICAgICAgTF90bXAgPSBMX2RlcG9zaXRfaCgqcCsrKTsKLSAgICAgICAgTF90bXAgPSBMX3NocihMX3RtcCwgdG1wKTsKLSAgICAgICAgTF9FeHRyYWN0KExfdG1wLCAmY29lZmZbaV0sICZjb2VmZl9sb1tpXSk7Ci0gICAgfQotICAgIHAgPSAmc2YxX2ZyYWNfY29lZmZbMF07Ci0gICAgZm9yICg7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgIHRtcCA9IHN1YihleHAsIGV4cF9tYXhbaV0pOwotICAgICAgICBMX3RtcCA9IExfZGVwb3NpdF9oKCpwKyspOwotICAgICAgICBMX3RtcCA9IExfc2hyKExfdG1wLCB0bXApOwotICAgICAgICBMX0V4dHJhY3QoTF90bXAsICZjb2VmZltpXSwgJmNvZWZmX2xvW2ldKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICogIENvZGVib29rIHNlYXJjaDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIEZvciBlYWNoIHBhaXIgKGdfcGl0Y2gsIGdfZmFjKSBpbiB0aGUgdGFibGUgY2FsY3VsYXRlIHRoZSAgICAgICAgKgotICAgICAqICB0ZXJtcyB0WzAuLjRdIGFuZCBzdW0gdGhlbSB1cDsgdGhlIHJlc3VsdCBpcyB0aGUgbWVhbiBzcXVhcmVkICAgICoKLSAgICAgKiAgZXJyb3IgZm9yIHRoZSBxdWFudGl6ZWQgZ2FpbnMgZnJvbSB0aGUgdGFibGUuIFRoZSBpbmRleCBmb3IgdGhlICAqCi0gICAgICogIG1pbmltdW0gTVNFIGlzIHN0b3JlZCBhbmQgZmluYWxseSB1c2VkIHRvIHJldHJpZXZlIHRoZSBxdWFudGl6ZWQgKgotICAgICAqICBnYWlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIHN0YXJ0IHdpdGggImluZmluaXRlIiBNU0UKLSAgICBkaXN0X21pbiA9IE1BWF8zMjsKLQotICAgIHAgPSAmdGFibGVfZ2Fpbl9NUjQ3NVswXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNUjQ3NV9WUV9TSVpFOyBpKyspCi0gICAgewotICAgICAgICAvLyBzdWJmcmFtZSAwIChhbmQgMikgY2FsY3VsYXRpb25zCi0gICAgICAgIGdfcGl0Y2ggPSAqcCsrOwotICAgICAgICBnX2NvZGUgPSAqcCsrOwotCi0gICAgICAgIGdfY29kZSA9IG11bHQoZ19jb2RlLCBzZjBfZ2NvZGUwKTsKLSAgICAgICAgZzJfcGl0Y2ggPSBtdWx0KGdfcGl0Y2gsIGdfcGl0Y2gpOwotICAgICAgICBnMl9jb2RlID0gbXVsdChnX2NvZGUsIGdfY29kZSk7Ci0gICAgICAgIGdfcGl0X2NvZCA9IG11bHQoZ19jb2RlLCBnX3BpdGNoKTsKLQotICAgICAgICBMX3RtcCA9IE1weV8zMl8xNiggICAgICAgY29lZmZbMF0sIGNvZWZmX2xvWzBdLCBnMl9waXRjaCk7Ci0gICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZlsxXSwgY29lZmZfbG9bMV0sIGdfcGl0Y2gpOwotICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbMl0sIGNvZWZmX2xvWzJdLCBnMl9jb2RlKTsKLSAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzNdLCBjb2VmZl9sb1szXSwgZ19jb2RlKTsKLSAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzRdLCBjb2VmZl9sb1s0XSwgZ19waXRfY29kKTsKLQotICAgICAgICB0bXAgPSBzdWIgKGdfcGl0Y2gsIGdwX2xpbWl0KTsKLQotICAgICAgICAvLyBzdWJmcmFtZSAxIChhbmQgMykgY2FsY3VsYXRpb25zCi0gICAgICAgIGdfcGl0Y2ggPSAqcCsrOwotICAgICAgICBnX2NvZGUgPSAqcCsrOwotCi0gICAgICAgIGlmICh0bXAgPD0gMCAmJiBzdWIoZ19waXRjaCwgZ3BfbGltaXQpIDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdfY29kZSA9IG11bHQoZ19jb2RlLCBzZjFfZ2NvZGUwKTsKLSAgICAgICAgICAgIGcyX3BpdGNoID0gbXVsdChnX3BpdGNoLCBnX3BpdGNoKTsKLSAgICAgICAgICAgIGcyX2NvZGUgPSBtdWx0KGdfY29kZSwgZ19jb2RlKTsKLSAgICAgICAgICAgIGdfcGl0X2NvZCA9IG11bHQoZ19jb2RlLCBnX3BpdGNoKTsKLQotICAgICAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzVdLCBjb2VmZl9sb1s1XSwgZzJfcGl0Y2gpOwotICAgICAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzZdLCBjb2VmZl9sb1s2XSwgZ19waXRjaCk7Ci0gICAgICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbN10sIGNvZWZmX2xvWzddLCBnMl9jb2RlKTsKLSAgICAgICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZls4XSwgY29lZmZfbG9bOF0sIGdfY29kZSk7Ci0gICAgICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbOV0sIGNvZWZmX2xvWzldLCBnX3BpdF9jb2QpOwotCi0gICAgICAgICAgICAvLyBzdG9yZSB0YWJsZSBpbmRleCBpZiBNU0UgZm9yIHRoaXMgaW5kZXggaXMgbG93ZXIKLSAgICAgICAgICAgICAgIHRoYW4gdGhlIG1pbmltdW0gTVNFIHNlZW4gc28gZmFyCi0gICAgICAgICAgICBpZiAoTF9zdWIoTF90bXAsIGRpc3RfbWluKSA8IChXb3JkMzIpIDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlzdF9taW4gPSBMX3RtcDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiAgcmVhZCBxdWFudGl6ZWQgZ2FpbnMgYW5kIHVwZGF0ZSBNQSBwcmVkaWN0b3IgbWVtb3JpZXMgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLQotICAgIC8vIGZvciBzdWJmcmFtZSAwLCB0aGUgcHJlLWNhbGN1bGF0ZWQgZ2NvZGUwL2V4cF9nY29kZTAgYXJlIHRoZSBzYW1lCi0gICAgLy8gYXMgdGhvc2UgY2FsY3VsYXRlZCBmcm9tIHRoZSAicmVhbCIgcHJlZGljdG9yIHVzaW5nIHF1YW50aXplZCBnYWlucwotICAgIHRtcCA9IHNobChpbmRleCwgMik7Ci0gICAgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cyhwcmVkX3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlX2dhaW5fTVI0NzVbdG1wXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nY29kZTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZXhwX2djb2RlMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX3BpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX2NvZCk7Ci0KLSAgICAvLyBjYWxjdWxhdGUgbmV3IHByZWRpY3RlZCBnYWluIGZvciBzdWJmcmFtZSAxICh0aGlzIHRpbWUgdXNpbmcKLSAgICAvLyB0aGUgcmVhbCwgcXVhbnRpemVkIGdhaW5zKQotICAgIGdjX3ByZWQocHJlZF9zdCwgTVI0NzUsIHNmMV9jb2RlX25vc2hhcnAsCi0gICAgICAgICAgICAmc2YxX2V4cF9nY29kZTAsICZzZjFfZnJhY19nY29kZTAsCi0gICAgICAgICAgICAmc2YwX2V4cF9nY29kZTAsICZzZjBfZ2NvZGUwKTsgLy8gbGFzdCB0d28gYXJncyBhcmUgZHVtbXkKLSAgICBzZjFfZ2NvZGUwID0gZXh0cmFjdF9sKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCkpOwotCi0gICAgdG1wID0gYWRkICh0bXAsIDIpOwotICAgIE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMocHJlZF9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZV9nYWluX01SNDc1W3RtcF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2NvZGUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YxX2V4cF9nY29kZTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2Fpbl9waXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2Fpbl9jb2QpOwotCi0gICAgcmV0dXJuIGluZGV4OwotfQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCi0KLSBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLSBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCi0KLSBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcwotCi0gQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICAgICAgIGNhbGxlZCkKLSAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBDQVVUSU9OIFtvcHRpb25hbF0KLSBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLVdvcmQxNiBNUjQ3NV9nYWluX3F1YW50KCAgICAgICAvKiBvICA6IGluZGV4IG9mIHF1YW50aXphdGlvbi4gICAgICAgICAgICAgICAgICovCi0gICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAgICAgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAqLwotCi0gICAgLyogZGF0YSBmcm9tIHN1YmZyYW1lIDAgKG9yIDIpICovCi0gICAgV29yZDE2IHNmMF9leHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwICAqLwotICAgIFdvcmQxNiBzZjBfZnJhY19nY29kZTAsICAgIC8qIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSwgICAgICBRMTUgKi8KLSAgICBXb3JkMTYgc2YwX2V4cF9jb2VmZltdLCAgICAvKiBpICA6IGVuZXJneSBjb2VmZi4gKDUpLCBleHBvbmVudCBwYXJ0LCAgUTAgICovCi0gICAgV29yZDE2IHNmMF9mcmFjX2NvZWZmW10sICAgLyogaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZnJhY3Rpb24gcGFydCwgIFExNSAqLwotICAgIC8qICAgICAgKGZyYWNfY29lZmYgYW5kIGV4cF9jb2VmZiBjb21wdXRlZCBpbiAgKi8KLSAgICAvKiAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkgICAgICAgICAgICAgICAgICovCi0gICAgV29yZDE2IHNmMF9leHBfdGFyZ2V0X2VuLCAgLyogaSAgOiBleHBvbmVudCBvZiB0YXJnZXQgZW5lcmd5LCAgICAgICAgIFEwICAqLwotICAgIFdvcmQxNiBzZjBfZnJhY190YXJnZXRfZW4sIC8qIGkgIDogZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMTUgKi8KLQotICAgIC8qIGRhdGEgZnJvbSBzdWJmcmFtZSAxIChvciAzKSAqLwotICAgIFdvcmQxNiBzZjFfY29kZV9ub3NoYXJwW10sIC8qIGkgIDogaW5ub3ZhdGl2ZSBjb2RlYm9vayB2ZWN0b3IgKExfU1VCRlIpICAgKi8KLSAgICAvKiAgICAgICh3aGl0aG91dCBwaXRjaCBzaGFycGVuaW5nKSAgICAgICAgICAgICovCi0gICAgV29yZDE2IHNmMV9leHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwICAqLwotICAgIFdvcmQxNiBzZjFfZnJhY19nY29kZTAsICAgIC8qIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSwgICAgICBRMTUgKi8KLSAgICBXb3JkMTYgc2YxX2V4cF9jb2VmZltdLCAgICAvKiBpICA6IGVuZXJneSBjb2VmZi4gKDUpLCBleHBvbmVudCBwYXJ0LCAgUTAgICovCi0gICAgV29yZDE2IHNmMV9mcmFjX2NvZWZmW10sICAgLyogaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZnJhY3Rpb24gcGFydCwgIFExNSAqLwotICAgIC8qICAgICAgKGZyYWNfY29lZmYgYW5kIGV4cF9jb2VmZiBjb21wdXRlZCBpbiAgKi8KLSAgICAvKiAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkgICAgICAgICAgICAgICAgICovCi0gICAgV29yZDE2IHNmMV9leHBfdGFyZ2V0X2VuLCAgLyogaSAgOiBleHBvbmVudCBvZiB0YXJnZXQgZW5lcmd5LCAgICAgICAgIFEwICAqLwotICAgIFdvcmQxNiBzZjFfZnJhY190YXJnZXRfZW4sIC8qIGkgIDogZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMTUgKi8KLQotICAgIFdvcmQxNiBncF9saW1pdCwgICAgICAgICAgIC8qIGkgIDogcGl0Y2ggZ2FpbiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIFdvcmQxNiAqc2YwX2dhaW5fcGl0LCAgICAgIC8qIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQgKi8KLSAgICBXb3JkMTYgKnNmMF9nYWluX2NvZCwgICAgICAvKiBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEgICovCi0KLSAgICBXb3JkMTYgKnNmMV9nYWluX3BpdCwgICAgICAvKiBvICA6IFBpdGNoIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgUTE0ICovCi0gICAgV29yZDE2ICpzZjFfZ2Fpbl9jb2QsICAgICAgLyogbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgIFExICAqLwotICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgICAgIC8qIG8gIDogb3ZlcmZsb3cgaW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgKi8KLSkKLXsKLSAgICBjb25zdCBXb3JkMTYgKnA7Ci0gICAgV29yZDE2IGk7Ci0gICAgV29yZDE2IGluZGV4ID0gMDsKLSAgICBXb3JkMTYgdG1wOwotICAgIFdvcmQxNiBleHA7Ci0gICAgV29yZDE2IHNmMF9nY29kZTA7Ci0gICAgV29yZDE2IHNmMV9nY29kZTA7Ci0gICAgV29yZDE2IGdfcGl0Y2g7Ci0gICAgV29yZDE2IGcyX3BpdGNoOwotICAgIFdvcmQxNiBnX2NvZGU7Ci0gICAgV29yZDE2IGcyX2NvZGU7Ci0gICAgV29yZDE2IGdfcGl0X2NvZDsKLSAgICBXb3JkMTYgY29lZmZbMTBdOwotICAgIFdvcmQxNiBjb2VmZl9sb1sxMF07Ci0gICAgV29yZDE2IGV4cF9tYXhbMTBdOyAgLyogMC4uNDogc2YwOyA1Li45OiBzZjEgKi8KLSAgICBXb3JkMzIgTF90bXA7Ci0gICAgV29yZDMyIGRpc3RfbWluOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBwcmVkaWN0ZWQgY29kZWJvb2sgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIGdjMCAgICAgPSAyXmV4cF9nY29kZTAgKyAyXmZyYWNfZ2NvZGUwICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgZ2NvZGUwIChRMTQpID0gMl4xNCoyXmZyYWNfZ2NvZGUwID0gZ2MwICogMl4oMTQtZXhwX2djb2RlMCkgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIHNmMF9nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBzZjBfZnJhY19nY29kZTAsIHBPdmVyZmxvdykpOwotICAgIHNmMV9nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBzZjFfZnJhY19nY29kZTAsIHBPdmVyZmxvdykpOwotCi0gICAgLyoKLSAgICAgKiBGb3IgZWFjaCBzdWJmcmFtZSwgdGhlIGVycm9yIGVuZXJneSAoc3VtKSB0byBiZSBtaW5pbWl6ZWQgY29uc2lzdHMKLSAgICAgKiBvZiBmaXZlIHRlcm1zLCB0WzAuLjRdLgotICAgICAqCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdFswXSA9ICAgIGdwXjIgICogPHkxIHkxPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbMV0gPSAtMipncCAgICAqIDx4biB5MT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzJdID0gICAgZ2NeMiAgKiA8eTIgeTI+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgdFszXSA9IC0yKmdjICAgICogPHhuIHkyPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbNF0gPSAgMipncCpnYyAqIDx5MSB5Mj4KLSAgICAgKgotICAgICAqLwotCi0gICAgLyogc2YgMCAqLwotICAgIC8qIGRldGVybWluZSB0aGUgc2NhbGluZyBleHBvbmVudCBmb3IgZ19jb2RlOiBlYyA9IGVjMCAtIDExICovCi0gICAgZXhwID0gc2YwX2V4cF9nY29kZTAgLSAxMTsKLQotICAgIC8qIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xICovCi0gICAgZXhwX21heFswXSA9IChzZjBfZXhwX2NvZWZmWzBdIC0gMTMpOwotICAgIGV4cF9tYXhbMV0gPSAoc2YwX2V4cF9jb2VmZlsxXSAtIDE0KTsKLSAgICBleHBfbWF4WzJdID0gKHNmMF9leHBfY29lZmZbMl0gKyAoMTUgKyAoZXhwIDw8IDEpKSk7Ci0gICAgZXhwX21heFszXSA9IChzZjBfZXhwX2NvZWZmWzNdICsgZXhwKTsKLSAgICBleHBfbWF4WzRdID0gKHNmMF9leHBfY29lZmZbNF0gKyAoMSArIGV4cCkpOwotCi0gICAgLyogc2YgMSAqLwotICAgIC8qIGRldGVybWluZSB0aGUgc2NhbGluZyBleHBvbmVudCBmb3IgZ19jb2RlOiBlYyA9IGVjMCAtIDExICovCi0gICAgZXhwID0gc2YxX2V4cF9nY29kZTAgLSAxMTsKLQotICAgIC8qIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xICovCi0gICAgZXhwX21heFs1XSA9IChzZjFfZXhwX2NvZWZmWzBdIC0gMTMpOwotICAgIGV4cF9tYXhbNl0gPSAoc2YxX2V4cF9jb2VmZlsxXSAtIDE0KTsKLSAgICBleHBfbWF4WzddID0gKHNmMV9leHBfY29lZmZbMl0gKyAoMTUgKyAoZXhwIDw8IDEpKSk7Ci0gICAgZXhwX21heFs4XSA9IChzZjFfZXhwX2NvZWZmWzNdICsgZXhwKTsKLSAgICBleHBfbWF4WzldID0gKHNmMV9leHBfY29lZmZbNF0gKyAoMSArIGV4cCkpOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBHYWluIHNlYXJjaCBlcXVhbGlzYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIFRoZSBNU0UgZm9yIHRoZSB0d28gc3ViZnJhbWVzIGlzIHdlaWdodGVkIGRpZmZlcmVudGx5IGlmIHRoZXJlICAgKgotICAgICAqICBpcyBhIGJpZyBkaWZmZXJlbmNlIGluIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldCBlbmVyZ2llcyAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgLyogbWFrZSB0aGUgdGFyZ2V0IGVuZXJneSBleHBvbmVudHMgdGhlIHNhbWUgYnkgZGUtbm9ybWFsaXppbmcgdGhlCi0gICAgICAgZnJhY3Rpb24gb2YgdGhlIHNtYWxsZXIgb25lLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIGNvbXBhcmUKLSAgICAgICB0aGVtCi0gICAgICovCi0gICAgZXhwID0gc2YwX2V4cF90YXJnZXRfZW4gLSBzZjFfZXhwX3RhcmdldF9lbjsKLSAgICBpZiAoZXhwID4gMCkKLSAgICB7Ci0gICAgICAgIHNmMV9mcmFjX3RhcmdldF9lbiA+Pj0gZXhwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzZjBfZnJhY190YXJnZXRfZW4gPj49ICgtZXhwKTsKLSAgICB9Ci0KLSAgICAvKiBhc3N1bWUgbm8gY2hhbmdlIG9mIGV4cG9uZW50cyAqLwotICAgIGV4cCA9IDA7Ci0KLSAgICAvKiB0ZXN0IGZvciB0YXJnZXQgZW5lcmd5IGRpZmZlcmVuY2U7IHNldCBleHAgdG8gKzEgb3IgLTEgdG8gc2NhbGUKLSAgICAgKiB1cC9kb3duIGNvZWZmaWNpZW50cyBmb3Igc2YgMQotICAgICAqLwotICAgIHRtcCA9IHNocl9yKHNmMV9mcmFjX3RhcmdldF9lbiwgMSwgcE92ZXJmbG93KTsgIC8qIHRtcCA9IGNlaWwoMC41KmVuKHNmMSkpICovCi0KLSAgICBpZiAodG1wID4gc2YwX2ZyYWNfdGFyZ2V0X2VuKSAgICAgICAgICAvKiB0bXAgPiBlbihzZjApPyAqLwotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogdGFyZ2V0X2VuZXJneShzZjEpID4gMip0YXJnZXRfZW5lcmd5KHNmMCkKLSAgICAgICAgICogICAtPiBzY2FsZSB1cCBNU0Uoc2YwKSBieSAyIGJ5IGFkZGluZyAxIHRvIGV4cG9uZW50cyAwLi40Ci0gICAgICAgICAqLwotICAgICAgICBleHAgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSAoKHNmMF9mcmFjX3RhcmdldF9lbiArIDMpID4+IDIpOyAvKiB0bXA9Y2VpbCgwLjI1KmVuKHNmMCkpICovCi0KLSAgICAgICAgaWYgKHRtcCA+IHNmMV9mcmFjX3RhcmdldF9lbikgICAgICAvKiB0bXAgPiBlbihzZjEpPyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogdGFyZ2V0X2VuZXJneShzZjEpIDwgMC4yNSp0YXJnZXRfZW5lcmd5KHNmMCkKLSAgICAgICAgICAgICAqICAgLT4gc2NhbGUgZG93biBNU0Uoc2YwKSBieSAwLjUgYnkgc3VidHJhY3RpbmcgMSBmcm9tCi0gICAgICAgICAgICAgKiAgICAgIGNvZWZmaWNpZW50cyAwLi40Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGV4cCA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLSAgICB7Ci0gICAgICAgIGV4cF9tYXhbaV0gKz0gZXhwOwotICAgIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiAgRmluZCBtYXhpbXVtIGV4cG9uZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgRm9yIHRoZSBzdW0gb3BlcmF0aW9uLCBhbGwgdGVybXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNjYWxpbmc7ICAgICAqCi0gICAgICogIHRoYXQgc2NhbGluZyBzaG91bGQgYmUgbG93IGVub3VnaCB0byBwcmV2ZW50IG92ZXJmbG93LiBUaGVyZS0gICAgKgotICAgICAqICBmb3JlLCB0aGUgbWF4aW11bSBzY2FsZSBpcyBkZXRlcm1pbmVkIGFuZCBhbGwgY29lZmZpY2llbnRzIGFyZSAgICoKLSAgICAgKiAgcmUtc2NhbGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgIGV4cCA9IG1heChleHBfbWF4W2ldKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICBlID0gZXhwX21heFtpXS1leHA7ICAgICAgICAgZSA8PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogICAgY1tpXSA9IGNbaV0qMl5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBleHAgPSBleHBfbWF4WzBdOwotICAgIGZvciAoaSA9IDk7IGkgPiAwOyBpLS0pCi0gICAgewotICAgICAgICBpZiAoZXhwX21heFtpXSA+IGV4cCkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwID0gZXhwX21heFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBleHArKzsgICAgICAvKiBUbyBhdm9pZCBvdmVyZmxvdyAqLwotCi0gICAgcCA9ICZzZjBfZnJhY19jb2VmZlswXTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gKGV4cCAtIGV4cF9tYXhbaV0pOwotICAgICAgICBMX3RtcCA9ICgoV29yZDMyKSgqcCsrKSA8PCAxNik7Ci0gICAgICAgIExfdG1wID0gTF9zaHIoTF90bXAsIHRtcCwgcE92ZXJmbG93KTsKLSAgICAgICAgY29lZmZbaV0gPSAoV29yZDE2KShMX3RtcCA+PiAxNik7Ci0gICAgICAgIGNvZWZmX2xvW2ldID0gKFdvcmQxNikoKExfdG1wID4+IDEpIC0gKChMX3RtcCA+PiAxNikgPDwgMTUpKTsKLSAgICB9Ci0gICAgcCA9ICZzZjFfZnJhY19jb2VmZlswXTsKLSAgICBmb3IgKDsgaSA8IDEwOyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBleHAgLSBleHBfbWF4W2ldOwotICAgICAgICBMX3RtcCA9ICgoV29yZDMyKSgqcCsrKSA8PCAxNik7Ci0gICAgICAgIExfdG1wID0gTF9zaHIoTF90bXAsIHRtcCwgcE92ZXJmbG93KTsKLSAgICAgICAgY29lZmZbaV0gPSAoV29yZDE2KShMX3RtcCA+PiAxNik7Ci0gICAgICAgIGNvZWZmX2xvW2ldID0gKFdvcmQxNikoKExfdG1wID4+IDEpIC0gKChMX3RtcCA+PiAxNikgPDwgMTUpKTsKLSAgICB9Ci0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiAgQ29kZWJvb2sgc2VhcmNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIH5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgRm9yIGVhY2ggcGFpciAoZ19waXRjaCwgZ19mYWMpIGluIHRoZSB0YWJsZSBjYWxjdWxhdGUgdGhlICAgICAgICAqCi0gICAgICogIHRlcm1zIHRbMC4uNF0gYW5kIHN1bSB0aGVtIHVwOyB0aGUgcmVzdWx0IGlzIHRoZSBtZWFuIHNxdWFyZWQgICAgKgotICAgICAqICBlcnJvciBmb3IgdGhlIHF1YW50aXplZCBnYWlucyBmcm9tIHRoZSB0YWJsZS4gVGhlIGluZGV4IGZvciB0aGUgICoKLSAgICAgKiAgbWluaW11bSBNU0UgaXMgc3RvcmVkIGFuZCBmaW5hbGx5IHVzZWQgdG8gcmV0cmlldmUgdGhlIHF1YW50aXplZCAqCi0gICAgICogIGdhaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICAvKiBzdGFydCB3aXRoICJpbmZpbml0ZSIgTVNFICovCi0gICAgZGlzdF9taW4gPSBNQVhfMzI7Ci0KLSAgICBwID0gJnRhYmxlX2dhaW5fTVI0NzVbMF07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTVI0NzVfVlFfU0laRTsgaSsrKQotICAgIHsKLSAgICAgICAgLyogc3ViZnJhbWUgMCAoYW5kIDIpIGNhbGN1bGF0aW9ucyAqLwotICAgICAgICBnX3BpdGNoID0gKnArKzsKLSAgICAgICAgZ19jb2RlID0gKnArKzsKLQotICAgICAgICAvKiBOZWVkIHRvIGJlIHRoZXJlIE9LQSAqLwotICAgICAgICBnX2NvZGUgICAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogc2YwX2djb2RlMCkgPj4gMTUpOwotICAgICAgICBnMl9waXRjaCAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19waXRjaCAqIGdfcGl0Y2gpID4+IDE1KTsKLSAgICAgICAgZzJfY29kZSAgID0gKFdvcmQxNikoKChXb3JkMzIpIGdfY29kZSAqIGdfY29kZSkgPj4gMTUpOwotICAgICAgICBnX3BpdF9jb2QgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogZ19waXRjaCkgPj4gMTUpOwotCi0KLSAgICAgICAgTF90bXAgPSBNcHlfMzJfMTYoY29lZmZbMF0sIGNvZWZmX2xvWzBdLCBnMl9waXRjaCwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzFdLCBjb2VmZl9sb1sxXSwgZ19waXRjaCwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzJdLCBjb2VmZl9sb1syXSwgZzJfY29kZSwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzNdLCBjb2VmZl9sb1szXSwgZ19jb2RlLCBwT3ZlcmZsb3cpICsKLSAgICAgICAgICAgICAgICBNcHlfMzJfMTYoY29lZmZbNF0sIGNvZWZmX2xvWzRdLCBnX3BpdF9jb2QsIHBPdmVyZmxvdyk7Ci0KLSAgICAgICAgdG1wID0gKGdfcGl0Y2ggLSBncF9saW1pdCk7Ci0KLSAgICAgICAgLyogc3ViZnJhbWUgMSAoYW5kIDMpIGNhbGN1bGF0aW9ucyAqLwotICAgICAgICBnX3BpdGNoID0gKnArKzsKLSAgICAgICAgZ19jb2RlID0gKnArKzsKLQotICAgICAgICBpZiAoKHRtcCA8PSAwKSAmJiAoZ19waXRjaCA8PSBncF9saW1pdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdfY29kZSA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBzZjFfZ2NvZGUwKSA+PiAxNSk7Ci0gICAgICAgICAgICBnMl9waXRjaCAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19waXRjaCAqIGdfcGl0Y2gpID4+IDE1KTsKLSAgICAgICAgICAgIGcyX2NvZGUgICA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBnX2NvZGUpID4+IDE1KTsKLSAgICAgICAgICAgIGdfcGl0X2NvZCA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBnX3BpdGNoKSA+PiAxNSk7Ci0KLSAgICAgICAgICAgIExfdG1wICs9IChNcHlfMzJfMTYoY29lZmZbNV0sIGNvZWZmX2xvWzVdLCBnMl9waXRjaCwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzZdLCBjb2VmZl9sb1s2XSwgZ19waXRjaCwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzddLCBjb2VmZl9sb1s3XSwgZzJfY29kZSwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzhdLCBjb2VmZl9sb1s4XSwgZ19jb2RlLCBwT3ZlcmZsb3cpICsKLSAgICAgICAgICAgICAgICAgICAgICBNcHlfMzJfMTYoY29lZmZbOV0sIGNvZWZmX2xvWzldLCBnX3BpdF9jb2QsIHBPdmVyZmxvdykpOwotCi0gICAgICAgICAgICAvKiBzdG9yZSB0YWJsZSBpbmRleCBpZiBNU0UgZm9yIHRoaXMgaW5kZXggaXMgbG93ZXIKLSAgICAgICAgICAgICAgIHRoYW4gdGhlIG1pbmltdW0gTVNFIHNlZW4gc28gZmFyICovCi0gICAgICAgICAgICBpZiAoTF90bXAgPCBkaXN0X21pbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaXN0X21pbiA9IExfdG1wOwotICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICByZWFkIHF1YW50aXplZCBnYWlucyBhbmQgdXBkYXRlIE1BIHByZWRpY3RvciBtZW1vcmllcyAgICAgICAgICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIC8qIGZvciBzdWJmcmFtZSAwLCB0aGUgcHJlLWNhbGN1bGF0ZWQgZ2NvZGUwL2V4cF9nY29kZTAgYXJlIHRoZSBzYW1lCi0gICAgICAgYXMgdGhvc2UgY2FsY3VsYXRlZCBmcm9tIHRoZSAicmVhbCIgcHJlZGljdG9yIHVzaW5nIHF1YW50aXplZCBnYWlucyAqLwotICAgIHRtcCA9IGluZGV4IDw8IDI7Ci0gICAgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cyhwcmVkX3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlX2dhaW5fTVI0NzVbdG1wXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nY29kZTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZXhwX2djb2RlMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX3BpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX2NvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvdyk7Ci0KLSAgICAvKiBjYWxjdWxhdGUgbmV3IHByZWRpY3RlZCBnYWluIGZvciBzdWJmcmFtZSAxICh0aGlzIHRpbWUgdXNpbmcKLSAgICAgICB0aGUgcmVhbCwgcXVhbnRpemVkIGdhaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBnY19wcmVkKHByZWRfc3QsIE1SNDc1LCBzZjFfY29kZV9ub3NoYXJwLAotICAgICAgICAgICAgJnNmMV9leHBfZ2NvZGUwLCAmc2YxX2ZyYWNfZ2NvZGUwLAotICAgICAgICAgICAgJnNmMF9leHBfZ2NvZGUwLCAmc2YwX2djb2RlMCwgLyogZHVtbXkgYXJncyAqLwotICAgICAgICAgICAgcE92ZXJmbG93KTsKLQotICAgIHNmMV9nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBzZjFfZnJhY19nY29kZTAsIHBPdmVyZmxvdykpOwotCi0gICAgdG1wICs9IDI7Ci0gICAgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cygKLSAgICAgICAgcHJlZF9zdCwKLSAgICAgICAgJnRhYmxlX2dhaW5fTVI0NzVbdG1wXSwKLSAgICAgICAgc2YxX2djb2RlMCwKLSAgICAgICAgc2YxX2V4cF9nY29kZTAsCi0gICAgICAgIHNmMV9nYWluX3BpdCwKLSAgICAgICAgc2YxX2dhaW5fY29kLAotICAgICAgICBwT3ZlcmZsb3cpOwotCi0gICAgcmV0dXJuKGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTgyZmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkFtcm5iRW5jb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotCi0gICAgc3JjczogWwotICAgICAgICAiQW1ybmJFbmNvZGVyVGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgICAgICAibGlic25kZmlsZSIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGUxY2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQotICovCi0KLWNjX2Z1enogewotICAgIG5hbWU6ICJhbXJuYl9kZWNfZnV6emVyIiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhbXJuYl9kZWNfZnV6emVyLmNwcCIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvYW1ybmJfZGVjX2Z1enplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTdlNWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKLSAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJnc21hbXJfZGVjLmgiCi0KLS8vIENvbnN0YW50cyBmb3IgQU1SLU5CCi1jb25zdGV4cHIgaW50MzJfdCBrU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKLWNvbnN0ZXhwciBpbnQzMl90IGtCaXRzUGVyU2FtcGxlID0gMTY7Ci1jb25zdGV4cHIgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IGtTYW1wbGVzUGVyRnJhbWUgKiBrQml0c1BlclNhbXBsZSAvIDg7Ci1jb25zdCBiaXRzdHJlYW1fZm9ybWF0IGtCaXRTdHJlYW1Gb3JtYXRzWzJdID0ge01JTUVfSUVURiwgSUYyfTsKLWNvbnN0IGludDMyX3Qga0xvY2FsV21mRGVjQnl0ZXNQZXJGcmFtZVs4XSA9IHsxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzF9OwotY29uc3QgaW50MzJfdCBrTG9jYWxJZjJEZWNCeXRlc1BlckZyYW1lWzhdID0gezEzLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDI2LCAzMX07Ci0KLWNsYXNzIENvZGVjIHsKLSBwdWJsaWM6Ci0gIENvZGVjKCkgPSBkZWZhdWx0OwotICB+Q29kZWMoKSB7IGRlSW5pdERlY29kZXIoKTsgfQotICBpbnQxNl90IGluaXREZWNvZGVyKCk7Ci0gIHZvaWQgZGVJbml0RGVjb2RlcigpOwotICB2b2lkIGRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSBwcml2YXRlOgotICB2b2lkICptQW1ySGFuZGxlID0gbnVsbHB0cjsKLX07Ci0KLWludDE2X3QgQ29kZWM6OmluaXREZWNvZGVyKCkgeyByZXR1cm4gR1NNSW5pdERlY29kZSgmbUFtckhhbmRsZSwgKFdvcmQ4ICopIkFNUk5CRGVjb2RlciIpOyB9Ci0KLXZvaWQgQ29kZWM6OmRlSW5pdERlY29kZXIoKSB7IEdTTURlY29kZUZyYW1lRXhpdCgmbUFtckhhbmRsZSk7IH0KLQotdm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIHdoaWxlIChzaXplID4gMCkgewotICAgIHVpbnQ4X3QgbW9kZSA9ICpkYXRhOwotICAgIGJvb2wgYml0ID0gbW9kZSAmIDB4MDE7Ci0gICAgYml0c3RyZWFtX2Zvcm1hdCBiaXRzcmVhbUZvcm1hdCA9IGtCaXRTdHJlYW1Gb3JtYXRzW2JpdF07Ci0gICAgaW50MzJfdCBmcmFtZVNpemUgPSAwOwotICAgIC8qIEZpbmQgZnJhbWUgdHlwZSAqLwotICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGUgPSBzdGF0aWNfY2FzdDxGcmFtZV9UeXBlXzNHUFA+KChtb2RlID4+IDMpICYgMHgwNyk7Ci0gICAgKytkYXRhOwotICAgIC0tc2l6ZTsKLSAgICBpZiAoYml0KSB7Ci0gICAgICBmcmFtZVNpemUgPSBrTG9jYWxJZjJEZWNCeXRlc1BlckZyYW1lW2ZyYW1lVHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZyYW1lU2l6ZSA9IGtMb2NhbFdtZkRlY0J5dGVzUGVyRnJhbWVbZnJhbWVUeXBlXTsKLSAgICB9Ci0gICAgaW50MTZfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdOwotICAgIHVpbnQ4X3QgKmlucHV0QnVmID0gbmV3IHVpbnQ4X3RbZnJhbWVTaXplXTsKLSAgICBpZiAoIWlucHV0QnVmKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGludDMyX3QgbWluU2l6ZSA9IHN0ZDo6bWluKChpbnQzMl90KXNpemUsIGZyYW1lU2l6ZSk7Ci0gICAgbWVtY3B5KGlucHV0QnVmLCBkYXRhLCBtaW5TaXplKTsKLSAgICBBTVJEZWNvZGUobUFtckhhbmRsZSwgZnJhbWVUeXBlLCBpbnB1dEJ1Ziwgb3V0cHV0QnVmLCBiaXRzcmVhbUZvcm1hdCk7Ci0gICAgLyogQU1SRGVjb2RlKCkgZGVjb2RlcyBtaW5TaXplIG51bWJlciBvZiBieXRlcyBpZiBkZWNvZGUgaXMgc3VjY2Vzc2Z1bC4KLSAgICAgKiBBTVJEZWNvZGUoKSByZXR1cm5zIC0xIGlmIGRlY29kZSBmYWlscy4KLSAgICAgKiBFdmVuIGlmIG5vIGJ5dGVzIGFyZSBkZWNvZGVkLCBpbmNyZW1lbnQgYnkgbWluU2l6ZSB0byBlbnN1cmUgZnV6emVyIHByb2NlZWRzCi0gICAgICogdG8gZmVlZCBuZXh0IGRhdGEgKi8KLSAgICBkYXRhICs9IG1pblNpemU7Ci0gICAgc2l6ZSAtPSBtaW5TaXplOwotICAgIGRlbGV0ZVtdIGlucHV0QnVmOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgaWYgKHNpemUgPCAyKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7Ci0gIGlmICghY29kZWMpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoY29kZWMtPmluaXREZWNvZGVyKCkgPT0gMCkgewotICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7Ci0gIH0KLSAgZGVsZXRlIGNvZGVjOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9OT1RJQ0UgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmNzdlMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCi0gKi8KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImFtcndiX2RlY19mdXp6ZXIiLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFtcndiX2RlY19mdXp6ZXIuY3BwIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCi0gICAgXSwKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YmYxMWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi1USElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCi0KLUdvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCi1zb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQotdGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgotaGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKLXRoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5Ci1yZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvd2Jfc3luX2ZpbHQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy93Yl9zeW5fZmlsdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWY2ZDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy93Yl9zeW5fZmlsdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Qb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgZm9sbG93aW5nIDNHUFAgc3RhbmRhcmQ6Ci0KLSAgICAzR1BQIFRTIDI2LjE3MwotICAgIEFOU0ktQyBjb2RlIGZvciB0aGUgQWRhcHRpdmUgTXVsdGktUmF0ZSAtIFdpZGViYW5kIChBTVItV0IpIHNwZWVjaCBjb2RlYwotICAgIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuM2dwcC5vcmcKLQotKEMpIDIwMDcsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRUQSwgVFRDKQotUGVybWlzc2lvbiB0byBkaXN0cmlidXRlLCBtb2RpZnkgYW5kIHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHN0YW5kYXJkIGxpY2Vuc2UKLXRlcm1zIGxpc3RlZCBhYm92ZSBoYXMgYmVlbiBvYnRhaW5lZCBmcm9tIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0KLSBGaWxlbmFtZTogd2Jfc3luX2ZpbHQuY3BwCi0KLSAgICAgRGF0ZTogMDUvMDgvMjAwNAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVZJU0lPTiBISVNUT1JZCi0KLQotIERlc2NyaXB0aW9uOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLXdiX3N5bl9maWx0Ci0KLSAgICAgaW50MTYgYVtdLCAgICAgICAgICAgICAgIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMKLSAgICAgaW50MTYgbSwgICAgICAgICAgICAgICAgIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIKLSAgICAgaW50MTYgeFtdLCAgICAgICAgICAgICAgIChpKSAgICAgOiBpbnB1dCBzaWduYWwKLSAgICAgaW50MTYgeVtdLCAgICAgICAgICAgICAgIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsCi0gICAgIGludDE2IGxnLCAgICAgICAgICAgICAgICAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcKLSAgICAgaW50MTYgbWVtW10sICAgICAgICAgICAgIChpL28pICAgOiBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsdGVyaW5nLgotICAgICBpbnQxNiB1cGRhdGUsICAgICAgICAgICAgKGkpICAgICA6IDA9bm8gdXBkYXRlLCAxPXVwZGF0ZSBvZiBtZW1vcnkuCi0gICAgIGludDE2IHlfYnVmW10KLQotU3luX2ZpbHRfMzIKLQotICAgICBpbnQxNiBhW10sICAgICAgICAgICAgICAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzCi0gICAgIGludDE2IG0sICAgICAgICAgICAgICAgIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIKLSAgICAgaW50MTYgZXhjW10sICAgICAgICAgICAgKGkpIFFuZXc6IGV4Y2l0YXRpb24gKGV4Y1tpXSA+PiBRbmV3KQotICAgICBpbnQxNiBRbmV3LCAgICAgICAgICAgICAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpCi0gICAgIGludDE2IHNpZ19oaVtdLCAgICAgICAgIChvKSAvMTYgOiBzeW50aGVzaXMgaGlnaAotICAgICBpbnQxNiBzaWdfbG9bXSwgICAgICAgICAobykgLzE2IDogc3ludGhlc2lzIGxvdwotICAgICBpbnQxNiBsZyAgICAgICAgICAgICAgICAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotICAgIERvIHRoZSBzeW50aGVzaXMgZmlsdGVyaW5nIDEvQSh6KSAgMTYgYW5kIDMyLWJpdHMgdmVyc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLSNpbmNsdWRlICJwdl9hbXJfd2JfdHlwZV9kZWZzLmgiCi0jaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfbWVtX2Z1bmNzLmgiCi0jaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJwdmFtcndiX21hdGhfb3AuaCIKLSNpbmNsdWRlICJwdmFtcndiZGVjb2Rlcl9jbnN0LmgiCi0jaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfYWNlbHAuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIHdiX3N5bl9maWx0KAotICAgIGludDE2IGFbXSwgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8KLSAgICBpbnQxNiBtLCAgICAgICAgIC8qIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaW50MTYgeFtdLCAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGludDE2IHlbXSwgICAgICAgLyogKG8pICAgICA6IG91dHB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpbnQxNiBsZywgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaW50MTYgbWVtW10sICAgICAvKiAoaS9vKSAgIDogbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlcmluZy4gICAqLwotICAgIGludDE2IHVwZGF0ZSwgICAgLyogKGkpICAgICA6IDA9bm8gdXBkYXRlLCAxPXVwZGF0ZSBvZiBtZW1vcnkuICAgICAgICAgKi8KLSAgICBpbnQxNiB5X2J1ZltdCi0pCi17Ci0KLSAgICBpbnQxNiBpLCBqOwotICAgIGludDMyIExfdG1wMTsKLSAgICBpbnQzMiBMX3RtcDI7Ci0gICAgaW50MzIgTF90bXAzOwotICAgIGludDMyIExfdG1wNDsKLSAgICBpbnQxNiAqeXk7Ci0KLSAgICAvKiBjb3B5IGluaXRpYWwgZmlsdGVyIHN0YXRlcyBpbnRvIHN5bnRoZXNpcyBidWZmZXIgKi8KLSAgICBwdl9tZW1jcHkoeV9idWYsIG1lbSwgbSpzaXplb2YoKnl5KSk7Ci0KLSAgICB5eSA9ICZ5X2J1ZlttXTsKLQotICAgIC8qIERvIHRoZSBmaWx0ZXJpbmcuICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGcgPj4gMjsgaSsrKQotICAgIHsKLSAgICAgICAgTF90bXAxID0gLSgoaW50MzIpeFsoaTw8MildIDw8IDExKTsKLSAgICAgICAgTF90bXAyID0gLSgoaW50MzIpeFsoaTw8MikrMV0gPDwgMTEpOwotICAgICAgICBMX3RtcDMgPSAtKChpbnQzMil4WyhpPDwyKSsyXSA8PCAxMSk7Ci0gICAgICAgIExfdG1wNCA9IC0oKGludDMyKXhbKGk8PDIpKzNdIDw8IDExKTsKLQotICAgICAgICAvKiBhW10gdXNlcyBRMTIgYW5kIGFicyhhKSA9PCAxICovCi0KLSAgICAgICAgTF90bXAxICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAtM10sIGFbM10sIExfdG1wMSk7Ci0gICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLTJdLCBhWzNdLCBMX3RtcDIpOwotICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpIC0yXSwgYVsyXSwgTF90bXAxKTsKLSAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAtMV0sIGFbMl0sIExfdG1wMik7Ci0gICAgICAgIExfdG1wMSAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLTFdLCBhWzFdLCBMX3RtcDEpOwotCi0gICAgICAgIGZvciAoaiA9IDQ7IGogPCBtOyBqICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfdG1wMSAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MiktMSAgLSBqXSwgYVtqKzFdLCBMX3RtcDEpOwotICAgICAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAgICAtIGpdLCBhW2orMV0sIExfdG1wMik7Ci0gICAgICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICAgIC0gal0sIGFbaiAgXSwgTF90bXAxKTsKLSAgICAgICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMSAgLSBqXSwgYVtqICBdLCBMX3RtcDIpOwotICAgICAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsxICAtIGpdLCBhW2orMV0sIExfdG1wMyk7Ci0gICAgICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzIgIC0gal0sIGFbaisxXSwgTF90bXA0KTsKLSAgICAgICAgICAgIExfdG1wMyAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMiAgLSBqXSwgYVtqICBdLCBMX3RtcDMpOwotICAgICAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSszICAtIGpdLCBhW2ogIF0sIExfdG1wNCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICAgIC0gal0sIGFbal0sIExfdG1wMSk7Ci0gICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMSAgLSBqXSwgYVtqXSwgTF90bXAyKTsKLSAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsyICAtIGpdLCBhW2pdLCBMX3RtcDMpOwotICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzMgIC0gal0sIGFbal0sIExfdG1wNCk7Ci0KLSAgICAgICAgTF90bXAxID0gc2hsX2ludDMyKExfdG1wMSwgNCk7Ci0KLSAgICAgICAgeVsoaTw8MildID0geXlbKGk8PDIpXSA9IGFtcl93Yl9yb3VuZCgtTF90bXAxKTsKLQotICAgICAgICBMX3RtcDIgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpXSwgYVsxXSwgTF90bXAyKTsKLQotICAgICAgICBMX3RtcDIgPSBzaGxfaW50MzIoTF90bXAyLCA0KTsKLQotICAgICAgICB5WyhpPDwyKSsxXSA9IHl5WyhpPDwyKSsxXSA9IGFtcl93Yl9yb3VuZCgtTF90bXAyKTsKLQotICAgICAgICBMX3RtcDMgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpIC0gMV0sIGFbM10sIExfdG1wMyk7Ci0gICAgICAgIExfdG1wNCAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MildLCBhWzNdLCBMX3RtcDQpOwotICAgICAgICBMX3RtcDMgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpXSwgYVsyXSwgTF90bXAzKTsKLSAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSArIDFdLCBhWzJdLCBMX3RtcDQpOwotICAgICAgICBMX3RtcDMgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICsgMV0sIGFbMV0sIExfdG1wMyk7Ci0KLSAgICAgICAgTF90bXAzID0gc2hsX2ludDMyKExfdG1wMywgNCk7Ci0KLSAgICAgICAgeVsoaTw8MikrMl0gPSB5eVsoaTw8MikrMl0gPSBhbXJfd2Jfcm91bmQoLUxfdG1wMyk7Ci0KLSAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsyXSwgYVsxXSwgTF90bXA0KTsKLQotICAgICAgICBMX3RtcDQgPSBzaGxfaW50MzIoTF90bXA0LCA0KTsKLQotICAgICAgICB5WyhpPDwyKSszXSA9IHl5WyhpPDwyKSszXSA9IGFtcl93Yl9yb3VuZCgtTF90bXA0KTsKLSAgICB9Ci0KLQotICAgIC8qIFVwZGF0ZSBtZW1vcnkgaWYgcmVxdWlyZWQgKi8KLQotICAgIGlmICh1cGRhdGUpCi0gICAgewotICAgICAgICBwdl9tZW1jcHkobWVtLCAmeVtsZyAtIG1dLCBtKnNpemVvZigqeSkpOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIFN5bl9maWx0XzMyKAotICAgIGludDE2IGFbXSwgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgKi8KLSAgICBpbnQxNiBtLCAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyICAgICAgICAgICAgICovCi0gICAgaW50MTYgZXhjW10sICAgICAgICAgICAgLyogKGkpIFFuZXc6IGV4Y2l0YXRpb24gKGV4Y1tpXSA+PiBRbmV3KSAgICAqLwotICAgIGludDE2IFFuZXcsICAgICAgICAgICAgIC8qIChpKSAgICAgOiBleGMgc2NhbGluZyA9IDAobWluKSB0byA4KG1heCkgKi8KLSAgICBpbnQxNiBzaWdfaGlbXSwgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGhpZ2ggICAgICAgICAgICAgICAgICovCi0gICAgaW50MTYgc2lnX2xvW10sICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBsb3cgICAgICAgICAgICAgICAgICAqLwotICAgIGludDE2IGxnICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgKi8KLSkKLXsKLSAgICBpbnQxNiBpLCBrLCBhMDsKLSAgICBpbnQzMiBMX3RtcDE7Ci0gICAgaW50MzIgTF90bXAyOwotICAgIGludDMyIExfdG1wMzsKLSAgICBpbnQzMiBMX3RtcDQ7Ci0KLSAgICBhMCA9IDkgLSBRbmV3OyAgICAgICAgLyogaW5wdXQgLyAxNiBhbmQgPj5RbmV3ICovCi0KLSAgICAvKiBEbyB0aGUgZmlsdGVyaW5nLiAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGxnID4+IDE7IGkrKykKLSAgICB7Ci0KLSAgICAgICAgTF90bXAzID0gMDsKLSAgICAgICAgTF90bXA0ID0gMDsKLQotICAgICAgICBMX3RtcDEgPSBmeHBfbXVsXzE2YnkxNihzaWdfbG9bKGk8PDEpIC0gMV0sIGFbMV0pOwotICAgICAgICBMX3RtcDIgPSBmeHBfbXVsXzE2YnkxNihzaWdfaGlbKGk8PDEpIC0gMV0sIGFbMV0pOwotCi0gICAgICAgIGZvciAoayA9IDI7IGsgPCBtOyBrICs9IDIpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgTF90bXAxID0gZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKS0xIC0ga10sIGFbaysxXSwgTF90bXAxKTsKLSAgICAgICAgICAgIExfdG1wMiA9IGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSktMSAtIGtdLCBhW2srMV0sIExfdG1wMik7Ci0gICAgICAgICAgICBMX3RtcDEgPSBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpICAgLSBrXSwgYVtrICBdLCBMX3RtcDEpOwotICAgICAgICAgICAgTF90bXAyID0gZnhwX21hY18xNmJ5MTYoc2lnX2hpWyhpPDwxKSAgIC0ga10sIGFbayAgXSwgTF90bXAyKTsKLSAgICAgICAgICAgIExfdG1wMyA9IGZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSkgICAtIGtdLCBhW2srMV0sIExfdG1wMyk7Ci0gICAgICAgICAgICBMX3RtcDQgPSBmeHBfbWFjXzE2YnkxNihzaWdfaGlbKGk8PDEpICAgLSBrXSwgYVtrKzFdLCBMX3RtcDQpOwotICAgICAgICAgICAgTF90bXAzID0gZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKSsxIC0ga10sIGFbayAgXSwgTF90bXAzKTsKLSAgICAgICAgICAgIExfdG1wNCA9IGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSkrMSAtIGtdLCBhW2sgIF0sIExfdG1wNCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMX3RtcDEgPSAtZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKSAgIC0ga10sIGFba10sIExfdG1wMSk7Ci0gICAgICAgIExfdG1wMyA9ICBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpKzEgLSBrXSwgYVtrXSwgTF90bXAzKTsKLSAgICAgICAgTF90bXAyID0gIGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSkgICAtIGtdLCBhW2tdLCBMX3RtcDIpOwotICAgICAgICBMX3RtcDQgPSAgZnhwX21hY18xNmJ5MTYoc2lnX2hpWyhpPDwxKSsxIC0ga10sIGFba10sIExfdG1wNCk7Ci0KLQotCi0gICAgICAgIExfdG1wMSA+Pj0gMTE7ICAgICAgLyogLTQgOiBzaWdfbG9baV0gPDwgNCAqLwotCi0gICAgICAgIExfdG1wMSArPSAoaW50MzIpZXhjWyhpPDwxKV0gPDwgYTA7Ci0KLSAgICAgICAgTF90bXAxIC09IChMX3RtcDIgPDwgMSk7Ci0gICAgICAgIC8qIHNpZ19oaSA9IGJpdDE2IHRvIGJpdDMxIG9mIHN5bnRoZXNpcyAqLwotICAgICAgICBMX3RtcDEgPSBzaGxfaW50MzIoTF90bXAxLCAzKTsgICAgICAgICAgIC8qIGFpIGluIFExMiAqLwotCi0gICAgICAgIHNpZ19oaVsoaTw8MSldID0gKGludDE2KShMX3RtcDEgPj4gMTYpOwotCi0gICAgICAgIExfdG1wNCA9IGZ4cF9tYWNfMTZieTE2KChpbnQxNikoTF90bXAxID4+IDE2KSwgYVsxXSwgTF90bXA0KTsKLQotICAgICAgICAvKiBzaWdfbG8gPSBiaXQ0IHRvIGJpdDE1IG9mIHN5bnRoZXNpcyAqLwotICAgICAgICAvKiBMX3RtcDEgPj49IDQgOiBzaWdfbG9baV0gPj4gNCAqLwotICAgICAgICBzaWdfbG9bKGk8PDEpXSA9IChpbnQxNikoKExfdG1wMSA+PiA0KSAtICgoTF90bXAxID4+IDE2KSA8PCAxMikpOwotCi0gICAgICAgIExfdG1wMyA9IGZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSldLCBhWzFdLCBMX3RtcDMpOwotICAgICAgICBMX3RtcDMgPSAtTF90bXAzID4+IDExOwotCi0gICAgICAgIExfdG1wMyArPSAoaW50MzIpZXhjWyhpPDwxKSsxXSA8PCBhMDsKLQotICAgICAgICBMX3RtcDMgLT0gKExfdG1wNCA8PCAxKTsKLSAgICAgICAgLyogc2lnX2hpID0gYml0MTYgdG8gYml0MzEgb2Ygc3ludGhlc2lzICovCi0gICAgICAgIExfdG1wMyA9IHNobF9pbnQzMihMX3RtcDMsIDMpOyAgICAgICAgICAgLyogYWkgaW4gUTEyICovCi0gICAgICAgIHNpZ19oaVsoaTw8MSkrMV0gPSAoaW50MTYpKExfdG1wMyA+PiAxNik7Ci0KLSAgICAgICAgLyogc2lnX2xvID0gYml0NCB0byBiaXQxNSBvZiBzeW50aGVzaXMgKi8KLSAgICAgICAgLyogTF90bXAxID4+PSA0IDogc2lnX2xvW2ldID4+IDQgKi8KLSAgICAgICAgc2lnX2xvWyhpPDwxKSsxXSA9IChpbnQxNikoKExfdG1wMyA+PiA0KSAtIChzaWdfaGlbKGk8PDEpKzFdIDw8IDEyKSk7Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODIxNWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiQW1yd2JEZWNvZGVyVGVzdCIsCi0gICAgZ3Rlc3Q6IHRydWUsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJBbXJ3YkRlY29kZXJUZXN0LmNwcCIsCi0gICAgXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCi0gICAgICAgICJsaWJzbmRmaWxlIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAppbmRleCA2NGYzMDJjLi42N2EwZjQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icApAQCAtMSwxNDYgKzEsMyBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYXV0b2NvcnIuYyIsCi0gICAgICAgICJzcmMvYXpfaXNwLmMiLAotICAgICAgICAic3JjL2JpdHMuYyIsCi0gICAgICAgICJzcmMvYzJ0NjRmeC5jIiwKLSAgICAgICAgInNyYy9jNHQ2NGZ4LmMiLAotICAgICAgICAic3JjL2NvbnZvbHZlLmMiLAotICAgICAgICAic3JjL2Nvcl9oX3guYyIsCi0gICAgICAgICJzcmMvZGVjaW01NC5jIiwKLSAgICAgICAgInNyYy9kZWVtcGguYyIsCi0gICAgICAgICJzcmMvZHR4LmMiLAotICAgICAgICAic3JjL2dfcGl0Y2guYyIsCi0gICAgICAgICJzcmMvZ3BjbGlwLmMiLAotICAgICAgICAic3JjL2hvbWluZy5jIiwKLSAgICAgICAgInNyYy9ocDQwMC5jIiwKLSAgICAgICAgInNyYy9ocDUwLmMiLAotICAgICAgICAic3JjL2hwNmsuYyIsCi0gICAgICAgICJzcmMvaHBfd3NwLmMiLAotICAgICAgICAic3JjL2ludF9scGMuYyIsCi0gICAgICAgICJzcmMvaXNwX2F6LmMiLAotICAgICAgICAic3JjL2lzcF9pc2YuYyIsCi0gICAgICAgICJzcmMvbGFnX3dpbmQuYyIsCi0gICAgICAgICJzcmMvbGV2aW5zb24uYyIsCi0gICAgICAgICJzcmMvbG9nMi5jIiwKLSAgICAgICAgInNyYy9scF9kZWMyLmMiLAotICAgICAgICAic3JjL21hdGhfb3AuYyIsCi0gICAgICAgICJzcmMvb3Blcl8zMmIuYyIsCi0gICAgICAgICJzcmMvcF9tZWRfb2wuYyIsCi0gICAgICAgICJzcmMvcGl0X3NocnAuYyIsCi0gICAgICAgICJzcmMvcGl0Y2hfZjQuYyIsCi0gICAgICAgICJzcmMvcHJlZF9sdDQuYyIsCi0gICAgICAgICJzcmMvcHJlZW1waC5jIiwKLSAgICAgICAgInNyYy9xX2dhaW4yLmMiLAotICAgICAgICAic3JjL3FfcHVsc2UuYyIsCi0gICAgICAgICJzcmMvcWlzZl9ucy5jIiwKLSAgICAgICAgInNyYy9xcGlzZl8ycy5jIiwKLSAgICAgICAgInNyYy9yYW5kb20uYyIsCi0gICAgICAgICJzcmMvcmVzaWR1LmMiLAotICAgICAgICAic3JjL3NjYWxlLmMiLAotICAgICAgICAic3JjL3N0cmVhbS5jIiwKLSAgICAgICAgInNyYy9zeW5fZmlsdC5jIiwKLSAgICAgICAgInNyYy91cGR0X3Rhci5jIiwKLSAgICAgICAgInNyYy91dGlsLmMiLAotICAgICAgICAic3JjL3ZvQU1SV0JFbmMuYyIsCi0gICAgICAgICJzcmMvdm9pY2VmYWMuYyIsCi0gICAgICAgICJzcmMvd2JfdmFkLmMiLAotICAgICAgICAic3JjL3dlaWdodF9hLmMiLAotICAgICAgICAic3JjL21lbV9hbGlnbi5jIiwKLSAgICBdLAotCi0gICAgYXJjaDogewotICAgICAgICBhcm06IHsKLSAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMiLAotICAgICAgICAgICAgXSwKLQotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1EQVJNIiwKLSAgICAgICAgICAgICAgICAiLURBU01fT1BUIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjL2FzbS9BUk1WNUUiXSwKLQotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKLQotICAgICAgICAgICAgbmVvbjogewotICAgICAgICAgICAgICAgIGV4Y2x1ZGVfc3JjczogWwotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgc3JjczogWwotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvU3luX2ZpbHRfMzJfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWN0dWFsbHkgZ2VuZXJhdGUgbmVvbiBpbnN0cnVjdGlvbnMsIHNlZSBidWcgMjY5MzI5ODAKLSAgICAgICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAgICAgIi1EQVJNVjciLAotICAgICAgICAgICAgICAgICAgICAiLW1mcHU9dmZwdjMiLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RSIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3IiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfSwKLQotICAgICAgICB9LAotICAgIH0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgIF0sCi0KLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmMiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi0KLX0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hbXJ3YmVuYyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9OT1RJQ0UgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZW1waC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVlbXBoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYzg2NTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVlbXBoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgIEZpbGU6IHByZWVtcGguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgRGVzY3JpcHRpb246IFByZWVtcGhhc2lzOiBmaWx0ZXJpbmcgdGhyb3VnaCAxIC0gZyB6Xi0xICAgICAgICAgKgotKiAgICAgICAgICAgICAgUHJlZW1waDIgLS0+IHNpZ25hbCBpcyBtdWx0aXBsaWVkIGJ5IDIgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJiYXNpY19vcC5oIgotCi12b2lkIFByZWVtcGgoCi0gICAgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IGlucHV0IHNpZ25hbCBvdmVyd3JpdHRlbiBieSB0aGUgb3V0cHV0ICovCi0gICAgICAgIFdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IHByZWVtcGhhc2lzIGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICovCi0gICAgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGxlbmdodCBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIFdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSAoeFstMV0pICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICkKLXsKLSAgICBXb3JkMTYgdGVtcDsKLSAgICBXb3JkMzIgaSwgTF90bXA7Ci0KLSAgICB0ZW1wID0geFtsZyAtIDFdOwotCi0gICAgZm9yIChpID0gbGcgLSAxOyBpID4gMDsgaS0tKQotICAgIHsKLSAgICAgICAgTF90bXAgPSBMX2RlcG9zaXRfaCh4W2ldKTsKLSAgICAgICAgTF90bXAgLT0gKHhbaSAtIDFdICogbXUpPDwxOwotICAgICAgICB4W2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7Ci0gICAgfQotCi0gICAgTF90bXAgPSBMX2RlcG9zaXRfaCh4WzBdKTsKLSAgICBMX3RtcCAtPSAoKCptZW0pICogbXUpPDwxOwotICAgIHhbMF0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsKLQotICAgICptZW0gPSB0ZW1wOwotCi0gICAgcmV0dXJuOwotfQotCi0KLXZvaWQgUHJlZW1waDIoCi0gICAgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IGlucHV0IHNpZ25hbCBvdmVyd3JpdHRlbiBieSB0aGUgb3V0cHV0ICovCi0gICAgICAgIFdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IHByZWVtcGhhc2lzIGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICovCi0gICAgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGxlbmdodCBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIFdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSAoeFstMV0pICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICApCi17Ci0gICAgV29yZDE2IHRlbXA7Ci0gICAgV29yZDMyIGksIExfdG1wOwotCi0gICAgdGVtcCA9IHhbbGcgLSAxXTsKLQotICAgIGZvciAoaSA9IChXb3JkMTYpIChsZyAtIDEpOyBpID4gMDsgaS0tKQotICAgIHsKLSAgICAgICAgTF90bXAgPSBMX2RlcG9zaXRfaCh4W2ldKTsKLSAgICAgICAgTF90bXAgLT0gKHhbaSAtIDFdICogbXUpPDwxOyAvLyBvbmx5IGNhbGxlZCB3aXRoIG11ID09IDIyMjgyLCBzbyB0aGlzIHdvbid0IG92ZXJmbG93Ci0gICAgICAgIGlmIChMX3RtcCA+IElOVDMyX01BWCAvIDIpIHsKLSAgICAgICAgICAgIExfdG1wID0gSU5UMzJfTUFYIC8gMjsKLSAgICAgICAgfQotICAgICAgICBMX3RtcCA9IChMX3RtcCA8PCAxKTsKLSAgICAgICAgaWYgKExfdG1wID4gSU5UMzJfTUFYIC0gMHg4MDAwKSB7Ci0gICAgICAgICAgICBMX3RtcCA9IElOVDMyX01BWCAtIDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICB4W2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7Ci0gICAgfQotCi0gICAgTF90bXAgPSBMX2RlcG9zaXRfaCh4WzBdKTsKLSAgICBMX3RtcCAtPSAoKCptZW0pICogbXUpPDwxOwotICAgIGlmIChMX3RtcCA+IElOVDMyX01BWCAvIDIpIHsKLSAgICAgICAgTF90bXAgPSBJTlQzMl9NQVggLyAyOwotICAgIH0KLSAgICBMX3RtcCA9IChMX3RtcCA8PCAxKTsKLSAgICBpZiAoTF90bXAgPiBJTlQzMl9NQVggLSAweDgwMDApIHsKLSAgICAgICAgTF90bXAgPSBJTlQzMl9NQVggLSAweDgwMDA7Ci0gICAgfQotICAgIHhbMF0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsKLQotICAgICptZW0gPSB0ZW1wOwotCi0gICAgcmV0dXJuOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfcHVsc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwYmRkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfcHVsc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgRmlsZTogcV9wdWxzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgIERlc2NyaXB0aW9uOiBDb2RpbmcgYW5kIGRlY29kaW5nIG9mIGFsZ2VicmFpYyBjb2RlYm9vayAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAicV9wdWxzZS5oIgotCi0jZGVmaW5lIE5CX1BPUyAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zIGluIHRyYWNrLCBtYXNrIGZvciBzaWduIGJpdCAqLwotCi1Xb3JkMzIgcXVhbnRfMXBfTjEoICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiBOKzEgYml0cyAgICAgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgICAgICAgKi8KLSAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCi17Ci0gICAgV29yZDE2IG1hc2s7Ci0gICAgV29yZDMyIGluZGV4OwotCi0gICAgbWFzayA9ICgxIDw8IE4pIC0gMTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiBRdWFudGl6YXRpb24gb2YgMSBwdWxzZSB3aXRoIE4rMSBiaXRzOiAgICAgICAgICAgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbmRleCA9IExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MgJiBtYXNrKSk7Ci0gICAgaWYgKChwb3MgJiBOQl9QT1MpICE9IDApCi0gICAgewotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBMX2RlcG9zaXRfbCgxIDw8IE4pKTsgICAvKiBpbmRleCArPSAxIDw8IE47ICovCi0gICAgfQotICAgIHJldHVybiAoaW5kZXgpOwotfQotCi0KLVdvcmQzMiBxdWFudF8ycF8yTjEoICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuICgyKk4pKzEgYml0cyAgICAgICAgICovCi0gICAgICAgIFdvcmQxNiBwb3MxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMiAgICAgKi8KLSAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCi17Ci0gICAgV29yZDE2IG1hc2ssIHRtcDsKLSAgICBXb3JkMzIgaW5kZXg7Ci0gICAgbWFzayA9ICgxIDw8IE4pIC0gMTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiBRdWFudGl6YXRpb24gb2YgMiBwdWxzZXMgd2l0aCAyKk4rMSBiaXRzOiAgICAgICAgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAoKChwb3MyIF4gcG9zMSkgJiBOQl9QT1MpID09IDApCi0gICAgewotICAgICAgICAvKiBzaWduIG9mIDFzdCBwdWxzZSA9PSBzaWduIG9mIDJ0aCBwdWxzZSAqLwotICAgICAgICBpZihwb3MxIDw9IHBvczIpICAgICAgICAgIC8qICgocG9zMSAtIHBvczIpIDw9IDApICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGluZGV4ID0gKChwb3MxICYgbWFzaykgPDwgTikgKyAocG9zMiAmIG1hc2spOyAqLwotICAgICAgICAgICAgaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMiAmIG1hc2spKSkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogKChwb3MyICYgbWFzaykgPDwgTikgKyAocG9zMSAmIG1hc2spOyAqLwotICAgICAgICAgICAgaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMSAmIG1hc2spKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocG9zMSAmIE5CX1BPUykgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gKE4gPDwgMSk7Ci0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMUwgPDwgdG1wKSk7ICAgICAgIC8qIGluZGV4ICs9IDEgPDwgKDIqTik7ICovCi0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIHNpZ24gb2YgMXN0IHB1bHNlICE9IHNpZ24gb2YgMnRoIHB1bHNlICovCi0gICAgICAgIGlmICh2b19zdWIoKFdvcmQxNikgKHBvczEgJiBtYXNrKSwgKFdvcmQxNikgKHBvczIgJiBtYXNrKSkgPD0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaW5kZXggPSAoKHBvczIgJiBtYXNrKSA8PCBOKSArIChwb3MxICYgbWFzayk7ICovCi0gICAgICAgICAgICBpbmRleCA9IExfZGVwb3NpdF9sKGFkZDEoKCgoV29yZDE2KSAocG9zMiAmIG1hc2spKSA8PCBOKSwgKChXb3JkMTYpIChwb3MxICYgbWFzaykpKSk7Ci0gICAgICAgICAgICBpZiAoKHBvczIgJiBOQl9QT1MpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gKE4gPDwgMSk7ICAgICAgICAgICAvKiBpbmRleCArPSAxIDw8ICgyKk4pOyAqLwotICAgICAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsICgxTCA8PCB0bXApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGluZGV4ID0gKChwb3MxICYgbWFzaykgPDwgTikgKyAocG9zMiAmIG1hc2spOyAgICAgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MxICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkpKTsKLSAgICAgICAgICAgIGlmICgocG9zMSAmIE5CX1BPUykgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSAoTiA8PCAxKTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMSA8PCB0bXApKTsgICAgLyogaW5kZXggKz0gMSA8PCAoMipOKTsgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKGluZGV4KTsKLX0KLQotCi1Xb3JkMzIgcXVhbnRfM3BfM04xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoMypOKSsxIGJpdHMgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovCi0gICAgICAgIFdvcmQxNiBwb3MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAzICAgICAqLwotICAgICAgICBXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8KLXsKLSAgICBXb3JkMTYgbmJfcG9zOwotICAgIFdvcmQzMiBpbmRleDsKLQotICAgIG5iX3BvcyA9KDEgPDwoTiAtIDEpKTsgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8KE4tMSkpOyAqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiBRdWFudGl6YXRpb24gb2YgMyBwdWxzZXMgd2l0aCAzKk4rMSBiaXRzOiAgICAgICAgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAoKChwb3MxIF4gcG9zMikgJiBuYl9wb3MpID09IDApCi0gICAgewotICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCBzdWIoTiwgMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCAoTi0xKSk7ICovCi0gICAgICAgIC8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7Ci0gICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczMsIE4pIDw8ICgyKk4pOyAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMXBfTjEocG9zMywgTik8PChOIDw8IDEpKSk7Ci0KLSAgICB9IGVsc2UgaWYgKCgocG9zMSBeIHBvczMpICYgbmJfcG9zKSA9PSAwKQotICAgIHsKLSAgICAgICAgaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMywgc3ViKE4sIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMywgKE4tMSkpOyAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7Ci0gICAgICAgIC8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMXBfTjEocG9zMiwgTikgPDwgKE4gPDwgMSkpKTsKLSAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zMiwgTikgPDwKLSAgICAgICAgICogKDIqTik7ICovCi0gICAgfSBlbHNlCi0gICAgewotICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTiAtIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zMywgKE4tMSkpOyAqLwotICAgICAgICAvKiBpbmRleCArPSAocG9zMiAmIG5iX3BvcykgPDwgTjsgICAgICAgICAgICAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczIgJiBuYl9wb3MpKSA8PCBOKSk7Ci0gICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczEsIE4pIDw8ICgyKk4pOyAgICovCi0gICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8xcF9OMShwb3MxLCBOKSA8PCAoTiA8PCAxKSkpOwotICAgIH0KLSAgICByZXR1cm4gKGluZGV4KTsKLX0KLQotCi1Xb3JkMzIgcXVhbnRfNHBfNE4xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoNCpOKSsxIGJpdHMgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovCi0gICAgICAgIFdvcmQxNiBwb3MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAzICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zNCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgNCAgICAgKi8KLSAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCi17Ci0gICAgV29yZDE2IG5iX3BvczsKLSAgICBXb3JkMzIgaW5kZXg7Ci0KLSAgICBuYl9wb3MgPSAxIDw8IChOIC0gMSk7ICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PChOLTEpKTsgICovCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqIFF1YW50aXphdGlvbiBvZiA0IHB1bHNlcyB3aXRoIDQqTisxIGJpdHM6ICAgICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGlmICgoKHBvczEgXiBwb3MyKSAmIG5iX3BvcykgPT0gMCkKLSAgICB7Ci0gICAgICAgIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczIsIHN1YihOLCAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczIsIChOLTEpKTsgKi8KLSAgICAgICAgLyogaW5kZXggKz0gKHBvczEgJiBuYl9wb3MpIDw8IE47ICAgICovCi0gICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMSAmIG5iX3BvcykpIDw8IE4pKTsKLSAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczMsIHBvczQsIE4pIDw8ICgyKk4pOyAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczMsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7Ci0gICAgfSBlbHNlIGlmICgoKHBvczEgXiBwb3MzKSAmIG5iX3BvcykgPT0gMCkKLSAgICB7Ci0gICAgICAgIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIChOIC0gMSkpOwotICAgICAgICAvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8KLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOwotICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zNCwgTikgPDwgKDIqTik7ICovCi0gICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8ycF8yTjEocG9zMiwgcG9zNCwgTikgPDwgKE4gPDwgMSkpKTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczMsIChOIC0gMSkpOwotICAgICAgICAvKiBpbmRleCArPSAocG9zMiAmIG5iX3BvcykgPDwgTjsgKi8KLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MyICYgbmJfcG9zKSkgPDwgTikpOwotICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zNCwgTikgPDwgKDIqTik7ICovCi0gICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8ycF8yTjEocG9zMSwgcG9zNCwgTikgPDwgKE4gPDwgMSkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChpbmRleCk7Ci19Ci0KLQotV29yZDMyIHF1YW50XzRwXzROKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gNCpOIGJpdHMgICAgICAgICAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjQgICovCi0gICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLwotewotICAgIFdvcmQxNiBuYl9wb3MsIG1hc2sgX191bnVzZWQsIG5fMSwgdG1wOwotICAgIFdvcmQxNiBwb3NBWzRdLCBwb3NCWzRdOwotICAgIFdvcmQzMiBpLCBqLCBrLCBpbmRleDsKLQotICAgIG5fMSA9IChXb3JkMTYpIChOIC0gMSk7Ci0gICAgbmJfcG9zID0gKDEgPDwgbl8xKTsgICAgICAgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8bl8xKTsgKi8KLSAgICBtYXNrID0gdm9fc3ViKCgxIDw8IE4pLCAxKTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLwotCi0gICAgaSA9IDA7Ci0gICAgaiA9IDA7Ci0gICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKLSAgICB7Ci0gICAgICAgIGlmICgocG9zW2tdICYgbmJfcG9zKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3NBW2krK10gPSBwb3Nba107Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3NCW2orK10gPSBwb3Nba107Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGkpCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB0bXAgPSB2b19zdWIoKE4gPDwgMiksIDMpOyAgICAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNCpOKS0zKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gKDFMIDw8IHRtcCk7Ci0gICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF80cF80TjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgcG9zQlszXSwgbl8xKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzRwXzROMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBwb3NCWzNdLCBuXzEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSkgPDwgKCgzKm5fMSkrMSk7ICovCi0gICAgICAgICAgICB0bXAgPSBhZGQxKChXb3JkMTYpKCh2b19MX211bHQoMywgbl8xKSA+PiAxKSksIDEpOwotICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpLCB0bXApOwotICAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSk7ICovCi0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgdG1wID0gKChuXzEgPDwgMSkgKyAxKTsgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBuXzEpIDw8ICgoMipuXzEpKzEpOyAqLwotICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKSwgdG1wKTsKLSAgICAgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpOyAqLwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgTjsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIE4pOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3NCWzBdLCBuXzEpOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGluZGV4ID0gcXVhbnRfNHBfNE4xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIHBvc0FbM10sIG5fMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgaW4gZnVuY3Rpb24gcXVhbnRfNHBfNE5cbiIpOwotICAgIH0KLSAgICB0bXAgPSAoKE4gPDwgMikgLSAyKTsgICAgICAgICAgICAgICAvKiBpbmRleCArPSAoaSAmIDMpIDw8ICgoNCpOKS0yKTsgKi8KLSAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBMX3NobCgoTF9kZXBvc2l0X2woaSkgJiAoM0wpKSwgdG1wKSk7Ci0KLSAgICByZXR1cm4gKGluZGV4KTsKLX0KLQotCi0KLVdvcmQzMiBxdWFudF81cF81TiggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuIDUqTiBiaXRzICAgICAgICAgICAgICovCi0gICAgICAgIFdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi41ICAqLwotICAgICAgICBXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8KLXsKLSAgICBXb3JkMTYgbmJfcG9zLCBuXzEsIHRtcDsKLSAgICBXb3JkMTYgcG9zQVs1XSwgcG9zQls1XTsKLSAgICBXb3JkMzIgaSwgaiwgaywgaW5kZXgsIHRtcDI7Ci0KLSAgICBuXzEgPSAoV29yZDE2KSAoTiAtIDEpOwotICAgIG5iX3BvcyA9ICgxIDw8IG5fMSk7ICAgICAgICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PG5fMSk7ICovCi0KLSAgICBpID0gMDsKLSAgICBqID0gMDsKLSAgICBmb3IgKGsgPSAwOyBrIDwgNTsgaysrKQotICAgIHsKLSAgICAgICAgaWYgKChwb3Nba10gJiBuYl9wb3MpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvc0FbaSsrXSA9IHBvc1trXTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvc0JbaisrXSA9IHBvc1trXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN3aXRjaCAoaSkKLSAgICB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHRtcCA9IHZvX3N1YigoV29yZDE2KSgodm9fTF9tdWx0KDUsIE4pID4+IDEpKSwgMSk7ICAgICAgICAvKiAoKDUqTiktMSkpICovCi0gICAgICAgICAgICBpbmRleCA9IExfc2hsKDFMLCB0bXApOyAgIC8qIGluZGV4ID0gMSA8PCAoKDUqTiktMSk7ICovCi0gICAgICAgICAgICB0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgIC8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsqLwotICAgICAgICAgICAgdG1wMiA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpLCB0bXApOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgdG1wMik7Ci0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQls0XSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbM10sIHBvc0JbNF0sIE4pOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHRtcCA9IHZvX3N1YigoV29yZDE2KSgodm9fTF9tdWx0KDUsIE4pID4+IDEpKSwgMSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg1Kk4pLTEpOyAqLwotICAgICAgICAgICAgaW5kZXggPSBMX3NobCgxTCwgdG1wKTsKLSAgICAgICAgICAgIHRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgIC8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpIDw8KCgyKk4pKzEpOyAgKi8KLSAgICAgICAgICAgIHRtcDIgPSBMX3NobChxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSwgdG1wKTsKLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHRtcDIpOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbM10sIHBvc0FbMF0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzNdLCBwb3NBWzBdLCBOKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB0bXAgPSB2b19zdWIoKFdvcmQxNikoKHZvX0xfbXVsdCg1LCBOKSA+PiAxKSksIDEpOyAgICAgICAgLyogKCg1Kk4pLTEpKSAqLwotICAgICAgICAgICAgaW5kZXggPSBMX3NobCgxTCwgdG1wKTsgICAgICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg1Kk4pLTEpOyAqLwotICAgICAgICAgICAgdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLwotICAgICAgICAgICAgdG1wMiA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpLCB0bXApOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgdG1wMik7Ci0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIE4pOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLwotICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSwgdG1wKTsKLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgTik7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsgICovCi0gICAgICAgICAgICBpbmRleCA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpLCB0bXApOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0JbMF0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NBWzNdLCBwb3NCWzBdLCBOKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyAgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIHRtcCk7Ci0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVszXSwgcG9zQVs0XSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0FbNF0sIE4pOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGluIGZ1bmN0aW9uIHF1YW50XzVwXzVOXG4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKGluZGV4KTsKLX0KLQotCi1Xb3JkMzIgcXVhbnRfNnBfNk5fMiggICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoNipOKS0yIGJpdHMgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMS4uNiAgKi8KLSAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCi17Ci0gICAgV29yZDE2IG5iX3Bvcywgbl8xOwotICAgIFdvcmQxNiBwb3NBWzZdLCBwb3NCWzZdOwotICAgIFdvcmQzMiBpLCBqLCBrLCBpbmRleDsKLQotICAgIC8qICEhICBOIGFuZCBuXzEgYXJlIGNvbnN0YW50cyAtPiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgb3BlcmF0ZWQgYnkgQmFzaWMgT3BlcmF0b3JzICovCi0gICAgbl8xID0gKFdvcmQxNikgKE4gLSAxKTsKLSAgICBuYl9wb3MgPSAoMSA8PCBuXzEpOyAgICAgICAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDxuXzEpOyAqLwotCi0gICAgaSA9IDA7Ci0gICAgaiA9IDA7Ci0gICAgZm9yIChrID0gMDsgayA8IDY7IGsrKykKLSAgICB7Ci0gICAgICAgIGlmICgocG9zW2tdICYgbmJfcG9zKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3NBW2krK10gPSBwb3Nba107Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3NCW2orK10gPSBwb3Nba107Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGkpCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBpbmRleCA9ICgxIDw8IChXb3JkMTYpICg2ICogTiAtIDUpKTsgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDYqTiktNSk7ICovCi0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOKSk7IC8qIGluZGV4ICs9IHF1YW50XzVwXzVOKHBvc0IsIG5fMSkgPDwgTjsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0JbNV0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQls1XSwgbl8xKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpbmRleCA9ICgxTCA8PCAoV29yZDE2KSAoNiAqIE4gLSA1KSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg2Kk4pLTUpOyAqLwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzVwXzVOKHBvc0IsIG5fMSkgPDwgTikpOyAvKiBpbmRleCArPSBxdWFudF81cF81Tihwb3NCLCBuXzEpIDw8IE47ICovCi0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSk7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgaW5kZXggPSAoMUwgPDwgKFdvcmQxNikgKDYgKiBOIC0gNSkpOyAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNipOKS01KTsgKi8KLSAgICAgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzRwXzROKHBvc0IsIG5fMSkgPDwgKCgyKm5fMSkrMSk7ICovCi0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfNHBfNE4ocG9zQiwgbl8xKSA8PCAoV29yZDE2KSAoMiAqIG5fMSArIDEpKSk7Ci0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKSk7ICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIG5fMSk7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgaW5kZXggPSAocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKFdvcmQxNikgKDMgKiBuXzEgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoKDMqbl8xKSsxKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID12b19MX2FkZChpbmRleCwgcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSk7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgaSA9IDI7Ci0gICAgICAgICAgICBpbmRleCA9IChxdWFudF80cF80Tihwb3NBLCBuXzEpIDw8IChXb3JkMTYpICgyICogbl8xICsgMSkpOyAgLyogaW5kZXggPSBxdWFudF80cF80Tihwb3NBLCBuXzEpIDw8ICgoMipuXzEpKzEpOyAqLwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSkpOyAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGkgPSAxOwotICAgICAgICAgICAgaW5kZXggPSAocXVhbnRfNXBfNU4ocG9zQSwgbl8xKSA8PCBOKTsgICAgICAgLyogaW5kZXggPSBxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE47ICovCi0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NCWzBdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSk7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IChxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE4pOyAgICAgICAvKiBpbmRleCA9IHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTjsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0FbNV0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQVs1XSwgbl8xKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiBmdW5jdGlvbiBxdWFudF82cF82Tl8yXG4iKTsKLSAgICB9Ci0gICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKChMX2RlcG9zaXRfbChpKSAmIDNMKSA8PCAoV29yZDE2KSAoNiAqIE4gLSA0KSkpOyAgIC8qIGluZGV4ICs9IChpICYgMykgPDwgKCg2Kk4pLTQpOyAqLwotCi0gICAgcmV0dXJuIChpbmRleCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDJiYzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiQW1yd2JFbmNvZGVyVGVzdCIsCi0gICAgZ3Rlc3Q6IHRydWUsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJBbXJ3YkVuY29kZXJUZXN0LmNwcCIsCi0gICAgXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgICAgICAibGlic25kZmlsZSIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggMjYwYTYwYS4uMjI5MDcyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icApAQCAtMTQsNCArMTQsMTEgQEAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCmluZGV4IGVmODY5MTUuLmQ1ODg1YTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKQEAgLTIwLDkgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKLWV4dGVybiAiQyIgewogI2luY2x1ZGUgImdzbS5oIgotfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icAppbmRleCA0MzAzNTY1Li5lNWNjY2Q4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDcxICsxLDMgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKLSAgICBdLAotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLSAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcCIsCi0gICAgICAgICJzcmMvYml0c3RyZWFtLmNwcCIsCi0gICAgICAgICJzcmMvYmxvY2tfaWRjdC5jcHAiLAotICAgICAgICAic3JjL2NhbF9kY19zY2FsZXIuY3BwIiwKLSAgICAgICAgInNyYy9jaHZyX2ZpbHRlci5jcHAiLAotICAgICAgICAic3JjL2Nodl9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9jb21iaW5lZF9kZWNvZGUuY3BwIiwKLSAgICAgICAgInNyYy9jb25jZWFsLmNwcCIsCi0gICAgICAgICJzcmMvZGF0YXBhcnRfZGVjb2RlLmNwcCIsCi0gICAgICAgICJzcmMvZGNhY19wcmVkaWN0aW9uLmNwcCIsCi0gICAgICAgICJzcmMvZGVjX3ByZWRfaW50cmFfZGMuY3BwIiwKLSAgICAgICAgInNyYy9kZXJpbmdpbmdfY2hyb21hLmNwcCIsCi0gICAgICAgICJzcmMvZGVyaW5naW5nX2x1bWEuY3BwIiwKLSAgICAgICAgInNyYy9maW5kX21pbl9tYXguY3BwIiwKLSAgICAgICAgInNyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwIiwKLSAgICAgICAgInNyYy9nZXRfcHJlZF9vdXRzaWRlLmNwcCIsCi0gICAgICAgICJzcmMvaWRjdC5jcHAiLAotICAgICAgICAic3JjL2lkY3RfdmNhLmNwcCIsCi0gICAgICAgICJzcmMvbWJfbW90aW9uX2NvbXAuY3BwIiwKLSAgICAgICAgInNyYy9tYl91dGlscy5jcHAiLAotICAgICAgICAic3JjL3BhY2tldF91dGlsLmNwcCIsCi0gICAgICAgICJzcmMvcG9zdF9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9wb3N0X3Byb2Nfc2VtYXBob3JlLmNwcCIsCi0gICAgICAgICJzcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAiLAotICAgICAgICAic3JjL3BwX3NlbWFwaG9yZV9sdW1hLmNwcCIsCi0gICAgICAgICJzcmMvcHZkZWNfYXBpLmNwcCIsCi0gICAgICAgICJzcmMvc2NhbGluZ190YWIuY3BwIiwKLSAgICAgICAgInNyYy92bGNfZGVjb2RlLmNwcCIsCi0gICAgICAgICJzcmMvdmxjX2RlcXVhbnQuY3BwIiwKLSAgICAgICAgInNyYy92bGNfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvdm9wLmNwcCIsCi0gICAgICAgICJzcmMvemlnemFnX3RhYi5jcHAiLAotICAgIF0sCi0KLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIKLSAgICBdLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMiLApAQCAtNzMsOCArNSw2IEBACiAKICAgICBzcmNzOiBbIlNvZnRNUEVHNC5jcHAiXSwKIAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQogICAgIGNmbGFnczogWwogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjQwNGNlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpZm5kZWYgX01QNERFQ19BUElfSF8KLSNkZWZpbmUgX01QNERFQ19BUElfSF8KLQotI2luY2x1ZGUgIm00dmgyNjNfZGVjb2Rlcl9wdl90eXBlcy5oIgotCi0vLyAjZGVmaW5lIFBWX1RPTEVSQVRFX1ZPTF9FUlJPUlMKLSNkZWZpbmUgUFZfTUVNT1JZX1BPT0wKLQotI2lmbmRlZiBfUFZfVFlQRVNfCi0jZGVmaW5lIF9QVl9UWVBFU18KLQotdHlwZWRlZiB1aW50IEJvb2w7Ci0KLSNkZWZpbmUgUFZfQ09ERUNfSU5JVCAgMAotI2RlZmluZSBQVl9DT0RFQ19TVE9QICAxCi0jZW5kaWYKLQotI2RlZmluZSBQVl9UUlVFICAxCi0jZGVmaW5lIFBWX0ZBTFNFIDAKLQotI2lmbmRlZiBPU0NMX0lNUE9SVF9SRUYKLSNkZWZpbmUgT1NDTF9JTVBPUlRfUkVGIC8qIGVtcHR5ICovCi0jZW5kaWYKLSNpZm5kZWYgT1NDTF9FWFBPUlRfUkVGCi0jZGVmaW5lIE9TQ0xfRVhQT1JUX1JFRiAvKiBlbXB0eSAqLwotI2VuZGlmCi0KLS8qIGZsYWcgZm9yIHBvc3QtcHJvY2Vzc2luZyAgNC8yNS8wMCAqLwotCi0jaWZkZWYgREVDX05PUE9TVFBST0MKLSN1bmRlZiBQVl9QT1NUUFJPQ19PTiAgIC8qIGVuYWJsZSBjb21waWxhdGlvbiBvZiBwb3N0LXByb2Nlc3NpbmcgY29kZSAqLwotI2Vsc2UKLSNkZWZpbmUgUFZfUE9TVFBST0NfT04KLSNlbmRpZgotCi0jZGVmaW5lIFBWX05PX1BPU1RfUFJPQyAwCi0jZGVmaW5lIFBWX0RFQkxPQ0sgMQotI2RlZmluZSBQVl9ERVJJTkcgIDIKLQotCi0KLSNpbmNsdWRlICJ2aXN1YWxfaGVhZGVyLmgiIC8vIHN0cnVjdCBWb2xJbmZvIGlzIGRlZmluZWQKLQotCi0vKipAbmFtZSBTdHJ1Y3R1cmUgYW5kIERhdGEgVHlwZXMKLSAqIFRoZXNlIHR5cGUgZGVmaW5pdGlvbnMgc3BlY2lmeSB0aGUgaW5wdXQgLyBvdXRwdXQgZnJvbSB0aGUgUFZNZXNzYWdlCi0gKiBsaWJyYXJ5LgotICovCi0KLS8qQHsqLwotLyogVGhlIGFwcGxpY2F0aW9uIGhhcyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHRhZ091dHB1dEZyYW1lCi17Ci0gICAgdWludDggICAgICAgKmRhdGE7ICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0cHV0IFlVViBidWZmZXIgKi8KLSAgICB1aW50MzIgICAgICB0aW1lU3RhbXA7ICAgICAgLyogdGltZSBzdGFtcCAqLwotfSBPdXRwdXRGcmFtZTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnQXBwbGljYXRpb25EYXRhCi17Ci0gICAgaW50IGxheWVyOyAgICAgICAgICAvKiBjdXJyZW50IHZpZGVvIGxheWVyICovCi0gICAgdm9pZCAqb2JqZWN0OyAgICAgICAvKiBzb21lIG9wdGlvbmFsIGRhdGEgZmllbGQgKi8KLX0gYXBwbGljYXRpb25EYXRhOwotCi0vKiBBcHBsaWNhdGlvbiBjb250cm9scywgdGhpcyBzdHJ1Y3RlZCBzaGFsbCBiZSBhbGxvY2F0ZWQgKi8KLS8qICAgIGFuZCBpbml0aWFsaXplZCBpbiB0aGUgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9scwotewotICAgIC8qIFRoZSBmb2xsb3dpbmcgZnVjbnRpb24gcG9pbnRlciBpcyBjb3BpZWQgdG8gQml0c3RyZWFtRGVjVmlkZW8gc3RydWN0dXJlICAqLwotICAgIC8qICAgIHVwb24gaW5pdGlhbGl6YXRpb24gYW5kIG5ldmVyIHVzZWQgYWdhaW4uICovCi0gICAgaW50ICgqcmVhZEJpdHN0cmVhbURhdGEpKHVpbnQ4ICpidWYsIGludCBuYnl0ZXNfcmVxdWlyZWQsIHZvaWQgKmFwcERhdGEpOwotICAgIGFwcGxpY2F0aW9uRGF0YSBhcHBEYXRhOwotCi0gICAgdWludDggKm91dHB1dEZyYW1lOwotICAgIHZvaWQgKnZpZGVvRGVjb2RlckRhdGE7ICAgICAvKiB0aGlzIGlzIGFuIGludGVybmFsIHBvaW50ZXIgdGhhdCBpcyBvbmx5IHVzZWQgKi8KLSAgICAvKiBpbiB0aGUgZGVjb2RlciBsaWJyYXJ5LiAgICovCi0jaWZkZWYgUFZfTUVNT1JZX1BPT0wKLSAgICBpbnQzMiBzaXplOwotI2VuZGlmCi0gICAgaW50IG5MYXllcnM7Ci0gICAgLyogcG9pbnRlcnMgdG8gVk9MIGRhdGEgZm9yIGZyYW1lLWJhc2VkIGRlY29kaW5nLiAqLwotICAgIHVpbnQ4ICp2b2xidWZbMl07ICAgICAgICAgICAvKiBtYXhpbXVtIG9mIDIgbGF5ZXJzIGZvciBub3cgKi8KLSAgICBpbnQzMiB2b2xidWZfc2l6ZVsyXTsKLQotfSBWaWRlb0RlY0NvbnRyb2xzOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBIMjYzX01PREUgPSAwLCBNUEVHNF9NT0RFLCBVTktOT1dOX01PREUKLX0gTVA0RGVjb2RpbmdNb2RlOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNUDRfSV9GUkFNRSwgTVA0X1BfRlJBTUUsIE1QNF9CX0ZSQU1FLCBNUDRfQkFEX0ZSQU1FCi19IE1QNEZyYW1lVHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnVm9wSGVhZGVySW5mbwotewotICAgIGludCAgICAgY3VyckxheWVyOwotICAgIHVpbnQzMiAgdGltZXN0YW1wOwotICAgIE1QNEZyYW1lVHlwZSAgICBmcmFtZVR5cGU7Ci0gICAgaW50ICAgICByZWZTZWxDb2RlOwotICAgIGludDE2ICAgICAgIHF1YW50aXplcjsKLX0gVm9wSGVhZGVySW5mbzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIFZpZGVvUmVmQ29weUluZm86Ci0gKiBPTUFQIERTUCBzcGVjaWZpYyB0eXBlZGVmIHN0cnVjdHVyZSwgdG8gc3VwcG9ydCB0aGUgdXNlciAoQVJNKSBjb3B5aW5nCi0gKiBvZiBhIFJlZmVyZW5jZSBGcmFtZSBpbnRvIHRoZSBWaWRlbyBEZWNvZGVyLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB0YWdWaWRlb1JlZkNvcHlJbmZvUHRyCi17Ci0gICAgdWludDggICAqeUNoYW47ICAgICAgICAgICAgIC8qIFRoZSBZIGNvbXBvbmVudCBmcmFtZSB0aGUgdXNlciBjYW4gY29weSBhIG5ldyByZWZlcmVuY2UgdG8gKi8KLSAgICB1aW50OCAgICp1Q2hhbjsgICAgICAgICAgICAgLyogVGhlIFUgY29tcG9uZW50IGZyYW1lIHRoZSB1c2VyIGNhbiBjb3B5IGEgbmV3IHJlZmVyZW5jZSB0byAqLwotICAgIHVpbnQ4ICAgKnZDaGFuOyAgICAgICAgICAgICAvKiBUaGUgViBjb21wb25lbnQgZnJhbWUgdGhlIHVzZXIgY2FuIGNvcHkgYSBuZXcgcmVmZXJlbmNlIHRvICovCi0gICAgdWludDggICAqY3VycmVudFZvcDsgICAgICAgIC8qIFRoZSBWb3AgZm9yIHZpZGVvIHRoZSB1c2VyIGNhbiBjb3B5IGEgbmV3IHJlZmVyZW5jZSB0byAqLwotfSBWaWRlb1JlZkNvcHlJbmZvUHRyOwotCi10eXBlZGVmIHN0cnVjdCB0YWdWaWRlb1JlZkNvcHlJbmZvRGF0YQotewotICAgIGludDE2ICAgd2lkdGg7ICAgICAgICAgICAgICAvKiBXaWR0aCAqLwotICAgIGludDE2ICAgaGVpZ2h0OyAgICAgICAgICAgICAvKiBIZWlnaHQgKi8KLSAgICBpbnQxNiAgIHJlYWxXaWR0aDsgICAgICAgICAgLyogTm9uLXBhZGRlZCB3aWR0aCwgbm90IGEgbXVsdGlwbGUgb2YgMTYuICovCi0gICAgaW50MTYgICByZWFsSGVpZ2h0OyAgICAgICAgIC8qIE5vbi1wYWRkZWQgaGVpZ2h0LCBub3QgYSBtdWx0aXBsZSBvZiAxNi4gKi8KLX0gVmlkZW9SZWZDb3B5SW5mb0RhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IHRhZ1ZpZGVvUmVmQ29weUluZm8KLXsKLSAgICBWaWRlb1JlZkNvcHlJbmZvRGF0YSBkYXRhOwotICAgIFZpZGVvUmVmQ29weUluZm9QdHIgcHRyczsKLX0gVmlkZW9SZWZDb3B5SW5mbzsKLQotLypAfSovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLQotICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWSW5pdFZpZGVvRGVjb2RlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqdm9sYnVmW10sIGludDMyICp2b2xidWZfc2l6ZSwgaW50IG5MYXllcnMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgTVA0RGVjb2RpbmdNb2RlIG1vZGUpOwotICAgIEJvb2wgICAgUFZBbGxvY1ZpZGVvRGF0YShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuTGF5ZXJzKTsKLSAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7Ci0gICAgQm9vbCAgICBQVlJlc2V0VmlkZW9EZWNvZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOwotICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWU2V0UmVmZXJlbmNlWVVWKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYpOwotICAgIEJvb2wgICAgUFZEZWNTZXRSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgdWludDMyIHRpbWVzdGFtcCk7Ci0gICAgQm9vbCAgICBQVkRlY1NldEVuaFJlZmVyZW5jZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWLCB1aW50MzIgdGltZXN0YW1wKTsKLSAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkRlY29kZVZpZGVvRnJhbWUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKmJpdHN0cmVhbVtdLCB1aW50MzIgKnRpbWVzdGFtcCwgaW50MzIgKmJ1ZmZlcl9zaXplLCB1aW50IHVzZV9leHRfdGltZXN0YW1wW10sIHVpbnQ4KiBjdXJyWVVWKTsKLSAgICBCb29sICAgIFBWRGVjb2RlVm9wSGVhZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpidWZmZXJbXSwgdWludDMyIHRpbWVzdGFtcFtdLCBpbnQzMiBidWZmZXJfc2l6ZVtdLCBWb3BIZWFkZXJJbmZvICpoZWFkZXJfaW5mbywgdWludCB1c2VfZXh0X3RpbWVzdGFtcFtdLCB1aW50OCAqY3VycllVVik7Ci0gICAgQm9vbCAgICBQVkRlY29kZVZvcEJvZHkoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50MzIgYnVmZmVyX3NpemVbXSk7Ci0gICAgdm9pZCAgICBQVkRlY1Bvc3RQcm9jZXNzKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpvdXRwdXRZVVYpOwotICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyICpkaXNwbGF5X3dpZHRoLCBpbnQzMiAqZGlzcGxheV9oZWlnaHQpOwotICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQzMiAqYnVmX3dpZHRoLCBpbnQzMiAqYnVmX2hlaWdodCk7Ci0gICAgT1NDTF9JTVBPUlRfUkVGIHZvaWQgICAgUFZTZXRQb3N0UHJvY1R5cGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50IG1vZGUpOwotICAgIHVpbnQzMiAgUFZHZXRWaWRlb1RpbWVTdGFtcChWaWRlb0RlY0NvbnRyb2xzICpkZWNvZGVyQ29udHJvbCk7Ci0gICAgaW50ICAgICBQVkdldERlY0JpdHJhdGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7Ci0gICAgaW50ICAgICBQVkdldERlY0ZyYW1lcmF0ZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKLSAgICB1aW50OCAgICpQVkdldERlY091dHB1dEZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOwotICAgIGludCAgICAgUFZHZXRMYXllcklEKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOwotICAgIGludDMyICAgUFZHZXREZWNNZW1vcnlVc2FnZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKLSAgICBPU0NMX0lNUE9SVF9SRUYgTVA0RGVjb2RpbmdNb2RlIFBWR2V0RGVjQml0c3RyZWFtTW9kZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKLSAgICBCb29sICAgIFBWRXh0cmFjdFZvbEhlYWRlcih1aW50OCAqdmlkZW9fYnVmZmVyLCB1aW50OCAqdm9sX2hlYWRlciwgaW50MzIgKnZvbF9oZWFkZXJfc2l6ZSk7Ci0gICAgaW50MzIgICBQVkxvY2F0ZUZyYW1lSGVhZGVyKHVpbnQ4ICp2aWRlb19idWZmZXIsIGludDMyIHZvcF9zaXplKTsKLSAgICBpbnQzMiAgIFBWTG9jYXRlSDI2M0ZyYW1lSGVhZGVyKHVpbnQ4ICp2aWRlb19idWZmZXIsIGludDMyIHZvcF9zaXplKTsKLSAgICBCb29sICAgIFBWR2V0Vm9sSW5mbyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBWb2xJbmZvICpwVm9sSW5mbyk7IC8vIEJYIDYvMjQvMDQKLSAgICBCb29sICAgIElzSW50cmFGcmFtZShWaWRlb0RlY0NvbnRyb2xzICpkZWNvZGVyQ29udHJvbCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYgLyogX01QNERFQ19BUElfSF8gKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NjFlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLQotIERlc2NyaXB0aW9uOiBTZXBhcmF0ZWQgbW9kdWxlcyBpbnRvIG9uZSBmdW5jdGlvbiBwZXIgZmlsZSBhbmQgcHV0IGludG8KLSAgICBuZXcgdGVtcGxhdGUuCi0KLSBEZXNjcmlwdGlvbjogT3B0aW1pemluZyBDIGNvZGUgYW5kIGFkZGluZyBjb21tZW50cy4gIEFsc28gY2hhbmdpbmcgdmFyaWFibGUKLSAgICBuYW1lcyB0byBtYWtlIHRoZW0gbW9yZSBtZWFuaW5nZnVsLgotCi0gV2hvOiAgICAgICAgICAgICAgICAgICBEYXRlOgotIERlc2NyaXB0aW9uOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0KLSAgICBSZWNfWSA9IHBvaW50ZXIgdG8gMHRoIHBvc2l0aW9uIGluIGJ1ZmZlciBjb250YWluaW5nIGx1bWluYW5jZSB2YWx1ZXMKLSAgICAgICAgb2YgdHlwZSB1aW50OC4KLSAgICB5X3N0YXJ0ID0gdmFsdWUgb2YgeSBjb29yZGluYXRlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZSBmaXJzdAotICAgICAgICByb3cgb2YgcGl4ZWxzIHRvIGJlIHVzZWQgaW4gdGhlIGZpbHRlciBhbGdvcml0aG0uCi0gICAgeF9zdGFydCA9IHZhbHVlIG9mIHggY29vcmRpbmF0ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUgZmlyc3QKLSAgICAgICAgY29sdW1uIG9mIHBpeGVscyB0byBiZSB1c2VkIGluIHRoZSBmaWx0ZXIgYWxnb3JpdGhtLgotICAgIHlfYmxrX3N0YXJ0ID0gdmFsdWUgb2YgdGhlIHkgY29vcmRpbmF0ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUKLSAgICAgICAgcm93IG9mIHBpeGVscyB3aGljaCBjb250YWlucyB0aGUgc3RhcnQgb2YgYSBibG9jay4gVGhlIHJvdwotICAgICAgICBzcGVjaWZpZWQgYnkgeV9ibGtfc3RhcnQrQkxLX1NJWkUgaXMgdGhlIGxhc3Qgcm93IG9mIHBpeGVscwotICAgICAgICB0aGF0IGFyZSB1c2VkIGluIHRoZSBmaWx0ZXIgYWxnb3JpdGhtLgotICAgIHhfYmxrX3N0YXJ0ID0gdmFsdWUgb2YgdGhlIHggY29vcmRpbmF0ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUKLSAgICAgICAgY29sdW1uIG9mIHBpeGVscyB3aGljaCBjb250YWlucyB0aGUgc3RhcnQgb2YgYSBibG9jay4gIFRoZQotICAgICAgICBjb2x1bW4gc3BlY2lmaWVkIGJ5IHhfYmxrX3N0YXJ0K0JMS19TSVpFIGlzIHRoZSBsYXN0IGNvbHVtbiBvZgotICAgICAgICBwaXhlbHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgZmlsdGVyIGFsZ29yaXRobS4KLSAgICB0aHIgPSB2YWx1ZSBvZiB0eXBlIGludCB0aGF0IGlzIGNvbXBhcmVkIHRvIHRoZSBlbGVtZW50cyBpbiBSZWNfWSB0bwotICAgICAgICBkZXRlcm1pbmUgaWYgYSBwYXJ0aWN1bGFyIHZhbHVlIGluIFJlY19ZIHdpbGwgYmUgbW9kaWZpZWQgYnkKLSAgICAgICAgdGhlIGZpbHRlciBvciBub3QKLSAgICB3aWR0aCA9IHZhbHVlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgZGlzcGxheQotICAgICAgICBpbiBwaXhlbHMgKG9yIHBlbHMsIGVxdWl2YWxlbnRseSkuCi0gICAgbWF4X2RpZmYgPSB2YWx1ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUgdmFsdWUgdGhhdCBtYXkgYmUgYWRkZWQKLSAgICAgICAgb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBwaXhlbCBpbiBSZWNfWSB0aGF0IGlzIGJlaW5nIGZpbHRlcmVkCi0gICAgICAgIGlmIHRoZSBmaWx0ZXIgYWxnb3JpdGhtIGRlY2lkZXMgdG8gY2hhbmdlIHRoYXQgcGFydGljdWxhcgotICAgICAgICBwaXhlbCdzIGx1bWluYW5jZSB2YWx1ZS4KLQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBOb25lCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBCdWZmZXIgcG9pbnRlZCB0byBieSBSZWNfWSBpcyBtb2RpZmllZCB3aXRoIHRoZSBmaWx0ZXJlZAotICAgIGx1bWluYW5jZSB2YWx1ZXMuCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OCi0KLSBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgYSBtb3Rpb24gY29tcGVuc2F0ZWQgbm9pc2UgZmlsdGVyIHVzaW5nIGFkYXB0aXZlCi0gd2VpZ2h0ZWQgYXZlcmFnaW5nIG9mIGx1bWluYW5jZSB2YWx1ZXMuICAqUmVjX1kgY29udGFpbnMgdGhlIGx1bWluYW5jZSB2YWx1ZXMKLSB0aGF0IGFyZSBiZWluZyBmaWx0ZXJlZC4KLQotIFRoZSBwaWN0dXJlIGJlbG93IGRlcGljdHMgYSAzeDMgZ3JvdXAgb2YgcGl4ZWwgbHVtaW5hbmNlIHZhbHVlcy4gIFRoZSAidSIsICJjIiwKLSBhbmQgImwiIHN0YW5kIGZvciAidXBwZXIiLCAiY2VudGVyIiBhbmQgImxvd2VyIiwgcmVzcGVjdGl2ZWx5LiAgVGhlIGxvY2F0aW9uCi0gb2YgcGVsYzAgaXMgc3BlY2lmaWVkIGJ5IHhfc3RhcnQgYW5kIHlfc3RhcnQgaW4gdGhlIDEtRCBhcnJheSAiUmVjX1kiIGFzCi0gZm9sbG93cyAoYXNzdW1pbmcgeF9zdGFydD0wKToKLQotIGxvY2F0aW9uIG9mIHBlbGMwID0gWyh5X3N0YXJ0KzEpICogd2lkdGhdICsgeF9zdGFydAotCi0gTW92aW5nIHVwIG9yIGRvd24gMSByb3cgKG1vdmluZyBmcm9tIHBlbHUyIHRvIHBlbGMyLCBmb3IgZXhhbXBsZSkgaXMgZG9uZSBieQotIGluY3JlbWVudGluZyBvciBkZWNyZW1lbnRpbmcgIndpZHRoIiBlbGVtZW50cyB3aXRoaW4gUmVjX1kuCi0KLSBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHVwcGVyIGxlZnQgaGFuZCBjb3JuZXIgb2YgYSBibG9jayAobm90IHRoZSBncm91cCBvZgotIDkgcGl4ZWxzIGRlcGljdGVkIGluIHRoZSBmaWd1cmUgYmVsb3cpIGlzIHNwZWNpZmllZCBieQotICh5X2Jsa19zdGFydCwgeF9ibGtfc3RhcnQpLiAgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJsb2NrIGlzIEJMS1NJWkUuCi0gKHlfc3RhcnQseF9zdGFydCkgbWF5IGJlIHNwZWNpZmllZCBpbmRlcGVuZGVudGx5IG9mICh5X2Jsa19zdGFydCwgeF9ibGtfc3RhcnQpLgotCi0gICAgKHlfc3RhcnQseF9zdGFydCkKLSAtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHwgICB8ICAgfCAgIHwgICB8Ci0gICAgfCAgIFggICB8IHBlbHUxIHwgcGVsdTIgfAotICAgIHwgcGVsdTAgfCAgIHwgICB8Ci0gICAgfCAgIHwgICB8ICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgfCAgIHwgICB8ICAgfAotICAgIHwgcGVsYzAgfCBwZWxjMSB8IHBlbGMyIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gICAgfCAgIHwgICB8ICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgfCAgIHwgICB8ICAgfAotICAgIHwgcGVsbDAgfCBwZWxsMSB8IHBlbGwyIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gICAgfCAgIHwgICB8ICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBUaGUgZmlsdGVyaW5nIG9mIHRoZSBsdW1pbmFuY2UgdmFsdWVzIGlzIGFjaGlldmVkIGJ5IGNvbXBhcmluZyB0aGUgOQotIGx1bWluYW5jZSB2YWx1ZXMgdG8gYSB0aHJlc2hvbGQgdmFsdWUgKCJ0aHIiKSBhbmQgdGhlbiBjaGFuZ2luZyB0aGUKLSBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEgaWYgYWxsIG9mIHRoZSB2YWx1ZXMgYXJlIGFib3ZlIG9yIGFsbCBvZiB0aGUgdmFsdWVzCi0gYXJlIGJlbG93IHRoZSB0aHJlc2hvbGQuICBUaGUgYW1vdW50IHRoYXQgdGhlIGx1bWluYW5jZSB2YWx1ZSBpcyBjaGFuZ2VkCi0gZGVwZW5kcyBvbiBhIHdlaWdodGVkIHN1bSBvZiB0aGUgOSBsdW1pbmFuY2UgdmFsdWVzLiBUaGUgcG9zaXRpb24gb2YgUGVsYzEKLSBpcyB0aGVuIGFkdmFuY2VkIHRvIHRoZSByaWdodCBieSBvbmUgKGFzIHdlbGwgYXMgYWxsIG9mIHRoZSBzdXJyb3VuZGluZyBwaXhlbHMpCi0gYW5kIHRoZSBzYW1lIGNhbGN1bGF0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbiBmb3IgdGhlIGx1bWluYW5jZSB2YWx1ZSBvZiB0aGUgbmV3Ci0gUGVsYzEuIFRoaXMgY29udGludWVzIHJvdy13aXNlIHVudGlsIHBpeGVscyBpbiB0aGUgbGFzdCByb3cgb2YgdGhlIGJsb2NrIGFyZQotIGZpbHRlcmVkLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUwotCi0gTm9uZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gLi5cY29yZWxpYnNcZGVjb2Rlclxjb21tb25cc3JjXHBvc3RfcHJvYy5jCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFU09VUkNFUyBVU0VECi0gICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAotICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0gREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQotICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCi0gICAgICAgICAgIGNhbGxlZF0KLQotICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQotICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09OVl9QT1NTSUJMRV9MT1NTX09GX0RBVEEKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBBZGFwdGl2ZVNtb290aF9Ob01NWCgKLSAgICB1aW50OCAqUmVjX1ksICAgICAgIC8qIGkvbyAgKi8KLSAgICBpbnQgeV9zdGFydCwgICAgICAgIC8qIGkgICAgKi8KLSAgICBpbnQgeF9zdGFydCwgICAgICAgIC8qIGkgICAgKi8KLSAgICBpbnQgeV9ibGtfc3RhcnQsICAgIC8qIGkgICAgKi8KLSAgICBpbnQgeF9ibGtfc3RhcnQsICAgIC8qIGkgICAgKi8KLSAgICBpbnQgdGhyLCAgICAgICAgLyogaSAgICAqLwotICAgIGludCB3aWR0aCwgICAgICAvKiBpICAgICovCi0gICAgaW50IG1heF9kaWZmICAgICAgICAvKiBpICAgICovCi0pCi17Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50ICBzaWduX3ZbMTVdOwotICAgIGludCBzdW1fdlsxNV07Ci0gICAgaW50ICpzdW1fVl9wdHI7Ci0gICAgaW50ICpzaWduX1ZfcHRyOwotICAgIHVpbnQ4IHBlbHU7Ci0gICAgdWludDggcGVsYzsKLSAgICB1aW50OCBwZWxsOwotICAgIHVpbnQ4ICpwZWxwOwotICAgIHVpbnQ4IG9sZHJvd1sxNV07Ci0gICAgaW50ICBzdW07Ci0gICAgaW50IHN1bTE7Ci0gICAgdWludDggKlJlY19ZX3B0cjsKLSAgICBpbnQzMiAgYWRkcl92OwotICAgIGludCByb3dfY250cjsKLSAgICBpbnQgY29sX2NudHI7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qICBmaXJzdCByb3cKLSAgICAqLwotICAgIGFkZHJfdiA9IChpbnQzMikoeV9zdGFydCArIDEpICogd2lkdGg7ICAvKiB5IGNvb3JkIG9mIDFzdCBlbGVtZW50IGluIHRoZSByb3cgIC8KLSAgICAgICAgICAgICAgICAgICAgIC9jb250YWluaW5nIHBlbGMgcGl4ZWwgLyAgICAgKi8KLSAgICBSZWNfWV9wdHIgPSAmUmVjX1lbYWRkcl92ICsgeF9zdGFydF07ICAvKiBpbml0aWFsaXppbmcgcG9pbnRlciB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgcGVsYzAgcG9zaXRpb24gICovCi0gICAgc3VtX1ZfcHRyID0gJnN1bV92WzBdOyAgLyogaW5pdGlhbGl6aW5nIHBvaW50ZXIgdG8gMHRoIGVsZW1lbnQgb2YgYXJyYXkKLSAgICAgICAgICAgICAgICAvICAgdGhhdCB3aWxsIGNvbnRhaW4gd2VpZ2h0ZWQgc3VtcyBvZiBwaXhlbAotICAgICAgICAgICAgICAgIC8gICBsdW1pbmFuY2UgdmFsdWVzICovCi0gICAgc2lnbl9WX3B0ciA9ICZzaWduX3ZbMF07ICAvKiAgaW5pdGlhbGl6aW5nIHBvaW50ZXIgdG8gMHRoIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgIC8gICBhcnJheSB0aGF0IHdpbGwgY29udGFpbiBzdW1zIHRoYXQgaW5kaWNhdGUKLSAgICAgICAgICAgICAgICAgIC8gICAgaG93IG1hbnkgb2YgdGhlIDkgcGl4ZWxzIGFyZSBhYm92ZSBvciBiZWxvdwotICAgICAgICAgICAgICAgICAgLyAgICB0aGUgdGhyZXNob2xkIHZhbHVlICh0aHIpICAgICovCi0gICAgcGVscCA9ICZvbGRyb3dbMF07ICAvKiBpbml0aWFsaXppbmcgcG9pbnRlciB0byB0aGUgMHRoIGVsZW1lbnQgb2YgYXJyYXkKLSAgICAgICAgICAgICAgICAvICAgIHRoYXQgd2lsbCBjb250YWluIGN1cnJlbnQgdmFsdWVzIG9mIHBlbGMgdGhhdAotICAgICAgICAgICAgICAgIC8gICBhcmUgc2F2ZWQgYW5kIHVzZWQgYXMgdmFsdWVzIG9mIHBlbHUgd2hlbiB0aGUKLSAgICAgICAgICAgICAgICAvICAgbmV4dCByb3cgb2YgcGl4ZWxzIGFyZSBmaWx0ZXJlZCAqLwotCi0gICAgcGVsdSA9ICooUmVjX1lfcHRyIC0gd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbHUwIHRvIHBlbHUgICovCi0gICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOyAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsYzAgdG8gcGVsYyBhbmQKLSAgICAgICAgICAgICAgICAgICAgIC8gIHN0b3JpbmcgdGhpcyB2YWx1ZSBpbiBwZWxwIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAvICAgd2lsbCBiZSB1c2VkIGFzIHZhbHVlIG9mIHBlbHUwIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgIC8gIG5leHQgcm93IGlzIGZpbHRlcmVkICovCi0gICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGwwIHRvIHBlbGwgKi8KLSAgICBSZWNfWV9wdHIrKzsgLyogYWR2YW5jaW5nIHBvaW50ZXIgZnJvbSBwZWxjMCB0byBwZWxjMSAqLwotICAgICpzdW1fVl9wdHIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7ICAvKiB3ZWlnaHRlZCBzdW0gb2YgcGVsdTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyAgcGVsYzAgYW5kIHBlbGwwICAqLwotICAgIC8qIHN1bSBvZiAwJ3MgYW5kIDEncyAoMCBpZiBwaXhlbCB2YWx1ZSBpcyBiZWxvdyB0aHIsIDEgaWYgdmFsdWUKLSAgICAvaXMgYWJvdmUgdGhyKSAgKi8KLSAgICAqc2lnbl9WX3B0cisrID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKyBJTkRFWChwZWxsLCB0aHIpOwotCi0KLSAgICBwZWx1ID0gKihSZWNfWV9wdHIgLSB3aWR0aCk7ICAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsdTEgdG8gcGVsdSAqLwotICAgICpwZWxwKysgPSBwZWxjID0gKlJlY19ZX3B0cjsgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGMxIHRvIHBlbGMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAvICBzdG9yaW5nIHRoaXMgdmFsdWUgaW4gcGVscCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgLyAgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBvZiBwZWx1MSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAvICBuZXh0IHJvdyBpcyBmaWx0ZXJlZCAqLwotICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsgIC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxsMSB0byBwZWxsICovCi0gICAgUmVjX1lfcHRyKys7ICAvKiBhZHZhbmNpbmcgcG9pbnRlciBmcm9tIHBlbGMxIHRvIHBlbGMyICovCi0gICAgKnN1bV9WX3B0cisrID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsgLyogd2VpZ2h0ZWQgc3VtIG9mIHBlbHUxLAotICAgICAgICAgICAgICAgICAgICAgICAgLyBwZWxjMSBhbmQgcGVsbDEgICovCi0gICAgLyogc3VtIG9mIDAncyBhbmQgMSdzICgwIGlmIHBpeGVsIHZhbHVlIGlzIGJlbG93IHRociwgMSBpZiB2YWx1ZQotICAgIC9pcyBhYm92ZSB0aHIpICAqLwotICAgICpzaWduX1ZfcHRyKysgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArIElOREVYKHBlbGwsIHRocik7Ci0KLSAgICAvKiBUaGUgbG9vcCBiZWxvdyBwZXJmb3JtcyB0aGUgZmlsdGVyaW5nIGZvciB0aGUgZmlyc3Qgcm93IG9mCi0gICAgLyAgIHBpeGVscyBpbiB0aGUgcmVnaW9uLiAgSXQgc3RlcHMgYWNyb3NzIHRoZSByZW1haW5pbmcgcGl4ZWxzIGluCi0gICAgLyAgIHRoZSByb3cgYW5kIGFsdGVycyB0aGUgbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlmIG5lY2Vzc2FyeSwKLSAgICAvICAgZGVwZW5kaW5nIG9uIHRoZSBsdW1pbmFuY2UgdmFsdWVzIG9mIHRoZSBhZGphY2VudCBwaXhlbHMqLwotCi0gICAgZm9yIChjb2xfY250ciA9ICh4X2Jsa19zdGFydCArIEJMS1NJWkUgLSAxKSAtIHhfc3RhcnQ7IGNvbF9jbnRyID4gMDsgY29sX2NudHItLSkKLSAgICB7Ci0gICAgICAgIHBlbHUgPSAqKFJlY19ZX3B0ciAtIHdpZHRoKTsgIC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWx1MiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLyAgIHBlbHUgKi8KLSAgICAgICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOyAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsYzIgdG8gcGVsYwotICAgICAgICAgICAgICAgICAgICAgICAgIC8gYW5kIHN0b3JpbmcgdGhpcyB2YWx1ZSBpbiBwZWxwCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyB3aGljaCB3aWxsIGJlIHVzZWQgICBhcyB2YWx1ZSBvZiBwZWx1MgotICAgICAgICAgICAgICAgICAgICAgICAgIC8gd2hlbiBuZXh0IHJvdyBpcyBmaWx0ZXJlZCAqLwotICAgICAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7IC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxsMiB0byBwZWxsICovCi0KLSAgICAgICAgLyogd2VpZ2h0ZWQgc3VtIG9mIHBlbHUxLCBwZWxjMSBhbmQgcGVsbDEgICovCi0gICAgICAgICpzdW1fVl9wdHIgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAvKiBzdW0gb2YgMCdzIGFuZCAxJ3MgKDAgaWYgcGl4ZWwgdmFsdWUgaXMgYmVsb3cgdGhyLAotICAgICAgICAvMSBpZiB2YWx1ZSBpcyBhYm92ZSB0aHIpICAqLwotICAgICAgICAqc2lnbl9WX3B0ciA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsKLSAgICAgICAgICAgICAgICAgICAgICBJTkRFWChwZWxsLCB0aHIpOwotICAgICAgICAvKiB0aGUgdmFsdWUgb2Ygc3VtMSBpbmRpY2F0ZXMgaG93IG1hbnkgb2YgdGhlIDkgcGl4ZWxzJwotICAgICAgICAvbHVtaW5hbmNlIHZhbHVlcyBhcmUgYWJvdmUgb3IgZXF1YWwgdG8gdGhyICovCi0gICAgICAgIHN1bTEgPSAqKHNpZ25fVl9wdHIgLSAyKSArICooc2lnbl9WX3B0ciAtIDEpICsgKnNpZ25fVl9wdHI7Ci0KLSAgICAgICAgLyogYWx0ZXIgdGhlIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSBpZiBhbGwgOSBsdW1pbmFuY2UgdmFsdWVzCi0gICAgICAgIC9hcmUgYWJvdmUgb3IgZXF1YWwgdG8gdGhyIG9yIGlmIGFsbCA5IHZhbHVlcyBhcmUgYmVsb3cgdGhyICovCi0gICAgICAgIGlmIChzdW0xID09IDAgfHwgc3VtMSA9PSA5KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdW0gaXMgYSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSA5IHBpeGVsIGx1bWluYW5jZQotICAgICAgICAgICAgL3ZhbHVlcyAgICovCi0gICAgICAgICAgICBzdW0gPSAoKihzdW1fVl9wdHIgLSAyKSArICgqKHN1bV9WX3B0ciAtIDEpIDw8IDEpICsKLSAgICAgICAgICAgICAgICAgICAqc3VtX1ZfcHRyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgUmVjX1lfcHRyLS07ICAvKiBtb3ZlIHBvaW50ZXIgYmFjayB0byBwZWxjMSAgKi8KLSAgICAgICAgICAgIC8qIElmIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSBpcyBsYXJnZXIgdGhhbgotICAgICAgICAgICAgLyBzdW0gYnkgbW9yZSB0aGFuIG1heF9kaWZmLCB0aGVuIHN1YnJhY3QgbWF4X2RpZmYKLSAgICAgICAgICAgIC8gZnJvbSBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEqLwotICAgICAgICAgICAgaWYgKChpbnQpKCpSZWNfWV9wdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VtID0gKlJlY19ZX3B0ciAtIG1heF9kaWZmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogSWYgbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlzIHNtYWxsZXIgdGhhbgotICAgICAgICAgICAgLyBzdW0gYnkgbW9yZSB0aGFuIG1heF9kaWZmLCB0aGVuIGFkZCBtYXhfZGlmZgotICAgICAgICAgICAgLyB0byBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEqLwotICAgICAgICAgICAgZWxzZSBpZiAoKGludCkoKlJlY19ZX3B0ciAtIHN1bSkgPCAtbWF4X2RpZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VtID0gKlJlY19ZX3B0ciArIG1heF9kaWZmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKlJlY19ZX3B0cisrID0gc3VtOyAvKiBhc3NpZ24gdmFsdWUgb2Ygc3VtIHRvIHBlbGMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFkdmFuY2UgcG9pbnRlciB0byBwZWxjMiAqLwotICAgICAgICB9Ci0gICAgICAgIFJlY19ZX3B0cisrOyAvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV3IHZhbHVlIG9mIHBlbGMyCi0gICAgICAgICAgICAgICAgIC8gICBvbGQgcGVsYzIgaXMgbm93IHRyZWF0ZWQgYXMgcGVsYzEqLwotICAgICAgICBzdW1fVl9wdHIrKzsgLyogcG9pbnRlciBpcyBhZHZhbmNlZCBzbyBuZXh0IHdlaWdodGVkIHN1bSBtYXkKLSAgICAgICAgICAgICAgICAgLyAgYmUgc2F2ZWQgKi8KLSAgICAgICAgc2lnbl9WX3B0cisrOyAvKiBwb2ludGVyIGlzIGFkdmFuY2VkIHNvIG5leHQgc3VtIG9mIDAncyBhbmQKLSAgICAgICAgICAgICAgICAgIC8gMSdzIG1heSBiZSBzYXZlZCAgKi8KLSAgICB9Ci0KLSAgICAvKiBUaGUgbmVzdGVkIGxvb3BzIGJlbG93IHBlcmZvcm0gdGhlIGZpbHRlcmluZyBmb3IgdGhlIHJlbWFpbmluZyByb3dzICovCi0KLSAgICBhZGRyX3YgPSAoeV9zdGFydCArIDIpICogd2lkdGg7ICAvKiBhZHZhbmNlIGFkZHJfdiB0byB0aGUgbmV4dCByb3cKLSAgICAgICAgICAgICAgICAgICAgIC8gICAoY29ycmVzcG9uZGluZyB0byBwZWxsMCkqLwotICAgIC8qIFRoZSBvdXRlciBsb29wIHN0ZXBzIHRocm91Z2h0IHRoZSByb3dzLiAgICovCi0gICAgZm9yIChyb3dfY250ciA9ICh5X2Jsa19zdGFydCArIEJMS1NJWkUpIC0gKHlfc3RhcnQgKyAyKTsgcm93X2NudHIgPiAwOyByb3dfY250ci0tKQotICAgIHsKLSAgICAgICAgUmVjX1lfcHRyID0gJlJlY19ZW2FkZHJfdiArIHhfc3RhcnRdOyAvKiBhZHZhbmNlIHBvaW50ZXIgdG8KLSAgICAgICAgICAgIC90aGUgb2xkIHBlbGwwLCB3aGljaCBoYXMgYmVjb21lIHRoZSBuZXcgcGVsYzAgKi8KLSAgICAgICAgYWRkcl92ICs9IHdpZHRoOyAgLyogbW92ZSBhZGRyX3YgZG93biAxIHJvdyAqLwotICAgICAgICBzdW1fVl9wdHIgPSAmc3VtX3ZbMF07ICAvKiByZS1pbml0aWFsaXppbmcgcG9pbnRlciAqLwotICAgICAgICBzaWduX1ZfcHRyID0gJnNpZ25fdlswXTsgIC8qIHJlLWluaXRpbGFpemluZyBwb2ludGVyICovCi0gICAgICAgIHBlbHAgPSAmb2xkcm93WzBdOyAvKiByZS1pbml0aWFsaXppbmcgcG9pbnRlciAqLwotCi0gICAgICAgIHBlbHUgPSAqcGVscDsgLyogc2V0dGluZyBwZWx1MCB0byBvbGQgdmFsdWUgb2YgcGVsYzAgKi8KLSAgICAgICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOwotICAgICAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7Ci0gICAgICAgIFJlY19ZX3B0cisrOwotICAgICAgICAqc3VtX1ZfcHRyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAqc2lnbl9WX3B0cisrID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKwotICAgICAgICAgICAgICAgICAgICAgICAgSU5ERVgocGVsbCwgdGhyKTsKLQotICAgICAgICBwZWx1ID0gKnBlbHA7IC8qIHNldHRpbmcgcGVsdTEgdG8gb2xkIHZhbHVlIG9mIHBlbGMxICovCi0gICAgICAgICpwZWxwKysgPSBwZWxjID0gKlJlY19ZX3B0cjsKLSAgICAgICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOwotICAgICAgICBSZWNfWV9wdHIrKzsKLSAgICAgICAgKnN1bV9WX3B0cisrID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgKnNpZ25fVl9wdHIrKyA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIElOREVYKHBlbGwsIHRocik7Ci0gICAgICAgIC8qIFRoZSBpbm5lciBsb29wIHN0ZXBzIHRocm91Z2ggdGhlIGNvbHVtbnMgKi8KLSAgICAgICAgZm9yIChjb2xfY250ciA9ICh4X2Jsa19zdGFydCArIEJMS1NJWkUgLSAxKSAtIHhfc3RhcnQ7IGNvbF9jbnRyID4gMDsgY29sX2NudHItLSkKLSAgICAgICAgewotICAgICAgICAgICAgcGVsdSA9ICpwZWxwOyAvKiBzZXR0aW5nIHBlbHUyIHRvIG9sZCB2YWx1ZSBvZiBwZWxjMiAqLwotICAgICAgICAgICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOwotICAgICAgICAgICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOwotCi0gICAgICAgICAgICAqc3VtX1ZfcHRyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgICAgICpzaWduX1ZfcHRyID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWChwZWxsLCB0aHIpOwotCi0gICAgICAgICAgICBzdW0xID0gKihzaWduX1ZfcHRyIC0gMikgKyAqKHNpZ25fVl9wdHIgLSAxKSArICpzaWduX1ZfcHRyOwotICAgICAgICAgICAgLyogdGhlICJpZiIgc3RhdGVtZW50IGJlbG93IGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgaW4KLSAgICAgICAgICAgIC8gdGhlIGZpcnN0IGxvb3AgKi8KLSAgICAgICAgICAgIGlmIChzdW0xID09IDAgfHwgc3VtMSA9PSA5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1bSA9ICgqKHN1bV9WX3B0ciAtIDIpICsgKCooc3VtX1ZfcHRyIC0gMSkgPDwgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAqc3VtX1ZfcHRyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgICAgIFJlY19ZX3B0ci0tOwotICAgICAgICAgICAgICAgIGlmICgoaW50KSgqUmVjX1lfcHRyIC0gc3VtKSA+IG1heF9kaWZmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VtID0gKlJlY19ZX3B0ciAtIG1heF9kaWZmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgoaW50KSgqUmVjX1lfcHRyIC0gc3VtKSA8IC1tYXhfZGlmZikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bSA9ICpSZWNfWV9wdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKlJlY19ZX3B0cisrID0gKHVpbnQ4KSBzdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZWNfWV9wdHIrKzsKLSAgICAgICAgICAgIHN1bV9WX3B0cisrOwotICAgICAgICAgICAgc2lnbl9WX3B0cisrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxMDA4Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxMiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBbaW5wdXRfdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IHRvIG1vZHVsZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHN0b3JlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbbG9jYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBidWZmZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbbG9jYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBwb2ludGVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBzdG9yZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtnbG9iYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgYnVmZmVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2dsb2JhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBwb2ludGVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gT3V0cHV0czoKLSAgICBbcmV0dXJuX3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIGRhdGEvcG9pbnRlciByZXR1cm5lZAotICAgICAgICAgICAgICAgICAgYnkgbW9kdWxlLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIFt2YXJpYWJsZV9iZnJfcHRyXSBwb2ludHMgdG8gdGhlIFtkZXNjcmliZSB3aGVyZSB0aGUKLSAgICAgIHZhcmlhYmxlX2Jmcl9wdHIgcG9pbnRzIHRvLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCi0gICAgICAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbdmFyaWFibGVfYmZyXSBjb250ZW50cyBhcmUgW2Rlc2NyaWJlIHRoZSBuZXcgY29udGVudHMgb2YKLSAgICAgIHZhcmlhYmxlX2Jmcl0KLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVRVUlSRU1FTlRTCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFRkVSRU5DRVMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUFNFVURPLUNPREUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVTT1VSQ0VTIFVTRUQKLSAgIFdoZW4gdGhlIGNvZGUgaXMgd3JpdHRlbiBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yIHRoZQotICAgICB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLSBTVEFDSyBVU0FHRTogW3N0YWNrIGNvdW50IGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUgdG8gcmVwcmVzZW50Ci0gICAgICAgICAgc3RhY2sgdXNhZ2UgZm9yIGVhY2ggc3Vicm91dGluZSBjYWxsZWRdCi0KLSAgICAgd2hlcmU6IFtzdGFjayB1c2FnZSB2YXJpYWJsZV0gPSBzdGFjayB1c2FnZSBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCi0KLSBEQVRBIE1FTU9SWSBVU0VEOiB4IHdvcmRzCi0KLSBQUk9HUkFNIE1FTU9SWSBVU0VEOiB4IHdvcmRzCi0KLSBDTE9DSyBDWUNMRVM6IFtjeWNsZSBjb3VudCBlcXVhdGlvbiBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlCi0gICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKLSAgICAgICAgICAgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbY3ljbGUgY291bnQgdmFyaWFibGVdID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAiaWRjdC5oIgotI2luY2x1ZGUgIm1vdGlvbl9jb21wLmgiCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09OVl9QT1NTSUJMRV9MT1NTX09GX0RBVEEKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBwcml2YXRlIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIGlkY3Ryb3coaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCk7Ci1zdGF0aWMgdm9pZCBpZGN0cm93X2ludHJhKGludDE2ICpibGssIFBJWEVMICosIGludCB3aWR0aCk7Ci1zdGF0aWMgdm9pZCBpZGN0Y29sKGludDE2ICpibGspOwotCi0jaWZkZWYgRkFTVF9JRENUCi0vLyBtYXBwaW5nIGZyb20gbnpfY29lZnMgdG8gZnVuY3Rpb25zIHRvIGJlIHVzZWQKLQotCi0vLyBBUk00IGRvZXMgbm90IGFsbG93IGdsb2JhbCBkYXRhIHdoZW4gdGhleSBhcmUgbm90IGNvbnN0YW50IGhlbmNlCi0vLyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBjYW5ub3QgYmUgY29uc2lkZXJlZCBhcyBhcnJheSBvZiBjb25zdGFudHMKLS8vIChhY3R1YWwgYWRkcmVzc2VzIGFyZSBvbmx5IGtub3duIHdoZW4gdGhlIGRsbCBpcyBsb2FkZWQpLgotLy8gU28gaW5zdGVhZCBvZiBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMsIHdlJ2xsIHN0b3JlIGhlcmUKLS8vIGFycmF5cyBvZiByb3dzIG9yIGNvbHVtbnMgYW5kIHRoZW4gY2FsbCB0aGUgaWRjdCBmdW5jdGlvbgotLy8gY29ycmVzcG9uZGluZyB0byBzdWNoIHRoZSByb3cvY29sdW1uIG51bWJlcjoKLQotCi1zdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Rjb2xWQ0FbMTBdWzRdKShpbnQxNiopID0KLXsKLSAgICB7JmlkY3Rjb2wxLCAmaWRjdGNvbDAsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKLSAgICB7JmlkY3Rjb2wxLCAmaWRjdGNvbDEsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKLSAgICB7JmlkY3Rjb2wyLCAmaWRjdGNvbDEsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKLSAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDEsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKLSAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMCwgJmlkY3Rjb2wwfSwKLSAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMSwgJmlkY3Rjb2wwfSwKLSAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMSwgJmlkY3Rjb2wxfSwKLSAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMiwgJmlkY3Rjb2wxfSwKLSAgICB7JmlkY3Rjb2wzLCAmaWRjdGNvbDMsICZpZGN0Y29sMiwgJmlkY3Rjb2wxfSwKLSAgICB7JmlkY3Rjb2w0LCAmaWRjdGNvbDMsICZpZGN0Y29sMiwgJmlkY3Rjb2wxfQotfTsKLQotCi1zdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0FbMTBdKShpbnQxNiosIHVpbnQ4KiwgdWludDgqLCBpbnQpID0KLXsKLSAgICAmaWRjdHJvdzEsCi0gICAgJmlkY3Ryb3cyLAotICAgICZpZGN0cm93MiwKLSAgICAmaWRjdHJvdzIsCi0gICAgJmlkY3Ryb3cyLAotICAgICZpZGN0cm93MywKLSAgICAmaWRjdHJvdzQsCi0gICAgJmlkY3Ryb3c0LAotICAgICZpZGN0cm93NCwKLSAgICAmaWRjdHJvdzQKLX07Ci0KLQotc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0Y29sVkNBMlsxNl0pKGludDE2KikgPQotewotICAgICZpZGN0Y29sMCwgJmlkY3Rjb2w0LCAmaWRjdGNvbDMsICZpZGN0Y29sNCwKLSAgICAmaWRjdGNvbDIsICZpZGN0Y29sNCwgJmlkY3Rjb2wzLCAmaWRjdGNvbDQsCi0gICAgJmlkY3Rjb2wxLCAmaWRjdGNvbDQsICZpZGN0Y29sMywgJmlkY3Rjb2w0LAotICAgICZpZGN0Y29sMiwgJmlkY3Rjb2w0LCAmaWRjdGNvbDMsICZpZGN0Y29sNAotfTsKLQotc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBMls4XSkoaW50MTYqLCB1aW50OCosIHVpbnQ4KiwgaW50KSA9Ci17Ci0gICAgJmlkY3Ryb3cxLCAmaWRjdHJvdzQsICZpZGN0cm93MywgJmlkY3Ryb3c0LAotICAgICZpZGN0cm93MiwgJmlkY3Ryb3c0LCAmaWRjdHJvdzMsICZpZGN0cm93NAotfTsKLQotc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBX2ludHJhWzEwXSkoaW50MTYqLCBQSVhFTCAqLCBpbnQpID0KLXsKLSAgICAmaWRjdHJvdzFfaW50cmEsCi0gICAgJmlkY3Ryb3cyX2ludHJhLAotICAgICZpZGN0cm93Ml9pbnRyYSwKLSAgICAmaWRjdHJvdzJfaW50cmEsCi0gICAgJmlkY3Ryb3cyX2ludHJhLAotICAgICZpZGN0cm93M19pbnRyYSwKLSAgICAmaWRjdHJvdzRfaW50cmEsCi0gICAgJmlkY3Ryb3c0X2ludHJhLAotICAgICZpZGN0cm93NF9pbnRyYSwKLSAgICAmaWRjdHJvdzRfaW50cmEKLX07Ci0KLXN0YXRpYyB2b2lkICgqY29uc3QgaWRjdHJvd1ZDQTJfaW50cmFbOF0pKGludDE2KiwgUElYRUwgKiwgaW50KSA9Ci17Ci0gICAgJmlkY3Ryb3cxX2ludHJhLCAmaWRjdHJvdzRfaW50cmEsICZpZGN0cm93M19pbnRyYSwgJmlkY3Ryb3c0X2ludHJhLAotICAgICZpZGN0cm93Ml9pbnRyYSwgJmlkY3Ryb3c0X2ludHJhLCAmaWRjdHJvdzNfaW50cmEsICZpZGN0cm93NF9pbnRyYQotfTsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBNQmxvY2tJRENUKFZpZGVvRGVjRGF0YSAqdmlkZW8pCi17Ci0gICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgTWFjcm9CbG9jayAqbWJsb2NrID0gdmlkZW8tPm1ibG9jazsKLSAgICBQSVhFTCAqY19jb21wOwotICAgIFBJWEVMICpjdV9jb21wOwotICAgIFBJWEVMICpjdl9jb21wOwotICAgIGludCB4X3BvcyA9IHZpZGVvLT5tYm51bV9jb2w7Ci0gICAgaW50IHlfcG9zID0gdmlkZW8tPm1ibnVtX3JvdzsKLSAgICBpbnQgd2lkdGgsIHdpZHRoX3V2OwotICAgIGludDMyIG9mZnNldDsKLSAgICB3aWR0aCA9IHZpZGVvLT53aWR0aDsKLSAgICB3aWR0aF91diA9IHdpZHRoID4+IDE7Ci0gICAgb2Zmc2V0ID0gKGludDMyKSh5X3BvcyA8PCA0KSAqIHdpZHRoICsgKHhfcG9zIDw8IDQpOwotCi0gICAgY19jb21wICA9IGN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OwotICAgIGN1X2NvbXAgPSBjdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMik7Ci0gICAgY3ZfY29tcCA9IGN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKTsKLQotICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGNfY29tcCwgMCwgd2lkdGgpOwotICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGNfY29tcCArIDgsIDEsIHdpZHRoKTsKLSAgICBCbG9ja0lEQ1RfaW50cmEobWJsb2NrLCBjX2NvbXAgKyAod2lkdGggPDwgMyksIDIsIHdpZHRoKTsKLSAgICBCbG9ja0lEQ1RfaW50cmEobWJsb2NrLCBjX2NvbXAgKyAod2lkdGggPDwgMykgKyA4LCAzLCB3aWR0aCk7Ci0gICAgQmxvY2tJRENUX2ludHJhKG1ibG9jaywgY3VfY29tcCwgNCwgd2lkdGhfdXYpOwotICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGN2X2NvbXAsIDUsIHdpZHRoX3V2KTsKLX0KLQotCi12b2lkIEJsb2NrSURDVF9pbnRyYSgKLSAgICBNYWNyb0Jsb2NrICptYmxvY2ssIFBJWEVMICpjX2NvbXAsIGludCBjb21wLCBpbnQgd2lkdGgpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludDE2ICpjb2VmZl9pbiA9IG1ibG9jay0+YmxvY2tbY29tcF07Ci0jaWZkZWYgSU5URUdFUl9JRENUCi0jaWZkZWYgRkFTVF9JRENUICAvKiBWQ0EgSURDVCB1c2luZyBuemNvZWZzIGFuZCBiaXRtYXBzKi8KLSAgICBpbnQgaSwgYm1hcHI7Ci0gICAgaW50IG56X2NvZWZzID0gbWJsb2NrLT5ub19jb2VmZltjb21wXTsKLSAgICB1aW50OCAqYml0bWFwY29sID0gbWJsb2NrLT5iaXRtYXBjb2xbY29tcF07Ci0gICAgdWludDggYml0bWFwcm93ID0gbWJsb2NrLT5iaXRtYXByb3dbY29tcF07Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGlmIChuel9jb2VmcyA8PSAxMCkKLSAgICB7Ci0gICAgICAgIGJtYXByID0gKG56X2NvZWZzIC0gMSk7Ci0KLSAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl0pKShjb2VmZl9pbik7Ci0gICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdWzFdKSkoY29lZmZfaW4gKyAxKTsKLSAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl1bMl0pKShjb2VmZl9pbiArIDIpOwotICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXVszXSkpKGNvZWZmX2luICsgMyk7Ci0KLSAgICAgICAgKCppZGN0cm93VkNBX2ludHJhW256X2NvZWZzLTFdKShjb2VmZl9pbiwgY19jb21wLCB3aWR0aCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGkgPSA4OwotICAgICAgICB3aGlsZSAoaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBibWFwciA9IChpbnQpYml0bWFwY29sW2ldOwotICAgICAgICAgICAgaWYgKGJtYXByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoYm1hcHImMHhmKSA9PSAwKSAgICAgICAgIC8qICAwNy8xOC8wMSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKCooaWRjdGNvbFZDQTJbYm1hcHI+PjRdKSkoY29lZmZfaW4gKyBpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWRjdGNvbChjb2VmZl9pbiArIGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGJpdG1hcGNvbFs0XSB8IGJpdG1hcGNvbFs1XSB8IGJpdG1hcGNvbFs2XSB8IGJpdG1hcGNvbFs3XSkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgYml0bWFwcm93ID4+PSA0OwotICAgICAgICAgICAgKCooaWRjdHJvd1ZDQTJfaW50cmFbKGludCliaXRtYXByb3ddKSkoY29lZmZfaW4sIGNfY29tcCwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWRjdHJvd19pbnRyYShjb2VmZl9pbiwgY19jb21wLCB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxzZQotICAgIHZvaWQgaWRjdF9pbnRyYShpbnQgKmJsb2NrLCB1aW50OCAqY29tcCwgaW50IHdpZHRoKTsKLSAgICBpZGN0X2ludHJhKGNvZWZmX2luLCBjX2NvbXAsIHdpZHRoKTsKLSNlbmRpZgotI2Vsc2UKLSAgICB2b2lkIGlkY3RyZWZfaW50cmEoaW50ICpibG9jaywgdWludDggKmNvbXAsIGludCB3aWR0aCk7Ci0gICAgaWRjdHJlZl9pbnRyYShjb2VmZl9pbiwgY19jb21wLCB3aWR0aCk7Ci0jZW5kaWYKLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLQotLyogIDA4LzA0LzA1LCBubyByZXNpZHVlLCBqdXN0IGNvcHkgZnJvbSBwcmVkIHRvIG91dHB1dCAqLwotdm9pZCBDb3B5X0Jsa190b19Wb3AodWludDggKmRzdCwgdWludDggKnByZWQsIGludCB3aWR0aCkKLXsKLSAgICAvKiBjb3B5IDQgYnl0ZXMgYXQgYSB0aW1lICovCi0gICAgd2lkdGggLT0gNDsKLSAgICAqKCh1aW50MzIqKWRzdCkgPSAqKCh1aW50MzIqKXByZWQpOwotICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOwotICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOwotICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOwotICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOwotICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7Ci0KLSAgICByZXR1cm4gOwotfQotCi0vKiAgMDgvMDQvMDUgY29tcHV0ZSBJRENUIGFuZCBhZGQgcHJlZGljdGlvbiBhdCB0aGUgZW5kICAqLwotdm9pZCBCbG9ja0lEQ1QoCi0gICAgdWludDggKmRzdCwgIC8qIGRlc3RpbmF0aW9uICovCi0gICAgdWludDggKnByZWQsIC8qIHByZWRpY3Rpb24gYmxvY2ssIHBpdGNoIDE2ICovCi0gICAgaW50MTYgICAqY29lZmZfaW4sICAvKiBEQ1QgZGF0YSwgc2l6ZSA2NCAqLwotICAgIGludCB3aWR0aCwgLyogd2lkdGggb2YgZHN0ICovCi0gICAgaW50IG56X2NvZWZzLAotICAgIHVpbnQ4ICpiaXRtYXBjb2wsCi0gICAgdWludDggYml0bWFwcm93Ci0pCi17Ci0jaWZkZWYgSU5URUdFUl9JRENUCi0jaWZkZWYgRkFTVF9JRENUICAvKiBWQ0EgSURDVCB1c2luZyBuemNvZWZzIGFuZCBiaXRtYXBzKi8KLSAgICBpbnQgaSwgYm1hcHI7Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAobnpfY29lZnMgPD0gMTApCi0gICAgewotICAgICAgICBibWFwciA9IChuel9jb2VmcyAtIDEpOwotICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXSkpKGNvZWZmX2luKTsKLSAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl1bMV0pKShjb2VmZl9pbiArIDEpOwotICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXVsyXSkpKGNvZWZmX2luICsgMik7Ci0gICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdWzNdKSkoY29lZmZfaW4gKyAzKTsKLQotICAgICAgICAoKmlkY3Ryb3dWQ0FbbnpfY29lZnMtMV0pKGNvZWZmX2luLCBwcmVkLCBkc3QsIHdpZHRoKTsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaSA9IDg7Ci0KLSAgICAgICAgd2hpbGUgKGktLSkKLSAgICAgICAgewotICAgICAgICAgICAgYm1hcHIgPSAoaW50KWJpdG1hcGNvbFtpXTsKLSAgICAgICAgICAgIGlmIChibWFwcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKGJtYXByJjB4ZikgPT0gMCkgICAgICAgICAvKiAgMDcvMTgvMDEgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgqKGlkY3Rjb2xWQ0EyW2JtYXByPj40XSkpKGNvZWZmX2luICsgaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlkY3Rjb2woY29lZmZfaW4gKyBpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChiaXRtYXBjb2xbNF0gfCBiaXRtYXBjb2xbNV0gfCBiaXRtYXBjb2xbNl0gfCBiaXRtYXBjb2xbN10pID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgqKGlkY3Ryb3dWQ0EyW2JpdG1hcHJvdz4+NF0pKShjb2VmZl9pbiwgcHJlZCwgZHN0LCB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZGN0cm93KGNvZWZmX2luLCBwcmVkLCBkc3QsIHdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gOwotICAgIH0KLSNlbHNlIC8vIEZBU1RfSURDVAotICAgIHZvaWQgaWRjdChpbnQgKmJsb2NrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKTsKLSAgICBpZGN0KGNvZWZmX2luLCBwcmVkLCBkc3QsIHdpZHRoKTsKLSAgICByZXR1cm47Ci0jZW5kaWYgLy8gRkFTVF9JRENUCi0jZWxzZSAvLyBJTlRFR0VSX0lEQ1QKLSAgICB2b2lkIGlkY3RyZWYoaW50ICpibG9jaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCk7Ci0gICAgaWRjdHJlZihjb2VmZl9pbiwgcHJlZCwgZHN0LCB3aWR0aCk7Ci0gICAgcmV0dXJuOwotI2VuZGlmIC8vIElOVEVHRVJfSURDVAotCi19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgIEVuZCBGdW5jdGlvbjogYmxvY2tfaWRjdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBOQU1FOiBpZGN0cm93Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TIEZPUiBpZGN0cm93Ci0KLSBJbnB1dHM6Ci0gICAgW2lucHV0X3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBpbnB1dCB0byBtb2R1bGUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBzdG9yZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2xvY2FsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgYnVmZmVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2xvY2FsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgcG9pbnRlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgc3RvcmUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbZ2xvYmFsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIGJ1ZmZlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtnbG9iYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgcG9pbnRlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIE91dHB1dHM6Ci0gICAgW3JldHVybl92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiBkYXRhL3BvaW50ZXIgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICAgIGJ5IG1vZHVsZSwgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAotICAgICAgICAgICAgICAgICAgKHdoZW4gYXBwbGljYWJsZSldCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBbdmFyaWFibGVfYmZyX3B0cl0gcG9pbnRzIHRvIHRoZSBbZGVzY3JpYmUgd2hlcmUgdGhlCi0gICAgICB2YXJpYWJsZV9iZnJfcHRyIHBvaW50cyB0bywgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAotICAgICAgKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW3ZhcmlhYmxlX2Jmcl0gY29udGVudHMgYXJlIFtkZXNjcmliZSB0aGUgbmV3IGNvbnRlbnRzIG9mCi0gICAgICB2YXJpYWJsZV9iZnJdCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OIEZPUiBpZGN0cm93Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUyBGT1IgaWRjdHJvdwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTIEZPUiBpZGN0cm93Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFIEZPUiBpZGN0cm93Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFU09VUkNFUyBVU0VEIEZPUiBpZGN0cm93Ci0gICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAotICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0gREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQotICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCi0gICAgICAgICAgIGNhbGxlZF0KLQotICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQotICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGdW5jdGlvbiBDb2RlIEZPUiBpZGN0cm93Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaWRjdHJvdygKLSAgICBpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoCi0pCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7Ci0gICAgaW50IGkgPSA4OwotICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOwotICAgIGludCByZXMsIHJlczI7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIHJvdyAoaG9yaXpvbnRhbCkgSURDVAotICAgICoKLSAgICAqIDcgICAgICAgICAgICAgICAgICAgICAgIHBpICAgICAgICAgMSBkc3Rba10gPSBzdW0gY1tsXSAqIHNyY1tsXSAqIGNvcyggLS0gKgotICAgICogKCBrICsgLSApICogbCApIGw9MCAgICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgIDIKLSAgICAqCi0gICAgKiB3aGVyZTogY1swXSAgICA9IDEyOCBjWzEuLjddID0gMTI4KnNxcnQoMikgKi8KLQotICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KLSAgICB3aWR0aCAtPSA0OwotICAgIGRzdCAtPSB3aWR0aDsKLSAgICBwcmVkIC09IDEyOwotICAgIGJsayAtPSA4OwotCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIHgxID0gKGludDMyKWJsa1sxMl0gPDwgODsKLSAgICAgICAgYmxrWzEyXSA9IDA7Ci0gICAgICAgIHgyID0gYmxrWzE0XTsKLSAgICAgICAgYmxrWzE0XSA9IDA7Ci0gICAgICAgIHgzID0gYmxrWzEwXTsKLSAgICAgICAgYmxrWzEwXSA9IDA7Ci0gICAgICAgIHg0ID0gYmxrWzldOwotICAgICAgICBibGtbOV0gPSAwOwotICAgICAgICB4NSA9IGJsa1sxNV07Ci0gICAgICAgIGJsa1sxNV0gPSAwOwotICAgICAgICB4NiA9IGJsa1sxM107Ci0gICAgICAgIGJsa1sxM10gPSAwOwotICAgICAgICB4NyA9IGJsa1sxMV07Ci0gICAgICAgIGJsa1sxMV0gPSAwOwotICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKLSAgICAgICAgYmxrWzBdID0gMDsgICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KLQotICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLwotICAgICAgICB4OCA9IFc3ICogKHg0ICsgeDUpICsgNDsKLSAgICAgICAgeDQgPSAoeDggKyAoVzEgLSBXNykgKiB4NCkgPj4gMzsKLSAgICAgICAgeDUgPSAoeDggLSAoVzEgKyBXNykgKiB4NSkgPj4gMzsKLSAgICAgICAgeDggPSBXMyAqICh4NiArIHg3KSArIDQ7Ci0gICAgICAgIHg2ID0gKHg4IC0gKFczIC0gVzUpICogeDYpID4+IDM7Ci0gICAgICAgIHg3ID0gKHg4IC0gKFczICsgVzUpICogeDcpID4+IDM7Ci0KLSAgICAgICAgLyogc2Vjb25kIHN0YWdlICovCi0gICAgICAgIHg4ID0geDAgKyB4MTsKLSAgICAgICAgeDAgLT0geDE7Ci0gICAgICAgIHgxID0gVzYgKiAoeDMgKyB4MikgKyA0OwotICAgICAgICB4MiA9ICh4MSAtIChXMiArIFc2KSAqIHgyKSA+PiAzOwotICAgICAgICB4MyA9ICh4MSArIChXMiAtIFc2KSAqIHgzKSA+PiAzOwotICAgICAgICB4MSA9IHg0ICsgeDY7Ci0gICAgICAgIHg0IC09IHg2OwotICAgICAgICB4NiA9IHg1ICsgeDc7Ci0gICAgICAgIHg1IC09IHg3OwotCi0gICAgICAgIC8qIHRoaXJkIHN0YWdlICovCi0gICAgICAgIHg3ID0geDggKyB4MzsKLSAgICAgICAgeDggLT0geDM7Ci0gICAgICAgIHgzID0geDAgKyB4MjsKLSAgICAgICAgeDAgLT0geDI7Ci0gICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKLSAgICAgICAgeDQgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OwotCi0gICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLwotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KLQotICAgICAgICByZXMgPSAoeDcgKyB4MSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKLSAgICAgICAgcmVzMiA9ICh4MyArIHgyKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gKHgwICsgeDQpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSAoeDggKyB4NikgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KLQotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotCi0gICAgICAgIHJlcyA9ICh4OCAtIHg2KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMShyZXMpOwotICAgICAgICByZXMyID0gKHgwIC0geDQpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOwotICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOwotICAgICAgICByZXMgPSAoeDMgLSB4MikgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7Ci0gICAgICAgIHJlcyA9ICh4NyAtIHgxKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQNChyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCi0gICAgfQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0KLV9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKLXZvaWQgaWRjdHJvd19pbnRyYSgKLSAgICBpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoCi0pCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHRlbXA7Ci0gICAgaW50IGkgPSA4OwotICAgIGludCBvZmZzZXQgPSB3aWR0aDsKLSAgICBpbnQzMiB3b3JkOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiByb3cgKGhvcml6b250YWwpIElEQ1QKLSAgICAqCi0gICAgKiA3ICAgICAgICAgICAgICAgICAgICAgICBwaSAgICAgICAgIDEgZHN0W2tdID0gc3VtIGNbbF0gKiBzcmNbbF0gKiBjb3MoIC0tICoKLSAgICAqICggayArIC0gKSAqIGwgKSBsPTAgICAgICAgICAgICAgICAgICAgICAgOCAgICAgICAgICAyCi0gICAgKgotICAgICogd2hlcmU6IGNbMF0gICAgPSAxMjggY1sxLi43XSA9IDEyOCpzcXJ0KDIpICovCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIHgxID0gKGludDMyKWJsa1s0XSA8PCA4OwotICAgICAgICBibGtbNF0gPSAwOwotICAgICAgICB4MiA9IGJsa1s2XTsKLSAgICAgICAgYmxrWzZdID0gMDsKLSAgICAgICAgeDMgPSBibGtbMl07Ci0gICAgICAgIGJsa1syXSA9IDA7Ci0gICAgICAgIHg0ID0gYmxrWzFdOwotICAgICAgICBibGtbMV0gPSAwOwotICAgICAgICB4NSA9IGJsa1s3XTsKLSAgICAgICAgYmxrWzddID0gMDsKLSAgICAgICAgeDYgPSBibGtbNV07Ci0gICAgICAgIGJsa1s1XSA9IDA7Ci0gICAgICAgIHg3ID0gYmxrWzNdOwotICAgICAgICBibGtbM10gPSAwOwotI2lmbmRlZiBGQVNUX0lEQ1QKLSAgICAgICAgLyogc2hvcnRjdXQgKi8gIC8qIGNvdmVyZWQgYnkgaWRjdHJvdzEgIDAxLzkvMjAwMSAqLwotICAgICAgICBpZiAoISh4MSB8IHgyIHwgeDMgfCB4NCB8IHg1IHwgeDYgfCB4NykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJsa1swXSA9IGJsa1sxXSA9IGJsa1syXSA9IGJsa1szXSA9IGJsa1s0XSA9IGJsa1s1XSA9IGJsa1s2XSA9IGJsa1s3XSA9IChibGtbMF0gKyAzMikgPj4gNjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgOCkgKyA4MTkyOwotICAgICAgICBibGtbMF0gPSAwOyAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCi0KLSAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KLSAgICAgICAgeDggPSBXNyAqICh4NCArIHg1KSArIDQ7Ci0gICAgICAgIHg0ID0gKHg4ICsgKFcxIC0gVzcpICogeDQpID4+IDM7Ci0gICAgICAgIHg1ID0gKHg4IC0gKFcxICsgVzcpICogeDUpID4+IDM7Ci0gICAgICAgIHg4ID0gVzMgKiAoeDYgKyB4NykgKyA0OwotICAgICAgICB4NiA9ICh4OCAtIChXMyAtIFc1KSAqIHg2KSA+PiAzOwotICAgICAgICB4NyA9ICh4OCAtIChXMyArIFc1KSAqIHg3KSA+PiAzOwotCi0gICAgICAgIC8qIHNlY29uZCBzdGFnZSAqLwotICAgICAgICB4OCA9IHgwICsgeDE7Ci0gICAgICAgIHgwIC09IHgxOwotICAgICAgICB4MSA9IFc2ICogKHgzICsgeDIpICsgNDsKLSAgICAgICAgeDIgPSAoeDEgLSAoVzIgKyBXNikgKiB4MikgPj4gMzsKLSAgICAgICAgeDMgPSAoeDEgKyAoVzIgLSBXNikgKiB4MykgPj4gMzsKLSAgICAgICAgeDEgPSB4NCArIHg2OwotICAgICAgICB4NCAtPSB4NjsKLSAgICAgICAgeDYgPSB4NSArIHg3OwotICAgICAgICB4NSAtPSB4NzsKLQotICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLwotICAgICAgICB4NyA9IHg4ICsgeDM7Ci0gICAgICAgIHg4IC09IHgzOwotICAgICAgICB4MyA9IHgwICsgeDI7Ci0gICAgICAgIHgwIC09IHgyOwotICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7Ci0gICAgICAgIHg0ID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKLQotICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KLSAgICAgICAgd29yZCA9ICgoeDcgKyB4MSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh3b3JkKQotCi0gICAgICAgIHRlbXAgPSAoKHgzICsgeDIpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKLQotICAgICAgICB0ZW1wID0gKCh4MCArIHg0KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMTYpOwotCi0gICAgICAgIHRlbXAgPSAoKHg4ICsgeDYpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAyNCk7Ci0gICAgICAgICooKGludDMyKikoY29tcCkpID0gd29yZDsKLQotICAgICAgICB3b3JkID0gKCh4OCAtIHg2KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCi0KLSAgICAgICAgdGVtcCA9ICgoeDAgLSB4NCkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOwotCi0gICAgICAgIHRlbXAgPSAoKHgzIC0geDIpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7Ci0KLSAgICAgICAgdGVtcCA9ICgoeDcgLSB4MSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKLSAgICAgICAgKigoaW50MzIqKShjb21wICsgNCkpID0gd29yZDsKLSAgICAgICAgY29tcCArPSBvZmZzZXQ7Ci0KLSAgICAgICAgYmxrICs9IEJfU0laRTsKLSAgICB9Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVuZCBGdW5jdGlvbjogaWRjdHJvdwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBOQU1FOiBpZGN0Y29sCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TIEZPUiBpZGN0Y29sCi0KLSBJbnB1dHM6Ci0gICAgW2lucHV0X3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBpbnB1dCB0byBtb2R1bGUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBzdG9yZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2xvY2FsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgYnVmZmVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2xvY2FsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgcG9pbnRlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgc3RvcmUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbZ2xvYmFsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIGJ1ZmZlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtnbG9iYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgcG9pbnRlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIE91dHB1dHM6Ci0gICAgW3JldHVybl92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiBkYXRhL3BvaW50ZXIgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICAgIGJ5IG1vZHVsZSwgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAotICAgICAgICAgICAgICAgICAgKHdoZW4gYXBwbGljYWJsZSldCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBbdmFyaWFibGVfYmZyX3B0cl0gcG9pbnRzIHRvIHRoZSBbZGVzY3JpYmUgd2hlcmUgdGhlCi0gICAgICB2YXJpYWJsZV9iZnJfcHRyIHBvaW50cyB0bywgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAotICAgICAgKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW3ZhcmlhYmxlX2Jmcl0gY29udGVudHMgYXJlIFtkZXNjcmliZSB0aGUgbmV3IGNvbnRlbnRzIG9mCi0gICAgICB2YXJpYWJsZV9iZnJdCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OIEZPUiBpZGN0Y29sCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUyBGT1IgaWRjdGNvbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTIEZPUiBpZGN0Y29sCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFIEZPUiBpZGN0Y29sCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFU09VUkNFUyBVU0VEIEZPUiBpZGN0Y29sCi0gICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAotICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0gREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQotICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCi0gICAgICAgICAgIGNhbGxlZF0KLQotICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQotICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGdW5jdGlvbiBDb2RlIEZPUiBpZGN0Y29sCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaWRjdGNvbCgKLSAgICBpbnQxNiAqYmxrCi0pCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGNvbHVtbiAodmVydGljYWwpIElEQ1QKLSAgICAqCi0gICAgKiA3ICAgICAgICAgICAgICAgICAgICAgICAgIHBpICAgICAgICAgMSBkc3RbOCprXSA9IHN1bSBjW2xdICogc3JjWzgqbF0gKgotICAgICogY29zKCAtLSAqICggayArIC0gKSAqIGwgKSBsPTAgICAgICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgIDIKLSAgICAqCi0gICAgKiB3aGVyZTogY1swXSAgICA9IDEvMTAyNCBjWzEuLjddID0gKDEvMTAyNCkqc3FydCgyKSAqLwotICAgIHgxID0gKGludDMyKWJsa1szMl0gPDwgMTE7Ci0gICAgeDIgPSBibGtbNDhdOwotICAgIHgzID0gYmxrWzE2XTsKLSAgICB4NCA9IGJsa1s4XTsKLSAgICB4NSA9IGJsa1s1Nl07Ci0gICAgeDYgPSBibGtbNDBdOwotICAgIHg3ID0gYmxrWzI0XTsKLSNpZm5kZWYgRkFTVF9JRENUCi0gICAgLyogc2hvcnRjdXQgKi8gICAgICAgIC8qIGNvdmVyZWQgYnkgaWRjdGNvbHVtbjEgIDAxLzkvMjAwMSAqLwotICAgIGlmICghKHgxIHwgeDIgfCB4MyB8IHg0IHwgeDUgfCB4NiB8IHg3KSkKLSAgICB7Ci0gICAgICAgIGJsa1swXSA9IGJsa1s4XSA9IGJsa1sxNl0gPSBibGtbMjRdID0gYmxrWzMyXSA9IGJsa1s0MF0gPSBibGtbNDhdID0gYmxrWzU2XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYmxrWzBdIDw8IDM7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OwotCi0gICAgLyogZmlyc3Qgc3RhZ2UgKi8KLSAgICB4OCA9IFc3ICogKHg0ICsgeDUpOwotICAgIHg0ID0geDggKyAoVzEgLSBXNykgKiB4NDsKLSAgICB4NSA9IHg4IC0gKFcxICsgVzcpICogeDU7Ci0gICAgeDggPSBXMyAqICh4NiArIHg3KTsKLSAgICB4NiA9IHg4IC0gKFczIC0gVzUpICogeDY7Ci0gICAgeDcgPSB4OCAtIChXMyArIFc1KSAqIHg3OwotCi0gICAgLyogc2Vjb25kIHN0YWdlICovCi0gICAgeDggPSB4MCArIHgxOwotICAgIHgwIC09IHgxOwotICAgIHgxID0gVzYgKiAoeDMgKyB4Mik7Ci0gICAgeDIgPSB4MSAtIChXMiArIFc2KSAqIHgyOwotICAgIHgzID0geDEgKyAoVzIgLSBXNikgKiB4MzsKLSAgICB4MSA9IHg0ICsgeDY7Ci0gICAgeDQgLT0geDY7Ci0gICAgeDYgPSB4NSArIHg3OwotICAgIHg1IC09IHg3OwotCi0gICAgLyogdGhpcmQgc3RhZ2UgKi8KLSAgICB4NyA9IHg4ICsgeDM7Ci0gICAgeDggLT0geDM7Ci0gICAgeDMgPSB4MCArIHgyOwotICAgIHgwIC09IHgyOwotICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKLSAgICB4NCA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7Ci0KLSAgICAvKiBmb3VydGggc3RhZ2UgKi8KLSAgICBibGtbMF0gICAgPSAoeDcgKyB4MSkgPj4gODsKLSAgICBibGtbOF0gPSAoeDMgKyB4MikgPj4gODsKLSAgICBibGtbMTZdID0gKHgwICsgeDQpID4+IDg7Ci0gICAgYmxrWzI0XSA9ICh4OCArIHg2KSA+PiA4OwotICAgIGJsa1szMl0gPSAoeDggLSB4NikgPj4gODsKLSAgICBibGtbNDBdID0gKHgwIC0geDQpID4+IDg7Ci0gICAgYmxrWzQ4XSA9ICh4MyAtIHgyKSA+PiA4OwotICAgIGJsa1s1Nl0gPSAoeDcgLSB4MSkgPj4gODsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07ICBFbmQgRnVuY3Rpb246IGlkY3Rjb2wKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZfZmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Nodl9maWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTkzYjQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Nodl9maWx0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIFtpbnB1dF92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgaW5wdXQgdG8gbW9kdWxlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgc3RvcmUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIGJ1ZmZlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHN0b3JlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2dsb2JhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBidWZmZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbZ2xvYmFsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBPdXRwdXRzOgotICAgIFtyZXR1cm5fdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgZGF0YS9wb2ludGVyIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICBieSBtb2R1bGUsIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgW3ZhcmlhYmxlX2Jmcl9wdHJdIHBvaW50cyB0byB0aGUgW2Rlc2NyaWJlIHdoZXJlIHRoZQotICAgICAgdmFyaWFibGVfYmZyX3B0ciBwb2ludHMgdG8sIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFt2YXJpYWJsZV9iZnJdIGNvbnRlbnRzIGFyZSBbZGVzY3JpYmUgdGhlIG5ldyBjb250ZW50cyBvZgotICAgICAgdmFyaWFibGVfYmZyXQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gICBGb3IgZmFzdCBEZWJsb2NrIGZpbHRlcmluZwotICAgTmV3ZXIgdmVyc2lvbiAobWFjcm9ibG9jayBiYXNlZCBwcm9jZXNzaW5nKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMKLQotIFtMaXN0IHJlcXVpcmVtZW50cyB0byBiZSBzYXRpc2ZpZWQgYnkgdGhpcyBtb2R1bGUuXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0KLSBbTGlzdCBhbGwgcmVmZXJlbmNlcyB1c2VkIGluIGRlc2lnbmluZyB0aGlzIG1vZHVsZS5dCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFU09VUkNFUyBVU0VECi0gICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAotICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0gREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQotICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCi0gICAgICAgICAgIGNhbGxlZF0KLQotICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQotICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09OVl9QT1NTSUJMRV9MT1NTX09GX0RBVEEKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vI2RlZmluZSBGSUxURVJfTEVOXzgKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEZ1bmN0aW9uIHByb3RvdHlwZSA6IHZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlciggICB1aW50OCAqcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcF9tb2QpCi0gICAgUGFyYW1ldGVycyAgOgotICAgICAgICByZWMgICAgIDogICBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIGZyYW1lIGJ1ZmZlci4KLSAgICAgICAgd2lkdGggICA6ICAgd2lkdGggb2YgZGVjb2RlZCBmcmFtZS4KLSAgICAgICAgaGVpZ2h0ICA6ICAgaGVpZ2h0IG9mIGRlY29kZWQgZnJhbWUKLSAgICAgICAgUVBfc3RvcmU6ICAgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgUVAgY29ycmVzcG9uZGluZyB0byB0aGUgZGVjb2RlZCBmcmFtZS4KLSAgICAgICAgICAgICAgICAgICAgSXQgaGFkIG9ubHkgb25lIHZhbHVlIGZvciBlYWNoIE1CLgotICAgICAgICBjaHIgICAgIDogICBsdW1hIG9yIGNvbG9yIGluZGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPT0gMCBsdW1hCi0gICAgICAgICAgICAgICAgICAgID09IDEgY29sb3IKLSAgICAgICAgcHBfbW9kICA6ICAgVGhlIHNlbXBob3JlIHVzZWQgZm9yIGRlYmxvY2tpbmcKLQotICAgIFJlbWFyayAgICAgIDogICBUaGUgZnVuY3Rpb24gZG8gdGhlIGRlYmxvY2tpbmcgb24gZGVjb2RlZCBmcmFtZXMuCi0gICAgICAgICAgICAgICAgICAgIEZpcnN0IGJhc2VkIG9uIHRoZSBzZW1hcGhvcmUgaW5mby4sIGl0IGlzIGRpdmlkZWQgaW50byBoYXJkIGFuZCBzb2Z0IGZpbHRlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgVG8gZGlmZmVyZW50aWF0ZSByZWFsIGFuZCBmYWtlIGVkZ2UsIGl0IHRoZW4gY2hlY2sgdGhlIGRpZmZlcmVuY2Ugd2l0aCBRUCB0bwotICAgICAgICAgICAgICAgICAgICBkZWNpZGUgd2hldGhlciB0byBkbyB0aGUgZmlsdGVyaW5nIG9yIG5vdC4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIoCi0gICAgdWludDggKnJlYywKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50IGNociwKLSAgICB1aW50OCAqcHBfbW9kKQotewotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCBiciwgYmMsIG1iciwgbWJjOwotICAgIGludCBRUCA9IDE7Ci0gICAgdWludDggKnB0ciwgKnB0cl9lOwotICAgIGludCBwcF93LCBwcF9oOwotICAgIGludCBicndpZHRoOwotCi0gICAgaW50IGpWYWwwLCBqVmFsMSwgalZhbDI7Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBwcF93ID0gKHdpZHRoID4+IDMpOwotICAgIHBwX2ggPSAoaGVpZ2h0ID4+IDMpOwotCi0gICAgZm9yIChtYnIgPSAwOyBtYnIgPCBwcF9oOyBtYnIgKz0gMikgICAgICAgICAvKiByb3cgb2YgYmxvY2tzICovCi0gICAgewotICAgICAgICBicndpZHRoID0gbWJyICogcHBfdzsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzIGFib3ZlIGN1cnJlbnQgYmxvY2sgcm93ICovCi0gICAgICAgIGZvciAobWJjID0gMDsgbWJjIDwgcHBfdzsgbWJjICs9IDIpICAgICAvKiBjb2wgb2YgYmxvY2tzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY2hyKQotICAgICAgICAgICAgICAgIFFQID0gUVBfc3RvcmVbKGJyd2lkdGg+PjIpICsgKG1iYz4+MSldOyAvKiBRUCBpcyBwZXIgTUIgYmFzZWQgdmFsdWUgKi8KLQotICAgICAgICAgICAgLyoqKioqKioqKiBmb3IgZWFjaCBibG9jayAqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogSG9yaXouIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnIgKyAxOyBiciA8IG1iciArIDM7IGJyKyspICAvKiAyeDIgYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OyAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBhYm92ZSAmIGxlZnQgY3VycmVudCBibG9jayByb3cgKi8KLSAgICAgICAgICAgICAgICAvKiB0aGUgcHJvZmlsZSBvbiBBUk05MjBUIHNob3dzIHNlcGFyYXRlIHRoZXNlIHR3byBib3VuZGFyeSBjaGVjayBpcyBmYXN0ZXIgdGhhbiBjb21iaW5lIHRoZW0gKi8KLSAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oKSAgICAgICAgICAgICAgICAgIC8qIGJvdW5kYXJ5IDogZG9uJ3QgZG8gaXQgb24gdGhlIGxvd2VzdCByb3cgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChiYyA9IG1iYzsgYmMgPCBtYmMgKyAyOyBiYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA8IHBwX3cpICAgICAgICAgICAgICAvKiBib3VuZGFyeSA6IGRvbid0IGRvIGl0IG9uIHRoZSBtb3N0IHJpZ2h0IGNvbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gYnJ3aWR0aCArIGJjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpICAgIFFQID0gUVBfc3RvcmVbalZhbDBdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2UgPSBwdHIgKyA4OyAgICAgICAgLyogcG9pbnRlciB0byB3aGVyZSB0aGUgbG9vcCBlbmRzICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChwcF9tb2RbalZhbDBdJjB4MDIpKSAmJiAoKHBwX21vZFtqVmFsMC1wcF93XSYweDAyKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIb3JpeiBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gd2lkdGgpOyAgICAgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoalZhbDIgPiAwKSAmJiAoalZhbDIgPCAoUVAgPDwgMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGpWYWwyIDwgMCkgJiYgKGpWYWwyID4gLShRUCA8PCAxKSkpKSAvKiAoRC1DKSBjb21wYXJlZCB3aXRoIDJRUCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpZmZlcmVudGlhdGUgYmV0d2VlbiByZWFsIGFuZCBmYWtlIGVkZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICgoalZhbDAgKyBqVmFsMSkgPj4gMSk7ICAgICAvKiAoRCtDKS8yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsgICAgLyogIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHVpbnQ4KShqVmFsMCk7ICAgICAgICAgIC8qICBEICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gKHdpZHRoIDw8IDEpKTsgICAgICAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIHdpZHRoKTsgICAgICAgICAvKiBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgIC8qIEUtQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyAzKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qICBzdG9yZSBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBzdG9yZSBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDMgLSBqVmFsMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpKSA9ICh1aW50OClqVmFsMDsgICAgICAgLyogIHN0b3JlIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIHN0b3JlIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpOyAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAod2lkdGggPDwgMSkpOyAgICAgIC8qIEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgICAgICAvKiAoRi1BKSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArICh3aWR0aCA8PCAxKSkgPSAodWludDgpKGpWYWwxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCAtPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAod2lkdGggPDwgMSkpID0gKHVpbnQ4KShqVmFsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGEzXzAgPiAyUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytwdHIgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAvKiBIb3JpeiBzb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gd2lkdGgpOyAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAvKiBDLUIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoalZhbDIgPiAwKSAmJiAoalZhbDIgPCAoUVApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVApKSkpIC8qIChDLUIpIGNvbXBhcmVkIHdpdGggUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKChqVmFsMCArIGpWYWwxKSA+PiAxKTsgICAgIC8qIChCK0MpLzIgY2Fubm90IG92ZXJmbG93OyBjZWlsKCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOyAgICAvKiBCID0gKEIrQykvMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSAodWludDgpalZhbDA7ICAgICAgICAgICAgLyogQyA9IChCK0MpLzIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAod2lkdGggPDwgMSkpOyAgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgd2lkdGgpOyAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgIC8qIEQtQSAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpKSA9ICh1aW50OClqVmFsMDsgICAgICAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHRyIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogU29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICAgICAgICAgfS8qYmMqLwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogVmVydC4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2gpCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmMgKyAxOyBiYyA8IG1iYyArIDM7IGJjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjIDwgcHBfdykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgKHdpZHRoIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwLTFdJjB4MDEpKSAmJiAoKHBwX21vZFtqVmFsMF0mMHgwMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVydCBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAxKTsgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgLyogRC1DICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9IChqVmFsMCArIGpWYWwxKSA+PiAxOyAgIC8qIChDK0QpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyICAgICAgICA9ICAgalZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSAgPSAgIGpWYWwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDEpOyAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAyKTsgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgLyogRS1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDIpOyAgICAgLyogRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAzKTsgICAgIC8qIEEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgLyogZW5kIG9mIHZlciBoYXJkIGZpbGV0ZXJpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAvKiBWZXJ0IHNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKnB0cjsgICAgICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMSk7ICAgICAgICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGpWYWwyIDwgMCkgJiYgKGpWYWwyID4gLShRUCkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKGpWYWwwICsgalZhbDEgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBqVmFsMTsgICAgICAgICAgIC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDEpID0galZhbDE7ICAgICAvKiBCICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgMSk7ICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIDIpOyAgICAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0gKGpWYWwxIC0galZhbDApOyAgICAgICAgLyogRC0gQSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoKGpWYWwyKSArIDcpID4+IDMpOyAgICAgIC8qIEQgLT0gKEQtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKChqVmFsMikgKyA3KSA+PiAzKTsgICAgICAvKiBBICs9IChELUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSAoalZhbDIpKSA+PiAzKTsgICAgICAvKiBEIC09IChELUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0gKGpWYWwyKSkgPj4gMyk7ICAgICAgLyogQSArPSAoRC1BKS84ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBTb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGJvdW5kYXJ5Ki8KLSAgICAgICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLXZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKAotICAgIHVpbnQ4ICpyZWMsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCBjaHIsCi0gICAgdWludDggKnBwX21vZCkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgYnIsIGJjLCBtYnIsIG1iYzsKLSAgICBpbnQgUVAgPSAxOwotICAgIHVpbnQ4ICpwdHIsICpwdHJfZTsKLSAgICBpbnQgcHBfdywgcHBfaDsKLSAgICBpbnQgYnJ3aWR0aDsKLQotICAgIGludCBqVmFsMCwgalZhbDEsIGpWYWwyOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcHBfdyA9ICh3aWR0aCA+PiAzKTsKLSAgICBwcF9oID0gKGhlaWdodCA+PiAzKTsKLQotICAgIGZvciAobWJyID0gMDsgbWJyIDwgcHBfaDsgbWJyICs9IDIpICAgICAgICAgLyogcm93IG9mIGJsb2NrcyAqLwotICAgIHsKLSAgICAgICAgYnJ3aWR0aCA9IG1iciAqIHBwX3c7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBhYm92ZSBjdXJyZW50IGJsb2NrIHJvdyAqLwotICAgICAgICBmb3IgKG1iYyA9IDA7IG1iYyA8IHBwX3c7IG1iYyArPSAyKSAgICAgLyogY29sIG9mIGJsb2NrcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNocikKLSAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlWyhicndpZHRoPj4yKSArIChtYmM+PjEpXTsgLyogUVAgaXMgcGVyIE1CIGJhc2VkIHZhbHVlICovCi0KLSAgICAgICAgICAgIC8qKioqKioqKiogZm9yIGVhY2ggYmxvY2sgKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIEhvcml6LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyICsgMTsgYnIgPCBtYnIgKyAzOyBicisrKSAgLyogMngyIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyd2lkdGggKz0gcHBfdzsgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgYWJvdmUgJiBsZWZ0IGN1cnJlbnQgYmxvY2sgcm93ICovCi0gICAgICAgICAgICAgICAgLyogdGhlIHByb2ZpbGUgb24gQVJNOTIwVCBzaG93cyBzZXBhcmF0ZSB0aGVzZSB0d28gYm91bmRhcnkgY2hlY2sgaXMgZmFzdGVyIHRoYW4gY29tYmluZSB0aGVtICovCi0gICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCkgICAgICAgICAgICAgICAgICAvKiBib3VuZGFyeSA6IGRvbid0IGRvIGl0IG9uIHRoZSBsb3dlc3Qgcm93IGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKiBjaGVjayBib3VuZGFyeSBmb3IgZGVibG9ja2luZyAqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmMgPCBwcF93KSAgICAgICAgICAgICAgLyogYm91bmRhcnkgOiBkb24ndCBkbyBpdCBvbiB0aGUgbW9zdCByaWdodCBjb2wgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgODsgICAgICAgIC8qIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGxvb3AgZW5kcyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwXSYweDAyKSkgJiYgKChwcF9tb2RbalZhbDAtcHBfd10mMHgwMikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSG9yaXogSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIHdpZHRoKTsgICAgIC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKnB0cjsgICAgICAgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkgLyogKEQtQykgY29tcGFyZWQgd2l0aCAyUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcmVhbCBhbmQgZmFrZSBlZGdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAoKGpWYWwwICsgalZhbDEpID4+IDEpOyAgICAgLyogKEQrQykvMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7ICAgIC8qICBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh1aW50OCkoalZhbDApOyAgICAgICAgICAvKiAgRCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSk7ICAgICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyB3aWR0aCk7ICAgICAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAvKiBFLUIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgMykgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiAgc3RvcmUgQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogc3RvcmUgRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qICBzdG9yZSBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBzdG9yZSBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKTsgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgKHdpZHRoIDw8IDEpKTsgICAgICAvKiBGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAod2lkdGggPDwgMSkpID0gKHVpbnQ4KShqVmFsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgKHdpZHRoIDw8IDEpKSA9ICh1aW50OCkoalZhbDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBhM18wID4gMlFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHRyIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICAgICAgICAgfS8qYmMqLwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogVmVydC4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2gpCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmMgKyAxOyBiYyA8IG1iYyArIDM7IGJjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjIDwgcHBfdykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgKHdpZHRoIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwLTFdJjB4MDEpKSAmJiAoKHBwX21vZFtqVmFsMF0mMHgwMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVydCBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAxKTsgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgLyogRC1DICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9IChqVmFsMCArIGpWYWwxKSA+PiAxOyAgIC8qIChDK0QpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyICAgICAgICA9ICAgalZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSAgPSAgIGpWYWwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDEpOyAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAyKTsgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgLyogRS1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDIpOyAgICAgLyogRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAzKTsgICAgIC8qIEEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgLyogZW5kIG9mIHZlciBoYXJkIGZpbGV0ZXJpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGJvdW5kYXJ5Ki8KLSAgICAgICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2h2cl9maWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2h2cl9maWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTVjZjcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NodnJfZmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0KLXZvaWQgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIoCi0gICAgdWludDggKnJlYywKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50IGNociwKLSAgICB1aW50OCAqcHBfbW9kKQotewotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCBpbmRleCwgY291bnRlcjsKLSAgICBpbnQgYnIsIGJjLCBpbmNyLCBtYnIsIG1iYzsKLSAgICBpbnQgUVAgPSAxOwotICAgIGludCB2WzVdOwotICAgIHVpbnQ4ICpwdHIsICpwdHJfYywgKnB0cl9uOwotICAgIGludCB3MSwgdzIsIHczLCB3NDsKLSAgICBpbnQgcHBfdywgcHBfaCwgYnJ3aWR0aDsKLSAgICBpbnQgc3VtLCBkZWx0YTsKLSAgICBpbnQgYTNfMCwgYTNfMSwgYTNfMiwgQTNfMDsKLSAgICAvKiBmb3IgRGVyaW5naW5nIFRocmVzaG9sZCBhcHByb2FjaCAoTVBFRzQpKi8KLSAgICBpbnQgbWF4X2RpZmYsIHRocmVzLCB2MCwgaDAsIG1pbl9ibGssIG1heF9ibGs7Ci0gICAgaW50IGNudGhmbGFnOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBDYWxjdWxhdGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaW4gYmxvY2tzIChkaXZpZGUgYnkgOCkgKi8KLSAgICBwcF93ID0gKHdpZHRoID4+IDMpOwotICAgIHBwX2ggPSAoaGVpZ2h0ID4+IDMpOwotCi0gICAgLyogU2V0IHVwIHZhcmlvdXMgdmFsdWVzIG5lZWRlZCBmb3IgdXBkYXRpbmcgcG9pbnRlcnMgaW50byByZWMgKi8KLSAgICB3MSA9IHdpZHRoOyAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gbmV4dCByb3cgaW4gcGl4ZWxzICovCi0gICAgdzIgPSB3aWR0aCA8PCAxOyAgICAgICAgLyogT2Zmc2V0IHRvIHR3byByb3dzIGluIHBpeGVscyAqLwotICAgIHczID0gdzEgKyB3MjsgICAgICAgICAgIC8qIE9mZnNldCB0byB0aHJlZSByb3dzIGluIHBpeGVscyAqLwotICAgIHc0ID0gdzIgPDwgMTsgICAgICAgICAgIC8qIE9mZnNldCB0byBmb3VyIHJvd3MgaW4gcGl4ZWxzICovCi0gICAgaW5jciA9IHdpZHRoIC0gQkxLU0laRTsgLyogT2Zmc2V0IHRvIG5leHQgcm93IGFmdGVyIHByb2Nlc3NpbmcgYmxvY2sgKi8KLQotICAgIC8qIFdvcmsgdGhyb3VnaCB0aGUgYXJlYSBob3J0aXpvbnRhbGx5IGJ5IHR3byByb3dzIHBlciBzdGVwICovCi0gICAgZm9yIChtYnIgPSAwOyBtYnIgPCBwcF9oOyBtYnIgKz0gMikKLSAgICB7Ci0gICAgICAgIC8qIGJyd2lkdGggY29udGFpbnMgdGhlIGJsb2NrIG51bWJlciBvZiB0aGUgbGVmdG1vc3QgYmxvY2sKLSAgICAgICAgICogb2YgdGhlIGN1cnJlbnQgcm93ICovCi0gICAgICAgIGJyd2lkdGggPSBtYnIgKiBwcF93OwotCi0gICAgICAgIC8qIFdvcmsgdGhyb3VnaCB0aGUgYXJlYSB2ZXJ0aWNhbGx5IGJ5IHR3byBjb2x1bW5zIHBlciBzdGVwICovCi0gICAgICAgIGZvciAobWJjID0gMDsgbWJjIDwgcHBfdzsgbWJjICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGx1bWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgKiBxdWFudGl6YXRpb24gcGFyYW1lbnRlci4gT25lIHBhcmFtZXRlciBwZXIgbWFjcm9ibG9jayAqLwotICAgICAgICAgICAgaWYgKCFjaHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogYnJ3aWR0aC80IGlzIHRoZSBtYWNyb2Jsb2NrIG51bWJlciBhbmQgbWJjLzIgaXMgdGhlIG1hY3JvYmxvY2sgY29sIG51bWJlciovCi0gICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVsoYnJ3aWR0aD4+MikgKyAobWJjPj4xKV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogSG9yaXouIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIFByb2Nlc3MgZm91ciBibG9ja3MgZm9yIHRoZSBmaWx0ZXJpbmcgICAgICAgICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIHJvd3Mgb2YgYmxvY2tzICovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyICsgMTsgYnIgPCBtYnIgKyAzOyBicisrKSAgICAvKiBiciBpcyB0aGUgcm93IGNvdW50ZXIgaW4gYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2V0IGJyd2lkdGggdG8gdGhlIGZpcnN0IChsZWZ0bW9zdCkgYmxvY2sgbnVtYmVyIG9mIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICAgICAgICAgIC8qIGJyd2lkdGggaXMgdXNlZCBhcyBhbiBpbmRleCB3aGVuIGNvdW50aW5nIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgIGJyd2lkdGggKz0gcHBfdzsKLQotICAgICAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gY29sdW1ucyBvZiBibG9ja3MgaW4gdGhlIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykgICAgLyogYmMgaXMgdGhlIGNvbHVtbiBjb3VudGVyIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqKioqKiBjaGVjayBib3VuZGFyeSBmb3IgZGVibG9ja2luZyAqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgaWYgdGhlIHJvdyBhbmQgY29sdW1uIGNvdW50ZXJzIGFyZSB3aXRoaW4gdGhlIGFyZWEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCAmJiBiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcHRyIHRvIHRoZSBmaXJzdCBwaXhlbCBvZiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHNlY29uZCByb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICogYnJ3aWR0aCAqIDY0IGlzIHRoZSBwaXhlbCByb3cgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGJjICogOCBpcyB0aGUgcGl4ZWwgY29sdW1uIG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gdGhlIGN1cnJlbnQgYmxvY2sgb2YgdGhlIHNlY29uZCByb3cgY291bnRpbmcgaW4gYmxvY2tzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGJyd2lkdGggKyBiYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIGRhdGEgaXMgY2hyb21pbmFuY2UgaW5mbywgZ2V0IHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBxdWFudGl6YXRpb24gcGFyYW1lbnRlci4gT25lIHBhcmFtZXRlciBwZXIgYmxvY2suICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQID0gUVBfc3RvcmVbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGhhcmQgaG9yaXpvbnRhbCBmaWx0ZXIgaWYgc2VtYXBob3JlIGZvciBob3Jpem9udGFsIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBzZXQgZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCBibG9jayBpbW1lZGlhdGVseSBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2luZGV4XSYweDAyKSAhPSAwKSAmJiAoKHBwX21vZFtpbmRleC1wcF93XSYweDAyKSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgICAvKiBIYXJkIGZpbHRlciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IEhvcnpIZmxhZyAoYml0IDQpIGluIHRoZSBwcF9tb2QgbG9jYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcF9tb2RbaW5kZXgtcHBfd10gfD0gMHgxMDsgLyogIDQvMjYvMDAgcmV1c2UgcHBfbW9kIGZvciBIb3J6SGZsYWcqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGFjcm9zcyB0aGUgOCBwaXhlbHMgb2YgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IEJMS1NJWkU7IGluZGV4ID4gMDsgaW5kZXgtLSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBwaXhlbCBhbmQgdGhlIHBpeGVsIGFib3ZlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzAgPSAqcHRyIC0gKihwdHIgLSB3MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIEtUaEggdGhyZXNob2xkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCB3aXRoaW4gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIsIGFwcGx5IGhhcmQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTNfMCA+IEtUaEggfHwgYTNfMCA8IC1LVGhIKSAmJiBhM18wPFFQICYmIGEzXzA+IC1RUCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgPSBwdHIgLSB3MzsgICAvKiBQb2ludHMgdG8gcGl4ZWwgdGhyZWUgcm93cyBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gPSBwdHIgKyB3MTsgICAvKiBQb2ludHMgdG8gcGl4ZWwgb25lIHJvdyBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlswXSA9IChpbnQpKCoocHRyX2MgLSB3MykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsxXSA9IChpbnQpKCoocHRyX2MgLSB3MikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsyXSA9IChpbnQpKCoocHRyX2MgLSB3MSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlszXSA9IChpbnQpKCpwdHJfYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzRdID0gKGludCkoKihwdHJfYyArIHcxKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHZbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICpwdHJfYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgdzIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIHczKSk7ICAvKiBDdXJyZW50IHBpeGVsICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKHN1bSArICpwdHJfYyArIDQpID4+IDM7ICAgLyogQXZlcmFnZSBwaXhlbCB2YWx1ZXMgd2l0aCByb3VuZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHJfYykgPSAodWludDgpIGRlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHBvaW50ZXIgZG93biBvbmUgcm93IG9mIHBpeGVscyAocG9pbnRzIHRvIHBpeGVsIHR3byByb3dzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhYm92ZSBjdXJyZW50IHBpeGVsKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgKz0gdzE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCA1OyBjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VidHJhY3Qgb2ZmIGhpZ2hlc3QgcGl4ZWwgYW5kIGFkZCBpbiBwaXhlbCBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHN1bSAtIHZbY291bnRlcl0gKyAqcHRyX247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXZlcmFnZSB0aGUgcGl4ZWwgdmFsdWVzIHdpdGggcm91bmRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHJfYyA9ICh1aW50OCkoZGVsdGEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXJzIHRvIG5leHQgcGl4ZWwgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgKz0gdzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gKz0gdzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXIgdG8gbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgLyogc29mdCBmaWx0ZXIqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgSG9yekhmbGFnIChiaXQgNCkgaW4gdGhlIHBwX21vZCBsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX21vZFtpbmRleC1wcF93XSAmPSAweGVmOyAvKiByZXNldCAxMTEwLDExMTEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHRoZSBwaXhlbCBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wID0gKihwdHIpIC0gKihwdHIgLSB3MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIEtUaCB0aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvZnQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTNfMCA+IEtUaCB8fCBhM18wIDwgLUtUaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIHdlaWdodGVkIGRpZmZlcmVuY2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wICs9ICgoKihwdHIgLSB3MikgLSAqKHB0ciArIHcxKSkgPDwgMSkgKyAoYTNfMCA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgc3VtIGlzIGxlc3MgdGhhbiB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUyhhM18wKSA8IChRUCA8PCAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xID0gKihwdHIgLSB3MikgLSAqKHB0ciAtIHczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xICs9ICgoKihwdHIgLSB3NCkgLSAqKHB0ciAtIHcxKSkgPDwgMSkgKyAoYTNfMSA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzIgID0gKihwdHIgKyB3MikgLSAqKHB0ciArIHcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18yICs9ICgoKihwdHIpIC0gKihwdHIgKyB3MykpIDw8IDEpICsgKGEzXzIgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gUFZfQUJTKGEzXzApIC0gUFZfTUlOKFBWX0FCUyhhM18xKSwgUFZfQUJTKGEzXzIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgKz0gQTNfMCA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gKEEzXzAgKyAzMikgPj4gNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gLUEzXzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9ICgqKHB0ciAtIHcxKSAtICoocHRyKSkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSBBM18wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUFZfTUFYKEEzXzAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFBWX01BWChBM18wLCBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIHcxKSA9ICh1aW50OCkoKihwdHIgLSB3MSkgLSBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyKSA9ICh1aW50OCkoKihwdHIpICsgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyp0aHJlc2hvbGQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBwb2ludGVyIHRvIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogU29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICB9LyogYm91bmRhcnkgY2hlY2tpbmcqLwotICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgIH0vKmJyKi8KLSAgICAgICAgICAgIGJyd2lkdGggLT0gKHBwX3cgPDwgMSk7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKiBWZXJ0LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogUHJvY2VzcyBmb3VyIGJsb2NrcyBmb3IgdGhlIGZpbHRlcmluZyAgICAgICAgKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gcm93cyBvZiBibG9ja3MgKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykgICAgICAvKiBiciBpcyB0aGUgcm93IGNvdW50ZXIgaW4gYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChiYyA9IG1iYyArIDE7IGJjIDwgbWJjICsgMzsgYmMrKykgIC8qIGJjIGlzIHRoZSBjb2x1bW4gY291bnRlciBpbiBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGlmIHRoZSByb3cgYW5kIGNvbHVtbiBjb3VudGVycyBhcmUgd2l0aGluIHRoZSBhcmVhICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2ggJiYgYmMgPCBwcF93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHB0ciB0byB0aGUgZmlyc3QgcGl4ZWwgb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGJyd2lkdGggKiA2NCBpcyB0aGUgcGl4ZWwgcm93IG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgKiBiYyAqIDggaXMgdGhlIHBpeGVsIGNvbHVtbiBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIHRoZSBjdXJyZW50IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93IGNvdW50aW5nIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBicndpZHRoICsgYmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGNocm9taW5hbmNlIGluZm8sIGdldCB0aGUgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBoYXJkIHZlcnRpY2FsIGZpbHRlciBpZiBzZW1hcGhvcmUgZm9yIHZlcnRpY2FsIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBzZXQgZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCBibG9jayBpbW1lZGlhdGVseSBsZWZ0IG9mIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChwcF9tb2RbaW5kZXgtMV0mMHgwMSkgIT0gMCkgJiYgKChwcF9tb2RbaW5kZXhdJjB4MDEpICE9IDApKQotICAgICAgICAgICAgICAgICAgICAgICAgeyAgIC8qIEhhcmQgZmlsdGVyICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgVmVydEhmbGFnIChiaXQgNSkgaW4gdGhlIHBwX21vZCBsb2NhdGlvbiBvZiBwcmV2aW91cyBibG9jayovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfbW9kW2luZGV4LTFdIHw9IDB4MjA7IC8qICA0LzI2LzAwIHJldXNlIHBwX21vZCBmb3IgVmVydEhmbGFnKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBhY3Jvc3MgdGhlIDggcGl4ZWxzIG9mIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgdGhlIHBpeGVsIHRvIGxlZnQgb2YgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCA9ICpwdHIgLSAqKHB0ciAtIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBLVGhIIHRocmVzaG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgd2l0aGluIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLCBhcHBseSBoYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEzXzAgPiBLVGhIIHx8IGEzXzAgPCAtS1RoSCkgJiYgYTNfMDxRUCAmJiBhM18wPiAtUVApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jID0gcHRyIC0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uID0gcHRyICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMF0gPSAoaW50KSgqKHB0cl9jIC0gMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsxXSA9IChpbnQpKCoocHRyX2MgLSAyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzJdID0gKGludCkoKihwdHJfYyAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbM10gPSAoaW50KSgqcHRyX2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdls0XSA9IChpbnQpKCoocHRyX2MgKyAxKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHZbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICpwdHJfYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgMykpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHJfYykgPSAodWludDgpIGRlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHBvaW50ZXIgZG93biBvbmUgcGl4ZWwgdG8gdGhlIHJpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfYyArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDU7IGNvdW50ZXIrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWJ0cmFjdCBvZmYgaGlnaGVzdCBwaXhlbCBhbmQgYWRkIGluIHBpeGVsIGJlbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtID0gc3VtIC0gdltjb3VudGVyXSArICpwdHJfbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdmVyYWdlIHRoZSBwaXhlbCB2YWx1ZXMgd2l0aCByb3VuZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKHN1bSArICpwdHJfYyArIDQpID4+IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cl9jID0gKHVpbnQ4KShkZWx0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlcnMgdG8gbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlcnMgdG8gbmV4dCBwaXhlbCByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogaW5kZXgqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBzb2Z0IGZpbHRlciovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciBWZXJ0SGZsYWcgKGJpdCA1KSBpbiB0aGUgcHBfbW9kIGxvY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfbW9kW2luZGV4LTFdICY9IDB4ZGY7IC8qIHJlc2V0IDExMDEsMTExMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHRoZSBwaXhlbCBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wID0gKihwdHIpIC0gKihwdHIgLSAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgbWFnbml0dWRlIG9mIHRoZSBkaWZmZXJlbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgS1RoIHRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXBwbHkgc29mdCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhM18wID4gS1RoIHx8IGEzXzAgPCAtS1RoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2Ygd2VpZ2h0ZWQgZGlmZmVyZW5jZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzAgKz0gKCgqKHB0ciAtIDIpIC0gKihwdHIgKyAxKSkgPDwgMSkgKyAoYTNfMCA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgc3VtIGlzIGxlc3MgdGhhbiB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUyhhM18wKSA8IChRUCA8PCAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xID0gKihwdHIgLSAyKSAtICoocHRyIC0gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSArPSAoKCoocHRyIC0gNCkgLSAqKHB0ciAtIDEpKSA8PCAxKSArIChhM18xIDw8IDIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMiAgPSAqKHB0ciArIDIpIC0gKihwdHIgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18yICs9ICgoKihwdHIpIC0gKihwdHIgKyAzKSkgPDwgMSkgKyAoYTNfMiA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSBQVl9BQlMoYTNfMCkgLSBQVl9NSU4oUFZfQUJTKGEzXzEpLCBQVl9BQlMoYTNfMikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCArPSBBM18wIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSAoQTNfMCArIDMyKSA+PiA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYTNfMCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSAtQTNfMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKCoocHRyIC0gMSkgLSAqKHB0cikpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gQTNfMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFBWX01BWChBM18wLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBQVl9NQVgoQTNfMCwgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSA9ICh1aW50OCkoKihwdHIgLSAxKSAtIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIpID0gKHVpbnQ4KSgqKHB0cikgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKnRocmVzaG9sZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyppbmRleCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIFNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgfSAvKiBib3VuZGFyeSovCi0gICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlciB0byBuZXh0IHJvdyBvZiBwaXhlbHMgKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIERlcmluZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBQcm9jZXNzIGZvdXIgYmxvY2tzIGZvciB0aGUgZmlsdGVyaW5nICAgICAgICAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogTG9vcCBvdmVyIHR3byByb3dzIG9mIGJsb2NrcyAqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gY29sdW1ucyBvZiBibG9ja3MgaW4gdGhlIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgaWYgdGhlIHJvdyBhbmQgY29sdW1uIGNvdW50ZXJzIGFyZSB3aXRoaW4gdGhlIGFyZWEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCAmJiBiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gdGhlIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYnJ3aWR0aCArIGJjOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGRlcmluZ2luZyBpZiBzZW1hcGhvcmUgZm9yIGRlcmluZ2luZyAoYml0LTMgb2YgcHBfbW9kKQotICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgc2V0IGZvciB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcF9tb2RbaW5kZXhdJjB4MDQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgcHJvY2VzcyBkZXJpbmdpbmcgaWYgb24gYW4gZWRnZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiciA+IDAgJiYgYmMgPiAwICYmIGJyIDwgcHBfaCAtIDEgJiYgYmMgPCBwcF93IC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNudGhmbGFnID0gd2VpZ2h0ZWQgYXZlcmFnZSBvZiBIb3J6SGZsYWcgb2YgY3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb25lIGFib3ZlLCBwcmV2aW91cyBibG9ja3MqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9ICgocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHBfbW9kW2luZGV4XSA+PiAxKSAmIDB4MTApKSA+PiA0OyAvKiA0LzI2LzAwKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyB0aGUgZGVyaW5naW5nIGlmIGRlY2lzaW9uIGZsYWdzIGluZGljYXRlIGl0J3MgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnRoZmxhZyA8IDMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGNocm9taW5hbmNlIGluZm8sIGdldCB0aGUgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGFtb3VudCB0byBjaGFuZ2UgbHVtaW5hbmNlIGlmIGl0IG5lZWRzIHRvIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VkIG9uIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmID0gKFFQID4+IDIpICsgNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHBvaW50ZXIgdG8gZmlyc3QgcGl4ZWwgb2YgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiBwaXhlbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHBpeGVsIHJhbmdlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBERVJJTkdfVEhSLCBzbW9vdGggdGhlIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYXhfYmxrIC0gbWluX2JsaykgPj0gREVSSU5HX1RIUikgLypzbW9vdGggOHg4IHJlZ2lvbiovCi0jaWZuZGVmIE5vTU1YCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc21vb3RoIGFsbCBwaXhlbHMgaW4gdGhlIGJsb2NrKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWChwdHIsIHdpZHRoLCB0aHJlcywgbWF4X2RpZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXR1cCB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHJlZ2lvbiB0byBzbW9vdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MCA9IChiciA8PCAzKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDAgPSAoYmMgPDwgMykgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzbW9vdGggOHg4IHJlZ2lvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgocmVjLCB2MCwgaDAsIHYwICsgMSwgaDAgKyAxLCB0aHJlcywgd2lkdGgsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LypjbnRoZmxhZyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmRlcmluZyBicj09MSBvciBiYz09MSAoYm91bmRhcnkgYmxvY2spKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgIC8qIFByb2Nlc3MgdGhlIGJvdW5kYXJ5IGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVjaWRlIHRvIHBlcmZvcm0gZGVibG9ja2luZyBiYXNlZCBvbiB0aGUgc2VtYXBob3JlIGZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrcyBpbiBlYWNoIGNhc2UuIEEgY2VydGFpbiBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGFyZCBmaWx0ZXJpbmcgZmxhZ3MgaGF2ZSB0byBiZSBzZXQgaW4gb3JkZXIgdG8gc2lnbmFsIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHNtb290aGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPiAwICYmIGJyIDwgcHBfaCAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApKSA+PiA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gKChwcF9tb2RbaW5kZXhdICYgMHgxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXhdID4+IDEpICYgMHgxMCkpID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmMgPiAwICYmIGJjIDwgcHBfdyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiciA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleF0gPj4gMSkgJiAweDEwKSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9ICgocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleF0gPj4gMSkgJiAweDEwKSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGF0IHRoZSBjb3JuZXIgZG8gZGVmYXVsdCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIHRoZSBkZXJpbmdpbmcgaWYgZGVjaXNpb24gZmxhZ3MgaW5kaWNhdGUgaXQncyBuZWNlc3NhcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNudGhmbGFnIDwgMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBjaHJvbWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGFtb3VudCB0byBjaGFuZ2UgbHVtaW5hbmNlIGlmIGl0IG5lZWRzIHRvIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VkIG9uIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmID0gKFFQID4+IDIpICsgNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHBvaW50ZXIgdG8gZmlyc3QgcGl4ZWwgb2YgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiBwaXhlbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldHVwIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgcmVnaW9uIHRvIHNtb290aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBnb2luZyB0byBiZSBhIDR4NCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYwID0gKGJyIDw8IDMpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgwID0gKGJjIDw8IDMpICsgMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgcGl4ZWwgcmFuZ2UgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIERFUklOR19USFIsIHNtb290aCB0aGUgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heF9ibGsgLSBtaW5fYmxrKSA+PSBERVJJTkdfVEhSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNtb290aCA0eDQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgocmVjLCB2MCwgaDAsIHYwIC0gMywgaDAgLSAzLCB0aHJlcywgd2lkdGgsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qY250aGZsYWcqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogYnI9PTAsIGJjPT0wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8qIGRlcmluZyovCi0gICAgICAgICAgICAgICAgICAgIH0gLypib3VuZGFyeSBjb25kaXRpb24qLwotICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuIDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OTkyMzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg0MCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgIm1wNGRlY19saWIuaCIgLyogdmlkZW8gZGVjb2RlciBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0jaW5jbHVkZSAidmxjX2RlY29kZS5oIgotI2luY2x1ZGUgImJpdHN0cmVhbS5oIgotI2luY2x1ZGUgInNjYWxpbmcuaCIKLSNpbmNsdWRlICJtYnR5cGVfbW9kZS5oIgotCi0jZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTkRJVElPTkFMX0lTX0NPTlNUQU5UCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IERlY29kZUZyYW1lQ29tYmluZWRNb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRGVjb2RlIGEgZnJhbWUgb2YgTVBFRzQgYml0c3RyZWFtIGluIGNvbWJpbmVkIG1vZGUuICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgMDMvMzAvMjAwMCA6IENsZWFuZWQgdXAgYW5kIG9wdGltaXplZCB0aGUgY29kZS4gICAgICAgICAgICAgKi8KLS8qICAgICAgMDMvMzEvMjAwMCA6IEFkZGVkIHByb3BlciBoYW5kbGluZyBvZiBNQiBzdHVmZmluZy4gICAgICAgICAgKi8KLS8qICAgICAgMDQvMTMvMjAwMCA6IFJld3JvdGUgdGhpcyBjb21iaW5lZCBtb2RlIHBhdGggY29tcGxldGVseSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBoYW5kbGVzICJDb21iaW5lZCBNb2RlIFdpdGggRXJyb3IgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNpbGllbmNlLiIgIE5vdyB0aGUgY29kZSByZXNlbWJsZXMgdGhlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkbyBjb2RlcyBpbiBNUEVHLTQgc3RhbmRhcmQgYmV0dGVyLiAgICAgICAgKi8KLS8qICAgICAgMTAvMTMvMjAwMCA6IEFkZCBmYXN0IFZMQytkZXF1YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgMDQvMTMvMjAwMSA6IGZpeCBNQl9zdHVmZmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAwOC8wNy8yMDAxIDogcmVtb3ZlIE1CemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1QVl9TVEFUVVMgRGVjb2RlRnJhbWVDb21iaW5lZE1vZGUoVmlkZW9EZWNEYXRhICp2aWRlbykKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzOwotICAgIGludCBtYm51bTsKLSAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKLSAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKLSAgICBpbnQgc2hvcnRWaWRlb0hlYWRlciA9IHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyOwotICAgIGludDE2IFFQLCAqUVBNQiA9IHZpZGVvLT5RUE1COwotICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKLSAgICBpbnQgblRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7Ci0gICAgaW50IG5NQlBlclJvdyA9IHZpZGVvLT5uTUJQZXJSb3c7Ci0gICAgaW50IHNsaWNlX2NvdW50ZXI7Ci0gICAgdWludDMyIHRtcHZhciwgbG9uZ196ZXJvX2JpdHM7Ci0gICAgdWludCBjb2RlOwotICAgIGludCB2YWxpZF9zdHVmZmluZzsKLSAgICBpbnQgcmVzeW5jX21hcmtlcl9sZW5ndGg7Ci0gICAgaW50IHN0dWZmaW5nX2xlbmd0aDsKLQotICAgIC8qIGFkZCB0aGlzIGZvciBlcnJvciByZXNpbGllbnQsIDA1LzE4LzIwMDAgKi8KLSAgICBpbnQzMiBzdGFydFBhY2tldDsKLSAgICBpbnQgbWJfc3RhcnQ7Ci0gICAgLyogY29weSBhbmQgcGFkIHRvIHByZXZfVm9wIGZvciBJTlRFUiBjb2RpbmcgKi8KLSAgICBzd2l0Y2ggKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBJX1ZPUCA6Ci0vLyAgICAgIG9zY2xfbWVtc2V0KE1vZGUsIE1PREVfSU5UUkEsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOwotICAgICAgICAgICAgcmVzeW5jX21hcmtlcl9sZW5ndGggPSAxNzsKLSAgICAgICAgICAgIHN0dWZmaW5nX2xlbmd0aCA9IDk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQX1ZPUCA6Ci0gICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkqNCpuVG90YWxNQik7Ci0gICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+bW90WSwgMCwgc2l6ZW9mKE1PVCkqNCpuVG90YWxNQik7Ci0vLyAgICAgIG9zY2xfbWVtc2V0KE1vZGUsIE1PREVfSU5URVIsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOwotICAgICAgICAgICAgcmVzeW5jX21hcmtlcl9sZW5ndGggPSAxNiArIGN1cnJWb3AtPmZjb2RlRm9yd2FyZDsKLSAgICAgICAgICAgIHN0dWZmaW5nX2xlbmd0aCA9IDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlRnJhbWVDb21iaW5lZE1vZGUoKTogVm9wIHR5cGUgbm90IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgfQotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgIGlmICh2aWRlby0+c2hvcnRWaWRlb0hlYWRlcikKLSAgICB7Ci0gICAgICAgIGlmICh2aWRlby0+YWR2YW5jZWRfSU5UUkEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+bW9kaWZpZWRfcXVhbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcl9Bbm5leElUOwotICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXJfQW5uZXhUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludHJhID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXJfQW5uZXhJOwotICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPm1vZGlmaWVkX3F1YW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcl9Bbm5leFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSB2aWRlby0+dmxjRGVjQ29lZmZJbnRyYSA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIC8qKiBJbml0aWFsaXplIHNsaWNlTm8gKioqLwotICAgIG1ibnVtID0gc2xpY2VfY291bnRlciA9IDA7Ci0vLyAgb3NjbF9tZW1zZXQodmlkZW8tPnNsaWNlTm8sIDAsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOwotICAgIFFQID0gdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplcjsKLQotICAgIGRvCi0gICAgewotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgZXF1aXZhbGVudCB0byBtb3Rpb25fc2hhcGVfdGV4dHVyZSgpICovCi0gICAgICAgIC8qICAgIGluIHRoZSBNUEVHLTQgc3RhbmRhcmQuICAgICAwNC8xMy8yMDAwICAgICAgICAgICovCi0gICAgICAgIG1iX3N0YXJ0ID0gbWJudW07Ci0gICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOyAgICAgICAgICAgICAvKiAgMDQvMjcvMDEgKi8KLSAgICAgICAgc3RhcnRQYWNrZXQgPSBnZXRQb2ludGVyKHN0cmVhbSk7Ci0KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgaWYgKHZpZGVvLT5tb2RpZmllZF9xdWFudCkKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPlFQX0NIUiA9IE1RX2Nocm9tYV9RUF90YWJsZVtRUF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+UVBfQ0hSID0gUVA7ICAgICAvKiBBTk5FWF9UICovCi0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICAvKiByZW1vdmUgYW55IHN0dWZmaW5nIGJpdHMgKi8KLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIHN0dWZmaW5nX2xlbmd0aCwgJmNvZGUpOwotICAgICAgICB3aGlsZSAoY29kZSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBzdHVmZmluZ19sZW5ndGgpOwotICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIHN0dWZmaW5nX2xlbmd0aCwgJmNvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgLyogd2UgbmVlZCB2aWRlby0+bWJudW0gaW4gbG93ZXIgbGV2ZWwgZnVuY3Rpb25zICovCi0gICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKLSAgICAgICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKG1ibnVtLCBuTUJQZXJSb3cpOwotICAgICAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IG1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKLSAgICAgICAgICAgIC8qIGFzc2lnbiBzbGljZSBudW1iZXIgZm9yIGVhY2ggbWFjcm9ibG9ja3MgKi8KLSAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9ICh1aW50OCkgc2xpY2VfY291bnRlcjsKLQotICAgICAgICAgICAgLyogZGVjb2RlIENPRCwgTUNCUEMsIEFDcHJlZF9mbGFnLCBDUEJZIGFuZCBEUVVBTlQgKi8KLSAgICAgICAgICAgIC8qIFdlIGhhdmUgdG8gZGlzY2FyZCBzdHVmZmVkIE1CIGhlYWRlciAqLwotICAgICAgICAgICAgc3RhdHVzID0gR2V0TUJoZWFkZXIodmlkZW8sICZRUCk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKLSAgICAgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgKHN0YXJ0UGFja2V0ICYgLTgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU3RvcmUgdGhlIFFQIHZhbHVlIGZvciBsYXRlciB1c2UgaW4gQUMgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgUVBNQlttYm51bV0gPSBRUDsKLQotICAgICAgICAgICAgaWYgKE1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBkZWNvZGUgdGhlIERDVCBjb2VmaWNpZW50cyBmb3IgdGhlIE1CICovCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gR2V0TUJEYXRhKHZpZGVvKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCAoc3RhcnRQYWNrZXQgJiAtOCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qIE1PREVfU0tJUFBFRCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNraXBwZWRNQk1vdGlvbkNvbXAodmlkZW8pOyAvKiAgMDgvMDQvMDUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE1vdGlvbiBjb21wZW5zYXRpb24gYW5kIHB1dCB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrCi0gICAgICAgICAgICBtYm51bSsrOwotCi0gICAgICAgICAgICAvKiByZW1vdmUgYW55IHN0dWZmaW5nIGJpdHMgKi8KLSAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCBzdHVmZmluZ19sZW5ndGgsICZjb2RlKTsKLSAgICAgICAgICAgIHdoaWxlIChjb2RlID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgc3R1ZmZpbmdfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgc3R1ZmZpbmdfbGVuZ3RoLCAmY29kZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGhhdmUgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB2aWRlbyBwYWNrZXQgb3Igdm9wPyAqLwotICAgICAgICAgICAgaWYgKHNob3J0VmlkZW9IZWFkZXIpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgaWYgKCF2aWRlby0+c2xpY2Vfc3RydWN0dXJlKQotICAgICAgICAgICAgICAgIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBpZiAobWJudW0gPj0gKGludCkodmlkZW8tPm1ibnVtX3JvdyArIDEpKnZpZGVvLT5uTUJpbkdPQikgICAvKiAgMTAvMTEvMDEgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ibnVtID49IG5Ub3RhbE1CKSByZXR1cm4gUFZfU1VDQ0VTUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzIoc3RyZWFtLCBHT0JfUkVTWU5DX01BUktFUl9MRU5HVEgsICZ0bXB2YXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IEdPQl9SRVNZTkNfTUFSS0VSKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0JpdHN0cmVhbVNob3dCaXRzQnl0ZUFsaWduKHN0cmVhbSwgR09CX1JFU1lOQ19NQVJLRVJfTEVOR1RILCAmdG1wdmFyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IEdPQl9SRVNZTkNfTUFSS0VSKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYm51bSA+PSBuVG90YWxNQikgIC8qIGluIGNhc2Ugbm8gdmFsaWQgc3R1ZmZpbmcgIDA2LzIzLzAxICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX3N0dWZmaW5nID0gdmFsaWRTdHVmZmluZ19oMjYzKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRfc3R1ZmZpbmcgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jZWFsUGFja2V0KHZpZGVvLCBtYl9zdGFydCwgblRvdGFsTUIsIHNsaWNlX2NvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogQU5ORVhfSyAqLwotICAgICAgICAgICAgICAgICAgICBQVl9CaXRzdHJlYW1TaG93Qml0c0J5dGVBbGlnbk5vRm9yY2VTdHVmZmluZyhzdHJlYW0sIDE3LCAmdG1wdmFyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcHZhciA9PSBSRVNZTkNfTUFSS0VSKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmdfaDI2MyhzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkX3N0dWZmaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiAgMDYvMjEvMDEgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ibnVtID49IG5Ub3RhbE1CKSAgLyogaW4gY2FzZSBubyB2YWxpZCBzdHVmZmluZyAgMDYvMjMvMDEgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qICAxMS8wMS8yMDAyIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZSBhbmQgdGhlcmUgaXMgc29tZSBnYXJiYWdlIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUgKGkuZS4gbm8gbmV4dCBzdGFydGNvZGUpIGJyZWFrIGlmIHRoZSBzdHVmZmluZyBpcyB2YWxpZCAqLwotICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmcoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkX3N0dWZmaW5nID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAxMS8wMS8yMDAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlYWxQYWNrZXQodmlkZW8sIG1iX3N0YXJ0LCBuVG90YWxNQiwgc2xpY2VfY291bnRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtQnl0ZUFsaWduKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9TVUNDRVNTOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0JpdHN0cmVhbVNob3dCaXRzQnl0ZUFsaWduKHN0cmVhbSwgMjMsICZ0bXB2YXIpOyAvKiB0aGlzIGNhbGwgaXMgdmFsaWQgZm9yIGZfY29kZSA8IDggKi8KLSAgICAgICAgICAgICAgICBsb25nX3plcm9fYml0cyA9ICF0bXB2YXI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHRtcHZhciA+PiAoMjMgLSByZXN5bmNfbWFya2VyX2xlbmd0aCkpID09IFJFU1lOQ19NQVJLRVIgfHwgbG9uZ196ZXJvX2JpdHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmcoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkX3N0dWZmaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qICAwNi8yMS8wMSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChUUlVFKTsKLQotICAgICAgICBpZiAoc2hvcnRWaWRlb0hlYWRlcikKLSAgICAgICAgeyAvKiBXZSBuZWVkIHRvIGNoZWNrIG5ld2dvYiB0byByZWZyZXNoIHF1YW50aXplciAqLwotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICAgICAgaWYgKCF2aWRlby0+c2xpY2Vfc3RydWN0dXJlKQotICAgICAgICAgICAgewotI2VuZGlmCi0gICAgICAgICAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBQVl9Hb2JIZWFkZXIodmlkZW8pKSA9PSBQVl9GQUlMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBxdWlja1NlYXJjaEdPQkhlYWRlcihzdHJlYW0pKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1ibnVtID0gY3VyclZvcC0+Z29iTnVtYmVyICogdmlkZW8tPm5NQmluR09COwotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICgoc3RhdHVzID0gUFZfSDI2M1NsaWNlSGVhZGVyKHZpZGVvLCAmbWJudW0pKSA9PSBQVl9GQUlMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBxdWlja1NlYXJjaEgyNjNTbGljZUhlYWRlcihzdHJlYW0pKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IFBWX1JlYWRWaWRlb1BhY2tldEhlYWRlcih2aWRlbywgJm1ibnVtKSkgPT0gUFZfRkFJTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IHF1aWNrU2VhcmNoVmlkZW9QYWNrZXRIZWFkZXIoc3RyZWFtLCByZXN5bmNfbWFya2VyX2xlbmd0aCkpICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9WT1ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ibnVtID0gblRvdGFsTUI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWJudW0gPiB2aWRlby0+bWJudW0gKyAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25jZWFsUGFja2V0KHZpZGVvLCB2aWRlby0+bWJudW0sIG1ibnVtLCBzbGljZV9jb3VudGVyKTsKLSAgICAgICAgfQotICAgICAgICBRUCA9IHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXI7Ci0gICAgICAgIHNsaWNlX2NvdW50ZXIrKzsKLSAgICAgICAgaWYgKG1ibnVtID49IG5Ub3RhbE1CKSBicmVhazsKLQotICAgIH0KLSAgICB3aGlsZSAoVFJVRSk7Ci0gICAgcmV0dXJuIFBWX1NVQ0NFU1M7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogR2V0TUJIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRGVjb2RlIE1CIGhlYWRlciwgbm90X2NvZGVkLCBtY2JwYywgYWNfcHJlZF9mbGFnLCBjYnB5LCBkcXVhbnQuICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAzLzI5LzAwIDogQ2hhbmdlZCB0aGUgcmV0dXJuZWQgdmFsdWUgYW5kIG9wdGltaXplZCB0aGUgY29kZS4gICAgKi8KLS8qICAgICAgNC8wMS8wMSA6IG5ldyBBQ0RDIHByZWRpY3Rpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1QVl9TVEFUVVMgR2V0TUJoZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50MTYgKlFQKQotewotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOwotICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKLSAgICB1aW50OCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7Ci0gICAgaW50IHhfcG9zID0gdmlkZW8tPm1ibnVtX2NvbDsKLSAgICB0eXBlRENTdG9yZSAqREMgPSB2aWRlby0+cHJlZERDICsgbWJudW07Ci0gICAgdHlwZURDQUNTdG9yZSAqRENBQ19yb3cgPSB2aWRlby0+cHJlZERDQUNfcm93ICsgeF9wb3M7Ci0gICAgdHlwZURDQUNTdG9yZSAqRENBQ19jb2wgPSB2aWRlby0+cHJlZERDQUNfY29sOwotICAgIGNvbnN0IHN0YXRpYyBpbnQxNiAgRFFfdGFiWzRdID0geyAtMSwgLTIsIDEsIDJ9OwotCi0gICAgaW50IENCUFksIENCUEM7Ci0gICAgaW50IE1CdHlwZSwgVm9wVHlwZTsKLSAgICBpbnQgTUNCUEM7Ci0gICAgdWludCBEUVVBTlQ7Ci0gICAgaW50IGNvbXA7Ci0gICAgQm9vbCBtYl9jb2RlZDsKLQotICAgIFZvcFR5cGUgPSB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7Ci0gICAgbWJfY29kZWQgPSAoKFZvcFR5cGUgPT0gSV9WT1ApID8gVFJVRSA6ICFCaXRzdHJlYW1SZWFkMUJpdHNfSU5MSU5FKHN0cmVhbSkpOwotCi0gICAgaWYgKCFtYl9jb2RlZCkKLSAgICB7Ci0gICAgICAgIC8qIHNraXBwZWQgbWFjcm9ibG9jayAqLwotICAgICAgICBNb2RlW21ibnVtXSA9IE1PREVfU0tJUFBFRDsKLSAgICAgICAgLy9vc2NsX21lbXNldChEQ0FDX3JvdywgMCwgc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsgICAvKiAgU0tJUFBFRF9BQ0RDICovCi0gICAgICAgIC8vb3NjbF9tZW1zZXQoRENBQ19jb2wsIDAsIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7Ci0gICAgICAgIFpFUk9fT1VUXzY0QllURVMoRENBQ19yb3cpOwotICAgICAgICBaRVJPX09VVF82NEJZVEVTKERDQUNfY29sKTsgLyogIDA4LzEyLzA1ICovCi0KLSAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKLSAgICAgICAgewotICAgICAgICAgICAgKCpEQylbY29tcF0gPSBtaWRfZ3JheTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBjb2RlZCBtYWNyb2Jsb2NrICovCi0gICAgICAgIGlmIChWb3BUeXBlID09IElfVk9QKQotICAgICAgICB7Ci0gICAgICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRyYShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICAgICAgaWYgKCF2aWRlby0+ZGVibG9ja2luZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRlcihzdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1DQlBDID0gUFZfVmxjRGVjTUNCUENfY29tX2ludGVyX0gyNjMoc3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRlcihzdHJlYW0pOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKE1DQlBDKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICBNb2RlW21ibnVtXSA9ICh1aW50OCkoTUJ0eXBlID0gTUJ0eXBlX21vZGVbTUNCUEMgJiA3XSk7Ci0gICAgICAgIENCUEMgPSAoTUNCUEMgPj4gNCkgJiAzOwotCi0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0gICAgICAgIGlmIChNQnR5cGUgJiBJTlRSQV9NQVNLKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9ICh1aW50OCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5hZHZhbmNlZF9JTlRSQSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tYmxvY2stPmRpcmVjdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibG9jay0+ZGlyZWN0aW9uID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKChNQnR5cGUgJiBJTlRSQV9NQVNLKSAmJiAhdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9ICh1aW50OCkgQml0c3RyZWFtUmVhZDFCaXRzX0lOTElORShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gMDsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIENCUFkgPSBQVl9WbGNEZWNDQlBZKHN0cmVhbSwgTUJ0eXBlICYgSU5UUkFfTUFTSyk7IC8qIElOVFJBIHx8IElOVFJBX1EgKi8KLSAgICAgICAgaWYgKENCUFkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdXIDA0LzIzLzk5Ci0gICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gPSAodWludDgpKENCUFkgPDwgMiB8IChDQlBDICYgMykpOwotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICBpZiAoTUJ0eXBlICYgUV9NQVNLKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXZpZGVvLT5tb2RpZmllZF9xdWFudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEUVVBTlQgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7Ci0gICAgICAgICAgICAgICAgKlFQICs9IERRX3RhYltEUVVBTlRdOwotCi0gICAgICAgICAgICAgICAgaWYgKCpRUCA8IDEpICpRUCA9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKlFQID4gMzEpICpRUCA9IDMxOwotICAgICAgICAgICAgICAgIHZpZGVvLT5RUF9DSFIgPSAqUVA7ICAvKiBBTk5FWF9UICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqUVAgKz0gRFFfdGFiX0FubmV4X1RfMTFbKlFQXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpRUCArPSBEUV90YWJfQW5uZXhfVF8xMFsqUVBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqUVAgPCAxKSAqUVAgPSAxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgqUVAgPiAzMSkgKlFQID0gMzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpRUCA9IChpbnQxNilCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpZGVvLT5RUF9DSFIgPSAgTVFfY2hyb21hX1FQX3RhYmxlWypRUF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmIChNQnR5cGUgJiBRX01BU0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIERRVUFOVCA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKLSAgICAgICAgICAgICpRUCArPSBEUV90YWJbRFFVQU5UXTsKLQotICAgICAgICAgICAgaWYgKCpRUCA8IDEpICpRUCA9IDE7Ci0gICAgICAgICAgICBlbHNlIGlmICgqUVAgPiAzMSkgKlFQID0gMzE7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgICByZXR1cm4gUFZfU1VDQ0VTUzsKLX0KLQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKLSogICAgICAgMy8xMC8wMCAgOiBpbml0aWFsIG1vZGlmaWNhdGlvbiB0byB0aGUKLSogICAgICAgICAgICAgICAgbmV3IFBWLURlY29kZXIgTGliIGZvcm1hdC4KLSogICAgICAgNC8yLzIwMDAgOiBDbGVhbnVwIGFuZCBlcnJvci1oYW5kbGluZyBtb2RpZmljYXRpb24uICBUaGlzCi0qICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGRpdmlkZWQgaW50byBzZXZlcmFsIHN1Yi1mdW5jdGlvbnMgZm9yCi0qICAgICAgICAgICAgICAgICAgIGJldHRlciBjb2Rpbmcgc3R5bGUgYW5kIG1haW50YWluYW5jZSByZWFzb24uICBJIGFsc28KLSogICAgICAgICAgICAgICAgICAgZ3JlYXRseSBzaHJ1bmsgdGhlIGNvZGUgc2l6ZSBoZXJlLgotKiAgICAgICA5LzE4LzIwMDAgOiBWbGNEZWNvZGUrRGVxdWFudCBvcHRpbWl6YXRpb24gKgotKiAgICAgICA0LzAxLzIwMDEgOiBuZXcgQUNEQyBwcmVkaWN0aW9uIHN0cnVjdHVyZQotKiAgICAgICAzLzI5LzIwMDIgOiByZW1vdmVkIEdldEludHJhTUIgYW5kIEdldEludGVyTUIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLwotUFZfU1RBVFVTIEdldE1CRGF0YShWaWRlb0RlY0RhdGEgKnZpZGVvKQotewotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOwotICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKLSAgICBNYWNyb0Jsb2NrICptYmxvY2sgPSB2aWRlby0+bWJsb2NrOwotICAgIGludDE2ICpkYXRhQmxvY2s7Ci0gICAgUElYRUwgKmNfY29tcDsKLSAgICB1aW50IG1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtXTsKLSAgICB1aW50IENCUCA9IHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV07Ci0gICAgdHlwZURDU3RvcmUgKkRDID0gdmlkZW8tPnByZWREQyArIG1ibnVtOwotICAgIGludCBpbnRyYV9kY192bGNfdGhyID0gdmlkZW8tPmN1cnJWb3AtPmludHJhRENWbGNUaHI7Ci0gICAgaW50MTYgUVAgPSB2aWRlby0+UVBNQlttYm51bV07Ci0gICAgaW50MTYgUVBfdG1wID0gUVA7Ci0gICAgaW50IHdpZHRoID0gdmlkZW8tPndpZHRoOwotICAgIGludCAgY29tcDsKLSAgICBpbnQgIHN3aXRjaGVkOwotICAgIGludCBuY29lZmZzWzZdID0gezAsIDAsIDAsIDAsIDAsIDB9OwotICAgIGludCAqbm9fY29lZmYgPSBtYmxvY2stPm5vX2NvZWZmOwotICAgIGludDE2IERDX2NvZWZmOwotICAgIFBWX1NUQVRVUyBzdGF0dXM7Ci0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIC8qIHBvc3QtcHJvY2Vzc2luZyAqLwotICAgIHVpbnQ4ICpwcF9tb2RbNl07Ci0gICAgaW50IFRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7Ci0gICAgaW50IE1CX2luX3dpZHRoID0gdmlkZW8tPm5NQlBlclJvdzsKLSNlbmRpZgotICAgIGludCB5X3BvcyA9IHZpZGVvLT5tYm51bV9yb3c7Ci0gICAgaW50IHhfcG9zID0gdmlkZW8tPm1ibnVtX2NvbDsKLSAgICBpbnQzMiBvZmZzZXQgPSAoaW50MzIpKHlfcG9zIDw8IDQpICogd2lkdGggKyAoeF9wb3MgPDwgNCk7Ci0KLSAgICAvKiBEZWNvZGUgZWFjaCA4LWJ5LTggYmxvY2tzLiBjb21wIDAgfiAzIGFyZSBsdW1pbmFuY2UgYmxvY2tzLCA0IH4gNSAqLwotICAgIC8qICBhcmUgY2hyb21pbmFuY2UgYmxvY2tzLiAgIDA0LzAzLzIwMDAuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgewotICAgICAgICAvKiogcG9zdC1wcm9jZXNzaW5nICoqKi8KLSAgICAgICAgcHBfbW9kWzBdID0gdmlkZW8tPnBzdHByY1R5cEN1ciArICh5X3BvcyA8PCAxKSAqIChNQl9pbl93aWR0aCA8PCAxKSArICh4X3BvcyA8PCAxKTsKLSAgICAgICAgcHBfbW9kWzFdID0gcHBfbW9kWzBdICsgMTsKLSAgICAgICAgcHBfbW9kWzJdID0gcHBfbW9kWzBdICsgKE1CX2luX3dpZHRoIDw8IDEpOwotICAgICAgICBwcF9tb2RbM10gPSBwcF9tb2RbMl0gKyAxOwotICAgICAgICBwcF9tb2RbNF0gPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKFRvdGFsTUIgPDwgMikgKyBtYm51bTsKLSAgICAgICAgcHBfbW9kWzVdID0gcHBfbW9kWzRdICsgVG90YWxNQjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qICBvc2NsX21lbXNldChtYmxvY2stPmJsb2NrLCAwLCBzaXplb2YodHlwZU1CU3RvcmUpKTsgICAgQXVnIDksMjAwNSAqLwotCi0gICAgaWYgKG1vZGUgJiBJTlRSQV9NQVNLKSAvKiBNT0RFX0lOVFJBIHx8IE1PREVfSU5UUkFfUSAqLwotICAgIHsKLSAgICAgICAgc3dpdGNoZWQgPSAwOwotICAgICAgICBpZiAoaW50cmFfZGNfdmxjX3RocikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZpZGVvLT51c2VQcmV2UVApCi0gICAgICAgICAgICAgICAgUVBfdG1wID0gdmlkZW8tPlFQTUJbbWJudW0tMV07ICAgLyogcnVubmluZyBRUCAgMDQvMjYvMDEgKi8KLQotICAgICAgICAgICAgc3dpdGNoZWQgPSAoaW50cmFfZGNfdmxjX3RociA9PSA3IHx8IFFQX3RtcCA+PSBpbnRyYV9kY192bGNfdGhyICogMiArIDExKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1ibG9jay0+RENTY2FsYXJMdW0gPSBjYWxfZGNfc2NhbGVyKFFQLCBMVU1JTkFOQ0VfRENfVFlQRSk7ICAgLyogIDMvMDEvMDEgKi8KLSAgICAgICAgbWJsb2NrLT5EQ1NjYWxhckNociA9IGNhbF9kY19zY2FsZXIoUVAsIENIUk9NSU5BTkNFX0RDX1RZUEUpOwotCi0gICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFCbG9jayA9IG1ibG9jay0+YmxvY2tbY29tcF07ICAgIC8qIDEwLzIwLzIwMDAgKi8KLQotICAgICAgICAgICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQotICAgICAgICAgICAgewotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICAgICAgICAgIGlmICghdmlkZW8tPmFkdmFuY2VkX0lOVFJBKQotICAgICAgICAgICAgICAgIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBEQ19jb2VmZiA9IChpbnQxNikgQml0c3RyZWFtUmVhZEJpdHMxNl9JTkxJTkUoc3RyZWFtLCA4KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKERDX2NvZWZmICYgMHg3ZikgPT0gMCkgLyogMTI4ICYgMCAgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudGx5IHdlIHdpbGwgb25seSBzaWduYWwgRkFJTCBmb3IgMTI4LiBXZSB3aWxsIGlnbm9yZSB0aGUgMCBjYXNlICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERDX2NvZWZmID09IDEyOCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoRENfY29lZmYgPT0gMjU1KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQ19jb2VmZiA9IDEyODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2tbMF0gPSAoaW50MTYpIERDX2NvZWZmOwotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludHJhQmxvY2tfU0godmlkZW8sIGNvbXAsIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN3aXRjaGVkID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9EZWNvZGVQcmVkaWN0ZWRJbnRyYURDKGNvbXAsIHN0cmVhbSwgJkRDX2NvZWZmKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2tbMF0gPSAoaW50MTYpIERDX2NvZWZmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gVmxjRGVxdWFudEgyNjNJbnRyYUJsb2NrKHZpZGVvLCBjb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hlZCwgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1tjb21wXSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN3aXRjaGVkKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoKGRhdGFCbG9jayArIDEpLCAwLCBzaXplb2YoaW50MTYpKjYzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub19jb2VmZltjb21wXSA9IG5jb2VmZnNbY29tcF07Ci0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9ICh1aW50OCkgUG9zdFByb2NTZW1hcGhvcmUoZGF0YUJsb2NrKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIE1CbG9ja0lEQ1QodmlkZW8pOwotICAgIH0KLSAgICBlbHNlICAgICAgLyogSU5URVIgbW9kZXMgKi8KLSAgICB7ICAgLyogIG1vdmVkIGl0IGhlcmUgQXVnIDE1LCAyMDA1ICovCi0gICAgICAgIC8qIGRlY29kZSB0aGUgbW90aW9uIHZlY3RvciAoaWYgdGhlcmUgYXJlIGFueSkgKi8KLSAgICAgICAgc3RhdHVzID0gUFZfR2V0TUJ2ZWN0b3JzKHZpZGVvLCBtb2RlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLQotICAgICAgICBNQk1vdGlvbkNvbXAodmlkZW8sIENCUCk7Ci0gICAgICAgIGNfY29tcCAgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBvZmZzZXQ7Ci0KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykKLSAgICAgICAgewotICAgICAgICAgICAgKCpEQylbY29tcF0gPSBtaWRfZ3JheTsKLSAgICAgICAgICAgIGlmIChDQlAgJiAoMSA8PCAoNSAtIGNvbXApKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCBjb21wLCBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgJm1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKLSAgICAgICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbY29tcF0pKSByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgICAgIEJsb2NrSURDVChjX2NvbXAgKyAoY29tcCYyKSood2lkdGggPDwgMikgKyA4Kihjb21wJjEpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAoY29tcCYyKSo2NCArIDgqKGNvbXAmMSksIG1ibG9jay0+YmxvY2tbY29tcF0sIHdpZHRoLCBuY29lZmZzW2NvbXBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAodWludDgpKChuY29lZmZzW2NvbXBdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCi0gICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAwOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2aWRlby0+UVBNQlttYm51bV0gPSB2aWRlby0+UVBfQ0hSOyAgICAgLyogQU5ORVhfVCAqLwotCi0KLQotICAgICAgICAoKkRDKVs0XSA9IG1pZF9ncmF5OwotICAgICAgICBpZiAoQ0JQICYgMikKLSAgICAgICAgewotICAgICAgICAgICAgbmNvZWZmc1s0XSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgNCwgbWJsb2NrLT5iaXRtYXBjb2xbNF0sICZtYmxvY2stPmJpdG1hcHJvd1s0XSk7Ci0gICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbNF0pKSByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI1NiwgbWJsb2NrLT5ibG9ja1s0XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgbWJsb2NrLT5iaXRtYXByb3dbNF0pOwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNF0gPSAodWludDgpKChuY29lZmZzWzRdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs0XSA9IDA7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OwotICAgICAgICBpZiAoQ0JQICYgMSkKLSAgICAgICAgewotICAgICAgICAgICAgbmNvZWZmc1s1XSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgNSwgbWJsb2NrLT5iaXRtYXBjb2xbNV0sICZtYmxvY2stPmJpdG1hcHJvd1s1XSk7Ci0gICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbNV0pKSByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI2NCwgbWJsb2NrLT5ibG9ja1s1XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s1XSwKLSAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs1XSwgbWJsb2NrLT5iaXRtYXByb3dbNV0pOwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNV0gPSAodWludDgpKChuY29lZmZzWzVdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs1XSA9IDA7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICB2aWRlby0+UVBNQlttYm51bV0gPSBRUDsgIC8qIHJlc3RvcmUgdGhlIFFQIHZhbHVlcyAgQU5ORVhfVCovCi0jZWxzZQotICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNDsgY29tcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKkRDKVtjb21wXSA9IG1pZF9ncmF5OwotICAgICAgICAgICAgaWYgKENCUCAmICgxIDw8ICg1IC0gY29tcCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIGNvbXAsIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwotICAgICAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1tjb21wXSkpIHJldHVybiBQVl9GQUlMOwotCi0gICAgICAgICAgICAgICAgQmxvY2tJRENUKGNfY29tcCArIChjb21wJjIpKih3aWR0aCA8PCAyKSArIDgqKGNvbXAmMSksIG1ibG9jay0+cHJlZF9ibG9jayArIChjb21wJjIpKjY0ICsgOCooY29tcCYxKSwgbWJsb2NrLT5ibG9ja1tjb21wXSwgd2lkdGgsIG5jb2VmZnNbY29tcF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCBtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7Ci0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9ICh1aW50OCkoKG5jb2VmZnNbY29tcF0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KLSAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9IDA7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICgqREMpWzRdID0gbWlkX2dyYXk7Ci0gICAgICAgIGlmIChDQlAgJiAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBuY29lZmZzWzRdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCA0LCBtYmxvY2stPmJpdG1hcGNvbFs0XSwgJm1ibG9jay0+Yml0bWFwcm93WzRdKTsKLSAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1s0XSkpIHJldHVybiBQVl9GQUlMOwotCi0gICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjU2LCBtYmxvY2stPmJsb2NrWzRdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzRdLAotICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzRdLCBtYmxvY2stPmJpdG1hcHJvd1s0XSk7Ci0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs0XSA9ICh1aW50OCkoKG5jb2VmZnNbNF0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzRdID0gMDsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgICgqREMpWzVdID0gbWlkX2dyYXk7Ci0gICAgICAgIGlmIChDQlAgJiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBuY29lZmZzWzVdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCA1LCBtYmxvY2stPmJpdG1hcGNvbFs1XSwgJm1ibG9jay0+Yml0bWFwcm93WzVdKTsKLSAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1s1XSkpIHJldHVybiBQVl9GQUlMOwotCi0gICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjY0LCBtYmxvY2stPmJsb2NrWzVdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzVdLAotICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCBtYmxvY2stPmJpdG1hcHJvd1s1XSk7Ci0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzVdID0gMDsKLSNlbmRpZgotI2VuZGlmICAvLyBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLQotCi0KLQotCi0KLSAgICB9Ci0KLSAgICB2aWRlby0+dXNlUHJldlFQID0gMTsgICAgICAgICAgLyogc2hvdWxkIGJlIHNldCBhZnRlciBkZWNvZGluZyB0aGUgZmlyc3QgQ29kZWQgIDA0LzI3LzAxICovCi0gICAgcmV0dXJuIFBWX1NVQ0NFU1M7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kYXRhcGFydF9kZWNvZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkYjA0Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kYXRhcGFydF9kZWNvZGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzk0ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jaW5jbHVkZSAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgInZsY19kZWNvZGUuaCIKLSNpbmNsdWRlICJiaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJzY2FsaW5nLmgiCi0jaW5jbHVkZSAibWJ0eXBlX21vZGUuaCIKLSNpbmNsdWRlICJpZGN0LmgiCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09ORElUSU9OQUxfSVNfQ09OU1RBTlQKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogRGVjb2RlRnJhbWVEYXRhUGFydE1vZGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBEZWNvZGUgYSBmcmFtZSBvZiBNUEVHNCBiaXRzdHJlYW0gaW4gZGF0YXBhcnRpdGlvbmluZyBtb2RlLiAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAwNC8yNS8yMDAwIDogUmV3cml0ZSB0aGUgZGF0YSBwYXJ0aXRpb25pbmcgcGF0aCBjb21wbGV0ZWx5ICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHBzZXVkbyBjb2RlcyBpbiBNUEVHLTQgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6IDA5LzE4LzIwMDAgYWRkIGZhc3QgVmxjRGVjb2RlK0RlcXVhbnQgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAwNC8xNy8yMDAxIGNsZWFudXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1QVl9TVEFUVVMgRGVjb2RlRnJhbWVEYXRhUGFydE1vZGUoVmlkZW9EZWNEYXRhICp2aWRlbykKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzOwotICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOwotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOwotCi0gICAgaW50IG5NQlBlclJvdyA9IHZpZGVvLT5uTUJQZXJSb3c7Ci0KLSAgICBpbnQgdm9wVHlwZSA9IGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOwotICAgIGludCBtYm51bTsKLSAgICBpbnQgblRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7Ci0gICAgaW50IHNsaWNlX2NvdW50ZXI7Ci0gICAgaW50IHJlc3luY19tYXJrZXJfbGVuZ3RoOwotCi0gICAgLyogY29weSBhbmQgcGFkIHRvIHByZXZfVm9wIGZvciBJTlRFUiBjb2RpbmcgKi8KLSAgICBzd2l0Y2ggKHZvcFR5cGUpCi0gICAgewotICAgICAgICBjYXNlIElfVk9QIDoKLS8vICAgICAgb3NjbF9tZW1zZXQoTW9kZSwgTU9ERV9JTlRSQSwgc2l6ZW9mKHVpbnQ4KSpuVG90YWxNQik7Ci0gICAgICAgICAgICByZXN5bmNfbWFya2VyX2xlbmd0aCA9IDE3OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUF9WT1AgOgotICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1vdFgsIDAsIHNpemVvZihNT1QpKjQqblRvdGFsTUIpOwotICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1vdFksIDAsIHNpemVvZihNT1QpKjQqblRvdGFsTUIpOwotLy8gICAgICBvc2NsX21lbXNldChNb2RlLCBNT0RFX0lOVEVSLCBzaXplb2YodWludDgpKm5Ub3RhbE1CKTsKLSAgICAgICAgICAgIHJlc3luY19tYXJrZXJfbGVuZ3RoID0gMTYgKyBjdXJyVm9wLT5mY29kZUZvcndhcmQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVGcmFtZURhdGFQYXJ0TW9kZSgpOiBWb3AgdHlwZSBub3Qgc3VwcG9ydGVkLlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiogSW5pdGlhbGl6ZSBzbGljZU5vICoqKi8KLSAgICBtYm51bSA9IHNsaWNlX2NvdW50ZXIgPSAwOwotLy8gIG9zY2xfbWVtc2V0KHZpZGVvLT5zbGljZU5vLCAwLCBzaXplb2YodWludDgpKm5Ub3RhbE1CKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgZXF1aXZhbGVudCB0byBtb3Rpb25fc2hhcGVfdGV4dHVyZSgpICovCi0gICAgICAgIC8qIGluIHRoZSBNUEVHLTQgc3RhbmRhcmQuICAgICAgICAgICAgMDQvMTMvMjAwMCAgICAgICovCi0gICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOwotICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyhtYm51bSwgbk1CUGVyUm93KTsgICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbmJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCi0gICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7Ci0KLSAgICAgICAgc3dpdGNoICh2b3BUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIElfVk9QIDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVEYXRhUGFydF9JX1ZpZGVvUGFja2V0KHZpZGVvLCBzbGljZV9jb3VudGVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBQX1ZPUCA6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRGF0YVBhcnRfUF9WaWRlb1BhY2tldCh2aWRlbywgc2xpY2VfY291bnRlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgIG1wNGRlY19sb2coIkRlY29kZUZyYW1lRGF0YVBhcnRNb2RlKCk6IFZvcCB0eXBlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICgoc3RhdHVzID0gUFZfUmVhZFZpZGVvUGFja2V0SGVhZGVyKHZpZGVvLCAmbWJudW0pKSA9PSBQVl9GQUlMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHN0YXR1cyA9IHF1aWNrU2VhcmNoVmlkZW9QYWNrZXRIZWFkZXIoc3RyZWFtLCByZXN5bmNfbWFya2VyX2xlbmd0aCkpICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9WT1ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ibnVtID0gblRvdGFsTUI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWJudW0gPiB2aWRlby0+bWJudW0gKyAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25jZWFsUGFja2V0KHZpZGVvLCB2aWRlby0+bWJudW0sIG1ibnVtLCBzbGljZV9jb3VudGVyKTsKLSAgICAgICAgfQotICAgICAgICBzbGljZV9jb3VudGVyKys7Ci0gICAgICAgIGlmIChtYm51bSA+PSBuVG90YWxNQikKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCi0gICAgfQotICAgIHdoaWxlIChUUlVFKTsKLQotICAgIHJldHVybiBQVl9TVUNDRVNTOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogRGVjb2RlRGF0YVBhcnRfSV9WaWRlb1BhY2tldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNC8yNS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IERlY29kZSBEYXRhIFBhcnRpdGlvbmVkIE1vZGUgVmlkZW8gUGFja2V0IGluIEktVk9QICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgUFZfRkFJTCBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6IDA5LzE4LzIwMDAgYWRkIGZhc3QgVmxjRGVjb2RlK0RlcXVhbnQgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAwNC8wMS8yMDAxIGZpeGVkIE1CX3N0dWZmaW5nLCByZW1vdmVkIHVubmVjZXNzYXJ5IGNvZGUgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1QVl9TVEFUVVMgRGVjb2RlRGF0YVBhcnRfSV9WaWRlb1BhY2tldChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgc2xpY2VfY291bnRlcikKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzOwotICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKLSAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKLSAgICBpbnQgIG5Ub3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COwotICAgIGludCAgbWJudW0sIG1iX3N0YXJ0LCBtYl9lbmQ7Ci0gICAgaW50MTYgUVAsICpRUE1CID0gdmlkZW8tPlFQTUI7Ci0gICAgaW50ICBNQnR5cGUsIE1DQlBDLCBDQlBZOwotICAgIHVpbnQzMiB0bXB2YXI7Ci0gICAgdWludCBjb2RlOwotICAgIGludCBuTUJQZXJSb3cgPSB2aWRlby0+bk1CUGVyUm93OwotICAgIEJvb2wgdmFsaWRfc3R1ZmZpbmc7Ci0gICAgaW50MzIgc3RhcnRTZWNvbmRQYXJ0LCBzdGFydEZpcnN0UGFydCA9IGdldFBvaW50ZXIoc3RyZWFtKTsKLQotICAgIC8qIGRlY29kZSB0aGUgZmlyc3QgcGFydGl0aW9uICovCi0gICAgUVAgPSB2aWRlby0+Y3VyclZvcC0+cXVhbnRpemVyOwotICAgIG1iX3N0YXJ0ID0gbWJudW0gPSB2aWRlby0+bWJudW07Ci0gICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7ICAgICAgICAgLyogIDA0LzI3LzAxICovCi0KLQotICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCA5LCAmY29kZSk7Ci0gICAgd2hpbGUgKGNvZGUgPT0gMSkKLSAgICB7Ci0gICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDkpOwotICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgOSwgJmNvZGUpOwotICAgIH0KLQotICAgIGRvCi0gICAgewotICAgICAgICAvKiBkZWNvZGUgQ09ELCBNQ0JQQywgQUNwcmVkX2ZsYWcsIENQQlkgYW5kIERRVUFOVCAqLwotICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRyYShzdHJlYW0pOwotCi0gICAgICAgIGlmICghVkxDX0VSUk9SX0RFVEVDVEVEKE1DQlBDKSkKLSAgICAgICAgewotICAgICAgICAgICAgTW9kZVttYm51bV0gPSAodWludDgpKE1CdHlwZSA9IE1CdHlwZV9tb2RlW01DQlBDICYgN10pOwotICAgICAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSA9ICh1aW50OCkoKE1DQlBDID4+IDQpICYgMyk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBHZXRNQmhlYWRlckRhdGFQYXJ0X0RRVUFOVF9EQyh2aWRlbywgJlFQKTsKLSAgICAgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOyAgICAgICAgLyogc2V0IGl0IGFmdGVyIHRoZSBmaXJzdCBjb2RlZCBNQiAgICAgIDA0LzI3LzAxICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCi0gICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OwotICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0Rmlyc3RQYXJ0KTsKLSAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gKHVpbnQ4KSBzbGljZV9jb3VudGVyOwotICAgICAgICBRUE1CW21ibnVtXSA9IFFQOwotICAgICAgICB2aWRlby0+bWJudW0gPSArK21ibnVtOwotCi0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCA5LCAmY29kZSk7Ci0gICAgICAgIHdoaWxlIChjb2RlID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDkpOwotICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDksICZjb2RlKTsKLSAgICAgICAgfQotICAgICAgICAvKiBoYXZlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gcGFja2V0IG9yIHZvcD8gKi8KLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIERDX01BUktFUl9MRU5HVEgsICZ0bXB2YXIpOwotCi0gICAgfQotICAgIHdoaWxlICh0bXB2YXIgIT0gRENfTUFSS0VSICYmIHZpZGVvLT5tYm51bSA8IG5Ub3RhbE1CKTsKLQotICAgIGlmICh0bXB2YXIgPT0gRENfTUFSS0VSKQotICAgIHsKLSAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgRENfTUFSS0VSX0xFTkdUSCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IHF1aWNrU2VhcmNoRENNKHN0cmVhbSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gUFZfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgLyogb25seSB3YXkgeW91IGNhbiBlbmQgdXAgYmVpbmcgaGVyZSBpcyBpbiB0aGUgbGFzdCBwYWNrZXQsYW5kIHRoZXJlIGlzIHN0dWZmaW5nIGF0Ci0gICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBmaXJzdCBwYXJ0aXRpb24gKi8KLSAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIERDX01BUktFUl9MRU5HVEgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLwotICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRGaXJzdFBhcnQpOwotICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7Ci0gICAgICAgICAgICAvKiBjb25jZWFsbWVudCB3aWxsIGJlIHRha2VuIGNhcmUgb2YgaW4gdGhlIHVwcGVyIGxheWVyICovCi0gICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGRlY29kZSB0aGUgc2Vjb25kIHBhcnRpdGlvbiAqLwotICAgIHN0YXJ0U2Vjb25kUGFydCA9IGdldFBvaW50ZXIoc3RyZWFtKTsKLQotICAgIG1iX2VuZCA9IHZpZGVvLT5tYm51bTsKLQotICAgIGZvciAobWJudW0gPSBtYl9zdGFydDsgbWJudW0gPCBtYl9lbmQ7IG1ibnVtKyspCi0gICAgewotICAgICAgICBNQnR5cGUgPSBNb2RlW21ibnVtXTsKLSAgICAgICAgLyogTm8gc2tpcHBlZCBtb2RlIGluIEktcGFja2V0cyAgMy8xLzIwMDEgICAgKi8KLSAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07Ci0KLSAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1cobWJudW0sIG5NQlBlclJvdyk7ICAgLyogIFRoaXMgaXMgbmVlZGVkIGlmIG5ibnVtIGlzIHJlYWQgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAqLwotICAgICAgICB2aWRlby0+bWJudW1fY29sID0gbWJudW0gLSB2aWRlby0+bWJudW1fcm93ICogbk1CUGVyUm93OwotICAgICAgICAvKiB0aGVyZSBpcyBhbHdheXMgYWNkY3ByZWQgaW4gRGF0YVBhcnQgbW9kZSAgMDQvMTAvMDEgKi8KLSAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gKHVpbnQ4KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLQotICAgICAgICBDQlBZID0gUFZfVmxjRGVjQ0JQWShzdHJlYW0sIE1CdHlwZSAmIElOVFJBX01BU0spOyAvKiBNT0RFX0lOVFJBIHx8IE1PREVfSU5UUkFfUSAqLwotICAgICAgICBpZiAoQ0JQWSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KLSAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0U2Vjb25kUGFydCk7IC8qICAqLwotICAgICAgICAgICAgLyogQ29uY2VhbCBwYWNrZXQsICAwNS8xNS8yMDAwICovCi0gICAgICAgICAgICBDb25jZWFsVGV4dHVyZV9JKHZpZGVvLCBzdGFydEZpcnN0UGFydCwgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7Ci0gICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gfD0gKHVpbnQ4KShDQlBZIDw8IDIpOwotICAgIH0KLQotICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOwotCi0gICAgZm9yIChtYm51bSA9IG1iX3N0YXJ0OyBtYm51bSA8IG1iX2VuZDsgbWJudW0rKykKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOwotCi0gICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKG1ibnVtICwgbk1CUGVyUm93KTsgIC8qICBUaGlzIGlzIG5lZWRlZCBpZiBuYm51bSBpcyByZWFkIGZyb20gdGhlIHBhY2tldCBoZWFkZXIgKi8KLSAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IG1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKLSAgICAgICAgLyogTm8gc2tpcHBlZCBtb2RlIGluIEktcGFja2V0cyAgMy8xLzIwMDEgICAgKi8KLSAgICAgICAgLyogZGVjb2RlIHRoZSBEQ1QgY29lZmljaWVudHMgZm9yIHRoZSBNQiAqLwotICAgICAgICBzdGF0dXMgPSBHZXRNQkRhdGFfRGF0YVBhcnQodmlkZW8pOwotICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KLSAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0U2Vjb25kUGFydCk7IC8qICAqLwotICAgICAgICAgICAgLyogQ29uY2VhbCBwYWNrZXQsICAwNS8xNS8yMDAwICovCi0gICAgICAgICAgICBDb25jZWFsVGV4dHVyZV9JKHZpZGVvLCBzdGFydEZpcnN0UGFydCwgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOyAgICAgICAgICAgLyogIDA0LzI3LzAxIHNob3VsZCBiZSBzZXQgYWZ0ZXIgZGVjb2RpbmcgZmlyc3QgTUIgKi8KLSAgICB9Ci0KLSAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmcoc3RyZWFtKTsKLSAgICBpZiAoIXZhbGlkX3N0dWZmaW5nKQotICAgIHsKLSAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydFNlY29uZFBhcnQpOwotICAgICAgICBDb25jZWFsVGV4dHVyZV9JKHZpZGVvLCBzdGFydEZpcnN0UGFydCwgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7Ci0gICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgIH0KLSAgICByZXR1cm4gUFZfU1VDQ0VTUzsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IERlY29kZURhdGFQYXJ0X1BfVmlkZW9QYWNrZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQvMjUvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBEZWNvZGUgRGF0YSBQYXJ0aXRpb25lZCBNb2RlIFZpZGVvIFBhY2tldCBpbiBQLVZPUCAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIFBWX0ZBSUwgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgIDA5LzE4LzIwMDAsICBmYXN0IFZsY0RlY29kZStEZXF1YW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAwNC8xMy8yMDAxLCAgZml4ZWQgTUJfc3R1ZmZpbmcsIG5ldyBBQ0RDIHByZWQgc3RydWN0dXJlLCAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgIDA4LzA3LzIwMDEsICByZW1vdmUgTUJ6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotUFZfU1RBVFVTIERlY29kZURhdGFQYXJ0X1BfVmlkZW9QYWNrZXQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IHNsaWNlX2NvdW50ZXIpCi17Ci0gICAgUFZfU1RBVFVTIHN0YXR1czsKLSAgICB1aW50OCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7Ci0gICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07Ci0gICAgaW50IG5Ub3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COwotICAgIGludCBtYm51bSwgbWJfc3RhcnQsIG1iX2VuZDsKLSAgICBpbnQxNiBRUCwgKlFQTUIgPSB2aWRlby0+UVBNQjsKLSAgICBpbnQgTUJ0eXBlLCBDQlBZOwotICAgIEJvb2wgdmFsaWRfc3R1ZmZpbmc7Ci0gICAgaW50IGludHJhX01COwotICAgIHVpbnQzMiB0bXB2YXI7Ci0gICAgdWludCBjb2RlOwotICAgIGludDMyICBzdGFydEZpcnN0UGFydCwgc3RhcnRTZWNvbmRQYXJ0OwotICAgIGludCBuTUJQZXJSb3cgPSB2aWRlby0+bk1CUGVyUm93OwotICAgIHVpbnQ4ICpwYnl0ZTsKLSAgICAvKiBkZWNvZGUgdGhlIGZpcnN0IHBhcnRpdGlvbiAqLwotICAgIHN0YXJ0Rmlyc3RQYXJ0ID0gZ2V0UG9pbnRlcihzdHJlYW0pOwotICAgIG1iX3N0YXJ0ID0gdmlkZW8tPm1ibnVtOwotICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOyAgICAgICAgICAgIC8qICAwNC8yNy8wMSAqLwotCi0gICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDEwLCAmY29kZSk7Ci0gICAgd2hpbGUgKGNvZGUgPT0gMSkKLSAgICB7Ci0gICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDEwKTsKLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDEwLCAmY29kZSk7Ci0gICAgfQotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIGRlY29kZSBDT0QsIE1DQlBDLCBBQ3ByZWRfZmxhZywgQ1BCWSBhbmQgRFFVQU5UICovCi0gICAgICAgIC8qIFdlIGhhdmUgdG8gZGlzY2FyZCBzdHVmZmVkIE1CIGhlYWRlciAqLwotCi0gICAgICAgIHN0YXR1cyA9IEdldE1CaGVhZGVyRGF0YVBhcnRfUCh2aWRlbyk7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCi0gICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydEZpcnN0UGFydCk7Ci0gICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKLSAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogd2UgbXVzdCB1cGRhdGUgc2xpY2VfY291bnRlciBiZWZvcmUgbW90aW9uIHZlY3RvciBkZWNvZGluZy4gICAqLwotICAgICAgICB2aWRlby0+c2xpY2VOb1t2aWRlby0+bWJudW1dID0gKHVpbnQ4KSBzbGljZV9jb3VudGVyOwotCi0gICAgICAgIGlmIChNb2RlW3ZpZGVvLT5tYm51bV0gJiBJTlRFUl9NQVNLKSAvKiBJTlRFUiB8fCBJTlRFUl9RIHx8IElOVEVSXzRWICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgbW90aW9uIHZlY3RvciAoaWYgdGhlcmUgYXJlIGFueSkgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IFBWX0dldE1CdmVjdG9ycyh2aWRlbywgTW9kZVt2aWRlby0+bWJudW1dKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCi0gICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0Rmlyc3RQYXJ0KTsKLSAgICAgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2aWRlby0+bWJudW0rKzsKLQotICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyh2aWRlby0+bWJudW0sIG5NQlBlclJvdyk7ICAgLyogIFRoaXMgaXMgbmVlZGVkIGlmIG1ibnVtIGlzIHJlYWQgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAqLwotICAgICAgICB2aWRlby0+bWJudW1fY29sID0gdmlkZW8tPm1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKLQotICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgMTAsICZjb2RlKTsKLSAgICAgICAgd2hpbGUgKGNvZGUgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgMTApOwotICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDEwLCAmY29kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogaGF2ZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvIHBhY2tldCBvciB2b3A/ICovCi0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzIoc3RyZWFtLCBNT1RJT05fTUFSS0VSX0NPTUJfTEVOR1RILCAmdG1wdmFyKTsKLSAgICAgICAgLyogICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFBWX0VORF9PRl9CVUZGRVIpIHJldHVybiBzdGF0dXM7ICAqLwotICAgIH0KLSAgICB3aGlsZSAodG1wdmFyICE9IE1PVElPTl9NQVJLRVJfQ09NQiAmJiB2aWRlby0+bWJudW0gPCBuVG90YWxNQik7Ci0KLSAgICBpZiAodG1wdmFyID09IE1PVElPTl9NQVJLRVJfQ09NQikKLSAgICB7Ci0gICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIE1PVElPTl9NQVJLRVJfQ09NQl9MRU5HVEgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzdGF0dXMgPSBxdWlja1NlYXJjaE1vdGlvbk1hcmtlcihzdHJlYW0pOwotICAgICAgICBpZiAoc3RhdHVzID09IFBWX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIG9ubHkgd2F5IHlvdSBjYW4gZW5kIHVwIGJlaW5nIGhlcmUgaXMgaW4gdGhlIGxhc3QgcGFja2V0LGFuZCB0aGVyZSBpcyBzdHVmZmluZyBhdAotICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgZmlyc3QgcGFydGl0aW9uICovCi0gICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBNT1RJT05fTUFSS0VSX0NPTUJfTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KLSAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0Rmlyc3RQYXJ0KTsKLSAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OwotICAgICAgICAgICAgLyogY29uY2VhbG1lbnQgd2lsbCBiZSB0YWtlbiBjYXJlIG9mIGluIHRoZSB1cHBlciBsYXllciAgKi8KLSAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZGVjb2RlIHRoZSBzZWNvbmQgcGFydGl0aW9uICovCi0gICAgc3RhcnRTZWNvbmRQYXJ0ID0gZ2V0UG9pbnRlcihzdHJlYW0pOwotICAgIFFQID0gdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplcjsKLQotICAgIG1iX2VuZCA9IHZpZGVvLT5tYm51bTsKLQotICAgIGZvciAobWJudW0gPSBtYl9zdGFydDsgbWJudW0gPCBtYl9lbmQ7IG1ibnVtKyspCi0gICAgewotICAgICAgICBNQnR5cGUgPSBNb2RlW21ibnVtXTsKLQotICAgICAgICBpZiAoTUJ0eXBlID09IE1PREVfU0tJUFBFRCkKLSAgICAgICAgewotICAgICAgICAgICAgUVBNQlttYm51bV0gPSBRUDsgLyogIDAzLzAxLzAxICovCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnRyYV9NQiA9IChNQnR5cGUgJiBJTlRSQV9NQVNLKTsgLyogKE1CdHlwZSA9PSBNT0RFX0lOVFJBIHx8IE1CdHlwZSA9PSBNT0RFX0lOVFJBX1EpICovCi0gICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOwotICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyhtYm51bSwgbk1CUGVyUm93KTsgICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbmJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCi0gICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7Ci0KLSAgICAgICAgLyogdGhlcmUgaXMgYWx3YXlzIGFjZGNwcmVkaWN0aW9uIGluIERhdGFQYXJ0IG1vZGUgICAgMDQvMTAvMDEgKi8KLSAgICAgICAgaWYgKGludHJhX01CKQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAodWludDgpIEJpdHN0cmVhbVJlYWQxQml0c19JTkxJTkUoc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIENCUFkgPSBQVl9WbGNEZWNDQlBZKHN0cmVhbSwgaW50cmFfTUIpOwotICAgICAgICBpZiAoQ0JQWSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KLSAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgICAgICAgICAgLyogQ29uY2VhbCBzZWNvbmQgcGFydGl0aW9uLCAgNS8xNS8yMDAwICovCi0gICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRTZWNvbmRQYXJ0KTsKLSAgICAgICAgICAgIENvbmNlYWxUZXh0dXJlX1AodmlkZW8sIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOwotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dIHw9ICh1aW50OCkoQ0JQWSA8PCAyKTsKLSAgICAgICAgaWYgKGludHJhX01CIHx8IE1CdHlwZSA9PSBNT0RFX0lOVEVSX1EpICAgICAgICAgICAgICAgICAgICAgLyogIDA0LzI2LzAxICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEdldE1CaGVhZGVyRGF0YVBhcnRfRFFVQU5UX0RDKHZpZGVvLCAmUVApOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOyAgICAgICAgLyogIDA0LzI3LzAxICovCi0gICAgICAgIFFQTUJbbWJudW1dID0gUVA7Ci0gICAgfQotCi0gICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7ICAvKiAgMDQvMjcvMDEgKi8KLQotICAgIGZvciAobWJudW0gPSBtYl9zdGFydDsgbWJudW0gPCBtYl9lbmQ7IG1ibnVtKyspCi0gICAgewotICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKLSAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1cobWJudW0sIG5NQlBlclJvdyk7ICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbmJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCi0gICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7Ci0KLQotICAgICAgICBpZiAoTW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkZWNvZGUgdGhlIERDVCBjb2VmaWNpZW50cyBmb3IgdGhlIE1CICovCi0gICAgICAgICAgICBzdGF0dXMgPSBHZXRNQkRhdGFfRGF0YVBhcnQodmlkZW8pOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KLSAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLQotICAgICAgICAgICAgICAgIC8qIENvbmNlYWwgc2Vjb25kIHBhcnRpdGlvbiwgIDUvMTUvMjAwMCAqLwotICAgICAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydFNlY29uZFBhcnQpOwotICAgICAgICAgICAgICAgIENvbmNlYWxUZXh0dXJlX1AodmlkZW8sIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMTsgIC8qICAwNC8yNy8wMSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgIC8vIFNLSVBQRUQKLQotICAgICAgICAgICAgLyogTW90aW9uIGNvbXBlbnNhdGlvbiBhbmQgcHV0IGl0IHRvIHZpZGVvLT5tYmxvY2stPnByZWRfYmxvY2sgKi8KLSAgICAgICAgICAgIFNraXBwZWRNQk1vdGlvbkNvbXAodmlkZW8pOwotCi0gICAgICAgICAgICAvL29zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19yb3cgKyB2aWRlby0+bWJudW1fY29sLCAwLCBzaXplb2YodHlwZURDQUNTdG9yZSkpOyAvKiAgU0tJUFBFRF9BQ0RDICovCi0gICAgICAgICAgICAvL29zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19jb2wsIDAsIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7Ci0gICAgICAgICAgICAvKiAgMDgvMDgvMjAwNSAqLwotICAgICAgICAgICAgcGJ5dGUgPSAodWludDgqKSh2aWRlby0+cHJlZERDQUNfcm93ICsgdmlkZW8tPm1ibnVtX2NvbCk7Ci0gICAgICAgICAgICBaRVJPX09VVF82NEJZVEVTKHBieXRlKTsKLSAgICAgICAgICAgIHBieXRlID0gKHVpbnQ4KikodmlkZW8tPnByZWREQ0FDX2NvbCk7Ci0gICAgICAgICAgICBaRVJPX09VVF82NEJZVEVTKHBieXRlKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdmFsaWRfc3R1ZmZpbmcgPSB2YWxpZFN0dWZmaW5nKHN0cmVhbSk7ICAgLyogICovCi0gICAgaWYgKCF2YWxpZF9zdHVmZmluZykKLSAgICB7Ci0gICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRTZWNvbmRQYXJ0KTsgLyogICovCi0gICAgICAgIENvbmNlYWxUZXh0dXJlX1AodmlkZW8sIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOwotCi0gICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgIH0KLSAgICByZXR1cm4gUFZfU1VDQ0VTUzsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IEdldE1CaGVhZGVyRGF0YVBhcnRfRFFVQU5UX0RDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQvMjYvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBEZWNvZGUgRFFVQU5UIGFuZCBEQyBpbiBEYXRhIFBhcnRpdGlvbmVkIE1vZGUgZm9yIGJvdGggICAgICAgKi8KLS8qICAgICAgICAgICAgIEktVk9QIGFuZCBQLVZPUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgUFZfRkFJTCBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6IDAyLzEzLzIwMDEgbmV3IEFDREMgcHJlZGljdGlvbiBzdHJ1Y3R1cmUsICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLVBWX1NUQVRVUyBHZXRNQmhlYWRlckRhdGFQYXJ0X0RRVUFOVF9EQyhWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQxNiAqUVApCi17Ci0gICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7Ci0gICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07Ci0gICAgaW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOwotICAgIGludCBpbnRyYV9kY192bGNfdGhyID0gdmlkZW8tPmN1cnJWb3AtPmludHJhRENWbGNUaHI7Ci0gICAgdWludDggKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOwotICAgIGludCAgTUJ0eXBlID0gTW9kZVttYm51bV07Ci0gICAgdHlwZURDU3RvcmUgKkRDID0gdmlkZW8tPnByZWREQyArIG1ibnVtOwotICAgIGludCAgY29tcDsKLSAgICBCb29sIHN3aXRjaGVkOwotICAgIHVpbnQgIERRVUFOVDsKLSAgICBpbnQxNiBRUF90bXA7Ci0KLSAgICBjb25zdCBzdGF0aWMgaW50ICBEUV90YWJbNF0gPSB7IC0xLCAtMiwgMSwgMn07Ci0KLSAgICBpZiAoTUJ0eXBlICYgUV9NQVNLKSAgICAgICAgICAgICAvKiBJTlRSQV9RIHx8IElOVEVSX1EgKi8KLSAgICB7Ci0gICAgICAgIERRVUFOVCA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKLSAgICAgICAgKlFQICs9IERRX3RhYltEUVVBTlRdOwotCi0gICAgICAgIGlmICgqUVAgPCAxKSAqUVAgPSAxOwotICAgICAgICBlbHNlIGlmICgqUVAgPiAzMSkgKlFQID0gMzE7Ci0gICAgfQotICAgIGlmIChNQnR5cGUgJiBJTlRSQV9NQVNLKSAgLyogSU5UUkEgfHwgSU5UUkFfUSAqLyAvKiBubyBzd2l0Y2gsIGNvZGUgREMgc2VwYXJhdGVseSAqLwotICAgIHsKLSAgICAgICAgUVBfdG1wID0gKlFQOyAgICAgICAgICAgICAgICAgICAgICAvKiBydW5uaW5nIFFQICAwNC8yNi8wMSovCi0gICAgICAgIHN3aXRjaGVkID0gMDsKLSAgICAgICAgaWYgKGludHJhX2RjX3ZsY190aHIpICAgICAgICAgICAgICAgICAvKiAgMDQvMjcvMDEgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZpZGVvLT51c2VQcmV2UVApCi0gICAgICAgICAgICAgICAgUVBfdG1wID0gdmlkZW8tPlFQTUJbbWJudW0tMV07Ci0gICAgICAgICAgICBzd2l0Y2hlZCA9IChpbnRyYV9kY192bGNfdGhyID09IDcgfHwgUVBfdG1wID49IGludHJhX2RjX3ZsY190aHIgKiAyICsgMTEpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3dpdGNoZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRGVjb2RlUHJlZGljdGVkSW50cmFEQyhjb21wLCBzdHJlYW0sICgqREMgKyBjb21wKSk7ICAgLyogIDAzLzAxLzAxICovCi0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpEQylbY29tcF0gPSAwOyAgIC8qICAwNC8yNi8wMSBuZWVkZWQgZm9yIHN3aXRjaGVkIGNhc2UqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCi0qICAgICAgIDA0LzI1LzIwMDAgOiBJbml0aWFsIG1vZGlmaWNhdGlvbiB0byB0aGUgbmV3IFBWIExpYiBmb3JtYXQuCi0qICAgICAgIDA0LzE3LzIwMDEgOiBuZXcgQUNEQyBwcmVkIHN0cnVjdHVyZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50RW5kKioqKioqKiovCi1QVl9TVEFUVVMgR2V0TUJoZWFkZXJEYXRhUGFydF9QKFZpZGVvRGVjRGF0YSAqdmlkZW8pCi17Ci0gICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07Ci0gICAgaW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOwotICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKLSAgICB0eXBlRENTdG9yZSAqREMgPSB2aWRlby0+cHJlZERDICsgbWJudW07Ci0gICAgdWludCBub19kY3RfZmxhZzsKLSAgICBpbnQgY29tcDsKLSAgICBpbnQgTUNCUEM7Ci0KLSAgICBub19kY3RfZmxhZyA9IEJpdHN0cmVhbVJlYWQxQml0c19JTkxJTkUoc3RyZWFtKTsKLQotICAgIGlmIChub19kY3RfZmxhZykKLSAgICB7Ci0gICAgICAgIC8qIHNraXBwZWQgbWFjcm9ibG9jayAqLwotICAgICAgICBNb2RlW21ibnVtXSA9IE1PREVfU0tJUFBFRDsKLQotICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKkRDKVtjb21wXSA9IG1pZF9ncmF5OwotICAgICAgICAgICAgLyogIEFDREMgUkVNT1ZFIEFDIGNvZWZzIGFyZSBzZXQgaW4gRGVjb2RlRGF0YVBhcnRfUCAqLwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGNvZGVkIG1hY3JvYmxvY2sgKi8KLSAgICAgICAgTUNCUEMgPSBQVl9WbGNEZWNNQ0JQQ19jb21faW50ZXIoc3RyZWFtKTsKLQotICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKE1DQlBDKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICBNb2RlW21ibnVtXSA9ICh1aW50OClNQnR5cGVfbW9kZVtNQ0JQQyAmIDddOwotICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dID0gKHVpbnQ4KSgoTUNCUEMgPj4gNCkgJiAzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gUFZfU1VDQ0VTUzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKLSogICAgICAgMDQvMTcvMDEgIG5ldyBBQ0RDIHByZWQgc3RydWN0dXJlLCByZW9yZ2FuaXplZCBjb2RlLCBjbGVhbnVwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRFbmQqKioqKioqKi8KLVBWX1NUQVRVUyBHZXRNQkRhdGFfRGF0YVBhcnQoVmlkZW9EZWNEYXRhICp2aWRlbykKLXsKLSAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJudW07Ci0gICAgaW50MTYgKmRhdGFCbG9jazsKLSAgICBNYWNyb0Jsb2NrICptYmxvY2sgPSB2aWRlby0+bWJsb2NrOwotICAgIGludCBRUCA9IHZpZGVvLT5RUE1CW21ibnVtXTsKLSAgICBpbnQzMiBvZmZzZXQ7Ci0gICAgUElYRUwgKmNfY29tcDsKLSAgICBpbnQgd2lkdGggPSB2aWRlby0+d2lkdGg7Ci0gICAgaW50IGludHJhX2RjX3ZsY190aHIgPSB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RocjsKLSAgICB1aW50IENCUCA9IHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV07Ci0gICAgdWludDggbW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOwotICAgIGludCB4X3BvcyA9IHZpZGVvLT5tYm51bV9jb2w7Ci0gICAgdHlwZURDU3RvcmUgKkRDID0gdmlkZW8tPnByZWREQyArIG1ibnVtOwotICAgIGludCAgbmNvZWZmc1s2XSwgKm5vX2NvZWZmID0gbWJsb2NrLT5ub19jb2VmZjsKLSAgICBpbnQgIGNvbXA7Ci0gICAgQm9vbCAgc3dpdGNoZWQ7Ci0gICAgaW50IFFQX3RtcCA9IFFQOwotCi0gICAgaW50IHlfcG9zID0gdmlkZW8tPm1ibnVtX3JvdzsKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIHVpbnQ4ICpwcF9tb2RbNl07Ci0gICAgaW50IFRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7Ci0gICAgaW50IE1CX2luX3dpZHRoID0gdmlkZW8tPm5NQlBlclJvdzsKLSNlbmRpZgotCi0KLQotICAgIC8qKioqKgotICAgICogICAgIERlY29kaW5nIG9mIHRoZSA2IGJsb2NrcyAoZGVwZW5kaW5nIG9uIHRyYW5zcGFyZW50IHBhdHRlcm4pCi0gICAgKioqKiovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICB7Ci0gICAgICAgIC8qKiBwb3N0LXByb2Nlc3NpbmcgKioqLwotICAgICAgICBwcF9tb2RbMF0gPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHlfcG9zIDw8IDEpICogKE1CX2luX3dpZHRoIDw8IDEpICsgKHhfcG9zIDw8IDEpOwotICAgICAgICBwcF9tb2RbMV0gPSBwcF9tb2RbMF0gKyAxOwotICAgICAgICBwcF9tb2RbMl0gPSBwcF9tb2RbMF0gKyAoTUJfaW5fd2lkdGggPDwgMSk7Ci0gICAgICAgIHBwX21vZFszXSA9IHBwX21vZFsyXSArIDE7Ci0gICAgICAgIHBwX21vZFs0XSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyAoVG90YWxNQiA8PCAyKSArIG1ibnVtOwotICAgICAgICBwcF9tb2RbNV0gPSBwcF9tb2RbNF0gKyBUb3RhbE1COwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogIG9zY2xfbWVtc2V0KG1ibG9jay0+YmxvY2ssIDAsIHNpemVvZih0eXBlTUJTdG9yZSkpOyAgICBBdWcgOSwyMDA1ICovCi0KLSAgICBpZiAobW9kZSAmIElOVFJBX01BU0spIC8qIE1PREVfSU5UUkEgfHwgbW9kZSA9PSBNT0RFX0lOVFJBX1EgKi8KLSAgICB7Ci0gICAgICAgIHN3aXRjaGVkID0gMDsKLSAgICAgICAgaWYgKGludHJhX2RjX3ZsY190aHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+dXNlUHJldlFQKQotICAgICAgICAgICAgICAgIFFQX3RtcCA9IHZpZGVvLT5RUE1CW21ibnVtLTFdOyAgIC8qIHJ1bm5pbmcgUVAgIDA0LzI2LzAxICovCi0KLSAgICAgICAgICAgIHN3aXRjaGVkID0gKGludHJhX2RjX3ZsY190aHIgPT0gNyB8fCBRUF90bXAgPj0gaW50cmFfZGNfdmxjX3RociAqIDIgKyAxMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYmxvY2stPkRDU2NhbGFyTHVtID0gY2FsX2RjX3NjYWxlcihRUCwgTFVNSU5BTkNFX0RDX1RZUEUpOyAgICAgLyogICBBQ0RDIDAzLzAxLzAxICovCi0gICAgICAgIG1ibG9jay0+RENTY2FsYXJDaHIgPSBjYWxfZGNfc2NhbGVyKFFQLCBDSFJPTUlOQU5DRV9EQ19UWVBFKTsKLQotICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhQmxvY2sgPSBtYmxvY2stPmJsb2NrW2NvbXBdOyAgICAvKiwgMTAvMjAvMjAwMCAqLwotCi0gICAgICAgICAgICBkYXRhQmxvY2tbMF0gPSAoKkRDKVtjb21wXTsKLQotICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IFZsY0RlcXVhbnRIMjYzSW50cmFCbG9jayh2aWRlbywgY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hlZCwgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7Ci0KLSAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1tjb21wXSkpICAgICAgICAgLyogICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN3aXRjaGVkKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoKGRhdGFCbG9jayArIDEpLCAwLCBzaXplb2YoaW50MTYpKjYzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub19jb2VmZltjb21wXSA9IG5jb2VmZnNbY29tcF07Ci0gICAgICAgICAgICAvKiAgbW9kaWZpZWQgdG8gbmV3IHNlbWFwaG9yZSBmb3IgcG9zdC1wcm9jICovCi0gICAgICAgICAgICAvLyBGdXR1cmUgd29yazo6IGNhbiBiZSBjb21iaW5lZCBpbiB0aGUgZGVxdWFudCBmdW5jdGlvbgotICAgICAgICAgICAgLy8gQHRvZG8gRGVibG9ja2luZyBTZW1hcGhvcmUgZm9yIElOVFJBIGJsb2NrCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAodWludDgpIFBvc3RQcm9jU2VtYXBob3JlKGRhdGFCbG9jayk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBNQmxvY2tJRENUKHZpZGVvKTsKLSAgICB9Ci0gICAgZWxzZSAvKiBNT0RFIElOVEVSKi8KLSAgICB7Ci0KLQotCi0KLSAgICAgICAgTUJNb3Rpb25Db21wKHZpZGVvLCBDQlApOwotICAgICAgICBvZmZzZXQgPSAoaW50MzIpKHlfcG9zIDw8IDQpICogd2lkdGggKyAoeF9wb3MgPDwgNCk7Ci0gICAgICAgIGNfY29tcCAgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBvZmZzZXQ7Ci0KLQotICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNDsgY29tcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKkRDKVtjb21wXSA9IG1pZF9ncmF5OwotCi0gICAgICAgICAgICBpZiAoQ0JQICYgKDEgPDwgKDUgLSBjb21wKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7Ci0gICAgICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzW2NvbXBdKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0KLQotICAgICAgICAgICAgICAgIEJsb2NrSURDVChjX2NvbXAgKyAoY29tcCYyKSood2lkdGggPDwgMikgKyA4Kihjb21wJjEpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAoY29tcCYyKSo2NCArIDgqKGNvbXAmMSksIG1ibG9jay0+YmxvY2tbY29tcF0sIHdpZHRoLCBuY29lZmZzW2NvbXBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qICBAdG9kbyBEZWJsb2NraW5nIFNlbWFwaG9yZSBmb3IgSU5UUkEgYmxvY2ssIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAodWludDgpKChuY29lZmZzW2NvbXBdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgICgqREMpWzRdID0gbWlkX2dyYXk7Ci0gICAgICAgIGlmIChDQlAgJiAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBuY29lZmZzWzRdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgJm1ibG9jay0+Yml0bWFwcm93WzRdKTsKLSAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1s0XSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNTYsIG1ibG9jay0+YmxvY2tbNF0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNF0sIG1ibG9jay0+Yml0bWFwcm93WzRdKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbmNvZWZmc1s0XSA9IDA7Ci0gICAgICAgIH0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICpwcF9tb2RbNF0gPSAodWludDgpKChuY29lZmZzWzRdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgKCpEQylbNV0gPSBtaWRfZ3JheTsKLSAgICAgICAgaWYgKENCUCAmIDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5jb2VmZnNbNV0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCAmbWJsb2NrLT5iaXRtYXByb3dbNV0pOwotICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzWzVdKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI2NCwgbWJsb2NrLT5ibG9ja1s1XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s1XSwKLSAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs1XSwgbWJsb2NrLT5iaXRtYXByb3dbNV0pOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBuY29lZmZzWzVdID0gMDsKLSAgICAgICAgfQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgotCi0KLQotCi0gICAgICAgIC8qIE1vdGlvbiBjb21wZW5zYXRpb24gYW5kIHB1dCBpdCB0byB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrICovCi0gICAgfQotICAgIHJldHVybiBQVl9TVUNDRVNTOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfY2hyb21hLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3NzliMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfY2hyb21hLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0KLXZvaWQgRGVyaW5naW5nX0Nocm9tYSgKLSAgICB1aW50OCAqUmVjX0MsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCwKLSAgICB1aW50OCAqcHBfbW9kCi0pCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCB0aHJlczsKLSAgICBpbnQgdl9ibGssIGhfYmxrOwotICAgIGludCBtYXhfZGlmZjsKLSAgICBpbnQgdl9wZWwsIGhfcGVsOwotICAgIGludCBtYXhfYmxrLCBtaW5fYmxrOwotICAgIGludCB2MCwgaDA7Ci0gICAgdWludDggKnB0cjsKLSAgICBpbnQgc3VtLCBzdW0xLCBpbmNyOwotICAgIGludDMyIGFkZHJfdjsKLSAgICBpbnQgc2lnbl92WzEwXSwgc3VtX3ZbMTBdOwotICAgIGludCAqcHRyMiwgKnB0cjM7Ci0gICAgdWludDggcGVsdSwgcGVsYywgcGVsbDsKLSAgICBpbmNyID0gd2lkdGggLSBCTEtTSVpFOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBjaHJvbWluYW5jZSAqLwotICAgIC8qIERvIHRoZSBmaXJzdCBsaW5lICg3IHBpeGVscyBhdCBhIHRpbWUgPT4gRG9uJ3QgdXNlIE1NWCkqLwotICAgIGZvciAoaF9ibGsgPSAwOyBoX2JsayA8IHdpZHRoOyBoX2JsayArPSBCTEtTSVpFKQotICAgIHsKLSAgICAgICAgbWF4X2RpZmYgPSAoUVBfc3RvcmVbaF9ibGs+PjNdID4+IDIpICsgNDsKLSAgICAgICAgcHRyID0gJlJlY19DW2hfYmxrXTsKLSAgICAgICAgbWF4X2JsayA9IG1pbl9ibGsgPSAqcHRyOwotICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCB3aWR0aCk7Ci0gICAgICAgIGgwID0gKChoX2JsayAtIDEpID49IDEpID8gKGhfYmxrIC0gMSkgOiAxOwotCi0gICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLQotICAgICAgICAgICAgZm9yICh2X3BlbCA9IDE7IHZfcGVsIDwgQkxLU0laRSAtIDE7IHZfcGVsKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkcl92ID0gKGludDMyKXZfcGVsICogd2lkdGg7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DW2FkZHJfdiArIGgwIC0gMV07Ci0gICAgICAgICAgICAgICAgcHRyMiA9ICZzdW1fdlswXTsKLSAgICAgICAgICAgICAgICBwdHIzID0gJnNpZ25fdlswXTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaF9wZWwgPSBoMDsgaF9wZWwgPCBoX2JsayArIEJMS1NJWkUgLSAxOyBoX3BlbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVsdSA9ICoocHRyIC0gd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICpwdHIyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgICAgICAgICAgICAgKnB0cjMgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3VtMSA9ICoocHRyMyAtIDIpICsgKihwdHIzIC0gMSkgKyAqcHRyMzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICgqKHB0cjIgLSAyKSArICgqKHB0cjIgLSAxKSA8PCAxKSArICpwdHIyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHRyLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUFZfQUJTKCpwdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSA+ICpwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgLSBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9ICh1aW50OCkgc3VtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICAgICBwdHIyKys7Ci0gICAgICAgICAgICAgICAgICAgIHB0cjMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHZfYmxrID0gQkxLU0laRTsgdl9ibGsgPCBoZWlnaHQ7IHZfYmxrICs9IEJMS1NJWkUpCi0gICAgewotICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgLyogRG8gdGhlIGZpcnN0IGJsb2NrIChwaXhlbHM9NyA9PiBObyBNTVgpICovCi0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMil2X2Jsayp3aWR0aCk+PjMpKT4+M10gPj4gMikgKyA0OwotICAgICAgICBwdHIgPSAmUmVjX0NbKGludDMyKXZfYmxrICogd2lkdGhdOwotICAgICAgICBtYXhfYmxrID0gbWluX2JsayA9ICpwdHI7Ci0gICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGZvciAodl9wZWwgPSB2MDsgdl9wZWwgPCB2X2JsayArIEJMS1NJWkUgLSAxOyB2X3BlbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZHJfdiA9IHZfcGVsICogd2lkdGg7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DW2FkZHJfdl07Ci0gICAgICAgICAgICAgICAgcHRyMiA9ICZzdW1fdlswXTsKLSAgICAgICAgICAgICAgICBwdHIzID0gJnNpZ25fdlswXTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaF9wZWwgPSAxOyBoX3BlbCA8IEJMS1NJWkUgLSAxOyBoX3BlbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVsdSA9ICoocHRyIC0gd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICpwdHIyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgICAgICAgICAgICAgKnB0cjMgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3VtMSA9ICoocHRyMyAtIDIpICsgKihwdHIzIC0gMSkgKyAqcHRyMzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICgqKHB0cjIgLSAyKSArICgqKHB0cjIgLSAxKSA8PCAxKSArICpwdHIyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHRyLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUFZfQUJTKCpwdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSA+ICpwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgLSBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9ICh1aW50OCkgc3VtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICAgICBwdHIyKys7Ci0gICAgICAgICAgICAgICAgICAgIHB0cjMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIERvIHRoZSByZXN0IGluIE1NWCAqLwotICAgICAgICBmb3IgKGhfYmxrID0gQkxLU0laRTsgaF9ibGsgPCB3aWR0aDsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChwcF9tb2RbKHZfYmxrLzgpKih3aWR0aC84KStoX2Jsay84XSYweDQpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4X2RpZmYgPSAoUVBfc3RvcmVbKCgoKGludDMyKXZfYmxrKndpZHRoKT4+MykraF9ibGspPj4zXSA+PiAyKSArIDQ7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DWyhpbnQzMil2X2JsayAqIHdpZHRoICsgaF9ibGtdOwotICAgICAgICAgICAgICAgIG1heF9ibGsgPSBtaW5fYmxrID0gKnB0cjsKLSAgICAgICAgICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLSAgICAgICAgICAgICAgICBoMCA9IGhfYmxrIC0gMTsKLQotICAgICAgICAgICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotI2lmZGVmIE5vTU1YCi0gICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKFJlY19DLCB2MCwgaDAsIHZfYmxrLCBoX2JsaywgdGhyZXMsIHdpZHRoLCBtYXhfZGlmZik7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWCgmUmVjX0NbKGludDMyKXYwKndpZHRoK2gwXSwgd2lkdGgsIHRocmVzLCBtYXhfZGlmZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlcmluZ2luZ19sdW1hLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlcmluZ2luZ19sdW1hLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NzRiNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfbHVtYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi12b2lkIERlcmluZ2luZ19MdW1hKAotICAgIHVpbnQ4ICpSZWNfWSwKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50LAotICAgIHVpbnQ4ICpwcF9tb2QpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCB0aHJlc1s0XSwgcmFuZ2VbNF0sIG1heF9yYW5nZV9ibGssIG1heF90aHJlc19ibGs7Ci0gICAgaW50IE1CX1YsIE1CX0gsIEJMS19WLCBCTEtfSDsKLSAgICBpbnQgdl9ibGssIGhfYmxrOwotICAgIGludCBtYXhfZGlmZjsKLSAgICBpbnQgbWF4X2JsaywgbWluX2JsazsKLSAgICBpbnQgdjAsIGgwOwotICAgIHVpbnQ4ICpwdHI7Ci0gICAgaW50IHRociwgYmxrcywgaW5jcjsKLSAgICBpbnQgbWJfaW5keCwgYmxrX2luZHg7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGluY3IgPSB3aWR0aCAtIEJMS1NJWkU7Ci0KLSAgICAvKiBEZXJpbmcgdGhlIGZpcnN0IGxpbmUgb2YgbWFjcm8gYmxvY2tzICovCi0gICAgZm9yIChNQl9IID0gMDsgTUJfSCA8IHdpZHRoOyBNQl9IICs9IE1CU0laRSkKLSAgICB7Ci0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWyhNQl9IKT4+NF0gPj4gMikgKyA0OwotCi0gICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgYmxrcyA9IDA7Ci0KLSAgICAgICAgZm9yIChCTEtfViA9IDA7IEJMS19WIDwgTUJTSVpFOyBCTEtfViArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEJMS19IID0gMDsgQkxLX0ggPCBNQlNJWkU7IEJMS19IICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19ZWyhpbnQzMikoQkxLX1YpICogd2lkdGggKyBNQl9IICsgQkxLX0hdOwotICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgIHJhbmdlW2Jsa3NdID0gbWF4X2JsayAtIG1pbl9ibGs7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc10gPj0gbWF4X3JhbmdlX2JsaykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1heF9yYW5nZV9ibGsgPSByYW5nZVtibGtzXTsKLSAgICAgICAgICAgICAgICAgICAgbWF4X3RocmVzX2JsayA9IHRocmVzW2Jsa3NdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBibGtzID0gMDsKLSAgICAgICAgZm9yICh2X2JsayA9IDA7IHZfYmxrIDwgTUJTSVpFOyB2X2JsayArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICB2MCA9ICgodl9ibGsgLSAxKSA+PSAxKSA/ICh2X2JsayAtIDEpIDogMTsKLSAgICAgICAgICAgIGZvciAoaF9ibGsgPSBNQl9IOyBoX2JsayA8IE1CX0ggKyBNQlNJWkU7IGhfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaDAgPSAoKGhfYmxrIC0gMSkgPj0gMSkgPyAoaF9ibGsgLSAxKSA6IDE7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZmxhdCByZWdpb24gYWRqYWNlbnQgdG8gbm9uLWZsYXQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdPDMyICYmIG1heF9yYW5nZV9ibGsgPj0gNjQpCi0gICAgICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gbWF4X3RocmVzX2JsazsKLQotICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgKGJsb2NraW5lc3MgYW5ub3lpbmcgYXQgREMgZG9taW5hbnQgcmVnaW9uKSAqLwotICAgICAgICAgICAgICAgIGlmIChtYXhfcmFuZ2VfYmxrID49IDE2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc21vb3RoaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHRociA9IHRocmVzW2Jsa3NdOwotCi0gICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKFJlY19ZLCB2MCwgaDAsIHZfYmxrLCBoX2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyLCB3aWR0aCwgbWF4X2RpZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9IC8qIGJsb2NrIGxldmVsIChMdW1pbmFuY2UpICovCi0gICAgICAgIH0KLSAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLQotCi0gICAgLyogRG8gdGhlIHJlc3Qgb2YgdGhlIG1hY3JvLWJsb2NrLWxpbmVzICovCi0gICAgZm9yIChNQl9WID0gTUJTSVpFOyBNQl9WIDwgaGVpZ2h0OyBNQl9WICs9IE1CU0laRSkKLSAgICB7Ci0gICAgICAgIC8qIEZpcnN0IG1hY3JvLWJsb2NrICovCi0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMilNQl9WKndpZHRoKT4+NCkpPj40XSA+PiAyKSArIDQ7Ci0gICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgYmxrcyA9IDA7Ci0gICAgICAgIGZvciAoQkxLX1YgPSAwOyBCTEtfViA8IE1CU0laRTsgQkxLX1YgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChCTEtfSCA9IDA7IEJMS19IIDwgTUJTSVpFOyBCTEtfSCArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfWVsoaW50MzIpKE1CX1YgKyBCTEtfVikgKiB3aWR0aCArIEJMS19IXTsKLSAgICAgICAgICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLSAgICAgICAgICAgICAgICB0aHJlc1tibGtzXSA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0gICAgICAgICAgICAgICAgcmFuZ2VbYmxrc10gPSBtYXhfYmxrIC0gbWluX2JsazsKLQotICAgICAgICAgICAgICAgIGlmIChyYW5nZVtibGtzXSA+PSBtYXhfcmFuZ2VfYmxrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4X3JhbmdlX2JsayA9IHJhbmdlW2Jsa3NdOwotICAgICAgICAgICAgICAgICAgICBtYXhfdGhyZXNfYmxrID0gdGhyZXNbYmxrc107Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJsa3MgPSAwOwotICAgICAgICBmb3IgKHZfYmxrID0gTUJfVjsgdl9ibGsgPCBNQl9WICsgTUJTSVpFOyB2X2JsayArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgICAgIGZvciAoaF9ibGsgPSAwOyBoX2JsayA8IE1CU0laRTsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoMCA9ICgoaF9ibGsgLSAxKSA+PSAxKSA/IChoX2JsayAtIDEpIDogMTsKLQotICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBmbGF0IHJlZ2lvbiBhZGphY2VudCB0byBub24tZmxhdCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc108MzIgJiYgbWF4X3JhbmdlX2JsayA+PSA2NCkKLSAgICAgICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSBtYXhfdGhyZXNfYmxrOwotCi0gICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAoYmxvY2tpbmVzcyBhbm5veWluZyBhdCBEQyBkb21pbmFudCByZWdpb24pICovCi0gICAgICAgICAgICAgICAgaWYgKG1heF9yYW5nZV9ibGsgPj0gMTYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdGl2ZSBzbW9vdGhpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgdGhyID0gdGhyZXNbYmxrc107Ci0KLSAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgoUmVjX1ksIHYwLCBoMCwgdl9ibGssIGhfYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHIsIHdpZHRoLCBtYXhfZGlmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKiBibG9jayBsZXZlbCAoTHVtaW5hbmNlKSAqLwotCi0gICAgICAgIC8qIFJlc3Qgb2YgdGhlIG1hY3JvLWJsb2NrcyAqLwotICAgICAgICBmb3IgKE1CX0ggPSBNQlNJWkU7IE1CX0ggPCB3aWR0aDsgTUJfSCArPSBNQlNJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMilNQl9WKndpZHRoKT4+NCkrTUJfSCk+PjRdID4+IDIpICsgNDsKLQotICAgICAgICAgICAgLyogdGhyZXNob2xkIGRldGVybWluYXRpb24gKi8KLSAgICAgICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgICAgIGJsa3MgPSAwOwotCi0gICAgICAgICAgICBtYl9pbmR4ID0gKE1CX1YgLyA4KSAqICh3aWR0aCAvIDgpICsgTUJfSCAvIDg7Ci0gICAgICAgICAgICBmb3IgKEJMS19WID0gMDsgQkxLX1YgPCBNQlNJWkU7IEJMS19WICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChCTEtfSCA9IDA7IEJMS19IIDwgTUJTSVpFOyBCTEtfSCArPSBCTEtTSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmxrX2luZHggPSBtYl9pbmR4ICsgKEJMS19WIC8gOCkgKiB3aWR0aCAvIDggKyBCTEtfSCAvIDg7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBiYXNlZCBvbiBwcF9tb2Qgb25seSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBwX21vZFtibGtfaW5keF0mMHg0KSAhPSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAmUmVjX1lbKGludDMyKShNQl9WICsgQkxLX1YpICogd2lkdGggKyBNQl9IICsgQkxLX0hdOwotICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJlc1tibGtzXSA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZVtibGtzXSA9IG1heF9ibGsgLSBtaW5fYmxrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc10gPj0gbWF4X3JhbmdlX2JsaykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcmFuZ2VfYmxrID0gcmFuZ2VbYmxrc107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RocmVzX2JsayA9IHRocmVzW2Jsa3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJsa3MgPSAwOwotICAgICAgICAgICAgZm9yICh2X2JsayA9IE1CX1Y7IHZfYmxrIDwgTUJfViArIE1CU0laRTsgdl9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgICAgICAgICBtYl9pbmR4ID0gKHZfYmxrIC8gOCkgKiAod2lkdGggLyA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGhfYmxrID0gTUJfSDsgaF9ibGsgPCBNQl9IICsgTUJTSVpFOyBoX2JsayArPSBCTEtTSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaDAgPSBoX2JsayAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGJsa19pbmR4ID0gbWJfaW5keCArIGhfYmxrIC8gODsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcF9tb2RbYmxrX2luZHhdJjB4NCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGZsYXQgcmVnaW9uIGFkamFjZW50IHRvIG5vbi1mbGF0IHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdPDMyICYmIG1heF9yYW5nZV9ibGsgPj0gNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSBtYXhfdGhyZXNfYmxrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZGVibG9ja2luZwotICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NraW5lc3MgYW5ub3lpbmcgYXQgREMgZG9taW5hbnQgcmVnaW9uKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heF9yYW5nZV9ibGsgPj0gMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc21vb3RoaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyID0gdGhyZXNbYmxrc107Ci0jaWZkZWYgTm9NTVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGl2ZVNtb290aF9Ob01NWChSZWNfWSwgdjAsIGgwLCB2X2JsaywgaF9ibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyLCB3aWR0aCwgbWF4X2RpZmYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWCgmUmVjX1lbdjAqd2lkdGgraDBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCB0aHIsIG1heF9kaWZmKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8qIGJsb2NrIGxldmVsIChMdW1pbmFuY2UpICovCi0gICAgICAgIH0gLyogbWFjcm9ibG9jayBsZXZlbCAqLwotICAgIH0gLyogbWFjcm9ibG9jayBsZXZlbCAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZmluZF9taW5fbWF4LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzg4YTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZmluZF9taW5fbWF4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBpbnB1dF9wdHIgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB2YWx1ZXMgb2YgdHlwZSBVQ2hhcgotICAgICAgICAgICAgaW4gYSAyRCBibG9jayBvZiBkYXRhLgotICAgIG1pbl9wdHIgPSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHR5cGUgSW50IHRvIGJlIGZvdW5kIGluIGEKLSAgICAgICAgICBzcXVhcmUgYmxvY2sgb2Ygc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotICAgIG1heF9wdHIgPSBwb2ludGVyIHRvIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHR5cGUgSW50IHRvIGJlIGZvdW5kIGluIGEKLSAgICAgICAgICBzcXVhcmUgYmxvY2sgb2Ygc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotICAgIGluY3IgPSB2YWx1ZSBvZiB0eXBlIEludCByZXByZXNlbnRpbmcgdGhlIHdpZHRoIG9mIDJEIGJsb2NrIG9mIGRhdGEuCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIG1pbl9wdHIgcG9pbnRzIHRvIHRoZSBmb3VuZCBtaW5pbXVtIHZhbHVlIGluIHRoZSBzcXVhcmUgYmxvY2sgb2YKLSAgICBzaXplIEJMS1NJWkUgY29udGFpbmVkIGluIDJEIGJsb2NrIG9mIGRhdGEuCi0KLSAgICBtYXhfcHRyIHBvaW50cyB0byB0aGUgZm91bmQgbWF4aW11bSB2YWx1ZSBpbiB0aGUgc3F1YXJlIGJsb2NrIG9mCi0gICAgc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbWF4aW11bSBhbmQgdGhlIG1pbmltdW0gdmFsdWVzIGluIGEgc3F1YXJlIGJsb2NrIG9mCi0gZGF0YSBvZiBzaXplIEJMS1NJWkUgKiBCTEtTSVpFLiBUaGUgZGF0YSBpcyBjb250YWluZWQgaW4gdGhlIGJ1ZmZlciB3aGljaAotIHJlcHJlc2VudHMgYSAyRCBibG9jayBvZiBkYXRhIHRoYXQgaXMgbGFyZ2VyIHRoYW4gQkxLU0laRSAqIEJMS1NJWkUuCi0gVGhpcyBpcyBpbGx1c3RyYXRlZCBiZWxvdy4KLQotICAgIG1lbSBsb2MgeCArIDAwaCAtPiBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgMTBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyAyMGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDMwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgNDBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA1MGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDYwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgNzBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA4MGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDkwaCAtPiBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgQTBoIC0+IG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8KLSAgICBtZW0gbG9jIHggKyBCMGggLT4gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbwotCi1Gb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzLCB0aGUgZGlhZ3JhbSBhc3N1bWVzIHRoYXQgQkxLU0laRSBpcyBlcXVhbCB0byA4Ci1idXQgdGhpcyBpcyBub3QgYSByZXF1aXJlbWVudC4gSW4gdGhpcyBkaWFncmFtLCB0aGUgYnVmZmVyIHN0YXJ0cyBhdAotbG9jYXRpb24geCBidXQgdGhlIGlucHV0IHBvaW50ZXIsIGlucHV0X3B0ciwgcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbgotd291bGQgYmUgdGhlIGZpcnN0IHJvdyBvZiBkYXRhIHRvIGJlIHNlYXJjaGVkIHdoaWNoIGlzIGF0IHggKyAxNWguIFRoZQotdmFsdWUgb2YgaW5jciBwYXNzZWQgb250byB0aGlzIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGFtb3VudCB0aGUgaW5wdXRfcHRyCi1uZWVkcyB0byBiZSBpbmNyZW1lbnRlZCB0byBwb2ludCB0byB0aGUgbmV4dCByb3cgb2YgZGF0YS4KLQotVGhpcyBmdW5jdGlvbiBjb21wYXJlcyBlYWNoIHZhbHVlIGluIGEgcm93IHRvIHRoZSBjdXJyZW50IG1heGltdW0gYW5kCi1taW5pbXVtLiBBZnRlciBlYWNoIHJvdywgaW5wdXRfcHRyIGlzIGluY3JlbWVudGVkIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJvdy4KLVRoaXMgaXMgcmVwZWF0ZWQgdW50aWwgYWxsIHJvd3MgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gV2hlbiB0aGUgc2VhcmNoIGlzCi1jb21wbGV0ZSB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBtaW5fcHRyIGNvbnRhaW5zIHRoZSBtaW5pbXVtIHZhbHVlCi1mb3VuZCBhbmQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgbWF4X3B0ciBjb250YWlucyB0aGUgbWF4aW11bSB2YWx1ZSBmb3VuZC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkICBGaW5kTWF4TWluKAotICAgIHVpbnQ4ICppbnB1dF9wdHIsCi0gICAgaW50ICptaW5fcHRyLAotICAgIGludCAqbWF4X3B0ciwKLSAgICBpbnQgaW5jcikKLXsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdWludCAgICBpLCBqOwotICAgIGludCBtaW4sIG1heDsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgbWF4ID0gbWluID0gKmlucHV0X3B0cjsKLSAgICAvKiAgaW5jciA9IGluY3IgLSBCTEtTSVpFOyAqLyAgIC8qICAwOS8wNi8yMDAxLCBhbHJlYWR5IHBhc3NlZCBpbiBhcyB3aWR0aCAtIEJMS1NJWkUgKi8KLQotICAgIGZvciAoaSA9IEJMS1NJWkU7IGkgPiAwOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBCTEtTSVpFOyBqID4gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKmlucHV0X3B0ciA+IG1heCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXggPSAqaW5wdXRfcHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKmlucHV0X3B0ciA8IG1pbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW4gPSAqaW5wdXRfcHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXRfcHRyICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXQgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdyovCi0gICAgICAgIGlucHV0X3B0ciArPSBpbmNyOwotICAgIH0KLQotICAgICptYXhfcHRyID0gbWF4OwotICAgICptaW5fcHRyID0gbWluOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1Y2U0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICJtcDRkZWYuaCIKLSNpbmNsdWRlICJpZGN0LmgiCi0jaW5jbHVkZSAibW90aW9uX2NvbXAuaCIKLQotI2lmZGVmIEZBU1RfSURDVAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICB2Y2FfaWRjdC5jIDogY3JlYXRlZCA2LzEvOTkgZm9yIHNldmVyYWwgb3B0aW9ucwotKiAgICAgICAgICAgICAgICAgICAgIG9mIGhhcmQtY29kZWQgcmVkdWNlZCBpZGN0IGZ1bmN0aW9uICh1c2luZyBuel9jb2VmcykKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wcmV0ZXN0ZWQgdmVyc2lvbgotdm9pZCBpZGN0cm93MChpbnQxNiAqLCB1aW50OCAqLCB1aW50OCAqLCBpbnQpCi17Ci0gICAgcmV0dXJuIDsKLX0KLXZvaWQgaWRjdGNvbDAoaW50MTYgKikKLXsKLSAgICByZXR1cm4gOwotfQotCi12b2lkIGlkY3Ryb3cxKGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCi17Ci0gICAgLyogc2hvcnRjdXQgKi8KLSAgICBpbnQgdG1wOwotICAgIGludCBpID0gODsKLSAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKLSAgICBpbnQgcmVzLCByZXMyOwotCi0gICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLwotICAgIHdpZHRoIC09IDQ7Ci0gICAgZHN0IC09IHdpZHRoOwotICAgIHByZWQgLT0gMTI7Ci0gICAgYmxrIC09IDg7Ci0KLSAgICB3aGlsZSAoaS0tKQotICAgIHsKLSAgICAgICAgdG1wID0gKCooYmxrICs9IDgpICsgMzIpID4+IDY7Ci0gICAgICAgICpibGsgPSAwOwotCi0gICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotICAgICAgICByZXMgPSB0bXAgKyAocHJlZF93b3JkICYgMHhGRik7Ci0gICAgICAgIENMSVBfUkVTVUxUKHJlcyk7Ci0gICAgICAgIHJlczIgPSB0bXAgKyAoKHByZWRfd29yZCA+PiA4KSAmIDB4RkYpOwotICAgICAgICBDTElQX1JFU1VMVChyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMTYpICYgMHhGRik7Ci0gICAgICAgIENMSVBfUkVTVUxUKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAyNCkgJiAweEZGKTsKLSAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KLQotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotICAgICAgICByZXMgPSB0bXAgKyAocHJlZF93b3JkICYgMHhGRik7Ci0gICAgICAgIENMSVBfUkVTVUxUKHJlcyk7Ci0gICAgICAgIHJlczIgPSB0bXAgKyAoKHByZWRfd29yZCA+PiA4KSAmIDB4RkYpOwotICAgICAgICBDTElQX1JFU1VMVChyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMTYpICYgMHhGRik7Ci0gICAgICAgIENMSVBfUkVTVUxUKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAyNCkgJiAweEZGKTsKLSAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgaWRjdGNvbDEoaW50MTYgKmJsaykKLXsgLyogc2hvcnRjdXQgKi8KLSAgICBibGtbMF0gPSBibGtbOF0gPSBibGtbMTZdID0gYmxrWzI0XSA9IGJsa1szMl0gPSBibGtbNDBdID0gYmxrWzQ4XSA9IGJsa1s1Nl0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsa1swXSA8PCAzOwotICAgIHJldHVybjsKLX0KLQotdm9pZCBpZGN0cm93MihpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKQotewotICAgIGludDMyIHgwLCB4MSwgeDIsIHg0LCB4NTsKLSAgICBpbnQgaSA9IDg7Ci0gICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7Ci0gICAgaW50IHJlcywgcmVzMjsKLQotICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KLSAgICB3aWR0aCAtPSA0OwotICAgIGRzdCAtPSB3aWR0aDsKLSAgICBwcmVkIC09IDEyOwotICAgIGJsayAtPSA4OwotCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIC8qIHNob3J0Y3V0ICovCi0gICAgICAgIHg0ID0gYmxrWzldOwotICAgICAgICBibGtbOV0gPSAwOwotICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKLSAgICAgICAgKmJsayA9IDA7ICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KLQotICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLwotICAgICAgICB4NSA9IChXNyAqIHg0ICsgNCkgPj4gMzsKLSAgICAgICAgeDQgPSAoVzEgKiB4NCArIDQpID4+IDM7Ci0KLSAgICAgICAgLyogdGhpcmQgc3RhZ2UgKi8KLSAgICAgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OwotICAgICAgICB4MSA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7Ci0KLSAgICAgICAgLyogZm91cnRoIHN0YWdlICovCi0gICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotICAgICAgICByZXMgPSAoeDAgKyB4NCkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKLSAgICAgICAgcmVzMiA9ICh4MCArIHgyKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSAoeDAgKyB4NSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KLQotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotICAgICAgICByZXMgPSAoeDAgLSB4NSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKLSAgICAgICAgcmVzMiA9ICh4MCAtIHgxKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gKHgwIC0geDIpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSAoeDAgLSB4NCkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLwotICAgIH0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIGlkY3Rjb2wyKGludDE2ICpibGspCi17Ci0gICAgaW50MzIgeDAsIHgxLCB4MywgeDUsIHg3Oy8vLCB4ODsKLQotICAgIHgxID0gYmxrWzhdOwotICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OwotICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KLQotICAgIHg3ID0gVzcgKiB4MTsKLSAgICB4MSA9IFcxICogeDE7Ci0KLSAgICB4MyA9IHg3OwotICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKLSAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7Ci0KLSAgICBibGtbMF0gPSAoeDAgKyB4MSkgPj4gODsKLSAgICBibGtbOF0gPSAoeDAgKyB4NykgPj4gODsKLSAgICBibGtbMTZdID0gKHgwICsgeDUpID4+IDg7Ci0gICAgYmxrWzI0XSA9ICh4MCArIHgzKSA+PiA4OwotICAgIGJsa1s1Nl0gPSAoeDAgLSB4MSkgPj4gODsKLSAgICBibGtbNDhdID0gKHgwIC0geDcpID4+IDg7Ci0gICAgYmxrWzQwXSA9ICh4MCAtIHg1KSA+PiA4OwotICAgIGJsa1szMl0gPSAoeDAgLSB4MykgPj4gODsKLQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgaWRjdHJvdzMoaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCkKLXsKLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwotICAgIGludCBpID0gODsKLSAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKLSAgICBpbnQgcmVzLCByZXMyOwotCi0gICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLwotICAgIHdpZHRoIC09IDQ7Ci0gICAgZHN0IC09IHdpZHRoOwotICAgIHByZWQgLT0gMTI7Ci0gICAgYmxrIC09IDg7Ci0KLSAgICB3aGlsZSAoaS0tKQotICAgIHsKLSAgICAgICAgeDIgPSBibGtbMTBdOwotICAgICAgICBibGtbMTBdID0gMDsKLSAgICAgICAgeDEgPSBibGtbOV07Ci0gICAgICAgIGJsa1s5XSA9IDA7Ci0gICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOwotICAgICAgICAqYmxrID0gMDsgICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KLSAgICAgICAgLyogYm90aCB1cHBlciBhbmQgbG93ZXIqLwotICAgICAgICAvKiBib3RoIHgyb3J4NiBhbmQgeDBvcng0ICovCi0KLSAgICAgICAgeDQgPSB4MDsKLSAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7Ci0gICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOwotICAgICAgICB4OCA9IHgwIC0geDI7Ci0gICAgICAgIHgwICs9IHgyOwotICAgICAgICB4MiA9IHg4OwotICAgICAgICB4OCA9IHg0IC0geDY7Ci0gICAgICAgIHg0ICs9IHg2OwotICAgICAgICB4NiA9IHg4OwotCi0gICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOwotICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKLSAgICAgICAgeDMgPSB4NzsKLSAgICAgICAgeDUgPSAoMTgxICogKHgxIC0geDcpICsgMTI4KSA+PiA4OwotICAgICAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7Ci0KLSAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSAxMikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCi0gICAgICAgIHJlcyA9ICh4MCArIHgxKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMShyZXMpOwotICAgICAgICByZXMyID0gKHg0ICsgeDcpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOwotICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOwotICAgICAgICByZXMgPSAoeDYgKyB4NSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7Ci0gICAgICAgIHJlcyA9ICh4MiArIHgzKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQNChyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLwotCi0gICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCi0gICAgICAgIHJlcyA9ICh4MiAtIHgzKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMShyZXMpOwotICAgICAgICByZXMyID0gKHg2IC0geDUpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOwotICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOwotICAgICAgICByZXMgPSAoeDQgLSB4NykgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7Ci0gICAgICAgIHJlcyA9ICh4MCAtIHgxKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQNChyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCi0gICAgfQotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBpZGN0Y29sMyhpbnQxNiAqYmxrKQotewotICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7Ci0KLSAgICB4MiA9IGJsa1sxNl07Ci0gICAgeDEgPSBibGtbOF07Ci0gICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCAxMSkgKyAxMjg7Ci0KLSAgICB4NCA9IHgwOwotICAgIHg2ID0gVzYgKiB4MjsKLSAgICB4MiA9IFcyICogeDI7Ci0gICAgeDggPSB4MCAtIHgyOwotICAgIHgwICs9IHgyOwotICAgIHgyID0geDg7Ci0gICAgeDggPSB4NCAtIHg2OwotICAgIHg0ICs9IHg2OwotICAgIHg2ID0geDg7Ci0KLSAgICB4NyA9IFc3ICogeDE7Ci0gICAgeDEgPSBXMSAqIHgxOwotICAgIHgzID0geDc7Ci0gICAgeDUgPSAoMTgxICogKHgxIC0geDcpICsgMTI4KSA+PiA4OwotICAgIHg3ID0gKDE4MSAqICh4MSArIHg3KSArIDEyOCkgPj4gODsKLQotICAgIGJsa1swXSA9ICh4MCArIHgxKSA+PiA4OwotICAgIGJsa1s4XSA9ICh4NCArIHg3KSA+PiA4OwotICAgIGJsa1sxNl0gPSAoeDYgKyB4NSkgPj4gODsKLSAgICBibGtbMjRdID0gKHgyICsgeDMpID4+IDg7Ci0gICAgYmxrWzU2XSA9ICh4MCAtIHgxKSA+PiA4OwotICAgIGJsa1s0OF0gPSAoeDQgLSB4NykgPj4gODsKLSAgICBibGtbNDBdID0gKHg2IC0geDUpID4+IDg7Ci0gICAgYmxrWzMyXSA9ICh4MiAtIHgzKSA+PiA4OwotCi0gICAgcmV0dXJuOwotfQotCi0KLXZvaWQgaWRjdHJvdzQoaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCkKLXsKLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwotICAgIGludCBpID0gODsKLSAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKLSAgICBpbnQgcmVzLCByZXMyOwotCi0gICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLwotICAgIHdpZHRoIC09IDQ7Ci0gICAgZHN0IC09IHdpZHRoOwotICAgIHByZWQgLT0gMTI7Ci0gICAgYmxrIC09IDg7Ci0KLSAgICB3aGlsZSAoaS0tKQotICAgIHsKLSAgICAgICAgeDIgPSBibGtbMTBdOwotICAgICAgICBibGtbMTBdID0gMDsKLSAgICAgICAgeDEgPSBibGtbOV07Ci0gICAgICAgIGJsa1s5XSA9IDA7Ci0gICAgICAgIHgzID0gYmxrWzExXTsKLSAgICAgICAgYmxrWzExXSA9IDA7Ci0gICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOwotICAgICAgICAqYmxrID0gMDsgICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCi0KLSAgICAgICAgeDQgPSB4MDsKLSAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7Ci0gICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOwotICAgICAgICB4OCA9IHgwIC0geDI7Ci0gICAgICAgIHgwICs9IHgyOwotICAgICAgICB4MiA9IHg4OwotICAgICAgICB4OCA9IHg0IC0geDY7Ci0gICAgICAgIHg0ICs9IHg2OwotICAgICAgICB4NiA9IHg4OwotCi0gICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOwotICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKLSAgICAgICAgeDUgPSAoVzMgKiB4MyArIDQpID4+IDM7Ci0gICAgICAgIHgzID0gKC0gVzUgKiB4MyArIDQpID4+IDM7Ci0gICAgICAgIHg4ID0geDEgLSB4NTsKLSAgICAgICAgeDEgKz0geDU7Ci0gICAgICAgIHg1ID0geDg7Ci0gICAgICAgIHg4ID0geDcgLSB4MzsKLSAgICAgICAgeDMgKz0geDc7Ci0gICAgICAgIHg3ID0gKDE4MSAqICh4NSArIHg4KSArIDEyOCkgPj4gODsKLSAgICAgICAgeDUgPSAoMTgxICogKHg1IC0geDgpICsgMTI4KSA+PiA4OwotCi0gICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotICAgICAgICByZXMgPSAoeDAgKyB4MSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKLSAgICAgICAgcmVzMiA9ICh4NCArIHg3KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gKHg2ICsgeDUpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSAoeDIgKyB4MykgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KLQotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotICAgICAgICByZXMgPSAoeDIgLSB4MykgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKLSAgICAgICAgcmVzMiA9ICh4NiAtIHg1KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gKHg0IC0geDcpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSAoeDAgLSB4MSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLwotICAgIH0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIGlkY3Rjb2w0KGludDE2ICpibGspCi17Ci0gICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKLSAgICB4MiA9IGJsa1sxNl07Ci0gICAgeDEgPSBibGtbOF07Ci0gICAgeDMgPSBibGtbMjRdOwotICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OwotCi0gICAgeDQgPSB4MDsKLSAgICB4NiA9IFc2ICogeDI7Ci0gICAgeDIgPSBXMiAqIHgyOwotICAgIHg4ID0geDAgLSB4MjsKLSAgICB4MCArPSB4MjsKLSAgICB4MiA9IHg4OwotICAgIHg4ID0geDQgLSB4NjsKLSAgICB4NCArPSB4NjsKLSAgICB4NiA9IHg4OwotCi0gICAgeDcgPSBXNyAqIHgxOwotICAgIHgxID0gVzEgKiB4MTsKLSAgICB4NSA9IFczICogeDM7Ci0gICAgeDMgPSAtVzUgKiB4MzsKLSAgICB4OCA9IHgxIC0geDU7Ci0gICAgeDEgKz0geDU7Ci0gICAgeDUgPSB4ODsKLSAgICB4OCA9IHg3IC0geDM7Ci0gICAgeDMgKz0geDc7Ci0gICAgeDcgPSAoMTgxICogKHg1ICsgeDgpICsgMTI4KSA+PiA4OwotICAgIHg1ID0gKDE4MSAqICh4NSAtIHg4KSArIDEyOCkgPj4gODsKLQotCi0gICAgYmxrWzBdID0gKHgwICsgeDEpID4+IDg7Ci0gICAgYmxrWzhdID0gKHg0ICsgeDcpID4+IDg7Ci0gICAgYmxrWzE2XSA9ICh4NiArIHg1KSA+PiA4OwotICAgIGJsa1syNF0gPSAoeDIgKyB4MykgPj4gODsKLSAgICBibGtbNTZdID0gKHgwIC0geDEpID4+IDg7Ci0gICAgYmxrWzQ4XSA9ICh4NCAtIHg3KSA+PiA4OwotICAgIGJsa1s0MF0gPSAoeDYgLSB4NSkgPj4gODsKLSAgICBibGtbMzJdID0gKHgyIC0geDMpID4+IDg7Ci0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIGlkY3Ryb3cwX2ludHJhKGludDE2ICosIFBJWEVMICosIGludCkKLXsKLSAgICByZXR1cm4gOwotfQotCi12b2lkIGlkY3Ryb3cxX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCi17Ci0gICAgLyogc2hvcnRjdXQgKi8KLSAgICBpbnQzMiB0bXA7Ci0gICAgaW50IGkgPSA4OwotICAgIGludCBvZmZzZXQgPSB3aWR0aDsKLSAgICB1aW50MzIgd29yZDsKLQotICAgIGNvbXAgLT0gb2Zmc2V0OwotICAgIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgICB0bXAgPSAoKGJsa1swXSArIDMyKSA+PiA2KTsKLSAgICAgICAgYmxrWzBdID0gMDsKLSAgICAgICAgQ0xJUF9SRVNVTFQodG1wKQotCi0gICAgICAgIHdvcmQgPSAodG1wIDw8IDgpIHwgdG1wOwotICAgICAgICB3b3JkID0gKHdvcmQgPDwgMTYpIHwgd29yZDsKLQotICAgICAgICAqKCh1aW50MzIqKShjb21wICs9IG9mZnNldCkpID0gd29yZDsKLSAgICAgICAgKigodWludDMyKikoY29tcCArIDQpKSA9IHdvcmQ7Ci0KLQotCi0KLSAgICAgICAgYmxrICs9IEJfU0laRTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIGlkY3Ryb3cyX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCi17Ci0gICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1LCB0ZW1wOwotICAgIGludCBpID0gODsKLSAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7Ci0gICAgaW50MzIgd29yZDsKLQotICAgIGNvbXAgLT0gb2Zmc2V0OwotICAgIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgICAvKiBzaG9ydGN1dCAqLwotICAgICAgICB4NCA9IGJsa1sxXTsKLSAgICAgICAgYmxrWzFdID0gMDsKLSAgICAgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCA4KSArIDgxOTI7Ci0gICAgICAgIGJsa1swXSA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCi0KLSAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KLSAgICAgICAgeDUgPSAoVzcgKiB4NCArIDQpID4+IDM7Ci0gICAgICAgIHg0ID0gKFcxICogeDQgKyA0KSA+PiAzOwotCi0gICAgICAgIC8qIHRoaXJkIHN0YWdlICovCi0gICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKLSAgICAgICAgeDEgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OwotCi0gICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLwotICAgICAgICB3b3JkID0gKCh4MCArIHg0KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCi0KLSAgICAgICAgdGVtcCA9ICgoeDAgKyB4MikgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOwotICAgICAgICB0ZW1wID0gKCh4MCArIHgxKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMTYpOwotICAgICAgICB0ZW1wID0gKCh4MCArIHg1KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOwotICAgICAgICAqKChpbnQzMiopKGNvbXAgKz0gb2Zmc2V0KSkgPSB3b3JkOwotCi0gICAgICAgIHdvcmQgPSAoKHgwIC0geDUpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKLSAgICAgICAgdGVtcCA9ICgoeDAgLSB4MSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOwotICAgICAgICB0ZW1wID0gKCh4MCAtIHgyKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMTYpOwotICAgICAgICB0ZW1wID0gKCh4MCAtIHg0KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOwotICAgICAgICAqKChpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOwotCi0gICAgICAgIGJsayArPSBCX1NJWkU7Ci0gICAgfQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgaWRjdHJvdzNfaW50cmEoaW50MTYgKmJsaywgUElYRUwgKmNvbXAsIGludCB3aWR0aCkKLXsKLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4LCB0ZW1wOwotICAgIGludCBpID0gODsKLSAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7Ci0gICAgaW50MzIgd29yZDsKLQotICAgIGNvbXAgLT0gb2Zmc2V0OwotCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIHgyID0gYmxrWzJdOwotICAgICAgICBibGtbMl0gPSAwOwotICAgICAgICB4MSA9IGJsa1sxXTsKLSAgICAgICAgYmxrWzFdID0gMDsKLSAgICAgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCA4KSArIDgxOTI7Ci0gICAgICAgIGJsa1swXSA9IDA7LyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCi0gICAgICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KLSAgICAgICAgLyogYm90aCB4Mm9yeDYgYW5kIHgwb3J4NCAqLwotCi0gICAgICAgIHg0ID0geDA7Ci0gICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOwotICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKLSAgICAgICAgeDggPSB4MCAtIHgyOwotICAgICAgICB4MCArPSB4MjsKLSAgICAgICAgeDIgPSB4ODsKLSAgICAgICAgeDggPSB4NCAtIHg2OwotICAgICAgICB4NCArPSB4NjsKLSAgICAgICAgeDYgPSB4ODsKLQotICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKLSAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7Ci0gICAgICAgIHgzID0geDc7Ci0gICAgICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKLSAgICAgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OwotCi0gICAgICAgIHdvcmQgPSAoKHgwICsgeDEpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKLSAgICAgICAgdGVtcCA9ICgoeDQgKyB4NykgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOwotCi0KLSAgICAgICAgdGVtcCA9ICgoeDYgKyB4NSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKLQotICAgICAgICB0ZW1wID0gKCh4MiArIHgzKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOwotICAgICAgICAqKChpbnQzMiopKGNvbXAgKz0gb2Zmc2V0KSkgPSB3b3JkOwotCi0gICAgICAgIHdvcmQgPSAoKHgyIC0geDMpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKLQotICAgICAgICB0ZW1wID0gKCh4NiAtIHg1KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgOCk7Ci0KLSAgICAgICAgdGVtcCA9ICgoeDQgLSB4NykgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKLQotICAgICAgICB0ZW1wID0gKCh4MCAtIHgxKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOwotICAgICAgICAqKChpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOwotCi0gICAgICAgIGJsayArPSBCX1NJWkU7Ci0gICAgfQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgaWRjdHJvdzRfaW50cmEoaW50MTYgKmJsaywgUElYRUwgKmNvbXAsIGludCB3aWR0aCkKLXsKLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4LCB0ZW1wOwotICAgIGludCBpID0gODsKLSAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7Ci0gICAgaW50MzIgd29yZDsKLQotICAgIGNvbXAgLT0gb2Zmc2V0OwotCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIHgyID0gYmxrWzJdOwotICAgICAgICBibGtbMl0gPSAwOwotICAgICAgICB4MSA9IGJsa1sxXTsKLSAgICAgICAgYmxrWzFdID0gMDsKLSAgICAgICAgeDMgPSBibGtbM107Ci0gICAgICAgIGJsa1szXSA9IDA7Ci0gICAgICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgOCkgKyA4MTkyOwotICAgICAgICBibGtbMF0gPSAwOy8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLwotCi0gICAgICAgIHg0ID0geDA7Ci0gICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOwotICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKLSAgICAgICAgeDggPSB4MCAtIHgyOwotICAgICAgICB4MCArPSB4MjsKLSAgICAgICAgeDIgPSB4ODsKLSAgICAgICAgeDggPSB4NCAtIHg2OwotICAgICAgICB4NCArPSB4NjsKLSAgICAgICAgeDYgPSB4ODsKLQotICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKLSAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7Ci0gICAgICAgIHg1ID0gKFczICogeDMgKyA0KSA+PiAzOwotICAgICAgICB4MyA9ICgtIFc1ICogeDMgKyA0KSA+PiAzOwotICAgICAgICB4OCA9IHgxIC0geDU7Ci0gICAgICAgIHgxICs9IHg1OwotICAgICAgICB4NSA9IHg4OwotICAgICAgICB4OCA9IHg3IC0geDM7Ci0gICAgICAgIHgzICs9IHg3OwotICAgICAgICB4NyA9ICgxODEgKiAoeDUgKyB4OCkgKyAxMjgpID4+IDg7Ci0gICAgICAgIHg1ID0gKDE4MSAqICh4NSAtIHg4KSArIDEyOCkgPj4gODsKLQotICAgICAgICB3b3JkID0gKCh4MCArIHgxKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCi0KLSAgICAgICAgdGVtcCA9ICgoeDQgKyB4NykgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOwotCi0KLSAgICAgICAgdGVtcCA9ICgoeDYgKyB4NSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKLQotICAgICAgICB0ZW1wID0gKCh4MiArIHgzKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOwotICAgICAgICAqKChpbnQzMiopKGNvbXAgKz0gb2Zmc2V0KSkgPSB3b3JkOwotCi0gICAgICAgIHdvcmQgPSAoKHgyIC0geDMpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKLQotICAgICAgICB0ZW1wID0gKCh4NiAtIHg1KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgOCk7Ci0KLSAgICAgICAgdGVtcCA9ICgoeDQgLSB4NykgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKLQotICAgICAgICB0ZW1wID0gKCh4MCAtIHgxKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOwotICAgICAgICAqKChpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOwotCi0gICAgICAgIGJsayArPSBCX1NJWkU7Ci0gICAgfQotCi0gICAgcmV0dXJuIDsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NzIzZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl9tb3Rpb25fY29tcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJtNHZfaDI2MyIKLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgdmlkZW8gPSBwb2ludGVyIHRvIHN0cnVjdHVyZSBvZiB0eXBlIFZpZGVvRGVjRGF0YQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIHJvdW5kdGFiMTYgPSByb3VuZGluZyB0YWJsZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiBjb250ZW50cyBhcmUgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgbHVtaW5hbmNlCi0gICAgICBkYXRhCi0gICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuIGNvbnRlbnRzIGFyZSB0aGUgbmV3bHkgY2FsY3VsYXRlZCBjaHJvbWluYW5jZQotICAgICAgYiBkYXRhCi0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuIGNvbnRlbnRzIGFyZSB0aGUgbmV3bHkgY2FsY3VsYXRlZCBjaHJvbWluYW5jZQotICAgICAgciBkYXRhCi0gICAgdmlkZW8tPnBzdHByY1R5cEN1ciBjb250ZW50cyBhcmUgdGhlIHVwZGF0ZWQgc2VtYXBob3JlIHByb3BhZ2F0aW9uCi0gICAgICB2YWx1ZXMKLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaGlnaCBsZXZlbCBtb3Rpb24gY29tcGVuc2F0aW9uIG9uIHRoZSBsdW1pbmFuY2UgYW5kCi0gY2hyb21pbmFuY2UgZGF0YS4gSXQgc2V0cyB1cCBhbGwgdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9ucwotIHRoYXQgcGVyZm9ybSBsdW1pbmFuY2UgYW5kIGNocm9taW5hbmNlIHByZWRpY3Rpb24gYW5kIGl0IGluaXRpYWxpemVzIHRoZQotIHBvaW50ZXIgdG8gdGhlIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmVzIG9mIGEgZ2l2ZW4gYmxvY2suIEl0IGFsc28gY2hlY2tzCi0gdGhlIG1vdGlvbiBjb21wZW5zYXRpb24gbW9kZSBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggbHVtaW5hbmNlIG9yCi0gY2hyb21pbmFuY2UgcHJlZGljdGlvbiBmdW5jdGlvbnMgdG8gY2FsbCBhbmQgZGV0ZXJtaW5lcyBob3cgdGhlIHBvc3QKLSBwcm9jZXNzaW5nIHNlbWFwaG9yZXMgYXJlIHVwZGF0ZWQuCi0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAibW90aW9uX2NvbXAuaCIKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIDA5LzI5LzIwMDAgYnJpbmcgdGhpcyBmcm9tIG1wNGRlZi5oICovCi0vLyBjb25zdCBzdGF0aWMgaW50IHJvdW5kdGFiNFtdID0gezAsMSwxLDF9OwotLy8gY29uc3Qgc3RhdGljIGludCByb3VuZHRhYjhbXSA9IHswLDAsMSwxLDEsMSwxLDJ9OwotLyoqKiAxMC8zMCBmb3IgVFBTICovCi0vLyBjb25zdCBzdGF0aWMgaW50IHJvdW5kdGFiMTJbXSA9IHswLDAsMCwxLDEsMSwxLDEsMSwxLDIsMn07Ci0vKiAxMC8zMCBmb3IgVFBTICoqKi8KLWNvbnN0IHN0YXRpYyBpbnQgcm91bmR0YWIxNltdID0gezAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDJ9OwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKiBtb2RpZmllZCAzIEF1Z3VzdCAyMDA1IHRvIGRvIHByZWRpY3Rpb24gYW5kIHB1dCB0aGUgcmVzdWx0cyBpbgotdmlkZW8tPm1ibG9jay0+cHJlZF9ibG9jaywgbm8gYWRkaW5nIHdpdGggcmVzaWR1ZSAqLwotCi12b2lkICBNQk1vdGlvbkNvbXAoCi0gICAgVmlkZW9EZWNEYXRhICp2aWRlbywKLSAgICBpbnQgQ0JQCi0pCi17Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogUHJldmlvdXMgVmlkZW8gT2JqZWN0IFBsYW5lICovCi0gICAgVm9wICpwcmV2ID0gdmlkZW8tPnByZXZWb3A7Ci0KLSAgICAvKiBDdXJyZW50IE1hY3JvYmxvY2sgKE1CKSBpbiB0aGUgVk9QICovCi0gICAgaW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOwotCi0gICAgLyogTnVtYmVyIG9mIE1CIHBlciBkYXRhIHJvdyAqLwotICAgIGludCBNQl9pbl93aWR0aCA9IHZpZGVvLT5uTUJQZXJSb3c7Ci0gICAgaW50IHlwb3MsIHhwb3M7Ci0gICAgUElYRUwgKmNfY29tcCwgKmNfcHJldjsKLSAgICBQSVhFTCAqY3VfY29tcCwgKmN1X3ByZXY7Ci0gICAgUElYRUwgKmN2X2NvbXAsICpjdl9wcmV2OwotICAgIGludCBoZWlnaHQsIHdpZHRoLCBwcmVkX3dpZHRoOwotICAgIGludCBpbXYsIG12d2lkdGg7Ci0gICAgaW50MzIgb2Zmc2V0OwotICAgIHVpbnQ4IG1vZGU7Ci0gICAgdWludDggKnByZWRfYmxvY2ssICpwcmVkOwotCi0gICAgLyogTW90aW9uIHZlY3RvciAoZHgsZHkpIGluIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KLSAgICBpbnQgZHgsIGR5OwotCi0gICAgTU9UIHB4WzRdLCBweVs0XTsKLSAgICBpbnQgeHByZWQsIHlwcmVkOwotICAgIGludCB4c3VtOwotICAgIGludCByb3VuZDE7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04gLy8gMi8xNC8yMDAxICAgICAgCi0gICAgLyogVG90YWwgbnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgVk9MICovCi0gICAgaW50MzIgc2l6ZSA9IChpbnQzMikgdmlkZW8tPm5Ub3RhbE1CIDw8IDg7Ci0gICAgdWludDggKnBwX2RlY195LCAqcHBfZGVjX3U7Ci0gICAgaW50IGxsWzRdOwotICAgIGludCB0bXAgPSAwOwotICAgIHVpbnQ4IG1za19kZWJsb2NrID0gMDsKLSNlbmRpZgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogU2V0IHJvdW5kaW5nIHR5cGUgKi8KLSAgICAvKiBjaGFuZ2UgZnJvbSBhcnJheSB0byBzaW5nbGUgMDkvMjkvMjAwMCAqLwotICAgIHJvdW5kMSA9IChpbnQpKDEgLSB2aWRlby0+Y3VyclZvcC0+cm91bmRpbmdUeXBlKTsKLQotICAgIC8qIHdpZHRoIG9mIGx1bWluYW5jZSBkYXRhIGluIHBpeGVscyAoeSBheGlzKSAqLwotICAgIHdpZHRoID0gdmlkZW8tPndpZHRoOwotCi0gICAgLyogaGVpZ3RoIG9mIGx1bWluYW5jZSBkYXRhIGluIHBpeGVscyAoeCBheGlzKSAqLwotICAgIGhlaWdodCA9IHZpZGVvLT5oZWlnaHQ7Ci0KLSAgICAvKiBudW1iZXIgb2YgYmxvY2tzIHBlciByb3cgKi8KLSAgICBtdndpZHRoID0gTUJfaW5fd2lkdGggPDwgMTsKLQotICAgIC8qIHN0YXJ0aW5nIHkgcG9zaXRpb24gaW4gY3VycmVudCBNQjsgb3JpZ2luIG9mIE1CICovCi0gICAgeXBvcyA9IHZpZGVvLT5tYm51bV9yb3cgPDwgNCA7Ci0gICAgLyogc3RhcnRpbmcgeCBwb3NpdGlvbiBpbiBjdXJyZW50IE1COyBvcmlnaW4gb2YgTUIgKi8KLSAgICB4cG9zID0gdmlkZW8tPm1ibnVtX2NvbCA8PCA0IDsKLQotICAgIC8qIG9mZnNldCB0byAoeCx5KSBwb3NpdGlvbiBpbiBjdXJyZW50IGx1bWluYW5jZSBNQiAqLwotICAgIC8qIGluIHBpeGVsIHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHlwb3Mqd2lkdGggLT4gcm93LCAreCAtPiBjb2x1bW4gKi8KLSAgICBvZmZzZXQgPSAoaW50MzIpeXBvcyAqIHdpZHRoICsgeHBvczsKLQotICAgIC8qIGdldCBtb2RlIGZvciBjdXJyZW50IE1CICovCi0gICAgbW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOwotCi0gICAgLyogYmxvY2sgaW5kZXggKi8KLSAgICAvKiBpbXYgPSAoeHBvcy84KSArICgoeXBvcy84KSAqIG12d2lkdGgpICovCi0gICAgaW12ID0gKG9mZnNldCA+PiA2KSAtICh4cG9zID4+IDYpICsgKHhwb3MgPj4gMyk7Ci0gICAgaWYgKG1vZGUgJiBJTlRFUl8xVk1BU0spCi0gICAgewotICAgICAgICBkeCA9IHB4WzBdID0gcHhbMV0gPSBweFsyXSA9IHB4WzNdID0gdmlkZW8tPm1vdFhbaW12XTsKLSAgICAgICAgZHkgPSBweVswXSA9IHB5WzFdID0gcHlbMl0gPSBweVszXSA9IHZpZGVvLT5tb3RZW2ltdl07Ci0gICAgICAgIGlmICgoZHggJiAzKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBkeCA9IGR4ID4+IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB4IGNvbXBvbmVudCBvZiBNViBpcyBvcidlZCBmb3Igcm91bmRpbmcgKD8pICovCi0gICAgICAgICAgICBkeCA9IChkeCA+PiAxKSB8IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB5IGNvbXBvbmVudCBvZiBtb3Rpb24gdmVjdG9yOyBkaXZpZGUgYnkgMiBmb3IgdG8gKi8KLSAgICAgICAgLyogY29udmVydCB0byBmdWxsLXBlbCByZXNvbHV0aW9uLiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICgoZHkgJiAzKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBkeSA9IGR5ID4+IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB5IGNvbXBvbmVudCBvZiBNViBpcyBvcidlZCBmb3Igcm91bmRpbmcgKD8pICovCi0gICAgICAgICAgICBkeSA9IChkeSA+PiAxKSB8IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHhbMF0gPSB2aWRlby0+bW90WFtpbXZdOwotICAgICAgICBweFsxXSA9IHZpZGVvLT5tb3RYW2ltdisxXTsKLSAgICAgICAgcHhbMl0gPSB2aWRlby0+bW90WFtpbXYrbXZ3aWR0aF07Ci0gICAgICAgIHB4WzNdID0gdmlkZW8tPm1vdFhbaW12K212d2lkdGgrMV07Ci0gICAgICAgIHhzdW0gPSBweFswXSArIHB4WzFdICsgcHhbMl0gKyBweFszXTsKLSAgICAgICAgZHggPSBQVl9TSUdOKHhzdW0pICogKHJvdW5kdGFiMTZbKFBWX0FCUyh4c3VtKSkgJiAweEZdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFBWX0FCUyh4c3VtKSkgPj4gNCkgPDwgMSkpOwotICAgICAgICBweVswXSA9IHZpZGVvLT5tb3RZW2ltdl07Ci0gICAgICAgIHB5WzFdID0gdmlkZW8tPm1vdFlbaW12KzFdOwotICAgICAgICBweVsyXSA9IHZpZGVvLT5tb3RZW2ltdittdndpZHRoXTsKLSAgICAgICAgcHlbM10gPSB2aWRlby0+bW90WVtpbXYrbXZ3aWR0aCsxXTsKLSAgICAgICAgeHN1bSA9IHB5WzBdICsgcHlbMV0gKyBweVsyXSArIHB5WzNdOwotICAgICAgICBkeSA9IFBWX1NJR04oeHN1bSkgKiAocm91bmR0YWIxNlsoUFZfQUJTKHhzdW0pKSAmIDB4Rl0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUFZfQUJTKHhzdW0pKSA+PiA0KSA8PCAxKSk7Ci0gICAgfQotCi0gICAgLyogUG9pbnRlciB0byBwcmV2aW91cyBsdW1pbmFuY2UgZnJhbWUgKi8KLSAgICBjX3ByZXYgID0gcHJldi0+eUNoYW47Ci0gICAgaWYgKCFjX3ByZXYpIHsKLSAgICAgICAgQUxPR0UoImIvMzUyNjk2MzUiKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNTI2OTYzNSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJlZF9ibG9jayA9IHZpZGVvLT5tYmxvY2stPnByZWRfYmxvY2s7Ci0KLSAgICAvKiBzb21lIGJsb2NrcyBoYXZlIG5vIHJlc2lkdWUgb3IgSU5URVI0ViAqLwotICAgIC8qaWYgKG1vZGUgPT0gTU9ERV9JTlRFUjRWKSAgIDA1LzA4LzE1ICovCi0gICAgLyogTW90aW9uIENvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHdpdGhpbiBhIE1CICovCi0gICAgLyogKDQgTVYgcGVyIE1CKSAqLwotCi0KLQotICAgIC8qIENhbGwgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBsdW1pbmFuY2UgcHJlZGljdGlvbiAqLwotICAgIC8qICAgICAgbHVtaW5hbmNlX3ByZWRfbW9kZV9pbnRlcjR2KHhwb3MsIHlwb3MsIHB4LCBweSwgY19wcmV2LAotICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICByb3VuZDEsIG12d2lkdGgsICZ4c3VtLCAmeXN1bSk7Ki8KLSAgICBjX2NvbXAgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBvZmZzZXQ7Ci0KLQotICAgIHhwcmVkID0gKGludCkoKHhwb3MgPDwgMSkgKyBweFswXSk7Ci0gICAgeXByZWQgPSAoaW50KSgoeXBvcyA8PCAxKSArIHB5WzBdKTsKLQotICAgIGlmICgoQ0JQID4+IDUpJjEpCi0gICAgewotICAgICAgICBwcmVkID0gcHJlZF9ibG9jazsKLSAgICAgICAgcHJlZF93aWR0aCA9IDE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcmVkID0gY19jb21wOwotICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmCi0gICAgICAgICAgICB5cHJlZCA+PSAwICYmIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCi0gICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIDsKLSAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKndpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgKHByZWRfd2lkdGggPDwgMSkgfCByb3VuZDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIEdldFByZWRPdXRzaWRlKHhwcmVkLCB5cHJlZCwgY19wcmV2LAotICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgaGVpZ2h0LCByb3VuZDEsIHByZWRfd2lkdGgpOwotICAgIH0KLQotCi0gICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIHZhbHVlcyBvdmVyIGN1cnJlbnQgbHVtaW5hbmNlIE1CICovCi0gICAgLyogKGJsb2NrcyAxKTsgYWRkIG1vdGlvbiB2ZWN0b3IgcHJpb3IgdG8gaW5wdXQ7ICAgICAgICovCi0gICAgLyogYWRkIDggdG8geF9wb3MgdG8gYWR2YW5jZSB0byBuZXh0IGJsb2NrICAgICAgICAgKi8KLSAgICB4cHJlZCA9IChpbnQpKCgoeHBvcyArIEJfU0laRSkgPDwgMSkgKyBweFsxXSk7Ci0gICAgeXByZWQgPSAoaW50KSgoeXBvcyA8PCAxKSArIHB5WzFdKTsKLQotICAgIGlmICgoQ0JQID4+IDQpJjEpCi0gICAgewotICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDg7Ci0gICAgICAgIHByZWRfd2lkdGggPSAxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJlZCA9IGNfY29tcCArIDg7Ci0gICAgICAgIHByZWRfd2lkdGggPSB3aWR0aDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBNViBwb2ludHMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICBpZiAoeHByZWQgPj0gMCAmJiB4cHJlZCA8PSAoKHdpZHRoIDw8IDEpIC0gKDIqQl9TSVpFKSkgJiYKLSAgICAgICAgICAgIHlwcmVkID49IDAgJiYgeXByZWQgPD0gKChoZWlnaHQgPDwgMSkgLSAoMipCX1NJWkUpKSkKLSAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAoeCx5KSBpcyBpbnNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKndpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgKHByZWRfd2lkdGggPDwgMSkgfCByb3VuZDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIEdldFByZWRPdXRzaWRlKHhwcmVkLCB5cHJlZCwgY19wcmV2LAotICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgaGVpZ2h0LCByb3VuZDEsIHByZWRfd2lkdGgpOwotICAgIH0KLQotCi0KLSAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gdmFsdWVzIG92ZXIgY3VycmVudCBsdW1pbmFuY2UgTUIgKi8KLSAgICAvKiAoYmxvY2tzIDIpOyBhZGQgbW90aW9uIHZlY3RvciBwcmlvciB0byBpbnB1dCAgICAgICAgKi8KLSAgICAvKiBhZGQgOCB0byB5X3BvcyB0byBhZHZhbmNlIHRvIGJsb2NrIG9uIG5leHQgcm93ICAgICAgKi8KLSAgICB4cHJlZCA9IChpbnQpKCh4cG9zIDw8IDEpICsgcHhbMl0pOwotICAgIHlwcmVkID0gKGludCkoKCh5cG9zICsgQl9TSVpFKSA8PCAxKSArIHB5WzJdKTsKLQotICAgIGlmICgoQ0JQID4+IDMpJjEpCi0gICAgewotICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDEyODsKLSAgICAgICAgcHJlZF93aWR0aCA9IDE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcmVkID0gY19jb21wICsgKHdpZHRoIDw8IDMpOwotICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmCi0gICAgICAgICAgICB5cHJlZCA+PSAwICYmIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCi0gICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsIGNfcHJldiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKLSAgICB9Ci0KLQotCi0gICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIHZhbHVlcyBvdmVyIGN1cnJlbnQgbHVtaW5hbmNlIE1CICovCi0gICAgLyogKGJsb2NrcyAzKTsgYWRkIG1vdGlvbiB2ZWN0b3IgcHJpb3IgdG8gaW5wdXQ7ICAgICAgICovCi0gICAgLyogYWRkIDggdG8geF9wb3MgYW5kIHlfcG9zIHRvIGFkdmFuY2UgdG8gbmV4dCBibG9jayAgICovCi0gICAgLyogb24gbmV4dCByb3cgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB4cHJlZCA9IChpbnQpKCgoeHBvcyArIEJfU0laRSkgPDwgMSkgKyBweFszXSk7Ci0gICAgeXByZWQgPSAoaW50KSgoKHlwb3MgKyBCX1NJWkUpIDw8IDEpICsgcHlbM10pOwotCi0gICAgaWYgKChDQlAgPj4gMikmMSkKLSAgICB7Ci0gICAgICAgIHByZWQgPSBwcmVkX2Jsb2NrICsgMTM2OwotICAgICAgICBwcmVkX3dpZHRoID0gMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHByZWQgPSBjX2NvbXAgKyAod2lkdGggPDwgMykgKyA4OwotICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmCi0gICAgICAgICAgICB5cHJlZCA+PSAwICYmIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCi0gICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsIGNfcHJldiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKLSAgICB9Ci0gICAgLyogQ2FsbCBmdW5jdGlvbiB0byBzZXQgZGUtYmxvY2tpbmcgYW5kIGRlLXJpbmdpbmcgKi8KLSAgICAvKiAgIHNlbWFwaG9yZXMgZm9yIGx1bWluYW5jZSAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICB7Ci0gICAgICAgIGlmIChtb2RlJklOVEVSXzFWTUFTSykKLSAgICAgICAgewotICAgICAgICAgICAgcHBfZGVjX3kgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgaW12OwotICAgICAgICAgICAgbGxbMF0gPSAxOwotICAgICAgICAgICAgbGxbMV0gPSBtdndpZHRoIC0gMTsKLSAgICAgICAgICAgIGxsWzJdID0gMTsKLSAgICAgICAgICAgIGxsWzNdID0gLW12d2lkdGggLSAxOwotICAgICAgICAgICAgbXNrX2RlYmxvY2sgPSBwcF9zZW1hcGhvcmVfbHVtYSh4cHJlZCwgeXByZWQsIHBwX2RlY195LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHN0cHJjVHlwUHJ2LCBsbCwgJnRtcCwgcHhbMF0sIHB5WzBdLCBtdndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKLQotICAgICAgICAgICAgcHBfZGVjX3UgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHNpemUgPj4gNikgKwotICAgICAgICAgICAgICAgICAgICAgICAoKGltdiArICh4cG9zID4+IDMpKSA+PiAyKTsKLQotICAgICAgICAgICAgcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlcih4cHJlZCwgeXByZWQsIHBwX2RlY191LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHN0cHJjVHlwUHJ2LCBkeCwgZHksIG12d2lkdGgsIGhlaWdodCwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBtc2tfZGVibG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQb3N0LXByb2Nlc3NpbmcgbW9kZSAoTUJNX0lOVEVSOCkgKi8KLSAgICAgICAgICAgIC8qIGRlYmxvY2tpbmcgYW5kIGRlcmluZ2luZykgKi8KLSAgICAgICAgICAgIHBwX2RlY195ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIGltdjsKLSAgICAgICAgICAgICpwcF9kZWNfeSA9IDQ7Ci0gICAgICAgICAgICAqKHBwX2RlY195ICsgMSkgPSA0OwotICAgICAgICAgICAgKihwcF9kZWNfeSArIG12d2lkdGgpID0gNDsKLSAgICAgICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoICsgMSkgPSA0OwotICAgICAgICAgICAgcHBfZGVjX3UgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHNpemUgPj4gNikgKwotICAgICAgICAgICAgICAgICAgICAgICAoKGltdiArICh4cG9zID4+IDMpKSA+PiAyKTsKLSAgICAgICAgICAgICpwcF9kZWNfdSA9IDQ7Ci0gICAgICAgICAgICBwcF9kZWNfdVtzaXplPj44XSA9IDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotCi0gICAgLyogeHByZWQgYW5kIHlwcmVkIGNhbGN1bGF0aW9uIGZvciBDaHJvbWluYW5jZSBpcyAqLwotICAgIC8qIGluIGZ1bGwtcGVsIHJlc29sdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIENocm9taW5hbmNlICovCi0gICAgLyogd2lkdGggb2YgY2hyb21pbmFuY2UgZGF0YSBpbiBwaXhlbHMgKHkgYXhpcykgKi8KLSAgICB3aWR0aCA+Pj0gMTsKLQotICAgIC8qIGhlaWd0aCBvZiBjaHJvbWluYW5jZSBkYXRhIGluIHBpeGVscyAoeCBheGlzKSAqLwotICAgIGhlaWdodCA+Pj0gMTsKLQotICAgIC8qIFBvaW50ZXIgdG8gcHJldmlvdXMgY2hyb21pbmFuY2UgYiBmcmFtZSAqLwotICAgIGN1X3ByZXYgPSBwcmV2LT51Q2hhbjsKLQotICAgIC8qIFBvaW50ZXIgdG8gcHJldmlvdXMgY2hyb21pbmFuY2UgciBmcmFtZSAqLwotICAgIGN2X3ByZXYgPSBwcmV2LT52Q2hhbjsKLQotICAgIC8qIHggcG9zaXRpb24gaW4gcHJlZGljdGlvbiBkYXRhIG9mZnNldCBieSBtb3Rpb24gdmVjdG9yICovCi0gICAgLyogeHByZWQgY2FsY3VsYXRpb24gZm9yIENocm9taW5hbmNlIGlzIGluIGZ1bGwtcGVsICAgICAgKi8KLSAgICAvKiByZXNvbHV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHhwcmVkID0geHBvcyArIGR4OwotCi0gICAgLyogeSBwb3NpdGlvbiBpbiBwcmVkaWN0aW9uIGRhdGEgb2Zmc2V0IGJ5IG1vdGlvbiB2ZWN0b3IgKi8KLSAgICAvKiB5cHJlZCBjYWxjdWxhdGlvbiBmb3IgQ2hyb21pbmFuY2UgaXMgaW4gZnVsbC1wZWwgICAgICAqLwotICAgIC8qIHJlc29sdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgeXByZWQgPSB5cG9zICsgZHk7Ci0KLSAgICBjdV9jb21wID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4cG9zID4+IDIpOwotICAgIGN2X2NvbXAgPSB2aWRlby0+Y3VyclZvcC0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhwb3MgPj4gMik7Ci0KLSAgICAvKiBDYWxsIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgY2hyb21pbmFuY2UgcHJlZGljdGlvbiAqLwotICAgIC8qICAgICAgY2hyb21pbmFuY2VfcHJlZCh4cHJlZCwgeXByZWQsIGN1X3ByZXYsIGN2X3ByZXYsCi0gICAgICAgICAgICBwcmVkX2Jsb2NrLCB3aWR0aF91diwgaGVpZ2h0X3V2LAotICAgICAgICAgICAgcm91bmQxKTsqLwotICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipCX1NJWkUpKSAmJiB5cHJlZCA+PSAwICYmCi0gICAgICAgICAgICB5cHJlZCA8PSAoKGhlaWdodCA8PCAxKSAtICgyKkJfU0laRSkpKQotICAgIHsKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAoeCx5KSBpcyBpbnNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgaWYgKChDQlAgPj4gMSkmMSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyAyNTY7Ci0gICAgICAgICAgICBwcmVkX3dpZHRoID0gMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVkID0gY3VfY29tcDsKLSAgICAgICAgICAgIHByZWRfd2lkdGggPSB3aWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiBmb3IgQ2hyb21pbmFuY2UgYiAoYmxvY2tbNF0pICovCi0gICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY3VfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqd2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCAocHJlZF93aWR0aCA8PCAxKSB8IHJvdW5kMSk7Ci0KLSAgICAgICAgaWYgKENCUCYxKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDI2NDsKLSAgICAgICAgICAgIHByZWRfd2lkdGggPSAxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWQgPSBjdl9jb21wOwotICAgICAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiBmb3IgQ2hyb21pbmFuY2UgciAoYmxvY2tbNV0pICovCi0gICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY3ZfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqd2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCAocHJlZF93aWR0aCA8PCAxKSB8IHJvdW5kMSk7Ci0KLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogKHgseSkgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgaWYgKChDQlAgPj4gMSkmMSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyAyNTY7Ci0gICAgICAgICAgICBwcmVkX3dpZHRoID0gMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVkID0gY3VfY29tcDsKLSAgICAgICAgICAgIHByZWRfd2lkdGggPSB3aWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiBmb3IgQ2hyb21pbmFuY2UgYiAoYmxvY2tbNF0pICovCi0gICAgICAgIEdldFByZWRPdXRzaWRlKHhwcmVkLCB5cHJlZCwgICAgY3VfcHJldiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKLQotICAgICAgICBpZiAoQ0JQJjEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWQgPSBwcmVkX2Jsb2NrICsgMjY0OwotICAgICAgICAgICAgcHJlZF93aWR0aCA9IDE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZCA9IGN2X2NvbXA7Ci0gICAgICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIHIgKGJsb2NrWzVdKSAqLwotICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsICAgIGN2X3ByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCBoZWlnaHQsIHJvdW5kMSwgcHJlZF93aWR0aCk7Ci0KLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0KLX0KLQotLyoqKiBzcGVjaWFsIGZ1bmN0aW9uIGZvciBza2lwcGVkIG1hY3JvYmxvY2ssICBBdWcgMTUsIDIwMDUgKi8KLXZvaWQgIFNraXBwZWRNQk1vdGlvbkNvbXAoCi0gICAgVmlkZW9EZWNEYXRhICp2aWRlbwotKQotewotICAgIFZvcCAqcHJldiA9IHZpZGVvLT5wcmV2Vm9wOwotICAgIFZvcCAqY29tcDsKLSAgICBpbnQgeXBvcywgeHBvczsKLSAgICBQSVhFTCAqY19jb21wLCAqY19wcmV2OwotICAgIFBJWEVMICpjdV9jb21wLCAqY3VfcHJldjsKLSAgICBQSVhFTCAqY3ZfY29tcCwgKmN2X3ByZXY7Ci0gICAgaW50IHdpZHRoLCB3aWR0aF91djsKLSAgICBpbnQzMiBvZmZzZXQ7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04gLy8gMi8xNC8yMDAxICAgICAgCi0gICAgaW50IGltdjsKLSAgICBpbnQzMiBzaXplID0gKGludDMyKSB2aWRlby0+blRvdGFsTUIgPDwgODsKLSAgICB1aW50OCAqcHBfZGVjX3ksICpwcF9kZWNfdTsKLSAgICB1aW50OCAqcHBfcHJldjE7Ci0gICAgaW50IG12d2lkdGggPSB2aWRlby0+bk1CUGVyUm93IDw8IDE7Ci0jZW5kaWYKLQotICAgIHdpZHRoID0gdmlkZW8tPndpZHRoOwotICAgIHdpZHRoX3V2ICA9IHdpZHRoID4+IDE7Ci0gICAgeXBvcyA9IHZpZGVvLT5tYm51bV9yb3cgPDwgNCA7Ci0gICAgeHBvcyA9IHZpZGVvLT5tYm51bV9jb2wgPDwgNCA7Ci0gICAgb2Zmc2V0ID0gKGludDMyKXlwb3MgKiB3aWR0aCArIHhwb3M7Ci0KLQotICAgIC8qIHplcm8gbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgcHJldmlvdXMgZnJhbWUgKi8KLSAgICAvKm1ieSp3aWR0aCArIG1ieDsqLwotICAgIGNfcHJldiAgPSBwcmV2LT55Q2hhbjsKLSAgICBpZiAoIWNfcHJldikgewotICAgICAgICBBTE9HRSgiYi8zNTI2OTYzNSIpOwotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM1MjY5NjM1Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY19wcmV2ICs9IG9mZnNldDsKLQotICAgIC8qYnkqd2lkdGhfdXYgKyBieDsqLwotICAgIGN1X3ByZXYgPSBwcmV2LT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKLSAgICAvKmJ5KndpZHRoX3V2ICsgYng7Ki8KLSAgICBjdl9wcmV2ID0gcHJldi0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhwb3MgPj4gMik7Ci0KLSAgICBjb21wID0gdmlkZW8tPmN1cnJWb3A7Ci0KLSAgICBjX2NvbXAgID0gY29tcC0+eUNoYW4gKyBvZmZzZXQ7Ci0gICAgY3VfY29tcCA9IGNvbXAtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4cG9zID4+IDIpOwotICAgIGN2X2NvbXAgPSBjb21wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKLQotCi0gICAgLyogQ29weSBwcmV2aW91cyByZWNvbnN0cnVjdGVkIGZyYW1lIGludG8gdGhlIGN1cnJlbnQgZnJhbWUgKi8KLSAgICBQdXRTS0lQUEVEX01CKGNfY29tcCwgIGNfcHJldiwgd2lkdGgpOwotICAgIFB1dFNLSVBQRURfQihjdV9jb21wLCBjdV9wcmV2LCB3aWR0aF91dik7Ci0gICAgUHV0U0tJUFBFRF9CKGN2X2NvbXAsIGN2X3ByZXYsIHdpZHRoX3V2KTsKLQotICAgIC8qICAxMC8yNC8yMDAwIHBvc3RfcHJvY2Vzc2luZyBzZW1hcGhvcmUgZ2VuZXJhdGlvbiAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OIC8vIDIvMTQvMjAwMQotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgIHsKLSAgICAgICAgaW12ID0gKG9mZnNldCA+PiA2KSAtICh4cG9zID4+IDYpICsgKHhwb3MgPj4gMyk7Ci0gICAgICAgIC8qIFBvc3QtcHJvY2Vzc2luZyBtb2RlIChjb3B5IHByZXZpb3VzIE1CKSAqLwotICAgICAgICBwcF9wcmV2MSA9IHZpZGVvLT5wc3RwcmNUeXBQcnYgKyBpbXY7Ci0gICAgICAgIHBwX2RlY195ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIGltdjsKLSAgICAgICAgKnBwX2RlY195ID0gKnBwX3ByZXYxOwotICAgICAgICAqKHBwX2RlY195ICsgMSkgPSAqKHBwX3ByZXYxICsgMSk7Ci0gICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoKSA9ICoocHBfcHJldjEgKyBtdndpZHRoKTsKLSAgICAgICAgKihwcF9kZWNfeSArIG12d2lkdGggKyAxKSA9ICoocHBfcHJldjEgKyBtdndpZHRoICsgMSk7Ci0KLSAgICAgICAgLyogY2hyb21pbmFuY2UgKi8KLSAgICAgICAgLyo0Kk1CX2luX3dpZHRoKk1CX2luX2hlaWdodCovCi0gICAgICAgIHBwX3ByZXYxID0gdmlkZW8tPnBzdHByY1R5cFBydiArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAoKGltdiArICh4cG9zID4+IDMpKSA+PiAyKTsKLSAgICAgICAgcHBfZGVjX3UgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHNpemUgPj4gNikgKwotICAgICAgICAgICAgICAgICAgICgoaW12ICsgKHhwb3MgPj4gMykpID4+IDIpOwotICAgICAgICAqcHBfZGVjX3UgPSAqcHBfcHJldjE7Ci0gICAgICAgIHBwX2RlY191W3NpemU+PjhdID0gcHBfcHJldjFbc2l6ZT4+OF07Ci0gICAgfQotI2VuZGlmCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q0ZWRjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2lmbmRlZiBfTVA0REVDTElCX0hfCi0jZGVmaW5lIF9NUDRERUNMSUJfSF8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJtcDRkZWYuaCIgLyogdHlwZWRlZiAqLwotI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIgLyogbWFpbiB2aWRlbyBzdHJ1Y3R1cmUgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIFZBUklBQkxFUyBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNJTVBMRSBUWVBFREVGJ1MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRU5VTUVSQVRFRCBUWVBFREVGJ1MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU1RSVUNUVVJFUyBUWVBFREVGJ1MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgR0xPQkFMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0gICAgLyogZGVmaW5lZCBpbiBwdmRlY19hcGkuYywgdGhlc2UgZnVuY3Rpb24gYXJlIG5vdCBzdXBwb3NlZCB0byBiZSAgICAqLwotICAgIC8qIGV4cG9zZWQgdG8gcHJvZ3JhbW1lcnMgb3V0c2lkZSBQYWNrZXRWaWRlby4gIDA4LzE1LzIwMDAuICAgICovCi0gICAgdWludCBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKFZpZGVvRGVjRGF0YSAqdmlkZW8pOwotCi0jaWZkZWYgRU5BQkxFX0xPRwotICAgIHZvaWQgbTR2ZGVjX2RwcmludGYoY2hhciAqZm9ybWF0LCAuLi4pOwotI2RlZmluZSBtcDRkZWNfbG9nKG1lc3NhZ2UpIG00dmRlY19kcHJpbnRmKG1lc3NhZ2UpCi0jZWxzZQotI2RlZmluZSBtcDRkZWNfbG9nKG1lc3NhZ2UpCi0jZW5kaWYKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gZnJhbWVfYnVmZmVyLmMgKi8KLSAgICBQVl9TVEFUVVMgRmlsbEZyYW1lQnVmZmVyTmV3KEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0pOwotICAgIFBWX1NUQVRVUyBGaWxsRnJhbWVCdWZmZXIoQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSwgaW50IHNob3J0X2hlYWRlcik7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGRjX2FjX3ByZWQuYyAqLwotICAgIGludCBjYWxfZGNfc2NhbGVyKGludCBRUCwgaW50IHR5cGUpOwotICAgIFBWX1NUQVRVUyBQVl9EZWNvZGVQcmVkaWN0ZWRJbnRyYURDKGludCBjb21wbnVtLCBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2ICpJbnRyYURDX2RlbHRhKTsKLQotICAgIHZvaWQgICAgZG9EQ0FDUHJlZGljdGlvbihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgY29tcCwgaW50MTYgKnFfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGlyZWN0aW9uKTsKLQotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgIHZvaWQgICAgZG9EQ0FDUHJlZGljdGlvbl9JKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBjb21wLCBpbnQxNiAqcV9ibG9jayk7Ci0jZW5kaWYKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGJsb2NrX2lkY3QuYyAqLwotICAgIHZvaWQgTUJsb2NrSURDVEFkZChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgbnpfY29lZnNbXSk7Ci0KLSAgICB2b2lkIEJsb2NrSURDVCh1aW50OCAqZHN0LCB1aW50OCAqcHJlZCwgaW50MTYgKmJsaywgaW50IHdpZHRoLCBpbnQgbnpjb2VmcywKLSAgICAgICAgICAgICAgICAgICB1aW50OCAqYml0bWFwY29sLCB1aW50OCBiaXRtYXByb3cpOwotCi0gICAgdm9pZCBNQmxvY2tJRENUKFZpZGVvRGVjRGF0YSAqdmlkZW8pOwotICAgIHZvaWQgQmxvY2tJRENUX2ludHJhKE1hY3JvQmxvY2sgKm1ibG9jaywgUElYRUwgKmNfY29tcCwgaW50IGNvbXAsIGludCB3aWR0aF9vZmZzZXQpOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gY29tYmluZWRfZGVjb2RlLmMgKi8KLSAgICBQVl9TVEFUVVMgRGVjb2RlRnJhbWVDb21iaW5lZE1vZGUoVmlkZW9EZWNEYXRhICp2aWRlbyk7Ci0gICAgUFZfU1RBVFVTIEdldE1CaGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludDE2ICpRUCk7Ci0gICAgUFZfU1RBVFVTIEdldE1CRGF0YShWaWRlb0RlY0RhdGEgKnZpZGVvKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gZGF0YXBhcnRfZGVjb2RlLmMgKi8KLSAgICBQVl9TVEFUVVMgRGVjb2RlRnJhbWVEYXRhUGFydE1vZGUoVmlkZW9EZWNEYXRhICp2aWRlbyk7Ci0gICAgUFZfU1RBVFVTIEdldE1CaGVhZGVyRGF0YVBhcnRfRFFVQU5UX0RDKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludDE2ICpRUCk7Ci0gICAgUFZfU1RBVFVTIEdldE1CaGVhZGVyRGF0YVBhcnRfUChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKLSAgICBQVl9TVEFUVVMgRGVjb2RlRGF0YVBhcnRfSV9WaWRlb1BhY2tldChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgc2xpY2VfY291bnRlcik7Ci0gICAgUFZfU1RBVFVTIERlY29kZURhdGFQYXJ0X1BfVmlkZW9QYWNrZXQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IHNsaWNlX2NvdW50ZXIpOwotICAgIFBWX1NUQVRVUyBHZXRNQkRhdGFfRGF0YVBhcnQoVmlkZW9EZWNEYXRhICp2aWRlbyk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIHBhY2tldF91dGlsLmMgKi8KLSAgICBQVl9TVEFUVVMgUFZfUmVhZFZpZGVvUGFja2V0SGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCAqbmV4dF9NQik7Ci0gICAgUFZfU1RBVFVTIFJlY292ZXJQYWNrZXRFcnJvcihCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtLCBpbnQgbWFya2VyX2xlbmd0aCwgaW50MzIgKm5leHRWb3ApOwotICAgIFBWX1NUQVRVUyBSZWNvdmVyR09CRXJyb3IoQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSwgaW50IG1hcmtlcl9sZW5ndGgsIGludDMyICp2b3BQb3MpOwotICAgIFBWX1NUQVRVUyBQVl9Hb2JIZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbyk7Ci0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0gICAgUFZfU1RBVFVTIFBWX0gyNjNTbGljZUhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvSW50LCBpbnQgKm5leHRfTUIpOwotI2VuZGlmCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBtb3Rpb25fY29tcC5jICovCi0gICAgdm9pZCBNQk1vdGlvbkNvbXAoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IENCUCk7Ci0gICAgdm9pZCAgU2tpcHBlZE1CTW90aW9uQ29tcChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gY2hyb21pbmFuY2VfcHJlZC5jICovCi0gICAgdm9pZCBjaHJvbWluYW5jZV9wcmVkKAotICAgICAgICBpbnQgeHByZWQsICAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHlwcmVkLCAgICAgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICpjdV9wcmV2LCAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAqY3ZfcHJldiwgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aF91diwgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0X3V2LCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHJvdW5kMQotICAgICk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXIuYyAqLwotICAgIHZvaWQgbHVtaW5hbmNlX3ByZWRfbW9kZV9pbnRlcigKLSAgICAgICAgaW50IHhwcmVkLCAgICAgICAgICAvKiBpICovCi0gICAgICAgIGludCB5cHJlZCwgICAgICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAqY19wcmV2LCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHJvdW5kMQotICAgICk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXI0di5jICovCi0gICAgdm9pZCBsdW1pbmFuY2VfcHJlZF9tb2RlX2ludGVyNHYoCi0gICAgICAgIGludCB4cG9zLCAgICAgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXBvcywgICAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgTU9UICpweCwgICAgICAgICAgICAvKiBpICovCi0gICAgICAgIE1PVCAqcHksICAgICAgICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAqY19wcmV2LCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHJvdW5kMSwgICAgICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50ICp4c3VtX3B0ciwgICAgICAgICAgLyogaS9vICovCi0gICAgICAgIGludCAqeXN1bV9wdHIgICAgICAgICAgIC8qIGkvbyAqLwotICAgICk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIHBwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIuYyAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgdm9pZCBwcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfdSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCBkeCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGR5LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZ3aWR0aCwgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0LCAgICAgLyogaSAqLwotICAgICAgICBpbnQzMiAgIHNpemUsICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12X2xvYywgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICBtc2tfZGVibG9jayAvKiBpICovCi0gICAgKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gcHBfc2VtYXBob3JlX2x1bWEuYyAqLwotICAgIHVpbnQ4IHBwX3NlbWFwaG9yZV9sdW1hKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfeSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCAqbGwsICAgICAgICAvKiBpICovCi0gICAgICAgIGludCAqbXZfbG9jLCAgICAvKiBpL28gKi8KLSAgICAgICAgaW50IGR4LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgZHksICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCi0gICAgICAgIGludCBoZWlnaHQgICAgICAvKiBpICovCi0gICAgKTsKLSNlbmRpZgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gZ2V0X3ByZWRfYWR2X21iX2FkZC5jICovCi0gICAgaW50IEdldFByZWRBZHZhbmNlZE1CKAotICAgICAgICBpbnQgeHBvcywKLSAgICAgICAgaW50IHlwb3MsCi0gICAgICAgIHVpbnQ4ICpjX3ByZXYsCi0gICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLAotICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgIGludCBybmQxCi0gICAgKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gZ2V0X3ByZWRfYWR2X2JfYWRkLmMgKi8KLSAgICBpbnQgR2V0UHJlZEFkdmFuY2VkQnkweDAoCi0gICAgICAgIHVpbnQ4ICpjX3ByZXYsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywgICAgICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCi0gICAgICAgIGludCBwcmVkX3dpZHRoX3JuZCAvKiBpICovCi0gICAgKTsKLQotICAgIGludCBHZXRQcmVkQWR2YW5jZWRCeTB4MSgKLSAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHdpZHRoLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHByZWRfd2lkdGhfcm5kIC8qIGkgKi8KLSAgICApOwotCi0gICAgaW50IEdldFByZWRBZHZhbmNlZEJ5MXgwKAotICAgICAgICB1aW50OCAqY19wcmV2LCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAgICAgLyogaSAqLwotICAgICAgICBpbnQgd2lkdGgsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgcHJlZF93aWR0aF9ybmQgLyogaSAqLwotICAgICk7Ci0KLSAgICBpbnQgR2V0UHJlZEFkdmFuY2VkQnkxeDEoCi0gICAgICAgIHVpbnQ4ICpjX3ByZXYsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywgICAgICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCi0gICAgICAgIGludCBwcmVkX3dpZHRoX3JuZCAvKiBpICovCi0gICAgKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gZ2V0X3ByZWRfb3V0c2lkZS5jICovCi0gICAgaW50IEdldFByZWRPdXRzaWRlKAotICAgICAgICBpbnQgeHBvcywKLSAgICAgICAgaW50IHlwb3MsCi0gICAgICAgIHVpbnQ4ICpjX3ByZXYsCi0gICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLAotICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgIGludCBybmQxLAotICAgICAgICBpbnQgcHJlZF93aWR0aAotICAgICk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGZpbmRfcG12c0VyclJlcy5jICovCi0gICAgdm9pZCBtdl9wcmVkaWN0aW9uKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBibG9jaywgTU9UICptdngsIE1PVCAqbXZ5KTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBtYl91dGlscy5jICovCi0gICAgdm9pZCBDb3B5X01CX2ludG9fVm9wKHVpbnQ4ICpjb21wLCBpbnQgeUNoYW5bXVtOQ09FRkZfQkxPQ0tdLCBpbnQgd2lkdGgpOwotICAgIHZvaWQgQ29weV9CX2ludG9fVm9wKHVpbnQ4ICpjb21wLCBpbnQgY0NoYW5bXSwgaW50IHdpZHRoKTsKLSAgICB2b2lkIFB1dFNLSVBQRURfTUIodWludDggKmNvbXAsIHVpbnQ4ICpjX3ByZXYsIGludCB3aWR0aCk7Ci0gICAgdm9pZCBQdXRTS0lQUEVEX0IodWludDggKmNvbXAsIHVpbnQ4ICpjX3ByZXYsIGludCB3aWR0aCk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIHZvcC5jICovCi0gICAgUFZfU1RBVFVTIERlY29kZUdPVkhlYWRlcihCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtLCB1aW50MzIgKnRpbWVfYmFzZSk7Ci0gICAgUFZfU1RBVFVTIERlY29kZVZPTEhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgbGF5ZXIpOwotICAgIFBWX1NUQVRVUyBEZWNvZGVWT1BIZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgVm9wICpjdXJyVm9wLCBCb29sIHVzZV9leHRfdGllbXN0YW1wKTsKLSAgICBQVl9TVEFUVVMgRGVjb2RlU2hvcnRIZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgVm9wICpjdXJyVm9wKTsKLSAgICBQVl9TVEFUVVMgUFZfRGVjb2RlVm9wKFZpZGVvRGVjRGF0YSAqdmlkZW8pOwotICAgIHVpbnQzMiBDYWxjVm9wRGlzcGxheVRpbWUoVm9sICpjdXJyVm9sLCBWb3AgKmN1cnJWb3AsIGludCBzaG9ydFZpZGVvSGVhZGVyKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gcG9zdF9wcm9jLmMgKi8KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICB2b2lkIEgyNjNfRGVibG9jayh1aW50OCAqcmVjLCAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50MTYgKlFQX3N0b3JlLCB1aW50OCAqbW9kZSwgaW50IGNociwgaW50IFQpOwotI2VuZGlmCi0gICAgaW50ICBQb3N0UHJvY1NlbWFwaG9yZShpbnQxNiAqcV9ibG9jayk7Ci0gICAgdm9pZCBQb3N0RmlsdGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBmaWxlcl90eXBlLCB1aW50OCAqb3V0cHV0KTsKLSAgICB2b2lkIEZpbmRNYXhNaW4odWludDggKnB0ciwgaW50ICptaW4sIGludCAqbWF4LCBpbnQgaW5jcik7Ci0gICAgdm9pZCBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWCh1aW50OCAqaW1nLCBpbnQgaW5jciwgaW50IHRocmVzLCBpbnQgbXhkZik7Ci0gICAgdm9pZCBBZGFwdGl2ZVNtb290aF9Ob01NWCh1aW50OCAqUmVjX1ksIGludCB2MCwgaW50IGgwLCBpbnQgdl9ibGssIGludCBoX2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHIsIGludCB3aWR0aCwgaW50IG1heF9kaWZmKTsKLSAgICB2b2lkIERlcmluZ2luZ19MdW1hKHVpbnQ4ICpSZWNfWSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQxNiAqUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29tYmluZWQsIHVpbnQ4ICpwcF9tb2QpOwotICAgIHZvaWQgRGVyaW5naW5nX0Nocm9tYSh1aW50OCAqUmVjX0MsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50MTYgKlFQX3N0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29tYmluZWQsIHVpbnQ4ICpwcF9tb2QpOwotICAgIHZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlcih1aW50OCAqcmVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludDE2ICpRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNociwgdWludDggKnBwX21vZCk7Ci0gICAgdm9pZCBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyX05vU29mdERlYmxvY2tpbmcodWludDggKnJlYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQxNiAqUVBfc3RvcmUsCi0gICAgICAgICAgICBpbnQgY2hyLCB1aW50OCAqcHBfbW9kKTsKLSAgICB2b2lkIENvbWJpbmVkSG9yelZlcnRSaW5nRmlsdGVyKHVpbnQ4ICpyZWMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2ICpRUF9zdG9yZSwgaW50IGNociwgdWludDggKnBwX21vZCk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGNvbmNlYWwuYyAqLwotICAgIHZvaWQgQ29uY2VhbFRleHR1cmVfSShWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQzMiBzdGFydEZpcnN0UGFydGl0aW9uLCBpbnQgbWJfc3RhcnQsIGludCBtYl9zdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xpY2VfY291bnRlcik7Ci0gICAgdm9pZCBDb25jZWFsVGV4dHVyZV9QKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBtYl9zdGFydCwgaW50IG1iX3N0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZV9jb3VudGVyKTsKLSAgICB2b2lkIENvbmNlYWxQYWNrZXQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IG1iX3N0YXJ0LCBpbnQgbWJfc3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsaWNlX2NvdW50ZXIpOwotICAgIHZvaWQgQ29weVZvcE1CKFZvcCAqY3VyciwgdWludDggKnByZXYsIGludCBtYm51bSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotICAgIC8qIGRlZmluZSBpbiB2bGNfZGVxdWFudC5jICwgIDA5LzE4LzIwMDAqLwotI2lmZGVmIFBWX1NVUFBPUlRfTUFJTl9QUk9GSUxFCi0gICAgaW50IFZsY0RlcXVhbnRNcGVnSW50cmFCbG9jayh2b2lkICp2aWRlbywgaW50IGNvbXAsIGludCBzd2l0Y2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpiaXRtYXBjb2wsIHVpbnQ4ICpiaXRtYXByb3cpOwotICAgIGludCBWbGNEZXF1YW50TXBlZ0ludGVyQmxvY2sodm9pZCAqdmlkZW8sIGludCBjb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKmJpdG1hcGNvbCwgdWludDggKmJpdG1hcHJvdyk7Ci0jZW5kaWYKLSAgICBpbnQgVmxjRGVxdWFudEgyNjNJbnRyYUJsb2NrKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBjb21wLCBpbnQgc3dpdGNoZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqYml0bWFwY29sLCB1aW50OCAqYml0bWFwcm93KTsKLSAgICBpbnQgVmxjRGVxdWFudEgyNjNJbnRyYUJsb2NrX1NIKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBjb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKmJpdG1hcGNvbCwgdWludDggKmJpdG1hcHJvdyk7Ci0gICAgaW50IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayhWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpiaXRtYXBjb2wsIHVpbnQ4ICpiaXRtYXByb3cpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRU5ECi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjA1MGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSNpbmNsdWRlICAgICJtb3Rpb25fY29tcC5oIgotI2luY2x1ZGUgIm1idHlwZV9tb2RlLmgiCi1jb25zdCBzdGF0aWMgaW50IFNUUkVOR1RIX3RhYltdID0gezAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTJ9OwotI2VuZGlmCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBQb3N0RmlsdGVyKAotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8sCi0gICAgaW50IGZpbHRlcl90eXBlLAotICAgIHVpbnQ4ICpvdXRwdXQpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQ4ICpwcF9tb2Q7Ci0gICAgaW50MTYgKlFQX3N0b3JlOwotICAgIGludCBjb21iaW5lZF93aXRoX2RlYmxvY2tfZmlsdGVyOwotICAgIGludCBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgICBpbnQzMiBzaXplOwotICAgIGludCBzb2Z0RGVibG9ja2luZzsKLSAgICB1aW50OCAqZGVjb2RlZEZyYW1lID0gdmlkZW8tPnZpZGVvRGVjQ29udHJvbHMtPm91dHB1dEZyYW1lOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgd2lkdGggPSB2aWRlby0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gdmlkZW8tPmhlaWdodDsKLSAgICBzaXplID0gKGludDMyKXdpZHRoICogaGVpZ2h0OwotCi0gICAgb3NjbF9tZW1jcHkob3V0cHV0LCBkZWNvZGVkRnJhbWUsIHNpemUpOwotICAgIG9zY2xfbWVtY3B5KG91dHB1dCArIHNpemUsIGRlY29kZWRGcmFtZSArIHNpemUsIChzaXplID4+IDIpKTsKLSAgICBvc2NsX21lbWNweShvdXRwdXQgKyBzaXplICsgKHNpemUgPj4gMiksIGRlY29kZWRGcmFtZSArIHNpemUgKyAoc2l6ZSA+PiAyKSwgKHNpemUgPj4gMikpOwotCi0gICAgaWYgKGZpbHRlcl90eXBlID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIFRoZSBzb2Z0RGVjb2RpbmcgY3V0b2ZmIGNvcnJlc3BvbmRzIHRvIH45MzAwMCBicHMgZm9yIFFDSUYgMTVmcHMgY2xpcCAgKi8KLSAgICBpZiAoUFZHZXREZWNCaXRyYXRlKHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzKSA+ICgxMDAqdmlkZW8tPmZyYW1lUmF0ZSooc2l6ZSA+PiAxMikpKSAgLy8gTUNfc29mRGVibG9jawotICAgICAgICBzb2Z0RGVibG9ja2luZyA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgc29mdERlYmxvY2tpbmcgPSBUUlVFOwotCi0gICAgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlciA9IGZpbHRlcl90eXBlICYgUFZfREVCTE9DSzsKLSAgICBRUF9zdG9yZSA9IHZpZGVvLT5RUE1COwotCi0gICAgLyogTHVtYSAqLwotICAgIHBwX21vZCA9IHZpZGVvLT5wc3RwcmNUeXBDdXI7Ci0KLSAgICBpZiAoKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykgJiYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKSkKLSAgICB7Ci0gICAgICAgIENvbWJpbmVkSG9yelZlcnRSaW5nRmlsdGVyKG91dHB1dCwgd2lkdGgsIGhlaWdodCwgUVBfc3RvcmUsIDAsIHBwX21vZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzb2Z0RGVibG9ja2luZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyKG91dHB1dCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXJfTm9Tb2Z0RGVibG9ja2luZyhvdXRwdXQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykKLSAgICAgICAgewotICAgICAgICAgICAgRGVyaW5naW5nX0x1bWEob3V0cHV0LCB3aWR0aCwgaGVpZ2h0LCBRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENocm9tYSAqLwotCi0gICAgcHBfbW9kICs9IChuVG90YWxNQiA8PCAyKTsKLSAgICBvdXRwdXQgKz0gc2l6ZTsKLQotICAgIGlmICgoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKSAmJiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpKQotICAgIHsKLSAgICAgICAgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNvZnREZWJsb2NraW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXJpbmdpbmdfQ2hyb21hKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcF9tb2QgKz0gblRvdGFsTUI7Ci0gICAgb3V0cHV0ICs9IChzaXplID4+IDIpOwotCi0gICAgaWYgKChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spICYmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykpCi0gICAgewotICAgICAgICBDb21iaW5lZEhvcnpWZXJ0UmluZ0ZpbHRlcihvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLCAoaW50KShoZWlnaHQgPj4gMSksIFFQX3N0b3JlLCAoaW50KSAxLCBwcF9tb2QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc29mdERlYmxvY2tpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcihvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyX05vU29mdERlYmxvY2tpbmcob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlcmluZ2luZ19DaHJvbWEob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlciwgcHBfbW9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qICBzd2FwIGN1cnJlbnQgcHBfbW9kIHRvIHByZXZfZnJhbWUgcHBfbW9kICovCi0gICAgcHBfbW9kID0gdmlkZW8tPnBzdHByY1R5cEN1cjsKLSAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gdmlkZW8tPnBzdHByY1R5cFBydjsKLSAgICB2aWRlby0+cHN0cHJjVHlwUHJ2ID0gcHBfbW9kOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLXZvaWQgSDI2M19EZWJsb2NrKHVpbnQ4ICpyZWMsCi0gICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgaW50MTYgKlFQX3N0b3JlLAotICAgICAgICAgICAgICAgICAgdWludDggKm1vZGUsCi0gICAgICAgICAgICAgICAgICBpbnQgY2hyLCBpbnQgYW5uZXhfVCkKLXsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50IGksIGosIGs7Ci0gICAgdWludDggKnJlY195OwotICAgIGludCB0bXB2YXI7Ci0gICAgaW50IG1ibnVtLCBzdHJlbmd0aCwgQV9ELCBkMV8yLCBkMSwgZDIsIEEsIEIsIEMsIEQsIGJfc2l6ZTsKLSAgICBpbnQgZCwgb2Zmc2V0LCBuTUJQZXJSb3csIG5NQlBlckNvbCwgd2lkdGgyID0gKHdpZHRoIDw8IDEpOwotICAgIC8qIE1BS0UgU1VSRSBJLVZPUCBJTlRSQSBNQUNST0JMT0NLUyBBUkUgU0VUIFRPIE5PTi1TS0lQUEVEIE1PREUqLwotICAgIG1ibnVtID0gMDsKLQotICAgIGlmIChjaHIpCi0gICAgewotICAgICAgICBuTUJQZXJSb3cgPSB3aWR0aCA+PiAzOwotICAgICAgICBuTUJQZXJDb2wgPSBoZWlnaHQgPj4gMzsKLSAgICAgICAgYl9zaXplID0gODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbk1CUGVyUm93ID0gd2lkdGggPj4gNDsKLSAgICAgICAgbk1CUGVyQ29sID0gaGVpZ2h0ID4+IDQ7Ci0gICAgICAgIGJfc2l6ZSA9IDE2OwotICAgIH0KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWRVJUSUNBTCBGSUxURVJJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiB2ZXJ0aWNhbCBmaWx0ZXJpbmcgb2YgbWlkIHNlY3Rpb25zIG5vIG5lZWQgdG8gY2hlY2sgbmVpZ2hib3JpbmcgUVAncyBldGMgKi8KLSAgICBpZiAoIWNocikKLSAgICB7Ci0gICAgICAgIHJlY195ID0gcmVjICsgKHdpZHRoIDw8IDMpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGhlaWdodCA+PiA0KTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKHdpZHRoID4+IDQpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGsgPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGggPSBTVFJFTkdUSF90YWJbUVBfc3RvcmVbbWJudW1dXTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGstLSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQSA9ICAqKHJlY195IC0gd2lkdGgyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEQgPSAqKHJlY195ICsgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQV9EID0gQSAtIEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDID0gKnJlY195OwotICAgICAgICAgICAgICAgICAgICAgICAgQiA9ICoocmVjX3kgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkID0gKCgoQyAtIEIpIDw8IDIpICsgQV9EKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLSgtZCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPCAtKHN0cmVuZ3RoIDw8IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkMSA8IC1zdHJlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLWQxIC0gKHN0cmVuZ3RoIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gLWQxID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBkID4+IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQxID4gKHN0cmVuZ3RoIDw8IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkMSA+IHN0cmVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAoc3RyZW5ndGggPDwgMSkgLSBkMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IGQxID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBX0QgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLSgtQV9EID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA8IC1kMV8yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSAtZDFfMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBBX0QgPj4gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPiBkMV8yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBkMV8yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIHdpZHRoMikgPSBBIC0gZDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBCICsgZDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXB2YXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gd2lkdGgpID0gdG1wdmFyOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gQyAtIGQxOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQotICAgICAgICAgICAgICAgICAgICAgICAgKnJlY195ID0gdG1wdmFyOwotICAgICAgICAgICAgICAgICAgICAgICAgKihyZWNfeSArIHdpZHRoKSA9IEQgKyBkMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY195Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjX3kgKz0gYl9zaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYm51bSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVjX3kgKz0gKDE1ICogd2lkdGgpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBWRVJUSUNBTCBib3VuZGFyeSBibG9ja3MgKi8KLQotCi0gICAgcmVjX3kgPSByZWMgKyB3aWR0aCAqIGJfc2l6ZTsKLQotICAgIG1ibnVtID0gbk1CUGVyUm93OwotICAgIGZvciAoaSA9IDA7IGkgPCBuTUJQZXJDb2wgLSAxOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbk1CUGVyUm93OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQgfHwgbW9kZVttYm51bSAtIG5NQlBlclJvd10gIT0gTU9ERV9TS0lQUEVEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGsgPSBiX3NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiWyhhbm5leF9UID8gIE1RX2Nocm9tYV9RUF90YWJsZVtRUF9zdG9yZVttYm51bV1dIDogUVBfc3RvcmVbbWJudW1dKV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiWyhhbm5leF9UID8gIE1RX2Nocm9tYV9RUF90YWJsZVtRUF9zdG9yZVttYm51bSAtIG5NQlBlclJvd11dIDogUVBfc3RvcmVbbWJudW0gLSBuTUJQZXJSb3ddKV07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGstLSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEEgPSAgKihyZWNfeSAtIHdpZHRoMik7Ci0gICAgICAgICAgICAgICAgICAgIEQgPSAgKihyZWNfeSArIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgQV9EID0gQSAtIEQ7Ci0gICAgICAgICAgICAgICAgICAgIEMgPSAqcmVjX3k7Ci0gICAgICAgICAgICAgICAgICAgIEIgPSAqKHJlY195IC0gd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBkID0gKCgoQyAtIEIpIDw8IDIpICsgQV9EKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLSgtZCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA8IC0oc3RyZW5ndGggPDwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAtc3RyZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAtZDEgLSAoc3RyZW5ndGggPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gLWQxID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMSA9IGQgPj4gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA+IChzdHJlbmd0aCA8PCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkMSA+IHN0cmVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gKHN0cmVuZ3RoIDw8IDEpIC0gZDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gZDEgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChBX0QgPCAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC0oLUFfRCA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA8IC1kMV8yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLWQxXzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMiA9IEFfRCA+PiAyOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyID4gZDFfMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGQxXzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gd2lkdGgyKSA9IEEgLSBkMjsKLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gQiArIGQxOwotICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXB2YXIpCi0gICAgICAgICAgICAgICAgICAgICoocmVjX3kgLSB3aWR0aCkgPSB0bXB2YXI7Ci0gICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEMgLSBkMTsKLSAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQotICAgICAgICAgICAgICAgICAgICAqcmVjX3kgPSB0bXB2YXI7Ci0gICAgICAgICAgICAgICAgICAgICoocmVjX3kgKyB3aWR0aCkgPSBEICsgZDI7Ci0gICAgICAgICAgICAgICAgICAgIHJlY195Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlY195ICs9IGJfc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ibnVtKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmVjX3kgKz0gKChiX3NpemUgLSAxKSAqIHdpZHRoKTsKLQotICAgIH0KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKkhPUklaT05UQUwgRklMVEVSSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIG1ibnVtID0gMDsKLSAgICAvKiBIT1JJWk9OVEFMIElOTkVSICovCi0gICAgaWYgKCFjaHIpCi0gICAgewotICAgICAgICByZWNfeSA9IHJlYyArIDg7Ci0gICAgICAgIG9mZnNldCA9IHdpZHRoICogYl9zaXplIC0gYl9zaXplOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuTUJQZXJDb2w7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5NQlBlclJvdzsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrID0gMTY7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiW1FQX3N0b3JlW21ibnVtXV07Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEEgPSAgKihyZWNfeSAtIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRCA9ICAqKHJlY195ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBX0QgPSBBIC0gRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEMgPSAqcmVjX3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCID0gKihyZWNfeSAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgoKEMgLSBCKSA8PCAyKSArIEFfRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC0oLWQgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQxIDwgLShzdHJlbmd0aCA8PCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAtc3RyZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC1kMSAtIChzdHJlbmd0aCA8PCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IC1kMSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gZCA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA+IChzdHJlbmd0aCA8PCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPiBzdHJlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gKHN0cmVuZ3RoIDw8IDEpIC0gZDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxXzIgPSBkMSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQV9EIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC0oLUFfRCA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPCAtZDFfMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLWQxXzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gQV9EID4+IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyID4gZDFfMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gZDFfMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgLSAyKSA9IEEgLSBkMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEIgKyBkMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKLSAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgLSAxKSA9IHRtcHZhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEMgLSBkMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKLSAgICAgICAgICAgICAgICAgICAgICAgICpyZWNfeSA9IHRtcHZhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgKyAxKSA9IEQgKyBkMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY195ICs9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlY195IC09IG9mZnNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjX3kgKz0gYl9zaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYm51bSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVjX3kgKz0gKDE1ICogd2lkdGgpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgLyogSE9SSVpPTlRBTCBFREdFICovCi0gICAgcmVjX3kgPSByZWMgKyBiX3NpemU7Ci0gICAgb2Zmc2V0ID0gd2lkdGggKiBiX3NpemUgLSBiX3NpemU7Ci0gICAgbWJudW0gPSAxOwotICAgIGZvciAoaSA9IDA7IGkgPCBuTUJQZXJDb2w7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBuTUJQZXJSb3cgLSAxOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQgfHwgbW9kZVttYm51bS0xXSAhPSBNT0RFX1NLSVBQRUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgayA9IGJfc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAobW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGggPSBTVFJFTkdUSF90YWJbKGFubmV4X1QgPyAgTVFfY2hyb21hX1FQX3RhYmxlW1FQX3N0b3JlW21ibnVtXV0gOiBRUF9zdG9yZVttYm51bV0pXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGggPSBTVFJFTkdUSF90YWJbKGFubmV4X1QgPyAgTVFfY2hyb21hX1FQX3RhYmxlW1FQX3N0b3JlW21ibnVtIC0gMV1dIDogUVBfc3RvcmVbbWJudW0gLSAxXSldOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBID0gICoocmVjX3kgLSAyKTsKLSAgICAgICAgICAgICAgICAgICAgRCA9ICAqKHJlY195ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIEFfRCA9IEEgLSBEOwotICAgICAgICAgICAgICAgICAgICBDID0gKnJlY195OwotICAgICAgICAgICAgICAgICAgICBCID0gKihyZWNfeSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBkID0gKCgoQyAtIEIpIDw8IDIpICsgQV9EKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLSgtZCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA8IC0oc3RyZW5ndGggPDwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAtc3RyZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAtZDEgLSAoc3RyZW5ndGggPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gLWQxID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMSA9IGQgPj4gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA+IChzdHJlbmd0aCA8PCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkMSA+IHN0cmVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gKHN0cmVuZ3RoIDw8IDEpIC0gZDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gZDEgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChBX0QgPCAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC0oLUFfRCA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA8IC1kMV8yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLWQxXzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMiA9IEFfRCA+PiAyOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyID4gZDFfMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGQxXzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gMikgPSBBIC0gZDI7Ci0gICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEIgKyBkMTsKLSAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQotICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gMSkgPSB0bXB2YXI7Ci0gICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEMgLSBkMTsKLSAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQotICAgICAgICAgICAgICAgICAgICAqcmVjX3kgPSB0bXB2YXI7Ci0gICAgICAgICAgICAgICAgICAgICoocmVjX3kgKyAxKSA9IEQgKyBkMjsKLSAgICAgICAgICAgICAgICAgICAgcmVjX3kgKz0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlY195IC09IG9mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWNfeSArPSBiX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYm51bSsrOwotICAgICAgICB9Ci0gICAgICAgIHJlY195ICs9ICgod2lkdGggKiAoYl9zaXplIC0gMSkpICsgYl9zaXplKTsKLSAgICAgICAgbWJudW0rKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jX3NlbWFwaG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X3Byb2Nfc2VtYXBob3JlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiYzZiZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X3Byb2Nfc2VtYXBob3JlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBxX2Jsb2NrID0gcG9pbnRlciB0byBidWZmZXIgb2YgaW52ZXJzZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBvZiB0eXBlCi0gICAgICAgICAgICAgIGludCBmb3IgaW50cmEtVk9QIG1vZGUgb3IgYnVmZmVyIG9mIHJlc2lkdWFsIGRhdGEgb2YgdHlwZSBpbnQKLSAgICAgICAgICAgICAgZm9yIGludGVyLVZPUCBtb2RlCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIHBvc3Rtb2RlID0gcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSB3aXRoIHRoZSB2ZXJ0aWNhbCBkZWJsb2NraW5nLAotICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBkZWJsb2NraW5nLCBhbmQgZGVyaW5naW5nIGJpdHMgc2V0IHVwIGFjY29yZGluZ2x5Ci0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OCi0KLSBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIHBvc3Rtb2RlIHNlbWFwaG9yZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlCi0gYnVmZmVyIHBvaW50ZWQgdG8gYnkgcV9ibG9jay4gVGhlIGZ1bmN0aW9uIHN0YXJ0cyBvdXQgd2l0aCB0aGUgYXNzdW1wdGlvbgotIHRoYXQgYWxsIGVudHJpZXMgb2YgcV9ibG9jaywgZXhjZXB0IGZvciB0aGUgZmlyc3QgZW50cnkgKHFfYmxvY2tbMF0pLCBhcmUKLSB6ZXJvLiBUaGlzIGNhc2UgY2FuIGluZHVjZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBibG9ja2luZyBhcnRpZmFjdHMsCi0gdGhlcmVmb3JlLCBib3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRlYmxvY2tpbmcgYml0cyBhcmUgZW5hYmxlZC4KLQotIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdGVzdGVkIHdoZW4gc2V0dGluZyB1cCB0aGUgaG9yaXpvbnRhbC92ZXJ0aWNhbAotIGRlYmxvY2tpbmcgYW5kIGRlcmluZ2luZyBiaXRzOgotIDEuIFdoZW4gb25seSB0aGUgZWxlbWVudHMgb2YgdGhlIHRvcCByb3cgb2YgdGhlIEJfU0laRSB4IEJfU0laRSBibG9jawotICAgIChxX2Jsb2NrW25dLCBuID0gMCwuLi4sIEJfU0laRS0xKSBhcmUgbm9uLXplcm8sIHZlcnRpY2FsIGJsb2NraW5nIGFydGlmYWN0cwotICAgIG1heSByZXN1bHQsIHRoZXJlZm9yZSwgb25seSB0aGUgdmVydGljYWwgZGVibG9ja2luZyBiaXQgaXMgZW5hYmxlZC4KLSAgICBPdGhlcndpc2UsIHRoZSB2ZXJ0aWNhbCBkZWJsb2NraW5nIGJpdCBpcyBkaXNhYmxlZC4KLSAyLiBXaGVuIG9ubHkgdGhlIGVsZW1lbnRzIG9mIHRoZSBmYXIgbGVmdCBjb2x1bW4gb2YgdGhlIEJfU0laRSB4IEJfU0laRSBibG9jawotICAgIChxX2Jsb2NrW24qQl9TSVpFXSwgbiA9IDAsIC4uLiwgQl9TSVpFLTEpIGFyZSBub24temVybywgaG9yaXpvbnRhbCBibG9ja2luZwotICAgIGFydGlmYWN0cyBtYXkgcmVzdWx0LCB0aGVyZWZvcmUsIG9ubHkgdGhlIGhvcml6b250YWwgZGVibG9ja2luZyBiaXQgaXMKLSAgICBlbmFibGVkLiBPdGhlcndpc2UsIHRoZSBob3Jpem9udGFsIGRlYmxvY2tpbmcgYml0IGlzIGRpc2FibGVkLgotIDMuIElmIGFueSBub24temVybyBlbGVtZW50cyBleGlzdCBpbiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLAotICAgIHFfYmxvY2tbMV0sIG9yIHFfYmxvY2tbQl9TSVpFXSwgdGhlIGRlcmluZ2luZyBiaXQgaXMgZW5hYmxlZC4gT3RoZXJ3aXNlLAotICAgIGl0IGlzIGRpc2FibGVkLgotCi0gVGhlIDMgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBwb3N0bW9kZSBkZWZpbmVzIHZlcnRpY2FsIG9yIGhvcml6b250YWwKLSBkZWJsb2NraW5nIGFuZCBkZXJpbmdpbmcuCi0KLSBUaGUgdmFsaWQgdmFsdWVzIGFyZSBzaG93biBiZWxvdzoKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgfCBFbmFibGVkIHwgRGlzYWJsZWQgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8IFZlcnRpY2FsIERlYmxvY2tpbmcgKEJpdCAjMCkgICB8ICAgIDEgICAgfCAgICAgMCAgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgSG9yaXpvbnRhbCBEZWJsb2NraW5nIChCaXQgIzEpIHwgICAgMSAgICB8ICAgICAwICAgIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCBEZXJpbmdpbmcgKEJpdCAjMikgICAgICAgICAgICAgfCAgICAxICAgIHwgICAgIDAgICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJtcDRkZWYuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IFBvc3RQcm9jU2VtYXBob3JlKAotICAgIGludDE2ICpxX2Jsb2NrKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgaSwgajsKLQotICAgIC8qIFNldCBkZWZhdWx0IHZhbHVlIHRvIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGRlYmxvY2tpbmcgZW5hYmxlZCAqLwotICAgIC8qIEluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IG9ubHkgcV9ibG9ja1swXSBlbGVtZW50IGlzIG5vbi16ZXJvLCAqLwotICAgIC8qIHRoZXJlZm9yZSwgdmVydGljYWwgYW5kIGhvcml6b250YWwgZGVibG9ja2luZyBiaXRzIGFyZSBzZXQgdG8gMSAqLwotICAgIGludCBwb3N0bW9kZSA9IDB4MzsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogVmVydGljYWwgZGVibG9ja2luZyBiaXQgaXMgZW5hYmxlZCB3aGVuIG9ubHkgdGhlIGVudGlyZSB0b3Agcm93IG9mICAgKi8KLSAgICAvKiB0aGUgQl9TSVpFIHggQl9TSVpFIGJsb2NrLCBpLmUuLCBxX2Jsb2NrW25dLCBuID0gMCwuLi4sIEJfU0laRS0xLCAgICAqLwotICAgIC8qIGFyZSBub24temVyby4gU2luY2UgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgYWxsIGVsZW1lbnRzLCBleGNlcHQgICovCi0gICAgLyogcV9ibG9ja1swXSwgaXMgemVybywgd2UgbmVlZCB0byBjaGVjayB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIHRoZSAgKi8KLSAgICAvKiB0b3Agcm93IHRvICBkZXRlcm1pbmUgaWYgYWxsIG9yIHNvbWUgYXJlIG5vbi16ZXJvLiAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmIChxX2Jsb2NrWzFdICE9IDApCi0gICAgewotICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBxX2Jsb2NrWzBdIGFuZCBxX2Jsb2NrWzFdIGFyZSBub24temVybywgd2hpbGUgKi8KLSAgICAgICAgLyogcV9ibG9ja1tuXSwgbiA9IDIsLi4uLCBCX1NJWkUtMSwgYXJlIHplcm8uIFRoZXJlZm9yZSwgd2UgICAgICovCi0gICAgICAgIC8qIG5lZWQgdG8gZGlzYWJsZSB2ZXJ0aWNhbCBkZWJsb2NraW5nICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBwb3N0bW9kZSAmPSAweEU7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMjsgaSA8IEJfU0laRTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHFfYmxvY2tbaV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIHFfYmxvY2tbbl0sIG4gPSAyLC4uLiwgQl9TSVpFLTEsIGFyZSBub24temVyby4qLwotICAgICAgICAgICAgLyogSWYgYW55IG9mIHRoZW0gdHVybiBvdXQgdG8gYmUgbm9uLXplcm8sIHdlIG5lZWQgdG8gICAgICovCi0gICAgICAgICAgICAvKiBkaXNhYmxlIHZlcnRpY2FsIGRlYmxvY2tpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBvc3Rtb2RlICY9IDB4RTsKLQotICAgICAgICAgICAgLyogRGVyaW5naW5nIGlzIGVuYWJsZWQgaWYgYW55IG5vbnplcm8gZWxlbWVudHMgZXhpc3QgaW4gKi8KLSAgICAgICAgICAgIC8qIHBvc2l0aW9ucyBvdGhlciB0aGFuIHFfYmxvY2tbMF0sIHFfYmxvY2tbMV0gb3IgICAgICAgICovCi0gICAgICAgICAgICAvKiBxX2Jsb2NrW0JfU0laRV0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcG9zdG1vZGUgfD0gMHg0OwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEhvcml6b250YWwgZGVibG9ja2luZyBiaXQgaXMgZW5hYmxlZCB3aGVuIG9ubHkgdGhlIGVudGlyZSBmYXIgKi8KLSAgICAvKiBsZWZ0IGNvbHVtbiwgaS5lLiwgcV9ibG9ja1tuKkJfU0laRV0sIG4gPSAwLCAuLi4sIEJfU0laRS0xLCAgICovCi0gICAgLyogYXJlIG5vbi16ZXJvLiBTaW5jZSBpbml0aWFsIGFzc3VtcHRpb24gaXMgdGhhdCBhbGwgZWxlbWVudHMsICAqLwotICAgIC8qIGV4Y2VwdCBxX2Jsb2NrWzBdLCBpcyB6ZXJvLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZW1haW5pbmcgICAgKi8KLSAgICAvKiBlbGVtZW50cyBpbiB0aGUgZmFyIGxlZnQgY29sdW1uIHRvIGRldGVybWluZSBpZiBhbGwgb3Igc29tZSAgICovCi0gICAgLyogYXJlIG5vbi16ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmIChxX2Jsb2NrW0JfU0laRV0pCi0gICAgewotICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvbmx5IHFfYmxvY2tbMF0gYW5kIHFfYmxvY2tbQl9TSVpFXSBhcmUgbm9uLXplcm8sICovCi0gICAgICAgIC8qIHdoaWxlIHFfYmxvY2tbbipCX1NJWkVdLCBuID0gMiwgMywuLi4sIEJfU0laRS0xLCBhcmUgemVyby4gICAgICAgKi8KLSAgICAgICAgLyogVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGRpc2FibGUgaG9yaXpvbnRhbCBkZWJsb2NraW5nLiAgICAgICAgICAgICAqLwotICAgICAgICBwb3N0bW9kZSAmPSAweEQ7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMTY7IGkgPCBOQ09FRkZfQkxPQ0s7IGkgKz0gQl9TSVpFKQotICAgIHsKLSAgICAgICAgaWYgKHFfYmxvY2tbaV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIHFfYmxvY2tbbl0sIG4gPSAyKkJfU0laRSwuLi4sKEJfU0laRS0xKSpCX1NJWkUsICAqLwotICAgICAgICAgICAgLyogYXJlIG5vbi16ZXJvLiBJZiBhbnkgb2YgdGhlbSB0dXJuIG91dCB0byBiZSBub24temVybywgICAgICovCi0gICAgICAgICAgICAvKiB3ZSBuZWVkIHRvIGRpc2FibGUgaG9yaXpvbnRhbCBkZWJsb2NraW5nLiAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBvc3Rtb2RlICY9IDB4RDsKLQotICAgICAgICAgICAgLyogRGVyaW5naW5nIGlzIGVuYWJsZWQgaWYgYW55IG5vbnplcm8gZWxlbWVudHMgZXhpc3QgaW4gKi8KLSAgICAgICAgICAgIC8qIHBvc2l0aW9ucyBvdGhlciB0aGFuIHFfYmxvY2tbMF0sIHFfYmxvY2tbMV0gb3IgICAgICAgICovCi0gICAgICAgICAgICAvKiBxX2Jsb2NrW0JfU0laRV0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcG9zdG1vZGUgfD0gMHg0OwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9ubHkgdGhlIGZpcnN0IHJvdyBhbmQgZmFyIGxlZnQgY29sdW1uIGVsZW1lbnRzICovCi0gICAgLyogaGF2ZSBiZWVuIHRlc3RlZC4gSWYgZGVyaW5naW5nIGJpdCBpcyBzdGlsbCBub3Qgc2V0IGF0IHRoaXMgICAgKi8KLSAgICAvKiBwb2ludCwgY2hlY2sgdGhlIHJlc3Qgb2YgcV9ibG9jayB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnRzICAqLwotICAgIC8qIGFyZSBub24temVyby4gSWYgYWxsIGVsZW1lbnRzLCBiZXNpZGVzIHFfYmxvY2tbMF0sIHFfYmxvY2tbMV0sICovCi0gICAgLyogb3IgcV9ibG9ja1tCX1NJWkVdIGFyZSBub24temVybywgZGVyaW5naW5nIGJpdCBtdXN0IGJlIHNldCAgICAgKi8KLSAgICBpZiAoKHBvc3Rtb2RlICYgMHg0KSA9PSAwKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMTsgaSA8IEJfU0laRTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgQl9TSVpFOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHFfYmxvY2tbKGk8PDMpK2pdKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgcV9ibG9ja1swXSBhbmQgYW5vdGhlciBxX2Jsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgYXJlIG5vbi16ZXJvLCB0aGVyZWZvcmUsIHdlIG5lZWQgdG8gICAqLwotICAgICAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGRlYmxvY2tpbmcgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcG9zdG1vZGUgJj0gMHhDOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIERlcmluZ2luZyBpcyBlbmFibGVkIGlmIGFueSBub256ZXJvIGVsZW1lbnRzIGV4aXN0IGluICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHBvc2l0aW9ucyBvdGhlciB0aGFuIHFfYmxvY2tbMF0sIHFfYmxvY2tbMV0gb3IgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHFfYmxvY2tbQl9TSVpFXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBvc3Rtb2RlIHw9IDB4NDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBTZXQgb3V0ZXIgRk9SIGxvb3AgY291bnQgdG8gQl9TSVpFIHRvIGdldCBvdXQgb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogb3V0ZXIgRk9SIGxvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGkgPSBCX1NJWkU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogR2V0IG91dCBvZiBpbm5lciBGT1IgbG9vcCAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuIChwb3N0bW9kZSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyMDIyMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICB4cHJlZCA9IHgtYXhpcyBjb29yZGluYXRlIG9mIHRoZSBibG9jayB1c2VkIGZvciBwcmVkaWN0aW9uIChpbnQpCi0gICAgeXByZWQgPSB5LWF4aXMgY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2sgdXNlZCBmb3IgcHJlZGljdGlvbiAoaW50KQotICAgIHBwX2RlY191ID0gcG9pbnRlciB0byB0aGUgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBmb3IgY2hyb21pbmFuY2UKLSAgICAgICAgICAgICAgICh1aW50OCkKLSAgICBwc3RwcmNUeXBQcnYgPSBwb2ludGVyIHRoZSBwcmV2aW91cyBmcmFtZSdzIHBvc3QgcHJvY2Vzc2luZyB0eXBlCi0gICAgICAgICAgICAgICAgICAgKHVpbnQ4KQotICAgIGR4ID0gaG9yaXpvbnRhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3IgKGludCkKLSAgICBkeSA9IHZlcnRpY2FsIGNvbXBvbmVudCBvZiB0aGUgbW90aW9uIHZlY3RvciAoaW50KQotICAgIG12d2lkdGggPSBudW1iZXIgb2YgYmxvY2tzIHBlciByb3cgaW4gdGhlIGx1bWluYW5jZSBWT1AgKGludCkKLSAgICBoZWlnaHQgPSBsdW1pbmFuY2UgVk9QIGhlaWdodCBpbiBwaXhlbHMgKGludCkKLSAgICBzaXplID0gdG90YWwgbnVtYmVyIG9mIHBpeGVsIGluIHRoZSBjdXJyZW50IGx1bWluYW5jZSBWT1AgKGludCkKLSAgICBtdl9sb2MgPSBmbGFnIGluZGljYXRpbmcgbG9jYXRpb24gb2YgdGhlIG1vdGlvbiBjb21wZW5zYXRlZAotICAgICAgICAgKHgseSkgcG9zaXRpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBsdW1pbmFuY2UgTUIgKGludCk7Ci0gICAgICAgICAwIC0+IGluc2lkZSBNQiwgMSAtPiBvdXRzaWRlIE1CCi0gICAgbXNrX2RlYmxvY2sgPSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBwZXJmb3JtIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgKG1za19kZWJsb2NrID0gMCkgb3Igbm90IChtc2tfZGVibG9jayA9IDEpICh1aW50OCkKLQotIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIE91dHB1dHM6Ci0gICAgTm9uZQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgcHBfZGVjX3UgY29udGVudHMgYXJlIHRoZSB1cGRhdGVkIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBkYXRhCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OCi0KLSBUaGlzIGZ1bmN0aW9ucyBwZXJmb3JtcyBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIHByb2Nlc3NpbmcKLSBhZnRlciBjaHJvbWluYW5jZSBwcmVkaWN0aW9uIGluIGludGVyZnJhbWUgcHJvY2Vzc2luZyBtb2RlLgotCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2FwaS5oIgotI2luY2x1ZGUgICAgIm1wNGRlZi5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZVTkNUSU9OIENPREUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICB2b2lkIHBwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIoCi0gICAgICAgIGludCB4cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIGludCB5cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICAgKnBwX2RlY191LCAgLyogaS9vICovCi0gICAgICAgIHVpbnQ4ICAgKnBzdHByY1R5cFBydiwgIC8qIGkgKi8KLSAgICAgICAgaW50IGR4LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgZHksICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAvKiBpICovCi0gICAgICAgIGludCBoZWlnaHQsICAgICAvKiBpICovCi0gICAgICAgIGludDMyICAgc2l6ZSwgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZfbG9jLCAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgIG1za19kZWJsb2NrIC8qIGkgKi8KLSAgICApCi0gICAgewotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgaW50IG1tdnksIG1tdngsIG5tdnksIG5tdng7Ci0gICAgICAgIHVpbnQ4ICpwcF9wcmV2MSwgKnBwX3ByZXYyLCAqcHBfcHJldjMsICpwcF9wcmV2NDsKLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICAgICAgLyogMDkvMjgvMjAwMCwgbW9kaWZ5IHNlbWFwaG9yZSBwcm9wYWdhdGlvbiB0byAqLwotICAgICAgICAvKiBhY2NvbW1vZGF0ZSBzbWFydCBpbmRleGluZyAqLwotICAgICAgICBtbXZ4ID0geHByZWQgPj4gNDsgIC8qIGJsb2NrIHggY29vciAqLwotICAgICAgICBubXZ4ID0gbW12eDsKLQotICAgICAgICBtbXZ5ID0geXByZWQgPj4gNDsgIC8qIGJsb2NrIHkgY29vciAqLwotICAgICAgICBubXZ5ID0gbW12eTsKLQotICAgICAgICAvKiBDaGVjayBpZiBNViBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICBpZiAobXZfbG9jID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBlcmZvcm0gYm91bmRhcnkgY2hlY2sgKi8KLSAgICAgICAgICAgIGlmIChubXZ4IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBubXZ4ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG5tdnggPiBtdndpZHRoIC0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBubXZ4ID0gbXZ3aWR0aCAtIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChubXZ5IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBubXZ5ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG5tdnkgPiAoaGVpZ2h0ID4+IDQpIC0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBubXZ5ID0gKGhlaWdodCA+PiA0KSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDYWxjdWxhdGUgcG9pbnRlciB0byBmaXJzdCBjaHJvbWluYW5jZSBiIHNlbWFwaG9yZXMgaW4gICAgICAgKi8KLSAgICAgICAgLyogcHN0cHJjVHlwUHJ2LCBpLmUuLCBmaXJzdCBjaHJvbWluYW5jZSBiIHNlbWFwaG9yZSBpcyBpbiAgICAgICovCi0gICAgICAgIC8qIChwc3RwcmNUeXBQcnYgKyAoc2l6ZT4+NikpLiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFNpbmNlIHRvdGFsIG51bWJlciBvZiBjaHJvbWluYW5jZSBibG9ja3MgcGVyIHJvdyBpbiBhIFZPUCAgICAqLwotICAgICAgICAvKiBpcyBoYWxmIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgbHVtaW5hbmNlIGJsb2NrcyBwZXIgcm93IGluIGEgKi8KLSAgICAgICAgLyogVk9QLCB3ZSB1c2UgKG12d2lkdGggPj4gMSkgd2hlbiBjYWxjdWxhdGluZyB0aGUgcm93IG9mZnNldC4gICovCi0gICAgICAgIHBwX3ByZXYxID0gcHN0cHJjVHlwUHJ2ICsgKHNpemUgPj4gNikgKyBubXZ4ICsgbm12eSAqIChtdndpZHRoID4+IDEpIDsKLQotICAgICAgICAvKiBDaGVjayBpZiBNViBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0gICAgICAgIC8qICAxLzUvMDEsIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGdvIG91dCBvZiBib3VuZCAqLwotICAgICAgICBpZiAoKChkeSYweEYpICE9IDApICYmIChtbXZ5ICsgMSA8IChoZWlnaHQgPj4gNCkgLSAxKSkKLSAgICAgICAgeyAgIC8qIGR5IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyBwcF9wcmV2MSBibG9jayAqLwotICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MSArIChtdndpZHRoID4+IDEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgIC8qIGR5IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLSAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAgMS81LzAxLCBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBvdXQgb2YgYm91bmQgKi8KLSAgICAgICAgaWYgKCgoZHgmMHhGKSAhPSAwKSAmJiAobW12eCArIDEgPCAobXZ3aWR0aCA+PiAxKSAtIDEpKQotICAgICAgICB7ICAgLyogZHggaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgLyogcHBfcHJldjIgaXMgdGhlIGJsb2NrIHRvIHRoZSByaWdodCBvZiBwcF9wcmV2MSBibG9jayAqLwotICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MSArIDE7Ci0KLSAgICAgICAgICAgIC8qIHBwX3ByZXY0IGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAvKiBiZWxvdyBwcF9wcmV2MSBibG9jayAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHBfcHJldjQgPSBwcF9wcmV2MyArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgLyogZHggaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxOwotICAgICAgICAgICAgcHBfcHJldjQgPSBwcF9wcmV2MzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFkdmFuY2Ugb2Zmc2V0IHRvIGxvY2F0aW9uIG9mIGZpcnN0IENocm9taW5hbmNlIFIgc2VtYXBob3JlIGluICovCi0gICAgICAgIC8qIHBzdHByY1R5cFBydi4gU2luY2UgdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gYSBDaHJvbWluYW5jZSBWT1AgICovCi0gICAgICAgIC8qIGlzIChudW1iZXIgb2YgcGl4ZWxzIGluIEx1bWluYW5jZSBWT1AvNCksIGFuZCB0aGVyZSBhcmUgNjQgICAgICovCi0gICAgICAgIC8qIHBpeGVscyBpbiBhbiA4eDggQ2hyb21pbmFuY2UgYmxvY2ssIHRoZSBvZmZzZXQgY2FuIGJlICAgICAgKi8KLSAgICAgICAgLyogY2FsY3VsYXRlZCBhczogICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogIG12X2xvYyA9IChudW1iZXIgb2YgcGl4ZWxzIGluIEx1bWluYW5jZSBWT1AvKDQqNjQpKSAgICovCi0gICAgICAgIC8qICAgICAgICAgPSBzaXplLzI1NiA9IHNpemU+PjggICAgICAgICAgICAgICAqLwotICAgICAgICBtdl9sb2MgPSAoc2l6ZSA+PiA4KTsKLQotICAgICAgICAvKiAgMTEvMy8wMCwgY2hhbmdlIHRoZSBwcm9wYWdhdGlvbiBmb3IgZGVibG9ja2luZyAqLwotICAgICAgICBpZiAobXNrX2RlYmxvY2sgPT0gMCkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKiBEZWJsb2NraW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgQ2hyb21pbmFuY2UgKi8KLSAgICAgICAgICAgIC8qIGIgc2VtYXBob3JlcyAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAqKHBwX2RlY191KSA9IDA7Ci0KLSAgICAgICAgICAgIC8qIEFkdmFuY2Ugb2Zmc2V0IHRvIHBvaW50IHRvIENocm9taW5hbmNlIHIgc2VtYXBob3JlcyAqLwotICAgICAgICAgICAgcHBfZGVjX3UgKz0gbXZfbG9jOwotCi0gICAgICAgICAgICAvKiBEZWJsb2NraW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgQ2hyb21pbmFuY2UgKi8KLSAgICAgICAgICAgIC8qIHIgc2VtYXBob3JlcyAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAqKHBwX2RlY191KSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBEZXJpbmdpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGZvciBDaHJvbWluYW5jZSBCIGJsb2NrICovCi0gICAgICAgICAgICBpZiAoKCoocHBfZGVjX3UpJjQpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKihwcF9kZWNfdSkgfD0gKCgqKHBwX3ByZXYxKSB8ICoocHBfcHJldjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjMpIHwgKihwcF9wcmV2NCkpICYgMHg0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQWR2YW5jZSBvZmZzZXQgdG8gcG9pbnQgdG8gQ2hyb21pbmFuY2UgciBzZW1hcGhvcmVzICovCi0gICAgICAgICAgICBwcF9kZWNfdSArPSBtdl9sb2M7Ci0gICAgICAgICAgICBwcF9wcmV2MSArPSBtdl9sb2M7Ci0gICAgICAgICAgICBwcF9wcmV2MiArPSBtdl9sb2M7Ci0gICAgICAgICAgICBwcF9wcmV2MyArPSBtdl9sb2M7Ci0gICAgICAgICAgICBwcF9wcmV2NCArPSBtdl9sb2M7Ci0KLSAgICAgICAgICAgIC8qIERlcmluZ2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIENocm9taW5hbmNlIFIgKi8KLSAgICAgICAgICAgIGlmICgoKihwcF9kZWNfdSkmNCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqKHBwX2RlY191KSB8PSAoKCoocHBfcHJldjEpIHwgKihwcF9wcmV2MikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwcF9wcmV2MykgfCAqKHBwX3ByZXY0KSkgJiAweDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BwX3NlbWFwaG9yZV9sdW1hLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BwX3NlbWFwaG9yZV9sdW1hLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNhMWViZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfbHVtYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgeHByZWQgPSB4LWF4aXMgY29vcmRpbmF0ZSBvZiB0aGUgTUIgdXNlZCBmb3IgcHJlZGljdGlvbiAoaW50KQotICAgIHlwcmVkID0geS1heGlzIGNvb3JkaW5hdGUgb2YgdGhlIE1CIHVzZWQgZm9yIHByZWRpY3Rpb24gKGludCkKLSAgICBwcF9kZWNfeSA9IHBvaW50ZXIgdG8gdGhlIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgZm9yIGN1cnJlbnQKLSAgICAgICAgICAgbHVtaW5hbmNlIGZyYW1lICh1aW50OCkKLSAgICBwc3RwcmNUeXBQcnYgPSBwb2ludGVyIHRoZSBwcmV2aW91cyBmcmFtZSdzIHBvc3QgcHJvY2Vzc2luZyB0eXBlCi0gICAgICAgICAgICAgICAgICAgKHVpbnQ4KQotICAgIGxsID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIChpbnQpCi0gICAgbXZfbG9jID0gZmxhZyBpbmRpY2F0aW5nIGxvY2F0aW9uIG9mIHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQKLSAgICAgICAgICh4LHkpIHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbHVtaW5hbmNlIE1CIChpbnQpOwotICAgICAgICAgMCAtPiBpbnNpZGUgTUIsIDEgLT4gb3V0c2lkZSBNQgotICAgIGR4ID0gaG9yaXpvbnRhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3IgKGludCkKLSAgICBkeSA9IHZlcnRpY2FsIGNvbXBvbmVudCBvZiB0aGUgbW90aW9uIHZlY3RvciAoaW50KQotICAgIG12d2lkdGggPSBudW1iZXIgb2YgYmxvY2tzIHBlciByb3cgKGludCkKLSAgICB3aWR0aCA9IGx1bWluYW5jZSBWT1Agd2lkdGggaW4gcGl4ZWxzIChpbnQpCi0gICAgaGVpZ2h0ID0gbHVtaW5hbmNlIFZPUCBoZWlnaHQgaW4gcGl4ZWxzIChpbnQpCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIG1za19kZWJsb2NrID0gZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGRlYmxvY2tpbmcgaXMgdG8gYmUKLSAgICAgICAgICAgICAgcGVyZm9ybWVkIChtc2tfZGVibG9jayA9IDApIG9yIG5vdCAobXNrX2RlYmxvY2sgPQotICAgICAgICAgICAgICAxKSAodWludDgpCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBwcF9kZWNfeSBjb250ZW50cyBhcmUgdGhlIHVwZGF0ZWQgc2VtYXBvaG9yZSBwcm9wYWdhdGlvbiBkYXRhCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OCi0KLSBUaGlzIGZ1bmN0aW9ucyBwZXJmb3JtcyBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIHByb2Nlc3NpbmcKLSBhZnRlciBsdW1pbmFuY2UgcHJlZGljdGlvbi4KLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19hcGkuaCIKLSNpbmNsdWRlICAgICJtcDRkZWYuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGVU5DVElPTiBDT0RFCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdWludDggcHBfc2VtYXBob3JlX2x1bWEoCi0gICAgICAgIGludCB4cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIGludCB5cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICAgKnBwX2RlY195LCAgLyogaS9vICovCi0gICAgICAgIHVpbnQ4ICAgKnBzdHByY1R5cFBydiwgIC8qIGkgKi8KLSAgICAgICAgaW50ICpsbCwgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50ICptdl9sb2MsICAgIC8qIGkvbyAqLwotICAgICAgICBpbnQgZHgsICAgICAvKiBpICovCi0gICAgICAgIGludCBkeSwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12d2lkdGgsICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHdpZHRoLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGhlaWdodCAgICAgIC8qIGkgKi8KLSAgICApCi0gICAgewotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgaW50IGtrLCBtbXZ5LCBtbXZ4LCBubXZ4LCBubXZ5OwotICAgICAgICB1aW50OCAgICpwcF9wcmV2MSwgKnBwX3ByZXYyLCAqcHBfcHJldjMsICpwcF9wcmV2NDsKLSAgICAgICAgdWludDggICBtc2tfZGVibG9jayA9IDA7ICAgICAgICAvKiAgMTEvMy8wMCAqLwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgLyogSW50ZXJmcmFtZSBQcm9jZXNzaW5nIC0gMSBNViBwZXIgTUIgKi8KLQotICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBNViBwb2ludHMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKk1CX1NJWkUpKSAmJiB5cHJlZCA+PSAwICYmCi0gICAgICAgICAgICAgICAgeXByZWQgPD0gKChoZWlnaHQgPDwgMSkgLSAoMipNQl9TSVpFKSkpCi0gICAgICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiAoeCx5KSBpcyBpbnNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAgICAgICAgIC8qICAxMC8yNC8yMDAwIHBvc3RfcHJvY2Vzc2luZyBzZW1hcGhvcmUgKi8KLSAgICAgICAgICAgIC8qIGdlbmVyYXRpb24gKi8KLQotICAgICAgICAgICAgLyogIDEwLzIzLzIwMDAgbm8gYm91bmRhcnkgY2hlY2tpbmcqLwotICAgICAgICAgICAgKm12X2xvYyA9IDA7Ci0KLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBibG9jayB4IGNvb3JkaW5hdGUuIERpdmlkZSBieSAxNiBpcyBmb3IgICovCi0gICAgICAgICAgICAvKiBjb252ZXJ0aW5nIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbiB0byBibG9jayAgICAgICAgICAqLwotICAgICAgICAgICAgbW12eCA9IHhwcmVkID4+IDQ7Ci0KLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBibG9jayB5IGNvb3JkaW5hdGUuIERpdmlkZSBieSAxNiBpcyBmb3IgKi8KLSAgICAgICAgICAgIC8qIGNvbnZlcnRpbmcgaGFsZi1waXhlbCByZXNvbHV0aW9uIHRvIGJsb2NrICAgICAgICAgKi8KLSAgICAgICAgICAgIG1tdnkgPSB5cHJlZCA+PiA0OwotCi0gICAgICAgICAgICAvKiBGaW5kIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgbG9jYXRpb24gZm9yIGJsb2NrICovCi0gICAgICAgICAgICAvKiB1c2VkIGZvciBwcmVkaWN0aW9uLCBpLmUuLCAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogcHBfcHJldjEgPSAmcHN0cHJjVHlwUHJ2W21tdnkqbXZ3aWR0aF1bbW12eF0gICAgICAqLwotICAgICAgICAgICAgcHBfcHJldjEgPSBwc3RwcmNUeXBQcnYgKyBtbXZ4ICsgbW12eSAqIG12d2lkdGg7Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIGlmIE1WIGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLSAgICAgICAgICAgIGlmICgoZHgmMHhGKSAhPSAwKQotICAgICAgICAgICAgeyAgIC8qIGR4IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MiBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mICovCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2sgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjEgKyAxOwotCi0gICAgICAgICAgICAgICAgaWYgKChkeSYweEYpICE9IDApCi0gICAgICAgICAgICAgICAgeyAgIC8qIGR5IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjMgaXMgdGhlIGJsb2NrIGJlbG93ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyBtdndpZHRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeyAgIC8qIGR5IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHBwX3ByZXY0IGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgKi8KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBibG9jay4gICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHBfcHJldjQgPSBwcF9wcmV2MyArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7ICAgLyogZHggaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MTsKLQotICAgICAgICAgICAgICAgIGlmICgoZHkmMHhGKSAhPSAwKQotICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSBibG9jay4gICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgbXZ3aWR0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICAgICAgbXNrX2RlYmxvY2sgPSAweDM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHBfcHJldjQgPSBwcF9wcmV2MzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUGVyZm9ybSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGZvciBlYWNoICovCi0gICAgICAgICAgICAvKiBvZiB0aGUgNCBibG9ja3MgaW4gYSBNQi4gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yIChrayA9IDA7IGtrIDwgNDsga2srKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZXJpbmdpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uICovCi0gICAgICAgICAgICAgICAgaWYgKCgqKHBwX2RlY195KSAmIDQpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKHBwX2RlY195KSB8PSAoKCoocHBfcHJldjEpIHwgKihwcF9wcmV2MikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjMpIHwgKihwcF9wcmV2NCkpICYgMHg0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRGVibG9ja2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gKi8KLSAgICAgICAgICAgICAgICAvKiAgMTEvMy8wMCwgY2hhbmdlIHRoZSBwcm9wYWdhdGlvbiBmb3IgZGVibG9ja2luZyAqLwotICAgICAgICAgICAgICAgIGlmIChtc2tfZGVibG9jayA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKihwcF9kZWNfeSkgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBwX2RlY195ICs9IGxsW2trXTsKLSAgICAgICAgICAgICAgICBwcF9wcmV2MSArPSBsbFtra107Ci0gICAgICAgICAgICAgICAgcHBfcHJldjIgKz0gbGxba2tdOwotICAgICAgICAgICAgICAgIHBwX3ByZXYzICs9IGxsW2trXTsKLSAgICAgICAgICAgICAgICBwcF9wcmV2NCArPSBsbFtra107Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogKHgseSkgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAgICAgICAgIC8qICAxMC8yNC8yMDAwIHBvc3RfcHJvY2Vzc2luZyBzZW1hcGhvcmUgKi8KLSAgICAgICAgICAgIC8qIGdlbmVyYXRpb24gKi8KLQotICAgICAgICAgICAgLyogIDEwLzIzLzIwMDAgYm91bmRhcnkgY2hlY2tpbmcqLwotICAgICAgICAgICAgKm12X2xvYyA9IDE7Ci0KLSAgICAgICAgICAgIC8qIFBlcmZvcm0gcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgZWFjaCAqLwotICAgICAgICAgICAgLyogb2YgdGhlIDQgYmxvY2tzIGluIGEgTUIuICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoa2sgPSAwOyBrayA8IDQ7IGtrKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGJsb2NrIHggY29vcmRpbmF0ZSBhbmQgcm91bmQgKD8pLiAgKi8KLSAgICAgICAgICAgICAgICAvKiBEaXZpZGUgYnkgMTYgaXMgZm9yIGNvbnZlcnRpbmcgaGFsZi1waXhlbCAgICAqLwotICAgICAgICAgICAgICAgIC8qIHJlc29sdXRpb24gdG8gYmxvY2suICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbW12eCA9ICh4cHJlZCArICgoa2sgJiAxKSA8PCAzKSkgPj4gNDsKLSAgICAgICAgICAgICAgICBubXZ4ID0gbW12eDsKLQotICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBibG9jayB5IGNvb3JkaW5hdGUgYW5kIHJvdW5kICg/KS4gICovCi0gICAgICAgICAgICAgICAgLyogRGl2aWRlIGJ5IDE2IGlzIGZvciBjb252ZXJ0aW5nIGhhbGYtcGl4ZWwgICAgKi8KLSAgICAgICAgICAgICAgICAvKiByZXNvbHV0aW9uIHRvIGJsb2NrLiAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1tdnkgPSAoeXByZWQgKyAoKGtrICYgMikgPDwgMikpID4+IDQ7Ci0gICAgICAgICAgICAgICAgbm12eSA9IG1tdnk7Ci0KLSAgICAgICAgICAgICAgICAvKiBQZXJmb3JtIGJvdW5kYXJ5IGNoZWNraW5nICovCi0gICAgICAgICAgICAgICAgaWYgKG5tdnggPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbm12eCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5tdnggPiBtdndpZHRoIC0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5tdnggPSBtdndpZHRoIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobm12eSA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBubXZ5ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobm12eSA+IChoZWlnaHQgPj4gMykgLSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbm12eSA9IChoZWlnaHQgPj4gMykgLSAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEZpbmQgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBsb2NhdGlvbiBmb3IgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAvKiB1c2VkIGZvciBwcmVkaWN0aW9uLCBpLmUuLCAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxID0gJnBzdHByY1R5cFBydltubXZ5Km12d2lkdGhdW25tdnhdICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcF9wcmV2MSA9IHBzdHByY1R5cFBydiArIG5tdnggKyBubXZ5ICogbXZ3aWR0aDsKLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHggY29tcG9uZW50IG9mIE1WIGlzIGEgbXVsdGlwbGUgb2YgMTYgICAgKi8KLSAgICAgICAgICAgICAgICAvKiBhbmQgY2hlY2sgaWYgYmxvY2sgeCBjb29yZGluYXRlIGlzIG91dCBvZiBib3VuZHMgICovCi0gICAgICAgICAgICAgICAgaWYgKCgoZHgmMHhGKSAhPSAwKSAmJiAobW12eCArIDEgPCBtdndpZHRoIC0gMSkpCi0gICAgICAgICAgICAgICAgeyAgIC8qIGR4IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IGFuZCB0aGUgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogeCBjb29yZGluYXRlIGlzIHdpdGhpbiB0aGUgYm91bmRzICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYyIGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2sgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxICsgMTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB5IGNvbXBvbmVudCBvZiBNViBpcyBhIG11bHRpcGxlICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG9mIDE2IGFuZCBjaGVjayBpZiBibG9jayB5IGNvb3JkaW5hdGUgaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogb3V0IG9mIGJvdW5kcyAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKChkeSYweEYpICE9IDApICYmIChtbXZ5ICsgMSA8IChoZWlnaHQgPj4gMykgLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgeyAgIC8qIGR5IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IGFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGJsb2NrIHkgY29vcmRpbmF0ZSBpcyAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRoaW4gdGhlIGJvdW5kcyAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjMgaXMgdGhlIGJsb2NrIGJlbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSBibG9jayAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MSArIG12d2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbCBwcmVkaWN0aW9uIGFyZSBmcm9tIGRpZmZlcmVudCBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1za19kZWJsb2NrID0gMHgzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeyAgIC8qIGR5IGlzIGEgbXVsdGlwbGUgb2YgMTYgb3IgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB5IGNvb3JkaW5hdGUgaXMgb3V0IG9mIGJvdW5kcyAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjQgaXMgdGhlIGJsb2NrIHRvIHRoZSByaWdodCBvZiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBibG9jay4gICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjMgKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeyAgIC8qIGR4IGlzIGEgbXVsdGlwbGUgb2YgMTYgb3IgdGhlIGJsb2NrIHggKi8KLSAgICAgICAgICAgICAgICAgICAgLyogY29vcmRpbmF0ZSBpcyBvdXQgb2YgYm91bmRzICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjE7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgeSBjb21wb25lbnQgb2YgTVYgaXMgYSBtdWx0aXBsZSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvZiAxNiBhbmQgY2hlY2sgaWYgYmxvY2sgeSBjb29yZGluYXRlIGlzICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG91dCBvZiBib3VuZHMgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoZHkmMHhGKSAhPSAwKSAmJiAobW12eSArIDEgPCAoaGVpZ2h0ID4+IDMpIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiBhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBibG9jayB5IGNvb3JkaW5hdGUgaXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2l0aGluIHRoZSBib3VuZHMgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2suICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyBtdndpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeyAgIC8qIGR5IGlzIGEgbXVsdGlwbGUgb2YgMTYgb3IgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB5IGNvb3JkaW5hdGUgaXMgb3V0IG9mIGJvdW5kcyAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjQgPSBwcF9wcmV2MzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEZXJpbmdpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uICovCi0gICAgICAgICAgICAgICAgaWYgKCgqKHBwX2RlY195KSY0KSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKihwcF9kZWNfeSkgfD0gKCgqKHBwX3ByZXYxKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwcF9wcmV2MikgfCAqKHBwX3ByZXYzKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwcF9wcmV2NCkpICYgMHg0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRGVibG9ja2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gKi8KLSAgICAgICAgICAgICAgICAvKiAgMTEvMy8wMCwgY2hhbmdlIHRoZSBwcm9wYWdhPSAqLwotICAgICAgICAgICAgICAgIC8qIHRpb24gZm9yIGRlYmxvY2tpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAobXNrX2RlYmxvY2sgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICoocHBfZGVjX3kpID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcF9kZWNfeSArPSBsbFtra107Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgcmV0dXJuIChtc2tfZGVibG9jayk7Ci0gICAgfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMGZjZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ODEgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAicHZkZWNfYXBpIgotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNpbmNsdWRlICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAidmxjX2RlY29kZS5oIgotI2luY2x1ZGUgImJpdHN0cmVhbS5oIgotCi0jaWZuZGVmIElOVDMyX01BWAotI2RlZmluZSBJTlQzMl9NQVggMHg3ZmZmZmZmZgotI2VuZGlmCi0KLSNpZm5kZWYgU0laRV9NQVgKLSNkZWZpbmUgU0laRV9NQVggKChzaXplX3QpIC0xKQotI2VuZGlmCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09ORElUSU9OQUxfSVNfQ09OU1RBTlQKLQotI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCi0jZGVmaW5lIFFDSUZfTUJTIDk5Ci0jZGVmaW5lIFFDSUZfQlMgKDQqUUNJRl9NQlMpCi0jZGVmaW5lIFFDSUZfTUJfUk9XUyAxMQotZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1fc2xpY2VOb1tRQ0lGX01CU107Ci1leHRlcm4gdWludDggICAgICAgICAgICAgICAgSU1FTV9hY1ByZWRGbGFnW1FDSUZfTUJTXTsKLWV4dGVybiB1aW50OCAgICAgICAgICAgICAgICBJTUVNX2hlYWRlckluZm9fTW9kZVtRQ0lGX01CU107Ci1leHRlcm4gdWludDggICAgICAgICAgICAgICAgSU1FTV9oZWFkZXJJbmZvX0NCUFtRQ0lGX01CU107Ci1leHRlcm4gaW50ICAgICAgICAgICAgICAgICAgSU1FTV9oZWFkZXJJbmZvX1FQTUJbUUNJRl9NQlNdOwotZXh0ZXJuIE1hY3JvQmxvY2sgICAgICAgICAgIElNRU1fbWJsb2NrOwotZXh0ZXJuIE1PVCAgICAgICAgICAgICAgICAgIElNRU1fbW90WFtRQ0lGX0JTXTsKLWV4dGVybiBNT1QgICAgICAgICAgICAgICAgICBJTUVNX21vdFlbUUNJRl9CU107Ci1leHRlcm4gQml0c3RyZWFtRGVjVmlkZW8gICAgSU1FTV9CaXRzdHJlYW1EZWNWaWRlb1s0XTsKLWV4dGVybiB0eXBlRENTdG9yZSAgICAgICAgICBJTUVNX3ByZWREQ1tRQ0lGX01CU107Ci1leHRlcm4gdHlwZURDQUNTdG9yZSAgICAgICAgSU1FTV9wcmVkRENBQ19jb2xbUUNJRl9NQl9ST1dTKzFdOwotCi1leHRlcm4gVmlkZW9EZWNEYXRhICAgICAgICAgSU1FTV9WaWRlb0RlY0RhdGFbMV07Ci1leHRlcm4gVm9wICAgICAgICAgICAgICAgICAgSU1FTV9jdXJyVm9wWzFdOwotZXh0ZXJuIFZvcCAgICAgICAgICAgICAgICAgIElNRU1fcHJldlZvcFsxXTsKLWV4dGVybiBQSVhFTCAgICAgICAgICAgICAgICBJTUVNX2N1cnJWb3BfeUNoYW5bUUNJRl9NQlMqMTI4KjNdOwotZXh0ZXJuIFBJWEVMICAgICAgICAgICAgICAgIElNRU1fcHJldlZvcF95Q2hhbltRQ0lGX01CUyoxMjgqM107Ci1leHRlcm4gdWludDggICAgICAgICAgICAgICAgSU1FTV9wc3RwcmNUeXBDdXJbNipRQ0lGX01CU107Ci1leHRlcm4gdWludDggICAgICAgICAgICAgICAgSU1FTV9wc3RwcmNUeXBQcnZbNipRQ0lGX01CU107Ci0KLQotZXh0ZXJuIFZvcCAgICAgICAgICAgICAgICAgIElNRU1fdm9wSEVBREVSWzJdOwotZXh0ZXJuIFZvbCAgICAgICAgICAgICAgICAgIElNRU1fVk9MWzJdOwotZXh0ZXJuIFZvcCAgICAgICAgICAgICAgICAgIElNRU1fdm9wSGVhZGVyWzJdWzFdOwotZXh0ZXJuIFZvbCAgICAgICAgICAgICAgICAgIElNRU1fdm9sWzJdWzFdOwotCi0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkluaXRWaWRlb0RlY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzExLzIwMDAsIDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogSW5pdGlhbGl6YXRpb24gb2YgdGhlIE1QRUctNCB2aWRlbyBkZWNvZGVyIGxpYnJhcnkuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICBUaGUgcmV0dXJuIHR5cGUgaXMgQm9vbCBpbnN0ZWFkIG9mIFBWX1NUQVRVUyBiZWNhdXNlICAgICAgICAgKi8KLS8qICAgICAgICAgICAgIHdlIGRvbid0IHdhbnQgdG8gZXhwb3NlIFBWX1NUQVRVUyB0byAob3V0c2lkZSkgcHJvZ3JhbW1lcnMgICAqLwotLyogICAgICAgICAgICAgdGhhdCB1c2Ugb3VyIGRlY29kZXIgbGlicmFyeSBTREsuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9TQ0xfRVhQT1JUX1JFRiBCb29sIFBWSW5pdFZpZGVvRGVjb2RlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqdm9sYnVmW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgKnZvbGJ1Zl9zaXplLCBpbnQgbkxheWVycywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBNUDREZWNvZGluZ01vZGUgbW9kZSkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIEJvb2wgc3RhdHVzID0gUFZfVFJVRTsKLSAgICBpbnQgaWR4OwotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW07Ci0KLQotICAgIG9zY2xfbWVtc2V0KGRlY0N0cmwsIDAsIHNpemVvZihWaWRlb0RlY0NvbnRyb2xzKSk7IC8qIGZpeCBhIHNpemUgYnVnLiAgIDAzLzI4LzIwMDEgKi8KLSAgICBkZWNDdHJsLT5uTGF5ZXJzID0gbkxheWVyczsKLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQotICAgIHsKLSAgICAgICAgZGVjQ3RybC0+dm9sYnVmW2lkeF0gPSB2b2xidWZbaWR4XTsKLSAgICAgICAgZGVjQ3RybC0+dm9sYnVmX3NpemVbaWR4XSA9IHZvbGJ1Zl9zaXplW2lkeF07Ci0gICAgfQotCi0gICAgLyogbWVtb3J5IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbiAqLwotI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCi0gICAgdmlkZW8gPSBJTUVNX1ZpZGVvRGVjRGF0YTsKLSNlbHNlCi0gICAgdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIG9zY2xfbWFsbG9jKHNpemVvZihWaWRlb0RlY0RhdGEpKTsKLSNlbmRpZgotICAgIGlmICh2aWRlbyAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8sIDAsIHNpemVvZihWaWRlb0RlY0RhdGEpKTsKLSAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlID0gc2l6ZW9mKFZpZGVvRGVjRGF0YSk7Ci0gICAgICAgIHZpZGVvLT5udW1iZXJPZkxheWVycyA9IG5MYXllcnM7Ci0jaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKLSAgICAgICAgdmlkZW8tPnZvbCA9IChWb2wgKiopIElNRU1fVk9MOwotI2Vsc2UKLSAgICAgICAgaWYgKChzaXplX3QpbkxheWVycyA+IFNJWkVfTUFYIC8gc2l6ZW9mKFZvbCAqKSkgewotICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8pOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlkZW8tPnZvbCA9IChWb2wgKiopIG9zY2xfbWFsbG9jKG5MYXllcnMgKiBzaXplb2YoVm9sICopKTsKLSNlbmRpZgotICAgICAgICBpZiAodmlkZW8tPnZvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5MYXllcnMgKiBzaXplb2YoVm9sICopOwotCi0gICAgICAgIC8qIGJlIHN1cmUgbm90IHRvIGxlYWsgYW55IHByZXZpb3VzIHN0YXRlICovCi0gICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihkZWNDdHJsKTsKLSAgICAgICAgLyogd2UgbmVlZCB0byBzZXR1cCB0aGlzIHBvaW50ZXIgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byAqLwotICAgICAgICAvKiAgICBwYXNzIGl0IGFyb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEgPSAodm9pZCAqKSB2aWRlbzsKLSAgICAgICAgdmlkZW8tPnZpZGVvRGVjQ29udHJvbHMgPSBkZWNDdHJsOyAgLyogeWVzLiB3ZSBoYXZlIGEgY3ljbGljICovCi0gICAgICAgIC8qIHJlZmVyZW5jZXMgaGVyZSA6KSAgICAqLwotCi0gICAgICAgIC8qIEFsbG9jYXRpbmcgVm9wIHNwYWNlLCB0aGlzIGhhcyB0byBjaGFuZ2Ugd2hlbiB3ZSBhZGQgKi8KLSAgICAgICAgLyogICAgc3BhdGlhbCBzY2FsYWJpbGl0eSB0byB0aGUgZGVjb2RlciAgICAgICAgICAgICAgICAqLwotI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCi0gICAgICAgIHZpZGVvLT5jdXJyVm9wID0gSU1FTV9jdXJyVm9wOwotICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3AgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmN1cnJWb3AsIDAsIHNpemVvZihWb3ApKTsKLSAgICAgICAgdmlkZW8tPnByZXZWb3AgPSBJTUVNX3ByZXZWb3A7Ci0gICAgICAgIGlmICh2aWRlby0+cHJldlZvcCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJldlZvcCwgMCwgc2l6ZW9mKFZvcCkpOwotICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihWb3ApICogMik7Ci0gICAgICAgIHZpZGVvLT52b3BIZWFkZXIgPSAoVm9wICoqKSBJTUVNX3ZvcEhFQURFUjsKLSNlbHNlCi0KLSAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSAoVm9wICopIG9zY2xfbWFsbG9jKHNpemVvZihWb3ApKTsKLSAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5jdXJyVm9wLCAwLCBzaXplb2YoVm9wKSk7Ci0gICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gKFZvcCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9wKSk7Ci0gICAgICAgIGlmICh2aWRlby0+cHJldlZvcCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJldlZvcCwgMCwgc2l6ZW9mKFZvcCkpOwotICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihWb3ApICogMik7Ci0KLSAgICAgICAgaWYgKChzaXplX3QpbkxheWVycyA+IFNJWkVfTUFYIC8gc2l6ZW9mKFZvcCAqKSkgewotICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICB2aWRlby0+dm9wSGVhZGVyID0gKFZvcCAqKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvcCAqKSAqIG5MYXllcnMpOwotI2VuZGlmCi0gICAgICAgIGlmICh2aWRlby0+dm9wSGVhZGVyID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT52b3BIZWFkZXIsIDAsIHNpemVvZihWb3AgKikqbkxheWVycyk7Ci0gICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKFZvcCAqKSAqIG5MYXllcnMpOwotCi0gICAgICAgIHZpZGVvLT5pbml0aWFsaXplZCA9IFBWX0ZBTFNFOwotICAgICAgICAvKiBEZWNvZGUgdGhlIGhlYWRlciB0byBnZXQgYWxsIGluZm9ybWF0aW9uIHRvIGFsbG9jYXRlIGRhdGEgKi8KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9UUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpbml0aWFsaXplIGRlY29kZWQgZnJhbWUgY291bnRlci4gICAwNC8yNC8yMDAxICovCi0gICAgICAgICAgICB2aWRlby0+ZnJhbWVfaWR4ID0gLTE7Ci0KLQotICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBuTGF5ZXJzOyBpZHgrKykKLSAgICAgICAgICAgIHsKLQotI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCi0gICAgICAgICAgICAgICAgdmlkZW8tPnZvcEhlYWRlcltpZHhdID0gSU1FTV92b3BIZWFkZXJbaWR4XTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgdmlkZW8tPnZvcEhlYWRlcltpZHhdID0gKFZvcCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9wKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvcEhlYWRlcltpZHhdID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT52b3BIZWFkZXJbaWR4XSwgMCwgc2l6ZW9mKFZvcCkpOwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9wSGVhZGVyW2lkeF0tPnRpbWVTdGFtcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKFZvcCkpOwotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IElNRU1fdm9sW2lkeF07Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihWb2wpOwotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBJTUVNX0JpdHN0cmVhbURlY1ZpZGVvOwotI2Vsc2UKLSAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSAoVm9sICopIG9zY2xfbWFsbG9jKHNpemVvZihWb2wpKTsKLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoVm9sKTsKLSAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3RyZWFtID0gKEJpdHN0cmVhbURlY1ZpZGVvICopIG9zY2xfbWFsbG9jKHNpemVvZihCaXRzdHJlYW1EZWNWaWRlbykpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihCaXRzdHJlYW1EZWNWaWRlbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQzMiBidWZmZXJfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChidWZmZXJfc2l6ZSA9IEJpdHN0cmVhbU9wZW4oc3RyZWFtLCBpZHgpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wNGRlY19sb2coIkluaXRWaWRlb0RlY29kZXIoKTogQ2FuJ3QgYWxsb2NhdGUgYml0c3RyZWFtIGJ1ZmZlci5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtID0gc3RyZWFtOwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPnZvbElEID0gaWR4OwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPnRpbWVJbmNfb2Zmc2V0ID0gMDsgIC8qICAxMS8xMi8wMSAqLwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+dmxjRGVjQ29lZmZJbnRyYSA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyOwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+dmxjRGVjQ29lZmZJbnRlciA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyOwotICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PSBNUEVHNF9NT0RFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdXAgVk9MIGhlYWRlciBiaXRzdHJlYW0gZm9yIGZyYW1lLWJhc2VkIGRlY29kaW5nLiAgMDgvMzAvMjAwMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVzZXQoc3RyZWFtLCBkZWNDdHJsLT52b2xidWZbaWR4XSwgZGVjQ3RybC0+dm9sYnVmX3NpemVbaWR4XSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoRGVjb2RlVk9MSGVhZGVyKHZpZGVvLCBpZHgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUFZfU1VDQ0VTUyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX1RSVUU7ICAgLyogIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgZmlyc3QgbGF5ZXIgaXMgYmFkLCBzZWNvbmQgbGF5ZXIgaXMgZ29vZCByZXR1cm4gUFZfRkFJTCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgUFZfVE9MRVJBVEVfVk9MX0VSUk9SUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUFZfQkFEX1ZPTEhFQURFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+c2hvcnRWaWRlb0hlYWRlciA9IFBWX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnNob3J0VmlkZW9IZWFkZXIgPT0gUFZfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEgyNjNfTU9ERTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBtYXggd2lkdGggYW5kIGhlaWdodC4gIEluIEguMjYzIG1vZGUsIHdlIHVzZSAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogIHZvbGJ1Zl9zaXplWzBdIHRvIHBhc3MgaW4gd2lkdGggYW5kIHZvbGJ1Zl9zaXplWzFdICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAgdG8gcGFzcyBpbiBoZWlnaHQuICAgICAgICAgICAgICAgICAgICAwNC8yMy8yMDAxICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHJldlZvcC0+dGVtcG9yYWxSZWYgPSAwOyAvKiAgMTEvMTIvMDEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgc29tZSBjb252ZW5pZW5jZSB2YXJpYWJsZXM6ICAgMDQvMjMvMjAwMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5xdWFudFR5cGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5xdWFudFByZWNpc2lvbiA9IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPmVycm9yUmVzRGlzYWJsZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPmRhdGFQYXJ0aXRpb25pbmcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT51c2VSZXZlcnNlVkxDID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5pbnRyYV9hY2RjUHJlZERpc2FibGUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5zY2FsYWJpbGl0eSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPndpZHRoID0gKHdpZHRoICsgMTUpICYgLTE2OwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmhlaWdodCA9IChoZWlnaHQgKyAxNSkgJiAtMTY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+c2l6ZSA9IChpbnQzMil2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0OwotCi0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+bW9kaWZpZWRfcXVhbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmFkdmFuY2VkX0lOVFJBID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kZWJsb2NraW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZV9zdHJ1Y3R1cmUgPSAwOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gUFZfRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFBWQWxsb2NWaWRlb0RhdGEoZGVjQ3RybCwgd2lkdGgsIGhlaWdodCwgbkxheWVycyk7Ci0gICAgICAgICAgICB2aWRlby0+aW5pdGlhbGl6ZWQgPSBQVl9UUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLQotZmFpbDoKLSAgICBpZiAoc3RhdHVzID09IFBWX0ZBTFNFKSBQVkNsZWFuVXBWaWRlb0RlY29kZXIoZGVjQ3RybCk7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1Cb29sIFBWQWxsb2NWaWRlb0RhdGEoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkxheWVycykKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIEJvb2wgc3RhdHVzID0gUFZfVFJVRTsKLSAgICBpbnQgblRvdGFsTUI7Ci0gICAgaW50IG5NQlBlclJvdzsKLSAgICBpbnQzMiBzaXplOwotCi0gICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyID09IFBWX1RSVUUpCi0gICAgewotICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gd2lkdGg7Ci0gICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB2aWRlby0+d2lkdGggPSAod2lkdGggKyAxNSkgJiAtMTY7Ci0gICAgICAgIHZpZGVvLT5oZWlnaHQgPSAoaGVpZ2h0ICsgMTUpICYgLTE2OwotCi0gICAgICAgIHZpZGVvLT5uTUJQZXJSb3cgPQotICAgICAgICAgICAgdmlkZW8tPm5NQmluR09CICA9IHZpZGVvLT53aWR0aCAvIE1CX1NJWkU7Ci0gICAgICAgIHZpZGVvLT5uTUJQZXJDb2wgPQotICAgICAgICAgICAgdmlkZW8tPm5HT0JpblZvcCA9IHZpZGVvLT5oZWlnaHQgLyBNQl9TSVpFOwotICAgICAgICB2aWRlby0+blRvdGFsTUIgPQotICAgICAgICAgICAgdmlkZW8tPm5NQlBlclJvdyAqIHZpZGVvLT5uTUJQZXJDb2w7Ci0gICAgfQotCi0gICAgaWYgKCgodWludDY0X3QpdmlkZW8tPndpZHRoICogdmlkZW8tPmhlaWdodCkgPiAodWludDY0X3QpSU5UMzJfTUFYIC8gc2l6ZW9mKFBJWEVMKSkgewotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgfQotCi0gICAgc2l6ZSA9IChpbnQzMilzaXplb2YoUElYRUwpICogdmlkZW8tPndpZHRoICogdmlkZW8tPmhlaWdodDsKLSNpZmRlZiBQVl9NRU1PUllfUE9PTAotICAgIGRlY0N0cmwtPnNpemUgPSBzaXplOwotI2Vsc2UKLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IElNRU1fY3VyclZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCi0gICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIHsKLSAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7Ci0gICAgfQotCi0gICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gSU1FTV9wcmV2Vm9wX3lDaGFuOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KLSAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIGVsc2UgewotICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKLSAgICB9Ci0jZWxzZQotICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC8gMykgewotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgfQotICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KLSAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIGVsc2UgewotICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKLSAgICB9Ci0gICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwotICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7Ci0gICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOwotICAgIH0KLSNlbmRpZgotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZSAqIDMpOwotI2VuZGlmICAgLy8gTUVNT1JZX1BPT0wKLSAgICAvKiBOb3RlIHRoYXQgYmFzZVZvcCwgZW5oY1ZvcCBpcyBvbmx5IHVzZWQgdG8gaG9sZCBlbmhhbmNlbWVudCAqLwotICAgIC8qICAgIGxheWVyIGhlYWRlciBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAwNS8wNC8yMDAwICAqLwotICAgIGlmIChuTGF5ZXJzID4gMSkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcCA9IChWb3AgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvcCkpOwotICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihWb3ApKTsKLSAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcCA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2RW5oY1ZvcCwgMCwgc2l6ZW9mKFZvcCkpOwotI2lmbmRlZiBQVl9NRU1PUllfUE9PTAotICAgICAgICAgICAgaWYgKHNpemUgPiBJTlQzMl9NQVggLyAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoMyAqIHNpemUgLyAyKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGluZyBzcGFjZSBmb3Igc2xpY2VzLCBBQyBwcmVkaWN0aW9uIGZsYWcsIGFuZCAqLwotICAgIC8qICAgIEFDL0RDIHByZWRpY3Rpb24gc3RvcmFnZSAqLwotICAgIG5Ub3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COwotICAgIG5NQlBlclJvdyA9IHZpZGVvLT5uTUJQZXJSb3c7Ci0KLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotICAgIHZpZGVvLT5zbGljZU5vID0gKHVpbnQ4ICopKElNRU1fc2xpY2VObyk7Ci0gICAgaWYgKHZpZGVvLT5zbGljZU5vID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKLSAgICB2aWRlby0+YWNQcmVkRmxhZyA9ICh1aW50OCAqKShJTUVNX2FjUHJlZEZsYWcpOwotICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CKTsKLSAgICB2aWRlby0+cHJlZERDID0gKHR5cGVEQ1N0b3JlICopKElNRU1fcHJlZERDKTsKLSAgICBpZiAodmlkZW8tPnByZWREQyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7Ci0gICAgdmlkZW8tPnByZWREQ0FDX2NvbCA9ICh0eXBlRENBQ1N0b3JlICopKElNRU1fcHJlZERDQUNfY29sKTsKLSAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7Ci0gICAgdmlkZW8tPnByZWREQ0FDX3JvdyA9IHZpZGVvLT5wcmVkRENBQ19jb2wgKyAxOwotICAgIHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPSAodWludDggKikoSU1FTV9oZWFkZXJJbmZvX01vZGUpOwotICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKLSAgICB2aWRlby0+aGVhZGVySW5mby5DQlAgPSAodWludDggKikoSU1FTV9oZWFkZXJJbmZvX0NCUCk7Ci0gICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7Ci0gICAgdmlkZW8tPlFQTUIgPSAoaW50ICopKElNRU1faGVhZGVySW5mb19RUE1CKTsKLSAgICBpZiAodmlkZW8tPlFQTUIgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZihpbnQpKTsKLSAgICB2aWRlby0+bWJsb2NrID0gJklNRU1fbWJsb2NrOwotICAgIGlmICh2aWRlby0+bWJsb2NrID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tYmxvY2stPmJsb2NrLCAwLCBzaXplb2YoaW50MTYpKjYqTkNPRUZGX0JMT0NLKTsgLy8gIEF1ZyAyMywyMDA1Ci0KLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gc2l6ZW9mKE1hY3JvQmxvY2spOwotICAgIHZpZGVvLT5tb3RYID0gKE1PVCAqKShJTUVNX21vdFgpOwotICAgIGlmICh2aWRlby0+bW90WCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+bW90WSA9IChNT1QgKikoSU1FTV9tb3RZKTsKLSAgICBpZiAodmlkZW8tPm1vdFkgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoTU9UKSAqIDggKiBuVG90YWxNQik7Ci0jZWxzZQotICAgIHZpZGVvLT5zbGljZU5vID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKLSAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+c2xpY2VObywgMCwgblRvdGFsTUIpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKLQotICAgIHZpZGVvLT5hY1ByZWRGbGFnID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7Ci0gICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmFjUHJlZEZsYWcsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQik7Ci0KLSAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ1N0b3JlKSkgewotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgfQotICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKLSAgICBpZiAodmlkZW8tPnByZWREQyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkREMsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwotCi0gICAgaWYgKG5NQlBlclJvdyA+IElOVDMyX01BWCAtIDEKLSAgICAgICAgICAgIHx8IChzaXplX3QpKG5NQlBlclJvdyArIDEpID4gU0laRV9NQVggLyBzaXplb2YodHlwZURDQUNTdG9yZSkpIHsKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIH0KLSAgICB2aWRlby0+cHJlZERDQUNfY29sID0gKHR5cGVEQ0FDU3RvcmUgKikgb3NjbF9tYWxsb2MoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKLSAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19jb2wsIDAsIChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwotCi0gICAgLyogZWxlbWVudCB6ZXJvIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyB2ZXJ0aWNhbCAoY29sKSBBQyBjb2VmZmljaWVudHMgKi8KLSAgICAvKiAgdGhlIHJlc3Qgd2lsbCBiZSB1c2VkIGZvciBzdG9yaW5nIGhvcml6b250YWwgKHJvdykgQUMgY29lZmZpY2llbnRzICAqLwotICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSB2aWRlby0+cHJlZERDQUNfY29sICsgMTsgICAgICAgIC8qICBBQ0RDICovCi0KLSAgICAvKiBBbGxvY2F0aW5nIEhlYWRlckluZm8gc3RydWN0dXJlICYgUXVhbnRpemVyIGFycmF5ICovCi0gICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7Ci0gICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAwLCBuVG90YWxNQik7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwotICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7Ci0gICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIG9zY2xfbWVtc2V0ICh2aWRlby0+aGVhZGVySW5mby5DQlAsIDAsIG5Ub3RhbE1CKTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7Ci0KLSAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKGludDE2KSkgewotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgfQotICAgIHZpZGVvLT5RUE1CID0gKGludDE2ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7Ci0gICAgaWYgKHZpZGVvLT5RUE1CID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5RUE1CLCAweDAsIG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZihpbnQpKTsKLQotICAgIC8qIEFsbG9jYXRpbmcgbWFjcm9ibG9jayBzcGFjZSAqLwotICAgIHZpZGVvLT5tYmxvY2sgPSAoTWFjcm9CbG9jayAqKSBvc2NsX21hbGxvYyhzaXplb2YoTWFjcm9CbG9jaykpOwotICAgIGlmICh2aWRlby0+bWJsb2NrID09IE5VTEwpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1ibG9jay0+YmxvY2ssIDAsIHNpemVvZihpbnQxNikqNipOQ09FRkZfQkxPQ0spOyAvLyAgQXVnIDIzLDIwMDUKLQotICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gc2l6ZW9mKE1hY3JvQmxvY2spOwotICAgIH0KLSAgICAvKiBBbGxvY2F0aW5nIG1vdGlvbiB2ZWN0b3Igc3BhY2UgKi8KLSAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gKHNpemVvZihNT1QpICogNCkpIHsKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIH0KLSAgICB2aWRlby0+bW90WCA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwotICAgIGlmICh2aWRlby0+bW90WCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwotICAgIHZpZGVvLT5tb3RZID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7Ci0gICAgaWYgKHZpZGVvLT5tb3RZID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RZLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoTU9UKSAqIDggKiBuVG90YWxNQik7Ci0jZW5kaWYKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgLyogQWxsb2NhdGluZyBzcGFjZSBmb3IgcG9zdC1wcm9jZXNzaW5nIE1vZGUgKi8KLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotICAgIHZpZGVvLT5wc3RwcmNUeXBDdXIgPSBJTUVNX3BzdHByY1R5cEN1cjsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogNik7Ci0gICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBDdXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHN0cHJjVHlwQ3VyLCAwLCA0Km5Ub3RhbE1CICsgMipuVG90YWxNQik7Ci0gICAgfQotCi0gICAgdmlkZW8tPnBzdHByY1R5cFBydiA9IElNRU1fcHN0cHJjVHlwUHJ2OwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiA2KTsKLSAgICBpZiAodmlkZW8tPnBzdHByY1R5cFBydiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wc3RwcmNUeXBQcnYsIDAsIG5Ub3RhbE1CKjYpOwotICAgIH0KLQotI2Vsc2UKLSAgICBpZiAoblRvdGFsTUIgPiBJTlQzMl9NQVggLyA2KSB7Ci0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICB9Ci0gICAgdmlkZW8tPnBzdHByY1R5cEN1ciA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIDYpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiA2KTsKLSAgICBpZiAodmlkZW8tPnBzdHByY1R5cEN1ciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wc3RwcmNUeXBDdXIsIDAsIDQqblRvdGFsTUIgKyAyKm5Ub3RhbE1CKTsKLSAgICB9Ci0KLSAgICB2aWRlby0+cHN0cHJjVHlwUHJ2ID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogNik7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIDYpOwotICAgIGlmICh2aWRlby0+cHN0cHJjVHlwUHJ2ID09IE5VTEwpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnBzdHByY1R5cFBydiwgMCwgblRvdGFsTUIqNik7Ci0gICAgfQotCi0jZW5kaWYKLQotI2VuZGlmCi0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBkZWNvZGVyIGxpYnJhcnkgKi8KLSAgICB2aWRlby0+cHJldlZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKLSAgICB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wID0gMDsKLSNpZm5kZWYgUFZfTUVNT1JZX1BPT0wKLSAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldlZvcC0+eUNoYW4sIDE2LCBzaXplb2YodWludDgpKnNpemUpOyAgICAgLyogIDEwLzMxLzAxICovCi0gICAgb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AtPnVDaGFuLCAxMjgsIHNpemVvZih1aW50OCkqc2l6ZSAvIDIpOwotCi0gICAgb3NjbF9tZW1zZXQodmlkZW8tPmN1cnJWb3AtPnlDaGFuLCAwLCBzaXplb2YodWludDgpKnNpemUqMyAvIDIpOwotICAgIGlmIChuTGF5ZXJzID4gMSkKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4sIDAsIHNpemVvZih1aW50OCkqc2l6ZSozIC8gMik7Ci0gICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dGltZVN0YW1wID0gMDsKLSAgICB9Ci0gICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsgICAgICAgICAgICAgICAvKiAgMDcvMDcvMjAwMSAqLwotICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOyAgICAgICAgICAgICAgLyogIDA2LzE5LzIwMDIgKi8KLSNlbmRpZgotCi0gICAgLyogYWx3YXlzIHN0YXJ0IGZyb20gYmFzZSBsYXllciAqLwotICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSAwOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZSZXNldFZpZGVvRGVjb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwMS8xNC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFJlc2V0IHZpZGVvIHRpbWVzdGFtcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1Cb29sIFBWUmVzZXRWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIGludCBpZHg7Ci0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGRlY0N0cmwtPm5MYXllcnM7IGlkeCsrKQotICAgIHsKLSAgICAgICAgdmlkZW8tPnZvcEhlYWRlcltpZHhdLT50aW1lU3RhbXAgPSAwOwotICAgIH0KLSAgICB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wID0gMDsKLSAgICBpZiAoZGVjQ3RybC0+bkxheWVycyA+IDEpCi0gICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dGltZVN0YW1wID0gMDsKLQotICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tYmxvY2stPmJsb2NrLCAwLCBzaXplb2YoaW50MTYpKjYqTkNPRUZGX0JMT0NLKTsgLy8gIEF1ZyAyMywyMDA1Ci0KLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWQ2xlYW5VcFZpZGVvRGVjb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQvMTEvMjAwMCwgMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBDbGVhbnVwIG9mIHRoZSBNUEVHLTQgdmlkZW8gZGVjb2RlciBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZDbGVhblVwVmlkZW9EZWNvZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgaW50IGlkeDsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCi0gICAgaWYgKHZpZGVvKQotICAgIHsKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gTlVMTDsKLSAgICAgICAgdmlkZW8tPnBzdHByY1R5cFBydiA9IE5VTEw7Ci0jZW5kaWYKLQotICAgICAgICB2aWRlby0+YWNQcmVkRmxhZyAgICAgICA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5zbGljZU5vICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgdmlkZW8tPm1vdFggICAgICAgICAgICAgPSBOVUxMOwotICAgICAgICB2aWRlby0+bW90WSAgICAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5tYmxvY2sgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgdmlkZW8tPlFQTUIgICAgICAgICAgICAgPSBOVUxMOwotICAgICAgICB2aWRlby0+cHJlZERDICAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgICAgID0gTlVMTDsKLSAgICAgICAgdmlkZW8tPnByZWREQ0FDX2NvbCAgICAgPSBOVUxMOwotICAgICAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlICA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCAgID0gTlVMTDsKLSAgICAgICAgaWYgKHZpZGVvLT5udW1iZXJPZkxheWVycyA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4pIG9zY2xfZnJlZSh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuKTsKLSAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnByZXZFbmhjVm9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSBOVUxMOwotICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbikKLSAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSBOVUxMOwotICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2aWRlby0+cHJldlZvcCkKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gTlVMTDsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuKQotICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICB2aWRlby0+cHJldlZvcCA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmlkZW8tPnZvbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCB2aWRlby0+bnVtYmVyT2ZMYXllcnM7IGlkeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1DbG9zZSh2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnZvcEhlYWRlcltpZHhdID0gTlVMTDsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlkZW8tPnZvbCA9IE5VTEw7Ci0gICAgICAgICAgICB2aWRlby0+dm9wSGVhZGVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpZGVvID0gTlVMTDsKLSAgICAgICAgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSA9IE5VTEw7Ci0gICAgfQotCi0jZWxzZQotCi0gICAgaWYgKHZpZGVvKQotICAgIHsKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICBpZiAodmlkZW8tPnBzdHByY1R5cEN1cikgb3NjbF9mcmVlKHZpZGVvLT5wc3RwcmNUeXBDdXIpOwotICAgICAgICBpZiAodmlkZW8tPnBzdHByY1R5cFBydikgb3NjbF9mcmVlKHZpZGVvLT5wc3RwcmNUeXBQcnYpOwotI2VuZGlmCi0gICAgICAgIGlmICh2aWRlby0+cHJlZERDKSBvc2NsX2ZyZWUodmlkZW8tPnByZWREQyk7Ci0gICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSBOVUxMOwotICAgICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCkgb3NjbF9mcmVlKHZpZGVvLT5wcmVkRENBQ19jb2wpOwotICAgICAgICBpZiAodmlkZW8tPm1vdFgpIG9zY2xfZnJlZSh2aWRlby0+bW90WCk7Ci0gICAgICAgIGlmICh2aWRlby0+bW90WSkgb3NjbF9mcmVlKHZpZGVvLT5tb3RZKTsKLSAgICAgICAgaWYgKHZpZGVvLT5tYmxvY2spIG9zY2xfZnJlZSh2aWRlby0+bWJsb2NrKTsKLSAgICAgICAgaWYgKHZpZGVvLT5RUE1CKSBvc2NsX2ZyZWUodmlkZW8tPlFQTUIpOwotICAgICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSkgb3NjbF9mcmVlKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUpOwotICAgICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQKSBvc2NsX2ZyZWUodmlkZW8tPmhlYWRlckluZm8uQ0JQKTsKLSAgICAgICAgaWYgKHZpZGVvLT5zbGljZU5vKSBvc2NsX2ZyZWUodmlkZW8tPnNsaWNlTm8pOwotICAgICAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcpIG9zY2xfZnJlZSh2aWRlby0+YWNQcmVkRmxhZyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5udW1iZXJPZkxheWVycyA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4pIG9zY2xfZnJlZSh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuKTsKLSAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnByZXZFbmhjVm9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3ApCi0gICAgICAgIHsKLQotI2lmbmRlZiBQVl9NRU1PUllfUE9PTAotICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gTlVMTDsKLSAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuKQotICAgICAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+Y3VyclZvcC0+eUNoYW4pOwotI2VuZGlmCi0gICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPmN1cnJWb3ApOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2aWRlby0+cHJldlZvcCkKLSAgICAgICAgewotI2lmbmRlZiBQVl9NRU1PUllfUE9PTAotICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gTlVMTDsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuKQotICAgICAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+cHJldlZvcC0+eUNoYW4pOwotI2VuZGlmCi0gICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnByZXZWb3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZpZGVvLT52b2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPm51bWJlck9mTGF5ZXJzOyBpZHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1DbG9zZSh2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnZvbFtpZHhdLT5iaXRzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+dm9sW2lkeF0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT52b2wpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCB2aWRlby0+bnVtYmVyT2ZMYXllcnM7IGlkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnZvcEhlYWRlcltpZHhdKSBvc2NsX2ZyZWUodmlkZW8tPnZvcEhlYWRlcltpZHhdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2aWRlby0+dm9wSGVhZGVyKSBvc2NsX2ZyZWUodmlkZW8tPnZvcEhlYWRlcik7Ci0KLSAgICAgICAgb3NjbF9mcmVlKHZpZGVvKTsKLSAgICAgICAgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSA9IE5VTEw7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWR2V0VmlkZW9EaW1lbnNpb25zKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQwNTA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogdGhlIGRpc3BsYXlfd2lkdGggYW5kIGRpc3BsYXlfaGVpZ2h0IG9mICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICB0aGUgZnJhbWUgaW4gdGhlIGN1cnJlbnQgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6IFRoaXMgaXMgbm90IGEgbWFjcm8gb3IgaW5saW5lIGZ1bmN0aW9uIGJlY2F1c2Ugd2UgZG8gICAgICAgICAqLwotLyogICAgICAgICAgICAgIG5vdCB3YW50IHRvIGV4cG9zZSBvdXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUuICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT1NDTF9FWFBPUlRfUkVGIHZvaWQgUFZHZXRWaWRlb0RpbWVuc2lvbnMoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50MzIgKmRpc3BsYXlfd2lkdGgsIGludDMyICpkaXNwbGF5X2hlaWdodCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgKmRpc3BsYXlfd2lkdGggPSB2aWRlby0+ZGlzcGxheVdpZHRoOwotICAgICpkaXNwbGF5X2hlaWdodCA9IHZpZGVvLT5kaXNwbGF5SGVpZ2h0OwotfQotCi1PU0NMX0VYUE9SVF9SRUYgdm9pZCBQVkdldEJ1ZmZlckRpbWVuc2lvbnMoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50MzIgKndpZHRoLCBpbnQzMiAqaGVpZ2h0KSB7Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgICp3aWR0aCA9IHZpZGVvLT53aWR0aDsKLSAgICAqaGVpZ2h0ID0gdmlkZW8tPmhlaWdodDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldFZpZGVvVGltZVN0YW1wKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzI3LzIwMDAsIDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IGN1cnJlbnQgdGltZSBzdGFtcCBpbiBtaWxsaXNlY29uZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdWludDMyIFBWR2V0VmlkZW9UaW1lU3RhbXAoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgcmV0dXJuIHZpZGVvLT5jdXJyVGltZXN0YW1wOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZTZXRQb3N0UHJvY1R5cGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNy8wNy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBTZXQgcG9zdC1wcm9jZXNzaW5nIGZpbHRlciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogLiAwOC8yOS8yMDAwIGNoYW5nZXMgdGhlIG5hbWUgZm9yIGNvbnNpc3RlbmN5LiAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9TQ0xfRVhQT1JUX1JFRiB2b2lkIFBWU2V0UG9zdFByb2NUeXBlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludCBtb2RlKQotewotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICB2aWRlby0+cG9zdEZpbHRlclR5cGUgPSBtb2RlOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXREZWNCaXRyYXRlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGF2ZXJhZ2UgYml0cyBwZXIgc2Vjb25kLiAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBQVkdldERlY0JpdHJhdGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgaW50ICAgICBpZHg7Ci0gICAgaW50MzIgICBzdW0gPSAwOwotCi0gICAgZm9yIChpZHggPSAwOyBpZHggPCBCSVRSQVRFX0FWRVJBR0VfV0lORE9XOyBpZHgrKykKLSAgICB7Ci0gICAgICAgIHN1bSArPSB2aWRlby0+bkJpdHNQZXJWb3BbaWR4XTsKLSAgICB9Ci0gICAgc3VtID0gKHN1bSAqIHZpZGVvLT5mcmFtZVJhdGUpIC8gKDEwICogQklUUkFURV9BVkVSQUdFX1dJTkRPVyk7Ci0gICAgcmV0dXJuIChpbnQpIHN1bTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWR2V0RGVjRnJhbWVyYXRlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDgvMjMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhdmVyYWdlIGZyYW1lIHBlciAxMCBzZWNvbmQuICAgICAgICovCi0vKiAgTm90ZSAgICAgOiBUaGUgZnBzIGNhbiBiZSBjYWxjdWxhdGVkIGJ5IFBWR2V0RGVjRnJhbWVyYXRlKCkvMTAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgUFZHZXREZWNGcmFtZXJhdGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0KLSAgICByZXR1cm4gdmlkZW8tPmZyYW1lUmF0ZTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldE91dHB1dEZyYW1lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA1LzA3LzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgb3V0cHV0IGZyYW1lICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdWludDggKlBWR2V0RGVjT3V0cHV0RnJhbWUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKLXsKLSAgICByZXR1cm4gZGVjQ3RybC0+b3V0cHV0RnJhbWU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXRMYXllcklEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNy8wOS8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZGVjb2RlZCBmcmFtZSBsYXllciBpZCAoQkFTRS9FTkhBTkNFKSAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBQVkdldExheWVySUQoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgcmV0dXJuIHZpZGVvLT5jdXJyTGF5ZXI7Ci19Ci0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWR2V0RGVjTWVtb3J5VXNhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDgvMjMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQuICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQzMiBQVkdldERlY01lbW9yeVVzYWdlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIHJldHVybiB2aWRlby0+bWVtb3J5VXNhZ2U7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldERlY0JpdHN0cmVhbU1vZGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzIzLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZGVjb2RpbmcgbW9kZSBvZiB0aGUgYmFzZWxheWVyICAgICAqLwotLyogICAgICAgICAgICAgIGJpdHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgTVA0RGVjb2RpbmdNb2RlIFBWR2V0RGVjQml0c3RyZWFtTW9kZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQotewotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICBpZiAodmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpCi0gICAgewotICAgICAgICByZXR1cm4gSDI2M19NT0RFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gTVBFRzRfTU9ERTsKLSAgICB9Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkV4dHJhY3RWb2xIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IEV4dHJhY3Qgdm9sIGhlYWRlciBvZiB0aGUgYml0c3RyZWFtIGZyb20gYnVmZmVyW10uICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotQm9vbCBQVkV4dHJhY3RWb2xIZWFkZXIodWludDggKnZpZGVvX2J1ZmZlciwgdWludDggKnZvbF9oZWFkZXIsIGludDMyICp2b2xfaGVhZGVyX3NpemUpCi17Ci0gICAgaW50IGlkeCA9IC0xOwotICAgIHVpbnQ4IHN0YXJ0X2NvZGVfcHJlZml4W10gPSB7IDB4MDAsIDB4MDAsIDB4MDEgfTsKLSAgICB1aW50OCBoMjYzX3ByZWZpeFtdID0geyAweDAwLCAweDAwLCAweDgwIH07Ci0KLSAgICBpZiAob3NjbF9tZW1jbXAoaDI2M19wcmVmaXgsIHZpZGVvX2J1ZmZlciwgMykgPT0gMCkgLyogd2UgaGF2ZSBzaG9ydCBoZWFkZXIgc3RyZWFtICovCi0gICAgewotICAgICAgICBvc2NsX21lbWNweSh2b2xfaGVhZGVyLCB2aWRlb19idWZmZXIsIDMyKTsKLSAgICAgICAgKnZvbF9oZWFkZXJfc2l6ZSA9IDMyOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKG9zY2xfbWVtY21wKHN0YXJ0X2NvZGVfcHJlZml4LCB2aWRlb19idWZmZXIsIDMpIHx8Ci0gICAgICAgICAgICAgICAgKHZpZGVvX2J1ZmZlclszXSAhPSAweGIwICYmIHZpZGVvX2J1ZmZlclszXSA+PSAweDIwKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgd2hpbGUgKG9zY2xfbWVtY21wKHN0YXJ0X2NvZGVfcHJlZml4LCB2aWRlb19idWZmZXIgKyBpZHgsIDMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgICAgIGlmIChpZHggKyAzID49ICp2b2xfaGVhZGVyX3NpemUpIGdvdG8gcXVpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAodmlkZW9fYnVmZmVyW2lkeCszXSAhPSAweGIzICYmIHZpZGVvX2J1ZmZlcltpZHgrM10gIT0gMHhiNik7Ci0KLSAgICAgICAgb3NjbF9tZW1jcHkodm9sX2hlYWRlciwgdmlkZW9fYnVmZmVyLCBpZHgpOwotICAgICAgICAqdm9sX2hlYWRlcl9zaXplID0gaWR4OwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLXF1aXQ6Ci0gICAgb3NjbF9tZW1jcHkodm9sX2hlYWRlciwgdmlkZW9fYnVmZmVyLCAqdm9sX2hlYWRlcl9zaXplKTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkxvY2F0ZUZyYW1lSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzgvMjAwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFJldHVybiB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBTQyBpbiB0aGUgYnVmZmVyICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50MzIgUFZMb2NhdGVGcmFtZUhlYWRlcih1aW50OCAqcHRyLCBpbnQzMiBzaXplKQotewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgaW50MzIgaSA9IHNpemU7Ci0KLSAgICBpZiAoc2l6ZSA8IDEpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIGlmICgoY291bnQgPiAxKSAmJiAoKnB0ciA9PSAweDAxKSkKLSAgICAgICAgewotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKnB0cisrKQotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb3VudCsrOwotICAgIH0KLSAgICByZXR1cm4gKHNpemUgLSAoaSArIDEpKTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWTG9jYXRlSDI2M0ZyYW1lSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQvOC8yMDA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUmV0dXJuIHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0IFNDIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQzMiBQVkxvY2F0ZUgyNjNGcmFtZUhlYWRlcih1aW50OCAqcHRyLCBpbnQzMiBzaXplKQotewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgaW50MzIgaSA9IHNpemU7Ci0KLSAgICBpZiAoc2l6ZSA8IDEpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoaS0tKQotICAgIHsKLSAgICAgICAgaWYgKChjb3VudCA+IDEpICYmICgoKnB0ciAmIDB4RkMpID09IDB4ODApKQotICAgICAgICB7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqcHRyKyspCi0gICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgfQotICAgIHJldHVybiAoc2l6ZSAtIChpICsgMSkpOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZEZWNvZGVWaWRlb0ZyYW1lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IERlY29kZSBvbmUgdmlkZW8gZnJhbWUgYW5kIHJldHVybiBhIFlVVi0xMiBpbWFnZS4gICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogMDQvMTcvMjAwMSByZW1vdmVkIFBWX0VPUywgUFZfRU5EX09GX0JVRkZFUiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICA6IDA4LzIyLzIwMDIgYnJlYWsgdXAgaW50byAyIGZ1bmN0aW9ucyBQVkRlY29kZVZvcEhlYWRlciBhbmQgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBQVkRlY29kZVZvcEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkRlY29kZVZpZGVvRnJhbWUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKmJ1ZmZlcltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0aW1lc3RhbXBbXSwgaW50MzIgYnVmZmVyX3NpemVbXSwgdWludCB1c2VfZXh0X3RpbWVzdGFtcFtdLCB1aW50OCAqY3VycllVVikKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfRkFJTDsKLSAgICBWb3BIZWFkZXJJbmZvIGhlYWRlcl9pbmZvOwotCi0gICAgc3RhdHVzID0gKFBWX1NUQVRVUylQVkRlY29kZVZvcEhlYWRlcihkZWNDdHJsLCBidWZmZXIsIHRpbWVzdGFtcCwgYnVmZmVyX3NpemUsICZoZWFkZXJfaW5mbywgdXNlX2V4dF90aW1lc3RhbXAsIGN1cnJZVVYpOwotICAgIGlmIChzdGF0dXMgIT0gUFZfVFJVRSkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotCi0gICAgaWYgKFBWRGVjb2RlVm9wQm9keShkZWNDdHJsLCBidWZmZXJfc2l6ZSkgIT0gUFZfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkRlY29kZVZvcEhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzIyLzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRGV0ZXJtaW5lIHRhcmdldCBsYXllciBhbmQgZGVjb2RlIHZvcCBoZWFkZXIsIG1vZGlmaWVkIGZyb20gICovCi0vKiAgICAgICAgICAgICAgb3JpZ2luYWwgUFZEZWNvZGVWaWRlb0ZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1Cb29sIFBWRGVjb2RlVm9wSGVhZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpidWZmZXJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRpbWVzdGFtcFtdLCBpbnQzMiBidWZmZXJfc2l6ZVtdLCBWb3BIZWFkZXJJbmZvICpoZWFkZXJfaW5mbywgdWludCB1c2VfZXh0X3RpbWVzdGFtcCBbXSwgdWludDggKmN1cnJZVVYpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICBWb2wgKmN1cnJWb2w7Ci0gICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgVm9wICoqdm9wSGVhZGVyID0gdmlkZW8tPnZvcEhlYWRlcjsKLSAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtOwotCi0gICAgaW50IHRhcmdldF9sYXllcjsKLQotI2lmZGVmIFBWX1NVUFBPUlRfVEVNUE9SQUxfU0NBTEFCSUxJVFkKLSAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfRkFJTDsKLSAgICBpbnQgaWR4OwotICAgIGludDMyIGRpc3BsYXlfdGltZTsKLQotICAgIC8qIGRlY2lkZSB3aGljaCBmcmFtZSB0byBkZWNvZGUgbmV4dCAqLwotICAgIGlmIChkZWNDdHJsLT5uTGF5ZXJzID4gMSkKLSAgICB7Ci0gICAgICAgIGRpc3BsYXlfdGltZSA9IHRhcmdldF9sYXllciA9IC0xOwotICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGRlY0N0cmwtPm5MYXllcnM7IGlkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkbyB3ZSBoYXZlIGRhdGEgZm9yIHRoaXMgbGF5ZXI/ICovCi0gICAgICAgICAgICBpZiAoYnVmZmVyX3NpemVbaWR4XSA8PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRpbWVzdGFtcFtpZHhdID0gLTE7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGRpZCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZSBhIHRpbWVzdGFtcCBmb3IgdGhpcyB2b3A/ICovCi0gICAgICAgICAgICBpZiAodGltZXN0YW1wW2lkeF0gPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2b3BIZWFkZXJbaWR4XS0+dGltZVN0YW1wIDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgdGltZXN0YW1wIGluIHRoZSBiaXRzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJMYXllciA9IGlkeDsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gdmlkZW8tPnZvbFtpZHhdLT5iaXRzdHJlYW07Ci0gICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlc2V0KHN0cmVhbSwgYnVmZmVyW2lkeF0sIGJ1ZmZlcl9zaXplW2lkeF0pOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoc3RhdHVzID0gRGVjb2RlVk9QSGVhZGVyKHZpZGVvLCB2b3BIZWFkZXJbaWR4XSwgRkFMU0UpKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZmluZCBhIFZPUCBoZWFkZXIgaW4gdGhlIGJ1ZmZlci4gICAwOC8zMC8yMDAwLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWU2VhcmNoTmV4dE00VkZyYW1lKHN0cmVhbSkgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIGRhdGEgZm9yIGVuaGFuY2VtZW50IGxheWVyLCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGRvbid0IGp1c3Qgc3RvcC4gICAwOS8wNy8yMDAwLiAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplW2lkeF0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9wSGVhZGVyW2lkeF0tPnRpbWVTdGFtcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wW2lkeF0gPSBDYWxjVm9wRGlzcGxheVRpbWUodmlkZW8tPnZvbFtpZHhdLCB2b3BIZWFkZXJbaWR4XSwgdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAwKSB2b3BIZWFkZXJbaWR4XS0+cmVmU2VsZWN0Q29kZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogV2UndmUgZGVjb2RlZCB0aGlzIHZvcCBoZWFkZXIgaW4gdGhlIHByZXZpb3VzIHJ1biBhbHJlYWR5LiAqLwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBbaWR4XSA9IHZvcEhlYWRlcltpZHhdLT50aW1lU3RhbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBVc2UgdGltZXN0YW1wcyB0byBzZWxlY3QgdGhlIG5leHQgVk9QIHRvIGJlIGRlY29kZWQgKi8KLSAgICAgICAgICAgIGlmICh0aW1lc3RhbXBbaWR4XSA+PSAwICYmIChkaXNwbGF5X3RpbWUgPCAwIHx8IGRpc3BsYXlfdGltZSA+IHRpbWVzdGFtcFtpZHhdKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWUgPSB0aW1lc3RhbXBbaWR4XTsKLSAgICAgICAgICAgICAgICB0YXJnZXRfbGF5ZXIgPSBpZHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChkaXNwbGF5X3RpbWUgPT0gdGltZXN0YW1wW2lkeF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgaGF2ZSB0byBoYW5kbGUgZWl0aGVyIFNOUiBvciBzcGF0aWFsIHNjYWxhYmlsaXR5IGhlcmUuICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldF9sYXllciA8IDApIHJldHVybiBQVl9GQUxTRTsKLQotICAgICAgICAvKiBzZXQgdXAgZm9yIGRlY29kaW5nIHRoZSB0YXJnZXQgbGF5ZXIgKi8KLSAgICAgICAgdmlkZW8tPmN1cnJMYXllciA9IHRhcmdldF9sYXllcjsKLSAgICAgICAgY3VyclZvbCA9IHZpZGVvLT52b2xbdGFyZ2V0X2xheWVyXTsKLSAgICAgICAgdmlkZW8tPmJpdHN0cmVhbSA9IHN0cmVhbSA9IGN1cnJWb2wtPmJpdHN0cmVhbTsKLQotICAgICAgICAvKiBXZSBuZWVkIHRvIGRlY29kZSB0aGUgdm9wIGhlYWRlciBpZiBleHRlcm5hbCB0aW1lc3RhbXAgICAqLwotICAgICAgICAvKiAgICBpcyBwcm92aWRlZC4gICAgMTAvMDQvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAodm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnRpbWVTdGFtcCA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmVhbSA9IHZpZGVvLT52b2xbdGFyZ2V0X2xheWVyXS0+Yml0c3RyZWFtOwotICAgICAgICAgICAgQml0c3RyZWFtUmVzZXQoc3RyZWFtLCBidWZmZXJbdGFyZ2V0X2xheWVyXSwgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChEZWNvZGVWT1BIZWFkZXIodmlkZW8sIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLCBUUlVFKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmaW5kIGEgVk9QIGhlYWRlciBpbiB0aGUgYnVmZmVyLiAgIDA4LzMwLzIwMDAuICovCi0gICAgICAgICAgICAgICAgaWYgKFBWU2VhcmNoTmV4dE00VkZyYW1lKHN0cmVhbSkgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGlmIHdlIGRvbid0IGhhdmUgZGF0YSBmb3IgZW5oYW5jZW1lbnQgbGF5ZXIsICovCi0gICAgICAgICAgICAgICAgICAgIC8qICAgIGRvbid0IGp1c3Qgc3RvcC4gICAwOS8wNy8yMDAwLiAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlkZW8tPnZvbFt0YXJnZXRfbGF5ZXJdLT50aW1lSW5jX29mZnNldCA9IHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT50aW1lSW5jOwotICAgICAgICAgICAgdmlkZW8tPnZvbFt0YXJnZXRfbGF5ZXJdLT5tb2R1bG9UaW1lQmFzZSA9IHRpbWVzdGFtcFt0YXJnZXRfbGF5ZXJdOwotICAgICAgICAgICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnRpbWVTdGFtcCA9IHRpbWVzdGFtcFt0YXJnZXRfbGF5ZXJdOwotICAgICAgICAgICAgaWYgKHRhcmdldF9sYXllciA9PSAwKSB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+cmVmU2VsZWN0Q29kZSA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKiBiYXNlIGxheWVyIG9ubHkgZGVjb2RpbmcgKi8KLSAgICB7Ci0jZW5kaWYKLSAgICAgICAgdmlkZW8tPmN1cnJMYXllciA9IHRhcmdldF9sYXllciA9IDA7Ci0gICAgICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sWzBdOwotICAgICAgICB2aWRlby0+Yml0c3RyZWFtID0gc3RyZWFtID0gY3VyclZvbC0+Yml0c3RyZWFtOwotICAgICAgICBpZiAoYnVmZmVyX3NpemVbMF0gPD0gMCkgcmV0dXJuIFBWX0ZBTFNFOwotICAgICAgICBCaXRzdHJlYW1SZXNldChzdHJlYW0sIGJ1ZmZlclswXSwgYnVmZmVyX3NpemVbMF0pOwotCi0gICAgICAgIGlmICh2aWRlby0+c2hvcnRWaWRlb0hlYWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKERlY29kZVNob3J0SGVhZGVyKHZpZGVvLCB2b3BIZWFkZXJbMF0pICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFBWU2VhcmNoTmV4dEgyNjNGcmFtZShzdHJlYW0pICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyBubyB2b3AgaGVhZGVyIGluIHRoZSBidWZmZXIsICAgICovCi0gICAgICAgICAgICAgICAgICAgIC8qICAgY2xlYW4gYml0c3RyZWFtIGJ1ZmZlci4gICAgIDIvNS8yMDAxICAgKi8KLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemVbMF0gPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmluaXRpYWxpemVkID09IFBWX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHVzZV9leHRfdGltZXN0YW1wWzBdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE1UQiBmb3IgSDI2MyBpcyBhYnNvbHV0ZSBUUiAqLwotICAgICAgICAgICAgICAgIC8qIGZvbGxvd2luZyBsaW5lIGlzIGVxdWl2YWxlbnQgdG8gIHJvdW5kKCh0aW1lc3RhbXBbMF0qMzApLzEwMDEpOyAgIDExLzEzLzIwMDEgKi8KLSAgICAgICAgICAgICAgICB2aWRlby0+dm9sWzBdLT5tb2R1bG9UaW1lQmFzZSA9IDMwICogKCh0aW1lc3RhbXBbMF0gKyAxNykgLyAxMDAxKSArICgzMCAqICgodGltZXN0YW1wWzBdICsgMTcpICUgMTAwMSkgLyAxMDAxKTsKLSAgICAgICAgICAgICAgICB2b3BIZWFkZXJbMF0tPnRpbWVTdGFtcCA9IHRpbWVzdGFtcFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2b3BIZWFkZXJbMF0tPnRpbWVTdGFtcCA9IENhbGNWb3BEaXNwbGF5VGltZShjdXJyVm9sLCB2b3BIZWFkZXJbMF0sIHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChEZWNvZGVWT1BIZWFkZXIodmlkZW8sIHZvcEhlYWRlclswXSwgRkFMU0UpICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVHJ5IHRvIGZpbmQgYSBWT1AgaGVhZGVyIGluIHRoZSBidWZmZXIuICAgMDgvMzAvMjAwMC4gKi8KLSAgICAgICAgICAgICAgICBpZiAoUFZTZWFyY2hOZXh0TTRWRnJhbWUoc3RyZWFtKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgbm8gdm9wIGhlYWRlciBpbiB0aGUgYnVmZmVyLCAgICAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgIGNsZWFuIGJpdHN0cmVhbSBidWZmZXIuICAgICAyLzUvMjAwMSAgICovCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplWzBdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHVzZV9leHRfdGltZXN0YW1wWzBdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbMF0tPnRpbWVJbmNfb2Zmc2V0ID0gdm9wSGVhZGVyWzBdLT50aW1lSW5jOwotICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbMF0tPm1vZHVsb1RpbWVCYXNlID0gdGltZXN0YW1wWzBdOyAgLyogIDExLzEyLzIwMDEgKi8KLSAgICAgICAgICAgICAgICB2b3BIZWFkZXJbMF0tPnRpbWVTdGFtcCA9IHRpbWVzdGFtcFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2b3BIZWFkZXJbMF0tPnRpbWVTdGFtcCA9IENhbGNWb3BEaXNwbGF5VGltZShjdXJyVm9sLCB2b3BIZWFkZXJbMF0sIHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNldCB1cCBzb21lIGJhc2UtbGF5ZXIgb25seSBwYXJhbWV0ZXJzICovCi0gICAgICAgIHZvcEhlYWRlclswXS0+cmVmU2VsZWN0Q29kZSA9IDE7Ci0jaWZkZWYgUFZfU1VQUE9SVF9URU1QT1JBTF9TQ0FMQUJJTElUWQotICAgIH0KLSNlbmRpZgotICAgIHRpbWVzdGFtcFt0YXJnZXRfbGF5ZXJdID0gdmlkZW8tPmN1cnJUaW1lc3RhbXAgPSB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dGltZVN0YW1wOwotI2lmZGVmIFBWX01FTU9SWV9QT09MCi0gICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnlDaGFuID0gKFBJWEVMICopY3VycllVVjsKLSAgICB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dUNoYW4gPSAoUElYRUwgKiljdXJyWVVWICsgZGVjQ3RybC0+c2l6ZTsKLSAgICB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dkNoYW4gPSAoUElYRUwgKikodm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnVDaGFuKSArIChkZWNDdHJsLT5zaXplID4+IDIpOwotI2Vsc2UKLSAgICB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+eUNoYW4gPSBjdXJyVm9wLT55Q2hhbjsKLSAgICB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dUNoYW4gPSBjdXJyVm9wLT51Q2hhbjsKLSAgICB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dkNoYW4gPSBjdXJyVm9wLT52Q2hhbjsKLSNlbmRpZgotICAgIG9zY2xfbWVtY3B5KGN1cnJWb3AsIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLCBzaXplb2YoVm9wKSk7Ci0KLSNpZmRlZiBQVl9TVVBQT1JUX1RFTVBPUkFMX1NDQUxBQklMSVRZCi0gICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnRpbWVTdGFtcCA9IC0xOwotI2VuZGlmCi0gICAgLyogcHV0IGhlYWRlciBpbmZvIGludG8gdGhlIHN0cnVjdHVyZSAqLwotICAgIGhlYWRlcl9pbmZvLT5jdXJyTGF5ZXIgPSB0YXJnZXRfbGF5ZXI7Ci0gICAgaGVhZGVyX2luZm8tPnRpbWVzdGFtcCA9IHZpZGVvLT5jdXJyVGltZXN0YW1wOwotICAgIGhlYWRlcl9pbmZvLT5mcmFtZVR5cGUgPSAoTVA0RnJhbWVUeXBlKWN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOwotICAgIGhlYWRlcl9pbmZvLT5yZWZTZWxDb2RlID0gdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnJlZlNlbGVjdENvZGU7Ci0gICAgaGVhZGVyX2luZm8tPnF1YW50aXplciA9IGN1cnJWb3AtPnF1YW50aXplcjsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkRlY29kZVZvcEJvZHkoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzIyLzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRGVjb2RlIHZvcCBib2R5IGFmdGVyIHRoZSBoZWFkZXIgaXMgZGVjb2RlZCwgbW9kaWZpZWQgZnJvbSAgICovCi0vKiAgICAgICAgICAgICAgb3JpZ2luYWwgUFZEZWNvZGVWaWRlb0ZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1Cb29sIFBWRGVjb2RlVm9wQm9keShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQzMiBidWZmZXJfc2l6ZVtdKQotewotICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9GQUlMOwotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgaW50IHRhcmdldF9sYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7Ci0gICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt0YXJnZXRfbGF5ZXJdOwotICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOwotICAgIFZvcCAqcHJldlZvcCA9IHZpZGVvLT5wcmV2Vm9wOwotICAgIFZvcCAqdGVtcFZvcFB0cjsKLSAgICBpbnQgYnl0ZXNfY29uc3VtZWQgPSAwOyAvKiBSZWNvcmQgaG93IG1hbnkgYml0cyB3ZSB1c2VkIGluIHRoZSBidWZmZXIuICAgMDQvMjQvMjAwMSAqLwotCi0gICAgaW50IGlkeDsKLQotICAgIGlmIChjdXJyVm9wLT52b3BDb2RlZCA9PSAwKSAgICAgICAgICAgICAgICAgIC8qICAwNy8wMy8yMDAxICovCi0gICAgewotICAgICAgICBQVl9CaXRzdHJlYW1CeXRlQWxpZ24oY3VyclZvbC0+Yml0c3RyZWFtKTsKLSAgICAgICAgLyogV2Ugc2hvdWxkIGFsd2F5cyBjbGVhciB1cCBiaXRzdHJlYW0gYnVmZmVyLiAgIDEwLzEwLzIwMDAgKi8KLSAgICAgICAgYnl0ZXNfY29uc3VtZWQgPSAoZ2V0UG9pbnRlcihjdXJyVm9sLT5iaXRzdHJlYW0pICsgNykgPj4gMzsKLQotICAgICAgICBpZiAoYnl0ZXNfY29uc3VtZWQgPiBjdXJyVm9sLT5iaXRzdHJlYW0tPmRhdGFfZW5kX3BvcykKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgPSBjdXJyVm9sLT5iaXRzdHJlYW0tPmRhdGFfZW5kX3BvczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChieXRlc19jb25zdW1lZCA8IGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHdlIG9ubHkgY29uc3VtZSBwYXJ0IG9mIHRoZSBiaXRzIGluIHRoZSBidWZmZXIsIHRha2UgdGhvc2UgKi8KLSAgICAgICAgICAgIC8qICBvdXQuICAgICAwNC8yNC8yMDAxICovCi0gICAgICAgICAgICAvKiAgICAgICAgICBvc2NsX21lbWNweShidWZmZXJbdGFyZ2V0X2xheWVyXSwgYnVmZmVyW3RhcmdldF9sYXllcl0rYnl0ZXNfY29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0tPWJ5dGVzX2NvbnN1bWVkKSk7ICovCi0gICAgICAgICAgICBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdIC09IGJ5dGVzX2NvbnN1bWVkOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSA9IDA7Ci0gICAgICAgIH0KLSNpZmRlZiBQVl9NRU1PUllfUE9PTAotCi0gICAgICAgIGlmICh0YXJnZXRfbGF5ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnRpbWVTdGFtcCA+IHZpZGVvLT5wcmV2Vm9wLT50aW1lU3RhbXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AgPSB2aWRlby0+cHJldkVuaGNWb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZpZGVvLT5wcmV2Vm9wLT55Q2hhbikgewotICAgICAgICAgICAgQUxPR0UoImIvMzUyNjk2MzUiKTsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzUyNjk2MzUiKTsKLSAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBvc2NsX21lbWNweShjdXJyVm9wLT55Q2hhbiwgdmlkZW8tPnByZXZWb3AtPnlDaGFuLCAoZGVjQ3RybC0+c2l6ZSozKSAvIDIpOwotCi0gICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gcHJldlZvcDsKLQotICAgICAgICB2aWRlby0+Y29uY2VhbEZyYW1lID0gY3VyclZvcC0+eUNoYW47ICAgICAgIC8qICAwNy8wNy8yMDAxICovCi0KLSAgICAgICAgdmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9IGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOyAvKiAgMDcvMDkvMDEgKi8KLQotICAgICAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IGN1cnJWb3AtPnlDaGFuOwotCi0gICAgICAgIC8qIFN3YXAgVk9QIHBvaW50ZXJzLiAgTm8gZW5oYy4gZnJhbWUgb3NjbF9tZW1jcHkoKSBhbnltb3JlISAgIDA0LzI0LzIwMDEgKi8KLSAgICAgICAgaWYgKHRhcmdldF9sYXllcikKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcFZvcFB0ciA9IHZpZGVvLT5wcmV2RW5oY1ZvcDsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcCA9IHZpZGVvLT5jdXJyVm9wOwotICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wVm9wUHRyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcFZvcFB0ciA9IHZpZGVvLT5wcmV2Vm9wOwotICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AgPSB2aWRlby0+Y3VyclZvcDsKLSAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcFZvcFB0cjsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKHRhcmdldF9sYXllcikgICAgICAgLyogdGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZmxhc2hiYWNrIHByb2JsZW1zICAgMDYvMjEvMjAwMiovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dGltZVN0YW1wID0gY3VyclZvcC0+dGltZVN0YW1wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnRpbWVTdGFtcCA9IGN1cnJWb3AtPnRpbWVTdGFtcDsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsgLyogIDA3LzA5LzAxICovCi0gICAgICAgIC8qIHRoZSBmb2xsb3dpbmcgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRpc3BsYXlpbmcgYW4gbm90Q29kZWQgSS1WT1AgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlc3Npb24KLSAgICAgICAgb3IgYWZ0ZXIgcmFuZG9tIHBvc2l0aW9uaW5nICAwNy8wMy8wMiovCi0gICAgICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9IFBfVk9QOwotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gUFZfVFJVRTsKLSAgICB9Ci0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotICAgIC8qICBEZWNvZGUgdm9wIGJvZHkgKGlmIHRoZXJlIGlzIG5vIGVycm9yIGluIHRoZSBoZWFkZXIhKSAgKi8KLSAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSAgICAvKiBmaXJzdCwgd2UgbmVlZCB0byBzZWxlY3QgYSByZWZlcmVuY2UgZnJhbWUgKi8KLSAgICBpZiAoZGVjQ3RybC0+bkxheWVycyA+IDEpCi0gICAgewotICAgICAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgaGVyZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IFBfVk9QKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGN1cnJWb3AtPnJlZlNlbGVjdENvZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwIDogLyogbW9zdCByZWNlbnRseSBkZWNvZGVkIGVuaGFuY2VtZW50IHZvcCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBTZXR1cCB2aWRlby0+cHJldlZvcCBiZWZvcmUgd2UgY2FsbCBQVl9EZWNvZGVWb3AoKS4gICAwNC8yNC8yMDAxICovCi0gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnRpbWVTdGFtcCA+PSB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AgPSB2aWRlby0+cHJldkVuaGNWb3A7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxIDogLyogbW9zdCByZWNlbnRseSBkaXNwbGF5ZWQgYmFzZS1sYXllciB2b3AgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldF9sYXllcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+dGltZVN0YW1wID4gdmlkZW8tPnByZXZWb3AtPnRpbWVTdGFtcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHJldlZvcCA9IHZpZGVvLT5wcmV2RW5oY1ZvcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMiA6IC8qIG5leHQgYmFzZS1sYXllciB2b3AgaW4gZGlzcGxheSBvcmRlciAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMyA6IC8qIHRlbXBvcmFsbHkgY29pbmNpZGVudCBiYXNlLWxheWVyIHZvcCAobm8gTVYncykgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiB3ZSBoYXZlIGEgQi1Wb3AgKi8KLSAgICAgICAgewotICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlVmlkZW9GcmFtZSgpOiBCLVZPUCBub3Qgc3VwcG9ydGVkLlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGZyYW1lIHJhdGUgYW5kIGJpdHJhdGUuICovCi0gICAgaWR4ID0gKyt2aWRlby0+ZnJhbWVfaWR4ICUgQklUUkFURV9BVkVSQUdFX1dJTkRPVzsKLQotICAgIC8qIENhbGN1bGF0ZSBiaXRyYXRlIGZvciB0aGlzIGxheWVyLiAgIDA4LzIzLzIwMDAgKi8KLSAgICBzdGF0dXMgPSBQVl9EZWNvZGVWb3AodmlkZW8pOwotICAgIHZpZGVvLT5uQml0c1BlclZvcFtpZHhdID0gZ2V0UG9pbnRlcihjdXJyVm9sLT5iaXRzdHJlYW0pOwotICAgIHZpZGVvLT5wcmV2VGltZXN0YW1wW2lkeF0gPSBjdXJyVm9wLT50aW1lU3RhbXA7Ci0KLSAgICAvKiByZXN0b3JlIHZpZGVvLT5wcmV2Vm9wIGFmdGVyIFBWX0RlY29kZVZvcCgpLiAgIDA0LzI0LzIwMDEgKi8KLS8vICBpZiAoY3VyclZvcC0+cmVmU2VsZWN0Q29kZSA9PSAwKSB2aWRlby0+cHJldlZvcCA9IHByZXZWb3A7Ci0gICAgdmlkZW8tPnByZXZWb3AgPSBwcmV2Vm9wOwotCi0gICAgLyogRXN0aW1hdGUgdGhlIGZyYW1lIHJhdGUuICAgMDgvMjMvMjAwMCAqLwotICAgIHZpZGVvLT5kdXJhdGlvbiA9IHZpZGVvLT5wcmV2VGltZXN0YW1wW2lkeF07Ci0gICAgdmlkZW8tPmR1cmF0aW9uIC09IHZpZGVvLT5wcmV2VGltZXN0YW1wWygrK2lkeCklQklUUkFURV9BVkVSQUdFX1dJTkRPV107Ci0gICAgaWYgKHZpZGVvLT5kdXJhdGlvbiA+IDApCi0gICAgeyAvKiBPbmx5IHVwZGF0ZSBmcmFtZXJhdGUgd2hlbiB0aGUgdGltZXN0YW1wIGlzIHJpZ2h0ICovCi0gICAgICAgIHZpZGVvLT5mcmFtZVJhdGUgPSAoaW50KShGUkFNRVJBVEVfU0NBTEUpIC8gdmlkZW8tPmR1cmF0aW9uOwotICAgIH0KLQotICAgIC8qIFdlIHNob3VsZCBhbHdheXMgY2xlYXIgdXAgYml0c3RyZWFtIGJ1ZmZlci4gICAxMC8xMC8yMDAwICovCi0gICAgYnl0ZXNfY29uc3VtZWQgPSAoZ2V0UG9pbnRlcihjdXJyVm9sLT5iaXRzdHJlYW0pICsgNykgPj4gMzsgLyogIDExLzQvMDMgKi8KLQotICAgIGlmIChieXRlc19jb25zdW1lZCA+IGN1cnJWb2wtPmJpdHN0cmVhbS0+ZGF0YV9lbmRfcG9zKQotICAgIHsKLSAgICAgICAgYnl0ZXNfY29uc3VtZWQgPSBjdXJyVm9sLT5iaXRzdHJlYW0tPmRhdGFfZW5kX3BvczsKLSAgICB9Ci0KLSAgICBpZiAoYnl0ZXNfY29uc3VtZWQgPCBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdKQotICAgIHsKLSAgICAgICAgLyogSWYgd2Ugb25seSBjb25zdW1lIHBhcnQgb2YgdGhlIGJpdHMgaW4gdGhlIGJ1ZmZlciwgdGFrZSB0aG9zZSAqLwotICAgICAgICAvKiAgb3V0LiAgICAgMDQvMjQvMjAwMSAqLwotICAgICAgICAvKiAgICAgIG9zY2xfbWVtY3B5KGJ1ZmZlclt0YXJnZXRfbGF5ZXJdLCBidWZmZXJbdGFyZ2V0X2xheWVyXStieXRlc19jb25zdW1lZCwKLSAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0tPWJ5dGVzX2NvbnN1bWVkKSk7ICovCi0gICAgICAgIGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0gLT0gYnl0ZXNfY29uc3VtZWQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0gPSAwOwotICAgIH0KLSAgICBzd2l0Y2ggKHN0YXR1cykKLSAgICB7Ci0gICAgICAgIGNhc2UgUFZfRkFJTCA6Ci0gICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7ICAgICAgICAvKiB0aGlzIHdpbGwgdGFrZSBjYXJlIG9mIGNvbmNlYWxtZW50IGlmIHdlIGxvc2Ugd2hvbGUgZnJhbWUgICovCi0KLSAgICAgICAgY2FzZSBQVl9FTkRfT0ZfVk9QIDoKLSAgICAgICAgICAgIC8qIHdlIG1heSB3YW50IHRvIGRpZmZlcmVuY2lhdGUgUFZfRU5EX09GX1ZPUCBhbmQgUFZfU1VDQ0VTUyAqLwotICAgICAgICAgICAgLyogICAgaW4gdGhlIGZ1dHVyZS4gICAgIDA1LzEwLzIwMDAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBjYXNlIFBWX1NVQ0NFU1MgOgotICAgICAgICAgICAgLyogTm9odGluZyBpcyB3cm9uZyA6KS4gKi8KLQotCi0gICAgICAgICAgICB2aWRlby0+Y29uY2VhbEZyYW1lID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuOyAgICAgICAvKiAgMDcvMDcvMjAwMSAqLwotCi0gICAgICAgICAgICB2aWRlby0+dm9wX2NvZGluZ190eXBlID0gdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOyAvKiAgMDcvMDkvMDEgKi8KLQotICAgICAgICAgICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW47Ci0KLSAgICAgICAgICAgIC8qIFN3YXAgVk9QIHBvaW50ZXJzLiAgTm8gZW5oYy4gZnJhbWUgb3NjbF9tZW1jcHkoKSBhbnltb3JlISAgIDA0LzI0LzIwMDEgKi8KLSAgICAgICAgICAgIGlmICh0YXJnZXRfbGF5ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcFZvcFB0ciA9IHZpZGVvLT5wcmV2RW5oY1ZvcDsKLSAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AgPSB2aWRlby0+Y3VyclZvcDsKLSAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclZvcCA9IHRlbXBWb3BQdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcFZvcFB0ciA9IHZpZGVvLT5wcmV2Vm9wOwotICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wVm9wUHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAvKiBUaGlzIHdpbGwgbmV2ZXIgaGFwcGVuICovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLQotI2lmZGVmIFBWX01FTU9SWV9QT09MCi1PU0NMX0VYUE9SVF9SRUYgdm9pZCBQVlNldFJlZmVyZW5jZVlVVihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqWVVWKQotewotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSAoUElYRUwgKilZVVY7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gKFBJWEVMICopWVVWICsgdmlkZW8tPnNpemU7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gKFBJWEVMICopdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKGRlY0N0cmwtPnNpemUgPj4gMik7Ci0gICAgb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AtPnlDaGFuLCAxNiwgc2l6ZW9mKHVpbnQ4KSpkZWNDdHJsLT5zaXplKTsgICAgIC8qICAxMC8zMS8wMSAqLwotICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiwgMTI4LCBzaXplb2YodWludDgpKmRlY0N0cmwtPnNpemUgLyAyKTsKLSAgICB2aWRlby0+Y29uY2VhbEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOyAgICAgICAgICAgICAgIC8qICAwNy8wNy8yMDAxICovCi0gICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSB2aWRlby0+cHJldlZvcC0+eUNoYW47ICAgICAgICAgICAgICAvKiAgMDYvMTkvMjAwMiAqLwotfQotI2VuZGlmCi0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA2LzIwLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZXZlcnl0aW1lIGFuIGVycm9yIGludCB0aGUgICAgICAqLwotLyogICAgICAgICAgICAgIGJpdHN0cmVhbSBpcyBkZXRlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi11aW50IFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQoVmlkZW9EZWNEYXRhICopCi17Ci0gICAgLyogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHRyYXBwaW5nIGJpdHN0cmVhbSBlcnJvciBmb3IgZGVidWdpbmcgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotI2lmZGVmIEVOQUJMRV9MT0cKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBtNHZkZWNfZHByaW50ZigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzE1LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogVGhpcyBpcyBhIGZ1bmN0aW9uIHRoYXQgbG9ncyBtZXNzYWdlcyBpbiB0aGUgbXBlZzQgdmlkZW8gICAgICovCi0vKiAgICAgICAgICAgICBkZWNvZGVyLiAgV2UgY2FuIGNhbGwgdGhlIHN0YW5kYXJkIFBhY2tldFZpZGVvIFBWTWVzc2FnZSAgICAgKi8KLS8qICAgICAgICAgICAgIGZyb20gaW5zaWRlIHRoaXMgZnVuY3Rpb24gaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6IFRvIHR1cm4gb24gdGhlIGxvZ2dpbmcsIExPR19NUDRERUNfTUVTU0FHRSBtdXN0IGJlIGRlZmluZWQgICAqLwotLyogICAgICAgICAgICAgIHdoZW4gY29tcGlsaW5nIHRoaXMgZmlsZSAob25seSB0aGlzIGZpbGUpLiAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdm9pZCBtNHZkZWNfZHByaW50ZihjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgICBGSUxFICpsb2dfZnA7Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0KLSAgICAvKiBvcGVuIHRoZSBsb2cgZmlsZSAqLwotICAgIGxvZ19mcCA9IGZvcGVuKCJcXG1wNGRlY19sb2cudHh0IiwgImErIik7Ci0gICAgaWYgKGxvZ19mcCA9PSBOVUxMKSByZXR1cm47Ci0gICAgLyogb3V0cHV0IHRoZSBtZXNzYWdlICovCi0gICAgdmZwcmludGYobG9nX2ZwLCBmb3JtYXQsIGFyZ3MpOwotICAgIGZjbG9zZShsb2dfZnApOwotCi0gICAgdmFfZW5kKGFyZ3MpOwotfQotI2VuZGlmCi0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBJc0ludHJhRnJhbWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA1LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFRoZSBtb3N0IHJlY2VudGx5IGRlY29kZWQgZnJhbWUgaXMgYW4gSW50cmEgZnJhbWUuICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotQm9vbCBJc0ludHJhRnJhbWUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgcmV0dXJuICh2aWRlby0+dm9wX2NvZGluZ190eXBlID09IElfVk9QKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkRlY1Bvc3RQcm9jZXNzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDAxLzA5LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogUG9zdFByb2Nlc3Mgb25lIHZpZGVvIGZyYW1lIGFuZCByZXR1cm4gYSBZVVYtMTIgaW1hZ2UuICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdm9pZCBQVkRlY1Bvc3RQcm9jZXNzKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpvdXRwdXRZVVYpCi17Ci0gICAgdWludDggKm91dHB1dEJ1ZmZlcjsKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgaW50MzIgdG1wdmFyOwotICAgIGlmIChvdXRwdXRZVVYpCi0gICAgewotICAgICAgICBvdXRwdXRCdWZmZXIgPSBvdXRwdXRZVVY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlciA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlciA9IGRlY0N0cmwtPm91dHB1dEZyYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSkKLSAgICB7Ci0gICAgICAgIC8qIFBvc3QtcHJvY2Vzc2luZywgICovCi0gICAgICAgIFBvc3RGaWx0ZXIodmlkZW8sIHZpZGVvLT5wb3N0RmlsdGVyVHlwZSwgb3V0cHV0QnVmZmVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKG91dHB1dFlVVikKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29weSBkZWNvZGVkIGZyYW1lIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiAqLwotICAgICAgICAgICAgdG1wdmFyID0gKGludDMyKXZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7Ci0gICAgICAgICAgICBvc2NsX21lbWNweShvdXRwdXRCdWZmZXIsIGRlY0N0cmwtPm91dHB1dEZyYW1lLCB0bXB2YXIqMyAvIDIpOyAgICAgICAgICAgLyogIDMvMy8wMSAqLwotICAgICAgICB9Ci0gICAgfQotI2Vsc2UKLSAgICBvdXRwdXRCdWZmZXIgPSBkZWNDdHJsLT5vdXRwdXRGcmFtZTsKLSAgICBvdXRwdXRZVVY7Ci0jZW5kaWYKLSAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IG91dHB1dEJ1ZmZlcjsKLSAgICByZXR1cm47Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkRlY1NldFJlZmVyZW5jZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWLCAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgdGltZXN0YW1wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDcvMjIvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBHZXQgWVVWIHJlZmVyZW5jZSBmcmFtZSBmcm9tIGV4dGVybmFsIHNvdXJjZS4gICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6IFlVViA0LTItMCBmcmFtZSBjb250YWluaW5nIG5ldyByZWZlcmVuY2UgZnJhbWUgaW4gdGhlIHNhbWUgICAqLwotLyogICA6IGRpbWVuc2lvbiBhcyBvcmlnaW5hbCwgaS5lLiwgZG9lc24ndCBoYXZlIHRvIGJlIG11bHRpcGxlIG9mIDE2ICEhIS4gICovCi0vKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUJvb2wgUFZEZWNTZXRSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgdWludDMyIHRpbWVzdGFtcCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIFZvcCAqcHJldlZvcCA9IHZpZGVvLT5wcmV2Vm9wOwotICAgIGludCB3aWR0aCA9IHZpZGVvLT53aWR0aDsKLSAgICB1aW50OCAqZHN0UHRyLCAqb3JnUHRyLCAqZHN0UHRyMiwgKm9yZ1B0cjI7Ci0gICAgaW50MzIgc2l6ZSA9IChpbnQzMil3aWR0aCAqIHZpZGVvLT5oZWlnaHQ7Ci0KLQotICAgIC8qIHNldCBuZXcgcGFyYW1ldGVycyAqLwotICAgIHByZXZWb3AtPnRpbWVTdGFtcCA9IHRpbWVzdGFtcDsKLSAgICBwcmV2Vm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOwotCi0gICAgZHN0UHRyID0gcHJldlZvcC0+eUNoYW47Ci0gICAgb3JnUHRyID0gcmVmWVVWOwotICAgIG9zY2xfbWVtY3B5KGRzdFB0ciwgb3JnUHRyLCBzaXplKTsKLSAgICBkc3RQdHIgPSBwcmV2Vm9wLT51Q2hhbjsKLSAgICBkc3RQdHIyID0gcHJldlZvcC0+dkNoYW47Ci0gICAgb3JnUHRyID0gcmVmWVVWICsgc2l6ZTsKLSAgICBvcmdQdHIyID0gb3JnUHRyICsgKHNpemUgPj4gMik7Ci0gICAgb3NjbF9tZW1jcHkoZHN0UHRyLCBvcmdQdHIsIChzaXplID4+IDIpKTsKLSAgICBvc2NsX21lbWNweShkc3RQdHIyLCBvcmdQdHIyLCAoc2l6ZSA+PiAyKSk7Ci0KLSAgICB2aWRlby0+Y29uY2VhbEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOwotICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBJX1ZPUDsKLSAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsKLQotICAgIHJldHVybiBQVl9UUlVFOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWRGVjU2V0RW5oUmVmZXJlbmNlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYsICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgdGltZXN0YW1wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDcvMjMvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBHZXQgWVVWIGVuaGFuY2UgcmVmZXJlbmNlIGZyYW1lIGZyb20gZXh0ZXJuYWwgc291cmNlLiAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6IFlVViA0LTItMCBmcmFtZSBjb250YWluaW5nIG5ldyByZWZlcmVuY2UgZnJhbWUgaW4gdGhlIHNhbWUgICAqLwotLyogICA6IGRpbWVuc2lvbiBhcyBvcmlnaW5hbCwgaS5lLiwgZG9lc24ndCBoYXZlIHRvIGJlIG11bHRpcGxlIG9mIDE2ICEhIS4gICovCi0vKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUJvb2wgUFZEZWNTZXRFbmhSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgdWludDMyIHRpbWVzdGFtcCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIFZvcCAqcHJldkVuaGNWb3AgPSB2aWRlby0+cHJldkVuaGNWb3A7Ci0gICAgdWludDggKmRzdFB0ciwgKm9yZ1B0ciwgKmRzdFB0cjIsICpvcmdQdHIyOwotICAgIGludDMyIHNpemUgPSAoaW50MzIpIHZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7Ci0KLSAgICBpZiAodmlkZW8tPm51bWJlck9mTGF5ZXJzIDw9IDEpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLQotCi0gICAgLyogc2V0IG5ldyBwYXJhbWV0ZXJzICovCi0gICAgcHJldkVuaGNWb3AtPnRpbWVTdGFtcCA9IHRpbWVzdGFtcDsKLSAgICBwcmV2RW5oY1ZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKLQotICAgIGRzdFB0ciA9IHByZXZFbmhjVm9wLT55Q2hhbjsKLSAgICBvcmdQdHIgPSByZWZZVVY7Ci0gICAgb3NjbF9tZW1jcHkoZHN0UHRyLCBvcmdQdHIsIHNpemUpOwotICAgIGRzdFB0ciA9IHByZXZFbmhjVm9wLT51Q2hhbjsKLSAgICBkc3RQdHIyID0gcHJldkVuaGNWb3AtPnZDaGFuOwotICAgIG9yZ1B0ciA9IHJlZllVViArIHNpemU7Ci0gICAgb3JnUHRyMiA9IG9yZ1B0ciArIChzaXplID4+IDIpOwotICAgIG9zY2xfbWVtY3B5KGRzdFB0ciwgb3JnUHRyLCAoc2l6ZSA+PiAyKSk7Ci0gICAgb3NjbF9tZW1jcHkoZHN0UHRyMiwgb3JnUHRyMiwgKHNpemUgPj4gMikpOwotICAgIHZpZGVvLT5jb25jZWFsRnJhbWUgPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuOwotICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBJX1ZPUDsKLSAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW47Ci0KLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWR2V0Vm9sSW5mbygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDgvMDYvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBHZXQgdGhlIHZvbCBpbmZvKG9ubHkgYmFzZS1sYXllcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6IDA2LzI0LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1Cb29sIFBWR2V0Vm9sSW5mbyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBWb2xJbmZvICpwVm9sSW5mbykKLXsKLSAgICBWb2wgKmN1cnJWb2w7Ci0KLSAgICBpZiAocFZvbEluZm8gPT0gTlVMTCB8fCBkZWNDdHJsID09IE5VTEwgfHwgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAoKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEpLT52b2xbMF0gPT0gTlVMTCkgcmV0dXJuIFBWX0ZBTFNFOwotCi0gICAgY3VyclZvbCA9ICgoVmlkZW9EZWNEYXRhICopKGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEpKS0+dm9sWzBdOwotCi0gICAgLy8gZ2V0IHRoZSBWT0wgaW5mbwotICAgIHBWb2xJbmZvLT5zaG9ydFZpZGVvSGVhZGVyID0gKGludDMyKSgoVmlkZW9EZWNEYXRhICopKGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEpKS0+c2hvcnRWaWRlb0hlYWRlcjsKLSAgICBwVm9sSW5mby0+ZGF0YVBhcnRpdGlvbmluZyA9IChpbnQzMiljdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nOwotICAgIHBWb2xJbmZvLT5lcnJvclJlc0Rpc2FibGUgID0gKGludDMyKWN1cnJWb2wtPmVycm9yUmVzRGlzYWJsZTsKLSAgICBwVm9sSW5mby0+dXNlUmV2ZXJzZVZMQyAgICA9IChpbnQzMiljdXJyVm9sLT51c2VSZXZlcnNlVkxDOwotICAgIHBWb2xJbmZvLT5zY2FsYWJpbGl0eSAgICAgID0gKGludDMyKWN1cnJWb2wtPnNjYWxhYmlsaXR5OwotICAgIHBWb2xJbmZvLT5uYml0c1RpbWVJbmNSZXMgID0gKGludDMyKWN1cnJWb2wtPm5iaXRzVGltZUluY1JlczsKLSAgICBwVm9sSW5mby0+cHJvZmlsZV9sZXZlbF9pZCA9IChpbnQzMiljdXJyVm9sLT5wcm9maWxlX2xldmVsX2lkOwotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiMzg4OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY4MSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgImxvZy9sb2cuaCIKLQotI2luY2x1ZGUgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICJiaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJ2bGNfZGVjb2RlLmgiCi0jaW5jbHVkZSAiemlnemFnLmgiCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09OVl9QT1NTSUJMRV9MT1NTX09GX0RBVEEKLQotI2lmZGVmIFBWX1NVUFBPUlRfTUFJTl9QUk9GSUxFCi0vKiBJTlRSQSAqLwotY29uc3Qgc3RhdGljIGludCBtcGVnX2lxbWF0X2RlZltOQ09FRkZfQkxPQ0tdID0KLXsKLSAgICA4LCAxNywgMTgsIDE5LCAyMSwgMjMsIDI1LCAyNywKLSAgICAxNywgMTgsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjgsCi0gICAgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjgsIDMwLAotICAgIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjgsIDMwLCAzMiwKLSAgICAyMiwgMjMsIDI0LCAyNiwgMjgsIDMwLCAzMiwgMzUsCi0gICAgMjMsIDI0LCAyNiwgMjgsIDMwLCAzMiwgMzUsIDM4LAotICAgIDI1LCAyNiwgMjgsIDMwLCAzMiwgMzUsIDM4LCA0MSwKLSAgICAyNywgMjgsIDMwLCAzMiwgMzUsIDM4LCA0MSwgNDUKLX07Ci0KLS8qIElOVEVSICovCi1jb25zdCBzdGF0aWMgaW50IG1wZWdfbnFtYXRfZGVmWzY0XSAgPQotewotICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKLSAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCi0gICAgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAotICAgIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI2LCAyNywKLSAgICAyMCwgMjEsIDIyLCAyMywgMjUsIDI2LCAyNywgMjgsCi0gICAgMjEsIDIyLCAyMywgMjQsIDI2LCAyNywgMjgsIDMwLAotICAgIDIyLCAyMywgMjQsIDI2LCAyNywgMjgsIDMwLCAzMSwKLSAgICAyMywgMjQsIDI1LCAyNywgMjgsIDMwLCAzMSwgMzMKLX07Ci0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBDYWxjTnVtQml0cygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBDYWxjdWxhdGUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICByZXByZXNlbnQgeC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogVGhpcyBpcyBhbiBlcXVpdmFsZW50IGltcGxlbWVudGF0aW9uIG9mICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAobG9uZyljZWlsKGxvZygoZG91YmxlKXgpL2xvZygyLjApKSAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgQ2FsY051bUJpdHModWludCB4KQotewotICAgIGludCBpID0gMTsKLSAgICB3aGlsZSAoeCA+Pj0gMSkgaSsrOwotICAgIHJldHVybiBpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCi0qCi0qIC0tIERlY29kZVZvbEhlYWRlciAtLSBEZWNvZGUgdGhlIGhlYWRlciBvZiBhIFZPTAotKgotKiAgIDA0LzEwLzIwMDAgOiBpbml0aWFsIG1vZGlmaWNhdGlvbiB0byB0aGUgbmV3IFBWLURlY29kZXIgTGliIGZvcm1hdC4KLSogICAxMC8xMi8yMDAxIDogcmVqZWN0IG5vbiBjb21wbGlhbnQgYml0c3RyZWFtcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50RW5kKioqKioqKiovCi1QVl9TVEFUVVMgRGVjb2RlVk9MSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBsYXllcikKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzOwotICAgIFZvbCAqY3VyclZvbDsKLSAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtOwotICAgIHVpbnQzMiB0bXB2YXIsIHZvbF9zaGFwZTsKLSAgICB1aW50MzIgc3RhcnRDb2RlOwotI2lmZGVmIFBWX1NVUFBPUlRfTUFJTl9QUk9GSUxFCi0gICAgaW50ICpxbWF0LCBpLCBqOwotI2VuZGlmCi0gICAgaW50IHZlcnNpb25faWQgPSAxOwotI2lmZGVmIFBWX1RPTEVSQVRFX1ZPTF9FUlJPUlMKLSAgICB1aW50MzIgcHJvZmlsZSA9IDB4MDE7Ci0jZW5kaWYKLSAgICAvKiAgVGhlcmUncyBhICJjdXJyTGF5ZXIiIHZhcmlhYmxlIGluc2lkZSB2aWRlb0RlY0RhdGEuICAgICAgICAgICovCi0gICAgLyogICBIb3dldmVyLCB3ZSBkb24ndCBtYWludGFpbiBpdCB1bnRpbCB3ZSBkZWNvZGUgZnJhbWUgZGF0YS4gIDA0LzA1LzIwMDAgKi8KLSAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFtsYXllcl07Ci0gICAgc3RyZWFtICA9IGN1cnJWb2wtPmJpdHN0cmVhbTsKLSAgICBjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSA9IDA7Ci0KLSAgICAvKiBEZXRlcm1pbmUgd2hpY2ggc3RhcnQgY29kZSBmb3IgdGhlIGRlY29kZXIgdG8gYmVnaW4gd2l0aCAqLwotICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzJIQyhzdHJlYW0sICZzdGFydENvZGUpOwotCi0gICAgaWYgKHN0YXJ0Q29kZSA9PSBWSVNVQUxfT0JKRUNUX1NFUVVFTkNFX1NUQVJUX0NPREUpCi0gICAgeyAgIC8qICBCaXRzdHJlYW0gRXhoY2hhbmdlIEZpeCA5Lzk5ICovCi0gICAgICAgIC8qIEJpdHN0cmVhbSBFeGNoYW5nZSByZXF1aXJlcyB3ZSBhbGxvdyBzdGFydCB3aXRoIFZpZGVvIE9iamVjdCBTZXF1ZW5jZSAqLwotICAgICAgICAvKiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgICAgICAgICAgICAqLwotICAgICAgICAodm9pZCkgQml0c3RyZWFtUmVhZEJpdHMzMkhDKHN0cmVhbSk7Ci0gICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAgOCk7IC8qIHByb2ZpbGUgKi8KLSNpZm5kZWYgUFZfVE9MRVJBVEVfVk9MX0VSUk9SUwotICAgICAgICBpZiAobGF5ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyogc3VwcG9ydCBTU1BMMC0yICAqLwotICAgICAgICAgICAgaWYgKHRtcHZhciAhPSAweDEwICYmIHRtcHZhciAhPSAweDExICYmIHRtcHZhciAhPSAweDEyICYmCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciAhPSAweEExICYmIHRtcHZhciAhPSAweEEyICAmJiB0bXB2YXIgIT0gMHhBMy8qIENvcmUgU1BATDEtTDMgKi8pCi0gICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdXBwb3J0IFNQTDAtMyAmIFNTUEwwLTIgICAqLwotICAgICAgICAgICAgaWYgKHRtcHZhciAhPSAweDAxICYmIHRtcHZhciAhPSAweDAyICYmIHRtcHZhciAhPSAweDAzICYmIHRtcHZhciAhPSAweDA4ICYmCi0gICAgICAgICAgICAgICAgICAgIC8qIFdoaWxlIG5vdCB0ZWNobmljYWxseSBzdXBwb3J0ZWQsIHRyeSB0byBkZWNvZGUgU1BMNCZTUEw1IGZpbGVzIGFzIHdlbGwuICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFdlJ2xsIGZhaWwgbGF0ZXIgaWYgdGhlIHNpemUgaXMgdG9vIGxhcmdlLiAgVGhpcyBpcyB0byBhbGxvdyBwbGF5YmFjayBvZiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBzb21lIDw9Q0lGIGZpbGVzIGdlbmVyYXRlZCBieSBvdGhlciBlbmNvZGVycy4gKi8KLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4MDQgJiYgdG1wdmFyICE9IDB4MDUgJiYKLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4MTAgJiYgdG1wdmFyICE9IDB4MTEgJiYgdG1wdmFyICE9IDB4MTIgJiYKLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4MjEgJiYgdG1wdmFyICE9IDB4MjIgJiYgIC8qIENvcmUgUHJvZmlsZSBMZXZlbHMgKi8KLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4QTEgJiYgdG1wdmFyICE9IDB4QTIgJiYgdG1wdmFyICE9IDB4QTMgJiYKLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4RjAgJiYgdG1wdmFyICE9IDB4RjEgJiYgLyogQWR2YW5jZWQgU2ltcGxlIFByb2ZpbGUgTGV2ZWxzKi8KLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4RjIgJiYgdG1wdmFyICE9IDB4RjMgJiYKLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4RjQgJiYgdG1wdmFyICE9IDB4RjUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIHByb2ZpbGUgPSB0bXB2YXI7Ci0jZW5kaWYKLQotICAgICAgICAvLyBzYXZlIHRoZSBwcm9maWxlIGFuZCBsZXZlbCBmb3IgdGhlIHF1ZXJ5Ci0gICAgICAgIGN1cnJWb2wtPnByb2ZpbGVfbGV2ZWxfaWQgPSAodWludCl0bXB2YXI7IC8vICA2LzEwLzA0Ci0KLQotCi0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzJIQyhzdHJlYW0sICZ0bXB2YXIpOwotICAgICAgICBpZiAodG1wdmFyID09IFVTRVJfREFUQV9TVEFSVF9DT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTb21ldGhpbmcgaGFzIHRvIGJlIGRvbmUgd2l0aCB1c2VyIGRhdGEgIDExLzExLzk5ICovCi0gICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVVc2VyRGF0YShzdHJlYW0pOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotICAgICAgICAvKiB2aXN1YWxfb2JqZWN0X3N0YXJ0X2NvZGUgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBCaXRzdHJlYW1TaG93Qml0czMySEMoc3RyZWFtLCAmdG1wdmFyKTsKLSAgICAgICAgaWYgKHRtcHZhciAhPSBWSVNVQUxfT0JKRUNUX1NUQVJUX0NPREUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2VhcmNoIGZvciBWT0xfSEVBREVSICovCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZTZWFyY2hOZXh0TTRWRnJhbWUoc3RyZWFtKTsgLyogc2VhcmNoIDB4MDAgMHgwMCAweDAxICovCi0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsgLyogYnJlYWtzIHRoZSBsb29wICovCi0gICAgICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCwgJnRtcHZhcik7Ci0gICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAodG1wdmFyICE9IFZPTF9TVEFSVF9DT0RFKTsKLSAgICAgICAgICAgIGdvdG8gZGVjb2RlX3ZvbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzMzJIQyhzdHJlYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogIGlzX3Zpc3VhbF9vYmplY3RfaWRlbnRpZmllciAgICAgICAgICAgICovCi0gICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgICAgICBpZiAodG1wdmFyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB2aXN1YWxfb2JqZWN0X3ZlcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNCk7Ci0gICAgICAgICAgICAvKiB2aXN1YWxfb2JqZWN0X3ByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogdmlzdWFsX29iamVjdF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIDQsICZ0bXB2YXIpOwotICAgICAgICBpZiAodG1wdmFyID09IDEpCi0gICAgICAgIHsgLyogdmlkZW9fc2lnbmFsX3R5cGUgKi8KLSAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDQpOwotICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgICAgICBpZiAodG1wdmFyID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogdmlkZW9fZm9ybWF0ICovCi0gICAgICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDMpOwotICAgICAgICAgICAgICAgIC8qIHZpZGVvX3JhbmdlICAqLwotICAgICAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgICAgICAgICAgICAgIC8qIGNvbG9yX2Rlc2NyaXB0aW9uICovCi0gICAgICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcHZhciA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogY29sb3JfcHJpbWFyaWVzICovCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzICovCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgLyogbWF0cml4X2NvZWZmaWNpZW50cyAqLwotICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTZWFyY2ggZm9yIFZPTF9IRUFERVIgKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVlNlYXJjaE5leHRNNFZGcmFtZShzdHJlYW0pOyAvKiBzZWFyY2ggMHgwMCAweDAwIDB4MDEgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpIHJldHVybiBQVl9GQUlMOyAvKiBicmVha3MgdGhlIGxvb3AgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgVk9MX1NUQVJUX0NPREVfTEVOR1RILCAmdG1wdmFyKTsKLSAgICAgICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCA4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICh0bXB2YXIgIT0gVk9MX1NUQVJUX0NPREUpOwotICAgICAgICAgICAgZ290byBkZWNvZGVfdm9sOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbmV4dF9zdGFydF9jb2RlKCkgKi8KLSAgICAgICAgc3RhdHVzID0gUFZfQml0c3RyZWFtQnl0ZUFsaWduKHN0cmVhbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxMC8xMi8wMSAqLwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMySEMoc3RyZWFtLCAmdG1wdmFyKTsKLQotICAgICAgICBpZiAodG1wdmFyID09IFVTRVJfREFUQV9TVEFSVF9DT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTb21ldGhpbmcgaGFzIHRvIGJlIGRvbmUgdG8gZGVhbCB3aXRoIHVzZXIgZGF0YSAocGFyc2UgaXQpICAxMS8xMS85OSAqLwotICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGEoc3RyZWFtKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIDI3LCAmdG1wdmFyKTsgICAvKiAgMTAvMTIvMDEgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogICAgICB0bXB2YXIgPSAwOyAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEwLzEyLzAxICovCi0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzIoc3RyZWFtLCAyNywgJnRtcHZhcik7ICAgICAvKiB1bmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydCBkZWNvZGluZyB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX29iamVjdF9zdGFydF9jb2RlICovCi0gICAgfQotCi0gICAgaWYgKHRtcHZhciA9PSBWT19TVEFSVF9DT0RFKQotICAgIHsKLSAgICAgICAgLyoqKioqCi0gICAgICAgICoKLSAgICAgICAgKiAgIFJlYWQgdGhlIFZPTCBoZWFkZXIgZW50cmllcyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgKgotICAgICAgICAqKioqKi8KLSAgICAgICAgLyogdmlkZW9fb2JqZWN0X3N0YXJ0X2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZEJpdHMzMihzdHJlYW0sIDI3KTsKLSAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDUpOwotCi0KLSAgICAgICAgLyogdmlkZW9fb2JqZWN0X2xheWVyX3N0YXJ0X2NvZGUgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCwgJnRtcHZhcik7Ci0gICAgICAgIGlmICh0bXB2YXIgIT0gVk9MX1NUQVJUX0NPREUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUNoZWNrRW5kQnVmZmVyKHN0cmVhbSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9WT1ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIgPSBUUlVFOwotICAgICAgICAgICAgICAgIHJldHVybiBQVl9TVUNDRVNTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggZm9yIFZPTF9IRUFERVIgKi8KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZTZWFyY2hOZXh0TTRWRnJhbWUoc3RyZWFtKTsvKiBzZWFyY2ggMHgwMCAweDAwIDB4MDEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsgLyogYnJlYWtzIHRoZSBsb29wICovCi0gICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMzIoc3RyZWFtLCBWT0xfU1RBUlRfQ09ERV9MRU5HVEgsICZ0bXB2YXIpOwotICAgICAgICAgICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCA4KTsgLyogYWR2YW5jZSB0aGUgYnl0ZSBwdHIgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRtcHZhciAhPSBWT0xfU1RBUlRfQ09ERSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCA4KTsKLSAgICAgICAgfQotCi1kZWNvZGVfdm9sOgotICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBWT0xfU1RBUlRfQ09ERV9MRU5HVEggLSA4KTsKLSAgICAgICAgdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIgPSAwOwotCi0gICAgICAgIC8qIHZvbF9pZCAoNCBiaXRzKSAqLwotICAgICAgICBjdXJyVm9sLT52b2xJRCA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKLQotICAgICAgICAvKiBSYW5kb21BY2Nlc3NpYmxlIGZsYWcgKi8KLSAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0KLSAgICAgICAgLyogb2JqZWN0IHR5cGUgKi8KLSAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOyAgICAgICAgICAgICAgICAvKiAgKi8KLQotI2lmZGVmIFBWX1RPTEVSQVRFX1ZPTF9FUlJPUlMKLSAgICAgICAgaWYgKHRtcHZhciA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGF5ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IFNTUEwwLTIgICovCi0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMHgxMCAmJiBwcm9maWxlICE9IDB4MTEgJiYgcHJvZmlsZSAhPSAweDEyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICB0bXB2YXIgPSAweDAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgU1BMMC0zICYgU1NQTDAtMiAgICovCi0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMHgwMSAmJiBwcm9maWxlICE9IDB4MDIgJiYgcHJvZmlsZSAhPSAweDAzICYmIHByb2ZpbGUgIT0gMHgwOCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSAhPSAweDEwICYmIHByb2ZpbGUgIT0gMHgxMSAmJiBwcm9maWxlICE9IDB4MTIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICAgICAgICAgIHRtcHZhciA9IDB4MDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9maWxlIHw9IDB4MDEwMDsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgaWYgKGxheWVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG1wdmFyICE9IDB4MDIpIHJldHVybiBQVl9GQUlMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRtcHZhciAhPSAweDAxKSByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHZlcnNpb24gaWQgc3BlY2lmaWVkPyAqLwotICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgaWYgKHRtcHZhciA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB2ZXJzaW9uIElEICovCi0gICAgICAgICAgICB2ZXJzaW9uX2lkID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDQpOwotICAgICAgICAgICAgLyogcHJpb3JpdHkgKi8KLSAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAzKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgLyogYXNwZWN0IHJhdGlvIGluZm8gKi8KLSAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDQpOwotICAgICAgICBpZiAodG1wdmFyID09IDApIHJldHVybiBQVl9GQUlMOwotICAgICAgICBpZiAodG1wdmFyID09IDB4ZiAvKiBleHRlbmRlZF9wYXIgKi8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHdpZHRoICovCi0gICAgICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICAvKiBoZWlnaHQgKi8KLSAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyogY29udHJvbCBwYXJhbWV0ZXJzIHByZXNlbnQ/ICovCi0gICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotCi0gICAgICAgIC8qICBHZXQgdGhlIHBhcmFtZXRlcnMgKHNraXBwZWQpICovCi0gICAgICAgIC8qICAwMy8xMC85OSAqLwotICAgICAgICBpZiAodG1wdmFyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjaHJvbWFfZm9ybWF0ICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOwotICAgICAgICAgICAgaWYgKHRtcHZhciAhPSAxKSByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgIC8qIGxvd19kZWxheSAgKi8KLSAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotCi0gICAgICAgICAgICAvKiB2YnZfcGFyYW1ldGVycyBwcmVzZW50PyAqLwotICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgICAgICBpZiAodG1wdmFyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGZpcnN0X2hhbGZfYml0X3JhdGUgICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMTUpOwotICAgICAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwotICAgICAgICAgICAgICAgIC8qIGxhdHRlcl9oYWxmX2JpdF9yYXRlICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMTUpOwotICAgICAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwotICAgICAgICAgICAgICAgIC8qIGZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMTUpOwotICAgICAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwotICAgICAgICAgICAgICAgIC8qIGxhdHRlcl9oYWxmX3Zidl9idWZmZXJfc2l6ZSAgICovCi0gICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sICAzKTsKLSAgICAgICAgICAgICAgICAvKiBmaXJzdF9oYWxmX3Zidl9vY2N1cGFuY3kgICAgICovCi0gICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDExKTsKLSAgICAgICAgICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICAvKiBsYXR0ZXJfaGFsZl92YnZfb2NjdXBhbmN5ICAqLwotICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAxNSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgKDIgYml0cyksIG9ubHkgMDAgKHJlY3QpIGlzIHN1cHBvcnRlZCBmb3Igbm93ICovCi0gICAgICAgIHZvbF9zaGFwZSA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKLSAgICAgICAgaWYgKHZvbF9zaGFwZSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgLyogbWFya2VyIGJpdCwgIDAzLzEwLzk5ICovCi0gICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwotCi0gICAgICAgIC8qIHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uICAgKi8KLSAgICAgICAgY3VyclZvbC0+dGltZUluY3JlbWVudFJlc29sdXRpb24gPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMTYpOwotICAgICAgICBpZiAoY3VyclZvbC0+dGltZUluY3JlbWVudFJlc29sdXRpb24gPT0gMCkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgLyogLiBzaW5jZSBuYml0c1RpbWVJbmNSZXMgd2lsbCBiZSB1c2VkIG92ZXIgYW5kIG92ZXIgYWdhaW4sICovCi0gICAgICAgIC8qICAgIHdlIHNob3VsZCBwdXQgaXQgaW4gVm9sIHN0cnVjdHVyZS4gIDA0LzEyLzIwMDAuICAgICAgICAgICovCi0gICAgICAgIGN1cnJWb2wtPm5iaXRzVGltZUluY1JlcyA9IENhbGNOdW1CaXRzKCh1aW50KWN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uIC0gMSk7Ci0KLSAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgLyogZml4ZWRfdm9wX3JhdGUgKi8KLSAgICAgICAgY3VyclZvbC0+Zml4ZWRWb3BSYXRlID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgIGlmIChjdXJyVm9sLT5maXhlZFZvcFJhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGZpeGVkX3ZvcF90aW1lX2luY3JlbWVudCAqLwotICAgICAgICAgICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIGN1cnJWb2wtPm5iaXRzVGltZUluY1Jlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBtYXJrZXIgYml0ICovCi0gICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwotCi0gICAgICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl93aWR0aCAoMTMgYml0cykgKi8KLSAgICAgICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDEzKTsKLSAgICAgICAgaWYgKCF0bXB2YXIpIHJldHVybiBQVl9GQUlMOwotICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gdG1wdmFyOwotCi0gICAgICAgIC8qIHJvdW5kIHVwIHRvIGEgbXVsdGlwbGUgb2YgTUJfU0laRS4gICAwOC8wOS8yMDAwICovCi0gICAgICAgIHZpZGVvLT53aWR0aCA9ICh2aWRlby0+d2lkdGggKyAxNSkgJiAtMTY7Ci0vLyAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggKz0gKHZpZGVvLT5kaXNwbGF5V2lkdGggJiAweDEpOyAgLyogZGlzcGxheWVkIGltYWdlIHNob3VsZCBiZSBldmVuIHNpemUgKi8KLQotICAgICAgICAvKiBtYXJrZXIgYml0ICovCi0gICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwotCi0gICAgICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgKDEzIGJpdHMpICovCi0gICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAxMyk7Ci0gICAgICAgIGlmICghdG1wdmFyKSByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ID0gdG1wdmFyOwotCi0gICAgICAgIC8qIHJvdW5kIHVwIHRvIGEgbXVsdGlwbGUgb2YgTUJfU0laRS4gICAwOC8wOS8yMDAwICovCi0gICAgICAgIHZpZGVvLT5oZWlnaHQgPSAodmlkZW8tPmhlaWdodCArIDE1KSAmIC0xNjsKLS8vICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgKz0gKHZpZGVvLT5kaXNwbGF5SGVpZ2h0ICYgMHgxKTsgLyogZGlzcGxheWVkIGltYWdlIHNob3VsZCBiZSBldmVuIHNpemUgKi8KLSAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgLyogIDAzLzEwLzk5ICovCi0gICAgICAgIC8qIGludGVybGFjZWQgKi8KLSAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgIGlmICh0bXB2YXIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlVk9MSGVhZGVyKCk6IEludGVybGFjZWQgdmlkZW8gaXMgbm90IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBvYm1jX2Rpc2FibGUgKi8KLSAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgIGlmICh0bXB2YXIgPT0gMCkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgaWYgKHZlcnNpb25faWQgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogIHNwcml0ZV9lbmFibGUgKDEgYml0cykgKi8KLSAgICAgICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgICAgICAgICAgaWYgKHRtcHZhcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVWT0xIZWFkZXIoKTogU3ByaXRlIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZvciB2ZXJzaW9uIDIsIHZvbF9zcHJpdGVfdXNhZ2UgaGFzIHR3byBiaXRzLiAqLwotICAgICAgICAgICAgLyogc3ByaXRlX2VuYWJsZSAqLwotICAgICAgICAgICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOwotICAgICAgICAgICAgaWYgKHRtcHZhcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVWT0xIZWFkZXIoKTogU3ByaXRlIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdF84X2JpdCAqLwotICAgICAgICBpZiAoQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHF1YW50X3ByZWNpc2lvbiAqLwotICAgICAgICAgICAgY3VyclZvbC0+cXVhbnRQcmVjaXNpb24gPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNCk7Ci0gICAgICAgICAgICAvKiBiaXRzX3Blcl9waXhlbCAgKi8KLSAgICAgICAgICAgIGN1cnJWb2wtPmJpdHNQZXJQaXhlbCA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKLSAgICAgICAgICAgIG1wNGRlY19sb2coIkRlY29kZVZPTEhlYWRlcigpOiBub3QgYW4gOC1iaXQgc3RyZWFtLlxuIik7ICAgIC8vIEZvciB0aGUgdGltZSBiZWluZyB3ZSBkbyBub3Qgc3VwcG9ydCAhPSA4IGJpdHMKLQotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyVm9sLT5xdWFudFByZWNpc2lvbiA9IDU7Ci0gICAgICAgICAgICBjdXJyVm9sLT5iaXRzUGVyUGl4ZWwgPSA4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcXVhbnRfdHlwZSAoMSBiaXQpICovCi0gICAgICAgIGN1cnJWb2wtPnF1YW50VHlwZSA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgICAgICBpZiAoY3VyclZvbC0+cXVhbnRUeXBlKQotICAgICAgICB7Ci0jaWZkZWYgUFZfU1VQUE9SVF9NQUlOX1BST0ZJTEUKLSAgICAgICAgICAgIC8qIGxvYWQgcXVhbnRpemF0aW9uIG1hdHJpY2VzLiAgIDUvMjIvMjAwMCAqLwotICAgICAgICAgICAgLyogbG9hZF9pbnRyYV9xdWFudF9tYXQgKDEgYml0KSAqLwotICAgICAgICAgICAgcW1hdCA9IGN1cnJWb2wtPmlxbWF0OwotICAgICAgICAgICAgY3VyclZvbC0+bG9hZEludHJhUXVhbnRNYXQgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgIGlmIChjdXJyVm9sLT5sb2FkSW50cmFRdWFudE1hdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBpbnRyYV9xdWFudF9tYXQgKDgqNjQgYml0cykgKi8KLSAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcW1hdFsqKHppZ3phZ19pbnYraSldID0gKGludCkgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKHFtYXRbKih6aWd6YWdfaW52K2kpXSAhPSAwKSAmJiAoKytpIDwgNjQpKTsKLQotICAgICAgICAgICAgICAgIC8qIHFtYXRyaXggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBub24temVybyB2YWx1ZSwgd2hpY2ggbWVhbnMKLSAgICAgICAgICAgICAgICAgICBpIHdvdWxkIGJlIG5vbi16ZXJvIGluIHZhbGlkIGNhc2VzICovCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPCA2NDsgaisrKQotICAgICAgICAgICAgICAgICAgICBxbWF0WyooemlnemFnX2luditqKV0gPSBxbWF0WyooemlnemFnX2luditpLTEpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvc2NsX21lbWNweShxbWF0LCBtcGVnX2lxbWF0X2RlZiwgNjQqc2l6ZW9mKGludCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxbWF0WzBdID0gMDsgICAgICAgICAgICAgLyogbmVjZXNzYXJ5IGZvciBzd2l0Y2hlZCAmJiBNUEVHIHF1YW50ICAwNy8wOS8wMSAqLwotCi0gICAgICAgICAgICAvKiBsb2FkX25vbmludHJhX3F1YW50X21hdCAoMSBiaXQpICovCi0gICAgICAgICAgICBxbWF0ID0gY3VyclZvbC0+bmlxbWF0OwotICAgICAgICAgICAgY3VyclZvbC0+bG9hZE5vbkludHJhUXVhbnRNYXQgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgIGlmIChjdXJyVm9sLT5sb2FkTm9uSW50cmFRdWFudE1hdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBub25pbnRyYV9xdWFudF9tYXQgKDgqNjQgYml0cykgKi8KLSAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcW1hdFsqKHppZ3phZ19pbnYraSldID0gKGludCkgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKHFtYXRbKih6aWd6YWdfaW52K2kpXSAhPSAwKSAmJiAoKytpIDwgNjQpKTsKLQotICAgICAgICAgICAgICAgIC8qIHFtYXRyaXggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBub24temVybyB2YWx1ZSwgd2hpY2ggbWVhbnMKLSAgICAgICAgICAgICAgICAgICBpIHdvdWxkIGJlIG5vbi16ZXJvIGluIHZhbGlkIGNhc2VzICovCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPCA2NDsgaisrKQotICAgICAgICAgICAgICAgICAgICBxbWF0WyooemlnemFnX2luditqKV0gPSBxbWF0WyooemlnemFnX2luditpLTEpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvc2NsX21lbWNweShxbWF0LCBtcGVnX25xbWF0X2RlZiwgNjQqc2l6ZW9mKGludCkpOwotICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICBpZiAodmVyc2lvbl9pZCAhPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBxdWFydGVyX3NhbXBsZSBlbmFibGVkICovCi0gICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgIGlmICh0bXB2YXIpIHJldHVybiBQVl9GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgKi8KLSAgICAgICAgY3VyclZvbC0+Y29tcGxleGl0eV9lc3REaXNhYmxlID0gQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgIGlmIChjdXJyVm9sLT5jb21wbGV4aXR5X2VzdERpc2FibGUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY3VyclZvbC0+Y29tcGxleGl0eV9lc3RNZXRob2QgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7Ci0KLSAgICAgICAgICAgIGlmIChjdXJyVm9sLT5jb21wbGV4aXR5X2VzdE1ldGhvZCA8IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2hhcGVfY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgKi8KLSAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVWT0xIZWFkZXIoKTogU2hhcGUgQ29tcGxleGl0eSBlc3RpbWF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIHRleHR1cmVfY29tcGxleGl0eV9lc3RpbWF0aW9uX3NldF8xX2Rpc2FibGUgKi8KLSAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5jb21wbGV4aXR5LnRleHRfMSA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogbWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwotICAgICAgICAgICAgICAgIC8qIHRleHR1cmVfY29tcGxleGl0eV9lc3RpbWF0aW9uX3NldF8yX2Rpc2FibGUgKi8KLSAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5jb21wbGV4aXR5LnRleHRfMiA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogbW90aW9uX2NvbXBlbnNhdGlvbl9jb21wbGV4aXR5X2Rpc2FibGUgKi8KLSAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5jb21wbGV4aXR5Lm1jID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBtYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VyclZvbC0+Y29tcGxleGl0eV9lc3RNZXRob2QgPT0gMSkKLSAgICAgICAgICAgICAgICB7ICAgLyogdmVyc2lvbjJfY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlVk9MSGVhZGVyKCk6IHNhZGN0LCBxdWFydGVyIHBlbCBub3Qgc3VwcG9ydGVkLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qICAwMy8xMC85OSAqLwotICAgICAgICAvKiByZXN5bmNfbWFya2VyX2Rpc2FibGUgKi8KLSAgICAgICAgY3VyclZvbC0+ZXJyb3JSZXNEaXNhYmxlID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgIC8qIGRhdGFfcGFydGl0aXRpb25lZCAgICAqLwotICAgICAgICBjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0KLSAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZJbnRyYTsKLSAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSAmVmxjRGVjVENPRUZJbnRlcjsKLQotICAgICAgICBpZiAoY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxheWVyKSByZXR1cm4gUFZfRkFJTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKi8KLSAgICAgICAgICAgIC8qIHJldmVyc2libGVfdmxjICovCi0gICAgICAgICAgICBjdXJyVm9sLT51c2VSZXZlcnNlVkxDID0gKGludClCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgIGlmIChjdXJyVm9sLT51c2VSZXZlcnNlVkxDKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludHJhID0gJlJ2bGNEZWNUQ09FRkludHJhOwotICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gJlJ2bGNEZWNUQ09FRkludGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VyclZvbC0+ZXJyb3JSZXNEaXNhYmxlID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJWb2wtPnVzZVJldmVyc2VWTEMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZlcnNpb25faWQgIT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogbmV3cHJlZF9lbmFibGUgKi8KLSAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgICAgICAgICAgaWYgKHRtcHZhcikgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgIC8qIHJlZHVjZWRfcmVzb2x1dGlvbl92b3AgKi8KLSAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgICAgICAgICAgaWYgKHRtcHZhcikgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEludHJhIEFDL0RDIHByZWRpY3Rpb24gaXMgYWx3YXlzIHRydWUgKi8KLSAgICAgICAgdmlkZW8tPmludHJhX2FjZGNQcmVkRGlzYWJsZSA9IDA7Ci0gICAgICAgIC8qIHNjYWxhYmlsaXR5ICovCi0gICAgICAgIGN1cnJWb2wtPnNjYWxhYmlsaXR5ID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0KLSAgICAgICAgaWYgKGN1cnJWb2wtPnNjYWxhYmlsaXR5KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGF5ZXIgPT0gMCkgIHJldHVybiBQVl9GQUlMOyAgICAgICAgICAgICAgICAgICAgIC8qICAqLwotICAgICAgICAgICAgLyogaGllcmFyY2h5X3R5cGU6IDEgOiB0ZW1wb3JhbCwgMCA6IHNwYXRpYWwgKi8KLSAgICAgICAgICAgIC8qICAwMy8xMC85OSAqLwotICAgICAgICAgICAgY3VyclZvbC0+c2NhbFR5cGUgPSAoaW50KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsgICAgICAgICAgICAgIC8qICAqLwotICAgICAgICAgICAgaWYgKCFjdXJyVm9sLT5zY2FsVHlwZSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgIC8qIHJlZl9sYXllcl9pZCAoNCBiaXRzKSAqLwotICAgICAgICAgICAgY3VyclZvbC0+cmVmVm9sSUQgPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNCk7Ci0gICAgICAgICAgICBpZiAobGF5ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPnJlZlZvbElEICE9IHZpZGVvLT52b2xbMF0tPnZvbElEKSByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIHJlZl9sYXllcl9zYW1wbGluZ19kaXJlYyAoMSBiaXRzKSAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgMSA6IHJlZi4gbGF5ZXIgaGFzIGhpZ2hlciByZXNvbHV0aW9uICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgMCA6IHJlZi4gbGF5ZXIgaGFzIGVxdWFsIG9yIGxvd2VyIHJlc29sdXRpb24gKi8KLSAgICAgICAgICAgIGN1cnJWb2wtPnJlZlNhbXBEaXIgPSAoaW50KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgIGlmIChjdXJyVm9sLT5yZWZTYW1wRGlyKSByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgLyogaG9yX3NhbXBsaW5nX2ZhY3Rvcl9uICg1IGJpdHMpICovCi0gICAgICAgICAgICBjdXJyVm9sLT5ob3JTYW1wX24gPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNSk7Ci0KLSAgICAgICAgICAgIC8qIGhvcl9zYW1wbGluZ19mYWN0b3JfbSAoNSBiaXRzKSAqLwotICAgICAgICAgICAgY3VyclZvbC0+aG9yU2FtcF9tID0gKGludCkgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDUpOwotCi0gICAgICAgICAgICBpZiAoY3VyclZvbC0+aG9yU2FtcF9tID09IDApIHJldHVybiBQVl9GQUlMOwotICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmhvclNhbXBfbiAhPSBjdXJyVm9sLT5ob3JTYW1wX20pIHJldHVybiBQVl9GQUlMOwotCi0gICAgICAgICAgICAvKiB2ZXJfc2FtcGxpbmdfZmFjdG9yX24gKDUgYml0cykgKi8KLSAgICAgICAgICAgIGN1cnJWb2wtPnZlclNhbXBfbiA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA1KTsKLQotICAgICAgICAgICAgLyogdmVyX3NhbXBsaW5nX2ZhY3Rvcl9tICg1IGJpdHMpICovCi0gICAgICAgICAgICBjdXJyVm9sLT52ZXJTYW1wX20gPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNSk7Ci0KLSAgICAgICAgICAgIGlmIChjdXJyVm9sLT52ZXJTYW1wX20gPT0gMCkgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgICAgICBpZiAoY3VyclZvbC0+dmVyU2FtcF9uICE9IGN1cnJWb2wtPnZlclNhbXBfbSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLQotICAgICAgICAgICAgLyogZW5oYW5jZW1lbnRfdHlwZTogMSA6IHBhcnRpYWwgcmVnaW9uLCAwIDogZnVsbCByZWdpb24gKi8KLSAgICAgICAgICAgIC8qIDA0LzEwLzIwMDA6IHdlIG9ubHkgc3VwcG9ydCBmdWxsIHJlZ2lvbiBlbmhhbmNlbWVudCBsYXllci4gKi8KLSAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICBQVl9CaXRzdHJlYW1CeXRlQWxpZ24oc3RyZWFtKTsKLQotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMySEMoc3RyZWFtLCAmdG1wdmFyKTsKLQotICAgICAgICAvKiBpZiB3ZSBoaXQgdGhlIGVuZCBvZiBidWZmZXIsIHRtcHZhciA9PSAwLiAgIDA4LzMwLzIwMDAgKi8KLSAgICAgICAgaWYgKHRtcHZhciA9PSBVU0VSX0RBVEFfU1RBUlRfQ09ERSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGEoc3RyZWFtKTsKLSAgICAgICAgICAgIC8qIHlvdSBzaG91bGQgbm90IGNoZWNrIGZvciBzdGF0dXMgaGVyZSAgMDMvMTkvMjAwMiAqLwotICAgICAgICAgICAgc3RhdHVzID0gUFZfU1VDQ0VTUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgc29tZSBjb252ZW5pZW5jZSB2YXJpYWJsZXM6ICAgMDQvMTMvMjAwMCAqLwotICAgICAgICB2aWRlby0+bk1CUGVyUm93ID0gdmlkZW8tPndpZHRoIC8gTUJfU0laRTsKLSAgICAgICAgdmlkZW8tPm5NQlBlckNvbCA9IHZpZGVvLT5oZWlnaHQgLyBNQl9TSVpFOwotICAgICAgICB2aWRlby0+blRvdGFsTUIgPSB2aWRlby0+bk1CUGVyUm93ICogdmlkZW8tPm5NQlBlckNvbDsKLSAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IENhbGNOdW1CaXRzKCh1aW50KXZpZGVvLT5uVG90YWxNQiAtIDEpOwotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICB2aWRlby0+bW9kaWZpZWRfcXVhbnQgPSAwOwotICAgICAgICB2aWRlby0+YWR2YW5jZWRfSU5UUkEgPSAwOwotICAgICAgICB2aWRlby0+ZGVibG9ja2luZyA9IDA7Ci0gICAgICAgIHZpZGVvLT5zbGljZV9zdHJ1Y3R1cmUgPSAwOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNIT1JUX0hFQURFUiAqLwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgU0hPUlRfVklERU9fU1RBUlRfTUFSS0VSX0xFTkdUSCwgJnRtcHZhcik7Ci0KLSAgICAgICAgaWYgKHRtcHZhciA9PSBTSE9SVF9WSURFT19TVEFSVF9NQVJLRVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2VhcmNoIGZvciBWT0xfSEVBREVSICovCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZTZWFyY2hOZXh0TTRWRnJhbWUoc3RyZWFtKTsgLyogc2VhcmNoIDB4MDAgMHgwMCAweDAxICovCi0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKSByZXR1cm4gUFZfRkFJTDsgLyogYnJlYWtzIHRoZSBsb29wICovCi0gICAgICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCwgJnRtcHZhcik7Ci0gICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAodG1wdmFyICE9IFZPTF9TVEFSVF9DT0RFKTsKLSAgICAgICAgICAgIGdvdG8gZGVjb2RlX3ZvbDsKLSAgICAgICAgfQotICAgIH0KLSNpZmRlZiBQVl9UT0xFUkFURV9WT0xfRVJST1JTCi0gICAgaWYgKHByb2ZpbGUgPiAweEZGIHx8IHByb2ZpbGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQVl9CQURfVk9MSEVBREVSOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKLSoKLSogLS0gRGVjb2RlR09WIC0tIERlY29kZXMgdGhlIEdyb3VwIG9mIFZPUHMgZnJvbSBiaXRzdHJlYW0KLSoKLSogICAwNC8yMC8yMDAwICBpbml0aWFsIG1vZGlmaWNhdGlvbiB0byB0aGUgbmV3IFBWLURlY29kZXIgTGliIGZvcm1hdC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLwotUFZfU1RBVFVTIERlY29kZUdPVkhlYWRlcihCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtLCB1aW50MzIgKnRpbWVfYmFzZSkKLXsKLSAgICB1aW50MzIgdG1wdmFyLCB0aW1lX3M7Ci0gICAgaW50IGNsb3NlZF9nb3YsIGJyb2tlbl9saW5rOwotCi0gICAgLyogZ3JvdXBfc3RhcnRfY29kZSAoMzIgYml0cykgKi8KLS8vICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZEJpdHMzMihzdHJlYW0sIDMyKTsKLQotICAgIC8qIGhvdXJzICovCi0gICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDUpOwotICAgIHRpbWVfcyA9IHRtcHZhciAqIDM2MDA7Ci0KLSAgICAvKiBtaW51dGVzICovCi0gICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDYpOwotICAgIHRpbWVfcyArPSB0bXB2YXIgKiA2MDsKLQotICAgIC8qIG1hcmtlciBiaXQgKi8KLSAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLQotICAgIC8qIHNlY29uZHMgKi8KLSAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNik7Ci0gICAgdGltZV9zICs9IHRtcHZhcjsKLQotICAgIC8qIFdlIGhhdmUgdG8gY2hlY2sgdGhlIHRpbWVzdGFtcCBoZXJlLiAgSWYgdGhlIHN5bmMgdGltZXN0YW1wIGlzICovCi0gICAgLyogICAgZWFybGllciB0aGFuIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAgb3IgbG9uZ2VyIHRoYW4gNjAgc2VjLiAgKi8KLSAgICAvKiAgICBhZnRlciB0aGUgcHJldmlvdXMgdGltZXN0YW1wLCBhc3N1bWUgdGhlIEdPViBoZWFkZXIgaXMgICAgICAqLwotICAgIC8qICAgIGNvcnJ1cHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNS8xMi8yMDAwICAgICAqLwotICAgICp0aW1lX2Jhc2UgPSB0aW1lX3M7ICAgLyogIDAyLzI3LzIwMDIgKi8KLS8vICAqdGltZV9iYXNlID0gKnRpbWVfYmFzZS8xMDAwOwotLy8gIHRtcHZhciA9IHRpbWVfcyAtICp0aW1lX2Jhc2U7Ci0vLyAgaWYgKHRtcHZhciA8PSA2MCkgKnRpbWVfYmFzZSA9IHRpbWVfczsKLS8vICBlbHNlIHJldHVybiBQVl9GQUlMOwotCi0gICAgdG1wdmFyID0gKHVpbnQzMikgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgY2xvc2VkX2dvdiA9IHRtcHZhcjsKLSAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICBicm9rZW5fbGluayA9IHRtcHZhcjsKLQotICAgIGlmICgoY2xvc2VkX2dvdiA9PSAwKSAmJiAoYnJva2VuX2xpbmsgPT0gMSkpCi0gICAgewotICAgICAgICByZXR1cm4gUFZfU1VDQ0VTUzsgICAgICAgIC8qICAwMy8xNS8yMDAyICB5b3UgY2FuIGFsc28gcmV0dXJuIFBWX0ZBSUwgKi8KLSAgICB9Ci0KLSAgICBQVl9CaXRzdHJlYW1CeXRlQWxpZ24oc3RyZWFtKTsKLQotICAgIEJpdHN0cmVhbVNob3dCaXRzMzJIQyhzdHJlYW0sICZ0bXB2YXIpOwotCi0gICAgd2hpbGUgKHRtcHZhciA9PSBVU0VSX0RBVEFfU1RBUlRfQ09ERSkgICAgICAgLyogIDAzLzE1LzIwMDIgKi8KLSAgICB7Ci0gICAgICAgIERlY29kZVVzZXJEYXRhKHN0cmVhbSk7Ci0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMzJIQyhzdHJlYW0sICZ0bXB2YXIpOwotICAgIH0KLQotICAgIHJldHVybiBQVl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKLSoKLSogLS0gRGVjb2RlVm9wSGVhZGVyIC0tIERlY29kZXMgdGhlIFZPUGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiaXRzdHJlYW0KLSoKLSogICAwNC8xMi8yMDAwICBJbml0aWFsIHBvcnQgdG8gdGhlIG5ldyBQViBkZWNvZGVyIGxpYnJhcnkgZm9ybWF0LgotKiAgIDA1LzEwLzIwMDAgIEVycm9yIHJlc2lsaWVudCBkZWNvZGluZyBvZiB2b3AgaGVhZGVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50RW5kKioqKioqKiovCi1QVl9TVEFUVVMgRGVjb2RlVk9QSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIFZvcCAqY3VyclZvcCwgQm9vbCB1c2VfZXh0X3RpbWVzdGFtcCkKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKLSAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOwotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSBjdXJyVm9sLT5iaXRzdHJlYW07Ci0gICAgdWludDMyIHRtcHZhcjsKLSAgICBpbnQgdGltZV9iYXNlOwotCi0gICAgLyoqKioqCi0gICAgKiAgIFJlYWQgdGhlIFZPUCBoZWFkZXIgZnJvbSB0aGUgYml0c3RyZWFtIChObyBzaG9ydFZpZGVvSGVhZGVyIE1vZGUgaGVyZSEpCi0gICAgKioqKiovCi0gICAgQml0c3RyZWFtU2hvd0JpdHMzMkhDKHN0cmVhbSwgJnRtcHZhcik7Ci0KLSAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIGEgR09WIGhlYWRlciBoZXJlLiAgIDA4LzMwLzIwMDAgKi8KLSAgICBpZiAodG1wdmFyID09IEdST1VQX1NUQVJUX0NPREUpCi0gICAgewotICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czMySEMoc3RyZWFtKTsKLS8vICAgICAgcmV3aW5kQml0c3RyZWFtKHN0cmVhbSwgU1RBUlRfQ09ERV9MRU5HVEgpOyAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotICAgICAgICBzdGF0dXMgPSBEZWNvZGVHT1ZIZWFkZXIoc3RyZWFtLCAmdG1wdmFyKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0vLyAgICAgIHVzZV9leHRfdGltZXN0YW1wID0gVFJVRTsgICAvKiAgMDIvMDgvMjAwMiAqLwotICAgICAgICAvKiBXZSBzaG91bGQgaGF2ZSBhIFZPUCBoZWFkZXIgZm9sbG93aW5nIHRoZSBHT1YgaGVhZGVyLiAgMDMvMTUvMjAwMSAqLwotICAgICAgICBCaXRzdHJlYW1TaG93Qml0czMySEMoc3RyZWFtLCAmdG1wdmFyKTsKLSAgICB9Ci0jaWZkZWYgUFZfU1VQUE9SVF9URU1QT1JBTF9TQ0FMQUJJTElUWQotICAgIGN1cnJWb3AtPnRpbWVTdGFtcCA9IC0xOwotI2VuZGlmCi0gICAgaWYgKHRtcHZhciA9PSBWT1BfU1RBUlRfQ09ERSkKLSAgICB7Ci0gICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMzJIQyhzdHJlYW0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCA4KTsgLy8gYWR2YW5jZSBieSBhIGJ5dGUKLSAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgfQotCi0KLQotICAgIC8qIHZvcF9wcmVkaWN0aW9uX3R5cGUgKDIgYml0cykgKi8KLSAgICBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKLQotICAgIC8qIG1vZHVsb190aW1lX2Jhc2UgKD8gYml0cykgKi8KLSAgICB0aW1lX2Jhc2UgPSAtMTsKLSAgICBkbwotICAgIHsKLSAgICAgICAgdGltZV9iYXNlKys7Ci0gICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgIH0KLSAgICB3aGlsZSAodG1wdmFyID09IDEpOwotCi0KLQotICAgIGlmICghdXNlX2V4dF90aW1lc3RhbXApCi0gICAgewotICAgICAgICBjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSArPSAxMDAwICogdGltZV9iYXNlOyAvKiBtaWxsaXNlY29uZHMgYmFzZWQgTVRCICAxMS8xMi8wMSAqLwotICAgIH0KLQotICAgIC8qIG1hcmtlcl9iaXQgKDEgYml0KSAqLwotICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICB9Ci0KLSAgICAvKiB2b3BfdGltZV9pbmNyZW1lbnQgKDEtMTUgYml0cykgaW4gTm92X0NvbXBsaWFudCAoMS0xNiBiaXRzKSAqLwotICAgIC8qICAgIHdlIGFsd2F5cyBhc3N1bWVzIGZpeGVkIHZvcCByYXRlIGhlcmUgKi8KLSAgICBjdXJyVm9wLT50aW1lSW5jID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIGN1cnJWb2wtPm5iaXRzVGltZUluY1Jlcyk7Ci0KLQotICAgIC8qIG1hcmtlcl9iaXQgKDEgYml0KSAqLwotICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICB9Ci0KLSAgICAvKiB2b3BfY29kZWQgKi8KLSAgICBjdXJyVm9wLT52b3BDb2RlZCA9IChpbnQpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotCi0KLSAgICBpZiAoY3VyclZvcC0+dm9wQ29kZWQgPT0gMCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX1NVQ0NFU1M7Ci0gICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgIH0KLQotCi0gICAgLyogcmVhZCB2b3Bfcm91bmRpbmdfdHlwZSAqLwotICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKLSAgICB7Ci0gICAgICAgIGN1cnJWb3AtPnJvdW5kaW5nVHlwZSA9IChpbnQpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjdXJyVm9wLT5yb3VuZGluZ1R5cGUgPSAwOwotICAgIH0KLQotICAgIGlmIChjdXJyVm9sLT5jb21wbGV4aXR5X2VzdERpc2FibGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJyVm9sLT5jb21wbGV4aXR5X2VzdE1ldGhvZCA8IDIpICAgLyogICBPQ1QgMjAwMiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8xID4+IDMpICYgMHgxKSAgICAvKiBpbnRyYSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICBpZiAoY3VyclZvbC0+Y29tcGxleGl0eS50ZXh0XzEgJiAweDEpICAgICAgICAgICAvKiBub3RfY29kZWQgICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8yID4+IDMpICYgMHgxKSAgICAvKiBkY3RfY29lZnMgICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8yID4+IDIpICYgMHgxKSAgICAvKiBkY3RfbGluZXMgICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8yID4+IDEpICYgMHgxKSAgICAvKiB2bGNfc3ltYm9scyAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICBpZiAoY3VyclZvbC0+Y29tcGxleGl0eS50ZXh0XzIgJiAweDEpICAgICAgICAgICAvKiB2bGNfYml0cyAgICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgNCk7Ci0KLSAgICAgICAgICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSAhPSBJX1ZPUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkudGV4dF8xID4+IDIpICYgMHgxKSAgICAvKiBpbnRlciAgICAqLwotICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKChjdXJyVm9sLT5jb21wbGV4aXR5LnRleHRfMSA+PiAxKSAmIDB4MSkgICAgLyogaW50ZXJfNHYgKi8KLSAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOwotICAgICAgICAgICAgICAgIGlmICgoY3VyclZvbC0+Y29tcGxleGl0eS5tYyA+PiA1KSAmIDB4MSkgICAgICAgIC8qIGFwbSAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKLSAgICAgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkubWMgPj4gNCkgJiAweDEpICAgICAgICAvKiBucG0gICAgICAqLwotICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICAgICAgLyogaW50ZXJwb2xhdGVfbWNfcSAqLwotICAgICAgICAgICAgICAgIGlmICgoY3VyclZvbC0+Y29tcGxleGl0eS5tYyA+PiAyKSAmIDB4MSkgICAgICAgIC8qIGZvcndfYmFja19tY19xICovCi0gICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKLSAgICAgICAgICAgICAgICBpZiAoKGN1cnJWb2wtPmNvbXBsZXhpdHkubWMgPj4gMSkgJiAweDEpICAgICAgICAvKiBoYWxmcGVsMiAqLwotICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmNvbXBsZXhpdHkubWMgJiAweDEpICAgICAgICAgICAgICAgLyogaGFsZnBlbDQgKi8KLSAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IEJfVk9QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoY3VyclZvbC0+Y29tcGxleGl0eS5tYyA+PiAzKSAmIDB4MSkgICAgICAgIC8qIGludGVycG9sYXRlX21jX3EgKi8KLSAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcmVhZCBpbnRyYV9kY192bGNfdGhyICovCi0gICAgY3VyclZvcC0+aW50cmFEQ1ZsY1RociA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAzKTsKLQotICAgIC8qIHJlYWQgdm9wX3F1YW50IChjdXJyVm9sLT5xdWFudFByZWNpc2lvbiBiaXRzKSAqLwotICAgIGN1cnJWb3AtPnF1YW50aXplciA9IChpbnQxNikgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIGN1cnJWb2wtPnF1YW50UHJlY2lzaW9uKTsKLSAgICBpZiAoY3VyclZvcC0+cXVhbnRpemVyID09IDApCi0gICAgewotICAgICAgICBjdXJyVm9wLT5xdWFudGl6ZXIgPSB2aWRlby0+cHJldlZvcC0+cXVhbnRpemVyOwotICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICB9Ci0KLQotICAgIC8qIHJlYWQgdm9wX2Zjb2RlX2ZvcndhcmQgKi8KLSAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgIT0gSV9WT1ApCi0gICAgewotICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMyk7Ci0gICAgICAgIGlmICh0bXB2YXIgPCAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyVm9wLT5mY29kZUZvcndhcmQgPSAxOwotICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICB9Ci0gICAgICAgIGN1cnJWb3AtPmZjb2RlRm9yd2FyZCA9IHRtcHZhcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3VyclZvcC0+ZmNvZGVGb3J3YXJkID0gMDsKLSAgICB9Ci0KLSAgICAvKiByZWFkIHZvcF9mY29kZV9iYWNrd2FyZCAqLwotICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBCX1ZPUCkKLSAgICB7Ci0gICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAzKTsKLSAgICAgICAgaWYgKHRtcHZhciA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJWb3AtPmZjb2RlQmFja3dhcmQgPSAxOwotICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICB9Ci0gICAgICAgIGN1cnJWb3AtPmZjb2RlQmFja3dhcmQgPSB0bXB2YXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGN1cnJWb3AtPmZjb2RlQmFja3dhcmQgPSAwOwotICAgIH0KLQotICAgIGlmIChjdXJyVm9sLT5zY2FsYWJpbGl0eSkKLSAgICB7Ci0gICAgICAgIGN1cnJWb3AtPnJlZlNlbGVjdENvZGUgPSAoaW50KSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7Ci0gICAgfQotCi1yZXR1cm5fcG9pbnQ6Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKLSoKLSogLS0gVmlkZW9QbGFuZVdpdGhTaG9ydEhlYWRlciAtLSBEZWNvZGVzIHRoZSBzaG9ydF92aWRlb19oZWFkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgYml0c3RyZWFtCi0qIE1vZGlmaWVkIDoKLSAgICAgICAgICAgICAwNC8yMy8yMDAxLiAgUmVtb3ZlIHRoZSBjb2RlcyByZWxhdGVkIHRvIHRoZQotICAgICAgICAgICAgICAgICAiZmlyc3QgcGFzcyIgZGVjb2RpbmcuICBXZSB1c2UgYSBkaWZmZXJlbnQgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgdG8gc2V0IHVwIHRoZSBkZWNvZGVyIG5vdy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLwotUFZfU1RBVFVTIERlY29kZVNob3J0SGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIFZvcCAqY3VyclZvcCkKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKLSAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sWzBdOwotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSBjdXJyVm9sLT5iaXRzdHJlYW07Ci0gICAgdWludDMyIHRtcHZhcjsKLSAgICBpbnQzMiBzaXplOwotCi0gICAgaW50IGV4dGVuZGVkX1BUWVBFID0gRkFMU0U7Ci0gICAgaW50IFVGRVAgPSAwLCBjdXN0b21fUEZNVCA9IDAsIGN1c3RvbV9QQ0YgPSAwOwotCi0gICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIFNIT1JUX1ZJREVPX1NUQVJUX01BUktFUl9MRU5HVEgsICZ0bXB2YXIpOwotCi0gICAgaWYgKHRtcHZhciAhPSAgU0hPUlRfVklERU9fU1RBUlRfTUFSS0VSKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgfQotCi0KLSAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBTSE9SVF9WSURFT19TVEFSVF9NQVJLRVJfTEVOR1RIKTsKLQotICAgIC8qIFRlbXBvcmFsIHJlZmVyZW5jZS4gVXNpbmcgdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPSAzMDAwMCAqLwotICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKLSAgICBjdXJyVm9wLT50ZW1wb3JhbFJlZiA9IChpbnQpIHRtcHZhcjsKLQotCi0gICAgY3VyclZvcC0+dGltZUluYyA9IDB4ZmYgJiAoMjU2ICsgY3VyclZvcC0+dGVtcG9yYWxSZWYgLSB2aWRlby0+cHJldlZvcC0+dGVtcG9yYWxSZWYpOwotICAgIGN1cnJWb2wtPm1vZHVsb1RpbWVCYXNlICs9IGN1cnJWb3AtPnRpbWVJbmM7IC8qIG1zZWNvbmRzICAgMTEvMTIvMDEgKi8KLSAgICAvKiBNYXJrZXIgQml0ICovCi0gICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICB7Ci0gICAgICAgIG1wNGRlY19sb2coIkRlY29kZVNob3J0SGVhZGVyKCk6IE1hcmtlciBiaXQgd3JvbmcuXG4iKTsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgfQotCi0gICAgLyogWmVybyBCaXQgKi8KLSAgICBpZiAoQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCi0gICAgewotICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVTaG9ydEhlYWRlcigpOiBaZXJvIGJpdCB3cm9uZy5cbiIpOwotICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICB9Ci0KLSAgICAvKnNwbGl0X3NjcmVlbl9pbmRpY2F0b3IqLwotICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICB7Ci0gICAgICAgIG1wNGRlY19sb2coIkRlY29kZVNob3J0SGVhZGVyKCk6IFNwbGl0IFNjcmVlbiBub3Qgc3VwcG9ydGVkLlxuIik7Ci0gICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgIH0KLQotICAgIC8qZG9jdW1lbnRfZnJlZXplX2NhbWVyYSovCi0gICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgIHsKLSAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlU2hvcnRIZWFkZXIoKTogRnJlZXplIENhbWVyYSBub3Qgc3VwcG9ydGVkLlxuIik7Ci0gICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgIH0KLQotICAgIC8qZnJlZXplX3BpY3R1cmVfcmVsZWFzZSovCi0gICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgIHsKLSAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlU2hvcnRIZWFkZXIoKTogRnJlZXplIFJlbGVhc2Ugbm90IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICB9Ci0gICAgLyogc291cmNlIGZvcm1hdCAqLwotICAgIHN3aXRjaCAoQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDMpKQotICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgaWYgKHZpZGVvLT5zaXplIDwgMTI4Kjk2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gIDEyODsKLSAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCAgPSA5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGlmICh2aWRlby0+c2l6ZSA8IDE3NioxNDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggID0gMTc2OwotICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ICA9IDE0NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGlmICh2aWRlby0+c2l6ZSA8IDM1MioyODgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggPSAzNTI7Ci0gICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHZpZGVvLT5oZWlnaHQgPSAyODg7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnNpemUgPCA3MDQqNTc2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gNzA0OwotICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ID0gNTc2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgaWYgKHZpZGVvLT5zaXplIDwgMTQwOCoxMTUyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gMTQwODsKLSAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCA9IDExNTI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBleHRlbmRlZF9QVFlQRSA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogTXNnKCJILjI2MyBzb3VyY2UgZm9ybWF0IG5vdCBsZWdhbFxuIik7ICovCi0gICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgfQotCi0KLSAgICBjdXJyVm9wLT5yb3VuZGluZ1R5cGUgPSAwOwotCi0gICAgaWYgKGV4dGVuZGVkX1BUWVBFID09IEZBTFNFKQotICAgIHsKLSAgICAgICAgY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSAoaW50KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLQotICAgICAgICAvKiBmb3VyX3Jlc2VydmVkX3plcm9fYml0cyAqLwotICAgICAgICBpZiAoQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVTaG9ydEhlYWRlcigpOiBSZXNlcnZlZCBiaXRzIHdyb25nLlxuIik7Ci0gICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVUZFUCA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAzKTsKLSAgICAgICAgaWYgKFVGRVAgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogc291cmNlIGZvcm1hdCAqLwotICAgICAgICAgICAgc3dpdGNoIChCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnNpemUgPCAxMjgqOTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gIDEyODsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ICA9IDk2OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5zaXplIDwgMTc2KjE0NCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggID0gMTc2OwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHZpZGVvLT5oZWlnaHQgID0gMTQ0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5zaXplIDwgMzUyKjI4OCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5V2lkdGggPSB2aWRlby0+d2lkdGggPSAzNTI7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCA9IDI4ODsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+c2l6ZSA8IDcwNCo1NzYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gNzA0OwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHZpZGVvLT5oZWlnaHQgPSA1NzY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnNpemUgPCAxNDA4KjExNTIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdmlkZW8tPndpZHRoID0gMTQwODsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ID0gMTE1MjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgIGN1c3RvbV9QRk1UID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAvKiBNc2coIkguMjYzIHNvdXJjZSBmb3JtYXQgbm90IGxlZ2FsXG4iKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1c3RvbV9QQ0YgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLSAgICAgICAgICAgIC8qIHVucmVzdHJpY3RlZCBNViAqLwotICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBTQUMgKi8KLSAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBUCAqLwotICAgICAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZpZGVvLT5hZHZhbmNlZF9JTlRSQSA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotCi0gICAgICAgICAgICB2aWRlby0+ZGVibG9ja2luZyA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotCi0gICAgICAgICAgICB2aWRlby0+c2xpY2Vfc3RydWN0dXJlID0gQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0KLSAgICAgICAgICAgIC8qIFJQUywgSVNELCBBSVYgKi8KLSAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvLT5tb2RpZmllZF9xdWFudCA9IEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotCi0gICAgICAgICAgICAvKiBNYXJrZXIgQml0IGFuZCByZXNlcnZlZCovCi0gICAgICAgICAgICBpZiAoQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDQpICE9IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2lmbmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgaWYgKHZpZGVvLT5hZHZhbmNlZF9JTlRSQSB8IHZpZGVvLT5kZWJsb2NraW5nIHwgdmlkZW8tPm1vZGlmaWVkX3F1YW50IHwgdmlkZW8tPm1vZGlmaWVkX3F1YW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlmIChVRkVQID09IDAgfHwgVUZFUCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMyk7Ci0gICAgICAgICAgICBpZiAodG1wdmFyID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSB0bXB2YXI7Ci0gICAgICAgICAgICAvKiBSUFIgKi8KLSAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBSUlUgKi8KLSAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VyclZvcC0+cm91bmRpbmdUeXBlID0gKGludCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0gICAgICAgICAgICBpZiAoQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDMpICE9IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgfQotICAgICAgICAvKiBDUE0gKi8KLSAgICAgICAgaWYgKEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ1BGTVQgKi8KLSAgICAgICAgaWYgKGN1c3RvbV9QRk1UID09IDEgJiYgVUZFUCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBhc3BlY3QgcmF0aW8gKi8KLSAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA0KTsKLSAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogRXh0ZW5kZWQgUEFSICovCi0gICAgICAgICAgICBpZiAodG1wdmFyID09IDB4RikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBSZWFkIHBhcl93aWR0aCBhbmQgcGFyX2hlaWdodCBidXQgZG8gbm90aGluZyAqLwotICAgICAgICAgICAgICAgIC8qIHBhcl93aWR0aCAqLwotICAgICAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA4KTsKLQotICAgICAgICAgICAgICAgIC8qIHBhcl9oZWlnaHQgKi8KLSAgICAgICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0bXB2YXIgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOSk7Ci0KLSAgICAgICAgICAgIGludCB0bXBEaXNwbGF5V2lkdGggPSAodG1wdmFyICsgMSkgPDwgMjsKLSAgICAgICAgICAgIC8qIG1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA5KTsKLSAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHRtcERpc3BsYXlIZWlnaHQgPSB0bXB2YXIgPDwgMjsKLSAgICAgICAgICAgIGludCB0bXBIZWlnaHQgPSAodG1wRGlzcGxheUhlaWdodCArIDE1KSAmIC0xNjsKLSAgICAgICAgICAgIGludCB0bXBXaWR0aCA9ICh0bXBEaXNwbGF5V2lkdGggKyAxNSkgJiAtMTY7Ci0KLSAgICAgICAgICAgIGlmICh0bXBXaWR0aCA+IHZpZGVvLT53aWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB3aGlsZSBhbGxvd2VkIGJ5IHRoZSBzcGVjLCB0aGlzIGRlY29kZXIgZG9lcyBub3QgYWN0dWFsbHkKLSAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGFuIGluY3JlYXNlIGluIHNpemUuCi0gICAgICAgICAgICAgICAgQUxPR0UoIndpZHRoIGluY3JlYXNlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRtcEhlaWdodCAqIHRtcFdpZHRoID4gdmlkZW8tPnNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IHBvc3NpYmx5ICJiLzM3MDc5Mjk2Ii4KLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNzA3OTI5NiIpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gdG1wRGlzcGxheVdpZHRoOwotICAgICAgICAgICAgdmlkZW8tPndpZHRoID0gdG1wV2lkdGg7Ci0gICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHRtcERpc3BsYXlIZWlnaHQ7Ci0gICAgICAgICAgICB2aWRlby0+aGVpZ2h0ID0gdG1wSGVpZ2h0OwotCi0gICAgICAgICAgICB2aWRlby0+blRvdGFsTUIgPSB2aWRlby0+d2lkdGggLyBNQl9TSVpFICogdmlkZW8tPmhlaWdodCAvIE1CX1NJWkU7Ci0KLSAgICAgICAgICAgIGlmICh2aWRlby0+blRvdGFsTUIgPD0gNDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IDY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+blRvdGFsTUIgPD0gOTkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+blRvdGFsTUIgPD0gMzk2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5uQml0c0Zvck1CSUQgPSA5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm5Ub3RhbE1CIDw9IDE1ODQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IDExOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm5Ub3RhbE1CIDw9IDYzMzYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IDEzIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5uVG90YWxNQiA8PSA5MjE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5uQml0c0Zvck1CSUQgPSAxNCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoVUZFUCA9PSAxICYmIGN1c3RvbV9QQ0YgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0KLSAgICAgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA3KTsKLSAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1c3RvbV9QQ0YgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VyclZvcC0+RVRSID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFVGRVAgPT0gMSAmJiB2aWRlby0+c2xpY2Vfc3RydWN0dXJlID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNTUyAqLwotICAgICAgICAgICAgdG1wdmFyID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOwotICAgICAgICAgICAgaWYgKHRtcHZhciAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZWNhbGN1bGF0ZSBudW1iZXIgb2YgbWFjcm9ibG9ja3MgcGVyIHJvdyAmIGNvbCBzaW5jZSAqLwotICAgIC8qICB0aGUgZnJhbWUgc2l6ZSBjYW4gY2hhbmdlLiAgICAgICAgICAgMDQvMjMvMjAwMS4gICAqLwotICAgIHZpZGVvLT5uTUJpbkdPQiA9IHZpZGVvLT5uTUJQZXJSb3cgPSB2aWRlby0+d2lkdGggLyBNQl9TSVpFOwotICAgIHZpZGVvLT5uR09CaW5Wb3AgPSB2aWRlby0+bk1CUGVyQ29sID0gdmlkZW8tPmhlaWdodCAvIE1CX1NJWkU7Ci0gICAgdmlkZW8tPm5Ub3RhbE1CID0gdmlkZW8tPm5NQlBlclJvdyAqIHZpZGVvLT5uTUJQZXJDb2w7Ci0gICAgaWYgKGN1c3RvbV9QRk1UID09IDAgIHx8IFVGRVAgPT0gMCkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5uQml0c0Zvck1CSUQgPSBDYWxjTnVtQml0cygodWludCl2aWRlby0+blRvdGFsTUIgLSAxKTsgLyogb3RoZXJ3aXNlIGNhbGN1bGF0ZSBhYm92ZSAqLwotICAgIH0KLSAgICBzaXplID0gKGludDMyKXZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7Ci0gICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IFBfVk9QICYmIHNpemUgPiB2aWRlby0+dmlkZW9EZWNDb250cm9scy0+c2l6ZSkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwotICAgIH0KLSAgICB2aWRlby0+dmlkZW9EZWNDb250cm9scy0+c2l6ZSA9IHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKLSAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOwotCi0KLSAgICBjdXJyVm9wLT5xdWFudGl6ZXIgPSAoaW50MTYpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA1KTsKLQotICAgIGlmIChjdXJyVm9wLT5xdWFudGl6ZXIgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwNC8wMy8wMSAqLwotICAgIHsKLSAgICAgICAgY3VyclZvcC0+cXVhbnRpemVyID0gdmlkZW8tPnByZXZWb3AtPnF1YW50aXplcjsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKLSAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgfQotCi0KLSAgICAvKiBaZXJvIGJpdCAqLwotICAgIGlmIChleHRlbmRlZF9QVFlQRSA9PSBGQUxTRSkKLSAgICB7Ci0gICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICAgICAgewotICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlU2hvcnRIZWFkZXIoKTogWmVybyBiaXQgd3JvbmcuXG4iKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBwZWkgKi8KLSAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKLQotICAgIHdoaWxlICh0bXB2YXIpCi0gICAgewotICAgICAgICB0bXB2YXIgPSAodWludDMyKSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgOCk7IC8qICJQU1BBUkUiICovCi0gICAgICAgIHRtcHZhciA9ICh1aW50MzIpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOyAvKiAiUEVJIiAqLwotICAgIH0KLQotICAgIGlmICh2aWRlby0+c2xpY2Vfc3RydWN0dXJlKSAgLyogQU5ORVhfSyAqLwotICAgIHsKLSAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkgIC8qIFNFUEIxICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICBpZiAoY3VyclZvbC0+bkJpdHNGb3JNQklEIC8vCi0gICAgICAgIGlmIChCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgdmlkZW8tPm5CaXRzRm9yTUJJRCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7ICAgICAgICAgICAgIC8qIG5vIEFTTywgUlMgc3VwcG9ydCBmb3IgQW5uZXggSyAqLwotICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKSAgLypTRVBCMyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwotICAgICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAvKiBTZXR0aW5nIG9mIG90aGVyIFZPUC1oZWFkZXIgcGFyYW1ldGVycyAqLwotICAgIGN1cnJWb3AtPmdvYk51bWJlciA9IDA7Ci0gICAgY3VyclZvcC0+dm9wQ29kZWQgPSAxOwotCi0gICAgY3VyclZvcC0+aW50cmFEQ1ZsY1RociA9IDA7Ci0gICAgY3VyclZvcC0+Z29iRnJhbWVJRCA9IDA7IC8qIGluaXRpYWwgdmFsdWUsICAwNS8yMi8wMCAqLwotICAgIGN1cnJWb2wtPmVycm9yUmVzRGlzYWJsZSA9IDA7Ci0gICAgLypQdXRWb3BJbnRlcmxhY2VkKDAsY3Vycl92b3ApOyBubyBpbXBsZW1lbnRlZCB5ZXQgKi8KLSAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgIT0gSV9WT1ApCi0gICAgICAgIGN1cnJWb3AtPmZjb2RlRm9yd2FyZCA9IDE7Ci0gICAgZWxzZQotICAgICAgICBjdXJyVm9wLT5mY29kZUZvcndhcmQgPSAwOwotCi1yZXR1cm5fcG9pbnQ6Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCi0qCi0qIC0tIFBWX0RlY29kZVZvcCAtLSBEZWNvZGVzIHRoZSBWT1AgaW5mb3JtYXRpb24gZnJvbSB0aGUgYml0c3RyZWFtCi0qCi0qICAgMDQvMTIvMjAwMAotKiAgICAgICAgICAgICAgICAgICBJbml0aWFsIHBvcnQgdG8gdGhlIG5ldyBQViBkZWNvZGVyIGxpYnJhcnkgZm9ybWF0LgotKiAgICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgaW4gTW9NdVN5cyBNUEVHLTQKLSogICAgICAgICAgICAgICAgICAgdmlzdWFsIGRlY29kZXIuICBXZSBoYW5kbGUgY29tYmluZWQgbW9kZSB3aXRoIG9yIHdpdGhwdXQKLSogICAgICAgICAgICAgICAgICAgZXJyb3IgcmVzaWxpZW5jZSBhbmQgSC4yNjMgbW9kZSB0aHJvdWdoIHRoZSBzYW0gcGF0aCBub3cuCi0qCi0qICAgMDUvMDQvMjAwMAotKiAgICAgICAgICAgICAgICAgICBBZGRlZCB0ZW1wb3JhbCBzY2FsYWJpbGl0eSB0byB0aGUgZGVjb2Rlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLwotUFZfU1RBVFVTIFBWX0RlY29kZVZvcChWaWRlb0RlY0RhdGEgKnZpZGVvKQotewotICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07Ci0gICAgUFZfU1RBVFVTIHN0YXR1czsKLSAgICB1aW50MzIgdG1wdmFyOwotCi0gICAgLyoqKioqCi0gICAgKiAgIERvIHNjYWxhYmxlIG9yIG5vbi1zY2FsYWJsZSBkZWNvZGluZyBvZiB0aGUgY3VycmVudCBWT1AKLSAgICAqKioqKi8KLQotICAgIGlmICghY3VyclZvbC0+c2NhbGFiaWxpdHkpCi0gICAgewotICAgICAgICBpZiAoY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZykKLSAgICAgICAgewotICAgICAgICAgICAgLyogRGF0YSBwYXJ0aXRpb25pbmcgbW9kZSBjb21lcyBoZXJlICovCi0gICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGcmFtZURhdGFQYXJ0TW9kZSh2aWRlbyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb21iaW5lZCBtb2RlIHdpdGggb3Igd2l0aG91dCBlcnJvciByZXNpbGllbmNlICovCi0gICAgICAgICAgICAvKiAgICBhbmQgc2hvcnQgdmlkZW8gaGVhZGVyIGNvbWVzIGhlcmUuICAgICAgICAgICovCi0gICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGcmFtZUNvbWJpbmVkTW9kZSh2aWRlbyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBET19OT1RfRk9MTE9XX1NUQU5EQVJECi0gICAgICAgIC8qIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQsIG9ubHkgY29tYmluZWQgbW9kZSBpcyBhbGxvd2VkICovCi0gICAgICAgIC8qICAgIGluIHRoZSBlbmhhbmNlbWVudCBsYXllci4gICAgICAgICAgMDYvMDEvMjAwMC4gICAgICAgICovCi0gICAgICAgIGlmIChjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBEYXRhIHBhcnRpdGlvbmluZyBtb2RlIGNvbWVzIGhlcmUgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZyYW1lRGF0YVBhcnRNb2RlKHZpZGVvKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbWJpbmVkIG1vZGUgd2l0aCBvciB3aXRob3V0IGVycm9yIHJlc2lsaWVuY2UgKi8KLSAgICAgICAgICAgIC8qICAgIGFuZCBzaG9ydCB2aWRlbyBoZWFkZXIgY29tZXMgaGVyZS4gICAgICAgICAgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZyYW1lQ29tYmluZWRNb2RlKHZpZGVvKTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgc3RhdHVzID0gRGVjb2RlRnJhbWVDb21iaW5lZE1vZGUodmlkZW8pOwotI2VuZGlmCi0gICAgfQotCi0gICAgLyogVGhpcyBwYXJ0IGlzIGZvciBjb25zdW1pbmcgVmlzdWFsX29iamVjdF9zZXF1ZW5jZV9lbmRfY29kZSBhbmQgRU9TIENvZGUgKi8gICAvKiAgMTAvMTUvMDEgKi8KLSAgICBpZiAoIXZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQotICAgIHsKLSAgICAgICAgLyogYXQgdGhpcyBwb2ludCBiaXRzdHJlYW0gaXMgZXhwZWN0ZWQgdG8gYmUgYnl0ZSBhbGlnbmVkICovCi0gICAgICAgIEJpdHN0cmVhbUJ5dGVBbGlnbk5vRm9yY2VTdHVmZmluZyhjdXJyVm9sLT5iaXRzdHJlYW0pOwotCi0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzJIQyhjdXJyVm9sLT5iaXRzdHJlYW0sICZ0bXB2YXIpOyAgLyogIDA3LzA3LzAxICovCi0gICAgICAgIGlmICh0bXB2YXIgPT0gVklTVUFMX09CSkVDVF9TRVFVRU5DRV9FTkRfQ09ERSkvKiBWT1NfRU5EX0NPREUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKGN1cnJWb2wtPmJpdHN0cmVhbSwgMTYpOwotICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKGN1cnJWb2wtPmJpdHN0cmVhbSwgMTYpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgaWYgKHZpZGVvLT5kZWJsb2NraW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBIMjYzX0RlYmxvY2sodmlkZW8tPmN1cnJWb3AtPnlDaGFuLCB2aWRlby0+d2lkdGgsIHZpZGVvLT5oZWlnaHQsIHZpZGVvLT5RUE1CLCB2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAwLCAwKTsKLSAgICAgICAgICAgIEgyNjNfRGVibG9jayh2aWRlby0+Y3VyclZvcC0+dUNoYW4sIHZpZGVvLT53aWR0aCA+PiAxLCB2aWRlby0+aGVpZ2h0ID4+IDEsIHZpZGVvLT5RUE1CLCB2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAxLCB2aWRlby0+bW9kaWZpZWRfcXVhbnQpOwotICAgICAgICAgICAgSDI2M19EZWJsb2NrKHZpZGVvLT5jdXJyVm9wLT52Q2hhbiwgdmlkZW8tPndpZHRoID4+IDEsIHZpZGVvLT5oZWlnaHQgPj4gMSwgdmlkZW8tPlFQTUIsIHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUsIDEsIHZpZGVvLT5tb2RpZmllZF9xdWFudCk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICAvKiBSZWFkIEVPUyBjb2RlIGZvciBzaG9ydGhlYWRlciBiaXRzdHJlYW1zICAgICovCi0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzIoY3VyclZvbC0+Yml0c3RyZWFtLCAyMiwgJnRtcHZhcik7Ci0gICAgICAgIGlmICh0bXB2YXIgPT0gU0hPUlRfVklERU9fRU5EX01BUktFUikKLSAgICAgICAgewotICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKGN1cnJWb2wtPmJpdHN0cmVhbSwgMjIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzID0gUFZfQml0c3RyZWFtU2hvd0JpdHNCeXRlQWxpZ24oY3VyclZvbC0+Yml0c3RyZWFtLCAyMiwgJnRtcHZhcik7Ci0gICAgICAgICAgICBpZiAodG1wdmFyID09IFNIT1JUX1ZJREVPX0VORF9NQVJLRVIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtQnl0ZUFsaWduKGN1cnJWb2wtPmJpdHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKGN1cnJWb2wtPmJpdHN0cmVhbSwgMjIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCi0qCi0qIC0tIENhbGNWb3BEaXNwbGF5VGltZSAtLSBjYWxjdWxhdGUgYWJzb2x1dGUgdGltZSB3aGVuIFZPUCBpcyB0byBiZSBkaXNwbGF5ZWQKLSoKLSogICAwNC8xMi8yMDAwIEluaXRpYWwgcG9ydCB0byB0aGUgbmV3IFBWIGRlY29kZXIgbGlicmFyeSBmb3JtYXQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRFbmQqKioqKioqKi8KLXVpbnQzMiBDYWxjVm9wRGlzcGxheVRpbWUoVm9sICpjdXJyVm9sLCBWb3AgKmN1cnJWb3AsIGludCBzaG9ydFZpZGVvSGVhZGVyKQotewotICAgIHVpbnQzMiBkaXNwbGF5X3RpbWU7Ci0KLQotICAgIC8qKioqKgotICAgICogICBDYWxjdWxhdGUgdGhlIHRpbWUgd2hlbiB0aGUgVk9QIGlzIHRvIGJlIGRpc3BsYXllZCBuZXh0Ci0gICAgKioqKiovCi0KLSAgICBpZiAoIXNob3J0VmlkZW9IZWFkZXIpCi0gICAgewotICAgICAgICBkaXNwbGF5X3RpbWUgPSAodWludDMyKShjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSArICgoKGludDMyKWN1cnJWb3AtPnRpbWVJbmMgLSAoaW50MzIpY3VyclZvbC0+dGltZUluY19vZmZzZXQpICogMTAwMCkgLyAoKGludDMyKWN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKSk7ICAvKiAgMTEvMTIvMjAwMSAqLwotICAgICAgICBpZiAoY3VyclZvcC0+dGltZVN0YW1wID49IGRpc3BsYXlfdGltZSkKLSAgICAgICAgewotICAgICAgICAgICAgZGlzcGxheV90aW1lICs9IDEwMDA7ICAvKiB0aGlzIGNhc2UgaXMgdmFsaWQgaWYgR09WSGVhZGVyIHRpbWVzdGFtcCBpcyBpZ25vcmVkICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZGlzcGxheV90aW1lID0gKHVpbnQzMikoY3VyclZvbC0+bW9kdWxvVGltZUJhc2UgKiAzMyArIChjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSAqIDExKSAvIDMwKTsgLyogIDExLzEyLzIwMDEgKi8KLSAgICB9Ci0KLSAgICByZXR1cm4oZGlzcGxheV90aW1lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1NDkxYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiTXBlZzRIMjYzRGVjb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotCi0gICAgc3JjczogWwotICAgICAgICAiTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdlMTBjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1wZWc0SDI2MyBEZWNvZGVyIHVuaXQgdGVzdHMiPgotICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNcGVnNEgyNjNEZWNvZGVyVGVzdCIgLz4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNcGVnNEgyNjNEZWNvZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0RlY29kZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2Rlci56aXA/dW56aXA9dHJ1ZSIKLSAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRGVjb2RlclRlc3RSZXMvIiAvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotCi0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcGVnNEgyNjNEZWNvZGVyVGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0RlY29kZXJUZXN0UmVzLyIgLz4KLSAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3YzFlYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1wZWc0SDI2M0RlY29kZXJUZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgotCi0jaW5jbHVkZSAiTXBlZzRIMjYzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvT3V0cHV0Lnl1diIKLSNkZWZpbmUgQ09ERUNfQ09ORklHX0ZMQUcgMzIKLSNkZWZpbmUgU1lOQ19GUkFNRSAxCi0jZGVmaW5lIE1QRUc0X01BWF9XSURUSCAxOTIwCi0jZGVmaW5lIE1QRUc0X01BWF9IRUlHSFQgMTA4MAotI2RlZmluZSBIMjYzX01BWF9XSURUSCAzNTIKLSNkZWZpbmUgSDI2M19NQVhfSEVJR0hUIDI4OAotCi1jb25zdGV4cHIgdWludDMyX3Qga051bU91dHB1dEJ1ZmZlcnMgPSAyOwotCi1zdHJ1Y3QgRnJhbWVJbmZvIHsKLSAgICBpbnQzMl90IGJ5dGVzQ291bnQ7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgaW50NjRfdCB0aW1lc3RhbXA7Ci19OwotCi1zdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKLQotc3RhdGljIE1wZWc0SDI2M0RlY29kZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOwotCi1jbGFzcyBNcGVnNEgyNjNEZWNvZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8c3RyaW5nLCBzdHJpbmcsIGJvb2w+PiB7Ci0gIHB1YmxpYzoKLSAgICBNcGVnNEgyNjNEZWNvZGVyVGVzdCgpCi0gICAgICAgIDogbURlY0hhbmRsZShudWxscHRyKSwKLSAgICAgICAgICBtSW5wdXRCdWZmZXIobnVsbHB0ciksCi0gICAgICAgICAgbUluaXRpYWxpemVkKGZhbHNlKSwKLSAgICAgICAgICBtRnJhbWVzQ29uZmlndXJlZChmYWxzZSksCi0gICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCi0gICAgICAgICAgbVdpZHRoKDM1MiksCi0gICAgICAgICAgbUhlaWdodCgyODgpIHsKLSAgICAgICAgbWVtc2V0KG1PdXRwdXRCdWZmZXIsIDB4MCwgc2l6ZW9mKG1PdXRwdXRCdWZmZXIpKTsKLSAgICB9Ci0KLSAgICB+TXBlZzRIMjYzRGVjb2RlclRlc3QoKSB7Ci0gICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOwotICAgICAgICBpZiAobURlY0hhbmRsZSkgewotICAgICAgICAgICAgZGVsZXRlIG1EZWNIYW5kbGU7Ci0gICAgICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGZyZWVPdXRwdXRCdWZmZXIoKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwotICAgIHZvaWQgYWxsb2NPdXRwdXRCdWZmZXIoc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUpOwotICAgIHZvaWQgZHVtcE91dHB1dChvZnN0cmVhbSAmb3N0cm0pOwotICAgIHZvaWQgZnJlZU91dHB1dEJ1ZmZlcigpOwotICAgIHZvaWQgcHJvY2Vzc01wZWc0SDI2M0RlY29kZXIodmVjdG9yPEZyYW1lSW5mbz4gSW5mbywgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnN0cmVhbSAmbUVsZVN0cmVhbSwgb2ZzdHJlYW0gJm9zdHJtLCBNUDREZWNvZGluZ01vZGUgaW5wdXRNb2RlKTsKLSAgICB2b2lkIGRlSW5pdERlY29kZXIoKTsKLQotICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07Ci0gICAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZTsKLSAgICBjaGFyICptSW5wdXRCdWZmZXI7Ci0gICAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc107Ci0gICAgYm9vbCBtSW5pdGlhbGl6ZWQ7Ci0gICAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZDsKLSAgICB1aW50MzJfdCBtTnVtU2FtcGxlc091dHB1dDsKLSAgICB1aW50MzJfdCBtV2lkdGg7Ci0gICAgdWludDMyX3QgbUhlaWdodDsKLX07Ci0KLXN0YXR1c190IE1wZWc0SDI2M0RlY29kZXJUZXN0Ojppbml0RGVjb2RlcigpIHsKLSAgICBpZiAoIW1EZWNIYW5kbGUpIHsKLSAgICAgICAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOwotICAgIH0KLSAgICBpZiAoIW1EZWNIYW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgbWVtc2V0KG1EZWNIYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTXBlZzRIMjYzRGVjb2RlclRlc3Q6OmFsbG9jT3V0cHV0QnVmZmVyKHNpemVfdCBvdXRwdXRCdWZmZXJTaXplKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgewotICAgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKLSAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSAodWludDhfdCAqKW1hbGxvYyhvdXRwdXRCdWZmZXJTaXplKTsKLSAgICAgICAgICAgIEFTU0VSVF9ORShtT3V0cHV0QnVmZmVyW2ldLCBudWxscHRyKSA8PCAiT3V0cHV0IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCI7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTXBlZzRIMjYzRGVjb2RlclRlc3Q6OmR1bXBPdXRwdXQob2ZzdHJlYW0gJm9zdHJtKSB7Ci0gICAgdWludDhfdCAqc3JjID0gbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdOwotICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24obUhlaWdodCwgMTYpOwotICAgIHNpemVfdCBzcmNZU3RyaWRlID0gYWxpZ24obVdpZHRoLCAxNik7Ci0gICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7Ci0gICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7Ci0KLSAgICAvKiBZIGJ1ZmZlciAqLwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodDsgKytpKSB7Ci0gICAgICAgIG9zdHJtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihzcmMpLCBtV2lkdGgpOwotICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKLSAgICB9Ci0gICAgLyogVSBidWZmZXIgKi8KLSAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodCAvIDI7ICsraSkgewotICAgICAgICBvc3RybS53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIgKj4oc3JjKSwgbVdpZHRoIC8gMik7Ci0gICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKLSAgICB9Ci0gICAgLyogViBidWZmZXIgKi8KLSAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgIG9zdHJtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihzcmMpLCBtV2lkdGggLyAyKTsKLSAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOwotICAgIH0KLX0KLQotdm9pZCBNcGVnNEgyNjNEZWNvZGVyVGVzdDo6ZnJlZU91dHB1dEJ1ZmZlcigpIHsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7Ci0gICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7Ci0gICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOwotICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTXBlZzRIMjYzRGVjb2RlclRlc3Q6OnByb2Nlc3NNcGVnNEgyNjNEZWNvZGVyKHZlY3RvcjxGcmFtZUluZm8+IEluZm8sIGludDMyX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgaWZzdHJlYW0gJm1FbGVTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnN0cmVhbSAmb3N0cm0sIE1QNERlY29kaW5nTW9kZSBpbnB1dE1vZGUpIHsKLSAgICBzaXplX3QgbWF4V2lkdGggPSAoaW5wdXRNb2RlID09IE1QRUc0X01PREUpID8gTVBFRzRfTUFYX1dJRFRIIDogSDI2M19NQVhfV0lEVEg7Ci0gICAgc2l6ZV90IG1heEhlaWdodCA9IChpbnB1dE1vZGUgPT0gTVBFRzRfTU9ERSkgPyBNUEVHNF9NQVhfSEVJR0hUIDogSDI2M19NQVhfSEVJR0hUOwotICAgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplID0gYWxpZ24obWF4V2lkdGgsIDE2KSAqIGFsaWduKG1heEhlaWdodCwgMTYpICogMyAvIDI7Ci0gICAgdWludDMyX3QgZnJhbWVJbmRleCA9IG9mZnNldDsKLSAgICBib29sIHN0YXR1cyA9IHRydWU7Ci0gICAgQVNTRVJUX0dFKHJhbmdlLCAwKSA8PCAiSW52YWxpZCByYW5nZSI7Ci0gICAgQVNTRVJUX1RSVUUob2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IEluZm8uc2l6ZSgpIC0gMSkgPDwgIkludmFsaWQgb2Zmc2V0IjsKLSAgICBBU1NFUlRfTEUocmFuZ2UgKyBvZmZzZXQsIEluZm8uc2l6ZSgpKSA8PCAicmFuZ2Urb2Zmc2V0IGNhbid0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbm8gb2YgZnJhbWVzIjsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChmcmFtZUluZGV4ID09IEluZm8uc2l6ZSgpIHx8IGZyYW1lSW5kZXggPT0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7Ci0KLSAgICAgICAgaW50MzJfdCBieXRlc0NvdW50ID0gSW5mb1tmcmFtZUluZGV4XS5ieXRlc0NvdW50OwotICAgICAgICBBU1NFUlRfR1QoYnl0ZXNDb3VudCwgMCkgPDwgIlNpemUgZm9yIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBuZWdhdGl2ZSI7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IChjaGFyICopbWFsbG9jKGJ5dGVzQ291bnQpOwotICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byByZWFkIGZyYW1lIjsKLSAgICAgICAgbUVsZVN0cmVhbS5yZWFkKG1JbnB1dEJ1ZmZlciwgYnl0ZXNDb3VudCk7Ci0gICAgICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBieXRlc0NvdW50KSA8PCAibUVsZVN0cmVhbS5nY291bnQoKSAhPSBieXRlc0NvdW50IjsKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgdm9sSW5mb1tdID0gezB4MDAsIDB4MDAsIDB4MDEsIDB4QjB9OwotICAgICAgICBib29sIHZvbEhlYWRlciA9IG1lbWNtcChtSW5wdXRCdWZmZXIsIHZvbEluZm8sIDQpID09IDA7Ci0gICAgICAgIGlmICh2b2xIZWFkZXIpIHsKLSAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKLSAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnZvbERhdGFbMV17fTsKLSAgICAgICAgICAgIGludDMyX3Qgdm9sU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gSW5mb1tmcmFtZUluZGV4XS5mbGFnczsKLSAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSBmbGFncyA9PSBDT0RFQ19DT05GSUdfRkxBRzsKLSAgICAgICAgICAgIGlmIChjb2RlY0NvbmZpZyB8fCB2b2xIZWFkZXIpIHsKLSAgICAgICAgICAgICAgICB2b2xEYXRhWzBdID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG1JbnB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgdm9sU2l6ZSA9IGJ5dGVzQ291bnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IFBWSW5pdFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlLCB2b2xEYXRhLCAmdm9sU2l6ZSwgMSwgbWF4V2lkdGgsIG1heEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE1vZGUpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudCI7Ci0KLSAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgICAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShpbnB1dE1vZGUsIGFjdHVhbE1vZGUpCi0gICAgICAgICAgICAgICAgICAgIDw8ICJEZWNvZGVkIG1vZGUgbm90IHNhbWUgYXMgYWN0dWFsIG1vZGUgb2YgdGhlIGRlY29kZXIiOwotCi0gICAgICAgICAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKLQotICAgICAgICAgICAgaW50MzJfdCBkaXNwV2lkdGgsIGRpc3BIZWlnaHQ7Ci0gICAgICAgICAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAmZGlzcFdpZHRoLCAmZGlzcEhlaWdodCk7Ci0KLSAgICAgICAgICAgIGludDMyX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKLSAgICAgICAgICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAmYnVmV2lkdGgsICZidWZIZWlnaHQpOwotCi0gICAgICAgICAgICBBU1NFUlRfTEUoZGlzcFdpZHRoLCBidWZXaWR0aCkgPDwgIkRpc3BsYXkgd2lkdGggaXMgZ3JlYXRlciB0aGFuIGJ1ZmZlciB3aWR0aCI7Ci0gICAgICAgICAgICBBU1NFUlRfTEUoZGlzcEhlaWdodCwgYnVmSGVpZ2h0KSA8PCAiRGlzcGxheSBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIGJ1ZmZlciBoZWlnaHQiOwotCi0gICAgICAgICAgICBpZiAoZGlzcFdpZHRoICE9IG1XaWR0aCB8fCBkaXNwSGVpZ2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBtV2lkdGggPSBkaXNwV2lkdGg7Ci0gICAgICAgICAgICAgICAgbUhlaWdodCA9IGRpc3BIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgZnJlZU91dHB1dEJ1ZmZlcigpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dE1vZGUgPT0gSDI2M19NT0RFKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKLQotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp2b2xEYXRhWzFde307Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgdm9sU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZJbml0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUsIHZvbERhdGEsICZ2b2xTaXplLCAxLCBtYXhXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCwgSDI2M19NT0RFKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZCBmb3IgSDI2MyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb2RlY0NvbmZpZykgewotICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IHlGcmFtZVNpemUgPSBzaXplb2YodWludDgpICogbURlY0hhbmRsZS0+c2l6ZTsKLSAgICAgICAgQVNTRVJUX0dFKG91dHB1dEJ1ZmZlclNpemUsIHlGcmFtZVNpemUgKiAzIC8gMikKLSAgICAgICAgICAgICAgICA8PCAiVG9vIHNtYWxsIG91dHB1dCBidWZmZXI6ICIgPDwgb3V0cHV0QnVmZmVyU2l6ZSA8PCAiIGJ5dGVzIjsKLSAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYWxsb2NPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVyU2l6ZSkpOwotCi0gICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKLSAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1EZWNIYW5kbGUsIG1PdXRwdXRCdWZmZXJbMV0pOwotICAgICAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiBoZWFkZXIgY29udGFpbnMgbmV3IGluZm8sIGUuZy4sIHdpZHRoL2hlaWdodCwgZXRjLgotICAgICAgICBWb3BIZWFkZXJJbmZvIGhlYWRlckluZm87Ci0gICAgICAgIHVpbnQzMl90IHVzZUV4dFRpbWVzdGFtcCA9IDE7Ci0gICAgICAgIGludDMyX3QgaW5wdXRTaXplID0gKEluZm8pW2ZyYW1lSW5kZXhdLmJ5dGVzQ291bnQ7Ci0gICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IGZyYW1lSW5kZXg7Ci0KLSAgICAgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG1JbnB1dEJ1ZmZlcik7Ci0KLSAgICAgICAgc3RhdHVzID0gUFZEZWNvZGVWb3BIZWFkZXIobURlY0hhbmRsZSwgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJmlucHV0U2l6ZSwgJmhlYWRlckluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VFeHRUaW1lc3RhbXAsIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSk7Ci0gICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFBWX1RSVUUpIDw8ICJmYWlsZWQgdG8gZGVjb2RlIHZvcCBoZWFkZXIiOwotCi0gICAgICAgIC8vIEgyNjMgZG9lc24ndCBoYXZlIFZPTCBoZWFkZXIsIHRoZSBmcmFtZSBzaXplIGluZm9ybWF0aW9uIGlzIGluIHNob3J0IGhlYWRlciwgaS5lLiB0aGUKLSAgICAgICAgLy8gZGVjb2RlciBtYXkgZGV0ZWN0IHNpemUgY2hhbmdlIGFmdGVyIFBWRGVjb2RlVm9wSGVhZGVyLgotICAgICAgICBpbnQzMl90IGRpc3BXaWR0aCwgZGlzcEhlaWdodDsKLSAgICAgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgJmRpc3BXaWR0aCwgJmRpc3BIZWlnaHQpOwotCi0gICAgICAgIGludDMyX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKLSAgICAgICAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsICZidWZXaWR0aCwgJmJ1ZkhlaWdodCk7Ci0KLSAgICAgICAgQVNTRVJUX0xFKGRpc3BXaWR0aCwgYnVmV2lkdGgpIDw8ICJEaXNwbGF5IHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiBidWZmZXIgd2lkdGgiOwotICAgICAgICBBU1NFUlRfTEUoZGlzcEhlaWdodCwgYnVmSGVpZ2h0KSA8PCAiRGlzcGxheSBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIGJ1ZmZlciBoZWlnaHQiOwotICAgICAgICBpZiAoZGlzcFdpZHRoICE9IG1XaWR0aCB8fCBkaXNwSGVpZ2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgICAgIG1XaWR0aCA9IGRpc3BXaWR0aDsKLSAgICAgICAgICAgIG1IZWlnaHQgPSBkaXNwSGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzID0gUFZEZWNvZGVWb3BCb2R5KG1EZWNIYW5kbGUsICZpbnB1dFNpemUpOwotICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBQVl9UUlVFKSA8PCAiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZSBObyA9ICVkIiA8PCBmcmFtZUluZGV4OwotCi0gICAgICAgIGR1bXBPdXRwdXQob3N0cm0pOwotCi0gICAgICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7Ci0gICAgICAgICsrZnJhbWVJbmRleDsKLSAgICB9Ci0gICAgZnJlZU91dHB1dEJ1ZmZlcigpOwotfQotCi12b2lkIE1wZWc0SDI2M0RlY29kZXJUZXN0OjpkZUluaXREZWNvZGVyKCkgewotICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKLSAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtRGVjSGFuZGxlOwotICAgICAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgfQotICAgIGZyZWVPdXRwdXRCdWZmZXIoKTsKLX0KLQotdm9pZCBnZXRJbmZvKHN0cmluZyBpbmZvRmlsZU5hbWUsIHZlY3RvcjxGcmFtZUluZm8+ICZJbmZvKSB7Ci0gICAgaWZzdHJlYW0gZWxlSW5mbzsKLSAgICBlbGVJbmZvLm9wZW4oaW5mb0ZpbGVOYW1lKTsKLSAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IGluZm9GaWxlTmFtZTsKLSAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSAwOwotICAgIHVpbnQzMl90IGZsYWdzID0gMDsKLSAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7Ci0gICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOwotICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOwotICAgIH0KLSAgICBpZiAoZWxlSW5mby5pc19vcGVuKCkpIGVsZUluZm8uY2xvc2UoKTsKLX0KLQotVEVTVF9QKE1wZWc0SDI2M0RlY29kZXJUZXN0LCBEZWNvZGVUZXN0KSB7Ci0gICAgdHVwbGU8c3RyaW5nIC8qIElucHV0RmlsZU5hbWUgKi8sIHN0cmluZyAvKiBJbmZvRmlsZU5hbWUgKi8sIGJvb2wgLyogbW9kZSAqLz4gcGFyYW1zID0KLSAgICAgICAgICAgIEdldFBhcmFtKCk7Ci0KLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7Ci0gICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOwotICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgZ2V0PDA+KHBhcmFtcyk7Ci0KLSAgICBzdHJpbmcgaW5mb0ZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4ocGFyYW1zKTsKLSAgICB2ZWN0b3I8RnJhbWVJbmZvPiBJbmZvOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldEluZm8oaW5mb0ZpbGVOYW1lLCBJbmZvKSk7Ci0gICAgQVNTRVJUX05FKEluZm8uZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgSW5mbyBmaWxlIjsKLQotICAgIG9mc3RyZWFtIG9zdHJtOwotICAgIG9zdHJtLm9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgc3RkOjpvZnN0cmVhbTo6YmluYXJ5KTsKLSAgICBBU1NFUlRfRVEob3N0cm0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgIiA8PCBnZXQ8MD4ocGFyYW1zKTsKLQotICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7Ci0gICAgQVNTRVJUX0VRKGVyciwgT0spIDw8ICJpbml0RGVjb2RlcjogZmFpbGVkIHRvIGNyZWF0ZSBkZWNvZGVyICIgPDwgZXJyOwotCi0gICAgYm9vbCBpc01wZWc0ID0gZ2V0PDI+KHBhcmFtcyk7Ci0gICAgTVA0RGVjb2RpbmdNb2RlIGlucHV0TW9kZSA9IGlzTXBlZzQgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAotICAgICAgICAgICAgcHJvY2Vzc01wZWc0SDI2M0RlY29kZXIoSW5mbywgMCwgSW5mby5zaXplKCksIG1FbGVTdHJlYW0sIG9zdHJtLCBpbnB1dE1vZGUpKTsKLSAgICBkZUluaXREZWNvZGVyKCk7Ci0gICAgb3N0cm0uY2xvc2UoKTsKLSAgICBJbmZvLmNsZWFyKCk7Ci19Ci0KLVRFU1RfUChNcGVnNEgyNjNEZWNvZGVyVGVzdCwgRmx1c2hUZXN0KSB7Ci0gICAgdHVwbGU8c3RyaW5nIC8qIElucHV0RmlsZU5hbWUgKi8sIHN0cmluZyAvKiBJbmZvRmlsZU5hbWUgKi8sIGJvb2wgLyogbW9kZSAqLz4gcGFyYW1zID0KLSAgICAgICAgICAgIEdldFBhcmFtKCk7Ci0KLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7Ci0gICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOwotICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgZ2V0PDA+KHBhcmFtcyk7Ci0KLSAgICBzdHJpbmcgaW5mb0ZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4ocGFyYW1zKTsKLSAgICB2ZWN0b3I8RnJhbWVJbmZvPiBJbmZvOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldEluZm8oaW5mb0ZpbGVOYW1lLCBJbmZvKSk7Ci0gICAgQVNTRVJUX05FKEluZm8uZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgSW5mbyBmaWxlIjsKLQotICAgIG9mc3RyZWFtIG9zdHJtOwotICAgIG9zdHJtLm9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgc3RkOjpvZnN0cmVhbTo6YmluYXJ5KTsKLSAgICBBU1NFUlRfRVEob3N0cm0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgIiA8PCBnZXQ8MD4ocGFyYW1zKTsKLQotICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7Ci0gICAgQVNTRVJUX0VRKGVyciwgT0spIDw8ICJpbml0RGVjb2RlcjogZmFpbGVkIHRvIGNyZWF0ZSBkZWNvZGVyICIgPDwgZXJyOwotCi0gICAgYm9vbCBpc01wZWc0ID0gZ2V0PDI+KHBhcmFtcyk7Ci0gICAgTVA0RGVjb2RpbmdNb2RlIGlucHV0TW9kZSA9IGlzTXBlZzQgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOwotICAgIC8vIE51bWJlciBvZiBmcmFtZXMgdG8gYmUgZGVjb2RlZCBiZWZvcmUgZmx1c2gKLSAgICBpbnQzMl90IG51bUZyYW1lcyA9IEluZm8uc2l6ZSgpIC8gMzsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKLSAgICAgICAgICAgIHByb2Nlc3NNcGVnNEgyNjNEZWNvZGVyKEluZm8sIDAsIG51bUZyYW1lcywgbUVsZVN0cmVhbSwgb3N0cm0sIGlucHV0TW9kZSkpOwotCi0gICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICBpbnQzMl90IHN0YXR1cyA9IFBWUmVzZXRWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7Ci0gICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFBWX1RSVUUpOwotICAgIH0KLQotICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAotICAgIGludDMyX3QgaW5kZXggPSBudW1GcmFtZXM7Ci0gICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOwotICAgIHVpbnQzMl90IGZsYWdzID0gMDsKLSAgICB3aGlsZSAoaW5kZXggPCAoaW50MzJfdClJbmZvLnNpemUoKSkgewotICAgICAgICBpZiAoSW5mb1tpbmRleF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baW5kZXhdLmZsYWdzIC0gMSk7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBTWU5DX0ZSQU1FKSA9PSBTWU5DX0ZSQU1FKSB7Ci0gICAgICAgICAgICBrZXlGcmFtZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmbGFncyA9IDA7Ci0gICAgICAgIG1FbGVTdHJlYW0uaWdub3JlKEluZm9baW5kZXhdLmJ5dGVzQ291bnQpOwotICAgICAgICBpbmRleCsrOwotICAgIH0KLSAgICBBTE9HVigiSW5kZXg9ICVkIiwgaW5kZXgpOwotICAgIGlmIChrZXlGcmFtZSkgewotICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHByb2Nlc3NNcGVnNEgyNjNEZWNvZGVyKEluZm8sIGluZGV4LCAoaW50MzJfdClJbmZvLnNpemUoKSAtIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWxlU3RyZWFtLCBvc3RybSwgaW5wdXRNb2RlKSk7Ci0gICAgfQotICAgIGRlSW5pdERlY29kZXIoKTsKLSAgICBvc3RybS5jbG9zZSgpOwotICAgIEluZm8uY2xlYXIoKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAotICAgICAgICBNcGVnNEgyNjNEZWNvZGVyVGVzdEFsbCwgTXBlZzRIMjYzRGVjb2RlclRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoInN3aXJsXzEyOHg5Nl9oMjYzLmgyNjMiLCAic3dpcmxfMTI4eDk2X2gyNjMuaW5mbyIsIGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTc2eDE0NF9oMjYzLmgyNjMiLCAic3dpcmxfMTc2eDE0NF9oMjYzLmluZm8iLCBmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInN3aXJsXzM1MngyODhfaDI2My5oMjYzIiwgInN3aXJsXzM1MngyODhfaDI2My5pbmZvIiwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfMzUyeDI4OF9oMjYzLmgyNjMiLCAiYmJiXzM1MngyODhfaDI2My5pbmZvIiwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfMzUyeDI4OF9tcGVnNC5tNHYiLCAiYmJiXzM1MngyODhfbXBlZzQuaW5mbyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzd2lybF8xMjh4MTI4X21wZWc0Lm00diIsICJzd2lybF8xMjh4MTI4X21wZWc0LmluZm8iLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTMweDEzMl9tcGVnNC5tNHYiLCAic3dpcmxfMTMweDEzMl9tcGVnNC5pbmZvIiwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInN3aXJsXzEzMngxMzBfbXBlZzQubTR2IiwgInN3aXJsXzEzMngxMzBfbXBlZzQuaW5mbyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzd2lybF8xMzZ4MTQ0X21wZWc0Lm00diIsICJzd2lybF8xMzZ4MTQ0X21wZWc0LmluZm8iLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTQ0eDEzNl9tcGVnNC5tNHYiLCAic3dpcmxfMTQ0eDEzNl9tcGVnNC5pbmZvIiwgdHJ1ZSkpKTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgZ0VudiA9IG5ldyBNcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50KCk7Ci0gICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7Ci0gICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKLSAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HRCgiRGVjb2RlciBUZXN0IFJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNGFlYTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMjIE1lZGlhIFRlc3RpbmcgIyMKLS0tLQotIyMjIyBNcGVnNEgyNjNEZWNvZGVyIDoKLVRoZSBNcGVnNEgyNjNEZWNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBNcGVnNCBhbmQgSDI2MyBkZWNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KLQotUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6Ci1gYGAKLW0gTXBlZzRIMjYzRGVjb2RlclRlc3QKLWBgYAotCi1UaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LwotCi1UaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCi0KLVRvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgotYGBgCi1hZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvTXBlZzRIMjYzRGVjb2RlclRlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLwotYGBgCi0KLVRvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KLWBgYAotYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCi1gYGAKLQotVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyLnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KLQotYGBgCi1hZGIgcHVzaCBNcGVnNEgyNjNEZWNvZGVyIC9kYXRhL2xvY2FsL3RtcC8KLWBgYAotCi11c2FnZTogTXBlZzRIMjYzRGVjb2RlclRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+Ci1gYGAKLWFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0RlY29kZXIvCi1gYGAKLUFsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgotCi1gYGAKLWF0ZXN0IE1wZWc0SDI2M0RlY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKLWBgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCmluZGV4IGI4YmMyNGUuLjllMTIwZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKQEAgLTEsNDkgKzEsMyBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGFwZXhfYXZhaWxhYmxlOiBbCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAotICAgIF0sCi0gICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2JpdHN0cmVhbV9pby5jcHAiLAotICAgICAgICAic3JjL2NvbWJpbmVkX2VuY29kZS5jcHAiLCAic3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAiLAotICAgICAgICAic3JjL2RjdC5jcHAiLAotICAgICAgICAic3JjL2ZpbmRoYWxmcGVsLmNwcCIsCi0gICAgICAgICJzcmMvZmFzdGNvZGVtYi5jcHAiLAotICAgICAgICAic3JjL2Zhc3RpZGN0LmNwcCIsCi0gICAgICAgICJzcmMvZmFzdHF1YW50LmNwcCIsCi0gICAgICAgICJzcmMvbWVfdXRpbHMuY3BwIiwKLSAgICAgICAgInNyYy9tcDRlbmNfYXBpLmNwcCIsCi0gICAgICAgICJzcmMvcmF0ZV9jb250cm9sLmNwcCIsCi0gICAgICAgICJzcmMvbW90aW9uX2VzdC5jcHAiLAotICAgICAgICAic3JjL21vdGlvbl9jb21wLmNwcCIsCi0gICAgICAgICJzcmMvc2FkLmNwcCIsCi0gICAgICAgICJzcmMvc2FkX2hhbGZwZWwuY3BwIiwKLSAgICAgICAgInNyYy92bGNfZW5jb2RlLmNwcCIsCi0gICAgICAgICJzcmMvdm9wLmNwcCIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURCWF9SQyIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCi0KLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19Ci0KIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC01Miw4ICs2LDYgQEAKIAogICAgIHNyY3M6IFsiU29mdE1QRUc0RW5jb2Rlci5jcHAiXSwKIAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLURCWF9SQyIsCiAgICAgXSwKQEAgLTY4LDI4ICsyMCwzIEBACiAgICAgfSwKIH0KIAotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jX3Rlc3QiLAotICAgIGd0ZXN0OiBmYWxzZSwKLQotICAgIHNyY3M6IFsidGVzdC9tNHZfaDI2M19lbmNfdGVzdC5jcHAiXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURCWF9SQyIsCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICB9LAotCi0gICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhODExNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiTXBlZzRIMjYzRW5jb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotCi0gICAgc3JjcyA6IFsgIk1wZWc0SDI2M0VuY29kZXJUZXN0LmNwcCIgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKaW5kZXggOTYxMDZmMS4uNjFiMjQ4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icApAQCAtMSw4MSArMSwzIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wM2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvcHZtcDNfbm9ybWFsaXplLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfYWxpYXNfcmVkdWN0aW9uLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfY3JjLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZ2V0Yml0cy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfaHVmZm1hbl9kZWNvZGluZy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2h1ZmZtYW5fcGFyc2luZy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX3RhYmxlcy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2ltZGN0X3N5bnRoLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfbWRjdF82LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGN0XzYuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2VxdWFsaXplci5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX3NlZWtfc3luY2guY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX3Jlb3JkZXIuY3BwIiwKLQotICAgICAgICAic3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfbWRjdF8xOC5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2RjdF85LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGN0XzE2LmNwcCIsCi0gICAgXSwKLQotICAgIGFyY2g6IHsKLSAgICAgICAgYXJtOiB7Ci0gICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKLSAgICAgICAgICAgICAgICAic3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcCIsCi0gICAgICAgICAgICAgICAgInNyYy9wdm1wM19tZGN0XzE4LmNwcCIsCi0gICAgICAgICAgICAgICAgInNyYy9wdm1wM19kY3RfOS5jcHAiLAotICAgICAgICAgICAgICAgICJzcmMvcHZtcDNfZGN0XzE2LmNwcCIsCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgc3JjczogWwotICAgICAgICAgICAgICAgICJzcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19tZGN0XzE4X2djYy5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19kY3RfOV9nY2MucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vcHZtcDNfZGN0XzE2X2djYy5zIiwKLSAgICAgICAgICAgIF0sCi0KLSAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgfSwKLQotICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgICAgICAic3JjIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLX0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcDNkZWMiLApAQCAtODMsMTEgKzUsNiBAQAogCiAgICAgc3JjczogWyJTb2Z0TVAzLmNwcCJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzcmMiLAotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTEwMCwzNCArMTcsMyBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X21wM2RlYyJdLAogfQogCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcDNkZWNfdGVzdCIsCi0gICAgZ3Rlc3Q6IGZhbHNlLAotCi0gICAgc3JjczogWwotICAgICAgICAidGVzdC9tcDNkZWNfdGVzdC5jcHAiLAotICAgICAgICAidGVzdC9tcDNyZWFkZXIuY3BwIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAic3JjIiwKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKLSAgICAgICAgImxpYnNuZGZpbGUiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWyJsaWJhdWRpb3V0aWxzIl0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCBiNWQzMmVkLi4xNWNkZTIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9wdm1wM2RlY29kZXJfYXBpLmgiCisjaW5jbHVkZSA8cHZtcDNkZWNvZGVyX2FwaS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19mcmFtZWRlY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM3ZjVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MzAgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgUGFja2V0VmlkZW8gQ29ycC4KLSAgIE1QMyBEZWNvZGVyIExpYnJhcnkKLQotICAgRmlsZW5hbWU6IHB2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKLQotICAgRnVuY3Rpb25zOgotICAgIHB2bXAzX2ZyYW1lZGVjb2RlcgotICAgIHB2bXAzX0luaXREZWNvZGVyCi0gICAgcHZtcDNfcmVzZXREZWNvZGVyCi0KLSAgICBEYXRlOiAwOS8yMS8yMDA3Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFVklTSU9OIEhJU1RPUlkKLQotCi0gRGVzY3JpcHRpb246Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotSW5wdXQKLSAgICBwRXh0ID0gcG9pbnRlciB0byB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlIHN0cnVjdHVyZS4gU2VlIHRoZSBmaWxlCi0gICAgICAgICAgIHB2bXAzZGVjb2Rlcl9hcGkuaCBmb3IgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIGZpZWxkLgotICAgICAgICAgICBEYXRhIHR5cGUgb2YgcG9pbnRlciB0byBhIHRQVk1QM0RlY29kZXJFeHRlcm5hbAotICAgICAgICAgICBzdHJ1Y3R1cmUuCi0KLSAgICBwTWVtID0gdm9pZCBwb2ludGVyIHRvIGhpZGUgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5Ci0gICAgICAgICAgIEl0IGlzIGNhc3QgYmFjayB0byBhIHRtcDNkZWNfZmlsZSBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlCi0gICAgICAgICAgIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gcGVyc2lzdCBiZXR3ZWVuIGNhbGxzIHRvCi0gICAgICAgICAgIHRoaXMgZnVuY3Rpb24sIG9yIGlzIHRvbyBiaWcgdG8gYmUgcGxhY2VkIG9uIHRoZSBzdGFjaywgZXZlbgotICAgICAgICAgICB0aG91Z2ggdGhlIGRhdGEgaXMgb25seSBuZWVkZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgIERhdGEgdHlwZSB2b2lkIHBvaW50ZXIsIGludGVybmFsbHkgcG9pbnRlciB0byBhIHRtcDNkZWNfZmlsZQotICAgICAgICAgICBzdHJ1Y3R1cmUuCi0KLQotIE91dHB1dHM6Ci0gICAgIHN0YXR1cyA9IEVSUk9SIGNvbmRpdGlvbi4gIHNlZSBzdHJ1Y3R1cmUgIEVSUk9SX0NPREUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIHBNZW0gY29udGVudHMgYXJlIG1vZGlmaWVkLgotICAgIHBFeHQ6IChtb3JlIGRldGFpbCBpbiB0aGUgZmlsZSBwdm1wM2RlY29kZXJfYXBpLmgpCi0gICAgaW5wdXRCdWZmZXJVc2VkTGVuZ3RoIC0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHVzZWQgdXAgYnkgdGhlIHN0cmVhbS4KLSAgICBzYW1wbGluZ1JhdGUgLSBzYW1wbGluZyByYXRlIGluIHNhbXBsZXMgcGVyIHNlYwotICAgIGJpdFJhdGUgLSBiaXQgcmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQsIHZhcmllcyBmcmFtZSB0byBmcmFtZS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OUyBERVNDUklQVElPTgotCi0gICAgcHZtcDNfZnJhbWVkZWNvZGVyCi0gICAgICAgIGZyYW1lIGRlY29kZXIgbGlicmFyeSBkcml2ZXIKLSAgICBwdm1wM19Jbml0RGVjb2RlcgotICAgICAgICBEZWNvZGVyIEluaXRpYWxpemF0aW9uCi0gICAgcHZtcDNfcmVzZXREZWNvZGVyCi0gICAgICAgIFJlc2V0IERlY29kZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVRVUlSRU1FTlRTCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gWzFdIElTTyBNUEVHIEF1ZGlvIFN1Ymdyb3VwIFNvZnR3YXJlIFNpbXVsYXRpb24gR3JvdXAgKDE5OTYpCi0gICAgIElTTyAxMzgxOC0zIE1QRUctMiBBdWRpbyBEZWNvZGVyIC0gTG93ZXIgU2FtcGxpbmcgRnJlcXVlbmN5IEV4dGVuc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0jaW5jbHVkZSAicHZtcDNfZnJhbWVkZWNvZGVyLmgiCi0jaW5jbHVkZSAicHZtcDNfZGVjX2RlZnMuaCIKLSNpbmNsdWRlICJwdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5oIgotI2luY2x1ZGUgInB2bXAzX3RhYmxlcy5oIgotI2luY2x1ZGUgInB2bXAzX2ltZGN0X3N5bnRoLmgiCi0jaW5jbHVkZSAicHZtcDNfYWxpYXNfcmVkdWN0aW9uLmgiCi0jaW5jbHVkZSAicHZtcDNfcmVvcmRlci5oIgotI2luY2x1ZGUgInB2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmgiCi0jaW5jbHVkZSAicHZtcDNfc3RlcmVvX3Byb2MuaCIKLSNpbmNsdWRlICJwdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5oIgotI2luY2x1ZGUgInB2bXAzX2dldF9zaWRlX2luZm8uaCIKLSNpbmNsdWRlICJwdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5oIgotI2luY2x1ZGUgInB2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmgiCi0jaW5jbHVkZSAicHZtcDNfZGVjb2RlX2hlYWRlci5oIgotI2luY2x1ZGUgInB2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5oIgotI2luY2x1ZGUgInNfdG1wM2RlY19maWxlLmgiCi0jaW5jbHVkZSAicHZtcDNfZ2V0Yml0cy5oIgotI2luY2x1ZGUgIm1wM19tZW1fZnVuY3MuaCIKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUVSUk9SX0NPREUgcHZtcDNfZnJhbWVkZWNvZGVyKHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqcEV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwTWVtKQotewotCi0gICAgRVJST1JfQ09ERSAgICAgICAgZXJyb3JDb2RlICA9IE5PX0RFQ09ESU5HX0VSUk9SOwotCi0gICAgaW50MzIgICBjcmNfZXJyb3JfY291bnQgPSAwOwotICAgIHVpbnQzMiAgc2VudF9jcmMgPSAwOwotICAgIHVpbnQzMiAgY29tcHV0ZWRfY3JjID0gMDsKLQotICAgIHRtcDNkZWNfY2hhbiAgICpwQ2hWYXJzW0NIQU5dOwotICAgIHRtcDNkZWNfZmlsZSAgICpwVmFycyA9ICh0bXAzZGVjX2ZpbGUgKilwTWVtOwotCi0gICAgbXAzSGVhZGVyIGluZm9fZGF0YTsKLSAgICBtcDNIZWFkZXIgKmluZm8gPSAmaW5mb19kYXRhOwotCi0gICAgcFZhcnMtPmlucHV0U3RyZWFtLnBCdWZmZXIgID0gcEV4dC0+cElucHV0QnVmZmVyOwotCi0KLSAgICBwVmFycy0+aW5wdXRTdHJlYW0udXNlZEJpdHMgID0gcEV4dC0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoIDw8IDM7Ci0gICAgcFZhcnMtPmlucHV0U3RyZWFtLmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCAgPSBwRXh0LT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGg7Ci0KLQotICAgIGVycm9yQ29kZSA9IHB2bXAzX2RlY29kZV9oZWFkZXIoJnBWYXJzLT5pbnB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHV0ZWRfY3JjKTsKLQotICAgIGlmIChlcnJvckNvZGUgIT0gTk9fREVDT0RJTkdfRVJST1IpCi0gICAgewotICAgICAgICBwRXh0LT5vdXRwdXRGcmFtZVNpemUgPSAwOwotICAgICAgICByZXR1cm4gZXJyb3JDb2RlOwotICAgIH0KLQotICAgIHBWYXJzLT5udW1fY2hhbm5lbHMgPSAoaW5mby0+bW9kZSA9PSBNUEdfTURfTU9OTykgPyAxIDogMjsKLSAgICBwRXh0LT5udW1fY2hhbm5lbHMgPSBwVmFycy0+bnVtX2NoYW5uZWxzOwotCi0gICAgaW50MzIgb3V0cHV0RnJhbWVTaXplID0gKGluZm8tPnZlcnNpb25feCA9PSBNUEVHXzEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogU1VCQkFORFNfTlVNQkVSICogRklMVEVSQkFOS19CQU5EUyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCQkFORFNfTlVNQkVSICogRklMVEVSQkFOS19CQU5EUzsKLQotICAgIG91dHB1dEZyYW1lU2l6ZSA9IChpbmZvLT5tb2RlID09IE1QR19NRF9NT05PKSA/IG91dHB1dEZyYW1lU2l6ZSA6IG91dHB1dEZyYW1lU2l6ZSA8PCAxOwotCi0KLSAgICAvKgotICAgICAqICBDaGVjayBpZiBvdXRwdXQgYnVmZmVyIGhhcyBlbm91Z2ggcm9vbSB0byBob2xkIG91dHB1dCBQQ00KLSAgICAgKi8KLSAgICBpZiAocEV4dC0+b3V0cHV0RnJhbWVTaXplID49IG91dHB1dEZyYW1lU2l6ZSkKLSAgICB7Ci0gICAgICAgIHBFeHQtPm91dHB1dEZyYW1lU2l6ZSA9IG91dHB1dEZyYW1lU2l6ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEV4dC0+b3V0cHV0RnJhbWVTaXplID0gMDsKLSAgICAgICAgcmV0dXJuIE9VVFBVVF9CVUZGRVJfVE9PX1NNQUxMOwotICAgIH0KLQotCi0gICAgcENoVmFyc1sgTEVGVF0gPSAmcFZhcnMtPnBlckNoYW5bIExFRlRdOwotICAgIHBDaFZhcnNbUklHSFRdID0gJnBWYXJzLT5wZXJDaGFuW1JJR0hUXTsKLQotCi0KLQotICAgIGlmIChpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogIEdldCBjcmMgY29udGVudAotICAgICAgICAgKi8KLSAgICAgICAgc2VudF9jcmMgPSBnZXRVcFRvMTdiaXRzKCZwVmFycy0+aW5wdXRTdHJlYW0sIDE2KTsKLSAgICB9Ci0KLQotICAgIGlmIChpbmZvLT5sYXllcl9kZXNjcmlwdGlvbiA9PSAzKQotICAgIHsKLSAgICAgICAgaW50MzIgZ3I7Ci0gICAgICAgIGludDMyIGNoOwotICAgICAgICB1aW50MzIgbWFpbl9kYXRhX2VuZDsKLSAgICAgICAgaW50MzIgYnl0ZXNfdG9fZGlzY2FyZDsKLSAgICAgICAgaW50MTYgKnB0ck91dEJ1ZmZlciA9IHBFeHQtPnBPdXRwdXRCdWZmZXI7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2lkZSBJbmZvcm1hdGlvbiBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBiaXRzdHJlYW0gYW5kIHN0b3JlIGZvciB1c2UKLSAgICAgICAgICogZHVyaW5nIHRoZSBkZWNvZGVkIG9mIHRoZSBhc3NvY2lhdGVkIGZyYW1lCi0gICAgICAgICAqLwotCi0gICAgICAgIGVycm9yQ29kZSA9IHB2bXAzX2dldF9zaWRlX2luZm8oJnBWYXJzLT5pbnB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNpZGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXB1dGVkX2NyYyk7Ci0KLSAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBOT19ERUNPRElOR19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgcEV4dC0+b3V0cHV0RnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiBlcnJvckNvZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgSWYgQ1JDIHdhcyBzZW50LCBjaGVjayB0aGF0IG1hdGNoZXMgdGhlIG9uZSBnb3Qgd2hpbGUgcGFyc2luZyBkYXRhCi0gICAgICAgICAqICBkaXNhYmxlIGNyYyBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIG1vZGUKLSAgICAgICAgICovCi0gICAgICAgIGlmIChpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGNvbXB1dGVkX2NyYyAhPSBzZW50X2NyYykgJiYgcEV4dC0+Y3JjRW5hYmxlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcmNfZXJyb3JfY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIG1haW4gZGF0YSAoc2NhbGVmYWN0b3JzLCBIdWZmbWFuIGNvZGVkLCBldGMsKSBhcmUgbm90IG5lY2Vzc2FyaWx5IGxvY2F0ZWQKLSAgICAgICAgICogYWRqYWNlbnQgdG8gdGhlIHNpZGUtaW5mby4gQmVnaW5uaW5nIG9mIG1haW4gZGF0YSBpcyBsb2NhdGVkIHVzaW5nCi0gICAgICAgICAqIGZpZWxkICJtYWluX2RhdGFfYmVnaW4iIG9mIHRoZSBjdXJyZW50IGZyYW1lLiBUaGUgbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUKLSAgICAgICAgICogaGVhZGVyIGFuZCBzaWRlIGluZm8uCi0gICAgICAgICAqICJtYWluX2RhdGFfYmVnaW4iIHBvaW50cyB0byB0aGUgZmlyc3QgYml0IG9mIG1haW4gZGF0YSBvZiBhIGZyYW1lLiBJdCBpcyBhIG5lZ2F0aXZlCi0gICAgICAgICAqIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzeW5jIHdvcmQKLSAgICAgICAgICogbWFpbl9kYXRhX2JlZ2luID0gMCAgPD09PT4gbWFpbiBkYXRhIHN0YXJ0IHJpZ3RoIGFmdGVyIHNpZGUgaW5mby4KLSAgICAgICAgICovCi0KLSAgICAgICAgaW50MzIgdGVtcCA9IHB2bXAzX2dldF9tYWluX2RhdGFfc2l6ZShpbmZvLCBwVmFycyk7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgQ2hlY2sgaWYgYXZhaWxhYmxlIGRhdGEgaG9sZHMgYSBmdWxsIGZyYW1lLCBpZiBub3QgZmxhZyBhbiBlcnJvcgotICAgICAgICAgKi8KLQotICAgICAgICBpZiAoKHVpbnQzMilwVmFycy0+cHJlZGljdGVkX2ZyYW1lX3NpemUgPiBwVmFycy0+aW5wdXRTdHJlYW0uaW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRXh0LT5vdXRwdXRGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgRmlsbCBpbiBpbnRlcm5hbCBjaXJjdWxhciBidWZmZXIKLSAgICAgICAgICovCi0gICAgICAgIGZpbGxNYWluRGF0YUJ1ZihwVmFycywgdGVtcCk7Ci0KLQotICAgICAgICBtYWluX2RhdGFfZW5kID0gcFZhcnMtPm1haW5EYXRhU3RyZWFtLnVzZWRCaXRzID4+IDM7IC8qIGluIGJ5dGVzICovCi0gICAgICAgIGlmICgobWFpbl9kYXRhX2VuZCA8PCAzKSA8IHBWYXJzLT5tYWluRGF0YVN0cmVhbS51c2VkQml0cykKLSAgICAgICAgewotICAgICAgICAgICAgbWFpbl9kYXRhX2VuZCsrOwotICAgICAgICAgICAgcFZhcnMtPm1haW5EYXRhU3RyZWFtLnVzZWRCaXRzID0gbWFpbl9kYXRhX2VuZCA8PCAzOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBmb3JjZSBzaWduZWQgY29tcHV0YXRpb247IGJ1ZmZlciBzaXplcyBhbmQgb2Zmc2V0cyBhcmUgYWxsIGdvaW5nIHRvIGJlCi0gICAgICAgIC8vIHdlbGwgd2l0aGluIHRoZSBjb25zdHJhaW50cyBvZiAzMi1iaXQgc2lnbmVkIG1hdGguCi0gICAgICAgIGJ5dGVzX3RvX2Rpc2NhcmQgPSBwVmFycy0+ZnJhbWVfc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChpbnQzMilwVmFycy0+c2lkZUluZm8ubWFpbl9kYXRhX2JlZ2luKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKGludDMyKW1haW5fZGF0YV9lbmQpOwotCi0KLSAgICAgICAgaWYgKG1haW5fZGF0YV9lbmQgPiBCVUZTSVpFKSAgIC8qIGNoZWNrIG92ZXJmbG93IG9uIHRoZSBidWZmZXIgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcFZhcnMtPmZyYW1lX3N0YXJ0IC09IEJVRlNJWkU7Ci0KLSAgICAgICAgICAgIHBWYXJzLT5tYWluRGF0YVN0cmVhbS51c2VkQml0cyAtPSAoQlVGU0laRSA8PCAzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBWYXJzLT5mcmFtZV9zdGFydCArPSB0ZW1wOwotCi0KLSAgICAgICAgaWYgKGJ5dGVzX3RvX2Rpc2NhcmQgPCAwIHx8IGNyY19lcnJvcl9jb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBOb3QgZW5vdWdoIGRhdGEgdG8gZGVjb2RlLCB0aGVuIHdlIHNob3VsZCBhdm9pZCByZWFkaW5nIHRoaXMKLSAgICAgICAgICAgICAqICBkYXRhICggZ2V0dGluZy9pZ25vcmluZyBzaWRvIGluZm8gYW5kIHNjYWxlIGRhdGEpCi0gICAgICAgICAgICAgKiAgTWFpbiBkYXRhIGNvdWxkIGJlIGxvY2F0ZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lLCBzbyBhbiB1bmFjY291bnRlZAotICAgICAgICAgICAgICogIGZyYW1lIGNhbiBjYXVzZSBpbmNvcnJlY3QgcHJvY2Vzc2luZwotICAgICAgICAgICAgICogIEp1c3QgcnVuIHRoZSBwb2x5cGhhc2UgZmlsdGVyIHRvICJjbGVhbiIgdGhlIGhpc3RvcnkgYnVmZmVyCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGVycm9yQ29kZSA9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1I7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgQ2xlYXIgdGhlIGlucHV0IHRvIHRoZXNlIGZpbHRlcnMKLSAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBwdl9tZW1zZXQoKHZvaWQqKXBDaFZhcnNbUklHSFRdLT53b3JrX2J1Zl9pbnQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgIFNVQkJBTkRTX05VTUJFUipGSUxURVJCQU5LX0JBTkRTKnNpemVvZihwQ2hWYXJzW1JJR0hUXS0+d29ya19idWZfaW50MzJbMF0pKTsKLQotICAgICAgICAgICAgcHZfbWVtc2V0KCh2b2lkKilwQ2hWYXJzW0xFRlRdLT53b3JrX2J1Zl9pbnQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgIFNVQkJBTkRTX05VTUJFUipGSUxURVJCQU5LX0JBTkRTKnNpemVvZihwQ2hWYXJzW0xFRlRdLT53b3JrX2J1Zl9pbnQzMlswXSkpOwotCi0gICAgICAgICAgICAvKiAgY2xlYXIgY2lyY3VsYXIgYnVmZmVycywgdG8gYXZvaWQgYW55IGdsaXRjaCAqLwotICAgICAgICAgICAgcHZfbWVtc2V0KCh2b2lkKikmcENoVmFyc1sgTEVGVF0tPmNpcmNfYnVmZmVyWzU3Nl0sCi0gICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICA0ODAqc2l6ZW9mKHBDaFZhcnNbIExFRlRdLT5jaXJjX2J1ZmZlclswXSkpOwotICAgICAgICAgICAgcHZfbWVtc2V0KCh2b2lkKikmcENoVmFyc1tSSUdIVF0tPmNpcmNfYnVmZmVyWzU3Nl0sCi0gICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICA0ODAqc2l6ZW9mKHBDaFZhcnNbUklHSFRdLT5jaXJjX2J1ZmZlclswXSkpOwotCi0gICAgICAgICAgICBwQ2hWYXJzWyBMRUZUXS0+dXNlZF9mcmVxX2xpbmVzID0gNTc1OwotICAgICAgICAgICAgcENoVmFyc1tSSUdIVF0tPnVzZWRfZnJlcV9saW5lcyA9IDU3NTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFZhcnMtPm1haW5EYXRhU3RyZWFtLnVzZWRCaXRzICs9IChieXRlc190b19kaXNjYXJkIDw8IDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIGlmIChmcl9wcy0+aGVhZGVyLT52ZXJzaW9uX3ggPT0gTVBFR18xKSwgdXNlIDIgZ3JhbnVsZXMsIG90aGVyd2lzZSBqdXN0IDEKLSAgICAgICAgICovCi0gICAgICAgIGZvciAoZ3IgPSAwOyBnciA8ICgxICsgIShpbmZvLT52ZXJzaW9uX3gpKTsgZ3IrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBOT19FTk9VR0hfTUFJTl9EQVRBX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHBWYXJzLT5udW1fY2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQzMiBwYXJ0Ml9zdGFydCA9IHBWYXJzLT5tYWluRGF0YVN0cmVhbS51c2VkQml0czsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+dmVyc2lvbl94ID09IE1QRUdfMSkKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdm1wM19nZXRfc2NhbGVfZmFjdG9ycygmcFZhcnMtPnNjYWxlRmFjdG9yc1tjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNpZGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+bWFpbkRhdGFTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgKiB0bXAgPSBwVmFycy0+U2NyYXRjaF9tZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycygmcFZhcnMtPnNjYWxlRmFjdG9yc1tjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNpZGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyICopdG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWYXJzLT5tYWluRGF0YVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzW2NoXS0+dXNlZF9mcmVxX2xpbmVzID0gcHZtcDNfaHVmZm1hbl9wYXJzaW5nKHBDaFZhcnNbY2hdLT53b3JrX2J1Zl9pbnQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8uY2hbY2hdLmdyYW5bZ3JdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0Ml9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pOwotCi0KLSAgICAgICAgICAgICAgICAgICAgcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUocENoVmFyc1tjaF0tPndvcmtfYnVmX2ludDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNjYWxlRmFjdG9yc1tjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8uY2hbY2hdLmdyYW5bZ3JdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzW2NoXS0+dXNlZF9mcmVxX2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKTsKLQotCi0KLQotICAgICAgICAgICAgICAgIH0gICAvKiBmb3IgKGNoPTA7IGNoPHN0ZXJlbzsgY2grKykgICovCi0KLSAgICAgICAgICAgICAgICBpZiAocFZhcnMtPm51bV9jaGFubmVscyA9PSAyKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMiB1c2VkX2ZyZXFfbGluZXMgPSAocENoVmFyc1sgTEVGVF0tPnVzZWRfZnJlcV9saW5lcyAgPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoVmFyc1tSSUdIVF0tPnVzZWRfZnJlcV9saW5lcykgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzWyBMRUZUXS0+dXNlZF9mcmVxX2xpbmVzICA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaFZhcnNbUklHSFRdLT51c2VkX2ZyZXFfbGluZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgcENoVmFyc1sgTEVGVF0tPnVzZWRfZnJlcV9saW5lcyA9IHVzZWRfZnJlcV9saW5lczsKLSAgICAgICAgICAgICAgICAgICAgcENoVmFyc1tSSUdIVF0tPnVzZWRfZnJlcV9saW5lcyA9IHVzZWRfZnJlcV9saW5lczsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+dmVyc2lvbl94ID09IE1QRUdfMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHZtcDNfc3RlcmVvX3Byb2MocENoVmFyc1sgTEVGVF0tPndvcmtfYnVmX2ludDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoVmFyc1tSSUdIVF0tPndvcmtfYnVmX2ludDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWYXJzLT5zY2FsZUZhY3RvcnNbUklHSFRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWYXJzLT5zaWRlSW5mby5jaFtMRUZUXS5ncmFuW2dyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRfZnJlcV9saW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgKiB0bXAgPSBwVmFycy0+U2NyYXRjaF9tZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdm1wM19tcGVnMl9zdGVyZW9fcHJvYyhwQ2hWYXJzWyBMRUZUXS0+d29ya19idWZfaW50MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzW1JJR0hUXS0+d29ya19idWZfaW50MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNjYWxlRmFjdG9yc1tSSUdIVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNpZGVJbmZvLmNoWyBMRUZUXS5ncmFuW2dyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8uY2hbUklHSFRdLmdyYW5bZ3JdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMiAqKXRtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRfZnJlcV9saW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8qIGlmICggZXJyb3JDb2RlICE9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IpICovCi0KLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHBWYXJzLT5udW1fY2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBwdm1wM19yZW9yZGVyKHBDaFZhcnNbY2hdLT53b3JrX2J1Zl9pbnQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmFycy0+c2lkZUluZm8uY2hbY2hdLmdyYW5bZ3JdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDaFZhcnNbIGNoXS0+dXNlZF9mcmVxX2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYXJzLT5TY3JhdGNoX21lbSk7Ci0KLSAgICAgICAgICAgICAgICBwdm1wM19hbGlhc19yZWR1Y3Rpb24ocENoVmFyc1tjaF0tPndvcmtfYnVmX2ludDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZhcnMtPnNpZGVJbmZvLmNoW2NoXS5ncmFuW2dyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDaFZhcnNbIGNoXS0+dXNlZF9mcmVxX2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKTsKLQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiAgIElNRENUCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLyogc2V0IG14cG9zaXRpb24KLSAgICAgICAgICAgICAgICAgKiBJbiBjYXNlIG9mIG1peGVkIGJsb2NrcywgIyBvZiBiYW5kcyB3aXRoIGxvbmcKLSAgICAgICAgICAgICAgICAgKiBibG9ja3MgKDIgb3IgNCkgZWxzZSAwCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgdWludDE2IG1peGVkQmxvY2tzTG9uZ0Jsb2NrcyA9IDA7IC8qICAwID0gbG9uZyBvciBzaG9ydCwgMj1taXhlZCwgND1taXhlZCAyLjVAODAwMCAqLwotICAgICAgICAgICAgICAgIGlmIChwVmFycy0+c2lkZUluZm8uY2hbY2hdLmdyYW5bZ3JdLm1peGVkX2Jsb2NrX2ZsYWcgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWYXJzLT5zaWRlSW5mby5jaFtjaF0uZ3Jhbltncl0ud2luZG93X3N3aXRjaGluZ19mbGFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbmZvLT52ZXJzaW9uX3ggPT0gTVBFR18yXzUpICYmIChpbmZvLT5zYW1wbGluZ19mcmVxdWVuY3kgPT0gMikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVkQmxvY2tzTG9uZ0Jsb2NrcyA9IDQ7IC8qIG1wZWcyLjUgQCA4IEtIeiAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWRCbG9ja3NMb25nQmxvY2tzID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB2bXAzX2ltZGN0X3N5bnRoKHBDaFZhcnNbY2hdLT53b3JrX2J1Zl9pbnQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hWYXJzW2NoXS0+b3ZlcmxhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFycy0+c2lkZUluZm8uY2hbY2hdLmdyYW5bZ3JdLmJsb2NrX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWRCbG9ja3NMb25nQmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaFZhcnNbIGNoXS0+dXNlZF9mcmVxX2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYXJzLT5TY3JhdGNoX21lbSk7Ci0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogICBQb2x5cGhhc2Ugc3ludGhlc2lzCi0gICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBwdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcyhwQ2hWYXJzW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFycy0+bnVtX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHQtPmVxdWFsaXplclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ck91dEJ1ZmZlcltjaF0pOwotCi0KLSAgICAgICAgICAgIH0vKiBlbmQgY2ggbG9vcCAqLwotCi0gICAgICAgICAgICBwdHJPdXRCdWZmZXIgKz0gcFZhcnMtPm51bV9jaGFubmVscyAqIFNVQkJBTkRTX05VTUJFUiAqIEZJTFRFUkJBTktfQkFORFM7Ci0gICAgICAgIH0gIC8qICAgZm9yIChncj0wO2dyPE1heF9ncjtncisrKSAgKi8KLQotICAgICAgICAvKiBza2lwIGFuY2lsbGFyeSBkYXRhICovCi0gICAgICAgIGlmIChpbmZvLT5iaXRyYXRlX2luZGV4ID4gMCkKLSAgICAgICAgeyAvKiBpZiBub3QgZnJlZS1mb3JtYXQgKi8KLQotICAgICAgICAgICAgaW50MzIgYW5jaWxsYXJ5X2RhdGFfbGVuZ2h0ID0gcFZhcnMtPnByZWRpY3RlZF9mcmFtZV9zaXplIDw8IDM7Ci0KLSAgICAgICAgICAgIGFuY2lsbGFyeV9kYXRhX2xlbmdodCAgLT0gcFZhcnMtPmlucHV0U3RyZWFtLnVzZWRCaXRzOwotCi0gICAgICAgICAgICAvKiBza2lwIGFuY2lsbGFyeSBkYXRhICovCi0gICAgICAgICAgICBpZiAoYW5jaWxsYXJ5X2RhdGFfbGVuZ2h0ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwVmFycy0+aW5wdXRTdHJlYW0udXNlZEJpdHMgKz0gYW5jaWxsYXJ5X2RhdGFfbGVuZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgVGhpcyBvdmVycmlkZXMgYSBwb3NzaWJsZSBOT19FTk9VR0hfTUFJTl9EQVRBX0VSUk9SCi0gICAgICAgICAqLwotICAgICAgICBlcnJvckNvZGUgPSBOT19ERUNPRElOR19FUlJPUjsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgaW5mbyBvbiB0aGUgaGVhZGVyIGxlYWRzIHRvIGFuIHVuc3VwcG9ydGVkIGxheWVyLCBtb3JlIGRhdGEKLSAgICAgICAgICogd2lsbCBub3QgZml4IHRoaXMsIHNvIHRoaXMgaXMgYSBiYWQgZnJhbWUsCi0gICAgICAgICAqLwotCi0gICAgICAgIHBFeHQtPm91dHB1dEZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgIHJldHVybiBVTlNVUFBPUlRFRF9MQVlFUjsKLSAgICB9Ci0KLSAgICBwRXh0LT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSBwVmFycy0+aW5wdXRTdHJlYW0udXNlZEJpdHMgPj4gMzsKLSAgICBwRXh0LT50b3RhbE51bWJlck9mQml0c1VzZWQgKz0gcFZhcnMtPmlucHV0U3RyZWFtLnVzZWRCaXRzOwotICAgIHBFeHQtPnZlcnNpb24gPSBpbmZvLT52ZXJzaW9uX3g7Ci0gICAgcEV4dC0+c2FtcGxpbmdSYXRlID0gbXAzX3NfZnJlcVtpbmZvLT52ZXJzaW9uX3hdW2luZm8tPnNhbXBsaW5nX2ZyZXF1ZW5jeV07Ci0gICAgcEV4dC0+Yml0UmF0ZSA9IG1wM19iaXRyYXRlW3BFeHQtPnZlcnNpb25dW2luZm8tPmJpdHJhdGVfaW5kZXhdOwotCi0KLSAgICAvKgotICAgICAqICBBbHdheXMgdmVyaWZ5IGJ1ZmZlciBvdmVycnVuIGNvbmRpdGlvbgotICAgICAqLwotCi0gICAgaWYgKHBFeHQtPmlucHV0QnVmZmVyVXNlZExlbmd0aCA+IHBFeHQtPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCkKLSAgICB7Ci0gICAgICAgIHBFeHQtPm91dHB1dEZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgIGVycm9yQ29kZSA9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotX19pbmxpbmUgdm9pZCBmaWxsRGF0YUJ1Zih0bXAzQml0cyAqcE1haW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdmFsKSAgICAgICAvKiB2YWwgdG8gd3JpdGUgaW50byB0aGUgYnVmZmVyICovCi17Ci0gICAgcE1haW5EYXRhLT5wQnVmZmVyW21vZHVsZShwTWFpbkRhdGEtPm9mZnNldCsrLCBCVUZTSVpFKV0gPSAodWludDgpdmFsOwotfQotCi0KLXZvaWQgZmlsbE1haW5EYXRhQnVmKHZvaWQgICpwTWVtLCBpbnQzMiB0ZW1wKQotewotICAgIHRtcDNkZWNfZmlsZSAgICpwVmFycyA9ICh0bXAzZGVjX2ZpbGUgKilwTWVtOwotCi0KLSAgICBpbnQzMiBvZmZzZXQgPSAocFZhcnMtPmlucHV0U3RyZWFtLnVzZWRCaXRzKSA+PiBJTkJVRl9BUlJBWV9JTkRFWF9TSElGVDsKLQotICAgIC8qCi0gICAgICogIENoZWNrIGlmIGlucHV0IGNpcmN1bGFyIGJ1ZmZlciBib3VuZGFyaWVzIG5lZWQgdG8gYmUgZW5mb3JjZWQKLSAgICAgKi8KLSAgICBpZiAoKG9mZnNldCArIHRlbXApIDwgQlVGU0laRSkKLSAgICB7Ci0gICAgICAgIHVpbnQ4ICogcHRyID0gcFZhcnMtPmlucHV0U3RyZWFtLnBCdWZmZXIgKyBvZmZzZXQ7Ci0KLSAgICAgICAgb2Zmc2V0ID0gcFZhcnMtPm1haW5EYXRhU3RyZWFtLm9mZnNldDsKLQotICAgICAgICAvKgotICAgICAgICAgKiAgQ2hlY2sgaWYgbWFpbiBkYXRhIGNpcmN1bGFyIGJ1ZmZlciBib3VuZGFyaWVzIG5lZWQgdG8gYmUgZW5mb3JjZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgob2Zmc2V0ICsgdGVtcCkgPCBCVUZTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdl9tZW1jcHkoKHBWYXJzLT5tYWluRGF0YVN0cmVhbS5wQnVmZmVyICsgb2Zmc2V0KSwgcHRyLCB0ZW1wKnNpemVvZih1aW50OCkpOwotICAgICAgICAgICAgcFZhcnMtPm1haW5EYXRhU3RyZWFtLm9mZnNldCArPSB0ZW1wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzIgdG1wMSA9ICoocHRyKyspOwotICAgICAgICAgICAgZm9yIChpbnQzMiBuQnl0ZXMgPSB0ZW1wID4+IDE7IG5CeXRlcyAhPSAwOyBuQnl0ZXMtLSkgIC8qIHJlYWQgbWFpbiBkYXRhLiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludDMyIHRtcDIgPSAqKHB0cisrKTsKLSAgICAgICAgICAgICAgICBmaWxsRGF0YUJ1ZigmcFZhcnMtPm1haW5EYXRhU3RyZWFtLCB0bXAxKTsKLSAgICAgICAgICAgICAgICBmaWxsRGF0YUJ1ZigmcFZhcnMtPm1haW5EYXRhU3RyZWFtLCB0bXAyKTsKLSAgICAgICAgICAgICAgICB0bXAxID0gKihwdHIrKyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZW1wJjEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsbERhdGFCdWYoJnBWYXJzLT5tYWluRGF0YVN0cmVhbSwgdG1wMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGFkanVzdCBjaXJjdWxhciBidWZmZXIgY291bnRlciAqLwotICAgICAgICAgICAgcFZhcnMtPm1haW5EYXRhU3RyZWFtLm9mZnNldCA9IG1vZHVsZShwVmFycy0+bWFpbkRhdGFTdHJlYW0ub2Zmc2V0LCBCVUZTSVpFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGludDMyIG5CeXRlcyA9IHRlbXAgPj4gMTsgbkJ5dGVzICE9IDA7IG5CeXRlcy0tKSAgLyogcmVhZCBtYWluIGRhdGEuICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGxEYXRhQnVmKCZwVmFycy0+bWFpbkRhdGFTdHJlYW0sICoocFZhcnMtPmlucHV0U3RyZWFtLnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0KysgICwgQlVGU0laRSkpKTsKLSAgICAgICAgICAgIGZpbGxEYXRhQnVmKCZwVmFycy0+bWFpbkRhdGFTdHJlYW0sICoocFZhcnMtPmlucHV0U3RyZWFtLnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0KysgICwgQlVGU0laRSkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGVtcCYxKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxsRGF0YUJ1ZigmcFZhcnMtPm1haW5EYXRhU3RyZWFtLCAqKHBWYXJzLT5pbnB1dFN0cmVhbS5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCAgLCBCVUZTSVpFKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwVmFycy0+aW5wdXRTdHJlYW0udXNlZEJpdHMgKz0gKHRlbXApIDw8IElOQlVGX0FSUkFZX0lOREVYX1NISUZUOwotfQotCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXVpbnQzMiBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKHZvaWQpCi17Ci0gICAgdWludDMyIHNpemU7Ci0KLSAgICBzaXplID0gKHVpbnQzMikgc2l6ZW9mKHRtcDNkZWNfZmlsZSk7Ci0gICAgcmV0dXJuIChzaXplKTsKLX0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgInB2bXAzX2RlY29kZV9odWZmX2N3LmgiCi0KLXZvaWQgcHZtcDNfSW5pdERlY29kZXIodFBWTVAzRGVjb2RlckV4dGVybmFsICpwRXh0LAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAqcE1lbSkKLXsKLQotICAgIHRtcDNkZWNfZmlsZSAgICAgICpwVmFyczsKLSAgICBodWZmY29kZXRhYiAgICAgICAqcEh1ZmY7Ci0KLSAgICBwVmFycyA9ICh0bXAzZGVjX2ZpbGUgKilwTWVtOwotICAgIG1lbXNldChwVmFycywgMCwgc2l6ZW9mKCpwVmFycykpOwotCi0gICAgcEV4dC0+dG90YWxOdW1iZXJPZkJpdHNVc2VkID0gMDsKLSAgICBwRXh0LT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSAwOwotICAgIHBFeHQtPmlucHV0QnVmZmVyVXNlZExlbmd0aCAgICA9IDA7Ci0KLSAgICBwVmFycy0+aW5wdXRTdHJlYW0ucEJ1ZmZlciA9IHBFeHQtPnBJbnB1dEJ1ZmZlcjsKLQotICAgIC8qCi0gICAgICogIEluaXRpYWxpemUgaHVmZm1hbiBkZWNvZGluZyB0YWJsZQotICAgICAqLwotCi0gICAgcEh1ZmYgPSBwVmFycy0+aHQ7Ci0gICAgcEh1ZmZbMF0ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbMF0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjA7Ci0gICAgcEh1ZmZbMV0ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbMV0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjE7Ci0gICAgcEh1ZmZbMl0ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbMl0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjI7Ci0gICAgcEh1ZmZbM10ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbM10ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjM7Ci0gICAgcEh1ZmZbNF0ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbNF0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjA7IC8qIHRibCA0IGlzIG5vdCB1c2VkICovCi0gICAgcEh1ZmZbNV0ubGluYml0cyA9IDQ7Ci0gICAgcEh1ZmZbNV0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjU7Ci0gICAgcEh1ZmZbNl0ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbNl0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjY7Ci0gICAgcEh1ZmZbN10ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbN10ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjc7Ci0gICAgcEh1ZmZbOF0ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbOF0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjg7Ci0gICAgcEh1ZmZbOV0ubGluYml0cyA9IDA7Ci0gICAgcEh1ZmZbOV0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjk7Ci0gICAgcEh1ZmZbMTBdLmxpbmJpdHMgPSAwOwotICAgIHBIdWZmWzEwXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTA7Ci0gICAgcEh1ZmZbMTFdLmxpbmJpdHMgPSAwOwotICAgIHBIdWZmWzExXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTE7Ci0gICAgcEh1ZmZbMTJdLmxpbmJpdHMgPSAwOwotICAgIHBIdWZmWzEyXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTI7Ci0gICAgcEh1ZmZbMTNdLmxpbmJpdHMgPSAwOwotICAgIHBIdWZmWzEzXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTM7Ci0gICAgcEh1ZmZbMTRdLmxpbmJpdHMgPSAwOwotICAgIHBIdWZmWzE0XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMDsgLyogdGJsIDE0IGlzIG5vdCB1c2VkICovCi0gICAgcEh1ZmZbMTVdLmxpbmJpdHMgPSAwOwotICAgIHBIdWZmWzE1XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTU7Ci0gICAgcEh1ZmZbMTZdLmxpbmJpdHMgPSAxOwotICAgIHBIdWZmWzE2XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTY7Ci0gICAgcEh1ZmZbMTddLmxpbmJpdHMgPSAyOwotICAgIHBIdWZmWzE3XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTY7Ci0gICAgcEh1ZmZbMThdLmxpbmJpdHMgPSAzOwotICAgIHBIdWZmWzE4XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTY7Ci0gICAgcEh1ZmZbMTldLmxpbmJpdHMgPSA0OwotICAgIHBIdWZmWzE5XS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTY7Ci0gICAgcEh1ZmZbMjBdLmxpbmJpdHMgPSA2OwotICAgIHBIdWZmWzIwXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTY7Ci0gICAgcEh1ZmZbMjFdLmxpbmJpdHMgPSA4OwotICAgIHBIdWZmWzIxXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMTY7Ci0gICAgcEh1ZmZbMjJdLmxpbmJpdHMgPSAxMDsKLSAgICBwSHVmZlsyMl0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjE2OwotICAgIHBIdWZmWzIzXS5saW5iaXRzID0gMTM7Ci0gICAgcEh1ZmZbMjNdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIxNjsKLSAgICBwSHVmZlsyNF0ubGluYml0cyA9IDQ7Ci0gICAgcEh1ZmZbMjRdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIyNDsKLSAgICBwSHVmZlsyNV0ubGluYml0cyA9IDU7Ci0gICAgcEh1ZmZbMjVdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIyNDsKLSAgICBwSHVmZlsyNl0ubGluYml0cyA9IDY7Ci0gICAgcEh1ZmZbMjZdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIyNDsKLSAgICBwSHVmZlsyN10ubGluYml0cyA9IDc7Ci0gICAgcEh1ZmZbMjddLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIyNDsKLSAgICBwSHVmZlsyOF0ubGluYml0cyA9IDg7Ci0gICAgcEh1ZmZbMjhdLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIyNDsKLSAgICBwSHVmZlsyOV0ubGluYml0cyA9IDk7Ci0gICAgcEh1ZmZbMjldLnBkZWNfaHVmZl90YWIgPSBwdm1wM19kZWNvZGVfaHVmZl9jd190YWIyNDsKLSAgICBwSHVmZlszMF0ubGluYml0cyA9IDExOwotICAgIHBIdWZmWzMwXS5wZGVjX2h1ZmZfdGFiID0gcHZtcDNfZGVjb2RlX2h1ZmZfY3dfdGFiMjQ7Ci0gICAgcEh1ZmZbMzFdLmxpbmJpdHMgPSAxMzsKLSAgICBwSHVmZlszMV0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjI0OwotICAgIHBIdWZmWzMyXS5saW5iaXRzID0gMDsKLSAgICBwSHVmZlszMl0ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjMyOwotICAgIHBIdWZmWzMzXS5saW5iaXRzID0gMDsKLSAgICBwSHVmZlszM10ucGRlY19odWZmX3RhYiA9IHB2bXAzX2RlY29kZV9odWZmX2N3X3RhYjMzOwotCi0gICAgLyoKLSAgICAgKiAgSW5pdGlhbGl6ZSBwb2x5c3ludGhlc2lzIGNpcmN1bGFyIGJ1ZmZlciBtZWNoYW5pc20KLSAgICAgKi8KLSAgICAvKiBjbGVhciBidWZmZXJzICovCi0KLSAgICBwdm1wM19yZXNldERlY29kZXIocE1lbSk7Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotdm9pZCBwdm1wM19yZXNldERlY29kZXIodm9pZCAgKnBNZW0pCi17Ci0KLSAgICB0bXAzZGVjX2ZpbGUgICAgICAqcFZhcnM7Ci0gICAgdG1wM2RlY19jaGFuICAgICAgKnBDaFZhcnNbQ0hBTl07Ci0KLSAgICBwVmFycyA9ICh0bXAzZGVjX2ZpbGUgKilwTWVtOwotICAgIHBDaFZhcnNbIExFRlRdID0gJnBWYXJzLT5wZXJDaGFuWyBMRUZUXTsKLSAgICBwQ2hWYXJzW1JJR0hUXSA9ICZwVmFycy0+cGVyQ2hhbltSSUdIVF07Ci0KLSAgICBwVmFycy0+ZnJhbWVfc3RhcnQgPSAwOwotCi0gICAgcFZhcnMtPm1haW5EYXRhU3RyZWFtLm9mZnNldCA9IDA7Ci0KLSAgICBwVmFycy0+bWFpbkRhdGFTdHJlYW0ucEJ1ZmZlciA9ICBwVmFycy0+bWFpbkRhdGFCdWZmZXI7Ci0gICAgcFZhcnMtPm1haW5EYXRhU3RyZWFtLnVzZWRCaXRzID0gMDsKLQotCi0gICAgcFZhcnMtPmlucHV0U3RyZWFtLnVzZWRCaXRzID0gMDsgLy8gaW4gYml0cwotCi0KLSAgICBwQ2hWYXJzWyBMRUZUXS0+dXNlZF9mcmVxX2xpbmVzID0gNTc1OwotICAgIHBDaFZhcnNbUklHSFRdLT51c2VkX2ZyZXFfbGluZXMgPSA1NzU7Ci0KLQotICAgIC8qCi0gICAgICogIEluaXRpYWxpemUgcG9seXN5bnRoZXNpcyBjaXJjdWxhciBidWZmZXIgbWVjaGFuaXNtCi0gICAgICovCi0KLSAgICBwdl9tZW1zZXQoKHZvaWQqKSZwQ2hWYXJzWyBMRUZUXS0+Y2lyY19idWZmZXJbNTc2XSwKLSAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgNDgwKnNpemVvZihwQ2hWYXJzWyBMRUZUXS0+Y2lyY19idWZmZXJbMF0pKTsKLSAgICBwdl9tZW1zZXQoKHZvaWQqKSZwQ2hWYXJzW1JJR0hUXS0+Y2lyY19idWZmZXJbNTc2XSwKLSAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgNDgwKnNpemVvZihwQ2hWYXJzW1JJR0hUXS0+Y2lyY19idWZmZXJbMF0pKTsKLQotCi0gICAgcHZfbWVtc2V0KCh2b2lkKilwQ2hWYXJzWyBMRUZUXS0+b3ZlcmxhcCwKLSAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgU1VCQkFORFNfTlVNQkVSKkZJTFRFUkJBTktfQkFORFMqc2l6ZW9mKHBDaFZhcnNbIExFRlRdLT5vdmVybGFwWzBdKSk7Ci0KLQotICAgIHB2X21lbXNldCgodm9pZCopcENoVmFyc1sgUklHSFRdLT5vdmVybGFwLAotICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICBTVUJCQU5EU19OVU1CRVIqRklMVEVSQkFOS19CQU5EUypzaXplb2YocENoVmFyc1sgUklHSFRdLT5vdmVybGFwWzBdKSk7Ci0KLQotCi0KLQotICAgIC8qCi0gICAgICogIENsZWFyIGFsbCB0aGUgc3RydWN0dXJlcwotICAgICAqLwotCi0KLSAgICBwdl9tZW1zZXQoKHZvaWQqKSZwVmFycy0+c2NhbGVGYWN0b3JzW1JJR0hUXSwKLSAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgc2l6ZW9mKG1wM1NjYWxlRmFjdG9ycykpOwotCi0gICAgcHZfbWVtc2V0KCh2b2lkKikmcFZhcnMtPnNjYWxlRmFjdG9yc1tMRUZUXSwKLSAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgc2l6ZW9mKG1wM1NjYWxlRmFjdG9ycykpOwotCi0gICAgcHZfbWVtc2V0KCh2b2lkKikmcFZhcnMtPnNpZGVJbmZvLAotICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICBzaXplb2YobXAzU2lkZUluZm8pKTsKLQotICAgIHB2X21lbXNldCgodm9pZCopJnBWYXJzLT5zaWRlSW5mbywKLSAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgc2l6ZW9mKG1wM1NpZGVJbmZvKSk7Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDQyMDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgUGFja2V0VmlkZW8gQ29ycC4KLSAgIE1QMyBEZWNvZGVyIExpYnJhcnkKLQotICAgRmlsZW5hbWU6IHB2bXAzX2dldF9zaWRlX2luZm8uY3BwCi0KLSAgICAgRGF0ZTogMDkvMjEvMjAwNwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVZJU0lPTiBISVNUT1JZCi0KLQotIERlc2NyaXB0aW9uOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLUlucHV0Ci0gICAgbXAzU2lkZUluZm8gICAgICpzaSwKLSAgICBtcDNIZWFkZXIgICAgICAgKmluZm8sICAgICAgICAgICAgIG1wMyBoZWFkZXIgaW5mb3JtYXRpb24KLSAgICB1aW50MzIgICAgICAgICAgKmNyYyAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGNyYyB2YWx1ZSAoaWYgZW5hYmxlZCkKLQotCi0gUmV0dXJucwotCi0gICAgbXAzU2lkZUluZm8gICAgICpzaSwgICAgICAgICAgICAgICBzaWRlIGluZm9ybWF0aW9uCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotICAgIGFjcXVpcmVzIHNpZGUgaW5mb3JtYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVRVUlSRU1FTlRTCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gWzFdIElTTyBNUEVHIEF1ZGlvIFN1Ymdyb3VwIFNvZnR3YXJlIFNpbXVsYXRpb24gR3JvdXAgKDE5OTYpCi0gICAgIElTTyAxMzgxOC0zIE1QRUctMiBBdWRpbyBEZWNvZGVyIC0gTG93ZXIgU2FtcGxpbmcgRnJlcXVlbmN5IEV4dGVuc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgInB2bXAzX2dldF9zaWRlX2luZm8uaCIKLSNpbmNsdWRlICJwdm1wM19jcmMuaCIKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUVSUk9SX0NPREUgcHZtcDNfZ2V0X3NpZGVfaW5mbyh0bXAzQml0cyAgICAqaW5wdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAzU2lkZUluZm8gKnNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wM0hlYWRlciAgICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiAgICAgICpjcmMpCi17Ci0gICAgaW50MzIgY2gsIGdyOwotICAgIHVpbnQzMiB0bXA7Ci0KLSAgICBpbnQgc3RlcmVvICA9IChpbmZvLT5tb2RlID09IE1QR19NRF9NT05PKSA/IDEgOiAyOwotCi0gICAgaWYgKGluZm8tPnZlcnNpb25feCA9PSBNUEVHXzEpCi0gICAgewotICAgICAgICBpZiAoc3RlcmVvID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAxNCwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKLSAgICAgICAgICAgIHNpLT5tYWluX2RhdGFfYmVnaW4gPSAodG1wIDw8IDE4KSA+PiAyMzsgICAgLyogOSAqLwotICAgICAgICAgICAgc2ktPnByaXZhdGVfYml0cyAgICA9ICh0bXAgPDwgMjcpID4+IDI3OyAgICAvKiA1ICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMTIsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7Ci0gICAgICAgICAgICBzaS0+bWFpbl9kYXRhX2JlZ2luID0gKHRtcCA8PCAyMCkgPj4gMjM7ICAgIC8qIDkgKi8KLSAgICAgICAgICAgIHNpLT5wcml2YXRlX2JpdHMgICAgPSAodG1wIDw8IDI5KSA+PiAyOTsgICAgLyogMyAqLwotCi0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW87IGNoKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCA0LCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwotICAgICAgICAgICAgc2ktPmNoW2NoXS5zY2ZzaVswXSA9ICh0bXAgPDwgMjgpID4+IDMxOyAgICAvKiAxICovCi0gICAgICAgICAgICBzaS0+Y2hbY2hdLnNjZnNpWzFdID0gKHRtcCA8PCAyOSkgPj4gMzE7ICAgIC8qIDEgKi8KLSAgICAgICAgICAgIHNpLT5jaFtjaF0uc2Nmc2lbMl0gPSAodG1wIDw8IDMwKSA+PiAzMTsgICAgLyogMSAqLwotICAgICAgICAgICAgc2ktPmNoW2NoXS5zY2ZzaVszXSA9ICB0bXAgJiAxOyAgICAgICAgIC8qIDEgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IDIgOyBncisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW87IGNoKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5wYXJ0Ml8zX2xlbmd0aCAgICA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAxMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMjIsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLmJpZ192YWx1ZXMgICAgICAgICAgICA9ICh0bXAgPDwgMTApID4+IDIzOyAgIC8qIDkgKi8KLSAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLmdsb2JhbF9nYWluICAgICAgICA9IChpbnQzMikoKHRtcCA8PCAxOSkgPj4gMjQpIC0gMjEwOyAvKiA4ICovCi0gICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5zY2FsZWZhY19jb21wcmVzcyAgICAgPSAodG1wIDw8IDI3KSA+PiAyODsgICAvKiA0ICovCi0gICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS53aW5kb3dfc3dpdGNoaW5nX2ZsYWcgPSB0bXAgJiAxOyAgICAgICAgIC8qIDEgKi8KLQotICAgICAgICAgICAgICAgIGlmIChzaS0+Y2hbY2hdLmdyYW5bZ3JdLndpbmRvd19zd2l0Y2hpbmdfZmxhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLmJsb2NrX3R5cGUgICAgICAgPSAodG1wIDw8IDEwKSA+PiAzMDsgICAvKiAyICovOwotICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLm1peGVkX2Jsb2NrX2ZsYWcgPSAodG1wIDw8IDEyKSA+PiAzMTsgICAvKiAxICovOwotCi0gICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0udGFibGVfc2VsZWN0WzBdICA9ICh0bXAgPDwgMTMpID4+IDI3OyAgIC8qIDUgKi87Ci0gICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0udGFibGVfc2VsZWN0WzFdICA9ICh0bXAgPDwgMTgpID4+IDI3OyAgIC8qIDUgKi87Ci0KLSAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5zdWJibG9ja19nYWluWzBdID0gKHRtcCA8PCAyMykgPj4gMjk7ICAgLyogMyAqLzsKLSAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5zdWJibG9ja19nYWluWzFdID0gKHRtcCA8PCAyNikgPj4gMjk7ICAgLyogMyAqLzsKLSAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5zdWJibG9ja19nYWluWzJdID0gKHRtcCA8PCAyOSkgPj4gMjk7ICAgLyogMyAqLzsKLQotICAgICAgICAgICAgICAgICAgICAvKiBTZXQgcmVnaW9uX2NvdW50IHBhcmFtZXRlcnMgc2luY2UgdGhleSBhcmUgaW1wbGljaXQgaW4gdGhpcyBjYXNlLiAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaS0+Y2hbY2hdLmdyYW5bZ3JdLmJsb2NrX3R5cGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKFNJREVfSU5GT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHNpLT5jaFtjaF0uZ3Jhbltncl0uYmxvY2tfdHlwZSAgICAgICA9PSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc2ktPmNoW2NoXS5ncmFuW2dyXS5taXhlZF9ibG9ja19mbGFnID09IDApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnJlZ2lvbjBfY291bnQgPSA4OyAvKiBNSSA5OyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5yZWdpb24xX2NvdW50ID0gMTI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnJlZ2lvbjBfY291bnQgPSA3OyAvKiBNSSA4OyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5yZWdpb24xX2NvdW50ID0gMTM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDIyLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwotCi0gICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0udGFibGVfc2VsZWN0WzBdID0gKHRtcCA8PCAxMCkgPj4gMjc7ICAgLyogNSAqLzsKLSAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS50YWJsZV9zZWxlY3RbMV0gPSAodG1wIDw8IDE1KSA+PiAyNzsgICAvKiA1ICovOwotICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnRhYmxlX3NlbGVjdFsyXSA9ICh0bXAgPDwgMjApID4+IDI3OyAgIC8qIDUgKi87Ci0KLSAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5yZWdpb24wX2NvdW50ICAgPSAodG1wIDw8IDI1KSA+PiAyODsgICAvKiA0ICovOwotICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnJlZ2lvbjFfY291bnQgICA9ICh0bXAgPDwgMjkpID4+IDI5OyAgIC8qIDMgKi87Ci0KLSAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5ibG9ja190eXBlICAgICAgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAzLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwotICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0ucHJlZmxhZyAgICAgICAgICAgID0gKHRtcCA8PCAyOSkgPj4gMzE7ICAgIC8qIDEgKi8KLSAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnNjYWxlZmFjX3NjYWxlICAgICA9ICh0bXAgPDwgMzApID4+IDMxOyAgICAvKiAxICovCi0gICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5jb3VudDF0YWJsZV9zZWxlY3QgPSAgdG1wICYgMTsgICAgICAgICAvKiAxICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKiBMYXllciAzIExTRiAqLwotICAgIHsKLSAgICAgICAgc2ktPm1haW5fZGF0YV9iZWdpbiA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAgICAgIDgsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7Ci0gICAgICAgIHNpLT5wcml2YXRlX2JpdHMgICAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgc3RlcmVvLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwotCi0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHN0ZXJlbzsgY2grKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDIxLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwotICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnBhcnQyXzNfbGVuZ3RoICAgID0gKHRtcCA8PCAxMSkgPj4gMjA7ICAvKiAxMiAqLwotICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLmJpZ192YWx1ZXMgICAgICAgID0gKHRtcCA8PCAyMykgPj4gMjM7ICAvKiAgOSAqLwotCi0gICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMTgsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7Ci0gICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uZ2xvYmFsX2dhaW4gICAgICAgICAgID0gKCh0bXAgPDwgMTQpID4+IDI0KSAtIDIxMDsgICAvKiA4ICovCi0gICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uc2NhbGVmYWNfY29tcHJlc3MgICAgID0gKHRtcCA8PCAyMikgPj4gMjM7ICAgLyogOSAqLwotICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLndpbmRvd19zd2l0Y2hpbmdfZmxhZyA9IHRtcCAmIDE7ICAgICAgICAgLyogMSAqLwotCi0gICAgICAgICAgICBpZiAoc2ktPmNoW2NoXS5ncmFuWzBdLndpbmRvd19zd2l0Y2hpbmdfZmxhZykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKLQotICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5ibG9ja190eXBlICAgICAgID0gKHRtcCA8PCAxMCkgPj4gMzA7ICAgLyogMiAqLzsKLSAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0ubWl4ZWRfYmxvY2tfZmxhZyA9ICh0bXAgPDwgMTIpID4+IDMxOyAgIC8qIDEgKi87Ci0KLSAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0udGFibGVfc2VsZWN0WzBdICA9ICh0bXAgPDwgMTMpID4+IDI3OyAgIC8qIDUgKi87Ci0gICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnRhYmxlX3NlbGVjdFsxXSAgPSAodG1wIDw8IDE4KSA+PiAyNzsgICAvKiA1ICovOwotCi0gICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnN1YmJsb2NrX2dhaW5bMF0gPSAodG1wIDw8IDIzKSA+PiAyOTsgICAvKiAzICovOwotICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5zdWJibG9ja19nYWluWzFdID0gKHRtcCA8PCAyNikgPj4gMjk7ICAgLyogMyAqLzsKLSAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uc3ViYmxvY2tfZ2FpblsyXSA9ICh0bXAgPDwgMjkpID4+IDI5OyAgIC8qIDMgKi87Ci0KLSAgICAgICAgICAgICAgICAvKiBTZXQgcmVnaW9uX2NvdW50IHBhcmFtZXRlcnMgc2luY2UgdGhleSBhcmUgaW1wbGljaXQgaW4gdGhpcyBjYXNlLiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKHNpLT5jaFtjaF0uZ3JhblswXS5ibG9ja190eXBlID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4oU0lERV9JTkZPX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKHNpLT5jaFtjaF0uZ3JhblswXS5ibG9ja190eXBlICAgICAgID09IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNpLT5jaFtjaF0uZ3JhblswXS5taXhlZF9ibG9ja19mbGFnID09IDApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnJlZ2lvbjBfY291bnQgPSA4OyAvKiBNSSA5OyAqLwotICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0ucmVnaW9uMV9jb3VudCA9IDEyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0ucmVnaW9uMF9jb3VudCA9IDc7IC8qIE1JIDg7ICovCi0gICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5yZWdpb24xX2NvdW50ID0gMTM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKLQotICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS50YWJsZV9zZWxlY3RbMF0gPSAodG1wIDw8IDEwKSA+PiAyNzsgICAvKiA1ICovOwotICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS50YWJsZV9zZWxlY3RbMV0gPSAodG1wIDw8IDE1KSA+PiAyNzsgICAvKiA1ICovOwotICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS50YWJsZV9zZWxlY3RbMl0gPSAodG1wIDw8IDIwKSA+PiAyNzsgICAvKiA1ICovOwotCi0gICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnJlZ2lvbjBfY291bnQgICA9ICh0bXAgPDwgMjUpID4+IDI4OyAgIC8qIDQgKi87Ci0gICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnJlZ2lvbjFfY291bnQgICA9ICh0bXAgPDwgMjkpID4+IDI5OyAgIC8qIDMgKi87Ci0KLSAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uYmxvY2tfdHlwZSAgICAgID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDIsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7Ci0gICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uc2NhbGVmYWNfc2NhbGUgICAgID0gIHRtcCA+PiAxOyAgLyogMSAqLwotICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLmNvdW50MXRhYmxlX3NlbGVjdCA9ICB0bXAgJiAxOyAgLyogMSAqLwotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChOT19ERUNPRElOR19FUlJPUik7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjc5NTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgUGFja2V0VmlkZW8gQ29ycC4KLSAgIE1QMyBEZWNvZGVyIExpYnJhcnkKLQotICAgRmlsZW5hbWU6IHB2bXAzX2dldGJpdHMuY3BwCi0KLQotICAgICBEYXRlOiAwOS8yMS8yMDA3Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFVklTSU9OIEhJU1RPUlkKLQotCi0gRGVzY3JpcHRpb246Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLQotICAgIHRtcDNCaXRzICppbnB1dFN0cmVhbSwgICAgIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBpbnB1dCBzdHJlYW0gcGFyYW1ldGVycwotICAgIGludDMyICAgICBuZWVkZWRCaXRzICAgICAgIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZnJvbSB0aGUgYml0IHN0cmVhbQotCi0gT3V0cHV0czoKLQotICAgIHdvcmQgcGFyc2VkIGZyb20gdGVoIGJpdHN0cmVhbSwgd2l0aCBzaXplIG5lZWRlZEJpdHMtYml0cywKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0gWzFdIElTTyBNUEVHIEF1ZGlvIFN1Ymdyb3VwIFNvZnR3YXJlIFNpbXVsYXRpb24gR3JvdXAgKDE5OTYpCi0gICAgIElTTyAxMzgxOC0zIE1QRUctMiBBdWRpbyBEZWNvZGVyIC0gTG93ZXIgU2FtcGxpbmcgRnJlcXVlbmN5IEV4dGVuc2lvbgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJwdm1wM19nZXRiaXRzLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXVpbnQzMiBnZXROYml0cyh0bXAzQml0cyAqcHRCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgaW50MzIgbmVlZGVkQml0cykgLyogbnVtYmVyIG9mIGJpdHMgdG8gcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0gKHVwIHRvIDI1KSAqLwotewotCi0gICAgdWludDMyICAgIG9mZnNldDsKLSAgICB1aW50MzIgICAgYml0SW5kZXg7Ci0gICAgdWludDggICAgIEVsZW07ICAgICAgICAgLyogTmVlZHMgdG8gYmUgc2FtZSB0eXBlIGFzIHBJbnB1dC0+cEJ1ZmZlciAqLwotICAgIHVpbnQ4ICAgICBFbGVtMTsKLSAgICB1aW50OCAgICAgRWxlbTI7Ci0gICAgdWludDggICAgIEVsZW0zOwotICAgIHVpbnQzMiAgIHJldHVyblZhbHVlID0gMDsKLQotICAgIGlmICghbmVlZGVkQml0cykKLSAgICB7Ci0gICAgICAgIHJldHVybiAocmV0dXJuVmFsdWUpOwotICAgIH0KLQotICAgIG9mZnNldCA9IChwdEJpdFN0cmVhbS0+dXNlZEJpdHMpID4+IElOQlVGX0FSUkFZX0lOREVYX1NISUZUOwotCi0gICAgRWxlbSAgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCAgLCBCVUZTSVpFKSk7Ci0gICAgRWxlbTEgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCArIDEsIEJVRlNJWkUpKTsKLSAgICBFbGVtMiA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICsgMiwgQlVGU0laRSkpOwotICAgIEVsZW0zID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAzLCBCVUZTSVpFKSk7Ci0KLQotICAgIHJldHVyblZhbHVlID0gKCgodWludDMyKShFbGVtKSkgPDwgMjQpIHwKLSAgICAgICAgICAgICAgICAgICgoKHVpbnQzMikoRWxlbTEpKSA8PCAxNikgfAotICAgICAgICAgICAgICAgICAgKCgodWludDMyKShFbGVtMikpIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICgodWludDMyKShFbGVtMykpOwotCi0gICAgLyogUmVtb3ZlIGV4dHJhIGhpZ2ggYml0cyBieSBzaGlmdGluZyB1cCAqLwotICAgIGJpdEluZGV4ID0gbW9kdWxlKHB0Qml0U3RyZWFtLT51c2VkQml0cywgSU5CVUZfQklUX1dJRFRIKTsKLQotICAgIC8qIFRoaXMgbGluZSBpcyBmYXN0ZXIgdGhhbiB0byBtYXNrIG9mZiB0aGUgaGlnaCBiaXRzLiAqLwotICAgIHJldHVyblZhbHVlIDw8PSBiaXRJbmRleDsKLQotICAgIC8qIE1vdmUgdGhlIGZpZWxkIGRvd24uICovCi0gICAgcmV0dXJuVmFsdWUgPj49ICgzMiAtIG5lZWRlZEJpdHMpOwotCi0gICAgcHRCaXRTdHJlYW0tPnVzZWRCaXRzICs9IG5lZWRlZEJpdHM7Ci0KLSAgICByZXR1cm4gKHJldHVyblZhbHVlKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11aW50MTYgZ2V0VXBUbzliaXRzKHRtcDNCaXRzICpwdEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzIgbmVlZGVkQml0cykgLyogbnVtYmVyIG9mIGJpdHMgdG8gcmVhZCBmcm9tIHRoZSBiaXQgc3RyZWFtIDIgdG8gOSAqLwotewotCi0gICAgdWludDMyICAgIG9mZnNldDsKLSAgICB1aW50MzIgICAgYml0SW5kZXg7Ci0gICAgdWludDggICAgRWxlbTsgICAgICAgICAvKiBOZWVkcyB0byBiZSBzYW1lIHR5cGUgYXMgcElucHV0LT5wQnVmZmVyICovCi0gICAgdWludDggICAgRWxlbTE7Ci0gICAgdWludDE2ICAgcmV0dXJuVmFsdWU7Ci0KLSAgICBvZmZzZXQgPSAocHRCaXRTdHJlYW0tPnVzZWRCaXRzKSA+PiBJTkJVRl9BUlJBWV9JTkRFWF9TSElGVDsKLQotICAgIEVsZW0gID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgICwgQlVGU0laRSkpOwotICAgIEVsZW0xID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAxLCBCVUZTSVpFKSk7Ci0KLQotICAgIHJldHVyblZhbHVlID0gKCgodWludDE2KShFbGVtKSkgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgKCh1aW50MTYpKEVsZW0xKSk7Ci0KLSAgICAvKiBSZW1vdmUgZXh0cmEgaGlnaCBiaXRzIGJ5IHNoaWZ0aW5nIHVwICovCi0gICAgYml0SW5kZXggPSBtb2R1bGUocHRCaXRTdHJlYW0tPnVzZWRCaXRzLCBJTkJVRl9CSVRfV0lEVEgpOwotCi0gICAgcHRCaXRTdHJlYW0tPnVzZWRCaXRzICs9IG5lZWRlZEJpdHM7Ci0gICAgLyogVGhpcyBsaW5lIGlzIGZhc3RlciB0aGFuIHRvIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuICovCi0gICAgcmV0dXJuVmFsdWUgPSAocmV0dXJuVmFsdWUgPDwgKGJpdEluZGV4KSk7Ci0KLSAgICAvKiBNb3ZlIHRoZSBmaWVsZCBkb3duLiAqLwotCi0gICAgcmV0dXJuICh1aW50MTYpKHJldHVyblZhbHVlID4+ICgxNiAtIG5lZWRlZEJpdHMpKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXVpbnQzMiBnZXRVcFRvMTdiaXRzKHRtcDNCaXRzICpwdEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyIG5lZWRlZEJpdHMpIC8qIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZnJvbSB0aGUgYml0IHN0cmVhbSAyIHRvIDggKi8KLXsKLQotICAgIHVpbnQzMiAgICBvZmZzZXQ7Ci0gICAgdWludDMyICAgIGJpdEluZGV4OwotICAgIHVpbnQ4ICAgICBFbGVtOyAgICAgICAgIC8qIE5lZWRzIHRvIGJlIHNhbWUgdHlwZSBhcyBwSW5wdXQtPnBCdWZmZXIgKi8KLSAgICB1aW50OCAgICAgRWxlbTE7Ci0gICAgdWludDggICAgIEVsZW0yOwotICAgIHVpbnQzMiAgIHJldHVyblZhbHVlOwotCi0gICAgb2Zmc2V0ID0gKHB0Qml0U3RyZWFtLT51c2VkQml0cykgPj4gSU5CVUZfQVJSQVlfSU5ERVhfU0hJRlQ7Ci0KLSAgICBFbGVtICA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICAsIEJVRlNJWkUpKTsKLSAgICBFbGVtMSA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICsgMSwgQlVGU0laRSkpOwotICAgIEVsZW0yID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAyLCBCVUZTSVpFKSk7Ci0KLQotICAgIHJldHVyblZhbHVlID0gKCgodWludDMyKShFbGVtKSkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICgoKHVpbnQzMikoRWxlbTEpKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAoKHVpbnQzMikoRWxlbTIpKTsKLQotICAgIC8qIFJlbW92ZSBleHRyYSBoaWdoIGJpdHMgYnkgc2hpZnRpbmcgdXAgKi8KLSAgICBiaXRJbmRleCA9IG1vZHVsZShwdEJpdFN0cmVhbS0+dXNlZEJpdHMsIElOQlVGX0JJVF9XSURUSCk7Ci0KLSAgICBwdEJpdFN0cmVhbS0+dXNlZEJpdHMgKz0gbmVlZGVkQml0czsKLSAgICAvKiBUaGlzIGxpbmUgaXMgZmFzdGVyIHRoYW4gdG8gbWFzayBvZmYgdGhlIGhpZ2ggYml0cy4gKi8KLSAgICByZXR1cm5WYWx1ZSA9IDB4RkZGRkZGICYgKHJldHVyblZhbHVlIDw8IChiaXRJbmRleCkpOwotCi0gICAgLyogTW92ZSB0aGUgZmllbGQgZG93bi4gKi8KLQotICAgIHJldHVybiAodWludDMyKShyZXR1cm5WYWx1ZSA+PiAoMjQgLSBuZWVkZWRCaXRzKSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11aW50OCBnZXQxYml0KHRtcDNCaXRzICpwdEJpdFN0cmVhbSkgIC8qIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZnJvbSB0aGUgYml0IHN0cmVhbSAqLwotewotCi0gICAgdWludDMyICAgIG9mZnNldDsKLSAgICB1aW50MzIgICAgYml0SW5kZXg7Ci0gICAgdWludDggICByZXR1cm5WYWx1ZTsKLQotICAgIG9mZnNldCA9IChwdEJpdFN0cmVhbS0+dXNlZEJpdHMpID4+IElOQlVGX0FSUkFZX0lOREVYX1NISUZUOwotCi0gICAgcmV0dXJuVmFsdWUgID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgICwgQlVGU0laRSkpOwotCi0gICAgLyogUmVtb3ZlIGV4dHJhIGhpZ2ggYml0cyBieSBzaGlmdGluZyB1cCAqLwotICAgIGJpdEluZGV4ID0gbW9kdWxlKHB0Qml0U3RyZWFtLT51c2VkQml0cywgSU5CVUZfQklUX1dJRFRIKTsKLSAgICBwdEJpdFN0cmVhbS0+dXNlZEJpdHMrKzsKLQotICAgIC8qIFRoaXMgbGluZSBpcyBmYXN0ZXIgdGhhbiB0byBtYXNrIG9mZiB0aGUgaGlnaCBiaXRzLiAqLwotICAgIHJldHVyblZhbHVlID0gKHJldHVyblZhbHVlIDw8IChiaXRJbmRleCkpOwotCi0gICAgcmV0dXJuICh1aW50OCkocmV0dXJuVmFsdWUgPj4gNyk7Ci0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDU4YjAwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgUGFja2V0VmlkZW8gQ29ycC4KLSAgIE1QMyBEZWNvZGVyIExpYnJhcnkKLQotICAgRmlsZW5hbWU6IHB2bXAzX2dldGJpdHMuaAotCi0gICAgIERhdGU6IDA5LzIxLzIwMDcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVWSVNJT04gSElTVE9SWQotCi0gRGVzY3JpcHRpb246Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOQ0xVREUgREVTQ1JJUFRJT04KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDT05USU5VRSBPTkxZIElGIE5PVCBBTFJFQURZIERFRklORUQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBQVk1QM19HRVRCSVRTX0gKLSNkZWZpbmUgUFZNUDNfR0VUQklUU19ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAicHZtcDNfZGVjX2RlZnMuaCIKLSNpbmNsdWRlICJzX21wM2JpdHMuaCIKLSNpbmNsdWRlICJwdm1wM19hdWRpb190eXBlX2RlZnMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgSU5CVUZfQVJSQVlfSU5ERVhfU0hJRlQgICgzKQotI2RlZmluZSBJTkJVRl9CSVRfV0lEVEggICAgICAgICAoMTw8KElOQlVGX0FSUkFZX0lOREVYX1NISUZUKSkKLSNkZWZpbmUgSU5CVUZfQklUX01PRFVMT19NQVNLICAgKChJTkJVRl9CSVRfV0lEVEgpLTEpCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIFZBUklBQkxFUyBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNJTVBMRSBUWVBFREVGJ1MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRU5VTUVSQVRFRCBUWVBFREVGJ1MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU1RSVUNUVVJFUyBUWVBFREVGJ1MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotICAgIHVpbnQzMiBnZXROYml0cyh0bXAzQml0cyAqcE1haW5EYXRhLAotICAgIGludDMyIG5lZWRlZEJpdHMpOwotCi0gICAgdWludDE2IGdldFVwVG85Yml0cyh0bXAzQml0cyAqcE1haW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgbmVlZGVkQml0cyk7Ci0KLSAgICB1aW50MzIgZ2V0VXBUbzE3Yml0cyh0bXAzQml0cyAqcE1haW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIG5lZWRlZEJpdHMpOwotCi0gICAgdWludDggZ2V0MWJpdCh0bXAzQml0cyAqcE1haW5EYXRhKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEdMT0JBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRU5ECi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjhiMTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIk1wM0RlY29kZXJUZXN0IiwKLSAgICBndGVzdDogdHJ1ZSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIm1wM3JlYWRlci5jcHAiLAotICAgICAgICAiTXAzRGVjb2RlclRlc3QuY3BwIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wM2RlYyIsCi0gICAgICAgICJsaWJzbmRmaWxlIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzM2Y5YmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNcDMgRGVjb2RlciB1bml0IHRlc3QiPgotICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNcDNEZWNvZGVyVGVzdCIgLz4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNcDNEZWNvZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC0xLjEuemlwP3VuemlwPXRydWUiCi0gICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLQotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdFJlcy8iIC8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODRjMGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNcDNEZWNvZGVyVGVzdCIKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJtcDNyZWFkZXIuaCIKLSNpbmNsdWRlICJwdm1wM2RlY29kZXJfYXBpLmgiCi0KLSNpbmNsdWRlICJNcDNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgiCi0KLSNkZWZpbmUgT1VUUFVUX0ZJTEUgIi9kYXRhL2xvY2FsL3RtcC9tcDNEZWNvZGUub3V0IgotCi1jb25zdGV4cHIgaW50MzJfdCBrSW5wdXRCdWZmZXJTaXplID0gMTAyNCAqIDEwOwotY29uc3RleHByIGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSA0NjA4ICogMjsKLWNvbnN0ZXhwciBpbnQzMl90IGtNYXhDb3VudCA9IDEwOwotY29uc3RleHByIGludDMyX3Qga051bUZyYW1lUmVzZXQgPSAxNTA7Ci0KLXN0YXRpYyBNcDNEZWNvZGVyVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKLQotY2xhc3MgTXAzRGVjb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0cmluZz4gewotICBwdWJsaWM6Ci0gICAgTXAzRGVjb2RlclRlc3QoKSA6IG1Db25maWcobnVsbHB0cikge30KLQotICAgIH5NcDNEZWNvZGVyVGVzdCgpIHsKLSAgICAgICAgaWYgKG1Db25maWcpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtQ29uZmlnOwotICAgICAgICAgICAgbUNvbmZpZyA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgICAgIG1Db25maWcgPSBuZXcgdFBWTVAzRGVjb2RlckV4dGVybmFse307Ci0gICAgICAgIEFTU0VSVF9ORShtQ29uZmlnLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlnLiBObyBNZW1vcnkgYXZhaWxhYmxlIjsKLSAgICAgICAgbUNvbmZpZy0+ZXF1YWxpemVyVHlwZSA9IGZsYXQ7Ci0gICAgICAgIG1Db25maWctPmNyY0VuYWJsZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwgKm1Db25maWc7Ci0gICAgTXAzUmVhZGVyIG1NcDNSZWFkZXI7Ci0KLSAgICBFUlJPUl9DT0RFIERlY29kZUZyYW1lcyh2b2lkICpkZWNvZGVyYnVmLCBTTkRGSUxFICpvdXRGaWxlSGFuZGxlLCBTRl9JTkZPIHNmSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lQ291bnQgPSBJTlQzMl9NQVgpOwotICAgIFNOREZJTEUgKm9wZW5PdXRwdXRGaWxlKFNGX0lORk8gKnNmSW5mbyk7Ci19OwotCi1FUlJPUl9DT0RFIE1wM0RlY29kZXJUZXN0OjpEZWNvZGVGcmFtZXModm9pZCAqZGVjb2RlckJ1ZiwgU05ERklMRSAqb3V0RmlsZUhhbmRsZSwgU0ZfSU5GTyBzZkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZUNvdW50KSB7Ci0gICAgdWludDhfdCBpbnB1dEJ1ZltrSW5wdXRCdWZmZXJTaXplXTsKLSAgICBpbnQxNl90IG91dHB1dEJ1ZltrT3V0cHV0QnVmZmVyU2l6ZV07Ci0gICAgdWludDMyX3QgYnl0ZXNSZWFkOwotICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKLSAgICB3aGlsZSAoZnJhbWVDb3VudCA+IDApIHsKLSAgICAgICAgYm9vbCBzdWNjZXNzID0gbU1wM1JlYWRlci5nZXRGcmFtZShpbnB1dEJ1ZiwgJmJ5dGVzUmVhZCk7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gYnl0ZXNSZWFkOwotICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7Ci0gICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7Ci0gICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9IGlucHV0QnVmOwotICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyID0gb3V0cHV0QnVmOwotICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSBrT3V0cHV0QnVmZmVyU2l6ZSAvIHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBkZWNvZGVyQnVmKTsKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gTk9fREVDT0RJTkdfRVJST1IpIGJyZWFrOwotICAgICAgICBzZl93cml0ZWZfc2hvcnQob3V0RmlsZUhhbmRsZSwgb3V0cHV0QnVmLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgLyBzZkluZm8uY2hhbm5lbHMpOwotICAgICAgICBmcmFtZUNvdW50LS07Ci0gICAgfQotICAgIHJldHVybiBkZWNvZGVyRXJyOwotfQotCi1TTkRGSUxFICpNcDNEZWNvZGVyVGVzdDo6b3Blbk91dHB1dEZpbGUoU0ZfSU5GTyAqc2ZJbmZvKSB7Ci0gICAgbWVtc2V0KHNmSW5mbywgMCwgc2l6ZW9mKFNGX0lORk8pKTsKLSAgICBzZkluZm8tPmNoYW5uZWxzID0gbU1wM1JlYWRlci5nZXROdW1DaGFubmVscygpOwotICAgIHNmSW5mby0+Zm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IFNGX0ZPUk1BVF9QQ01fMTY7Ci0gICAgc2ZJbmZvLT5zYW1wbGVyYXRlID0gbU1wM1JlYWRlci5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgU05ERklMRSAqb3V0RmlsZUhhbmRsZSA9IHNmX29wZW4oT1VUUFVUX0ZJTEUsIFNGTV9XUklURSwgc2ZJbmZvKTsKLSAgICByZXR1cm4gb3V0RmlsZUhhbmRsZTsKLX0KLQotVEVTVF9GKE1wM0RlY29kZXJUZXN0LCBNdWx0aUNyZWF0ZU1wM0RlY29kZXJUZXN0KSB7Ci0gICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKLSAgICBBU1NFUlRfTkUobWVtUmVxdWlyZW1lbnRzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50IHNpemUiOwotICAgIHZvaWQgKmRlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKLSAgICBBU1NFUlRfTkUoZGVjb2RlckJ1ZiwgbnVsbHB0cikKLSAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGVjb2RlciBtZW1vcnkgb2Ygc2l6ZSAiIDw8IG1lbVJlcXVpcmVtZW50czsKLSAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7Ci0gICAgICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIGRlY29kZXJCdWYpOwotICAgICAgICBBTE9HVigiRGVjb2RlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseSIpOwotICAgIH0KLSAgICBpZiAoZGVjb2RlckJ1ZikgewotICAgICAgICBmcmVlKGRlY29kZXJCdWYpOwotICAgICAgICBkZWNvZGVyQnVmID0gbnVsbHB0cjsKLSAgICB9Ci19Ci0KLVRFU1RfUChNcDNEZWNvZGVyVGVzdCwgRGVjb2RlVGVzdCkgewotICAgIHNpemVfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7Ci0gICAgQVNTRVJUX05FKG1lbVJlcXVpcmVtZW50cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudCBzaXplIjsKLSAgICB2b2lkICpkZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7Ci0gICAgQVNTRVJUX05FKGRlY29kZXJCdWYsIG51bGxwdHIpCi0gICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29kZXIgbWVtb3J5IG9mIHNpemUgIiA8PCBtZW1SZXF1aXJlbWVudHM7Ci0KLSAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBkZWNvZGVyQnVmKTsKLSAgICBBTE9HVigiRGVjb2RlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseSIpOwotICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCk7Ci0gICAgYm9vbCBzdGF0dXMgPSBtTXAzUmVhZGVyLmluaXQoaW5wdXRGaWxlLmNfc3RyKCkpOwotICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBtcDNSZWFkZXIiOwotCi0gICAgLy8gT3BlbiB0aGUgb3V0cHV0IGZpbGUuCi0gICAgU0ZfSU5GTyBzZkluZm87Ci0gICAgU05ERklMRSAqb3V0RmlsZUhhbmRsZSA9IG9wZW5PdXRwdXRGaWxlKCZzZkluZm8pOwotICAgIEFTU0VSVF9ORShvdXRGaWxlSGFuZGxlLCBudWxscHRyKSA8PCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZyBkZWNvZGVkIG91dHB1dCI7Ci0KLSAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoZGVjb2RlckJ1Ziwgb3V0RmlsZUhhbmRsZSwgc2ZJbmZvKTsKLSAgICBBU1NFUlRfRVEoZGVjb2RlckVyciwgTk9fREVDT0RJTkdfRVJST1IpIDw8ICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBmcmFtZXMiOwotICAgIEFTU0VSVF9FUShzZkluZm8uY2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscykgPDwgIk51bWJlciBvZiBjaGFubmVscyBkb2VzIG5vdCBtYXRjaCI7Ci0gICAgQVNTRVJUX0VRKHNmSW5mby5zYW1wbGVyYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpIDw8ICJTYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaCI7Ci0KLSAgICBtTXAzUmVhZGVyLmNsb3NlKCk7Ci0gICAgc2ZfY2xvc2Uob3V0RmlsZUhhbmRsZSk7Ci0gICAgaWYgKGRlY29kZXJCdWYpIHsKLSAgICAgICAgZnJlZShkZWNvZGVyQnVmKTsKLSAgICAgICAgZGVjb2RlckJ1ZiA9IG51bGxwdHI7Ci0gICAgfQotfQotCi1URVNUX1AoTXAzRGVjb2RlclRlc3QsIFJlc2V0RGVjb2RlclRlc3QpIHsKLSAgICBzaXplX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOwotICAgIEFTU0VSVF9ORShtZW1SZXF1aXJlbWVudHMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnQgc2l6ZSI7Ci0gICAgdm9pZCAqZGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOwotICAgIEFTU0VSVF9ORShkZWNvZGVyQnVmLCBudWxscHRyKQotICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvZGVyIG1lbW9yeSBvZiBzaXplICIgPDwgbWVtUmVxdWlyZW1lbnRzOwotCi0gICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgZGVjb2RlckJ1Zik7Ci0gICAgQUxPR1YoIkRlY29kZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0gICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKLSAgICBib29sIHN0YXR1cyA9IG1NcDNSZWFkZXIuaW5pdChpbnB1dEZpbGUuY19zdHIoKSk7Ci0gICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIG1wM1JlYWRlciI7Ci0KLSAgICAvLyBPcGVuIHRoZSBvdXRwdXQgZmlsZS4KLSAgICBTRl9JTkZPIHNmSW5mbzsKLSAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gb3Blbk91dHB1dEZpbGUoJnNmSW5mbyk7Ci0gICAgQVNTRVJUX05FKG91dEZpbGVIYW5kbGUsIG51bGxwdHIpIDw8ICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIGZvciB3cml0aW5nIGRlY29kZWQgb3V0cHV0IjsKLQotICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKLSAgICBkZWNvZGVyRXJyID0gRGVjb2RlRnJhbWVzKGRlY29kZXJCdWYsIG91dEZpbGVIYW5kbGUsIHNmSW5mbywga051bUZyYW1lUmVzZXQpOwotICAgIEFTU0VSVF9FUShkZWNvZGVyRXJyLCBOT19ERUNPRElOR19FUlJPUikgPDwgIkZhaWxlZCB0byBkZWNvZGUgdGhlIGZyYW1lcyI7Ci0gICAgQVNTRVJUX0VRKHNmSW5mby5jaGFubmVscywgbUNvbmZpZy0+bnVtX2NoYW5uZWxzKSA8PCAiTnVtYmVyIG9mIGNoYW5uZWxzIGRvZXMgbm90IG1hdGNoIjsKLSAgICBBU1NFUlRfRVEoc2ZJbmZvLnNhbXBsZXJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSkgPDwgIlNhbXBsZSByYXRlIGRvZXMgbm90IG1hdGNoIjsKLQotICAgIHB2bXAzX3Jlc2V0RGVjb2RlcihkZWNvZGVyQnVmKTsKLSAgICAvLyBEZWNvZGUgdGhlIHNhbWUgZmlsZS4KLSAgICBkZWNvZGVyRXJyID0gRGVjb2RlRnJhbWVzKGRlY29kZXJCdWYsIG91dEZpbGVIYW5kbGUsIHNmSW5mbyk7Ci0gICAgQVNTRVJUX0VRKGRlY29kZXJFcnIsIE5PX0RFQ09ESU5HX0VSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29kZSB0aGUgZnJhbWVzIjsKLSAgICBBU1NFUlRfRVEoc2ZJbmZvLmNoYW5uZWxzLCBtQ29uZmlnLT5udW1fY2hhbm5lbHMpIDw8ICJOdW1iZXIgb2YgY2hhbm5lbHMgZG9lcyBub3QgbWF0Y2giOwotICAgIEFTU0VSVF9FUShzZkluZm8uc2FtcGxlcmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKSA8PCAiU2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2giOwotCi0gICAgbU1wM1JlYWRlci5jbG9zZSgpOwotICAgIHNmX2Nsb3NlKG91dEZpbGVIYW5kbGUpOwotICAgIGlmIChkZWNvZGVyQnVmKSB7Ci0gICAgICAgIGZyZWUoZGVjb2RlckJ1Zik7Ci0gICAgICAgIGRlY29kZXJCdWYgPSBudWxscHRyOwotICAgIH0KLX0KLQotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1wM0RlY29kZXJUZXN0QWxsLCBNcDNEZWNvZGVyVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJ1Z18xMzYwNTM4ODUubXAzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIikpKTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgZ0VudiA9IG5ldyBNcDNEZWNvZGVyVGVzdEVudmlyb25tZW50KCk7Ci0gICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7Ci0gICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKLSAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IDRmNjFhYTguLjViYjE4NzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtNTgsNiArNTgsOCBAQAogICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCiAgICAgICBtRGVjb2RlcihOVUxMKSwKICAgICAgIG1IZWFkZXIoTlVMTCksCisgICAgICBtTnVtQ2hhbm5lbHMoMSksCisgICAgICBtU2FtcGxpbmdSYXRlKGtSYXRlKSwKICAgICAgIG1Db2RlY0RlbGF5KDApLAogICAgICAgbVNlZWtQcmVSb2xsKDApLAogICAgICAgbUFuY2hvclRpbWVVcygwKSwKQEAgLTE2OSwxMSArMTcxLDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5BdWRpb0JhbmRXaWR0aCA9IDA7Ci0gICAgICAgICAgICBvcHVzUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IGtSYXRlOworICAgICAgICAgICAgb3B1c1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU2FtcGxpbmdSYXRlOwogICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkJpdFJhdGUgPSAwOwogCiAgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5DaGFubmVscyA9IG1IZWFkZXItPmNoYW5uZWxzOwogICAgICAgICAgICAgfQpAQCAtMjc0LDcgKzI3Niw4IEBACiAgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gb3B1c1BhcmFtcy0+bkNoYW5uZWxzOworICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IG9wdXNQYXJhbXMtPm5TYW1wbGVSYXRlOwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIApAQCAtNDk2LDYgKzQ5OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaW5IZWFkZXItPnBCdWZmZXIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlKTsKKyAgICAgICAgICAgICAgICBtU2FtcGxpbmdSYXRlID0ga1JhdGU7CisgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gbUhlYWRlci0+Y2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKaW5kZXggOTFjYWZhMS4uMDAwNThjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKQEAgLTcwLDYgKzcwLDggQEAKICAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKICAgICBPcHVzSGVhZGVyICptSGVhZGVyOwogCisgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CisgICAgaW50MzJfdCBtU2FtcGxpbmdSYXRlOwogICAgIGludDY0X3QgbUNvZGVjRGVsYXk7CiAgICAgaW50NjRfdCBtU2Vla1ByZVJvbGw7CiAgICAgaW50NjRfdCBtU2FtcGxlc1RvRGlzY2FyZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCmluZGV4IDMyYjIwNzUuLmI2MzM1M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icApAQCAtMiw2ICsyLDcgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJGTEFDRGVjb2Rlci5jcHAiLApAQCAtMzMsNiArMzQsMTMgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IGNlZjBiYzYuLmY1ZTk1MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTQzMyw3ICs0MzMsNyBAQAogICAgICAgICAgICAgaWYgKG1CdWZmZXIgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIG1CdWZmZXJEYXRhU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlckxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImRlY29kZU9uZUZyYW1lOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dCBidWZmZXIiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRGF0YVRvQnVmZmVyOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dCBidWZmZXIiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUJ1ZmZlckxlbiA9IG1CdWZmZXJEYXRhU2l6ZSArIGluQnVmZmVyTGVuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKaW5kZXggOGE3YzNlYi4uMGE0ZTU5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgICAgfQogICAgICAgICBzLmFwcGVuZCgiXG4iKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHMuc3RyaW5nKCksIHMuc2l6ZSgpKTsKKyAgICAodm9pZCl3cml0ZShmZCwgcy5zdHJpbmcoKSwgcy5zaXplKCkpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKaW5kZXggNGJkMTg2Yy4uODcyMmUxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCkBAIC0zODcsMTAgKzM4NywxNCBAQAogICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwogCiAgICAgY2hhciAqYnVmZmVyOwotICAgIHZhc3ByaW50ZigmYnVmZmVyLCBmb3JtYXQsIGFwKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IHZhc3ByaW50ZigmYnVmZmVyLCBmb3JtYXQsIGFwKTsKIAogICAgIHZhX2VuZChhcCk7CiAKKyAgICBpZihidWZmZXJTaXplIDwgMCkgeworICAgICAgICByZXR1cm4gQVN0cmluZygpOworICAgIH0KKwogICAgIEFTdHJpbmcgcmVzdWx0KGJ1ZmZlcik7CiAKICAgICBmcmVlKGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggZjQ0MGUwMC4uZWJmMTAzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtMTIsNiArMTIsNyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCkBAIC0yNSw3ICsyNiw2IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCkBAIC04Niw2ICs4Niw5IEBACiAgICAgICAgICAgICAgICAgIi1ETk9fSU1FTU9SWSIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAorICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAogICAgIH0sCiAKICAgICBjbGFuZzogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAppbmRleCBhMDhmZWQxLi5jMjE2YmM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcgPSAiaW1hZ2UvanBlZyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMgPSAiaW1hZ2Uvdm5kLmFuZHJvaWQuaGVpYyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGID0gImltYWdlL2F2aWYiOwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDggPSAidmlkZW8veC12bmQub24yLnZwOCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDkgPSAidmlkZW8veC12bmQub24yLnZwOSI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vVEVTVF9NQVBQSU5HCmluZGV4IDMzMDFjNGIuLmE3MGMzNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vVEVTVF9NQVBQSU5HCkBAIC0xLDUgKzEsMTQgQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24KIHsKKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJPcHVzSGVhZGVyVGVzdCIgfQorICBdLAorCiAgICJwcmVzdWJtaXQiOiBbCi0gICAgeyAibmFtZSI6ICJzZl9mb3VuZGF0aW9uX3Rlc3QiIH0KKyAgICB7ICJuYW1lIjogInNmX2ZvdW5kYXRpb25fdGVzdCIgfSwKKyAgICB7ICJuYW1lIjogIk1ldGFEYXRhQmFzZVVuaXRUZXN0In0KICAgXQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuY3BwCmluZGV4IGY1M2QyYzkuLjlkNjg4N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5jcHAKQEAgLTU1OSwxMSArNTU5LDkgQEAKICAgICBDSEVDS19ORSh2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uLAogICAgICAgICAgICAgIDB4MjF1IC8qIEZpbmUgR3JhbnVsYXJpdHkgU2NhbGFibGUgKi8pOwogCi0gICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkIF9fdW51c2VkOwotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSBfX3VudXNlZDsKICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgewotICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgPSBici5nZXRCaXRzKDQpOwotICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgPSBici5nZXRCaXRzKDMpOworICAgICAgICBici5za2lwQml0cyg0KTsgLy92aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQKKyAgICAgICAgYnIuc2tpcEJpdHMoMyk7IC8vdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5CiAgICAgfQogICAgIHVuc2lnbmVkIGFzcGVjdF9yYXRpb19pbmZvID0gYnIuZ2V0Qml0cyg0KTsKICAgICBpZiAoYXNwZWN0X3JhdGlvX2luZm8gPT0gMHgwZiAvKiBleHRlbmRlZCBQQVIgKi8pIHsKQEAgLTYyMiw3ICs2MjAsNyBAQAogICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgPSBici5nZXRCaXRzKDEzKTsKICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKIAotICAgIHVuc2lnbmVkIGludGVybGFjZWQgX191bnVzZWQgPSBici5nZXRCaXRzKDEpOworICAgIGJyLnNraXBCaXRzKDEpOyAvLyBpbnRlcmxhY2VkCiAKICAgICAqd2lkdGggPSB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGg7CiAgICAgKmhlaWdodCA9IHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQ7CkBAIC02NjgsNyArNjY2LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHVuc2lnbmVkIHByb3RlY3Rpb24gX191bnVzZWQgPSAoaGVhZGVyID4+IDE2KSAmIDE7CisgICAgLy8gd2UgY2FuIGdldCBwcm90ZWN0aW9uIHZhbHVlIGZyb20gKGhlYWRlciA+PiAxNikgJiAxCiAKICAgICB1bnNpZ25lZCBiaXRyYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMikgJiAweDBmOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCmluZGV4IGFiMTdhMDIuLmU0Yjk5YmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCkBAIC0xNDgsNyArMTQ4LDggQEAKICAgICBzdGF0aWMgY2hhciAqR2V0RGVidWdOYW1lKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgaW5saW5lIHN0YXRpYyBib29sIGlzRXhwZXJpbWVudEVuYWJsZWQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lIF9fdW51c2VkIC8qIG5vbm51bGwgKi8sIGJvb2wgYWxsb3cgX191bnVzZWQgPSB0cnVlKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICBib29sIGFsbG93IF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gdHJ1ZSkgewogI2lmZGVmIEVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUwogICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAibGVnYWN5LWFkYXB0aXZlIikpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRFeHBlcmltZW50RmxhZyhhbGxvdywgbmFtZSwgMiwgMSk7IC8vIGV2ZXJ5IG90aGVyIGRheQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaAppbmRleCBhZjZiMzU3Li4zYjY0NmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaApAQCAtNjMsNyArNjMsNyBAQAogCiB0ZW1wbGF0ZTxjbGFzcyBUPgogdm9pZCBFTlNVUkVfVU5TSUdORURfVFlQRSgpIHsKLSAgICBUIFRZUEVfTVVTVF9CRV9VTlNJR05FRFsoVCktMSA8IDAgPyAtMSA6IDBdIF9fdW51c2VkOworICAgIFQgVFlQRV9NVVNUX0JFX1VOU0lHTkVEWyhUKS0xIDwgMCA/IC0xIDogMF0gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CiB9CiAKIC8vIG5lZWRsZSBpcyBpbiByYW5nZSBbaGF5U3RhcnQsIGhheVN0YXJ0ICsgaGF5U2l6ZSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKaW5kZXggMWY5ZTYzNi4uZTk2MjQzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUc7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0lNQUdFX0FWSUY7CiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDg7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOGE3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19BVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWM6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIEFWQ1V0aWxzVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IEFWQ1V0aWxzVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fQVZDX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1VuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2E4NTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1VuaXRUZXN0LmNwcApAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQVZDVXRpbHNVbml0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlICJtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaCIKKyNpbmNsdWRlICJtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oIgorCisjaW5jbHVkZSAiQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaCIKKworY29uc3RleHByIHNpemVfdCBrU21hbGxCdWZmZXJTaXplID0gMjsKK2NvbnN0ZXhwciB1aW50OF90IGtTUFNtYXNrID0gMHgxZjsKK2NvbnN0ZXhwciB1aW50OF90IGtTUFNTdGFydENvZGUgPSAweDA3OworY29uc3RleHByIHVpbnQ4X3Qga0NvbmZpZ1ZlcnNpb24gPSAweDAxOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIEFWQ1V0aWxzVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgTXBlZ0F1ZGlvVW5pdFRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qYXVkaW9IZWFkZXIqLyB1aW50MzJfdCwgLypmcmFtZVNpemUqLyBpbnQzMl90LCAvKnNhbXBsZVJhdGUqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAvKm51bUNoYW5uZWxzKi8gaW50MzJfdCwgLypiaXRSYXRlKi8gaW50MzJfdCwgLypudW1TYW1wbGVzKi8gaW50MzJfdD4+IHt9OworCitjbGFzcyBWT0xEaW1lbnNpb25UZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTwvKmZpbGVOYW1lKi8gc3RyaW5nLCAvKnZvbFdpZHRoKi8gaW50MzJfdCwgLyp2b2xIZWlnaHQqLyBpbnQzMl90Pj4ge307CisKK2NsYXNzIEFWQ1V0aWxzIHsKKyAgcHVibGljOgorICAgIGJvb2wgU2V0VXBBVkNVdGlscyhzdHJpbmcgZmlsZU5hbWUsIHN0cmluZyBpbmZvRmlsZU5hbWUpIHsKKyAgICAgICAgbUlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZmlsZU5hbWU7CisgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBpZiAoIW1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbUluZm9GaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBpbmZvRmlsZU5hbWU7CisgICAgICAgIG1JbmZvRmlsZVN0cmVhbS5vcGVuKG1JbmZvRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgaWYgKCFtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB+QVZDVXRpbHMoKSB7CisgICAgICAgIGlmIChtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgbUlucHV0RmlsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgbUluZm9GaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgfQorCisgICAgc3RyaW5nIG1JbnB1dEZpbGU7CisgICAgc3RyaW5nIG1JbmZvRmlsZTsKKworICAgIGlmc3RyZWFtIG1JbnB1dEZpbGVTdHJlYW07CisgICAgaWZzdHJlYW0gbUluZm9GaWxlU3RyZWFtOworfTsKKworY2xhc3MgQVZDRGltZW5zaW9uVGVzdAorICAgIDogcHVibGljIEFWQ1V0aWxzLAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LypmaWxlTmFtZSovIHN0cmluZywgLyppbmZvRmlsZU5hbWUqLyBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIC8qYXZjV2lkdGgqLyBzaXplX3QsIC8qYXZjSGVpZ2h0Ki8gc2l6ZV90LCAvKm51bWJlck9mTkFMVW5pdHMqLyBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHN0cmluZywgc2l6ZV90LCBzaXplX3QsIHNpemVfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGZpbGVOYW1lID0gZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIHN0cmluZyBpbmZvRmlsZU5hbWUgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgQVZDVXRpbHM6OlNldFVwQVZDVXRpbHMoZmlsZU5hbWUsIGluZm9GaWxlTmFtZSk7CisKKyAgICAgICAgbUZyYW1lV2lkdGggPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lSGVpZ2h0ID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgICAgIG1OYWxVbml0c0V4cGVjdGVkID0gZ2V0PDQ+KHBhcmFtcyk7CisgICAgfQorCisgICAgc2l6ZV90IG1GcmFtZVdpZHRoOworICAgIHNpemVfdCBtRnJhbWVIZWlnaHQ7CisgICAgaW50MzJfdCBtTmFsVW5pdHNFeHBlY3RlZDsKK307CisKK2NsYXNzIEF2Y2NCb3hUZXN0IDogcHVibGljIEFWQ0RpbWVuc2lvblRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBBVkNEaW1lbnNpb25UZXN0OjpTZXRVcCgpOyB9Cit9OworCitjbGFzcyBBVkNGcmFtZVRlc3QKKyAgICA6IHB1YmxpYyBBVkNVdGlscywKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjwvKmZpbGVOYW1lKi8gc3RyaW5nLCAvKmluZm9GaWxlTmFtZSovIHN0cmluZz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RyaW5nIGZpbGVOYW1lID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICAgICAgc3RyaW5nIGluZm9GaWxlTmFtZSA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgICAgICBBVkNVdGlsczo6U2V0VXBBVkNVdGlscyhmaWxlTmFtZSwgaW5mb0ZpbGVOYW1lKTsKKyAgICB9Cit9OworCitURVNUX1AoTXBlZ0F1ZGlvVW5pdFRlc3QsIEF1ZGlvUHJvZmlsZVRlc3QpIHsKKyAgICB0dXBsZTx1aW50MzJfdCwgc2l6ZV90LCBpbnQsIGludCwgaW50LCBpbnQ+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgdWludDMyX3QgaGVhZGVyID0gZ2V0PDA+KHBhcmFtcyk7CisKKyAgICBzaXplX3QgYXVkaW9GcmFtZVNpemUgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9TYW1wbGVSYXRlID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgaW50IGF1ZGlvTnVtQ2hhbm5lbHMgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9CaXRSYXRlID0gZ2V0PDQ+KHBhcmFtcyk7CisgICAgaW50IGF1ZGlvTnVtU2FtcGxlcyA9IGdldDw1PihwYXJhbXMpOworCisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7CisgICAgaW50IHNhbXBsZVJhdGUgPSAwOworICAgIGludCBudW1DaGFubmVscyA9IDA7CisgICAgaW50IGJpdFJhdGUgPSAwOworICAgIGludCBudW1TYW1wbGVzID0gMDsKKworICAgIGJvb2wgc3RhdHVzID0gR2V0TVBFR0F1ZGlvRnJhbWVTaXplKGhlYWRlciwgJmZyYW1lU2l6ZSwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bVNhbXBsZXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgQXVkaW8gcHJvcGVydGllcyI7CisKKyAgICBBU1NFUlRfRVEoZnJhbWVTaXplLCBhdWRpb0ZyYW1lU2l6ZSkgPDwgIldyb25nIGZyYW1lIHNpemUgZm91bmQiOworCisgICAgQVNTRVJUX0VRKHNhbXBsZVJhdGUsIGF1ZGlvU2FtcGxlUmF0ZSkgPDwgIldyb25nIHNhbXBsZSByYXRlIGZvdW5kIjsKKworICAgIEFTU0VSVF9FUShudW1DaGFubmVscywgYXVkaW9OdW1DaGFubmVscykgPDwgIldyb25nIG51bWJlciBvZiBjaGFubmVscyBmb3VuZCI7CisKKyAgICBBU1NFUlRfRVEoYml0UmF0ZSwgYXVkaW9CaXRSYXRlKSA8PCAiV3JvbmcgYml0IHJhdGUgZm91bmQiOworCisgICAgQVNTRVJUX0VRKG51bVNhbXBsZXMsIGF1ZGlvTnVtU2FtcGxlcykgPDwgIldyb25nIG51bWJlciBvZiBzYW1wbGVzIGZvdW5kIjsKK30KKworVEVTVF9QKFZPTERpbWVuc2lvblRlc3QsIERpbWVuc2lvblRlc3QpIHsKKyAgICB0dXBsZTxzdHJpbmcsIGludDMyX3QsIGludDMyX3Q+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgaWZzdHJlYW0gaW5wdXRGaWxlU3RyZWFtOworICAgIGlucHV0RmlsZVN0cmVhbS5vcGVuKGlucHV0RmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICBBU1NFUlRfVFJVRShpbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSA8PCAiRmFpbGVkIHRvIG9wZW46ICIgPDwgaW5wdXRGaWxlOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludDhfdCBlcnIgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICBBU1NFUlRfRVEoZXJyLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBBU1NFUlRfTkUoZmlsZVNpemUsIDApIDw8ICJJbnZhbGlkIGZpbGUgc2l6ZSBmb3VuZCI7CisKKyAgICBjb25zdCB1aW50OF90ICp2b2xCdWZmZXIgPSBuZXcgdWludDhfdFtmaWxlU2l6ZV07CisgICAgQVNTRVJUX05FKHZvbEJ1ZmZlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBWT0wgYnVmZmVyIG9mIHNpemU6ICIgPDwgZmlsZVNpemU7CisKKyAgICBpbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKSh2b2xCdWZmZXIpLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKGlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgZmlsZVNpemUpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBpbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICBpbnQzMl90IHdpZHRoID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgaW50MzJfdCBoZWlnaHQgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBpbnQzMl90IHZvbFdpZHRoID0gLTE7CisgICAgaW50MzJfdCB2b2xIZWlnaHQgPSAtMTsKKworICAgIGJvb2wgc3RhdHVzID0gRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKHZvbEJ1ZmZlciwgZmlsZVNpemUsICZ2b2xXaWR0aCwgJnZvbEhlaWdodCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgVk9MIGRpbWVuc2lvbnMgZnJvbSBmdW5jdGlvbjogRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKCkiOworCisgICAgQVNTRVJUX0VRKHZvbFdpZHRoLCB3aWR0aCkgPDwgIkV4cGVjdGVkIHdpZHRoOiAiIDw8IHdpZHRoIDw8ICJGb3VuZDogIiA8PCB2b2xXaWR0aDsKKworICAgIEFTU0VSVF9FUSh2b2xIZWlnaHQsIGhlaWdodCkgPDwgIkV4cGVjdGVkIGhlaWdodDogIiA8PCBoZWlnaHQgPDwgIkZvdW5kOiAiIDw8IHZvbEhlaWdodDsKKworICAgIGRlbGV0ZVtdIHZvbEJ1ZmZlcjsKK30KKworVEVTVF9QKEFWQ0RpbWVuc2lvblRlc3QsIERpbWVuc2lvblRlc3QpIHsKKyAgICBpbnQzMl90IG51bU5hbFVuaXRzID0gMDsKKyAgICBpbnQzMl90IGF2Y1dpZHRoID0gLTE7CisgICAgaW50MzJfdCBhdmNIZWlnaHQgPSAtMTsKKyAgICBzdHJpbmcgbGluZTsKKyAgICBzdHJpbmcgdHlwZTsKKyAgICBzaXplX3QgY2h1bmtMZW5ndGg7CisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdHlwZSA+PiBjaHVua0xlbmd0aDsKKyAgICAgICAgQVNTRVJUX0dUKGNodW5rTGVuZ3RoLCAwKSA8PCAiTGVuZ3RoIG9mIHRoZSBkYXRhIGNodW5rIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBuZXcgdWludDhfdFtjaHVua0xlbmd0aF07CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgY2h1bmtMZW5ndGg7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7CisgICAgICAgIHNpemVfdCBuYWxTaXplOworCisgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKWRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGNodW5rTGVuZ3RoKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICAgICAgc2l6ZV90IHNtYWxsQnVmZmVyU2l6ZSA9IGtTbWFsbEJ1ZmZlclNpemU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNhbml0eURhdGEgPSBuZXcgdWludDhfdFtzbWFsbEJ1ZmZlclNpemVdOworICAgICAgICBtZW1jcHkoKHZvaWQgKilzYW5pdHlEYXRhLCAodm9pZCAqKWRhdGEsIHNtYWxsQnVmZmVyU2l6ZSk7CisKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0TmV4dE5BTFVuaXQoJnNhbml0eURhdGEsICZzbWFsbEJ1ZmZlclNpemUsICZuYWxTdGFydCwgJm5hbFNpemUsIHRydWUpOworICAgICAgICBBU1NFUlRfRVEocmVzdWx0LCAtRUFHQUlOKSA8PCAiSW52YWxpZCByZXN1bHQgZm91bmQgd2hlbiB3cm9uZyBOQUwgdW5pdCBwYXNzZWQiOworCisgICAgICAgIHdoaWxlICghZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZjaHVua0xlbmd0aCwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgIG51bU5hbFVuaXRzKys7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIFNQUworICAgICAgICAgICAgaWYgKChuYWxTdGFydFswXSAmIGtTUFNtYXNrKSAhPSBrU1BTU3RhcnRDb2RlKSBjb250aW51ZTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKG5hbFNpemUgPiAwKSA8PCAiTkFMIHVuaXQgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gc3BzQnVmZmVyID0gbmV3IEFCdWZmZXIobmFsU2l6ZSk7CisgICAgICAgICAgICBBU1NFUlRfTkUoc3BzQnVmZmVyLCBudWxscHRyKSA8PCAiQUJ1ZmZlciByZXR1cm5lZCBudWxsIGZvciBzaXplOiAiIDw8IG5hbFNpemU7CisKKyAgICAgICAgICAgIG1lbWNweShzcHNCdWZmZXItPmRhdGEoKSwgbmFsU3RhcnQsIG5hbFNpemUpOworICAgICAgICAgICAgRmluZEFWQ0RpbWVuc2lvbnMoc3BzQnVmZmVyLCAmYXZjV2lkdGgsICZhdmNIZWlnaHQpOworICAgICAgICAgICAgc3BzQnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoYXZjV2lkdGgsIG1GcmFtZVdpZHRoKQorICAgICAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgd2lkdGg6ICIgPDwgbUZyYW1lV2lkdGggPDwgIkZvdW5kOiAiIDw8IGF2Y1dpZHRoOworCisgICAgICAgICAgICBBU1NFUlRfRVEoYXZjSGVpZ2h0LCBtRnJhbWVIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBoZWlnaHQ6ICIgPDwgbUZyYW1lSGVpZ2h0IDw8ICJGb3VuZDogIiA8PCBhdmNIZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gZGF0YTsKKyAgICB9CisgICAgaWYgKG1OYWxVbml0c0V4cGVjdGVkIDwgMCkgeworICAgICAgICBBU1NFUlRfR1QobnVtTmFsVW5pdHMsIDApIDw8ICJGYWlsZWQgdG8gZmluZCBhbiBOQUwgVW5pdCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKG51bU5hbFVuaXRzLCBtTmFsVW5pdHNFeHBlY3RlZCkKKyAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgbnVtYmVyIG9mIE5BTCB1bml0czogIiA8PCBtTmFsVW5pdHNFeHBlY3RlZAorICAgICAgICAgICAgICAgIDw8ICIgZm91bmQ6ICIgPDwgbnVtTmFsVW5pdHM7CisgICAgfQorfQorCitURVNUX1AoQXZjY0JveFRlc3QsIEF2Y2NCb3hWYWxpZGF0aW9uVGVzdCkgeworICAgIGludDMyX3QgYXZjV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IGF2Y0hlaWdodCA9IC0xOworICAgIGludDMyX3QgYWNjZXNzVW5pdExlbmd0aCA9IDA7CisgICAgaW50MzJfdCBwcm9maWxlID0gLTE7CisgICAgaW50MzJfdCBsZXZlbCA9IC0xOworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0eXBlOworICAgIHNpemVfdCBjaHVua0xlbmd0aDsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0eXBlID4+IGNodW5rTGVuZ3RoOworCisgICAgICAgIGlmICh0eXBlLmNvbXBhcmUoIlNQUyIpICYmIHR5cGUuY29tcGFyZSgiUFBTIikpIGNvbnRpbnVlOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgdGhlIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyI7CisKKyAgICAgICAgYWNjZXNzVW5pdExlbmd0aCArPSBjaHVua0xlbmd0aDsKKworICAgICAgICBpZiAoIXR5cGUuY29tcGFyZSgiU1BTIikpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBuZXcgdWludDhfdFtjaHVua0xlbmd0aF07CisgICAgICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBkYXRhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGNodW5rTGVuZ3RoOworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICAgICAgICAgIHNpemVfdCBuYWxTaXplOworCisgICAgICAgICAgICBtSW5wdXRGaWxlU3RyZWFtLnJlYWQoKGNoYXIgKilkYXRhLCAodWludDMyX3QpY2h1bmtMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGNodW5rTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBtSW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpOworCisgICAgICAgICAgICB3aGlsZSAoIWdldE5leHROQUxVbml0KCZkYXRhLCAmY2h1bmtMZW5ndGgsICZuYWxTdGFydCwgJm5hbFNpemUsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBTUFMKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShuYWxTaXplID4gMCAmJiAobmFsU3RhcnRbMF0gJiBrU1BTbWFzaykgPT0ga1NQU1N0YXJ0Q29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IFNQUyI7CisKKyAgICAgICAgICAgICAgICBBU1NFUlRfR0UobmFsU2l6ZSwgNCkgPDwgIlNQUyBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDQiOworCisgICAgICAgICAgICAgICAgcHJvZmlsZSA9IG5hbFN0YXJ0WzFdOworICAgICAgICAgICAgICAgIGxldmVsID0gbmFsU3RhcnRbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGVbXSBkYXRhOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgKmFjY2Vzc1VuaXREYXRhID0gbmV3IHVpbnQ4X3RbYWNjZXNzVW5pdExlbmd0aF07CisgICAgQVNTRVJUX05FKGFjY2Vzc1VuaXREYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGFjY2Vzc1VuaXRMZW5ndGg7CisKKyAgICBtSW5wdXRGaWxlU3RyZWFtLnNlZWtnKDAsIGlvczo6YmVnKTsKKyAgICBtSW5wdXRGaWxlU3RyZWFtLnJlYWQoKGNoYXIgKilhY2Nlc3NVbml0RGF0YSwgYWNjZXNzVW5pdExlbmd0aCk7CisgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGFjY2Vzc1VuaXRMZW5ndGgpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBtSW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpOworCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKGFjY2Vzc1VuaXRMZW5ndGgpOworICAgIEFTU0VSVF9ORShhY2Nlc3NVbml0LCBudWxscHRyKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgYW4gYW5kcm9pZCBkYXRhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGFjY2Vzc1VuaXRMZW5ndGg7CisKKyAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0RGF0YSwgYWNjZXNzVW5pdExlbmd0aCk7CisgICAgc3A8QUJ1ZmZlcj4gY3NkRGF0YUJ1ZmZlciA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShhY2Nlc3NVbml0LCAmYXZjV2lkdGgsICZhdmNIZWlnaHQpOworICAgIEFTU0VSVF9ORShjc2REYXRhQnVmZmVyLCBudWxscHRyKSA8PCAiTm8gZGF0YSByZXR1cm5lZCBmcm9tIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgpIjsKKworICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpIDw8ICJFeHBlY3RlZCB3aWR0aDogIiA8PCBtRnJhbWVXaWR0aCA8PCAiRm91bmQ6ICIgPDwgYXZjV2lkdGg7CisKKyAgICBBU1NFUlRfRVEoYXZjSGVpZ2h0LCBtRnJhbWVIZWlnaHQpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgaGVpZ2h0OiAiIDw8IG1GcmFtZUhlaWdodCA8PCAiRm91bmQ6ICIgPDwgYXZjSGVpZ2h0OworCisgICAgdWludDhfdCAqY3NkRGF0YSA9IGNzZERhdGFCdWZmZXItPmRhdGEoKTsKKyAgICBBU1NFUlRfRVEoKmNzZERhdGEsIGtDb25maWdWZXJzaW9uKSA8PCAiSW52YWxpZCBjb25maWd1cmF0aW9uIHZlcnNpb24iOworCisgICAgQVNTRVJUX0dFKGNzZERhdGFCdWZmZXItPnNpemUoKSwgNCkgPDwgIkNTRCBkYXRhIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNCI7CisKKyAgICBBU1NFUlRfRVEoKihjc2REYXRhICsgMSksIHByb2ZpbGUpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgQVZDIHByb2ZpbGU6ICIgPDwgcHJvZmlsZSA8PCAiIGZvdW5kOiAiIDw8ICooY3NkRGF0YSArIDEpOworCisgICAgQVNTRVJUX0VRKCooY3NkRGF0YSArIDMpLCBsZXZlbCkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBBVkMgbGV2ZWw6ICIgPDwgbGV2ZWwgPDwgIiBmb3VuZDogIiA8PCAqKGNzZERhdGEgKyAzKTsKKyAgICBjc2REYXRhQnVmZmVyLmNsZWFyKCk7CisgICAgZGVsZXRlW10gYWNjZXNzVW5pdERhdGE7CisgICAgYWNjZXNzVW5pdC5jbGVhcigpOworfQorCitURVNUX1AoQVZDRnJhbWVUZXN0LCBGcmFtZVRlc3QpIHsKKyAgICBzdHJpbmcgbGluZTsKKyAgICBzdHJpbmcgdHlwZTsKKyAgICBzaXplX3QgY2h1bmtMZW5ndGg7CisgICAgaW50MzJfdCBmcmFtZUxheWVySUQ7CisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICB1aW50MzJfdCBsYXllcklEID0gMDsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSBzdHJpbmdMaW5lKGxpbmUpOworICAgICAgICBzdHJpbmdMaW5lID4+IHR5cGUgPj4gY2h1bmtMZW5ndGggPj4gZnJhbWVMYXllcklEOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgdGhlIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyI7CisKKyAgICAgICAgY2hhciAqZGF0YSA9IG5ldyBjaGFyW2NodW5rTGVuZ3RoXTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGlvbiBkYXRhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGNodW5rTGVuZ3RoOworCisgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZChkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgIEFTU0VSVF9FUShtSW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpLCBjaHVua0xlbmd0aCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBtSW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpOworCisgICAgICAgIGlmICghdHlwZS5jb21wYXJlKCJJRFIiKSkgeworICAgICAgICAgICAgYm9vbCBpc0lEUiA9IElzSURSKCh1aW50OF90ICopZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXNJRFIpOworCisgICAgICAgICAgICBsYXllcklEID0gRmluZEFWQ0xheWVySWQoKHVpbnQ4X3QgKilkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEobGF5ZXJJRCwgZnJhbWVMYXllcklEKSA8PCAiV3JvbmcgbGF5ZXIgSUQgZm91bmQiOworICAgICAgICB9IGVsc2UgaWYgKCF0eXBlLmNvbXBhcmUoIlAiKSB8fCAhdHlwZS5jb21wYXJlKCJCIikpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoYWNjZXNzVW5pdCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgYWNjZXNzIFVuaXQiOworCisgICAgICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBib29sIGlzUmVmZXJlbmNlRnJhbWUgPSBJc0FWQ1JlZmVyZW5jZUZyYW1lKGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXNSZWZlcmVuY2VGcmFtZSk7CisKKyAgICAgICAgICAgIGFjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGxheWVySUQgPSBGaW5kQVZDTGF5ZXJJZCgodWludDhfdCAqKWRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShsYXllcklELCBmcmFtZUxheWVySUQpIDw8ICJXcm9uZyBsYXllciBJRCBmb3VuZCI7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gZGF0YTsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBVkNVdGlsc1Rlc3RBbGwsIE1wZWdBdWRpb1VuaXRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoMHhGRkZCOTIwNCwgNDE4LCA0NDEwMCwgMiwgMTI4LCAxMTUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDB4RkZGQjc2MDQsIDI4OSwgNDgwMDAsIDIsIDk2LCAxMTUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDB4RkZGRTU2MDQsIDE2NCwgNDgwMDAsIDIsIDE2MCwgMzg0KSkpOworCisvLyBJbmZvIEZpbGUgY29udGFpbnMgdGhlIHR5cGUgYW5kIGxlbmd0aCBmb3IgZWFjaCBjaHVuay9mcmFtZQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBBVkNVdGlsc1Rlc3RBbGwsIEFWQ0RpbWVuc2lvblRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF84eDhwNTBmMzJfMjAwa2Jwc19icC5pbmZvIiwgOCwgOCwgMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfNjQweDM2MHAyNGYzMDBfMTAwMGticHNfYnAuaW5mbyIsIDY0MCwgMzYwLCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmluZm8iLCAxMjgwLCA3MjAsIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzE5MjB4MTA4MHA1MGYzMDBfMTIwMDBrYnBzX2JwLmluZm8iLCAxOTIwLCAxMDgwLCAxNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8zODQweDIxNjBwNjBmMzAwXzY4MDAwa2Jwc19icC5pbmZvIiwgMzg0MCwgMjE2MCwgMTQpKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEFWQ1V0aWxzVGVzdEFsbCwgQXZjY0JveFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF84eDhwNTBmMzJfMjAwa2Jwc19icC5pbmZvIiwgOCwgOCwgMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xMjgweDcyMHAzMGYzMDBfNTAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5pbmZvIiwgMTI4MCwgNzIwLCAxMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MHA1MGYzMDBfMTIwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5pbmZvIiwgMTkyMCwgMTA4MCwgMTQpKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQVZDVXRpbHNUZXN0QWxsLCBWT0xEaW1lbnNpb25UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoInZvbERhdGFfNzIwXzQ4MCIsIDcyMCwgNDgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ2b2xEYXRhXzEyODBfNzIwIiwgMTI4MCwgNzIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ2b2xEYXRhXzE5MjBfMTA4MCIsIDE5MjAsIDEwODApKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSwgbGVuZ3RoIGFuZCBsYXllciBJRCBmb3IgZWFjaCBjaHVuay9mcmFtZQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEFWQ1V0aWxzVGVzdEFsbCwgQVZDRnJhbWVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmluZm8iKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IEFWQ1V0aWxzVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDBlNDgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQVZDVXRpbHNVbml0VGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBVkNVdGlsc1VuaXRUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA4OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIEFWQyBVdGlscyB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iQVZDVXRpbHNVbml0VGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQVZDVXRpbHNVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNVbml0VGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvQVZDVXRpbHNVbml0VGVzdC8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkFWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9BVkNVdGlsc1VuaXRUZXN0LyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWQ3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQVZDVXRpbHMgVGVzdAorVGhlIEFWQyBVdGlsaXR5IFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIGF2Y191dGlscyBsaWJyYXJpeSBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQVZDVXRpbHNVbml0VGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BVkNVdGlsc1VuaXRUZXN0L0FWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BVkNVdGlsc1VuaXRUZXN0L0FWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIEFWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBBVkNVdGlsc1VuaXRUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEFWQ1V0aWxzVW5pdFRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZjIxNTdjOS4uOWU2NzE4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icApAQCAtMjUsMyArMjUsMzIgQEAKICAgICAgICAgIlV0aWxzX3Rlc3QuY3BwIiwKICAgICBdLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWV0YURhdGFCYXNlVW5pdFRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDEgPSAxOTIwOworY29uc3RleHByIGludDMyX3Qga0hlaWdodDEgPSAxMDgwOworY29uc3RleHByIGludDMyX3Qga1dpZHRoMiA9IDEyODA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MiA9IDkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDMgPSA3MjA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MyA9IDQ4MDsKK2NvbnN0ZXhwciBpbnQzMl90IGtQcm9maWxlID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtMZXZlbCA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBrUGxhdGZvcm1WYWx1ZSA9IDE7CisKKy8vIFJlY3RhbmdsZSBtYXJnaW5zCitjb25zdGV4cHIgaW50MzJfdCBrTGVmdCA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtUb3AgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmlnaHQgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrQm90dG9tID0gMTAwOworCitjb25zdGV4cHIgaW50NjRfdCBrRHVyYXRpb25VcyA9IDYwMDAwMDAwOworCitjb25zdGV4cHIgZmxvYXQga0NhcHR1cmVSYXRlID0gMzAuMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZXRhRGF0YUJhc2VVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ3JlYXRlTWV0YURhdGFCYXNlVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgLy8gVGVzdGluZyBjb3B5IGNvbnN0cnVjdG9yCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YUNvcHkgPSBtZXRhRGF0YTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGFDb3B5LCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEgY29weSI7CisKKyAgICBkZWxldGUgbWV0YURhdGE7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgU2V0QW5kRmluZERhdGFUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBTZXR0aW5nIHRoZSBkaWZmZXJlbnQga2V5LXZhbHVlIHBhaXIgdHlwZSBmb3IgZmlyc3QgdGltZSwgb3ZlcndyaXRlCisgICAgLy8gZXhwZWN0ZWQgdG8gYmUgZmFsc2UKKyAgICBib29sIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlNSU1FVHlwZSwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBrUHJvZmlsZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5VmlkZW9Qcm9maWxlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwga0xldmVsKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb0xldmVsLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwga0R1cmF0aW9uVXMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUR1cmF0aW9uLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCBrQ2FwdHVyZVJhdGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNhcHR1cmVGcmFtZXJhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBjb25zdCBpbnQzMl90ICpwbGF0Zm9ybSA9ICZrUGxhdGZvcm1WYWx1ZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAodm9pZCAqKXBsYXRmb3JtKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlQbGF0Zm9ybVByaXZhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGtMZWZ0LCBrVG9wLCBrUmlnaHQsIGtCb3R0b20pOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNyb3BSZWN0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgLy8gRHVtcCB0byBsb2cgZm9yIHJlZmVyZW5jZQorICAgIG1ldGFEYXRhLT5kdW1wVG9Mb2coKTsKKworICAgIC8vIEZpbmQgdGhlIGRhdGEgd2hpY2ggd2FzIHNldAorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlNSU1FVHlwZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSA8PCAiSW5jb3JyZWN0IG1pbWUgdHlwZSByZXR1cm5lZCI7CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHByb2ZpbGUsIGxldmVsOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlXaWR0aCBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEod2lkdGgsIGtXaWR0aDEpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2Ygd2lkdGggcmV0dXJuZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5SGVpZ2h0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShoZWlnaHQsIGtIZWlnaHQxKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGhlaWdodCByZXR1cm5lZCI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZwcm9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5VmlkZW9Qcm9maWxlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShwcm9maWxlLCBrUHJvZmlsZSkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBwcm9maWxlIHJldHVybmVkIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZsZXZlbCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVZpZGVvTGV2ZWwga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGxldmVsLCBrTGV2ZWwpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgbGV2ZWwgcmV0dXJuZWQiOworCisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5RHVyYXRpb24ga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGR1cmF0aW9uLCBrRHVyYXRpb25VcykgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBkdXJhdGlvbiByZXR1cm5lZCI7CisKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmZyYW1lUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNhcHR1cmVGcmFtZXJhdGUga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGZyYW1lUmF0ZSwga0NhcHR1cmVSYXRlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGNhcHR1cmVGcmFtZVJhdGUgcmV0dXJuZWQiOworCisgICAgaW50MzJfdCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRSZWN0KGtLZXlDcm9wUmVjdCwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNyb3BSZWN0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShsZWZ0LCBrTGVmdCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBsZWZ0IG1hcmdpbiByZXR1cm5lZCI7CisgICAgQVNTRVJUX0VRKHRvcCwga1RvcCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiB0b3AgbWFyZ2luIHJldHVybmVkIjsKKyAgICBBU1NFUlRfRVEocmlnaHQsIGtSaWdodCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiByaWdodCBtYXJnaW4gcmV0dXJuZWQiOworICAgIEFTU0VSVF9FUShib3R0b20sIGtCb3R0b20pIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgYm90dG9tIG1hcmdpbiByZXR1cm5lZCI7CisKKyAgICB2b2lkICpwbGF0Zm9ybVZhbHVlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kUG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAmcGxhdGZvcm1WYWx1ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVBsYXRmb3JtUHJpdmF0ZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEocGxhdGZvcm1WYWx1ZSwgJmtQbGF0Zm9ybVZhbHVlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIHBvaW50ZXIgcmV0dXJuZWQiOworCisgICAgLy8gQ2hlY2sgZm9yIHRoZSBrZXkgd2hpY2ggaXMgbm90IGFkZGVkIHRvIG1ldGFkYXRhCisgICAgaW50MzJfdCBhbmdsZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJmFuZ2xlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiVmFsdWUgZm9yIGFuIGludmFsaWQga2V5IGlzIHJldHVybmVkIHdoZW4gdGhlIGtleSBpcyBub3Qgc2V0IjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIE92ZXJXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBzZXQvc2V0L3JlYWQgdG8gY2hlY2sgZmlyc3Qgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleU1JTUVUeXBlIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gQ2hlY2sgdGhlIHZhbHVlCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleU1JTUVUeXBlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9TVFJFUShtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSA8PCAiTWltZSB2YWx1ZSBpcyBub3Qgb3ZlcndyaXR0ZW4iOworCisgICAgLy8gc2V0L3NldC9zZXQvcmVhZCB0byBjaGVjayBzZWNvbmQgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlXaWR0aCBhZ2Fpbiwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIHRydWUiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0Mik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiU2V0dGluZyBrS2V5SGVpZ2h0IGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gT3ZlcndyaXRlIHRoZSB2YWx1ZSBhZ2FpbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleVdpZHRoIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlIZWlnaHQgYWdhaW4sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSB0cnVlIjsKKyAgICAvLyBDaGVjayB0aGUgdmFsdWUKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVdpZHRoIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUSh3aWR0aCwga1dpZHRoMykgPDwgIlZhbHVlIG9mIHdpZHRoIGlzIG5vdCBvdmVyd3JpdHRlbiI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlIZWlnaHQga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGhlaWdodCwga0hlaWdodDMpIDw8ICJWYWx1ZSBvZiBoZWlnaHQgaXMgbm90IG92ZXJ3cml0dGVuIjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIFJlbW92ZUtleVRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIk1ldGFEYXRhIGRvZXMgbm90IGhhdmUgdGhlIG1pbWUga2V5IjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBrS2V5TUlNRVR5cGUga2V5IjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNZXRhRGF0YSBoYXMgbWltZSBrZXkgYWZ0ZXIgcmVtb3ZpbmcgaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFJlbW92ZSB0aGUgbm9uIGV4aXN0aW5nIGtleQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiUmVtb3ZlZCB0aGUgbm9uIGV4aXN0aW5nIGtleSI7CisKKyAgICAvLyBDaGVjayBvdmVyd3JpdGluZyB0aGUgcmVtb3ZlZCBrZXkKKyAgICBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJPdmVyd3JpdGUgc2hvdWxkIGJlIGZhbHNlIHNpbmNlIHRoZSBrZXkgd2FzIHJlbW92ZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICAvLyBDbGVhciB3aG9sZSBtZXRhZGF0YQorICAgIG1ldGFEYXRhLT5jbGVhcigpOworCisgICAgLy8gQ2hlY2sgZmluZGluZyBrZXkgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWV0YURhdGEgZm91bmQga0tleVdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5V2lkdGgpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIHdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIG1pbWUga2V5IGFmdGVyIGNsZWFyaW5nIGFsbCB0aGUgaXRlbXMgaW4gaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIENoZWNrIHJlbW92aW5nIGtleSBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+cmVtb3ZlKGtLZXlNSU1FVHlwZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIlJlbW92ZWQgdGhlIGtleSwgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhIjsKKworICAgIC8vIENoZWNraW5nIHNldCBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ29udmVydFRvU3RyaW5nVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgU3RyaW5nOCBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0VRKGluZm8ubGVuZ3RoKCksIDApIDw8ICJFbXB0eSBNZXRhRGF0YSBsZW5ndGggaXMgbm9uLXplcm86ICIgPDwgaW5mby5sZW5ndGgoKTsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlIZWlnaHQsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGtQcm9maWxlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb1Byb2ZpbGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBrTGV2ZWwpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVZpZGVvTGV2ZWwsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0dUKGluZm8ubGVuZ3RoKCksIDApIDw8ICJNZXRhRGF0YSBjb250YWlucyBubyBpbmZvcm1hdGlvbiI7CisKKyAgICAvLyBEdW1wIHRvIGxvZyBmb3IgcmVmZXJlbmNlCisgICAgbWV0YURhdGEtPmR1bXBUb0xvZygpOworCisgICAgLy8gQ2xlYXIgd2hvbGUgbWV0YWRhdGEKKyAgICBtZXRhRGF0YS0+Y2xlYXIoKTsKKworICAgIGluZm8gPSBtZXRhRGF0YS0+dG9TdHJpbmcoKTsKKyAgICBBU1NFUlRfRVEoaW5mby5sZW5ndGgoKSwgMCkgPDwgIk1ldGFEYXRhIGxlbmd0aCBpcyBub24temVybyBhZnRlciBjbGVhcmluZyBpdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmZvLmxlbmd0aCgpOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzI5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIk9wdXNIZWFkZXJUZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk9wdXNIZWFkZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWUxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBvcHVzIGhlYWRlciB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXIuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWM5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3QuY3BwCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPcHVzSGVhZGVyVGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvT3B1c091dHB1dCIKKworLy8gT3B1cyBpbiBXZWJNIGlzIGEgd2VsbC1rbm93biwgeWV0IHVuZGVyLWRvY3VtZW50ZWQsIGZvcm1hdC4gVGhlIGNvZGVjIHByaXZhdGUgZGF0YQorLy8gb2YgdGhlIHRyYWNrIGlzIGFuIE9wdXMgT2dnIGhlYWRlciAoaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc4NDUjc2VjdGlvbi01LjEpCisvLyBjaGFubmVsIG1hcHBpbmcgb2Zmc2V0IGluIG9wdXMgaGVhZGVyCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0gMjE7Citjb25zdGV4cHIgc2l6ZV90IGtNYXhPcHVzSGVhZGVyU2l6ZSA9IDEwMDsKKy8vIEFPUFVTSERSICsgQU9QVVNIRFJMZW5ndGggKworLy8gKDggKyA4ICkgKworLy8gSGVhZGVyKGNzZCkgKyBudW1fc3RyZWFtcyArIG51bV9jb3VwbGVkICsgMQorLy8gKDE5ICsgMSArIDEgKyAxKSArCisvLyBBT1BVU0RMWSArIEFPUFVTRExZTGVuZ3RoICsgREVMQVkgKyBBT1BVU1BSTCArIEFPUFVTUFJMTGVuZ3RoICsgUFJMCisvLyAoOCArIDggKyA4ICsgOCArIDggKyA4KQorLy8gPSA4NgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxNYXBPZmZzZXQgPSA4NjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKK2NvbnN0ZXhwciB1aW50NjRfdCBrT3B1c1NlZWtQcmVyb2xsTnMgPSA4MDAwMDAwMDsKK2NvbnN0ZXhwciBpbnQ2NF90IGtOc2VjUGVyU2VjID0gMTAwMDAwMDAwMGxsOworCisvLyBPcHVzIHVzZXMgVm9yYmlzIGNoYW5uZWwgbWFwcGluZywgYW5kIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcgc3BlY2lmaWVzCisvLyBtYXBwaW5ncyBmb3IgdXAgdG8gOCBjaGFubmVscy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXJ0IG9mIHRoZSBWb3JiaXMgSQorLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly93d3cueGlwaC5vcmcvdm9yYmlzL2RvYy9Wb3JiaXNfSV9zcGVjLmh0bWwKK2NvbnN0ZXhwciBpbnQga01heENoYW5uZWxzID0gODsKK2NvbnN0ZXhwciB1aW50OF90IGtPcHVzQ2hhbm5lbE1hcFtrTWF4Q2hhbm5lbHNdW2tNYXhDaGFubmVsc10gPSB7CisgICAgICAgIHswfSwKKyAgICAgICAgezAsIDF9LAorICAgICAgICB7MCwgMiwgMX0sCisgICAgICAgIHswLCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDN9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNX0sCisgICAgICAgIHswLCA0LCAxLCAyLCAzLCA1LCA2fSwKKyAgICAgICAgezAsIDYsIDEsIDIsIDMsIDQsIDUsIDd9LAorfTsKKworc3RhdGljIE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBPcHVzSGVhZGVyVGVzdCB7CisgIHB1YmxpYzoKKyAgICBPcHVzSGVhZGVyVGVzdCgpIDogbUlucHV0QnVmZmVyKG51bGxwdHIpIHt9CisKKyAgICB+T3B1c0hlYWRlclRlc3QoKSB7CisgICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07CisgICAgdWludDhfdCAqbUlucHV0QnVmZmVyOworfTsKKworY2xhc3MgT3B1c0hlYWRlclBhcnNlVGVzdCA6IHB1YmxpYyBPcHVzSGVhZGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8c3RyaW5nIC8qIElucHV0RmlsZU5hbWUgKi8sIGludDMyX3QgLyogQ2hhbm5lbENvdW50ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKiBpc0hlYWRlclZhbGlkICovLCBib29sIC8qIGlzQ29kZWNEZWxheVZhbGlkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKiBpc1NlZWtQcmVSb2xsVmFsaWQgKi8sIGJvb2wgLyogaXNJbnB1dFZhbGlkICovPj4geworfTsKKworY2xhc3MgT3B1c0hlYWRlcldyaXRlVGVzdAorICAgIDogcHVibGljIE9wdXNIZWFkZXJUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxpbnQzMl90IC8qIENoYW5uZWxDb3VudCAqLywgaW50MzJfdCAvKiBza2lwU2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIC8qIHJlZmVyZW5jZUZpbGUgKi8+PiB7fTsKKworVEVTVF9QKE9wdXNIZWFkZXJXcml0ZVRlc3QsIFdyaXRlVGVzdCkgeworICAgIHR1cGxlPGludDMyX3QsIGludDMyX3QsIHN0cmluZz4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBPcHVzSGVhZGVyIHdyaXR0ZW5IZWFkZXI7CisgICAgbWVtc2V0KCZ3cml0dGVuSGVhZGVyLCAwLCBzaXplb2Yod3JpdHRlbkhlYWRlcikpOworICAgIGludDMyX3QgY2hhbm5lbHMgPSBnZXQ8MD4ocGFyYW1zKTsKKyAgICB3cml0dGVuSGVhZGVyLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgd3JpdHRlbkhlYWRlci5udW1fc3RyZWFtcyA9IGNoYW5uZWxzOworICAgIHdyaXR0ZW5IZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChjaGFubmVscyA+IDgpID8gMjU1IDogKGNoYW5uZWxzID4gMikpOworICAgIGludDMyX3Qgc2tpcFNhbXBsZXMgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICBzdHJpbmcgcmVmZXJlbmNlRmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwyPihwYXJhbXMpOworICAgIHdyaXR0ZW5IZWFkZXIuc2tpcF9zYW1wbGVzID0gc2tpcFNhbXBsZXM7CisgICAgdWludDY0X3QgY29kZWNEZWxheU5zID0gc2tpcFNhbXBsZXMgKiBrTnNlY1BlclNlYyAvIGtPcHVzU2FtcGxlUmF0ZTsKKyAgICB1aW50OF90IGhlYWRlckRhdGFba01heE9wdXNIZWFkZXJTaXplXTsKKyAgICBpbnQzMl90IGhlYWRlclNpemUgPSBXcml0ZU9wdXNIZWFkZXJzKHdyaXR0ZW5IZWFkZXIsIGtPcHVzU2FtcGxlUmF0ZSwgaGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXJEYXRhKSwgY29kZWNEZWxheU5zLCBrT3B1c1NlZWtQcmVyb2xsTnMpOworICAgIEFTU0VSVF9HVChoZWFkZXJTaXplLCAwKSA8PCAiZmFpbGVkIHRvIGdlbmVyYXRlIE9wdXMgaGVhZGVyIjsKKyAgICBBU1NFUlRfTEUoaGVhZGVyU2l6ZSwga01heE9wdXNIZWFkZXJTaXplKQorICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIHdyaXR0ZW4uIEhlYWRlciBzaXplIGNhbid0IGV4Y2VlZCBrTWF4T3B1c0hlYWRlclNpemUiOworCisgICAgb2ZzdHJlYW0gb3N0cm07CisgICAgb3N0cm0ub3BlbihPVVRQVVRfRklMRV9OQU1FLCBvZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfVFJVRShvc3RybS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUU7CisgICAgb3N0cm0ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KGhlYWRlckRhdGEpLCBoZWFkZXJTaXplKTsKKyAgICBvc3RybS5jbG9zZSgpOworCisgICAgbUVsZVN0cmVhbS5vcGVuKHJlZmVyZW5jZUZpbGVOYW1lLCBpZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiByZWZlcmVuY2VGaWxlTmFtZSAiIDw8IGdldDwyPihwYXJhbXMpOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludDMyX3Qgc3RhdFN0YXR1cyA9IHN0YXQocmVmZXJlbmNlRmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgQVNTRVJUX0VRKHN0YXRTdGF0dXMsIDApIDw8ICJVbmFibGUgdG8gZ2V0IGZpbGUgcHJvcGVydGllcyI7CisKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBtSW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZSk7CisgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkluc3VmZmljaWVudCBtZW1vcnkuIE1hbGxvYyBmYWlsZWQgZm9yIHNpemUgIiA8PCBmaWxlU2l6ZTsKKworICAgIG1FbGVTdHJlYW0ucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4obUlucHV0QnVmZmVyKSwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBmaWxlU2l6ZSkgPDwgIm1FbGVTdHJlYW0uZ2NvdW50KCkgIT0gYnl0ZXNDb3VudCI7CisKKyAgICBBU1NFUlRfRVEoZmlsZVNpemUsIGhlYWRlclNpemUpCisgICAgICAgICAgICA8PCAiTWlzbWF0Y2ggaW4gc2l6ZSBiZXR3ZWVuIGhlYWRlciBnZW5lcmF0ZWQgYW5kIHJlZmVyZW5jZSBoZWFkZXIiOworICAgIGludDMyX3QgbWF0Y2ggPSBtZW1jbXAocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KG1JbnB1dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIgKj4oaGVhZGVyRGF0YSksIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEobWF0Y2gsIDApIDw8ICJPcHVzIGhlYWRlciBkb2VzIG5vdCBtYXRjaCByZWZlcmVuY2UgZmlsZTogIiA8PCByZWZlcmVuY2VGaWxlTmFtZTsKKworICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBudWxscHRyOworICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBudWxscHRyOworICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gbnVsbHB0cjsKKyAgICBib29sIHN0YXR1cyA9IEdldE9wdXNIZWFkZXJCdWZmZXJzKGhlYWRlckRhdGEsIGhlYWRlclNpemUsICZvcHVzSGVhZEJ1ZiwgJm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmLCAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkVuY291bnRlcmVkIGVycm9yIGluIEdldE9wdXNIZWFkZXJCdWZmZXJzIjsKKworICAgIHVpbnQ2NF90IHZhbHVlID0gKigodWludDY0X3QgKiljb2RlY0RlbGF5QnVmKTsKKyAgICBBU1NFUlRfRVEodmFsdWUsIGNvZGVjRGVsYXlOcyk7CisKKyAgICB2YWx1ZSA9ICooKHVpbnQ2NF90ICopc2Vla1ByZVJvbGxCdWYpOworICAgIEFTU0VSVF9FUSh2YWx1ZSwga09wdXNTZWVrUHJlcm9sbE5zKTsKKworICAgIE9wdXNIZWFkZXIgcGFyc2VkSGVhZGVyOworICAgIHN0YXR1cyA9IFBhcnNlT3B1c0hlYWRlcigodWludDhfdCAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUsICZwYXJzZWRIZWFkZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIFBhcnNpbmcgT3B1cyBIZWFkZXIuIjsKKworICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLmNoYW5uZWxzLCBwYXJzZWRIZWFkZXIuY2hhbm5lbHMpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWwgY291bnRzIjsKKworICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLnNraXBfc2FtcGxlcywgcGFyc2VkSGVhZGVyLnNraXBfc2FtcGxlcykKKyAgICAgICAgICAgIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIG5vIG9mIHNraXBTYW1wbGVzIHdyaXR0ZW4gIgorICAgICAgICAgICAgICAgImFuZCBubyBvZiBza2lwU2FtcGxlcyBnb3QgYWZ0ZXIgcGFyc2luZyI7CisKKyAgICBBU1NFUlRfRVEod3JpdHRlbkhlYWRlci5jaGFubmVsX21hcHBpbmcsIHBhcnNlZEhlYWRlci5jaGFubmVsX21hcHBpbmcpCisgICAgICAgICAgICA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBjaGFubmVsTWFwcGluZyB3cml0dGVuICIKKyAgICAgICAgICAgICAgICJhbmQgY2hhbm5lbE1hcHBpbmcgZ290IGFmdGVyIHBhcnNpbmciOworCisgICAgaWYgKHBhcnNlZEhlYWRlci5jaGFubmVsX21hcHBpbmcpIHsKKyAgICAgICAgQVNTRVJUX0dUKHBhcnNlZEhlYWRlci5jaGFubmVscywgMik7CisgICAgICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLm51bV9zdHJlYW1zLCBwYXJzZWRIZWFkZXIubnVtX3N0cmVhbXMpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gTWlzbWF0Y2ggYmV0d2VlbiBjaGFubmVsIGNvdW50cyI7CisKKyAgICAgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIubnVtX2NvdXBsZWQsIHBhcnNlZEhlYWRlci5udW1fY291cGxlZCkKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWwgY291bnRzIjsKKworICAgICAgICBBU1NFUlRfRVEocGFyc2VkSGVhZGVyLm51bV9jb3VwbGVkICsgcGFyc2VkSGVhZGVyLm51bV9zdHJlYW1zLCBwYXJzZWRIZWFkZXIuY2hhbm5lbHMpOworCisgICAgICAgIEFTU0VSVF9MRShwYXJzZWRIZWFkZXIubnVtX2NvdXBsZWQsIHBhcnNlZEhlYWRlci5udW1fc3RyZWFtcykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBOdW1iZXIgb2YgY291cGxlZCBzdHJlYW1zIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICJudW1iZXIgIgorICAgICAgICAgICAgICAgICAgICJvZiBzdHJlYW1zLiI7CisKKyAgICAgICAgQVNTRVJUX0VRKGhlYWRlclNpemUsIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcE9mZnNldCArIHdyaXR0ZW5IZWFkZXIuY2hhbm5lbHMpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIHdyaXR0ZW4uIEhlYWRlciBzaXplIHNob3VsZCBiZSBlcXVhbCB0byA4NiArICIKKyAgICAgICAgICAgICAgICAgICAid3JpdHRlbkhlYWRlci5jaGFubmVscyI7CisKKyAgICAgICAgdWludDhfdCBtYXBwZWRDaGFubmVsTnVtYmVyOworICAgICAgICBmb3IgKGludDMyX3QgY2hhbm5lbE51bWJlciA9IDA7IGNoYW5uZWxOdW1iZXIgPCBjaGFubmVsczsgY2hhbm5lbE51bWJlcisrKSB7CisgICAgICAgICAgICBtYXBwZWRDaGFubmVsTnVtYmVyID0gKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4ob3B1c0hlYWRCdWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgY2hhbm5lbE51bWJlcik7CisgICAgICAgICAgICBBU1NFUlRfTFQobWFwcGVkQ2hhbm5lbE51bWJlciwgY2hhbm5lbHMpIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIENoYW5uZWwgbWFwcGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGNoYW5uZWwgY291bnQuIjsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG1hcHBlZENoYW5uZWxOdW1iZXIsIGtPcHVzQ2hhbm5lbE1hcFtjaGFubmVscyAtIDFdW2NoYW5uZWxOdW1iZXJdKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBDaGFubmVsIG1hcHBpbmcgaXMgbm90IGFzIHBlciBzcGVjaWZpY2F0aW9uLiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTEUocGFyc2VkSGVhZGVyLmNoYW5uZWxzLCAyKTsKKyAgICB9Cit9CisKK1RFU1RfUChPcHVzSGVhZGVyUGFyc2VUZXN0LCBQYXJzZVRlc3QpIHsKKyAgICB0dXBsZTxzdHJpbmcsIGludDMyX3QsIGJvb2wsIGJvb2wsIGJvb2wsIGJvb2w+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwwPihwYXJhbXMpOworICAgIG1FbGVTdHJlYW0ub3BlbihpbnB1dEZpbGVOYW1lLCBpZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiBpbnB1dGZpbGUgIiA8PCBnZXQ8MD4ocGFyYW1zKTsKKyAgICBib29sIGlzSGVhZGVyVmFsaWQgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBib29sIGlzQ29kZWNEZWxheVZhbGlkID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgYm9vbCBpc1NlZWtQcmVSb2xsVmFsaWQgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICBib29sIGlzSW5wdXRWYWxpZCA9IGdldDw1PihwYXJhbXMpOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXQoaW5wdXRGaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBtSW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZSk7CisgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkluc3VmZmljaWVudCBtZW1vcnkuIE1hbGxvYyBmYWlsZWQgZm9yIHNpemUgIiA8PCBmaWxlU2l6ZTsKKworICAgIG1FbGVTdHJlYW0ucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4obUlucHV0QnVmZmVyKSwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBmaWxlU2l6ZSkgPDwgIm1FbGVTdHJlYW0uZ2NvdW50KCkgIT0gYnl0ZXNDb3VudCI7CisKKyAgICBPcHVzSGVhZGVyIGhlYWRlcjsKKyAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgIHNpemVfdCBzZWVrUHJlUm9sbEJ1ZlNpemUgPSAwOworICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gbnVsbHB0cjsKKyAgICB2b2lkICpjb2RlY0RlbGF5QnVmID0gbnVsbHB0cjsKKyAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IG51bGxwdHI7CisgICAgYm9vbCBzdGF0dXMgPSBHZXRPcHVzSGVhZGVyQnVmZmVycyhtSW5wdXRCdWZmZXIsIGZpbGVTaXplLCAmb3B1c0hlYWRCdWYsICZvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNEZWxheUJ1ZiwgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vla1ByZVJvbGxCdWZTaXplKTsKKyAgICBpZiAoIWlzSGVhZGVyVmFsaWQpIHsKKyAgICAgICAgQVNTRVJUX0VRKG9wdXNIZWFkQnVmLCBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTkUob3B1c0hlYWRCdWYsIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAoIWlzQ29kZWNEZWxheVZhbGlkKSB7CisgICAgICAgIEFTU0VSVF9FUShjb2RlY0RlbGF5QnVmLCBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTkUoY29kZWNEZWxheUJ1ZiwgbnVsbHB0cik7CisgICAgfQorICAgIGlmICghaXNTZWVrUHJlUm9sbFZhbGlkKSB7CisgICAgICAgIEFTU0VSVF9FUShzZWVrUHJlUm9sbEJ1ZiwgbnVsbHB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05FKHNlZWtQcmVSb2xsQnVmLCBudWxscHRyKTsKKyAgICB9CisgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGlzSW5wdXRWYWxpZCkgPDwgIkdldE9wdXNIZWFkZXJCdWZmZXJzIGZhaWxlZCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBQYXJzZU9wdXNIZWFkZXIoKHVpbnQ4X3QgKilvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplLCAmaGVhZGVyKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaXNJbnB1dFZhbGlkKSA8PCAiUGFyc2Ugb3B1cyBoZWFkZXIgZGlkbid0IGZhaWwgZm9yIGludmFsaWQgaW5wdXQiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShpc0lucHV0VmFsaWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBjaGFubmVscyA9IGdldDwxPihwYXJhbXMpOworICAgIEFTU0VSVF9FUShoZWFkZXIuY2hhbm5lbHMsIGNoYW5uZWxzKSA8PCAiUGFyc2VyIHJldHVybmVkIGludmFsaWQgY2hhbm5lbCBjb3VudCI7CisgICAgQVNTRVJUX0xFKGhlYWRlci5jaGFubmVscywga01heENoYW5uZWxzKTsKKworICAgIEFTU0VSVF9MRShoZWFkZXIubnVtX2NvdXBsZWQsIGhlYWRlci5udW1fc3RyZWFtcykKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE51bWJlciBvZiBjb3VwbGVkIHN0cmVhbXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBudW1iZXIgIgorICAgICAgICAgICAgICAgIm9mIHN0cmVhbXMuIjsKKworICAgIEFTU0VSVF9FUShoZWFkZXIubnVtX2NvdXBsZWQgKyBoZWFkZXIubnVtX3N0cmVhbXMsIGhlYWRlci5jaGFubmVscyk7CisKKyAgICBpZiAoaGVhZGVyLmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICB1aW50OF90IG1hcHBlZENoYW5uZWxOdW1iZXI7CisgICAgICAgIGZvciAoaW50MzJfdCBjaGFubmVsTnVtYmVyID0gMDsgY2hhbm5lbE51bWJlciA8IGNoYW5uZWxzOyBjaGFubmVsTnVtYmVyKyspIHsKKyAgICAgICAgICAgIG1hcHBlZENoYW5uZWxOdW1iZXIgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihvcHVzSGVhZEJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBjaGFubmVsTnVtYmVyKTsKKyAgICAgICAgICAgIEFTU0VSVF9MVChtYXBwZWRDaGFubmVsTnVtYmVyLCBjaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyLiBDaGFubmVsIG1hcHBpbmcgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBjaGFubmVsIGNvdW50LiI7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShtYXBwZWRDaGFubmVsTnVtYmVyLCBrT3B1c0NoYW5uZWxNYXBbY2hhbm5lbHMgLSAxXVtjaGFubmVsTnVtYmVyXSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gQ2hhbm5lbCBtYXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhcyBwZXIgc3BlY2lmaWNhdGlvbi4iOworICAgICAgICB9CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIE9wdXNIZWFkZXJUZXN0QWxsLCBPcHVzSGVhZGVyV3JpdGVUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKDEsIDMxMiwgIm91dHB1dF9jaGFubmVsc18xc2tpcFNhbXBsZXNfMzEyLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgyLCAzMTIsICJvdXRwdXRfY2hhbm5lbHNfMnNraXBTYW1wbGVzXzMxMi5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNSwgMzEyLCAib3V0cHV0X2NoYW5uZWxzXzVza2lwU2FtcGxlc18zMTIub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDYsIDMxMiwgIm91dHB1dF9jaGFubmVsc182c2tpcFNhbXBsZXNfMzEyLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgxLCAwLCAib3V0cHV0X2NoYW5uZWxzXzFza2lwU2FtcGxlc18wLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgyLCAwLCAib3V0cHV0X2NoYW5uZWxzXzJza2lwU2FtcGxlc18wLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg1LCAwLCAib3V0cHV0X2NoYW5uZWxzXzVza2lwU2FtcGxlc18wLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg2LCAwLCAib3V0cHV0X2NoYW5uZWxzXzZza2lwU2FtcGxlc18wLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgxLCA2MjQsICJvdXRwdXRfY2hhbm5lbHNfMXNraXBTYW1wbGVzXzYyNC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMiwgNjI0LCAib3V0cHV0X2NoYW5uZWxzXzJza2lwU2FtcGxlc182MjQub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDUsIDYyNCwgIm91dHB1dF9jaGFubmVsc181c2tpcFNhbXBsZXNfNjI0Lm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg2LCA2MjQsICJvdXRwdXRfY2hhbm5lbHNfNnNraXBTYW1wbGVzXzYyNC5vcHVzIikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBPcHVzSGVhZGVyVGVzdEFsbCwgT3B1c0hlYWRlclBhcnNlVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX3ZhbGlkX3NpemU4M0Iub3B1cyIsIDIsIHRydWUsIHRydWUsIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF92YWxpZF9zaXplODhCLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI1Y2hfdmFsaWQub3B1cyIsIDUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNmNoX3ZhbGlkLm9wdXMiLCA2LCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjFjaF92YWxpZC5vcHVzIiwgMSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfdmFsaWQub3B1cyIsIDIsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfc2l6ZS5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX3N0cmVhbXMub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI1Y2hfaW52YWxpZF9jaGFubmVsbWFwcGluZy5vcHVzIiwgNSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNWNoX2ludmFsaWRfY291cGxlZHN0cmVhbXMub3B1cyIsIDUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjZjaF9pbnZhbGlkX2NoYW5uZWxtYXBwaW5nLm9wdXMiLCA2LCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI5Y2hfaW52YWxpZF9jaGFubmVscy5vcHVzIiwgOSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlci5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlcmxlbmd0aF8xNi5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlcmxlbmd0aF8yNTYub3B1cyIsIDIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfaW52YWxpZF9zaXplLm9wdXMiLCAyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfY2hhbm5lbG1hcHBpbmdfMC5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2NvdXBsZWRzdHJlYW1zLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVybGVuZ3RoLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVyU2l6ZTEub3B1cyIsIDMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9oZWFkZXJTaXplMi5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2hlYWRlclNpemUzLm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfbm9kZWxheS5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX25vcHJlcm9sbC5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR0QoIk9wdXMgSGVhZGVyIFRlc3QgUmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE2M2MzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX09QVVNfSEVBREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fT1BVU19IRUFERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX09QVVNfSEVBREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjBjODI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgT3B1cyBIZWFkZXIKK1RoZSBPcHVzSGVhZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBPUFVTIGhlYWRlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIE9wdXNIZWFkZXJUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L09wdXNIZWFkZXJUZXN0L09wdXNIZWFkZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvT3B1c0hlYWRlclRlc3QvT3B1c0hlYWRlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlci56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggT3B1c0hlYWRlciAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE9wdXNIZWFkZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBPcHVzSGVhZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVHlwZVRyYWl0c190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVHlwZVRyYWl0c190ZXN0LmNwcAppbmRleCAxZTIwNDlkLi5kNTM4M2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1R5cGVUcmFpdHNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9UeXBlVHJhaXRzX3Rlc3QuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAgICAgZW51bSBJQSA6IGludDMyX3QgeyB9OwogfTsKIAotLy8gPT09PT09PT09PT0gYmFzaWMgc2FuaXR5IHRlc3RzIGZvciB0eXBlLXN1cHBvcnQgdGVtcGxhdGVzCisvLyA9PT09PT09PT09PSBiYXNpYyB0ZXN0cyBmb3IgdHlwZS1zdXBwb3J0IHRlbXBsYXRlcwogVEVTVF9GKFR5cGVUcmFpdHNUZXN0LCBTdGF0aWNUZXN0cykgewogCiAgICAgLy8gPT09PT09PT09PT09IGlzX2ludGVncmFsX29yX2VudW0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3ZjQwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQ29sb3JVdGlsc1Rlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQ29sb3JVdGlsc1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0NvbG9yVXRpbHNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9Db2xvclV0aWxzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MDJiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9Db2xvclV0aWxzVGVzdC5jcHAKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvbG9yVXRpbHNUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworY29uc3Qgc2l6ZV90IGtIRFJCdWZmZXJTaXplID0gMjU7Citjb25zdCB1aW50MTZfdCBrSERSSW5mb1Rlc3RWYWx1ZTEgPSA0MjA7Citjb25zdCB1aW50MTZfdCBrSERSSW5mb1Rlc3RWYWx1ZTIgPSA0MjA2OTsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3R5cGVkZWYgQ29sb3JBc3BlY3RzIENBOworCitjbGFzcyBDb2xvclJhbmdlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08LyogQ29sb3JSYW5nZSAqLyBDQTo6UmFuZ2U+IHsKKyAgcHVibGljOgorICAgIENvbG9yUmFuZ2VUZXN0KCkgeyBtUmFuZ2UgPSBHZXRQYXJhbSgpOyB9OworCisgICAgQ0E6OlJhbmdlIG1SYW5nZTsKK307CisKK2NsYXNzIENvbG9yVHJhbnNmZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwvKiBDb2xvclRyYW5zZmVyICovIENBOjpUcmFuc2Zlcj4geworICBwdWJsaWM6CisgICAgQ29sb3JUcmFuc2ZlclRlc3QoKSB7IG1UcmFuc2ZlciA9IEdldFBhcmFtKCk7IH07CisKKyAgICBDQTo6VHJhbnNmZXIgbVRyYW5zZmVyOworfTsKKworY2xhc3MgQ29sb3JTdGFuZGFyZFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcz4+IHsKKyAgcHVibGljOgorICAgIENvbG9yU3RhbmRhcmRUZXN0KCkgeworICAgICAgICBtUHJpbWFyaWVzID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICAgICAgbU1hdHJpeENvZWZmcyA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIH07CisKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworfTsKKworY2xhc3MgSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgKi8gQ0E6OlRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhbmRhcmQgKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgKi8gaW50MzJfdD4+IHsKKyAgcHVibGljOgorICAgIElzb1RvUGxhdGZvcm1Bc3BlY3RzVGVzdCgpIHsKKyAgICAgICAgbVByaW1hcmllcyA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgICAgICBtVHJhbnNmZXIgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbU1hdHJpeENvZWZmcyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtUGxhdGZvcm1TdGFuZGFyZCA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgICAgICBtUGxhdGZvcm1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpOworICAgIH07CisKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6OlRyYW5zZmVyIG1UcmFuc2ZlcjsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7CisgICAgaW50MzJfdCBtUGxhdGZvcm1TdGFuZGFyZDsKKyAgICBpbnQzMl90IG1QbGF0Zm9ybVRyYW5zZmVyOworfTsKKworY2xhc3MgQ29sb3JBc3BlY3RzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp0dXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW1hcmllcyAqLyBDQTo6UHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JUcmFuc2ZlciAqLyBDQTo6VHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yUmFuZ2UgKi8gQ0E6OlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JTdGFuZGFyZCAqLyBDQTo6U3RhbmRhcmQ+PiB7CisgIHB1YmxpYzoKKyAgICBDb2xvckFzcGVjdHNUZXN0KCkgeworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1SYW5nZSA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgICAgICBtU3RhbmRhcmQgPSBzdGQ6OmdldDw0PihHZXRQYXJhbSgpKTsKKyAgICB9OworCisgICAgQ0E6OlByaW1hcmllcyBtUHJpbWFyaWVzOworICAgIENBOjpUcmFuc2ZlciBtVHJhbnNmZXI7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworICAgIENBOjpSYW5nZSBtUmFuZ2U7CisgICAgQ0E6OlN0YW5kYXJkIG1TdGFuZGFyZDsKK307CisKK2NsYXNzIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpZHRoICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGVpZ2h0ICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbWFyaWVzICovIENBOjpQcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4Q29lZmZzICovIENBOjpNYXRyaXhDb2VmZnM+PiB7CisgIHB1YmxpYzoKKyAgICBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCgpIHsKKyAgICAgICAgbVdpZHRoID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1IZWlnaHQgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVByaW1hcmllcyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworfTsKKworY2xhc3MgRGF0YVNwYWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp0dXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yUmFuZ2UgKi8gQ0E6OlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbWFyaWVzICovIENBOjpQcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xvclRyYW5zZmVyICovIENBOjpUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdjBfYW5kcm9pZF9kYXRhc3BhY2UgKi8gYW5kcm9pZF9kYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmRyb2lkX2RhdGFzcGFjZSAqLyBhbmRyb2lkX2RhdGFzcGFjZT4+IHsKKyAgcHVibGljOgorICAgIERhdGFTcGFjZVRlc3QoKSB7CisgICAgICAgIG1SYW5nZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1EYXRhU3BhY2VWMCA9IHN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpOworICAgICAgICBtRGF0YVNwYWNlID0gc3RkOjpnZXQ8NT4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIENBOjpSYW5nZSBtUmFuZ2U7CisgICAgQ0E6OlByaW1hcmllcyBtUHJpbWFyaWVzOworICAgIENBOjpUcmFuc2ZlciBtVHJhbnNmZXI7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2VWMDsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtRGF0YVNwYWNlOworfTsKKworVEVTVF9QKENvbG9yUmFuZ2VUZXN0LCBXcmFwQ29sb3JSYW5nZVRlc3QpIHsKKyAgICBpbnQzMl90IHJhbmdlID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclJhbmdlKG1SYW5nZSk7CisgICAgQ0E6OlJhbmdlIHVud3JhcHBlZFJhbmdlOworICAgIHN0YXR1c190IHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKHJhbmdlLCAmdW53cmFwcGVkUmFuZ2UpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAidW53cmFwcGluZyBDb2xvckFzcGVjdHMgZnJvbSBDb2xvclJhbmdlIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKHVud3JhcHBlZFJhbmdlLCBtUmFuZ2UpIDw8ICJSZXR1cm5lZCBDb2xvclJhbmdlIGRvZXNuJ3QgbWF0Y2giOworICAgIEFMT0dWKCJ0b1N0cmluZyB0ZXN0OiBSYW5nZTogJXMiLCBhc1N0cmluZyhtUmFuZ2UsICJkZWZhdWx0IikpOworfQorCitURVNUX1AoQ29sb3JUcmFuc2ZlclRlc3QsIFdyYXBDb2xvclRyYW5zZmVyVGVzdCkgeworICAgIGludDMyX3QgdHJhbnNmZXIgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yVHJhbnNmZXIobVRyYW5zZmVyKTsKKyAgICBDQTo6VHJhbnNmZXIgdW53cmFwcGVkVHJhbnNmZXI7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIodHJhbnNmZXIsICZ1bndyYXBwZWRUcmFuc2Zlcik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIENvbG9yQXNwZWN0cyBmcm9tIENvbG9yVHJhbnNmZXIgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEodW53cmFwcGVkVHJhbnNmZXIsIG1UcmFuc2ZlcikgPDwgIlJldHVybmVkIENvbG9yVHJhbnNmZXIgZG9lc24ndCBtYXRjaCI7CisgICAgQUxPR1YoInRvU3RyaW5nIHRlc3Q6IFRyYW5zZmVyOiAlcyIsIGFzU3RyaW5nKG1UcmFuc2ZlciwgImRlZmF1bHQiKSk7Cit9CisKK1RFU1RfUChDb2xvclN0YW5kYXJkVGVzdCwgV3JhcENvbG9yU3RhbmRhcmRUZXN0KSB7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZChtUHJpbWFyaWVzLCBtTWF0cml4Q29lZmZzKTsKKyAgICBDQTo6UHJpbWFyaWVzIHVud3JhcHBlZFByaW1hcmllczsKKyAgICBDQTo6TWF0cml4Q29lZmZzIHVud3JhcHBlZE1hdHJpeENvZWZmczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZChzdGFuZGFyZCwgJnVud3JhcHBlZFByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW53cmFwcGVkTWF0cml4Q29lZmZzKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgInVud3JhcHBpbmcgQ29sb3JBc3BlY3RzIGZyb20gQ29sb3JTdGFuZGFyZCBmYWlsZWQiOworICAgIEVYUEVDVF9FUSh1bndyYXBwZWRQcmltYXJpZXMsIG1QcmltYXJpZXMpIDw8ICJSZXR1cm5lZCBwcmltYXJpZXMgZG9lc24ndCBtYXRjaCI7CisgICAgRVhQRUNUX0VRKHVud3JhcHBlZE1hdHJpeENvZWZmcywgbU1hdHJpeENvZWZmcykgPDwgIlJldHVybmVkICBtYXRyaXhDb2VmZnMgZG9lc24ndCBtYXRjaCI7Cit9CisKK1RFU1RfUChDb2xvckFzcGVjdHNUZXN0LCBQbGF0Zm9ybUFzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IHJhbmdlID0gLTE7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IC0xOworICAgIGludDMyX3QgdHJhbnNmZXIgPSAtMTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhhc3BlY3RzLCAmcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiQ29udmVyc2lvbiBvZiBDb2xvckFzcGVjdHMgdG8gUGxhdGZvcm1Bc3BlY3RzIGZhaWxlZCI7CisKKyAgICBDQSByZXR1cm5lZEFzcGVjdHM7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydFBsYXRmb3JtQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMocmFuZ2UsIHN0YW5kYXJkLCB0cmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZEFzcGVjdHMpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiQ29udmVyc2lvbiBvZiBQbGF0Zm9ybUFzcGVjdHMgdG8gQ29sb3JBc3BlY3RzIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKQorICAgICAgICAgICAgPDwgInJhbmdlIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gUGxhdGZvcm1Bc3BlY3RzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1QcmltYXJpZXMsIGFzcGVjdHMubVByaW1hcmllcykKKyAgICAgICAgICAgIDw8ICJwcmltYXJpZXMgbWlzbWF0Y2ggZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBQbGF0Zm9ybUFzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpCisgICAgICAgICAgICA8PCAibWF0cml4Q29lZmZzIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gUGxhdGZvcm1Bc3BlY3RzIjsKK30KKworVEVTVF9QKENvbG9yQXNwZWN0c1Rlc3QsIElzb0FzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IHByaW1hcmllcyA9IC0xOworICAgIGludDMyX3QgY29sb3JUcmFuc2ZlciA9IC0xOworICAgIGludDMyX3QgbWF0cml4Q29lZmZzID0gLTE7CisgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoYXNwZWN0cywgJnByaW1hcmllcywgJmNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRyaXhDb2VmZnMsICZmdWxsUmFuZ2UpOworCisgICAgQ0EgcmV0dXJuZWRBc3BlY3RzOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhwcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsIG1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFJhbmdlLCByZXR1cm5lZEFzcGVjdHMpOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVJhbmdlLCBhc3BlY3RzLm1SYW5nZSkKKyAgICAgICAgICAgIDw8ICJyYW5nZSBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgYXNwZWN0cy5tTWF0cml4Q29lZmZzKQorICAgICAgICAgICAgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworfQorCitURVNUX1AoSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0LCBJc29Bc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IGlzb1ByaW1hcmllcyA9IC0xOworICAgIGludDMyX3QgaXNvVHJhbnNmZXIgPSAtMTsKKyAgICBpbnQzMl90IGlzb01hdHJpeENvZWZmcyA9IC0xOworICAgIGJvb2wgZnVsbHJhbmdlID0gZmFsc2U7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKGFzcGVjdHMsICZpc29QcmltYXJpZXMsICZpc29UcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzb01hdHJpeENvZWZmcywgJmZ1bGxyYW5nZSk7CisKKyAgICBpbnQzMl90IHJhbmdlID0gLTE7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IC0xOworICAgIGludDMyX3QgdHJhbnNmZXIgPSAtMTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoaXNvUHJpbWFyaWVzLCBpc29UcmFuc2ZlciwgaXNvTWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscmFuZ2UsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIGlmIChmdWxscmFuZ2UpIHsKKyAgICAgICAgRVhQRUNUX0VRKHJhbmdlLCBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUZ1bGwpCisgICAgICAgICAgICAgICAgPDwgInJhbmdlIGluY29ycmVjdCBjb252ZXJ0aW5nIHRvIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgfQorICAgIEVYUEVDVF9FUShzdGFuZGFyZCwgbVBsYXRmb3JtU3RhbmRhcmQpIDw8ICJzdGFuZGFyZCBpbmNvcnJlY3QgY29udmVydGluZyB0byBQbGF0Zm9ybUFzcGVjdHMiOworICAgIEVYUEVDVF9FUSh0cmFuc2ZlciwgbVBsYXRmb3JtVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBpbmNvcnJlY3QgY29udmVydGluZyB0byBQbGF0Zm9ybUFzcGVjdHMiOworfQorCitURVNUX1AoQ29sb3JBc3BlY3RzVGVzdCwgUGFja0NvbG9yQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKyAgICB1aW50MzJfdCBwYWNrZWRDb2xvckFzcGVjdHMgPSBDb2xvclV0aWxzOjpwYWNrVG9VMzIoYXNwZWN0cyk7CisKKyAgICBDQSB1bnBhY2tlZEFzcGVjdHMgPSBDb2xvclV0aWxzOjp1bnBhY2tUb0NvbG9yQXNwZWN0cyhwYWNrZWRDb2xvckFzcGVjdHMpOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVJhbmdlLCBtUmFuZ2UpIDw8ICJyYW5nZSBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVByaW1hcmllcywgbVByaW1hcmllcykgPDwgInByaW1hcmllcyBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVRyYW5zZmVyLCBtVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubU1hdHJpeENvZWZmcywgbU1hdHJpeENvZWZmcykKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2ggYWZ0ZXIgdW5wYWNraW5nIjsKKyAgICBBTE9HVigidG9TdHJpbmcgdGVzdDogU3RhbmRhcmQ6ICVzIiwgYXNTdHJpbmcobVN0YW5kYXJkLCAiZGVmYXVsdCIpKTsKK30KKworVEVTVF9QKERlZmF1bHRDb2xvckFzcGVjdHNUZXN0LCBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBDQTo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisKKyAgICBDb2xvclV0aWxzOjpzZXREZWZhdWx0Q29kZWNDb2xvckFzcGVjdHNJZk5lZWRlZChhc3BlY3RzLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1SYW5nZSwgQ0E6OlJhbmdlTGltaXRlZCkgPDwgInJhbmdlIG5vdCBzZXQgdG8gZGVmYXVsdCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVByaW1hcmllcywgbVByaW1hcmllcykgPDwgInByaW1hcmllcyBub3Qgc2V0IHRvIGRlZmF1bHQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1NYXRyaXhDb2VmZnMsIG1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbm90IHNldCB0byBkZWZhdWx0IjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tVHJhbnNmZXIsIENBOjpUcmFuc2ZlclNNUFRFMTcwTSkgPDwgInRyYW5zZmVyIG5vdCBzZXQgdG8gZGVmYXVsdCI7Cit9CisKK1RFU1RfUChEYXRhU3BhY2VUZXN0LCBEYXRhU3BhY2VUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgZmFsc2UpOworICAgIEVYUEVDVF9FUShkYXRhU3BhY2UsIG1EYXRhU3BhY2UpIDw8ICJSZXR1cm5lZCBpbmNvcnJlY3QgZGF0YXNwYWNlIjsKKworICAgIGJvb2wgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydERhdGFTcGFjZVRvVjAoZGF0YVNwYWNlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJSZXR1cm5lZCB2MCBkYXRhc3BhY2UgaXMgbm90IGFzcGVjdC1vbmx5IjsKKyAgICBFWFBFQ1RfRVEoZGF0YVNwYWNlLCBtRGF0YVNwYWNlVjApIDw8ICJSZXR1cm5lZCBpbmNvcnJlY3QgdjAgZGF0YXNwYWNlIjsKK30KKworVEVTVChDb2xvclV0aWxzVW5pdFRlc3QsIEFzcGVjdHNDaGFuZ2VkVGVzdCkgeworICAgIENBIG9yaWdBc3BlY3RzOworICAgIG9yaWdBc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VGdWxsOworICAgIG9yaWdBc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81OworICAgIG9yaWdBc3BlY3RzLm1UcmFuc2ZlciA9IENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXI7CisgICAgb3JpZ0FzcGVjdHMubU1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzU7CisKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUZ1bGw7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNTsKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNTsKKworICAgIGJvb2wgc3RhdHVzID0gQ29sb3JVdGlsczo6Y2hlY2tJZkFzcGVjdHNDaGFuZ2VkQW5kVW5zcGVjaWZ5VGhlbShhc3BlY3RzLCBvcmlnQXNwZWN0cyk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OmNoZWNrSWZBc3BlY3RzQ2hhbmdlZEFuZFVuc3BlY2lmeVRoZW0oYXNwZWN0cywgb3JpZ0FzcGVjdHMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlVW5zcGVjaWZpZWQpIDw8ICJyYW5nZSBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VGdWxsOworCisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQjsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckFzcGVjdHMgY29tcGFyaXNvbiBjaGVjayBmYWlsZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgInRyYW5zZmVyIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcjsKKworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMDsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzLCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckFzcGVjdHMgY29tcGFyaXNvbiBjaGVjayBmYWlsZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7CisKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME07CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Y2hlY2tJZkFzcGVjdHNDaGFuZ2VkQW5kVW5zcGVjaWZ5VGhlbShhc3BlY3RzLCBvcmlnQXNwZWN0cywgdHJ1ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JBc3BlY3RzIGNvbXBhcmlzb24gY2hlY2sgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJwcmltYXJpZXMgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4VW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAibWF0cml4Q29lZmZzIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgQ29sb3JDb25maWdGcm9tRm9ybWF0VGVzdCkgeworICAgIGludCByYW5nZSA9IC0xOworICAgIGludCBzdGFuZGFyZCA9IC0xOworICAgIGludCB0cmFuc2ZlciA9IC0xOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KGZvcm1hdCwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX0VRKHJhbmdlIHwgc3RhbmRhcmQgfCB0cmFuc2ZlciwgMCkgPDwgImNvbG9yIGNvbmZpZyBkaWRuJ3QgZGVmYXVsdCB0byAwIjsKKworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1JBTkdFLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpOworICAgIENvbG9yVXRpbHM6OmdldENvbG9yQ29uZmlnRnJvbUZvcm1hdChmb3JtYXQsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9FUShyYW5nZSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHN0YW5kYXJkLCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpIDw8ICJzdGFuZGFyZCBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKSA8PCAidHJhbnNmZXIgbWlzbWF0Y2giOworCisgICAgcmFuZ2UgPSBzdGFuZGFyZCA9IHRyYW5zZmVyID0gLTE7CisgICAgc3A8QU1lc3NhZ2U+IGNvcHlGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoY29weUZvcm1hdCwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQU1lc3NhZ2UiOworICAgIENvbG9yVXRpbHM6OmNvcHlDb2xvckNvbmZpZyhmb3JtYXQsIGNvcHlGb3JtYXQpOworICAgIGJvb2wgc3RhdHVzID0gY29weUZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9SQU5HRSwgJnJhbmdlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckNvbmZpZyByYW5nZSBlbnRyeSBtaXNzaW5nIjsKKyAgICBzdGF0dXMgPSBjb3B5Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmc3RhbmRhcmQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQ29uZmlnIHN0YW5kYXJkIGVudHJ5IG1pc3NpbmciOworICAgIHN0YXR1cyA9IGNvcHlGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZ0cmFuc2Zlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JDb25maWcgdHJhbnNmZXIgZW50cnkgbWlzc2luZyI7CisgICAgRVhQRUNUX0VRKHJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCkgPDwgInJhbmdlIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEoc3RhbmRhcmQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSkgPDwgInN0YW5kYXJkIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaGQiOworCisgICAgcmFuZ2UgPSBzdGFuZGFyZCA9IHRyYW5zZmVyID0gLTE7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KGNvcHlGb3JtYXQsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9FUShyYW5nZSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHN0YW5kYXJkLCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpIDw8ICJzdGFuZGFyZCBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKSA8PCAidHJhbnNmZXIgbWlzbWF0Y2giOworfQorCitURVNUX1AoQ29sb3JBc3BlY3RzVGVzdCwgRm9ybWF0VGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIEFNZXNzYWdlIjsKKyAgICBDb2xvclV0aWxzOjpzZXRDb2xvckFzcGVjdHNJbnRvRm9ybWF0KGFzcGVjdHMsIGZvcm1hdCwgdHJ1ZSk7CisKKyAgICBDQSByZXR1cm5lZEFzcGVjdHM7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChmb3JtYXQsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKSA8PCAicmFuZ2UgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgYXNwZWN0cy5tVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2giOworCisgICAgYXNwZWN0cy5tUmFuZ2UgPSBtUmFuZ2U7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gbVByaW1hcmllczsKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IG1UcmFuc2ZlcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBtTWF0cml4Q29lZmZzOworICAgIENvbG9yVXRpbHM6OnNldENvbG9yQXNwZWN0c0ludG9Gb3JtYXQoYXNwZWN0cywgZm9ybWF0KTsKKworICAgIG1lbXNldCgmcmV0dXJuZWRBc3BlY3RzLCAwLCBzaXplb2YocmV0dXJuZWRBc3BlY3RzKSk7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChmb3JtYXQsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKSA8PCAicmFuZ2UgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgYXNwZWN0cy5tVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2giOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgSERSU3RhdGljSW5mb1Rlc3QpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQU1lc3NhZ2UiOworCisgICAgSERSU3RhdGljSW5mbyByZXR1cm5lZEluZm9IRFI7CisgICAgYm9vbCBzdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZyZXR1cm5lZEluZm9IRFIpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJIRFIgaW5mbyBzaG91bGQgYmUgYWJzZW50IGluIGVtcHR5IGZvcm1hdCI7CisKKyAgICBIRFJTdGF0aWNJbmZvIGluZm9IRFI7CisgICAgaW5mb0hEUi5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIGluZm9IRFIuc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0ga0hEUkluZm9UZXN0VmFsdWUxOworICAgIGluZm9IRFIuc1R5cGUxLm1SLnggPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubVIueSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBpbmZvSERSLnNUeXBlMS5tRy54ID0ga0hEUkluZm9UZXN0VmFsdWUxOworICAgIGluZm9IRFIuc1R5cGUxLm1HLnkgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubUIueCA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tQi55ID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIGluZm9IRFIuc1R5cGUxLm1XLnggPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubVcueSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChpbmZvSERSLCBmb3JtYXQpOworCisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmcmV0dXJuZWRJbmZvSERSKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IEhEUiBpbmZvIGZyb20gZm9ybWF0IjsKKyAgICBBU1NFUlRfRVEoMCwgbWVtY21wKCZyZXR1cm5lZEluZm9IRFIsICZpbmZvSERSLCBzaXplb2YoaW5mb0hEUikpKSA8PCAiIEhEUlN0YXRpY0luZm8gbWlzbWF0Y2giOworCisgICAgQU1lZGlhRm9ybWF0ICptZWRpYUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUobWVkaWFGb3JtYXQsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIEFNZWRpYUZvcm1hdCI7CisgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoaW5mb0hEUiwgbWVkaWFGb3JtYXQpOworICAgIG1lbXNldCgmcmV0dXJuZWRJbmZvSERSLCAwLCBzaXplb2YocmV0dXJuZWRJbmZvSERSKSk7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobWVkaWFGb3JtYXQtPm1Gb3JtYXQsICZyZXR1cm5lZEluZm9IRFIpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobWVkaWFGb3JtYXQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgSERSIGluZm8gZnJvbSBtZWRpYSBmb3JtYXQiOworICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAoJnJldHVybmVkSW5mb0hEUiwgJmluZm9IRFIsIHNpemVvZihpbmZvSERSKSkpIDw8ICIgSERSU3RhdGljSW5mbyBtaXNtYXRjaCI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBTYW5pdHlUZXN0KSB7CisgICAgQ0E6OlByaW1hcmllcyB1bm1hcHBlZFByaW1hcmllcyA9IChDQTo6UHJpbWFyaWVzKShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNPdGhlciArIDEpOworICAgIENBOjpNYXRyaXhDb2VmZnMgdW5tYXBwZWRNYXRyaXhDb2VmZnMgPSAoQ0E6Ok1hdHJpeENvZWZmcykoQ0E6Ok1hdHJpeE90aGVyICsgMSk7CisgICAgaW50MzJfdCBjb2xvclN0YW5kYXJkID0KKyAgICAgICAgICAgIENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZCh1bm1hcHBlZFByaW1hcmllcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCB1bnNwZWNpZmllZCBleHBlY3RlZCI7CisgICAgY29sb3JTdGFuZGFyZCA9CisgICAgICAgICAgICBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQoQ0E6OlByaW1hcmllc090aGVyLCB1bm1hcHBlZE1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX0VRKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiU3RhbmRhcmQgdW5zcGVjaWZpZWQgZXhwZWN0ZWQiOworICAgIGNvbG9yU3RhbmRhcmQgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQoQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeEJUMjAyMCk7CisgICAgRVhQRUNUX0dFKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRXh0ZW5kZWRTdGFydCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCBncmVhdGVyIHRoYW4gZXh0ZW5kZWQgc3RhcnQgZXhwZWN0ZWQiOworICAgIHVubWFwcGVkUHJpbWFyaWVzID0gKENBOjpQcmltYXJpZXMpKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCArIDEpOworICAgIHVubWFwcGVkTWF0cml4Q29lZmZzID0gKENBOjpNYXRyaXhDb2VmZnMpKENBOjpNYXRyaXhCVDIwMjBDb25zdGFudCArIDEpOworICAgIGNvbG9yU3RhbmRhcmQgPQorICAgICAgICAgICAgQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHVubWFwcGVkUHJpbWFyaWVzLCB1bm1hcHBlZE1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX0dFKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRXh0ZW5kZWRTdGFydCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCBncmVhdGVyIHRoYW4gZXh0ZW5kZWQgc3RhcnQgZXhwZWN0ZWQiOworCisgICAgQ0EgYXNwZWN0czsKKyAgICBpbnQzMl90IGNvbG9yUmFuZ2UgPSAtMTsKKyAgICBjb2xvclN0YW5kYXJkID0gLTE7CisgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gKENBOjpQcmltYXJpZXMpKENBOjpQcmltYXJpZXM6OlByaW1hcmllc090aGVyICsgMSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICBhc3BlY3RzLCAmY29sb3JSYW5nZSwgJmNvbG9yU3RhbmRhcmQsICZjb2xvclRyYW5zZmVyKTsKKyAgICBFWFBFQ1RfTkUoc3RhdHVzLCBPSykgPDwgImludmFsaWQgY29sb3JBc3BlY3RzIHZhbHVlIGFjY2VwdGVkIjsKKworICAgIGludDMyX3QgY29sb3JQcmltYXJpZXMgPSAtMTsKKyAgICBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgaW50MzJfdCBjb2xvck1hdHJpeENvZWZmcyA9IC0xOworICAgIGJvb2wgZnVsbFJhbmdlID0gZmFsc2U7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc090aGVyOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyT3RoZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeE90aGVyOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvSXNvQXNwZWN0cyhhc3BlY3RzLCAmY29sb3JQcmltYXJpZXMsICZjb2xvclRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JNYXRyaXhDb2VmZnMsICZmdWxsUmFuZ2UpOworICAgIENBIHJldHVybmVkQXNwZWN0czsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoY29sb3JQcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWF0cml4Q29lZmZzLCBmdWxsUmFuZ2UsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgUHJpbWFyaWVzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgVHJhbnNmZXIiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIE1hdHJpeENvZWZmcyI7CisKKyAgICAvLyBpbnZhbGlkIHZhbHVlcywgb3RoZXIgdmFsdWUgZXF1YWxzIDB4RkYKKyAgICBjb2xvclByaW1hcmllcyA9IENBOjpQcmltYXJpZXNPdGhlcjsKKyAgICBjb2xvclRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyT3RoZXI7CisgICAgY29sb3JNYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4T3RoZXI7CisgICAgZnVsbFJhbmdlID0gZmFsc2U7CisgICAgbWVtc2V0KCZyZXR1cm5lZEFzcGVjdHMsIDAsIHNpemVvZihyZXR1cm5lZEFzcGVjdHMpKTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoY29sb3JQcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWF0cml4Q29lZmZzLCBmdWxsUmFuZ2UsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgUHJpbWFyaWVzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgVHJhbnNmZXIiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIE1hdHJpeENvZWZmcyI7CisKKyAgICBDQTo6UHJpbWFyaWVzIHByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhVbnNwZWNpZmllZDsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZChDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFZlbmRvclN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJpZXMsICZtYXRyaXhDb2VmZnMpOworICAgIEVYUEVDVF9FUShzdGF0dXMsIE9LKSA8PCAidW53cmFwcGluZyBhc3BlY3RzIGZyb20gY29sb3Igc3RhbmRhcmQgZmFpbGVkIjsKKworICAgIHByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBtYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yU3RhbmRhcmQoCisgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFZlbmRvclN0YXJ0ICogNCwgJnByaW1hcmllcywgJm1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX05FKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIGFzcGVjdHMgZnJvbSBjb2xvciBzdGFuZGFyZCBmYWlsZWQiOworCisgICAgY29sb3JSYW5nZSA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JSYW5nZSgoQ0E6OlJhbmdlKShDQTo6UmFuZ2VPdGhlciArIDEpKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JSYW5nZSwgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZCkgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIGNvbG9yIHJhbmdlIjsKKworICAgIENBOjpSYW5nZSByYW5nZTsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JSYW5nZSgKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclJhbmdlVmVuZG9yU3RhcnQgKyBDQTo6UmFuZ2VPdGhlciArIDEsICZyYW5nZSk7CisgICAgRVhQRUNUX05FKHN0YXR1cywgT0spIDw8ICJpbnZhbGlkIHJhbmdlIHZhbHVlIGFjY2VwdGVkIjsKKyAgICBFWFBFQ1RfRVEocmFuZ2UsIENBOjpSYW5nZU90aGVyKSA8PCAicmV0dXJuZWQgdW5leHBlY3RlZCByYW5nZSB2YWx1ZSI7CisKKyAgICBjb2xvclRyYW5zZmVyID0KKyAgICAgICAgICAgIENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JUcmFuc2ZlcigoQ0E6OlRyYW5zZmVyKShDQTo6VHJhbnNmZXJPdGhlciArIDEpKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JUcmFuc2ZlciwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBjb2xvciB0cmFuc2ZlciI7CisKKyAgICBDQTo6VHJhbnNmZXIgdHJhbnNmZXI7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIoCisgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclZlbmRvclN0YXJ0ICsgQ0E6OlRyYW5zZmVyT3RoZXIgKyAxLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9ORShzdGF0dXMsIE9LKSA8PCAiaW52YWxpZCB0cmFuc2ZlciB2YWx1ZSBhY2NlcHRlZCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXJPdGhlcikgPDwgImV4cGVjdGVkIG90aGVyIGNvbG9yIHRyYW5zZmVyIjsKK30KKworVEVTVChDb2xvclV0aWxzVW5pdFRlc3QsIEhEUkluZm9TYW5pdHlUZXN0KSB7CisgICAgSERSU3RhdGljSW5mbyBoZHJJbmZvOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisKKyAgICBib29sIGJvb2xTdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZoZHJJbmZvKTsKKyAgICBFWFBFQ1RfRkFMU0UoYm9vbFN0YXR1cykgPDwgIkhEUlN0YXRpY0luZm8gc2hvdWxkIG5vdCBiZSBwcmVzZW50IjsKKworICAgIHNwPEFCdWZmZXI+IGludmFsaWRTaXplSERSSW5mb0J1ZmZlciA9IG5ldyBBQnVmZmVyKGtIRFJCdWZmZXJTaXplIC0gMSk7CisgICAgQVNTRVJUX05FKGludmFsaWRTaXplSERSSW5mb0J1ZmZlciwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQUJ1ZmZlciI7CisgICAgZm9ybWF0LT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgaW52YWxpZFNpemVIRFJJbmZvQnVmZmVyKTsKKyAgICBtZW1zZXQoJmhkckluZm8sIDAsIHNpemVvZihoZHJJbmZvKSk7CisgICAgYm9vbFN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmhkckluZm8pOworICAgIEVYUEVDVF9GQUxTRShib29sU3RhdHVzKSA8PCAiaW5jb3JyZWN0IEhEUlN0YXRpY0luZm8gYnVmZmVyIGFjY2VwdGVkIjsKKworICAgIHNwPEFCdWZmZXI+IGludmFsaWRIRFJJbmZvQnVmZmVyID0gbmV3IEFCdWZmZXIoa0hEUkJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9ORShpbnZhbGlkSERSSW5mb0J1ZmZlciwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQUJ1ZmZlciI7CisgICAgdWludDhfdCAqZGF0YSA9IGludmFsaWRIRFJJbmZvQnVmZmVyLT5kYXRhKCk7CisgICAgKmRhdGEgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEgKyAxOworICAgIGZvcm1hdC0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIGludmFsaWRIRFJJbmZvQnVmZmVyKTsKKyAgICBtZW1zZXQoJmhkckluZm8sIDAsIHNpemVvZihoZHJJbmZvKSk7CisgICAgYm9vbFN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmhkckluZm8pOworICAgIEVYUEVDVF9GQUxTRShib29sU3RhdHVzKSA8PCAiaW5jb3JyZWN0IEhEUlN0YXRpY0luZm8gYnVmZmVyIGFjY2VwdGVkIjsKKworICAgIENBIGFzcGVjdHM7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfUkFOR0UsIENvbG9yVXRpbHM6OmtDb2xvclJhbmdlVmVuZG9yU3RhcnQgKyBDQTo6UmFuZ2VPdGhlciArIDEpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1RSQU5TRkVSLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKTsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGZvcm1hdCwgYXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVJhbmdlLCBDQTo6UmFuZ2VPdGhlcikgPDwgInVuZXhwZWN0ZWQgcmFuZ2UiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgRGF0YVNwYWNlU2FuaXR5VGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBDQTo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUpOworICAgIEVYUEVDVF9FUShkYXRhU3BhY2UsIDApIDw8ICJleHBlY3RlZCBpbnZhbGlkIGRhdGFzcGFjZSI7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhCVDIwMjBDb25zdGFudDsKKyAgICBkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSk7CisgICAgRVhQRUNUX05FKGRhdGFTcGFjZSwgMCkgPDwgInVuZXhwZWN0ZWQgdmFsdWUiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQ29sb3JVdGlsc1VuaXRUZXN0LCBDb2xvclJhbmdlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yUmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpSYW5nZTo6UmFuZ2VVbnNwZWNpZmllZCwgQ0E6OlJhbmdlOjpSYW5nZU90aGVyKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yVHJhbnNmZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3JUcmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNSR0IsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyR2FtbWEyMiwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckdhbW1hMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1QyMDg0LCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVySExHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMjQwTSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2Zlclh2WUNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckJUMTM2MSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNUNDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2Zlck90aGVyKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQ29sb3JVdGlsc1VuaXRUZXN0LCBDb2xvclN0YW5kYXJkVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUHJpbWFyaWVzLCBNYXRyaXhDb2VmZnMKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhVbnNwZWNpZmllZCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjApLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0dlbmVyaWNGaWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yQXNwZWN0c1Rlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIFByaW1hcmllcywgQ29sb3JUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCBDb2xvclJhbmdlLCBDb2xvclN0YW5kYXJkCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFVuc3BlY2lmaWVkLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRVbnNwZWNpZmllZCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJHYW1tYTIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJHYW1tYTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME0sIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ0NzBNKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1QyMDg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjAsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVySExHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDYwMV81MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDQ3MF82TSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNHZW5lcmljRmlsbSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNjAxXzYyNSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIElzb1RvUGxhdGZvcm1Bc3BlY3RzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUHJpbWFyaWVzLCBUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCBTdGFuZGFyZCwgVHJhbnNmZXIKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkLCBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkLCBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNzA5XzUsIENBOjpUcmFuc2ZlckxpbmVhciwgQ0E6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDksIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyTGluZWFyKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNjI1LCBDQTo6VHJhbnNmZXJTUkdCLCBDQTo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyU1JHQiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDYwMV82XzYyNSwgQ0E6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjVfVW5hZGp1c3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTTVBURV8xNzBNKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LCBDQTo6VHJhbnNmZXJHYW1tYTIyLCBDQTo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyR2FtbWEyMiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6OlRyYW5zZmVyR2FtbWEyOCwgQ0E6Ok1hdHJpeFNNUFRFMjQwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjVfVW5hZGp1c3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJHYW1tYTI4KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUMjAyMCwgQ0E6OlRyYW5zZmVyU1QyMDg0LCBDQTo6TWF0cml4QlQyMDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUMjAyMCwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTVDIwODQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXJITEcsIENBOjpNYXRyaXhCVDIwMjBDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDIwMjBDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJITEcpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ0NzBfNk0sIENBOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDQTo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ0NzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0dlbmVyaWNGaWxtLCBDQTo6VHJhbnNmZXJMaW5lYXIsIENBOjpNYXRyaXhCVDIwMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRmlsbSwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJMaW5lYXIpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQ29sb3JVdGlsc1VuaXRUZXN0LCBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gV2lkdGgsIEhlaWdodCwgUHJpbWFyaWVzLCBNYXRyaXhDb2VmZnMKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoMzg0MCwgMzg0MCwgQ0E6OlByaW1hcmllc0JUMjAyMCwgQ0E6Ok1hdHJpeEJUMjAyMCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKDcyMCwgNTc2LCBDQTo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsIENBOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoNDgwLCAzNjAsIENBOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSg0ODAsIDE5MjAsIENBOjpQcmltYXJpZXNCVDcwOV81LCBDQTo6TWF0cml4QlQ3MDlfNSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIERhdGFTcGFjZVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIENvbG9yUmFuZ2UsIFByaW1hcmllcywgQ29sb3JUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCB2MF9hbmRyb2lkX2RhdGFzcGFjZSwKKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkX2RhdGFzcGFjZQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNSR0IsIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfU1JHQiwgSEFMX0RBVEFTUEFDRV9TUkdCKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ3MDksIEhBTF9EQVRBU1BBQ0VfQlQ3MDkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9TUkdCX0xJTkVBUiwgSEFMX0RBVEFTUEFDRV9TUkdCX0xJTkVBUiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzYyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV82MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfSkZJRiwgSEFMX0RBVEFTUEFDRV9KRklGKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNDcwXzZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzYyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV82MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV82MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNjI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDcwOSwgSEFMX0RBVEFTUEFDRV9CVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ3MDksIEhBTF9EQVRBU1BBQ0VfQlQ3MDkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNjI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzYyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSkpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggZGIzN2ZlOS4uZTM0NTA0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTUsNyArNSw5IEBACiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKQEAgLTE5LDYgKzIxLDEyIEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCBlOTdmNmViLi41NTA5NTEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtODEzLDEwICs4MTMsNiBAQAogICAgICAgICAgICAgICAgIGJhc2VTaXplID0gVTMyX0FUKCZtUGFyZW50Lm1EYXRhW21PZmZzZXQgKyA0XSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChiYXNlU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAvLyBQcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cgd2hlbiBhZGRpbmcKICAgICAgICAgICAgIGlmIChTSVpFX01BWCAtIDEwIDw9IGJhc2VTaXplKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3MGQyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwyNCBAQAorLy8gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMKK3sKKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJJRDNUZXN0IiB9CisgIF0sCisKKyAgInByZXN1Ym1pdCI6IFsKKyAgICAvLyB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBydW4gYW55IHRlc3RzLgorICAgIC8vIGJ1dDogY3RzLXRyYWRlZmVkIHJ1biAtbSBDdHNNZWRpYVRlc3RDYXNlcyAtdCBhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdAorICAgIC8vIGRvZXMgcnVuIGhlIDMyIGFuZCA2NCBiaXQgdGVzdHMsIGJ1dCBub3QgdGhlIGluc3RhbnQgdGVzdHMKKyAgICAvLyBidXQgYWxsIEkga25vdyBpcyB0aGF0IHdpdGggJ2F0ZXN0JywgaXQncyBub3QgcnVubmluZworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICAgIHsKKyAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdCIKKyAgICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZC5icAppbmRleCA5ZDI2ZWVjLi5hY2YzOGUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDcgQEAKIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIklEM1Rlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogICAgIGd0ZXN0OiB0cnVlLAogCiAgICAgc3JjczogWyJJRDNUZXN0LmNwcCJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmluZGV4IDZjNjY5N2QuLmQ2ZWE0NzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iSUQzVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0lEM1Rlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC0xLjEuemlwP3VuemlwPXRydWUiCiAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0lEM1Rlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9JRDNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwCmluZGV4IGNkNWNkOWUuLjhkYjgzY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwCkBAIC01MSw3ICs1MSw3IEBACiAgICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKICAgICAgICAgU3RyaW5nOCBpZDsKICAgICAgICAgaXQuZ2V0SUQoJmlkKTsKLSAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKSA8PCAiTm8gSUQgdGFnIGZvdW5kISBcbiI7CisgICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCkgPDwgIkZvdW5kIGFuIElEMyB0YWcgb2YgMCBzaXplIjsKICAgICAgICAgQUxPR1YoIkZvdW5kIElEIHRhZzogJXNcbiIsIFN0cmluZzgoaWQpLmNfc3RyKCkpOwogICAgICAgICBpdC5uZXh0KCk7CiAgICAgfQpAQCAtNjYsOCArNjYsOCBAQAogICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKGZpbGUtPndyYXAoKSk7CiAgICAgSUQzIHRhZygmaGVscGVyKTsKICAgICBBU1NFUlRfVFJVRSh0YWcuaXNWYWxpZCgpKSA8PCAiTm8gdmFsaWQgSUQzIHRhZyBmb3VuZCBmb3IgIiA8PCBwYXRoLmNfc3RyKCkgPDwgIlxuIjsKLSAgICBBU1NFUlRfVFJVRSh0YWcudmVyc2lvbigpID49IHZlcnNpb25OdW1iZXIpCi0gICAgICAgICAgICA8PCAiRXhwZWN0ZWQgdmVyc2lvbjogIiA8PCB0YWcudmVyc2lvbigpIDw8ICIgRm91bmQgdmVyc2lvbjogIiA8PCB2ZXJzaW9uTnVtYmVyOworICAgIEFTU0VSVF9FUSh0YWcudmVyc2lvbigpLCB2ZXJzaW9uTnVtYmVyKQorICAgICAgICAgICAgPDwgIkZvdW5kIHZlcnNpb246ICIgPDwgdGFnLnZlcnNpb24oKSA8PCAiIEV4cGVjdGVkIHZlcnNpb246ICIgPDwgdmVyc2lvbk51bWJlcjsKIH0KIAogVEVTVF9QKElEM3RleHRUYWdUZXN0LCBUZXh0VGFnVGVzdCkgewpAQCAtODEsMTcgKzgxLDM0IEBACiAgICAgQVNTRVJUX1RSVUUodGFnLmlzVmFsaWQoKSkgPDwgIk5vIHZhbGlkIElEMyB0YWcgZm91bmQgZm9yICIgPDwgcGF0aC5jX3N0cigpIDw8ICJcbiI7CiAgICAgaW50IGNvdW50VGV4dEZyYW1lcyA9IDA7CiAgICAgSUQzOjpJdGVyYXRvciBpdCh0YWcsIG51bGxwdHIpOwotICAgIHdoaWxlICghaXQuZG9uZSgpKSB7Ci0gICAgICAgIFN0cmluZzggaWQ7Ci0gICAgICAgIGl0LmdldElEKCZpZCk7Ci0gICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCk7Ci0gICAgICAgIGlmIChpZFswXSA9PSAnVCcpIHsKLSAgICAgICAgICAgIFN0cmluZzggdGV4dDsKLSAgICAgICAgICAgIGNvdW50VGV4dEZyYW1lcysrOwotICAgICAgICAgICAgaXQuZ2V0U3RyaW5nKCZ0ZXh0KTsKLSAgICAgICAgICAgIEFMT0dWKCJGb3VuZCB0ZXh0IGZyYW1lICVzIDogJXMgXG4iLCBpZC5zdHJpbmcoKSwgdGV4dC5zdHJpbmcoKSk7CisgICAgaWYgKHRhZy52ZXJzaW9uKCkgIT0gSUQzOjpJRDNfVjEgJiYgdGFnLnZlcnNpb24oKSAhPSBJRDM6OklEM19WMV8xKSB7CisgICAgICAgIHdoaWxlICghaXQuZG9uZSgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGlkOworICAgICAgICAgICAgaXQuZ2V0SUQoJmlkKTsKKyAgICAgICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCkgPDwgIkZvdW5kIGFuIElEMyB0YWcgb2YgMCBzaXplIjsKKyAgICAgICAgICAgIGlmIChpZFswXSA9PSAnVCcpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHRleHQ7CisgICAgICAgICAgICAgICAgY291bnRUZXh0RnJhbWVzKys7CisgICAgICAgICAgICAgICAgaXQuZ2V0U3RyaW5nKCZ0ZXh0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiRm91bmQgdGV4dCBmcmFtZSAlcyA6ICVzIFxuIiwgaWQuc3RyaW5nKCksIHRleHQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXQubmV4dCgpOwogICAgICAgICB9Ci0gICAgICAgIGl0Lm5leHQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICAgICAgU3RyaW5nOCBpZDsKKyAgICAgICAgICAgIFN0cmluZzggdGV4dDsKKyAgICAgICAgICAgIGl0LmdldElEKCZpZCk7CisgICAgICAgICAgICBBU1NFUlRfR1QoaWQubGVuZ3RoKCksIDApIDw8ICJGb3VuZCBhbiBJRDMgdGFnIG9mIDAgc2l6ZSI7CisgICAgICAgICAgICBpdC5nZXRTdHJpbmcoJnRleHQpOworICAgICAgICAgICAgLy8gaWYgdGhlIHRhZyBoYXMgYSB2YWx1ZQorICAgICAgICAgICAgaWYgKHN0cmNtcCh0ZXh0LnN0cmluZygpLCAiIikpIHsKKyAgICAgICAgICAgICAgICBjb3VudFRleHRGcmFtZXMrKzsKKyAgICAgICAgICAgICAgICBBTE9HVigiSUQ6ICVzXG4iLCBpZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiVGV4dCBzdHJpbmc6ICVzXG4iLCB0ZXh0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl0Lm5leHQoKTsKKyAgICAgICAgfQogICAgIH0KICAgICBBU1NFUlRfRVEoY291bnRUZXh0RnJhbWVzLCBudW1UZXh0RnJhbWVzKQogICAgICAgICAgICAgPDwgIkV4cGVjdGVkICIgPDwgbnVtVGV4dEZyYW1lcyA8PCAiIHRleHQgZnJhbWVzLCBmb3VuZCAiIDw8IGNvdW50VGV4dEZyYW1lczsKQEAgLTExNCw3ICsxMzEsNyBAQAogICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGFsYnVtIGFydDogc2l6ZSA9ICV6dSBtaW1lID0gJXMgXG4iLCBkYXRhU2l6ZSwgbWltZS5zdHJpbmcoKSk7CiAgICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJFeHBlY3RlZCBhbGJ1bSBhcnQsIGZvdW5kIG5vbmUhIiA8PCBwYXRoOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkV4cGVjdGVkIGFsYnVtIGFydCwgZm91bmQgbm9uZSEgIiA8PCBwYXRoOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFTU0VSVF9FUShkYXRhLCBudWxscHRyKSA8PCAiRm91bmQgYWxidW0gYXJ0IHdoZW4gZXhwZWN0ZWQgbm9uZSEiOwogICAgIH0KQEAgLTEzNyw3ICsxNTQsNyBAQAogICAgIHdoaWxlICghaXQuZG9uZSgpKSB7CiAgICAgICAgIFN0cmluZzggaWQ7CiAgICAgICAgIGl0LmdldElEKCZpZCk7Ci0gICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCk7CisgICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCkgPDwgIkZvdW5kIGFuIElEMyB0YWcgb2YgMCBzaXplIjsKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhZyBpcyBhbiAiQVBJQy9QSUMiIHRhZy4KICAgICAgICAgaWYgKFN0cmluZzgoaWQpID09ICJBUElDIiB8fCBTdHJpbmc4KGlkKSA9PSAiUElDIikgewogICAgICAgICAgICAgY291bnQrKzsKQEAgLTE1MCw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIGhleGR1bXAoZGF0YSwgZGF0YVNpemUgPiAxMjggPyAxMjggOiBkYXRhU2l6ZSk7CiAjZW5kaWYKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRXhwZWN0ZWQgYWxidW0gYXJ0LCBmb3VuZCBub25lISIgPDwgcGF0aDsKKyAgICAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRXhwZWN0ZWQgYWxidW0gYXJ0LCBmb3VuZCBub25lISAiIDw8IHBhdGg7CiAgICAgICAgIH0KICAgICAgICAgaXQubmV4dCgpOwogICAgIH0KQEAgLTE1OSw1NiArMTc2LDY3IEBACiB9CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChpZDNUZXN0QWxsLCBJRDN0YWdUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjX21vcmVUZXh0RnJhbWVzLm1wMyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygiYmJiXzFzZWNfdjIzLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMnNlY192MjQubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMnNlY18yX2ltYWdlLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8yc2VjX2xhcmdlU2l6ZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMXNlY192MjNfM3RhZ3MubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzFzZWNfdjFfNXRhZ3MubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkT25lRnJhbWUubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkQWxsRnJhbWVzLm1wMyIpKTsKIAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAogICAgICAgICBpZDNUZXN0QWxsLCBJRDN2ZXJzaW9uVGVzdCwKLSAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjX21vcmVUZXh0RnJhbWVzLm1wMyIsIDQpKSk7CisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzFzZWNfdjIzLm1wMyIsIElEMzo6SUQzX1YyXzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwgSUQzOjpJRDNfVjJfMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLCBJRDM6OklEM19WMl8zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjQubXAzIiwgSUQzOjpJRDNfVjJfNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLCBJRDM6OklEM19WMl80KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18yX2ltYWdlLm1wMyIsIElEMzo6SUQzX1YyXzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX2xhcmdlU2l6ZS5tcDMiLCBJRDM6OklEM19WMl80KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MjNfM3RhZ3MubXAzIiwgSUQzOjpJRDNfVjJfMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfdjFfNXRhZ3MubXAzIiwgSUQzOjpJRDNfVjFfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfdjFfM3RhZ3MubXAzIiwgSUQzOjpJRDNfVjFfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkT25lRnJhbWUubXAzIiwgSUQzOjpJRDNfVjJfNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkQWxsRnJhbWVzLm1wMyIsIElEMzo6SUQzX1YyXzQpKSk7CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKICAgICAgICAgaWQzVGVzdEFsbCwgSUQzdGV4dFRhZ1Rlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18xX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18yX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMV9pbWFnZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMl9pbWFnZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfbGFyZ2VTaXplLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY19tb3JlVGV4dEZyYW1lcy5tcDMiLCA1KSkpOworICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YyMy5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY18yX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0Lm1wMyIsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY19sYXJnZVNpemUubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MjNfM3RhZ3MubXAzIiwgMyksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV81dGFncy5tcDMiLCA1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YxXzN0YWdzLm1wMyIsIDMpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkT25lRnJhbWUubXAzIiwgMyksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjRfdW5zeW5jaHJvbml6ZWRBbGxGcmFtZXMubXAzIiwgMykpKTsKIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAotICAgICAgICBpZDNUZXN0QWxsLCBJRDNhbGJ1bUFydFRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgdHJ1ZSkpKTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChpZDNUZXN0QWxsLCBJRDNhbGJ1bUFydFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfMXNlY192MjMubXAzIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzJfaW1hZ2UubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjQubXAzIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY19sYXJnZVNpemUubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV81dGFncy5tcDMiLCBmYWxzZSkpKTsKIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAotICAgICAgICBpZDNUZXN0QWxsLCBJRDNtdWx0aUFsYnVtQXJ0VGVzdCwKLSAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18xX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18yX2ltYWdlLm1wMyIsIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgMykpKTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChpZDNUZXN0QWxsLCBJRDNtdWx0aUFsYnVtQXJ0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl8xc2VjX3YyMy5tcDMiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX3YyNC5tcDMiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18xX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY19sYXJnZVNpemUubXAzIiwgMykpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgZ0VudiA9IG5ldyBJRDNUZXN0RW52aXJvbm1lbnQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYW1lRGVjb2Rlci5oCmluZGV4IDE5YWUwZTMuLmJjYTdmMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFtZURlY29kZXIuaApAQCAtMTM1LDcgKzEzNSw4IEBACiBwcml2YXRlOgogICAgIHNwPEZyYW1lQ2FwdHVyZUxheWVyPiBtQ2FwdHVyZUxheWVyOwogICAgIFZpZGVvRnJhbWUgKm1GcmFtZTsKLSAgICBib29sIG1Jc0F2Y09ySGV2YzsKKyAgICBib29sIG1Jc0F2YzsKKyAgICBib29sIG1Jc0hldmM7CiAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtU2Vla01vZGU7CiAgICAgaW50NjRfdCBtVGFyZ2V0VGltZVVzOwogICAgIExpc3Q8aW50NjRfdD4gbVNhbXBsZUR1cmF0aW9uczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSGV2Y1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hldmNVdGlscy5oCmluZGV4IDBmNTk2MzEuLjZhNGExNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSGV2Y1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IZXZjVXRpbHMuaApAQCAtMzAsNiArMzAsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CisgICAga0hldmNOYWxVbml0VHlwZUNvZGVkU2xpY2VJZHIgPSAxOSwKKyAgICBrSGV2Y05hbFVuaXRUeXBlQ29kZWRTbGljZUlkck5vTFAgPSAyMCwKKyAgICBrSGV2Y05hbFVuaXRUeXBlQ29kZWRTbGljZUNyYSA9IDIxLAorCiAgICAga0hldmNOYWxVbml0VHlwZVZwcyA9IDMyLAogICAgIGtIZXZjTmFsVW5pdFR5cGVTcHMgPSAzMywKICAgICBrSGV2Y05hbFVuaXRUeXBlUHBzID0gMzQsCkBAIC05MCw4ICs5NCwxMSBAQAogICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3cml0ZSB0aGUgc3RhcnQgY29kZS4KICAgICBib29sIHdyaXRlKHNpemVfdCBpbmRleCwgdWludDhfdCogZGVzdCwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IG1ha2VIdmNjKHVpbnQ4X3QgKmh2Y2MsIHNpemVfdCAqaHZjY1NpemUsIHNpemVfdCBuYWxTaXplTGVuZ3RoKTsKKyAgICB2b2lkIEZpbmRIRVZDRGltZW5zaW9ucygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZTcHNCdWZmZXIsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOwogCiAgICAgSW5mbyBnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gbUluZm87IH0KKyAgICBzdGF0aWMgYm9vbCBJc0hldmNJRFIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiBwcml2YXRlOgogICAgIHN0YXR1c190IHBhcnNlVnBzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IDgzZTkyYjkuLjRjOTdiNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtMTQ3LDYgKzE0Nyw3IEBACiAgICAgICAgIGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UgICAgPSAncmVsQycsCiAgICAgICAgIGtXaGF0Rm9yY2VTdGF0ZVRyYW5zaXRpb24gICAgPSAnZnN0dCcsCiAgICAgICAgIGtXaGF0Q2hlY2tJZlN0dWNrICAgICAgICAgICAgPSAnQ3N0aycsCisgICAgICAgIGtXaGF0U3VibWl0RXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlciA9ICdzYnhvJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0yNzIsNiArMjczLDggQEAKICAgICBib29sIG1TaHV0ZG93bkluUHJvZ3Jlc3M7CiAgICAgYm9vbCBtRXhwbGljaXRTaHV0ZG93bjsKICAgICBib29sIG1Jc0xlZ2FjeVZQOURlY29kZXI7CisgICAgYm9vbCBtSXNTdHJlYW1Db3JydXB0RnJlZTsKKyAgICBib29sIG1Jc0xvd0xhdGVuY3k7CiAKICAgICAvLyBJZiAibUtlZXBDb21wb25lbnRBbGxvY2F0ZWQiIHdlIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvIExvYWRlZCBzdGF0ZQogICAgIC8vIGFuZCBkbyBub3QgcmVsZWFzZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtNDk5LDYgKzUwMiw3IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBBTVJDb2RlYyhib29sIGVuY29kZXIsIGJvb2wgaXNXQU1SLCBpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldHVwRzcxMUNvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKIAorICAgIHN0YXR1c190IHNldHVwT3B1c0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKICAgICBzdGF0dXNfdCBzZXR1cEZsYWNDb2RlYygKICAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCiAgICAgICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IDZmMGQzYjUuLjE2ZTdkODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CkBAIC00MCwxNyArMzksNiBAQAogY2xhc3MgQ2FtZXJhU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLCBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CiBwdWJsaWM6CiAgICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IENhbWVyYVNvdXJjZSB1c2luZyB0aGUgY3VycmVudAotICAgICAqIHNldHRpbmdzIChzdWNoIGFzIHZpZGVvIHNpemUsIGZyYW1lIHJhdGUsIGNvbG9yIGZvcm1hdCwgZXRjKQotICAgICAqIGZyb20gdGhlIGRlZmF1bHQgY2FtZXJhLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudE5hbWUgVGhlIHBhY2thZ2UvcHJvY2VzcyBuYW1lIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24uCi0gICAgICogICAgVGhpcyBpcyB1c2VkIGZvciBwZXJtaXNzaW9ucyBjaGVja2luZy4KLSAgICAgKiBAcmV0dXJuIE5VTEwgb24gZXJyb3IuCi0gICAgICovCi0gICAgc3RhdGljIENhbWVyYVNvdXJjZSAqQ3JlYXRlKGNvbnN0IFN0cmluZzE2ICZjbGllbnROYW1lKTsKLQotICAgIC8qKgogICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBDYW1lcmFTb3VyY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2FtZXJhIHRoZSB2aWRlbyBpbnB1dCBmcmFtZSBkYXRhIHNvdXJjZS4gSWYgaXQgaXMgTlVMTCwKQEAgLTg5LDggKzc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzID0gdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmFTb3VyY2UoKTsKIApAQCAtMTMyLDI2ICsxMTksNiBAQAogcHJvdGVjdGVkOgogCiAgICAgLyoqCi0gICAgICogVGhlIGNsYXNzIGZvciBsaXN0ZW5pbmcgdG8gQm5DYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLiBUaGlzIGlzIHVzZWQgdG8gcmVjZWl2ZSB2aWRlbwotICAgICAqIGJ1ZmZlcnMgaW4gVklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19ZVVYgYW5kIFZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEEKLSAgICAgKiBtb2RlLiBXaGVuIGEgZnJhbWUgaXMgYXZhaWxhYmxlLCBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIHdpbGwgYmUgY2FsbGVkLgotICAgICAqLwotICAgIGNsYXNzIFByb3h5TGlzdGVuZXI6IHB1YmxpYyBCbkNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgUHJveHlMaXN0ZW5lcihjb25zdCBzcDxDYW1lcmFTb3VyY2U+JiBzb3VyY2UpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsCi0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiB0aW1lc3RhbXBzVXMsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBtU291cmNlOwotICAgIH07Ci0KLSAgICAvKioKICAgICAgKiBUaGUgY2xhc3MgZm9yIGxpc3RlbmluZyB0byBCdWZmZXJRdWV1ZSdzIG9uRnJhbWVBdmFpbGFibGUuIFRoaXMgaXMgdXNlZCB0byByZWNlaXZlIHZpZGVvCiAgICAgICogYnVmZmVycyBpbiBWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUgbW9kZS4gV2hlbiBhIGZyYW1lIGlzIGF2YWlsYWJsZSwKICAgICAgKiBDYW1lcmFTb3VyY2U6OnByb2Nlc3NCdWZmZXJRdWV1ZUZyYW1lKCkgd2lsbCBiZSBjYWxsZWQuCkBAIC0yMTMsMzIgKzE4MCwxNSBAQAogICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYT4mIGNhbWVyYSwgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHksCiAgICAgICAgICAgICAgICAgIGludDMyX3QgY2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnROYW1lLCB1aWRfdCBjbGllbnRVaWQsIHBpZF90IGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgU2l6ZSB2aWRlb1NpemUsIGludDMyX3QgZnJhbWVSYXRlLAotICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOwotICAgIC8vIHN0YWdlZnJpZ2h0IHJlY29yZGVyIG5vdCB1c2luZyB0aGlzIGZvciBub3cKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwogCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBmcmFtZS4KICAgICAvLyBDYWxsZWQgZnJvbSBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAuCiAgICAgdmlydHVhbCBib29sIHNraXBDdXJyZW50RnJhbWUoaW50NjRfdCAvKnRpbWVzdGFtcFVzKi8pIHtyZXR1cm4gZmFsc2U7fQogCi0gICAgLy8gQ2FsbGJhY2sgY2FsbGVkIHdoZW4gc3RpbGwgY2FtZXJhIHJhdyBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrKGludDMyX3QgLyptc2dUeXBlKi8sIGNvbnN0IHNwPElNZW1vcnk+JiAvKmRhdGEqLykge30KLQotICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOwotCi0gICAgdmlydHVhbCB2b2lkIHJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKTsKLQotICAgIHZpcnR1YWwgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgdGltZXN0YW1wc1VzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwotCiAgICAgLy8gUHJvY2VzcyBhIGJ1ZmZlciBpdGVtIHJlY2VpdmVkIGluIEJ1ZmZlclF1ZXVlTGlzdGVuZXIuCiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NCdWZmZXJRdWV1ZUZyYW1lKEJ1ZmZlckl0ZW0mIGJ1ZmZlcik7CiAKQEAgLTI2MSw5ICsyMTEsNiBAQAogICAgIGludDY0X3QgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXM7CiAgICAgYm9vbCBtQ29sbGVjdFN0YXRzOwogCi0gICAgLy8gVGhlIG1vZGUgdmlkZW8gYnVmZmVycyBhcmUgcmVjZWl2ZWQgZnJvbSBjYW1lcmEuIE9uZSBvZiBWSURFT19CVUZGRVJfTU9ERV8qLgotICAgIGludDMyX3QgbVZpZGVvQnVmZmVyTW9kZTsKLQogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFZpZGVvQnVmZmVyQ291bnQgPSAzMjsKIAogICAgIC8qKgpAQCAtMjk3LDEyICsyNDQsMTIgQEAKIAogICAgIHN0YXR1c190IGluaXQoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmE+JiBjYW1lcmEsIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5LAogICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUsIHVpZF90IGNsaWVudFVpZCwgcGlkX3QgY2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgU2l6ZSB2aWRlb1NpemUsIGludDMyX3QgZnJhbWVSYXRlLCBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyk7CisgICAgICAgICAgICAgICAgICBTaXplIHZpZGVvU2l6ZSwgaW50MzJfdCBmcmFtZVJhdGUpOwogCiAgICAgc3RhdHVzX3QgaW5pdFdpdGhDYW1lcmFBY2Nlc3MoCiAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYT4mIGNhbWVyYSwgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHksCiAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwgdWlkX3QgY2xpZW50VWlkLCBwaWRfdCBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgICBTaXplIHZpZGVvU2l6ZSwgaW50MzJfdCBmcmFtZVJhdGUsIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgIFNpemUgdmlkZW9TaXplLCBpbnQzMl90IGZyYW1lUmF0ZSk7CiAKICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXIgcXVldWUgdXNlZCBpbiBWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUgbW9kZS4KICAgICBzdGF0dXNfdCBpbml0QnVmZmVyUXVldWUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKaW5kZXggNTMzZTMzYi4uM2MzMTFjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oCkBAIC00NSw4ICs0NSw3IEBACiAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlLAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAotICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyA9IHRydWUpOworICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhU291cmNlVGltZUxhcHNlKCk7CiAKQEAgLTEyMiw4ICsxMjEsNyBAQAogICAgICAgICBTaXplIHZpZGVvU2l6ZSwKICAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSwKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCi0gICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKLSAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMgPSB0cnVlKTsKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKIAogICAgIC8vIFdyYXBwZXIgb3ZlciBDYW1lcmFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKCkgdG8gaW1wbGVtZW50IHF1aWNrIHN0b3AuCiAgICAgLy8gSXQgb25seSBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gbUxhc3RSZWFkQnVmZmVyQ29weSBpcyBzaWduYWxsZWQuIE90aGVyd2lzZQpAQCAtMTM3LDMzICsxMzUsNiBAQAogICAgIC8vIGZyYW1lIG5lZWRzIHRvIGJlIHNraXBwZWQgYW5kIHRoaXMgZnVuY3Rpb24ganVzdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBtU2tpcEN1cnJlbnRGcmFtZS4KICAgICB2aXJ0dWFsIGJvb2wgc2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKTsKIAotICAgIC8vIEluIHRoZSB2aWRlbyBjYW1lcmEgY2FzZSBjYWxscyBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoKSB0byBtb2RpZnkKLSAgICAvLyB0aW1lc3RhbXAgYW5kIHNldCBtU2tpcEN1cnJlbnRGcmFtZS4KLSAgICAvLyBUaGVuIGl0IGNhbGxzIHRoZSBiYXNlIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkKLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGluIFZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfWVVWIGFuZAotICAgIC8vIFZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEEgbW9kZS4KLSAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKLQotICAgIC8vIEluIHRoZSB2aWRlbyBjYW1lcmEgY2FzZSBjYWxscyBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoKSB0byBtb2RpZnkKLSAgICAvLyB0aW1lc3RhbXAgYW5kIHNldCBtU2tpcEN1cnJlbnRGcmFtZS4KLSAgICAvLyBUaGVuIGl0IGNhbGxzIHRoZSBiYXNlIENhbWVyYVNvdXJjZTo6cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcCgpIG9yCi0gICAgLy8gQ2FtZXJhU291cmNlOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goKQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gVklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19NRVRBREFUQSBtb2RlIHdoZW4KLSAgICAvLyB0aGUgbWV0YWRhdGEgaXMgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YS4KLSAgICB2aXJ0dWFsIHZvaWQgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLAotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOwotCi0gICAgLy8gSW4gdGhlIHZpZGVvIGNhbWVyYSBjYXNlIGNhbGxzIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgpIHRvIG1vZGlmeQotICAgIC8vIHRpbWVzdGFtcCBhbmQgc2V0IG1Ta2lwQ3VycmVudEZyYW1lLgotICAgIC8vIFRoZW4gaXQgY2FsbHMgdGhlIGJhc2UgQ2FtZXJhU291cmNlOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKCkgb3IKLSAgICAvLyBDYW1lcmFTb3VyY2U6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgpCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiBWSURFT19CVUZGRVJfTU9ERV9EQVRBX0NBTExCQUNLX01FVEFEQVRBIG1vZGUgd2hlbgotICAgIC8vIHRoZSBtZXRhZGF0YSBpcyBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhLgotICAgIHZpcnR1YWwgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgdGltZXN0YW1wc1VzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwotCiAgICAgLy8gUHJvY2VzcyBhIGJ1ZmZlciBpdGVtIHJlY2VpdmVkIGluIENhbWVyYVNvdXJjZTo6QnVmZmVyUXVldWVMaXN0ZW5lci4KICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGluIFZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRSBtb2RlLgogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQnVmZmVyUXVldWVGcmFtZShCdWZmZXJJdGVtJiBidWZmZXIpOwpAQCAtMTg3LDkgKzE1OCw2IEBACiAgICAgLy8gV3JhcHBlciB0byBlbnRlciB0aHJlYWRUaW1lTGFwc2VFbnRyeSgpCiAgICAgc3RhdGljIHZvaWQgKlRocmVhZFRpbWVMYXBzZVdyYXBwZXIodm9pZCAqbWUpOwogCi0gICAgLy8gQ3JlYXRlcyBhIGNvcHkgb2Ygc291cmNlX2RhdGEgaW50byBhIG5ldyBtZW1vcnkgb2YgZmluYWwgdHlwZSBNZW1vcnlCYXNlLgotICAgIHNwPElNZW1vcnk+IGNyZWF0ZUlNZW1vcnlDb3B5KGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSk7Ci0KICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY29uc3QgQ2FtZXJhU291cmNlVGltZUxhcHNlICYpOwogICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAmb3BlcmF0b3I9KGNvbnN0IENhbWVyYVNvdXJjZVRpbWVMYXBzZSAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKaW5kZXggNTAxY2YyYy4uMjU4MmVkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaApAQCAtNDYsNyArNDYsNyBAQAogCiAgICAgLy8gUmV0dXJucyBJTlZBTElEX09QRVJBVElPTiBpZiB0aGVyZSBpcyBubyBzb3VyY2Ugb3IgdHJhY2suCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW0gPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSB7IHJldHVybiByZXNldCgpOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CkBAIC0xMjYsNiArMTI2LDcgQEAKICAgICBib29sIG1Xcml0ZVNlZWtFcnI7CiAgICAgYm9vbCBtRmFsbG9jYXRlRXJyOwogICAgIGJvb2wgbVByZUFsbG9jYXRpb25FbmFibGVkOworICAgIHN0YXR1c190IG1SZXNldFN0YXR1czsKICAgICAvLyBRdWV1ZSB0byBob2xkIHRvcCBsb25nIHdyaXRlIGR1cmF0aW9ucwogICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcywgc3RkOjp2ZWN0b3I8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdyZWF0ZXI8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4+IG1Xcml0ZUR1cmF0aW9uUFE7CkBAIC0xMzUsNyArMTM2LDkgQEAKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxNUEVHNFdyaXRlcj4gPiBtUmVmbGVjdG9yOwogCiAgICAgTXV0ZXggbUxvY2s7CisgICAgLy8gU2VyaWFsaXplIHJlc2V0IGNhbGxzIGZyb20gY2xpZW50IG9mIE1QRUc0V3JpdGVyIGFuZCBNUDRXdHJDdHJsSGxwTG9vcGVyLgogICAgIHN0ZDo6bXV0ZXggbVJlc2V0TXV0ZXg7CisgICAgLy8gU2VyaWFsaXplIHByZWFsbG9jYXRpb24gY2FsbHMgZnJvbSBkaWZmZXJlbnQgdHJhY2sgdGhyZWFkcy4KICAgICBzdGQ6Om11dGV4IG1GYWxsb2NNdXRleDsKICAgICBib29sIG1QcmVBbGxvY0ZpcnN0VGltZTsgLy8gUHJlLWFsbG9jYXRlIHNwYWNlIGZvciBmaWxlIGFuZCB0cmFjayBoZWFkZXJzIG9ubHkgb25jZSBwZXIgZmlsZS4KICAgICB1aW50NjRfdCBtUHJldkFsbFRyYWNrc1RvdGFsTWV0YURhdGFTaXplRXN0aW1hdGU7CkBAIC0zMDQsNyArMzA3LDcgQEAKICAgICB2b2lkIHdyaXRlR2VvRGF0YUJveCgpOwogICAgIHZvaWQgd3JpdGVMYXRpdHVkZShpbnQgZGVncmVleDEwMDAwKTsKICAgICB2b2lkIHdyaXRlTG9uZ2l0dWRlKGludCBkZWdyZWV4MTAwMDApOwotICAgIHZvaWQgZmluaXNoQ3VycmVudFNlc3Npb24oKTsKKyAgICBzdGF0dXNfdCBmaW5pc2hDdXJyZW50U2Vzc2lvbigpOwogCiAgICAgdm9pZCBhZGREZXZpY2VNZXRhKCk7CiAgICAgdm9pZCB3cml0ZUhkbHIoY29uc3QgY2hhciAqaGFuZGxlclR5cGUpOwpAQCAtMzM3LDcgKzM0MCw3IEBACiAgICAgdm9pZCBzZW5kU2Vzc2lvblN1bW1hcnkoKTsKICAgICBzdGF0dXNfdCByZWxlYXNlKCk7CiAgICAgc3RhdHVzX3Qgc3dpdGNoRmQoKTsKLSAgICBzdGF0dXNfdCByZXNldChib29sIHN0b3BTb3VyY2UgPSB0cnVlKTsKKyAgICBzdGF0dXNfdCByZXNldChib29sIHN0b3BTb3VyY2UgPSB0cnVlLCBib29sIHdhaXRGb3JBbnlQcmV2aW91c0NhbGxUb0NvbXBsZXRlID0gdHJ1ZSk7CiAKICAgICBzdGF0aWMgdWludDMyX3QgZ2V0TXBlZzRUaW1lKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5oCmluZGV4IDE3N2E5ZTkuLmM3ZDc3NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuaApAQCAtNTgsNiArNTgsNyBAQAogCiBwcml2YXRlOgogICAgIE11dGV4IG1BZGFwdGVyTG9jazsKKyAgICBzdGQ6Om11dGV4IG1CdWZmZXJHYXRpbmdNdXRleDsKICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlYWQoKSB3YWl0IGZvciB0aGUgaW5jb21pbmcgYnVmZmVyLgogICAgIENvbmRpdGlvbiBtQnVmZmVyUmVhZENvbmQ7CiAgICAgLy8gTWFrZSBzdXJlIHRoZSBwdXNoQnVmZmVyKCkgd2FpdCBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnN1bWVkLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAppbmRleCBmN2U2YzI3Li5hMjhkNDc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaApAQCAtODEsNiArODEsMTMgQEAKICAgICAgICAgQlVGRkVSX0ZMQUdfTVVYRVJfREFUQSAgICA9IDE2LAogICAgIH07CiAKKyAgICBlbnVtIENWT0RlZ3JlZSB7CisgICAgICAgIENWT19ERUdSRUVfMCAgID0gMCwKKyAgICAgICAgQ1ZPX0RFR1JFRV85MCAgPSA5MCwKKyAgICAgICAgQ1ZPX0RFR1JFRV8xODAgPSAxODAsCisgICAgICAgIENWT19ERUdSRUVfMjcwID0gMjcwLAorICAgIH07CisKICAgICBlbnVtIHsKICAgICAgICAgQ0JfSU5QVVRfQVZBSUxBQkxFID0gMSwKICAgICAgICAgQ0JfT1VUUFVUX0FWQUlMQUJMRSA9IDIsCkBAIC0zNjYsNiArMzczLDggQEAKICAgICBBU3RyaW5nIG1Pd25lck5hbWU7CiAgICAgc3A8TWVkaWFDb2RlY0luZm8+IG1Db2RlY0luZm87CiAgICAgc3A8QVJlcGx5VG9rZW4+IG1SZXBseUlEOworICAgIHN0ZDo6c3RyaW5nIG1MYXN0UmVwbHlPcmlnaW47CisgICAgc3RkOjp2ZWN0b3I8c3A8QU1lc3NhZ2U+PiBtRGVmZXJyZWRNZXNzYWdlczsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgc3RhdHVzX3QgbVN0aWNreUVycm9yOwogICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwpAQCAtNDE2LDYgKzQyNSwxMCBAQAogCiAgICAgc3A8SUNyeXB0bz4gbUNyeXB0bzsKIAorICAgIGludDMyX3QgbVR1bm5lbGVkSW5wdXRXaWR0aDsKKyAgICBpbnQzMl90IG1UdW5uZWxlZElucHV0SGVpZ2h0OworICAgIGJvb2wgbVR1bm5lbGVkOworCiAgICAgc3A8SURlc2NyYW1ibGVyPiBtRGVzY3JhbWJsZXI7CiAKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUNTRDsKQEAgLTQyOCwxMyArNDQxLDE3IEBACiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IG1CdWZmZXJDaGFubmVsOwogCi0gICAgTWVkaWFDb2RlYyhjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisgICAgTWVkaWFDb2RlYygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIHBpZF90IHBpZCwgdWlkX3QgdWlkLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKT4gZ2V0Q29kZWNCYXNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoY29uc3QgQVN0cmluZyAmLCBzcDxNZWRpYUNvZGVjSW5mbz4gKik+IGdldENvZGVjSW5mbyA9IG51bGxwdHIpOwogCiAgICAgc3RhdGljIHNwPENvZGVjQmFzZT4gR2V0Q29kZWNCYXNlKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyID0gbnVsbHB0cik7CiAKICAgICBzdGF0aWMgc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSk7CiAKKyAgICB2b2lkIFBvc3RSZXBseVdpdGhFcnJvcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50MzJfdCBlcnIpOwogICAgIHZvaWQgUG9zdFJlcGx5V2l0aEVycm9yKGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlJRCwgaW50MzJfdCBlcnIpOwogCiAgICAgc3RhdHVzX3QgaW5pdChjb25zdCBBU3RyaW5nICZuYW1lKTsKQEAgLTQ0NSw2ICs0NjIsNyBAQAogICAgIHNpemVfdCB1cGRhdGVCdWZmZXJzKGludDMyX3QgcG9ydEluZGV4LCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3RhdHVzX3Qgb25RdWV1ZUlucHV0QnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzdGF0dXNfdCBvblJlbGVhc2VPdXRwdXRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIEJ1ZmZlckluZm8gKnBlZWtOZXh0UG9ydEJ1ZmZlcihpbnQzMl90IHBvcnRJbmRleCk7CiAgICAgc3NpemVfdCBkZXF1ZXVlUG9ydEJ1ZmZlcihpbnQzMl90IHBvcnRJbmRleCk7CiAKICAgICBzdGF0dXNfdCBnZXRCdWZmZXJBbmRGb3JtYXQoCkBAIC00NzYsNiArNDk0LDcgQEAKICAgICBzdGF0dXNfdCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOwogCiAgICAgc3RhdHVzX3QgYW1lbmRPdXRwdXRGb3JtYXRXaXRoQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCBoYW5kbGVPdXRwdXRGb3JtYXRDaGFuZ2VJZk5lZWRlZChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKTsKICAgICBib29sIGlzRXhlY3V0aW5nKCkgY29uc3Q7CiAKICAgICB1aW50NjRfdCBnZXRHcmFwaGljQnVmZmVyU2l6ZSgpOwpAQCAtNDg0LDYgKzUwMyw5IEBACiAgICAgYm9vbCBoYXNQZW5kaW5nQnVmZmVyKGludCBwb3J0SW5kZXgpOwogICAgIGJvb2wgaGFzUGVuZGluZ0J1ZmZlcigpOwogCisgICAgdm9pZCBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKHN0ZDo6c3RyaW5nIG9yaWdpbiwgc3RhdHVzX3QgZXJyID0gT0spOworICAgIHZvaWQgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhzdGQ6OnN0cmluZyBvcmlnaW4sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVzcG9uc2UpOworCiAgICAgLyogY2FsbGVkIHRvIGdldCB0aGUgbGFzdCBjb2RlYyBlcnJvciB3aGVuIHRoZSBzdGlja3kgZmxhZyBpcyBzZXQuCiAgICAgICogaWYgbm8gc3VjaCBjb2RlYyBlcnJvciBpcyBmb3VuZCwgcmV0dXJucyBVTktOT1dOX0VSUk9SLgogICAgICAqLwpAQCAtNTY5LDYgKzU5MSwxMCBAQAogCiAgICAgSGlzdG9ncmFtIG1MYXRlbmN5SGlzdDsKIAorICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICYsIGNvbnN0IGNoYXIgKik+IG1HZXRDb2RlY0Jhc2U7CisgICAgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdChjb25zdCBBU3RyaW5nICYsIHNwPE1lZGlhQ29kZWNJbmZvPiAqKT4gbUdldENvZGVjSW5mbzsKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFUZXN0SGVscGVyOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFDb2RlYyk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDE3OGQzMzQuLjljNjczMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC03NDQsNiArNzQ0LDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UW10gPSAiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQUFDX1BST0ZJTEVbXSA9ICJhYWMtcHJvZmlsZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQUFDX1NCUl9NT0RFW10gPSAiYWFjLXNici1tb2RlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9BTExPV19GUkFNRV9EUk9QW10gPSAiYWxsb3ctZnJhbWUtZHJvcCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQVVESU9fU0VTU0lPTl9JRFtdID0gImF1ZGlvLXNlc3Npb24taWQiOwogY29uc3RleHByIGNoYXIgS0VZX0JJVF9SQVRFW10gPSAiYml0cmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQklUUkFURV9NT0RFW10gPSAiYml0cmF0ZS1tb2RlIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaAppbmRleCBmNTNiMjNlLi5iZjg1ZDdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCkBAIC0xOSw3ICsxOSw2IEBACiAjZGVmaW5lIE1FRElBX0NPREVDX0xJU1RfV1JJVEVSX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC02NSw2ICs2NCw3IEBACiAgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiBtQ29kZWNJbmZvczsKIAogICAgIGZyaWVuZCBzdHJ1Y3QgTWVkaWFDb2RlY0xpc3Q7CisgICAgZnJpZW5kIGNsYXNzIE1lZGlhVGVzdEhlbHBlcjsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaAppbmRleCAyZjk4YWYxLi4wZjdiNTM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaApAQCAtNjQsMTIgKzY0LDE1IEBACiAKICAgICAvLyBNZWRpYUJ1ZmZlck9ic2VydmVyCiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVuY29kaW5nQml0cmF0ZShpbnQzMl90IGJpdFJhdGUgLyogYnBzICovKTsKIAogICAgIC8vIGZvciBBSGFuZGxlclJlZmxlY3RvcgogICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAKIAorICAgIHN0YXR1c190IHJlcXVlc3RJRFJGcmFtZSgpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFDb2RlY1NvdXJjZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKaW5kZXggMWY0ZmJjYi4uMTdiMWFiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaApAQCAtNTQsNiArNTQsMTAgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IC8qbXMqLykge30KICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXROZXh0RmQoaW50IC8qZmQqLykgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ1ZPRGVncmVlcyhpbnQzMl90IC8qY3ZvRGVncmVlcyovKSB7fQorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVQYXlsb2FkVHlwZShpbnQzMl90IC8qcGF5bG9hZFR5cGUqLykge30KKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU29ja2V0TmV0d29yayhpbnQ2NF90IC8qc29ja2V0TmV0d29yayovKSB7fQorICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2VxdWVuY2VOdW0oKSB7IHJldHVybiAwOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYVdyaXRlcigpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAppbmRleCA2NGViOGI0Li5mMjYwNTEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKQEAgLTYyLDYgKzYyLDcgQEAKICAgICBrS2V5RFZDQyAgICAgICAgICAgICAgPSAnZHZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlBVjFDICAgICAgICAgICAgICA9ICdhdjFjJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5VGh1bWJuYWlsQVYxQyAgICAgPSAndGF2MScsICAvLyByYXcgZGF0YQogICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCiAgICAga0tleU9wdXNIZWFkZXIgICAgICAgID0gJ29oZHInLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5T3B1c0NvZGVjRGVsYXkgICAgPSAnb2NvZCcsICAvLyB1aW50NjRfdCAoY29kZWMgZGVsYXkgaW4gbnMpCkBAIC0yNDcsNiArMjQ4LDIwIEBACiAKICAgICAvLyBUcmVhdCBlbXB0eSB0cmFjayBhcyBtYWxmb3JtZWQgZm9yIE1lZGlhUmVjb3JkZXIuCiAgICAga0tleUVtcHR5VHJhY2tNYWxGb3JtZWQgPSAnbmVtdCcsIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICBrS2V5VnBzICAgICAgICAgICAgICA9ICdzVnBzJywgLy8gaW50MzJfdCwgaW5kaWNhdGVzIHRoYXQgYSBidWZmZXIgaGFzIHZwcy4KKyAgICBrS2V5U3BzICAgICAgICAgICAgICA9ICdzU3BzJywgLy8gaW50MzJfdCwgaW5kaWNhdGVzIHRoYXQgYSBidWZmZXIgaGFzIHNwcy4KKyAgICBrS2V5UHBzICAgICAgICAgICAgICA9ICdzUHBzJywgLy8gaW50MzJfdCwgaW5kaWNhdGVzIHRoYXQgYSBidWZmZXIgaGFzIHBwcy4KKyAgICBrS2V5U2VsZklEICAgICAgICAgICA9ICdzZmlkJywgLy8gaW50MzJfdCwgc291cmNlIElEIHRvIGlkZW50aWZ5IGl0c2VsZiBvbiBSVFAgcHJvdG9jb2wuCisgICAga0tleVBheWxvYWRUeXBlICAgICAgPSAncFR5cCcsIC8vIGludDMyX3QsIFNEUCBuZWdvdGlhdGVkIHBheWxvYWQgdHlwZS4KKyAgICBrS2V5UnRwRXh0TWFwICAgICAgICA9ICdleHRtJywgLy8gaW50MzJfdCwgcnRwIGV4dGVuc2lvbiBJRCBmb3IgY3ZvIG9uIFJUUCBwcm90b2NvbC4KKyAgICBrS2V5UnRwQ3ZvRGVncmVlcyAgICA9ICdjdm9kJywgLy8gaW50MzJfdCwgcnRwIGN2byBkZWdyZWVzIGFzIHBlciAzR1BQIDI2LjExNC4KKyAgICBrS2V5UnRwRHNjcCAgICAgICAgICA9ICdkc2NwJywgLy8gaW50MzJfdCwgRFNDUChEaWZmZXJlbnRpYXRlZCBzZXJ2aWNlcyBjb2RlcG9pbnQpIG9mIFJGQyAyNDc0LgorICAgIGtLZXlTb2NrZXROZXR3b3JrICAgID0gJ3NOZXQnLCAvLyBpbnQ2NF90LCBzb2NrZXQgd2lsbCBiZSBib3VuZCB0byBuZXR3b3JrIGhhbmRsZS4KKworICAgIC8vIFNsb3ctbW90aW9uIG1hcmtlcnMKKyAgICBrS2V5U2xvd01vdGlvbk1hcmtlcnMgPSAnc2xtbycsIC8vIHJhdyBkYXRhLCBieXRlIGFycmF5IGZvbGxvd2luZyBzcGVjIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVkaWFGb3JtYXQjS0VZX1NMT1dfTU9USU9OX01BUktFUlMKIH07CiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oCmluZGV4IDBiZTFhNTIuLmI4YTNjMTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmgKQEAgLTIwLDYgKzIwLDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yOCwxMSArMzEsMjAgQEAKIAogICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KTsKICAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZFBpZChpbnQgcGlkKTsKKyAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgcGlkLCBpbnQgcHJvY1N0YXRlLCBpbnQgb29tU2NvcmUpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UHJvY2Vzc0luZm8oKTsKIAogcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUHJvY2Vzc0luZm9PdmVycmlkZSB7CisgICAgICAgIGludCBwcm9jU3RhdGU7CisgICAgICAgIGludCBvb21TY29yZTsKKyAgICB9OworICAgIHN0ZDo6bXV0ZXggbU92ZXJyaWRlTG9jazsKKyAgICBzdGQ6Om1hcDxpbnQsIFByb2Nlc3NJbmZvT3ZlcnJpZGU+IG1PdmVycmlkZU1hcCBHVUFSREVEX0JZKG1PdmVycmlkZUxvY2spOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHJvY2Vzc0luZm8pOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oCmluZGV4IGIzOTExMmEuLjkyNjAxODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmgKQEAgLTI0LDYgKzI0LDggQEAKIHN0cnVjdCBQcm9jZXNzSW5mb0ludGVyZmFjZSA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50KiBwcmlvcml0eSkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCBwaWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgcGlkLCBpbnQgcHJvY1N0YXRlLCBpbnQgb29tU2NvcmUpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UHJvY2Vzc0luZm9JbnRlcmZhY2UoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaAppbmRleCBkODJiZThhLi5kNjA1Y2RhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaApAQCAtNDEsNiArNDEsMTEgQEAKICAgICAgICAgY2xvc2UoKTsKICAgICB9CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJTWVtb3J5KCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRJTWVtb3J5KCkgZmFpbGVkLCBtTWVtb3J5IGlzIG51bGxwdHIiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBtTWVtb3J5OwogICAgIH0KICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewpAQCAtNDgsMTkgKzUzLDM1IEBACiAgICAgICAgIGlmIChzaXplID4ga0J1ZmZlclNpemUpIHsKICAgICAgICAgICAgIHNpemUgPSBrQnVmZmVyU2l6ZTsKICAgICAgICAgfQorCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1Tb3VyY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoInJlYWRBdCgpIGZhaWxlZCwgbVNvdXJjZSBpcyBudWxscHRyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbU1lbW9yeS0+dW5zZWN1cmVQb2ludGVyKCksIHNpemUpOwogICAgIH0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU291cmNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRTaXplKCkgZmFpbGVkLCBtU291cmNlIGlzIG51bGxwdHIiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShzaXplKTsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgewogICAgICAgICAvLyBQcm90ZWN0IHN0cm9uZyBwb2ludGVyIGFzc2lnbm1lbnRzLiBUaGlzIGFsc28gY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBiaW5kZXIKICAgICAgICAgLy8gY2xlYW4tdXAgcHJvY2VkdXJlIHdoaWNoIGlzIHJ1bm5pbmcgb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DbG9zZUxvY2spOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIG1Tb3VyY2UgPSBudWxscHRyOwogICAgICAgICBtTWVtb3J5ID0gbnVsbHB0cjsKICAgICB9CiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRGbGFncygpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBpZiAobVNvdXJjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0U2l6ZSgpIGZhaWxlZCwgbVNvdXJjZSBpcyBudWxscHRyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MoKTsKICAgICB9CiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgIHsKQEAgLTc1LDkgKzk2LDEwIEBACiAgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKICAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwogICAgIFN0cmluZzggbU5hbWU7Ci0gICAgTXV0ZXggbUNsb3NlTG9jazsKKyAgICBNdXRleCBtTG9jazsKIAogICAgIGV4cGxpY2l0IFJlbW90ZURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrQnVmZmVyU2l6ZSwgIlJlbW90ZURhdGFTb3VyY2UiKTsKICAgICAgICAgbU1lbW9yeSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoa0J1ZmZlclNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmgKaW5kZXggYWU1NWM2NS4uMzViM2ZhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwgaW50IHJvdGF0aW9uLCBpbnQgdXNhZ2UsIGJvb2wgcmVjb25uZWN0KTsKIHZvaWQgc2V0TmF0aXZlV2luZG93SGRyTWV0YWRhdGEoCiAgICAgICAgIEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovLCBIRFJTdGF0aWNJbmZvICppbmZvIC8qIG5vbm51bGwgKi8pOworc3RhdHVzX3Qgc2V0TmF0aXZlV2luZG93Um90YXRpb24oCisgICAgICAgIEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovLCBpbnQgcm90YXRpb24pOwogc3RhdHVzX3QgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovKTsKIHN0YXR1c190IG5hdGl2ZVdpbmRvd0Nvbm5lY3QoQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSwgY29uc3QgY2hhciAqcmVhc29uKTsKIHN0YXR1c190IG5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3QoQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSwgY29uc3QgY2hhciAqcmVhc29uKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAppbmRleCAyYjliNzU5Li4xNjczMTIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKLXZvaWQgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKAorc3RhdHVzX3QgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgc3A8TWV0YURhdGE+ICZtZXRhKTsKIAogLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgTkFMIHN0YXJ0IGNvZGUgaW4gYnVmZmVyIG9mIHNpemUgfGxlbmd0aHwgc3RhcnRpbmcgYXQgfGRhdGF8LCBvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGZiYjJkMGMuLjVkNjk3ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTEsMTIgKzEsMTEgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFub3RoZXJQYWNrZXRTb3VyY2UuY3BwIiwKICAgICAgICAgIkFUU1BhcnNlci5jcHAiLAogICAgICAgICAiQ2FzTWFuYWdlci5jcHAiLAogICAgICAgICAiRVNRdWV1ZS5jcHAiLAotICAgICAgICAiSGxzU2FtcGxlRGVjcnlwdG9yLmNwcCIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpAQCAtMjgsNyArMjcsNiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCkBAIC0zNiw5ICszNCwxMCBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKQEAgLTQ4LDQgKzQ3LDM5IEBACiAgICAgXSwKIAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERU5BQkxFX0NSWVBUTyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3J5cHRvIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkhsc1NhbXBsZURlY3J5cHRvci5jcHAiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X25vY3J5cHRvIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X2RlZmF1bHRzIiwKKyAgICBdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IGVhNWQyZGUuLjE5MmJhNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogCi0jaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKyNpZmRlZiBFTkFCTEVfQ1JZUFRPCiAjaW5jbHVkZSAiSGxzU2FtcGxlRGVjcnlwdG9yLmgiCiAjZW5kaWYKIApAQCAtNTUsMTAgKzU1LDEwIEBACiAgICAgLy8gQ3JlYXRlIHRoZSBkZWNyeXB0b3IgYW55d2F5IHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIHVzZS1jYXNlIHVubGVzcyBrZXkgaXMgcHJvdmlkZWQKICAgICAvLyBXb24ndCBkZWNyeXB0IGlmIGtleSBpbmZvIG5vdCBhdmFpbGFibGUgKGUuZy4sIHNjYW5uZXIvZXh0cmFjdG9yIGp1c3QgcGFyc2luZyB0cyBmaWxlcykKICAgICBtU2FtcGxlRGVjcnlwdG9yID0gaXNTYW1wbGVFbmNyeXB0ZWQoKSA/Ci0jaWZkZWYgX19BTkRST0lEX0FQRVhfXwotICAgICAgICBuZXcgU2FtcGxlRGVjcnlwdG9yCi0jZWxzZQorI2lmZGVmIEVOQUJMRV9DUllQVE8KICAgICAgICAgbmV3IEhsc1NhbXBsZURlY3J5cHRvcgorI2Vsc2UKKyAgICAgICAgbmV3IFNhbXBsZURlY3J5cHRvcgogI2VuZGlmCiAgICAgICAgIDogTlVMTDsKIH0KQEAgLTE3MiwyOSArMTcyLDI2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDMpOworICAgIGJpdHMuc2tpcEJpdHMoMyk7IC8vIGJzbW9kCiAgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7Ci0gICAgdW5zaWduZWQgY21peGxldiBfX3VudXNlZCA9IDA7Ci0gICAgdW5zaWduZWQgc3VybWl4bGV2IF9fdW51c2VkID0gMDsKLSAgICB1bnNpZ25lZCBkc3VybW9kIF9fdW51c2VkID0gMDsKIAogICAgIGlmICgoYWNtb2QgJiAxKSA+IDAgJiYgYWNtb2QgIT0gMSkgewogICAgICAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMikgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgY21peGxldiA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICAgICAgYml0cy5za2lwQml0cygyKTsgLy9jbWl4bGV2CiAgICAgfQogICAgIGlmICgoYWNtb2QgJiA0KSA+IDApIHsKICAgICAgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIHN1cm1peGxldiA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICAgICAgYml0cy5za2lwQml0cygyKTsgLy9zdXJtaXhsZXYKICAgICB9CiAgICAgaWYgKGFjbW9kID09IDIpIHsKICAgICAgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGRzdXJtb2QgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vZHN1cm1vZAogICAgIH0KIAogICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAxKSB7CkBAIC0yNjksNyArMjY2LDcgQEAKICAgICAgICAgc2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlVGFibGUyW2ZzY29kMl07CiAgICAgfSBlbHNlIHsKICAgICAgICAgc2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlVGFibGVbZnNjb2RdOwotICAgICAgICB1bnNpZ25lZCBudW1ibGtzY29kIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvLyBudW1ibGtzY29kCiAgICAgfQogCiAgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7CkBAIC0xMDg3LDcgKzEwODQsNyBAQAogICAgIH0KICAgICB1bnNpZ25lZCBudW1BVXMgPSBiaXRzLmdldEJpdHMoOCk7CiAgICAgYml0cy5za2lwQml0cyg4KTsKLSAgICB1bnNpZ25lZCBxdWFudGl6YXRpb25fd29yZF9sZW5ndGggX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CisgICAgYml0cy5za2lwQml0cygyKTsgLy8gcXVhbnRpemF0aW9uX3dvcmRfbGVuZ3RoCiAgICAgdW5zaWduZWQgYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5ID0gYml0cy5nZXRCaXRzKDMpOwogICAgIHVuc2lnbmVkIG51bV9jaGFubmVscyA9IGJpdHMuZ2V0Qml0cygzKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjRiYmRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw5IEBACisvLyBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMKK3sKKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJNcGVnMnRzVW5pdFRlc3QiIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGIwMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3R7CisgICAgbmFtZTogIk1wZWcydHNVbml0VGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNcGVnMnRzVW5pdFRlc3QuY3BwIgorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTI5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNcGVnMnRzIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNcGVnMnRzVW5pdFRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXBlZzJ0c1VuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9NcGVnMnRzVW5pdFRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcGVnMnRzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcGVnMnRzVW5pdFRlc3RSZXMvIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMjMzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNcGVnMnRzVW5pdFRlc3QiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSAibXBlZzJ0cy9BVFNQYXJzZXIuaCIKKyNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKKworI2luY2x1ZGUgIk1wZWcydHNVbml0VGVzdEVudmlyb25tZW50LmgiCisKK2NvbnN0ZXhwciBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKK2NvbnN0ZXhwciB1aW50MTZfdCBrUElETWFzayA9IDB4MUZGRjsKKy8vIE1heCB2YWx1ZSBvZiBQSUQgd2hpY2ggaXMgYWxzbyB1c2VkIGZvciBOdWxsIHBhY2tldHMKK2NvbnN0ZXhwciB1aW50MTZfdCBrUElETWF4VmFsdWUgPSA4MTkxOworY29uc3RleHByIHVpbnQ4X3Qga1RTU3luY0J5dGUgPSAweDQ3OworY29uc3RleHByIHVpbnQ4X3Qga1ZpZGVvUHJlc2VudCA9IDB4MDE7Citjb25zdGV4cHIgdWludDhfdCBrQXVkaW9QcmVzZW50ID0gMHgwMjsKK2NvbnN0ZXhwciB1aW50OF90IGtNZXRhRGF0YVByZXNlbnQgPSAweDA0OworCitzdGF0aWMgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTXBlZzJ0c1VuaXRUZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nIDo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LypmaWxlTmFtZSovIHN0cmluZywgLypzb3VyY2VUeXBlKi8gY2hhciwgLypudW1Tb3VyY2UqLyB1aW50MTZfdD4+IHsKKyAgcHVibGljOgorICAgIE1wZWcydHNVbml0VGVzdCgpCisgICAgICAgIDogbUlucHV0QnVmZmVyKG51bGxwdHIpLCBtU291cmNlKG51bGxwdHIpLCBtRnBJbnB1dChudWxscHRyKSwgbVBhcnNlcihudWxscHRyKSB7fQorCisgICAgfk1wZWcydHNVbml0VGVzdCgpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlcikgZnJlZShtSW5wdXRCdWZmZXIpOworICAgICAgICBpZiAobUZwSW5wdXQpIGZjbG9zZShtRnBJbnB1dCk7CisgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBtT2Zmc2V0ID0gMDsKKyAgICAgICAgbU51bURhdGFTb3VyY2UgPSAwOworICAgICAgICB0dXBsZTxzdHJpbmcsIGNoYXIsIHVpbnQxNl90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBjaGFyIHNvdXJjZVR5cGUgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgLyogbVNvdXJjZVR5cGUgPSAwYiB4IHggeCB4IHggTSBBIFYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgIGF1ZGlvICB2aWRlbyAqLworICAgICAgICBtTWVkaWFUeXBlID0gKHNvdXJjZVR5cGUgJiAweDA3KTsKKyAgICAgICAgbU51bURhdGFTb3VyY2UgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1GcElucHV0ID0gZm9wZW4oaW5wdXRGaWxlLmNfc3RyKCksICJyYiIpOworICAgICAgICBBU1NFUlRfTkUobUZwSW5wdXQsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIGludDhfdCBlcnIgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgMCkgPDwgIkZhaWxlZCB0byBnZXQgaW5mb3JtYXRpb24gZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIGxvbmcgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICAgICAgbVRvdGFsUGFja2V0cyA9IGZpbGVTaXplIC8ga1RTUGFja2V0U2l6ZTsKKyAgICAgICAgaW50MzJfdCBmZCA9IGZpbGVubyhtRnBJbnB1dCk7CisgICAgICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIjsKKworICAgICAgICBtU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZHVwKGZkKSwgMCwgYnVmLnN0X3NpemUpOworICAgICAgICBBU1NFUlRfTkUobVNvdXJjZSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGRhdGEgc291cmNlISI7CisKKyAgICAgICAgbVBhcnNlciA9IG5ldyBBVFNQYXJzZXIoKTsKKyAgICAgICAgQVNTRVJUX05FKG1QYXJzZXIsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIEFUUyBwYXJzZXIhIjsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2Moa1RTUGFja2V0U2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBUUyBwYWNrZXQhIjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBtT2Zmc2V0OworICAgIHVpbnQ2NF90IG1Ub3RhbFBhY2tldHM7CisgICAgdWludDE2X3QgbU51bURhdGFTb3VyY2U7CisKKyAgICBpbnQ4X3QgbU1lZGlhVHlwZTsKKworICAgIHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKKyAgICBzdHJpbmcgbUlucHV0RmlsZTsKKyAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOworICAgIEZJTEUgKm1GcElucHV0OworICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKK307CisKK1RFU1RfUChNcGVnMnRzVW5pdFRlc3QsIE1lZGlhSW5mb1Rlc3QpIHsKKyAgICBib29sIHZpZGVvRm91bmQgPSBmYWxzZTsKKyAgICBib29sIGF1ZGlvRm91bmQgPSBmYWxzZTsKKyAgICBib29sIG1ldGFEYXRhRm91bmQgPSBmYWxzZTsKKyAgICBib29sIHN5bmNQb2ludFByZXNlbnQgPSBmYWxzZTsKKworICAgIGludDE2X3QgdG90YWxEYXRhU291cmNlID0gMDsKKyAgICBpbnQzMl90IHZhbDMyID0gMDsKKyAgICB1aW50OF90IG51bURhdGFTb3VyY2UgPSAwOworICAgIHVpbnQ4X3QgcGFja2V0W2tUU1BhY2tldFNpemVdOworICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gLTE7CisKKyAgICBBVFNQYXJzZXI6OlN5bmNFdmVudCBldmVudChtT2Zmc2V0KTsKKyAgICBzdGF0aWMgY29uc3QgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIG1lZGlhVHlwZVtdID0ge0FUU1BhcnNlcjo6VklERU8sIEFUU1BhcnNlcjo6QVVESU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6Ok1FVEEsIEFUU1BhcnNlcjo6TlVNX1NPVVJDRV9UWVBFU307CisgICAgY29uc3QgdWludDMyX3Qgbk1lZGlhVHlwZXMgPSBzaXplb2YobWVkaWFUeXBlKSAvIHNpemVvZihtZWRpYVR5cGVbMF0pOworCisgICAgd2hpbGUgKChudW1CeXRlc1JlYWQgPSBtU291cmNlLT5yZWFkQXQobU9mZnNldCwgcGFja2V0LCBrVFNQYWNrZXRTaXplKSkgPT0ga1RTUGFja2V0U2l6ZSkgeworICAgICAgICBBU1NFUlRfVFJVRShwYWNrZXRbMF0gPT0ga1RTU3luY0J5dGUpIDw8ICJTeW5jIGJ5dGUgZXJyb3IhIjsKKworICAgICAgICAvLyBwaWQgaXMgMTMgYml0cworICAgICAgICB1aW50MTZfdCBwaWQgPSAocGFja2V0WzFdICsgKHBhY2tldFsyXSA8PCA4KSkgJiBrUElETWFzazsKKyAgICAgICAgQVNTRVJUX1RSVUUocGlkIDw9IGtQSURNYXhWYWx1ZSkgPDwgIkludmFsaWQgUElEOiAiIDw8IHBpZDsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtUGFyc2VyLT5mZWVkVFNQYWNrZXQocGFja2V0LCBrVFNQYWNrZXRTaXplLCAmZXZlbnQpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJVbmFibGUgdG8gZmVlZCBUUyBwYWNrZXQhIjsKKworICAgICAgICBtT2Zmc2V0ICs9IG51bUJ5dGVzUmVhZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTWVkaWFUeXBlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVBhcnNlci0+aGFzU291cmNlKG1lZGlhVHlwZVtpXSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lZGlhVHlwZVtpXSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFUU1BhcnNlcjo6VklERU86CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFUU1BhcnNlcjo6QVVESU86CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFUU1BhcnNlcjo6TUVUQToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVRTUGFyc2VyOjpOVU1fU09VUkNFX1RZUEVTOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVtRGF0YVNvdXJjZSA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW9Gb3VuZCAmJiBhdWRpb0ZvdW5kICYmIG1ldGFEYXRhRm91bmQgJiYgKG51bURhdGFTb3VyY2UgPT0gMykpIGJyZWFrOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbk1lZGlhVHlwZXM7IGkrKykgeworICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgY3VycmVudE1lZGlhVHlwZSA9IG1lZGlhVHlwZVtpXTsKKyAgICAgICAgaWYgKG1QYXJzZXItPmhhc1NvdXJjZShjdXJyZW50TWVkaWFUeXBlKSkgeworICAgICAgICAgICAgaWYgKGV2ZW50Lmhhc1JldHVybmVkRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgc3luY1BvaW50UHJlc2VudCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc3luY1BhY2tldFNvdXJjZSA9IGV2ZW50LmdldE1lZGlhU291cmNlKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHN5bmNQYWNrZXRTb3VyY2UsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2Fubm90IGdldCBzeW5jIHNvdXJjZSBmb3IgbWVkaWEgdHlwZTogIiA8PCBjdXJyZW50TWVkaWFUeXBlOworCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3luY1BhY2tldFNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJFcnJvciByZXR1cm5lZCB3aGlsZSBzdGFydGluZyEiOworCisgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHN5bmNQYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IHRoZSBmb3JtYXQgb2YgdGhlIHNvdXJjZSBwYWNrZXQhIjsKKworICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmOworICAgICAgICAgICAgICAgIHN5bmNQYWNrZXRTb3VyY2UtPnJlYWQoJmJ1ZiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKGJ1ZiwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byByZWFkIHN5bmMgcGFja2V0IHNvdXJjZSBkYXRhIjsKKworICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmaW5NZXRhID0gYnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBib29sIHN0YXR1cyA9IGluTWV0YS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsMzIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIHRydWUpIDw8ICJTeW5jIGZyYW1lIGtleSBpcyBub3Qgc2V0IjsKKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGluTWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ2YWwzMik7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgZmFsc2UpIDw8ICJJbnZhbGlkIHBhY2tldCwgZm91bmQgc2NyYW1ibGVkIHBhY2tldHMhIjsKKworICAgICAgICAgICAgICAgIGVyciA9IHN5bmNQYWNrZXRTb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJFcnJvciByZXR1cm5lZCB3aGlsZSBzdG9wcGluZyEiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhcnNlci0+Z2V0U291cmNlKGN1cnJlbnRNZWRpYVR5cGUpOworICAgICAgICAgICAgQVNTRVJUX05FKHBhY2tldFNvdXJjZSwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNhbm5vdCBnZXQgc291cmNlIGZvciBtZWRpYSB0eXBlOiAiIDw8IGN1cnJlbnRNZWRpYVR5cGU7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhY2tldFNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIkVycm9yIHJldHVybmVkIHdoaWxlIHN0YXJ0aW5nISI7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gcGFja2V0U291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IHRoZSBmb3JtYXQgb2YgdGhlIHBhY2tldCEiOworCisgICAgICAgICAgICBlcnIgPSBwYWNrZXRTb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIkVycm9yIHJldHVybmVkIHdoaWxlIHN0b3BwaW5nISI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlRfRVEodmlkZW9Gb3VuZCwgYm9vbChtTWVkaWFUeXBlICYga1ZpZGVvUHJlc2VudCkpIDw8ICJObyBWaWRlbyBwYWNrZXRzIGZvdW5kISI7CisgICAgQVNTRVJUX0VRKGF1ZGlvRm91bmQsIGJvb2wobU1lZGlhVHlwZSAmIGtBdWRpb1ByZXNlbnQpKSA8PCAiTm8gQXVkaW8gcGFja2V0cyBmb3VuZCEiOworICAgIEFTU0VSVF9FUShtZXRhRGF0YUZvdW5kLCBib29sKG1NZWRpYVR5cGUgJiBrTWV0YURhdGFQcmVzZW50KSkgPDwgIk5vIG1ldGEgZGF0YSBmb3VuZCEiOworCisgICAgaWYgKHZpZGVvRm91bmQgfHwgYXVkaW9Gb3VuZCkgeworICAgICAgICBBU1NFUlRfVFJVRShzeW5jUG9pbnRQcmVzZW50KSA8PCAiTm8gc3luYyBwb2ludHMgZm91bmQgZm9yIGF1ZGlvL3ZpZGVvIjsKKyAgICB9CisKKyAgICBpZiAodmlkZW9Gb3VuZCkgdG90YWxEYXRhU291cmNlICs9IDE7CisgICAgaWYgKGF1ZGlvRm91bmQpIHRvdGFsRGF0YVNvdXJjZSArPSAxOworICAgIGlmIChtZXRhRGF0YUZvdW5kKSB0b3RhbERhdGFTb3VyY2UgKz0gMTsKKworICAgIEFTU0VSVF9UUlVFKHRvdGFsRGF0YVNvdXJjZSA9PSBtTnVtRGF0YVNvdXJjZSkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCAiIDw8IG1OdW1EYXRhU291cmNlIDw8ICIgZGF0YSBzb3VyY2VzLCBmb3VuZCAiIDw8IHRvdGFsRGF0YVNvdXJjZTsKKyAgICBpZiAobnVtRGF0YVNvdXJjZSA9PSAzKSB7CisgICAgICAgIEFTU0VSVF9FUShudW1EYXRhU291cmNlLCBtTnVtRGF0YVNvdXJjZSkKKyAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgIiA8PCBtTnVtRGF0YVNvdXJjZSA8PCAiIGRhdGEgc291cmNlcywgZm91bmQgIiA8PCB0b3RhbERhdGFTb3VyY2U7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIGluZm9UZXN0LCBNcGVnMnRzVW5pdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIiwgMHgwMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInNlZ21lbnQwMDAwMDEudHMiLCAweDAzLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLnRzIiwgMHgwMiwgMSkpKTsKKworaW50MzJfdCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICB1aW50OF90IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiTXBlZzJ0c1VuaXQgVGVzdCBSZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0MWRiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTVBFRzJUU19VTklUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fTVBFRzJUU19VTklUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIE1wZWcydHNVbml0VGVzdEVudmlyb25tZW50IDogcHVibGljOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX01QRUcyVFNfVU5JVF9URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3Y2U3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwzOCBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIE1wZWcyVFMgVW5pdCBUZXN0IDoKK1RoZSBNcGVnMlRTIFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYnJhcmllcyBwcmVzZW50IGluIE1wZWcyVFMuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittbW0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvCitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KKworYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L01wZWcydHNVbml0VGVzdC9NcGVnMnRzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCisKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvTXBlZzJ0c1VuaXRUZXN0L01wZWcydHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LnppcCApLgorRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIE1wZWcydHNVbml0VGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogTXBlZzJ0c1VuaXRUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL01wZWcydHNVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBNcGVnMnRzVW5pdFRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKaW5kZXggZWVmOWNlMy4uZWIxNTAzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09teEdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KQEAgLTQxLDIxICs0MSwyMSBAQAogY29uc3RleHByIHNpemVfdCBrTWF4Tm9kZUluc3RhbmNlcyA9ICgxIDw8IDE2KTsKIAogT214OjpPbXgoKSA6Ci0gICAgbU1hc3RlcihuZXcgT01YTWFzdGVyKCkpLAorICAgIG1TdG9yZShuZXcgT01YU3RvcmUoKSksCiAgICAgbVBhcnNlcigpIHsKICAgICAodm9pZCltUGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoKTsKICAgICAodm9pZCltUGFyc2VyLnBhcnNlWG1sUGF0aChtUGFyc2VyLmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CiB9CiAKIE9teDo6fk9teCgpIHsKLSAgICBkZWxldGUgbU1hc3RlcjsKKyAgICBkZWxldGUgbVN0b3JlOwogfQogCiBSZXR1cm48dm9pZD4gT214OjpsaXN0Tm9kZXMobGlzdE5vZGVzX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpsaXN0PDo6YW5kcm9pZDo6SU9NWDo6Q29tcG9uZW50SW5mbz4gbGlzdDsKICAgICBjaGFyIGNvbXBvbmVudE5hbWVbMjU2XTsKICAgICBmb3IgKE9NWF9VMzIgaW5kZXggPSAwOwotICAgICAgICAgICAgbU1hc3Rlci0+ZW51bWVyYXRlQ29tcG9uZW50cygKKyAgICAgICAgICAgIG1TdG9yZS0+ZW51bWVyYXRlQ29tcG9uZW50cygKICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsIHNpemVvZihjb21wb25lbnROYW1lKSwgaW5kZXgpID09IE9NWF9FcnJvck5vbmU7CiAgICAgICAgICAgICArK2luZGV4KSB7CiAgICAgICAgIGxpc3QucHVzaF9iYWNrKDo6YW5kcm9pZDo6SU9NWDo6Q29tcG9uZW50SW5mbygpKTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgaW5mby5tTmFtZSA9IGNvbXBvbmVudE5hbWU7CiAgICAgICAgIDo6YW5kcm9pZDo6VmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nOD4gcm9sZXM7CiAgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KLSAgICAgICAgICAgICAgICBtTWFzdGVyLT5nZXRSb2xlc09mQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsICZyb2xlcyk7CisgICAgICAgICAgICAgICAgbVN0b3JlLT5nZXRSb2xlc09mQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsICZyb2xlcyk7CiAgICAgICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBpbmZvLm1Sb2xlcy5wdXNoX2JhY2socm9sZXNbaV0pOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgICAgICAgICAgdGhpcywgbmV3IExXT214T2JzZXJ2ZXIob2JzZXJ2ZXIpLCBuYW1lLmNfc3RyKCkpOwogCiAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpoYW5kbGU7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gbU1hc3Rlci0+bWFrZUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9IG1TdG9yZS0+bWFrZUNvbXBvbmVudEluc3RhbmNlKAogICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgJk9NWE5vZGVJbnN0YW5jZTo6a0NhbGxiYWNrcywKICAgICAgICAgICAgICAgICBpbnN0YW5jZS5nZXQoKSwgJmhhbmRsZSk7CiAKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRXJyb3JOb25lOwogICAgIGlmIChpbnN0YW5jZS0+aGFuZGxlKCkgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtTWFzdGVyLT5kZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgIGVyciA9IG1TdG9yZS0+ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE9NWF9DT01QT05FTlRUWVBFKj4oaW5zdGFuY2UtPmhhbmRsZSgpKSk7CiAgICAgfQogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKaW5kZXggNjdmNDc4ZS4uYjVjMTE2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKQEAgLTU0LDYgKzU0LDI0IEBACiAgICAgICAgIH0pOwogICAgIH0KIAorICAgIGlmICghbm9kZXMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGFueU5vZGUgPSBub2Rlcy5jYmVnaW4oKTsKKyAgICAgICAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGZpcnN0ID0gYW55Tm9kZS0+Y2JlZ2luKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBsYXN0ID0gYW55Tm9kZS0+Y2VuZCgpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lIDogbm9kZXMpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdDEgPSBmaXJzdDsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0MiA9IG5hbWUuY2JlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGl0MSAhPSBsYXN0ICYmIGl0MiAhPSBuYW1lLmNlbmQoKSAmJiB0b2xvd2VyKCppdDEpID09IHRvbG93ZXIoKml0Mik7CisgICAgICAgICAgICAgICAgICAgICsraXQxLCArK2l0MikgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IGl0MTsKKyAgICAgICAgfQorICAgICAgICBtUHJlZml4ID0gc3RkOjpzdHJpbmcoZmlyc3QsIGxhc3QpOworICAgICAgICBMT0coSU5GTykgPDwgIm9teCBjb21tb24gcHJlZml4OiAnIiA8PCBtUHJlZml4LmNfc3RyKCkgPDwgIiciOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAib214IGNvbW1vbiBwcmVmaXg6IG5vIG5vZGVzIjsKKyAgICB9CisKICAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXI7CiAgICAgcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoeG1sTmFtZXMsIHNlYXJjaERpcnMpOwogICAgIGlmIChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCAhPSBudWxscHRyKSB7CkBAIC0xMTIsOCArMTMwLDYgQEAKICAgICAgICAgbVJvbGVMaXN0W2ldID0gc3RkOjptb3ZlKHJvbGUpOwogICAgICAgICArK2k7CiAgICAgfQotCi0gICAgbVByZWZpeCA9IHBhcnNlci5nZXRDb21tb25QcmVmaXgoKTsKIH0KIAogT214U3RvcmU6On5PbXhTdG9yZSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggN2QyMTdlYi4uZjdiZjNiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKICAgICAgICAgTWVzc2FnZSB0TXNnOwogICAgICAgICB0TXNnLnR5cGUgPSBNZXNzYWdlOjpUeXBlOjpFVkVOVDsKLSAgICAgICAgdE1zZy5mZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDAsIDApOworICAgICAgICB0TXNnLmZlbmNlLnNldFRvKG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDAsIDApLCAvKiBzaG91bGRPd24gPSAqLyB0cnVlKTsKICAgICAgICAgdE1zZy5kYXRhLmV2ZW50RGF0YS5ldmVudCA9IHVpbnQzMl90KE9NWF9FdmVudERhdGFTcGFjZUNoYW5nZWQpOwogICAgICAgICB0TXNnLmRhdGEuZXZlbnREYXRhLmRhdGExID0gZGF0YVNwYWNlOwogICAgICAgICB0TXNnLmRhdGEuZXZlbnREYXRhLmRhdGEyID0gYXNwZWN0czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKaW5kZXggNzhiNGYxOS4uN2MzNzJjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKQEAgLTcsNyArNyw3IEBACiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwotICAgICAgICAiT01YTWFzdGVyLmNwcCIsCisgICAgICAgICJPTVhTdG9yZS5jcHAiLAogICAgICAgICAiT01YTm9kZUluc3RhbmNlLmNwcCIsCiAgICAgICAgICJPTVhVdGlscy5jcHAiLAogICAgICAgICAiT214R3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk0YjFmNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJPTVhNYXN0ZXIiCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0KLSNpbmNsdWRlIDx2bmRrc3VwcG9ydC9saW5rZXIuaD4KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1PTVhNYXN0ZXI6Ok9NWE1hc3RlcigpIHsKLQotICAgIHBpZF90IHBpZCA9IGdldHBpZCgpOwotICAgIGNoYXIgZmlsZW5hbWVbMjBdOwotICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiL3Byb2MvJWQvY29tbSIsIHBpZCk7Ci0gICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgIEFMT0dXKCJjb3VsZG4ndCBkZXRlcm1pbmUgcHJvY2VzcyBuYW1lIik7Ci0gICAgICBzdHJsY3B5KG1Qcm9jZXNzTmFtZSwgIjx1bmtub3duPiIsIHNpemVvZihtUHJvY2Vzc05hbWUpKTsKLSAgICB9IGVsc2UgewotICAgICAgc3NpemVfdCBsZW4gPSByZWFkKGZkLCBtUHJvY2Vzc05hbWUsIHNpemVvZihtUHJvY2Vzc05hbWUpKTsKLSAgICAgIGlmIChsZW4gPCAyKSB7Ci0gICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkZXRlcm1pbmUgcHJvY2VzcyBuYW1lIik7Ci0gICAgICAgIHN0cmxjcHkobVByb2Nlc3NOYW1lLCAiPHVua25vd24+Iiwgc2l6ZW9mKG1Qcm9jZXNzTmFtZSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gdGhlIG5hbWUgaXMgbmV3bGluZSB0ZXJtaW5hdGVkLCBzbyBlcmFzZSB0aGUgbmV3bGluZQotICAgICAgICBtUHJvY2Vzc05hbWVbbGVuIC0gMV0gPSAwOwotICAgICAgfQotICAgICAgY2xvc2UoZmQpOwotICAgIH0KLQotICAgIGFkZFZlbmRvclBsdWdpbigpOwotICAgIGFkZFBsYXRmb3JtUGx1Z2luKCk7Ci19Ci0KLU9NWE1hc3Rlcjo6fk9NWE1hc3RlcigpIHsKLSAgICBjbGVhclBsdWdpbnMoKTsKLX0KLQotdm9pZCBPTVhNYXN0ZXI6OmFkZFZlbmRvclBsdWdpbigpIHsKLSAgICBhZGRQbHVnaW4oImxpYnN0YWdlZnJpZ2h0aHcuc28iKTsKLX0KLQotdm9pZCBPTVhNYXN0ZXI6OmFkZFBsYXRmb3JtUGx1Z2luKCkgewotICAgIGFkZFBsdWdpbigibGlic3RhZ2VmcmlnaHRfc29mdG9teF9wbHVnaW4uc28iKTsKLX0KLQotdm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKSB7Ci0gICAgaWYgKDo6YW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInZlbmRvci5tZWRpYS5vbXgiLCBpbnQ2NF90KDEpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2b2lkICpsaWJIYW5kbGUgPSBhbmRyb2lkX2xvYWRfc3BoYWxfbGlicmFyeShsaWJuYW1lLCBSVExEX05PVyk7Ci0KLSAgICBpZiAobGliSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHR5cGVkZWYgT01YUGx1Z2luQmFzZSAqKCpDcmVhdGVPTVhQbHVnaW5GdW5jKSgpOwotICAgIENyZWF0ZU9NWFBsdWdpbkZ1bmMgY3JlYXRlT01YUGx1Z2luID0KLSAgICAgICAgKENyZWF0ZU9NWFBsdWdpbkZ1bmMpZGxzeW0oCi0gICAgICAgICAgICAgICAgbGliSGFuZGxlLCAiY3JlYXRlT01YUGx1Z2luIik7Ci0gICAgaWYgKCFjcmVhdGVPTVhQbHVnaW4pCi0gICAgICAgIGNyZWF0ZU9NWFBsdWdpbiA9IChDcmVhdGVPTVhQbHVnaW5GdW5jKWRsc3ltKAotICAgICAgICAgICAgICAgIGxpYkhhbmRsZSwgIl9aTjdhbmRyb2lkMTVjcmVhdGVPTVhQbHVnaW5FdiIpOwotCi0gICAgT01YUGx1Z2luQmFzZSAqcGx1Z2luID0gbnVsbHB0cjsKLSAgICBpZiAoY3JlYXRlT01YUGx1Z2luKSB7Ci0gICAgICAgIHBsdWdpbiA9ICgqY3JlYXRlT01YUGx1Z2luKSgpOwotICAgIH0KLQotICAgIGlmIChwbHVnaW4pIHsKLSAgICAgICAgbVBsdWdpbnMucHVzaF9iYWNrKHsgcGx1Z2luLCBsaWJIYW5kbGUgfSk7Ci0gICAgICAgIGFkZFBsdWdpbihwbHVnaW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFuZHJvaWRfdW5sb2FkX3NwaGFsX2xpYnJhcnkobGliSGFuZGxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIE9NWF9VMzIgaW5kZXggPSAwOwotCi0gICAgY2hhciBuYW1lWzEyOF07Ci0gICAgT01YX0VSUk9SVFlQRSBlcnI7Ci0gICAgd2hpbGUgKChlcnIgPSBwbHVnaW4tPmVudW1lcmF0ZUNvbXBvbmVudHMoCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsIHNpemVvZihuYW1lKSwgaW5kZXgrKykpID09IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgU3RyaW5nOCBuYW1lOChuYW1lKTsKLQotICAgICAgICBpZiAobVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5pbmRleE9mS2V5KG5hbWU4KSA+PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQSBjb21wb25lbnQgb2YgbmFtZSAnJXMnIGFscmVhZHkgZXhpc3RzLCBpZ25vcmluZyB0aGlzIG9uZS4iLAotICAgICAgICAgICAgICAgICBuYW1lOC5zdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5hZGQobmFtZTgsIHBsdWdpbik7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb01vcmUpIHsKLSAgICAgICAgQUxPR0UoIk9NWCBwbHVnaW4gZmFpbGVkIHcvIGVycm9yIDB4JTA4eCBhZnRlciByZWdpc3RlcmluZyAlenUgIgotICAgICAgICAgICAgICJjb21wb25lbnRzIiwgZXJyLCBtUGx1Z2luQnlDb21wb25lbnROYW1lLnNpemUoKSk7Ci0gICAgfQotfQotCi12b2lkIE9NWE1hc3Rlcjo6Y2xlYXJQbHVnaW5zKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtUGx1Z2luQnlDb21wb25lbnROYW1lLmNsZWFyKCk7Ci0gICAgbVBsdWdpbkJ5SW5zdGFuY2UuY2xlYXIoKTsKLQotICAgIHR5cGVkZWYgdm9pZCAoKkRlc3Ryb3lPTVhQbHVnaW5GdW5jKShPTVhQbHVnaW5CYXNlKik7Ci0gICAgZm9yIChjb25zdCBQbHVnaW4gJnBsdWdpbiA6IG1QbHVnaW5zKSB7Ci0gICAgICAgIERlc3Ryb3lPTVhQbHVnaW5GdW5jIGRlc3Ryb3lPTVhQbHVnaW4gPQotICAgICAgICAgICAgKERlc3Ryb3lPTVhQbHVnaW5GdW5jKWRsc3ltKAotICAgICAgICAgICAgICAgICAgICBwbHVnaW4ubUxpYkhhbmRsZSwgImRlc3Ryb3lPTVhQbHVnaW4iKTsKLSAgICAgICAgaWYgKGRlc3Ryb3lPTVhQbHVnaW4pCi0gICAgICAgICAgICBkZXN0cm95T01YUGx1Z2luKHBsdWdpbi5tT214KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVsZXRlIHBsdWdpbi5tT214OwotCi0gICAgICAgIGFuZHJvaWRfdW5sb2FkX3NwaGFsX2xpYnJhcnkocGx1Z2luLm1MaWJIYW5kbGUpOwotICAgIH0KLQotICAgIG1QbHVnaW5zLmNsZWFyKCk7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgT01YTWFzdGVyOjptYWtlQ29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewotICAgIEFMT0dJKCJtYWtlQ29tcG9uZW50SW5zdGFuY2UoJXMpIGluICVzIHByb2Nlc3MiLCBuYW1lLCBtUHJvY2Vzc05hbWUpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqY29tcG9uZW50ID0gTlVMTDsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLmluZGV4T2ZLZXkoU3RyaW5nOChuYW1lKSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKLSAgICB9Ci0KLSAgICBPTVhQbHVnaW5CYXNlICpwbHVnaW4gPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLnZhbHVlQXQoaW5kZXgpOwotICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KLSAgICAgICAgcGx1Z2luLT5tYWtlQ29tcG9uZW50SW5zdGFuY2UobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOwotCi0gICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbVBsdWdpbkJ5SW5zdGFuY2UuYWRkKCpjb21wb25lbnQsIHBsdWdpbik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1PTVhfRVJST1JUWVBFIE9NWE1hc3Rlcjo6ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtUGx1Z2luQnlJbnN0YW5jZS5pbmRleE9mS2V5KGNvbXBvbmVudCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgfQotCi0gICAgT01YUGx1Z2luQmFzZSAqcGx1Z2luID0gbVBsdWdpbkJ5SW5zdGFuY2UudmFsdWVBdChpbmRleCk7Ci0gICAgbVBsdWdpbkJ5SW5zdGFuY2UucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICByZXR1cm4gcGx1Z2luLT5kZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50KTsKLX0KLQotT01YX0VSUk9SVFlQRSBPTVhNYXN0ZXI6OmVudW1lcmF0ZUNvbXBvbmVudHMoCi0gICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKLSAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgIE9NWF9VMzIgaW5kZXgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc2l6ZV90IG51bUNvbXBvbmVudHMgPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLnNpemUoKTsKLQotICAgIGlmIChpbmRleCA+PSBudW1Db21wb25lbnRzKSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7Ci0gICAgfQotCi0gICAgY29uc3QgU3RyaW5nOCAmbmFtZTggPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLmtleUF0KGluZGV4KTsKLQotICAgIENIRUNLKHNpemUgPj0gMSArIG5hbWU4LnNpemUoKSk7Ci0gICAgc3RyY3B5KG5hbWUsIG5hbWU4LnN0cmluZygpKTsKLQotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotfQotCi1PTVhfRVJST1JUWVBFIE9NWE1hc3Rlcjo6Z2V0Um9sZXNPZkNvbXBvbmVudCgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByb2xlcy0+Y2xlYXIoKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLmluZGV4T2ZLZXkoU3RyaW5nOChuYW1lKSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKLSAgICB9Ci0KLSAgICBPTVhQbHVnaW5CYXNlICpwbHVnaW4gPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBwbHVnaW4tPmdldFJvbGVzT2ZDb21wb25lbnQobmFtZSwgcm9sZXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCBhYzQyMzczLi5iZWJkNTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZlZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiT01YU3RvcmUiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPHZuZGtzdXBwb3J0L2xpbmtlci5oPgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK09NWFN0b3JlOjpPTVhTdG9yZSgpIHsKKworICAgIHBpZF90IHBpZCA9IGdldHBpZCgpOworICAgIGNoYXIgZmlsZW5hbWVbMjBdOworICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiL3Byb2MvJWQvY29tbSIsIHBpZCk7CisgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgIEFMT0dXKCJjb3VsZG4ndCBkZXRlcm1pbmUgcHJvY2VzcyBuYW1lIik7CisgICAgICBzdHJsY3B5KG1Qcm9jZXNzTmFtZSwgIjx1bmtub3duPiIsIHNpemVvZihtUHJvY2Vzc05hbWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgc3NpemVfdCBsZW4gPSByZWFkKGZkLCBtUHJvY2Vzc05hbWUsIHNpemVvZihtUHJvY2Vzc05hbWUpKTsKKyAgICAgIGlmIChsZW4gPCAyKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkZXRlcm1pbmUgcHJvY2VzcyBuYW1lIik7CisgICAgICAgIHN0cmxjcHkobVByb2Nlc3NOYW1lLCAiPHVua25vd24+Iiwgc2l6ZW9mKG1Qcm9jZXNzTmFtZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdGhlIG5hbWUgaXMgbmV3bGluZSB0ZXJtaW5hdGVkLCBzbyBlcmFzZSB0aGUgbmV3bGluZQorICAgICAgICBtUHJvY2Vzc05hbWVbbGVuIC0gMV0gPSAwOworICAgICAgfQorICAgICAgY2xvc2UoZmQpOworICAgIH0KKworICAgIGFkZFZlbmRvclBsdWdpbigpOworICAgIGFkZFBsYXRmb3JtUGx1Z2luKCk7Cit9CisKK09NWFN0b3JlOjp+T01YU3RvcmUoKSB7CisgICAgY2xlYXJQbHVnaW5zKCk7Cit9CisKK3ZvaWQgT01YU3RvcmU6OmFkZFZlbmRvclBsdWdpbigpIHsKKyAgICBhZGRQbHVnaW4oImxpYnN0YWdlZnJpZ2h0aHcuc28iKTsKK30KKwordm9pZCBPTVhTdG9yZTo6YWRkUGxhdGZvcm1QbHVnaW4oKSB7CisgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbi5zbyIpOworfQorCit2b2lkIE9NWFN0b3JlOjphZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSkgeworICAgIGlmICg6OmFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJ2ZW5kb3IubWVkaWEub214IiwgaW50NjRfdCgxKSkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdm9pZCAqbGliSGFuZGxlID0gYW5kcm9pZF9sb2FkX3NwaGFsX2xpYnJhcnkobGlibmFtZSwgUlRMRF9OT1cpOworCisgICAgaWYgKGxpYkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIE9NWFBsdWdpbkJhc2UgKigqQ3JlYXRlT01YUGx1Z2luRnVuYykoKTsKKyAgICBDcmVhdGVPTVhQbHVnaW5GdW5jIGNyZWF0ZU9NWFBsdWdpbiA9CisgICAgICAgIChDcmVhdGVPTVhQbHVnaW5GdW5jKWRsc3ltKAorICAgICAgICAgICAgICAgIGxpYkhhbmRsZSwgImNyZWF0ZU9NWFBsdWdpbiIpOworICAgIGlmICghY3JlYXRlT01YUGx1Z2luKQorICAgICAgICBjcmVhdGVPTVhQbHVnaW4gPSAoQ3JlYXRlT01YUGx1Z2luRnVuYylkbHN5bSgKKyAgICAgICAgICAgICAgICBsaWJIYW5kbGUsICJfWk43YW5kcm9pZDE1Y3JlYXRlT01YUGx1Z2luRXYiKTsKKworICAgIE9NWFBsdWdpbkJhc2UgKnBsdWdpbiA9IG51bGxwdHI7CisgICAgaWYgKGNyZWF0ZU9NWFBsdWdpbikgeworICAgICAgICBwbHVnaW4gPSAoKmNyZWF0ZU9NWFBsdWdpbikoKTsKKyAgICB9CisKKyAgICBpZiAocGx1Z2luKSB7CisgICAgICAgIG1QbHVnaW5zLnB1c2hfYmFjayh7IHBsdWdpbiwgbGliSGFuZGxlIH0pOworICAgICAgICBhZGRQbHVnaW4ocGx1Z2luKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhbmRyb2lkX3VubG9hZF9zcGhhbF9saWJyYXJ5KGxpYkhhbmRsZSk7CisgICAgfQorfQorCit2b2lkIE9NWFN0b3JlOjphZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIE9NWF9VMzIgaW5kZXggPSAwOworCisgICAgY2hhciBuYW1lWzEyOF07CisgICAgT01YX0VSUk9SVFlQRSBlcnI7CisgICAgd2hpbGUgKChlcnIgPSBwbHVnaW4tPmVudW1lcmF0ZUNvbXBvbmVudHMoCisgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNpemVvZihuYW1lKSwgaW5kZXgrKykpID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU3RyaW5nOCBuYW1lOChuYW1lKTsKKworICAgICAgICBpZiAobVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5pbmRleE9mS2V5KG5hbWU4KSA+PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQSBjb21wb25lbnQgb2YgbmFtZSAnJXMnIGFscmVhZHkgZXhpc3RzLCBpZ25vcmluZyB0aGlzIG9uZS4iLAorICAgICAgICAgICAgICAgICBuYW1lOC5zdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5hZGQobmFtZTgsIHBsdWdpbik7CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb01vcmUpIHsKKyAgICAgICAgQUxPR0UoIk9NWCBwbHVnaW4gZmFpbGVkIHcvIGVycm9yIDB4JTA4eCBhZnRlciByZWdpc3RlcmluZyAlenUgIgorICAgICAgICAgICAgICJjb21wb25lbnRzIiwgZXJyLCBtUGx1Z2luQnlDb21wb25lbnROYW1lLnNpemUoKSk7CisgICAgfQorfQorCit2b2lkIE9NWFN0b3JlOjpjbGVhclBsdWdpbnMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICBtUGx1Z2luQnlJbnN0YW5jZS5jbGVhcigpOworCisgICAgdHlwZWRlZiB2b2lkICgqRGVzdHJveU9NWFBsdWdpbkZ1bmMpKE9NWFBsdWdpbkJhc2UqKTsKKyAgICBmb3IgKGNvbnN0IFBsdWdpbiAmcGx1Z2luIDogbVBsdWdpbnMpIHsKKyAgICAgICAgRGVzdHJveU9NWFBsdWdpbkZ1bmMgZGVzdHJveU9NWFBsdWdpbiA9CisgICAgICAgICAgICAoRGVzdHJveU9NWFBsdWdpbkZ1bmMpZGxzeW0oCisgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5tTGliSGFuZGxlLCAiZGVzdHJveU9NWFBsdWdpbiIpOworICAgICAgICBpZiAoZGVzdHJveU9NWFBsdWdpbikKKyAgICAgICAgICAgIGRlc3Ryb3lPTVhQbHVnaW4ocGx1Z2luLm1PbXgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZWxldGUgcGx1Z2luLm1PbXg7CisKKyAgICAgICAgYW5kcm9pZF91bmxvYWRfc3BoYWxfbGlicmFyeShwbHVnaW4ubUxpYkhhbmRsZSk7CisgICAgfQorCisgICAgbVBsdWdpbnMuY2xlYXIoKTsKK30KKworT01YX0VSUk9SVFlQRSBPTVhTdG9yZTo6bWFrZUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICBBTE9HSSgibWFrZUNvbXBvbmVudEluc3RhbmNlKCVzKSBpbiAlcyBwcm9jZXNzIiwgbmFtZSwgbVByb2Nlc3NOYW1lKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgKmNvbXBvbmVudCA9IE5VTEw7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5pbmRleE9mS2V5KFN0cmluZzgobmFtZSkpOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWU7CisgICAgfQorCisgICAgT01YUGx1Z2luQmFzZSAqcGx1Z2luID0gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS52YWx1ZUF0KGluZGV4KTsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9CisgICAgICAgIHBsdWdpbi0+bWFrZUNvbXBvbmVudEluc3RhbmNlKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKKworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1QbHVnaW5CeUluc3RhbmNlLmFkZCgqY29tcG9uZW50LCBwbHVnaW4pOworCisgICAgcmV0dXJuIGVycjsKK30KKworT01YX0VSUk9SVFlQRSBPTVhTdG9yZTo6ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtUGx1Z2luQnlJbnN0YW5jZS5pbmRleE9mS2V5KGNvbXBvbmVudCk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorCisgICAgT01YUGx1Z2luQmFzZSAqcGx1Z2luID0gbVBsdWdpbkJ5SW5zdGFuY2UudmFsdWVBdChpbmRleCk7CisgICAgbVBsdWdpbkJ5SW5zdGFuY2UucmVtb3ZlSXRlbXNBdChpbmRleCk7CisKKyAgICByZXR1cm4gcGx1Z2luLT5kZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50KTsKK30KKworT01YX0VSUk9SVFlQRSBPTVhTdG9yZTo6ZW51bWVyYXRlQ29tcG9uZW50cygKKyAgICAgICAgT01YX1NUUklORyBuYW1lLAorICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgT01YX1UzMiBpbmRleCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzaXplX3QgbnVtQ29tcG9uZW50cyA9IG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuc2l6ZSgpOworCisgICAgaWYgKGluZGV4ID49IG51bUNvbXBvbmVudHMpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICB9CisKKyAgICBjb25zdCBTdHJpbmc4ICZuYW1lOCA9IG1QbHVnaW5CeUNvbXBvbmVudE5hbWUua2V5QXQoaW5kZXgpOworCisgICAgQ0hFQ0soc2l6ZSA+PSAxICsgbmFtZTguc2l6ZSgpKTsKKyAgICBzdHJjcHkobmFtZSwgbmFtZTguc3RyaW5nKCkpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgT01YU3RvcmU6OmdldFJvbGVzT2ZDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgcm9sZXMtPmNsZWFyKCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5pbmRleE9mS2V5KFN0cmluZzgobmFtZSkpOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWU7CisgICAgfQorCisgICAgT01YUGx1Z2luQmFzZSAqcGx1Z2luID0gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gcGx1Z2luLT5nZXRSb2xlc09mQ29tcG9uZW50KG5hbWUsIHJvbGVzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCmluZGV4IDFiODQ5M2EuLjQ5YjJkZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcApAQCAtMTcyLDYgKzE3Miw4IEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYzQiLCAiYXVkaW9fZW5jb2Rlci5hYzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAogICAgICAgICAgICAgImltYWdlX2RlY29kZXIuaGVpYyIsICJpbWFnZV9lbmNvZGVyLmhlaWMiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRiwKKyAgICAgICAgICAgICJpbWFnZV9kZWNvZGVyLmF2aWYiLCAiaW1hZ2VfZW5jb2Rlci5hdmlmIiB9LAogICAgIH07CiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NaW1lVG9Sb2xlID0KQEAgLTM1NCw3ICszNTYsNyBAQAogICAgIERlc2NyaWJlQ29sb3JGb3JtYXQyUGFyYW1zIGRlc2NyaWJlUGFyYW1zOwogICAgIEluaXRPTVhQYXJhbXMoJmRlc2NyaWJlUGFyYW1zKTsKICAgICBkZXNjcmliZVBhcmFtcy5lQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7Ci0gICAgLy8gcmVhc29uYWJsZSBkdW1teSB2YWx1ZXMKKyAgICAvLyByZWFzb25hYmxlIGluaXRpYWwgdmFsdWVzICh0aGF0IHdpbGwgYmUgb3ZlcndyaXR0ZW4pCiAgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lV2lkdGggPSAxMjg7CiAgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lSGVpZ2h0ID0gMTI4OwogICAgIGRlc2NyaWJlUGFyYW1zLm5TdHJpZGUgPSAxMjg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggZGRiNDU5Zi4uNDQ0MTVhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMTcsNiArMTcsMTAgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlU29mdE9NWENvbXBvbmVudCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxPTVhfQ29yZS5oPgorI2luY2x1ZGUgPE9NWF9BdWRpby5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNzQsNyArNzgsNyBAQAogCiAgICAgT01YX1UzMiBwb3J0SW5kZXg7CiAKLSAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZnMgPQpAQCAtMTA4LDYgKzExMiwxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY0RyY1ByZXNlbnRhdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDRFJDUFJFU0VOVEFUSU9OVFlQRSAqYWFjUHJlc1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ0RSQ1BSRVNFTlRBVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQcmVzUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKaW5kZXggNWE0NmIyNi4uODRhZTUxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCkBAIC0yNyw3ICsyNyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE9NWE1hc3RlcjsKK3N0cnVjdCBPTVhTdG9yZTsKIHN0cnVjdCBPTVhOb2RlSW5zdGFuY2U7CiAKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CkBAIC01MSw3ICs1MSw3IEBACiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogdXNpbmcgOjphbmRyb2lkOjp3cDsKIAotdXNpbmcgOjphbmRyb2lkOjpPTVhNYXN0ZXI7Cit1c2luZyA6OmFuZHJvaWQ6Ok9NWFN0b3JlOwogdXNpbmcgOjphbmRyb2lkOjpPTVhOb2RlSW5zdGFuY2U7CiAKIHN0cnVjdCBPbXggOiBwdWJsaWMgSU9teCwgcHVibGljIGhpZGxfZGVhdGhfcmVjaXBpZW50IHsKQEAgLTczLDcgKzczLDcgQEAKICAgICBzdGF0dXNfdCBmcmVlTm9kZShzcDxPTVhOb2RlSW5zdGFuY2U+IGNvbnN0JiBpbnN0YW5jZSk7CiAKIHByb3RlY3RlZDoKLSAgICBPTVhNYXN0ZXIqIG1NYXN0ZXI7CisgICAgT01YU3RvcmUqIG1TdG9yZTsKICAgICBNdXRleCBtTG9jazsKICAgICBLZXllZFZlY3Rvcjx3cDxJQmFzZT4sIHNwPE9NWE5vZGVJbnN0YW5jZT4gPiBtTGl2ZU5vZGVzOwogICAgIEtleWVkVmVjdG9yPE9NWE5vZGVJbnN0YW5jZSosIHdwPElCYXNlPiA+IG1Ob2RlMk9ic2VydmVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2VhZWYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE9NWF9NQVNURVJfSF8KLQotI2RlZmluZSBPTVhfTUFTVEVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9PTVhQbHVnaW5CYXNlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBPTVhNYXN0ZXIgOiBwdWJsaWMgT01YUGx1Z2luQmFzZSB7Ci0gICAgT01YTWFzdGVyKCk7Ci0gICAgdmlydHVhbCB+T01YTWFzdGVyKCk7Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGVDb21wb25lbnRzKAotICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBPTVhfVTMyIGluZGV4KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpOwotCi1wcml2YXRlOgotICAgIGNoYXIgbVByb2Nlc3NOYW1lWzE2XTsKLSAgICBNdXRleCBtTG9jazsKLSAgICBzdHJ1Y3QgUGx1Z2luIHsKLSAgICAgICAgT01YUGx1Z2luQmFzZSAqbU9teDsKLSAgICAgICAgdm9pZCAqbUxpYkhhbmRsZTsKLSAgICB9OwotICAgIExpc3Q8UGx1Z2luPiBtUGx1Z2luczsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBPTVhQbHVnaW5CYXNlICo+IG1QbHVnaW5CeUNvbXBvbmVudE5hbWU7Ci0gICAgS2V5ZWRWZWN0b3I8T01YX0NPTVBPTkVOVFRZUEUgKiwgT01YUGx1Z2luQmFzZSAqPiBtUGx1Z2luQnlJbnN0YW5jZTsKLQotICAgIHZvaWQgYWRkVmVuZG9yUGx1Z2luKCk7Ci0gICAgdm9pZCBhZGRQbGF0Zm9ybVBsdWdpbigpOwotICAgIHZvaWQgYWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpOwotICAgIHZvaWQgYWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbik7Ci0gICAgdm9pZCBjbGVhclBsdWdpbnMoKTsKLQotICAgIE9NWE1hc3Rlcihjb25zdCBPTVhNYXN0ZXIgJik7Ci0gICAgT01YTWFzdGVyICZvcGVyYXRvcj0oY29uc3QgT01YTWFzdGVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBPTVhfTUFTVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKaW5kZXggYTc2MWVmNi4uNWYzMmM5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaApAQCAtMzMsNyArMzMsNyBAQAogY2xhc3MgR3JhcGhpY0J1ZmZlcjsKIGNsYXNzIElPTVhCdWZmZXJTb3VyY2U7CiBjbGFzcyBJT01YT2JzZXJ2ZXI7Ci1zdHJ1Y3QgT01YTWFzdGVyOworc3RydWN0IE9NWFN0b3JlOwogY2xhc3MgT01YQnVmZmVyOwogdXNpbmcgSUhpZGxNZW1vcnkgPSBoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7CiB1c2luZyBoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6aW1wbGVtZW50YXRpb246Ok9teDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2YzNlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9NWF9TVE9SRV9IXworCisjZGVmaW5lIE9NWF9TVE9SRV9IXworCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvT01YUGx1Z2luQmFzZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT01YU3RvcmUgOiBwdWJsaWMgT01YUGx1Z2luQmFzZSB7CisgICAgT01YU3RvcmUoKTsKKyAgICB2aXJ0dWFsIH5PTVhTdG9yZSgpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIG1ha2VDb21wb25lbnRJbnN0YW5jZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKmNvbXBvbmVudCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZW51bWVyYXRlQ29tcG9uZW50cygKKyAgICAgICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgT01YX1UzMiBpbmRleCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0Um9sZXNPZkNvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICBWZWN0b3I8U3RyaW5nOD4gKnJvbGVzKTsKKworcHJpdmF0ZToKKyAgICBjaGFyIG1Qcm9jZXNzTmFtZVsxNl07CisgICAgTXV0ZXggbUxvY2s7CisgICAgc3RydWN0IFBsdWdpbiB7CisgICAgICAgIE9NWFBsdWdpbkJhc2UgKm1PbXg7CisgICAgICAgIHZvaWQgKm1MaWJIYW5kbGU7CisgICAgfTsKKyAgICBMaXN0PFBsdWdpbj4gbVBsdWdpbnM7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgT01YUGx1Z2luQmFzZSAqPiBtUGx1Z2luQnlDb21wb25lbnROYW1lOworICAgIEtleWVkVmVjdG9yPE9NWF9DT01QT05FTlRUWVBFICosIE9NWFBsdWdpbkJhc2UgKj4gbVBsdWdpbkJ5SW5zdGFuY2U7CisKKyAgICB2b2lkIGFkZFZlbmRvclBsdWdpbigpOworICAgIHZvaWQgYWRkUGxhdGZvcm1QbHVnaW4oKTsKKyAgICB2b2lkIGFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKTsKKyAgICB2b2lkIGFkZFBsdWdpbihPTVhQbHVnaW5CYXNlICpwbHVnaW4pOworICAgIHZvaWQgY2xlYXJQbHVnaW5zKCk7CisKKyAgICBPTVhTdG9yZShjb25zdCBPTVhTdG9yZSAmKTsKKyAgICBPTVhTdG9yZSAmb3BlcmF0b3I9KGNvbnN0IE9NWFN0b3JlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPTVhfU1RPUkVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3Zjg0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTExIEBACitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogInJlbmRlcmZyaWdodF9kZWZhdWx0cyIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRExPR19UQUc9XCJyZW5kZXJmcmlnaHRcIiIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XdGhyZWFkLXNhZmV0eSIsCisgICAgICAgICItV3VudXNlZCIsCisgICAgICAgICItV3VucmVhY2hhYmxlLWNvZGUiLAorICAgIF0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlicmVuZGVyZnJpZ2h0X2RlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJyZW5kZXJmcmlnaHRfZGVmYXVsdHMiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ER0xfR0xFWFRfUFJPVE9UWVBFUyIsCisgICAgICAgICItREVHTF9FR0xFWFRfUFJPVE9UWVBFUyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliRUdMIiwKKyAgICAgICAgImxpYkdMRVN2MV9DTSIsCisgICAgICAgICJsaWJHTEVTdjIiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICAgICAgImxpYnN5bmMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibGlicmVuZGVyZnJpZ2h0X3NvdXJjZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkRlc2NyaXB0aW9uLmNwcCIsCisgICAgICAgICJNZXNoLmNwcCIsCisgICAgICAgICJSZW5kZXJFbmdpbmUuY3BwIiwKKyAgICAgICAgIlRleHR1cmUuY3BwIiwKKyAgICBdLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJsaWJyZW5kZXJmcmlnaHRfZ2xfc291cmNlcyIsCisgICAgc3JjczogWworICAgICAgICAiZ2wvR0xFU1JlbmRlckVuZ2luZS5jcHAiLAorICAgICAgICAiZ2wvR0xFeHRlbnNpb25zLmNwcCIsCisgICAgICAgICJnbC9HTEZyYW1lYnVmZmVyLmNwcCIsCisgICAgICAgICJnbC9HTEltYWdlLmNwcCIsCisgICAgICAgICJnbC9HTFNoYWRvd1RleHR1cmUuY3BwIiwKKyAgICAgICAgImdsL0dMU2hhZG93VmVydGV4R2VuZXJhdG9yLmNwcCIsCisgICAgICAgICJnbC9HTFNraWFTaGFkb3dQb3J0LmNwcCIsCisgICAgICAgICJnbC9HTFZlcnRleEJ1ZmZlci5jcHAiLAorICAgICAgICAiZ2wvSW1hZ2VNYW5hZ2VyLmNwcCIsCisgICAgICAgICJnbC9Qcm9ncmFtLmNwcCIsCisgICAgICAgICJnbC9Qcm9ncmFtQ2FjaGUuY3BwIiwKKyAgICAgICAgImdsL2ZpbHRlcnMvQmx1ckZpbHRlci5jcHAiLAorICAgICAgICAiZ2wvZmlsdGVycy9HZW5lcmljUHJvZ3JhbS5jcHAiLAorICAgIF0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImxpYnJlbmRlcmZyaWdodF90aHJlYWRlZF9zb3VyY2VzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0aHJlYWRlZC9SZW5kZXJFbmdpbmVUaHJlYWRlZC5jcHAiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlicmVuZGVyZnJpZ2h0IiwKKyAgICBkZWZhdWx0czogWyJsaWJyZW5kZXJmcmlnaHRfZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBjbGFuZzogdHJ1ZSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVdlcnJvcj1mb3JtYXQiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiOmxpYnJlbmRlcmZyaWdodF9zb3VyY2VzIiwKKyAgICAgICAgIjpsaWJyZW5kZXJmcmlnaHRfZ2xfc291cmNlcyIsCisgICAgICAgICI6bGlicmVuZGVyZnJpZ2h0X3RocmVhZGVkX3NvdXJjZXMiLAorICAgIF0sCisgICAgbHRvOiB7CisgICAgICAgIHRoaW46IHRydWUsCisgICAgfSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJyZW5kZXJmcmlnaHRfbW9ja3MiLAorICAgIGRlZmF1bHRzOiBbImxpYnJlbmRlcmZyaWdodF9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1vY2svRnJhbWVidWZmZXIuY3BwIiwKKyAgICAgICAgIm1vY2svSW1hZ2UuY3BwIiwKKyAgICAgICAgIm1vY2svUmVuZGVyRW5naW5lLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ3Rlc3QiLAorICAgICAgICAibGliZ21vY2siLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvRGVzY3JpcHRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Y2VhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvRGVzY3JpcHRpb24uY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvcHJpdmF0ZS9EZXNjcmlwdGlvbi5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKKworRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb24gRGVzY3JpcHRpb246OmRhdGFTcGFjZVRvVHJhbnNmZXJGdW5jdGlvbih1aTo6RGF0YXNwYWNlIGRhdGFTcGFjZSkgeworICAgIHVpOjpEYXRhc3BhY2UgdHJhbnNmZXIgPSBzdGF0aWNfY2FzdDx1aTo6RGF0YXNwYWNlPihkYXRhU3BhY2UgJiB1aTo6RGF0YXNwYWNlOjpUUkFOU0ZFUl9NQVNLKTsKKyAgICBzd2l0Y2ggKHRyYW5zZmVyKSB7CisgICAgICAgIGNhc2UgdWk6OkRhdGFzcGFjZTo6VFJBTlNGRVJfU1QyMDg0OgorICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uOjpUcmFuc2ZlckZ1bmN0aW9uOjpTVDIwODQ7CisgICAgICAgIGNhc2UgdWk6OkRhdGFzcGFjZTo6VFJBTlNGRVJfSExHOgorICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uOjpUcmFuc2ZlckZ1bmN0aW9uOjpITEc7CisgICAgICAgIGNhc2UgdWk6OkRhdGFzcGFjZTo6VFJBTlNGRVJfTElORUFSOgorICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uOjpUcmFuc2ZlckZ1bmN0aW9uOjpMSU5FQVI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OlNSR0I7CisgICAgfQorfQorCitib29sIERlc2NyaXB0aW9uOjpoYXNJbnB1dFRyYW5zZm9ybU1hdHJpeCgpIGNvbnN0IHsKKyAgICBjb25zdCBtYXQ0IGlkZW50aXR5OworICAgIHJldHVybiBpbnB1dFRyYW5zZm9ybU1hdHJpeCAhPSBpZGVudGl0eTsKK30KKworYm9vbCBEZXNjcmlwdGlvbjo6aGFzT3V0cHV0VHJhbnNmb3JtTWF0cml4KCkgY29uc3QgeworICAgIGNvbnN0IG1hdDQgaWRlbnRpdHk7CisgICAgcmV0dXJuIG91dHB1dFRyYW5zZm9ybU1hdHJpeCAhPSBpZGVudGl0eTsKK30KKworYm9vbCBEZXNjcmlwdGlvbjo6aGFzQ29sb3JNYXRyaXgoKSBjb25zdCB7CisgICAgY29uc3QgbWF0NCBpZGVudGl0eTsKKyAgICByZXR1cm4gY29sb3JNYXRyaXggIT0gaWRlbnRpdHk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L01lc2guY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L01lc2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMmY0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvTWVzaC5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvTWVzaC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitNZXNoOjpNZXNoKFByaW1pdGl2ZSBwcmltaXRpdmUsIHNpemVfdCB2ZXJ0ZXhDb3VudCwgc2l6ZV90IHZlcnRleFNpemUsIHNpemVfdCB0ZXhDb29yZFNpemUsCisgICAgICAgICAgIHNpemVfdCBjcm9wQ29vcmRzU2l6ZSwgc2l6ZV90IHNoYWRvd0NvbG9yU2l6ZSwgc2l6ZV90IHNoYWRvd1BhcmFtc1NpemUsCisgICAgICAgICAgIHNpemVfdCBpbmRleENvdW50KQorICAgICAgOiBtVmVydGV4Q291bnQodmVydGV4Q291bnQpLAorICAgICAgICBtVmVydGV4U2l6ZSh2ZXJ0ZXhTaXplKSwKKyAgICAgICAgbVRleENvb3Jkc1NpemUodGV4Q29vcmRTaXplKSwKKyAgICAgICAgbUNyb3BDb29yZHNTaXplKGNyb3BDb29yZHNTaXplKSwKKyAgICAgICAgbVNoYWRvd0NvbG9yU2l6ZShzaGFkb3dDb2xvclNpemUpLAorICAgICAgICBtU2hhZG93UGFyYW1zU2l6ZShzaGFkb3dQYXJhbXNTaXplKSwKKyAgICAgICAgbVByaW1pdGl2ZShwcmltaXRpdmUpLAorICAgICAgICBtSW5kZXhDb3VudChpbmRleENvdW50KSB7CisgICAgaWYgKHZlcnRleENvdW50ID09IDApIHsKKyAgICAgICAgbVZlcnRpY2VzLnJlc2l6ZSgxKTsKKyAgICAgICAgbVZlcnRpY2VzWzBdID0gMC4wZjsKKyAgICAgICAgbVN0cmlkZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IHN0cmlkZSA9IHZlcnRleFNpemUgKyB0ZXhDb29yZFNpemUgKyBjcm9wQ29vcmRzU2l6ZSArIHNoYWRvd0NvbG9yU2l6ZSArIHNoYWRvd1BhcmFtc1NpemU7CisgICAgc2l6ZV90IHJlbWFpbmRlciA9IChzdHJpZGUgKiB2ZXJ0ZXhDb3VudCkgLyB2ZXJ0ZXhDb3VudDsKKyAgICAvLyBTaW5jZSBhbGwgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgYXJlIHVuc2lnbmVkLCBpZiBzdHJpZGUgaXMgbGVzcyB0aGFuCisgICAgLy8gZWl0aGVyIHZlcnRleFNpemUgb3IgdGV4Q29vcmRTaXplLCBpdCBtdXN0IGhhdmUgb3ZlcmZsb3dlZC4gcmVtYWluZGVyCisgICAgLy8gd2lsbCBiZSBlcXVhbCB0byBzdHJpZGUgYXMgbG9uZyBhcyBzdHJpZGUgKiB2ZXJ0ZXhDb3VudCBkb2Vzbid0IG92ZXJmbG93LgorICAgIGlmICgoc3RyaWRlIDwgdmVydGV4U2l6ZSkgfHwgKHJlbWFpbmRlciAhPSBzdHJpZGUpKSB7CisgICAgICAgIEFMT0dFKCJPdmVyZmxvdyBpbiBNZXNoKC4uLiwgJXp1LCAlenUsICV6dSwgJXp1LCAlenUsICV6dSkiLCB2ZXJ0ZXhDb3VudCwgdmVydGV4U2l6ZSwKKyAgICAgICAgICAgICAgdGV4Q29vcmRTaXplLCBjcm9wQ29vcmRzU2l6ZSwgc2hhZG93Q29sb3JTaXplLCBzaGFkb3dQYXJhbXNTaXplKTsKKyAgICAgICAgbVZlcnRpY2VzLnJlc2l6ZSgxKTsKKyAgICAgICAgbVZlcnRpY2VzWzBdID0gMC4wZjsKKyAgICAgICAgbVZlcnRleENvdW50ID0gMDsKKyAgICAgICAgbVZlcnRleFNpemUgPSAwOworICAgICAgICBtVGV4Q29vcmRzU2l6ZSA9IDA7CisgICAgICAgIG1Dcm9wQ29vcmRzU2l6ZSA9IDA7CisgICAgICAgIG1TaGFkb3dDb2xvclNpemUgPSAwOworICAgICAgICBtU2hhZG93UGFyYW1zU2l6ZSA9IDA7CisgICAgICAgIG1TdHJpZGUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVZlcnRpY2VzLnJlc2l6ZShzdHJpZGUgKiB2ZXJ0ZXhDb3VudCk7CisgICAgbVN0cmlkZSA9IHN0cmlkZTsKKyAgICBtSW5kaWNlcy5yZXNpemUoaW5kZXhDb3VudCk7Cit9CisKK01lc2g6OlByaW1pdGl2ZSBNZXNoOjpnZXRQcmltaXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmltaXRpdmU7Cit9CisKK2Zsb2F0IGNvbnN0KiBNZXNoOjpnZXRQb3NpdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCk7Cit9CitmbG9hdCogTWVzaDo6Z2V0UG9zaXRpb25zKCkgeworICAgIHJldHVybiBtVmVydGljZXMuZGF0YSgpOworfQorCitmbG9hdCBjb25zdCogTWVzaDo6Z2V0VGV4Q29vcmRzKCkgY29uc3QgeworICAgIHJldHVybiBtVmVydGljZXMuZGF0YSgpICsgbVZlcnRleFNpemU7Cit9CitmbG9hdCogTWVzaDo6Z2V0VGV4Q29vcmRzKCkgeworICAgIHJldHVybiBtVmVydGljZXMuZGF0YSgpICsgbVZlcnRleFNpemU7Cit9CisKK2Zsb2F0IGNvbnN0KiBNZXNoOjpnZXRDcm9wQ29vcmRzKCkgY29uc3QgeworICAgIHJldHVybiBtVmVydGljZXMuZGF0YSgpICsgbVZlcnRleFNpemUgKyBtVGV4Q29vcmRzU2l6ZTsKK30KK2Zsb2F0KiBNZXNoOjpnZXRDcm9wQ29vcmRzKCkgeworICAgIHJldHVybiBtVmVydGljZXMuZGF0YSgpICsgbVZlcnRleFNpemUgKyBtVGV4Q29vcmRzU2l6ZTsKK30KKworZmxvYXQgY29uc3QqIE1lc2g6OmdldFNoYWRvd0NvbG9yKCkgY29uc3QgeworICAgIHJldHVybiBtVmVydGljZXMuZGF0YSgpICsgbVZlcnRleFNpemUgKyBtVGV4Q29vcmRzU2l6ZSArIG1Dcm9wQ29vcmRzU2l6ZTsKK30KK2Zsb2F0KiBNZXNoOjpnZXRTaGFkb3dDb2xvcigpIHsKKyAgICByZXR1cm4gbVZlcnRpY2VzLmRhdGEoKSArIG1WZXJ0ZXhTaXplICsgbVRleENvb3Jkc1NpemUgKyBtQ3JvcENvb3Jkc1NpemU7Cit9CisKK2Zsb2F0IGNvbnN0KiBNZXNoOjpnZXRTaGFkb3dQYXJhbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCkgKyBtVmVydGV4U2l6ZSArIG1UZXhDb29yZHNTaXplICsgbUNyb3BDb29yZHNTaXplICsgbVNoYWRvd0NvbG9yU2l6ZTsKK30KK2Zsb2F0KiBNZXNoOjpnZXRTaGFkb3dQYXJhbXMoKSB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCkgKyBtVmVydGV4U2l6ZSArIG1UZXhDb29yZHNTaXplICsgbUNyb3BDb29yZHNTaXplICsgbVNoYWRvd0NvbG9yU2l6ZTsKK30KKwordWludDE2X3QgY29uc3QqIE1lc2g6OmdldEluZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbmRpY2VzLmRhdGEoKTsKK30KKwordWludDE2X3QqIE1lc2g6OmdldEluZGljZXMoKSB7CisgICAgcmV0dXJuIG1JbmRpY2VzLmRhdGEoKTsKK30KKworc2l6ZV90IE1lc2g6OmdldFZlcnRleENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtVmVydGV4Q291bnQ7Cit9CisKK3NpemVfdCBNZXNoOjpnZXRWZXJ0ZXhTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtVmVydGV4U2l6ZTsKK30KKworc2l6ZV90IE1lc2g6OmdldFRleENvb3Jkc1NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UZXhDb29yZHNTaXplOworfQorCitzaXplX3QgTWVzaDo6Z2V0U2hhZG93Q29sb3JTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtU2hhZG93Q29sb3JTaXplOworfQorCitzaXplX3QgTWVzaDo6Z2V0U2hhZG93UGFyYW1zU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNoYWRvd1BhcmFtc1NpemU7Cit9CisKK3NpemVfdCBNZXNoOjpnZXRCeXRlU3RyaWRlKCkgY29uc3QgeworICAgIHJldHVybiBtU3RyaWRlICogc2l6ZW9mKGZsb2F0KTsKK30KKworc2l6ZV90IE1lc2g6OmdldFN0cmlkZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0cmlkZTsKK30KKworc2l6ZV90IE1lc2g6OmdldEluZGV4Q291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbmRleENvdW50OworfQorCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9SZW5kZXJFbmdpbmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L1JlbmRlckVuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmYmI2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9SZW5kZXJFbmdpbmUuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvUmVuZGVyRW5naW5lLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2d1aS9TeW5jRmVhdHVyZXMuaD4KKyNpbmNsdWRlICJnbC9HTEVTUmVuZGVyRW5naW5lLmgiCisjaW5jbHVkZSAidGhyZWFkZWQvUmVuZGVyRW5naW5lVGhyZWFkZWQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK3N0ZDo6dW5pcXVlX3B0cjxSZW5kZXJFbmdpbmU+IFJlbmRlckVuZ2luZTo6Y3JlYXRlKGNvbnN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyYgYXJncykgeworICAgIFJlbmRlckVuZ2luZVR5cGUgcmVuZGVyRW5naW5lVHlwZSA9IGFyZ3MucmVuZGVyRW5naW5lVHlwZTsKKworICAgIC8vIEtlZXAgdGhlIGFiaWxpdHkgdG8gb3ZlcnJpZGUgYnkgUFJPUEVSVElFUzoKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfREVCVUdfUkVOREVSRU5HSU5FX0JBQ0tFTkQsIHByb3AsICIiKTsKKyAgICBpZiAoc3RyY21wKHByb3AsICJnbGVzIikgPT0gMCkgeworICAgICAgICByZW5kZXJFbmdpbmVUeXBlID0gUmVuZGVyRW5naW5lVHlwZTo6R0xFUzsKKyAgICB9CisgICAgaWYgKHN0cmNtcChwcm9wLCAidGhyZWFkZWQiKSA9PSAwKSB7CisgICAgICAgIHJlbmRlckVuZ2luZVR5cGUgPSBSZW5kZXJFbmdpbmVUeXBlOjpUSFJFQURFRDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlbmRlckVuZ2luZVR5cGUpIHsKKyAgICAgICAgY2FzZSBSZW5kZXJFbmdpbmVUeXBlOjpUSFJFQURFRDoKKyAgICAgICAgICAgIEFMT0dEKCJUaHJlYWRlZCBSZW5kZXJFbmdpbmUgd2l0aCBHTEVTIEJhY2tlbmQiKTsKKyAgICAgICAgICAgIHJldHVybiByZW5kZXJlbmdpbmU6OnRocmVhZGVkOjpSZW5kZXJFbmdpbmVUaHJlYWRlZDo6Y3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBbYXJnc10oKSB7IHJldHVybiBhbmRyb2lkOjpyZW5kZXJlbmdpbmU6OmdsOjpHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGUoYXJncyk7IH0pOworICAgICAgICBjYXNlIFJlbmRlckVuZ2luZVR5cGU6OkdMRVM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiUmVuZGVyRW5naW5lIHdpdGggR0xFUyBCYWNrZW5kIik7CisgICAgICAgICAgICByZXR1cm4gcmVuZGVyZW5naW5lOjpnbDo6R0xFU1JlbmRlckVuZ2luZTo6Y3JlYXRlKGFyZ3MpOworICAgIH0KK30KKworUmVuZGVyRW5naW5lOjp+UmVuZGVyRW5naW5lKCkgPSBkZWZhdWx0OworCituYW1lc3BhY2UgaW1wbCB7CisKK1JlbmRlckVuZ2luZTo6UmVuZGVyRW5naW5lKGNvbnN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyYgYXJncykgOiBtQXJncyhhcmdzKSB7fQorCitSZW5kZXJFbmdpbmU6On5SZW5kZXJFbmdpbmUoKSA9IGRlZmF1bHQ7CisKK2Jvb2wgUmVuZGVyRW5naW5lOjp1c2VOYXRpdmVGZW5jZVN5bmMoKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bmNGZWF0dXJlczo6Z2V0SW5zdGFuY2UoKS51c2VOYXRpdmVGZW5jZVN5bmMoKTsKK30KKworYm9vbCBSZW5kZXJFbmdpbmU6OnVzZVdhaXRTeW5jKCkgY29uc3QgeworICAgIHJldHVybiBTeW5jRmVhdHVyZXM6OmdldEluc3RhbmNlKCkudXNlV2FpdFN5bmMoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgaW1wbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvVGV4dHVyZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvVGV4dHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0Y2RlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9UZXh0dXJlLmNwcApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL1RleHR1cmUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK1RleHR1cmU6OlRleHR1cmUoKQorICAgICAgOiBtVGV4dHVyZU5hbWUoMCksIG1UZXh0dXJlVGFyZ2V0KFRFWFRVUkVfMkQpLCBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1GaWx0ZXJpbmcoZmFsc2UpIHt9CisKK1RleHR1cmU6OlRleHR1cmUoVGFyZ2V0IHRleHR1cmVUYXJnZXQsIHVpbnQzMl90IHRleHR1cmVOYW1lKQorICAgICAgOiBtVGV4dHVyZU5hbWUodGV4dHVyZU5hbWUpLAorICAgICAgICBtVGV4dHVyZVRhcmdldCh0ZXh0dXJlVGFyZ2V0KSwKKyAgICAgICAgbVdpZHRoKDApLAorICAgICAgICBtSGVpZ2h0KDApLAorICAgICAgICBtRmlsdGVyaW5nKGZhbHNlKSB7fQorCit2b2lkIFRleHR1cmU6OmluaXQoVGFyZ2V0IHRleHR1cmVUYXJnZXQsIHVpbnQzMl90IHRleHR1cmVOYW1lKSB7CisgICAgbVRleHR1cmVOYW1lID0gdGV4dHVyZU5hbWU7CisgICAgbVRleHR1cmVUYXJnZXQgPSB0ZXh0dXJlVGFyZ2V0OworfQorCitUZXh0dXJlOjp+VGV4dHVyZSgpIHt9CisKK3ZvaWQgVGV4dHVyZTo6c2V0TWF0cml4KGZsb2F0IGNvbnN0KiBtYXRyaXgpIHsKKyAgICBtVGV4dHVyZU1hdHJpeCA9IG1hdDQobWF0cml4KTsKK30KKwordm9pZCBUZXh0dXJlOjpzZXRGaWx0ZXJpbmcoYm9vbCBlbmFibGVkKSB7CisgICAgbUZpbHRlcmluZyA9IGVuYWJsZWQ7Cit9CisKK3ZvaWQgVGV4dHVyZTo6c2V0RGltZW5zaW9ucyhzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworfQorCit1aW50MzJfdCBUZXh0dXJlOjpnZXRUZXh0dXJlTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRleHR1cmVOYW1lOworfQorCit1aW50MzJfdCBUZXh0dXJlOjpnZXRUZXh0dXJlVGFyZ2V0KCkgY29uc3QgeworICAgIHJldHVybiBtVGV4dHVyZVRhcmdldDsKK30KKworY29uc3QgbWF0NCYgVGV4dHVyZTo6Z2V0TWF0cml4KCkgY29uc3QgeworICAgIHJldHVybiBtVGV4dHVyZU1hdHJpeDsKK30KKworYm9vbCBUZXh0dXJlOjpnZXRGaWx0ZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWx0ZXJpbmc7Cit9CisKK3NpemVfdCBUZXh0dXJlOjpnZXRXaWR0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVdpZHRoOworfQorCitzaXplX3QgVGV4dHVyZTo6Z2V0SGVpZ2h0KCkgY29uc3QgeworICAgIHJldHVybiBtSGVpZ2h0OworfQorCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEVTUmVuZGVyRW5naW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEVTUmVuZGVyRW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjRiZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRVNSZW5kZXJFbmdpbmUuY3BwCkBAIC0wLDAgKzEsMTc3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiUmVuZGVyRW5naW5lIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKKworI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxndWkvRGVidWdFR0xJbWFnZVRyYWNrZXIuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvTWVzaC5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9UZXh0dXJlLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL3ByaXZhdGUvRGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxzeW5jL3N5bmMuaD4KKyNpbmNsdWRlIDx1aS9Db2xvclNwYWNlLmg+CisjaW5jbHVkZSA8dWkvRGVidWdVdGlscy5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8dWkvUmVnaW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkdMRVNSZW5kZXJFbmdpbmUuaCIKKyNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKKyNpbmNsdWRlICJHTEZyYW1lYnVmZmVyLmgiCisjaW5jbHVkZSAiR0xJbWFnZS5oIgorI2luY2x1ZGUgIkdMU2hhZG93VmVydGV4R2VuZXJhdG9yLmgiCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgImZpbHRlcnMvQmx1ckZpbHRlci5oIgorCitib29sIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCwgaW50IGxpbmVOdW1iZXIpIHsKKyAgICBib29sIGVycm9yRm91bmQgPSBmYWxzZTsKKyAgICBHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICB3aGlsZSAoZXJyb3IgIT0gR0xfTk9fRVJST1IpIHsKKyAgICAgICAgZXJyb3JGb3VuZCA9IHRydWU7CisgICAgICAgIGVycm9yID0gZ2xHZXRFcnJvcigpOworICAgICAgICBBTE9HVigiYWZ0ZXIgJXMoKSAobGluZSAjICVkKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGxpbmVOdW1iZXIsIGVycm9yKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yRm91bmQ7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgYm9vbCBvdXRwdXREZWJ1Z1BQTXMgPSBmYWxzZTsKKwordm9pZCB3cml0ZVBQTShjb25zdCBjaGFyKiBiYXNlbmFtZSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0KSB7CisgICAgQUxPR1YoIndyaXRlUFBNICMlczogJWQgeCAlZCIsIGJhc2VuYW1lLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIHN0ZDo6dmVjdG9yPEdMdWJ5dGU+IHBpeGVscyh3aWR0aCAqIGhlaWdodCAqIDQpOworICAgIHN0ZDo6dmVjdG9yPEdMdWJ5dGU+IG91dEJ1ZmZlcih3aWR0aCAqIGhlaWdodCAqIDMpOworCisgICAgLy8gVE9ETyhjb3VydG5leWdvKTogV2UgY2FuIG5vdyBoYXZlIGZsb2F0IGZvcm1hdHMsIG5lZWQKKyAgICAvLyB0byByZW1vdmUgdGhpcyBjb2RlIG9yIHVwZGF0ZSB0byBzdXBwb3J0LgorICAgIC8vIE1ha2UgcmV0dXJuZWQgcGl4ZWxzIGZpdCBpbiB1aW50MzJfdCwgb25lIGJ5dGUgcGVyIGNvbXBvbmVudAorICAgIGdsUmVhZFBpeGVscygwLCAwLCB3aWR0aCwgaGVpZ2h0LCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMuZGF0YSgpKTsKKyAgICBpZiAoY2hlY2tHbEVycm9yKF9fRlVOQ1RJT05fXywgX19MSU5FX18pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZShiYXNlbmFtZSk7CisgICAgZmlsZW5hbWUuYXBwZW5kKCIucHBtIik7CisgICAgc3RkOjpvZnN0cmVhbSBmaWxlKGZpbGVuYW1lLmNfc3RyKCksIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgIGlmICghZmlsZS5pc19vcGVuKCkpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBvcGVuIGZpbGU6ICVzIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJZb3UgbWF5IG5lZWQgdG8gZG86IFwiYWRiIHNoZWxsIHNldGVuZm9yY2UgMFwiIHRvIGVuYWJsZSAiCisgICAgICAgICAgICAgICJzdXJmYWNlZmxpbmdlciB0byB3cml0ZSBkZWJ1ZyBpbWFnZXMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZpbGUgPDwgIlA2XG4iOworICAgIGZpbGUgPDwgd2lkdGggPDwgIlxuIjsKKyAgICBmaWxlIDw8IGhlaWdodCA8PCAiXG4iOworICAgIGZpbGUgPDwgMjU1IDw8ICJcbiI7CisKKyAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHBpeGVscy5kYXRhKCkpOworICAgIGF1dG8gb3V0UHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ob3V0QnVmZmVyLmRhdGEoKSk7CisgICAgZm9yIChpbnQgeSA9IGhlaWdodCAtIDE7IHkgPj0gMDsgeS0tKSB7CisgICAgICAgIGNoYXIqIGRhdGEgPSBwdHIgKyB5ICogd2lkdGggKiBzaXplb2YodWludDMyX3QpOworCisgICAgICAgIGZvciAoR0x1aW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgLy8gT25seSBjb3B5IFIsIEcgYW5kIEIgY29tcG9uZW50cworICAgICAgICAgICAgb3V0UHRyWzBdID0gZGF0YVswXTsKKyAgICAgICAgICAgIG91dFB0clsxXSA9IGRhdGFbMV07CisgICAgICAgICAgICBvdXRQdHJbMl0gPSBkYXRhWzJdOworICAgICAgICAgICAgZGF0YSArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgb3V0UHRyICs9IDM7CisgICAgICAgIH0KKyAgICB9CisgICAgZmlsZS53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIqPihvdXRCdWZmZXIuZGF0YSgpKSwgb3V0QnVmZmVyLnNpemUoKSk7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKwordXNpbmcgYmFzZTo6U3RyaW5nQXBwZW5kRjsKK3VzaW5nIHVpOjpEYXRhc3BhY2U7CisKK3N0YXRpYyBzdGF0dXNfdCBzZWxlY3RDb25maWdGb3JBdHRyaWJ1dGUoRUdMRGlzcGxheSBkcHksIEVHTGludCBjb25zdCogYXR0cnMsIEVHTGludCBhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCB3YW50ZWQsIEVHTENvbmZpZyogb3V0Q29uZmlnKSB7CisgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMSwgbiA9IDA7CisgICAgZWdsR2V0Q29uZmlncyhkcHksIG51bGxwdHIsIDAsICZudW1Db25maWdzKTsKKyAgICBzdGQ6OnZlY3RvcjxFR0xDb25maWc+IGNvbmZpZ3MobnVtQ29uZmlncywgRUdMX05PX0NPTkZJR19LSFIpOworICAgIGVnbENob29zZUNvbmZpZyhkcHksIGF0dHJzLCBjb25maWdzLmRhdGEoKSwgY29uZmlncy5zaXplKCksICZuKTsKKyAgICBjb25maWdzLnJlc2l6ZShuKTsKKworICAgIGlmICghY29uZmlncy5lbXB0eSgpKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gRUdMX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoRUdMQ29uZmlnIGNvbmZpZyA6IGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICBFR0xpbnQgdmFsdWUgPSAwOworICAgICAgICAgICAgICAgIGVnbEdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgYXR0cmlidXRlLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh3YW50ZWQgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dENvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGp1c3QgcGljayB0aGUgZmlyc3Qgb25lCisgICAgICAgICAgICAqb3V0Q29uZmlnID0gY29uZmlnc1swXTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKK30KKworc3RhdGljIHN0YXR1c190IHNlbGVjdEVHTENvbmZpZyhFR0xEaXNwbGF5IGRpc3BsYXksIEVHTGludCBmb3JtYXQsIEVHTGludCByZW5kZXJhYmxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnKiBjb25maWcpIHsKKyAgICAvLyBzZWxlY3Qgb3VyIEVHTENvbmZpZy4gSXQgbXVzdCBzdXBwb3J0IEVHTF9SRUNPUkRBQkxFX0FORFJPSUQgaWYKKyAgICAvLyBpdCBpcyB0byBiZSB1c2VkIHdpdGggV0lGSSBkaXNwbGF5cworICAgIHN0YXR1c190IGVycjsKKyAgICBFR0xpbnQgd2FudGVkQXR0cmlidXRlOworICAgIEVHTGludCB3YW50ZWRBdHRyaWJ1dGVWYWx1ZTsKKworICAgIHN0ZDo6dmVjdG9yPEVHTGludD4gYXR0cmliczsKKyAgICBpZiAocmVuZGVyYWJsZVR5cGUpIHsKKyAgICAgICAgY29uc3QgdWk6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWk6OlBpeGVsRm9ybWF0Pihmb3JtYXQpOworICAgICAgICBjb25zdCBib29sIGlzMTAxMDEwMiA9IHBpeGVsRm9ybWF0ID09IHVpOjpQaXhlbEZvcm1hdDo6UkdCQV8xMDEwMTAyOworCisgICAgICAgIC8vIERlZmF1bHQgdG8gOCBiaXRzIHBlciBjaGFubmVsLgorICAgICAgICBjb25zdCBFR0xpbnQgdG1wQXR0cmlic1tdID0geworICAgICAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsCisgICAgICAgICAgICAgICAgcmVuZGVyYWJsZVR5cGUsCisgICAgICAgICAgICAgICAgRUdMX1JFQ09SREFCTEVfQU5EUk9JRCwKKyAgICAgICAgICAgICAgICBFR0xfVFJVRSwKKyAgICAgICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLAorICAgICAgICAgICAgICAgIEVHTF9XSU5ET1dfQklUIHwgRUdMX1BCVUZGRVJfQklULAorICAgICAgICAgICAgICAgIEVHTF9GUkFNRUJVRkZFUl9UQVJHRVRfQU5EUk9JRCwKKyAgICAgICAgICAgICAgICBFR0xfVFJVRSwKKyAgICAgICAgICAgICAgICBFR0xfUkVEX1NJWkUsCisgICAgICAgICAgICAgICAgaXMxMDEwMTAyID8gMTAgOiA4LAorICAgICAgICAgICAgICAgIEVHTF9HUkVFTl9TSVpFLAorICAgICAgICAgICAgICAgIGlzMTAxMDEwMiA/IDEwIDogOCwKKyAgICAgICAgICAgICAgICBFR0xfQkxVRV9TSVpFLAorICAgICAgICAgICAgICAgIGlzMTAxMDEwMiA/IDEwIDogOCwKKyAgICAgICAgICAgICAgICBFR0xfQUxQSEFfU0laRSwKKyAgICAgICAgICAgICAgICBpczEwMTAxMDIgPyAyIDogOCwKKyAgICAgICAgICAgICAgICBFR0xfTk9ORSwKKyAgICAgICAgfTsKKyAgICAgICAgc3RkOjpjb3B5KHRtcEF0dHJpYnMsIHRtcEF0dHJpYnMgKyAoc2l6ZW9mKHRtcEF0dHJpYnMpIC8gc2l6ZW9mKEVHTGludCkpLAorICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGF0dHJpYnMpKTsKKyAgICAgICAgd2FudGVkQXR0cmlidXRlID0gRUdMX05PTkU7CisgICAgICAgIHdhbnRlZEF0dHJpYnV0ZVZhbHVlID0gRUdMX05PTkU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaWYgbm8gcmVuZGVyYWJsZSB0eXBlIHNwZWNpZmllZCwgZmFsbGJhY2sgdG8gYSBzaW1wbGlmaWVkIHF1ZXJ5CisgICAgICAgIHdhbnRlZEF0dHJpYnV0ZSA9IEVHTF9OQVRJVkVfVklTVUFMX0lEOworICAgICAgICB3YW50ZWRBdHRyaWJ1dGVWYWx1ZSA9IGZvcm1hdDsKKyAgICB9CisKKyAgICBlcnIgPSBzZWxlY3RDb25maWdGb3JBdHRyaWJ1dGUoZGlzcGxheSwgYXR0cmlicy5kYXRhKCksIHdhbnRlZEF0dHJpYnV0ZSwgd2FudGVkQXR0cmlidXRlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyk7CisgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgICBFR0xpbnQgY2F2ZWF0OworICAgICAgICBpZiAoZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksICpjb25maWcsIEVHTF9DT05GSUdfQ0FWRUFULCAmY2F2ZWF0KSkKKyAgICAgICAgICAgIEFMT0dXX0lGKGNhdmVhdCA9PSBFR0xfU0xPV19DT05GSUcsICJFR0xfU0xPV19DT05GSUcgc2VsZWN0ZWQhIik7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RkOjp1bmlxdWVfcHRyPEdMRVNSZW5kZXJFbmdpbmU+IEdMRVNSZW5kZXJFbmdpbmU6OmNyZWF0ZShjb25zdCBSZW5kZXJFbmdpbmVDcmVhdGlvbkFyZ3MmIGFyZ3MpIHsKKyAgICAvLyBpbml0aWFsaXplIEVHTCBmb3IgdGhlIGRlZmF1bHQgZGlzcGxheQorICAgIEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgaWYgKCFlZ2xJbml0aWFsaXplKGRpc3BsYXksIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImZhaWxlZCB0byBpbml0aWFsaXplIEVHTCIpOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gZWdsVmVyc2lvbiA9IGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9WRVJTSU9OKTsKKyAgICBpZiAoIWVnbFZlcnNpb24pIHsKKyAgICAgICAgY2hlY2tHbEVycm9yKF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJlZ2xRdWVyeVN0cmluZyhFR0xfVkVSU0lPTikgZmFpbGVkIik7CisgICAgfQorCisgICAgY29uc3QgYXV0byBlZ2xFeHRlbnNpb25zID0gZWdsUXVlcnlTdHJpbmcoZGlzcGxheSwgRUdMX0VYVEVOU0lPTlMpOworICAgIGlmICghZWdsRXh0ZW5zaW9ucykgeworICAgICAgICBjaGVja0dsRXJyb3IoX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImVnbFF1ZXJ5U3RyaW5nKEVHTF9FWFRFTlNJT05TKSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBHTEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMgPSBHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCk7CisgICAgZXh0ZW5zaW9ucy5pbml0V2l0aEVHTFN0cmluZ3MoZWdsVmVyc2lvbiwgZWdsRXh0ZW5zaW9ucyk7CisKKyAgICAvLyBUaGUgY29kZSBhc3N1bWVzIHRoYXQgRVMyIG9yIGxhdGVyIGlzIGF2YWlsYWJsZSBpZiB0aGlzIGV4dGVuc2lvbiBpcworICAgIC8vIHN1cHBvcnRlZC4KKyAgICBFR0xDb25maWcgY29uZmlnID0gRUdMX05PX0NPTkZJRzsKKyAgICBpZiAoIWV4dGVuc2lvbnMuaGFzTm9Db25maWdDb250ZXh0KCkpIHsKKyAgICAgICAgY29uZmlnID0gY2hvb3NlRWdsQ29uZmlnKGRpc3BsYXksIGFyZ3MucGl4ZWxGb3JtYXQsIC8qbG9nQ29uZmlnKi8gdHJ1ZSk7CisgICAgfQorCisgICAgYm9vbCB1c2VDb250ZXh0UHJpb3JpdHkgPQorICAgICAgICAgICAgZXh0ZW5zaW9ucy5oYXNDb250ZXh0UHJpb3JpdHkoKSAmJiBhcmdzLmNvbnRleHRQcmlvcml0eSA9PSBDb250ZXh0UHJpb3JpdHk6OkhJR0g7CisgICAgRUdMQ29udGV4dCBwcm90ZWN0ZWRDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7CisgICAgaWYgKGFyZ3MuZW5hYmxlUHJvdGVjdGVkQ29udGV4dCAmJiBleHRlbnNpb25zLmhhc1Byb3RlY3RlZENvbnRlbnQoKSkgeworICAgICAgICBwcm90ZWN0ZWRDb250ZXh0ID0gY3JlYXRlRWdsQ29udGV4dChkaXNwbGF5LCBjb25maWcsIG51bGxwdHIsIHVzZUNvbnRleHRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGlvbjo6UFJPVEVDVEVEKTsKKyAgICAgICAgQUxPR0VfSUYocHJvdGVjdGVkQ29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCwgIkNhbid0IGNyZWF0ZSBwcm90ZWN0ZWQgY29udGV4dCIpOworICAgIH0KKworICAgIEVHTENvbnRleHQgY3R4dCA9IGNyZWF0ZUVnbENvbnRleHQoZGlzcGxheSwgY29uZmlnLCBwcm90ZWN0ZWRDb250ZXh0LCB1c2VDb250ZXh0UHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90ZWN0aW9uOjpVTlBST1RFQ1RFRCk7CisKKyAgICAvLyBpZiBjYW4ndCBjcmVhdGUgYSBHTCBjb250ZXh0LCB3ZSBjYW4gb25seSBhYm9ydC4KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGN0eHQgPT0gRUdMX05PX0NPTlRFWFQsICJFR0xDb250ZXh0IGNyZWF0aW9uIGZhaWxlZCIpOworCisgICAgRUdMU3VyZmFjZSBzdHViID0gRUdMX05PX1NVUkZBQ0U7CisgICAgaWYgKCFleHRlbnNpb25zLmhhc1N1cmZhY2VsZXNzQ29udGV4dCgpKSB7CisgICAgICAgIHN0dWIgPSBjcmVhdGVTdHViRWdsUGJ1ZmZlclN1cmZhY2UoZGlzcGxheSwgY29uZmlnLCBhcmdzLnBpeGVsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RlY3Rpb246OlVOUFJPVEVDVEVEKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHViID09IEVHTF9OT19TVVJGQUNFLCAiY2FuJ3QgY3JlYXRlIHN0dWIgcGJ1ZmZlciIpOworICAgIH0KKyAgICBFR0xCb29sZWFuIHN1Y2Nlc3MgPSBlZ2xNYWtlQ3VycmVudChkaXNwbGF5LCBzdHViLCBzdHViLCBjdHh0KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFzdWNjZXNzLCAiY2FuJ3QgbWFrZSBzdHViIHBidWZmZXIgY3VycmVudCIpOworICAgIGV4dGVuc2lvbnMuaW5pdFdpdGhHTFN0cmluZ3MoZ2xHZXRTdHJpbmcoR0xfVkVORE9SKSwgZ2xHZXRTdHJpbmcoR0xfUkVOREVSRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTiksIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKKworICAgIEVHTFN1cmZhY2UgcHJvdGVjdGVkU3R1YiA9IEVHTF9OT19TVVJGQUNFOworICAgIGlmIChwcm90ZWN0ZWRDb250ZXh0ICE9IEVHTF9OT19DT05URVhUICYmICFleHRlbnNpb25zLmhhc1N1cmZhY2VsZXNzQ29udGV4dCgpKSB7CisgICAgICAgIHByb3RlY3RlZFN0dWIgPSBjcmVhdGVTdHViRWdsUGJ1ZmZlclN1cmZhY2UoZGlzcGxheSwgY29uZmlnLCBhcmdzLnBpeGVsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RlY3Rpb246OlBST1RFQ1RFRCk7CisgICAgICAgIEFMT0dFX0lGKHByb3RlY3RlZFN0dWIgPT0gRUdMX05PX1NVUkZBQ0UsICJjYW4ndCBjcmVhdGUgcHJvdGVjdGVkIHN0dWIgcGJ1ZmZlciIpOworICAgIH0KKworICAgIC8vIG5vdyBmaWd1cmUgb3V0IHdoYXQgdmVyc2lvbiBvZiBHTCBkaWQgd2UgYWN0dWFsbHkgZ2V0CisgICAgR2xlc1ZlcnNpb24gdmVyc2lvbiA9IHBhcnNlR2xlc1ZlcnNpb24oZXh0ZW5zaW9ucy5nZXRWZXJzaW9uKCkpOworCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihhcmdzLnN1cHBvcnRzQmFja2dyb3VuZEJsdXIgJiYgdmVyc2lvbiA8IEdMRVNfVkVSU0lPTl8zXzAsCisgICAgICAgICJCbHVycyByZXF1aXJlIE9wZW5HTCBFUyAzLjAuIFBsZWFzZSB1bnNldCByby5zdXJmYWNlX2ZsaW5nZXIuc3VwcG9ydHNfYmFja2dyb3VuZF9ibHVyIik7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSByZW5kZXJlciB3aGlsZSBHTCBpcyBjdXJyZW50CisgICAgc3RkOjp1bmlxdWVfcHRyPEdMRVNSZW5kZXJFbmdpbmU+IGVuZ2luZTsKKyAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgY2FzZSBHTEVTX1ZFUlNJT05fMV8wOgorICAgICAgICBjYXNlIEdMRVNfVkVSU0lPTl8xXzE6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTdXJmYWNlRmxpbmdlciByZXF1aXJlcyBPcGVuR0wgRVMgMi4wIG1pbmltdW0gdG8gcnVuLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xFU19WRVJTSU9OXzJfMDoKKyAgICAgICAgY2FzZSBHTEVTX1ZFUlNJT05fM18wOgorICAgICAgICAgICAgZW5naW5lID0gc3RkOjptYWtlX3VuaXF1ZTxHTEVTUmVuZGVyRW5naW5lPihhcmdzLCBkaXNwbGF5LCBjb25maWcsIGN0eHQsIHN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZENvbnRleHQsIHByb3RlY3RlZFN0dWIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQUxPR0koIk9wZW5HTCBFUyBpbmZvcm1hdGlvbnM6Iik7CisgICAgQUxPR0koInZlbmRvciAgICA6ICVzIiwgZXh0ZW5zaW9ucy5nZXRWZW5kb3IoKSk7CisgICAgQUxPR0koInJlbmRlcmVyICA6ICVzIiwgZXh0ZW5zaW9ucy5nZXRSZW5kZXJlcigpKTsKKyAgICBBTE9HSSgidmVyc2lvbiAgIDogJXMiLCBleHRlbnNpb25zLmdldFZlcnNpb24oKSk7CisgICAgQUxPR0koImV4dGVuc2lvbnM6ICVzIiwgZXh0ZW5zaW9ucy5nZXRFeHRlbnNpb25zKCkpOworICAgIEFMT0dJKCJHTF9NQVhfVEVYVFVSRV9TSVpFID0gJXp1IiwgZW5naW5lLT5nZXRNYXhUZXh0dXJlU2l6ZSgpKTsKKyAgICBBTE9HSSgiR0xfTUFYX1ZJRVdQT1JUX0RJTVMgPSAlenUiLCBlbmdpbmUtPmdldE1heFZpZXdwb3J0RGltcygpKTsKKworICAgIHJldHVybiBlbmdpbmU7Cit9CisKK0VHTENvbmZpZyBHTEVTUmVuZGVyRW5naW5lOjpjaG9vc2VFZ2xDb25maWcoRUdMRGlzcGxheSBkaXNwbGF5LCBpbnQgZm9ybWF0LCBib29sIGxvZ0NvbmZpZykgeworICAgIHN0YXR1c190IGVycjsKKyAgICBFR0xDb25maWcgY29uZmlnOworCisgICAgLy8gRmlyc3QgdHJ5IHRvIGdldCBhbiBFUzMgY29uZmlnCisgICAgZXJyID0gc2VsZWN0RUdMQ29uZmlnKGRpc3BsYXksIGZvcm1hdCwgRUdMX09QRU5HTF9FUzNfQklULCAmY29uZmlnKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIElmIEVTMyBmYWlscywgdHJ5IHRvIGdldCBhbiBFUzIgY29uZmlnCisgICAgICAgIGVyciA9IHNlbGVjdEVHTENvbmZpZyhkaXNwbGF5LCBmb3JtYXQsIEVHTF9PUEVOR0xfRVMyX0JJVCwgJmNvbmZpZyk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIElmIEVTMiBzdGlsbCBkb2Vzbid0IHdvcmssIHByb2JhYmx5IGJlY2F1c2Ugd2UncmUgb24gdGhlIGVtdWxhdG9yLgorICAgICAgICAgICAgLy8gdHJ5IGEgc2ltcGxpZmllZCBxdWVyeQorICAgICAgICAgICAgQUxPR1coIm5vIHN1aXRhYmxlIEVHTENvbmZpZyBmb3VuZCwgdHJ5aW5nIGEgc2ltcGxlciBxdWVyeSIpOworICAgICAgICAgICAgZXJyID0gc2VsZWN0RUdMQ29uZmlnKGRpc3BsYXksIGZvcm1hdCwgMCwgJmNvbmZpZyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBFR0wgaXMgdG9vIGxhbWUgZm9yIGFuZHJvaWQKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJubyBzdWl0YWJsZSBFR0xDb25maWcgZm91bmQsIGdpdmluZyB1cCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvZ0NvbmZpZykgeworICAgICAgICAvLyBwcmludCBzb21lIGRlYnVnZ2luZyBpbmZvCisgICAgICAgIEVHTGludCByLCBnLCBiLCBhOworICAgICAgICBlZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBFR0xfUkVEX1NJWkUsICZyKTsKKyAgICAgICAgZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX0dSRUVOX1NJWkUsICZnKTsKKyAgICAgICAgZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX0JMVUVfU0laRSwgJmIpOworICAgICAgICBlZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBFR0xfQUxQSEFfU0laRSwgJmEpOworICAgICAgICBBTE9HSSgiRUdMIGluZm9ybWF0aW9uOiIpOworICAgICAgICBBTE9HSSgidmVuZG9yICAgIDogJXMiLCBlZ2xRdWVyeVN0cmluZyhkaXNwbGF5LCBFR0xfVkVORE9SKSk7CisgICAgICAgIEFMT0dJKCJ2ZXJzaW9uICAgOiAlcyIsIGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9WRVJTSU9OKSk7CisgICAgICAgIEFMT0dJKCJleHRlbnNpb25zOiAlcyIsIGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9FWFRFTlNJT05TKSk7CisgICAgICAgIEFMT0dJKCJDbGllbnQgQVBJOiAlcyIsIGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9DTElFTlRfQVBJUykgPzogIk5vdCBTdXBwb3J0ZWQiKTsKKyAgICAgICAgQUxPR0koIkVHTFN1cmZhY2U6ICVkLSVkLSVkLSVkLCBjb25maWc9JXAiLCByLCBnLCBiLCBhLCBjb25maWcpOworICAgIH0KKworICAgIHJldHVybiBjb25maWc7Cit9CisKK0dMRVNSZW5kZXJFbmdpbmU6OkdMRVNSZW5kZXJFbmdpbmUoY29uc3QgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzJiBhcmdzLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIEVHTENvbnRleHQgY3R4dCwgRUdMU3VyZmFjZSBzdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHByb3RlY3RlZENvbnRleHQsIEVHTFN1cmZhY2UgcHJvdGVjdGVkU3R1YikKKyAgICAgIDogcmVuZGVyZW5naW5lOjppbXBsOjpSZW5kZXJFbmdpbmUoYXJncyksCisgICAgICAgIG1FR0xEaXNwbGF5KGRpc3BsYXkpLAorICAgICAgICBtRUdMQ29uZmlnKGNvbmZpZyksCisgICAgICAgIG1FR0xDb250ZXh0KGN0eHQpLAorICAgICAgICBtU3R1YlN1cmZhY2Uoc3R1YiksCisgICAgICAgIG1Qcm90ZWN0ZWRFR0xDb250ZXh0KHByb3RlY3RlZENvbnRleHQpLAorICAgICAgICBtUHJvdGVjdGVkU3R1YlN1cmZhY2UocHJvdGVjdGVkU3R1YiksCisgICAgICAgIG1WcFdpZHRoKDApLAorICAgICAgICBtVnBIZWlnaHQoMCksCisgICAgICAgIG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGVTaXplKGFyZ3MuaW1hZ2VDYWNoZVNpemUpLAorICAgICAgICBtVXNlQ29sb3JNYW5hZ2VtZW50KGFyZ3MudXNlQ29sb3JNYW5hZ2VtZW50KSB7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbU1heFRleHR1cmVTaXplKTsKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9WSUVXUE9SVF9ESU1TLCBtTWF4Vmlld3BvcnREaW1zKTsKKworICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgNCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgNCk7CisKKyAgICAvLyBJbml0aWFsaXplIHByb3RlY3RlZCBFR0wgQ29udGV4dC4KKyAgICBpZiAobVByb3RlY3RlZEVHTENvbnRleHQgIT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsTWFrZUN1cnJlbnQoZGlzcGxheSwgbVByb3RlY3RlZFN0dWJTdXJmYWNlLCBtUHJvdGVjdGVkU3R1YlN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm90ZWN0ZWRFR0xDb250ZXh0KTsKKyAgICAgICAgQUxPR0VfSUYoIXN1Y2Nlc3MsICJjYW4ndCBtYWtlIHByb3RlY3RlZCBjb250ZXh0IGN1cnJlbnQiKTsKKyAgICAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCA0KTsKKyAgICAgICAgZ2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgNCk7CisgICAgICAgIHN1Y2Nlc3MgPSBlZ2xNYWtlQ3VycmVudChkaXNwbGF5LCBtU3R1YlN1cmZhY2UsIG1TdHViU3VyZmFjZSwgbUVHTENvbnRleHQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFzdWNjZXNzLCAiY2FuJ3QgbWFrZSBkZWZhdWx0IGNvbnRleHQgY3VycmVudCIpOworICAgIH0KKworICAgIC8vIG1Db2xvckJsaW5kbmVzc0NvcnJlY3Rpb24gPSBNOworCisgICAgaWYgKG1Vc2VDb2xvck1hbmFnZW1lbnQpIHsKKyAgICAgICAgY29uc3QgQ29sb3JTcGFjZSBzcmdiKENvbG9yU3BhY2U6OnNSR0IoKSk7CisgICAgICAgIGNvbnN0IENvbG9yU3BhY2UgZGlzcGxheVAzKENvbG9yU3BhY2U6OkRpc3BsYXlQMygpKTsKKyAgICAgICAgY29uc3QgQ29sb3JTcGFjZSBidDIwMjAoQ29sb3JTcGFjZTo6QlQyMDIwKCkpOworCisgICAgICAgIC8vIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIG5lZWRlZCBzaW5jZSBhbGwgY29sb3Igc3BhY2VzIHVzZSBENjUgZm9yIHRoZWlyIHdoaXRlIHBvaW50cy4KKyAgICAgICAgbVNyZ2JUb1h5eiA9IG1hdDQoc3JnYi5nZXRSR0J0b1hZWigpKTsKKyAgICAgICAgbURpc3BsYXlQM1RvWHl6ID0gbWF0NChkaXNwbGF5UDMuZ2V0UkdCdG9YWVooKSk7CisgICAgICAgIG1CdDIwMjBUb1h5eiA9IG1hdDQoYnQyMDIwLmdldFJHQnRvWFlaKCkpOworICAgICAgICBtWHl6VG9TcmdiID0gbWF0NChzcmdiLmdldFhZWnRvUkdCKCkpOworICAgICAgICBtWHl6VG9EaXNwbGF5UDMgPSBtYXQ0KGRpc3BsYXlQMy5nZXRYWVp0b1JHQigpKTsKKyAgICAgICAgbVh5elRvQnQyMDIwID0gbWF0NChidDIwMjAuZ2V0WFladG9SR0IoKSk7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBzUkdCIHRvIERpc3BsYXkgUDMgYW5kIEJUMjAyMCB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAgICAvLyBOT1RFOiBGb3Igbm93LCB3ZSBhcmUgbGltaXRpbmcgb3V0cHV0IHdpZGUgY29sb3Igc3BhY2Ugc3VwcG9ydCB0bworICAgICAgICAvLyBEaXNwbGF5LVAzIGFuZCBCVDIwMjAgb25seS4KKyAgICAgICAgbVNyZ2JUb0Rpc3BsYXlQMyA9IG1YeXpUb0Rpc3BsYXlQMyAqIG1TcmdiVG9YeXo7CisgICAgICAgIG1TcmdiVG9CdDIwMjAgPSBtWHl6VG9CdDIwMjAgKiBtU3JnYlRvWHl6OworCisgICAgICAgIC8vIENvbXB1dGUgRGlzcGxheSBQMyB0byBzUkdCIGFuZCBCVDIwMjAgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgICAgbURpc3BsYXlQM1RvU3JnYiA9IG1YeXpUb1NyZ2IgKiBtRGlzcGxheVAzVG9YeXo7CisgICAgICAgIG1EaXNwbGF5UDNUb0J0MjAyMCA9IG1YeXpUb0J0MjAyMCAqIG1EaXNwbGF5UDNUb1h5ejsKKworICAgICAgICAvLyBDb21wdXRlIEJUMjAyMCB0byBzUkdCIGFuZCBEaXNwbGF5IFAzIHRyYW5zZm9ybSBtYXRyaXgKKyAgICAgICAgbUJ0MjAyMFRvU3JnYiA9IG1YeXpUb1NyZ2IgKiBtQnQyMDIwVG9YeXo7CisgICAgICAgIG1CdDIwMjBUb0Rpc3BsYXlQMyA9IG1YeXpUb0Rpc3BsYXlQMyAqIG1CdDIwMjBUb1h5ejsKKyAgICB9CisKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wudHJhY2VHcHVDb21wbGV0aW9uIiwgdmFsdWUsICIwIik7CisgICAgaWYgKGF0b2kodmFsdWUpKSB7CisgICAgICAgIG1UcmFjZUdwdUNvbXBsZXRpb24gPSB0cnVlOworICAgICAgICBtRmx1c2hUcmFjZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEZsdXNoVHJhY2VyPih0aGlzKTsKKyAgICB9CisKKyAgICBpZiAoYXJncy5zdXBwb3J0c0JhY2tncm91bmRCbHVyKSB7CisgICAgICAgIG1CbHVyRmlsdGVyID0gbmV3IEJsdXJGaWx0ZXIoKnRoaXMpOworICAgICAgICBjaGVja0Vycm9ycygiQmx1ckZpbHRlciBjcmVhdGlvbiIpOworICAgIH0KKworICAgIG1JbWFnZU1hbmFnZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEltYWdlTWFuYWdlcj4odGhpcyk7CisgICAgbUltYWdlTWFuYWdlci0+aW5pdFRocmVhZCgpOworICAgIG1EcmF3aW5nQnVmZmVyID0gY3JlYXRlRnJhbWVidWZmZXIoKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYgPQorICAgICAgICAgICAgbmV3IEdyYXBoaWNCdWZmZXIoMSwgMSwgUElYRUxfRk9STUFUX1JHQkFfODg4OCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFLCAicGxhY2Vob2xkZXIiKTsKKworICAgIGNvbnN0IHN0YXR1c190IGVyciA9IGJ1Zi0+aW5pdENoZWNrKCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRXJyb3IgYWxsb2NhdGluZyBwbGFjZWhvbGRlciBidWZmZXI6ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUGxhY2Vob2xkZXJCdWZmZXIgPSBidWYuZ2V0KCk7CisgICAgRUdMaW50IGF0dHJpYnV0ZXNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9OT05FLAorICAgIH07CisgICAgbVBsYWNlaG9sZGVySW1hZ2UgPSBlZ2xDcmVhdGVJbWFnZUtIUihtRUdMRGlzcGxheSwgRUdMX05PX0NPTlRFWFQsIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxhY2Vob2xkZXJCdWZmZXIsIGF0dHJpYnV0ZXMpOworICAgIEFMT0dFX0lGKG1QbGFjZWhvbGRlckltYWdlID09IEVHTF9OT19JTUFHRV9LSFIsICJGYWlsZWQgdG8gY3JlYXRlIHBsYWNlaG9sZGVyIGltYWdlOiAlI3giLAorICAgICAgICAgICAgIGVnbEdldEVycm9yKCkpOworfQorCitHTEVTUmVuZGVyRW5naW5lOjp+R0xFU1JlbmRlckVuZ2luZSgpIHsKKyAgICAvLyBEZXN0cm95IHRoZSBpbWFnZSBtYW5hZ2VyIGZpcnN0LgorICAgIG1JbWFnZU1hbmFnZXIgPSBudWxscHRyOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZW5kZXJpbmdNdXRleCk7CisgICAgdW5iaW5kRnJhbWVCdWZmZXIobURyYXdpbmdCdWZmZXIuZ2V0KCkpOworICAgIG1EcmF3aW5nQnVmZmVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAoIW1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuZW1wdHkoKSkgeworICAgICAgICBFR0xJbWFnZUtIUiBleHBpcmVkID0gbUZyYW1lYnVmZmVySW1hZ2VDYWNoZS5mcm9udCgpLnNlY29uZDsKKyAgICAgICAgbUZyYW1lYnVmZmVySW1hZ2VDYWNoZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgZWdsRGVzdHJveUltYWdlS0hSKG1FR0xEaXNwbGF5LCBleHBpcmVkKTsKKyAgICAgICAgREVCVUdfRUdMX0lNQUdFX1RSQUNLRVJfREVTVFJPWSgpOworICAgIH0KKyAgICBlZ2xEZXN0cm95SW1hZ2VLSFIobUVHTERpc3BsYXksIG1QbGFjZWhvbGRlckltYWdlKTsKKyAgICBtSW1hZ2VDYWNoZS5jbGVhcigpOworICAgIGVnbE1ha2VDdXJyZW50KG1FR0xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKyAgICBlZ2xUZXJtaW5hdGUobUVHTERpc3BsYXkpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8RnJhbWVidWZmZXI+IEdMRVNSZW5kZXJFbmdpbmU6OmNyZWF0ZUZyYW1lYnVmZmVyKCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEdMRnJhbWVidWZmZXI+KCp0aGlzKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPEltYWdlPiBHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGVJbWFnZSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxHTEltYWdlPigqdGhpcyk7Cit9CisKK0ZyYW1lYnVmZmVyKiBHTEVTUmVuZGVyRW5naW5lOjpnZXRGcmFtZWJ1ZmZlckZvckRyYXdpbmcoKSB7CisgICAgcmV0dXJuIG1EcmF3aW5nQnVmZmVyLmdldCgpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnByaW1lQ2FjaGUoKSBjb25zdCB7CisgICAgUHJvZ3JhbUNhY2hlOjpnZXRJbnN0YW5jZSgpLnByaW1lQ2FjaGUobUluUHJvdGVjdGVkQ29udGV4dCA/IG1Qcm90ZWN0ZWRFR0xDb250ZXh0IDogbUVHTENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFyZ3MudXNlQ29sb3JNYW5hZ2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BcmdzLnByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkpOworfQorCitiYXNlOjp1bmlxdWVfZmQgR0xFU1JlbmRlckVuZ2luZTo6Zmx1c2goKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoIUdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKS5oYXNOYXRpdmVGZW5jZVN5bmMoKSkgeworICAgICAgICByZXR1cm4gYmFzZTo6dW5pcXVlX2ZkKCk7CisgICAgfQorCisgICAgRUdMU3luY0tIUiBzeW5jID0gZWdsQ3JlYXRlU3luY0tIUihtRUdMRGlzcGxheSwgRUdMX1NZTkNfTkFUSVZFX0ZFTkNFX0FORFJPSUQsIG51bGxwdHIpOworICAgIGlmIChzeW5jID09IEVHTF9OT19TWU5DX0tIUikgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNyZWF0ZSBFR0wgbmF0aXZlIGZlbmNlIHN5bmM6ICUjeCIsIGVnbEdldEVycm9yKCkpOworICAgICAgICByZXR1cm4gYmFzZTo6dW5pcXVlX2ZkKCk7CisgICAgfQorCisgICAgLy8gbmF0aXZlIGZlbmNlIGZkIHdpbGwgbm90IGJlIHBvcHVsYXRlZCB1bnRpbCBmbHVzaCgpIGlzIGRvbmUuCisgICAgZ2xGbHVzaCgpOworCisgICAgLy8gZ2V0IHRoZSBmZW5jZSBmZAorICAgIGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKGVnbER1cE5hdGl2ZUZlbmNlRkRBTkRST0lEKG1FR0xEaXNwbGF5LCBzeW5jKSk7CisgICAgZWdsRGVzdHJveVN5bmNLSFIobUVHTERpc3BsYXksIHN5bmMpOworICAgIGlmIChmZW5jZUZkID09IEVHTF9OT19OQVRJVkVfRkVOQ0VfRkRfQU5EUk9JRCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGR1cCBFR0wgbmF0aXZlIGZlbmNlIHN5bmM6ICUjeCIsIGVnbEdldEVycm9yKCkpOworICAgIH0KKworICAgIC8vIE9ubHkgdHJhY2UgaWYgd2UgaGF2ZSBhIHZhbGlkIGZlbmNlLCBhcyBjdXJyZW50IHVzYWdlIGZhbGxzIGJhY2sgdG8KKyAgICAvLyBjYWxsaW5nIGZpbmlzaCgpIGlmIHRoZSBmZW5jZSBmZCBpcyBpbnZhbGlkLgorICAgIGlmIChDQ19VTkxJS0VMWShtVHJhY2VHcHVDb21wbGV0aW9uICYmIG1GbHVzaFRyYWNlcikgJiYgZmVuY2VGZC5nZXQoKSA+PSAwKSB7CisgICAgICAgIG1GbHVzaFRyYWNlci0+cXVldWVTeW5jKGVnbENyZWF0ZVN5bmNLSFIobUVHTERpc3BsYXksIEVHTF9TWU5DX0ZFTkNFX0tIUiwgbnVsbHB0cikpOworICAgIH0KKworICAgIHJldHVybiBmZW5jZUZkOworfQorCitib29sIEdMRVNSZW5kZXJFbmdpbmU6OmZpbmlzaCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmICghR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhc0ZlbmNlU3luYygpKSB7CisgICAgICAgIEFMT0dXKCJubyBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRUdMU3luY0tIUiBzeW5jID0gZWdsQ3JlYXRlU3luY0tIUihtRUdMRGlzcGxheSwgRUdMX1NZTkNfRkVOQ0VfS0hSLCBudWxscHRyKTsKKyAgICBpZiAoc3luYyA9PSBFR0xfTk9fU1lOQ19LSFIpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBjcmVhdGUgRUdMIGZlbmNlIHN5bmM6ICUjeCIsIGVnbEdldEVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKENDX1VOTElLRUxZKG1UcmFjZUdwdUNvbXBsZXRpb24gJiYgbUZsdXNoVHJhY2VyKSkgeworICAgICAgICBtRmx1c2hUcmFjZXItPnF1ZXVlU3luYyhlZ2xDcmVhdGVTeW5jS0hSKG1FR0xEaXNwbGF5LCBFR0xfU1lOQ19GRU5DRV9LSFIsIG51bGxwdHIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gd2FpdFN5bmMoc3luYywgRUdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUX0tIUik7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6d2FpdFN5bmMoRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MpIHsKKyAgICBFR0xpbnQgcmVzdWx0ID0gZWdsQ2xpZW50V2FpdFN5bmNLSFIobUVHTERpc3BsYXksIHN5bmMsIGZsYWdzLCAyMDAwMDAwMDAwIC8qMiBzZWMqLyk7CisgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKKyAgICBlZ2xEZXN0cm95U3luY0tIUihtRUdMRGlzcGxheSwgc3luYyk7CisgICAgaWYgKHJlc3VsdCAhPSBFR0xfQ09ORElUSU9OX1NBVElTRklFRF9LSFIpIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFR0xfVElNRU9VVF9FWFBJUkVEX0tIUikgeworICAgICAgICAgICAgQUxPR1coImZlbmNlIHdhaXQgdGltZWQgb3V0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiZXJyb3Igd2FpdGluZyBvbiBFR0wgZmVuY2U6ICUjeCIsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6d2FpdEZlbmNlKGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKSB7CisgICAgaWYgKCFHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCkuaGFzTmF0aXZlRmVuY2VTeW5jKCkgfHwKKyAgICAgICAgIUdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKS5oYXNXYWl0U3luYygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyByZWxlYXNlIHRoZSBmZCBhbmQgdHJhbnNmZXIgdGhlIG93bmVyc2hpcCB0byBFR0xTeW5jCisgICAgRUdMaW50IGF0dHJpYnNbXSA9IHtFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfRkRfQU5EUk9JRCwgZmVuY2VGZC5yZWxlYXNlKCksIEVHTF9OT05FfTsKKyAgICBFR0xTeW5jS0hSIHN5bmMgPSBlZ2xDcmVhdGVTeW5jS0hSKG1FR0xEaXNwbGF5LCBFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfQU5EUk9JRCwgYXR0cmlicyk7CisgICAgaWYgKHN5bmMgPT0gRUdMX05PX1NZTkNfS0hSKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIEVHTCBuYXRpdmUgZmVuY2Ugc3luYzogJSN4IiwgZWdsR2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBYWFg6IFRoZSBzcGVjIGRyYWZ0IGlzIGluY29uc2lzdGVudCBhcyB0byB3aGV0aGVyIHRoaXMgc2hvdWxkIHJldHVybiBhbgorICAgIC8vIEVHTGludCBvciB2b2lkLiAgSWdub3JlIHRoZSByZXR1cm4gdmFsdWUgZm9yIG5vdywgYXMgaXQncyBub3Qgc3RyaWN0bHkKKyAgICAvLyBuZWVkZWQuCisgICAgZWdsV2FpdFN5bmNLSFIobUVHTERpc3BsYXksIHN5bmMsIDApOworICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7CisgICAgZWdsRGVzdHJveVN5bmNLSFIobUVHTERpc3BsYXksIHN5bmMpOworICAgIGlmIChlcnJvciAhPSBFR0xfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHdhaXQgZm9yIEVHTCBuYXRpdmUgZmVuY2Ugc3luYzogJSN4IiwgZXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6Y2xlYXJXaXRoQ29sb3IoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgZ2xDbGVhckNvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmZpbGxSZWdpb25XaXRoQ29sb3IoY29uc3QgUmVnaW9uJiByZWdpb24sIGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEpIHsKKyAgICBzaXplX3QgYzsKKyAgICBSZWN0IGNvbnN0KiByID0gcmVnaW9uLmdldEFycmF5KCZjKTsKKyAgICBNZXNoIG1lc2ggPSBNZXNoOjpCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmltaXRpdmUoTWVzaDo6VFJJQU5HTEVTKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZlcnRpY2VzKGMgKiA2IC8qIGNvdW50ICovLCAyIC8qIHNpemUgKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiBwb3NpdGlvbihtZXNoLmdldFBvc2l0aW9uQXJyYXk8dmVjMj4oKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjOyBpKyssIHIrKykgeworICAgICAgICBwb3NpdGlvbltpICogNiArIDBdLnggPSByLT5sZWZ0OworICAgICAgICBwb3NpdGlvbltpICogNiArIDBdLnkgPSByLT50b3A7CisgICAgICAgIHBvc2l0aW9uW2kgKiA2ICsgMV0ueCA9IHItPmxlZnQ7CisgICAgICAgIHBvc2l0aW9uW2kgKiA2ICsgMV0ueSA9IHItPmJvdHRvbTsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyAyXS54ID0gci0+cmlnaHQ7CisgICAgICAgIHBvc2l0aW9uW2kgKiA2ICsgMl0ueSA9IHItPmJvdHRvbTsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyAzXS54ID0gci0+bGVmdDsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyAzXS55ID0gci0+dG9wOworICAgICAgICBwb3NpdGlvbltpICogNiArIDRdLnggPSByLT5yaWdodDsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyA0XS55ID0gci0+Ym90dG9tOworICAgICAgICBwb3NpdGlvbltpICogNiArIDVdLnggPSByLT5yaWdodDsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyA1XS55ID0gci0+dG9wOworICAgIH0KKyAgICBzZXR1cEZpbGxXaXRoQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIGRyYXdNZXNoKG1lc2gpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldFNjaXNzb3IoY29uc3QgUmVjdCYgcmVnaW9uKSB7CisgICAgZ2xTY2lzc29yKHJlZ2lvbi5sZWZ0LCByZWdpb24udG9wLCByZWdpb24uZ2V0V2lkdGgoKSwgcmVnaW9uLmdldEhlaWdodCgpKTsKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmRpc2FibGVTY2lzc29yKCkgeworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmdlblRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QqIG5hbWVzKSB7CisgICAgZ2xHZW5UZXh0dXJlcyhjb3VudCwgbmFtZXMpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmRlbGV0ZVRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QgY29uc3QqIG5hbWVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIG1UZXh0dXJlVmlldy5lcmFzZShuYW1lc1tpXSk7CisgICAgfQorICAgIGdsRGVsZXRlVGV4dHVyZXMoY291bnQsIG5hbWVzKTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpiaW5kRXh0ZXJuYWxUZXh0dXJlSW1hZ2UodWludDMyX3QgdGV4TmFtZSwgY29uc3QgSW1hZ2UmIGltYWdlKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBjb25zdCBHTEltYWdlJiBnbEltYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgR0xJbWFnZSY+KGltYWdlKTsKKyAgICBjb25zdCBHTGVudW0gdGFyZ2V0ID0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVM7CisKKyAgICBnbEJpbmRUZXh0dXJlKHRhcmdldCwgdGV4TmFtZSk7CisgICAgaWYgKGdsSW1hZ2UuZ2V0RUdMSW1hZ2UoKSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgICAgIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVModGFyZ2V0LCBzdGF0aWNfY2FzdDxHTGVnbEltYWdlT0VTPihnbEltYWdlLmdldEVHTEltYWdlKCkpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEdMRVNSZW5kZXJFbmdpbmU6OmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDMyX3QgdGV4TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RmVuY2U+JiBidWZmZXJGZW5jZSkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVuZGVyaW5nTXV0ZXgpOworICAgICAgICBhdXRvIGNhY2hlZEltYWdlID0gbUltYWdlQ2FjaGUuZmluZChidWZmZXItPmdldElkKCkpOworICAgICAgICBmb3VuZCA9IChjYWNoZWRJbWFnZSAhPSBtSW1hZ2VDYWNoZS5lbmQoKSk7CisgICAgfQorCisgICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCB0aGUgaW1hZ2UgaW4gdGhlIGNhY2hlIGF0IHRoaXMgdGltZSwgdGhlbiBlaXRoZXIKKyAgICAvLyBTdXJmYWNlRmxpbmdlciBtZXNzZWQgdXAgcmVnaXN0ZXJpbmcgdGhlIGJ1ZmZlciBhaGVhZCBvZiB0aW1lIG9yIHdlIGdvdAorICAgIC8vIGJhY2tlZCB1cCBjcmVhdGluZyBvdGhlciBFR0xJbWFnZXMuCisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBzdGF0dXNfdCBjYWNoZVJlc3VsdCA9IG1JbWFnZU1hbmFnZXItPmNhY2hlKGJ1ZmZlcik7CisgICAgICAgIGlmIChjYWNoZVJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIGNhY2hlUmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2hldGhlciBvciBub3Qgd2UgbmVlZGVkIHRvIGNhY2hlLCByZS1jaGVjayBtSW1hZ2VDYWNoZSB0byBtYWtlIHN1cmUgdGhhdAorICAgIC8vIHRoZXJlJ3MgYW4gRUdMSW1hZ2UuIFRoZSBjdXJyZW50IHRocmVhZGluZyBtb2RlbCBndWFyYW50ZWVzIHRoYXQgd2UgZG9uJ3QKKyAgICAvLyBkZXN0cm95IGEgY2FjaGVkIGltYWdlIHVudGlsIGl0J3MgcmVhbGx5IG5vdCBuZWVkZWQgYW55bW9yZSAoaS5lLiB0aGlzCisgICAgLy8gZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQpLCBzbyB0aGUgb25seSBwb3NzaWJpbGl0eSBpcyB0aGF0IHNvbWV0aGluZworICAgIC8vIHRlcnJpYmxlIHdlbnQgd3JvbmcgYW5kIHdlIHNob3VsZCBqdXN0IGJpbmQgc29tZXRoaW5nIGFuZCBtb3ZlIG9uLgorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbmRlcmluZ011dGV4KTsKKyAgICAgICAgYXV0byBjYWNoZWRJbWFnZSA9IG1JbWFnZUNhY2hlLmZpbmQoYnVmZmVyLT5nZXRJZCgpKTsKKworICAgICAgICBpZiAoY2FjaGVkSW1hZ2UgPT0gbUltYWdlQ2FjaGUuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGZhaWxlZCBjcmVhdGluZyB0aGUgaW1hZ2UgaWYgd2UgZ290IGhlcmUsIHNvIGJhaWwgb3V0LgorICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgYW4gRUdMSW1hZ2Ugd2hlbiByZW5kZXJpbmciKTsKKyAgICAgICAgICAgIGJpbmRFeHRlcm5hbFRleHR1cmVJbWFnZSh0ZXhOYW1lLCAqY3JlYXRlSW1hZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIGJpbmRFeHRlcm5hbFRleHR1cmVJbWFnZSh0ZXhOYW1lLCAqY2FjaGVkSW1hZ2UtPnNlY29uZCk7CisgICAgICAgIG1UZXh0dXJlVmlldy5pbnNlcnRfb3JfYXNzaWduKHRleE5hbWUsIGJ1ZmZlci0+Z2V0SWQoKSk7CisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgdGhlIG5ldyBidWZmZXIgdG8gYmUgcmVhZHkuCisgICAgaWYgKGJ1ZmZlckZlbmNlICE9IG51bGxwdHIgJiYgYnVmZmVyRmVuY2UtPmlzVmFsaWQoKSkgeworICAgICAgICBpZiAoR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhc1dhaXRTeW5jKCkpIHsKKyAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKGJ1ZmZlckZlbmNlLT5kdXAoKSk7CisgICAgICAgICAgICBpZiAoZmVuY2VGZCA9PSAtMSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciBkdXAnaW5nIGZlbmNlIGZkOiAlZCIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF3YWl0RmVuY2Uoc3RkOjptb3ZlKGZlbmNlRmQpKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gd2FpdCBvbiBmZW5jZSBmZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYnVmZmVyRmVuY2UtPndhaXRGb3JldmVyKCJSZW5kZXJFbmdpbmU6OmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIiKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3Igd2FpdGluZyBmb3IgZmVuY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBtSW1hZ2VNYW5hZ2VyLT5jYWNoZUFzeW5jKGJ1ZmZlciwgbnVsbHB0cik7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJbWFnZU1hbmFnZXI6OkJhcnJpZXI+IEdMRVNSZW5kZXJFbmdpbmU6OmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZygKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcikgeworICAgIGF1dG8gYmFycmllciA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1hZ2VNYW5hZ2VyOjpCYXJyaWVyPigpOworICAgIG1JbWFnZU1hbmFnZXItPmNhY2hlQXN5bmMoYnVmZmVyLCBiYXJyaWVyKTsKKyAgICByZXR1cm4gYmFycmllcjsKK30KKworc3RhdHVzX3QgR0xFU1JlbmRlckVuZ2luZTo6Y2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVuZGVyaW5nTXV0ZXgpOworICAgICAgICBpZiAobUltYWdlQ2FjaGUuY291bnQoYnVmZmVyLT5nZXRJZCgpKSA+IDApIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiBpbWFnZSB0aGVuIGZhaWwgZmFzdCBoZXJlLgorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBDcmVhdGUgdGhlIGltYWdlIHdpdGhvdXQgaG9sZGluZyBhIGxvY2sgc28gdGhhdCB3ZSBkb24ndCBibG9jayBhbnl0aGluZy4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1hZ2U+IG5ld0ltYWdlID0gY3JlYXRlSW1hZ2UoKTsKKworICAgIGJvb2wgY3JlYXRlZCA9IG5ld0ltYWdlLT5zZXROYXRpdmVXaW5kb3dCdWZmZXIoYnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+Z2V0VXNhZ2UoKSAmIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKTsKKyAgICBpZiAoIWNyZWF0ZWQpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaW1hZ2UuIHNpemU9JXV4JXUgc3Q9JXUgdXNhZ2U9JSMiIFBSSXg2NCAiIGZtdD0lZCIsCisgICAgICAgICAgICAgIGJ1ZmZlci0+Z2V0V2lkdGgoKSwgYnVmZmVyLT5nZXRIZWlnaHQoKSwgYnVmZmVyLT5nZXRTdHJpZGUoKSwgYnVmZmVyLT5nZXRVc2FnZSgpLAorICAgICAgICAgICAgICBidWZmZXItPmdldFBpeGVsRm9ybWF0KCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZW5kZXJpbmdNdXRleCk7CisgICAgICAgIGlmIChtSW1hZ2VDYWNoZS5jb3VudChidWZmZXItPmdldElkKCkpID4gMCkgeworICAgICAgICAgICAgLy8gSW4gdGhlb3J5IGl0J3MgcG9zc2libGUgZm9yIGFub3RoZXIgdGhyZWFkIHRvIHJlY2FjaGUgdGhlIGltYWdlLAorICAgICAgICAgICAgLy8gc28gYmFpbCBvdXQgaWYgYW5vdGhlciB0aHJlYWQgd29uLgorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1JbWFnZUNhY2hlLmluc2VydChzdGQ6Om1ha2VfcGFpcihidWZmZXItPmdldElkKCksIHN0ZDo6bW92ZShuZXdJbWFnZSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSB7CisgICAgbUltYWdlTWFuYWdlci0+cmVsZWFzZUFzeW5jKGJ1ZmZlcklkLCBudWxscHRyKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEltYWdlTWFuYWdlcjo6QmFycmllcj4gR0xFU1JlbmRlckVuZ2luZTo6dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZygKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQpIHsKKyAgICBhdXRvIGJhcnJpZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltYWdlTWFuYWdlcjo6QmFycmllcj4oKTsKKyAgICBtSW1hZ2VNYW5hZ2VyLT5yZWxlYXNlQXN5bmMoYnVmZmVySWQsIGJhcnJpZXIpOworICAgIHJldHVybiBiYXJyaWVyOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlckludGVybmFsKHVpbnQ2NF90IGJ1ZmZlcklkKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltYWdlPiBpbWFnZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZW5kZXJpbmdNdXRleCk7CisgICAgICAgIGNvbnN0IGF1dG8mIGNhY2hlZEltYWdlID0gbUltYWdlQ2FjaGUuZmluZChidWZmZXJJZCk7CisKKyAgICAgICAgaWYgKGNhY2hlZEltYWdlICE9IG1JbWFnZUNhY2hlLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiRGVzdHJveWluZyBpbWFnZSBmb3IgYnVmZmVyOiAlIiBQUkl1NjQsIGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIC8vIE1vdmUgdGhlIGJ1ZmZlciBvdXQgb2YgY2FjaGUgZmlyc3QsIHNvIHRoYXQgd2UgY2FuIGRlc3Ryb3kKKyAgICAgICAgICAgIC8vIHdpdGhvdXQgaG9sZGluZyB0aGUgY2FjaGUncyBsb2NrLgorICAgICAgICAgICAgaW1hZ2UgPSBzdGQ6Om1vdmUoY2FjaGVkSW1hZ2UtPnNlY29uZCk7CisgICAgICAgICAgICBtSW1hZ2VDYWNoZS5lcmFzZShidWZmZXJJZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIkZhaWxlZCB0byBmaW5kIGltYWdlIGZvciBidWZmZXI6ICUiIFBSSXU2NCwgYnVmZmVySWQpOworfQorCitGbG9hdFJlY3QgR0xFU1JlbmRlckVuZ2luZTo6c2V0dXBMYXllckNyb3BwaW5nKGNvbnN0IExheWVyU2V0dGluZ3MmIGxheWVyLCBNZXNoJiBtZXNoKSB7CisgICAgLy8gVHJhbnNsYXRlIHdpbiBieSB0aGUgcm91bmRlZCBjb3JuZXJzIHJlY3QgY29vcmRpbmF0ZXMsIHRvIGhhdmUgYWxsIHZhbHVlcyBpbgorICAgIC8vIGxheWVyIGNvb3JkaW5hdGUgc3BhY2UuCisgICAgRmxvYXRSZWN0IGNyb3BXaW4gPSBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzOworICAgIGNvbnN0IEZsb2F0UmVjdCYgcm91bmRlZENvcm5lcnNDcm9wID0gbGF5ZXIuZ2VvbWV0cnkucm91bmRlZENvcm5lcnNDcm9wOworICAgIGNyb3BXaW4ubGVmdCAtPSByb3VuZGVkQ29ybmVyc0Nyb3AubGVmdDsKKyAgICBjcm9wV2luLnJpZ2h0IC09IHJvdW5kZWRDb3JuZXJzQ3JvcC5sZWZ0OworICAgIGNyb3BXaW4udG9wIC09IHJvdW5kZWRDb3JuZXJzQ3JvcC50b3A7CisgICAgY3JvcFdpbi5ib3R0b20gLT0gcm91bmRlZENvcm5lcnNDcm9wLnRvcDsKKyAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiBjcm9wQ29vcmRzKG1lc2guZ2V0Q3JvcENvb3JkQXJyYXk8dmVjMj4oKSk7CisgICAgY3JvcENvb3Jkc1swXSA9IHZlYzIoY3JvcFdpbi5sZWZ0LCBjcm9wV2luLnRvcCk7CisgICAgY3JvcENvb3Jkc1sxXSA9IHZlYzIoY3JvcFdpbi5sZWZ0LCBjcm9wV2luLnRvcCArIGNyb3BXaW4uZ2V0SGVpZ2h0KCkpOworICAgIGNyb3BDb29yZHNbMl0gPSB2ZWMyKGNyb3BXaW4ucmlnaHQsIGNyb3BXaW4udG9wICsgY3JvcFdpbi5nZXRIZWlnaHQoKSk7CisgICAgY3JvcENvb3Jkc1szXSA9IHZlYzIoY3JvcFdpbi5yaWdodCwgY3JvcFdpbi50b3ApOworCisgICAgc2V0dXBDb3JuZXJSYWRpdXNDcm9wU2l6ZShyb3VuZGVkQ29ybmVyc0Nyb3AuZ2V0V2lkdGgoKSwgcm91bmRlZENvcm5lcnNDcm9wLmdldEhlaWdodCgpKTsKKyAgICByZXR1cm4gY3JvcFdpbjsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpoYW5kbGVSb3VuZGVkQ29ybmVycyhjb25zdCBEaXNwbGF5U2V0dGluZ3MmIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExheWVyU2V0dGluZ3MmIGxheWVyLCBjb25zdCBNZXNoJiBtZXNoKSB7CisgICAgLy8gV2Ugc2VwYXJhdGUgdGhlIGxheWVyIGludG8gMyBwYXJ0cyBlc3NlbnRpYWxseSwgc3VjaCB0aGF0IHdlIG9ubHkgdHVybiBvbiBibGVuZGluZyBmb3IgdGhlCisgICAgLy8gdG9wIHJlY3RhbmdsZSBhbmQgdGhlIGJvdHRvbSByZWN0YW5nbGUsIGFuZCB0dXJuIG9mZiBibGVuZGluZyBmb3IgdGhlIG1pZGRsZSByZWN0YW5nbGUuCisgICAgRmxvYXRSZWN0IGJvdW5kcyA9IGxheWVyLmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzQ3JvcDsKKworICAgIC8vIEV4cGxpY2l0bHkgY29tcHV0ZSB0aGUgdHJhbnNmb3JtIGZyb20gdGhlIGNsaXAgcmVjdGFuZ2xlIHRvIHRoZSBwaHlzaWNhbAorICAgIC8vIGRpc3BsYXkuIE5vcm1hbGx5LCB0aGlzIGlzIGRvbmUgaW4gZ2xWaWV3cG9ydCBidXQgd2UgZXhwbGljaXRseSBjb21wdXRlCisgICAgLy8gaXQgaGVyZSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHNjaXNzb3IgYm91bmRzIGNvcnJlY3QuCisgICAgY29uc3QgUmVjdCYgc291cmNlID0gZGlzcGxheS5jbGlwOworICAgIGNvbnN0IFJlY3QmIGRlc3RpbmF0aW9uID0gZGlzcGxheS5waHlzaWNhbERpc3BsYXk7CisgICAgLy8gSGVyZSB3ZSBjb21wdXRlIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtOgorICAgIC8vIDEuIFRyYW5zbGF0ZSB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBzb3VyY2UgY2xpcCB0byAoMCwgMCkKKyAgICAvLyAyLiBSb3RhdGUgdGhlIGNsaXAgcmVjdGFuZ2xlIGFib3V0IHRoZSBvcmlnaW4gaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICAgIC8vIG9yaWVudGF0aW9uIGZsYWcKKyAgICAvLyAzLiBUcmFuc2xhdGUgdGhlIHRvcCBsZWZ0IGNvcm5lciBiYWNrIHRvIHRoZSBvcmlnaW4uCisgICAgLy8gNC4gU2NhbGUgdGhlIGNsaXAgcmVjdGFuZ2xlIHRvIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgZGltZW5zaW9ucworICAgIC8vIDUuIFRyYW5zbGF0ZSB0aGUgdG9wIGxlZnQgY29ybmVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUncyB0b3AgbGVmdAorICAgIC8vIGNvcm5lci4KKyAgICBjb25zdCBtYXQ0IHRyYW5zbGF0ZVNvdXJjZSA9IG1hdDQ6OnRyYW5zbGF0ZSh2ZWM0KC1zb3VyY2UubGVmdCwgLXNvdXJjZS50b3AsIDAsIDEpKTsKKyAgICBtYXQ0IHJvdGF0aW9uOworICAgIGludCBkaXNwbGFjZW1lbnRYID0gMDsKKyAgICBpbnQgZGlzcGxhY2VtZW50WSA9IDA7CisgICAgZmxvYXQgZGVzdGluYXRpb25XaWR0aCA9IHN0YXRpY19jYXN0PGZsb2F0PihkZXN0aW5hdGlvbi5nZXRXaWR0aCgpKTsKKyAgICBmbG9hdCBkZXN0aW5hdGlvbkhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0PihkZXN0aW5hdGlvbi5nZXRIZWlnaHQoKSk7CisgICAgZmxvYXQgc291cmNlV2lkdGggPSBzdGF0aWNfY2FzdDxmbG9hdD4oc291cmNlLmdldFdpZHRoKCkpOworICAgIGZsb2F0IHNvdXJjZUhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0Pihzb3VyY2UuZ2V0SGVpZ2h0KCkpOworICAgIGNvbnN0IGZsb2F0IHJvdDkwSW5SYWRpYW5zID0gMi4wZiAqIHN0YXRpY19jYXN0PGZsb2F0PihNX1BJKSAvIDQuMGY7CisgICAgc3dpdGNoIChkaXNwbGF5Lm9yaWVudGF0aW9uKSB7CisgICAgICAgIGNhc2UgdWk6OlRyYW5zZm9ybTo6Uk9UXzkwOgorICAgICAgICAgICAgcm90YXRpb24gPSBtYXQ0Ojpyb3RhdGUocm90OTBJblJhZGlhbnMsIHZlYzMoMCwgMCwgMSkpOworICAgICAgICAgICAgZGlzcGxhY2VtZW50WCA9IHNvdXJjZS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHN0ZDo6c3dhcChzb3VyY2VIZWlnaHQsIHNvdXJjZVdpZHRoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHVpOjpUcmFuc2Zvcm06OlJPVF8xODA6CisgICAgICAgICAgICByb3RhdGlvbiA9IG1hdDQ6OnJvdGF0ZShyb3Q5MEluUmFkaWFucyAqIDIuMGYsIHZlYzMoMCwgMCwgMSkpOworICAgICAgICAgICAgZGlzcGxhY2VtZW50WSA9IHNvdXJjZS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGRpc3BsYWNlbWVudFggPSBzb3VyY2UuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHVpOjpUcmFuc2Zvcm06OlJPVF8yNzA6CisgICAgICAgICAgICByb3RhdGlvbiA9IG1hdDQ6OnJvdGF0ZShyb3Q5MEluUmFkaWFucyAqIDMuMGYsIHZlYzMoMCwgMCwgMSkpOworICAgICAgICAgICAgZGlzcGxhY2VtZW50WSA9IHNvdXJjZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgc3RkOjpzd2FwKHNvdXJjZUhlaWdodCwgc291cmNlV2lkdGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjb25zdCBtYXQ0IGludGVybWVkaWF0ZVRyYW5zbGF0aW9uID0gbWF0NDo6dHJhbnNsYXRlKHZlYzQoZGlzcGxhY2VtZW50WCwgZGlzcGxhY2VtZW50WSwgMCwgMSkpOworICAgIGNvbnN0IG1hdDQgc2NhbGUgPSBtYXQ0OjpzY2FsZSgKKyAgICAgICAgICAgIHZlYzQoZGVzdGluYXRpb25XaWR0aCAvIHNvdXJjZVdpZHRoLCBkZXN0aW5hdGlvbkhlaWdodCAvIHNvdXJjZUhlaWdodCwgMSwgMSkpOworICAgIGNvbnN0IG1hdDQgdHJhbnNsYXRlRGVzdGluYXRpb24gPQorICAgICAgICAgICAgbWF0NDo6dHJhbnNsYXRlKHZlYzQoZGVzdGluYXRpb24ubGVmdCwgZGVzdGluYXRpb24udG9wLCAwLCAxKSk7CisgICAgY29uc3QgbWF0NCBnbG9iYWxUcmFuc2Zvcm0gPQorICAgICAgICAgICAgdHJhbnNsYXRlRGVzdGluYXRpb24gKiBzY2FsZSAqIGludGVybWVkaWF0ZVRyYW5zbGF0aW9uICogcm90YXRpb24gKiB0cmFuc2xhdGVTb3VyY2U7CisKKyAgICBjb25zdCBtYXQ0IHRyYW5zZm9ybU1hdHJpeCA9IGdsb2JhbFRyYW5zZm9ybSAqIGxheWVyLmdlb21ldHJ5LnBvc2l0aW9uVHJhbnNmb3JtOworICAgIGNvbnN0IHZlYzQgbGVmdFRvcENvb3JkaW5hdGUoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIDEuMCwgMS4wKTsKKyAgICBjb25zdCB2ZWM0IHJpZ2h0Qm90dG9tQ29vcmRpbmF0ZShib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sIDEuMCwgMS4wKTsKKyAgICBjb25zdCB2ZWM0IGxlZnRUb3BDb29yZGluYXRlSW5CdWZmZXIgPSB0cmFuc2Zvcm1NYXRyaXggKiBsZWZ0VG9wQ29vcmRpbmF0ZTsKKyAgICBjb25zdCB2ZWM0IHJpZ2h0Qm90dG9tQ29vcmRpbmF0ZUluQnVmZmVyID0gdHJhbnNmb3JtTWF0cml4ICogcmlnaHRCb3R0b21Db29yZGluYXRlOworICAgIGJvdW5kcyA9IEZsb2F0UmVjdChzdGQ6Om1pbihsZWZ0VG9wQ29vcmRpbmF0ZUluQnVmZmVyWzBdLCByaWdodEJvdHRvbUNvb3JkaW5hdGVJbkJ1ZmZlclswXSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGxlZnRUb3BDb29yZGluYXRlSW5CdWZmZXJbMV0sIHJpZ2h0Qm90dG9tQ29vcmRpbmF0ZUluQnVmZmVyWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgobGVmdFRvcENvb3JkaW5hdGVJbkJ1ZmZlclswXSwgcmlnaHRCb3R0b21Db29yZGluYXRlSW5CdWZmZXJbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChsZWZ0VG9wQ29vcmRpbmF0ZUluQnVmZmVyWzFdLCByaWdodEJvdHRvbUNvb3JkaW5hdGVJbkJ1ZmZlclsxXSkpOworCisgICAgLy8gRmluYWxseSwgd2UgY3V0IHRoZSBsYXllciBpbnRvIDMgcGFydHMsIHdpdGggdG9wIGFuZCBib3R0b20gcGFydHMgaGF2aW5nIHJvdW5kZWQgY29ybmVycworICAgIC8vIGFuZCB0aGUgbWlkZGxlIHBhcnQgd2l0aG91dCByb3VuZGVkIGNvcm5lcnMuCisgICAgY29uc3QgaW50MzJfdCByYWRpdXMgPSBjZWlsKGxheWVyLmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzUmFkaXVzKTsKKyAgICBjb25zdCBSZWN0IHRvcFJlY3QoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLnRvcCArIHJhZGl1cyk7CisgICAgc2V0U2Npc3Nvcih0b3BSZWN0KTsKKyAgICBkcmF3TWVzaChtZXNoKTsKKyAgICBjb25zdCBSZWN0IGJvdHRvbVJlY3QoYm91bmRzLmxlZnQsIGJvdW5kcy5ib3R0b20gLSByYWRpdXMsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSk7CisgICAgc2V0U2Npc3Nvcihib3R0b21SZWN0KTsKKyAgICBkcmF3TWVzaChtZXNoKTsKKworICAgIC8vIFRoZSBtaWRkbGUgcGFydCBvZiB0aGUgbGF5ZXIgY2FuIHR1cm4gb2ZmIGJsZW5kaW5nLgorICAgIGlmICh0b3BSZWN0LmJvdHRvbSA8IGJvdHRvbVJlY3QudG9wKSB7CisgICAgICAgIGNvbnN0IFJlY3QgbWlkZGxlUmVjdChib3VuZHMubGVmdCwgYm91bmRzLnRvcCArIHJhZGl1cywgYm91bmRzLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSAtIHJhZGl1cyk7CisgICAgICAgIHNldFNjaXNzb3IobWlkZGxlUmVjdCk7CisgICAgICAgIG1TdGF0ZS5jb3JuZXJSYWRpdXMgPSAwLjA7CisgICAgICAgIGRpc2FibGVCbGVuZGluZygpOworICAgICAgICBkcmF3TWVzaChtZXNoKTsKKyAgICB9CisgICAgZGlzYWJsZVNjaXNzb3IoKTsKK30KKworc3RhdHVzX3QgR0xFU1JlbmRlckVuZ2luZTo6YmluZEZyYW1lQnVmZmVyKEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgR0xGcmFtZWJ1ZmZlciogZ2xGcmFtZWJ1ZmZlciA9IHN0YXRpY19jYXN0PEdMRnJhbWVidWZmZXIqPihmcmFtZWJ1ZmZlcik7CisgICAgRUdMSW1hZ2VLSFIgZWdsSW1hZ2UgPSBnbEZyYW1lYnVmZmVyLT5nZXRFR0xJbWFnZSgpOworICAgIHVpbnQzMl90IHRleHR1cmVOYW1lID0gZ2xGcmFtZWJ1ZmZlci0+Z2V0VGV4dHVyZU5hbWUoKTsKKyAgICB1aW50MzJfdCBmcmFtZWJ1ZmZlck5hbWUgPSBnbEZyYW1lYnVmZmVyLT5nZXRGcmFtZWJ1ZmZlck5hbWUoKTsKKworICAgIC8vIEJpbmQgdGhlIHRleHR1cmUgYW5kIHR1cm4gb3VyIEVHTEltYWdlIGludG8gYSB0ZXh0dXJlCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlTmFtZSk7CisgICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTF9URVhUVVJFXzJELCAoR0xlZ2xJbWFnZU9FUyllZ2xJbWFnZSk7CisKKyAgICAvLyBCaW5kIHRoZSBGcmFtZWJ1ZmZlciB0byByZW5kZXIgaW50bworICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlck5hbWUpOworICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwLCBHTF9URVhUVVJFXzJELCB0ZXh0dXJlTmFtZSwgMCk7CisKKyAgICB1aW50MzJfdCBnbFN0YXR1cyA9IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhHTF9GUkFNRUJVRkZFUik7CisgICAgQUxPR0VfSUYoZ2xTdGF0dXMgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTLCAiZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTIGVycm9yICVkIiwKKyAgICAgICAgICAgICBnbFN0YXR1cyk7CisKKyAgICByZXR1cm4gZ2xTdGF0dXMgPT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTID8gTk9fRVJST1IgOiBCQURfVkFMVUU7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6dW5iaW5kRnJhbWVCdWZmZXIoRnJhbWVidWZmZXIqIC8qZnJhbWVidWZmZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBiYWNrIHRvIG1haW4gZnJhbWVidWZmZXIKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6Y2xlYW51cFBvc3RSZW5kZXIoQ2xlYW51cE1vZGUgbW9kZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBpZiAobVByaW9yUmVzb3VyY2VzQ2xlYW5lZCB8fAorICAgICAgICAobUxhc3REcmF3RmVuY2UgIT0gbnVsbHB0ciAmJiBtTGFzdERyYXdGZW5jZS0+Z2V0U3RhdHVzKCkgIT0gRmVuY2U6OlN0YXR1czo6U2lnbmFsZWQpKSB7CisgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBwcmlvciBmcmFtZSBuZWVkaW5nIGNsZWFudXAsIHRoZW4gZG9uJ3QgZG8gYW55dGhpbmcuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGEgYml0IG9mIGEgYmFuZC1haWQgZml4IGZvciBGcmFtZUNhcHR1cmVQcm9jZXNzb3IsIGFzIHdlIHNob3VsZAorICAgIC8vIG5vdCBuZWVkIHRvIGtlZXAgbWVtb3J5IGFyb3VuZCBpZiB3ZSBkb24ndCBuZWVkIHRvIGRvIHNvLgorICAgIGlmIChtb2RlID09IENsZWFudXBNb2RlOjpDTEVBTl9BTEwpIHsKKyAgICAgICAgLy8gVE9ETzogU3VyZmFjZUZsaW5nZXIgbWVtb3J5IHV0aWxpemF0aW9uIG1heSBiZW5lZml0IGZyb20gcmVzZXR0aW5nCisgICAgICAgIC8vIHRleHR1cmUgYmluZGluZ3MgYXMgd2VsbC4gQXNzZXNzIGlmIGl0IGRvZXMgYW5kIHRoZXJlJ3Mgbm8gcGVyZm9ybWFuY2UgcmVncmVzc2lvbgorICAgICAgICAvLyB3aGVuIHJlYmluZGluZyB0aGUgc2FtZSBpbWFnZSBkYXRhIHRvIHRoZSBzYW1lIHRleHR1cmUsIGFuZCBpZiBzbyB0aGVuIGl0cyBtb2RlCisgICAgICAgIC8vIGJlaGF2aW9yIGNhbiBiZSB0d2Vha2VkLgorICAgICAgICBpZiAobVBsYWNlaG9sZGVySW1hZ2UgIT0gRUdMX05PX0lNQUdFX0tIUikgeworICAgICAgICAgICAgZm9yIChhdXRvIFt0ZXh0dXJlTmFtZSwgYnVmZmVySWRdIDogbVRleHR1cmVWaWV3KSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcklkICYmIG1QbGFjZWhvbGRlckltYWdlICE9IEVHTF9OT19JTUFHRV9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgdGV4dHVyZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEdMZWdsSW1hZ2VPRVM+KG1QbGFjZWhvbGRlckltYWdlKSk7CisgICAgICAgICAgICAgICAgICAgIG1UZXh0dXJlVmlld1t0ZXh0dXJlTmFtZV0gPSBzdGQ6Om51bGxvcHQ7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZW5kZXJpbmdNdXRleCk7CisgICAgICAgICAgICBtSW1hZ2VDYWNoZS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQmluZCB0aGUgdGV4dHVyZSB0byBwbGFjZWhvbGRlciBzbyB0aGF0IGJhY2tpbmcgaW1hZ2UgZGF0YSBjYW4gYmUgZnJlZWQuCisgICAgR0xGcmFtZWJ1ZmZlciogZ2xGcmFtZWJ1ZmZlciA9IHN0YXRpY19jYXN0PEdMRnJhbWVidWZmZXIqPihnZXRGcmFtZWJ1ZmZlckZvckRyYXdpbmcoKSk7CisgICAgZ2xGcmFtZWJ1ZmZlci0+YWxsb2NhdGVCdWZmZXJzKDEsIDEsIG1QbGFjZWhvbGRlckRyYXdCdWZmZXIpOworICAgIC8vIFJlbGVhc2UgdGhlIGNhY2hlZCBmZW5jZSBoZXJlLCBzbyB0aGF0IHdlIGRvbid0IGNodXJuIHJlYWxsb2NhdGlvbnMgd2hlbgorICAgIC8vIHdlIGNvdWxkIG5vLW9wIHJlcGVhdGVkIGNhbGxzIG9mIHRoaXMgbWV0aG9kIGluc3RlYWQuCisgICAgbUxhc3REcmF3RmVuY2UgPSBudWxscHRyOworICAgIG1QcmlvclJlc291cmNlc0NsZWFuZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmNoZWNrRXJyb3JzKCkgY29uc3QgeworICAgIGNoZWNrRXJyb3JzKG51bGxwdHIpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmNoZWNrRXJyb3JzKGNvbnN0IGNoYXIqIHRhZykgY29uc3QgeworICAgIGRvIHsKKyAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBlcnJvciBmbGFnCisgICAgICAgIEdMZW51bSBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICAgICAgaWYgKGVycm9yID09IEdMX05PX0VSUk9SKSBicmVhazsKKyAgICAgICAgaWYgKHRhZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiR0wgZXJyb3IgMHglMDR4IiwgaW50KGVycm9yKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiR0wgZXJyb3I6ICVzIC0+IDB4JTA0eCIsIHRhZywgaW50KGVycm9yKSk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICh0cnVlKTsKK30KKworYm9vbCBHTEVTUmVuZGVyRW5naW5lOjpzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Qcm90ZWN0ZWRFR0xDb250ZXh0ICE9IEVHTF9OT19DT05URVhUOworfQorCitib29sIEdMRVNSZW5kZXJFbmdpbmU6OnVzZVByb3RlY3RlZENvbnRleHQoYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KSB7CisgICAgaWYgKHVzZVByb3RlY3RlZENvbnRleHQgPT0gbUluUHJvdGVjdGVkQ29udGV4dCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHVzZVByb3RlY3RlZENvbnRleHQgJiYgbVByb3RlY3RlZEVHTENvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBFR0xTdXJmYWNlIHN1cmZhY2UgPSB1c2VQcm90ZWN0ZWRDb250ZXh0ID8gbVByb3RlY3RlZFN0dWJTdXJmYWNlIDogbVN0dWJTdXJmYWNlOworICAgIGNvbnN0IEVHTENvbnRleHQgY29udGV4dCA9IHVzZVByb3RlY3RlZENvbnRleHQgPyBtUHJvdGVjdGVkRUdMQ29udGV4dCA6IG1FR0xDb250ZXh0OworICAgIGNvbnN0IGJvb2wgc3VjY2VzcyA9IGVnbE1ha2VDdXJyZW50KG1FR0xEaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KSA9PSBFR0xfVFJVRTsKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBtSW5Qcm90ZWN0ZWRDb250ZXh0ID0gdXNlUHJvdGVjdGVkQ29udGV4dDsKKyAgICB9CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitFR0xJbWFnZUtIUiBHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGVGcmFtZWJ1ZmZlckltYWdlSWZOZWVkZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogbmF0aXZlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQcm90ZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VGcmFtZWJ1ZmZlckNhY2hlKSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IEdyYXBoaWNCdWZmZXI6OmZyb20obmF0aXZlQnVmZmVyKTsKKyAgICBpZiAodXNlRnJhbWVidWZmZXJDYWNoZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXgpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGltYWdlIDogbUZyYW1lYnVmZmVySW1hZ2VDYWNoZSkgeworICAgICAgICAgICAgaWYgKGltYWdlLmZpcnN0ID09IGdyYXBoaWNCdWZmZXItPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW1hZ2Uuc2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEVHTGludCBhdHRyaWJ1dGVzW10gPSB7CisgICAgICAgICAgICBpc1Byb3RlY3RlZCA/IEVHTF9QUk9URUNURURfQ09OVEVOVF9FWFQgOiBFR0xfTk9ORSwKKyAgICAgICAgICAgIGlzUHJvdGVjdGVkID8gRUdMX1RSVUUgOiBFR0xfTk9ORSwKKyAgICAgICAgICAgIEVHTF9OT05FLAorICAgIH07CisgICAgRUdMSW1hZ2VLSFIgaW1hZ2UgPSBlZ2xDcmVhdGVJbWFnZUtIUihtRUdMRGlzcGxheSwgRUdMX05PX0NPTlRFWFQsIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVCdWZmZXIsIGF0dHJpYnV0ZXMpOworICAgIGlmICh1c2VGcmFtZWJ1ZmZlckNhY2hlKSB7CisgICAgICAgIGlmIChpbWFnZSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuc2l6ZSgpID49IG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGVTaXplKSB7CisgICAgICAgICAgICAgICAgRUdMSW1hZ2VLSFIgZXhwaXJlZCA9IG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuZnJvbnQoKS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgbUZyYW1lYnVmZmVySW1hZ2VDYWNoZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIobUVHTERpc3BsYXksIGV4cGlyZWQpOworICAgICAgICAgICAgICAgIERFQlVHX0VHTF9JTUFHRV9UUkFDS0VSX0RFU1RST1koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUucHVzaF9iYWNrKHtncmFwaGljQnVmZmVyLT5nZXRJZCgpLCBpbWFnZX0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGltYWdlICE9IEVHTF9OT19JTUFHRV9LSFIpIHsKKyAgICAgICAgREVCVUdfRUdMX0lNQUdFX1RSQUNLRVJfQ1JFQVRFKCk7CisgICAgfQorICAgIHJldHVybiBpbWFnZTsKK30KKworc3RhdHVzX3QgR0xFU1JlbmRlckVuZ2luZTo6ZHJhd0xheWVycyhjb25zdCBEaXNwbGF5U2V0dGluZ3MmIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IExheWVyU2V0dGluZ3MqPiYgbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZUZyYW1lYnVmZmVyQ2FjaGUsIGJhc2U6OnVuaXF1ZV9mZCYmIGJ1ZmZlckZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjp1bmlxdWVfZmQqIGRyYXdGZW5jZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGxheWVycy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCJEcmF3aW5nIGVtcHR5IGxheWVyIHN0YWNrIik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyRmVuY2UuZ2V0KCkgPj0gMCkgeworICAgICAgICAvLyBEdXBsaWNhdGUgdGhlIGZlbmNlIGZvciBwYXNzaW5nIHRvIHdhaXRGZW5jZS4KKyAgICAgICAgYmFzZTo6dW5pcXVlX2ZkIGJ1ZmZlckZlbmNlRHVwKGR1cChidWZmZXJGZW5jZS5nZXQoKSkpOworICAgICAgICBpZiAoYnVmZmVyRmVuY2VEdXAgPCAwIHx8ICF3YWl0RmVuY2Uoc3RkOjptb3ZlKGJ1ZmZlckZlbmNlRHVwKSkpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJXYWl0aW5nIGJlZm9yZSBkcmF3Iik7CisgICAgICAgICAgICBzeW5jX3dhaXQoYnVmZmVyRmVuY2UuZ2V0KCksIC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiTm8gb3V0cHV0IGJ1ZmZlciBwcm92aWRlZC4gQWJvcnRpbmcgR1BVIGNvbXBvc2l0aW9uLiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxCaW5kTmF0aXZlQnVmZmVyQXNGcmFtZWJ1ZmZlcj4gZmJvOworICAgIC8vIEdhdGhlcmluZyBsYXllcnMgdGhhdCByZXF1ZXN0ZWQgYmx1ciwgd2UnbGwgbmVlZCB0aGVtIHRvIGRlY2lkZSB3aGVuIHRvIHJlbmRlciB0byBhbgorICAgIC8vIG9mZnNjcmVlbiBidWZmZXIsIGFuZCB3aGVuIHRvIHJlbmRlciB0byB0aGUgbmF0aXZlIGJ1ZmZlci4KKyAgICBzdGQ6OmRlcXVlPGNvbnN0IExheWVyU2V0dGluZ3MqPiBibHVyTGF5ZXJzOworICAgIGlmIChDQ19MSUtFTFkobUJsdXJGaWx0ZXIgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgZm9yIChhdXRvIGxheWVyIDogbGF5ZXJzKSB7CisgICAgICAgICAgICBpZiAobGF5ZXItPmJhY2tncm91bmRCbHVyUmFkaXVzID4gMCkgeworICAgICAgICAgICAgICAgIGJsdXJMYXllcnMucHVzaF9iYWNrKGxheWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBhdXRvIGJsdXJMYXllcnNTaXplID0gYmx1ckxheWVycy5zaXplKCk7CisKKyAgICBpZiAoYmx1ckxheWVyc1NpemUgPT0gMCkgeworICAgICAgICBmYm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEJpbmROYXRpdmVCdWZmZXJBc0ZyYW1lYnVmZmVyPigqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpLT5nZXROYXRpdmVCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRnJhbWVidWZmZXJDYWNoZSk7CisgICAgICAgIGlmIChmYm8tPmdldFN0YXR1cygpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGJpbmQgZnJhbWVidWZmZXIhIEFib3J0aW5nIEdQVSBjb21wb3NpdGlvbiBmb3IgYnVmZmVyICglcCkuIiwKKyAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+aGFuZGxlKTsKKyAgICAgICAgICAgIGNoZWNrRXJyb3JzKCk7CisgICAgICAgICAgICByZXR1cm4gZmJvLT5nZXRTdGF0dXMoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRWaWV3cG9ydEFuZFByb2plY3Rpb24oZGlzcGxheS5waHlzaWNhbERpc3BsYXksIGRpc3BsYXkuY2xpcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0Vmlld3BvcnRBbmRQcm9qZWN0aW9uKGRpc3BsYXkucGh5c2ljYWxEaXNwbGF5LCBkaXNwbGF5LmNsaXApOworICAgICAgICBhdXRvIHN0YXR1cyA9CisgICAgICAgICAgICAgICAgbUJsdXJGaWx0ZXItPnNldEFzRHJhd1RhcmdldChkaXNwbGF5LCBibHVyTGF5ZXJzLmZyb250KCktPmJhY2tncm91bmRCbHVyUmFkaXVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwcmVwYXJlIGJsdXIgZmlsdGVyISBBYm9ydGluZyBHUFUgY29tcG9zaXRpb24gZm9yIGJ1ZmZlciAoJXApLiIsCisgICAgICAgICAgICAgICAgICBidWZmZXItPmhhbmRsZSk7CisgICAgICAgICAgICBjaGVja0Vycm9ycygpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNsZWFyIHRoZSBlbnRpcmUgYnVmZmVyLCBzb21ldGltZXMgd2hlbiB3ZSByZXVzZSBidWZmZXJzIHdlJ2QgcGVyc2lzdAorICAgIC8vIGdob3N0IGltYWdlcyBvdGhlcndpc2UuCisgICAgLy8gd2UgYWxzbyByZXF1aXJlIGEgZnVsbCB0cmFuc3BhcmVudCBmcmFtZWJ1ZmZlciBmb3Igb3ZlcmxheXMuIFRoaXMgaXMKKyAgICAvLyBwcm9iYWJseSBub3QgcXVpdGUgZWZmaWNpZW50IG9uIGFsbCBHUFVzLCBzaW5jZSB3ZSBjb3VsZCBmaWx0ZXIgb3V0CisgICAgLy8gb3BhcXVlIGxheWVycy4KKyAgICBjbGVhcldpdGhDb2xvcigwLjAsIDAuMCwgMC4wLCAwLjApOworCisgICAgc2V0T3V0cHV0RGF0YVNwYWNlKGRpc3BsYXkub3V0cHV0RGF0YXNwYWNlKTsKKyAgICBzZXREaXNwbGF5TWF4THVtaW5hbmNlKGRpc3BsYXkubWF4THVtaW5hbmNlKTsKKworICAgIGNvbnN0IG1hdDQgcHJvamVjdGlvbk1hdHJpeCA9CisgICAgICAgICAgICB1aTo6VHJhbnNmb3JtKGRpc3BsYXkub3JpZW50YXRpb24pLmFzTWF0cml4NCgpICogbVN0YXRlLnByb2plY3Rpb25NYXRyaXg7CisgICAgaWYgKCFkaXNwbGF5LmNsZWFyUmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICBmaWxsUmVnaW9uV2l0aENvbG9yKGRpc3BsYXkuY2xlYXJSZWdpb24sIDAuMCwgMC4wLCAwLjAsIDEuMCk7CisgICAgfQorCisgICAgTWVzaCBtZXNoID0gTWVzaDo6QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJpbWl0aXZlKE1lc2g6OlRSSUFOR0xFX0ZBTikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWZXJ0aWNlcyg0IC8qIGNvdW50ICovLCAyIC8qIHNpemUgKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGV4Q29vcmRzKDIgLyogc2l6ZSAqLykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDcm9wQ29vcmRzKDIgLyogc2l6ZSAqLykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIGZvciAoYXV0byBjb25zdCBsYXllciA6IGxheWVycykgeworICAgICAgICBpZiAoYmx1ckxheWVycy5zaXplKCkgPiAwICYmIGJsdXJMYXllcnMuZnJvbnQoKSA9PSBsYXllcikgeworICAgICAgICAgICAgYmx1ckxheWVycy5wb3BfZnJvbnQoKTsKKworICAgICAgICAgICAgYXV0byBzdGF0dXMgPSBtQmx1ckZpbHRlci0+cHJlcGFyZSgpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVuZGVyIGJsdXIgZWZmZWN0ISBBYm9ydGluZyBHUFUgY29tcG9zaXRpb24gZm9yIGJ1ZmZlciAoJXApLiIsCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5oYW5kbGUpOworICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCJDYW4ndCByZW5kZXIgZmlyc3QgYmx1ciBwYXNzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJsdXJMYXllcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBEb25lIGJsdXJyaW5nLCB0aW1lIHRvIGJpbmQgdGhlIG5hdGl2ZSBGQk8gYW5kIHJlbmRlciBvdXIgYmx1ciBvbnRvIGl0LgorICAgICAgICAgICAgICAgIGZibyA9IHN0ZDo6bWFrZV91bmlxdWU8QmluZE5hdGl2ZUJ1ZmZlckFzRnJhbWVidWZmZXI+KCp0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXROYXRpdmVCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VGcmFtZWJ1ZmZlckNhY2hlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYm8tPmdldFN0YXR1cygpOworICAgICAgICAgICAgICAgIHNldFZpZXdwb3J0QW5kUHJvamVjdGlvbihkaXNwbGF5LnBoeXNpY2FsRGlzcGxheSwgZGlzcGxheS5jbGlwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBzdGlsbCBzb21ldGhpbmcgZWxzZSB0byBibHVyLCBzbyBsZXQncyBrZWVwIHJlbmRlcmluZyB0byBvdXIgRkJPCisgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiB0byB0aGUgZGlzcGxheS4KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBtQmx1ckZpbHRlci0+c2V0QXNEcmF3VGFyZ2V0KGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVyTGF5ZXJzLmZyb250KCktPmJhY2tncm91bmRCbHVyUmFkaXVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGJpbmQgZnJhbWVidWZmZXIhIEFib3J0aW5nIEdQVSBjb21wb3NpdGlvbiBmb3IgYnVmZmVyICglcCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPmhhbmRsZSk7CisgICAgICAgICAgICAgICAgY2hlY2tFcnJvcnMoIkNhbid0IGJpbmQgbmF0aXZlIGZyYW1lYnVmZmVyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gbUJsdXJGaWx0ZXItPnJlbmRlcihibHVyTGF5ZXJzU2l6ZSA+IDEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVuZGVyIGJsdXIgZWZmZWN0ISBBYm9ydGluZyBHUFUgY29tcG9zaXRpb24gZm9yIGJ1ZmZlciAoJXApLiIsCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5oYW5kbGUpOworICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCJDYW4ndCByZW5kZXIgYmx1ciBmaWx0ZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVN0YXRlLm1heE1hc3RlcmluZ0x1bWluYW5jZSA9IGxheWVyLT5zb3VyY2UuYnVmZmVyLm1heE1hc3RlcmluZ0x1bWluYW5jZTsKKyAgICAgICAgbVN0YXRlLm1heENvbnRlbnRMdW1pbmFuY2UgPSBsYXllci0+c291cmNlLmJ1ZmZlci5tYXhDb250ZW50THVtaW5hbmNlOworICAgICAgICBtU3RhdGUucHJvamVjdGlvbk1hdHJpeCA9IHByb2plY3Rpb25NYXRyaXggKiBsYXllci0+Z2VvbWV0cnkucG9zaXRpb25UcmFuc2Zvcm07CisKKyAgICAgICAgY29uc3QgRmxvYXRSZWN0IGJvdW5kcyA9IGxheWVyLT5nZW9tZXRyeS5ib3VuZGFyaWVzOworICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiBwb3NpdGlvbihtZXNoLmdldFBvc2l0aW9uQXJyYXk8dmVjMj4oKSk7CisgICAgICAgIHBvc2l0aW9uWzBdID0gdmVjMihib3VuZHMubGVmdCwgYm91bmRzLnRvcCk7CisgICAgICAgIHBvc2l0aW9uWzFdID0gdmVjMihib3VuZHMubGVmdCwgYm91bmRzLmJvdHRvbSk7CisgICAgICAgIHBvc2l0aW9uWzJdID0gdmVjMihib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20pOworICAgICAgICBwb3NpdGlvblszXSA9IHZlYzIoYm91bmRzLnJpZ2h0LCBib3VuZHMudG9wKTsKKworICAgICAgICBzZXR1cExheWVyQ3JvcHBpbmcoKmxheWVyLCBtZXNoKTsKKyAgICAgICAgc2V0Q29sb3JUcmFuc2Zvcm0oZGlzcGxheS5jb2xvclRyYW5zZm9ybSAqIGxheWVyLT5jb2xvclRyYW5zZm9ybSk7CisKKyAgICAgICAgYm9vbCB1c2VQcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlOworICAgICAgICBib29sIGRpc2FibGVUZXh0dXJlID0gdHJ1ZTsKKyAgICAgICAgYm9vbCBpc09wYXF1ZSA9IGZhbHNlOworICAgICAgICBpZiAobGF5ZXItPnNvdXJjZS5idWZmZXIuYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRpc2FibGVUZXh0dXJlID0gZmFsc2U7CisgICAgICAgICAgICBpc09wYXF1ZSA9IGxheWVyLT5zb3VyY2UuYnVmZmVyLmlzT3BhcXVlOworCisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnQnVmID0gbGF5ZXItPnNvdXJjZS5idWZmZXIuYnVmZmVyOworICAgICAgICAgICAgYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcihsYXllci0+c291cmNlLmJ1ZmZlci50ZXh0dXJlTmFtZSwgZ0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPnNvdXJjZS5idWZmZXIuZmVuY2UpOworCisgICAgICAgICAgICB1c2VQcmVtdWx0aXBsaWVkQWxwaGEgPSBsYXllci0+c291cmNlLmJ1ZmZlci51c2VQcmVtdWx0aXBsaWVkQWxwaGE7CisgICAgICAgICAgICBUZXh0dXJlIHRleHR1cmUoVGV4dHVyZTo6VEVYVFVSRV9FWFRFUk5BTCwgbGF5ZXItPnNvdXJjZS5idWZmZXIudGV4dHVyZU5hbWUpOworICAgICAgICAgICAgbWF0NCB0ZXhNYXRyaXggPSBsYXllci0+c291cmNlLmJ1ZmZlci50ZXh0dXJlVHJhbnNmb3JtOworCisgICAgICAgICAgICB0ZXh0dXJlLnNldE1hdHJpeCh0ZXhNYXRyaXguYXNBcnJheSgpKTsKKyAgICAgICAgICAgIHRleHR1cmUuc2V0RmlsdGVyaW5nKGxheWVyLT5zb3VyY2UuYnVmZmVyLnVzZVRleHR1cmVGaWx0ZXJpbmcpOworCisgICAgICAgICAgICB0ZXh0dXJlLnNldERpbWVuc2lvbnMoZ0J1Zi0+Z2V0V2lkdGgoKSwgZ0J1Zi0+Z2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgc2V0U291cmNlWTQxMEJUMjAyMChsYXllci0+c291cmNlLmJ1ZmZlci5pc1k0MTBCVDIwMjApOworCisgICAgICAgICAgICByZW5kZXJlbmdpbmU6Ok1lc2g6OlZlcnRleEFycmF5PHZlYzI+IHRleENvb3JkcyhtZXNoLmdldFRleENvb3JkQXJyYXk8dmVjMj4oKSk7CisgICAgICAgICAgICB0ZXhDb29yZHNbMF0gPSB2ZWMyKDAuMCwgMC4wKTsKKyAgICAgICAgICAgIHRleENvb3Jkc1sxXSA9IHZlYzIoMC4wLCAxLjApOworICAgICAgICAgICAgdGV4Q29vcmRzWzJdID0gdmVjMigxLjAsIDEuMCk7CisgICAgICAgICAgICB0ZXhDb29yZHNbM10gPSB2ZWMyKDEuMCwgMC4wKTsKKyAgICAgICAgICAgIHNldHVwTGF5ZXJUZXh0dXJpbmcodGV4dHVyZSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBoYWxmMyBzb2xpZENvbG9yID0gbGF5ZXItPnNvdXJjZS5zb2xpZENvbG9yOworICAgICAgICBjb25zdCBoYWxmNCBjb2xvciA9IGhhbGY0KHNvbGlkQ29sb3Iuciwgc29saWRDb2xvci5nLCBzb2xpZENvbG9yLmIsIGxheWVyLT5hbHBoYSk7CisgICAgICAgIC8vIEJ1ZmZlciBzb3VyY2VzIHdpbGwgaGF2ZSBhIGJsYWNrIHNvbGlkIGNvbG9yIGlnbm9yZWQgaW4gdGhlIHNoYWRlciwKKyAgICAgICAgLy8gc28gaW4gdGhhdCBzY2VuYXJpbyB0aGUgc29saWQgY29sb3IgcGFzc2VkIGhlcmUgaXMgYXJiaXRyYXJ5LgorICAgICAgICBzZXR1cExheWVyQmxlbmRpbmcodXNlUHJlbXVsdGlwbGllZEFscGhhLCBpc09wYXF1ZSwgZGlzYWJsZVRleHR1cmUsIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzUmFkaXVzKTsKKyAgICAgICAgaWYgKGxheWVyLT5kaXNhYmxlQmxlbmRpbmcpIHsKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0U291cmNlRGF0YVNwYWNlKGxheWVyLT5zb3VyY2VEYXRhc3BhY2UpOworCisgICAgICAgIGlmIChsYXllci0+c2hhZG93Lmxlbmd0aCA+IDAuMGYpIHsKKyAgICAgICAgICAgIGhhbmRsZVNoYWRvdyhsYXllci0+Z2VvbWV0cnkuYm91bmRhcmllcywgbGF5ZXItPmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzUmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5zaGFkb3cpOworICAgICAgICB9CisgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byBkbyBhIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHJvdW5kZWQgY29ybmVycyB3aGVuIGhhdmluZyByb3VuZGVkIGNvcm5lcnMKKyAgICAgICAgLy8gaXMgdGhlIG9ubHkgcmVhc29uIGl0IG5lZWRzIHRvIHR1cm4gb24gYmxlbmRpbmcsIG90aGVyd2lzZSwgd2UgaGFuZGxlIGl0IGxpa2UgdGhlCisgICAgICAgIC8vIHVzdWFsIHdheSBzaW5jZSBpdCBuZWVkcyB0byB0dXJuIG9uIGJsZW5kaW5nIGFueXdheS4KKyAgICAgICAgZWxzZSBpZiAobGF5ZXItPmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzUmFkaXVzID4gMC4wICYmIGNvbG9yLmEgPj0gMS4wZiAmJiBpc09wYXF1ZSkgeworICAgICAgICAgICAgaGFuZGxlUm91bmRlZENvcm5lcnMoZGlzcGxheSwgKmxheWVyLCBtZXNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRyYXdNZXNoKG1lc2gpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xlYW51cCBpZiB0aGVyZSdzIGEgYnVmZmVyIHNvdXJjZQorICAgICAgICBpZiAobGF5ZXItPnNvdXJjZS5idWZmZXIuYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRpc2FibGVCbGVuZGluZygpOworICAgICAgICAgICAgc2V0U291cmNlWTQxMEJUMjAyMChmYWxzZSk7CisgICAgICAgICAgICBkaXNhYmxlVGV4dHVyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZHJhd0ZlbmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmRyYXdGZW5jZSA9IGZsdXNoKCk7CisgICAgfQorICAgIC8vIElmIGZsdXNoIGZhaWxlZCBvciB3ZSBkb24ndCBzdXBwb3J0IG5hdGl2ZSBmZW5jZXMsIHdlIG5lZWQgdG8gZm9yY2UgdGhlCisgICAgLy8gZ2wgY29tbWFuZCBzdHJlYW0gdG8gYmUgZXhlY3V0ZWQuCisgICAgaWYgKGRyYXdGZW5jZSA9PSBudWxscHRyIHx8IGRyYXdGZW5jZS0+Z2V0KCkgPCAwKSB7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZpbmlzaCgpOworICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggUmVuZGVyRW5naW5lIGNvbW1hbmRzIik7CisgICAgICAgICAgICBjaGVja0Vycm9ycygpOworICAgICAgICAgICAgLy8gQ2hhbmNlcyBhcmUsIHNvbWV0aGluZyBpbGxlZ2FsIGhhcHBlbmVkIChlaXRoZXIgdGhlIGNhbGxlciBwYXNzZWQKKyAgICAgICAgICAgIC8vIHVzIGJhZCBwYXJhbWV0ZXJzLCBvciB3ZSBtZXNzZWQgdXAgb3VyIHNoYWRlciBnZW5lcmF0aW9uKS4KKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBtTGFzdERyYXdGZW5jZSA9IG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGNhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgZHJhd0ZlbmNlLCBzbyB3ZSBuZWVkIHRvIGR1cGxpY2F0ZSB0aGUKKyAgICAgICAgLy8gZmQgaGVyZS4KKyAgICAgICAgbUxhc3REcmF3RmVuY2UgPSBuZXcgRmVuY2UoZHVwKGRyYXdGZW5jZS0+Z2V0KCkpKTsKKyAgICB9CisgICAgbVByaW9yUmVzb3VyY2VzQ2xlYW5lZCA9IGZhbHNlOworCisgICAgY2hlY2tFcnJvcnMoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6c2V0Vmlld3BvcnRBbmRQcm9qZWN0aW9uKFJlY3Qgdmlld3BvcnQsIFJlY3QgY2xpcCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgbVZwV2lkdGggPSB2aWV3cG9ydC5nZXRXaWR0aCgpOworICAgIG1WcEhlaWdodCA9IHZpZXdwb3J0LmdldEhlaWdodCgpOworCisgICAgLy8gV2UgcGFzcyB0aGUgdG9wIGxlZnQgY29ybmVyIGluc3RlYWQgb2YgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciwKKyAgICAvLyBiZWNhdXNlIHNpbmNlIHdlJ3JlIHJlbmRlcmluZyBvZmYtc2NyZWVuIGZpcnN0LgorICAgIGdsVmlld3BvcnQodmlld3BvcnQubGVmdCwgdmlld3BvcnQudG9wLCBtVnBXaWR0aCwgbVZwSGVpZ2h0KTsKKworICAgIG1TdGF0ZS5wcm9qZWN0aW9uTWF0cml4ID0gbWF0NDo6b3J0aG8oY2xpcC5sZWZ0LCBjbGlwLnJpZ2h0LCBjbGlwLnRvcCwgY2xpcC5ib3R0b20sIDAsIDEpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldHVwTGF5ZXJCbGVuZGluZyhib29sIHByZW11bHRpcGxpZWRBbHBoYSwgYm9vbCBvcGFxdWUsIGJvb2wgZGlzYWJsZVRleHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYWxmNCYgY29sb3IsIGZsb2F0IGNvcm5lclJhZGl1cykgeworICAgIG1TdGF0ZS5pc1ByZW11bHRpcGxpZWRBbHBoYSA9IHByZW11bHRpcGxpZWRBbHBoYTsKKyAgICBtU3RhdGUuaXNPcGFxdWUgPSBvcGFxdWU7CisgICAgbVN0YXRlLmNvbG9yID0gY29sb3I7CisgICAgbVN0YXRlLmNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1czsKKworICAgIGlmIChkaXNhYmxlVGV4dHVyZSkgeworICAgICAgICBtU3RhdGUudGV4dHVyZUVuYWJsZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoY29sb3IuYSA8IDEuMGYgfHwgIW9wYXF1ZSB8fCBjb3JuZXJSYWRpdXMgPiAwLjBmKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMocHJlbXVsdGlwbGllZEFscGhhID8gR0xfT05FIDogR0xfU1JDX0FMUEhBLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpzZXRTb3VyY2VZNDEwQlQyMDIwKGJvb2wgZW5hYmxlKSB7CisgICAgbVN0YXRlLmlzWTQxMEJUMjAyMCA9IGVuYWJsZTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpzZXRTb3VyY2VEYXRhU3BhY2UoRGF0YXNwYWNlIHNvdXJjZSkgeworICAgIG1EYXRhU3BhY2UgPSBzb3VyY2U7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6c2V0T3V0cHV0RGF0YVNwYWNlKERhdGFzcGFjZSBkYXRhc3BhY2UpIHsKKyAgICBtT3V0cHV0RGF0YVNwYWNlID0gZGF0YXNwYWNlOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldERpc3BsYXlNYXhMdW1pbmFuY2UoY29uc3QgZmxvYXQgbWF4THVtaW5hbmNlKSB7CisgICAgbVN0YXRlLmRpc3BsYXlNYXhMdW1pbmFuY2UgPSBtYXhMdW1pbmFuY2U7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6c2V0dXBMYXllclRleHR1cmluZyhjb25zdCBUZXh0dXJlJiB0ZXh0dXJlKSB7CisgICAgR0x1aW50IHRhcmdldCA9IHRleHR1cmUuZ2V0VGV4dHVyZVRhcmdldCgpOworICAgIGdsQmluZFRleHR1cmUodGFyZ2V0LCB0ZXh0dXJlLmdldFRleHR1cmVOYW1lKCkpOworICAgIEdMZW51bSBmaWx0ZXIgPSBHTF9ORUFSRVNUOworICAgIGlmICh0ZXh0dXJlLmdldEZpbHRlcmluZygpKSB7CisgICAgICAgIGZpbHRlciA9IEdMX0xJTkVBUjsKKyAgICB9CisgICAgZ2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBHTF9URVhUVVJFX01BR19GSUxURVIsIGZpbHRlcik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXIpOworCisgICAgbVN0YXRlLnRleHR1cmUgPSB0ZXh0dXJlOworICAgIG1TdGF0ZS50ZXh0dXJlRW5hYmxlZCA9IHRydWU7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6c2V0Q29sb3JUcmFuc2Zvcm0oY29uc3QgbWF0NCYgY29sb3JUcmFuc2Zvcm0pIHsKKyAgICBtU3RhdGUuY29sb3JNYXRyaXggPSBjb2xvclRyYW5zZm9ybTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpkaXNhYmxlVGV4dHVyaW5nKCkgeworICAgIG1TdGF0ZS50ZXh0dXJlRW5hYmxlZCA9IGZhbHNlOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmRpc2FibGVCbGVuZGluZygpIHsKKyAgICBnbERpc2FibGUoR0xfQkxFTkQpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldHVwRmlsbFdpdGhDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7CisgICAgbVN0YXRlLmlzUHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTsKKyAgICBtU3RhdGUuaXNPcGFxdWUgPSBmYWxzZTsKKyAgICBtU3RhdGUuY29sb3IgPSBoYWxmNChyLCBnLCBiLCBhKTsKKyAgICBtU3RhdGUudGV4dHVyZUVuYWJsZWQgPSBmYWxzZTsKKyAgICBnbERpc2FibGUoR0xfQkxFTkQpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldHVwQ29ybmVyUmFkaXVzQ3JvcFNpemUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgeworICAgIG1TdGF0ZS5jcm9wU2l6ZSA9IGhhbGYyKHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmRyYXdNZXNoKGNvbnN0IE1lc2gmIG1lc2gpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtZXNoLmdldFRleENvb3Jkc1NpemUoKSkgeworICAgICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFByb2dyYW06OnRleENvb3Jkcyk7CisgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihQcm9ncmFtOjp0ZXhDb29yZHMsIG1lc2guZ2V0VGV4Q29vcmRzU2l6ZSgpLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmdldEJ5dGVTdHJpZGUoKSwgbWVzaC5nZXRUZXhDb29yZHMoKSk7CisgICAgfQorCisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKFByb2dyYW06OnBvc2l0aW9uLCBtZXNoLmdldFZlcnRleFNpemUoKSwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmdldEJ5dGVTdHJpZGUoKSwgbWVzaC5nZXRQb3NpdGlvbnMoKSk7CisKKyAgICBpZiAobVN0YXRlLmNvcm5lclJhZGl1cyA+IDAuMGYpIHsKKyAgICAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShQcm9ncmFtOjpjcm9wQ29vcmRzKTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKFByb2dyYW06OmNyb3BDb29yZHMsIG1lc2guZ2V0VmVydGV4U2l6ZSgpLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmdldEJ5dGVTdHJpZGUoKSwgbWVzaC5nZXRDcm9wQ29vcmRzKCkpOworICAgIH0KKworICAgIGlmIChtU3RhdGUuZHJhd1NoYWRvd3MpIHsKKyAgICAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShQcm9ncmFtOjpzaGFkb3dDb2xvcik7CisgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihQcm9ncmFtOjpzaGFkb3dDb2xvciwgbWVzaC5nZXRTaGFkb3dDb2xvclNpemUoKSwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5nZXRCeXRlU3RyaWRlKCksIG1lc2guZ2V0U2hhZG93Q29sb3IoKSk7CisKKyAgICAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShQcm9ncmFtOjpzaGFkb3dQYXJhbXMpOworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoUHJvZ3JhbTo6c2hhZG93UGFyYW1zLCBtZXNoLmdldFNoYWRvd1BhcmFtc1NpemUoKSwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5nZXRCeXRlU3RyaWRlKCksIG1lc2guZ2V0U2hhZG93UGFyYW1zKCkpOworICAgIH0KKworICAgIERlc2NyaXB0aW9uIG1hbmFnZWRTdGF0ZSA9IG1TdGF0ZTsKKyAgICAvLyBCeSBkZWZhdWx0LCBESVNQTEFZX1AzIGlzIHRoZSBvbmx5IHN1cHBvcnRlZCB3aWRlIGNvbG9yIG91dHB1dC4gSG93ZXZlciwKKyAgICAvLyB3aGVuIEhEUiBjb250ZW50IGlzIHByZXNlbnQsIGhhcmR3YXJlIGNvbXBvc2VyIG1heSBiZSBhYmxlIHRvIGhhbmRsZQorICAgIC8vIEJUMjAyMCBkYXRhIHNwYWNlLCBpbiB0aGF0IGNhc2UsIHRoZSBvdXRwdXQgZGF0YSBzcGFjZSBpcyBzZXQgdG8gYmUKKyAgICAvLyBCVDIwMjBfSExHIG9yIEJUMjAyMF9QUSByZXNwZWN0aXZlbHkuIEluIEdQVSBmYWxsIGJhY2sgd2UgbmVlZAorICAgIC8vIHRvIHJlc3BlY3QgdGhpcyBhbmQgY29udmVydCBub24tSERSIGNvbnRlbnQgdG8gSERSIGZvcm1hdC4KKyAgICBpZiAobVVzZUNvbG9yTWFuYWdlbWVudCkgeworICAgICAgICBEYXRhc3BhY2UgaW5wdXRTdGFuZGFyZCA9IHN0YXRpY19jYXN0PERhdGFzcGFjZT4obURhdGFTcGFjZSAmIERhdGFzcGFjZTo6U1RBTkRBUkRfTUFTSyk7CisgICAgICAgIERhdGFzcGFjZSBpbnB1dFRyYW5zZmVyID0gc3RhdGljX2Nhc3Q8RGF0YXNwYWNlPihtRGF0YVNwYWNlICYgRGF0YXNwYWNlOjpUUkFOU0ZFUl9NQVNLKTsKKyAgICAgICAgRGF0YXNwYWNlIG91dHB1dFN0YW5kYXJkID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KG1PdXRwdXREYXRhU3BhY2UgJiBEYXRhc3BhY2U6OlNUQU5EQVJEX01BU0spOworICAgICAgICBEYXRhc3BhY2Ugb3V0cHV0VHJhbnNmZXIgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PERhdGFzcGFjZT4obU91dHB1dERhdGFTcGFjZSAmIERhdGFzcGFjZTo6VFJBTlNGRVJfTUFTSyk7CisgICAgICAgIGJvb2wgbmVlZHNYWVpDb252ZXJzaW9uID0gbmVlZHNYWVpUcmFuc2Zvcm1NYXRyaXgoKTsKKworICAgICAgICAvLyBOT1RFOiBpZiB0aGUgaW5wdXQgc3RhbmRhcmQgb2YgdGhlIGlucHV0IGRhdGFzcGFjZSBpcyBub3QgU1RBTkRBUkRfRENJX1AzIG9yCisgICAgICAgIC8vIFNUQU5EQVJEX0JUMjAyMCwgaXQgd2lsbCBiZSAgdHJlYXRlZCBhcyBTVEFOREFSRF9CVDcwOQorICAgICAgICBpZiAoaW5wdXRTdGFuZGFyZCAhPSBEYXRhc3BhY2U6OlNUQU5EQVJEX0RDSV9QMyAmJgorICAgICAgICAgICAgaW5wdXRTdGFuZGFyZCAhPSBEYXRhc3BhY2U6OlNUQU5EQVJEX0JUMjAyMCkgeworICAgICAgICAgICAgaW5wdXRTdGFuZGFyZCA9IERhdGFzcGFjZTo6U1RBTkRBUkRfQlQ3MDk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZHNYWVpDb252ZXJzaW9uKSB7CisgICAgICAgICAgICAvLyBUaGUgc3VwcG9ydGVkIGlucHV0IGNvbG9yIHNwYWNlcyBhcmUgc3RhbmRhcmQgUkdCLCBEaXNwbGF5IFAzIGFuZCBCVDIwMjAuCisgICAgICAgICAgICBzd2l0Y2ggKGlucHV0U3RhbmRhcmQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFzcGFjZTo6U1RBTkRBUkRfRENJX1AzOgorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkU3RhdGUuaW5wdXRUcmFuc2Zvcm1NYXRyaXggPSBtRGlzcGxheVAzVG9YeXo7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YXNwYWNlOjpTVEFOREFSRF9CVDIwMjA6CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5pbnB1dFRyYW5zZm9ybU1hdHJpeCA9IG1CdDIwMjBUb1h5ejsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLmlucHV0VHJhbnNmb3JtTWF0cml4ID0gbVNyZ2JUb1h5ejsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBzdXBwb3J0ZWQgb3V0cHV0IGNvbG9yIHNwYWNlcyBhcmUgQlQyMDIwLCBEaXNwbGF5IFAzIGFuZCBzdGFuZGFyZCBSR0IuCisgICAgICAgICAgICBzd2l0Y2ggKG91dHB1dFN0YW5kYXJkKSB7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhc3BhY2U6OlNUQU5EQVJEX0JUMjAyMDoKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLm91dHB1dFRyYW5zZm9ybU1hdHJpeCA9IG1YeXpUb0J0MjAyMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhc3BhY2U6OlNUQU5EQVJEX0RDSV9QMzoKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLm91dHB1dFRyYW5zZm9ybU1hdHJpeCA9IG1YeXpUb0Rpc3BsYXlQMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLm91dHB1dFRyYW5zZm9ybU1hdHJpeCA9IG1YeXpUb1NyZ2I7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGlucHV0U3RhbmRhcmQgIT0gb3V0cHV0U3RhbmRhcmQpIHsKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBpbnB1dCBkYXRhIHNwYWNlIGFuZCBvdXRwdXQgZGF0YSBzcGFjZSBjb3VsZCBiZSBib3RoCisgICAgICAgICAgICAvLyBIRFIgZGF0YSBzcGFjZXMsIGJ1dCB0aGV5IG1hdGNoIGVhY2ggb3RoZXIsIHdlIGRvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGNhc2UgYWJvdmUsIHRoZSBpbnB1dCBkYXRhIHNwYWNlIGNvdWxkIGJlCisgICAgICAgICAgICAvLyAtIHNjUkdCIGxpbmVhcgorICAgICAgICAgICAgLy8gLSBzY1JHQiBub24tbGluZWFyCisgICAgICAgICAgICAvLyAtIHNSR0IKKyAgICAgICAgICAgIC8vIC0gRGlzcGxheSBQMworICAgICAgICAgICAgLy8gLSBCVDIwMjAKKyAgICAgICAgICAgIC8vIFRoZSBvdXRwdXQgZGF0YSBzcGFjZXMgY291bGQgYmUKKyAgICAgICAgICAgIC8vIC0gc1JHQgorICAgICAgICAgICAgLy8gLSBEaXNwbGF5IFAzCisgICAgICAgICAgICAvLyAtIEJUMjAyMAorICAgICAgICAgICAgc3dpdGNoIChvdXRwdXRTdGFuZGFyZCkgeworICAgICAgICAgICAgICAgIGNhc2UgRGF0YXNwYWNlOjpTVEFOREFSRF9CVDIwMjA6CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFN0YW5kYXJkID09IERhdGFzcGFjZTo6U1RBTkRBUkRfQlQ3MDkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtU3JnYlRvQnQyMDIwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0U3RhbmRhcmQgPT0gRGF0YXNwYWNlOjpTVEFOREFSRF9EQ0lfUDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtRGlzcGxheVAzVG9CdDIwMjA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhc3BhY2U6OlNUQU5EQVJEX0RDSV9QMzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RhbmRhcmQgPT0gRGF0YXNwYWNlOjpTVEFOREFSRF9CVDcwOSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLm91dHB1dFRyYW5zZm9ybU1hdHJpeCA9IG1TcmdiVG9EaXNwbGF5UDM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRTdGFuZGFyZCA9PSBEYXRhc3BhY2U6OlNUQU5EQVJEX0JUMjAyMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLm91dHB1dFRyYW5zZm9ybU1hdHJpeCA9IG1CdDIwMjBUb0Rpc3BsYXlQMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTdGFuZGFyZCA9PSBEYXRhc3BhY2U6OlNUQU5EQVJEX0RDSV9QMykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLm91dHB1dFRyYW5zZm9ybU1hdHJpeCA9IG1EaXNwbGF5UDNUb1NyZ2I7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRTdGFuZGFyZCA9PSBEYXRhc3BhY2U6OlNUQU5EQVJEX0JUMjAyMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLm91dHB1dFRyYW5zZm9ybU1hdHJpeCA9IG1CdDIwMjBUb1NyZ2I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIFJHQiB2YWx1ZSB0byBsaW5lYXIgc3BhY2UgYW5kIGNvbnZlcnQgaXQgYmFjayB3aGVuOgorICAgICAgICAvLyAtIHRoZXJlIGlzIGEgY29sb3IgbWF0cml4IHRoYXQgaXMgbm90IGFuIGlkZW50aXR5IG1hdHJpeCwgb3IKKyAgICAgICAgLy8gLSB0aGVyZSBpcyBhbiBvdXRwdXQgdHJhbnNmb3JtIG1hdHJpeCB0aGF0IGlzIG5vdCBhbiBpZGVudGl0eSBtYXRyaXgsIG9yCisgICAgICAgIC8vIC0gdGhlIGlucHV0IHRyYW5zZmVyIGZ1bmN0aW9uIGRvZXNuJ3QgbWF0Y2ggdGhlIG91dHB1dCB0cmFuc2ZlciBmdW5jdGlvbi4KKyAgICAgICAgaWYgKG1hbmFnZWRTdGF0ZS5oYXNDb2xvck1hdHJpeCgpIHx8IG1hbmFnZWRTdGF0ZS5oYXNPdXRwdXRUcmFuc2Zvcm1NYXRyaXgoKSB8fAorICAgICAgICAgICAgaW5wdXRUcmFuc2ZlciAhPSBvdXRwdXRUcmFuc2ZlcikgeworICAgICAgICAgICAgbWFuYWdlZFN0YXRlLmlucHV0VHJhbnNmZXJGdW5jdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOjpkYXRhU3BhY2VUb1RyYW5zZmVyRnVuY3Rpb24oaW5wdXRUcmFuc2Zlcik7CisgICAgICAgICAgICBtYW5hZ2VkU3RhdGUub3V0cHV0VHJhbnNmZXJGdW5jdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOjpkYXRhU3BhY2VUb1RyYW5zZmVyRnVuY3Rpb24ob3V0cHV0VHJhbnNmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgUHJvZ3JhbUNhY2hlOjpnZXRJbnN0YW5jZSgpLnVzZVByb2dyYW0obUluUHJvdGVjdGVkQ29udGV4dCA/IG1Qcm90ZWN0ZWRFR0xDb250ZXh0IDogbUVHTENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlKTsKKworICAgIGlmIChtU3RhdGUuZHJhd1NoYWRvd3MpIHsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMobWVzaC5nZXRQcmltaXRpdmUoKSwgbWVzaC5nZXRJbmRleENvdW50KCksIEdMX1VOU0lHTkVEX1NIT1JULAorICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmdldEluZGljZXMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKG1lc2guZ2V0UHJpbWl0aXZlKCksIDAsIG1lc2guZ2V0VmVydGV4Q291bnQoKSk7CisgICAgfQorCisgICAgaWYgKG1Vc2VDb2xvck1hbmFnZW1lbnQgJiYgb3V0cHV0RGVidWdQUE1zKSB7CisgICAgICAgIHN0YXRpYyB1aW50NjRfdCBtYW5hZ2VkQ29sb3JGcmFtZUNvdW50ID0gMDsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICAgICAgb3V0IDw8ICIvZGF0YS90ZXh0dXJlX291dCIgPDwgbWFuYWdlZENvbG9yRnJhbWVDb3VudCsrOworICAgICAgICB3cml0ZVBQTShvdXQuc3RyKCkuY19zdHIoKSwgbVZwV2lkdGgsIG1WcEhlaWdodCk7CisgICAgfQorCisgICAgaWYgKG1lc2guZ2V0VGV4Q29vcmRzU2l6ZSgpKSB7CisgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFByb2dyYW06OnRleENvb3Jkcyk7CisgICAgfQorCisgICAgaWYgKG1TdGF0ZS5jb3JuZXJSYWRpdXMgPiAwLjBmKSB7CisgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFByb2dyYW06OmNyb3BDb29yZHMpOworICAgIH0KKworICAgIGlmIChtU3RhdGUuZHJhd1NoYWRvd3MpIHsKKyAgICAgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoUHJvZ3JhbTo6c2hhZG93Q29sb3IpOworICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShQcm9ncmFtOjpzaGFkb3dQYXJhbXMpOworICAgIH0KK30KKworc2l6ZV90IEdMRVNSZW5kZXJFbmdpbmU6OmdldE1heFRleHR1cmVTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtTWF4VGV4dHVyZVNpemU7Cit9CisKK3NpemVfdCBHTEVTUmVuZGVyRW5naW5lOjpnZXRNYXhWaWV3cG9ydERpbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1NYXhWaWV3cG9ydERpbXNbMF0gPCBtTWF4Vmlld3BvcnREaW1zWzFdID8gbU1heFZpZXdwb3J0RGltc1swXSA6IG1NYXhWaWV3cG9ydERpbXNbMV07Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6ZHVtcChzdGQ6OnN0cmluZyYgcmVzdWx0KSB7CisgICAgY29uc3QgR0xFeHRlbnNpb25zJiBleHRlbnNpb25zID0gR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpOworICAgIFByb2dyYW1DYWNoZSYgY2FjaGUgPSBQcm9ncmFtQ2FjaGU6OmdldEluc3RhbmNlKCk7CisKKyAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICJFR0wgaW1wbGVtZW50YXRpb24gOiAlc1xuIiwgZXh0ZW5zaW9ucy5nZXRFR0xWZXJzaW9uKCkpOworICAgIFN0cmluZ0FwcGVuZEYoJnJlc3VsdCwgIiVzXG4iLCBleHRlbnNpb25zLmdldEVHTEV4dGVuc2lvbnMoKSk7CisgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiR0xFUzogJXMsICVzLCAlc1xuIiwgZXh0ZW5zaW9ucy5nZXRWZW5kb3IoKSwgZXh0ZW5zaW9ucy5nZXRSZW5kZXJlcigpLAorICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5nZXRWZXJzaW9uKCkpOworICAgIFN0cmluZ0FwcGVuZEYoJnJlc3VsdCwgIiVzXG4iLCBleHRlbnNpb25zLmdldEV4dGVuc2lvbnMoKSk7CisgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiUmVuZGVyRW5naW5lIHN1cHBvcnRzIHByb3RlY3RlZCBjb250ZXh0OiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHN1cHBvcnRzUHJvdGVjdGVkQ29udGVudCgpKTsKKyAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICJSZW5kZXJFbmdpbmUgaXMgaW4gcHJvdGVjdGVkIGNvbnRleHQ6ICVkXG4iLCBtSW5Qcm90ZWN0ZWRDb250ZXh0KTsKKyAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICJSZW5kZXJFbmdpbmUgcHJvZ3JhbSBjYWNoZSBzaXplIGZvciB1bnByb3RlY3RlZCBjb250ZXh0OiAlenVcbiIsCisgICAgICAgICAgICAgICAgICBjYWNoZS5nZXRTaXplKG1FR0xDb250ZXh0KSk7CisgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiUmVuZGVyRW5naW5lIHByb2dyYW0gY2FjaGUgc2l6ZSBmb3IgcHJvdGVjdGVkIGNvbnRleHQ6ICV6dVxuIiwKKyAgICAgICAgICAgICAgICAgIGNhY2hlLmdldFNpemUobVByb3RlY3RlZEVHTENvbnRleHQpKTsKKyAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICJSZW5kZXJFbmdpbmUgbGFzdCBkYXRhc3BhY2UgY29udmVyc2lvbjogKCVzKSB0byAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgZGF0YXNwYWNlRGV0YWlscyhzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4obURhdGFTcGFjZSkpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICBkYXRhc3BhY2VEZXRhaWxzKHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihtT3V0cHV0RGF0YVNwYWNlKSkuY19zdHIoKSk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVuZGVyaW5nTXV0ZXgpOworICAgICAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICJSZW5kZXJFbmdpbmUgaW1hZ2UgY2FjaGUgc2l6ZTogJXp1XG4iLCBtSW1hZ2VDYWNoZS5zaXplKCkpOworICAgICAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICJEdW1waW5nIGJ1ZmZlciBpZHMuLi5cbiIpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIFtpZCwgdW51c2VkXSA6IG1JbWFnZUNhY2hlKSB7CisgICAgICAgICAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICIweCUiIFBSSXg2NCAiXG4iLCBpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXgpOworICAgICAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICJSZW5kZXJFbmdpbmUgZnJhbWVidWZmZXIgaW1hZ2UgY2FjaGUgc2l6ZTogJXp1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuc2l6ZSgpKTsKKyAgICAgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiRHVtcGluZyBidWZmZXIgaWRzLi4uXG4iKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBbaWQsIHVudXNlZF0gOiBtRnJhbWVidWZmZXJJbWFnZUNhY2hlKSB7CisgICAgICAgICAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICIweCUiIFBSSXg2NCAiXG4iLCBpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMRVNSZW5kZXJFbmdpbmU6OkdsZXNWZXJzaW9uIEdMRVNSZW5kZXJFbmdpbmU6OnBhcnNlR2xlc1ZlcnNpb24oY29uc3QgY2hhciogc3RyKSB7CisgICAgaW50IG1ham9yLCBtaW5vcjsKKyAgICBpZiAoc3NjYW5mKHN0ciwgIk9wZW5HTCBFUy1DTSAlZC4lZCIsICZtYWpvciwgJm1pbm9yKSAhPSAyKSB7CisgICAgICAgIGlmIChzc2NhbmYoc3RyLCAiT3BlbkdMIEVTICVkLiVkIiwgJm1ham9yLCAmbWlub3IpICE9IDIpIHsKKyAgICAgICAgICAgIEFMT0dXKCJVbmFibGUgdG8gcGFyc2UgR0xfVkVSU0lPTiBzdHJpbmc6IFwiJXNcIiIsIHN0cik7CisgICAgICAgICAgICByZXR1cm4gR0xFU19WRVJTSU9OXzFfMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtYWpvciA9PSAxICYmIG1pbm9yID09IDApIHJldHVybiBHTEVTX1ZFUlNJT05fMV8wOworICAgIGlmIChtYWpvciA9PSAxICYmIG1pbm9yID49IDEpIHJldHVybiBHTEVTX1ZFUlNJT05fMV8xOworICAgIGlmIChtYWpvciA9PSAyICYmIG1pbm9yID49IDApIHJldHVybiBHTEVTX1ZFUlNJT05fMl8wOworICAgIGlmIChtYWpvciA9PSAzICYmIG1pbm9yID49IDApIHJldHVybiBHTEVTX1ZFUlNJT05fM18wOworCisgICAgQUxPR1coIlVucmVjb2duaXplZCBPcGVuR0wgRVMgdmVyc2lvbjogJWQuJWQiLCBtYWpvciwgbWlub3IpOworICAgIHJldHVybiBHTEVTX1ZFUlNJT05fMV8wOworfQorCitFR0xDb250ZXh0IEdMRVNSZW5kZXJFbmdpbmU6OmNyZWF0ZUVnbENvbnRleHQoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbnRleHQgc2hhcmVDb250ZXh0LCBib29sIHVzZUNvbnRleHRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90ZWN0aW9uIHByb3RlY3Rpb24pIHsKKyAgICBFR0xpbnQgcmVuZGVyYWJsZVR5cGUgPSAwOworICAgIGlmIChjb25maWcgPT0gRUdMX05PX0NPTkZJRykgeworICAgICAgICByZW5kZXJhYmxlVHlwZSA9IEVHTF9PUEVOR0xfRVMzX0JJVDsKKyAgICB9IGVsc2UgaWYgKCFlZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBFR0xfUkVOREVSQUJMRV9UWVBFLCAmcmVuZGVyYWJsZVR5cGUpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImNhbid0IHF1ZXJ5IEVHTENvbmZpZyBSRU5ERVJBQkxFX1RZUEUiKTsKKyAgICB9CisgICAgRUdMaW50IGNvbnRleHRDbGllbnRWZXJzaW9uID0gMDsKKyAgICBpZiAocmVuZGVyYWJsZVR5cGUgJiBFR0xfT1BFTkdMX0VTM19CSVQpIHsKKyAgICAgICAgY29udGV4dENsaWVudFZlcnNpb24gPSAzOworICAgIH0gZWxzZSBpZiAocmVuZGVyYWJsZVR5cGUgJiBFR0xfT1BFTkdMX0VTMl9CSVQpIHsKKyAgICAgICAgY29udGV4dENsaWVudFZlcnNpb24gPSAyOworICAgIH0gZWxzZSBpZiAocmVuZGVyYWJsZVR5cGUgJiBFR0xfT1BFTkdMX0VTX0JJVCkgeworICAgICAgICBjb250ZXh0Q2xpZW50VmVyc2lvbiA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgibm8gc3VwcG9ydGVkIEVHTF9SRU5ERVJBQkxFX1RZUEVzIik7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8RUdMaW50PiBjb250ZXh0QXR0cmlidXRlczsKKyAgICBjb250ZXh0QXR0cmlidXRlcy5yZXNlcnZlKDcpOworICAgIGNvbnRleHRBdHRyaWJ1dGVzLnB1c2hfYmFjayhFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTik7CisgICAgY29udGV4dEF0dHJpYnV0ZXMucHVzaF9iYWNrKGNvbnRleHRDbGllbnRWZXJzaW9uKTsKKyAgICBpZiAodXNlQ29udGV4dFByaW9yaXR5KSB7CisgICAgICAgIGNvbnRleHRBdHRyaWJ1dGVzLnB1c2hfYmFjayhFR0xfQ09OVEVYVF9QUklPUklUWV9MRVZFTF9JTUcpOworICAgICAgICBjb250ZXh0QXR0cmlidXRlcy5wdXNoX2JhY2soRUdMX0NPTlRFWFRfUFJJT1JJVFlfSElHSF9JTUcpOworICAgIH0KKyAgICBpZiAocHJvdGVjdGlvbiA9PSBQcm90ZWN0aW9uOjpQUk9URUNURUQpIHsKKyAgICAgICAgY29udGV4dEF0dHJpYnV0ZXMucHVzaF9iYWNrKEVHTF9QUk9URUNURURfQ09OVEVOVF9FWFQpOworICAgICAgICBjb250ZXh0QXR0cmlidXRlcy5wdXNoX2JhY2soRUdMX1RSVUUpOworICAgIH0KKyAgICBjb250ZXh0QXR0cmlidXRlcy5wdXNoX2JhY2soRUdMX05PTkUpOworCisgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBjb25maWcsIHNoYXJlQ29udGV4dCwgY29udGV4dEF0dHJpYnV0ZXMuZGF0YSgpKTsKKworICAgIGlmIChjb250ZXh0Q2xpZW50VmVyc2lvbiA9PSAzICYmIGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgLy8gZWdsR2V0Q29uZmlnQXR0cmliIGluZGljYXRlZCB3ZSBjYW4gY3JlYXRlIEdMRVMgMyBjb250ZXh0LCBidXQgd2UgZmFpbGVkLCB0aHVzCisgICAgICAgIC8vIEVHTF9OT19DT05URVhUIHNvIHRoYXQgd2UgY2FuIGFib3J0LgorICAgICAgICBpZiAoY29uZmlnICE9IEVHTF9OT19DT05GSUcpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworICAgICAgICB9CisgICAgICAgIC8vIElmIHxjb25maWd8IGlzIEVHTF9OT19DT05GSUcsIHdlIHNwZWN1bGF0aXZlbHkgdHJ5IHRvIGNyZWF0ZSBHTEVTIDMgY29udGV4dCwgc28gd2Ugc2hvdWxkCisgICAgICAgIC8vIHRyeSB0byBmYWxsIGJhY2sgdG8gR0xFUyAyLgorICAgICAgICBjb250ZXh0QXR0cmlidXRlc1sxXSA9IDI7CisgICAgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXksIGNvbmZpZywgc2hhcmVDb250ZXh0LCBjb250ZXh0QXR0cmlidXRlcy5kYXRhKCkpOworICAgIH0KKworICAgIHJldHVybiBjb250ZXh0OworfQorCitFR0xTdXJmYWNlIEdMRVNSZW5kZXJFbmdpbmU6OmNyZWF0ZVN0dWJFZ2xQYnVmZmVyU3VyZmFjZShFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHdjRm9ybWF0LCBQcm90ZWN0aW9uIHByb3RlY3Rpb24pIHsKKyAgICBFR0xDb25maWcgc3R1YkNvbmZpZyA9IGNvbmZpZzsKKyAgICBpZiAoc3R1YkNvbmZpZyA9PSBFR0xfTk9fQ09ORklHKSB7CisgICAgICAgIHN0dWJDb25maWcgPSBjaG9vc2VFZ2xDb25maWcoZGlzcGxheSwgaHdjRm9ybWF0LCAvKmxvZ0NvbmZpZyovIHRydWUpOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxFR0xpbnQ+IGF0dHJpYnV0ZXM7CisgICAgYXR0cmlidXRlcy5yZXNlcnZlKDcpOworICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKEVHTF9XSURUSCk7CisgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soMSk7CisgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soRUdMX0hFSUdIVCk7CisgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soMSk7CisgICAgaWYgKHByb3RlY3Rpb24gPT0gUHJvdGVjdGlvbjo6UFJPVEVDVEVEKSB7CisgICAgICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKEVHTF9QUk9URUNURURfQ09OVEVOVF9FWFQpOworICAgICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhFR0xfVFJVRSk7CisgICAgfQorICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKEVHTF9OT05FKTsKKworICAgIHJldHVybiBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShkaXNwbGF5LCBzdHViQ29uZmlnLCBhdHRyaWJ1dGVzLmRhdGEoKSk7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6aXNIZHJEYXRhU3BhY2UoY29uc3QgRGF0YXNwYWNlIGRhdGFTcGFjZSkgY29uc3QgeworICAgIGNvbnN0IERhdGFzcGFjZSBzdGFuZGFyZCA9IHN0YXRpY19jYXN0PERhdGFzcGFjZT4oZGF0YVNwYWNlICYgRGF0YXNwYWNlOjpTVEFOREFSRF9NQVNLKTsKKyAgICBjb25zdCBEYXRhc3BhY2UgdHJhbnNmZXIgPSBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KGRhdGFTcGFjZSAmIERhdGFzcGFjZTo6VFJBTlNGRVJfTUFTSyk7CisgICAgcmV0dXJuIHN0YW5kYXJkID09IERhdGFzcGFjZTo6U1RBTkRBUkRfQlQyMDIwICYmCisgICAgICAgICAgICAodHJhbnNmZXIgPT0gRGF0YXNwYWNlOjpUUkFOU0ZFUl9TVDIwODQgfHwgdHJhbnNmZXIgPT0gRGF0YXNwYWNlOjpUUkFOU0ZFUl9ITEcpOworfQorCisvLyBGb3IgY29udmVuaWVuY2UsIHdlIHdhbnQgdG8gY29udmVydCB0aGUgaW5wdXQgY29sb3Igc3BhY2UgdG8gWFlaIGNvbG9yIHNwYWNlIGZpcnN0LAorLy8gYW5kIHRoZW4gY29udmVydCBmcm9tIFhZWiBjb2xvciBzcGFjZSB0byBvdXRwdXQgY29sb3Igc3BhY2Ugd2hlbgorLy8gLSBTRFIgYW5kIEhEUiBjb250ZW50cyBhcmUgbWl4ZWQsIGVpdGhlciBTRFIgY29udGVudCB3aWxsIGJlIGNvbnZlcnRlZCB0byBIRFIgb3IKKy8vICAgSERSIGNvbnRlbnQgd2lsbCBiZSB0b25lLW1hcHBlZCB0byBTRFI7IE9yLAorLy8gLSB0aGVyZSBhcmUgSERSIFBRIGFuZCBITEcgY29udGVudHMgcHJlc2VudGVkIGF0IHRoZSBzYW1lIHRpbWUsIHdoZXJlIHdlIHdhbnQgdG8gY29udmVydAorLy8gICBITEcgY29udGVudCB0byBQUSBjb250ZW50LgorLy8gSW4gZWl0aGVyIGNhc2UgYWJvdmUsIHdlIG5lZWQgdG8gb3BlcmF0ZSB0aGUgWSB2YWx1ZSBpbiBYWVogY29sb3Igc3BhY2UuIFRodXMsIHdoZW4gZWl0aGVyCisvLyBpbnB1dCBkYXRhIHNwYWNlIG9yIG91dHB1dCBkYXRhIHNwYWNlIGlzIEhEUiBkYXRhIHNwYWNlLCBhbmQgdGhlIGlucHV0IHRyYW5zZmVyIGZ1bmN0aW9uCisvLyBkb2Vzbid0IG1hdGNoIHRoZSBvdXRwdXQgdHJhbnNmZXIgZnVuY3Rpb24sIHdlIHdvdWxkIGVuYWJsZSBhbiBpbnRlcm1lZGlhdGUgdHJhbnNmcm9tIHRvCisvLyBYWVogY29sb3Igc3BhY2UuCitib29sIEdMRVNSZW5kZXJFbmdpbmU6Om5lZWRzWFlaVHJhbnNmb3JtTWF0cml4KCkgY29uc3QgeworICAgIGNvbnN0IGJvb2wgaXNJbnB1dEhkckRhdGFTcGFjZSA9IGlzSGRyRGF0YVNwYWNlKG1EYXRhU3BhY2UpOworICAgIGNvbnN0IGJvb2wgaXNPdXRwdXRIZHJEYXRhU3BhY2UgPSBpc0hkckRhdGFTcGFjZShtT3V0cHV0RGF0YVNwYWNlKTsKKyAgICBjb25zdCBEYXRhc3BhY2UgaW5wdXRUcmFuc2ZlciA9IHN0YXRpY19jYXN0PERhdGFzcGFjZT4obURhdGFTcGFjZSAmIERhdGFzcGFjZTo6VFJBTlNGRVJfTUFTSyk7CisgICAgY29uc3QgRGF0YXNwYWNlIG91dHB1dFRyYW5zZmVyID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PERhdGFzcGFjZT4obU91dHB1dERhdGFTcGFjZSAmIERhdGFzcGFjZTo6VFJBTlNGRVJfTUFTSyk7CisKKyAgICByZXR1cm4gKGlzSW5wdXRIZHJEYXRhU3BhY2UgfHwgaXNPdXRwdXRIZHJEYXRhU3BhY2UpICYmIGlucHV0VHJhbnNmZXIgIT0gb3V0cHV0VHJhbnNmZXI7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6aXNJbWFnZUNhY2hlZEZvclRlc3RpbmcodWludDY0X3QgYnVmZmVySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVuZGVyaW5nTXV0ZXgpOworICAgIGNvbnN0IGF1dG8mIGNhY2hlZEltYWdlID0gbUltYWdlQ2FjaGUuZmluZChidWZmZXJJZCk7CisgICAgcmV0dXJuIGNhY2hlZEltYWdlICE9IG1JbWFnZUNhY2hlLmVuZCgpOworfQorCitib29sIEdMRVNSZW5kZXJFbmdpbmU6OmlzVGV4dHVyZU5hbWVLbm93bkZvclRlc3RpbmcodWludDMyX3QgdGV4TmFtZSkgeworICAgIGNvbnN0IGF1dG8mIGVudHJ5ID0gbVRleHR1cmVWaWV3LmZpbmQodGV4TmFtZSk7CisgICAgcmV0dXJuIGVudHJ5ICE9IG1UZXh0dXJlVmlldy5lbmQoKTsKK30KKworc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gR0xFU1JlbmRlckVuZ2luZTo6Z2V0QnVmZmVySWRGb3JUZXh0dXJlTmFtZUZvclRlc3RpbmcodWludDMyX3QgdGV4TmFtZSkgeworICAgIGNvbnN0IGF1dG8mIGVudHJ5ID0gbVRleHR1cmVWaWV3LmZpbmQodGV4TmFtZSk7CisgICAgcmV0dXJuIGVudHJ5ICE9IG1UZXh0dXJlVmlldy5lbmQoKSA/IGVudHJ5LT5zZWNvbmQgOiBzdGQ6Om51bGxvcHQ7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6aXNGcmFtZWJ1ZmZlckltYWdlQ2FjaGVkRm9yVGVzdGluZyh1aW50NjRfdCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGVNdXRleCk7CisgICAgcmV0dXJuIHN0ZDo6YW55X29mKG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuY2JlZ2luKCksIG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuY2VuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICBbPV0oc3RkOjpwYWlyPHVpbnQ2NF90LCBFR0xJbWFnZUtIUj4gaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZS5maXJzdCA9PSBidWZmZXJJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKKy8vIEZsdXNoVHJhY2VyIGltcGxlbWVudGF0aW9uCitHTEVTUmVuZGVyRW5naW5lOjpGbHVzaFRyYWNlcjo6Rmx1c2hUcmFjZXIoR0xFU1JlbmRlckVuZ2luZSogZW5naW5lKSA6IG1FbmdpbmUoZW5naW5lKSB7CisgICAgbVRocmVhZCA9IHN0ZDo6dGhyZWFkKCZHTEVTUmVuZGVyRW5naW5lOjpGbHVzaFRyYWNlcjo6bG9vcCwgdGhpcyk7Cit9CisKK0dMRVNSZW5kZXJFbmdpbmU6OkZsdXNoVHJhY2VyOjp+Rmx1c2hUcmFjZXIoKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICBpZiAobVRocmVhZC5qb2luYWJsZSgpKSB7CisgICAgICAgIG1UaHJlYWQuam9pbigpOworICAgIH0KK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpGbHVzaFRyYWNlcjo6cXVldWVTeW5jKEVHTFN5bmNLSFIgc3luYykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgY2hhciBuYW1lWzY0XTsKKyAgICBjb25zdCB1aW50NjRfdCBmcmFtZU51bSA9IG1GcmFtZXNRdWV1ZWQrKzsKKyAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJRdWV1ZWluZyBzeW5jIGZvciBmcmFtZTogJWx1IiwKKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihmcmFtZU51bSkpOworICAgIEFUUkFDRV9OQU1FKG5hbWUpOworICAgIG1RdWV1ZS5wdXNoKHtzeW5jLCBmcmFtZU51bX0pOworICAgIEFUUkFDRV9JTlQoIkdQVSBGcmFtZXMgT3V0c3RhbmRpbmciLCBtUXVldWUuc2l6ZSgpKTsKKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpGbHVzaFRyYWNlcjo6bG9vcCgpIHsKKyAgICB3aGlsZSAobVJ1bm5pbmcpIHsKKyAgICAgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1NdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oKSBSRVFVSVJFUyhtTXV0ZXgpIHsgcmV0dXJuICFtUXVldWUuZW1wdHkoKSB8fCAhbVJ1bm5pbmc7IH0pOworCisgICAgICAgICAgICBpZiAoIW1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgbVJ1bm5pbmcgaXMgZmFsc2UsIHRoZW4gRmx1c2hUcmFjZXIgaXMgYmVpbmcgZGVzdHJveWVkLCBzbworICAgICAgICAgICAgICAgIC8vIGJhaWwgb3V0IG5vdy4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudHJ5ID0gbVF1ZXVlLmZyb250KCk7CisgICAgICAgICAgICBtUXVldWUucG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBuYW1lWzY0XTsKKyAgICAgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIndhaXRpbmcgZm9yIGZyYW1lICVsdSIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihlbnRyeS5tRnJhbWVOdW0pKTsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKG5hbWUpOworICAgICAgICAgICAgbUVuZ2luZS0+d2FpdFN5bmMoZW50cnkubVN5bmMsIDApOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmhhbmRsZVNoYWRvdyhjb25zdCBGbG9hdFJlY3QmIGNhc3RlclJlY3QsIGZsb2F0IGNhc3RlckNvcm5lclJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNoYWRvd1NldHRpbmdzJiBzZXR0aW5ncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgY29uc3QgZmxvYXQgY2FzdGVyWiA9IHNldHRpbmdzLmxlbmd0aCAvIDIuMGY7CisgICAgY29uc3QgR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3Igc2hhZG93cyhjYXN0ZXJSZWN0LCBjYXN0ZXJDb3JuZXJSYWRpdXMsIGNhc3RlclosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5jYXN0ZXJJc1RyYW5zbHVjZW50LCBzZXR0aW5ncy5hbWJpZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zcG90Q29sb3IsIHNldHRpbmdzLmxpZ2h0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubGlnaHRSYWRpdXMpOworCisgICAgLy8gc2V0dXAgbWVzaCBmb3IgYm90aCBzaGFkb3dzCisgICAgTWVzaCBtZXNoID0gTWVzaDo6QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJpbWl0aXZlKE1lc2g6OlRSSUFOR0xFUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWZXJ0aWNlcyhzaGFkb3dzLmdldFZlcnRleENvdW50KCksIDIgLyogc2l6ZSAqLykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTaGFkb3dBdHRycygpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kaWNlcyhzaGFkb3dzLmdldEluZGV4Q291bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMj4gcG9zaXRpb24gPSBtZXNoLmdldFBvc2l0aW9uQXJyYXk8dmVjMj4oKTsKKyAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWM0PiBzaGFkb3dDb2xvciA9IG1lc2guZ2V0U2hhZG93Q29sb3JBcnJheTx2ZWM0PigpOworICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzM+IHNoYWRvd1BhcmFtcyA9IG1lc2guZ2V0U2hhZG93UGFyYW1zQXJyYXk8dmVjMz4oKTsKKyAgICBzaGFkb3dzLmZpbGxWZXJ0aWNlcyhwb3NpdGlvbiwgc2hhZG93Q29sb3IsIHNoYWRvd1BhcmFtcyk7CisgICAgc2hhZG93cy5maWxsSW5kaWNlcyhtZXNoLmdldEluZGljZXNBcnJheSgpKTsKKworICAgIG1TdGF0ZS5jb3JuZXJSYWRpdXMgPSAwLjBmOworICAgIG1TdGF0ZS5kcmF3U2hhZG93cyA9IHRydWU7CisgICAgc2V0dXBMYXllclRleHR1cmluZyhtU2hhZG93VGV4dHVyZS5nZXRUZXh0dXJlKCkpOworICAgIGRyYXdNZXNoKG1lc2gpOworICAgIG1TdGF0ZS5kcmF3U2hhZG93cyA9IGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xFU1JlbmRlckVuZ2luZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRVNSZW5kZXJFbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZlYWUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRVNSZW5kZXJFbmdpbmUuaApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRl9HTEVTUkVOREVSRU5HSU5FX0hfCisjZGVmaW5lIFNGX0dMRVNSRU5ERVJFTkdJTkVfSF8KKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9SZW5kZXJFbmdpbmUuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvcHJpdmF0ZS9EZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIkdMU2hhZG93VGV4dHVyZS5oIgorI2luY2x1ZGUgIkltYWdlTWFuYWdlci5oIgorCisjZGVmaW5lIEVHTF9OT19DT05GSUcgKChFR0xDb25maWcpMCkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKKworY2xhc3MgTWVzaDsKK2NsYXNzIFRleHR1cmU7CisKK25hbWVzcGFjZSBnbCB7CisKK2NsYXNzIEdMSW1hZ2U7CitjbGFzcyBCbHVyRmlsdGVyOworCitjbGFzcyBHTEVTUmVuZGVyRW5naW5lIDogcHVibGljIGltcGw6OlJlbmRlckVuZ2luZSB7CitwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHTEVTUmVuZGVyRW5naW5lPiBjcmVhdGUoY29uc3QgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzJiBhcmdzKTsKKworICAgIEdMRVNSZW5kZXJFbmdpbmUoY29uc3QgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzJiBhcmdzLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IGN0eHQsIEVHTFN1cmZhY2Ugc3R1YiwgRUdMQ29udGV4dCBwcm90ZWN0ZWRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSBwcm90ZWN0ZWRTdHViKTsKKyAgICB+R0xFU1JlbmRlckVuZ2luZSgpIG92ZXJyaWRlIEVYQ0xVREVTKG1SZW5kZXJpbmdNdXRleCk7CisKKyAgICB2b2lkIHByaW1lQ2FjaGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGdlblRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QqIG5hbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIGRlbGV0ZVRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QgY29uc3QqIG5hbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIGJpbmRFeHRlcm5hbFRleHR1cmVJbWFnZSh1aW50MzJfdCB0ZXhOYW1lLCBjb25zdCBJbWFnZSYgaW1hZ2UpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDMyX3QgdGV4TmFtZSwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEZlbmNlPiYgZmVuY2UpIEVYQ0xVREVTKG1SZW5kZXJpbmdNdXRleCk7CisgICAgdm9pZCBjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlcihjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSBFWENMVURFUyhtUmVuZGVyaW5nTXV0ZXgpOworICAgIHZvaWQgdW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSBFWENMVURFUyhtUmVuZGVyaW5nTXV0ZXgpOworICAgIHN0YXR1c190IGJpbmRGcmFtZUJ1ZmZlcihGcmFtZWJ1ZmZlciogZnJhbWVidWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgdW5iaW5kRnJhbWVCdWZmZXIoRnJhbWVidWZmZXIqIGZyYW1lYnVmZmVyKSBvdmVycmlkZTsKKworICAgIGJvb2wgaXNQcm90ZWN0ZWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtSW5Qcm90ZWN0ZWRDb250ZXh0OyB9CisgICAgYm9vbCBzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIHVzZVByb3RlY3RlZENvbnRleHQoYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkcmF3TGF5ZXJzKGNvbnN0IERpc3BsYXlTZXR0aW5ncyYgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IExheWVyU2V0dGluZ3MqPiYgbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwgY29uc3QgYm9vbCB1c2VGcmFtZWJ1ZmZlckNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6dW5pcXVlX2ZkJiYgYnVmZmVyRmVuY2UsIGJhc2U6OnVuaXF1ZV9mZCogZHJhd0ZlbmNlKSBvdmVycmlkZTsKKyAgICBib29sIGNsZWFudXBQb3N0UmVuZGVyKENsZWFudXBNb2RlIG1vZGUpIG92ZXJyaWRlOworCisgICAgRUdMRGlzcGxheSBnZXRFR0xEaXNwbGF5KCkgY29uc3QgeyByZXR1cm4gbUVHTERpc3BsYXk7IH0KKyAgICAvLyBDcmVhdGVzIGFuIG91dHB1dCBpbWFnZSBmb3IgcmVuZGVyaW5nIHRvCisgICAgRUdMSW1hZ2VLSFIgY3JlYXRlRnJhbWVidWZmZXJJbWFnZUlmTmVlZGVkKEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZUJ1ZmZlciwgYm9vbCBpc1Byb3RlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VGcmFtZWJ1ZmZlckNhY2hlKQorICAgICAgICAgICAgRVhDTFVERVMobUZyYW1lYnVmZmVySW1hZ2VDYWNoZU11dGV4KTsKKworICAgIC8vIFRlc3Qtb25seSBtZXRob2RzCisgICAgLy8gUmV0dXJucyB0cnVlIGlmZiBtSW1hZ2VDYWNoZSBjb250YWlucyBhbiBpbWFnZSBrZXllZCBieSBidWZmZXJJZAorICAgIGJvb2wgaXNJbWFnZUNhY2hlZEZvclRlc3RpbmcodWludDY0X3QgYnVmZmVySWQpIEVYQ0xVREVTKG1SZW5kZXJpbmdNdXRleCk7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXhOYW1lIHdhcyBwcmV2aW91c2x5IGdlbmVyYXRlZCBieSBSZW5kZXJFbmdpbmUgYW5kIHdhcworICAgIC8vIG5vdCBkZXN0cm95ZWQuCisgICAgYm9vbCBpc1RleHR1cmVOYW1lS25vd25Gb3JUZXN0aW5nKHVpbnQzMl90IHRleE5hbWUpOworICAgIC8vIFJldHVybnMgdGhlIGJ1ZmZlciBJRCBvZiB0aGUgY29udGVudCBib3VuZCB0byB0ZXhOYW1lLCBvciBudWxsb3B0IGlmIG5vCisgICAgLy8gc3VjaCBtYXBwaW5nIGV4aXN0cy4KKyAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBnZXRCdWZmZXJJZEZvclRleHR1cmVOYW1lRm9yVGVzdGluZyh1aW50MzJfdCB0ZXhOYW1lKTsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWZmIG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUgY29udGFpbnMgYW4gaW1hZ2Uga2V5ZWQgYnkgYnVmZmVySWQKKyAgICBib29sIGlzRnJhbWVidWZmZXJJbWFnZUNhY2hlZEZvclRlc3RpbmcodWludDY0X3QgYnVmZmVySWQpCisgICAgICAgICAgICBFWENMVURFUyhtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXgpOworICAgIC8vIFRoZXNlIGFyZSB3cmFwcGVycyBhcm91bmQgcHVibGljIG1ldGhvZHMgYWJvdmUsIGJ1dCBleHBvc2luZyBCYXJyaWVyCisgICAgLy8gb2JqZWN0cyBzbyB0aGF0IHRlc3RzIGNhbiBibG9jay4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1hZ2VNYW5hZ2VyOjpCYXJyaWVyPiBjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlckZvclRlc3RpbmcoCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1hZ2VNYW5hZ2VyOjpCYXJyaWVyPiB1bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXJGb3JUZXN0aW5nKHVpbnQ2NF90IGJ1ZmZlcklkKTsKKworcHJvdGVjdGVkOgorICAgIEZyYW1lYnVmZmVyKiBnZXRGcmFtZWJ1ZmZlckZvckRyYXdpbmcoKSBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcmIHJlc3VsdCkgb3ZlcnJpZGUgRVhDTFVERVMobVJlbmRlcmluZ011dGV4KQorICAgICAgICAgICAgRVhDTFVERVMobUZyYW1lYnVmZmVySW1hZ2VDYWNoZU11dGV4KTsKKyAgICBzaXplX3QgZ2V0TWF4VGV4dHVyZVNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgICBzaXplX3QgZ2V0TWF4Vmlld3BvcnREaW1zKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSBHbGVzVmVyc2lvbiB7CisgICAgICAgIEdMRVNfVkVSU0lPTl8xXzAgPSAweDEwMDAwLAorICAgICAgICBHTEVTX1ZFUlNJT05fMV8xID0gMHgxMDAwMSwKKyAgICAgICAgR0xFU19WRVJTSU9OXzJfMCA9IDB4MjAwMDAsCisgICAgICAgIEdMRVNfVkVSU0lPTl8zXzAgPSAweDMwMDAwLAorICAgIH07CisKKyAgICBzdGF0aWMgRUdMQ29uZmlnIGNob29zZUVnbENvbmZpZyhFR0xEaXNwbGF5IGRpc3BsYXksIGludCBmb3JtYXQsIGJvb2wgbG9nQ29uZmlnKTsKKyAgICBzdGF0aWMgR2xlc1ZlcnNpb24gcGFyc2VHbGVzVmVyc2lvbihjb25zdCBjaGFyKiBzdHIpOworICAgIHN0YXRpYyBFR0xDb250ZXh0IGNyZWF0ZUVnbENvbnRleHQoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29udGV4dCBzaGFyZUNvbnRleHQsIGJvb2wgdXNlQ29udGV4dFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGlvbiBwcm90ZWN0aW9uKTsKKyAgICBzdGF0aWMgRUdMU3VyZmFjZSBjcmVhdGVTdHViRWdsUGJ1ZmZlclN1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHdjRm9ybWF0LCBQcm90ZWN0aW9uIHByb3RlY3Rpb24pOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGcmFtZWJ1ZmZlcj4gY3JlYXRlRnJhbWVidWZmZXIoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1hZ2U+IGNyZWF0ZUltYWdlKCk7CisgICAgdm9pZCBjaGVja0Vycm9ycygpIGNvbnN0OworICAgIHZvaWQgY2hlY2tFcnJvcnMoY29uc3QgY2hhciogdGFnKSBjb25zdDsKKyAgICB2b2lkIHNldFNjaXNzb3IoY29uc3QgUmVjdCYgcmVnaW9uKTsKKyAgICB2b2lkIGRpc2FibGVTY2lzc29yKCk7CisgICAgYm9vbCB3YWl0U3luYyhFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncyk7CisgICAgc3RhdHVzX3QgY2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKQorICAgICAgICAgICAgRVhDTFVERVMobVJlbmRlcmluZ011dGV4KTsKKyAgICB2b2lkIHVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlckludGVybmFsKHVpbnQ2NF90IGJ1ZmZlcklkKSBFWENMVURFUyhtUmVuZGVyaW5nTXV0ZXgpOworCisgICAgLy8gQSBkYXRhIHNwYWNlIGlzIGNvbnNpZGVyZWQgSERSIGRhdGEgc3BhY2UgaWYgaXQgaGFzIEJUMjAyMCBjb2xvciBzcGFjZQorICAgIC8vIHdpdGggUFEgb3IgSExHIHRyYW5zZmVyIGZ1bmN0aW9uLgorICAgIGJvb2wgaXNIZHJEYXRhU3BhY2UoY29uc3QgdWk6OkRhdGFzcGFjZSBkYXRhU3BhY2UpIGNvbnN0OworICAgIGJvb2wgbmVlZHNYWVpUcmFuc2Zvcm1NYXRyaXgoKSBjb25zdDsKKyAgICAvLyBEZWZpbmVzIHRoZSB2aWV3cG9ydCwgYW5kIHNldHMgdGhlIHByb2plY3Rpb24gbWF0cml4IHRvIHRoZSBwcm9qZWN0aW9uCisgICAgLy8gZGVmaW5lZCBieSB0aGUgY2xpcC4KKyAgICB2b2lkIHNldFZpZXdwb3J0QW5kUHJvamVjdGlvbihSZWN0IHZpZXdwb3J0LCBSZWN0IGNsaXApOworICAgIC8vIEV2aWN0cyBzdGFsZSBpbWFnZXMgZnJvbSB0aGUgYnVmZmVyIGNhY2hlLgorICAgIHZvaWQgZXZpY3RJbWFnZXMoY29uc3Qgc3RkOjp2ZWN0b3I8TGF5ZXJTZXR0aW5ncz4mIGxheWVycyk7CisgICAgLy8gQ29tcHV0ZXMgdGhlIGNyb3BwaW5nIHdpbmRvdyBmb3IgdGhlIGxheWVyIGFuZCBzZXRzIHVwIGNyb3BwaW5nCisgICAgLy8gY29vcmRpbmF0ZXMgZm9yIHRoZSBtZXNoLgorICAgIEZsb2F0UmVjdCBzZXR1cExheWVyQ3JvcHBpbmcoY29uc3QgTGF5ZXJTZXR0aW5ncyYgbGF5ZXIsIE1lc2gmIG1lc2gpOworCisgICAgLy8gV2UgZG8gYSBzcGVjaWFsIGhhbmRsaW5nIGZvciByb3VuZGVkIGNvcm5lcnMgd2hlbiBpdCdzIHBvc3NpYmxlIHRvIHR1cm4gb2ZmIGJsZW5kaW5nCisgICAgLy8gZm9yIHRoZSBtYWpvcml0eSBvZiB0aGUgbGF5ZXIuIFRoZSByb3VuZGVkIGNvcm5lcnMgbmVlZHMgdG8gdHVybiBvbiBibGVuZGluZyBzdWNoIHRoYXQKKyAgICAvLyB3ZSBjYW4gc2V0IHRoZSBhbHBoYSB2YWx1ZSBjb3JyZWN0bHksIGhvd2V2ZXIsIG9ubHkgdGhlIGNvcm5lcnMgbmVlZCB0aGlzLCBhbmQgc2luY2UKKyAgICAvLyBibGVuZGluZyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLCB3ZSB3YW50IHRvIHR1cm4gb2ZmIGJsZW5kaW5nIHdoZW4gaXQncyBub3QgbmVjZXNzYXJ5LgorICAgIHZvaWQgaGFuZGxlUm91bmRlZENvcm5lcnMoY29uc3QgRGlzcGxheVNldHRpbmdzJiBkaXNwbGF5LCBjb25zdCBMYXllclNldHRpbmdzJiBsYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc2gmIG1lc2gpOworICAgIGJhc2U6OnVuaXF1ZV9mZCBmbHVzaCgpOworICAgIGJvb2wgZmluaXNoKCk7CisgICAgYm9vbCB3YWl0RmVuY2UoYmFzZTo6dW5pcXVlX2ZkIGZlbmNlRmQpOworICAgIHZvaWQgY2xlYXJXaXRoQ29sb3IoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpOworICAgIHZvaWQgZmlsbFJlZ2lvbldpdGhDb2xvcihjb25zdCBSZWdpb24mIHJlZ2lvbiwgZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpOworICAgIHZvaWQgaGFuZGxlU2hhZG93KGNvbnN0IEZsb2F0UmVjdCYgY2FzdGVyUmVjdCwgZmxvYXQgY2FzdGVyQ29ybmVyUmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNoYWRvd1NldHRpbmdzJiBzaGFkb3dTZXR0aW5ncyk7CisgICAgdm9pZCBzZXR1cExheWVyQmxlbmRpbmcoYm9vbCBwcmVtdWx0aXBsaWVkQWxwaGEsIGJvb2wgb3BhcXVlLCBib29sIGRpc2FibGVUZXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbGY0JiBjb2xvciwgZmxvYXQgY29ybmVyUmFkaXVzKTsKKyAgICB2b2lkIHNldHVwTGF5ZXJUZXh0dXJpbmcoY29uc3QgVGV4dHVyZSYgdGV4dHVyZSk7CisgICAgdm9pZCBzZXR1cEZpbGxXaXRoQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSk7CisgICAgdm9pZCBzZXRDb2xvclRyYW5zZm9ybShjb25zdCBtYXQ0JiBjb2xvclRyYW5zZm9ybSk7CisgICAgdm9pZCBkaXNhYmxlVGV4dHVyaW5nKCk7CisgICAgdm9pZCBkaXNhYmxlQmxlbmRpbmcoKTsKKyAgICB2b2lkIHNldHVwQ29ybmVyUmFkaXVzQ3JvcFNpemUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCk7CisKKyAgICAvLyBIRFIgYW5kIGNvbG9yIG1hbmFnZW1lbnQgcmVsYXRlZCBmdW5jdGlvbnMgYW5kIHN0YXRlCisgICAgdm9pZCBzZXRTb3VyY2VZNDEwQlQyMDIwKGJvb2wgZW5hYmxlKTsKKyAgICB2b2lkIHNldFNvdXJjZURhdGFTcGFjZSh1aTo6RGF0YXNwYWNlIHNvdXJjZSk7CisgICAgdm9pZCBzZXRPdXRwdXREYXRhU3BhY2UodWk6OkRhdGFzcGFjZSBkYXRhc3BhY2UpOworICAgIHZvaWQgc2V0RGlzcGxheU1heEx1bWluYW5jZShjb25zdCBmbG9hdCBtYXhMdW1pbmFuY2UpOworCisgICAgLy8gZHJhd2luZworICAgIHZvaWQgZHJhd01lc2goY29uc3QgTWVzaCYgbWVzaCk7CisKKyAgICBFR0xEaXNwbGF5IG1FR0xEaXNwbGF5OworICAgIEVHTENvbmZpZyBtRUdMQ29uZmlnOworICAgIEVHTENvbnRleHQgbUVHTENvbnRleHQ7CisgICAgRUdMU3VyZmFjZSBtU3R1YlN1cmZhY2U7CisgICAgRUdMQ29udGV4dCBtUHJvdGVjdGVkRUdMQ29udGV4dDsKKyAgICBFR0xTdXJmYWNlIG1Qcm90ZWN0ZWRTdHViU3VyZmFjZTsKKyAgICBHTGludCBtTWF4Vmlld3BvcnREaW1zWzJdOworICAgIEdMaW50IG1NYXhUZXh0dXJlU2l6ZTsKKyAgICBHTHVpbnQgbVZwV2lkdGg7CisgICAgR0x1aW50IG1WcEhlaWdodDsKKyAgICBEZXNjcmlwdGlvbiBtU3RhdGU7CisgICAgR0xTaGFkb3dUZXh0dXJlIG1TaGFkb3dUZXh0dXJlOworCisgICAgbWF0NCBtU3JnYlRvWHl6OworICAgIG1hdDQgbURpc3BsYXlQM1RvWHl6OworICAgIG1hdDQgbUJ0MjAyMFRvWHl6OworICAgIG1hdDQgbVh5elRvU3JnYjsKKyAgICBtYXQ0IG1YeXpUb0Rpc3BsYXlQMzsKKyAgICBtYXQ0IG1YeXpUb0J0MjAyMDsKKyAgICBtYXQ0IG1TcmdiVG9EaXNwbGF5UDM7CisgICAgbWF0NCBtU3JnYlRvQnQyMDIwOworICAgIG1hdDQgbURpc3BsYXlQM1RvU3JnYjsKKyAgICBtYXQ0IG1EaXNwbGF5UDNUb0J0MjAyMDsKKyAgICBtYXQ0IG1CdDIwMjBUb1NyZ2I7CisgICAgbWF0NCBtQnQyMDIwVG9EaXNwbGF5UDM7CisKKyAgICBib29sIG1JblByb3RlY3RlZENvbnRleHQgPSBmYWxzZTsKKyAgICAvLyBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiBlbmFibGVzIHRyYWNpbmcgZmx1c2goKSBhbmQgZmluaXNoKCkgdG8gc3lzdHJhY2UuCisgICAgYm9vbCBtVHJhY2VHcHVDb21wbGV0aW9uID0gZmFsc2U7CisgICAgLy8gTWF4aW11bSBzaXplIG9mIG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuIElmIG1vcmUgaW1hZ2VzIHdvdWxkIGJlIGNhY2hlZCwgdGhlbiAoYXBwcm94aW1hdGVseSkKKyAgICAvLyB0aGUgbGFzdCByZWNlbnRseSB1c2VkIGJ1ZmZlciBzaG91bGQgYmUga2lja2VkIG91dC4KKyAgICB1aW50MzJfdCBtRnJhbWVidWZmZXJJbWFnZUNhY2hlU2l6ZSA9IDA7CisKKyAgICAvLyBDYWNoZSBvZiBvdXRwdXQgaW1hZ2VzLCBrZXllZCBieSBjb3JyZXNwb25kaW5nIEdyYXBoaWNCdWZmZXIgSUQuCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dWludDY0X3QsIEVHTEltYWdlS0hSPj4gbUZyYW1lYnVmZmVySW1hZ2VDYWNoZQorICAgICAgICAgICAgR1VBUkRFRF9CWShtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXgpOworICAgIC8vIFRoZSBvbmx5IHJlYXNvbiB3aHkgd2UgaGF2ZSB0aGlzIG11dGV4IGlzIHNvIHRoYXQgd2UgZG9uJ3Qgc2VnZmF1bHQgd2hlbgorICAgIC8vIGR1bXBpbmcgaW5mby4KKyAgICBzdGQ6Om11dGV4IG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGVNdXRleDsKKworICAgIC8vIEN1cnJlbnQgZGF0YXNwYWNlIG9mIGxheWVyIGJlaW5nIHJlbmRlcmVkCisgICAgdWk6OkRhdGFzcGFjZSBtRGF0YVNwYWNlID0gdWk6OkRhdGFzcGFjZTo6VU5LTk9XTjsKKworICAgIC8vIEN1cnJlbnQgb3V0cHV0IGRhdGFzcGFjZSBvZiB0aGUgcmVuZGVyIGVuZ2luZQorICAgIHVpOjpEYXRhc3BhY2UgbU91dHB1dERhdGFTcGFjZSA9IHVpOjpEYXRhc3BhY2U6OlVOS05PV047CisKKyAgICAvLyBXaGV0aGVyIGRldmljZSBzdXBwb3J0cyBjb2xvciBtYW5hZ2VtZW50LCBjdXJyZW50bHkgY29sb3IgbWFuYWdlbWVudAorICAgIC8vIHN1cHBvcnRzIHNSR0IsIERpc3BsYXlQMyBjb2xvciBzcGFjZXMuCisgICAgY29uc3QgYm9vbCBtVXNlQ29sb3JNYW5hZ2VtZW50ID0gZmFsc2U7CisKKyAgICAvLyBDYWNoZSBvZiBHTCBpbWFnZXMgdGhhdCB3ZSdsbCBzdG9yZSBwZXIgR3JhcGhpY0J1ZmZlciBJRAorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgc3RkOjp1bmlxdWVfcHRyPEltYWdlPj4gbUltYWdlQ2FjaGUgR1VBUkRFRF9CWShtUmVuZGVyaW5nTXV0ZXgpOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4+IG1UZXh0dXJlVmlldzsKKworICAgIC8vIE11dGV4IGd1YXJkaW5nIHJlbmRlcmluZyBvcGVyYXRpb25zLCBzbyB0aGF0OgorICAgIC8vIDEuIEdMIG9wZXJhdGlvbnMgYXJlbid0IGludGVybGVhdmVkLCBhbmQKKyAgICAvLyAyLiBJbnRlcm5hbCBzdGF0ZSByZWxhdGVkIHRvIHJlbmRlcmluZyB0aGF0IGlzIHBvdGVudGlhbGx5IG1vZGlmaWVkIGJ5CisgICAgLy8gbXVsdGlwbGUgdGhyZWFkcyBpcyBndWFyYW50ZWVkIHRocmVhZC1zYWZlLgorICAgIHN0ZDo6bXV0ZXggbVJlbmRlcmluZ011dGV4OworCisgICAgc3RkOjp1bmlxdWVfcHRyPEZyYW1lYnVmZmVyPiBtRHJhd2luZ0J1ZmZlcjsKKyAgICAvLyB0aGlzIGlzIGEgMXgxIFJHQiBidWZmZXIsIGJ1dCBvdmVyLWFsbG9jYXRlIGluIGNhc2UgYSBkcml2ZXIgd2FudHMgbW9yZQorICAgIC8vIG1lbW9yeSBvciBpZiBpdCBuZWVkcyB0byBzYXRpc2Z5IGFsaWdubWVudCByZXF1aXJlbWVudHMuIEluIHRoaXMgY2FzZToKKyAgICAvLyBhc3N1bWUgdGhhdCBlYWNoIGNoYW5uZWwgcmVxdWlyZXMgNCBieXRlcywgYW5kIGFkZCAzIGFkZGl0aW9uYWwgYnl0ZXMgdG8KKyAgICAvLyBlbnN1cmUgdGhhdCB3ZSBhbGlnbiBvbiBhIHdvcmQuIEFsbG9jYXRpbmcgMTYgYnl0ZXMgd2lsbCBwcm92aWRlIGEKKyAgICAvLyBndWFyYW50ZWUgdGhhdCB3ZSBkb24ndCBjbG9iYmVyIG1lbW9yeS4KKyAgICB1aW50MzJfdCBtUGxhY2Vob2xkZXJEcmF3QnVmZmVyWzRdOworICAgIC8vIFBsYWNlaG9sZGVyIGJ1ZmZlciBhbmQgaW1hZ2UsIHNpbWlsYXIgdG8gbVBsYWNlaG9sZGVyRHJhd0J1ZmZlciwgYnV0CisgICAgLy8gaW5zdGVhZCB0aGVzZSBhcmUgaW50ZW5kZWQgZm9yIGNsZWFuaW5nIHVwIHRleHR1cmUgbWVtb3J5IHdpdGggdGhlCisgICAgLy8gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgdGFyZ2V0LgorICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIG1QbGFjZWhvbGRlckJ1ZmZlciA9IG51bGxwdHI7CisgICAgRUdMSW1hZ2UgbVBsYWNlaG9sZGVySW1hZ2UgPSBFR0xfTk9fSU1BR0VfS0hSOworICAgIHNwPEZlbmNlPiBtTGFzdERyYXdGZW5jZTsKKyAgICAvLyBTdG9yZSBhIHNlcGFyYXRlIGJvb2xlYW4gY2hlY2tpbmcgaWYgcHJpb3IgcmVzb3VyY2VzIHdlcmUgY2xlYW5lZCB1cCwgYXMKKyAgICAvLyBkZXZpY2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBuYXRpdmUgc3luYyBmZW5jZXMgY2FuJ3QgcmVseSBvbiBhIGxhc3QgZHJhdworICAgIC8vIGZlbmNlIHRoYXQgZG9lc24ndCBleGlzdC4KKyAgICBib29sIG1QcmlvclJlc291cmNlc0NsZWFuZWQgPSB0cnVlOworCisgICAgLy8gQmx1ciBlZmZlY3QgcHJvY2Vzc29yLCBvbmx5IGluc3RhbnRpYXRlZCB3aGVuIGEgbGF5ZXIgcmVxdWVzdHMgaXQuCisgICAgQmx1ckZpbHRlciogbUJsdXJGaWx0ZXIgPSBudWxscHRyOworCisgICAgY2xhc3MgRmx1c2hUcmFjZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmx1c2hUcmFjZXIoR0xFU1JlbmRlckVuZ2luZSogZW5naW5lKTsKKyAgICAgICAgfkZsdXNoVHJhY2VyKCk7CisgICAgICAgIHZvaWQgcXVldWVTeW5jKEVHTFN5bmNLSFIgc3luYykgRVhDTFVERVMobU11dGV4KTsKKworICAgICAgICBzdHJ1Y3QgUXVldWVFbnRyeSB7CisgICAgICAgICAgICBFR0xTeW5jS0hSIG1TeW5jID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHVpbnQ2NF90IG1GcmFtZU51bSA9IDA7CisgICAgICAgIH07CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIGxvb3AoKTsKKyAgICAgICAgR0xFU1JlbmRlckVuZ2luZSogY29uc3QgbUVuZ2luZTsKKyAgICAgICAgc3RkOjp0aHJlYWQgbVRocmVhZDsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IG1Db25kaXRpb247CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6OnF1ZXVlPFF1ZXVlRW50cnk+IG1RdWV1ZSBHVUFSREVEX0JZKG1NdXRleCk7CisgICAgICAgIHVpbnQ2NF90IG1GcmFtZXNRdWV1ZWQgR1VBUkRFRF9CWShtTXV0ZXgpID0gMDsKKyAgICAgICAgYm9vbCBtUnVubmluZyA9IHRydWU7CisgICAgfTsKKyAgICBmcmllbmQgY2xhc3MgRmx1c2hUcmFjZXI7CisgICAgZnJpZW5kIGNsYXNzIEltYWdlTWFuYWdlcjsKKyAgICBmcmllbmQgY2xhc3MgR0xGcmFtZWJ1ZmZlcjsKKyAgICBmcmllbmQgY2xhc3MgQmx1ckZpbHRlcjsKKyAgICBmcmllbmQgY2xhc3MgR2VuZXJpY1Byb2dyYW07CisgICAgc3RkOjp1bmlxdWVfcHRyPEZsdXNoVHJhY2VyPiBtRmx1c2hUcmFjZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltYWdlTWFuYWdlcj4gbUltYWdlTWFuYWdlciA9IHN0ZDo6bWFrZV91bmlxdWU8SW1hZ2VNYW5hZ2VyPih0aGlzKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIFNGX0dMRVNSRU5ERVJFTkdJTkVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEV4dGVuc2lvbnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRXh0ZW5zaW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyNGIwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEV4dGVuc2lvbnMuY3BwCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkdMRXh0ZW5zaW9ucy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitBTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoYW5kcm9pZDo6cmVuZGVyZW5naW5lOjpnbDo6R0xFeHRlbnNpb25zKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEV4dGVuc2lvblNldCB7CitwdWJsaWM6CisgICAgRXh0ZW5zaW9uU2V0KGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMpIHsKKyAgICAgICAgY2hhciBjb25zdCogY3VyciA9IGV4dGVuc2lvbnM7CisgICAgICAgIGNoYXIgY29uc3QqIGhlYWQgPSBjdXJyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBoZWFkID0gc3RyY2hyKGN1cnIsICcgJyk7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gaGVhZCA/IGhlYWQgLSBjdXJyIDogc3RybGVuKGN1cnIpOworICAgICAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBtRXh0ZW5zaW9ucy5lbXBsYWNlKGN1cnIsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyID0gaGVhZCArIDE7CisgICAgICAgIH0gd2hpbGUgKGhlYWQpOworICAgIH0KKworICAgIGJvb2wgaGFzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgY29uc3QgeyByZXR1cm4gbUV4dGVuc2lvbnMuY291bnQoZXh0ZW5zaW9uKSA+IDA7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1FeHRlbnNpb25zOworfTsKKworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK3ZvaWQgR0xFeHRlbnNpb25zOjppbml0V2l0aEdMU3RyaW5ncyhHTHVieXRlIGNvbnN0KiB2ZW5kb3IsIEdMdWJ5dGUgY29uc3QqIHJlbmRlcmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWJ5dGUgY29uc3QqIHZlcnNpb24sIEdMdWJ5dGUgY29uc3QqIGV4dGVuc2lvbnMpIHsKKyAgICBtVmVuZG9yID0gKGNoYXIgY29uc3QqKXZlbmRvcjsKKyAgICBtUmVuZGVyZXIgPSAoY2hhciBjb25zdCopcmVuZGVyZXI7CisgICAgbVZlcnNpb24gPSAoY2hhciBjb25zdCopdmVyc2lvbjsKKyAgICBtRXh0ZW5zaW9ucyA9IChjaGFyIGNvbnN0KilleHRlbnNpb25zOworCisgICAgRXh0ZW5zaW9uU2V0IGV4dGVuc2lvblNldChtRXh0ZW5zaW9ucy5jX3N0cigpKTsKKyAgICBpZiAoZXh0ZW5zaW9uU2V0Lmhhc0V4dGVuc2lvbigiR0xfRVhUX3Byb3RlY3RlZF90ZXh0dXJlcyIpKSB7CisgICAgICAgIG1IYXNQcm90ZWN0ZWRUZXh0dXJlID0gdHJ1ZTsKKyAgICB9Cit9CisKK2NoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0VmVuZG9yKCkgY29uc3QgeworICAgIHJldHVybiBtVmVuZG9yLnN0cmluZygpOworfQorCitjaGFyIGNvbnN0KiBHTEV4dGVuc2lvbnM6OmdldFJlbmRlcmVyKCkgY29uc3QgeworICAgIHJldHVybiBtUmVuZGVyZXIuc3RyaW5nKCk7Cit9CisKK2NoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0VmVyc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbVZlcnNpb24uc3RyaW5nKCk7Cit9CisKK2NoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0RXh0ZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUV4dGVuc2lvbnMuc3RyaW5nKCk7Cit9CisKK3ZvaWQgR0xFeHRlbnNpb25zOjppbml0V2l0aEVHTFN0cmluZ3MoY2hhciBjb25zdCogZWdsVmVyc2lvbiwgY2hhciBjb25zdCogZWdsRXh0ZW5zaW9ucykgeworICAgIG1FR0xWZXJzaW9uID0gZWdsVmVyc2lvbjsKKyAgICBtRUdMRXh0ZW5zaW9ucyA9IGVnbEV4dGVuc2lvbnM7CisKKyAgICBFeHRlbnNpb25TZXQgZXh0ZW5zaW9uU2V0KGVnbEV4dGVuc2lvbnMpOworCisgICAgLy8gRUdMX0FORFJPSURYX25vX2NvbmZpZ19jb250ZXh0IGlzIGFuIGV4cGVyaW1lbnRhbCBleHRlbnNpb24gd2l0aCBubworICAgIC8vIHdyaXR0ZW4gc3BlY2lmaWNhdGlvbi4gSXQgd2lsbCBiZSByZXBsYWNlZCBieSBzb21ldGhpbmcgbW9yZSBmb3JtYWwuCisgICAgLy8gU3VyZmFjZUZsaW5nZXIgaXMgdXNpbmcgaXQgdG8gYWxsb3cgYSBzaW5nbGUgRUdMQ29udGV4dCB0byByZW5kZXIgdG8KKyAgICAvLyBib3RoIGEgMTYtYml0IHByaW1hcnkgZGlzcGxheSBmcmFtZWJ1ZmZlciBhbmQgYSAzMi1iaXQgdmlydHVhbCBkaXNwbGF5CisgICAgLy8gZnJhbWVidWZmZXIuCisgICAgLy8KKyAgICAvLyBFR0xfS0hSX25vX2NvbmZpZ19jb250ZXh0IGlzIG9mZmljaWFsIGV4dGVuc2lvbiB0byBhbGxvdyBjcmVhdGluZyBhCisgICAgLy8gY29udGV4dCB0aGF0IHdvcmtzIHdpdGggYW55IHN1cmZhY2Ugb2YgYSBkaXNwbGF5LgorICAgIGlmIChleHRlbnNpb25TZXQuaGFzRXh0ZW5zaW9uKCJFR0xfQU5EUk9JRFhfbm9fY29uZmlnX2NvbnRleHQiKSB8fAorICAgICAgICBleHRlbnNpb25TZXQuaGFzRXh0ZW5zaW9uKCJFR0xfS0hSX25vX2NvbmZpZ19jb250ZXh0IikpIHsKKyAgICAgICAgbUhhc05vQ29uZmlnQ29udGV4dCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGV4dGVuc2lvblNldC5oYXNFeHRlbnNpb24oIkVHTF9BTkRST0lEX25hdGl2ZV9mZW5jZV9zeW5jIikpIHsKKyAgICAgICAgbUhhc05hdGl2ZUZlbmNlU3luYyA9IHRydWU7CisgICAgfQorICAgIGlmIChleHRlbnNpb25TZXQuaGFzRXh0ZW5zaW9uKCJFR0xfS0hSX2ZlbmNlX3N5bmMiKSkgeworICAgICAgICBtSGFzRmVuY2VTeW5jID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGV4dGVuc2lvblNldC5oYXNFeHRlbnNpb24oIkVHTF9LSFJfd2FpdF9zeW5jIikpIHsKKyAgICAgICAgbUhhc1dhaXRTeW5jID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGV4dGVuc2lvblNldC5oYXNFeHRlbnNpb24oIkVHTF9FWFRfcHJvdGVjdGVkX2NvbnRlbnQiKSkgeworICAgICAgICBtSGFzUHJvdGVjdGVkQ29udGVudCA9IHRydWU7CisgICAgfQorICAgIGlmIChleHRlbnNpb25TZXQuaGFzRXh0ZW5zaW9uKCJFR0xfSU1HX2NvbnRleHRfcHJpb3JpdHkiKSkgeworICAgICAgICBtSGFzQ29udGV4dFByaW9yaXR5ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGV4dGVuc2lvblNldC5oYXNFeHRlbnNpb24oIkVHTF9LSFJfc3VyZmFjZWxlc3NfY29udGV4dCIpKSB7CisgICAgICAgIG1IYXNTdXJmYWNlbGVzc0NvbnRleHQgPSB0cnVlOworICAgIH0KK30KKworY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRFR0xWZXJzaW9uKCkgY29uc3QgeworICAgIHJldHVybiBtRUdMVmVyc2lvbi5zdHJpbmcoKTsKK30KKworY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRFR0xFeHRlbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtRUdMRXh0ZW5zaW9ucy5zdHJpbmcoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRXh0ZW5zaW9ucy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRXh0ZW5zaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDAwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xFeHRlbnNpb25zLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRl9HTEVYVEVOU0lPTl9ICisjZGVmaW5lIEFORFJPSURfU0ZfR0xFWFRFTlNJT05fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK2NsYXNzIEdMRXh0ZW5zaW9ucyA6IHB1YmxpYyBTaW5nbGV0b248R0xFeHRlbnNpb25zPiB7CitwdWJsaWM6CisgICAgYm9vbCBoYXNOb0NvbmZpZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtSGFzTm9Db25maWdDb250ZXh0OyB9CisgICAgYm9vbCBoYXNOYXRpdmVGZW5jZVN5bmMoKSBjb25zdCB7IHJldHVybiBtSGFzTmF0aXZlRmVuY2VTeW5jOyB9CisgICAgYm9vbCBoYXNGZW5jZVN5bmMoKSBjb25zdCB7IHJldHVybiBtSGFzRmVuY2VTeW5jOyB9CisgICAgYm9vbCBoYXNXYWl0U3luYygpIGNvbnN0IHsgcmV0dXJuIG1IYXNXYWl0U3luYzsgfQorICAgIGJvb2wgaGFzUHJvdGVjdGVkQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNQcm90ZWN0ZWRDb250ZW50OyB9CisgICAgYm9vbCBoYXNDb250ZXh0UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBtSGFzQ29udGV4dFByaW9yaXR5OyB9CisgICAgYm9vbCBoYXNTdXJmYWNlbGVzc0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtSGFzU3VyZmFjZWxlc3NDb250ZXh0OyB9CisgICAgYm9vbCBoYXNQcm90ZWN0ZWRUZXh0dXJlKCkgY29uc3QgeyByZXR1cm4gbUhhc1Byb3RlY3RlZFRleHR1cmU7IH0KKworICAgIHZvaWQgaW5pdFdpdGhHTFN0cmluZ3MoR0x1Ynl0ZSBjb25zdCogdmVuZG9yLCBHTHVieXRlIGNvbnN0KiByZW5kZXJlciwgR0x1Ynl0ZSBjb25zdCogdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWJ5dGUgY29uc3QqIGV4dGVuc2lvbnMpOworICAgIGNoYXIgY29uc3QqIGdldFZlbmRvcigpIGNvbnN0OworICAgIGNoYXIgY29uc3QqIGdldFJlbmRlcmVyKCkgY29uc3Q7CisgICAgY2hhciBjb25zdCogZ2V0VmVyc2lvbigpIGNvbnN0OworICAgIGNoYXIgY29uc3QqIGdldEV4dGVuc2lvbnMoKSBjb25zdDsKKworICAgIHZvaWQgaW5pdFdpdGhFR0xTdHJpbmdzKGNoYXIgY29uc3QqIGVnbFZlcnNpb24sIGNoYXIgY29uc3QqIGVnbEV4dGVuc2lvbnMpOworICAgIGNoYXIgY29uc3QqIGdldEVHTFZlcnNpb24oKSBjb25zdDsKKyAgICBjaGFyIGNvbnN0KiBnZXRFR0xFeHRlbnNpb25zKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBHTEV4dGVuc2lvbnMoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFNpbmdsZXRvbjxHTEV4dGVuc2lvbnM+OworCisgICAgYm9vbCBtSGFzTm9Db25maWdDb250ZXh0ID0gZmFsc2U7CisgICAgYm9vbCBtSGFzTmF0aXZlRmVuY2VTeW5jID0gZmFsc2U7CisgICAgYm9vbCBtSGFzRmVuY2VTeW5jID0gZmFsc2U7CisgICAgYm9vbCBtSGFzV2FpdFN5bmMgPSBmYWxzZTsKKyAgICBib29sIG1IYXNQcm90ZWN0ZWRDb250ZW50ID0gZmFsc2U7CisgICAgYm9vbCBtSGFzQ29udGV4dFByaW9yaXR5ID0gZmFsc2U7CisgICAgYm9vbCBtSGFzU3VyZmFjZWxlc3NDb250ZXh0ID0gZmFsc2U7CisgICAgYm9vbCBtSGFzUHJvdGVjdGVkVGV4dHVyZSA9IGZhbHNlOworCisgICAgU3RyaW5nOCBtVmVuZG9yOworICAgIFN0cmluZzggbVJlbmRlcmVyOworICAgIFN0cmluZzggbVZlcnNpb247CisgICAgU3RyaW5nOCBtRXh0ZW5zaW9uczsKKyAgICBTdHJpbmc4IG1FR0xWZXJzaW9uOworICAgIFN0cmluZzggbUVHTEV4dGVuc2lvbnM7CisKKyAgICBHTEV4dGVuc2lvbnMoY29uc3QgR0xFeHRlbnNpb25zJik7CisgICAgR0xFeHRlbnNpb25zJiBvcGVyYXRvcj0oY29uc3QgR0xFeHRlbnNpb25zJik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NGX0dMRVhURU5TSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEZyYW1lYnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEZyYW1lYnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM0ODZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRnJhbWVidWZmZXIuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUworCisjaW5jbHVkZSAiR0xGcmFtZWJ1ZmZlci5oIgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDxHTEVTMy9nbDMuaD4KKyNpbmNsdWRlIDxndWkvRGVidWdFR0xJbWFnZVRyYWNrZXIuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkdMRVNSZW5kZXJFbmdpbmUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitHTEZyYW1lYnVmZmVyOjpHTEZyYW1lYnVmZmVyKEdMRVNSZW5kZXJFbmdpbmUmIGVuZ2luZSkKKyAgICAgIDogbUVuZ2luZShlbmdpbmUpLCBtRUdMRGlzcGxheShlbmdpbmUuZ2V0RUdMRGlzcGxheSgpKSwgbUVHTEltYWdlKEVHTF9OT19JTUFHRV9LSFIpIHsKKyAgICBnbEdlblRleHR1cmVzKDEsICZtVGV4dHVyZU5hbWUpOworICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZtRnJhbWVidWZmZXJOYW1lKTsKK30KKworR0xGcmFtZWJ1ZmZlcjo6fkdMRnJhbWVidWZmZXIoKSB7CisgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJm1GcmFtZWJ1ZmZlck5hbWUpOworICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlTmFtZSk7Cit9CisKK2Jvb2wgR0xGcmFtZWJ1ZmZlcjo6c2V0TmF0aXZlV2luZG93QnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZUJ1ZmZlciwgYm9vbCBpc1Byb3RlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG1FR0xJbWFnZSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgICAgIGlmICghdXNpbmdGcmFtZWJ1ZmZlckNhY2hlKSB7CisgICAgICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIobUVHTERpc3BsYXksIG1FR0xJbWFnZSk7CisgICAgICAgICAgICBERUJVR19FR0xfSU1BR0VfVFJBQ0tFUl9ERVNUUk9ZKCk7CisgICAgICAgIH0KKyAgICAgICAgbUVHTEltYWdlID0gRUdMX05PX0lNQUdFX0tIUjsKKyAgICAgICAgbUJ1ZmZlcldpZHRoID0gMDsKKyAgICAgICAgbUJ1ZmZlckhlaWdodCA9IDA7CisgICAgfQorCisgICAgaWYgKG5hdGl2ZUJ1ZmZlcikgeworICAgICAgICBtRUdMSW1hZ2UgPSBtRW5naW5lLmNyZWF0ZUZyYW1lYnVmZmVySW1hZ2VJZk5lZWRlZChuYXRpdmVCdWZmZXIsIGlzUHJvdGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VGcmFtZWJ1ZmZlckNhY2hlKTsKKyAgICAgICAgaWYgKG1FR0xJbWFnZSA9PSBFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdXNpbmdGcmFtZWJ1ZmZlckNhY2hlID0gdXNlRnJhbWVidWZmZXJDYWNoZTsKKyAgICAgICAgbUJ1ZmZlcldpZHRoID0gbmF0aXZlQnVmZmVyLT53aWR0aDsKKyAgICAgICAgbUJ1ZmZlckhlaWdodCA9IG5hdGl2ZUJ1ZmZlci0+aGVpZ2h0OworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHTEZyYW1lYnVmZmVyOjphbGxvY2F0ZUJ1ZmZlcnModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdm9pZCogZGF0YSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlTmFtZSk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgd2lkdGgsIGhlaWdodCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9CWVRFLCBkYXRhKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9NSVJST1JFRF9SRVBFQVQpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfTUlSUk9SRURfUkVQRUFUKTsKKworICAgIG1CdWZmZXJIZWlnaHQgPSBoZWlnaHQ7CisgICAgbUJ1ZmZlcldpZHRoID0gd2lkdGg7CisgICAgbUVuZ2luZS5jaGVja0Vycm9ycygiQWxsb2NhdGluZyBGYm8gdGV4dHVyZSIpOworCisgICAgYmluZCgpOworICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwLCBHTF9URVhUVVJFXzJELCBtVGV4dHVyZU5hbWUsIDApOworICAgIG1TdGF0dXMgPSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpOworICAgIHVuYmluZCgpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisKKyAgICBpZiAobVN0YXR1cyAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkgeworICAgICAgICBBTE9HRSgiRnJhbWUgYnVmZmVyIGlzIG5vdCBjb21wbGV0ZS4gRXJyb3IgJWQiLCBtU3RhdHVzKTsKKyAgICB9Cit9CisKK3ZvaWQgR0xGcmFtZWJ1ZmZlcjo6YmluZCgpIGNvbnN0IHsKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgbUZyYW1lYnVmZmVyTmFtZSk7Cit9CisKK3ZvaWQgR0xGcmFtZWJ1ZmZlcjo6YmluZEFzUmVhZEJ1ZmZlcigpIGNvbnN0IHsKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9SRUFEX0ZSQU1FQlVGRkVSLCBtRnJhbWVidWZmZXJOYW1lKTsKK30KKwordm9pZCBHTEZyYW1lYnVmZmVyOjpiaW5kQXNEcmF3QnVmZmVyKCkgY29uc3QgeworICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0RSQVdfRlJBTUVCVUZGRVIsIG1GcmFtZWJ1ZmZlck5hbWUpOworfQorCit2b2lkIEdMRnJhbWVidWZmZXI6OnVuYmluZCgpIGNvbnN0IHsKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEZyYW1lYnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xGcmFtZWJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTc2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xGcmFtZWJ1ZmZlci5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0ZyYW1lYnVmZmVyLmg+CisKK3N0cnVjdCBBTmF0aXZlV2luZG93QnVmZmVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK2NsYXNzIEdMRVNSZW5kZXJFbmdpbmU7CisKK2NsYXNzIEdMRnJhbWVidWZmZXIgOiBwdWJsaWMgcmVuZGVyZW5naW5lOjpGcmFtZWJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgR0xGcmFtZWJ1ZmZlcihHTEVTUmVuZGVyRW5naW5lJiBlbmdpbmUpOworICAgIGV4cGxpY2l0IEdMRnJhbWVidWZmZXIoR0xFU1JlbmRlckVuZ2luZSYgZW5naW5lLCBib29sIG11bHRpVGFyZ2V0KTsKKyAgICB+R0xGcmFtZWJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgYm9vbCBzZXROYXRpdmVXaW5kb3dCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogbmF0aXZlQnVmZmVyLCBib29sIGlzUHJvdGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdm9pZCogZGF0YSA9IG51bGxwdHIpOworICAgIEVHTEltYWdlS0hSIGdldEVHTEltYWdlKCkgY29uc3QgeyByZXR1cm4gbUVHTEltYWdlOyB9CisgICAgdWludDMyX3QgZ2V0VGV4dHVyZU5hbWUoKSBjb25zdCB7IHJldHVybiBtVGV4dHVyZU5hbWU7IH0KKyAgICB1aW50MzJfdCBnZXRGcmFtZWJ1ZmZlck5hbWUoKSBjb25zdCB7IHJldHVybiBtRnJhbWVidWZmZXJOYW1lOyB9CisgICAgaW50MzJfdCBnZXRCdWZmZXJIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtQnVmZmVySGVpZ2h0OyB9CisgICAgaW50MzJfdCBnZXRCdWZmZXJXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJXaWR0aDsgfQorICAgIEdMZW51bSBnZXRTdGF0dXMoKSBjb25zdCB7IHJldHVybiBtU3RhdHVzOyB9CisgICAgdm9pZCBiaW5kKCkgY29uc3Q7CisgICAgdm9pZCBiaW5kQXNSZWFkQnVmZmVyKCkgY29uc3Q7CisgICAgdm9pZCBiaW5kQXNEcmF3QnVmZmVyKCkgY29uc3Q7CisgICAgdm9pZCB1bmJpbmQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBHTEVTUmVuZGVyRW5naW5lJiBtRW5naW5lOworICAgIEVHTERpc3BsYXkgbUVHTERpc3BsYXk7CisgICAgRUdMSW1hZ2VLSFIgbUVHTEltYWdlOworICAgIGJvb2wgdXNpbmdGcmFtZWJ1ZmZlckNhY2hlID0gZmFsc2U7CisgICAgR0xlbnVtIG1TdGF0dXMgPSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDsKKyAgICB1aW50MzJfdCBtVGV4dHVyZU5hbWUsIG1GcmFtZWJ1ZmZlck5hbWU7CisKKyAgICBpbnQzMl90IG1CdWZmZXJIZWlnaHQgPSAwOworICAgIGludDMyX3QgbUJ1ZmZlcldpZHRoID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEltYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDk3NzIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMSW1hZ2UuY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisKKyNpbmNsdWRlICJHTEltYWdlLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxndWkvRGVidWdFR0xJbWFnZVRyYWNrZXIuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlICJHTEVTUmVuZGVyRW5naW5lLmgiCisjaW5jbHVkZSAiR0xFeHRlbnNpb25zLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworc3RhdGljIHN0ZDo6dmVjdG9yPEVHTGludD4gYnVpbGRBdHRyaWJ1dGVMaXN0KGJvb2wgaXNQcm90ZWN0ZWQpIHsKKyAgICBzdGQ6OnZlY3RvcjxFR0xpbnQ+IGF0dHJzOworICAgIGF0dHJzLnJlc2VydmUoMTYpOworCisgICAgYXR0cnMucHVzaF9iYWNrKEVHTF9JTUFHRV9QUkVTRVJWRURfS0hSKTsKKyAgICBhdHRycy5wdXNoX2JhY2soRUdMX1RSVUUpOworCisgICAgaWYgKGlzUHJvdGVjdGVkICYmIEdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKS5oYXNQcm90ZWN0ZWRDb250ZW50KCkpIHsKKyAgICAgICAgYXR0cnMucHVzaF9iYWNrKEVHTF9QUk9URUNURURfQ09OVEVOVF9FWFQpOworICAgICAgICBhdHRycy5wdXNoX2JhY2soRUdMX1RSVUUpOworICAgIH0KKworICAgIGF0dHJzLnB1c2hfYmFjayhFR0xfTk9ORSk7CisKKyAgICByZXR1cm4gYXR0cnM7Cit9CisKK0dMSW1hZ2U6OkdMSW1hZ2UoY29uc3QgR0xFU1JlbmRlckVuZ2luZSYgZW5naW5lKSA6IG1FR0xEaXNwbGF5KGVuZ2luZS5nZXRFR0xEaXNwbGF5KCkpIHt9CisKK0dMSW1hZ2U6On5HTEltYWdlKCkgeworICAgIHNldE5hdGl2ZVdpbmRvd0J1ZmZlcihudWxscHRyLCBmYWxzZSk7Cit9CisKK2Jvb2wgR0xJbWFnZTo6c2V0TmF0aXZlV2luZG93QnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgYm9vbCBpc1Byb3RlY3RlZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG1FR0xJbWFnZSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgICAgIGlmICghZWdsRGVzdHJveUltYWdlS0hSKG1FR0xEaXNwbGF5LCBtRUdMSW1hZ2UpKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlc3Ryb3kgaW1hZ2U6ICUjeCIsIGVnbEdldEVycm9yKCkpOworICAgICAgICB9CisgICAgICAgIERFQlVHX0VHTF9JTUFHRV9UUkFDS0VSX0RFU1RST1koKTsKKyAgICAgICAgbUVHTEltYWdlID0gRUdMX05PX0lNQUdFX0tIUjsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEVHTGludD4gYXR0cnMgPSBidWlsZEF0dHJpYnV0ZUxpc3QoaXNQcm90ZWN0ZWQpOworICAgICAgICBtRUdMSW1hZ2UgPSBlZ2xDcmVhdGVJbWFnZUtIUihtRUdMRGlzcGxheSwgRUdMX05PX0NPTlRFWFQsIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVHTENsaWVudEJ1ZmZlcj4oYnVmZmVyKSwgYXR0cnMuZGF0YSgpKTsKKyAgICAgICAgaWYgKG1FR0xJbWFnZSA9PSBFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBFR0xJbWFnZTogJSN4IiwgZWdsR2V0RXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgREVCVUdfRUdMX0lNQUdFX1RSQUNLRVJfQ1JFQVRFKCk7CisgICAgICAgIG1Qcm90ZWN0ZWQgPSBpc1Byb3RlY3RlZDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMSW1hZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkNmNlMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEltYWdlLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0ltYWdlLmg+CisKK3N0cnVjdCBBTmF0aXZlV2luZG93QnVmZmVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK2NsYXNzIEdMRVNSZW5kZXJFbmdpbmU7CisKK2NsYXNzIEdMSW1hZ2UgOiBwdWJsaWMgcmVuZGVyZW5naW5lOjpJbWFnZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgR0xJbWFnZShjb25zdCBHTEVTUmVuZGVyRW5naW5lJiBlbmdpbmUpOworICAgIH5HTEltYWdlKCkgb3ZlcnJpZGU7CisKKyAgICBib29sIHNldE5hdGl2ZVdpbmRvd0J1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGJvb2wgaXNQcm90ZWN0ZWQpIG92ZXJyaWRlOworCisgICAgRUdMSW1hZ2VLSFIgZ2V0RUdMSW1hZ2UoKSBjb25zdCB7IHJldHVybiBtRUdMSW1hZ2U7IH0KKyAgICBib29sIGlzUHJvdGVjdGVkKCkgY29uc3QgeyByZXR1cm4gbVByb3RlY3RlZDsgfQorCitwcml2YXRlOgorICAgIEVHTERpc3BsYXkgbUVHTERpc3BsYXk7CisgICAgRUdMSW1hZ2VLSFIgbUVHTEltYWdlID0gRUdMX05PX0lNQUdFX0tIUjsKKyAgICBib29sIG1Qcm90ZWN0ZWQgPSBmYWxzZTsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihHTEltYWdlKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNoYWRvd1RleHR1cmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2hhZG93VGV4dHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyM2EzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNoYWRvd1RleHR1cmUuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPEdMRVMzL2dsMy5oPgorCisjaW5jbHVkZSAiR0xTaGFkb3dUZXh0dXJlLmgiCisjaW5jbHVkZSAiR0xTa2lhU2hhZG93UG9ydC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK0dMU2hhZG93VGV4dHVyZTo6R0xTaGFkb3dUZXh0dXJlKCkgeworICAgIGZpbGxTaGFkb3dUZXh0dXJlRGF0YShtVGV4dHVyZURhdGEsIFNIQURPV19URVhUVVJFX1dJRFRIKTsKKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJm1OYW1lKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1OYW1lKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCAvKiBiYXNlIGltYWdlIGxldmVsICovLCBHTF9BTFBIQSwgU0hBRE9XX1RFWFRVUkVfV0lEVEgsCisgICAgICAgICAgICAgICAgIFNIQURPV19URVhUVVJFX0hFSUdIVCwgMCAvKiBib3JkZXIgKi8sIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBtVGV4dHVyZURhdGEpOworICAgIG1UZXh0dXJlLmluaXQoVGV4dHVyZTo6VEVYVFVSRV8yRCwgbU5hbWUpOworICAgIG1UZXh0dXJlLnNldEZpbHRlcmluZyh0cnVlKTsKKyAgICBtVGV4dHVyZS5zZXREaW1lbnNpb25zKFNIQURPV19URVhUVVJFX1dJRFRILCAxKTsKK30KKworR0xTaGFkb3dUZXh0dXJlOjp+R0xTaGFkb3dUZXh0dXJlKCkgeworICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1OYW1lKTsKK30KKworY29uc3QgVGV4dHVyZSYgR0xTaGFkb3dUZXh0dXJlOjpnZXRUZXh0dXJlKCkgeworICAgIHJldHVybiBtVGV4dHVyZTsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2hhZG93VGV4dHVyZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2hhZG93VGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MGE5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dUZXh0dXJlLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvVGV4dHVyZS5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworY2xhc3MgR0xTaGFkb3dUZXh0dXJlIHsKK3B1YmxpYzoKKyAgICBHTFNoYWRvd1RleHR1cmUoKTsKKyAgICB+R0xTaGFkb3dUZXh0dXJlKCk7CisKKyAgICBjb25zdCBUZXh0dXJlJiBnZXRUZXh0dXJlKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgU0hBRE9XX1RFWFRVUkVfV0lEVEggPSAxMjg7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgU0hBRE9XX1RFWFRVUkVfSEVJR0hUID0gMTsKKworICAgIEdMdWludCBtTmFtZTsKKyAgICBUZXh0dXJlIG1UZXh0dXJlOworICAgIHVpbnQ4X3QgbVRleHR1cmVEYXRhW1NIQURPV19URVhUVVJFX1dJRFRIXTsKK307CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNoYWRvd1ZlcnRleEdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODFmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvTWVzaC5oPgorCisjaW5jbHVkZSA8bWF0aC92ZWM0Lmg+CisKKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8dWkvVHJhbnNmb3JtLmg+CisKKyNpbmNsdWRlICJHTFNoYWRvd1ZlcnRleEdlbmVyYXRvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK0dMU2hhZG93VmVydGV4R2VuZXJhdG9yOjpHTFNoYWRvd1ZlcnRleEdlbmVyYXRvcihjb25zdCBGbG9hdFJlY3QmIGNhc3RlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FzdGVyQ29ybmVyUmFkaXVzLCBmbG9hdCBjYXN0ZXJaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzdGVySXNUcmFuc2x1Y2VudCwgY29uc3QgdmVjNCYgYW1iaWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlYzQmIHNwb3RDb2xvciwgY29uc3QgdmVjMyYgbGlnaHRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsaWdodFJhZGl1cykgeworICAgIG1EcmF3QW1iaWVudFNoYWRvdyA9IGFtYmllbnRDb2xvci5hID4gMC5mOworICAgIG1EcmF3U3BvdFNoYWRvdyA9IHNwb3RDb2xvci5hID4gMC5mOworCisgICAgLy8gR2VuZXJhdGUgZ2VvbWV0cmllcyBhbmQgZmluZCBudW1iZXIgb2YgdmVydGljZXMgdG8gZ2VuZXJhdGUKKyAgICBpZiAobURyYXdBbWJpZW50U2hhZG93KSB7CisgICAgICAgIG1BbWJpZW50U2hhZG93R2VvbWV0cnkgPSBnZXRBbWJpZW50U2hhZG93R2VvbWV0cnkoY2FzdGVyUmVjdCwgY2FzdGVyQ29ybmVyUmFkaXVzLCBjYXN0ZXJaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlcklzVHJhbnNsdWNlbnQsIGFtYmllbnRDb2xvcik7CisgICAgICAgIG1BbWJpZW50U2hhZG93VmVydGV4Q291bnQgPSBnZXRWZXJ0ZXhDb3VudEZvckdlb21ldHJ5KCptQW1iaWVudFNoYWRvd0dlb21ldHJ5LmdldCgpKTsKKyAgICAgICAgbUFtYmllbnRTaGFkb3dJbmRleENvdW50ID0gZ2V0SW5kZXhDb3VudEZvckdlb21ldHJ5KCptQW1iaWVudFNoYWRvd0dlb21ldHJ5LmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQW1iaWVudFNoYWRvd1ZlcnRleENvdW50ID0gMDsKKyAgICAgICAgbUFtYmllbnRTaGFkb3dJbmRleENvdW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAobURyYXdTcG90U2hhZG93KSB7CisgICAgICAgIG1TcG90U2hhZG93R2VvbWV0cnkgPQorICAgICAgICAgICAgICAgIGdldFNwb3RTaGFkb3dHZW9tZXRyeShjYXN0ZXJSZWN0LCBjYXN0ZXJDb3JuZXJSYWRpdXMsIGNhc3RlclosIGNhc3RlcklzVHJhbnNsdWNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3RDb2xvciwgbGlnaHRQb3NpdGlvbiwgbGlnaHRSYWRpdXMpOworICAgICAgICBtU3BvdFNoYWRvd1ZlcnRleENvdW50ID0gZ2V0VmVydGV4Q291bnRGb3JHZW9tZXRyeSgqbVNwb3RTaGFkb3dHZW9tZXRyeS5nZXQoKSk7CisgICAgICAgIG1TcG90U2hhZG93SW5kZXhDb3VudCA9IGdldEluZGV4Q291bnRGb3JHZW9tZXRyeSgqbVNwb3RTaGFkb3dHZW9tZXRyeS5nZXQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNwb3RTaGFkb3dWZXJ0ZXhDb3VudCA9IDA7CisgICAgICAgIG1TcG90U2hhZG93SW5kZXhDb3VudCA9IDA7CisgICAgfQorfQorCitzaXplX3QgR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3I6OmdldFZlcnRleENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtQW1iaWVudFNoYWRvd1ZlcnRleENvdW50ICsgbVNwb3RTaGFkb3dWZXJ0ZXhDb3VudDsKK30KKworc2l6ZV90IEdMU2hhZG93VmVydGV4R2VuZXJhdG9yOjpnZXRJbmRleENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtQW1iaWVudFNoYWRvd0luZGV4Q291bnQgKyBtU3BvdFNoYWRvd0luZGV4Q291bnQ7Cit9CisKK3ZvaWQgR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3I6OmZpbGxWZXJ0aWNlcyhNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiYgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjND4mIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzM+JiBwYXJhbXMpIGNvbnN0IHsKKyAgICBpZiAobURyYXdBbWJpZW50U2hhZG93KSB7CisgICAgICAgIGZpbGxWZXJ0aWNlc0Zvckdlb21ldHJ5KCptQW1iaWVudFNoYWRvd0dlb21ldHJ5LmdldCgpLCBtQW1iaWVudFNoYWRvd1ZlcnRleENvdW50LCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IsIHBhcmFtcyk7CisgICAgfQorICAgIGlmIChtRHJhd1Nwb3RTaGFkb3cpIHsKKyAgICAgICAgZmlsbFZlcnRpY2VzRm9yR2VvbWV0cnkoKm1TcG90U2hhZG93R2VvbWV0cnkuZ2V0KCksIG1TcG90U2hhZG93VmVydGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzI+KHBvc2l0aW9uLCBtQW1iaWVudFNoYWRvd1ZlcnRleENvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjND4oY29sb3IsIG1BbWJpZW50U2hhZG93VmVydGV4Q291bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMzPihwYXJhbXMsIG1BbWJpZW50U2hhZG93VmVydGV4Q291bnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3I6OmZpbGxJbmRpY2VzKHVpbnQxNl90KiBpbmRpY2VzKSBjb25zdCB7CisgICAgaWYgKG1EcmF3QW1iaWVudFNoYWRvdykgeworICAgICAgICBmaWxsSW5kaWNlc0Zvckdlb21ldHJ5KCptQW1iaWVudFNoYWRvd0dlb21ldHJ5LmdldCgpLCBtQW1iaWVudFNoYWRvd0luZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBzdGFydGluZyB2ZXJ0ZXggb2Zmc2V0ICovLCBpbmRpY2VzKTsKKyAgICB9CisgICAgaWYgKG1EcmF3U3BvdFNoYWRvdykgeworICAgICAgICBmaWxsSW5kaWNlc0Zvckdlb21ldHJ5KCptU3BvdFNoYWRvd0dlb21ldHJ5LmdldCgpLCBtU3BvdFNoYWRvd0luZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFtYmllbnRTaGFkb3dWZXJ0ZXhDb3VudCAvKiBzdGFydGluZyB2ZXJ0ZXggb2Zmc2V0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaW5kaWNlc1ttQW1iaWVudFNoYWRvd0luZGV4Q291bnRdKSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNoYWRvd1ZlcnRleEdlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMmY5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1hdGgvdmVjNC5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKworI2luY2x1ZGUgIkdMU2tpYVNoYWRvd1BvcnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK2NsYXNzIE1lc2g7CisKK25hbWVzcGFjZSBnbCB7CisKKy8qKgorICogR2VuZXJhdGVzIGdsIGF0dHJpYnV0ZXMgcmVxdWlyZWQgdG8gZHJhdyBzaGFkb3cgc3BvdCBhbmQvb3IgYW1iaWVudCBzaGFkb3dzLgorICoKKyAqIEVhY2ggc2hhZG93IGNhbiBzdXBwb3J0IGRpZmZlcmVudCBjb2xvcnMuIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIHRocmVlIHZlcnRleCBhdHRyaWJ1dGVzIGZvcgorICogZWFjaCBzaGFkb3csIGl0cyBwb3NpdGlvbiwgY29sb3IgYW5kIHNoYWRvdyBwYXJhbXMob2Zmc2V0IGFuZCBkaXN0YW5jZSkuIFRoZXNlIGNhbiBiZSBzZW50CisgKiB1c2luZyBhIHNpbmdsZSBnbERyYXdFbGVtZW50cyBjYWxsLgorICovCitjbGFzcyBHTFNoYWRvd1ZlcnRleEdlbmVyYXRvciB7CitwdWJsaWM6CisgICAgR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IoY29uc3QgRmxvYXRSZWN0JiBjYXN0ZXJSZWN0LCBmbG9hdCBjYXN0ZXJDb3JuZXJSYWRpdXMsIGZsb2F0IGNhc3RlclosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXN0ZXJJc1RyYW5zbHVjZW50LCBjb25zdCB2ZWM0JiBhbWJpZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjNCYgc3BvdENvbG9yLCBjb25zdCB2ZWMzJiBsaWdodFBvc2l0aW9uLCBmbG9hdCBsaWdodFJhZGl1cyk7CisgICAgfkdMU2hhZG93VmVydGV4R2VuZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgc2l6ZV90IGdldFZlcnRleENvdW50KCkgY29uc3Q7CisgICAgc2l6ZV90IGdldEluZGV4Q291bnQoKSBjb25zdDsKKyAgICB2b2lkIGZpbGxWZXJ0aWNlcyhNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiYgcG9zaXRpb24sIE1lc2g6OlZlcnRleEFycmF5PHZlYzQ+JiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMzPiYgcGFyYW1zKSBjb25zdDsKKyAgICB2b2lkIGZpbGxJbmRpY2VzKHVpbnQxNl90KiBpbmRpY2VzKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBib29sIG1EcmF3QW1iaWVudFNoYWRvdzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R2VvbWV0cnk+IG1BbWJpZW50U2hhZG93R2VvbWV0cnk7CisgICAgaW50IG1BbWJpZW50U2hhZG93VmVydGV4Q291bnQgPSAwOworICAgIGludCBtQW1iaWVudFNoYWRvd0luZGV4Q291bnQgPSAwOworCisgICAgYm9vbCBtRHJhd1Nwb3RTaGFkb3c7CisgICAgc3RkOjp1bmlxdWVfcHRyPEdlb21ldHJ5PiBtU3BvdFNoYWRvd0dlb21ldHJ5OworICAgIGludCBtU3BvdFNoYWRvd1ZlcnRleENvdW50ID0gMDsKKyAgICBpbnQgbVNwb3RTaGFkb3dJbmRleENvdW50ID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNraWFTaGFkb3dQb3J0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNraWFTaGFkb3dQb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThiNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2tpYVNoYWRvd1BvcnQuY3BwCkBAIC0wLDAgKzEsNjU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWF0aC92ZWM0Lmg+CisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvTWVzaC5oPgorCisjaW5jbHVkZSA8dWkvUmVjdC5oPgorI2luY2x1ZGUgPHVpL1RyYW5zZm9ybS5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJHTFNraWFTaGFkb3dQb3J0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworLyoqCisgKiBUaGUgc2hhZG93IGdlb21ldHJ5IGxvZ2ljIGFuZCB2ZXJ0ZXggZ2VuZXJhdGlvbiBjb2RlIGhhcyBiZWVuIHBvcnRlZCBmcm9tIHNraWEgc2hhZG93CisgKiBmYXN0IHBhdGggT3BlbkdMIGltcGxlbWVudGF0aW9uIHRvIGRyYXcgc2hhZG93cyBhcm91bmQgcmVjdHMgYW5kIHJvdW5kZWQgcmVjdHMgaW5jbHVkaW5nCisgKiBjaXJjbGVzLgorICoKKyAqIHBhdGg6IHNraWEvc3JjL2dwdS9HclJlbmRlclRhcmdldENvbnRleHQuY3BwIEdyUmVuZGVyVGFyZ2V0Q29udGV4dDo6ZHJhd0Zhc3RTaGFkb3cKKyAqCisgKiBNb2RpZmljYXRpb25zIG1hZGU6CisgKiAtIFN3aXRjaGVkIHRvIHVzaW5nIHN0ZCBsaWIgbWF0aCBmdW5jdGlvbnMKKyAqIC0gRmFsbCBvZmYgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdmVydGV4IHNoYWRlciByYXRoZXIgdGhhbiBhIHNoYWRvdyB0ZXh0dXJlCisgKiAtIFJlbW92ZWQgdHJhbnNmb3JtYXRpb25zIGFwcGxpZWQgb24gdGhlIGNhc3RlciByZWN0IHNpbmNlIHRoZSBjYXN0ZXIgd2lsbCBiZSBpbiBsb2NhbAorICogICBjb29yZGluYXRlIHNwYWNlIGFuZCB3aWxsIGJlIHRyYW5zZm9ybWVkIGJ5IHRoZSB2ZXJ0ZXggc2hhZGVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgZGl2aWRlX2FuZF9waW4oZmxvYXQgbnVtZXIsIGZsb2F0IGRlbm9tLCBmbG9hdCBtaW4sIGZsb2F0IG1heCkgeworICAgIGlmIChkZW5vbSA9PSAwLjBmKSByZXR1cm4gbWluOworICAgIHJldHVybiBzdGQ6OmNsYW1wKG51bWVyIC8gZGVub20sIG1pbiwgbWF4KTsKK30KKworc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNLX1NjYWxhclNxcnQyID0gMS40MTQyMTM1NmY7CitzdGF0aWMgY29uc3RleHByIGF1dG8ga0FtYmllbnRIZWlnaHRGYWN0b3IgPSAxLjBmIC8gMTI4LjBmOworc3RhdGljIGNvbnN0ZXhwciBhdXRvIGtBbWJpZW50R2VvbUZhY3RvciA9IDY0LjBmOworLy8gQXNzdW1pbmcgdGhhdCB3ZSBoYXZlIGEgbGlnaHQgaGVpZ2h0IG9mIDYwMCBmb3IgdGhlIHNwb3Qgc2hhZG93LAorLy8gdGhlIHNwb3QgdmFsdWVzIHdpbGwgcmVhY2ggdGhlaXIgbWF4aW11bSBhdCBhIGhlaWdodCBvZiBhcHByb3hpbWF0ZWx5IDI5Mi4zMDc3LgorLy8gV2UnbGwgcm91bmQgdXAgdG8gMzAwIHRvIGtlZXAgaXQgc2ltcGxlLgorc3RhdGljIGNvbnN0ZXhwciBhdXRvIGtNYXhBbWJpZW50UmFkaXVzID0gMzAwICoga0FtYmllbnRIZWlnaHRGYWN0b3IgKiBrQW1iaWVudEdlb21GYWN0b3I7CisKK2lubGluZSBmbG9hdCBBbWJpZW50Qmx1clJhZGl1cyhmbG9hdCBoZWlnaHQpIHsKKyAgICByZXR1cm4gc3RkOjptaW4oaGVpZ2h0ICoga0FtYmllbnRIZWlnaHRGYWN0b3IgKiBrQW1iaWVudEdlb21GYWN0b3IsIGtNYXhBbWJpZW50UmFkaXVzKTsKK30KK2lubGluZSBmbG9hdCBBbWJpZW50UmVjaXBBbHBoYShmbG9hdCBoZWlnaHQpIHsKKyAgICByZXR1cm4gMS4wZiArIHN0ZDo6bWF4KGhlaWdodCAqIGtBbWJpZW50SGVpZ2h0RmFjdG9yLCAwLjBmKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDaXJjbGUgRGF0YQorLy8KKy8vIFdlIGhhdmUgdHdvIHBvc3NpYmxlIGNhc2VzIGZvciBnZW9tZXRyeSBmb3IgYSBjaXJjbGU6CisKKy8vIEluIHRoZSBjYXNlIG9mIGEgbm9ybWFsIGZpbGwsIHdlIGRyYXcgZ2VvbWV0cnkgZm9yIHRoZSBjaXJjbGUgYXMgYW4gb2N0YWdvbi4KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBnRmlsbENpcmNsZUluZGljZXNbXSA9IHsKKyAgICAgICAgLy8gZW50ZXIgdGhlIG9jdGFnb24KKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICAgMCwgMSwgOCwgMSwgMiwgOCwKKyAgICAgICAgIDIsIDMsIDgsIDMsIDQsIDgsCisgICAgICAgICA0LCA1LCA4LCA1LCA2LCA4LAorICAgICAgICAgNiwgNywgOCwgNywgMCwgOCwKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCit9OworCisvLyBGb3Igc3Ryb2tlZCBjaXJjbGVzLCB3ZSB1c2UgdHdvIG5lc3RlZCBvY3RhZ29ucy4KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBnU3Ryb2tlQ2lyY2xlSW5kaWNlc1tdID0geworICAgICAgICAvLyBlbnRlciB0aGUgb2N0YWdvbgorICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgICAgICAwLCAxLCAgOSwgMCwgIDksICA4LAorICAgICAgICAgMSwgMiwgMTAsIDEsIDEwLCAgOSwKKyAgICAgICAgIDIsIDMsIDExLCAyLCAxMSwgMTAsCisgICAgICAgICAzLCA0LCAxMiwgMywgMTIsIDExLAorICAgICAgICAgNCwgNSwgMTMsIDQsIDEzLCAxMiwKKyAgICAgICAgIDUsIDYsIDE0LCA1LCAxNCwgMTMsCisgICAgICAgICA2LCA3LCAxNSwgNiwgMTUsIDE0LAorICAgICAgICAgNywgMCwgIDgsIDcsICA4LCAxNSwKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCit9OworCisjZGVmaW5lIFNLX0FSUkFZX0NPVU5UKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKK3N0YXRpYyBjb25zdCBpbnQga0luZGljZXNQZXJGaWxsQ2lyY2xlID0gU0tfQVJSQVlfQ09VTlQoZ0ZpbGxDaXJjbGVJbmRpY2VzKTsKK3N0YXRpYyBjb25zdCBpbnQga0luZGljZXNQZXJTdHJva2VDaXJjbGUgPSBTS19BUlJBWV9DT1VOVChnU3Ryb2tlQ2lyY2xlSW5kaWNlcyk7CitzdGF0aWMgY29uc3QgaW50IGtWZXJ0c1BlclN0cm9rZUNpcmNsZSA9IDE2Oworc3RhdGljIGNvbnN0IGludCBrVmVydHNQZXJGaWxsQ2lyY2xlID0gOTsKKworc3RhdGljIGludCBjaXJjbGVfdHlwZV90b192ZXJ0X2NvdW50KGJvb2wgc3Ryb2tlZCkgeworICAgIHJldHVybiBzdHJva2VkID8ga1ZlcnRzUGVyU3Ryb2tlQ2lyY2xlIDoga1ZlcnRzUGVyRmlsbENpcmNsZTsKK30KKworc3RhdGljIGludCBjaXJjbGVfdHlwZV90b19pbmRleF9jb3VudChib29sIHN0cm9rZWQpIHsKKyAgICByZXR1cm4gc3Ryb2tlZCA/IGtJbmRpY2VzUGVyU3Ryb2tlQ2lyY2xlIDoga0luZGljZXNQZXJGaWxsQ2lyY2xlOworfQorCitzdGF0aWMgY29uc3QgdWludDE2X3QqIGNpcmNsZV90eXBlX3RvX2luZGljZXMoYm9vbCBzdHJva2VkKSB7CisgICAgcmV0dXJuIHN0cm9rZWQgPyBnU3Ryb2tlQ2lyY2xlSW5kaWNlcyA6IGdGaWxsQ2lyY2xlSW5kaWNlczsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUm91bmRSZWN0IERhdGEKKy8vCisvLyBUaGUgZ2VvbWV0cnkgZm9yIGEgc2hhZG93IHJvdW5kcmVjdCBpcyBzaW1pbGFyIHRvIGEgOS1wYXRjaDoKKy8vICAgIF9fX19fX19fX19fXworLy8gICB8X3xfX19fX19fX3xffAorLy8gICB8IHwgICAgICAgIHwgfAorLy8gICB8IHwgICAgICAgIHwgfAorLy8gICB8IHwgICAgICAgIHwgfAorLy8gICB8X3xfX19fX19fX3xffAorLy8gICB8X3xfX19fX19fX3xffAorLy8KKy8vIEhvd2V2ZXIsIGVhY2ggY29ybmVyIGlzIHJlbmRlcmVkIGFzIGEgZmFuIHJhdGhlciB0aGFuIGEgc2ltcGxlIHF1YWQsIGFzIGJlbG93LiAoVGhlIGRpYWdyYW0KKy8vIHNob3dzIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lci4gVGhlIGJvdHRvbSB0cmlhbmdsZSB3b3VsZCBzaW1pbGFybHkgYmUgc3BsaXQKKy8vIGludG8gdHdvIHRyaWFuZ2xlcy4pCisvLyAgICBfX19fX19fXworLy8gICB8XCAgXCAgIHwKKy8vICAgfCAgXCBcICB8CisvLyAgIHwgICAgXFwgfAorLy8gICB8ICAgICAgXHwKKy8vICAgLS0tLS0tLS0KKy8vCisvLyBUaGUgY2VudGVyIG9mIHRoZSBmYW4gaGFuZGxlcyB0aGUgY3VydmUgb2YgdGhlIGNvcm5lci4gRm9yIHJvdW5kcmVjdHMgd2hlcmUgdGhlIHN0cm9rZSB3aWR0aAorLy8gaXMgZ3JlYXRlciB0aGFuIHRoZSBjb3JuZXIgcmFkaXVzLCB0aGUgb3V0ZXIgdHJpYW5nbGVzIGJsZW5kIGZyb20gdGhlIGN1cnZlIHRvIHRoZSBzdHJhaWdodAorLy8gc2lkZXMuIE90aGVyd2lzZSB0aGVzZSB0cmlhbmdsZXMgd2lsbCBiZSBkZWdlbmVyYXRlLgorLy8KKy8vIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJva2Ugd2lkdGggaXMgZ3JlYXRlciB0aGFuIHRoZSBjb3JuZXIgcmFkaXVzIGFuZCB0aGUKKy8vIGJsdXIgcmFkaXVzIChvdmVyc3Ryb2tlKSwgd2UgYWRkIGFkZGl0aW9uYWwgZ2VvbWV0cnkgdG8gbWFyayBvdXQgdGhlIHJlY3RhbmdsZSBpbiB0aGUgY2VudGVyLgorLy8gVGhpcyByZWN0YW5nbGUgZXh0ZW5kcyB0aGUgY292ZXJhZ2UgdmFsdWVzIG9mIHRoZSBjZW50ZXIgZWRnZXMgb2YgdGhlIDktcGF0Y2guCisvLyAgICBfX19fX19fX19fX18KKy8vICAgfF98X19fX19fX198X3wKKy8vICAgfCB8XCBfX19fIC98IHwKKy8vICAgfCB8IHwgICAgfCB8IHwKKy8vICAgfCB8IHxfX19ffCB8IHwKKy8vICAgfF98L19fX19fX1x8X3wKKy8vICAgfF98X19fX19fX198X3wKKy8vCisvLyBGb3IgZmlsbGVkIHJyZWN0cyB3ZSByZXVzZSB0aGUgc3Ryb2tlIGdlb21ldHJ5IGJ1dCBhZGQgYW4gYWRkaXRpb25hbCBxdWFkIHRvIHRoZSBjZW50ZXIuCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBnUlJlY3RJbmRpY2VzW10gPSB7CisgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgLy8gb3ZlcnN0cm9rZSBxdWFkcworICAgICAvLyB3ZSBwbGFjZSB0aGlzIGF0IHRoZSBiZWdpbm5pbmcgc28gdGhhdCB3ZSBjYW4gc2tpcCB0aGVzZSBpbmRpY2VzIHdoZW4gcmVuZGVyaW5nIGFzIGZpbGxlZAorICAgICAwLCA2LCAyNSwgMCwgMjUsIDI0LAorICAgICA2LCAxOCwgMjcsIDYsIDI3LCAyNSwKKyAgICAgMTgsIDEyLCAyNiwgMTgsIDI2LCAyNywKKyAgICAgMTIsIDAsIDI0LCAxMiwgMjQsIDI2LAorCisgICAgIC8vIGNvcm5lcnMKKyAgICAgMCwgMSwgMiwgMCwgMiwgMywgMCwgMywgNCwgMCwgNCwgNSwKKyAgICAgNiwgMTEsIDEwLCA2LCAxMCwgOSwgNiwgOSwgOCwgNiwgOCwgNywKKyAgICAgMTIsIDE3LCAxNiwgMTIsIDE2LCAxNSwgMTIsIDE1LCAxNCwgMTIsIDE0LCAxMywKKyAgICAgMTgsIDE5LCAyMCwgMTgsIDIwLCAyMSwgMTgsIDIxLCAyMiwgMTgsIDIyLCAyMywKKworICAgICAvLyBlZGdlcworICAgICAwLCA1LCAxMSwgMCwgMTEsIDYsCisgICAgIDYsIDcsIDE5LCA2LCAxOSwgMTgsCisgICAgIDE4LCAyMywgMTcsIDE4LCAxNywgMTIsCisgICAgIDEyLCAxMywgMSwgMTIsIDEsIDAsCisKKyAgICAgLy8gZmlsbCBxdWFkCisgICAgIC8vIHdlIHBsYWNlIHRoaXMgYXQgdGhlIGVuZCBzbyB0aGF0IHdlIGNhbiBza2lwIHRoZXNlIGluZGljZXMgd2hlbiByZW5kZXJpbmcgYXMgc3Ryb2tlZAorICAgICAwLCA2LCAxOCwgMCwgMTgsIDEyLAorICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KK307CisKKy8vIG92ZXJzdHJva2UgY291bnQKK3N0YXRpYyBjb25zdCBpbnQga0luZGljZXNQZXJPdmVyc3Ryb2tlUlJlY3QgPSBTS19BUlJBWV9DT1VOVChnUlJlY3RJbmRpY2VzKSAtIDY7CisvLyBzaW1wbGUgc3Ryb2tlIGNvdW50IHNraXBzIG92ZXJzdHJva2UgaW5kaWNlcworc3RhdGljIGNvbnN0IGludCBrSW5kaWNlc1BlclN0cm9rZVJSZWN0ID0ga0luZGljZXNQZXJPdmVyc3Ryb2tlUlJlY3QgLSA2ICogNDsKKy8vIGZpbGwgY291bnQgYWRkcyBmaW5hbCBxdWFkIHRvIHN0cm9rZSBjb3VudAorc3RhdGljIGNvbnN0IGludCBrSW5kaWNlc1BlckZpbGxSUmVjdCA9IGtJbmRpY2VzUGVyU3Ryb2tlUlJlY3QgKyA2Oworc3RhdGljIGNvbnN0IGludCBrVmVydHNQZXJTdHJva2VSUmVjdCA9IDI0Oworc3RhdGljIGNvbnN0IGludCBrVmVydHNQZXJPdmVyc3Ryb2tlUlJlY3QgPSAyODsKK3N0YXRpYyBjb25zdCBpbnQga1ZlcnRzUGVyRmlsbFJSZWN0ID0gMjQ7CisKK3N0YXRpYyBpbnQgcnJlY3RfdHlwZV90b192ZXJ0X2NvdW50KFJSZWN0VHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2Uga0ZpbGxfUlJlY3RUeXBlOgorICAgICAgICAgICAgcmV0dXJuIGtWZXJ0c1BlckZpbGxSUmVjdDsKKyAgICAgICAgY2FzZSBrU3Ryb2tlX1JSZWN0VHlwZToKKyAgICAgICAgICAgIHJldHVybiBrVmVydHNQZXJTdHJva2VSUmVjdDsKKyAgICAgICAgY2FzZSBrT3ZlcnN0cm9rZV9SUmVjdFR5cGU6CisgICAgICAgICAgICByZXR1cm4ga1ZlcnRzUGVyT3ZlcnN0cm9rZVJSZWN0OworICAgIH0KKyAgICBBTE9HRSgiSW52YWxpZCByZWN0IHR5cGU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJyZWN0X3R5cGVfdG9faW5kZXhfY291bnQoUlJlY3RUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBrRmlsbF9SUmVjdFR5cGU6CisgICAgICAgICAgICByZXR1cm4ga0luZGljZXNQZXJGaWxsUlJlY3Q7CisgICAgICAgIGNhc2Uga1N0cm9rZV9SUmVjdFR5cGU6CisgICAgICAgICAgICByZXR1cm4ga0luZGljZXNQZXJTdHJva2VSUmVjdDsKKyAgICAgICAgY2FzZSBrT3ZlcnN0cm9rZV9SUmVjdFR5cGU6CisgICAgICAgICAgICByZXR1cm4ga0luZGljZXNQZXJPdmVyc3Ryb2tlUlJlY3Q7CisgICAgfQorICAgIEFMT0dFKCJJbnZhbGlkIHJlY3QgdHlwZTogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCogcnJlY3RfdHlwZV90b19pbmRpY2VzKFJSZWN0VHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2Uga0ZpbGxfUlJlY3RUeXBlOgorICAgICAgICBjYXNlIGtTdHJva2VfUlJlY3RUeXBlOgorICAgICAgICAgICAgcmV0dXJuIGdSUmVjdEluZGljZXMgKyA2ICogNDsKKyAgICAgICAgY2FzZSBrT3ZlcnN0cm9rZV9SUmVjdFR5cGU6CisgICAgICAgICAgICByZXR1cm4gZ1JSZWN0SW5kaWNlczsKKyAgICB9CisgICAgQUxPR0UoIkludmFsaWQgcmVjdCB0eXBlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBudWxscHRyOworfQorCitzdGF0aWMgdm9pZCBmaWxsSW5DaXJjbGVWZXJ0cyhjb25zdCBHZW9tZXRyeSYgYXJncywgYm9vbCBpc1N0cm9rZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiYgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWM0PiYgc2hhZG93Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMzPiYgc2hhZG93UGFyYW1zKSB7CisgICAgdmVjNCBjb2xvciA9IGFyZ3MuZkNvbG9yOworICAgIGZsb2F0IG91dGVyUmFkaXVzID0gYXJncy5mT3V0ZXJSYWRpdXM7CisgICAgZmxvYXQgaW5uZXJSYWRpdXMgPSBhcmdzLmZJbm5lclJhZGl1czsKKyAgICBmbG9hdCBibHVyUmFkaXVzID0gYXJncy5mQmx1clJhZGl1czsKKyAgICBmbG9hdCBkaXN0YW5jZUNvcnJlY3Rpb24gPSBvdXRlclJhZGl1cyAvIGJsdXJSYWRpdXM7CisKKyAgICBjb25zdCBGbG9hdFJlY3QmIGJvdW5kcyA9IGFyZ3MuZkRldkJvdW5kczsKKworICAgIC8vIFRoZSBpbm5lciByYWRpdXMgaW4gdGhlIHZlcnRleCBkYXRhIG11c3QgYmUgc3BlY2lmaWVkIGluIG5vcm1hbGl6ZWQgc3BhY2UuCisgICAgaW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cyAvIG91dGVyUmFkaXVzOworCisgICAgdmVjMiBjZW50ZXIgPSB2ZWMyKGJvdW5kcy5nZXRXaWR0aCgpIC8gMi4wZiwgYm91bmRzLmdldEhlaWdodCgpIC8gMi4wZik7CisgICAgZmxvYXQgaGFsZldpZHRoID0gMC41ZiAqIGJvdW5kcy5nZXRXaWR0aCgpOworICAgIGZsb2F0IG9jdE9mZnNldCA9IDAuNDE0MjEzNTYyMzdmOyAvLyBzcXJ0KDIpIC0gMQorICAgIGludCB2ZXJ0ZXhDb3VudCA9IDA7CisKKyAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKC1vY3RPZmZzZXQgKiBoYWxmV2lkdGgsIC1oYWxmV2lkdGgpOworICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKC1vY3RPZmZzZXQsIC0xLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgIHZlcnRleENvdW50Kys7CisKKyAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKG9jdE9mZnNldCAqIGhhbGZXaWR0aCwgLWhhbGZXaWR0aCk7CisgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMob2N0T2Zmc2V0LCAtMSwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMihoYWxmV2lkdGgsIC1vY3RPZmZzZXQgKiBoYWxmV2lkdGgpOworICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKDEsIC1vY3RPZmZzZXQsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgdmVydGV4Q291bnQrKzsKKworICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIoaGFsZldpZHRoLCBvY3RPZmZzZXQgKiBoYWxmV2lkdGgpOworICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKDEsIG9jdE9mZnNldCwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMihvY3RPZmZzZXQgKiBoYWxmV2lkdGgsIGhhbGZXaWR0aCk7CisgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMob2N0T2Zmc2V0LCAxLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgIHZlcnRleENvdW50Kys7CisKKyAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKC1vY3RPZmZzZXQgKiBoYWxmV2lkdGgsIGhhbGZXaWR0aCk7CisgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoLW9jdE9mZnNldCwgMSwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMigtaGFsZldpZHRoLCBvY3RPZmZzZXQgKiBoYWxmV2lkdGgpOworICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKC0xLCBvY3RPZmZzZXQsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgdmVydGV4Q291bnQrKzsKKworICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIoLWhhbGZXaWR0aCwgLW9jdE9mZnNldCAqIGhhbGZXaWR0aCk7CisgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoLTEsIC1vY3RPZmZzZXQsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgdmVydGV4Q291bnQrKzsKKworICAgIGlmIChpc1N0cm9rZWQpIHsKKyAgICAgICAgLy8gY29tcHV0ZSB0aGUgaW5uZXIgcmluZworCisgICAgICAgIC8vIGNvc2luZSBhbmQgc2luZSBvZiBwaS84CisgICAgICAgIGZsb2F0IGMgPSAwLjkyMzU3OTUzM2Y7CisgICAgICAgIGZsb2F0IHMgPSAwLjM4MjY4MzQzMmY7CisgICAgICAgIGZsb2F0IHIgPSBhcmdzLmZJbm5lclJhZGl1czsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKC1zICogciwgLWMgKiByKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKC1zICogaW5uZXJSYWRpdXMsIC1jICogaW5uZXJSYWRpdXMsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMihzICogciwgLWMgKiByKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKHMgKiBpbm5lclJhZGl1cywgLWMgKiBpbm5lclJhZGl1cywgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKGMgKiByLCAtcyAqIHIpOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoYyAqIGlubmVyUmFkaXVzLCAtcyAqIGlubmVyUmFkaXVzLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIoYyAqIHIsIHMgKiByKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKGMgKiBpbm5lclJhZGl1cywgcyAqIGlubmVyUmFkaXVzLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIocyAqIHIsIGMgKiByKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKHMgKiBpbm5lclJhZGl1cywgYyAqIGlubmVyUmFkaXVzLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIoLXMgKiByLCBjICogcik7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygtcyAqIGlubmVyUmFkaXVzLCBjICogaW5uZXJSYWRpdXMsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMigtYyAqIHIsIHMgKiByKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKC1jICogaW5uZXJSYWRpdXMsIHMgKiBpbm5lclJhZGl1cywgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKC1jICogciwgLXMgKiByKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKC1jICogaW5uZXJSYWRpdXMsIC1zICogaW5uZXJSYWRpdXMsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZmlsbGVkCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlcjsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKDAsIDAsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWxsSW5SUmVjdFZlcnRzKGNvbnN0IEdlb21ldHJ5JiBhcmdzLCBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiYgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzQ+JiBzaGFkb3dDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMz4mIHNoYWRvd1BhcmFtcykgeworICAgIHZlYzQgY29sb3IgPSBhcmdzLmZDb2xvcjsKKyAgICBmbG9hdCBvdXRlclJhZGl1cyA9IGFyZ3MuZk91dGVyUmFkaXVzOworCisgICAgY29uc3QgRmxvYXRSZWN0JiBib3VuZHMgPSBhcmdzLmZEZXZCb3VuZHM7CisKKyAgICBmbG9hdCB1bWJyYUluc2V0ID0gYXJncy5mVW1icmFJbnNldDsKKyAgICBmbG9hdCBtaW5EaW0gPSAwLjVmICogc3RkOjptaW4oYm91bmRzLmdldFdpZHRoKCksIGJvdW5kcy5nZXRIZWlnaHQoKSk7CisgICAgaWYgKHVtYnJhSW5zZXQgPiBtaW5EaW0pIHsKKyAgICAgICAgdW1icmFJbnNldCA9IG1pbkRpbTsKKyAgICB9CisKKyAgICBmbG9hdCB4SW5uZXJbNF0gPSB7Ym91bmRzLmxlZnQgKyB1bWJyYUluc2V0LCBib3VuZHMucmlnaHQgLSB1bWJyYUluc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMubGVmdCArIHVtYnJhSW5zZXQsIGJvdW5kcy5yaWdodCAtIHVtYnJhSW5zZXR9OworICAgIGZsb2F0IHhNaWRbNF0gPSB7Ym91bmRzLmxlZnQgKyBvdXRlclJhZGl1cywgYm91bmRzLnJpZ2h0IC0gb3V0ZXJSYWRpdXMsCisgICAgICAgICAgICAgICAgICAgICBib3VuZHMubGVmdCArIG91dGVyUmFkaXVzLCBib3VuZHMucmlnaHQgLSBvdXRlclJhZGl1c307CisgICAgZmxvYXQgeE91dGVyWzRdID0ge2JvdW5kcy5sZWZ0LCBib3VuZHMucmlnaHQsIGJvdW5kcy5sZWZ0LCBib3VuZHMucmlnaHR9OworICAgIGZsb2F0IHlJbm5lcls0XSA9IHtib3VuZHMudG9wICsgdW1icmFJbnNldCwgYm91bmRzLnRvcCArIHVtYnJhSW5zZXQsIGJvdW5kcy5ib3R0b20gLSB1bWJyYUluc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tIC0gdW1icmFJbnNldH07CisgICAgZmxvYXQgeU1pZFs0XSA9IHtib3VuZHMudG9wICsgb3V0ZXJSYWRpdXMsIGJvdW5kcy50b3AgKyBvdXRlclJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gLSBvdXRlclJhZGl1cywgYm91bmRzLmJvdHRvbSAtIG91dGVyUmFkaXVzfTsKKyAgICBmbG9hdCB5T3V0ZXJbNF0gPSB7Ym91bmRzLnRvcCwgYm91bmRzLnRvcCwgYm91bmRzLmJvdHRvbSwgYm91bmRzLmJvdHRvbX07CisKKyAgICBmbG9hdCBibHVyUmFkaXVzID0gYXJncy5mQmx1clJhZGl1czsKKworICAgIC8vIEluIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgdG8gaW5zZXQgbW9yZSBmb3IgdGhlIHVtYnJhLCBvdXIgdHdvIHRyaWFuZ2xlcyBpbiB0aGUKKyAgICAvLyBjb3JuZXIgZ2V0IHNrZXdlZCB0byBhIGRpYW1vbmQgcmF0aGVyIHRoYW4gYSBzcXVhcmUuIFRvIGNvcnJlY3QgZm9yIHRoYXQsCisgICAgLy8gd2UgYWxzbyBza2V3IHRoZSB2ZWN0b3JzIHdlIHNlbmQgdG8gdGhlIHNoYWRlciB0aGF0IGhlbHAgZGVmaW5lIHRoZSBjaXJjbGUuCisgICAgLy8gQnkgZG9pbmcgc28sIHdlIGVuZCB1cCB3aXRoIGEgcXVhcnRlciBjaXJjbGUgaW4gdGhlIGNvcm5lciByYXRoZXIgdGhhbiB0aGUKKyAgICAvLyBlbGxpcHRpY2FsIGN1cnZlLgorCisgICAgLy8gVGhpcyBpcyBhIGJpdCBtYWdpY2FsLCBidXQgaXQgZ2l2ZXMgdXMgdGhlIGNvcnJlY3QgcmVzdWx0cyBhdCBleHRyZW1hOgorICAgIC8vICAgYSkgdW1icmFJbnNldCA9PSBvdXRlclJhZGl1cyBwcm9kdWNlcyBhbiBvcnRob2dvbmFsIHZlY3RvcgorICAgIC8vICAgYikgb3V0ZXJSYWRpdXMgPT0gMCBwcm9kdWNlcyBhIGRpYWdvbmFsIHZlY3RvcgorICAgIC8vIEFuZCB2aXN1YWxseSB0aGUgY29ybmVyIGxvb2tzIGNvcnJlY3QuCisgICAgdmVjMiBvdXRlclZlYyA9IHZlYzIob3V0ZXJSYWRpdXMgLSB1bWJyYUluc2V0LCAtb3V0ZXJSYWRpdXMgLSB1bWJyYUluc2V0KTsKKyAgICBvdXRlclZlYyA9IG5vcm1hbGl6ZShvdXRlclZlYyk7CisgICAgLy8gV2Ugd2FudCB0aGUgY2lyY2xlIGVkZ2UgdG8gZmFsbCBmcmFjdGlvbmFsbHkgYWxvbmcgdGhlIGRpYWdvbmFsIGF0CisgICAgLy8gICAgICAoc3FydCgyKSoodW1icmFJbnNldCAtIG91dGVyUmFkaXVzKSArIG91dGVyUmFkaXVzKS9zcXJ0KDIpKnVtYnJhSW5zZXQKKyAgICAvLworICAgIC8vIFNldHRpbmcgdGhlIGNvbXBvbmVudHMgb2YgdGhlIGRpYWdvbmFsIG9mZnNldCB0byB0aGUgZm9sbG93aW5nIHZhbHVlIHdpbGwgZ2l2ZSB1cyB0aGF0LgorICAgIGZsb2F0IGRpYWdWYWwgPSB1bWJyYUluc2V0IC8gKFNLX1NjYWxhclNxcnQyICogKG91dGVyUmFkaXVzIC0gdW1icmFJbnNldCkgLSBvdXRlclJhZGl1cyk7CisgICAgdmVjMiBkaWFnVmVjID0gdmVjMihkaWFnVmFsLCBkaWFnVmFsKTsKKyAgICBmbG9hdCBkaXN0YW5jZUNvcnJlY3Rpb24gPSB1bWJyYUluc2V0IC8gYmx1clJhZGl1czsKKworICAgIGludCB2ZXJ0ZXhDb3VudCA9IDA7CisgICAgLy8gYnVpbGQgY29ybmVyIGJ5IGNvcm5lcgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIC8vIGlubmVyIHBvaW50CisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IHZlYzIoeElubmVyW2ldLCB5SW5uZXJbaV0pOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoMCwgMCwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICAvLyBvdXRlciBwb2ludHMKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gdmVjMih4T3V0ZXJbaV0sIHlJbm5lcltpXSk7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygwLCAtMSwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSB2ZWMyKHhPdXRlcltpXSwgeU1pZFtpXSk7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMyhvdXRlclZlYy54LCBvdXRlclZlYy55LCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IHZlYzIoeE91dGVyW2ldLCB5T3V0ZXJbaV0pOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoZGlhZ1ZlYy54LCBkaWFnVmVjLnksIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gdmVjMih4TWlkW2ldLCB5T3V0ZXJbaV0pOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMob3V0ZXJWZWMueCwgb3V0ZXJWZWMueSwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSB2ZWMyKHhJbm5lcltpXSwgeU91dGVyW2ldKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKDAsIC0xLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgYWRkaXRpb25hbCB2ZXJ0aWNlcyBmb3Igb3ZlcnN0cm9rZWQgcnJlY3RzLgorICAgIC8vIEVmZmVjdGl2ZWx5IHRoaXMgaXMgYW4gYWRkaXRpb25hbCBzdHJva2VkIHJyZWN0LCB3aXRoIGl0cworICAgIC8vIHBhcmFtZXRlcnMgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGNlbnRlciBvZiB0aGUgOS1wYXRjaC4gVGhpcyB3aWxsCisgICAgLy8gZ2l2ZSBjb25zdGFudCB2YWx1ZXMgYWNyb3NzIHRoaXMgaW5uZXIgcmluZy4KKyAgICBpZiAoa092ZXJzdHJva2VfUlJlY3RUeXBlID09IGFyZ3MuZlR5cGUpIHsKKyAgICAgICAgZmxvYXQgaW5zZXQgPSB1bWJyYUluc2V0ICsgYXJncy5mSW5uZXJSYWRpdXM7CisKKyAgICAgICAgLy8gVEwKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gdmVjMihib3VuZHMubGVmdCArIGluc2V0LCBib3VuZHMudG9wICsgaW5zZXQpOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoMCwgMCwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICAvLyBUUgorICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSB2ZWMyKGJvdW5kcy5yaWdodCAtIGluc2V0LCBib3VuZHMudG9wICsgaW5zZXQpOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoMCwgMCwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICAvLyBCTAorICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSB2ZWMyKGJvdW5kcy5sZWZ0ICsgaW5zZXQsIGJvdW5kcy5ib3R0b20gLSBpbnNldCk7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygwLCAwLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgICAgIC8vIEJSCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IHZlYzIoYm91bmRzLnJpZ2h0IC0gaW5zZXQsIGJvdW5kcy5ib3R0b20gLSBpbnNldCk7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygwLCAwLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworICAgIH0KK30KKworaW50IGdldFZlcnRleENvdW50Rm9yR2VvbWV0cnkoY29uc3QgR2VvbWV0cnkmIHNoYWRvd0dlb21ldHJ5KSB7CisgICAgaWYgKHNoYWRvd0dlb21ldHJ5LmZJc0NpcmNsZSkgeworICAgICAgICByZXR1cm4gY2lyY2xlX3R5cGVfdG9fdmVydF9jb3VudChzaGFkb3dHZW9tZXRyeS5mVHlwZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJyZWN0X3R5cGVfdG9fdmVydF9jb3VudChzaGFkb3dHZW9tZXRyeS5mVHlwZSk7Cit9CisKK2ludCBnZXRJbmRleENvdW50Rm9yR2VvbWV0cnkoY29uc3QgR2VvbWV0cnkmIHNoYWRvd0dlb21ldHJ5KSB7CisgICAgaWYgKHNoYWRvd0dlb21ldHJ5LmZJc0NpcmNsZSkgeworICAgICAgICByZXR1cm4gY2lyY2xlX3R5cGVfdG9faW5kZXhfY291bnQoa1N0cm9rZV9SUmVjdFR5cGUgPT0gc2hhZG93R2VvbWV0cnkuZlR5cGUpOworICAgIH0KKworICAgIHJldHVybiBycmVjdF90eXBlX3RvX2luZGV4X2NvdW50KHNoYWRvd0dlb21ldHJ5LmZUeXBlKTsKK30KKwordm9pZCBmaWxsVmVydGljZXNGb3JHZW9tZXRyeShjb25zdCBHZW9tZXRyeSYgc2hhZG93R2VvbWV0cnksIGludCAvKiB2ZXJ0ZXhDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMj4gcG9zaXRpb24sIE1lc2g6OlZlcnRleEFycmF5PHZlYzQ+IHNoYWRvd0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMzPiBzaGFkb3dQYXJhbXMpIHsKKyAgICBpZiAoc2hhZG93R2VvbWV0cnkuZklzQ2lyY2xlKSB7CisgICAgICAgIGZpbGxJbkNpcmNsZVZlcnRzKHNoYWRvd0dlb21ldHJ5LCBzaGFkb3dHZW9tZXRyeS5mSXNTdHJva2VkLCBwb3NpdGlvbiwgc2hhZG93Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1BhcmFtcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEluUlJlY3RWZXJ0cyhzaGFkb3dHZW9tZXRyeSwgcG9zaXRpb24sIHNoYWRvd0NvbG9yLCBzaGFkb3dQYXJhbXMpOworICAgIH0KK30KKwordm9pZCBmaWxsSW5kaWNlc0Zvckdlb21ldHJ5KGNvbnN0IEdlb21ldHJ5JiBzaGFkb3dHZW9tZXRyeSwgaW50IGluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0aW5nVmVydGV4T2Zmc2V0LCB1aW50MTZfdCogaW5kaWNlcykgeworICAgIGlmIChzaGFkb3dHZW9tZXRyeS5mSXNDaXJjbGUpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QqIHByaW1JbmRpY2VzID0gY2lyY2xlX3R5cGVfdG9faW5kaWNlcyhzaGFkb3dHZW9tZXRyeS5mSXNTdHJva2VkKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGluZGljZXNbaV0gPSBwcmltSW5kaWNlc1tpXSArIHN0YXJ0aW5nVmVydGV4T2Zmc2V0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QqIHByaW1JbmRpY2VzID0gcnJlY3RfdHlwZV90b19pbmRpY2VzKHNoYWRvd0dlb21ldHJ5LmZUeXBlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGluZGljZXNbaV0gPSBwcmltSW5kaWNlc1tpXSArIHN0YXJ0aW5nVmVydGV4T2Zmc2V0OworICAgICAgICB9CisgICAgfQorfQorCitpbmxpbmUgdm9pZCBHZXRTcG90UGFyYW1zKGZsb2F0IG9jY2x1ZGVyWiwgZmxvYXQgbGlnaHRYLCBmbG9hdCBsaWdodFksIGZsb2F0IGxpZ2h0WiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGlnaHRSYWRpdXMsIGZsb2F0JiBibHVyUmFkaXVzLCBmbG9hdCYgc2NhbGUsIHZlYzImIHRyYW5zbGF0ZSkgeworICAgIGZsb2F0IHpSYXRpbyA9IGRpdmlkZV9hbmRfcGluKG9jY2x1ZGVyWiwgbGlnaHRaIC0gb2NjbHVkZXJaLCAwLjBmLCAwLjk1Zik7CisgICAgYmx1clJhZGl1cyA9IGxpZ2h0UmFkaXVzICogelJhdGlvOworICAgIHNjYWxlID0gZGl2aWRlX2FuZF9waW4obGlnaHRaLCBsaWdodFogLSBvY2NsdWRlclosIDEuMGYsIDEuOTVmKTsKKyAgICB0cmFuc2xhdGUueCA9IC16UmF0aW8gKiBsaWdodFg7CisgICAgdHJhbnNsYXRlLnkgPSAtelJhdGlvICogbGlnaHRZOworfQorCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEdlb21ldHJ5PiBnZXRTaGFkb3dHZW9tZXRyeShjb25zdCB2ZWM0JiBjb2xvciwgY29uc3QgRmxvYXRSZWN0JiBkZXZSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGV2UmFkaXVzLCBmbG9hdCBibHVyUmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaW5zZXRXaWR0aCkgeworICAgIC8vIEFuIGluc2V0V2lkdGggPiAxLzIgcmVjdCB3aWR0aCBvciBoZWlnaHQgaW5kaWNhdGVzIGEgc2ltcGxlIGZpbGwuCisgICAgY29uc3QgYm9vbCBpc0NpcmNsZSA9ICgoZGV2UmFkaXVzID49IGRldlJlY3QuZ2V0V2lkdGgoKSkgJiYgKGRldlJhZGl1cyA+PSBkZXZSZWN0LmdldEhlaWdodCgpKSk7CisKKyAgICBGbG9hdFJlY3QgYm91bmRzID0gZGV2UmVjdDsKKyAgICBmbG9hdCBpbm5lclJhZGl1cyA9IDAuMGY7CisgICAgZmxvYXQgb3V0ZXJSYWRpdXMgPSBkZXZSYWRpdXM7CisgICAgZmxvYXQgdW1icmFJbnNldDsKKworICAgIFJSZWN0VHlwZSB0eXBlID0ga0ZpbGxfUlJlY3RUeXBlOworICAgIGlmIChpc0NpcmNsZSkgeworICAgICAgICB1bWJyYUluc2V0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICB1bWJyYUluc2V0ID0gc3RkOjptYXgob3V0ZXJSYWRpdXMsIGJsdXJSYWRpdXMpOworICAgIH0KKworICAgIC8vIElmIHN0cm9rZSBpcyBncmVhdGVyIHRoYW4gd2lkdGggb3IgaGVpZ2h0LCB0aGlzIGlzIHN0aWxsIGEgZmlsbCwKKyAgICAvLyBvdGhlcndpc2Ugd2UgY29tcHV0ZSBzdHJva2UgcGFyYW1zLgorICAgIGlmIChpc0NpcmNsZSkgeworICAgICAgICBpbm5lclJhZGl1cyA9IGRldlJhZGl1cyAtIGluc2V0V2lkdGg7CisgICAgICAgIHR5cGUgPSBpbm5lclJhZGl1cyA+IDAgPyBrU3Ryb2tlX1JSZWN0VHlwZSA6IGtGaWxsX1JSZWN0VHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW5zZXRXaWR0aCA8PSAwLjVmICogc3RkOjptaW4oZGV2UmVjdC5nZXRXaWR0aCgpLCBkZXZSZWN0LmdldEhlaWdodCgpKSkgeworICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd29ycnkgYWJvdXQgYSByZWFsIGlubmVyIHJhZGl1cywgd2UganVzdCBuZWVkIHRvIGtub3cgaWYgd2UKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gY3JlYXRlIG92ZXJzdHJva2UgdmVydGljZXMuCisgICAgICAgICAgICBpbm5lclJhZGl1cyA9IHN0ZDo6bWF4KGluc2V0V2lkdGggLSB1bWJyYUluc2V0LCAwLjBmKTsKKyAgICAgICAgICAgIHR5cGUgPSBpbm5lclJhZGl1cyA+IDAgPyBrT3ZlcnN0cm9rZV9SUmVjdFR5cGUgOiBrU3Ryb2tlX1JSZWN0VHlwZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBib29sIGlzU3Ryb2tlZCA9IChrU3Ryb2tlX1JSZWN0VHlwZSA9PSB0eXBlKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxHZW9tZXRyeT4oR2VvbWV0cnl7Y29sb3IsIG91dGVyUmFkaXVzLCB1bWJyYUluc2V0LCBpbm5lclJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1clJhZGl1cywgYm91bmRzLCB0eXBlLCBpc0NpcmNsZSwgaXNTdHJva2VkfSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxHZW9tZXRyeT4gZ2V0QW1iaWVudFNoYWRvd0dlb21ldHJ5KGNvbnN0IEZsb2F0UmVjdCYgY2FzdGVyUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNhc3RlckNvcm5lclJhZGl1cywgZmxvYXQgY2FzdGVyWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzdGVySXNUcmFuc2x1Y2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlYzQmIGFtYmllbnRDb2xvcikgeworICAgIGZsb2F0IGRldlNwYWNlSW5zZXRXaWR0aCA9IEFtYmllbnRCbHVyUmFkaXVzKGNhc3RlclopOworICAgIGNvbnN0IGZsb2F0IHVtYnJhUmVjaXBBbHBoYSA9IEFtYmllbnRSZWNpcEFscGhhKGNhc3RlclopOworICAgIGNvbnN0IGZsb2F0IGRldlNwYWNlQW1iaWVudEJsdXIgPSBkZXZTcGFjZUluc2V0V2lkdGggKiB1bWJyYVJlY2lwQWxwaGE7CisKKyAgICAvLyBPdXRzZXQgdGhlIHNoYWRvdyBycmVjdCB0byB0aGUgYm9yZGVyIG9mIHRoZSBwZW51bWJyYQorICAgIGZsb2F0IGFtYmllbnRQYXRoT3V0c2V0ID0gZGV2U3BhY2VJbnNldFdpZHRoOworICAgIEZsb2F0UmVjdCBvdXRzZXRSZWN0KGNhc3RlclJlY3QpOworICAgIG91dHNldFJlY3QubGVmdCAtPSBhbWJpZW50UGF0aE91dHNldDsKKyAgICBvdXRzZXRSZWN0LnRvcCAtPSBhbWJpZW50UGF0aE91dHNldDsKKyAgICBvdXRzZXRSZWN0LnJpZ2h0ICs9IGFtYmllbnRQYXRoT3V0c2V0OworICAgIG91dHNldFJlY3QuYm90dG9tICs9IGFtYmllbnRQYXRoT3V0c2V0OworCisgICAgZmxvYXQgb3V0c2V0UmFkID0gY2FzdGVyQ29ybmVyUmFkaXVzICsgYW1iaWVudFBhdGhPdXRzZXQ7CisgICAgaWYgKGNhc3RlcklzVHJhbnNsdWNlbnQpIHsKKyAgICAgICAgLy8gc2V0IGEgbGFyZ2UgaW5zZXQgdG8gZm9yY2UgYSBmaWxsCisgICAgICAgIGRldlNwYWNlSW5zZXRXaWR0aCA9IG91dHNldFJlY3QuZ2V0V2lkdGgoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZ2V0U2hhZG93R2VvbWV0cnkoYW1iaWVudENvbG9yLCBvdXRzZXRSZWN0LCBzdGQ6OmFicyhvdXRzZXRSYWQpLCBkZXZTcGFjZUFtYmllbnRCbHVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFicyhkZXZTcGFjZUluc2V0V2lkdGgpKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPEdlb21ldHJ5PiBnZXRTcG90U2hhZG93R2VvbWV0cnkoY29uc3QgRmxvYXRSZWN0JiBjYXN0ZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FzdGVyQ29ybmVyUmFkaXVzLCBmbG9hdCBjYXN0ZXJaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXN0ZXJJc1RyYW5zbHVjZW50LCBjb25zdCB2ZWM0JiBzcG90Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWMzJiBsaWdodFBvc2l0aW9uLCBmbG9hdCBsaWdodFJhZGl1cykgeworICAgIGZsb2F0IGRldlNwYWNlU3BvdEJsdXI7CisgICAgZmxvYXQgc3BvdFNjYWxlOworICAgIHZlYzIgc3BvdE9mZnNldDsKKyAgICBHZXRTcG90UGFyYW1zKGNhc3RlclosIGxpZ2h0UG9zaXRpb24ueCwgbGlnaHRQb3NpdGlvbi55LCBsaWdodFBvc2l0aW9uLnosIGxpZ2h0UmFkaXVzLAorICAgICAgICAgICAgICAgICAgZGV2U3BhY2VTcG90Qmx1ciwgc3BvdFNjYWxlLCBzcG90T2Zmc2V0KTsKKyAgICAvLyBoYW5kbGUgc2NhbGUgb2YgcmFkaXVzIGR1ZSB0byBDVE0KKyAgICBjb25zdCBmbG9hdCBzcmNTcGFjZVNwb3RCbHVyID0gZGV2U3BhY2VTcG90Qmx1cjsKKworICAgIC8vIEFkanVzdCB0cmFuc2xhdGUgZm9yIHRoZSBlZmZlY3Qgb2YgdGhlIHNjYWxlLgorICAgIHNwb3RPZmZzZXQueCArPSBzcG90U2NhbGU7CisgICAgc3BvdE9mZnNldC55ICs9IHNwb3RTY2FsZTsKKworICAgIC8vIENvbXB1dGUgdGhlIHRyYW5zZm9ybWVkIHNoYWRvdyByZWN0CisgICAgdWk6OlRyYW5zZm9ybSBzaGFkb3dUcmFuc2Zvcm07CisgICAgc2hhZG93VHJhbnNmb3JtLnNldChzcG90T2Zmc2V0LngsIHNwb3RPZmZzZXQueSk7CisgICAgc2hhZG93VHJhbnNmb3JtLnNldChzcG90U2NhbGUsIDAsIDAsIHNwb3RTY2FsZSk7CisgICAgRmxvYXRSZWN0IHNwb3RTaGFkb3dSZWN0ID0gc2hhZG93VHJhbnNmb3JtLnRyYW5zZm9ybShjYXN0ZXJSZWN0KTsKKyAgICBmbG9hdCBzcG90U2hhZG93UmFkaXVzID0gY2FzdGVyQ29ybmVyUmFkaXVzICogc3BvdFNjYWxlOworCisgICAgLy8gQ29tcHV0ZSB0aGUgaW5zZXRXaWR0aAorICAgIGZsb2F0IGJsdXJPdXRzZXQgPSBzcmNTcGFjZVNwb3RCbHVyOworICAgIGZsb2F0IGluc2V0V2lkdGggPSBibHVyT3V0c2V0OworICAgIGlmIChjYXN0ZXJJc1RyYW5zbHVjZW50KSB7CisgICAgICAgIC8vIElmIHRyYW5zcGFyZW50LCBqdXN0IGRvIGEgZmlsbAorICAgICAgICBpbnNldFdpZHRoICs9IHNwb3RTaGFkb3dSZWN0LmdldFdpZHRoKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRm9yIHNoYWRvd3MsIGluc3RlYWQgb2YgdXNpbmcgYSBzdHJva2Ugd2Ugc3BlY2lmeSBhbiBpbnNldCBmcm9tIHRoZSBwZW51bWJyYQorICAgICAgICAvLyBib3JkZXIuIFdlIHdhbnQgdG8gZXh0ZW5kIHRoaXMgaW5zZXQgYXJlYSBzbyB0aGF0IGl0IG1lZXRzIHVwIHdpdGggdGhlIGNhc3RlcgorICAgICAgICAvLyBnZW9tZXRyeS4gVGhlIGluc2V0IGdlb21ldHJ5IHdpbGwgYnkgZGVmYXVsdCBhbHJlYWR5IGJlIGluc2V0IGJ5IHRoZSBibHVyIHdpZHRoLgorICAgICAgICAvLworICAgICAgICAvLyBXZSBjb21wYXJlIHRoZSBtaW4gYW5kIG1heCBjb3JuZXJzIGluc2V0IGJ5IHRoZSByYWRpdXMgYmV0d2VlbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgLy8gcnJlY3QgYW5kIHRoZSBzaGFkb3cgcnJlY3QuIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcGx1cyB0aGUgZGlmZmVyZW5jZQorICAgICAgICAvLyBiZXR3ZWVuIHRoZSBzY2FsZWQgcmFkaXVzIGFuZCB0aGUgb3JpZ2luYWwgcmFkaXVzIGdpdmVzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZQorICAgICAgICAvLyB0cmFuc2Zvcm1lZCBzaGFkb3cgc2hhcGUgdG8gdGhlIG9yaWdpbmFsIHNoYXBlIGluIHRoYXQgY29ybmVyLiBUaGUgbWF4CisgICAgICAgIC8vIG9mIHRoZXNlIGdpdmVzIHRoZSBtYXhpbXVtIGRpc3RhbmNlIHdlIG5lZWQgdG8gY292ZXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBvdXRzZXR0aW5nIGJ5IDEvMiB0aGUgYmx1ciBkaXN0YW5jZSwgd2UganVzdCBhZGQgdGhlIG1heE9mZnNldCB0bworICAgICAgICAvLyB0aGF0IHRvIGdldCB0aGUgZnVsbCBpbnNldFdpZHRoLgorICAgICAgICBmbG9hdCBtYXhPZmZzZXQ7CisgICAgICAgIGlmIChjYXN0ZXJDb3JuZXJSYWRpdXMgPD0gMC5mKSB7CisgICAgICAgICAgICAvLyBNYW5oYXR0YW4gZGlzdGFuY2Ugd29ya3MgYmV0dGVyIGZvciByZWN0cworICAgICAgICAgICAgbWF4T2Zmc2V0ID0gc3RkOjptYXgoc3RkOjptYXgoc3RkOjphYnMoc3BvdFNoYWRvd1JlY3QubGVmdCAtIGNhc3RlclJlY3QubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFicyhzcG90U2hhZG93UmVjdC50b3AgLSBjYXN0ZXJSZWN0LnRvcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoc3RkOjphYnMoc3BvdFNoYWRvd1JlY3QucmlnaHQgLSBjYXN0ZXJSZWN0LnJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWJzKHNwb3RTaGFkb3dSZWN0LmJvdHRvbSAtIGNhc3RlclJlY3QuYm90dG9tKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvYXQgZHIgPSBzcG90U2hhZG93UmFkaXVzIC0gY2FzdGVyQ29ybmVyUmFkaXVzOworICAgICAgICAgICAgdmVjMiB1cHBlckxlZnRPZmZzZXQgPSB2ZWMyKHNwb3RTaGFkb3dSZWN0LmxlZnQgLSBjYXN0ZXJSZWN0LmxlZnQgKyBkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG90U2hhZG93UmVjdC50b3AgLSBjYXN0ZXJSZWN0LnRvcCArIGRyKTsKKyAgICAgICAgICAgIHZlYzIgbG93ZXJSaWdodE9mZnNldCA9IHZlYzIoc3BvdFNoYWRvd1JlY3QucmlnaHQgLSBjYXN0ZXJSZWN0LnJpZ2h0IC0gZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3RTaGFkb3dSZWN0LmJvdHRvbSAtIGNhc3RlclJlY3QuYm90dG9tIC0gZHIpOworICAgICAgICAgICAgbWF4T2Zmc2V0ID0gc3FydChzdGQ6Om1heChkb3QodXBwZXJMZWZ0T2Zmc2V0LCBsb3dlclJpZ2h0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90KGxvd2VyUmlnaHRPZmZzZXQsIGxvd2VyUmlnaHRPZmZzZXQpKSkgKworICAgICAgICAgICAgICAgICAgICBkcjsKKyAgICAgICAgfQorICAgICAgICBpbnNldFdpZHRoICs9IHN0ZDo6bWF4KGJsdXJPdXRzZXQsIG1heE9mZnNldCk7CisgICAgfQorCisgICAgLy8gT3V0c2V0IHRoZSBzaGFkb3cgcnJlY3QgdG8gdGhlIGJvcmRlciBvZiB0aGUgcGVudW1icmEKKyAgICBzcG90U2hhZG93UmFkaXVzICs9IGJsdXJPdXRzZXQ7CisgICAgc3BvdFNoYWRvd1JlY3QubGVmdCAtPSBibHVyT3V0c2V0OworICAgIHNwb3RTaGFkb3dSZWN0LnRvcCAtPSBibHVyT3V0c2V0OworICAgIHNwb3RTaGFkb3dSZWN0LnJpZ2h0ICs9IGJsdXJPdXRzZXQ7CisgICAgc3BvdFNoYWRvd1JlY3QuYm90dG9tICs9IGJsdXJPdXRzZXQ7CisKKyAgICByZXR1cm4gZ2V0U2hhZG93R2VvbWV0cnkoc3BvdENvbG9yLCBzcG90U2hhZG93UmVjdCwgc3RkOjphYnMoc3BvdFNoYWRvd1JhZGl1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMGYgKiBkZXZTcGFjZVNwb3RCbHVyLCBzdGQ6OmFicyhpbnNldFdpZHRoKSk7Cit9CisKK3ZvaWQgZmlsbFNoYWRvd1RleHR1cmVEYXRhKHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaGFkb3dUZXh0dXJlV2lkdGgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoYWRvd1RleHR1cmVXaWR0aDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IGQgPSAxIC0gaSAvICgoc2hhZG93VGV4dHVyZVdpZHRoICogMS4wZikgLSAxLjBmKTsKKyAgICAgICAgZGF0YVtpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChleHAoLTQuMGYgKiBkICogZCkgLSAwLjAxOGYpICogMjU1KTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNraWFTaGFkb3dQb3J0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTa2lhU2hhZG93UG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMmM4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTa2lhU2hhZG93UG9ydC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWF0aC92ZWM0Lmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL01lc2guaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworLyoqCisgKiBUaGUgc2hhZG93IGdlb21ldHJ5IGxvZ2ljIGFuZCB2ZXJ0ZXggZ2VuZXJhdGlvbiBjb2RlIGhhcyBiZWVuIHBvcnRlZCBmcm9tIHNraWEgc2hhZG93CisgKiBmYXN0IHBhdGggT3BlbkdMIGltcGxlbWVudGF0aW9uIHRvIGRyYXcgc2hhZG93cyBhcm91bmQgcmVjdHMgYW5kIHJvdW5kZWQgcmVjdHMgaW5jbHVkaW5nCisgKiBjaXJjbGVzLgorICoKKyAqIHBhdGg6IHNraWEvc3JjL2dwdS9HclJlbmRlclRhcmdldENvbnRleHQuY3BwIEdyUmVuZGVyVGFyZ2V0Q29udGV4dDo6ZHJhd0Zhc3RTaGFkb3cKKyAqCisgKiBNb2RpZmljYXRpb25zIG1hZGU6CisgKiAtIFN3aXRjaGVkIHRvIHVzaW5nIHN0ZCBsaWIgbWF0aCBmdW5jdGlvbnMKKyAqIC0gRmFsbCBvZmYgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdmVydGV4IHNoYWRlciByYXRoZXIgdGhhbiBhIHNoYWRvdyB0ZXh0dXJlCisgKiAtIFJlbW92ZWQgdHJhbnNmb3JtYXRpb25zIGFwcGxpZWQgb24gdGhlIGNhc3RlciByZWN0IHNpbmNlIHRoZSBjYXN0ZXIgd2lsbCBiZSBpbiBsb2NhbAorICogICBjb29yZGluYXRlIHNwYWNlIGFuZCB3aWxsIGJlIHRyYW5zZm9ybWVkIGJ5IHRoZSB2ZXJ0ZXggc2hhZGVyLgorICovCisKK2VudW0gUlJlY3RUeXBlIHsKKyAgICBrRmlsbF9SUmVjdFR5cGUsCisgICAga1N0cm9rZV9SUmVjdFR5cGUsCisgICAga092ZXJzdHJva2VfUlJlY3RUeXBlLAorfTsKKworc3RydWN0IEdlb21ldHJ5IHsKKyAgICB2ZWM0IGZDb2xvcjsKKyAgICBmbG9hdCBmT3V0ZXJSYWRpdXM7CisgICAgZmxvYXQgZlVtYnJhSW5zZXQ7CisgICAgZmxvYXQgZklubmVyUmFkaXVzOworICAgIGZsb2F0IGZCbHVyUmFkaXVzOworICAgIEZsb2F0UmVjdCBmRGV2Qm91bmRzOworICAgIFJSZWN0VHlwZSBmVHlwZTsKKyAgICBib29sIGZJc0NpcmNsZTsKKyAgICBib29sIGZJc1N0cm9rZWQ7Cit9OworCitzdGQ6OnVuaXF1ZV9wdHI8R2VvbWV0cnk+IGdldFNwb3RTaGFkb3dHZW9tZXRyeShjb25zdCBGbG9hdFJlY3QmIGNhc3RlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjYXN0ZXJDb3JuZXJSYWRpdXMsIGZsb2F0IGNhc3RlclosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhc3RlcklzVHJhbnNsdWNlbnQsIGNvbnN0IHZlYzQmIHNwb3RDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlYzMmIGxpZ2h0UG9zaXRpb24sIGZsb2F0IGxpZ2h0UmFkaXVzKTsKKworc3RkOjp1bmlxdWVfcHRyPEdlb21ldHJ5PiBnZXRBbWJpZW50U2hhZG93R2VvbWV0cnkoY29uc3QgRmxvYXRSZWN0JiBjYXN0ZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FzdGVyQ29ybmVyUmFkaXVzLCBmbG9hdCBjYXN0ZXJaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXN0ZXJJc1RyYW5zbHVjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjNCYgYW1iaWVudENvbG9yKTsKKworaW50IGdldFZlcnRleENvdW50Rm9yR2VvbWV0cnkoY29uc3QgR2VvbWV0cnkmIHNoYWRvd0dlb21ldHJ5KTsKKworaW50IGdldEluZGV4Q291bnRGb3JHZW9tZXRyeShjb25zdCBHZW9tZXRyeSYgc2hhZG93R2VvbWV0cnkpOworCit2b2lkIGZpbGxWZXJ0aWNlc0Zvckdlb21ldHJ5KGNvbnN0IEdlb21ldHJ5JiBzaGFkb3dHZW9tZXRyeSwgaW50IHZlcnRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiBwb3NpdGlvbiwgTWVzaDo6VmVydGV4QXJyYXk8dmVjND4gc2hhZG93Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzM+IHNoYWRvd1BhcmFtcyk7CisKK3ZvaWQgZmlsbEluZGljZXNGb3JHZW9tZXRyeShjb25zdCBHZW9tZXRyeSYgc2hhZG93R2VvbWV0cnksIGludCBpbmRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGluZ1ZlcnRleE9mZnNldCwgdWludDE2X3QqIGluZGljZXMpOworCisvKioKKyAqIE1hcHMgc2hhZG93IGdlb21ldHJ5ICdhbHBoYScgdmFyeWluZyAoMSBmb3IgZGFya2VzdCwgMCBmb3IgdHJhbnNwYXJlbnQpIHRvCisgKiBkYXJrbmVzcyBhdCB0aGF0IHNwb3QuIFZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSBhbiBleHBvbmVudGlhbCBmYWxsb2ZmCisgKiBmdW5jdGlvbiBwcm92aWRlZCBieSBVWC4KKyAqCisgKiBUaGUgdGV4dHVyZSBpcyB1c2VkIGZvciBxdWljayBsb29rdXAgaW4gdGhlc2hhZG93IHNoYWRlci4KKyAqCisgKiB0ZXh0dXJlRGF0YSAtIGZpbGxlZCB3aXRoIHNoYWRvdyB0ZXh0dXJlIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBhdCBsZWFzdCBvZgorICogICAgICAgICAgICAgICBzaXplIHRleHR1cmVXaWR0aAorICoKKyAqIHRleHR1cmVXaWR0aCAtIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLCBoZWlnaHQgaXMgYWx3YXlzIDEKKyAqLwordm9pZCBmaWxsU2hhZG93VGV4dHVyZURhdGEodWludDhfdCogdGV4dHVyZURhdGEsIHNpemVfdCB0ZXh0dXJlV2lkdGgpOworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xWZXJ0ZXhCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMVmVydGV4QnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBjNDcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMVmVydGV4QnVmZmVyLmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUworCisjaW5jbHVkZSAiR0xWZXJ0ZXhCdWZmZXIuaCIKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK0dMVmVydGV4QnVmZmVyOjpHTFZlcnRleEJ1ZmZlcigpIHsKKyAgICBnbEdlbkJ1ZmZlcnMoMSwgJm1CdWZmZXJOYW1lKTsKK30KKworR0xWZXJ0ZXhCdWZmZXI6On5HTFZlcnRleEJ1ZmZlcigpIHsKKyAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwgJm1CdWZmZXJOYW1lKTsKK30KKwordm9pZCBHTFZlcnRleEJ1ZmZlcjo6YWxsb2NhdGVCdWZmZXJzKGNvbnN0IEdMZmxvYXQgZGF0YVtdLCBjb25zdCBHTHVpbnQgc2l6ZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgYmluZCgpOworICAgIGdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIHNpemUgKiBzaXplb2YoR0xmbG9hdCksIGRhdGEsIEdMX1NUQVRJQ19EUkFXKTsKKyAgICB1bmJpbmQoKTsKK30KKwordm9pZCBHTFZlcnRleEJ1ZmZlcjo6YmluZCgpIGNvbnN0IHsKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQnVmZmVyTmFtZSk7Cit9CisKK3ZvaWQgR0xWZXJ0ZXhCdWZmZXI6OnVuYmluZCgpIGNvbnN0IHsKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAwKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMVmVydGV4QnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xWZXJ0ZXhCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGZkMGMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMVmVydGV4QnVmZmVyLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworc3RydWN0IEFOYXRpdmVXaW5kb3dCdWZmZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworY2xhc3MgR0xFU1JlbmRlckVuZ2luZTsKKworY2xhc3MgR0xWZXJ0ZXhCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEdMVmVydGV4QnVmZmVyKCk7CisgICAgfkdMVmVydGV4QnVmZmVyKCk7CisKKyAgICB2b2lkIGFsbG9jYXRlQnVmZmVycyhjb25zdCBHTGZsb2F0IGRhdGFbXSwgY29uc3QgR0x1aW50IHNpemUpOworICAgIHVpbnQzMl90IGdldEJ1ZmZlck5hbWUoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyTmFtZTsgfQorICAgIHZvaWQgYmluZCgpIGNvbnN0OworICAgIHZvaWQgdW5iaW5kKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUJ1ZmZlck5hbWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvSW1hZ2VNYW5hZ2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9JbWFnZU1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTY2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvSW1hZ2VNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiUmVuZGVyRW5naW5lIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkdMRVNSZW5kZXJFbmdpbmUuaCIKKyNpbmNsdWRlICJJbWFnZU1hbmFnZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitJbWFnZU1hbmFnZXI6OkltYWdlTWFuYWdlcihHTEVTUmVuZGVyRW5naW5lKiBlbmdpbmUpIDogbUVuZ2luZShlbmdpbmUpIHt9CisKK3ZvaWQgSW1hZ2VNYW5hZ2VyOjppbml0VGhyZWFkKCkgeworICAgIG1UaHJlYWQgPSBzdGQ6OnRocmVhZChbdGhpc10oKSB7IHRocmVhZE1haW4oKTsgfSk7CisgICAgcHRocmVhZF9zZXRuYW1lX25wKG1UaHJlYWQubmF0aXZlX2hhbmRsZSgpLCAiSW1hZ2VNYW5hZ2VyIik7CisgICAgLy8gVXNlIFNDSEVEX0ZJRk8gdG8gbWluaW1pemUgaml0dGVyCisgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0gezB9OworICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gMjsKKyAgICBpZiAocHRocmVhZF9zZXRzY2hlZHBhcmFtKG1UaHJlYWQubmF0aXZlX2hhbmRsZSgpLCBTQ0hFRF9GSUZPLCAmcGFyYW0pICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkbid0IHNldCBTQ0hFRF9GSUZPIGZvciBJbWFnZU1hbmFnZXIiKTsKKyAgICB9Cit9CisKK0ltYWdlTWFuYWdlcjo6fkltYWdlTWFuYWdlcigpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIGlmIChtVGhyZWFkLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgbVRocmVhZC5qb2luKCk7CisgICAgfQorfQorCit2b2lkIEltYWdlTWFuYWdlcjo6Y2FjaGVBc3luYyhjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJhcnJpZXI+JiBiYXJyaWVyKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJhcnJpZXItPm11dGV4KTsKKyAgICAgICAgICAgIGJhcnJpZXItPmlzT3BlbiA9IHRydWU7CisgICAgICAgICAgICBiYXJyaWVyLT5yZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYmFycmllci0+Y29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIFF1ZXVlRW50cnkgZW50cnkgPSB7UXVldWVFbnRyeTo6T3BlcmF0aW9uOjpJbnNlcnQsIGJ1ZmZlciwgYnVmZmVyLT5nZXRJZCgpLCBiYXJyaWVyfTsKKyAgICBxdWV1ZU9wZXJhdGlvbihzdGQ6Om1vdmUoZW50cnkpKTsKK30KKworc3RhdHVzX3QgSW1hZ2VNYW5hZ2VyOjpjYWNoZShjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBhdXRvIGJhcnJpZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJhcnJpZXI+KCk7CisgICAgY2FjaGVBc3luYyhidWZmZXIsIGJhcnJpZXIpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJhcnJpZXItPm11dGV4KTsKKyAgICBiYXJyaWVyLT5jb25kaXRpb24ud2FpdChiYXJyaWVyLT5tdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oKSBSRVFVSVJFUyhiYXJyaWVyLT5tdXRleCkgeyByZXR1cm4gYmFycmllci0+aXNPcGVuOyB9KTsKKyAgICByZXR1cm4gYmFycmllci0+cmVzdWx0OworfQorCit2b2lkIEltYWdlTWFuYWdlcjo6cmVsZWFzZUFzeW5jKHVpbnQ2NF90IGJ1ZmZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QmFycmllcj4mIGJhcnJpZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIFF1ZXVlRW50cnkgZW50cnkgPSB7UXVldWVFbnRyeTo6T3BlcmF0aW9uOjpEZWxldGUsIG51bGxwdHIsIGJ1ZmZlcklkLCBiYXJyaWVyfTsKKyAgICBxdWV1ZU9wZXJhdGlvbihzdGQ6Om1vdmUoZW50cnkpKTsKK30KKwordm9pZCBJbWFnZU1hbmFnZXI6OnF1ZXVlT3BlcmF0aW9uKGNvbnN0IFF1ZXVlRW50cnkmJiBlbnRyeSkgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVF1ZXVlLmVtcGxhY2UoZW50cnkpOworICAgICAgICBBVFJBQ0VfSU5UKCJJbWFnZU1hbmFnZXJRdWV1ZURlcHRoIiwgbVF1ZXVlLnNpemUoKSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworfQorCit2b2lkIEltYWdlTWFuYWdlcjo6dGhyZWFkTWFpbigpIHsKKyAgICBzZXRfc2NoZWRfcG9saWN5KDAsIFNQX0ZPUkVHUk9VTkQpOworICAgIGJvb2wgcnVuOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgcnVuID0gbVJ1bm5pbmc7CisgICAgfQorICAgIHdoaWxlIChydW4pIHsKKyAgICAgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKCkgUkVRVUlSRVMobU11dGV4KSB7IHJldHVybiAhbVF1ZXVlLmVtcHR5KCkgfHwgIW1SdW5uaW5nOyB9KTsKKyAgICAgICAgICAgIHJ1biA9IG1SdW5uaW5nOworCisgICAgICAgICAgICBpZiAoIW1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgbVJ1bm5pbmcgaXMgZmFsc2UsIHRoZW4gSW1hZ2VNYW5hZ2VyIGlzIGJlaW5nIGRlc3Ryb3llZCwgc28KKyAgICAgICAgICAgICAgICAvLyBiYWlsIG91dCBub3cuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5ID0gbVF1ZXVlLmZyb250KCk7CisgICAgICAgICAgICBtUXVldWUucG9wKCk7CisgICAgICAgICAgICBBVFJBQ0VfSU5UKCJJbWFnZU1hbmFnZXJRdWV1ZURlcHRoIiwgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19FUlJPUjsKKyAgICAgICAgc3dpdGNoIChlbnRyeS5vcCkgeworICAgICAgICAgICAgY2FzZSBRdWV1ZUVudHJ5OjpPcGVyYXRpb246OkRlbGV0ZToKKyAgICAgICAgICAgICAgICBtRW5naW5lLT51bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXJJbnRlcm5hbChlbnRyeS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFF1ZXVlRW50cnk6Ok9wZXJhdGlvbjo6SW5zZXJ0OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1FbmdpbmUtPmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVySW50ZXJuYWwoZW50cnkuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50cnkuYmFycmllciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGVudHJ5TG9jayhlbnRyeS5iYXJyaWVyLT5tdXRleCk7CisgICAgICAgICAgICAgICAgZW50cnkuYmFycmllci0+cmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgICAgIGVudHJ5LmJhcnJpZXItPmlzT3BlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnRyeS5iYXJyaWVyLT5jb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0QoIlJlYWNoZWQgZW5kIG9mIHRocmVhZE1haW4sIHRlcm1pbmF0aW5nIEltYWdlTWFuYWdlciB0aHJlYWQhIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9JbWFnZU1hbmFnZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9JbWFnZU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTY3ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0ltYWdlTWFuYWdlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitjbGFzcyBHTEVTUmVuZGVyRW5naW5lOworCitjbGFzcyBJbWFnZU1hbmFnZXIgeworcHVibGljOgorICAgIHN0cnVjdCBCYXJyaWVyIHsKKyAgICAgICAgc3RkOjptdXRleCBtdXRleDsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IGNvbmRpdGlvbjsKKyAgICAgICAgYm9vbCBpc09wZW4gR1VBUkRFRF9CWShtdXRleCkgPSBmYWxzZTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0IEdVQVJERURfQlkobXV0ZXgpID0gTk9fRVJST1I7CisgICAgfTsKKyAgICBJbWFnZU1hbmFnZXIoR0xFU1JlbmRlckVuZ2luZSogZW5naW5lKTsKKyAgICB+SW1hZ2VNYW5hZ2VyKCk7CisgICAgLy8gU3RhcnRzIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBmb3IgdGhlIEltYWdlTWFuYWdlcgorICAgIC8vIFdlIG5lZWQgdGhpcyB0byBndWFyYW50ZWUgdGhhdCB0aGUgY2xhc3MgaXMgZnVsbHktY29uc3RydWN0ZWQgYmVmb3JlIHRoZQorICAgIC8vIHRocmVhZCBiZWdpbnMgcnVubmluZy4KKyAgICB2b2lkIGluaXRUaHJlYWQoKTsKKyAgICB2b2lkIGNhY2hlQXN5bmMoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJhcnJpZXI+JiBiYXJyaWVyKQorICAgICAgICAgICAgRVhDTFVERVMobU11dGV4KTsKKyAgICBzdGF0dXNfdCBjYWNoZShjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKTsKKyAgICB2b2lkIHJlbGVhc2VBc3luYyh1aW50NjRfdCBidWZmZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJhcnJpZXI+JiBiYXJyaWVyKSBFWENMVURFUyhtTXV0ZXgpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBRdWV1ZUVudHJ5IHsKKyAgICAgICAgZW51bSBjbGFzcyBPcGVyYXRpb24geyBEZWxldGUsIEluc2VydCB9OworCisgICAgICAgIE9wZXJhdGlvbiBvcCA9IE9wZXJhdGlvbjo6RGVsZXRlOworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIgPSBudWxscHRyOworICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IDA7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCYXJyaWVyPiBiYXJyaWVyID0gbnVsbHB0cjsKKyAgICB9OworCisgICAgdm9pZCBxdWV1ZU9wZXJhdGlvbihjb25zdCBRdWV1ZUVudHJ5JiYgZW50cnkpOworICAgIHZvaWQgdGhyZWFkTWFpbigpOworICAgIEdMRVNSZW5kZXJFbmdpbmUqIGNvbnN0IG1FbmdpbmU7CisgICAgc3RkOjp0aHJlYWQgbVRocmVhZDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkgbUNvbmRpdGlvbjsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OnF1ZXVlPFF1ZXVlRW50cnk+IG1RdWV1ZSBHVUFSREVEX0JZKG1NdXRleCk7CisKKyAgICBib29sIG1SdW5uaW5nIEdVQVJERURfQlkobU11dGV4KSA9IHRydWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmYmYzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9Qcm9ncmFtLmNwcApAQCAtMCwwICsxLDE2MyBAQAorLypHbHVpbnQKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlByb2dyYW0uaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1hdGgvbWF0NC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitQcm9ncmFtOjpQcm9ncmFtKGNvbnN0IFByb2dyYW1DYWNoZTo6S2V5JiAvKm5lZWRzKi8sIGNvbnN0IGNoYXIqIHZlcnRleCwgY29uc3QgY2hhciogZnJhZ21lbnQpCisgICAgICA6IG1Jbml0aWFsaXplZChmYWxzZSkgeworICAgIEdMdWludCB2ZXJ0ZXhJZCA9IGJ1aWxkU2hhZGVyKHZlcnRleCwgR0xfVkVSVEVYX1NIQURFUik7CisgICAgR0x1aW50IGZyYWdtZW50SWQgPSBidWlsZFNoYWRlcihmcmFnbWVudCwgR0xfRlJBR01FTlRfU0hBREVSKTsKKyAgICBHTHVpbnQgcHJvZ3JhbUlkID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbUlkLCB2ZXJ0ZXhJZCk7CisgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbUlkLCBmcmFnbWVudElkKTsKKyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtSWQsIHBvc2l0aW9uLCAicG9zaXRpb24iKTsKKyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtSWQsIHRleENvb3JkcywgInRleENvb3JkcyIpOworICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW1JZCwgY3JvcENvb3JkcywgImNyb3BDb29yZHMiKTsKKyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtSWQsIHNoYWRvd0NvbG9yLCAic2hhZG93Q29sb3IiKTsKKyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtSWQsIHNoYWRvd1BhcmFtcywgInNoYWRvd1BhcmFtcyIpOworICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbUlkKTsKKworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtSWQsIEdMX0xJTktfU1RBVFVTLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHdoaWxlIGxpbmtpbmcgc2hhZGVyczoiKTsKKyAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7CisgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW1JZCwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7CisgICAgICAgIGlmIChpbmZvTGVuID4gMSkgeworICAgICAgICAgICAgR0xjaGFyIGxvZ1tpbmZvTGVuXTsKKyAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbUlkLCBpbmZvTGVuLCAwLCAmbG9nWzBdKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyIsIGxvZyk7CisgICAgICAgIH0KKyAgICAgICAgZ2xEZXRhY2hTaGFkZXIocHJvZ3JhbUlkLCB2ZXJ0ZXhJZCk7CisgICAgICAgIGdsRGV0YWNoU2hhZGVyKHByb2dyYW1JZCwgZnJhZ21lbnRJZCk7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleElkKTsKKyAgICAgICAgZ2xEZWxldGVTaGFkZXIoZnJhZ21lbnRJZCk7CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Qcm9ncmFtID0gcHJvZ3JhbUlkOworICAgICAgICBtVmVydGV4U2hhZGVyID0gdmVydGV4SWQ7CisgICAgICAgIG1GcmFnbWVudFNoYWRlciA9IGZyYWdtZW50SWQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIG1Qcm9qZWN0aW9uTWF0cml4TG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAicHJvamVjdGlvbiIpOworICAgICAgICBtVGV4dHVyZU1hdHJpeExvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW1JZCwgInRleHR1cmUiKTsKKyAgICAgICAgbVNhbXBsZXJMb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtSWQsICJzYW1wbGVyIik7CisgICAgICAgIG1Db2xvckxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW1JZCwgImNvbG9yIik7CisgICAgICAgIG1EaXNwbGF5TWF4THVtaW5hbmNlTG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAiZGlzcGxheU1heEx1bWluYW5jZSIpOworICAgICAgICBtTWF4TWFzdGVyaW5nTHVtaW5hbmNlTG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAibWF4TWFzdGVyaW5nTHVtaW5hbmNlIik7CisgICAgICAgIG1NYXhDb250ZW50THVtaW5hbmNlTG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAibWF4Q29udGVudEx1bWluYW5jZSIpOworICAgICAgICBtSW5wdXRUcmFuc2Zvcm1NYXRyaXhMb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtSWQsICJpbnB1dFRyYW5zZm9ybU1hdHJpeCIpOworICAgICAgICBtT3V0cHV0VHJhbnNmb3JtTWF0cml4TG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAib3V0cHV0VHJhbnNmb3JtTWF0cml4Iik7CisgICAgICAgIG1Db3JuZXJSYWRpdXNMb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtSWQsICJjb3JuZXJSYWRpdXMiKTsKKyAgICAgICAgbUNyb3BDZW50ZXJMb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtSWQsICJjcm9wQ2VudGVyIik7CisKKyAgICAgICAgLy8gc2V0LXVwIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3Igb3VyIHVuaWZvcm1zCisgICAgICAgIGdsVXNlUHJvZ3JhbShwcm9ncmFtSWQpOworICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobVByb2plY3Rpb25NYXRyaXhMb2MsIDEsIEdMX0ZBTFNFLCBtYXQ0KCkuYXNBcnJheSgpKTsKKyAgICAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKTsKKyAgICB9Cit9CisKK2Jvb2wgUHJvZ3JhbTo6aXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRpYWxpemVkOworfQorCit2b2lkIFByb2dyYW06OnVzZSgpIHsKKyAgICBnbFVzZVByb2dyYW0obVByb2dyYW0pOworfQorCitHTHVpbnQgUHJvZ3JhbTo6Z2V0QXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBtYXliZSB1c2UgYSBsb2NhbCBjYWNoZQorICAgIHJldHVybiBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCBuYW1lKTsKK30KKworR0xpbnQgUHJvZ3JhbTo6Z2V0VW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKSBjb25zdCB7CisgICAgLy8gVE9ETzogbWF5YmUgdXNlIGEgbG9jYWwgY2FjaGUKKyAgICByZXR1cm4gZ2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sIG5hbWUpOworfQorCitHTHVpbnQgUHJvZ3JhbTo6YnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSkgeworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcih0eXBlKTsKKyAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZzb3VyY2UsIDApOworICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICAvLyBTb21lIGRyaXZlcnMgcmV0dXJuIHdyb25nIHZhbHVlcyBmb3IgR0xfSU5GT19MT0dfTEVOR1RICisgICAgICAgIC8vIHVzZSBhIGZpeGVkIHNpemUgaW5zdGVhZAorICAgICAgICBHTGNoYXIgbG9nWzUxMl07CisgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIHNpemVvZihsb2cpLCAwLCBsb2cpOworICAgICAgICBBTE9HRSgiRXJyb3Igd2hpbGUgY29tcGlsaW5nIHNoYWRlcjogXG4lc1xuJXMiLCBzb3VyY2UsIGxvZyk7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gc2hhZGVyOworfQorCit2b2lkIFByb2dyYW06OnNldFVuaWZvcm1zKGNvbnN0IERlc2NyaXB0aW9uJiBkZXNjKSB7CisgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGhhdmUgYSBtZWNoYW5pc20gaGVyZSB0byBub3QgYWx3YXlzIHJlc2V0IHVuaWZvcm1zIHRoYXQKKyAgICAvLyBkaWRuJ3QgY2hhbmdlIGZvciB0aGlzIHByb2dyYW0uCisKKyAgICBpZiAobVNhbXBsZXJMb2MgPj0gMCkgeworICAgICAgICBnbFVuaWZvcm0xaShtU2FtcGxlckxvYywgMCk7CisgICAgICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtVGV4dHVyZU1hdHJpeExvYywgMSwgR0xfRkFMU0UsIGRlc2MudGV4dHVyZS5nZXRNYXRyaXgoKS5hc0FycmF5KCkpOworICAgIH0KKyAgICBpZiAobUNvbG9yTG9jID49IDApIHsKKyAgICAgICAgY29uc3QgZmxvYXQgY29sb3JbNF0gPSB7ZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hfTsKKyAgICAgICAgZ2xVbmlmb3JtNGZ2KG1Db2xvckxvYywgMSwgY29sb3IpOworICAgIH0KKyAgICBpZiAobUlucHV0VHJhbnNmb3JtTWF0cml4TG9jID49IDApIHsKKyAgICAgICAgbWF0NCBpbnB1dFRyYW5zZm9ybU1hdHJpeCA9IGRlc2MuaW5wdXRUcmFuc2Zvcm1NYXRyaXg7CisgICAgICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtSW5wdXRUcmFuc2Zvcm1NYXRyaXhMb2MsIDEsIEdMX0ZBTFNFLCBpbnB1dFRyYW5zZm9ybU1hdHJpeC5hc0FycmF5KCkpOworICAgIH0KKyAgICBpZiAobU91dHB1dFRyYW5zZm9ybU1hdHJpeExvYyA+PSAwKSB7CisgICAgICAgIC8vIFRoZSBvdXRwdXQgdHJhbnNmb3JtIG1hdHJpeCBhbmQgY29sb3IgbWF0cml4IGNhbiBiZSBjb21iaW5lZCBhcyBvbmUgbWF0cml4CisgICAgICAgIC8vIHRoYXQgaXMgYXBwbGllZCByaWdodCBiZWZvcmUgYXBwbHlpbmcgT0VURi4KKyAgICAgICAgbWF0NCBvdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBkZXNjLmNvbG9yTWF0cml4ICogZGVzYy5vdXRwdXRUcmFuc2Zvcm1NYXRyaXg7CisgICAgICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtT3V0cHV0VHJhbnNmb3JtTWF0cml4TG9jLCAxLCBHTF9GQUxTRSwgb3V0cHV0VHJhbnNmb3JtTWF0cml4LmFzQXJyYXkoKSk7CisgICAgfQorICAgIGlmIChtRGlzcGxheU1heEx1bWluYW5jZUxvYyA+PSAwKSB7CisgICAgICAgIGdsVW5pZm9ybTFmKG1EaXNwbGF5TWF4THVtaW5hbmNlTG9jLCBkZXNjLmRpc3BsYXlNYXhMdW1pbmFuY2UpOworICAgIH0KKyAgICBpZiAobU1heE1hc3RlcmluZ0x1bWluYW5jZUxvYyA+PSAwKSB7CisgICAgICAgIGdsVW5pZm9ybTFmKG1NYXhNYXN0ZXJpbmdMdW1pbmFuY2VMb2MsIGRlc2MubWF4TWFzdGVyaW5nTHVtaW5hbmNlKTsKKyAgICB9CisgICAgaWYgKG1NYXhDb250ZW50THVtaW5hbmNlTG9jID49IDApIHsKKyAgICAgICAgZ2xVbmlmb3JtMWYobU1heENvbnRlbnRMdW1pbmFuY2VMb2MsIGRlc2MubWF4Q29udGVudEx1bWluYW5jZSk7CisgICAgfQorICAgIGlmIChtQ29ybmVyUmFkaXVzTG9jID49IDApIHsKKyAgICAgICAgZ2xVbmlmb3JtMWYobUNvcm5lclJhZGl1c0xvYywgZGVzYy5jb3JuZXJSYWRpdXMpOworICAgIH0KKyAgICBpZiAobUNyb3BDZW50ZXJMb2MgPj0gMCkgeworICAgICAgICBnbFVuaWZvcm0yZihtQ3JvcENlbnRlckxvYywgZGVzYy5jcm9wU2l6ZS54IC8gMi4wZiwgZGVzYy5jcm9wU2l6ZS55IC8gMi4wZik7CisgICAgfQorICAgIC8vIHRoZXNlIHVuaWZvcm1zIGFyZSBhbHdheXMgcHJlc2VudAorICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtUHJvamVjdGlvbk1hdHJpeExvYywgMSwgR0xfRkFMU0UsIGRlc2MucHJvamVjdGlvbk1hdHJpeC5hc0FycmF5KCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL1Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzM3NTVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL1Byb2dyYW0uaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRl9SRU5ERVJfRU5HSU5FX1BST0dSQU1fSAorI2RlZmluZSBTRl9SRU5ERVJfRU5HSU5FX1BST0dSQU1fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvcHJpdmF0ZS9EZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworLyoKKyAqIEFic3RyYWN0cyBhIEdMU0wgcHJvZ3JhbSBjb21wcmlzaW5nIGEgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIKKyAqLworY2xhc3MgUHJvZ3JhbSB7CitwdWJsaWM6CisgICAgLy8ga25vd24gbG9jYXRpb25zIGZvciBwb3NpdGlvbiBhbmQgdGV4dHVyZSBjb29yZGluYXRlcworICAgIGVudW0geworICAgICAgICAvKiBwb3NpdGlvbiBvZiBlYWNoIHZlcnRleCBmb3IgdmVydGV4IHNoYWRlciAqLworICAgICAgICBwb3NpdGlvbiA9IDAsCisKKyAgICAgICAgLyogVVYgY29vcmRpbmF0ZXMgZm9yIHRleHR1cmUgbWFwcGluZyAqLworICAgICAgICB0ZXhDb29yZHMgPSAxLAorCisgICAgICAgIC8qIENyb3AgY29vcmRpbmF0ZXMsIGluIHBpeGVscyAqLworICAgICAgICBjcm9wQ29vcmRzID0gMiwKKworICAgICAgICAvKiBTaGFkb3cgY29sb3IgKi8KKyAgICAgICAgc2hhZG93Q29sb3IgPSAzLAorCisgICAgICAgIC8qIFNoYWRvdyBwYXJhbXMgKi8KKyAgICAgICAgc2hhZG93UGFyYW1zID0gNCwKKyAgICB9OworCisgICAgUHJvZ3JhbShjb25zdCBQcm9ncmFtQ2FjaGU6OktleSYgbmVlZHMsIGNvbnN0IGNoYXIqIHZlcnRleCwgY29uc3QgY2hhciogZnJhZ21lbnQpOworICAgIH5Qcm9ncmFtKCkgPSBkZWZhdWx0OworCisgICAgLyogd2hldGhlciB0aGlzIG9iamVjdCBpcyB1c2FibGUgKi8KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKKworICAgIC8qIEJpbmRzIHRoaXMgcHJvZ3JhbSB0byB0aGUgR0xFUyBjb250ZXh0ICovCisgICAgdm9pZCB1c2UoKTsKKworICAgIC8qIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlICovCisgICAgR0x1aW50IGdldEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKSBjb25zdDsKKworICAgIC8qIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgdW5pZm9ybSAqLworICAgIEdMaW50IGdldFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSkgY29uc3Q7CisKKyAgICAvKiBzZXQtdXAgdW5pZm9ybXMgZnJvbSB0aGUgZGVzY3JpcHRpb24gKi8KKyAgICB2b2lkIHNldFVuaWZvcm1zKGNvbnN0IERlc2NyaXB0aW9uJiBkZXNjKTsKKworcHJpdmF0ZToKKyAgICBHTHVpbnQgYnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSk7CisKKyAgICAvLyB3aGV0aGVyIHRoZSBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKworICAgIC8vIE5hbWUgb2YgdGhlIE9wZW5HTCBwcm9ncmFtIGFuZCBzaGFkZXJzCisgICAgR0x1aW50IG1Qcm9ncmFtOworICAgIEdMdWludCBtVmVydGV4U2hhZGVyOworICAgIEdMdWludCBtRnJhZ21lbnRTaGFkZXI7CisKKyAgICAvKiBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdGlvbiBtYXRyaXggdW5pZm9ybSAqLworICAgIEdMaW50IG1Qcm9qZWN0aW9uTWF0cml4TG9jOworCisgICAgLyogbG9jYXRpb24gb2YgdGhlIHRleHR1cmUgbWF0cml4IHVuaWZvcm0gKi8KKyAgICBHTGludCBtVGV4dHVyZU1hdHJpeExvYzsKKworICAgIC8qIGxvY2F0aW9uIG9mIHRoZSBzYW1wbGVyIHVuaWZvcm0gKi8KKyAgICBHTGludCBtU2FtcGxlckxvYzsKKworICAgIC8qIGxvY2F0aW9uIG9mIHRoZSBjb2xvciB1bmlmb3JtICovCisgICAgR0xpbnQgbUNvbG9yTG9jOworCisgICAgLyogbG9jYXRpb24gb2YgZGlzcGxheSBsdW1pbmFuY2UgdW5pZm9ybSAqLworICAgIEdMaW50IG1EaXNwbGF5TWF4THVtaW5hbmNlTG9jOworICAgIC8qIGxvY2F0aW9uIG9mIG1heCBtYXN0ZXJpbmcgbHVtaW5hbmNlIHVuaWZvcm0gKi8KKyAgICBHTGludCBtTWF4TWFzdGVyaW5nTHVtaW5hbmNlTG9jOworICAgIC8qIGxvY2F0aW9uIG9mIG1heCBjb250ZW50IGx1bWluYW5jZSB1bmlmb3JtICovCisgICAgR0xpbnQgbU1heENvbnRlbnRMdW1pbmFuY2VMb2M7CisKKyAgICAvKiBsb2NhdGlvbiBvZiB0cmFuc2Zvcm0gbWF0cml4ICovCisgICAgR0xpbnQgbUlucHV0VHJhbnNmb3JtTWF0cml4TG9jOworICAgIEdMaW50IG1PdXRwdXRUcmFuc2Zvcm1NYXRyaXhMb2M7CisKKyAgICAvKiBsb2NhdGlvbiBvZiBjb3JuZXIgcmFkaXVzIHVuaWZvcm0gKi8KKyAgICBHTGludCBtQ29ybmVyUmFkaXVzTG9jOworCisgICAgLyogbG9jYXRpb24gb2Ygc3VyZmFjZSBjcm9wIG9yaWdpbiB1bmlmb3JtLCBmb3Igcm91bmRlZCBjb3JuZXIgY2xpcHBpbmcgKi8KKyAgICBHTGludCBtQ3JvcENlbnRlckxvYzsKK307CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIFNGX1JFTkRFUl9FTkdJTkVfUFJPR1JBTV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbUNhY2hlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9Qcm9ncmFtQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZTM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbUNhY2hlLmNwcApAQCAtMCwwICsxLDgwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKKworI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9wcml2YXRlL0Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorCitBTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoYW5kcm9pZDo6cmVuZGVyZW5naW5lOjpnbDo6UHJvZ3JhbUNhY2hlKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKKy8qCisgKiBBIHNpbXBsZSBmb3JtYXR0ZXIgY2xhc3MgdG8gYXV0b21hdGljYWxseSBhZGQgdGhlIGVuZGwgYW5kCisgKiBtYW5hZ2UgdGhlIGluZGVudGF0aW9uLgorICovCisKK2NsYXNzIEZvcm1hdHRlcjsKK3N0YXRpYyBGb3JtYXR0ZXImIGluZGVudChGb3JtYXR0ZXImIGYpOworc3RhdGljIEZvcm1hdHRlciYgZGVkZW50KEZvcm1hdHRlciYgZik7CisKK2NsYXNzIEZvcm1hdHRlciB7CisgICAgU3RyaW5nOCBtU3RyaW5nOworICAgIGludCBtSW5kZW50OworICAgIHR5cGVkZWYgRm9ybWF0dGVyJiAoKkZvcm1hdGVyTWFuaXBGdW5jKShGb3JtYXR0ZXImKTsKKyAgICBmcmllbmQgRm9ybWF0dGVyJiBpbmRlbnQoRm9ybWF0dGVyJiBmKTsKKyAgICBmcmllbmQgRm9ybWF0dGVyJiBkZWRlbnQoRm9ybWF0dGVyJiBmKTsKKworcHVibGljOgorICAgIEZvcm1hdHRlcigpIDogbUluZGVudCgwKSB7fQorCisgICAgU3RyaW5nOCBnZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtU3RyaW5nOyB9CisKKyAgICBmcmllbmQgRm9ybWF0dGVyJiBvcGVyYXRvcjw8KEZvcm1hdHRlciYgb3V0LCBjb25zdCBjaGFyKiBpbikgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dC5tSW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIG91dC5tU3RyaW5nLmFwcGVuZCgiICAgICIpOworICAgICAgICB9CisgICAgICAgIG91dC5tU3RyaW5nLmFwcGVuZChpbik7CisgICAgICAgIG91dC5tU3RyaW5nLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgICAgZnJpZW5kIGlubGluZSBGb3JtYXR0ZXImIG9wZXJhdG9yPDwoRm9ybWF0dGVyJiBvdXQsIGNvbnN0IFN0cmluZzgmIGluKSB7CisgICAgICAgIHJldHVybiBvcGVyYXRvcjw8KG91dCwgaW4uc3RyaW5nKCkpOworICAgIH0KKyAgICBmcmllbmQgaW5saW5lIEZvcm1hdHRlciYgb3BlcmF0b3I8PChGb3JtYXR0ZXImIHRvLCBGb3JtYXRlck1hbmlwRnVuYyBmdW5jKSB7CisgICAgICAgIHJldHVybiAoKmZ1bmMpKHRvKTsKKyAgICB9Cit9OworRm9ybWF0dGVyJiBpbmRlbnQoRm9ybWF0dGVyJiBmKSB7CisgICAgZi5tSW5kZW50Kys7CisgICAgcmV0dXJuIGY7Cit9CitGb3JtYXR0ZXImIGRlZGVudChGb3JtYXR0ZXImIGYpIHsKKyAgICBmLm1JbmRlbnQtLTsKKyAgICByZXR1cm4gZjsKK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OnByaW1lQ2FjaGUoCisgICAgICAgIEVHTENvbnRleHQgY29udGV4dCwgYm9vbCB1c2VDb2xvck1hbmFnZW1lbnQsIGJvb2wgdG9uZU1hcHBlclNoYWRlck9ubHkpIHsKKyAgICBhdXRvJiBjYWNoZSA9IG1DYWNoZXNbY29udGV4dF07CisgICAgdWludDMyX3Qgc2hhZGVyQ291bnQgPSAwOworCisgICAgaWYgKHRvbmVNYXBwZXJTaGFkZXJPbmx5KSB7CisgICAgICAgIEtleSBzaGFkZXJLZXk7CisgICAgICAgIC8vIGJhc2Ugc2V0dGluZ3MgdXNlZCBieSBIRFItPlNEUiB0b25lbWFwIG9ubHkKKyAgICAgICAgc2hhZGVyS2V5LnNldChLZXk6OkJMRU5EX01BU0sgfCBLZXk6OklOUFVUX1RSQU5TRk9STV9NQVRSSVhfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgS2V5OjpPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9NQVNLIHwgS2V5OjpPVVRQVVRfVEZfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgS2V5OjpPUEFDSVRZX01BU0sgfCBLZXk6OkFMUEhBX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgIEtleTo6Uk9VTkRFRF9DT1JORVJTX01BU0sgfCBLZXk6OlRFWFRVUkVfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICBLZXk6OkJMRU5EX05PUk1BTCB8IEtleTo6SU5QVVRfVFJBTlNGT1JNX01BVFJJWF9PTiB8CisgICAgICAgICAgICAgICAgICAgICAgS2V5OjpPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9PTiB8IEtleTo6T1VUUFVUX1RGX1NSR0IgfAorICAgICAgICAgICAgICAgICAgICAgIEtleTo6T1BBQ0lUWV9PUEFRVUUgfCBLZXk6OkFMUEhBX0VRX09ORSB8CisgICAgICAgICAgICAgICAgICAgICAgS2V5OjpST1VOREVEX0NPUk5FUlNfT0ZGIHwgS2V5OjpURVhUVVJFX0VYVCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAvLyBDYWNoZSBpbnB1dCB0cmFuc2ZlciBmb3IgSExHICYgU1QyMDg0CisgICAgICAgICAgICBzaGFkZXJLZXkuc2V0KEtleTo6SU5QVVRfVEZfTUFTSywgKGkgJiAxKSA/CisgICAgICAgICAgICAgICAgICAgIEtleTo6SU5QVVRfVEZfSExHIDogS2V5OjpJTlBVVF9URl9TVDIwODQpOworCisgICAgICAgICAgICAvLyBDYWNoZSBZNDEwIGlucHV0IG9uIG9yIG9mZgorICAgICAgICAgICAgc2hhZGVyS2V5LnNldChLZXk6Olk0MTBfQlQyMDIwX01BU0ssIChpICYgMikgPworICAgICAgICAgICAgICAgICAgICBLZXk6Olk0MTBfQlQyMDIwX09OIDogS2V5OjpZNDEwX0JUMjAyMF9PRkYpOworICAgICAgICAgICAgaWYgKGNhY2hlLmNvdW50KHNoYWRlcktleSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNhY2hlLmVtcGxhY2Uoc2hhZGVyS2V5LCBnZW5lcmF0ZVByb2dyYW0oc2hhZGVyS2V5KSk7CisgICAgICAgICAgICAgICAgc2hhZGVyQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3Qga2V5TWFzayA9IEtleTo6QkxFTkRfTUFTSyB8IEtleTo6T1BBQ0lUWV9NQVNLIHwgS2V5OjpBTFBIQV9NQVNLIHwgS2V5OjpURVhUVVJFX01BU0sKKyAgICAgICAgfCBLZXk6OlJPVU5ERURfQ09STkVSU19NQVNLOworICAgIC8vIFByaW1lIHRoZSBjYWNoZSBmb3IgYWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgbWFza3MsCisgICAgLy8gbGVhdmluZyBvZmYgdGhlIGV4cGVyaW1lbnRhbCBjb2xvciBtYXRyaXggbWFzayBvcHRpb25zLgorCisgICAgbnNlY3NfdCB0aW1lQmVmb3JlID0gc3lzdGVtVGltZSgpOworICAgIGZvciAodWludDMyX3Qga2V5VmFsID0gMDsga2V5VmFsIDw9IGtleU1hc2s7IGtleVZhbCsrKSB7CisgICAgICAgIEtleSBzaGFkZXJLZXk7CisgICAgICAgIHNoYWRlcktleS5zZXQoa2V5TWFzaywga2V5VmFsKTsKKyAgICAgICAgdWludDMyX3QgdGV4ID0gc2hhZGVyS2V5LmdldFRleHR1cmVUYXJnZXQoKTsKKyAgICAgICAgaWYgKHRleCAhPSBLZXk6OlRFWFRVUkVfT0ZGICYmIHRleCAhPSBLZXk6OlRFWFRVUkVfRVhUICYmIHRleCAhPSBLZXk6OlRFWFRVUkVfMkQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjYWNoZS5jb3VudChzaGFkZXJLZXkpID09IDApIHsKKyAgICAgICAgICAgIGNhY2hlLmVtcGxhY2Uoc2hhZGVyS2V5LCBnZW5lcmF0ZVByb2dyYW0oc2hhZGVyS2V5KSk7CisgICAgICAgICAgICBzaGFkZXJDb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJpbWUgZm9yIHNSR0ItPlAzIGNvbnZlcnNpb24KKyAgICBpZiAodXNlQ29sb3JNYW5hZ2VtZW50KSB7CisgICAgICAgIEtleSBzaGFkZXJLZXk7CisgICAgICAgIHNoYWRlcktleS5zZXQoS2V5OjpCTEVORF9NQVNLIHwgS2V5OjpPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9NQVNLIHwgS2V5OjpJTlBVVF9URl9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTo6T1VUUFVUX1RGX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgS2V5OjpCTEVORF9QUkVNVUxUIHwgS2V5OjpPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9PTiB8IEtleTo6SU5QVVRfVEZfU1JHQiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXk6Ok9VVFBVVF9URl9TUkdCKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBzaGFkZXJLZXkuc2V0KEtleTo6T1BBQ0lUWV9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaSAmIDEpID8gS2V5OjpPUEFDSVRZX09QQVFVRSA6IEtleTo6T1BBQ0lUWV9UUkFOU0xVQ0VOVCk7CisgICAgICAgICAgICBzaGFkZXJLZXkuc2V0KEtleTo6QUxQSEFfTUFTSywgKGkgJiAyKSA/IEtleTo6QUxQSEFfTFRfT05FIDogS2V5OjpBTFBIQV9FUV9PTkUpOworCisgICAgICAgICAgICAvLyBDYWNoZSByb3VuZGVkIGNvcm5lcnMKKyAgICAgICAgICAgIHNoYWRlcktleS5zZXQoS2V5OjpST1VOREVEX0NPUk5FUlNfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiA0KSA/IEtleTo6Uk9VTkRFRF9DT1JORVJTX09OIDogS2V5OjpST1VOREVEX0NPUk5FUlNfT0ZGKTsKKworICAgICAgICAgICAgLy8gQ2FjaGUgdGV4dHVyZSBvZmYgb3B0aW9uIGZvciB3aW5kb3cgdHJhbnNpdGlvbgorICAgICAgICAgICAgc2hhZGVyS2V5LnNldChLZXk6OlRFWFRVUkVfTUFTSywgKGkgJiA4KSA/IEtleTo6VEVYVFVSRV9FWFQgOiBLZXk6OlRFWFRVUkVfT0ZGKTsKKyAgICAgICAgICAgIGlmIChjYWNoZS5jb3VudChzaGFkZXJLZXkpID09IDApIHsKKyAgICAgICAgICAgICAgICBjYWNoZS5lbXBsYWNlKHNoYWRlcktleSwgZ2VuZXJhdGVQcm9ncmFtKHNoYWRlcktleSkpOworICAgICAgICAgICAgICAgIHNoYWRlckNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuc2Vjc190IHRpbWVBZnRlciA9IHN5c3RlbVRpbWUoKTsKKyAgICBmbG9hdCBjb21waWxlVGltZU1zID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRpbWVBZnRlciAtIHRpbWVCZWZvcmUpIC8gMS4wRTY7CisgICAgQUxPR0QoInNoYWRlciBjYWNoZSBnZW5lcmF0ZWQgLSAldSBzaGFkZXJzIGluICVmIG1zXG4iLCBzaGFkZXJDb3VudCwgY29tcGlsZVRpbWVNcyk7Cit9CisKK1Byb2dyYW1DYWNoZTo6S2V5IFByb2dyYW1DYWNoZTo6Y29tcHV0ZUtleShjb25zdCBEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBLZXkgbmVlZHM7CisgICAgbmVlZHMuc2V0KEtleTo6VEVYVFVSRV9NQVNLLAorICAgICAgICAgICAgICAhZGVzY3JpcHRpb24udGV4dHVyZUVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICA/IEtleTo6VEVYVFVSRV9PRkYKKyAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0aW9uLnRleHR1cmUuZ2V0VGV4dHVyZVRhcmdldCgpID09IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEtleTo6VEVYVFVSRV9FWFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVzY3JpcHRpb24udGV4dHVyZS5nZXRUZXh0dXJlVGFyZ2V0KCkgPT0gR0xfVEVYVFVSRV8yRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEtleTo6VEVYVFVSRV8yRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEtleTo6VEVYVFVSRV9PRkYpCisgICAgICAgICAgICAuc2V0KEtleTo6QUxQSEFfTUFTSywgKGRlc2NyaXB0aW9uLmNvbG9yLmEgPCAxKSA/IEtleTo6QUxQSEFfTFRfT05FIDogS2V5OjpBTFBIQV9FUV9PTkUpCisgICAgICAgICAgICAuc2V0KEtleTo6QkxFTkRfTUFTSywKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uaXNQcmVtdWx0aXBsaWVkQWxwaGEgPyBLZXk6OkJMRU5EX1BSRU1VTFQgOiBLZXk6OkJMRU5EX05PUk1BTCkKKyAgICAgICAgICAgIC5zZXQoS2V5OjpPUEFDSVRZX01BU0ssCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmlzT3BhcXVlID8gS2V5OjpPUEFDSVRZX09QQVFVRSA6IEtleTo6T1BBQ0lUWV9UUkFOU0xVQ0VOVCkKKyAgICAgICAgICAgIC5zZXQoS2V5OjpLZXk6OklOUFVUX1RSQU5TRk9STV9NQVRSSVhfTUFTSywKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uaGFzSW5wdXRUcmFuc2Zvcm1NYXRyaXgoKSA/IEtleTo6SU5QVVRfVFJBTlNGT1JNX01BVFJJWF9PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogS2V5OjpJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX09GRikKKyAgICAgICAgICAgIC5zZXQoS2V5OjpLZXk6Ok9VVFBVVF9UUkFOU0ZPUk1fTUFUUklYX01BU0ssCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmhhc091dHB1dFRyYW5zZm9ybU1hdHJpeCgpIHx8IGRlc2NyaXB0aW9uLmhhc0NvbG9yTWF0cml4KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEtleTo6T1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfT04KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IEtleTo6T1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfT0ZGKQorICAgICAgICAgICAgLnNldChLZXk6OlJPVU5ERURfQ09STkVSU19NQVNLLAorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5jb3JuZXJSYWRpdXMgPiAwID8gS2V5OjpST1VOREVEX0NPUk5FUlNfT04gOiBLZXk6OlJPVU5ERURfQ09STkVSU19PRkYpCisgICAgICAgICAgICAuc2V0KEtleTo6U0hBRE9XX01BU0ssIGRlc2NyaXB0aW9uLmRyYXdTaGFkb3dzID8gS2V5OjpTSEFET1dfT04gOiBLZXk6OlNIQURPV19PRkYpOworICAgIG5lZWRzLnNldChLZXk6Olk0MTBfQlQyMDIwX01BU0ssCisgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmlzWTQxMEJUMjAyMCA/IEtleTo6WTQxMF9CVDIwMjBfT04gOiBLZXk6Olk0MTBfQlQyMDIwX09GRik7CisKKyAgICBpZiAobmVlZHMuaGFzVHJhbnNmb3JtTWF0cml4KCkgfHwKKyAgICAgICAgKGRlc2NyaXB0aW9uLmlucHV0VHJhbnNmZXJGdW5jdGlvbiAhPSBkZXNjcmlwdGlvbi5vdXRwdXRUcmFuc2ZlckZ1bmN0aW9uKSkgeworICAgICAgICBzd2l0Y2ggKGRlc2NyaXB0aW9uLmlucHV0VHJhbnNmZXJGdW5jdGlvbikgeworICAgICAgICAgICAgY2FzZSBEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbjo6TElORUFSOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBuZWVkcy5zZXQoS2V5OjpJTlBVVF9URl9NQVNLLCBLZXk6OklOUFVUX1RGX0xJTkVBUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERlc2NyaXB0aW9uOjpUcmFuc2ZlckZ1bmN0aW9uOjpTUkdCOgorICAgICAgICAgICAgICAgIG5lZWRzLnNldChLZXk6OklOUFVUX1RGX01BU0ssIEtleTo6SU5QVVRfVEZfU1JHQik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERlc2NyaXB0aW9uOjpUcmFuc2ZlckZ1bmN0aW9uOjpTVDIwODQ6CisgICAgICAgICAgICAgICAgbmVlZHMuc2V0KEtleTo6SU5QVVRfVEZfTUFTSywgS2V5OjpJTlBVVF9URl9TVDIwODQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbjo6SExHOgorICAgICAgICAgICAgICAgIG5lZWRzLnNldChLZXk6OklOUFVUX1RGX01BU0ssIEtleTo6SU5QVVRfVEZfSExHKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZGVzY3JpcHRpb24ub3V0cHV0VHJhbnNmZXJGdW5jdGlvbikgeworICAgICAgICAgICAgY2FzZSBEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbjo6TElORUFSOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBuZWVkcy5zZXQoS2V5OjpPVVRQVVRfVEZfTUFTSywgS2V5OjpPVVRQVVRfVEZfTElORUFSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OlNSR0I6CisgICAgICAgICAgICAgICAgbmVlZHMuc2V0KEtleTo6T1VUUFVUX1RGX01BU0ssIEtleTo6T1VUUFVUX1RGX1NSR0IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbjo6U1QyMDg0OgorICAgICAgICAgICAgICAgIG5lZWRzLnNldChLZXk6Ok9VVFBVVF9URl9NQVNLLCBLZXk6Ok9VVFBVVF9URl9TVDIwODQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbjo6SExHOgorICAgICAgICAgICAgICAgIG5lZWRzLnNldChLZXk6Ok9VVFBVVF9URl9NQVNLLCBLZXk6Ok9VVFBVVF9URl9ITEcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5lZWRzOworfQorCisvLyBHZW5lcmF0ZSBFT1RGIHRoYXQgY29udmVydHMgc2lnbmFsIHZhbHVlcyB0byByZWxhdGl2ZSBkaXNwbGF5IGxpZ2h0LAorLy8gYm90aCBub3JtYWxpemVkIHRvIFswLCAxXS4KK3ZvaWQgUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZUVPVEYoRm9ybWF0dGVyJiBmcywgY29uc3QgS2V5JiBuZWVkcykgeworICAgIHN3aXRjaCAobmVlZHMuZ2V0SW5wdXRURigpKSB7CisgICAgICAgIGNhc2UgS2V5OjpJTlBVVF9URl9TUkdCOgorICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIGZsb2F0IEVPVEZfc1JHQihmbG9hdCBzcmdiKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcmdiIDw9IDAuMDQwNDUgPyBzcmdiIC8gMTIuOTIgOiBwb3coKHNyZ2IgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2ZWMzIEVPVEZfc1JHQihjb25zdCB2ZWMzIHNyZ2IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzMoRU9URl9zUkdCKHNyZ2IuciksIEVPVEZfc1JHQihzcmdiLmcpLCBFT1RGX3NSR0Ioc3JnYi5iKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmVjMyBFT1RGKGNvbnN0IHZlYzMgc3JnYikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lnbihzcmdiLnJnYikgKiBFT1RGX3NSR0IoYWJzKHNyZ2IucmdiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5OjpJTlBVVF9URl9TVDIwODQ6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgdmVjMyBFT1RGKGNvbnN0IGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgbTEgPSAoMjYxMC4wIC8gNDA5Ni4wKSAvIDQuMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgbTIgPSAoMjUyMy4wIC8gNDA5Ni4wKSAqIDEyOC4wOworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBjMSA9ICgzNDI0LjAgLyA0MDk2LjApOworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBjMiA9ICgyNDEzLjAgLyA0MDk2LjApICogMzIuMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgYzMgPSAoMjM5Mi4wIC8gNDA5Ni4wKSAqIDMyLjA7CisKKyAgICAgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyB0bXAgPSBwb3coY2xhbXAoY29sb3IsIDAuMCwgMS4wKSwgMS4wIC8gdmVjMyhtMikpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBtYXgodG1wIC0gYzEsIDAuMCkgLyAoYzIgLSBjMyAqIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3codG1wLCAxLjAgLyB2ZWMzKG0xKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5OjpJTlBVVF9URl9ITEc6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgZmxvYXQgRU9URl9jaGFubmVsKGNvbnN0IGhpZ2hwIGZsb2F0IGNoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgYSA9IDAuMTc4ODMyNzc7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IGIgPSAwLjI4NDY2ODkyOworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBjID0gMC41NTk5MTA3MzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWwgPD0gMC41ID8gY2hhbm5lbCAqIGNoYW5uZWwgLyAzLjAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHAoKGNoYW5uZWwgLSBjKSAvIGEpICsgYikgLyAxMi4wOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZlYzMgRU9URihjb25zdCBoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWMzKEVPVEZfY2hhbm5lbChjb2xvci5yKSwgRU9URl9jaGFubmVsKGNvbG9yLmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVPVEZfY2hhbm5lbChjb2xvci5iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgdmVjMyBFT1RGKGNvbnN0IHZlYzMgbGluZWFyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lYXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVUb25lTWFwcGluZ1Byb2Nlc3MoRm9ybWF0dGVyJiBmcywgY29uc3QgS2V5JiBuZWVkcykgeworICAgIC8vIENvbnZlcnQgcmVsYXRpdmUgbGlnaHQgdG8gYWJzb2x1dGUgbGlnaHQuCisgICAgc3dpdGNoIChuZWVkcy5nZXRJbnB1dFRGKCkpIHsKKyAgICAgICAgY2FzZSBLZXk6OklOUFVUX1RGX1NUMjA4NDoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIFNjYWxlTHVtaW5hbmNlKGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yICogMTAwMDAuMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXk6OklOUFVUX1RGX0hMRzoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIFNjYWxlTHVtaW5hbmNlKGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvcm11bGEgaXM6CisgICAgICAgICAgICAgICAgICAgIC8vIGFscGhhICogcG93KFksIGdhbW1hIC0gMS4wKSAqIGNvbG9yICsgYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgYWxwaGEgaXMgMTAwMC4wLCBnYW1tYSBpcyAxLjIsIGJldGEgaXMgMC4wLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3IgKiAxMDAwLjAgKiBwb3coY29sb3IueSwgMC4yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIFNjYWxlTHVtaW5hbmNlKGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yICogZGlzcGxheU1heEx1bWluYW5jZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBUb25lIG1hcCBhYnNvbHV0ZSBsaWdodCB0byBkaXNwbGF5IGx1bWluYW5jZSByYW5nZS4KKyAgICBzd2l0Y2ggKG5lZWRzLmdldElucHV0VEYoKSkgeworICAgICAgICBjYXNlIEtleTo6SU5QVVRfVEZfU1QyMDg0OgorICAgICAgICBjYXNlIEtleTo6SU5QVVRfVEZfSExHOgorICAgICAgICAgICAgc3dpdGNoIChuZWVkcy5nZXRPdXRwdXRURigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLZXk6Ok9VVFBVVF9URl9ITEc6CisgICAgICAgICAgICAgICAgICAgIC8vIFJpZ2h0IG5vdyB3aGVuIG1peGVkIFBRIGFuZCBITEcgY29udGVudHMgYXJlIHByZXNlbnRlZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gSExHIGNvbnRlbnQgd2lsbCBhbHdheXMgYmUgY29udmVydGVkIHRvIFBRLiBIb3dldmVyLCBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVuZXNzLCB3ZSBzaW1wbHkgY2xhbXAgdGhlIHZhbHVlIHRvIFswLjAsIDEwMDAuMF0uCisgICAgICAgICAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgVG9uZU1hcChoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYW1wKGNvbG9yLCAwLjAsIDEwMDAuMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXk6Ok9VVFBVVF9URl9TVDIwODQ6CisgICAgICAgICAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgVG9uZU1hcChoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgVG9uZU1hcChoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4TWFzdGVyaW5nTHVtaSA9IG1heE1hc3RlcmluZ0x1bWluYW5jZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhDb250ZW50THVtaSA9IG1heENvbnRlbnRMdW1pbmFuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4SW5MdW1pID0gbWluKG1heE1hc3RlcmluZ0x1bWksIG1heENvbnRlbnRMdW1pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhPdXRMdW1pID0gZGlzcGxheU1heEx1bWluYW5jZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG5pdHMgPSBjb2xvci55OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhbXAgdG8gbWF4IGlucHV0IGx1bWluYW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pdHMgPSBjbGFtcChuaXRzLCAwLjAsIG1heEluTHVtaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSBbMC4wLCBtYXhJbkx1bWldIHRvIFswLjAsIG1heE91dEx1bWldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heEluTHVtaSA8PSBtYXhPdXRMdW1pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAqIChtYXhPdXRMdW1pIC8gbWF4SW5MdW1pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlZSBjb250cm9sIHBvaW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB4MCA9IDEwLjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHkwID0gMTcuMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDEgPSBtYXhPdXRMdW1pICogMC43NTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTEgPSB4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIgPSB4MSArIChtYXhJbkx1bWkgLSB4MSkgLyAyLjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkyID0geTEgKyAobWF4T3V0THVtaSAtIHkxKSAqIDAuNzU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBkaXN0YW5jZXMgYmV0d2VlbiB0aGUgbGFzdCB0aHJlZSBjb250cm9sIHBvaW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMTIgPSB4MiAtIHgxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMjMgPSBtYXhJbkx1bWkgLSB4MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFuZ2VudHMgYXQgdGhlIGxhc3QgdGhyZWUgY29udHJvbCBwb2ludHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbTEgPSAoeTIgLSB5MSkgLyBoMTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG0zID0gKG1heE91dEx1bWkgLSB5MikgLyBoMjM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG0yID0gKG0xICsgbTMpIC8gMi4wOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuaXRzIDwgeDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIFswLjAsIHgwXSB0byBbMC4wLCB5MF0gbGluZWFybHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNsb3BlID0geTAgLyB4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAqIHNsb3BlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5pdHMgPCB4MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgW3gwLCB4MV0gdG8gW3kwLCB5MV0gbGluZWFybHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNsb3BlID0gKHkxIC0geTApIC8gKHgxIC0geDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbml0cyA9IHkwICsgKG5pdHMgLSB4MCkgKiBzbG9wZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuaXRzIDwgeDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIFt4MSwgeDJdIHRvIFt5MSwgeTJdIHVzaW5nIEhlcm1pdGUgaW50ZXJwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ID0gKG5pdHMgLSB4MSkgLyBoMTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaXRzID0gKHkxICogKDEuMCArIDIuMCAqIHQpICsgaDEyICogbTEgKiB0KSAqICgxLjAgLSB0KSAqICgxLjAgLSB0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5MiAqICgzLjAgLSAyLjAgKiB0KSArIGgxMiAqIG0yICogKHQgLSAxLjApKSAqIHQgKiB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgW3gyLCBtYXhJbkx1bWldIHRvIFt5MiwgbWF4T3V0THVtaV0gdXNpbmcgSGVybWl0ZSBpbnRlcnAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQgPSAobml0cyAtIHgyKSAvIGgyMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pdHMgPSAoeTIgKiAoMS4wICsgMi4wICogdCkgKyBoMjMgKiBtMiAqIHQpICogKDEuMCAtIHQpICogKDEuMCAtIHQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heE91dEx1bWkgKiAoMy4wIC0gMi4wICogdCkgKyBoMjMgKiBtMyAqICh0IC0gMS4wKSkgKiB0ICogdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yLnkgaXMgZ3JlYXRlciB0aGFuIHgwIGFuZCBpcyB0aHVzIG5vbi16ZXJvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yICogKG5pdHMgLyBjb2xvci55KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gaW52ZXJzZSB0b25lIG1hcDsgdGhlIG91dHB1dCBsdW1pbmFuY2UgY2FuIGJlIHVwIHRvIG1heE91dEx1bWkuCisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBUb25lTWFwKGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgbWF4T3V0THVtaSA9IDMwMDAuMDsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB4MCA9IDUuMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgeTAgPSAyLjU7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgxID0gZGlzcGxheU1heEx1bWluYW5jZSAqIDAuNzsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTEgPSBtYXhPdXRMdW1pICogMC4xNTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIgPSBkaXNwbGF5TWF4THVtaW5hbmNlICogMC45OworICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MiA9IG1heE91dEx1bWkgKiAwLjQ1OworICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MyA9IGRpc3BsYXlNYXhMdW1pbmFuY2U7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkzID0gbWF4T3V0THVtaTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCBjMSA9IHkxIC8gMy4wOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBjMiA9IHkyIC8gMi4wOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBjMyA9IHkzIC8gMS41OworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG5pdHMgPSBjb2xvci55OworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlOworICAgICAgICAgICAgICAgICAgICBpZiAobml0cyA8PSB4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgWzAuMCwgeDBdIHRvIFswLjAsIHkwXSBsaW5lYXJseQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2xvcGUgPSB5MCAvIHgwOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yICogc2xvcGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobml0cyA8PSB4MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgW3gwLCB4MV0gdG8gW3kwLCB5MV0gdXNpbmcgYSBjdXJ2ZQorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdCA9IChuaXRzIC0geDApIC8gKHgxIC0geDApOworICAgICAgICAgICAgICAgICAgICAgICAgbml0cyA9ICgxLjAgLSB0KSAqICgxLjAgLSB0KSAqIHkwICsgMi4wICogKDEuMCAtIHQpICogdCAqIGMxICsgdCAqIHQgKiB5MTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuaXRzIDw9IHgyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSBbeDEsIHgyXSB0byBbeTEsIHkyXSB1c2luZyBhIGN1cnZlCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ID0gKG5pdHMgLSB4MSkgLyAoeDIgLSB4MSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuaXRzID0gKDEuMCAtIHQpICogKDEuMCAtIHQpICogeTEgKyAyLjAgKiAoMS4wIC0gdCkgKiB0ICogYzIgKyB0ICogdCAqIHkyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgW3gyLCB4M10gdG8gW3kyLCB5M10gdXNpbmcgYSBjdXJ2ZQorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdCA9IChuaXRzIC0geDIpIC8gKHgzIC0geDIpOworICAgICAgICAgICAgICAgICAgICAgICAgbml0cyA9ICgxLjAgLSB0KSAqICgxLjAgLSB0KSAqIHkyICsgMi4wICogKDEuMCAtIHQpICogdCAqIGMzICsgdCAqIHQgKiB5MzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yLnkgaXMgZ3JlYXRlciB0aGFuIHgwIGFuZCBpcyB0aHVzIG5vbi16ZXJvCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAqIChuaXRzIC8gY29sb3IueSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gY29udmVydCBhYnNvbHV0ZSBsaWdodCB0byByZWxhdGl2ZSBsaWdodC4KKyAgICBzd2l0Y2ggKG5lZWRzLmdldE91dHB1dFRGKCkpIHsKKyAgICAgICAgY2FzZSBLZXk6Ok9VVFBVVF9URl9TVDIwODQ6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBOb3JtYWxpemVMdW1pbmFuY2UoaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3IgLyAxMDAwMC4wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleTo6T1VUUFVUX1RGX0hMRzoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIE5vcm1hbGl6ZUx1bWluYW5jZShoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAvIDEwMDAuMCAqIHBvdyhjb2xvci55IC8gMTAwMC4wLCAtMC4yIC8gMS4yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIE5vcm1hbGl6ZUx1bWluYW5jZShoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAvIGRpc3BsYXlNYXhMdW1pbmFuY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvLyBHZW5lcmF0ZSBPT1RGIHRoYXQgbW9kaWZpZXMgdGhlIHJlbGF0aXZlIHNjZW5jZSBsaWdodCB0byByZWxhdGl2ZSBkaXNwbGF5IGxpZ2h0Lgordm9pZCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlT09URihGb3JtYXR0ZXImIGZzLCBjb25zdCBQcm9ncmFtQ2FjaGU6OktleSYgbmVlZHMpIHsKKyAgICBpZiAoIW5lZWRzLm5lZWRzVG9uZU1hcHBpbmcoKSkgeworICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICBoaWdocCB2ZWMzIE9PVEYoY29uc3QgaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgKV9fU0hBREVSX18iOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRlVG9uZU1hcHBpbmdQcm9jZXNzKGZzLCBuZWVkcyk7CisgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgIGhpZ2hwIHZlYzMgT09URihjb25zdCBoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vcm1hbGl6ZUx1bWluYW5jZShUb25lTWFwKFNjYWxlTHVtaW5hbmNlKGNvbG9yKSkpOworICAgICAgICAgICAgfQorICAgICAgICApX19TSEFERVJfXyI7CisgICAgfQorfQorCisvLyBHZW5lcmF0ZSBPRVRGIHRoYXQgY29udmVydHMgcmVsYXRpdmUgZGlzcGxheSBsaWdodCB0byBzaWduYWwgdmFsdWVzLAorLy8gYm90aCBub3JtYWxpemVkIHRvIFswLCAxXQordm9pZCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlT0VURihGb3JtYXR0ZXImIGZzLCBjb25zdCBLZXkmIG5lZWRzKSB7CisgICAgc3dpdGNoIChuZWVkcy5nZXRPdXRwdXRURigpKSB7CisgICAgICAgIGNhc2UgS2V5OjpPVVRQVVRfVEZfU1JHQjoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBmbG9hdCBPRVRGX3NSR0IoY29uc3QgZmxvYXQgbGluZWFyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lYXIgPD0gMC4wMDMxMzA4ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXIgKiAxMi45MiA6IChwb3cobGluZWFyLCAxLjAgLyAyLjQpICogMS4wNTUpIC0gMC4wNTU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmVjMyBPRVRGX3NSR0IoY29uc3QgdmVjMyBsaW5lYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzMoT0VURl9zUkdCKGxpbmVhci5yKSwgT0VURl9zUkdCKGxpbmVhci5nKSwgT0VURl9zUkdCKGxpbmVhci5iKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmVjMyBPRVRGKGNvbnN0IHZlYzMgbGluZWFyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWduKGxpbmVhci5yZ2IpICogT0VURl9zUkdCKGFicyhsaW5lYXIucmdiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5OjpPVVRQVVRfVEZfU1QyMDg0OgorICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIHZlYzMgT0VURihjb25zdCB2ZWMzIGxpbmVhcikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBtMSA9ICgyNjEwLjAgLyA0MDk2LjApIC8gNC4wOworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBtMiA9ICgyNTIzLjAgLyA0MDk2LjApICogMTI4LjA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IGMxID0gKDM0MjQuMCAvIDQwOTYuMCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IGMyID0gKDI0MTMuMCAvIDQwOTYuMCkgKiAzMi4wOworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBjMyA9ICgyMzkyLjAgLyA0MDk2LjApICogMzIuMDsKKworICAgICAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIHRtcCA9IHBvdyhsaW5lYXIsIHZlYzMobTEpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gKGMxICsgYzIgKiB0bXApIC8gKDEuMCArIGMzICogdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvdyh0bXAsIHZlYzMobTIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXk6Ok9VVFBVVF9URl9ITEc6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgZmxvYXQgT0VURl9jaGFubmVsKGNvbnN0IGhpZ2hwIGZsb2F0IGNoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgYSA9IDAuMTc4ODMyNzc7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IGIgPSAwLjI4NDY2ODkyOworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBjID0gMC41NTk5MTA3MzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWwgPD0gMS4wIC8gMTIuMCA/IHNxcnQoMy4wICogY2hhbm5lbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgKiBsb2coMTIuMCAqIGNoYW5uZWwgLSBiKSArIGM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmVjMyBPRVRGKGNvbnN0IGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzMoT0VURl9jaGFubmVsKGNvbG9yLnIpLCBPRVRGX2NoYW5uZWwoY29sb3IuZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0VURl9jaGFubmVsKGNvbG9yLmIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICB2ZWMzIE9FVEYoY29uc3QgdmVjMyBsaW5lYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVhcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK1N0cmluZzggUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVZlcnRleFNoYWRlcihjb25zdCBLZXkmIG5lZWRzKSB7CisgICAgRm9ybWF0dGVyIHZzOworICAgIGlmIChuZWVkcy5oYXNUZXh0dXJlQ29vcmRzKCkpIHsKKyAgICAgICAgdnMgPDwgImF0dHJpYnV0ZSB2ZWM0IHRleENvb3JkczsiCisgICAgICAgICAgIDw8ICJ2YXJ5aW5nIHZlYzIgb3V0VGV4Q29vcmRzOyI7CisgICAgfQorICAgIGlmIChuZWVkcy5oYXNSb3VuZGVkQ29ybmVycygpKSB7CisgICAgICAgIHZzIDw8ICJhdHRyaWJ1dGUgbG93cCB2ZWM0IGNyb3BDb29yZHM7IjsKKyAgICAgICAgdnMgPDwgInZhcnlpbmcgbG93cCB2ZWMyIG91dENyb3BDb29yZHM7IjsKKyAgICB9CisgICAgaWYgKG5lZWRzLmRyYXdTaGFkb3dzKCkpIHsKKyAgICAgICAgdnMgPDwgImF0dHJpYnV0ZSBsb3dwIHZlYzQgc2hhZG93Q29sb3I7IjsKKyAgICAgICAgdnMgPDwgInZhcnlpbmcgbG93cCB2ZWM0IG91dFNoYWRvd0NvbG9yOyI7CisgICAgICAgIHZzIDw8ICJhdHRyaWJ1dGUgbG93cCB2ZWM0IHNoYWRvd1BhcmFtczsiOworICAgICAgICB2cyA8PCAidmFyeWluZyBsb3dwIHZlYzMgb3V0U2hhZG93UGFyYW1zOyI7CisgICAgfQorICAgIHZzIDw8ICJhdHRyaWJ1dGUgdmVjNCBwb3NpdGlvbjsiCisgICAgICAgPDwgInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uOyIKKyAgICAgICA8PCAidW5pZm9ybSBtYXQ0IHRleHR1cmU7IgorICAgICAgIDw8ICJ2b2lkIG1haW4odm9pZCkgeyIgPDwgaW5kZW50IDw8ICJnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb24gKiBwb3NpdGlvbjsiOworICAgIGlmIChuZWVkcy5oYXNUZXh0dXJlQ29vcmRzKCkpIHsKKyAgICAgICAgdnMgPDwgIm91dFRleENvb3JkcyA9ICh0ZXh0dXJlICogdGV4Q29vcmRzKS5zdDsiOworICAgIH0KKyAgICBpZiAobmVlZHMuaGFzUm91bmRlZENvcm5lcnMoKSkgeworICAgICAgICB2cyA8PCAib3V0Q3JvcENvb3JkcyA9IGNyb3BDb29yZHMuc3Q7IjsKKyAgICB9CisgICAgaWYgKG5lZWRzLmRyYXdTaGFkb3dzKCkpIHsKKyAgICAgICAgdnMgPDwgIm91dFNoYWRvd0NvbG9yID0gc2hhZG93Q29sb3I7IjsKKyAgICAgICAgdnMgPDwgIm91dFNoYWRvd1BhcmFtcyA9IHNoYWRvd1BhcmFtcy54eXo7IjsKKyAgICB9CisgICAgdnMgPDwgZGVkZW50IDw8ICJ9IjsKKyAgICByZXR1cm4gdnMuZ2V0U3RyaW5nKCk7Cit9CisKK1N0cmluZzggUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGNvbnN0IEtleSYgbmVlZHMpIHsKKyAgICBGb3JtYXR0ZXIgZnM7CisgICAgaWYgKG5lZWRzLmdldFRleHR1cmVUYXJnZXQoKSA9PSBLZXk6OlRFWFRVUkVfRVhUKSB7CisgICAgICAgIGZzIDw8ICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlIjsKKyAgICB9CisKKyAgICAvLyBkZWZhdWx0IHByZWNpc2lvbiBpcyByZXF1aXJlZC1pc2ggaW4gZnJhZ21lbnQgc2hhZGVycworICAgIGZzIDw8ICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsiOworCisgICAgaWYgKG5lZWRzLmdldFRleHR1cmVUYXJnZXQoKSA9PSBLZXk6OlRFWFRVUkVfRVhUKSB7CisgICAgICAgIGZzIDw8ICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyBzYW1wbGVyOyI7CisgICAgfSBlbHNlIGlmIChuZWVkcy5nZXRUZXh0dXJlVGFyZ2V0KCkgPT0gS2V5OjpURVhUVVJFXzJEKSB7CisgICAgICAgIGZzIDw8ICJ1bmlmb3JtIHNhbXBsZXIyRCBzYW1wbGVyOyI7CisgICAgfQorCisgICAgaWYgKG5lZWRzLmhhc1RleHR1cmVDb29yZHMoKSkgeworICAgICAgICBmcyA8PCAidmFyeWluZyB2ZWMyIG91dFRleENvb3JkczsiOworICAgIH0KKworICAgIGlmIChuZWVkcy5oYXNSb3VuZGVkQ29ybmVycygpKSB7CisgICAgICAgIC8vIFJvdW5kZWQgY29ybmVycyBpbXBsZW1lbnRhdGlvbiB1c2luZyBhIHNpZ25lZCBkaXN0YW5jZSBmdW5jdGlvbi4KKyAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgdW5pZm9ybSBmbG9hdCBjb3JuZXJSYWRpdXM7CisgICAgICAgICAgICB1bmlmb3JtIHZlYzIgY3JvcENlbnRlcjsKKyAgICAgICAgICAgIHZhcnlpbmcgdmVjMiBvdXRDcm9wQ29vcmRzOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGN1cnJlbnQgY3JvcCBjb29yZGluYXRlcyBhbmQgY2FsY3VsYXRlcyBhbiBhbHBoYSB2YWx1ZSBiYXNlZAorICAgICAgICAgICAgICogb24gdGhlIGNvcm5lciByYWRpdXMgYW5kIGRpc3RhbmNlIGZyb20gdGhlIGNyb3AgY2VudGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmbG9hdCBhcHBseUNvcm5lclJhZGl1cyh2ZWMyIGNyb3BDb29yZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmVjMiBwb3NpdGlvbiA9IGNyb3BDb29yZHMgLSBjcm9wQ2VudGVyOworICAgICAgICAgICAgICAgIC8vIFNjYWxlIGRvd24gdGhlIGRpc3QgdmVjdG9yIGhlcmUsIGFzIG90aGVyd2lzZSBsYXJnZSBjb3JuZXIKKyAgICAgICAgICAgICAgICAvLyByYWRpaSBjYW4gY2F1c2UgZmxvYXRpbmcgcG9pbnQgaXNzdWVzIHdoZW4gY29tcHV0aW5nIHRoZSBub3JtCisgICAgICAgICAgICAgICAgdmVjMiBkaXN0ID0gKGFicyhwb3NpdGlvbikgLSBjcm9wQ2VudGVyICsgdmVjMihjb3JuZXJSYWRpdXMpKSAvIDE2LjA7CisgICAgICAgICAgICAgICAgLy8gT25jZSB3ZSd2ZSBmb3VuZCB0aGUgbm9ybSwgdGhlbiBzY2FsZSBiYWNrIHVwLgorICAgICAgICAgICAgICAgIGZsb2F0IHBsYW5lID0gbGVuZ3RoKG1heChkaXN0LCB2ZWMyKDAuMCkpKSAqIDE2LjA7CisgICAgICAgICAgICAgICAgcmV0dXJuIDEuMCAtIGNsYW1wKHBsYW5lIC0gY29ybmVyUmFkaXVzLCAwLjAsIDEuMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgfQorCisgICAgaWYgKG5lZWRzLmRyYXdTaGFkb3dzKCkpIHsKKyAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgdmFyeWluZyBsb3dwIHZlYzQgb3V0U2hhZG93Q29sb3I7CisgICAgICAgICAgICB2YXJ5aW5nIGxvd3AgdmVjMyBvdXRTaGFkb3dQYXJhbXM7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmV0dXJucyB0aGUgc2hhZG93IGNvbG9yLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB2ZWM0IGdldFNoYWRvd0NvbG9yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb3dwIGZsb2F0IGQgPSBsZW5ndGgob3V0U2hhZG93UGFyYW1zLnh5KTsKKyAgICAgICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMihvdXRTaGFkb3dQYXJhbXMueiAqICgxLjAgLSBkKSwgMC41KTsKKyAgICAgICAgICAgICAgICBsb3dwIGZsb2F0IGZhY3RvciA9IHRleHR1cmUyRChzYW1wbGVyLCB1dikuYTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3V0U2hhZG93Q29sb3IgKiBmYWN0b3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgfQorCisgICAgaWYgKG5lZWRzLmdldFRleHR1cmVUYXJnZXQoKSA9PSBLZXk6OlRFWFRVUkVfT0ZGIHx8IG5lZWRzLmhhc0FscGhhKCkpIHsKKyAgICAgICAgZnMgPDwgInVuaWZvcm0gdmVjNCBjb2xvcjsiOworICAgIH0KKworICAgIGlmIChuZWVkcy5pc1k0MTBCVDIwMjAoKSkgeworICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICB2ZWMzIGNvbnZlcnRZNDEwQlQyMDIwKGNvbnN0IHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB2ZWMzIG9mZnNldCA9IHZlYzMoMC4wNjI1LCAwLjUsIDAuNSk7CisgICAgICAgICAgICAgICAgY29uc3QgbWF0MyB0cmFuc2Zvcm0gPSBtYXQzKAorICAgICAgICAgICAgICAgICAgICB2ZWMzKDEuMTY3OCwgIDEuMTY3OCwgMS4xNjc4KSwKKyAgICAgICAgICAgICAgICAgICAgdmVjMyggICAwLjAsIC0wLjE4NzgsIDIuMTQ4MSksCisgICAgICAgICAgICAgICAgICAgIHZlYzMoMS42ODM2LCAtMC42NTIzLCAgIDAuMCkpOworICAgICAgICAgICAgICAgIC8vIFkgaXMgaW4gRywgVSBpcyBpbiBSLCBhbmQgViBpcyBpbiBCCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYW1wKHRyYW5zZm9ybSAqIChjb2xvci5ncmIgLSBvZmZzZXQpLCAwLjAsIDEuMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgfQorCisgICAgaWYgKG5lZWRzLmhhc1RyYW5zZm9ybU1hdHJpeCgpIHx8IChuZWVkcy5nZXRJbnB1dFRGKCkgIT0gbmVlZHMuZ2V0T3V0cHV0VEYoKSkpIHsKKyAgICAgICAgaWYgKG5lZWRzLm5lZWRzVG9uZU1hcHBpbmcoKSkgeworICAgICAgICAgICAgZnMgPDwgInVuaWZvcm0gZmxvYXQgZGlzcGxheU1heEx1bWluYW5jZTsiOworICAgICAgICAgICAgZnMgPDwgInVuaWZvcm0gZmxvYXQgbWF4TWFzdGVyaW5nTHVtaW5hbmNlOyI7CisgICAgICAgICAgICBmcyA8PCAidW5pZm9ybSBmbG9hdCBtYXhDb250ZW50THVtaW5hbmNlOyI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZHMuaGFzSW5wdXRUcmFuc2Zvcm1NYXRyaXgoKSkgeworICAgICAgICAgICAgZnMgPDwgInVuaWZvcm0gbWF0NCBpbnB1dFRyYW5zZm9ybU1hdHJpeDsiOworICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgSW5wdXRUcmFuc2Zvcm0oY29uc3QgaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAodmVjMyhpbnB1dFRyYW5zZm9ybU1hdHJpeCAqIHZlYzQoY29sb3IsIDEuMCkpLCAwLjAsIDEuMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgSW5wdXRUcmFuc2Zvcm0oY29uc3QgaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gYSB3aWRlciBjb2xvcnNwYWNlIHRvIGEgbmFycm93ZXIgb25lIGNhbgorICAgICAgICAvLyByZXN1bHQgaW4gPjEuMCBvciA8MC4wIHBpeGVsIHZhbHVlcworICAgICAgICBpZiAobmVlZHMuaGFzT3V0cHV0VHJhbnNmb3JtTWF0cml4KCkpIHsKKyAgICAgICAgICAgIGZzIDw8ICJ1bmlmb3JtIG1hdDQgb3V0cHV0VHJhbnNmb3JtTWF0cml4OyI7CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBPdXRwdXRUcmFuc2Zvcm0oY29uc3QgaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAodmVjMyhvdXRwdXRUcmFuc2Zvcm1NYXRyaXggKiB2ZWM0KGNvbG9yLCAxLjApKSwgMC4wLCAxLjApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIE91dHB1dFRyYW5zZm9ybShjb25zdCBoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChjb2xvciwgMC4wLCAxLjApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlRU9URihmcywgbmVlZHMpOworICAgICAgICBnZW5lcmF0ZU9PVEYoZnMsIG5lZWRzKTsKKyAgICAgICAgZ2VuZXJhdGVPRVRGKGZzLCBuZWVkcyk7CisgICAgfQorCisgICAgZnMgPDwgInZvaWQgbWFpbih2b2lkKSB7IiA8PCBpbmRlbnQ7CisgICAgaWYgKG5lZWRzLmRyYXdTaGFkb3dzKCkpIHsKKyAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvciA9IGdldFNoYWRvd0NvbG9yKCk7IjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobmVlZHMuaXNUZXh0dXJpbmcoKSkgeworICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRChzYW1wbGVyLCBvdXRUZXhDb29yZHMpOyI7CisgICAgICAgICAgICBpZiAobmVlZHMuaXNZNDEwQlQyMDIwKCkpIHsKKyAgICAgICAgICAgICAgICBmcyA8PCAiZ2xfRnJhZ0NvbG9yLnJnYiA9IGNvbnZlcnRZNDEwQlQyMDIwKGdsX0ZyYWdDb2xvci5yZ2IpOyI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcyA8PCAiZ2xfRnJhZ0NvbG9yLnJnYiA9IGNvbG9yLnJnYjsiOworICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvci5hID0gMS4wOyI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzLmlzT3BhcXVlKCkpIHsKKyAgICAgICAgICAgIGZzIDw8ICJnbF9GcmFnQ29sb3IuYSA9IDEuMDsiOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkcy5oYXNBbHBoYSgpKSB7CisgICAgICAgICAgICAvLyBtb2R1bGF0ZSB0aGUgY3VycmVudCBhbHBoYSB2YWx1ZSB3aXRoIGFscGhhIHNldAorICAgICAgICAgICAgaWYgKG5lZWRzLmlzUHJlbXVsdGlwbGllZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gLi4uIGFuZCB0aGUgY29sb3IgdG9vIGlmIHdlJ3JlIHByZW11bHRpcGxpZWQKKyAgICAgICAgICAgICAgICBmcyA8PCAiZ2xfRnJhZ0NvbG9yICo9IGNvbG9yLmE7IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvci5hICo9IGNvbG9yLmE7IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZWVkcy5oYXNUcmFuc2Zvcm1NYXRyaXgoKSB8fCAobmVlZHMuZ2V0SW5wdXRURigpICE9IG5lZWRzLmdldE91dHB1dFRGKCkpKSB7CisgICAgICAgIGlmICghbmVlZHMuaXNPcGFxdWUoKSAmJiBuZWVkcy5pc1ByZW11bHRpcGxpZWQoKSkgeworICAgICAgICAgICAgLy8gdW4tcHJlbXVsdGlwbHkgaWYgbmVlZGVkIGJlZm9yZSBsaW5lYXJpemF0aW9uCisgICAgICAgICAgICAvLyBhdm9pZCBkaXZpZGUgYnkgMCBieSBhZGRpbmcgMC41LzI1NiB0byB0aGUgYWxwaGEgY2hhbm5lbAorICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvci5yZ2IgPSBnbF9GcmFnQ29sb3IucmdiIC8gKGdsX0ZyYWdDb2xvci5hICsgMC4wMDE5KTsiOworICAgICAgICB9CisgICAgICAgIGZzIDw8ICJnbF9GcmFnQ29sb3IucmdiID0gIgorICAgICAgICAgICAgICAiT0VURihPdXRwdXRUcmFuc2Zvcm0oT09URihJbnB1dFRyYW5zZm9ybShFT1RGKGdsX0ZyYWdDb2xvci5yZ2IpKSkpKTsiOworICAgICAgICBpZiAoIW5lZWRzLmlzT3BhcXVlKCkgJiYgbmVlZHMuaXNQcmVtdWx0aXBsaWVkKCkpIHsKKyAgICAgICAgICAgIC8vIGFuZCByZS1wcmVtdWx0aXBseSBpZiBuZWVkZWQgYWZ0ZXIgZ2FtbWEgY29ycmVjdGlvbgorICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvci5yZ2IgPSBnbF9GcmFnQ29sb3IucmdiICogKGdsX0ZyYWdDb2xvci5hICsgMC4wMDE5KTsiOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5lZWRzLmhhc1JvdW5kZWRDb3JuZXJzKCkpIHsKKyAgICAgICAgaWYgKG5lZWRzLmlzUHJlbXVsdGlwbGllZCgpKSB7CisgICAgICAgICAgICBmcyA8PCAiZ2xfRnJhZ0NvbG9yICo9IHZlYzQoYXBwbHlDb3JuZXJSYWRpdXMob3V0Q3JvcENvb3JkcykpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcyA8PCAiZ2xfRnJhZ0NvbG9yLmEgKj0gYXBwbHlDb3JuZXJSYWRpdXMob3V0Q3JvcENvb3Jkcyk7IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZzIDw8IGRlZGVudCA8PCAifSI7CisgICAgcmV0dXJuIGZzLmdldFN0cmluZygpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbT4gUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVByb2dyYW0oY29uc3QgS2V5JiBuZWVkcykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyB2ZXJ0ZXggc2hhZGVyCisgICAgU3RyaW5nOCB2cyA9IGdlbmVyYXRlVmVydGV4U2hhZGVyKG5lZWRzKTsKKworICAgIC8vIGZyYWdtZW50IHNoYWRlcgorICAgIFN0cmluZzggZnMgPSBnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKG5lZWRzKTsKKworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFByb2dyYW0+KG5lZWRzLCB2cy5zdHJpbmcoKSwgZnMuc3RyaW5nKCkpOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6dXNlUHJvZ3JhbShFR0xDb250ZXh0IGNvbnRleHQsIGNvbnN0IERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIC8vIGdlbmVyYXRlIHRoZSBrZXkgZm9yIHRoZSBzaGFkZXIgYmFzZWQgb24gdGhlIGRlc2NyaXB0aW9uCisgICAgS2V5IG5lZWRzKGNvbXB1dGVLZXkoZGVzY3JpcHRpb24pKTsKKworICAgIC8vIGxvb2stdXAgdGhlIHByb2dyYW0gaW4gdGhlIGNhY2hlCisgICAgYXV0byYgY2FjaGUgPSBtQ2FjaGVzW2NvbnRleHRdOworICAgIGF1dG8gaXQgPSBjYWNoZS5maW5kKG5lZWRzKTsKKyAgICBpZiAoaXQgPT0gY2FjaGUuZW5kKCkpIHsKKyAgICAgICAgLy8gd2UgZGlkbid0IGZpbmQgb3VyIHByb2dyYW0sIHNvIGdlbmVyYXRlIG9uZS4uLgorICAgICAgICBuc2Vjc190IHRpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGl0ID0gY2FjaGUuZW1wbGFjZShuZWVkcywgZ2VuZXJhdGVQcm9ncmFtKG5lZWRzKSkuZmlyc3Q7CisgICAgICAgIHRpbWUgPSBzeXN0ZW1UaW1lKCkgLSB0aW1lOworCisgICAgICAgIEFMT0dWKCI+Pj4gZ2VuZXJhdGVkIG5ldyBwcm9ncmFtIGZvciBjb250ZXh0ICVwOiBuZWVkcz0lMDhYLCB0aW1lPSV1IG1zICglenUgcHJvZ3JhbXMpIiwKKyAgICAgICAgICAgICAgY29udGV4dCwgbmVlZHMubUtleSwgdWludDMyX3QobnMybXModGltZSkpLCBjYWNoZS5zaXplKCkpOworICAgIH0KKworICAgIC8vIGhlcmUgd2UgaGF2ZSBhIHN1aXRhYmxlIHByb2dyYW0gZm9yIHRoaXMgZGVzY3JpcHRpb24KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbT4mIHByb2dyYW0gPSBpdC0+c2Vjb25kOworICAgIGlmIChwcm9ncmFtLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcHJvZ3JhbS0+dXNlKCk7CisgICAgICAgIHByb2dyYW0tPnNldFVuaWZvcm1zKGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9Qcm9ncmFtQ2FjaGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9Qcm9ncmFtQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFlNjMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL1Byb2dyYW1DYWNoZS5oCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNGX1JFTkRFUl9FTkdJTkVfUFJPR1JBTUNBQ0hFX0gKKyNkZWZpbmUgU0ZfUkVOREVSX0VOR0lORV9QUk9HUkFNQ0FDSEVfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL3ByaXZhdGUvRGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KKyNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitzdHJ1Y3QgRGVzY3JpcHRpb247CisKK25hbWVzcGFjZSBnbCB7CisKK2NsYXNzIEZvcm1hdHRlcjsKK2NsYXNzIFByb2dyYW07CisKKy8qCisgKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBHTFNMIHByb2dyYW1zIHN1aXRhYmxlIHRvIGhhbmRsZSBhIGdpdmVuCisgKiBEZXNjcmlwdGlvbi4gSXQncyByZXNwb25zaWJsZSBmb3IgZmlndXJpbmcgb3V0IHdoYXQgdG8KKyAqIGdlbmVyYXRlIGZyb20gYSBEZXNjcmlwdGlvbi4KKyAqIEl0IGFsc28gbWFpbnRhaW5zIGEgY2FjaGUgb2YgdGhlc2UgUHJvZ3JhbXMuCisgKi8KK2NsYXNzIFByb2dyYW1DYWNoZSA6IHB1YmxpYyBTaW5nbGV0b248UHJvZ3JhbUNhY2hlPiB7CitwdWJsaWM6CisgICAgLyoKKyAgICAgKiBLZXkgaXMgdXNlZCB0byByZXRyaWV2ZSBhIFByb2dyYW0gaW4gdGhlIGNhY2hlLgorICAgICAqIEEgS2V5IGlzIGdlbmVyYXRlZCBmcm9tIGEgRGVzY3JpcHRpb24uCisgICAgICovCisgICAgY2xhc3MgS2V5IHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFByb2dyYW1DYWNoZTsKKyAgICAgICAgdHlwZWRlZiB1aW50MzJfdCBrZXlfdDsKKyAgICAgICAga2V5X3QgbUtleTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBCTEVORF9TSElGVCA9IDAsCisgICAgICAgICAgICBCTEVORF9NQVNLID0gMSA8PCBCTEVORF9TSElGVCwKKyAgICAgICAgICAgIEJMRU5EX1BSRU1VTFQgPSAxIDw8IEJMRU5EX1NISUZULAorICAgICAgICAgICAgQkxFTkRfTk9STUFMID0gMCA8PCBCTEVORF9TSElGVCwKKworICAgICAgICAgICAgT1BBQ0lUWV9TSElGVCA9IDEsCisgICAgICAgICAgICBPUEFDSVRZX01BU0sgPSAxIDw8IE9QQUNJVFlfU0hJRlQsCisgICAgICAgICAgICBPUEFDSVRZX09QQVFVRSA9IDEgPDwgT1BBQ0lUWV9TSElGVCwKKyAgICAgICAgICAgIE9QQUNJVFlfVFJBTlNMVUNFTlQgPSAwIDw8IE9QQUNJVFlfU0hJRlQsCisKKyAgICAgICAgICAgIEFMUEhBX1NISUZUID0gMiwKKyAgICAgICAgICAgIEFMUEhBX01BU0sgPSAxIDw8IEFMUEhBX1NISUZULAorICAgICAgICAgICAgQUxQSEFfTFRfT05FID0gMSA8PCBBTFBIQV9TSElGVCwKKyAgICAgICAgICAgIEFMUEhBX0VRX09ORSA9IDAgPDwgQUxQSEFfU0hJRlQsCisKKyAgICAgICAgICAgIFRFWFRVUkVfU0hJRlQgPSAzLAorICAgICAgICAgICAgVEVYVFVSRV9NQVNLID0gMyA8PCBURVhUVVJFX1NISUZULAorICAgICAgICAgICAgVEVYVFVSRV9PRkYgPSAwIDw8IFRFWFRVUkVfU0hJRlQsCisgICAgICAgICAgICBURVhUVVJFX0VYVCA9IDEgPDwgVEVYVFVSRV9TSElGVCwKKyAgICAgICAgICAgIFRFWFRVUkVfMkQgPSAyIDw8IFRFWFRVUkVfU0hJRlQsCisKKyAgICAgICAgICAgIFJPVU5ERURfQ09STkVSU19TSElGVCA9IDUsCisgICAgICAgICAgICBST1VOREVEX0NPUk5FUlNfTUFTSyA9IDEgPDwgUk9VTkRFRF9DT1JORVJTX1NISUZULAorICAgICAgICAgICAgUk9VTkRFRF9DT1JORVJTX09GRiA9IDAgPDwgUk9VTkRFRF9DT1JORVJTX1NISUZULAorICAgICAgICAgICAgUk9VTkRFRF9DT1JORVJTX09OID0gMSA8PCBST1VOREVEX0NPUk5FUlNfU0hJRlQsCisKKyAgICAgICAgICAgIElOUFVUX1RSQU5TRk9STV9NQVRSSVhfU0hJRlQgPSA2LAorICAgICAgICAgICAgSU5QVVRfVFJBTlNGT1JNX01BVFJJWF9NQVNLID0gMSA8PCBJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX1NISUZULAorICAgICAgICAgICAgSU5QVVRfVFJBTlNGT1JNX01BVFJJWF9PRkYgPSAwIDw8IElOUFVUX1RSQU5TRk9STV9NQVRSSVhfU0hJRlQsCisgICAgICAgICAgICBJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX09OID0gMSA8PCBJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX1NISUZULAorCisgICAgICAgICAgICBPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9TSElGVCA9IDcsCisgICAgICAgICAgICBPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9NQVNLID0gMSA8PCBPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9TSElGVCwKKyAgICAgICAgICAgIE9VVFBVVF9UUkFOU0ZPUk1fTUFUUklYX09GRiA9IDAgPDwgT1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfU0hJRlQsCisgICAgICAgICAgICBPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9PTiA9IDEgPDwgT1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfU0hJRlQsCisKKyAgICAgICAgICAgIElOUFVUX1RGX1NISUZUID0gOCwKKyAgICAgICAgICAgIElOUFVUX1RGX01BU0sgPSAzIDw8IElOUFVUX1RGX1NISUZULAorICAgICAgICAgICAgSU5QVVRfVEZfTElORUFSID0gMCA8PCBJTlBVVF9URl9TSElGVCwKKyAgICAgICAgICAgIElOUFVUX1RGX1NSR0IgPSAxIDw8IElOUFVUX1RGX1NISUZULAorICAgICAgICAgICAgSU5QVVRfVEZfU1QyMDg0ID0gMiA8PCBJTlBVVF9URl9TSElGVCwKKyAgICAgICAgICAgIElOUFVUX1RGX0hMRyA9IDMgPDwgSU5QVVRfVEZfU0hJRlQsCisKKyAgICAgICAgICAgIE9VVFBVVF9URl9TSElGVCA9IDEwLAorICAgICAgICAgICAgT1VUUFVUX1RGX01BU0sgPSAzIDw8IE9VVFBVVF9URl9TSElGVCwKKyAgICAgICAgICAgIE9VVFBVVF9URl9MSU5FQVIgPSAwIDw8IE9VVFBVVF9URl9TSElGVCwKKyAgICAgICAgICAgIE9VVFBVVF9URl9TUkdCID0gMSA8PCBPVVRQVVRfVEZfU0hJRlQsCisgICAgICAgICAgICBPVVRQVVRfVEZfU1QyMDg0ID0gMiA8PCBPVVRQVVRfVEZfU0hJRlQsCisgICAgICAgICAgICBPVVRQVVRfVEZfSExHID0gMyA8PCBPVVRQVVRfVEZfU0hJRlQsCisKKyAgICAgICAgICAgIFk0MTBfQlQyMDIwX1NISUZUID0gMTIsCisgICAgICAgICAgICBZNDEwX0JUMjAyMF9NQVNLID0gMSA8PCBZNDEwX0JUMjAyMF9TSElGVCwKKyAgICAgICAgICAgIFk0MTBfQlQyMDIwX09GRiA9IDAgPDwgWTQxMF9CVDIwMjBfU0hJRlQsCisgICAgICAgICAgICBZNDEwX0JUMjAyMF9PTiA9IDEgPDwgWTQxMF9CVDIwMjBfU0hJRlQsCisKKyAgICAgICAgICAgIFNIQURPV19TSElGVCA9IDEzLAorICAgICAgICAgICAgU0hBRE9XX01BU0sgPSAxIDw8IFNIQURPV19TSElGVCwKKyAgICAgICAgICAgIFNIQURPV19PRkYgPSAwIDw8IFNIQURPV19TSElGVCwKKyAgICAgICAgICAgIFNIQURPV19PTiA9IDEgPDwgU0hBRE9XX1NISUZULAorICAgICAgICB9OworCisgICAgICAgIGlubGluZSBLZXkoKSA6IG1LZXkoMCkge30KKyAgICAgICAgaW5saW5lIEtleShjb25zdCBLZXkmIHJocykgOiBtS2V5KHJocy5tS2V5KSB7fQorCisgICAgICAgIGlubGluZSBLZXkmIHNldChrZXlfdCBtYXNrLCBrZXlfdCB2YWx1ZSkgeworICAgICAgICAgICAgbUtleSA9IChtS2V5ICYgfm1hc2spIHwgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBpc1RleHR1cmluZygpIGNvbnN0IHsgcmV0dXJuIChtS2V5ICYgVEVYVFVSRV9NQVNLKSAhPSBURVhUVVJFX09GRjsgfQorICAgICAgICBpbmxpbmUgYm9vbCBoYXNUZXh0dXJlQ29vcmRzKCkgY29uc3QgeyByZXR1cm4gaXNUZXh0dXJpbmcoKSAmJiAhZHJhd1NoYWRvd3MoKTsgfQorICAgICAgICBpbmxpbmUgaW50IGdldFRleHR1cmVUYXJnZXQoKSBjb25zdCB7IHJldHVybiAobUtleSAmIFRFWFRVUkVfTUFTSyk7IH0KKyAgICAgICAgaW5saW5lIGJvb2wgaXNQcmVtdWx0aXBsaWVkKCkgY29uc3QgeyByZXR1cm4gKG1LZXkgJiBCTEVORF9NQVNLKSA9PSBCTEVORF9QUkVNVUxUOyB9CisgICAgICAgIGlubGluZSBib29sIGlzT3BhcXVlKCkgY29uc3QgeyByZXR1cm4gKG1LZXkgJiBPUEFDSVRZX01BU0spID09IE9QQUNJVFlfT1BBUVVFOyB9CisgICAgICAgIGlubGluZSBib29sIGhhc0FscGhhKCkgY29uc3QgeyByZXR1cm4gKG1LZXkgJiBBTFBIQV9NQVNLKSA9PSBBTFBIQV9MVF9PTkU7IH0KKyAgICAgICAgaW5saW5lIGJvb2wgaGFzUm91bmRlZENvcm5lcnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1LZXkgJiBST1VOREVEX0NPUk5FUlNfTUFTSykgPT0gUk9VTkRFRF9DT1JORVJTX09OOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIGRyYXdTaGFkb3dzKCkgY29uc3QgeyByZXR1cm4gKG1LZXkgJiBTSEFET1dfTUFTSykgPT0gU0hBRE9XX09OOyB9CisgICAgICAgIGlubGluZSBib29sIGhhc0lucHV0VHJhbnNmb3JtTWF0cml4KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChtS2V5ICYgSU5QVVRfVFJBTlNGT1JNX01BVFJJWF9NQVNLKSA9PSBJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX09OOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIGhhc091dHB1dFRyYW5zZm9ybU1hdHJpeCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUtleSAmIE9VVFBVVF9UUkFOU0ZPUk1fTUFUUklYX01BU0spID09IE9VVFBVVF9UUkFOU0ZPUk1fTUFUUklYX09OOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIGhhc1RyYW5zZm9ybU1hdHJpeCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBoYXNJbnB1dFRyYW5zZm9ybU1hdHJpeCgpIHx8IGhhc091dHB1dFRyYW5zZm9ybU1hdHJpeCgpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBpbnQgZ2V0SW5wdXRURigpIGNvbnN0IHsgcmV0dXJuIChtS2V5ICYgSU5QVVRfVEZfTUFTSyk7IH0KKyAgICAgICAgaW5saW5lIGludCBnZXRPdXRwdXRURigpIGNvbnN0IHsgcmV0dXJuIChtS2V5ICYgT1VUUFVUX1RGX01BU0spOyB9CisKKyAgICAgICAgLy8gV2hlbiBIRFIgYW5kIG5vbi1IRFIgY29udGVudHMgYXJlIG1peGVkLCBvciBkaWZmZXJlbnQgdHlwZXMgb2YgSERSIGNvbnRlbnRzIGFyZQorICAgICAgICAvLyBtaXhlZCwgd2Ugd2lsbCBkbyBhIHRvbmUgbWFwcGluZyBwcm9jZXNzIHRvIHRvbmUgbWFwIHRoZSBpbnB1dCBjb250ZW50IHRvIG91dHB1dAorICAgICAgICAvLyBjb250ZW50LiBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgaGFuZGxlZCwgdGhleSBhcmU6CisgICAgICAgIC8vICogU0RSIC0+IEhMRworICAgICAgICAvLyAqIFNEUiAtPiBQUQorICAgICAgICAvLyAqIEhMRyAtPiBQUQorICAgICAgICBpbmxpbmUgYm9vbCBuZWVkc1RvbmVNYXBwaW5nKCkgY29uc3QgeworICAgICAgICAgICAgaW50IGlucHV0VEYgPSBnZXRJbnB1dFRGKCk7CisgICAgICAgICAgICBpbnQgb3V0cHV0VEYgPSBnZXRPdXRwdXRURigpOworCisgICAgICAgICAgICAvLyBSZXR1cm4gZmFsc2Ugd2hlbiBjb252ZXJ0aW5nIGZyb20gU0RSIHRvIFNEUi4KKyAgICAgICAgICAgIGlmIChpbnB1dFRGID09IEtleTo6SU5QVVRfVEZfU1JHQiAmJiBvdXRwdXRURiA9PSBLZXk6Ok9VVFBVVF9URl9MSU5FQVIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXRURiA9PSBLZXk6OklOUFVUX1RGX0xJTkVBUiAmJiBvdXRwdXRURiA9PSBLZXk6Ok9VVFBVVF9URl9TUkdCKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFRGID4+PSBLZXk6OklOUFVUX1RGX1NISUZUOworICAgICAgICAgICAgb3V0cHV0VEYgPj49IEtleTo6T1VUUFVUX1RGX1NISUZUOworICAgICAgICAgICAgcmV0dXJuIGlucHV0VEYgIT0gb3V0cHV0VEY7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIGJvb2wgaXNZNDEwQlQyMDIwKCkgY29uc3QgeyByZXR1cm4gKG1LZXkgJiBZNDEwX0JUMjAyMF9NQVNLKSA9PSBZNDEwX0JUMjAyMF9PTjsgfQorCisgICAgICAgIC8vIGZvciB1c2UgYnkgc3RkOjp1bm9yZGVyZWRfbWFwCisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEtleSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG1LZXkgPT0gb3RoZXIubUtleTsgfQorCisgICAgICAgIHN0cnVjdCBIYXNoIHsKKyAgICAgICAgICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IEtleSYga2V5KSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGtleS5tS2V5KTsgfQorICAgICAgICB9OworICAgIH07CisKKyAgICBQcm9ncmFtQ2FjaGUoKSA9IGRlZmF1bHQ7CisgICAgflByb2dyYW1DYWNoZSgpID0gZGVmYXVsdDsKKworICAgIC8vIEdlbmVyYXRlIHNoYWRlcnMgdG8gcG9wdWxhdGUgdGhlIGNhY2hlCisgICAgdm9pZCBwcmltZUNhY2hlKGNvbnN0IEVHTENvbnRleHQgY29udGV4dCwgYm9vbCB1c2VDb2xvck1hbmFnZW1lbnQsIGJvb2wgdG9uZU1hcHBlclNoYWRlck9ubHkpOworCisgICAgc2l6ZV90IGdldFNpemUoY29uc3QgRUdMQ29udGV4dCBjb250ZXh0KSB7IHJldHVybiBtQ2FjaGVzW2NvbnRleHRdLnNpemUoKTsgfQorCisgICAgLy8gdXNlUHJvZ3JhbSBsb29rdXAgYSBzdWl0YWJsZSBwcm9ncmFtIGluIHRoZSBjYWNoZSBvciBnZW5lcmF0ZXMgb25lCisgICAgLy8gaWYgbm9uZSBjYW4gYmUgZm91bmQuCisgICAgdm9pZCB1c2VQcm9ncmFtKGNvbnN0IEVHTENvbnRleHQgY29udGV4dCwgY29uc3QgRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworcHJpdmF0ZToKKyAgICAvLyBjb21wdXRlIGEgY2FjaGUgS2V5IGZyb20gYSBEZXNjcmlwdGlvbgorICAgIHN0YXRpYyBLZXkgY29tcHV0ZUtleShjb25zdCBEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworICAgIC8vIEdlbmVyYXRlIEVPVEYgYmFzZWQgZnJvbSBLZXkuCisgICAgc3RhdGljIHZvaWQgZ2VuZXJhdGVFT1RGKEZvcm1hdHRlciYgZnMsIGNvbnN0IEtleSYgbmVlZHMpOworICAgIC8vIEdlbmVyYXRlIG5lY2Vzc2FyeSB0b25lIG1hcHBpbmcgbWV0aG9kcyBmb3IgT09URi4KKyAgICBzdGF0aWMgdm9pZCBnZW5lcmF0ZVRvbmVNYXBwaW5nUHJvY2VzcyhGb3JtYXR0ZXImIGZzLCBjb25zdCBLZXkmIG5lZWRzKTsKKyAgICAvLyBHZW5lcmF0ZSBPT1RGIGJhc2VkIGZyb20gS2V5LgorICAgIHN0YXRpYyB2b2lkIGdlbmVyYXRlT09URihGb3JtYXR0ZXImIGZzLCBjb25zdCBLZXkmIG5lZWRzKTsKKyAgICAvLyBHZW5lcmF0ZSBPRVRGIGJhc2VkIGZyb20gS2V5LgorICAgIHN0YXRpYyB2b2lkIGdlbmVyYXRlT0VURihGb3JtYXR0ZXImIGZzLCBjb25zdCBLZXkmIG5lZWRzKTsKKyAgICAvLyBnZW5lcmF0ZXMgYSBwcm9ncmFtIGZyb20gdGhlIEtleQorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbT4gZ2VuZXJhdGVQcm9ncmFtKGNvbnN0IEtleSYgbmVlZHMpOworICAgIC8vIGdlbmVyYXRlcyB0aGUgdmVydGV4IHNoYWRlciBmcm9tIHRoZSBLZXkKKyAgICBzdGF0aWMgU3RyaW5nOCBnZW5lcmF0ZVZlcnRleFNoYWRlcihjb25zdCBLZXkmIG5lZWRzKTsKKyAgICAvLyBnZW5lcmF0ZXMgdGhlIGZyYWdtZW50IHNoYWRlciBmcm9tIHRoZSBLZXkKKyAgICBzdGF0aWMgU3RyaW5nOCBnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGNvbnN0IEtleSYgbmVlZHMpOworCisgICAgLy8gS2V5L1ZhbHVlIG1hcCB1c2VkIGZvciBjYWNoaW5nIFByb2dyYW1zLiBDdXJyZW50bHkgdGhlIGNhY2hlCisgICAgLy8gaXMgbmV2ZXIgc2hydW5rIChhbmQgdGhlIEdMIHByb2dyYW0gb2JqZWN0cyBhcmUgbmV2ZXIgZGVsZXRlZCkuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPEVHTENvbnRleHQsIHN0ZDo6dW5vcmRlcmVkX21hcDxLZXksIHN0ZDo6dW5pcXVlX3B0cjxQcm9ncmFtPiwgS2V5OjpIYXNoPj4KKyAgICAgICAgICAgIG1DYWNoZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCisKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKHJlbmRlcmVuZ2luZTo6Z2w6OlByb2dyYW1DYWNoZTo6S2V5KQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKiBTRl9SRU5ERVJfRU5HSU5FX1BST0dSQU1DQUNIRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9CbHVyRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0JsdXJGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjE4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9CbHVyRmlsdGVyLmNwcApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKKworI2luY2x1ZGUgIkJsdXJGaWx0ZXIuaCIKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMzL2dsMy5oPgorI2luY2x1ZGUgPEdMRVMzL2dsM2V4dC5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNUeXBlcy5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK0JsdXJGaWx0ZXI6OkJsdXJGaWx0ZXIoR0xFU1JlbmRlckVuZ2luZSYgZW5naW5lKQorICAgICAgOiBtRW5naW5lKGVuZ2luZSksCisgICAgICAgIG1Db21wb3NpdGlvbkZibyhlbmdpbmUpLAorICAgICAgICBtUGluZ0ZibyhlbmdpbmUpLAorICAgICAgICBtUG9uZ0ZibyhlbmdpbmUpLAorICAgICAgICBtTWl4UHJvZ3JhbShlbmdpbmUpLAorICAgICAgICBtQmx1clByb2dyYW0oZW5naW5lKSB7CisgICAgbU1peFByb2dyYW0uY29tcGlsZShnZXRWZXJ0ZXhTaGFkZXIoKSwgZ2V0TWl4RnJhZ1NoYWRlcigpKTsKKyAgICBtTVBvc0xvYyA9IG1NaXhQcm9ncmFtLmdldEF0dHJpYnV0ZUxvY2F0aW9uKCJhUG9zaXRpb24iKTsKKyAgICBtTVV2TG9jID0gbU1peFByb2dyYW0uZ2V0QXR0cmlidXRlTG9jYXRpb24oImFVViIpOworICAgIG1NVGV4dHVyZUxvYyA9IG1NaXhQcm9ncmFtLmdldFVuaWZvcm1Mb2NhdGlvbigidVRleHR1cmUiKTsKKyAgICBtTUNvbXBvc2l0aW9uVGV4dHVyZUxvYyA9IG1NaXhQcm9ncmFtLmdldFVuaWZvcm1Mb2NhdGlvbigidUNvbXBvc2l0aW9uVGV4dHVyZSIpOworICAgIG1NTWl4TG9jID0gbU1peFByb2dyYW0uZ2V0VW5pZm9ybUxvY2F0aW9uKCJ1TWl4Iik7CisKKyAgICBtQmx1clByb2dyYW0uY29tcGlsZShnZXRWZXJ0ZXhTaGFkZXIoKSwgZ2V0RnJhZ21lbnRTaGFkZXIoKSk7CisgICAgbUJQb3NMb2MgPSBtQmx1clByb2dyYW0uZ2V0QXR0cmlidXRlTG9jYXRpb24oImFQb3NpdGlvbiIpOworICAgIG1CVXZMb2MgPSBtQmx1clByb2dyYW0uZ2V0QXR0cmlidXRlTG9jYXRpb24oImFVViIpOworICAgIG1CVGV4dHVyZUxvYyA9IG1CbHVyUHJvZ3JhbS5nZXRVbmlmb3JtTG9jYXRpb24oInVUZXh0dXJlIik7CisgICAgbUJPZmZzZXRMb2MgPSBtQmx1clByb2dyYW0uZ2V0VW5pZm9ybUxvY2F0aW9uKCJ1T2Zmc2V0Iik7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gc2l6ZSA9IDIuMGY7CisgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHRyYW5zbGF0aW9uID0gMS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHZib0RhdGFbXSA9IHsKKyAgICAgICAgLy8gVmVydGV4IGRhdGEKKyAgICAgICAgdHJhbnNsYXRpb24gLSBzaXplLCAtdHJhbnNsYXRpb24gLSBzaXplLAorICAgICAgICB0cmFuc2xhdGlvbiAtIHNpemUsIC10cmFuc2xhdGlvbiArIHNpemUsCisgICAgICAgIHRyYW5zbGF0aW9uICsgc2l6ZSwgLXRyYW5zbGF0aW9uICsgc2l6ZSwKKyAgICAgICAgLy8gVVYgZGF0YQorICAgICAgICAwLjBmLCAwLjBmIC0gdHJhbnNsYXRpb24sCisgICAgICAgIDAuMGYsIHNpemUgLSB0cmFuc2xhdGlvbiwKKyAgICAgICAgc2l6ZSwgc2l6ZSAtIHRyYW5zbGF0aW9uCisgICAgfTsKKyAgICBtTWVzaEJ1ZmZlci5hbGxvY2F0ZUJ1ZmZlcnModmJvRGF0YSwgMTIgLyogc2l6ZSAqLyk7Cit9CisKK3N0YXR1c190IEJsdXJGaWx0ZXI6OnNldEFzRHJhd1RhcmdldChjb25zdCBEaXNwbGF5U2V0dGluZ3MmIGRpc3BsYXksIHVpbnQzMl90IHJhZGl1cykgeworICAgIEFUUkFDRV9OQU1FKCJCbHVyRmlsdGVyOjpzZXRBc0RyYXdUYXJnZXQiKTsKKyAgICBtUmFkaXVzID0gcmFkaXVzOworICAgIG1EaXNwbGF5WCA9IGRpc3BsYXkucGh5c2ljYWxEaXNwbGF5LmxlZnQ7CisgICAgbURpc3BsYXlZID0gZGlzcGxheS5waHlzaWNhbERpc3BsYXkudG9wOworCisgICAgaWYgKG1EaXNwbGF5V2lkdGggPCBkaXNwbGF5LnBoeXNpY2FsRGlzcGxheS53aWR0aCgpIHx8CisgICAgICAgIG1EaXNwbGF5SGVpZ2h0IDwgZGlzcGxheS5waHlzaWNhbERpc3BsYXkuaGVpZ2h0KCkpIHsKKyAgICAgICAgQVRSQUNFX05BTUUoIkJsdXJGaWx0ZXI6OmFsbG9jYXRpbmdUZXh0dXJlcyIpOworCisgICAgICAgIG1EaXNwbGF5V2lkdGggPSBkaXNwbGF5LnBoeXNpY2FsRGlzcGxheS53aWR0aCgpOworICAgICAgICBtRGlzcGxheUhlaWdodCA9IGRpc3BsYXkucGh5c2ljYWxEaXNwbGF5LmhlaWdodCgpOworICAgICAgICBtQ29tcG9zaXRpb25GYm8uYWxsb2NhdGVCdWZmZXJzKG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0KTsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBmYm9XaWR0aCA9IGZsb29yZihtRGlzcGxheVdpZHRoICoga0Zib1NjYWxlKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZmJvSGVpZ2h0ID0gZmxvb3JmKG1EaXNwbGF5SGVpZ2h0ICoga0Zib1NjYWxlKTsKKyAgICAgICAgbVBpbmdGYm8uYWxsb2NhdGVCdWZmZXJzKGZib1dpZHRoLCBmYm9IZWlnaHQpOworICAgICAgICBtUG9uZ0Ziby5hbGxvY2F0ZUJ1ZmZlcnMoZmJvV2lkdGgsIGZib0hlaWdodCk7CisKKyAgICAgICAgaWYgKG1QaW5nRmJvLmdldFN0YXR1cygpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBwaW5nIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG1QaW5nRmJvLmdldFN0YXR1cygpOworICAgICAgICB9CisgICAgICAgIGlmIChtUG9uZ0Ziby5nZXRTdGF0dXMoKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgcG9uZyBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBtUG9uZ0Ziby5nZXRTdGF0dXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNvbXBvc2l0aW9uRmJvLmdldFN0YXR1cygpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjb21wb3NpdGlvbiBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBtQ29tcG9zaXRpb25GYm8uZ2V0U3RhdHVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQmx1clByb2dyYW0uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzaGFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBHTF9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1Db21wb3NpdGlvbkZiby5iaW5kKCk7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtQ29tcG9zaXRpb25GYm8uZ2V0QnVmZmVyV2lkdGgoKSwgbUNvbXBvc2l0aW9uRmJvLmdldEJ1ZmZlckhlaWdodCgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQmx1ckZpbHRlcjo6ZHJhd01lc2goR0x1aW50IHV2LCBHTHVpbnQgcG9zaXRpb24pIHsKKworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkodXYpOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOworICAgIG1NZXNoQnVmZmVyLmJpbmQoKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIocG9zaXRpb24sIDIgLyogc2l6ZSAqLywgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyICogc2l6ZW9mKEdMZmxvYXQpIC8qIHN0cmlkZSAqLywgMCAvKiBvZmZzZXQgKi8pOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih1diwgMiAvKiBzaXplICovLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAgLyogc3RyaWRlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoR0x2b2lkKikoNiAqIHNpemVvZihHTGZsb2F0KSkgLyogb2Zmc2V0ICovKTsKKyAgICBtTWVzaEJ1ZmZlci51bmJpbmQoKTsKKworICAgIC8vIGRyYXcgbWVzaAorICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAgLyogZmlyc3QgKi8sIDMgLyogY291bnQgKi8pOworfQorCitzdGF0dXNfdCBCbHVyRmlsdGVyOjpwcmVwYXJlKCkgeworICAgIEFUUkFDRV9OQU1FKCJCbHVyRmlsdGVyOjpwcmVwYXJlIik7CisKKyAgICAvLyBLYXdhc2UgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiBHYXVzc2lhbiwgYnV0IGl0IGJlaGF2ZXMgZGlmZmVyZW50bHkgZnJvbSBpdC4KKyAgICAvLyBBIHJhZGl1cyB0cmFuc2Zvcm1hdGlvbiBpcyByZXF1aXJlZCBmb3IgYXBwcm94aW1hdGluZyB0aGVtLCBhbmQgYWxzbyB0byBpbnRyb2R1Y2UKKyAgICAvLyBub24taW50ZWdlciBzdGVwcywgbmVjZXNzYXJ5IHRvIHNtb290aGx5IGludGVycG9sYXRlIGxhcmdlIHJhZGlpLgorICAgIGNvbnN0IGF1dG8gcmFkaXVzID0gbVJhZGl1cyAvIDYuMGY7CisKKyAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgcGFzc2VzIHdlJ2xsIGRvLCBiYXNlZCBvbiB0aGUgcmFkaXVzLgorICAgIC8vIFRvbyBtYW55IHBhc3NlcyB3aWxsIG1ha2UgdGhlIG9wZXJhdGlvbiBleHBlbnNpdmUuCisgICAgY29uc3QgYXV0byBwYXNzZXMgPSBtaW4oa01heFBhc3NlcywgKHVpbnQzMl90KWNlaWwocmFkaXVzKSk7CisKKyAgICBjb25zdCBmbG9hdCByYWRpdXNCeVBhc3NlcyA9IHJhZGl1cyAvIChmbG9hdClwYXNzZXM7CisgICAgY29uc3QgZmxvYXQgc3RlcFggPSByYWRpdXNCeVBhc3NlcyAvIChmbG9hdCltQ29tcG9zaXRpb25GYm8uZ2V0QnVmZmVyV2lkdGgoKTsKKyAgICBjb25zdCBmbG9hdCBzdGVwWSA9IHJhZGl1c0J5UGFzc2VzIC8gKGZsb2F0KW1Db21wb3NpdGlvbkZiby5nZXRCdWZmZXJIZWlnaHQoKTsKKworICAgIC8vIExldCdzIHN0YXJ0IGJ5IGRvd25zYW1wbGluZyBhbmQgYmx1cnJpbmcgdGhlIGNvbXBvc2l0ZWQgZnJhbWUgc2ltdWx0YW5lb3VzbHkuCisgICAgbUJsdXJQcm9ncmFtLnVzZVByb2dyYW0oKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGdsVW5pZm9ybTFpKG1CVGV4dHVyZUxvYywgMCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtQ29tcG9zaXRpb25GYm8uZ2V0VGV4dHVyZU5hbWUoKSk7CisgICAgZ2xVbmlmb3JtMmYobUJPZmZzZXRMb2MsIHN0ZXBYLCBzdGVwWSk7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtUGluZ0Ziby5nZXRCdWZmZXJXaWR0aCgpLCBtUGluZ0Ziby5nZXRCdWZmZXJIZWlnaHQoKSk7CisgICAgbVBpbmdGYm8uYmluZCgpOworICAgIGRyYXdNZXNoKG1CVXZMb2MsIG1CUG9zTG9jKTsKKworICAgIC8vIEFuZCBub3cgd2UnbGwgcGluZyBwb25nIGJldHdlZW4gb3VyIHRleHR1cmVzLCB0byBhY2N1bXVsYXRlIHRoZSByZXN1bHQgb2YgdmFyaW91cyBvZmZzZXRzLgorICAgIEdMRnJhbWVidWZmZXIqIHJlYWQgPSAmbVBpbmdGYm87CisgICAgR0xGcmFtZWJ1ZmZlciogZHJhdyA9ICZtUG9uZ0ZibzsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIGRyYXctPmdldEJ1ZmZlcldpZHRoKCksIGRyYXctPmdldEJ1ZmZlckhlaWdodCgpKTsKKyAgICBmb3IgKGF1dG8gaSA9IDE7IGkgPCBwYXNzZXM7IGkrKykgeworICAgICAgICBBVFJBQ0VfTkFNRSgiQmx1ckZpbHRlcjo6cmVuZGVyUGFzcyIpOworICAgICAgICBkcmF3LT5iaW5kKCk7CisKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCByZWFkLT5nZXRUZXh0dXJlTmFtZSgpKTsKKyAgICAgICAgZ2xVbmlmb3JtMmYobUJPZmZzZXRMb2MsIHN0ZXBYICogaSwgc3RlcFkgKiBpKTsKKworICAgICAgICBkcmF3TWVzaChtQlV2TG9jLCBtQlBvc0xvYyk7CisKKyAgICAgICAgLy8gU3dhcCBidWZmZXJzIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBhdXRvIHRtcCA9IGRyYXc7CisgICAgICAgIGRyYXcgPSByZWFkOworICAgICAgICByZWFkID0gdG1wOworICAgIH0KKyAgICBtTGFzdERyYXdUYXJnZXQgPSByZWFkOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBCbHVyRmlsdGVyOjpyZW5kZXIoYm9vbCBtdWx0aVBhc3MpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQmx1ckZpbHRlcjo6cmVuZGVyIik7CisKKyAgICAvLyBOb3cgbGV0J3Mgc2NhbGUgb3VyIGJsdXIgdXAuIEl0IHdpbGwgYmUgaW50ZXJwb2xhdGVkIHdpdGggdGhlIGxhcmdlciBjb21wb3NpdGVkCisgICAgLy8gdGV4dHVyZSBmb3IgdGhlIGZpcnN0IGZyYW1lcywgdG8gaGlkZSBkb3duc2NhbGluZyBhcnRpZmFjdHMuCisgICAgR0xmbG9hdCBtaXggPSBmbWluKDEuMCwgbVJhZGl1cyAvIGtNYXhDcm9zc0ZhZGVSYWRpdXMpOworCisgICAgLy8gV2hlbiBkb2luZyBtdWx0aXBsZSBwYXNzZXMsIHdlIGNhbm5vdCB0cnkgdG8gcmVhZCBtQ29tcG9zaXRpb25GYm8sIGdpdmVuIHRoYXQgd2UnbGwKKyAgICAvLyBiZSB3cml0aW5nIG9udG8gaXQuIExldCdzIGRpc2FibGUgdGhlIGNyb3NzZmFkZSwgb3RoZXJ3aXNlIHdlJ2QgbmVlZCAxIGV4dHJhIGZyYW1lIGJ1ZmZlciwKKyAgICAvLyBhcyBsYXJnZSBhcyB0aGUgc2NyZWVuIHNpemUuCisgICAgaWYgKG1peCA+PSAxIHx8IG11bHRpUGFzcykgeworICAgICAgICBtTGFzdERyYXdUYXJnZXQtPmJpbmRBc1JlYWRCdWZmZXIoKTsKKyAgICAgICAgZ2xCbGl0RnJhbWVidWZmZXIoMCwgMCwgbUxhc3REcmF3VGFyZ2V0LT5nZXRCdWZmZXJXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERyYXdUYXJnZXQtPmdldEJ1ZmZlckhlaWdodCgpLCBtRGlzcGxheVgsIG1EaXNwbGF5WSwgbURpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlIZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBtTWl4UHJvZ3JhbS51c2VQcm9ncmFtKCk7CisgICAgZ2xVbmlmb3JtMWYobU1NaXhMb2MsIG1peCk7CisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1MYXN0RHJhd1RhcmdldC0+Z2V0VGV4dHVyZU5hbWUoKSk7CisgICAgZ2xVbmlmb3JtMWkobU1UZXh0dXJlTG9jLCAwKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTEpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbUNvbXBvc2l0aW9uRmJvLmdldFRleHR1cmVOYW1lKCkpOworICAgIGdsVW5pZm9ybTFpKG1NQ29tcG9zaXRpb25UZXh0dXJlTG9jLCAxKTsKKworICAgIGRyYXdNZXNoKG1NVXZMb2MsIG1NUG9zTG9jKTsKKworICAgIGdsVXNlUHJvZ3JhbSgwKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIG1FbmdpbmUuY2hlY2tFcnJvcnMoIkRyYXdpbmcgYmx1ciBtZXNoIik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdHJpbmcgQmx1ckZpbHRlcjo6Z2V0VmVydGV4U2hhZGVyKCkgY29uc3QgeworICAgIHJldHVybiBSIlNIQURFUigjdmVyc2lvbiAzMTAgZXMKKyAgICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CisKKyAgICAgICAgaW4gdmVjMiBhUG9zaXRpb247CisgICAgICAgIGluIGhpZ2hwIHZlYzIgYVVWOworICAgICAgICBvdXQgaGlnaHAgdmVjMiB2VVY7CisKKyAgICAgICAgdm9pZCBtYWluKCkgeworICAgICAgICAgICAgdlVWID0gYVVWOworICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFQb3NpdGlvbiwgMC4wLCAxLjApOworICAgICAgICB9CisgICAgKVNIQURFUiI7Cit9CisKK3N0cmluZyBCbHVyRmlsdGVyOjpnZXRGcmFnbWVudFNoYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUiJTSEFERVIoI3ZlcnNpb24gMzEwIGVzCisgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OworCisgICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlOworICAgICAgICB1bmlmb3JtIHZlYzIgdU9mZnNldDsKKworICAgICAgICBpbiBoaWdocCB2ZWMyIHZVVjsKKyAgICAgICAgb3V0IHZlYzQgZnJhZ0NvbG9yOworCisgICAgICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgICAgIGZyYWdDb2xvciAgPSB0ZXh0dXJlKHVUZXh0dXJlLCB2VVYsIDAuMCk7CisgICAgICAgICAgICBmcmFnQ29sb3IgKz0gdGV4dHVyZSh1VGV4dHVyZSwgdlVWICsgdmVjMiggdU9mZnNldC54LCAgdU9mZnNldC55KSwgMC4wKTsKKyAgICAgICAgICAgIGZyYWdDb2xvciArPSB0ZXh0dXJlKHVUZXh0dXJlLCB2VVYgKyB2ZWMyKCB1T2Zmc2V0LngsIC11T2Zmc2V0LnkpLCAwLjApOworICAgICAgICAgICAgZnJhZ0NvbG9yICs9IHRleHR1cmUodVRleHR1cmUsIHZVViArIHZlYzIoLXVPZmZzZXQueCwgIHVPZmZzZXQueSksIDAuMCk7CisgICAgICAgICAgICBmcmFnQ29sb3IgKz0gdGV4dHVyZSh1VGV4dHVyZSwgdlVWICsgdmVjMigtdU9mZnNldC54LCAtdU9mZnNldC55KSwgMC4wKTsKKworICAgICAgICAgICAgZnJhZ0NvbG9yID0gdmVjNChmcmFnQ29sb3IucmdiICogMC4yLCAxLjApOworICAgICAgICB9CisgICAgKVNIQURFUiI7Cit9CisKK3N0cmluZyBCbHVyRmlsdGVyOjpnZXRNaXhGcmFnU2hhZGVyKCkgY29uc3QgeworICAgIHN0cmluZyBzaGFkZXIgPSBSIlNIQURFUigjdmVyc2lvbiAzMTAgZXMKKyAgICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CisKKyAgICAgICAgaW4gaGlnaHAgdmVjMiB2VVY7CisgICAgICAgIG91dCB2ZWM0IGZyYWdDb2xvcjsKKworICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1Q29tcG9zaXRpb25UZXh0dXJlOworICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZTsKKyAgICAgICAgdW5pZm9ybSBmbG9hdCB1TWl4OworCisgICAgICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgICAgIHZlYzQgYmx1cnJlZCA9IHRleHR1cmUodVRleHR1cmUsIHZVVik7CisgICAgICAgICAgICB2ZWM0IGNvbXBvc2l0aW9uID0gdGV4dHVyZSh1Q29tcG9zaXRpb25UZXh0dXJlLCB2VVYpOworICAgICAgICAgICAgZnJhZ0NvbG9yID0gbWl4KGNvbXBvc2l0aW9uLCBibHVycmVkLCB1TWl4KTsKKyAgICAgICAgfQorICAgIClTSEFERVIiOworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0JsdXJGaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0JsdXJGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNhOGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL2ZpbHRlcnMvQmx1ckZpbHRlci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dWkvR3JhcGhpY1R5cGVzLmg+CisjaW5jbHVkZSAiLi4vR0xFU1JlbmRlckVuZ2luZS5oIgorI2luY2x1ZGUgIi4uL0dMRnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICIuLi9HTFZlcnRleEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdlbmVyaWNQcm9ncmFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgS2F3YXNlIGJsdXIsIGFzIGRlc2NyaWJlZCBpbiBoZXJlOgorICogaHR0cHM6Ly9jb21tdW5pdHkuYXJtLmNvbS9jZnMtZmlsZS9fX2tleS9jb21tdW5pdHlzZXJ2ZXItYmxvZ3MtY29tcG9uZW50cy13ZWJsb2dmaWxlcy8KKyAqIDAwLTAwLTAwLTIwLTY2L3NpZ2dyYXBoMjAxNV8yRDAwX21tZ18yRDAwX21hcml1c18yRDAwX25vdGVzLnBkZgorICovCitjbGFzcyBCbHVyRmlsdGVyIHsKK3B1YmxpYzoKKyAgICAvLyBEb3duc2FtcGxlIEZCTyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRmJvU2NhbGUgPSAwLjI1ZjsKKyAgICAvLyBNYXhpbXVtIG51bWJlciBvZiByZW5kZXIgcGFzc2VzCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4UGFzc2VzID0gNDsKKyAgICAvLyBUbyBhdm9pZCBkb3duc2NhbGluZyBhcnRpZmFjdHMsIHdlIGludGVycG9sYXRlIHRoZSBibHVycmVkIGZibyB3aXRoIHRoZSBmdWxsIGNvbXBvc2l0ZWQKKyAgICAvLyBpbWFnZSwgdXAgdG8gdGhpcyByYWRpdXMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrTWF4Q3Jvc3NGYWRlUmFkaXVzID0gMzAuMGY7CisKKyAgICBleHBsaWNpdCBCbHVyRmlsdGVyKEdMRVNSZW5kZXJFbmdpbmUmIGVuZ2luZSk7CisgICAgdmlydHVhbCB+Qmx1ckZpbHRlcigpe307CisKKyAgICAvLyBTZXQgdXAgcmVuZGVyIHRhcmdldHMsIHJlZGlyZWN0aW5nIG91dHB1dCB0byBvZmZzY3JlZW4gdGV4dHVyZS4KKyAgICBzdGF0dXNfdCBzZXRBc0RyYXdUYXJnZXQoY29uc3QgRGlzcGxheVNldHRpbmdzJiwgdWludDMyX3QgcmFkaXVzKTsKKyAgICAvLyBFeGVjdXRlIGJsdXIgcGFzc2VzLCByZW5kZXJpbmcgdG8gb2Zmc2NyZWVuIHRleHR1cmUuCisgICAgc3RhdHVzX3QgcHJlcGFyZSgpOworICAgIC8vIFJlbmRlciBibHVyIHRvIHRoZSBib3VuZCBmcmFtZWJ1ZmZlciAoc2NyZWVuKS4KKyAgICBzdGF0dXNfdCByZW5kZXIoYm9vbCBtdWx0aVBhc3MpOworCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1SYWRpdXM7CisgICAgdm9pZCBkcmF3TWVzaChHTHVpbnQgdXYsIEdMdWludCBwb3NpdGlvbik7CisgICAgc3RyaW5nIGdldFZlcnRleFNoYWRlcigpIGNvbnN0OworICAgIHN0cmluZyBnZXRGcmFnbWVudFNoYWRlcigpIGNvbnN0OworICAgIHN0cmluZyBnZXRNaXhGcmFnU2hhZGVyKCkgY29uc3Q7CisKKyAgICBHTEVTUmVuZGVyRW5naW5lJiBtRW5naW5lOworICAgIC8vIEZyYW1lIGJ1ZmZlciBob2xkaW5nIHRoZSBjb21wb3NpdGVkIGJhY2tncm91bmQuCisgICAgR0xGcmFtZWJ1ZmZlciBtQ29tcG9zaXRpb25GYm87CisgICAgLy8gRnJhbWUgYnVmZmVycyBob2xkaW5nIHRoZSBibHVyIHBhc3Nlcy4KKyAgICBHTEZyYW1lYnVmZmVyIG1QaW5nRmJvOworICAgIEdMRnJhbWVidWZmZXIgbVBvbmdGYm87CisgICAgdWludDMyX3QgbURpc3BsYXlXaWR0aCA9IDA7CisgICAgdWludDMyX3QgbURpc3BsYXlIZWlnaHQgPSAwOworICAgIHVpbnQzMl90IG1EaXNwbGF5WCA9IDA7CisgICAgdWludDMyX3QgbURpc3BsYXlZID0gMDsKKyAgICAvLyBCdWZmZXIgaG9sZGluZyB0aGUgZmluYWwgYmx1ciBwYXNzLgorICAgIEdMRnJhbWVidWZmZXIqIG1MYXN0RHJhd1RhcmdldDsKKworICAgIC8vIFZCTyBjb250YWluaW5nIHZlcnRleCBhbmQgdXYgZGF0YSBvZiBhIGZ1bGxzY3JlZW4gdHJpYW5nbGUuCisgICAgR0xWZXJ0ZXhCdWZmZXIgbU1lc2hCdWZmZXI7CisKKyAgICBHZW5lcmljUHJvZ3JhbSBtTWl4UHJvZ3JhbTsKKyAgICBHTHVpbnQgbU1Qb3NMb2M7CisgICAgR0x1aW50IG1NVXZMb2M7CisgICAgR0x1aW50IG1NTWl4TG9jOworICAgIEdMdWludCBtTVRleHR1cmVMb2M7CisgICAgR0x1aW50IG1NQ29tcG9zaXRpb25UZXh0dXJlTG9jOworCisgICAgR2VuZXJpY1Byb2dyYW0gbUJsdXJQcm9ncmFtOworICAgIEdMdWludCBtQlBvc0xvYzsKKyAgICBHTHVpbnQgbUJVdkxvYzsKKyAgICBHTHVpbnQgbUJUZXh0dXJlTG9jOworICAgIEdMdWludCBtQk9mZnNldExvYzsKK307CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0dlbmVyaWNQcm9ncmFtLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0dlbmVyaWNQcm9ncmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjM1ODg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL2ZpbHRlcnMvR2VuZXJpY1Byb2dyYW0uY3BwCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiR2VuZXJpY1Byb2dyYW0uaCIKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworR2VuZXJpY1Byb2dyYW06OkdlbmVyaWNQcm9ncmFtKEdMRVNSZW5kZXJFbmdpbmUmIGVuZ2luZSkgOiBtRW5naW5lKGVuZ2luZSkge30KKworR2VuZXJpY1Byb2dyYW06On5HZW5lcmljUHJvZ3JhbSgpIHsKKyAgICBpZiAobVZlcnRleFNoYWRlckhhbmRsZSAhPSAwKSB7CisgICAgICAgIGlmIChtUHJvZ3JhbUhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICBnbERldGFjaFNoYWRlcihtUHJvZ3JhbUhhbmRsZSwgbVZlcnRleFNoYWRlckhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgZ2xEZWxldGVTaGFkZXIobVZlcnRleFNoYWRlckhhbmRsZSk7CisgICAgfQorCisgICAgaWYgKG1GcmFnbWVudFNoYWRlckhhbmRsZSAhPSAwKSB7CisgICAgICAgIGlmIChtUHJvZ3JhbUhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICBnbERldGFjaFNoYWRlcihtUHJvZ3JhbUhhbmRsZSwgbUZyYWdtZW50U2hhZGVySGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBnbERlbGV0ZVNoYWRlcihtRnJhZ21lbnRTaGFkZXJIYW5kbGUpOworICAgIH0KKworICAgIGlmIChtUHJvZ3JhbUhhbmRsZSAhPSAwKSB7CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShtUHJvZ3JhbUhhbmRsZSk7CisgICAgfQorfQorCit2b2lkIEdlbmVyaWNQcm9ncmFtOjpjb21waWxlKHN0cmluZyB2ZXJ0ZXhTaGFkZXIsIHN0cmluZyBmcmFnbWVudFNoYWRlcikgeworICAgIG1WZXJ0ZXhTaGFkZXJIYW5kbGUgPSBjb21waWxlU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlcik7CisgICAgbUZyYWdtZW50U2hhZGVySGFuZGxlID0gY29tcGlsZVNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyKTsKKyAgICBpZiAobVZlcnRleFNoYWRlckhhbmRsZSA9PSAwIHx8IG1GcmFnbWVudFNoYWRlckhhbmRsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBYm9ydGluZyBwcm9ncmFtIGNyZWF0aW9uLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Qcm9ncmFtSGFuZGxlID0gY3JlYXRlQW5kTGluayhtVmVydGV4U2hhZGVySGFuZGxlLCBtRnJhZ21lbnRTaGFkZXJIYW5kbGUpOworICAgIG1FbmdpbmUuY2hlY2tFcnJvcnMoIkxpbmtpbmcgcHJvZ3JhbSIpOworfQorCit2b2lkIEdlbmVyaWNQcm9ncmFtOjp1c2VQcm9ncmFtKCkgY29uc3QgeworICAgIGdsVXNlUHJvZ3JhbShtUHJvZ3JhbUhhbmRsZSk7Cit9CisKK0dMdWludCBHZW5lcmljUHJvZ3JhbTo6Y29tcGlsZVNoYWRlcihHTHVpbnQgdHlwZSwgc3RyaW5nIHNyYykgY29uc3QgeworICAgIGNvbnN0IEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcih0eXBlKTsKKyAgICBpZiAoc2hhZGVyID09IDApIHsKKyAgICAgICAgbUVuZ2luZS5jaGVja0Vycm9ycygiQ3JlYXRpbmcgc2hhZGVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBHTGNoYXIqIGNoYXJTcmMgPSAoY29uc3QgR0xjaGFyKilzcmMuY19zdHIoKTsKKyAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZjaGFyU3JjLCBudWxscHRyKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKworICAgIEdMaW50IGlzQ29tcGlsZWQgPSAwOworICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmlzQ29tcGlsZWQpOworICAgIGlmIChpc0NvbXBpbGVkID09IEdMX0ZBTFNFKSB7CisgICAgICAgIEdMaW50IG1heExlbmd0aCA9IDA7CisgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZtYXhMZW5ndGgpOworICAgICAgICBzdHJpbmcgZXJyb3JMb2c7CisgICAgICAgIGVycm9yTG9nLnJlc2VydmUobWF4TGVuZ3RoKTsKKyAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgbWF4TGVuZ3RoLCAmbWF4TGVuZ3RoLCBlcnJvckxvZy5kYXRhKCkpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgICAgICBBTE9HRSgiRXJyb3IgY29tcGlsaW5nIHNoYWRlcjogJXMiLCBlcnJvckxvZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBzaGFkZXI7Cit9CitHTHVpbnQgR2VuZXJpY1Byb2dyYW06OmNyZWF0ZUFuZExpbmsoR0x1aW50IHZlcnRleFNoYWRlciwgR0x1aW50IGZyYWdtZW50U2hhZGVyKSBjb25zdCB7CisgICAgY29uc3QgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICBtRW5naW5lLmNoZWNrRXJyb3JzKCJDcmVhdGluZyBwcm9ncmFtIik7CisKKyAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsKKyAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOworICAgIG1FbmdpbmUuY2hlY2tFcnJvcnMoIkxpbmtpbmcgcHJvZ3JhbSIpOworICAgIHJldHVybiBwcm9ncmFtOworfQorCitHTHVpbnQgR2VuZXJpY1Byb2dyYW06OmdldFVuaWZvcm1Mb2NhdGlvbihjb25zdCBzdHJpbmcgbmFtZSkgY29uc3QgeworICAgIGlmIChtUHJvZ3JhbUhhbmRsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJDYW4ndCBnZXQgbG9jYXRpb24gb2YgJXMgb24gYW4gaW52YWxpZCBwcm9ncmFtLiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtSGFuZGxlLCAoY29uc3QgR0xjaGFyKiluYW1lLmNfc3RyKCkpOworfQorCitHTHVpbnQgR2VuZXJpY1Byb2dyYW06OmdldEF0dHJpYnV0ZUxvY2F0aW9uKGNvbnN0IHN0cmluZyBuYW1lKSBjb25zdCB7CisgICAgaWYgKG1Qcm9ncmFtSGFuZGxlID09IDApIHsKKyAgICAgICAgQUxPR0UoIkNhbid0IGdldCBsb2NhdGlvbiBvZiAlcyBvbiBhbiBpbnZhbGlkIHByb2dyYW0uIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbUhhbmRsZSwgKGNvbnN0IEdMY2hhciopbmFtZS5jX3N0cigpKTsKK30KKworYm9vbCBHZW5lcmljUHJvZ3JhbTo6aXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVByb2dyYW1IYW5kbGUgIT0gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL2ZpbHRlcnMvR2VuZXJpY1Byb2dyYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0dlbmVyaWNQcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhMmE1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0dlbmVyaWNQcm9ncmFtLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx1aS9HcmFwaGljVHlwZXMuaD4KKyNpbmNsdWRlICIuLi9HTEVTUmVuZGVyRW5naW5lLmgiCisjaW5jbHVkZSAiLi4vR0xGcmFtZWJ1ZmZlci5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK2NsYXNzIEdlbmVyaWNQcm9ncmFtIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBHZW5lcmljUHJvZ3JhbShHTEVTUmVuZGVyRW5naW5lJiByZW5kZXJFbmdpbmUpOworICAgIH5HZW5lcmljUHJvZ3JhbSgpOworICAgIHZvaWQgY29tcGlsZShzdHJpbmcgdmVydGV4U2hhZGVyLCBzdHJpbmcgZnJhZ21lbnRTaGFkZXIpOworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OworICAgIHZvaWQgdXNlUHJvZ3JhbSgpIGNvbnN0OworICAgIEdMdWludCBnZXRBdHRyaWJ1dGVMb2NhdGlvbihjb25zdCBzdHJpbmcgbmFtZSkgY29uc3Q7CisgICAgR0x1aW50IGdldFVuaWZvcm1Mb2NhdGlvbihjb25zdCBzdHJpbmcgbmFtZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgR0x1aW50IGNvbXBpbGVTaGFkZXIoR0x1aW50IHR5cGUsIGNvbnN0IHN0cmluZyBzcmMpIGNvbnN0OworICAgIEdMdWludCBjcmVhdGVBbmRMaW5rKEdMdWludCB2ZXJ0ZXhTaGFkZXIsIEdMdWludCBmcmFnbWVudFNoYWRlcikgY29uc3Q7CisKKyAgICBHTEVTUmVuZGVyRW5naW5lJiBtRW5naW5lOworICAgIEdMdWludCBtVmVydGV4U2hhZGVySGFuZGxlID0gMDsKKyAgICBHTHVpbnQgbUZyYWdtZW50U2hhZGVySGFuZGxlID0gMDsKKyAgICBHTHVpbnQgbVByb2dyYW1IYW5kbGUgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0Rpc3BsYXlTZXR0aW5ncy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0Rpc3BsYXlTZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTZkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvRGlzcGxheVNldHRpbmdzLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisKKyNpbmNsdWRlIDxtYXRoL21hdDQuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljVHlwZXMuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8dWkvUmVnaW9uLmg+CisjaW5jbHVkZSA8dWkvVHJhbnNmb3JtLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCisvLyBEaXNwbGF5U2V0dGluZ3MgY29udGFpbnMgdGhlIHNldHRpbmdzIHRoYXQgYXJlIGFwcGxpY2FibGUgd2hlbiBkcmF3aW5nIGFsbAorLy8gbGF5ZXJzIGZvciBhIGdpdmVuIGRpc3BsYXkuCitzdHJ1Y3QgRGlzcGxheVNldHRpbmdzIHsKKyAgICAvLyBSZWN0YW5nbGUgZGVzY3JpYmluZyB0aGUgcGh5c2ljYWwgZGlzcGxheS4gV2Ugd2lsbCBwcm9qZWN0IGZyb20gdGhlCisgICAgLy8gbG9naWNhbCBjbGlwIG9udG8gdGhpcyByZWN0YW5nbGUuCisgICAgUmVjdCBwaHlzaWNhbERpc3BsYXkgPSBSZWN0OjpJTlZBTElEX1JFQ1Q7CisKKyAgICAvLyBSZWN0YW5nbGUgYm91bmRlZCBieSB0aGUgeCx5LSBjbGlwcGluZyBwbGFuZXMgaW4gdGhlIGxvZ2ljYWwgZGlzcGxheSwgc28KKyAgICAvLyB0aGF0IHRoZSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXggY2FuIGJlIGNvbXB1dGVkLiBXaGVuCisgICAgLy8gY29uc3RydWN0aW5nIHRoaXMgbWF0cml4LCB6LWNvb3JkaW5hdGUgYm91bmQgYXJlIGFzc3VtZWQgdG8gYmUgYXQgej0wIGFuZAorICAgIC8vIHo9MS4KKyAgICBSZWN0IGNsaXAgPSBSZWN0OjpJTlZBTElEX1JFQ1Q7CisKKyAgICAvLyBNYXhpbXVtIGx1bWluYW5jZSBwdWxsZWQgZnJvbSB0aGUgZGlzcGxheSdzIEhEUiBjYXBhYmlsaXRpZXMuCisgICAgZmxvYXQgbWF4THVtaW5hbmNlID0gMS4wZjsKKworICAgIC8vIE91dHB1dCBkYXRhc3BhY2UgdGhhdCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB3aWRlIGNvbG9yIGdhbXV0IGlzIHVzZWQsIG9yCisgICAgLy8gRGF0YVNwYWNlOjpVTktOT1dOIG90aGVyd2lzZS4KKyAgICB1aTo6RGF0YXNwYWNlIG91dHB1dERhdGFzcGFjZSA9IHVpOjpEYXRhc3BhY2U6OlVOS05PV047CisKKyAgICAvLyBBZGRpdGlvbmFsIGNvbG9yIHRyYW5zZm9ybSB0byBhcHBseSBpbiBsaW5lYXIgc3BhY2UgYWZ0ZXIgdHJhbnNmb3JtaW5nCisgICAgLy8gdG8gdGhlIG91dHB1dCBkYXRhc3BhY2UuCisgICAgbWF0NCBjb2xvclRyYW5zZm9ybSA9IG1hdDQoKTsKKworICAgIC8vIFJlZ2lvbiB0aGF0IHdpbGwgYmUgY2xlYXJlZCB0byAoMCwgMCwgMCwgMSkgcHJpb3IgdG8gcmVuZGVyaW5nLgorICAgIC8vIFRoaXMgaXMgc3BlY2lmaWVkIGluIGxheWVyLXN0YWNrIHNwYWNlLgorICAgIFJlZ2lvbiBjbGVhclJlZ2lvbiA9IFJlZ2lvbjo6SU5WQUxJRF9SRUdJT047CisKKyAgICAvLyBBbiBhZGRpdGlvbmFsIG9yaWVudGF0aW9uIGZsYWcgdG8gYmUgYXBwbGllZCBhZnRlciBjbGlwcGluZyB0aGUgb3V0cHV0LgorICAgIC8vIEJ5IHdheSBvZiBleGFtcGxlLCB0aGlzIG1heSBiZSB1c2VkIGZvciBzdXBwb3J0aW5nIGZ1bGxzY3JlZW4gc2NyZWVuc2hvdAorICAgIC8vIGNhcHR1cmUgb2YgYSBkZXZpY2UgaW4gbGFuZHNjYXBlIHdoaWxlIHRoZSBidWZmZXIgaXMgaW4gcG9ydHJhaXQKKyAgICAvLyBvcmllbnRhdGlvbi4KKyAgICB1aW50MzJfdCBvcmllbnRhdGlvbiA9IHVpOjpUcmFuc2Zvcm06OlJPVF8wOworfTsKKworc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRGlzcGxheVNldHRpbmdzJiBsaHMsIGNvbnN0IERpc3BsYXlTZXR0aW5ncyYgcmhzKSB7CisgICAgcmV0dXJuIGxocy5waHlzaWNhbERpc3BsYXkgPT0gcmhzLnBoeXNpY2FsRGlzcGxheSAmJiBsaHMuY2xpcCA9PSByaHMuY2xpcCAmJgorICAgICAgICAgICAgbGhzLm1heEx1bWluYW5jZSA9PSByaHMubWF4THVtaW5hbmNlICYmIGxocy5vdXRwdXREYXRhc3BhY2UgPT0gcmhzLm91dHB1dERhdGFzcGFjZSAmJgorICAgICAgICAgICAgbGhzLmNvbG9yVHJhbnNmb3JtID09IHJocy5jb2xvclRyYW5zZm9ybSAmJgorICAgICAgICAgICAgbGhzLmNsZWFyUmVnaW9uLmhhc1NhbWVSZWN0cyhyaHMuY2xlYXJSZWdpb24pICYmIGxocy5vcmllbnRhdGlvbiA9PSByaHMub3JpZW50YXRpb247Cit9CisKKy8vIERlZmluaW5nIFByaW50VG8gaGVscHMgd2l0aCBHb29nbGUgVGVzdHMuCitzdGF0aWMgaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBEaXNwbGF5U2V0dGluZ3MmIHNldHRpbmdzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAqb3MgPDwgIkRpc3BsYXlTZXR0aW5ncyB7IjsKKyAgICAqb3MgPDwgIlxuICAgIC5waHlzaWNhbERpc3BsYXkgPSAiOworICAgIFByaW50VG8oc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5LCBvcyk7CisgICAgKm9zIDw8ICJcbiAgICAuY2xpcCA9ICI7CisgICAgUHJpbnRUbyhzZXR0aW5ncy5jbGlwLCBvcyk7CisgICAgKm9zIDw8ICJcbiAgICAubWF4THVtaW5hbmNlID0gIiA8PCBzZXR0aW5ncy5tYXhMdW1pbmFuY2U7CisgICAgKm9zIDw8ICJcbiAgICAub3V0cHV0RGF0YXNwYWNlID0gIjsKKyAgICBQcmludFRvKHNldHRpbmdzLm91dHB1dERhdGFzcGFjZSwgb3MpOworICAgICpvcyA8PCAiXG4gICAgLmNvbG9yVHJhbnNmb3JtID0gIiA8PCBzZXR0aW5ncy5jb2xvclRyYW5zZm9ybTsKKyAgICAqb3MgPDwgIlxuICAgIC5jbGVhclJlZ2lvbiA9ICI7CisgICAgUHJpbnRUbyhzZXR0aW5ncy5jbGVhclJlZ2lvbiwgb3MpOworICAgICpvcyA8PCAiXG4gICAgLm9yaWVudGF0aW9uID0gIiA8PCBzZXR0aW5ncy5vcmllbnRhdGlvbjsKKyAgICAqb3MgPDwgIlxufSI7Cit9CisKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0ZyYW1lYnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvRnJhbWVidWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTExMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0ZyYW1lYnVmZmVyLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK2NsYXNzIEZyYW1lYnVmZmVyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5GcmFtZWJ1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBzZXROYXRpdmVXaW5kb3dCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogbmF0aXZlQnVmZmVyLCBib29sIGlzUHJvdGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB1c2VGcmFtZWJ1ZmZlckNhY2hlKSA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9JbWFnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiNDczMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9JbWFnZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK2NsYXNzIEltYWdlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JbWFnZSgpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0TmF0aXZlV2luZG93QnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgYm9vbCBpc1Byb3RlY3RlZCkgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvTGF5ZXJTZXR0aW5ncy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0xheWVyU2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWU5MzY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0xheWVyU2V0dGluZ3MuaApAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisKKyNpbmNsdWRlIDxtYXRoL21hdDQuaD4KKyNpbmNsdWRlIDxtYXRoL3ZlYzMuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvVGV4dHVyZS5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvRmxvYXRSZWN0Lmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNUeXBlcy5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKyNpbmNsdWRlIDx1aS9SZWdpb24uaD4KKyNpbmNsdWRlIDx1aS9UcmFuc2Zvcm0uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKKy8vIE1ldGFkYXRhIGRlc2NyaWJpbmcgdGhlIGlucHV0IGJ1ZmZlciB0byByZW5kZXIgZnJvbS4KK3N0cnVjdCBCdWZmZXIgeworICAgIC8vIEJ1ZmZlciBjb250YWluaW5nIHRoZSBpbWFnZSB0aGF0IHdlIHdpbGwgcmVuZGVyLgorICAgIC8vIElmIGJ1ZmZlciA9PSBudWxscHRyLCB0aGVuIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3Qgd2lsbCBiZQorICAgIC8vIGlnbm9yZWQuCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyID0gbnVsbHB0cjsKKworICAgIC8vIEZlbmNlIHRoYXQgd2lsbCBmaXJlIHdoZW4gdGhlIGJ1ZmZlciBpcyByZWFkeSB0byBiZSBib3VuZC4KKyAgICBzcDxGZW5jZT4gZmVuY2UgPSBudWxscHRyOworCisgICAgLy8gVGV4dHVyZSBpZGVudGlmaWVyIHRvIGJpbmQgdGhlIGV4dGVybmFsIHRleHR1cmUgdG8uCisgICAgLy8gVE9ETyhhbGVjbW91cmkpOiBUaGlzIGlzIEdMLXNwZWNpZmljLi4ubWFrZSB0aGUgdHlwZSBiYWNrZW5kLWFnbm9zdGljLgorICAgIHVpbnQzMl90IHRleHR1cmVOYW1lID0gMDsKKworICAgIC8vIFdoZXRoZXIgdG8gdXNlIGZpbHRlcmluZyB3aGVuIHJlbmRlcmluZyB0aGUgdGV4dHVyZS4KKyAgICBib29sIHVzZVRleHR1cmVGaWx0ZXJpbmcgPSBmYWxzZTsKKworICAgIC8vIFRyYW5zZm9ybSBtYXRyaXggdG8gYXBwbHkgdG8gdGV4dHVyZSBjb29yZGluYXRlcy4KKyAgICBtYXQ0IHRleHR1cmVUcmFuc2Zvcm0gPSBtYXQ0KCk7CisKKyAgICAvLyBXaGV0aGVyIHRvIHVzZSBwcmUtbXVsdGlwbGllZCBhbHBoYS4KKyAgICBib29sIHVzZVByZW11bHRpcGxpZWRBbHBoYSA9IHRydWU7CisKKyAgICAvLyBPdmVycmlkZSBmbGFnIHRoYXQgYWxwaGEgZm9yIGVhY2ggcGl4ZWwgaW4gdGhlIGJ1ZmZlciAqbXVzdCogYmUgMS4wLgorICAgIC8vIExheWVyU2V0dGluZ3M6OmFscGhhIGlzIHN0aWxsIHVzZWQgaWYgaXNPcGFxdWU9PXRydWUgLSB0aGlzIGZsYWcgb25seQorICAgIC8vIG92ZXJyaWRlcyB0aGUgYWxwaGEgY2hhbm5lbCBvZiB0aGUgYnVmZmVyLgorICAgIGJvb2wgaXNPcGFxdWUgPSBmYWxzZTsKKworICAgIC8vIEhEUiBjb2xvci1zcGFjZSBzZXR0aW5nIGZvciBZNDEwLgorICAgIGJvb2wgaXNZNDEwQlQyMDIwID0gZmFsc2U7CisgICAgZmxvYXQgbWF4TWFzdGVyaW5nTHVtaW5hbmNlID0gMC4wOworICAgIGZsb2F0IG1heENvbnRlbnRMdW1pbmFuY2UgPSAwLjA7Cit9OworCisvLyBNZXRhZGF0YSBkZXNjcmliaW5nIHRoZSBsYXllciBnZW9tZXRyeS4KK3N0cnVjdCBHZW9tZXRyeSB7CisgICAgLy8gQm91bmRhcmllcyBvZiB0aGUgbGF5ZXIuCisgICAgRmxvYXRSZWN0IGJvdW5kYXJpZXMgPSBGbG9hdFJlY3QoKTsKKworICAgIC8vIFRyYW5zZm9ybSBtYXRyaXggdG8gYXBwbHkgdG8gbWVzaCBjb29yZGluYXRlcy4KKyAgICBtYXQ0IHBvc2l0aW9uVHJhbnNmb3JtID0gbWF0NCgpOworCisgICAgLy8gUmFkaXVzIG9mIHJvdW5kZWQgY29ybmVycywgaWYgZ3JlYXRlciB0aGFuIDAuIE90aGVyd2lzZSwgdGhpcyBsYXllcidzCisgICAgLy8gY29ybmVycyBhcmUgbm90IHJvdW5kZWQuCisgICAgLy8gSGF2aW5nIGNvcm5lciByYWRpdXMgd2lsbCBmb3JjZSBHUFUgY29tcG9zaXRpb24gb24gdGhlIGxheWVyIGFuZCBpdHMgY2hpbGRyZW4sIGRyYXdpbmcgaXQKKyAgICAvLyB3aXRoIGEgc3BlY2lhbCBzaGFkZXIuIFRoZSBzaGFkZXIgd2lsbCByZWNlaXZlIHRoZSByYWRpdXMgYW5kIHRoZSBjcm9wIHJlY3RhbmdsZSBhcyBpbnB1dCwKKyAgICAvLyBtb2RpZnlpbmcgdGhlIG9wYWNpdHkgb2YgdGhlIGRlc3RpbmF0aW9uIHRleHR1cmUsIG11bHRpcGx5aW5nIGl0IGJ5IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS4KKyAgICAvLyBXZSBxdWVyeSBMYXllciNnZXRSb3VuZGVkQ29ybmVyU3RhdGUoKSB0byByZXRyaWV2ZSB0aGUgcmFkaXVzIGFzIHdlbGwgYXMgdGhlIHJvdW5kZWQgY3JvcAorICAgIC8vIHJlY3RhbmdsZSB0byBmaWd1cmUgb3V0IGhvdyB0byBhcHBseSB0aGUgcmFkaXVzIGZvciB0aGlzIGxheWVyLiBUaGUgY3JvcCByZWN0YW5nbGUgd2lsbCBiZQorICAgIC8vIGluIGxvY2FsIGxheWVyIGNvb3JkaW5hdGUgc3BhY2UsIHNvIHdlIGhhdmUgdG8gdGFrZSB0aGUgbGF5ZXIgdHJhbnNmb3JtIGludG8gYWNjb3VudCB3aGVuCisgICAgLy8gd2Fsa2luZyB1cCB0aGUgdHJlZS4KKyAgICBmbG9hdCByb3VuZGVkQ29ybmVyc1JhZGl1cyA9IDAuMDsKKworICAgIC8vIFJlY3RhbmdsZSB3aXRoaW4gd2hpY2ggY29ybmVycyB3aWxsIGJlIHJvdW5kZWQuCisgICAgRmxvYXRSZWN0IHJvdW5kZWRDb3JuZXJzQ3JvcCA9IEZsb2F0UmVjdCgpOworfTsKKworLy8gRGVzY3JpcHRvciBvZiB0aGUgc291cmNlIHBpeGVscyBmb3IgdGhpcyBsYXllci4KK3N0cnVjdCBQaXhlbFNvdXJjZSB7CisgICAgLy8gU291cmNlIGJ1ZmZlcgorICAgIEJ1ZmZlciBidWZmZXIgPSBCdWZmZXIoKTsKKworICAgIC8vIFRoZSBzb2xpZCBjb2xvciB3aXRoIHdoaWNoIHRvIGZpbGwgdGhlIGxheWVyLgorICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcG9wdWxhdGVkIGlmIHdlIGRvbid0IHJlbmRlciBmcm9tIGFuIGFwcGxpY2F0aW9uCisgICAgLy8gYnVmZmVyLgorICAgIGhhbGYzIHNvbGlkQ29sb3IgPSBoYWxmMygwLjBmLCAwLjBmLCAwLjBmKTsKK307CisKKy8qCisgKiBDb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNoYWRvd3MgZHJhd24gYnkgc2luZ2xlIGxheWVyLiBTaGFkb3cgZm9sbG93cworICogbWF0ZXJpYWwgZGVzaWduIGd1aWRlbGluZXMuCisgKi8KK3N0cnVjdCBTaGFkb3dTZXR0aW5ncyB7CisgICAgLy8gQ29sb3IgdG8gdGhlIGFtYmllbnQgc2hhZG93LiBUaGUgYWxwaGEgaXMgcHJlbXVsdGlwbGllZC4KKyAgICB2ZWM0IGFtYmllbnRDb2xvciA9IHZlYzQoKTsKKworICAgIC8vIENvbG9yIHRvIHRoZSBzcG90IHNoYWRvdy4gVGhlIGFscGhhIGlzIHByZW11bHRpcGxpZWQuIFRoZSBwb3NpdGlvbiBvZiB0aGUgc3BvdCBzaGFkb3cKKyAgICAvLyBkZXBlbmRzIG9uIHRoZSBsaWdodCBwb3NpdGlvbi4KKyAgICB2ZWM0IHNwb3RDb2xvciA9IHZlYzQoKTsKKworICAgIC8vIFBvc2l0aW9uIG9mIHRoZSBsaWdodCBzb3VyY2UgdXNlZCB0byBjYXN0IHRoZSBzcG90IHNoYWRvdy4KKyAgICB2ZWMzIGxpZ2h0UG9zID0gdmVjMygpOworCisgICAgLy8gUmFkaXVzIG9mIHRoZSBzcG90IGxpZ2h0IHNvdXJjZS4gU21hbGxlciByYWRpdXMgd2lsbCBoYXZlIHNoYXJwZXIgZWRnZXMsCisgICAgLy8gbGFyZ2VyIHJhZGl1cyB3aWxsIGhhdmUgc29mdGVyIHNoYWRvd3MKKyAgICBmbG9hdCBsaWdodFJhZGl1cyA9IDAuZjsKKworICAgIC8vIExlbmd0aCBvZiB0aGUgY2FzdCBzaGFkb3cuIElmIGxlbmd0aCBpcyA8PSAwLmYgbm8gc2hhZG93cyB3aWxsIGJlIGRyYXduLgorICAgIGZsb2F0IGxlbmd0aCA9IDAuZjsKKworICAgIC8vIElmIHRydWUgZmlsbCBpbiB0aGUgY2FzdGluZyBsYXllciBpcyB0cmFuc2x1Y2VudCBhbmQgdGhlIHNoYWRvdyBuZWVkcyB0byBmaWxsIHRoZSBib3VuZHMuCisgICAgLy8gT3RoZXJ3aXNlIHRoZSBzaGFkb3cgd2lsbCBvbmx5IGJlIGRyYXduIGFyb3VuZCB0aGUgZWRnZXMgb2YgdGhlIGNhc3RpbmcgbGF5ZXIuCisgICAgYm9vbCBjYXN0ZXJJc1RyYW5zbHVjZW50ID0gZmFsc2U7Cit9OworCisvLyBUaGUgc2V0dGluZ3MgdGhhdCBSZW5kZXJFbmdpbmUgcmVxdWlyZXMgZm9yIGNvcnJlY3RseSByZW5kZXJpbmcgYSBMYXllci4KK3N0cnVjdCBMYXllclNldHRpbmdzIHsKKyAgICAvLyBHZW9tZXRyeSBpbmZvcm1hdGlvbgorICAgIEdlb21ldHJ5IGdlb21ldHJ5ID0gR2VvbWV0cnkoKTsKKworICAgIC8vIFNvdXJjZSBwaXhlbHMgZm9yIHRoaXMgbGF5ZXIuCisgICAgUGl4ZWxTb3VyY2Ugc291cmNlID0gUGl4ZWxTb3VyY2UoKTsKKworICAgIC8vIEFscGhhIG9wdGlvbiB0byBibGVuZCB3aXRoIHRoZSBzb3VyY2UgcGl4ZWxzCisgICAgaGFsZiBhbHBoYSA9IGhhbGYoMC4wKTsKKworICAgIC8vIENvbG9yIHNwYWNlIGRlc2NyaWJpbmcgaG93IHRoZSBzb3VyY2UgcGl4ZWxzIHNob3VsZCBiZSBpbnRlcnByZXRlZC4KKyAgICB1aTo6RGF0YXNwYWNlIHNvdXJjZURhdGFzcGFjZSA9IHVpOjpEYXRhc3BhY2U6OlVOS05PV047CisKKyAgICAvLyBBZGRpdGlvbmFsIGxheWVyLXNwZWNpZmljIGNvbG9yIHRyYW5zZm9ybSB0byBiZSBhcHBsaWVkIGJlZm9yZSB0aGUgZ2xvYmFsCisgICAgLy8gdHJhbnNmb3JtLgorICAgIG1hdDQgY29sb3JUcmFuc2Zvcm0gPSBtYXQ0KCk7CisKKyAgICAvLyBUcnVlIGlmIGJsZW5kaW5nIHdpbGwgYmUgZm9yY2VkIHRvIGJlIGRpc2FibGVkLgorICAgIGJvb2wgZGlzYWJsZUJsZW5kaW5nID0gZmFsc2U7CisKKyAgICBTaGFkb3dTZXR0aW5ncyBzaGFkb3c7CisKKyAgICBpbnQgYmFja2dyb3VuZEJsdXJSYWRpdXMgPSAwOworfTsKKworLy8gS2VlcCBpbiBzeW5jIHdpdGggY3VzdG9tIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4KKy8vIGNvbXBvc2l0aW9uZW5naW5lL2ltcGwvQ2xpZW50Q29tcG9zaXRpb25SZXF1ZXN0Q2FjaGUuY3BwCitzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCdWZmZXImIGxocywgY29uc3QgQnVmZmVyJiByaHMpIHsKKyAgICByZXR1cm4gbGhzLmJ1ZmZlciA9PSByaHMuYnVmZmVyICYmIGxocy5mZW5jZSA9PSByaHMuZmVuY2UgJiYKKyAgICAgICAgICAgIGxocy50ZXh0dXJlTmFtZSA9PSByaHMudGV4dHVyZU5hbWUgJiYKKyAgICAgICAgICAgIGxocy51c2VUZXh0dXJlRmlsdGVyaW5nID09IHJocy51c2VUZXh0dXJlRmlsdGVyaW5nICYmCisgICAgICAgICAgICBsaHMudGV4dHVyZVRyYW5zZm9ybSA9PSByaHMudGV4dHVyZVRyYW5zZm9ybSAmJgorICAgICAgICAgICAgbGhzLnVzZVByZW11bHRpcGxpZWRBbHBoYSA9PSByaHMudXNlUHJlbXVsdGlwbGllZEFscGhhICYmCisgICAgICAgICAgICBsaHMuaXNPcGFxdWUgPT0gcmhzLmlzT3BhcXVlICYmIGxocy5pc1k0MTBCVDIwMjAgPT0gcmhzLmlzWTQxMEJUMjAyMCAmJgorICAgICAgICAgICAgbGhzLm1heE1hc3RlcmluZ0x1bWluYW5jZSA9PSByaHMubWF4TWFzdGVyaW5nTHVtaW5hbmNlICYmCisgICAgICAgICAgICBsaHMubWF4Q29udGVudEx1bWluYW5jZSA9PSByaHMubWF4Q29udGVudEx1bWluYW5jZTsKK30KKworc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR2VvbWV0cnkmIGxocywgY29uc3QgR2VvbWV0cnkmIHJocykgeworICAgIHJldHVybiBsaHMuYm91bmRhcmllcyA9PSByaHMuYm91bmRhcmllcyAmJiBsaHMucG9zaXRpb25UcmFuc2Zvcm0gPT0gcmhzLnBvc2l0aW9uVHJhbnNmb3JtICYmCisgICAgICAgICAgICBsaHMucm91bmRlZENvcm5lcnNSYWRpdXMgPT0gcmhzLnJvdW5kZWRDb3JuZXJzUmFkaXVzICYmCisgICAgICAgICAgICBsaHMucm91bmRlZENvcm5lcnNDcm9wID09IHJocy5yb3VuZGVkQ29ybmVyc0Nyb3A7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBpeGVsU291cmNlJiBsaHMsIGNvbnN0IFBpeGVsU291cmNlJiByaHMpIHsKKyAgICByZXR1cm4gbGhzLmJ1ZmZlciA9PSByaHMuYnVmZmVyICYmIGxocy5zb2xpZENvbG9yID09IHJocy5zb2xpZENvbG9yOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTaGFkb3dTZXR0aW5ncyYgbGhzLCBjb25zdCBTaGFkb3dTZXR0aW5ncyYgcmhzKSB7CisgICAgcmV0dXJuIGxocy5hbWJpZW50Q29sb3IgPT0gcmhzLmFtYmllbnRDb2xvciAmJiBsaHMuc3BvdENvbG9yID09IHJocy5zcG90Q29sb3IgJiYKKyAgICAgICAgICAgIGxocy5saWdodFBvcyA9PSByaHMubGlnaHRQb3MgJiYgbGhzLmxpZ2h0UmFkaXVzID09IHJocy5saWdodFJhZGl1cyAmJgorICAgICAgICAgICAgbGhzLmxlbmd0aCA9PSByaHMubGVuZ3RoICYmIGxocy5jYXN0ZXJJc1RyYW5zbHVjZW50ID09IHJocy5jYXN0ZXJJc1RyYW5zbHVjZW50OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMYXllclNldHRpbmdzJiBsaHMsIGNvbnN0IExheWVyU2V0dGluZ3MmIHJocykgeworICAgIHJldHVybiBsaHMuZ2VvbWV0cnkgPT0gcmhzLmdlb21ldHJ5ICYmIGxocy5zb3VyY2UgPT0gcmhzLnNvdXJjZSAmJiBsaHMuYWxwaGEgPT0gcmhzLmFscGhhICYmCisgICAgICAgICAgICBsaHMuc291cmNlRGF0YXNwYWNlID09IHJocy5zb3VyY2VEYXRhc3BhY2UgJiYKKyAgICAgICAgICAgIGxocy5jb2xvclRyYW5zZm9ybSA9PSByaHMuY29sb3JUcmFuc2Zvcm0gJiYKKyAgICAgICAgICAgIGxocy5kaXNhYmxlQmxlbmRpbmcgPT0gcmhzLmRpc2FibGVCbGVuZGluZyAmJiBsaHMuc2hhZG93ID09IHJocy5zaGFkb3cgJiYKKyAgICAgICAgICAgIGxocy5iYWNrZ3JvdW5kQmx1clJhZGl1cyA9PSByaHMuYmFja2dyb3VuZEJsdXJSYWRpdXM7Cit9CisKKy8vIERlZmluaW5nIFByaW50VG8gaGVscHMgd2l0aCBHb29nbGUgVGVzdHMuCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IEJ1ZmZlciYgc2V0dGluZ3MsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgICpvcyA8PCAiQnVmZmVyIHsiOworICAgICpvcyA8PCAiXG4gICAgLmJ1ZmZlciA9ICIgPDwgc2V0dGluZ3MuYnVmZmVyLmdldCgpOworICAgICpvcyA8PCAiXG4gICAgLmZlbmNlID0gIiA8PCBzZXR0aW5ncy5mZW5jZS5nZXQoKTsKKyAgICAqb3MgPDwgIlxuICAgIC50ZXh0dXJlTmFtZSA9ICIgPDwgc2V0dGluZ3MudGV4dHVyZU5hbWU7CisgICAgKm9zIDw8ICJcbiAgICAudXNlVGV4dHVyZUZpbHRlcmluZyA9ICIgPDwgc2V0dGluZ3MudXNlVGV4dHVyZUZpbHRlcmluZzsKKyAgICAqb3MgPDwgIlxuICAgIC50ZXh0dXJlVHJhbnNmb3JtID0gIiA8PCBzZXR0aW5ncy50ZXh0dXJlVHJhbnNmb3JtOworICAgICpvcyA8PCAiXG4gICAgLnVzZVByZW11bHRpcGxpZWRBbHBoYSA9ICIgPDwgc2V0dGluZ3MudXNlUHJlbXVsdGlwbGllZEFscGhhOworICAgICpvcyA8PCAiXG4gICAgLmlzT3BhcXVlID0gIiA8PCBzZXR0aW5ncy5pc09wYXF1ZTsKKyAgICAqb3MgPDwgIlxuICAgIC5pc1k0MTBCVDIwMjAgPSAiIDw8IHNldHRpbmdzLmlzWTQxMEJUMjAyMDsKKyAgICAqb3MgPDwgIlxuICAgIC5tYXhNYXN0ZXJpbmdMdW1pbmFuY2UgPSAiIDw8IHNldHRpbmdzLm1heE1hc3RlcmluZ0x1bWluYW5jZTsKKyAgICAqb3MgPDwgIlxuICAgIC5tYXhDb250ZW50THVtaW5hbmNlID0gIiA8PCBzZXR0aW5ncy5tYXhDb250ZW50THVtaW5hbmNlOworICAgICpvcyA8PCAiXG59IjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFByaW50VG8oY29uc3QgR2VvbWV0cnkmIHNldHRpbmdzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAqb3MgPDwgIkdlb21ldHJ5IHsiOworICAgICpvcyA8PCAiXG4gICAgLmJvdW5kYXJpZXMgPSAiOworICAgIFByaW50VG8oc2V0dGluZ3MuYm91bmRhcmllcywgb3MpOworICAgICpvcyA8PCAiXG4gICAgLnBvc2l0aW9uVHJhbnNmb3JtID0gIiA8PCBzZXR0aW5ncy5wb3NpdGlvblRyYW5zZm9ybTsKKyAgICAqb3MgPDwgIlxuICAgIC5yb3VuZGVkQ29ybmVyc1JhZGl1cyA9ICIgPDwgc2V0dGluZ3Mucm91bmRlZENvcm5lcnNSYWRpdXM7CisgICAgKm9zIDw8ICJcbiAgICAucm91bmRlZENvcm5lcnNDcm9wID0gIjsKKyAgICBQcmludFRvKHNldHRpbmdzLnJvdW5kZWRDb3JuZXJzQ3JvcCwgb3MpOworICAgICpvcyA8PCAiXG59IjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFByaW50VG8oY29uc3QgUGl4ZWxTb3VyY2UmIHNldHRpbmdzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAqb3MgPDwgIlBpeGVsU291cmNlIHsiOworICAgICpvcyA8PCAiXG4gICAgLmJ1ZmZlciA9ICI7CisgICAgUHJpbnRUbyhzZXR0aW5ncy5idWZmZXIsIG9zKTsKKyAgICAqb3MgPDwgIlxuICAgIC5zb2xpZENvbG9yID0gIiA8PCBzZXR0aW5ncy5zb2xpZENvbG9yOworICAgICpvcyA8PCAiXG59IjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFByaW50VG8oY29uc3QgU2hhZG93U2V0dGluZ3MmIHNldHRpbmdzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAqb3MgPDwgIlNoYWRvd1NldHRpbmdzIHsiOworICAgICpvcyA8PCAiXG4gICAgLmFtYmllbnRDb2xvciA9ICIgPDwgc2V0dGluZ3MuYW1iaWVudENvbG9yOworICAgICpvcyA8PCAiXG4gICAgLnNwb3RDb2xvciA9ICIgPDwgc2V0dGluZ3Muc3BvdENvbG9yOworICAgICpvcyA8PCAiXG4gICAgLmxpZ2h0UG9zID0gIiA8PCBzZXR0aW5ncy5saWdodFBvczsKKyAgICAqb3MgPDwgIlxuICAgIC5saWdodFJhZGl1cyA9ICIgPDwgc2V0dGluZ3MubGlnaHRSYWRpdXM7CisgICAgKm9zIDw8ICJcbiAgICAubGVuZ3RoID0gIiA8PCBzZXR0aW5ncy5sZW5ndGg7CisgICAgKm9zIDw8ICJcbiAgICAuY2FzdGVySXNUcmFuc2x1Y2VudCA9ICIgPDwgc2V0dGluZ3MuY2FzdGVySXNUcmFuc2x1Y2VudDsKKyAgICAqb3MgPDwgIlxufSI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IExheWVyU2V0dGluZ3MmIHNldHRpbmdzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAqb3MgPDwgIkxheWVyU2V0dGluZ3MgeyI7CisgICAgKm9zIDw8ICJcbiAgICAuZ2VvbWV0cnkgPSAiOworICAgIFByaW50VG8oc2V0dGluZ3MuZ2VvbWV0cnksIG9zKTsKKyAgICAqb3MgPDwgIlxuICAgIC5zb3VyY2UgPSAiOworICAgIFByaW50VG8oc2V0dGluZ3Muc291cmNlLCBvcyk7CisgICAgKm9zIDw8ICJcbiAgICAuYWxwaGEgPSAiIDw8IHNldHRpbmdzLmFscGhhOworICAgICpvcyA8PCAiXG4gICAgLnNvdXJjZURhdGFzcGFjZSA9ICI7CisgICAgUHJpbnRUbyhzZXR0aW5ncy5zb3VyY2VEYXRhc3BhY2UsIG9zKTsKKyAgICAqb3MgPDwgIlxuICAgIC5jb2xvclRyYW5zZm9ybSA9ICIgPDwgc2V0dGluZ3MuY29sb3JUcmFuc2Zvcm07CisgICAgKm9zIDw8ICJcbiAgICAuZGlzYWJsZUJsZW5kaW5nID0gIiA8PCBzZXR0aW5ncy5kaXNhYmxlQmxlbmRpbmc7CisgICAgKm9zIDw8ICJcbiAgICAuYmFja2dyb3VuZEJsdXJSYWRpdXMgPSAiIDw8IHNldHRpbmdzLmJhY2tncm91bmRCbHVyUmFkaXVzOworICAgICpvcyA8PCAiXG4gICAgLnNoYWRvdyA9ICI7CisgICAgUHJpbnRUbyhzZXR0aW5ncy5zaGFkb3csIG9zKTsKKyAgICAqb3MgPDwgIlxufSI7Cit9CisKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL01lc2guaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9NZXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3ZjEzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9NZXNoLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0ZfUkVOREVSX0VOR0lORV9NRVNIX0gKKyNkZWZpbmUgU0ZfUkVOREVSX0VOR0lORV9NRVNIX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKKworY2xhc3MgTWVzaCB7CitwdWJsaWM6CisgICAgY2xhc3MgQnVpbGRlcjsKKworICAgIGVudW0gUHJpbWl0aXZlIHsKKyAgICAgICAgVFJJQU5HTEVTID0gMHgwMDA0LCAgICAgIC8vIEdMX1RSSUFOR0xFUworICAgICAgICBUUklBTkdMRV9TVFJJUCA9IDB4MDAwNSwgLy8gR0xfVFJJQU5HTEVfU1RSSVAKKyAgICAgICAgVFJJQU5HTEVfRkFOID0gMHgwMDA2ICAgIC8vIEdMX1RSSUFOR0xFX0ZBTgorICAgIH07CisKKyAgICB+TWVzaCgpID0gZGVmYXVsdDsKKworICAgIC8qCisgICAgICogVmVydGV4QXJyYXkgaGFuZGxlcyB0aGUgc3RyaWRlIGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+CisgICAgY2xhc3MgVmVydGV4QXJyYXkgeworICAgICAgICBmcmllbmQgY2xhc3MgTWVzaDsKKyAgICAgICAgZmxvYXQqIG1EYXRhOworICAgICAgICBzaXplX3QgbVN0cmlkZTsKKyAgICAgICAgc2l6ZV90IG1PZmZzZXQgPSAwOworICAgICAgICBWZXJ0ZXhBcnJheShmbG9hdCogZGF0YSwgc2l6ZV90IHN0cmlkZSkgOiBtRGF0YShkYXRhKSwgbVN0cmlkZShzdHJpZGUpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIFJldHVybnMgYSB2ZXJ0ZXggYXJyYXkgYXQgYW4gb2Zmc2V0IHNvIGl0cyBlYXNpZXIgdG8gYXBwZW5kIGF0dHJpYnV0ZXMgZnJvbQorICAgICAgICAvLyBtdWx0aXBsZSBzb3VyY2VzLgorICAgICAgICBWZXJ0ZXhBcnJheShWZXJ0ZXhBcnJheTxUWVBFPiYgb3RoZXIsIHNpemVfdCBvZmZzZXQpCisgICAgICAgICAgICAgIDogbURhdGEob3RoZXIubURhdGEpLCBtU3RyaWRlKG90aGVyLm1TdHJpZGUpLCBtT2Zmc2V0KG9mZnNldCkge30KKworICAgICAgICBUWVBFJiBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFRZUEUqPigmbURhdGFbKGluZGV4ICsgbU9mZnNldCkgKiBtU3RyaWRlXSk7CisgICAgICAgIH0KKyAgICAgICAgVFlQRSBjb25zdCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxUWVBFIGNvbnN0Kj4oJm1EYXRhWyhpbmRleCArIG1PZmZzZXQpICogbVN0cmlkZV0pOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgorICAgIFZlcnRleEFycmF5PFRZUEU+IGdldFBvc2l0aW9uQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBWZXJ0ZXhBcnJheTxUWVBFPihnZXRQb3NpdGlvbnMoKSwgbVN0cmlkZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+CisgICAgVmVydGV4QXJyYXk8VFlQRT4gZ2V0VGV4Q29vcmRBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIFZlcnRleEFycmF5PFRZUEU+KGdldFRleENvb3JkcygpLCBtU3RyaWRlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KKyAgICBWZXJ0ZXhBcnJheTxUWVBFPiBnZXRDcm9wQ29vcmRBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIFZlcnRleEFycmF5PFRZUEU+KGdldENyb3BDb29yZHMoKSwgbVN0cmlkZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+CisgICAgVmVydGV4QXJyYXk8VFlQRT4gZ2V0U2hhZG93Q29sb3JBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIFZlcnRleEFycmF5PFRZUEU+KGdldFNoYWRvd0NvbG9yKCksIG1TdHJpZGUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgorICAgIFZlcnRleEFycmF5PFRZUEU+IGdldFNoYWRvd1BhcmFtc0FycmF5KCkgeworICAgICAgICByZXR1cm4gVmVydGV4QXJyYXk8VFlQRT4oZ2V0U2hhZG93UGFyYW1zKCksIG1TdHJpZGUpOworICAgIH0KKworICAgIHVpbnQxNl90KiBnZXRJbmRpY2VzQXJyYXkoKSB7IHJldHVybiBnZXRJbmRpY2VzKCk7IH0KKworICAgIFByaW1pdGl2ZSBnZXRQcmltaXRpdmUoKSBjb25zdDsKKworICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2ZXJ0aWNlcyBwb3NpdGlvbnMKKyAgICBmbG9hdCBjb25zdCogZ2V0UG9zaXRpb25zKCkgY29uc3Q7CisKKyAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmVydGljZXMgdGV4dHVyZSBjb29yZGluYXRlcworICAgIGZsb2F0IGNvbnN0KiBnZXRUZXhDb29yZHMoKSBjb25zdDsKKworICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2ZXJ0aWNlcyBjcm9wIGNvb3JkaW5hdGVzCisgICAgZmxvYXQgY29uc3QqIGdldENyb3BDb29yZHMoKSBjb25zdDsKKworICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIGNvbG9ycworICAgIGZsb2F0IGNvbnN0KiBnZXRTaGFkb3dDb2xvcigpIGNvbnN0OworCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNoYWRvdyBwYXJhbXMKKyAgICBmbG9hdCBjb25zdCogZ2V0U2hhZG93UGFyYW1zKCkgY29uc3Q7CisKKyAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byBpbmRpY2VzCisgICAgdWludDE2X3QgY29uc3QqIGdldEluZGljZXMoKSBjb25zdDsKKworICAgIC8vIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiB0aGlzIG1lc2gKKyAgICBzaXplX3QgZ2V0VmVydGV4Q291bnQoKSBjb25zdDsKKworICAgIC8vIGRpbWVuc2lvbiBvZiB2ZXJ0aWNlcworICAgIHNpemVfdCBnZXRWZXJ0ZXhTaXplKCkgY29uc3Q7CisKKyAgICAvLyBkaW1lbnNpb24gb2YgdGV4dHVyZSBjb29yZGluYXRlcworICAgIHNpemVfdCBnZXRUZXhDb29yZHNTaXplKCkgY29uc3Q7CisKKyAgICBzaXplX3QgZ2V0U2hhZG93UGFyYW1zU2l6ZSgpIGNvbnN0OworCisgICAgc2l6ZV90IGdldFNoYWRvd0NvbG9yU2l6ZSgpIGNvbnN0OworCisgICAgc2l6ZV90IGdldEluZGV4Q291bnQoKSBjb25zdDsKKworICAgIC8vIHJldHVybiBzdHJpZGUgaW4gYnl0ZXMKKyAgICBzaXplX3QgZ2V0Qnl0ZVN0cmlkZSgpIGNvbnN0OworCisgICAgLy8gcmV0dXJuIHN0cmlkZSBpbiBmbG9hdHMKKyAgICBzaXplX3QgZ2V0U3RyaWRlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTWVzaChQcmltaXRpdmUgcHJpbWl0aXZlLCBzaXplX3QgdmVydGV4Q291bnQsIHNpemVfdCB2ZXJ0ZXhTaXplLCBzaXplX3QgdGV4Q29vcmRTaXplLAorICAgICAgICAgc2l6ZV90IGNyb3BDb29yZHNTaXplLCBzaXplX3Qgc2hhZG93Q29sb3JTaXplLCBzaXplX3Qgc2hhZG93UGFyYW1zU2l6ZSwgc2l6ZV90IGluZGV4Q291bnQpOworICAgIE1lc2goY29uc3QgTWVzaCYpOworICAgIE1lc2gmIG9wZXJhdG9yPShjb25zdCBNZXNoJik7CisgICAgTWVzaCBjb25zdCYgb3BlcmF0b3I9KGNvbnN0IE1lc2gmKSBjb25zdDsKKworICAgIGZsb2F0KiBnZXRQb3NpdGlvbnMoKTsKKyAgICBmbG9hdCogZ2V0VGV4Q29vcmRzKCk7CisgICAgZmxvYXQqIGdldENyb3BDb29yZHMoKTsKKyAgICBmbG9hdCogZ2V0U2hhZG93Q29sb3IoKTsKKyAgICBmbG9hdCogZ2V0U2hhZG93UGFyYW1zKCk7CisgICAgdWludDE2X3QqIGdldEluZGljZXMoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtVmVydGljZXM7CisgICAgc2l6ZV90IG1WZXJ0ZXhDb3VudDsKKyAgICBzaXplX3QgbVZlcnRleFNpemU7CisgICAgc2l6ZV90IG1UZXhDb29yZHNTaXplOworICAgIHNpemVfdCBtQ3JvcENvb3Jkc1NpemU7CisgICAgc2l6ZV90IG1TaGFkb3dDb2xvclNpemU7CisgICAgc2l6ZV90IG1TaGFkb3dQYXJhbXNTaXplOworICAgIHNpemVfdCBtU3RyaWRlOworICAgIFByaW1pdGl2ZSBtUHJpbWl0aXZlOworICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBtSW5kaWNlczsKKyAgICBzaXplX3QgbUluZGV4Q291bnQ7Cit9OworCitjbGFzcyBNZXNoOjpCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICBCdWlsZGVyJiBzZXRQcmltaXRpdmUoUHJpbWl0aXZlIHByaW1pdGl2ZSkgeworICAgICAgICBtUHJpbWl0aXZlID0gcHJpbWl0aXZlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfTsKKyAgICBCdWlsZGVyJiBzZXRWZXJ0aWNlcyhzaXplX3QgdmVydGV4Q291bnQsIHNpemVfdCB2ZXJ0ZXhTaXplKSB7CisgICAgICAgIG1WZXJ0ZXhDb3VudCA9IHZlcnRleENvdW50OworICAgICAgICBtVmVydGV4U2l6ZSA9IHZlcnRleFNpemU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9OworICAgIEJ1aWxkZXImIHNldFRleENvb3JkcyhzaXplX3QgdGV4Q29vcmRzU2l6ZSkgeworICAgICAgICBtVGV4Q29vcmRzU2l6ZSA9IHRleENvb3Jkc1NpemU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9OworICAgIEJ1aWxkZXImIHNldENyb3BDb29yZHMoc2l6ZV90IGNyb3BDb29yZHNTaXplKSB7CisgICAgICAgIG1Dcm9wQ29vcmRzU2l6ZSA9IGNyb3BDb29yZHNTaXplOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfTsKKyAgICBCdWlsZGVyJiBzZXRTaGFkb3dBdHRycygpIHsKKyAgICAgICAgbVNoYWRvd1BhcmFtc1NpemUgPSAzOworICAgICAgICBtU2hhZG93Q29sb3JTaXplID0gNDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH07CisgICAgQnVpbGRlciYgc2V0SW5kaWNlcyhzaXplX3QgaW5kZXhDb3VudCkgeworICAgICAgICBtSW5kZXhDb3VudCA9IGluZGV4Q291bnQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9OworICAgIE1lc2ggYnVpbGQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBNZXNoe21QcmltaXRpdmUsICAgICAgbVZlcnRleENvdW50LCAgICAgbVZlcnRleFNpemUsICAgICAgIG1UZXhDb29yZHNTaXplLAorICAgICAgICAgICAgICAgICAgICBtQ3JvcENvb3Jkc1NpemUsIG1TaGFkb3dDb2xvclNpemUsIG1TaGFkb3dQYXJhbXNTaXplLCBtSW5kZXhDb3VudH07CisgICAgfQorCitwcml2YXRlOgorICAgIHNpemVfdCBtVmVydGV4Q291bnQgPSAwOworICAgIHNpemVfdCBtVmVydGV4U2l6ZSA9IDA7CisgICAgc2l6ZV90IG1UZXhDb29yZHNTaXplID0gMDsKKyAgICBzaXplX3QgbUNyb3BDb29yZHNTaXplID0gMDsKKyAgICBzaXplX3QgbVNoYWRvd0NvbG9yU2l6ZSA9IDA7CisgICAgc2l6ZV90IG1TaGFkb3dQYXJhbXNTaXplID0gMDsKKyAgICBzaXplX3QgbUluZGV4Q291bnQgPSAwOworICAgIFByaW1pdGl2ZSBtUHJpbWl0aXZlOworfTsKKworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgLyogU0ZfUkVOREVSX0VOR0lORV9NRVNIX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9SZW5kZXJFbmdpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9SZW5kZXJFbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWEwZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL1JlbmRlckVuZ2luZS5oCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNGX1JFTkRFUkVOR0lORV9IXworI2RlZmluZSBTRl9SRU5ERVJFTkdJTkVfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxtYXRoL21hdDQuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvRGlzcGxheVNldHRpbmdzLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0ZyYW1lYnVmZmVyLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0ltYWdlLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0xheWVyU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljVHlwZXMuaD4KKyNpbmNsdWRlIDx1aS9UcmFuc2Zvcm0uaD4KKworLyoqCisgKiBBbGxvd3MgdG8gc2V0IFJlbmRlckVuZ2luZSBiYWNrZW5kIHRvIEdMRVMgKGRlZmF1bHQpIG9yIFZ1bGthbiAoTk9UIHlldCBzdXBwb3J0ZWQpLgorICovCisjZGVmaW5lIFBST1BFUlRZX0RFQlVHX1JFTkRFUkVOR0lORV9CQUNLRU5EICJkZWJ1Zy5yZW5kZXJlbmdpbmUuYmFja2VuZCIKKworc3RydWN0IEFOYXRpdmVXaW5kb3dCdWZmZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUmVjdDsKK2NsYXNzIFJlZ2lvbjsKKworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK2NsYXNzIEJpbmROYXRpdmVCdWZmZXJBc0ZyYW1lYnVmZmVyOworY2xhc3MgSW1hZ2U7CitjbGFzcyBNZXNoOworY2xhc3MgVGV4dHVyZTsKK3N0cnVjdCBSZW5kZXJFbmdpbmVDcmVhdGlvbkFyZ3M7CisKK25hbWVzcGFjZSB0aHJlYWRlZCB7CitjbGFzcyBSZW5kZXJFbmdpbmVUaHJlYWRlZDsKK30KKworbmFtZXNwYWNlIGltcGwgeworY2xhc3MgUmVuZGVyRW5naW5lOworfQorCitlbnVtIGNsYXNzIFByb3RlY3Rpb24geworICAgIFVOUFJPVEVDVEVEID0gMSwKKyAgICBQUk9URUNURUQgPSAyLAorfTsKKworY2xhc3MgUmVuZGVyRW5naW5lIHsKK3B1YmxpYzoKKyAgICBlbnVtIGNsYXNzIENvbnRleHRQcmlvcml0eSB7CisgICAgICAgIExPVyA9IDEsCisgICAgICAgIE1FRElVTSA9IDIsCisgICAgICAgIEhJR0ggPSAzLAorICAgIH07CisKKyAgICBlbnVtIGNsYXNzIFJlbmRlckVuZ2luZVR5cGUgeworICAgICAgICBHTEVTID0gMSwKKyAgICAgICAgVEhSRUFERUQgPSAyLAorICAgIH07CisKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFJlbmRlckVuZ2luZT4gY3JlYXRlKGNvbnN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyYgYXJncyk7CisKKyAgICB2aXJ0dWFsIH5SZW5kZXJFbmdpbmUoKSA9IDA7CisKKyAgICAvLyAtLS0tLSBCRUdJTiBERVBSRUNBVEVEIElOVEVSRkFDRSAtLS0tLQorICAgIC8vIFRoaXMgaW50ZXJmYWNlLCB3aGlsZSBzdGlsbCBpbiB1c2UgdW50aWwgYSBzdWl0YWJsZSByZXBsYWNlbWVudCBpcyBidWlsdCwKKyAgICAvLyBzaG91bGQgYmUgY29uc2lkZXJlZCBkZXByZWNhdGVkLCBtaW51cyBzb21lIG1ldGhvZHMgd2hpY2ggc3RpbGwgbWF5IGJlCisgICAgLy8gdXNlZCB0byBzdXBwb3J0IGxlZ2FjeSBiZWhhdmlvci4KKyAgICB2aXJ0dWFsIHZvaWQgcHJpbWVDYWNoZSgpIGNvbnN0ID0gMDsKKworICAgIC8vIGR1bXAgdGhlIGV4dGVuc2lvbiBzdHJpbmdzLiBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzcy4KKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChzdGQ6OnN0cmluZyYgcmVzdWx0KSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgdXNlTmF0aXZlRmVuY2VTeW5jKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCB1c2VXYWl0U3luYygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZ2VuVGV4dHVyZXMoc2l6ZV90IGNvdW50LCB1aW50MzJfdCogbmFtZXMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlVGV4dHVyZXMoc2l6ZV90IGNvdW50LCB1aW50MzJfdCBjb25zdCogbmFtZXMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYmluZEV4dGVybmFsVGV4dHVyZUltYWdlKHVpbnQzMl90IHRleE5hbWUsIGNvbnN0IEltYWdlJiBpbWFnZSkgPSAwOworICAgIC8vIExlZ2FjeSBwdWJsaWMgbWV0aG9kIHVzZWQgYnkgZGV2aWNlcyB0aGF0IGRvbid0IHN1cHBvcnQgbmF0aXZlIGZlbmNlCisgICAgLy8gc3luY2hyb25pemF0aW9uIGluIHRoZWlyIEdQVSBkcml2ZXIsIGFzIHRoaXMgbWV0aG9kIHByb3ZpZGVzIGltcGxpY2l0CisgICAgLy8gc3luY2hyb25pemF0aW9uIGZvciBsYXRjaGluZyBidWZmZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcih1aW50MzJfdCB0ZXhOYW1lLCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxGZW5jZT4mIGZlbmNlKSA9IDA7CisgICAgLy8gQ2FjaGVzIEltYWdlIHJlc291cmNlcyBmb3IgdGhpcyBidWZmZXIsIGJ1dCBkb2VzIG5vdCBiaW5kIHRoZSBidWZmZXIgdG8KKyAgICAvLyBhIHBhcnRpY3VsYXIgdGV4dHVyZS4KKyAgICAvLyBOb3RlIHRoYXQgd29yayBpcyBkZWZlcnJlZCB0byBhbiBhZGRpdGlvbmFsIHRocmVhZCwgaS5lLiB0aGlzIGNhbGwKKyAgICAvLyBpcyBtYWRlIGFzeW5jaHJvbm91c2x5LCBidXQgdGhlIGNhbGxlciBjYW4gZXhwZWN0IHRoYXQgY2FjaGUvdW5iaW5kIGNhbGxzCisgICAgLy8gYXJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciB0aGF0J3MgY29uZmxpY3Qgc2VyaWFsaXphYmxlLCBpLmUuIHVuYmluZGluZworICAgIC8vIGEgYnVmZmVyIHNob3VsZCBuZXZlciBvY2N1ciBiZWZvcmUgYmluZGluZyB0aGUgYnVmZmVyIGlmIHRoZSBjYWxsZXIKKyAgICAvLyBjYWxsZWQge2JpbmQsIGNhY2hlfUV4dGVybmFsVGV4dHVyZUJ1ZmZlciBiZWZvcmUgY2FsbGluZyB1bmJpbmQuCisgICAgdmlydHVhbCB2b2lkIGNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpID0gMDsKKyAgICAvLyBSZW1vdmVzIGludGVybmFsIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoZSBidWZmZXJJZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCisgICAgLy8gaW52b2tlZCB3aGVuIHRoZSBjYWxsZXIgd2lsbCBubyBsb25nZXIgaG9sZCBhIHJlZmVyZW5jZSB0byBhIEdyYXBoaWNCdWZmZXIKKyAgICAvLyBhbmQgbmVlZHMgdG8gY2xlYW4gdXAgaXRzIHJlc291cmNlcy4KKyAgICAvLyBOb3RlIHRoYXQgd29yayBpcyBkZWZlcnJlZCB0byBhbiBhZGRpdGlvbmFsIHRocmVhZCwgaS5lLiB0aGlzIGNhbGwKKyAgICAvLyBpcyBtYWRlIGFzeW5jaHJvbm91c2x5LCBidXQgdGhlIGNhbGxlciBjYW4gZXhwZWN0IHRoYXQgY2FjaGUvdW5iaW5kIGNhbGxzCisgICAgLy8gYXJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciB0aGF0J3MgY29uZmxpY3Qgc2VyaWFsaXphYmxlLCBpLmUuIHVuYmluZGluZworICAgIC8vIGEgYnVmZmVyIHNob3VsZCBuZXZlciBvY2N1ciBiZWZvcmUgYmluZGluZyB0aGUgYnVmZmVyIGlmIHRoZSBjYWxsZXIKKyAgICAvLyBjYWxsZWQge2JpbmQsIGNhY2hlfUV4dGVybmFsVGV4dHVyZUJ1ZmZlciBiZWZvcmUgY2FsbGluZyB1bmJpbmQuCisgICAgdmlydHVhbCB2b2lkIHVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcih1aW50NjRfdCBidWZmZXJJZCkgPSAwOworICAgIC8vIFdoZW4gYmluZGluZyBhIG5hdGl2ZSBidWZmZXIsIGl0IG11c3QgYmUgZG9uZSBiZWZvcmUgc2V0Vmlld3BvcnRBbmRQcm9qZWN0aW9uCisgICAgLy8gUmV0dXJucyBOT19FUlJPUiB3aGVuIGJpbmRzIHN1Y2Nlc3NmdWxseSwgTk9fTUVNT1JZIHdoZW4gdGhlcmUncyBubyBtZW1vcnkgZm9yIGFsbG9jYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBiaW5kRnJhbWVCdWZmZXIoRnJhbWVidWZmZXIqIGZyYW1lYnVmZmVyKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHVuYmluZEZyYW1lQnVmZmVyKEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikgPSAwOworCisgICAgZW51bSBjbGFzcyBDbGVhbnVwTW9kZSB7CisgICAgICAgIENMRUFOX09VVFBVVF9SRVNPVVJDRVMsCisgICAgICAgIENMRUFOX0FMTCwKKyAgICB9OworICAgIC8vIENsZWFuLXVwIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkIGFmdGVyIHRoZQorICAgIC8vIGRyYXdGZW5jZSByZXR1cm5lZCBieSBkcmF3TGF5ZXJzIGZpcmVzLiBUaGlzIG1ldGhvZCB3aWxsIGZyZWUgdXAKKyAgICAvLyByZXNvdXJjZXMgdXNlZCBieSB0aGUgbW9zdCByZWNlbnRseSBkcmF3biBmcmFtZS4gSWYgdGhlIGZyYW1lIGlzIHN0aWxsCisgICAgLy8gYmVpbmcgZHJhd24sIHRoZW4gdGhpcyBjYWxsIGlzIHNpbGVudGx5IGlnbm9yZWQuCisgICAgLy8KKyAgICAvLyBJZiBtb2RlIGlzIENMRUFOX09VVFBVVF9SRVNPVVJDRVMsIHRoZW4gb25seSByZXNvdXJjZXMgcmVsYXRlZCB0byB0aGUKKyAgICAvLyBvdXRwdXQgZnJhbWVidWZmZXIgYXJlIGNsZWFuZWQgdXAsIGluY2x1ZGluZyB0aGUgc2libGluZyB0ZXh0dXJlLgorICAgIC8vCisgICAgLy8gSWYgbW9kZSBpcyBDTEVBTl9BTEwsIHRoZW4gd2UgYWxzbyBjbGVhbnVwIHJlc291cmNlcyByZWxhdGVkIHRvIGFueSBpbnB1dAorICAgIC8vIGJ1ZmZlcnMuCisgICAgLy8KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgcmVzb3VyY2VzIHdlcmUgY2xlYW5lZCB1cCwgYW5kIGZhbHNlIGlmIHdlIGRpZG4ndCBuZWVkIHRvCisgICAgLy8gZG8gYW55IHdvcmsuCisgICAgdmlydHVhbCBib29sIGNsZWFudXBQb3N0UmVuZGVyKENsZWFudXBNb2RlIG1vZGUgPSBDbGVhbnVwTW9kZTo6Q0xFQU5fT1VUUFVUX1JFU09VUkNFUykgPSAwOworCisgICAgLy8gcXVlcmllcworICAgIHZpcnR1YWwgc2l6ZV90IGdldE1heFRleHR1cmVTaXplKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IGdldE1heFZpZXdwb3J0RGltcygpIGNvbnN0ID0gMDsKKworICAgIC8vIC0tLS0tIEVORCBERVBSRUNBVEVEIElOVEVSRkFDRSAtLS0tLQorCisgICAgLy8gLS0tLS0gQkVHSU4gTkVXIElOVEVSRkFDRSAtLS0tLQorCisgICAgdmlydHVhbCBib29sIGlzUHJvdGVjdGVkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIHVzZVByb3RlY3RlZENvbnRleHQoYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KSA9IDA7CisKKyAgICAvLyBSZW5kZXJzIGxheWVycyBmb3IgYSBwYXJ0aWN1bGFyIGRpc3BsYXkgdmlhIEdQVSBjb21wb3NpdGlvbi4gVGhpcyBtZXRob2QKKyAgICAvLyBzaG91bGQgYmUgY2FsbGVkIGZvciBldmVyeSBkaXNwbGF5IHRoYXQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgdmlhIHRoZSBHUFUuCisgICAgLy8gQHBhcmFtIGRpc3BsYXkgVGhlIGRpc3BsYXktd2lkZSBzZXR0aW5ncyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHByaW9yIHRvCisgICAgLy8gZHJhd2luZyBhbnkgbGF5ZXJzLgorICAgIC8vCisgICAgLy8gQXNzdW1wdGlvbnMgd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kOgorICAgIC8vIDEuIFRoZXJlIGlzIGV4YWN0bHkgb25lIGNhbGxlciAtIGkuZS4gbXVsdGktdGhyZWFkaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgLy8gMi4gQWRkaXRpb25hbCB0aHJlYWRzIG1heSBiZSBjYWxsaW5nIHRoZSB7YmluZCxjYWNoZX1FeHRlcm5hbFRleHR1cmUKKyAgICAvLyBtZXRob2RzIGFib3ZlLiBCdXQgdGhlIG1haW4gdGhyZWFkIGlzIHJlc3BvbnNpYmxlIGZvciBob2xkaW5nIHJlc291cmNlcworICAgIC8vIHN1Y2ggdGhhdCBJbWFnZSBkZXN0cnVjdGlvbiBkb2VzIG5vdCBvY2N1ciB3aGlsZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgLy8KKyAgICAvLyBUT0RPKGIvMTM2ODA2MzQyKTogVGhpcyBzaG91bGQgYmVoYXZpb3Igc2hvdWxkIGlkZWFsbHkgYmUgZml4ZWQgc2luY2UKKyAgICAvLyB0aGUgYWJvdmUgdHdvIGFzc3VtcHRpb25zIGFyZSBicml0dGxlLCBhcyBjb25kaXRpb25hbCB0aHJlYWQgc2FmZXR5bmVzcworICAgIC8vIG1heSBiZSBpbnN1ZmZpY2llbnQgd2hlbiBtYXhpbWl6aW5nIHJlbmRlcmluZyBwZXJmb3JtYW5jZSBpbiB0aGUgZnV0dXJlLgorICAgIC8vCisgICAgLy8gQHBhcmFtIGxheWVycyBUaGUgbGF5ZXJzIHRvIGRyYXcgb250byB0aGUgZGlzcGxheSwgaW4gWi1vcmRlci4KKyAgICAvLyBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgd2hpY2ggd2lsbCBiZSBkcmF3biB0by4gVGhpcyBidWZmZXIgd2lsbCBiZQorICAgIC8vIHJlYWR5IG9uY2UgZHJhd0ZlbmNlIGZpcmVzLgorICAgIC8vIEBwYXJhbSB1c2VGcmFtZWJ1ZmZlckNhY2hlIFRydWUgaWYgdGhlIGZyYW1lYnVmZmVyIGNhY2hlIHNob3VsZCBiZSB1c2VkLgorICAgIC8vIElmIGFuIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNhY2hlIG91dHB1dCBmcmFtZWJ1ZmZlcnMsIHRoZW4gdGhpcworICAgIC8vIHBhcmFtZXRlciBkb2VzIG5vdGhpbmcuCisgICAgLy8gQHBhcmFtIGJ1ZmZlckZlbmNlIEZlbmNlIHNpZ25hbGxpbmcgdGhhdCB0aGUgYnVmZmVyIGlzIHJlYWR5IHRvIGJlIGRyYXduCisgICAgLy8gdG8uCisgICAgLy8gQHBhcmFtIGRyYXdGZW5jZSBBIHBvaW50ZXIgdG8gYSBmZW5jZSwgd2hpY2ggd2lsbCBmaXJlIHdoZW4gdGhlIGJ1ZmZlcgorICAgIC8vIGhhcyBiZWVuIGRyYXduIHRvIGFuZCBpcyByZWFkeSB0byBiZSBleGFtaW5lZC4gVGhlIGZlbmNlIHdpbGwgYmUKKyAgICAvLyBpbml0aWFsaXplZCBieSB0aGlzIG1ldGhvZC4gVGhlIGNhbGxlciB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBvd25pbmcgdGhlCisgICAgLy8gZmVuY2UuCisgICAgLy8gQHJldHVybiBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgd2hldGhlciBkcmF3aW5nIHdhcyBzdWNjZXNzZnVsLiBGb3IKKyAgICAvLyBub3csIHRoaXMgYWx3YXlzIHJldHVybnMgTk9fRVJST1IuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcmF3TGF5ZXJzKGNvbnN0IERpc3BsYXlTZXR0aW5ncyYgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgTGF5ZXJTZXR0aW5ncyo+JiBsYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsIGNvbnN0IGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6dW5pcXVlX2ZkJiYgYnVmZmVyRmVuY2UsIGJhc2U6OnVuaXF1ZV9mZCogZHJhd0ZlbmNlKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBHZXRzIGEgZnJhbWVidWZmZXIgdG8gcmVuZGVyIHRvLiBUaGlzIGZyYW1lYnVmZmVyIG1heSBvciBtYXkgbm90IGJlCisgICAgLy8gY2FjaGVkIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgdHJhbnNmZXIgb3duZXJzaGlwLCBzbyB0aGUgY2FsbGVyIG1vc3Qgbm90CisgICAgLy8gbGl2ZSBsb25nZXIgdGhhbiBSZW5kZXJFbmdpbmUuCisgICAgdmlydHVhbCBGcmFtZWJ1ZmZlciogZ2V0RnJhbWVidWZmZXJGb3JEcmF3aW5nKCkgPSAwOworICAgIGZyaWVuZCBjbGFzcyBCaW5kTmF0aXZlQnVmZmVyQXNGcmFtZWJ1ZmZlcjsKKyAgICBmcmllbmQgY2xhc3MgdGhyZWFkZWQ6OlJlbmRlckVuZ2luZVRocmVhZGVkOworfTsKKworc3RydWN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyB7CisgICAgaW50IHBpeGVsRm9ybWF0OworICAgIHVpbnQzMl90IGltYWdlQ2FjaGVTaXplOworICAgIGJvb2wgdXNlQ29sb3JNYW5hZ2VtZW50OworICAgIGJvb2wgZW5hYmxlUHJvdGVjdGVkQ29udGV4dDsKKyAgICBib29sIHByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHk7CisgICAgYm9vbCBzdXBwb3J0c0JhY2tncm91bmRCbHVyOworICAgIFJlbmRlckVuZ2luZTo6Q29udGV4dFByaW9yaXR5IGNvbnRleHRQcmlvcml0eTsKKyAgICBSZW5kZXJFbmdpbmU6OlJlbmRlckVuZ2luZVR5cGUgcmVuZGVyRW5naW5lVHlwZTsKKworICAgIHN0cnVjdCBCdWlsZGVyOworCitwcml2YXRlOgorICAgIC8vIG11c3QgYmUgY3JlYXRlZCBieSBCdWlsZGVyIHZpYSBjb25zdHJ1Y3RvciB3aXRoIGZ1bGwgYXJndW1lbnQgbGlzdAorICAgIFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyhpbnQgX3BpeGVsRm9ybWF0LCB1aW50MzJfdCBfaW1hZ2VDYWNoZVNpemUsIGJvb2wgX3VzZUNvbG9yTWFuYWdlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfZW5hYmxlUHJvdGVjdGVkQ29udGV4dCwgYm9vbCBfcHJlY2FjaGVUb25lTWFwcGVyU2hhZGVyT25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfc3VwcG9ydHNCYWNrZ3JvdW5kQmx1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyRW5naW5lOjpDb250ZXh0UHJpb3JpdHkgX2NvbnRleHRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyRW5naW5lOjpSZW5kZXJFbmdpbmVUeXBlIF9yZW5kZXJFbmdpbmVUeXBlKQorICAgICAgICAgIDogcGl4ZWxGb3JtYXQoX3BpeGVsRm9ybWF0KSwKKyAgICAgICAgICAgIGltYWdlQ2FjaGVTaXplKF9pbWFnZUNhY2hlU2l6ZSksCisgICAgICAgICAgICB1c2VDb2xvck1hbmFnZW1lbnQoX3VzZUNvbG9yTWFuYWdlbWVudCksCisgICAgICAgICAgICBlbmFibGVQcm90ZWN0ZWRDb250ZXh0KF9lbmFibGVQcm90ZWN0ZWRDb250ZXh0KSwKKyAgICAgICAgICAgIHByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkoX3ByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkpLAorICAgICAgICAgICAgc3VwcG9ydHNCYWNrZ3JvdW5kQmx1cihfc3VwcG9ydHNCYWNrZ3JvdW5kQmx1ciksCisgICAgICAgICAgICBjb250ZXh0UHJpb3JpdHkoX2NvbnRleHRQcmlvcml0eSksCisgICAgICAgICAgICByZW5kZXJFbmdpbmVUeXBlKF9yZW5kZXJFbmdpbmVUeXBlKSB7fQorICAgIFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncygpID0gZGVsZXRlOworfTsKKworc3RydWN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJnczo6QnVpbGRlciB7CisgICAgQnVpbGRlcigpIHt9CisKKyAgICBCdWlsZGVyJiBzZXRQaXhlbEZvcm1hdChpbnQgcGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgdGhpcy0+cGl4ZWxGb3JtYXQgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBCdWlsZGVyJiBzZXRJbWFnZUNhY2hlU2l6ZSh1aW50MzJfdCBpbWFnZUNhY2hlU2l6ZSkgeworICAgICAgICB0aGlzLT5pbWFnZUNhY2hlU2l6ZSA9IGltYWdlQ2FjaGVTaXplOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIEJ1aWxkZXImIHNldFVzZUNvbG9yTWFuYWdlcm1lbnQoYm9vbCB1c2VDb2xvck1hbmFnZW1lbnQpIHsKKyAgICAgICAgdGhpcy0+dXNlQ29sb3JNYW5hZ2VtZW50ID0gdXNlQ29sb3JNYW5hZ2VtZW50OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIEJ1aWxkZXImIHNldEVuYWJsZVByb3RlY3RlZENvbnRleHQoYm9vbCBlbmFibGVQcm90ZWN0ZWRDb250ZXh0KSB7CisgICAgICAgIHRoaXMtPmVuYWJsZVByb3RlY3RlZENvbnRleHQgPSBlbmFibGVQcm90ZWN0ZWRDb250ZXh0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIEJ1aWxkZXImIHNldFByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkoYm9vbCBwcmVjYWNoZVRvbmVNYXBwZXJTaGFkZXJPbmx5KSB7CisgICAgICAgIHRoaXMtPnByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkgPSBwcmVjYWNoZVRvbmVNYXBwZXJTaGFkZXJPbmx5OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIEJ1aWxkZXImIHNldFN1cHBvcnRzQmFja2dyb3VuZEJsdXIoYm9vbCBzdXBwb3J0c0JhY2tncm91bmRCbHVyKSB7CisgICAgICAgIHRoaXMtPnN1cHBvcnRzQmFja2dyb3VuZEJsdXIgPSBzdXBwb3J0c0JhY2tncm91bmRCbHVyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIEJ1aWxkZXImIHNldENvbnRleHRQcmlvcml0eShSZW5kZXJFbmdpbmU6OkNvbnRleHRQcmlvcml0eSBjb250ZXh0UHJpb3JpdHkpIHsKKyAgICAgICAgdGhpcy0+Y29udGV4dFByaW9yaXR5ID0gY29udGV4dFByaW9yaXR5OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIEJ1aWxkZXImIHNldFJlbmRlckVuZ2luZVR5cGUoUmVuZGVyRW5naW5lOjpSZW5kZXJFbmdpbmVUeXBlIHJlbmRlckVuZ2luZVR5cGUpIHsKKyAgICAgICAgdGhpcy0+cmVuZGVyRW5naW5lVHlwZSA9IHJlbmRlckVuZ2luZVR5cGU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzIGJ1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzKHBpeGVsRm9ybWF0LCBpbWFnZUNhY2hlU2l6ZSwgdXNlQ29sb3JNYW5hZ2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVByb3RlY3RlZENvbnRleHQsIHByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNCYWNrZ3JvdW5kQmx1ciwgY29udGV4dFByaW9yaXR5LCByZW5kZXJFbmdpbmVUeXBlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gMSBtZWFucyBSR0JBXzg4ODgKKyAgICBpbnQgcGl4ZWxGb3JtYXQgPSAxOworICAgIHVpbnQzMl90IGltYWdlQ2FjaGVTaXplID0gMDsKKyAgICBib29sIHVzZUNvbG9yTWFuYWdlbWVudCA9IHRydWU7CisgICAgYm9vbCBlbmFibGVQcm90ZWN0ZWRDb250ZXh0ID0gZmFsc2U7CisgICAgYm9vbCBwcmVjYWNoZVRvbmVNYXBwZXJTaGFkZXJPbmx5ID0gZmFsc2U7CisgICAgYm9vbCBzdXBwb3J0c0JhY2tncm91bmRCbHVyID0gZmFsc2U7CisgICAgUmVuZGVyRW5naW5lOjpDb250ZXh0UHJpb3JpdHkgY29udGV4dFByaW9yaXR5ID0gUmVuZGVyRW5naW5lOjpDb250ZXh0UHJpb3JpdHk6Ok1FRElVTTsKKyAgICBSZW5kZXJFbmdpbmU6OlJlbmRlckVuZ2luZVR5cGUgcmVuZGVyRW5naW5lVHlwZSA9IFJlbmRlckVuZ2luZTo6UmVuZGVyRW5naW5lVHlwZTo6R0xFUzsKK307CisKK2NsYXNzIEJpbmROYXRpdmVCdWZmZXJBc0ZyYW1lYnVmZmVyIHsKK3B1YmxpYzoKKyAgICBCaW5kTmF0aXZlQnVmZmVyQXNGcmFtZWJ1ZmZlcihSZW5kZXJFbmdpbmUmIGVuZ2luZSwgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSkKKyAgICAgICAgICA6IG1FbmdpbmUoZW5naW5lKSwgbUZyYW1lYnVmZmVyKG1FbmdpbmUuZ2V0RnJhbWVidWZmZXJGb3JEcmF3aW5nKCkpLCBtU3RhdHVzKE5PX0VSUk9SKSB7CisgICAgICAgIG1TdGF0dXMgPSBtRnJhbWVidWZmZXItPnNldE5hdGl2ZVdpbmRvd0J1ZmZlcihidWZmZXIsIG1FbmdpbmUuaXNQcm90ZWN0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lYnVmZmVyQ2FjaGUpCisgICAgICAgICAgICAgICAgPyBtRW5naW5lLmJpbmRGcmFtZUJ1ZmZlcihtRnJhbWVidWZmZXIpCisgICAgICAgICAgICAgICAgOiBOT19NRU1PUlk7CisgICAgfQorICAgIH5CaW5kTmF0aXZlQnVmZmVyQXNGcmFtZWJ1ZmZlcigpIHsKKyAgICAgICAgbUZyYW1lYnVmZmVyLT5zZXROYXRpdmVXaW5kb3dCdWZmZXIobnVsbHB0ciwgZmFsc2UsIC8qYXJiaXRyYXJ5Ki8gdHJ1ZSk7CisgICAgICAgIG1FbmdpbmUudW5iaW5kRnJhbWVCdWZmZXIobUZyYW1lYnVmZmVyKTsKKyAgICB9CisgICAgc3RhdHVzX3QgZ2V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorCitwcml2YXRlOgorICAgIFJlbmRlckVuZ2luZSYgbUVuZ2luZTsKKyAgICBGcmFtZWJ1ZmZlciogbUZyYW1lYnVmZmVyOworICAgIHN0YXR1c190IG1TdGF0dXM7Cit9OworCituYW1lc3BhY2UgaW1wbCB7CisKKy8vIGltcGw6OlJlbmRlckVuZ2luZSBjb250YWlucyBjb21tb24gaW1wbGVtZW50YXRpb24gdGhhdCBpcyBncmFwaGljcyBiYWNrLWVuZCBhZ25vc3RpYy4KK2NsYXNzIFJlbmRlckVuZ2luZSA6IHB1YmxpYyByZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UmVuZGVyRW5naW5lKCkgPSAwOworCisgICAgYm9vbCB1c2VOYXRpdmVGZW5jZVN5bmMoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIHVzZVdhaXRTeW5jKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBSZW5kZXJFbmdpbmUoY29uc3QgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzJiBhcmdzKTsKKyAgICBjb25zdCBSZW5kZXJFbmdpbmVDcmVhdGlvbkFyZ3MgbUFyZ3M7Cit9OworCit9IC8vIG5hbWVzcGFjZSBpbXBsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIFNGX1JFTkRFUkVOR0lORV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL1RleHR1cmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9UZXh0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5YWNlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9UZXh0dXJlLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRl9SRU5ERVJfRU5HSU5FX1RFWFRVUkVfSAorI2RlZmluZSBTRl9SRU5ERVJfRU5HSU5FX1RFWFRVUkVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtYXRoL21hdDQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK2NsYXNzIFRleHR1cmUgeworcHVibGljOgorICAgIGVudW0gVGFyZ2V0IHsgVEVYVFVSRV8yRCA9IDB4MERFMSwgVEVYVFVSRV9FWFRFUk5BTCA9IDB4OEQ2NSB9OworCisgICAgVGV4dHVyZSgpOworICAgIFRleHR1cmUoVGFyZ2V0IHRleHR1cmVUYXJnZXQsIHVpbnQzMl90IHRleHR1cmVOYW1lKTsKKyAgICB+VGV4dHVyZSgpOworCisgICAgdm9pZCBpbml0KFRhcmdldCB0ZXh0dXJlVGFyZ2V0LCB1aW50MzJfdCB0ZXh0dXJlTmFtZSk7CisKKyAgICB2b2lkIHNldE1hdHJpeChmbG9hdCBjb25zdCogbWF0cml4KTsKKyAgICB2b2lkIHNldEZpbHRlcmluZyhib29sIGVuYWJsZWQpOworICAgIHZvaWQgc2V0RGltZW5zaW9ucyhzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOworCisgICAgdWludDMyX3QgZ2V0VGV4dHVyZU5hbWUoKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRUZXh0dXJlVGFyZ2V0KCkgY29uc3Q7CisKKyAgICBjb25zdCBtYXQ0JiBnZXRNYXRyaXgoKSBjb25zdDsKKyAgICBib29sIGdldEZpbHRlcmluZygpIGNvbnN0OworICAgIHNpemVfdCBnZXRXaWR0aCgpIGNvbnN0OworICAgIHNpemVfdCBnZXRIZWlnaHQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtVGV4dHVyZU5hbWU7CisgICAgdWludDMyX3QgbVRleHR1cmVUYXJnZXQ7CisgICAgc2l6ZV90IG1XaWR0aDsKKyAgICBzaXplX3QgbUhlaWdodDsKKyAgICBib29sIG1GaWx0ZXJpbmc7CisgICAgbWF0NCBtVGV4dHVyZU1hdHJpeDsKK307CisKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmIC8qIFNGX1JFTkRFUl9FTkdJTkVfVEVYVFVSRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvbW9jay9GcmFtZWJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svRnJhbWVidWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmI2YTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svRnJhbWVidWZmZXIuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0ZyYW1lYnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIG1vY2sgeworCitjbGFzcyBGcmFtZWJ1ZmZlciA6IHB1YmxpYyByZW5kZXJlbmdpbmU6OkZyYW1lYnVmZmVyIHsKK3B1YmxpYzoKKyAgICBGcmFtZWJ1ZmZlcigpOworICAgIH5GcmFtZWJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgTU9DS19NRVRIT0QzKHNldE5hdGl2ZVdpbmRvd0J1ZmZlciwgYm9vbChBTmF0aXZlV2luZG93QnVmZmVyKiwgYm9vbCwgY29uc3QgYm9vbCkpOworfTsKKworfSAvLyBuYW1lc3BhY2UgbW9jaworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvbW9jay9JbWFnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjBlZWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svSW1hZ2UuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0ltYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIG1vY2sgeworCitjbGFzcyBJbWFnZSA6IHB1YmxpYyByZW5kZXJlbmdpbmU6OkltYWdlIHsKK3B1YmxpYzoKKyAgICBJbWFnZSgpOworICAgIH5JbWFnZSgpIG92ZXJyaWRlOworCisgICAgTU9DS19NRVRIT0QyKHNldE5hdGl2ZVdpbmRvd0J1ZmZlciwgYm9vbChBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGJvb2wgaXNQcm90ZWN0ZWQpKTsKK307CisKK30gLy8gbmFtZXNwYWNlIG1vY2sKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svUmVuZGVyRW5naW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvbW9jay9SZW5kZXJFbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDNkZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svUmVuZGVyRW5naW5lLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9EaXNwbGF5U2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvTGF5ZXJTZXR0aW5ncy5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9NZXNoLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL1JlbmRlckVuZ2luZS5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9UZXh0dXJlLmg+CisjaW5jbHVkZSA8dWkvRmVuY2UuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvUmVnaW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIG1vY2sgeworCitjbGFzcyBSZW5kZXJFbmdpbmUgOiBwdWJsaWMgcmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUgeworcHVibGljOgorICAgIFJlbmRlckVuZ2luZSgpOworICAgIH5SZW5kZXJFbmdpbmUoKSBvdmVycmlkZTsKKworICAgIE1PQ0tfTUVUSE9EMChnZXRGcmFtZWJ1ZmZlckZvckRyYXdpbmcsIEZyYW1lYnVmZmVyKigpKTsKKyAgICBNT0NLX0NPTlNUX01FVEhPRDAocHJpbWVDYWNoZSwgdm9pZCgpKTsKKyAgICBNT0NLX01FVEhPRDEoZHVtcCwgdm9pZChzdGQ6OnN0cmluZyYpKTsKKyAgICBNT0NLX0NPTlNUX01FVEhPRDAodXNlTmF0aXZlRmVuY2VTeW5jLCBib29sKCkpOworICAgIE1PQ0tfQ09OU1RfTUVUSE9EMCh1c2VXYWl0U3luYywgYm9vbCgpKTsKKyAgICBNT0NLX0NPTlNUX01FVEhPRDAoaXNDdXJyZW50LCBib29sKCkpOworICAgIE1PQ0tfTUVUSE9EMihnZW5UZXh0dXJlcywgdm9pZChzaXplX3QsIHVpbnQzMl90KikpOworICAgIE1PQ0tfTUVUSE9EMihkZWxldGVUZXh0dXJlcywgdm9pZChzaXplX3QsIHVpbnQzMl90IGNvbnN0KikpOworICAgIE1PQ0tfTUVUSE9EMihiaW5kRXh0ZXJuYWxUZXh0dXJlSW1hZ2UsIHZvaWQodWludDMyX3QsIGNvbnN0IHJlbmRlcmVuZ2luZTo6SW1hZ2UmKSk7CisgICAgTU9DS19NRVRIT0QxKGNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyLCB2b2lkKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JikpOworICAgIE1PQ0tfTUVUSE9EMyhiaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyLAorICAgICAgICAgICAgICAgICBzdGF0dXNfdCh1aW50MzJfdCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mLCBjb25zdCBzcDxGZW5jZT4mKSk7CisgICAgTU9DS19NRVRIT0QxKHVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlciwgdm9pZCh1aW50NjRfdCkpOworICAgIE1PQ0tfTUVUSE9EMShiaW5kRnJhbWVCdWZmZXIsIHN0YXR1c190KHJlbmRlcmVuZ2luZTo6RnJhbWVidWZmZXIqKSk7CisgICAgTU9DS19NRVRIT0QxKHVuYmluZEZyYW1lQnVmZmVyLCB2b2lkKHJlbmRlcmVuZ2luZTo6RnJhbWVidWZmZXIqKSk7CisgICAgTU9DS19NRVRIT0QxKGRyYXdNZXNoLCB2b2lkKGNvbnN0IHJlbmRlcmVuZ2luZTo6TWVzaCYpKTsKKyAgICBNT0NLX0NPTlNUX01FVEhPRDAoZ2V0TWF4VGV4dHVyZVNpemUsIHNpemVfdCgpKTsKKyAgICBNT0NLX0NPTlNUX01FVEhPRDAoZ2V0TWF4Vmlld3BvcnREaW1zLCBzaXplX3QoKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QwKGlzUHJvdGVjdGVkLCBib29sKCkpOworICAgIE1PQ0tfQ09OU1RfTUVUSE9EMChzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQsIGJvb2woKSk7CisgICAgTU9DS19NRVRIT0QxKHVzZVByb3RlY3RlZENvbnRleHQsIGJvb2woYm9vbCkpOworICAgIE1PQ0tfTUVUSE9EMShjbGVhbnVwUG9zdFJlbmRlciwgYm9vbChDbGVhbnVwTW9kZSBtb2RlKSk7CisgICAgTU9DS19NRVRIT0Q2KGRyYXdMYXllcnMsCisgICAgICAgICAgICAgICAgIHN0YXR1c190KGNvbnN0IERpc3BsYXlTZXR0aW5ncyYsIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IExheWVyU2V0dGluZ3MqPiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiwgY29uc3QgYm9vbCwgYmFzZTo6dW5pcXVlX2ZkJiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCopKTsKK307CisKK30gLy8gbmFtZXNwYWNlIG1vY2sKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL3ByaXZhdGUvRGVzY3JpcHRpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9wcml2YXRlL0Rlc2NyaXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMTYxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9wcml2YXRlL0Rlc2NyaXB0aW9uLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRl9SRU5ERVJfRU5HSU5FX0RFU0NSSVBUSU9OX0hfCisjZGVmaW5lIFNGX1JFTkRFUl9FTkdJTkVfREVTQ1JJUFRJT05fSF8KKworI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9UZXh0dXJlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY1R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHN0YXRlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lLgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgY29ycmVzcG9uZGluZyBHTFNMIHByb2dyYW0gYW5kIHNldCB0aGUKKyAqIGFwcHJvcHJpYXRlIHVuaWZvcm0uCisgKi8KK3N0cnVjdCBEZXNjcmlwdGlvbiB7CisgICAgZW51bSBjbGFzcyBUcmFuc2ZlckZ1bmN0aW9uIDogaW50IHsKKyAgICAgICAgTElORUFSLAorICAgICAgICBTUkdCLAorICAgICAgICBTVDIwODQsCisgICAgICAgIEhMRywgLy8gSHlicmlkIExvZy1HYW1tYSBmb3IgSERSLgorICAgIH07CisKKyAgICBzdGF0aWMgVHJhbnNmZXJGdW5jdGlvbiBkYXRhU3BhY2VUb1RyYW5zZmVyRnVuY3Rpb24odWk6OkRhdGFzcGFjZSBkYXRhU3BhY2UpOworCisgICAgRGVzY3JpcHRpb24oKSA9IGRlZmF1bHQ7CisgICAgfkRlc2NyaXB0aW9uKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBoYXNJbnB1dFRyYW5zZm9ybU1hdHJpeCgpIGNvbnN0OworICAgIGJvb2wgaGFzT3V0cHV0VHJhbnNmb3JtTWF0cml4KCkgY29uc3Q7CisgICAgYm9vbCBoYXNDb2xvck1hdHJpeCgpIGNvbnN0OworCisgICAgLy8gd2hldGhlciB0ZXh0dXJlcyBhcmUgcHJlbXVsdGlwbGllZAorICAgIGJvb2wgaXNQcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTsKKyAgICAvLyB3aGV0aGVyIHRoaXMgbGF5ZXIgaXMgbWFya2VkIGFzIG9wYXF1ZQorICAgIGJvb2wgaXNPcGFxdWUgPSB0cnVlOworCisgICAgLy8gY29ybmVyIHJhZGl1cyBvZiB0aGUgbGF5ZXIKKyAgICBmbG9hdCBjb3JuZXJSYWRpdXMgPSAwOworCisgICAgLy8gU2l6ZSBvZiB0aGUgcm91bmRlZCByZWN0YW5nbGUgd2UgYXJlIGNyb3BwaW5nIHRvCisgICAgaGFsZjIgY3JvcFNpemU7CisKKyAgICAvLyBUZXh0dXJlIHRoaXMgbGF5ZXIgdXNlcworICAgIFRleHR1cmUgdGV4dHVyZTsKKyAgICBib29sIHRleHR1cmVFbmFibGVkID0gZmFsc2U7CisKKyAgICAvLyBjb2xvciB1c2VkIHdoZW4gdGV4dHVyaW5nIGlzIGRpc2FibGVkIG9yIHdoZW4gc2V0dGluZyBhbHBoYS4KKyAgICBoYWxmNCBjb2xvcjsKKworICAgIC8vIHRydWUgaWYgdGhlIHNhbXBsZWQgcGl4ZWwgdmFsdWVzIGFyZSBpbiBZNDEwL0JUMjAyMCByYXRoZXIgdGhhbiBSR0JBCisgICAgYm9vbCBpc1k0MTBCVDIwMjAgPSBmYWxzZTsKKworICAgIC8vIHRyYW5zZmVyIGZ1bmN0aW9ucyBmb3IgdGhlIGlucHV0L291dHB1dAorICAgIFRyYW5zZmVyRnVuY3Rpb24gaW5wdXRUcmFuc2ZlckZ1bmN0aW9uID0gVHJhbnNmZXJGdW5jdGlvbjo6TElORUFSOworICAgIFRyYW5zZmVyRnVuY3Rpb24gb3V0cHV0VHJhbnNmZXJGdW5jdGlvbiA9IFRyYW5zZmVyRnVuY3Rpb246OkxJTkVBUjsKKworICAgIGZsb2F0IGRpc3BsYXlNYXhMdW1pbmFuY2U7CisgICAgZmxvYXQgbWF4TWFzdGVyaW5nTHVtaW5hbmNlOworICAgIGZsb2F0IG1heENvbnRlbnRMdW1pbmFuY2U7CisKKyAgICAvLyBwcm9qZWN0aW9uIG1hdHJpeAorICAgIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsKKworICAgIC8vIFRoZSBjb2xvciBtYXRyaXggd2lsbCBiZSBhcHBsaWVkIGluIGxpbmVhciBzcGFjZSByaWdodCBiZWZvcmUgT0VURi4KKyAgICBtYXQ0IGNvbG9yTWF0cml4OworICAgIG1hdDQgaW5wdXRUcmFuc2Zvcm1NYXRyaXg7CisgICAgbWF0NCBvdXRwdXRUcmFuc2Zvcm1NYXRyaXg7CisKKyAgICAvLyBUcnVlIGlmIHRoaXMgbGF5ZXIgd2lsbCBkcmF3IGEgc2hhZG93LgorICAgIGJvb2wgZHJhd1NoYWRvd3MgPSBmYWxzZTsKK307CisKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLyogU0ZfUkVOREVSX0VOR0lORV9ERVNDUklQVElPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L21vY2svRnJhbWVidWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L21vY2svRnJhbWVidWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZGNhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvbW9jay9GcmFtZWJ1ZmZlci5jcHAKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9tb2NrL0ZyYW1lYnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIG1vY2sgeworCisvLyBUaGUgR29vZ2xlIE1vY2sgZG9jdW1lbnRhdGlvbiByZWNvbW1lbmRzIGV4cGxpY2l0IG5vbi1oZWFkZXIgaW5zdGFudGlhdGlvbnMKKy8vIGZvciBiZXR0ZXIgY29tcGlsZSB0aW1lIHBlcmZvcm1hbmNlLgorRnJhbWVidWZmZXI6OkZyYW1lYnVmZmVyKCkgPSBkZWZhdWx0OworRnJhbWVidWZmZXI6On5GcmFtZWJ1ZmZlcigpID0gZGVmYXVsdDsKKworfSAvLyBuYW1lc3BhY2UgbW9jaworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvbW9jay9JbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvbW9jay9JbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNDM0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9tb2NrL0ltYWdlLmNwcApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL21vY2svSW1hZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgbW9jayB7CisKKy8vIFRoZSBHb29nbGUgTW9jayBkb2N1bWVudGF0aW9uIHJlY29tbWVuZHMgZXhwbGljaXQgbm9uLWhlYWRlciBpbnN0YW50aWF0aW9ucworLy8gZm9yIGJldHRlciBjb21waWxlIHRpbWUgcGVyZm9ybWFuY2UuCitJbWFnZTo6SW1hZ2UoKSA9IGRlZmF1bHQ7CitJbWFnZTo6fkltYWdlKCkgPSBkZWZhdWx0OworCit9IC8vIG5hbWVzcGFjZSBtb2NrCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9tb2NrL1JlbmRlckVuZ2luZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvbW9jay9SZW5kZXJFbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTYzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvbW9jay9SZW5kZXJFbmdpbmUuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvbW9jay9SZW5kZXJFbmdpbmUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgbW9jayB7CisKKy8vIFRoZSBHb29nbGUgTW9jayBkb2N1bWVudGF0aW9uIHJlY29tbWVuZHMgZXhwbGljaXQgbm9uLWhlYWRlciBpbnN0YW50aWF0aW9ucworLy8gZm9yIGJldHRlciBjb21waWxlIHRpbWUgcGVyZm9ybWFuY2UuCitSZW5kZXJFbmdpbmU6OlJlbmRlckVuZ2luZSgpID0gZGVmYXVsdDsKK1JlbmRlckVuZ2luZTo6flJlbmRlckVuZ2luZSgpID0gZGVmYXVsdDsKKworfSAvLyBuYW1lc3BhY2UgbW9jaworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZWU2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlicmVuZGVyZnJpZ2h0X3Rlc3QiLAorICAgIGRlZmF1bHRzOiBbInN1cmZhY2VmbGluZ2VyX2RlZmF1bHRzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3JjczogWworICAgICAgICAiUmVuZGVyRW5naW5lVGVzdC5jcHAiLAorICAgICAgICAiUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ21vY2siLAorICAgICAgICAibGlicmVuZGVyZnJpZ2h0IiwKKyAgICAgICAgImxpYnJlbmRlcmZyaWdodF9tb2NrcyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliRUdMIiwKKyAgICAgICAgImxpYkdMRVN2MiIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlic3luYyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90ZXN0cy9SZW5kZXJFbmdpbmVUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90ZXN0cy9SZW5kZXJFbmdpbmVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzBmNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3Rlc3RzL1JlbmRlckVuZ2luZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTQ2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVE9ETyhiLzEyOTQ4MTE2NSk6IHJlbW92ZSB0aGUgI3ByYWdtYSBiZWxvdyBhbmQgZml4IGNvbnZlcnNpb24gaXNzdWVzCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XY29udmVyc2lvbiIKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvUmVuZGVyRW5naW5lLmg+CisjaW5jbHVkZSA8c3luYy9zeW5jLmg+CisjaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KKyNpbmNsdWRlICIuLi9nbC9HTEVTUmVuZGVyRW5naW5lLmgiCisjaW5jbHVkZSAiLi4vdGhyZWFkZWQvUmVuZGVyRW5naW5lVGhyZWFkZWQuaCIKKworY29uc3RleHByIGludCBERUZBVUxUX0RJU1BMQVlfV0lEVEggPSAxMjg7Citjb25zdGV4cHIgaW50IERFRkFVTFRfRElTUExBWV9IRUlHSFQgPSAyNTY7Citjb25zdGV4cHIgaW50IERFRkFVTFRfRElTUExBWV9PRkZTRVQgPSA2NDsKK2NvbnN0ZXhwciBib29sIFdSSVRFX0JVRkZFUl9UT19GSUxFX09OX0ZBSUxVUkUgPSBmYWxzZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgUmVuZGVyRW5naW5lVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgIHN0YXRpYyB2b2lkIFNldFVwVGVzdFN1aXRlKCkgeworICAgICAgICBzUkUgPSByZW5kZXJlbmdpbmU6OmdsOjpHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGUoCisgICAgICAgICAgICAgICAgcmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmVDcmVhdGlvbkFyZ3M6OkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBpeGVsRm9ybWF0KHN0YXRpY19jYXN0PGludD4odWk6OlBpeGVsRm9ybWF0OjpSR0JBXzg4ODgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEltYWdlQ2FjaGVTaXplKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VXNlQ29sb3JNYW5hZ2VybWVudChmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmFibGVQcm90ZWN0ZWRDb250ZXh0KGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3VwcG9ydHNCYWNrZ3JvdW5kQmx1cih0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRleHRQcmlvcml0eShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Q29udGV4dFByaW9yaXR5OjpNRURJVU0pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVuZGVyRW5naW5lVHlwZShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6UmVuZGVyRW5naW5lVHlwZTo6R0xFUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RTdWl0ZSgpIHsKKyAgICAgICAgLy8gVGhlIG9yZGVyaW5nIGhlcmUgaXMgaW1wb3J0YW50IC0gc0N1cnJlbnRCdWZmZXIgbXVzdCBsaXZlIGxvbmdlcgorICAgICAgICAvLyB0aGFuIFJlbmRlckVuZ2luZSB0byBhdm9pZCBhIG51bGwgcmVmZXJlbmNlIG9uIHRlYXItZG93bi4KKyAgICAgICAgc1JFID0gbnVsbHB0cjsKKyAgICAgICAgc0N1cnJlbnRCdWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIHN0YXRpYyBzcDxHcmFwaGljQnVmZmVyPiBhbGxvY2F0ZURlZmF1bHRCdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JhcGhpY0J1ZmZlcihERUZBVUxUX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiKTsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZXMgYSAxeDEgYnVmZmVyIHRvIGZpbGwgd2l0aCBhIHNvbGlkIGNvbG9yCisgICAgc3RhdGljIHNwPEdyYXBoaWNCdWZmZXI+IGFsbG9jYXRlU291cmNlQnVmZmVyKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcmFwaGljQnVmZmVyKHdpZHRoLCBoZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCIpOworICAgIH0KKworICAgIFJlbmRlckVuZ2luZVRlc3QoKSB7IG1CdWZmZXIgPSBhbGxvY2F0ZURlZmF1bHRCdWZmZXIoKTsgfQorCisgICAgflJlbmRlckVuZ2luZVRlc3QoKSB7CisgICAgICAgIGlmIChXUklURV9CVUZGRVJfVE9fRklMRV9PTl9GQUlMVVJFICYmIDo6dGVzdGluZzo6VGVzdDo6SGFzRmFpbHVyZSgpKSB7CisgICAgICAgICAgICB3cml0ZUJ1ZmZlclRvRmlsZSgiL2RhdGEvdGV4dHVyZV9vdXRfIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1aW50MzJfdCB0ZXhOYW1lIDogbVRleE5hbWVzKSB7CisgICAgICAgICAgICBzUkUtPmRlbGV0ZVRleHR1cmVzKDEsICZ0ZXhOYW1lKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShzUkUtPmlzVGV4dHVyZU5hbWVLbm93bkZvclRlc3RpbmcodGV4TmFtZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB3cml0ZUJ1ZmZlclRvRmlsZShjb25zdCBjaGFyKiBiYXNlbmFtZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZShiYXNlbmFtZSk7CisgICAgICAgIGZpbGVuYW1lLmFwcGVuZCg6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpLT5uYW1lKCkpOworICAgICAgICBmaWxlbmFtZS5hcHBlbmQoIi5wcG0iKTsKKyAgICAgICAgc3RkOjpvZnN0cmVhbSBmaWxlKGZpbGVuYW1lLmNfc3RyKCksIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgICAgICBpZiAoIWZpbGUuaXNfb3BlbigpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG9wZW4gZmlsZTogJXMiLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJZb3UgbWF5IG5lZWQgdG8gZG86IFwiYWRiIHNoZWxsIHNldGVuZm9yY2UgMFwiIHRvIGVuYWJsZSAiCisgICAgICAgICAgICAgICAgICAic3VyZmFjZWZsaW5nZXIgdG8gd3JpdGUgZGVidWcgaW1hZ2VzIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBwaXhlbHM7CisgICAgICAgIG1CdWZmZXItPmxvY2soR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnBpeGVscykpOworCisgICAgICAgIGZpbGUgPDwgIlA2XG4iOworICAgICAgICBmaWxlIDw8IG1CdWZmZXItPmdldFdpZHRoKCkgPDwgIlxuIjsKKyAgICAgICAgZmlsZSA8PCBtQnVmZmVyLT5nZXRIZWlnaHQoKSA8PCAiXG4iOworICAgICAgICBmaWxlIDw8IDI1NSA8PCAiXG4iOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG91dEJ1ZmZlcihtQnVmZmVyLT5nZXRXaWR0aCgpICogbUJ1ZmZlci0+Z2V0SGVpZ2h0KCkgKiAzKTsKKyAgICAgICAgYXV0byBvdXRQdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvdXRCdWZmZXIuZGF0YSgpKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBtQnVmZmVyLT5nZXRIZWlnaHQoKTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMgPSBwaXhlbHMgKyAobUJ1ZmZlci0+Z2V0U3RyaWRlKCkgKiBqKSAqIDQ7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtQnVmZmVyLT5nZXRXaWR0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IGNvcHkgUiwgRyBhbmQgQiBjb21wb25lbnRzCisgICAgICAgICAgICAgICAgb3V0UHRyWzBdID0gc3JjWzBdOworICAgICAgICAgICAgICAgIG91dFB0clsxXSA9IHNyY1sxXTsKKyAgICAgICAgICAgICAgICBvdXRQdHJbMl0gPSBzcmNbMl07CisgICAgICAgICAgICAgICAgb3V0UHRyICs9IDM7CisKKyAgICAgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWxlLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG91dEJ1ZmZlci5kYXRhKCkpLCBvdXRCdWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgbUJ1ZmZlci0+dW5sb2NrKCk7CisgICAgfQorCisgICAgdm9pZCBleHBlY3RCdWZmZXJDb2xvcihjb25zdCBSZWdpb24mIHJlZ2lvbiwgdWludDhfdCByLCB1aW50OF90IGcsIHVpbnQ4X3QgYiwgdWludDhfdCBhKSB7CisgICAgICAgIHNpemVfdCBjOworICAgICAgICBSZWN0IGNvbnN0KiByZWN0ID0gcmVnaW9uLmdldEFycmF5KCZjKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjOyBpKyssIHJlY3QrKykgeworICAgICAgICAgICAgZXhwZWN0QnVmZmVyQ29sb3IoKnJlY3QsIHIsIGcsIGIsIGEpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBleHBlY3RCdWZmZXJDb2xvcihjb25zdCBSZWN0JiByZWN0LCB1aW50OF90IHIsIHVpbnQ4X3QgZywgdWludDhfdCBiLCB1aW50OF90IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRvbGVyYW5jZSA9IDApIHsKKyAgICAgICAgYXV0byBjb2xvckNvbXBhcmUgPSBbdG9sZXJhbmNlXShjb25zdCB1aW50OF90KiBjb2xvckEsIGNvbnN0IHVpbnQ4X3QqIGNvbG9yQikgeworICAgICAgICAgICAgYXV0byBjb2xvckJpdENvbXBhcmUgPSBbdG9sZXJhbmNlXSh1aW50OF90IGEsIHVpbnQ4X3QgYikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdG1wID0gYSA+PSBiID8gYSAtIGIgOiBiIC0gYTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG1wIDw9IHRvbGVyYW5jZTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZXR1cm4gc3RkOjplcXVhbChjb2xvckEsIGNvbG9yQSArIDQsIGNvbG9yQiwgY29sb3JCaXRDb21wYXJlKTsKKyAgICAgICAgfTsKKworICAgICAgICBleHBlY3RCdWZmZXJDb2xvcihyZWN0LCByLCBnLCBiLCBhLCBjb2xvckNvbXBhcmUpOworICAgIH0KKworICAgIHZvaWQgZXhwZWN0QnVmZmVyQ29sb3IoY29uc3QgUmVjdCYgcmVnaW9uLCB1aW50OF90IHIsIHVpbnQ4X3QgZywgdWludDhfdCBiLCB1aW50OF90IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYik+IGNvbG9yQ29tcGFyZSkgeworICAgICAgICB1aW50OF90KiBwaXhlbHM7CisgICAgICAgIG1CdWZmZXItPmxvY2soR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnBpeGVscykpOworICAgICAgICBpbnQzMl90IG1heEZhaWxzID0gMTA7CisgICAgICAgIGludDMyX3QgZmFpbHMgPSAwOworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCByZWdpb24uZ2V0SGVpZ2h0KCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjID0KKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxzICsgKG1CdWZmZXItPmdldFN0cmlkZSgpICogKHJlZ2lvbi50b3AgKyBqKSArIHJlZ2lvbi5sZWZ0KSAqIDQ7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCByZWdpb24uZ2V0V2lkdGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBleHBlY3RlZFs0XSA9IHtyLCBnLCBiLCBhfTsKKyAgICAgICAgICAgICAgICBib29sIGVxdWFsID0gY29sb3JDb21wYXJlKHNyYywgZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGVxdWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgInBpeGVsIEAgKCIgPDwgcmVnaW9uLmxlZnQgKyBpIDw8ICIsICIgPDwgcmVnaW9uLnRvcCArIGogPDwgIik6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJleHBlY3RlZCAoIiA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocikgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGcpIDw8ICIsICIgPDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGIpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihhKSA8PCAiKSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgImdvdCAoIiA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3JjWzBdKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3JjWzFdKSA8PCAiLCAiIDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNbM10pIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgICAgICAgICBpZiAoIWVxdWFsICYmICsrZmFpbHMgPj0gbWF4RmFpbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZhaWxzID49IG1heEZhaWxzKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlci0+dW5sb2NrKCk7CisgICAgfQorCisgICAgdm9pZCBleHBlY3RBbHBoYShjb25zdCBSZWN0JiByZWN0LCB1aW50OF90IGEpIHsKKyAgICAgICAgYXV0byBjb2xvckNvbXBhcmUgPSBbXShjb25zdCB1aW50OF90KiBjb2xvckEsIGNvbnN0IHVpbnQ4X3QqIGNvbG9yQikgeworICAgICAgICAgICAgcmV0dXJuIGNvbG9yQVszXSA9PSBjb2xvckJbM107CisgICAgICAgIH07CisgICAgICAgIGV4cGVjdEJ1ZmZlckNvbG9yKHJlY3QsIDAuMGYgLyogciAqLywgMC4wZiAvKmcgKi8sIDAuMGYgLyogYiAqLywgYSwgY29sb3JDb21wYXJlKTsKKyAgICB9CisKKyAgICB2b2lkIGV4cGVjdFNoYWRvd0NvbG9yKGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyYgY2FzdGluZ0xheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZW5naW5lOjpTaGFkb3dTZXR0aW5ncyYgc2hhZG93LCBjb25zdCB1Ynl0ZTQmIGNhc3RlckNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWJ5dGU0JiBiYWNrZ3JvdW5kQ29sb3IpIHsKKyAgICAgICAgY29uc3QgUmVjdCBjYXN0ZXJSZWN0KGNhc3RpbmdMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzKTsKKyAgICAgICAgUmVnaW9uIGNhc3RlclJlZ2lvbiA9IFJlZ2lvbihjYXN0ZXJSZWN0KTsKKyAgICAgICAgY29uc3QgZmxvYXQgY2FzdGVyQ29ybmVyUmFkaXVzID0gY2FzdGluZ0xheWVyLmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzUmFkaXVzOworICAgICAgICBpZiAoY2FzdGVyQ29ybmVyUmFkaXVzID4gMC4wZikgeworICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBjb3JuZXJzIGlmIGEgY29ybmVyIHJhZGl1cyBpcyBzZXQKKyAgICAgICAgICAgIFJlY3QgY29ybmVyUmVjdChjYXN0ZXJDb3JuZXJSYWRpdXMsIGNhc3RlckNvcm5lclJhZGl1cyk7CisgICAgICAgICAgICBjYXN0ZXJSZWdpb24uc3VidHJhY3RTZWxmKGNvcm5lclJlY3Qub2Zmc2V0VG8oY2FzdGVyUmVjdC5sZWZ0LCBjYXN0ZXJSZWN0LnRvcCkpOworICAgICAgICAgICAgY2FzdGVyUmVnaW9uLnN1YnRyYWN0U2VsZigKKyAgICAgICAgICAgICAgICAgICAgY29ybmVyUmVjdC5vZmZzZXRUbyhjYXN0ZXJSZWN0LnJpZ2h0IC0gY2FzdGVyQ29ybmVyUmFkaXVzLCBjYXN0ZXJSZWN0LnRvcCkpOworICAgICAgICAgICAgY2FzdGVyUmVnaW9uLnN1YnRyYWN0U2VsZigKKyAgICAgICAgICAgICAgICAgICAgY29ybmVyUmVjdC5vZmZzZXRUbyhjYXN0ZXJSZWN0LmxlZnQsIGNhc3RlclJlY3QuYm90dG9tIC0gY2FzdGVyQ29ybmVyUmFkaXVzKSk7CisgICAgICAgICAgICBjYXN0ZXJSZWdpb24uc3VidHJhY3RTZWxmKGNvcm5lclJlY3Qub2Zmc2V0VG8oY2FzdGVyUmVjdC5yaWdodCAtIGNhc3RlckNvcm5lclJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZXJSZWN0LmJvdHRvbSAtIGNhc3RlckNvcm5lclJhZGl1cykpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgZmxvYXQgc2hhZG93SW5zZXQgPSBzaGFkb3cubGVuZ3RoICogLTEuMGY7CisgICAgICAgIGNvbnN0IFJlY3QgY2FzdGVyV2l0aFNoYWRvdyA9CisgICAgICAgICAgICAgICAgUmVjdChjYXN0ZXJSZWN0KS5pbnNldChzaGFkb3dJbnNldCwgc2hhZG93SW5zZXQsIHNoYWRvd0luc2V0LCBzaGFkb3dJbnNldCk7CisgICAgICAgIGNvbnN0IFJlZ2lvbiBzaGFkb3dSZWdpb24gPSBSZWdpb24oY2FzdGVyV2l0aFNoYWRvdykuc3VidHJhY3RTZWxmKGNhc3RlclJlY3QpOworICAgICAgICBjb25zdCBSZWdpb24gYmFja2dyb3VuZFJlZ2lvbiA9IFJlZ2lvbihmdWxsc2NyZWVuUmVjdCgpKS5zdWJ0cmFjdFNlbGYoY2FzdGVyV2l0aFNoYWRvdyk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGNhc3RpbmcgbGF5ZXIKKyAgICAgICAgZXhwZWN0QnVmZmVyQ29sb3IoY2FzdGVyUmVnaW9uLCBjYXN0ZXJDb2xvci5yLCBjYXN0ZXJDb2xvci5nLCBjYXN0ZXJDb2xvci5iLCBjYXN0ZXJDb2xvci5hKTsKKworICAgICAgICAvLyB2ZXJpZnkgc2hhZG93cyBieSB0ZXN0aW5nIGp1c3QgdGhlIGFscGhhIHNpbmNlIGl0cyBkaWZmaWN1bHQgdG8gdmFsaWRhdGUgdGhlIHNoYWRvdyBjb2xvcgorICAgICAgICBzaXplX3QgYzsKKyAgICAgICAgUmVjdCBjb25zdCogciA9IHNoYWRvd1JlZ2lvbi5nZXRBcnJheSgmYyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYzsgaSsrLCByKyspIHsKKyAgICAgICAgICAgIGV4cGVjdEFscGhhKCpyLCAyNTUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IGJhY2tncm91bmQKKyAgICAgICAgZXhwZWN0QnVmZmVyQ29sb3IoYmFja2dyb3VuZFJlZ2lvbiwgYmFja2dyb3VuZENvbG9yLnIsIGJhY2tncm91bmRDb2xvci5nLCBiYWNrZ3JvdW5kQ29sb3IuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLmEpOworICAgIH0KKworICAgIHN0YXRpYyByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzIGdldFNoYWRvd1NldHRpbmdzKGNvbnN0IHZlYzImIGNhc3RlclBvcywgZmxvYXQgc2hhZG93TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzdGVySXNUcmFuc2x1Y2VudCkgeworICAgICAgICByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzIHNoYWRvdzsKKyAgICAgICAgc2hhZG93LmFtYmllbnRDb2xvciA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjAzOWZ9OworICAgICAgICBzaGFkb3cuc3BvdENvbG9yID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMTlmfTsKKyAgICAgICAgc2hhZG93LmxpZ2h0UG9zID0gdmVjMyhjYXN0ZXJQb3MueCwgY2FzdGVyUG9zLnksIDApOworICAgICAgICBzaGFkb3cubGlnaHRSYWRpdXMgPSAwLjBmOworICAgICAgICBzaGFkb3cubGVuZ3RoID0gc2hhZG93TGVuZ3RoOworICAgICAgICBzaGFkb3cuY2FzdGVySXNUcmFuc2x1Y2VudCA9IGNhc3RlcklzVHJhbnNsdWNlbnQ7CisgICAgICAgIHJldHVybiBzaGFkb3c7CisgICAgfQorCisgICAgc3RhdGljIFJlY3QgZnVsbHNjcmVlblJlY3QoKSB7IHJldHVybiBSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCk7IH0KKworICAgIHN0YXRpYyBSZWN0IG9mZnNldFJlY3QoKSB7CisgICAgICAgIHJldHVybiBSZWN0KERFRkFVTFRfRElTUExBWV9PRkZTRVQsIERFRkFVTFRfRElTUExBWV9PRkZTRVQsIERFRkFVTFRfRElTUExBWV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCk7CisgICAgfQorCisgICAgc3RhdGljIFJlY3Qgb2Zmc2V0UmVjdEF0WmVybygpIHsKKyAgICAgICAgcmV0dXJuIFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC0gREVGQVVMVF9ESVNQTEFZX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAtIERFRkFVTFRfRElTUExBWV9PRkZTRVQpOworICAgIH0KKworICAgIHZvaWQgaW52b2tlRHJhdyhyZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIpIHsKKyAgICAgICAgYmFzZTo6dW5pcXVlX2ZkIGZlbmNlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgIHNSRS0+ZHJhd0xheWVycyhzZXR0aW5ncywgbGF5ZXJzLCBidWZmZXIsIHRydWUsIGJhc2U6OnVuaXF1ZV9mZCgpLCAmZmVuY2UpOworICAgICAgICBzQ3VycmVudEJ1ZmZlciA9IGJ1ZmZlcjsKKworICAgICAgICBpbnQgZmQgPSBmZW5jZS5yZWxlYXNlKCk7CisgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICBzeW5jX3dhaXQoZmQsIC0xKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICAgICAgaWYgKGxheWVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzUkUtPmlzRnJhbWVidWZmZXJJbWFnZUNhY2hlZEZvclRlc3RpbmcoYnVmZmVyLT5nZXRJZCgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGRyYXdFbXB0eUxheWVycygpIHsKKyAgICAgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKyAgICAgICAgLy8gTWVhbmluZ2xlc3MgYnVmZmVyIHNpbmNlIHdlIGRvbid0IGRvIGFueSBkcmF3aW5nCisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CisgICAgICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgYnVmZmVyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXIoaGFsZiByLCBoYWxmIGcsIGhhbGYgYiwgaGFsZiBhKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbFJlZEJ1ZmZlcigpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsR3JlZW5CdWZmZXIoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJsdWVCdWZmZXIoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbFJlZFRyYW5zcGFyZW50QnVmZmVyKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxSZWRPZmZzZXRCdWZmZXIoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlclBoeXNpY2FsT2Zmc2V0KCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXJDaGVja2Vycyh1aW50MzJfdCByb3RhdGlvbik7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTAoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlOTAoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMTgwKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTI3MCgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsQnVmZmVyV2l0aExheWVyVHJhbnNmb3JtKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXJMYXllclRyYW5zZm9ybSgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsQnVmZmVyV2l0aENvbG9yVHJhbnNmb3JtKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXJDb2xvclRyYW5zZm9ybSgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsUmVkQnVmZmVyV2l0aFJvdW5kZWRDb3JuZXJzKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXJXaXRoUm91bmRlZENvcm5lcnMoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlckFuZEJsdXJCYWNrZ3JvdW5kKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIG92ZXJsYXlDb3JuZXJzKCk7CisKKyAgICB2b2lkIGZpbGxSZWRCdWZmZXJUZXh0dXJlVHJhbnNmb3JtKCk7CisKKyAgICB2b2lkIGZpbGxCdWZmZXJUZXh0dXJlVHJhbnNmb3JtKCk7CisKKyAgICB2b2lkIGZpbGxSZWRCdWZmZXJXaXRoUHJlbXVsdGlwbHlBbHBoYSgpOworCisgICAgdm9pZCBmaWxsQnVmZmVyV2l0aFByZW11bHRpcGx5QWxwaGEoKTsKKworICAgIHZvaWQgZmlsbFJlZEJ1ZmZlcldpdGhvdXRQcmVtdWx0aXBseUFscGhhKCk7CisKKyAgICB2b2lkIGZpbGxCdWZmZXJXaXRob3V0UHJlbXVsdGlwbHlBbHBoYSgpOworCisgICAgdm9pZCBmaWxsR3JlZW5Db2xvckJ1ZmZlclRoZW5DbGVhclJlZ2lvbigpOworCisgICAgdm9pZCBjbGVhckxlZnRSZWdpb24oKTsKKworICAgIHZvaWQgY2xlYXJSZWdpb24oKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZHJhd1NoYWRvdyhjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MmIGNhc3RpbmdMYXllciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZW5naW5lOjpTaGFkb3dTZXR0aW5ncyYgc2hhZG93LCBjb25zdCB1Ynl0ZTQmIGNhc3RlckNvbG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1Ynl0ZTQmIGJhY2tncm91bmRDb2xvcik7CisKKyAgICAvLyBLZWVwIGFyb3VuZCB0aGUgc2FtZSByZW5kZXJlbmdpbmUgb2JqZWN0IHRvIHNhdmUgb24gaW5pdGlhbGl6YXRpb24gdGltZS4KKyAgICAvLyBGb3Igbm93LCBleGVyY2lzZSB0aGUgR0wgYmFja2VuZCBkaXJlY3RseSBzbyB0aGF0IHNvbWUgY2FjaGluZyBzcGVjaWZpY3MKKyAgICAvLyBjYW4gYmUgdGVzdGVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGludGVyZmFjZS4KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6Z2w6OkdMRVNSZW5kZXJFbmdpbmU+IHNSRTsKKyAgICAvLyBIYWNrIHRvIGF2b2lkIE5QRSBpbiB0aGUgRUdMIGRyaXZlcjogdGhlIEdyYXBoaWNCdWZmZXIgbmVlZHMgdG8KKyAgICAvLyBiZSBmcmVlZCAqYWZ0ZXIqIFJlbmRlckVuZ2luZSBpcyBkZXN0cm95ZWQsIHNvIHRoYXQgdGhlIEVHTCBpbWFnZSBpcworICAgIC8vIGRlc3Ryb3llZCBmaXJzdC4KKyAgICBzdGF0aWMgc3A8R3JhcGhpY0J1ZmZlcj4gc0N1cnJlbnRCdWZmZXI7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyOworCisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1UZXhOYW1lczsKK307CisKK3N0ZDo6dW5pcXVlX3B0cjxyZW5kZXJlbmdpbmU6OmdsOjpHTEVTUmVuZGVyRW5naW5lPiBSZW5kZXJFbmdpbmVUZXN0OjpzUkUgPSBudWxscHRyOworc3A8R3JhcGhpY0J1ZmZlcj4gUmVuZGVyRW5naW5lVGVzdDo6c0N1cnJlbnRCdWZmZXIgPSBudWxscHRyOworCitzdHJ1Y3QgQ29sb3JTb3VyY2VWYXJpYW50IHsKKyAgICBzdGF0aWMgdm9pZCBmaWxsQ29sb3IocmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzJiBsYXllciwgaGFsZiByLCBoYWxmIGcsIGhhbGYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyRW5naW5lVGVzdCogLypmaXh0dXJlKi8pIHsKKyAgICAgICAgbGF5ZXIuc291cmNlLnNvbGlkQ29sb3IgPSBoYWxmMyhyLCBnLCBiKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgUmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50IHsKKyAgICBzdGF0aWMgdm9pZCBzZXRPcGFxdWVCaXQocmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzJiBsYXllcikgeworICAgICAgICBsYXllci5zb3VyY2UuYnVmZmVyLmlzT3BhcXVlID0gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIHVpbnQ4X3QgZ2V0QWxwaGFDaGFubmVsKCkgeyByZXR1cm4gMjU1OyB9Cit9OworCitzdHJ1Y3QgRm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50IHsKKyAgICBzdGF0aWMgdm9pZCBzZXRPcGFxdWVCaXQocmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzJiBsYXllcikgeworICAgICAgICBsYXllci5zb3VyY2UuYnVmZmVyLmlzT3BhcXVlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdWludDhfdCBnZXRBbHBoYUNoYW5uZWwoKSB7CisgICAgICAgIC8vIFRoZSBpc09wYXF1ZSBiaXQgd2lsbCBvdmVycmlkZSB0aGUgYWxwaGEgY2hhbm5lbCwgc28gdGhpcyBzaG91bGQgYmUKKyAgICAgICAgLy8gYXJiaXRyYXJ5LgorICAgICAgICByZXR1cm4gMTA7CisgICAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wYXF1ZW5lc3NWYXJpYW50Pgorc3RydWN0IEJ1ZmZlclNvdXJjZVZhcmlhbnQgeworICAgIHN0YXRpYyB2b2lkIGZpbGxDb2xvcihyZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MmIGxheWVyLCBoYWxmIHIsIGhhbGYgZywgaGFsZiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJFbmdpbmVUZXN0KiBmaXh0dXJlKSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZiA9IFJlbmRlckVuZ2luZVRlc3Q6OmFsbG9jYXRlU291cmNlQnVmZmVyKDEsIDEpOworICAgICAgICB1aW50MzJfdCB0ZXhOYW1lOworICAgICAgICBmaXh0dXJlLT5zUkUtPmdlblRleHR1cmVzKDEsICZ0ZXhOYW1lKTsKKyAgICAgICAgZml4dHVyZS0+bVRleE5hbWVzLnB1c2hfYmFjayh0ZXhOYW1lKTsKKworICAgICAgICB1aW50OF90KiBwaXhlbHM7CisgICAgICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZwaXhlbHMpKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBidWYtPmdldEhlaWdodCgpOyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIGl0ZXIgPSBwaXhlbHMgKyAoYnVmLT5nZXRTdHJpZGUoKSAqIGopICogNDsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJ1Zi0+Z2V0V2lkdGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaXRlclswXSA9IHVpbnQ4X3QociAqIDI1NSk7CisgICAgICAgICAgICAgICAgaXRlclsxXSA9IHVpbnQ4X3QoZyAqIDI1NSk7CisgICAgICAgICAgICAgICAgaXRlclsyXSA9IHVpbnQ4X3QoYiAqIDI1NSk7CisgICAgICAgICAgICAgICAgaXRlclszXSA9IE9wYXF1ZW5lc3NWYXJpYW50OjpnZXRBbHBoYUNoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICBpdGVyICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWYtPnVubG9jaygpOworCisgICAgICAgIGxheWVyLnNvdXJjZS5idWZmZXIuYnVmZmVyID0gYnVmOworICAgICAgICBsYXllci5zb3VyY2UuYnVmZmVyLnRleHR1cmVOYW1lID0gdGV4TmFtZTsKKyAgICAgICAgT3BhcXVlbmVzc1ZhcmlhbnQ6OnNldE9wYXF1ZUJpdChsYXllcik7CisgICAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXIoaGFsZiByLCBoYWxmIGcsIGhhbGYgYiwgaGFsZiBhKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gZnVsbHNjcmVlblJlY3QoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllciwgciwgZywgYiwgdGhpcyk7CisgICAgbGF5ZXIuYWxwaGEgPSBhOworCisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworCisgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxSZWRCdWZmZXIoKSB7CisgICAgZmlsbEJ1ZmZlcjxTb3VyY2VWYXJpYW50PigxLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihmdWxsc2NyZWVuUmVjdCgpLCAyNTUsIDAsIDAsIDI1NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsR3JlZW5CdWZmZXIoKSB7CisgICAgZmlsbEJ1ZmZlcjxTb3VyY2VWYXJpYW50PigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihmdWxsc2NyZWVuUmVjdCgpLCAwLCAyNTUsIDAsIDI1NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQmx1ZUJ1ZmZlcigpIHsKKyAgICBmaWxsQnVmZmVyPFNvdXJjZVZhcmlhbnQ+KDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGZ1bGxzY3JlZW5SZWN0KCksIDAsIDAsIDI1NSwgMjU1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxSZWRUcmFuc3BhcmVudEJ1ZmZlcigpIHsKKyAgICBmaWxsQnVmZmVyPFNvdXJjZVZhcmlhbnQ+KDEuMGYsIDAuMGYsIDAuMGYsIC4yZik7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoZnVsbHNjcmVlblJlY3QoKSwgNTEsIDAsIDAsIDUxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxSZWRPZmZzZXRCdWZmZXIoKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gb2Zmc2V0UmVjdCgpOworICAgIHNldHRpbmdzLmNsaXAgPSBvZmZzZXRSZWN0QXRaZXJvKCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IG9mZnNldFJlY3RBdFplcm8oKS50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllciwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXIuYWxwaGEgPSAxLjBmOworCisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyUGh5c2ljYWxPZmZzZXQoKSB7CisgICAgZmlsbFJlZE9mZnNldEJ1ZmZlcjxTb3VyY2VWYXJpYW50PigpOworCisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfT0ZGU0VULCBERUZBVUxUX0RJU1BMQVlfT0ZGU0VULCBERUZBVUxUX0RJU1BMQVlfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAyNTUsIDAsIDAsIDI1NSk7CisgICAgUmVjdCBvZmZzZXRSZWdpb25MZWZ0KERFRkFVTFRfRElTUExBWV9PRkZTRVQsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpOworICAgIFJlY3Qgb2Zmc2V0UmVnaW9uVG9wKERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX09GRlNFVCk7CisKKyAgICBleHBlY3RCdWZmZXJDb2xvcihvZmZzZXRSZWdpb25MZWZ0LCAwLCAwLCAwLCAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihvZmZzZXRSZWdpb25Ub3AsIDAsIDAsIDAsIDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlckNoZWNrZXJzKHVpbnQzMl90IG9yaWVudGF0aW9uRmxhZykgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgLy8gSGVyZSBsb2dpY2FsIHNwYWNlIGlzIDJ4MgorICAgIHNldHRpbmdzLmNsaXAgPSBSZWN0KDIsIDIpOworICAgIHNldHRpbmdzLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb25GbGFnOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyT25lOworICAgIFJlY3QgcmVjdE9uZSgwLCAwLCAxLCAxKTsKKyAgICBsYXllck9uZS5nZW9tZXRyeS5ib3VuZGFyaWVzID0gcmVjdE9uZS50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllck9uZSwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXJPbmUuYWxwaGEgPSAxLjBmOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyVHdvOworICAgIFJlY3QgcmVjdFR3bygwLCAxLCAxLCAyKTsKKyAgICBsYXllclR3by5nZW9tZXRyeS5ib3VuZGFyaWVzID0gcmVjdFR3by50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllclR3bywgMC4wZiwgMS4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXJUd28uYWxwaGEgPSAxLjBmOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyVGhyZWU7CisgICAgUmVjdCByZWN0VGhyZWUoMSwgMCwgMiwgMSk7CisgICAgbGF5ZXJUaHJlZS5nZW9tZXRyeS5ib3VuZGFyaWVzID0gcmVjdFRocmVlLnRvRmxvYXRSZWN0KCk7CisgICAgU291cmNlVmFyaWFudDo6ZmlsbENvbG9yKGxheWVyVGhyZWUsIDAuMGYsIDAuMGYsIDEuMGYsIHRoaXMpOworICAgIGxheWVyVGhyZWUuYWxwaGEgPSAxLjBmOworCisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXJPbmUpOworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyVHdvKTsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllclRocmVlKTsKKworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUwKCkgeworICAgIGZpbGxCdWZmZXJDaGVja2VyczxTb3VyY2VWYXJpYW50Pih1aTo6VHJhbnNmb3JtOjpST1RfMCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdCgwLCAwLCBERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiksIDI1NSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAyNTUpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIpLAorICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDI1NSwgMjU1KTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KDAsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyLCBERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksCisgICAgICAgICAgICAgICAgICAgICAgMCwgMjU1LCAwLCAyNTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlOTAoKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzPFNvdXJjZVZhcmlhbnQ+KHVpOjpUcmFuc2Zvcm06OlJPVF85MCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdCgwLCAwLCBERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiksIDAsIDI1NSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAyNTUpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIpLAorICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMCwgMCwgMjU1KTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTUsIDI1NSk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdCgwLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLAorICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMTgwKCkgeworICAgIGZpbGxCdWZmZXJDaGVja2VyczxTb3VyY2VWYXJpYW50Pih1aTo6VHJhbnNmb3JtOjpST1RfMTgwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KDAsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyKSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAyNTUsIDAsIDI1NSk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksCisgICAgICAgICAgICAgICAgICAgICAgMjU1LCAwLCAwLCAyNTUpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIsIERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTUsIDI1NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUyNzAoKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzPFNvdXJjZVZhcmlhbnQ+KHVpOjpUcmFuc2Zvcm06OlJPVF8yNzApOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIpLCAwLCAwLCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgMjU1KTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAyNTUsIDAsIDI1NSk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdCgwLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLAorICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMCwgMCwgMjU1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJXaXRoTGF5ZXJUcmFuc2Zvcm0oKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICAvLyBIZXJlIGxvZ2ljYWwgc3BhY2UgaXMgMngyCisgICAgc2V0dGluZ3MuY2xpcCA9IFJlY3QoMiwgMik7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IFJlY3QoMSwgMSkudG9GbG9hdFJlY3QoKTsKKyAgICAvLyBUcmFuc2xhdGUgb25lIHBpeGVsIGRpYWdvbmFsbHkKKyAgICBsYXllci5nZW9tZXRyeS5wb3NpdGlvblRyYW5zZm9ybSA9IG1hdDQoMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMSk7CisgICAgU291cmNlVmFyaWFudDo6ZmlsbENvbG9yKGxheWVyLCAxLjBmLCAwLjBmLCAwLjBmLCB0aGlzKTsKKyAgICBsYXllci5zb3VyY2Uuc29saWRDb2xvciA9IGhhbGYzKDEuMGYsIDAuMGYsIDAuMGYpOworICAgIGxheWVyLmFscGhhID0gMS4wZjsKKworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyTGF5ZXJUcmFuc2Zvcm0oKSB7CisgICAgZmlsbEJ1ZmZlcldpdGhMYXllclRyYW5zZm9ybTxTb3VyY2VWYXJpYW50PigpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiksIDAsIDAsIDAsIDApOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksIDAsIDAsIDAsIDApOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLAorICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMCwgMCwgMjU1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJXaXRoQ29sb3JUcmFuc2Zvcm0oKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gUmVjdCgxLCAxKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gUmVjdCgxLCAxKS50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllciwgMC41ZiwgMC4yNWYsIDAuMTI1ZiwgdGhpcyk7CisgICAgbGF5ZXIuYWxwaGEgPSAxLjBmOworCisgICAgLy8gY29uc3RydWN0IGEgZmFrZSBjb2xvciBtYXRyaXgKKyAgICAvLyBhbm5paGlsYXRlIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzCisgICAgc2V0dGluZ3MuY29sb3JUcmFuc2Zvcm0gPSBtYXQ0OjpzY2FsZSh2ZWM0KDEsIDAsIDAsIDEpKTsKKyAgICAvLyBzZXQgcmVkIGNoYW5uZWwgdG8gcmVkICsgZ3JlZW4KKyAgICBsYXllci5jb2xvclRyYW5zZm9ybSA9IG1hdDQoMSwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSk7CisKKyAgICBsYXllci5hbHBoYSA9IDEuMGY7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IFJlY3QoMSwgMSkudG9GbG9hdFJlY3QoKTsKKworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyQ29sb3JUcmFuc2Zvcm0oKSB7CisgICAgZmlsbEJ1ZmZlcldpdGhDb2xvclRyYW5zZm9ybTxTb3VyY2VWYXJpYW50PigpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGZ1bGxzY3JlZW5SZWN0KCksIDE5MSwgMCwgMCwgMjU1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxSZWRCdWZmZXJXaXRoUm91bmRlZENvcm5lcnMoKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gZnVsbHNjcmVlblJlY3QoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIGxheWVyLmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzUmFkaXVzID0gNS4wZjsKKyAgICBsYXllci5nZW9tZXRyeS5yb3VuZGVkQ29ybmVyc0Nyb3AgPSBmdWxsc2NyZWVuUmVjdCgpLnRvRmxvYXRSZWN0KCk7CisgICAgU291cmNlVmFyaWFudDo6ZmlsbENvbG9yKGxheWVyLCAxLjBmLCAwLjBmLCAwLjBmLCB0aGlzKTsKKyAgICBsYXllci5hbHBoYSA9IDEuMGY7CisKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlcldpdGhSb3VuZGVkQ29ybmVycygpIHsKKyAgICBmaWxsUmVkQnVmZmVyV2l0aFJvdW5kZWRDb3JuZXJzPFNvdXJjZVZhcmlhbnQ+KCk7CisgICAgLy8gQ29ybmVycyBzaG91bGQgYmUgaWdub3JlZC4uLgorICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgMCwgMSwgMSksIDAsIDAsIDAsIDApOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC0gMSwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRILCAxKSwgMCwgMCwgMCwgMCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdCgwLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC0gMSwgMSwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksIDAsIDAsIDAsIDApOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC0gMSwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLAorICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDApOworICAgIC8vIC4uLkFuZCB0aGUgbm9uLXJvdW5kZWQgcG9ydGlvbiBzaG91bGQgYmUgcmVkLgorICAgIC8vIE90aGVyIHBpeGVscyBtYXkgYmUgYW50aS1hbGlhc2VkLCBzbyBsZXQncyBub3QgY2hlY2sgdGhvc2UuCisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdCg1LCA1LCBERUZBVUxUX0RJU1BMQVlfV0lEVEggLSA1LCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC0gNSksIDI1NSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAyNTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlckFuZEJsdXJCYWNrZ3JvdW5kKCkgeworICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJyby5zdXJmYWNlX2ZsaW5nZXIuc3VwcG9ydHNfYmFja2dyb3VuZF9ibHVyIiwgdmFsdWUsICIwIik7CisgICAgaWYgKCFhdG9pKHZhbHVlKSkgeworICAgICAgICAvLyBUaGlzIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgYmx1cnMsIG5vLW9wLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBibHVyUmFkaXVzID0gNTA7CisgICAgYXV0byBjZW50ZXIgPSBERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyOworCisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gZnVsbHNjcmVlblJlY3QoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBiYWNrZ3JvdW5kTGF5ZXI7CisgICAgYmFja2dyb3VuZExheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBmdWxsc2NyZWVuUmVjdCgpLnRvRmxvYXRSZWN0KCk7CisgICAgU291cmNlVmFyaWFudDo6ZmlsbENvbG9yKGJhY2tncm91bmRMYXllciwgMC4wZiwgMS4wZiwgMC4wZiwgdGhpcyk7CisgICAgYmFja2dyb3VuZExheWVyLmFscGhhID0gMS4wZjsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZiYWNrZ3JvdW5kTGF5ZXIpOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxlZnRMYXllcjsKKyAgICBsZWZ0TGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9CisgICAgICAgICAgICBSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLnRvRmxvYXRSZWN0KCk7CisgICAgU291cmNlVmFyaWFudDo6ZmlsbENvbG9yKGxlZnRMYXllciwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGVmdExheWVyLmFscGhhID0gMS4wZjsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsZWZ0TGF5ZXIpOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGJsdXJMYXllcjsKKyAgICBibHVyTGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IGZ1bGxzY3JlZW5SZWN0KCkudG9GbG9hdFJlY3QoKTsKKyAgICBibHVyTGF5ZXIuYmFja2dyb3VuZEJsdXJSYWRpdXMgPSBibHVyUmFkaXVzOworICAgIGJsdXJMYXllci5hbHBoYSA9IDA7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmYmx1ckxheWVyKTsKKworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7CisKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KGNlbnRlciAtIDEsIGNlbnRlciAtIDUsIGNlbnRlciwgY2VudGVyICsgNSksIDE1MCwgMTUwLCAwLCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgNTAgLyogdG9sZXJhbmNlICovKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KGNlbnRlciwgY2VudGVyIC0gNSwgY2VudGVyICsgMSwgY2VudGVyICsgNSksIDE1MCwgMTUwLCAwLCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgNTAgLyogdG9sZXJhbmNlICovKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6Om92ZXJsYXlDb3JuZXJzKCkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IGZ1bGxzY3JlZW5SZWN0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnNGaXJzdDsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllck9uZTsKKyAgICBsYXllck9uZS5nZW9tZXRyeS5ib3VuZGFyaWVzID0KKyAgICAgICAgICAgIEZsb2F0UmVjdCgwLCAwLCBERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAzLjAsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAzLjApOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllck9uZSwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXJPbmUuYWxwaGEgPSAwLjI7CisKKyAgICBsYXllcnNGaXJzdC5wdXNoX2JhY2soJmxheWVyT25lKTsKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnNGaXJzdCwgbUJ1ZmZlcik7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAzLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMyksIDUxLCAwLCAwLCA1MSk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAzICsgMSwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyc1NlY29uZDsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXJUd287CisgICAgbGF5ZXJUd28uZ2VvbWV0cnkuYm91bmRhcmllcyA9CisgICAgICAgICAgICBGbG9hdFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMy4wLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMy4wLAorICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCk7CisgICAgU291cmNlVmFyaWFudDo6ZmlsbENvbG9yKGxheWVyVHdvLCAwLjBmLCAxLjBmLCAwLjBmLCB0aGlzKTsKKyAgICBsYXllclR3by5hbHBoYSA9IDEuMGY7CisKKyAgICBsYXllcnNTZWNvbmQucHVzaF9iYWNrKCZsYXllclR3byk7CisgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzU2Vjb25kLCBtQnVmZmVyKTsKKworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMywgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMpLCAwLCAwLCAwLCAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDMgKyAxLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLAorICAgICAgICAgICAgICAgICAgICAgIDAsIDI1NSwgMCwgMjU1KTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsUmVkQnVmZmVyVGV4dHVyZVRyYW5zZm9ybSgpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5waHlzaWNhbERpc3BsYXkgPSBmdWxsc2NyZWVuUmVjdCgpOworICAgIHNldHRpbmdzLmNsaXAgPSBSZWN0KDEsIDEpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyOworICAgIC8vIEhlcmUgd2lsbCBhbGxvY2F0ZSBhIGNoZWNrZXIgYm9hcmQgdGV4dHVyZSwgYnV0IHRyYW5zZm9ybSB0ZXh0dXJlCisgICAgLy8gY29vcmRpbmF0ZXMgc28gdGhhdCBvbmx5IHRoZSB1cHBlciBsZWZ0IGlzIGFwcGxpZWQuCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmID0gYWxsb2NhdGVTb3VyY2VCdWZmZXIoMiwgMik7CisgICAgdWludDMyX3QgdGV4TmFtZTsKKyAgICBSZW5kZXJFbmdpbmVUZXN0OjpzUkUtPmdlblRleHR1cmVzKDEsICZ0ZXhOYW1lKTsKKyAgICB0aGlzLT5tVGV4TmFtZXMucHVzaF9iYWNrKHRleE5hbWUpOworCisgICAgdWludDhfdCogcGl4ZWxzOworICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnBpeGVscykpOworICAgIC8vIFJlZCB0b3AgbGVmdCwgR3JlZW4gdG9wIHJpZ2h0LCBCbHVlIGJvdHRvbSBsZWZ0LCBCbGFjayBib3R0b20gcmlnaHQKKyAgICBwaXhlbHNbMF0gPSAyNTU7CisgICAgcGl4ZWxzWzFdID0gMDsKKyAgICBwaXhlbHNbMl0gPSAwOworICAgIHBpeGVsc1szXSA9IDI1NTsKKyAgICBwaXhlbHNbNF0gPSAwOworICAgIHBpeGVsc1s1XSA9IDI1NTsKKyAgICBwaXhlbHNbNl0gPSAwOworICAgIHBpeGVsc1s3XSA9IDI1NTsKKyAgICBwaXhlbHNbOF0gPSAwOworICAgIHBpeGVsc1s5XSA9IDA7CisgICAgcGl4ZWxzWzEwXSA9IDI1NTsKKyAgICBwaXhlbHNbMTFdID0gMjU1OworICAgIGJ1Zi0+dW5sb2NrKCk7CisKKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLmJ1ZmZlciA9IGJ1ZjsKKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLnRleHR1cmVOYW1lID0gdGV4TmFtZTsKKyAgICAvLyBUcmFuc2Zvcm0gY29vcmRpbmF0ZXMgdG8gb25seSBiZSBpbnNpZGUgdGhlIHJlZCBxdWFkcmFudC4KKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLnRleHR1cmVUcmFuc2Zvcm0gPSBtYXQ0OjpzY2FsZSh2ZWM0KDAuMiwgMC4yLCAxLCAxKSk7CisgICAgbGF5ZXIuYWxwaGEgPSAxLjBmOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBSZWN0KDEsIDEpLnRvRmxvYXRSZWN0KCk7CisKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworfQorCit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJUZXh0dXJlVHJhbnNmb3JtKCkgeworICAgIGZpbGxSZWRCdWZmZXJUZXh0dXJlVHJhbnNmb3JtKCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoZnVsbHNjcmVlblJlY3QoKSwgMjU1LCAwLCAwLCAyNTUpOworfQorCit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxSZWRCdWZmZXJXaXRoUHJlbXVsdGlwbHlBbHBoYSgpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5waHlzaWNhbERpc3BsYXkgPSBmdWxsc2NyZWVuUmVjdCgpOworICAgIC8vIEhlcmUgbG9naWNhbCBzcGFjZSBpcyAxeDEKKyAgICBzZXR0aW5ncy5jbGlwID0gUmVjdCgxLCAxKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYgPSBhbGxvY2F0ZVNvdXJjZUJ1ZmZlcigxLCAxKTsKKyAgICB1aW50MzJfdCB0ZXhOYW1lOworICAgIFJlbmRlckVuZ2luZVRlc3Q6OnNSRS0+Z2VuVGV4dHVyZXMoMSwgJnRleE5hbWUpOworICAgIHRoaXMtPm1UZXhOYW1lcy5wdXNoX2JhY2sodGV4TmFtZSk7CisKKyAgICB1aW50OF90KiBwaXhlbHM7CisgICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmcGl4ZWxzKSk7CisgICAgcGl4ZWxzWzBdID0gMjU1OworICAgIHBpeGVsc1sxXSA9IDA7CisgICAgcGl4ZWxzWzJdID0gMDsKKyAgICBwaXhlbHNbM10gPSAyNTU7CisgICAgYnVmLT51bmxvY2soKTsKKworICAgIGxheWVyLnNvdXJjZS5idWZmZXIuYnVmZmVyID0gYnVmOworICAgIGxheWVyLnNvdXJjZS5idWZmZXIudGV4dHVyZU5hbWUgPSB0ZXhOYW1lOworICAgIGxheWVyLnNvdXJjZS5idWZmZXIudXNlUHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTsKKyAgICBsYXllci5hbHBoYSA9IDAuNWY7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IFJlY3QoMSwgMSkudG9GbG9hdFJlY3QoKTsKKworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlcldpdGhQcmVtdWx0aXBseUFscGhhKCkgeworICAgIGZpbGxSZWRCdWZmZXJXaXRoUHJlbXVsdGlwbHlBbHBoYSgpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGZ1bGxzY3JlZW5SZWN0KCksIDEyOCwgMCwgMCwgMTI4KTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsUmVkQnVmZmVyV2l0aG91dFByZW11bHRpcGx5QWxwaGEoKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICAvLyBIZXJlIGxvZ2ljYWwgc3BhY2UgaXMgMXgxCisgICAgc2V0dGluZ3MuY2xpcCA9IFJlY3QoMSwgMSk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmID0gYWxsb2NhdGVTb3VyY2VCdWZmZXIoMSwgMSk7CisgICAgdWludDMyX3QgdGV4TmFtZTsKKyAgICBSZW5kZXJFbmdpbmVUZXN0OjpzUkUtPmdlblRleHR1cmVzKDEsICZ0ZXhOYW1lKTsKKyAgICB0aGlzLT5tVGV4TmFtZXMucHVzaF9iYWNrKHRleE5hbWUpOworCisgICAgdWludDhfdCogcGl4ZWxzOworICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnBpeGVscykpOworICAgIHBpeGVsc1swXSA9IDI1NTsKKyAgICBwaXhlbHNbMV0gPSAwOworICAgIHBpeGVsc1syXSA9IDA7CisgICAgcGl4ZWxzWzNdID0gMjU1OworICAgIGJ1Zi0+dW5sb2NrKCk7CisKKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLmJ1ZmZlciA9IGJ1ZjsKKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLnRleHR1cmVOYW1lID0gdGV4TmFtZTsKKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLnVzZVByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlOworICAgIGxheWVyLmFscGhhID0gMC41ZjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gUmVjdCgxLCAxKS50b0Zsb2F0UmVjdCgpOworCisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworCisgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyV2l0aG91dFByZW11bHRpcGx5QWxwaGEoKSB7CisgICAgZmlsbFJlZEJ1ZmZlcldpdGhvdXRQcmVtdWx0aXBseUFscGhhKCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoZnVsbHNjcmVlblJlY3QoKSwgMTI4LCAwLCAwLCA2NCwgMSk7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6Y2xlYXJMZWZ0UmVnaW9uKCkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgLy8gSGVyZSBsb2dpY2FsIHNwYWNlIGlzIDR4NAorICAgIHNldHRpbmdzLmNsaXAgPSBSZWN0KDQsIDQpOworICAgIHNldHRpbmdzLmNsZWFyUmVnaW9uID0gUmVnaW9uKFJlY3QoMiwgNCkpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKyAgICAvLyBmYWtlIGxheWVyLCB3aXRob3V0IGJvdW5kcyBzaG91bGQgbm90IHJlbmRlciBhbnl0aGluZworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpjbGVhclJlZ2lvbigpIHsKKyAgICAvLyBSZXVzZSBtQnVmZmVyCisgICAgY2xlYXJMZWZ0UmVnaW9uKCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwgMCwgMCwgMCwgMjU1KTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLAorICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZHJhd1NoYWRvdyhjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MmIGNhc3RpbmdMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzJiBzaGFkb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWJ5dGU0JiBjYXN0ZXJDb2xvciwgY29uc3QgdWJ5dGU0JiBiYWNrZ3JvdW5kQ29sb3IpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5waHlzaWNhbERpc3BsYXkgPSBmdWxsc2NyZWVuUmVjdCgpOworICAgIHNldHRpbmdzLmNsaXAgPSBmdWxsc2NyZWVuUmVjdCgpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworCisgICAgLy8gYWRkIGJhY2tncm91bmQgbGF5ZXIKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgYmdMYXllcjsKKyAgICBiZ0xheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBmdWxsc2NyZWVuUmVjdCgpLnRvRmxvYXRSZWN0KCk7CisgICAgQ29sb3JTb3VyY2VWYXJpYW50OjpmaWxsQ29sb3IoYmdMYXllciwgYmFja2dyb3VuZENvbG9yLnIgLyAyNTUuMGYsIGJhY2tncm91bmRDb2xvci5nIC8gMjU1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5iIC8gMjU1LjBmLCB0aGlzKTsKKyAgICBiZ0xheWVyLmFscGhhID0gYmFja2dyb3VuZENvbG9yLmEgLyAyNTUuMGY7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmYmdMYXllcik7CisKKyAgICAvLyBhZGQgc2hhZG93IGxheWVyCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIHNoYWRvd0xheWVyOworICAgIHNoYWRvd0xheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBjYXN0aW5nTGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllczsKKyAgICBzaGFkb3dMYXllci5hbHBoYSA9IGNhc3RpbmdMYXllci5hbHBoYTsKKyAgICBzaGFkb3dMYXllci5zaGFkb3cgPSBzaGFkb3c7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmc2hhZG93TGF5ZXIpOworCisgICAgLy8gYWRkIGxheWVyIGNhc3RpbmcgdGhlIHNoYWRvdworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllciA9IGNhc3RpbmdMYXllcjsKKyAgICBTb3VyY2VWYXJpYW50OjpmaWxsQ29sb3IobGF5ZXIsIGNhc3RlckNvbG9yLnIgLyAyNTUuMGYsIGNhc3RlckNvbG9yLmcgLyAyNTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlckNvbG9yLmIgLyAyNTUuMGYsIHRoaXMpOworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX25vTGF5ZXJzVG9EcmF3KSB7CisgICAgZHJhd0VtcHR5TGF5ZXJzKCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX251bGxPdXRwdXRCdWZmZXIpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBmdWxsc2NyZWVuUmVjdCgpLnRvRmxvYXRSZWN0KCk7CisgICAgQnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+OjpmaWxsQ29sb3IobGF5ZXIsIDEuMGYsIDAuMGYsIDAuMGYsIHRoaXMpOworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKyAgICBiYXNlOjp1bmlxdWVfZmQgZmVuY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc1JFLT5kcmF3TGF5ZXJzKHNldHRpbmdzLCBsYXllcnMsIG51bGxwdHIsIHRydWUsIGJhc2U6OnVuaXF1ZV9mZCgpLCAmZmVuY2UpOworCisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgc3RhdHVzKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfbnVsbE91dHB1dEZlbmNlKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gZnVsbHNjcmVlblJlY3QoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IGZ1bGxzY3JlZW5SZWN0KCkudG9GbG9hdFJlY3QoKTsKKyAgICBCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD46OmZpbGxDb2xvcihsYXllciwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXIuYWxwaGEgPSAxLjA7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc1JFLT5kcmF3TGF5ZXJzKHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIsIHRydWUsIGJhc2U6OnVuaXF1ZV9mZCgpLCBudWxscHRyKTsKKyAgICBzQ3VycmVudEJ1ZmZlciA9IG1CdWZmZXI7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzdGF0dXMpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGZ1bGxzY3JlZW5SZWN0KCksIDI1NSwgMCwgMCwgMjU1KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZG9lc05vdENhY2hlRnJhbWVidWZmZXIpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5waHlzaWNhbERpc3BsYXkgPSBmdWxsc2NyZWVuUmVjdCgpOworICAgIHNldHRpbmdzLmNsaXAgPSBmdWxsc2NyZWVuUmVjdCgpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pjo6ZmlsbENvbG9yKGxheWVyLCAxLjBmLCAwLjBmLCAwLjBmLCB0aGlzKTsKKyAgICBsYXllci5hbHBoYSA9IDEuMDsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzUkUtPmRyYXdMYXllcnMoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlciwgZmFsc2UsIGJhc2U6OnVuaXF1ZV9mZCgpLCBudWxscHRyKTsKKyAgICBzQ3VycmVudEJ1ZmZlciA9IG1CdWZmZXI7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzdGF0dXMpOworICAgIEFTU0VSVF9GQUxTRShzUkUtPmlzRnJhbWVidWZmZXJJbWFnZUNhY2hlZEZvclRlc3RpbmcobUJ1ZmZlci0+Z2V0SWQoKSkpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGZ1bGxzY3JlZW5SZWN0KCksIDI1NSwgMCwgMCwgMjU1KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFJlZEJ1ZmZlcl9jb2xvclNvdXJjZSkgeworICAgIGZpbGxSZWRCdWZmZXI8Q29sb3JTb3VyY2VWYXJpYW50PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsR3JlZW5CdWZmZXJfY29sb3JTb3VyY2UpIHsKKyAgICBmaWxsR3JlZW5CdWZmZXI8Q29sb3JTb3VyY2VWYXJpYW50PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQmx1ZUJ1ZmZlcl9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCbHVlQnVmZmVyPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFJlZFRyYW5zcGFyZW50QnVmZmVyX2NvbG9yU291cmNlKSB7CisgICAgZmlsbFJlZFRyYW5zcGFyZW50QnVmZmVyPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlclBoeXNpY2FsT2Zmc2V0X2NvbG9yU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlclBoeXNpY2FsT2Zmc2V0PENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMF9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTA8Q29sb3JTb3VyY2VWYXJpYW50PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGU5MF9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTkwPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMTgwX2NvbG9yU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMTgwPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMjcwX2NvbG9yU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMjcwPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtX2NvbG9yU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNvbG9yVHJhbnNmb3JtX2NvbG9yU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlclJvdW5kZWRDb3JuZXJzX2NvbG9yU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlcldpdGhSb3VuZGVkQ29ybmVyczxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJBbmRCbHVyQmFja2dyb3VuZF9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJBbmRCbHVyQmFja2dyb3VuZDxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX292ZXJsYXlDb3JuZXJzX2NvbG9yU291cmNlKSB7CisgICAgb3ZlcmxheUNvcm5lcnM8Q29sb3JTb3VyY2VWYXJpYW50PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsUmVkQnVmZmVyX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxSZWRCdWZmZXI8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsR3JlZW5CdWZmZXJfb3BhcXVlQnVmZmVyU291cmNlKSB7CisgICAgZmlsbEdyZWVuQnVmZmVyPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJsdWVCdWZmZXJfb3BhcXVlQnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJsdWVCdWZmZXI8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsUmVkVHJhbnNwYXJlbnRCdWZmZXJfb3BhcXVlQnVmZmVyU291cmNlKSB7CisgICAgZmlsbFJlZFRyYW5zcGFyZW50QnVmZmVyPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlclBoeXNpY2FsT2Zmc2V0X29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJQaHlzaWNhbE9mZnNldDxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTBfb3BhcXVlQnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMDxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTkwX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTkwPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMTgwX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTE4MDxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTI3MF9vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUyNzA8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyTGF5ZXJUcmFuc2Zvcm1fb3BhcXVlQnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNvbG9yVHJhbnNmb3JtX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJMYXllclRyYW5zZm9ybTxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJSb3VuZGVkQ29ybmVyc19vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyV2l0aFJvdW5kZWRDb3JuZXJzPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckFuZEJsdXJCYWNrZ3JvdW5kX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJBbmRCbHVyQmFja2dyb3VuZDxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX292ZXJsYXlDb3JuZXJzX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIG92ZXJsYXlDb3JuZXJzPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFJlZEJ1ZmZlcl9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsUmVkQnVmZmVyPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEdyZWVuQnVmZmVyX2J1ZmZlclNvdXJjZSkgeworICAgIGZpbGxHcmVlbkJ1ZmZlcjxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCbHVlQnVmZmVyX2J1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCbHVlQnVmZmVyPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFJlZFRyYW5zcGFyZW50QnVmZmVyX2J1ZmZlclNvdXJjZSkgeworICAgIGZpbGxSZWRUcmFuc3BhcmVudEJ1ZmZlcjxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJQaHlzaWNhbE9mZnNldF9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyUGh5c2ljYWxPZmZzZXQ8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUwX2J1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTA8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGU5MF9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGU5MDxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTE4MF9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUxODA8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUyNzBfYnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMjcwPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtX2J1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJMYXllclRyYW5zZm9ybTxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDb2xvclRyYW5zZm9ybV9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyTGF5ZXJUcmFuc2Zvcm08QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyUm91bmRlZENvcm5lcnNfYnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlcldpdGhSb3VuZGVkQ29ybmVyczxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJBbmRCbHVyQmFja2dyb3VuZF9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQW5kQmx1ckJhY2tncm91bmQ8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19vdmVybGF5Q29ybmVyc19idWZmZXJTb3VyY2UpIHsKKyAgICBvdmVybGF5Q29ybmVyczxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJUZXh0dXJlVHJhbnNmb3JtKSB7CisgICAgZmlsbEJ1ZmZlclRleHR1cmVUcmFuc2Zvcm0oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlcl9wcmVtdWx0aXBsaWVzQWxwaGEpIHsKKyAgICBmaWxsQnVmZmVyV2l0aFByZW11bHRpcGx5QWxwaGEoKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlcl93aXRob3V0UHJlbXVsdGlwbHlpbmdBbHBoYSkgeworICAgIGZpbGxCdWZmZXJXaXRob3V0UHJlbXVsdGlwbHlBbHBoYSgpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19jbGVhclJlZ2lvbikgeworICAgIGNsZWFyUmVnaW9uKCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxzQnVmZmVyQW5kQ2FjaGVzSW1hZ2VzKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gZnVsbHNjcmVlblJlY3QoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pjo6ZmlsbENvbG9yKGxheWVyLCAxLjBmLCAwLjBmLCAwLjBmLCB0aGlzKTsKKworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gbGF5ZXIuc291cmNlLmJ1ZmZlci5idWZmZXItPmdldElkKCk7CisgICAgRVhQRUNUX1RSVUUoc1JFLT5pc0ltYWdlQ2FjaGVkRm9yVGVzdGluZyhidWZmZXJJZCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxyZW5kZXJlbmdpbmU6OmdsOjpJbWFnZU1hbmFnZXI6OkJhcnJpZXI+IGJhcnJpZXIgPQorICAgICAgICAgICAgc1JFLT51bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXJGb3JUZXN0aW5nKGJ1ZmZlcklkKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhiYXJyaWVyLT5tdXRleCk7CisgICAgQVNTRVJUX1RSVUUoYmFycmllci0+Y29uZGl0aW9uLndhaXRfZm9yKGJhcnJpZXItPm11dGV4LCBzdGQ6OmNocm9ubzo6c2Vjb25kcyg1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKCkgUkVRVUlSRVMoYmFycmllci0+bXV0ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXJyaWVyLT5pc09wZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc1JFLT5pc0ltYWdlQ2FjaGVkRm9yVGVzdGluZyhidWZmZXJJZCkpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgYmFycmllci0+cmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGJpbmRFeHRlcm5hbEJ1ZmZlcl93aXRoTnVsbEJ1ZmZlcikgeworICAgIHN0YXR1c190IHJlc3VsdCA9IHNSRS0+YmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcigwLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgYmluZEV4dGVybmFsQnVmZmVyX2NhY2hlc0ltYWdlcykgeworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZiA9IGFsbG9jYXRlU291cmNlQnVmZmVyKDEsIDEpOworICAgIHVpbnQzMl90IHRleE5hbWU7CisgICAgc1JFLT5nZW5UZXh0dXJlcygxLCAmdGV4TmFtZSk7CisgICAgbVRleE5hbWVzLnB1c2hfYmFjayh0ZXhOYW1lKTsKKworICAgIHNSRS0+YmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcih0ZXhOYW1lLCBidWYsIG51bGxwdHIpOworICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gYnVmLT5nZXRJZCgpOworICAgIEVYUEVDVF9UUlVFKHNSRS0+aXNJbWFnZUNhY2hlZEZvclRlc3RpbmcoYnVmZmVySWQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8cmVuZGVyZW5naW5lOjpnbDo6SW1hZ2VNYW5hZ2VyOjpCYXJyaWVyPiBiYXJyaWVyID0KKyAgICAgICAgICAgIHNSRS0+dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZyhidWZmZXJJZCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYmFycmllci0+bXV0ZXgpOworICAgIEFTU0VSVF9UUlVFKGJhcnJpZXItPmNvbmRpdGlvbi53YWl0X2ZvcihiYXJyaWVyLT5tdXRleCwgc3RkOjpjaHJvbm86OnNlY29uZHMoNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXSgpIFJFUVVJUkVTKGJhcnJpZXItPm11dGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFycmllci0+aXNPcGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBiYXJyaWVyLT5yZXN1bHQpOworICAgIEVYUEVDVF9GQUxTRShzUkUtPmlzSW1hZ2VDYWNoZWRGb3JUZXN0aW5nKGJ1ZmZlcklkKSk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBjYWNoZUV4dGVybmFsQnVmZmVyX3dpdGhOdWxsQnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPHJlbmRlcmVuZ2luZTo6Z2w6OkltYWdlTWFuYWdlcjo6QmFycmllcj4gYmFycmllciA9CisgICAgICAgICAgICBzUkUtPmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZyhudWxscHRyKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhiYXJyaWVyLT5tdXRleCk7CisgICAgQVNTRVJUX1RSVUUoYmFycmllci0+Y29uZGl0aW9uLndhaXRfZm9yKGJhcnJpZXItPm11dGV4LCBzdGQ6OmNocm9ubzo6c2Vjb25kcyg1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKCkgUkVRVUlSRVMoYmFycmllci0+bXV0ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXJyaWVyLT5pc09wZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICBFWFBFQ1RfVFJVRShiYXJyaWVyLT5pc09wZW4pOworICAgIEVYUEVDVF9FUShCQURfVkFMVUUsIGJhcnJpZXItPnJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBjYWNoZUV4dGVybmFsQnVmZmVyX2NhY2hlc0ltYWdlcykgeworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZiA9IGFsbG9jYXRlU291cmNlQnVmZmVyKDEsIDEpOworICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gYnVmLT5nZXRJZCgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxyZW5kZXJlbmdpbmU6OmdsOjpJbWFnZU1hbmFnZXI6OkJhcnJpZXI+IGJhcnJpZXIgPQorICAgICAgICAgICAgc1JFLT5jYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlckZvclRlc3RpbmcoYnVmKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJhcnJpZXItPm11dGV4KTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmFycmllci0+Y29uZGl0aW9uLndhaXRfZm9yKGJhcnJpZXItPm11dGV4LCBzdGQ6OmNocm9ubzo6c2Vjb25kcyg1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXSgpIFJFUVVJUkVTKGJhcnJpZXItPm11dGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhcnJpZXItPmlzT3BlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBiYXJyaWVyLT5yZXN1bHQpOworICAgIH0KKyAgICBFWFBFQ1RfVFJVRShzUkUtPmlzSW1hZ2VDYWNoZWRGb3JUZXN0aW5nKGJ1ZmZlcklkKSk7CisgICAgYmFycmllciA9IHNSRS0+dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZyhidWZmZXJJZCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhiYXJyaWVyLT5tdXRleCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJhcnJpZXItPmNvbmRpdGlvbi53YWl0X2ZvcihiYXJyaWVyLT5tdXRleCwgc3RkOjpjaHJvbm86OnNlY29uZHMoNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oKSBSRVFVSVJFUyhiYXJyaWVyLT5tdXRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXJyaWVyLT5pc09wZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgIEVYUEVDVF9FUShOT19FUlJPUiwgYmFycmllci0+cmVzdWx0KTsKKyAgICB9CisgICAgRVhQRUNUX0ZBTFNFKHNSRS0+aXNJbWFnZUNhY2hlZEZvclRlc3RpbmcoYnVmZmVySWQpKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFNoYWRvd19jYXN0ZXJMYXllck1pblNpemUpIHsKKyAgICBjb25zdCB1Ynl0ZTQgY2FzdGVyQ29sb3IoMjU1LCAwLCAwLCAyNTUpOworICAgIGNvbnN0IHVieXRlNCBiYWNrZ3JvdW5kQ29sb3IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKyAgICBjb25zdCBmbG9hdCBzaGFkb3dMZW5ndGggPSA1LjBmOworICAgIFJlY3QgY2FzdGVyQm91bmRzKDEsIDEpOworICAgIGNhc3RlckJvdW5kcy5vZmZzZXRCeShzaGFkb3dMZW5ndGggKyAxLCBzaGFkb3dMZW5ndGggKyAxKTsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgY2FzdGluZ0xheWVyOworICAgIGNhc3RpbmdMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gY2FzdGVyQm91bmRzLnRvRmxvYXRSZWN0KCk7CisgICAgY2FzdGluZ0xheWVyLmFscGhhID0gMS4wZjsKKyAgICByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzIHNldHRpbmdzID0KKyAgICAgICAgICAgIGdldFNoYWRvd1NldHRpbmdzKHZlYzIoY2FzdGVyQm91bmRzLmxlZnQsIGNhc3RlckJvdW5kcy50b3ApLCBzaGFkb3dMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYXN0ZXJJc1RyYW5zbHVjZW50ICovKTsKKworICAgIGRyYXdTaGFkb3c8Q29sb3JTb3VyY2VWYXJpYW50PihjYXN0aW5nTGF5ZXIsIHNldHRpbmdzLCBjYXN0ZXJDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKKyAgICBleHBlY3RTaGFkb3dDb2xvcihjYXN0aW5nTGF5ZXIsIHNldHRpbmdzLCBjYXN0ZXJDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFNoYWRvd19jYXN0ZXJDb2xvckxheWVyKSB7CisgICAgY29uc3QgdWJ5dGU0IGNhc3RlckNvbG9yKDI1NSwgMCwgMCwgMjU1KTsKKyAgICBjb25zdCB1Ynl0ZTQgYmFja2dyb3VuZENvbG9yKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgY29uc3QgZmxvYXQgc2hhZG93TGVuZ3RoID0gNS4wZjsKKyAgICBSZWN0IGNhc3RlckJvdW5kcyhERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAzLjBmLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMy4wZik7CisgICAgY2FzdGVyQm91bmRzLm9mZnNldEJ5KHNoYWRvd0xlbmd0aCArIDEsIHNoYWRvd0xlbmd0aCArIDEpOworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBjYXN0aW5nTGF5ZXI7CisgICAgY2FzdGluZ0xheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBjYXN0ZXJCb3VuZHMudG9GbG9hdFJlY3QoKTsKKyAgICBjYXN0aW5nTGF5ZXIuYWxwaGEgPSAxLjBmOworICAgIHJlbmRlcmVuZ2luZTo6U2hhZG93U2V0dGluZ3Mgc2V0dGluZ3MgPQorICAgICAgICAgICAgZ2V0U2hhZG93U2V0dGluZ3ModmVjMihjYXN0ZXJCb3VuZHMubGVmdCwgY2FzdGVyQm91bmRzLnRvcCksIHNoYWRvd0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhc3RlcklzVHJhbnNsdWNlbnQgKi8pOworCisgICAgZHJhd1NoYWRvdzxDb2xvclNvdXJjZVZhcmlhbnQ+KGNhc3RpbmdMYXllciwgc2V0dGluZ3MsIGNhc3RlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOworICAgIGV4cGVjdFNoYWRvd0NvbG9yKGNhc3RpbmdMYXllciwgc2V0dGluZ3MsIGNhc3RlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsU2hhZG93X2Nhc3Rlck9wYXF1ZUJ1ZmZlckxheWVyKSB7CisgICAgY29uc3QgdWJ5dGU0IGNhc3RlckNvbG9yKDI1NSwgMCwgMCwgMjU1KTsKKyAgICBjb25zdCB1Ynl0ZTQgYmFja2dyb3VuZENvbG9yKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgY29uc3QgZmxvYXQgc2hhZG93TGVuZ3RoID0gNS4wZjsKKyAgICBSZWN0IGNhc3RlckJvdW5kcyhERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAzLjBmLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMy4wZik7CisgICAgY2FzdGVyQm91bmRzLm9mZnNldEJ5KHNoYWRvd0xlbmd0aCArIDEsIHNoYWRvd0xlbmd0aCArIDEpOworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBjYXN0aW5nTGF5ZXI7CisgICAgY2FzdGluZ0xheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBjYXN0ZXJCb3VuZHMudG9GbG9hdFJlY3QoKTsKKyAgICBjYXN0aW5nTGF5ZXIuYWxwaGEgPSAxLjBmOworICAgIHJlbmRlcmVuZ2luZTo6U2hhZG93U2V0dGluZ3Mgc2V0dGluZ3MgPQorICAgICAgICAgICAgZ2V0U2hhZG93U2V0dGluZ3ModmVjMihjYXN0ZXJCb3VuZHMubGVmdCwgY2FzdGVyQm91bmRzLnRvcCksIHNoYWRvd0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhc3RlcklzVHJhbnNsdWNlbnQgKi8pOworCisgICAgZHJhd1NoYWRvdzxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KGNhc3RpbmdMYXllciwgc2V0dGluZ3MsIGNhc3RlckNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IpOworICAgIGV4cGVjdFNoYWRvd0NvbG9yKGNhc3RpbmdMYXllciwgc2V0dGluZ3MsIGNhc3RlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsU2hhZG93X2Nhc3RlcldpdGhSb3VuZGVkQ29ybmVyKSB7CisgICAgY29uc3QgdWJ5dGU0IGNhc3RlckNvbG9yKDI1NSwgMCwgMCwgMjU1KTsKKyAgICBjb25zdCB1Ynl0ZTQgYmFja2dyb3VuZENvbG9yKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgY29uc3QgZmxvYXQgc2hhZG93TGVuZ3RoID0gNS4wZjsKKyAgICBSZWN0IGNhc3RlckJvdW5kcyhERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAzLjBmLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMy4wZik7CisgICAgY2FzdGVyQm91bmRzLm9mZnNldEJ5KHNoYWRvd0xlbmd0aCArIDEsIHNoYWRvd0xlbmd0aCArIDEpOworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBjYXN0aW5nTGF5ZXI7CisgICAgY2FzdGluZ0xheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBjYXN0ZXJCb3VuZHMudG9GbG9hdFJlY3QoKTsKKyAgICBjYXN0aW5nTGF5ZXIuZ2VvbWV0cnkucm91bmRlZENvcm5lcnNSYWRpdXMgPSAzLjBmOworICAgIGNhc3RpbmdMYXllci5nZW9tZXRyeS5yb3VuZGVkQ29ybmVyc0Nyb3AgPSBjYXN0ZXJCb3VuZHMudG9GbG9hdFJlY3QoKTsKKyAgICBjYXN0aW5nTGF5ZXIuYWxwaGEgPSAxLjBmOworICAgIHJlbmRlcmVuZ2luZTo6U2hhZG93U2V0dGluZ3Mgc2V0dGluZ3MgPQorICAgICAgICAgICAgZ2V0U2hhZG93U2V0dGluZ3ModmVjMihjYXN0ZXJCb3VuZHMubGVmdCwgY2FzdGVyQm91bmRzLnRvcCksIHNoYWRvd0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhc3RlcklzVHJhbnNsdWNlbnQgKi8pOworCisgICAgZHJhd1NoYWRvdzxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KGNhc3RpbmdMYXllciwgc2V0dGluZ3MsIGNhc3RlckNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IpOworICAgIGV4cGVjdFNoYWRvd0NvbG9yKGNhc3RpbmdMYXllciwgc2V0dGluZ3MsIGNhc3RlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsU2hhZG93X3RyYW5zbHVjZW50Q2FzdGVyV2l0aEFscGhhKSB7CisgICAgY29uc3QgdWJ5dGU0IGNhc3RlckNvbG9yKDI1NSwgMCwgMCwgMjU1KTsKKyAgICBjb25zdCB1Ynl0ZTQgYmFja2dyb3VuZENvbG9yKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgY29uc3QgZmxvYXQgc2hhZG93TGVuZ3RoID0gNS4wZjsKKyAgICBSZWN0IGNhc3RlckJvdW5kcyhERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAzLjBmLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMy4wZik7CisgICAgY2FzdGVyQm91bmRzLm9mZnNldEJ5KHNoYWRvd0xlbmd0aCArIDEsIHNoYWRvd0xlbmd0aCArIDEpOworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBjYXN0aW5nTGF5ZXI7CisgICAgY2FzdGluZ0xheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBjYXN0ZXJCb3VuZHMudG9GbG9hdFJlY3QoKTsKKyAgICBjYXN0aW5nTGF5ZXIuYWxwaGEgPSAwLjVmOworICAgIHJlbmRlcmVuZ2luZTo6U2hhZG93U2V0dGluZ3Mgc2V0dGluZ3MgPQorICAgICAgICAgICAgZ2V0U2hhZG93U2V0dGluZ3ModmVjMihjYXN0ZXJCb3VuZHMubGVmdCwgY2FzdGVyQm91bmRzLnRvcCksIHNoYWRvd0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY2FzdGVySXNUcmFuc2x1Y2VudCAqLyk7CisKKyAgICBkcmF3U2hhZG93PEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oY2FzdGluZ0xheWVyLCBzZXR0aW5ncywgY2FzdGVyQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcik7CisKKyAgICAvLyB2ZXJpZnkgb25seSB0aGUgYmFja2dyb3VuZCBzaW5jZSB0aGUgc2hhZG93IHdpbGwgZHJhdyBiZWhpbmQgdGhlIGNhc3RlcgorICAgIGNvbnN0IGZsb2F0IHNoYWRvd0luc2V0ID0gc2V0dGluZ3MubGVuZ3RoICogLTEuMGY7CisgICAgY29uc3QgUmVjdCBjYXN0ZXJXaXRoU2hhZG93ID0KKyAgICAgICAgICAgIFJlY3QoY2FzdGVyQm91bmRzKS5pbnNldChzaGFkb3dJbnNldCwgc2hhZG93SW5zZXQsIHNoYWRvd0luc2V0LCBzaGFkb3dJbnNldCk7CisgICAgY29uc3QgUmVnaW9uIGJhY2tncm91bmRSZWdpb24gPSBSZWdpb24oZnVsbHNjcmVlblJlY3QoKSkuc3VidHJhY3RTZWxmKGNhc3RlcldpdGhTaGFkb3cpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGJhY2tncm91bmRSZWdpb24sIGJhY2tncm91bmRDb2xvci5yLCBiYWNrZ3JvdW5kQ29sb3IuZywgYmFja2dyb3VuZENvbG9yLmIsCisgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLmEpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgY2xlYW51cFBvc3RSZW5kZXJfY2xlYW5zVXBPbmNlKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gZnVsbHNjcmVlblJlY3QoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IGZ1bGxzY3JlZW5SZWN0KCkudG9GbG9hdFJlY3QoKTsKKyAgICBCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD46OmZpbGxDb2xvcihsYXllciwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXIuYWxwaGEgPSAxLjA7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworCisgICAgYmFzZTo6dW5pcXVlX2ZkIGZlbmNlT25lOworICAgIHNSRS0+ZHJhd0xheWVycyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyLCB0cnVlLCBiYXNlOjp1bmlxdWVfZmQoKSwgJmZlbmNlT25lKTsKKyAgICBiYXNlOjp1bmlxdWVfZmQgZmVuY2VUd287CisgICAgc1JFLT5kcmF3TGF5ZXJzKHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIsIHRydWUsIHN0ZDo6bW92ZShmZW5jZU9uZSksICZmZW5jZVR3byk7CisKKyAgICBjb25zdCBpbnQgZmQgPSBmZW5jZVR3by5nZXQoKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBzeW5jX3dhaXQoZmQsIC0xKTsKKyAgICB9CisgICAgLy8gT25seSBjbGVhbnVwIHRoZSBmaXJzdCB0aW1lLgorICAgIEVYUEVDVF9UUlVFKHNSRS0+Y2xlYW51cFBvc3RSZW5kZXIoCisgICAgICAgICAgICByZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Q2xlYW51cE1vZGU6OkNMRUFOX09VVFBVVF9SRVNPVVJDRVMpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc1JFLT5jbGVhbnVwUG9zdFJlbmRlcigKKyAgICAgICAgICAgIHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lOjpDbGVhbnVwTW9kZTo6Q0xFQU5fT1VUUFVUX1JFU09VUkNFUykpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgY2xlYW51cFBvc3RSZW5kZXJfd2hlbkNsZWFuaW5nQWxsX3JlcGxhY2VzVGV4dHVyZU1lbW9yeSkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IGZ1bGxzY3JlZW5SZWN0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBmdWxsc2NyZWVuUmVjdCgpLnRvRmxvYXRSZWN0KCk7CisgICAgQnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+OjpmaWxsQ29sb3IobGF5ZXIsIDEuMGYsIDAuMGYsIDAuMGYsIHRoaXMpOworICAgIGxheWVyLmFscGhhID0gMS4wOworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIGJhc2U6OnVuaXF1ZV9mZCBmZW5jZTsKKyAgICBzUkUtPmRyYXdMYXllcnMoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlciwgdHJ1ZSwgYmFzZTo6dW5pcXVlX2ZkKCksICZmZW5jZSk7CisKKyAgICBjb25zdCBpbnQgZmQgPSBmZW5jZS5nZXQoKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBzeW5jX3dhaXQoZmQsIC0xKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBidWZmZXJJZCA9IGxheWVyLnNvdXJjZS5idWZmZXIuYnVmZmVyLT5nZXRJZCgpOworICAgIHVpbnQzMl90IHRleE5hbWUgPSBsYXllci5zb3VyY2UuYnVmZmVyLnRleHR1cmVOYW1lOworICAgIEVYUEVDVF9UUlVFKHNSRS0+aXNJbWFnZUNhY2hlZEZvclRlc3RpbmcoYnVmZmVySWQpKTsKKyAgICBFWFBFQ1RfRVEoYnVmZmVySWQsIHNSRS0+Z2V0QnVmZmVySWRGb3JUZXh0dXJlTmFtZUZvclRlc3RpbmcodGV4TmFtZSkpOworCisgICAgRVhQRUNUX1RSVUUoc1JFLT5jbGVhbnVwUG9zdFJlbmRlcihyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Q2xlYW51cE1vZGU6OkNMRUFOX0FMTCkpOworCisgICAgLy8gTm93IGNoZWNrIHRoYXQgb3VyIHZpZXcgb2YgbWVtb3J5IGlzIGdvb2QuCisgICAgRVhQRUNUX0ZBTFNFKHNSRS0+aXNJbWFnZUNhY2hlZEZvclRlc3RpbmcoYnVmZmVySWQpKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpudWxsb3B0LCBzUkUtPmdldEJ1ZmZlcklkRm9yVGV4dHVyZU5hbWVGb3JUZXN0aW5nKGJ1ZmZlcklkKSk7CisgICAgRVhQRUNUX1RSVUUoc1JFLT5pc1RleHR1cmVOYW1lS25vd25Gb3JUZXN0aW5nKHRleE5hbWUpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyBUT0RPKGIvMTI5NDgxMTY1KTogcmVtb3ZlIHRoZSAjcHJhZ21hIGJlbG93IGFuZCBmaXggY29udmVyc2lvbiBpc3N1ZXMKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AgLy8gaWdub3JlZCAiLVdjb252ZXJzaW9uIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3Rlc3RzL1JlbmRlckVuZ2luZVRocmVhZGVkVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvdGVzdHMvUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2M3NDQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3Rlc3RzL1JlbmRlckVuZ2luZVRocmVhZGVkVGVzdC5jcHAKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvbW9jay9SZW5kZXJFbmdpbmUuaD4KKyNpbmNsdWRlICIuLi90aHJlYWRlZC9SZW5kZXJFbmdpbmVUaHJlYWRlZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIHRlc3Rpbmc6Ol87Cit1c2luZyB0ZXN0aW5nOjpFcTsKK3VzaW5nIHRlc3Rpbmc6Ok1vY2s7Cit1c2luZyB0ZXN0aW5nOjpSZXR1cm47CisKK3N0cnVjdCBSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgICB+UmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0KCkge30KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1UaHJlYWRlZFJFID0gcmVuZGVyZW5naW5lOjp0aHJlYWRlZDo6UmVuZGVyRW5naW5lVGhyZWFkZWQ6OmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBbdGhpc10oKSB7IHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8cmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU+KG1SZW5kZXJFbmdpbmUpOyB9KTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8cmVuZGVyZW5naW5lOjp0aHJlYWRlZDo6UmVuZGVyRW5naW5lVGhyZWFkZWQ+IG1UaHJlYWRlZFJFOworICAgIHJlbmRlcmVuZ2luZTo6bW9jazo6UmVuZGVyRW5naW5lKiBtUmVuZGVyRW5naW5lID0gbmV3IHJlbmRlcmVuZ2luZTo6bW9jazo6UmVuZGVyRW5naW5lKCk7Cit9OworCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBkdW1wKSB7CisgICAgc3RkOjpzdHJpbmcgdGVzdFN0cmluZyA9ICJYWVoiOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBkdW1wKF8pKTsKKyAgICBtVGhyZWFkZWRSRS0+ZHVtcCh0ZXN0U3RyaW5nKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgcHJpbWVDYWNoZSkgeworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBwcmltZUNhY2hlKCkpOworICAgIG1UaHJlYWRlZFJFLT5wcmltZUNhY2hlKCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGdlblRleHR1cmVzKSB7CisgICAgdWludDMyX3QgdGV4TmFtZTsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgZ2VuVGV4dHVyZXMoMSwgJnRleE5hbWUpKTsKKyAgICBtVGhyZWFkZWRSRS0+Z2VuVGV4dHVyZXMoMSwgJnRleE5hbWUpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBkZWxldGVUZXh0dXJlcykgeworICAgIHVpbnQzMl90IHRleE5hbWU7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGRlbGV0ZVRleHR1cmVzKDEsICZ0ZXhOYW1lKSk7CisgICAgbVRocmVhZGVkUkUtPmRlbGV0ZVRleHR1cmVzKDEsICZ0ZXhOYW1lKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgYmluZEV4dGVybmFsQnVmZmVyX251bGxwdHJCdWZmZXIpIHsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcigwLCBFcShudWxscHRyKSwgRXEobnVsbHB0cikpKQorICAgICAgICAgICAgLldpbGxPbmNlKFJldHVybihCQURfVkFMVUUpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+YmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcigwLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBiaW5kRXh0ZXJuYWxCdWZmZXJfd2l0aEJ1ZmZlcikgeworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZiA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIoMCwgYnVmLCBFcShudWxscHRyKSkpCisgICAgICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKE5PX0VSUk9SKSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIoMCwgYnVmLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyX251bGxwdHIpIHsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgY2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXIoRXEobnVsbHB0cikpKTsKKyAgICBtVGhyZWFkZWRSRS0+Y2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXIobnVsbHB0cik7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyX3dpdGhCdWZmZXIpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlcihidWYpKTsKKyAgICBtVGhyZWFkZWRSRS0+Y2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXIoYnVmKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgdW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIHVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcigweDApKTsKKyAgICBtVGhyZWFkZWRSRS0+dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKDB4MCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGJpbmRGcmFtZUJ1ZmZlcl9yZXR1cm5zQmFkVmFsdWUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8cmVuZGVyZW5naW5lOjpGcmFtZWJ1ZmZlcj4gZnJhbWVidWZmZXI7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGJpbmRGcmFtZUJ1ZmZlcihmcmFtZWJ1ZmZlci5nZXQoKSkpLldpbGxPbmNlKFJldHVybihCQURfVkFMVUUpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+YmluZEZyYW1lQnVmZmVyKGZyYW1lYnVmZmVyLmdldCgpKTsKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBiaW5kRnJhbWVCdWZmZXJfcmV0dXJuc05vRXJyb3IpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8cmVuZGVyZW5naW5lOjpGcmFtZWJ1ZmZlcj4gZnJhbWVidWZmZXI7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGJpbmRGcmFtZUJ1ZmZlcihmcmFtZWJ1ZmZlci5nZXQoKSkpLldpbGxPbmNlKFJldHVybihOT19FUlJPUikpOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT5iaW5kRnJhbWVCdWZmZXIoZnJhbWVidWZmZXIuZ2V0KCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgdW5iaW5kRnJhbWVCdWZmZXIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8cmVuZGVyZW5naW5lOjpGcmFtZWJ1ZmZlcj4gZnJhbWVidWZmZXI7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIHVuYmluZEZyYW1lQnVmZmVyKGZyYW1lYnVmZmVyLmdldCgpKSk7CisgICAgbVRocmVhZGVkUkUtPnVuYmluZEZyYW1lQnVmZmVyKGZyYW1lYnVmZmVyLmdldCgpKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgZ2V0TWF4VGV4dHVyZVNpemVfcmV0dXJuczIwKSB7CisgICAgc2l6ZV90IHNpemUgPSAyMDsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgZ2V0TWF4VGV4dHVyZVNpemUoKSkuV2lsbE9uY2UoUmV0dXJuKHNpemUpKTsKKyAgICBzaXplX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPmdldE1heFRleHR1cmVTaXplKCk7CisgICAgQVNTRVJUX0VRKHNpemUsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGdldE1heFRleHR1cmVTaXplX3JldHVybnMwKSB7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBnZXRNYXhUZXh0dXJlU2l6ZSgpKS5XaWxsT25jZShSZXR1cm4oc2l6ZSkpOworICAgIHNpemVfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+Z2V0TWF4VGV4dHVyZVNpemUoKTsKKyAgICBBU1NFUlRfRVEoc2l6ZSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgZ2V0TWF4Vmlld3BvcnREaW1zX3JldHVybnMyMCkgeworICAgIHNpemVfdCBkaW1zID0gMjA7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGdldE1heFZpZXdwb3J0RGltcygpKS5XaWxsT25jZShSZXR1cm4oZGltcykpOworICAgIHNpemVfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+Z2V0TWF4Vmlld3BvcnREaW1zKCk7CisgICAgQVNTRVJUX0VRKGRpbXMsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGdldE1heFZpZXdwb3J0RGltc19yZXR1cm5zMCkgeworICAgIHNpemVfdCBkaW1zID0gMDsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgZ2V0TWF4Vmlld3BvcnREaW1zKCkpLldpbGxPbmNlKFJldHVybihkaW1zKSk7CisgICAgc2l6ZV90IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT5nZXRNYXhWaWV3cG9ydERpbXMoKTsKKyAgICBBU1NFUlRfRVEoZGltcywgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgaXNQcm90ZWN0ZWRfcmV0dXJuc0ZhbHNlKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGlzUHJvdGVjdGVkKCkpLldpbGxPbmNlKFJldHVybihmYWxzZSkpOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT5pc1Byb3RlY3RlZCgpOworICAgIEFTU0VSVF9FUShmYWxzZSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgaXNQcm90ZWN0ZWRfcmV0dXJuc1RydWUpIHsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgaXNQcm90ZWN0ZWQoKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKKyAgICBzaXplX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPmlzUHJvdGVjdGVkKCk7CisgICAgQVNTRVJUX0VRKHRydWUsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIHN1cHBvcnRzUHJvdGVjdGVkQ29udGVudF9yZXR1cm5zRmFsc2UpIHsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgc3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50KCkpLldpbGxPbmNlKFJldHVybihmYWxzZSkpOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT5zdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKTsKKyAgICBBU1NFUlRfRVEoZmFsc2UsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIHN1cHBvcnRzUHJvdGVjdGVkQ29udGVudF9yZXR1cm5zVHJ1ZSkgeworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+c3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50KCk7CisgICAgQVNTRVJUX0VRKHRydWUsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIHVzZVByb3RlY3RlZENvbnRleHRfcmV0dXJuc0ZhbHNlKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIHVzZVByb3RlY3RlZENvbnRleHQoZmFsc2UpKS5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+dXNlUHJvdGVjdGVkQ29udGV4dChmYWxzZSk7CisgICAgQVNTRVJUX0VRKGZhbHNlLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCB1c2VQcm90ZWN0ZWRDb250ZXh0X3JldHVybnNUcnVlKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIHVzZVByb3RlY3RlZENvbnRleHQoZmFsc2UpKS5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT51c2VQcm90ZWN0ZWRDb250ZXh0KGZhbHNlKTsKKyAgICBBU1NFUlRfRVEodHJ1ZSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgY2xlYW51cFBvc3RSZW5kZXJfcmV0dXJuc0ZhbHNlKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsCisgICAgICAgICAgICAgICAgY2xlYW51cFBvc3RSZW5kZXIocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU6OkNsZWFudXBNb2RlOjpDTEVBTl9BTEwpKQorICAgICAgICAgICAgLldpbGxPbmNlKFJldHVybihmYWxzZSkpOworICAgIHN0YXR1c190IHJlc3VsdCA9CisgICAgICAgICAgICBtVGhyZWFkZWRSRS0+Y2xlYW51cFBvc3RSZW5kZXIocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU6OkNsZWFudXBNb2RlOjpDTEVBTl9BTEwpOworICAgIEFTU0VSVF9FUShmYWxzZSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgY2xlYW51cFBvc3RSZW5kZXJfcmV0dXJuc1RydWUpIHsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwKKyAgICAgICAgICAgICAgICBjbGVhbnVwUG9zdFJlbmRlcihyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Q2xlYW51cE1vZGU6OkNMRUFOX0FMTCkpCisgICAgICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPQorICAgICAgICAgICAgbVRocmVhZGVkUkUtPmNsZWFudXBQb3N0UmVuZGVyKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lOjpDbGVhbnVwTW9kZTo6Q0xFQU5fQUxMKTsKKyAgICBBU1NFUlRfRVEodHJ1ZSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgZHJhd0xheWVycykgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOworICAgIGJhc2U6OnVuaXF1ZV9mZCBidWZmZXJGZW5jZTsKKyAgICBiYXNlOjp1bmlxdWVfZmQgZHJhd0ZlbmNlOworCisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGRyYXdMYXllcnMpCisgICAgICAgICAgICAuV2lsbE9uY2UoW10oY29uc3QgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3MmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYsIGNvbnN0IGJvb2wsIGJhc2U6OnVuaXF1ZV9mZCYmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCopIC0+IHN0YXR1c190IHsgcmV0dXJuIE5PX0VSUk9SOyB9KTsKKworICAgIHN0YXR1c190IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT5kcmF3TGF5ZXJzKHNldHRpbmdzLCBsYXllcnMsIGJ1ZmZlciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGJ1ZmZlckZlbmNlKSwgJmRyYXdGZW5jZSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXN1bHQpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvdGhyZWFkZWQvUmVuZGVyRW5naW5lVGhyZWFkZWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3RocmVhZGVkL1JlbmRlckVuZ2luZVRocmVhZGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE4NGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3RocmVhZGVkL1JlbmRlckVuZ2luZVRocmVhZGVkLmNwcApAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKKworI2luY2x1ZGUgIlJlbmRlckVuZ2luZVRocmVhZGVkLmgiCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxmdXR1cmU+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9ndWkvU3luY0ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgImdsL0dMRVNSZW5kZXJFbmdpbmUuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSB0aHJlYWRlZCB7CisKK3N0ZDo6dW5pcXVlX3B0cjxSZW5kZXJFbmdpbmVUaHJlYWRlZD4gUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmNyZWF0ZShDcmVhdGVJbnN0YW5jZUZhY3RvcnkgZmFjdG9yeSkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFJlbmRlckVuZ2luZVRocmVhZGVkPihzdGQ6Om1vdmUoZmFjdG9yeSkpOworfQorCitSZW5kZXJFbmdpbmVUaHJlYWRlZDo6UmVuZGVyRW5naW5lVGhyZWFkZWQoQ3JlYXRlSW5zdGFuY2VGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2tUaHJlYWQobVRocmVhZE11dGV4KTsKKyAgICBtVGhyZWFkID0gc3RkOjp0aHJlYWQoJlJlbmRlckVuZ2luZVRocmVhZGVkOjp0aHJlYWRNYWluLCB0aGlzLCBmYWN0b3J5KTsKK30KKworUmVuZGVyRW5naW5lVGhyZWFkZWQ6On5SZW5kZXJFbmdpbmVUaHJlYWRlZCgpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIGlmIChtVGhyZWFkLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgbVRocmVhZC5qb2luKCk7CisgICAgfQorfQorCisvLyBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIGlzIGJlY2F1c2Ugc3RkOjp1bmlxdWVfbG9jayBwcmVzZW50bHkgbGFja3MgdGhyZWFkIHNhZmV0eSBhbm5vdGF0aW9ucy4KK3ZvaWQgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OnRocmVhZE1haW4oQ3JlYXRlSW5zdGFuY2VGYWN0b3J5IGZhY3RvcnkpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7MH07CisgICAgcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSAyOworICAgIGlmIChzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfRklGTywgJnBhcmFtKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZG4ndCBzZXQgU0NIRURfRklGTyIpOworICAgIH0KKworICAgIG1SZW5kZXJFbmdpbmUgPSBmYWN0b3J5KCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVRocmVhZE11dGV4KTsKKyAgICBwdGhyZWFkX3NldG5hbWVfbnAocHRocmVhZF9zZWxmKCksIG1UaHJlYWROYW1lKTsKKworICAgIHdoaWxlIChtUnVubmluZykgeworICAgICAgICBpZiAoIW1GdW5jdGlvbkNhbGxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGF1dG8gdGFzayA9IG1GdW5jdGlvbkNhbGxzLmZyb250KCk7CisgICAgICAgICAgICBtRnVuY3Rpb25DYWxscy5wb3AoKTsKKyAgICAgICAgICAgIHRhc2soKm1SZW5kZXJFbmdpbmUpOworICAgICAgICB9CisgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrLCBbdGhpc10oKSBSRVFVSVJFUyhtVGhyZWFkTXV0ZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAhbVJ1bm5pbmcgfHwgIW1GdW5jdGlvbkNhbGxzLmVtcHR5KCk7CisgICAgICAgIH0pOworICAgIH0KK30KKwordm9pZCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6cHJpbWVDYWNoZSgpIGNvbnN0IHsKKyAgICBzdGQ6OnByb21pc2U8dm9pZD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTx2b2lkPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpwcmltZUNhY2hlIik7CisgICAgICAgICAgICBpbnN0YW5jZS5wcmltZUNhY2hlKCk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZSgpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmVzdWx0RnV0dXJlLndhaXQoKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6ZHVtcChzdGQ6OnN0cmluZyYgcmVzdWx0KSB7CisgICAgc3RkOjpwcm9taXNlPHN0ZDo6c3RyaW5nPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPHN0ZDo6c3RyaW5nPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlLCAmcmVzdWx0XShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpkdW1wIik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsb2NhbFJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIGluc3RhbmNlLmR1bXAobG9jYWxSZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoc3RkOjptb3ZlKGxvY2FsUmVzdWx0KSk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICAvLyBOb3RlOiBUaGlzIGlzIGFuIHJ2YWx1ZS4KKyAgICByZXN1bHQuYXNzaWduKHJlc3VsdEZ1dHVyZS5nZXQoKSk7Cit9CisKK2Jvb2wgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OnVzZU5hdGl2ZUZlbmNlU3luYygpIGNvbnN0IHsKKyAgICBzdGQ6OnByb21pc2U8Ym9vbD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTxib29sPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgLyppbnN0YW5jZSovKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6dXNlTmF0aXZlRmVuY2VTeW5jIik7CisgICAgICAgICAgICBib29sIHJldHVyblZhbHVlID0gU3luY0ZlYXR1cmVzOjpnZXRJbnN0YW5jZSgpLnVzZU5hdGl2ZUZlbmNlU3luYygpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUocmV0dXJuVmFsdWUpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmV0dXJuIHJlc3VsdEZ1dHVyZS5nZXQoKTsKK30KKworYm9vbCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6dXNlV2FpdFN5bmMoKSBjb25zdCB7CisgICAgc3RkOjpwcm9taXNlPGJvb2w+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIC8qaW5zdGFuY2UqLykgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoIlJFVGhyZWFkZWQ6OnVzZVdhaXRTeW5jIik7CisgICAgICAgICAgICBib29sIHJldHVyblZhbHVlID0gU3luY0ZlYXR1cmVzOjpnZXRJbnN0YW5jZSgpLnVzZVdhaXRTeW5jKCk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShyZXR1cm5WYWx1ZSk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCit2b2lkIFJlbmRlckVuZ2luZVRocmVhZGVkOjpnZW5UZXh0dXJlcyhzaXplX3QgY291bnQsIHVpbnQzMl90KiBuYW1lcykgeworICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaChbJnJlc3VsdFByb21pc2UsIGNvdW50LCBuYW1lc10ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6Z2VuVGV4dHVyZXMiKTsKKyAgICAgICAgICAgIGluc3RhbmNlLmdlblRleHR1cmVzKGNvdW50LCBuYW1lcyk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZSgpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmVzdWx0RnV0dXJlLndhaXQoKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6ZGVsZXRlVGV4dHVyZXMoc2l6ZV90IGNvdW50LCB1aW50MzJfdCBjb25zdCogbmFtZXMpIHsKKyAgICBzdGQ6OnByb21pc2U8dm9pZD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTx2b2lkPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlLCBjb3VudCwgJm5hbWVzXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpkZWxldGVUZXh0dXJlcyIpOworICAgICAgICAgICAgaW5zdGFuY2UuZGVsZXRlVGV4dHVyZXMoY291bnQsIG5hbWVzKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKCk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXN1bHRGdXR1cmUud2FpdCgpOworfQorCit2b2lkIFJlbmRlckVuZ2luZVRocmVhZGVkOjpiaW5kRXh0ZXJuYWxUZXh0dXJlSW1hZ2UodWludDMyX3QgdGV4TmFtZSwgY29uc3QgSW1hZ2UmIGltYWdlKSB7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8dm9pZD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKAorICAgICAgICAgICAgICAgIFsmcmVzdWx0UHJvbWlzZSwgdGV4TmFtZSwgJmltYWdlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoIlJFVGhyZWFkZWQ6OmJpbmRFeHRlcm5hbFRleHR1cmVJbWFnZSIpOworICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5iaW5kRXh0ZXJuYWxUZXh0dXJlSW1hZ2UodGV4TmFtZSwgaW1hZ2UpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZSgpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXN1bHRGdXR1cmUud2FpdCgpOworfQorCitzdGF0dXNfdCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6YmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcih1aW50MzJfdCB0ZXhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEZlbmNlPiYgZmVuY2UpIHsKKyAgICBzdGQ6OnByb21pc2U8c3RhdHVzX3Q+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8c3RhdHVzX3Q+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaCgKKyAgICAgICAgICAgICAgICBbJnJlc3VsdFByb21pc2UsIHRleE5hbWUsICZidWZmZXIsICZmZW5jZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpiaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbmNlLmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodGV4TmFtZSwgYnVmZmVyLCBmZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBzdGQ6OnByb21pc2U8dm9pZD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTx2b2lkPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlLCAmYnVmZmVyXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlciIpOworICAgICAgICAgICAgaW5zdGFuY2UuY2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKCk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXN1bHRGdXR1cmUud2FpdCgpOworfQorCit2b2lkIFJlbmRlckVuZ2luZVRocmVhZGVkOjp1bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDY0X3QgYnVmZmVySWQpIHsKKyAgICBzdGQ6OnByb21pc2U8dm9pZD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTx2b2lkPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlLCAmYnVmZmVySWRdKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiBpbnN0YW5jZSkgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoIlJFVGhyZWFkZWQ6OnVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlciIpOworICAgICAgICAgICAgaW5zdGFuY2UudW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKCk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXN1bHRGdXR1cmUud2FpdCgpOworfQorCitzdGF0dXNfdCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6YmluZEZyYW1lQnVmZmVyKEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikgeworICAgIHN0ZDo6cHJvbWlzZTxzdGF0dXNfdD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTxzdGF0dXNfdD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZSwgJmZyYW1lYnVmZmVyXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpiaW5kRnJhbWVCdWZmZXIiKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbmNlLmJpbmRGcmFtZUJ1ZmZlcihmcmFtZWJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShzdGF0dXMpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmV0dXJuIHJlc3VsdEZ1dHVyZS5nZXQoKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6dW5iaW5kRnJhbWVCdWZmZXIoRnJhbWVidWZmZXIqIGZyYW1lYnVmZmVyKSB7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8dm9pZD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZSwgJmZyYW1lYnVmZmVyXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjp1bmJpbmRGcmFtZUJ1ZmZlciIpOworICAgICAgICAgICAgaW5zdGFuY2UudW5iaW5kRnJhbWVCdWZmZXIoZnJhbWVidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJlc3VsdEZ1dHVyZS53YWl0KCk7Cit9CisKK3NpemVfdCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6Z2V0TWF4VGV4dHVyZVNpemUoKSBjb25zdCB7CisgICAgc3RkOjpwcm9taXNlPHNpemVfdD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTxzaXplX3Q+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaChbJnJlc3VsdFByb21pc2VdKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiBpbnN0YW5jZSkgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoIlJFVGhyZWFkZWQ6OmdldE1heFRleHR1cmVTaXplIik7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGluc3RhbmNlLmdldE1heFRleHR1cmVTaXplKCk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShzaXplKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK3NpemVfdCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6Z2V0TWF4Vmlld3BvcnREaW1zKCkgY29uc3QgeworICAgIHN0ZDo6cHJvbWlzZTxzaXplX3Q+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8c2l6ZV90PiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpnZXRNYXhWaWV3cG9ydERpbXMiKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gaW5zdGFuY2UuZ2V0TWF4Vmlld3BvcnREaW1zKCk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShzaXplKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK2Jvb2wgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmlzUHJvdGVjdGVkKCkgY29uc3QgeworICAgIHN0ZDo6cHJvbWlzZTxib29sPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPGJvb2w+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaChbJnJlc3VsdFByb21pc2VdKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiBpbnN0YW5jZSkgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoIlJFVGhyZWFkZWQ6OmlzUHJvdGVjdGVkIik7CisgICAgICAgICAgICBib29sIHJldHVyblZhbHVlID0gaW5zdGFuY2UuaXNQcm90ZWN0ZWQoKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKHJldHVyblZhbHVlKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK2Jvb2wgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OnN1cHBvcnRzUHJvdGVjdGVkQ29udGVudCgpIGNvbnN0IHsKKyAgICBzdGQ6OnByb21pc2U8Ym9vbD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTxib29sPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQiKTsKKyAgICAgICAgICAgIGJvb2wgcmV0dXJuVmFsdWUgPSBpbnN0YW5jZS5zdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKHJldHVyblZhbHVlKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK2Jvb2wgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OnVzZVByb3RlY3RlZENvbnRleHQoYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KSB7CisgICAgc3RkOjpwcm9taXNlPGJvb2w+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKAorICAgICAgICAgICAgICAgIFsmcmVzdWx0UHJvbWlzZSwgdXNlUHJvdGVjdGVkQ29udGV4dF0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjp1c2VQcm90ZWN0ZWRDb250ZXh0Iik7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgcmV0dXJuVmFsdWUgPSBpbnN0YW5jZS51c2VQcm90ZWN0ZWRDb250ZXh0KHVzZVByb3RlY3RlZENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShyZXR1cm5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK0ZyYW1lYnVmZmVyKiBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6Z2V0RnJhbWVidWZmZXJGb3JEcmF3aW5nKCkgeworICAgIHN0ZDo6cHJvbWlzZTxGcmFtZWJ1ZmZlcio+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8RnJhbWVidWZmZXIqPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpnZXRGcmFtZWJ1ZmZlckZvckRyYXdpbmciKTsKKyAgICAgICAgICAgIEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlciA9IGluc3RhbmNlLmdldEZyYW1lYnVmZmVyRm9yRHJhd2luZygpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoZnJhbWVidWZmZXIpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmV0dXJuIHJlc3VsdEZ1dHVyZS5nZXQoKTsKK30KKworYm9vbCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6Y2xlYW51cFBvc3RSZW5kZXIoQ2xlYW51cE1vZGUgbW9kZSkgeworICAgIHN0ZDo6cHJvbWlzZTxib29sPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPGJvb2w+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaChbJnJlc3VsdFByb21pc2UsIG1vZGVdKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiBpbnN0YW5jZSkgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoIlJFVGhyZWFkZWQ6OmNsZWFudXBQb3N0UmVuZGVyIik7CisgICAgICAgICAgICBib29sIHJldHVyblZhbHVlID0gaW5zdGFuY2UuY2xlYW51cFBvc3RSZW5kZXIobW9kZSk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShyZXR1cm5WYWx1ZSk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCitzdGF0dXNfdCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6ZHJhd0xheWVycyhjb25zdCBEaXNwbGF5U2V0dGluZ3MmIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBMYXllclNldHRpbmdzKj4mIGxheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZUZyYW1lYnVmZmVyQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjp1bmlxdWVfZmQmJiBidWZmZXJGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCogZHJhd0ZlbmNlKSB7CisgICAgc3RkOjpwcm9taXNlPHN0YXR1c190PiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPHN0YXR1c190PiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlLCAmZGlzcGxheSwgJmxheWVycywgJmJ1ZmZlciwgdXNlRnJhbWVidWZmZXJDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlckZlbmNlLCAmZHJhd0ZlbmNlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpkcmF3TGF5ZXJzIik7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YW5jZS5kcmF3TGF5ZXJzKGRpc3BsYXksIGxheWVycywgYnVmZmVyLCB1c2VGcmFtZWJ1ZmZlckNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoYnVmZmVyRmVuY2UpLCBkcmF3RmVuY2UpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoc3RhdHVzKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHRocmVhZGVkCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90aHJlYWRlZC9SZW5kZXJFbmdpbmVUaHJlYWRlZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3RocmVhZGVkL1JlbmRlckVuZ2luZVRocmVhZGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhNDllOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90aHJlYWRlZC9SZW5kZXJFbmdpbmVUaHJlYWRlZC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlICJyZW5kZXJlbmdpbmUvUmVuZGVyRW5naW5lLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIHRocmVhZGVkIHsKKwordXNpbmcgQ3JlYXRlSW5zdGFuY2VGYWN0b3J5ID0gc3RkOjpmdW5jdGlvbjxzdGQ6OnVuaXF1ZV9wdHI8cmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU+KCk+OworCisvKioKKyAqIFRoaXMgY2xhc3MgZXh0ZW5kcyBhIGJhc2ljIFJlbmRlckVuZ2luZSBjbGFzcy4gSXQgY29udGFpbnMgYSB0aHJlYWQuIEVhY2ggdGltZSBhIGZ1bmN0aW9uIG9mCisgKiB0aGlzIGNsYXNzIGlzIGNhbGxlZCwgd2UgY3JlYXRlIGEgbGFtYmRhIGZ1bmN0aW9uIHRoYXQgaXMgcHV0IG9uIGEgcXVldWUuIFRoZSBtYWluIHRocmVhZCB0aGVuCisgKiBleGVjdXRlcyB0aGUgZnVuY3Rpb25zIGluIG9yZGVyLgorICovCitjbGFzcyBSZW5kZXJFbmdpbmVUaHJlYWRlZCA6IHB1YmxpYyBSZW5kZXJFbmdpbmUgeworcHVibGljOgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyRW5naW5lVGhyZWFkZWQ+IGNyZWF0ZShDcmVhdGVJbnN0YW5jZUZhY3RvcnkgZmFjdG9yeSk7CisKKyAgICBSZW5kZXJFbmdpbmVUaHJlYWRlZChDcmVhdGVJbnN0YW5jZUZhY3RvcnkgZmFjdG9yeSk7CisgICAgflJlbmRlckVuZ2luZVRocmVhZGVkKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcmltZUNhY2hlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcmIHJlc3VsdCkgb3ZlcnJpZGU7CisKKyAgICBib29sIHVzZU5hdGl2ZUZlbmNlU3luYygpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgdXNlV2FpdFN5bmMoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGdlblRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QqIG5hbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIGRlbGV0ZVRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QgY29uc3QqIG5hbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIGJpbmRFeHRlcm5hbFRleHR1cmVJbWFnZSh1aW50MzJfdCB0ZXhOYW1lLCBjb25zdCBJbWFnZSYgaW1hZ2UpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDMyX3QgdGV4TmFtZSwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEZlbmNlPiYgZmVuY2UpIG92ZXJyaWRlOworICAgIHZvaWQgY2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXIoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdm9pZCB1bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDY0X3QgYnVmZmVySWQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGJpbmRGcmFtZUJ1ZmZlcihGcmFtZWJ1ZmZlciogZnJhbWVidWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgdW5iaW5kRnJhbWVCdWZmZXIoRnJhbWVidWZmZXIqIGZyYW1lYnVmZmVyKSBvdmVycmlkZTsKKyAgICBzaXplX3QgZ2V0TWF4VGV4dHVyZVNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgICBzaXplX3QgZ2V0TWF4Vmlld3BvcnREaW1zKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzUHJvdGVjdGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIHVzZVByb3RlY3RlZENvbnRleHQoYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KSBvdmVycmlkZTsKKyAgICBib29sIGNsZWFudXBQb3N0UmVuZGVyKENsZWFudXBNb2RlIG1vZGUpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZHJhd0xheWVycyhjb25zdCBEaXNwbGF5U2V0dGluZ3MmIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBMYXllclNldHRpbmdzKj4mIGxheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsIGNvbnN0IGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCYmIGJ1ZmZlckZlbmNlLCBiYXNlOjp1bmlxdWVfZmQqIGRyYXdGZW5jZSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBGcmFtZWJ1ZmZlciogZ2V0RnJhbWVidWZmZXJGb3JEcmF3aW5nKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgdm9pZCB0aHJlYWRNYWluKENyZWF0ZUluc3RhbmNlRmFjdG9yeSBmYWN0b3J5KTsKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFRocmVhZGluZworICAgICAqLworICAgIGNvbnN0IGNoYXIqIGNvbnN0IG1UaHJlYWROYW1lID0gIlJlbmRlckVuZ2luZVRocmVhZCI7CisgICAgLy8gUHJvdGVjdHMgdGhlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiBtVGhyZWFkLgorICAgIG11dGFibGUgc3RkOjptdXRleCBtVGhyZWFkTXV0ZXg7CisgICAgc3RkOjp0aHJlYWQgbVRocmVhZCBHVUFSREVEX0JZKG1UaHJlYWRNdXRleCk7CisgICAgYm9vbCBtUnVubmluZyBHVUFSREVEX0JZKG1UaHJlYWRNdXRleCkgPSB0cnVlOworICAgIG11dGFibGUgc3RkOjpxdWV1ZTxzdGQ6OmZ1bmN0aW9uPHZvaWQocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKT4+IG1GdW5jdGlvbkNhbGxzCisgICAgICAgICAgICBHVUFSREVEX0JZKG1UaHJlYWRNdXRleCk7CisgICAgbXV0YWJsZSBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogUmVuZGVyIEVuZ2luZQorICAgICAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZT4gbVJlbmRlckVuZ2luZTsKK307Cit9IC8vIG5hbWVzcGFjZSB0aHJlYWRlZAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAppbmRleCA0YmM2N2U4Li5hMGI2NmE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKQEAgLTM3LDEyICszNyw3MyBAQAogICAgICAgbUFjY2Vzc1VuaXRSVFBUaW1lKDApLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQoZmFsc2UpLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vKDApLAotICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkKGZhbHNlKSB7CisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpLAorICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQoZmFsc2UpLAorICAgICAgbUxhc3RJRnJhbWVQcm92aWRlZEF0TXMoMCkgewogfQogCiBBQVZDQXNzZW1ibGVyOjp+QUFWQ0Fzc2VtYmxlcigpIHsKIH0KIAoraW50MzJfdCBBQVZDQXNzZW1ibGVyOjphZGROYWNrKAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgTGlzdDxzcDxBQnVmZmVyPj4gKnF1ZXVlID0gc291cmNlLT5xdWV1ZSgpOworICAgIGludDMyX3QgbmFja0NvdW50ID0gMDsKKworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKworICAgIGlmIChpdCA9PSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG5hY2tDb3VudCAvKiAwICovOworICAgIH0KKworICAgIHVpbnQxNl90IHF1ZXVlSGVhZFNlcU51bSA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKworICAgIC8vIG1vdmUgdG8gdGhlIHBhY2tldCBhZnRlciB3aGljaCBSVENQOk5BQ0sgd2FzIHNlbnQuCisgICAgZm9yICg7IGl0ICE9IHF1ZXVlLT5lbmQoKTsgKytpdCkgeworICAgICAgICBpbnQzMl90IHNlcU51bSA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKyAgICAgICAgaWYgKHNlcU51bSA+PSBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlcikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IG5hY2tTdGFydEF0ID0gLTE7CisKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIGludDMyX3Qgc2VxQmVmb3JlTGFzdCA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKyAgICAgICAgLy8gaW5jcmVhc2UgaXRlcmF0b3IuCisgICAgICAgIGlmICgoKytpdCkgPT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IHNlcUxhc3QgPSAoKml0KS0+aW50MzJEYXRhKCk7CisKKyAgICAgICAgaWYgKChzZXFMYXN0IC0gc2VxQmVmb3JlTGFzdCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRCgiYWRkTmFjazogZm91bmQgZW5kIG9mIHNlcU51bSBmcm9tKCVkKSB0byglZCkiLCBzZXFCZWZvcmVMYXN0LCBzZXFMYXN0KTsKKyAgICAgICAgICAgIHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1pc3NlZCBwYWNrZXQgZm91bmQKKyAgICAgICAgaWYgKHNlcUxhc3QgPiAoc2VxQmVmb3JlTGFzdCArIDEpICYmCisgICAgICAgICAgICAgICAgLy8gd2UgZGlkbid0IHNlbmQgUlRDUDpOQUNLIGZvciB0aGlzIHBhY2tldCB5ZXQuCisgICAgICAgICAgICAgICAgKHNlcUxhc3QgLSAxKSA+IHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyKSB7CisgICAgICAgICAgICBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlciA9IHNlcUxhc3QgLSAxOworICAgICAgICAgICAgbmFja1N0YXJ0QXQgPSBzZXFCZWZvcmVMYXN0ICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAobmFja1N0YXJ0QXQgIT0gLTEpIHsKKyAgICAgICAgbmFja0NvdW50ID0gc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIgLSBuYWNrU3RhcnRBdCArIDE7CisgICAgICAgIEFMT0dEKCJhZGROYWNrOiBuYWNrQ291bnQ9JWQsIG5hY2tGcm9tPSVkLCBuYWNrVG89JWQiLCBuYWNrQ291bnQsCisgICAgICAgICAgICAgICAgbmFja1N0YXJ0QXQsIHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyKTsKKworICAgICAgICB1aW50MTZfdCBtYXNrID0gKHVpbnQxNl90KSgweGZmZmYpID4+ICgxNiAtIG5hY2tDb3VudCArIDEpOworICAgICAgICBzb3VyY2UtPnNldFNlcU51bVRvTkFDSyhuYWNrU3RhcnRBdCwgbWFzaywgcXVldWVIZWFkU2VxTnVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmFja0NvdW50OworfQorCiBBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBQVZDQXNzZW1ibGVyOjphZGROQUxVbml0KAogICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CiAgICAgTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKQEAgLTUxLDIyICsxMTIsNjIgQEAKICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICB9CiAKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IHNvdXJjZS0+bUZpcnN0U3lzVGltZSAvIDEwMDA7CisgICAgaW50NjRfdCBub3dUaW1lID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDA7CisgICAgaW50NjRfdCBwbGF5ZWRUaW1lID0gbm93VGltZSAtIHN0YXJ0VGltZTsKKyAgICBpbnQ2NF90IHBsYXllZFRpbWVSdHAgPQorICAgICAgICBzb3VyY2UtPm1GaXJzdFJ0cFRpbWUgKyAoKCh1aW50MzJfdClwbGF5ZWRUaW1lKSAqIChzb3VyY2UtPm1DbG9ja1JhdGUgLyAxMDAwKSk7CisgICAgY29uc3QgdWludDMyX3Qgaml0dGVyVGltZSA9CisgICAgICAgICh1aW50MzJfdCkoc291cmNlLT5tQ2xvY2tSYXRlIC8gKChmbG9hdCkxMDAwIC8gKHNvdXJjZS0+bUpiVGltZU1zKSkpOworICAgIHVpbnQzMl90IGV4cGlyZWRUaW1lSW5KYiA9IHJ0cFRpbWUgKyBqaXR0ZXJUaW1lOworICAgIGJvb2wgaXNFeHBpcmVkID0gZXhwaXJlZFRpbWVJbkpiIDw9IChwbGF5ZWRUaW1lUnRwKTsKKyAgICBib29sIGlzVG9vTGF0ZTIwMCA9IGV4cGlyZWRUaW1lSW5KYiA8IChwbGF5ZWRUaW1lUnRwIC0gaml0dGVyVGltZSk7CisgICAgYm9vbCBpc1Rvb0xhdGUzMDAgPSBleHBpcmVkVGltZUluSmIgPCAocGxheWVkVGltZVJ0cCAtIChqaXR0ZXJUaW1lICogMyAvIDIpKTsKKworICAgIGlmIChtU2hvd1F1ZXVlICYmIG1TaG93UXVldWVDbnQgPCAyMCkgeworICAgICAgICBzaG93Q3VycmVudFF1ZXVlKHF1ZXVlKTsKKyAgICAgICAgcHJpbnROb3dUaW1lVXMoc3RhcnRUaW1lLCBub3dUaW1lLCBwbGF5ZWRUaW1lKTsKKyAgICAgICAgcHJpbnRSVFBUaW1lKHJ0cFRpbWUsIHBsYXllZFRpbWVSdHAsIGV4cGlyZWRUaW1lSW5KYiwgaXNFeHBpcmVkKTsKKyAgICAgICAgbVNob3dRdWV1ZUNudCsrOworICAgIH0KKworICAgIEFBVkNBc3NlbWJsZXI6OmFkZE5hY2soc291cmNlKTsKKworICAgIGlmICghaXNFeHBpcmVkKSB7CisgICAgICAgIEFMT0dWKCJidWZmZXJpbmcgaW4gaml0dGVyIGJ1ZmZlci4iKTsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICBpZiAoaXNUb29MYXRlMjAwKSB7CisgICAgICAgIEFMT0dXKCI9PT0gV0FSTklORyA9PT0gYnVmZmVyIGFycml2ZWQgMjAwbXMgbGF0ZS4gPT09IFdBUk5JTkcgPT09ICIpOworICAgIH0KKworICAgIGlmIChpc1Rvb0xhdGUzMDApIHsKKyAgICAgICAgQUxPR1coImJ1ZmZlciBhcnJpdmVkIGFmdGVyIDMwMG1zIC4uLiBcdCBEaWZmIGluIEpiPSVsbGQgXHQgU2VxIyAlZCIsCisgICAgICAgICAgICAgICgobG9uZyBsb25nKXBsYXllZFRpbWVSdHApIC0gZXhwaXJlZFRpbWVJbkpiLCBidWZmZXItPmludDMyRGF0YSgpKTsKKyAgICAgICAgcHJpbnROb3dUaW1lVXMoc3RhcnRUaW1lLCBub3dUaW1lLCBwbGF5ZWRUaW1lKTsKKyAgICAgICAgcHJpbnRSVFBUaW1lKHJ0cFRpbWUsIHBsYXllZFRpbWVSdHAsIGV4cGlyZWRUaW1lSW5KYiwgaXNFeHBpcmVkKTsKKworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBwaWNrUHJvcGVyU2VxKHF1ZXVlLCBqaXR0ZXJUaW1lLCBwbGF5ZWRUaW1lUnRwKTsKKyAgICB9CisKICAgICBpZiAobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpIHsKLSAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IHF1ZXVlLT5iZWdpbigpOwotICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7Ci0gICAgICAgICAgICBpZiAoKHVpbnQzMl90KSgqaXQpLT5pbnQzMkRhdGEoKSA+PSBtTmV4dEV4cGVjdGVkU2VxTm8pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBzaXplID0gcXVldWUtPnNpemUoKTsKKyAgICAgICAgaW50MzJfdCBjbnRSZW1vdmUgPSBkZWxldGVVbml0VW5kZXJTZXEocXVldWUsIG1OZXh0RXhwZWN0ZWRTZXFObyk7CiAKLSAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAgICAgaWYgKGNudFJlbW92ZSA+IDApIHsKKyAgICAgICAgICAgIHNvdXJjZS0+bm90aWNlQWJhbmRvbkJ1ZmZlcihjbnRSZW1vdmUpOworICAgICAgICAgICAgQUxPR1coImRlbGV0ZSAlZCBvZiAlZCBidWZmZXJzIiwgY250UmVtb3ZlLCBzaXplKTsKICAgICAgICAgfQotCiAgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKyAgICBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CiAKICAgICBpZiAoIW1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CiAgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkID0gdHJ1ZTsKQEAgLTEyMywxMiArMjI0LDMwIEBACiAgICAgfQogfQogCit2b2lkIEFBVkNBc3NlbWJsZXI6OmNoZWNrSUZyYW1lUHJvdmlkZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBkYXRhWzBdICYgMHgxZjsKKyAgICBpZiAobmFsVHlwZSA9PSAweDUpIHsKKyAgICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQgPSB0cnVlOworICAgICAgICBtTGFzdElGcmFtZVByb3ZpZGVkQXRNcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwOworCisgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworICAgICAgICBBTE9HRCgiZ290IEZpcnN0IEktZnJhbWUgdG8gYmUgZGVjb2RlZC4gcnRwVGltZT0ldSwgc2l6ZT0lenUiLCBydHBUaW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgfQorfQorCiB2b2lkIEFBVkNBc3NlbWJsZXI6OmFkZFNpbmdsZU5BTFVuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIEFMT0dWKCJhZGRTaW5nbGVOQUxVbml0IG9mIHNpemUgJXp1IiwgYnVmZmVyLT5zaXplKCkpOwogI2lmICFMT0dfTkRFQlVHCiAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogI2VuZGlmCiAKKyAgICBjaGVja0lGcmFtZVByb3ZpZGVkKGJ1ZmZlcik7CisKICAgICB1aW50MzJfdCBydHBUaW1lOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOwogCkBAIC0yMTYsNiArMzM1LDExIEBACiAgICAgc2l6ZV90IHRvdGFsQ291bnQgPSAxOwogICAgIGJvb2wgY29tcGxldGUgPSBmYWxzZTsKIAorICAgIHVpbnQzMl90IHJ0cFRpbWVTdGFydEF0OworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZVN0YXJ0QXQpKTsKKyAgICB1aW50MzJfdCBzdGFydFNlcU5vID0gYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICBib29sIHBGcmFtZSA9IG5hbFR5cGUgPT0gMHgxOworCiAgICAgaWYgKGRhdGFbMV0gJiAweDQwKSB7CiAgICAgICAgIC8vIEh1aD8gRW5kIGJpdCBhbHNvIHNldCBvbiB0aGUgZmlyc3QgYnVmZmVyLgogCkBAIC0yMjQsNiArMzQ4LDggQEAKICAgICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSArK3F1ZXVlLT5iZWdpbigpOworICAgICAgICBpbnQzMl90IGNvbm5lY3RlZCA9IDE7CisgICAgICAgIGJvb2wgc25hcHBlZCA9IGZhbHNlOwogICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CiAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbGVuZ3RoICV6dSIsIHRvdGFsQ291bnQpOwogCkBAIC0yMzMsMjYgKzM1OSwzMiBAQAogICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKIAogICAgICAgICAgICAgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IGV4cGVjdGVkU2VxTm8pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2Ugbm90IGNvbXBsZXRlLCBleHBlY3RlZCBzZXFObyAlZCwgZ290ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU2VxTm8sICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2VxdWVuY2Ugbm90IGNvbXBsZXRlLCBleHBlY3RlZCBzZXFObyAldSwgZ290ICV1LCBuYWxUeXBlICV1IiwKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU2VxTm8sICh1bnNpZ25lZClidWZmZXItPmludDMyRGF0YSgpLCBuYWxUeXBlKTsKKyAgICAgICAgICAgICAgICBzbmFwcGVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgIHJldHVybiBXUk9OR19TRVFVRU5DRV9OVU1CRVI7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICghc25hcHBlZCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CiAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIKICAgICAgICAgICAgICAgICAgICAgfHwgZGF0YVswXSAhPSBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICAgfHwgKGRhdGFbMV0gJiAweDFmKSAhPSBuYWxUeXBlCi0gICAgICAgICAgICAgICAgICAgIHx8IChkYXRhWzFdICYgMHg4MCkpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRhdGFbMV0gJiAweDgwKQorICAgICAgICAgICAgICAgICAgICB8fCBydHBUaW1lICE9IHJ0cFRpbWVTdGFydEF0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yaW5nIG1hbGZvcm1lZCBGVSBidWZmZXIuIik7CiAKICAgICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIHdob2xlIHN0YXJ0IG9mIHRoZSBGVS4KIAotICAgICAgICAgICAgICAgIGl0ID0gcXVldWUtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gdG90YWxDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vICsgMTsKKyAgICAgICAgICAgICAgICBkZWxldGVVbml0VW5kZXJTZXEocXVldWUsIG1OZXh0RXhwZWN0ZWRTZXFObyk7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKICAgICAgICAgICAgIH0KQEAgLTI2MCw5ICszOTIsMTcgQEAKICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBzaXplIC0gMjsKICAgICAgICAgICAgICsrdG90YWxDb3VudDsKIAotICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm8gKyAxOworICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICsgMTsKIAogICAgICAgICAgICAgaWYgKGRhdGFbMV0gJiAweDQwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBGcmFtZSAmJiAhcmVjeWNsZVVuaXQoc3RhcnRTZXFObywgZXhwZWN0ZWRTZXFObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQsIHRvdGFsQ291bnQsIDAuNWYpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm87CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVVuaXRVbmRlclNlcShxdWV1ZSwgbU5leHRFeHBlY3RlZFNlcU5vKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50LgogICAgICAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI5MCw2ICs0MzAsNyBAQAogICAgIHVuaXQtPmRhdGEoKVswXSA9IChucmkgPDwgNSkgfCBuYWxUeXBlOwogCiAgICAgc2l6ZV90IG9mZnNldCA9IDE7CisgICAgaW50MzJfdCBjdm8gPSAtMTsKICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0b3RhbENvdW50OyArK2kpIHsKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKQEAgLTMwMCw2ICs0NDEsOCBAQAogI2VuZGlmCiAKICAgICAgICAgbWVtY3B5KHVuaXQtPmRhdGEoKSArIG9mZnNldCwgYnVmZmVyLT5kYXRhKCkgKyAyLCBidWZmZXItPnNpemUoKSAtIDIpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOwogICAgICAgICBvZmZzZXQgKz0gYnVmZmVyLT5zaXplKCkgLSAyOwogCiAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKQEAgLTMwNyw2ICs0NTAsMTAgQEAKIAogICAgIHVuaXQtPnNldFJhbmdlKDAsIHRvdGFsU2l6ZSk7CiAKKyAgICBpZiAoY3ZvID49IDApIHsKKyAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3ZvIiwgY3ZvKTsKKyAgICB9CisKICAgICBhZGRTaW5nbGVOQUxVbml0KHVuaXQpOwogCiAgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSBhc3NlbWJsZWQgYSBOQUwgdW5pdCBmcm9tIGZyYWdtZW50cy4iKTsKQEAgLTMyNyw2ICs0NzQsNyBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaW50MzJfdCBjdm8gPSAtMTsKICAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtTkFMVW5pdHMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IG1OQUxVbml0cy5lbmQoKTsgKytpdCkgewogICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOwpAQCAtMzM1LDYgKzQ4Myw4IEBACiAgICAgICAgIHNwPEFCdWZmZXI+IG5hbCA9ICppdDsKICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgbmFsLT5kYXRhKCksIG5hbC0+c2l6ZSgpKTsKICAgICAgICAgb2Zmc2V0ICs9IG5hbC0+c2l6ZSgpOworCisgICAgICAgIG5hbC0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOwogICAgIH0KIAogICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCAqbU5BTFVuaXRzLmJlZ2luKCkpOwpAQCAtMzQzLDYgKzQ5Myw5IEBACiAgICAgcHJpbnRmKG1BY2Nlc3NVbml0RGFtYWdlZCA/ICJYIiA6ICIuIik7CiAgICAgZmZsdXNoKHN0ZG91dCk7CiAjZW5kaWYKKyAgICBpZiAoY3ZvID49IDApIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3ZvIiwgY3ZvKTsKKyAgICB9CiAKICAgICBpZiAobUFjY2Vzc1VuaXREYW1hZ2VkKSB7CiAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRhbWFnZWQiLCB0cnVlKTsKQEAgLTM1NiwyMiArNTA5LDc4IEBACiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKK2ludDMyX3QgQUFWQ0Fzc2VtYmxlcjo6cGlja1Byb3BlclNlcShjb25zdCBRdWV1ZSAqcXVldWUsIHVpbnQzMl90IGppdCwgaW50NjRfdCBwbGF5KSB7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKihxdWV1ZS0+YmVnaW4oKSk7CisgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICBpbnQzMl90IG5leHRTZXFObyA9IGJ1ZmZlci0+aW50MzJEYXRhKCk7CisKKyAgICBRdWV1ZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIENIRUNLKCgqaXQpLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisgICAgICAgIC8vIGlmIHBrdCBpbiB0aW1lIGV4aXN0cywgdGhhdCBzaG91bGQgYmUgdGhlIG5leHQgcGl2b3QKKyAgICAgICAgaWYgKHJ0cFRpbWUgKyBqaXQgPj0gcGxheSkgeworICAgICAgICAgICAgbmV4dFNlcU5vID0gKCppdCktPmludDMyRGF0YSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgcmV0dXJuIG5leHRTZXFObzsKK30KKworYm9vbCBBQVZDQXNzZW1ibGVyOjpyZWN5Y2xlVW5pdCh1aW50MzJfdCBzdGFydCwgdWludDMyX3QgZW5kLCB1aW50MzJfdCBjb25uZWN0ZWQsCisgICAgICAgIHNpemVfdCBhdmFpbCwgZmxvYXQgZ29vZFJhdGlvKSB7CisgICAgZmxvYXQgdG90YWwgPSBlbmQgLSBzdGFydDsKKyAgICBmbG9hdCB2YWxpZCA9IGNvbm5lY3RlZDsKKyAgICBmbG9hdCBleGlzdCA9IGF2YWlsOworICAgIGJvb2wgaXNSZWN5Y2xlID0gKHZhbGlkIC8gdG90YWwpID49IGdvb2RSYXRpbzsKKworICAgIEFMT0dWKCJjaGVja2luZyBwLWZyYW1lIGxvc3Nlcy4uIHJlY3ZCdWZzICVmIHZhbGlkICVmIGRpZmYgJWYgcmVjeWNsZT8gJWQiLAorICAgICAgICAgICAgZXhpc3QsIHZhbGlkLCB0b3RhbCwgaXNSZWN5Y2xlKTsKKworICAgIHJldHVybiBpc1JlY3ljbGU7Cit9CisKK2ludDMyX3QgQUFWQ0Fzc2VtYmxlcjo6ZGVsZXRlVW5pdFVuZGVyU2VxKFF1ZXVlICpxdWV1ZSwgdWludDMyX3Qgc2VxKSB7CisgICAgaW50MzJfdCBpbml0U2l6ZSA9IHF1ZXVlLT5zaXplKCk7CisgICAgUXVldWU6Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICBpZiAoKHVpbnQzMl90KSgqaXQpLT5pbnQzMkRhdGEoKSA+PSBzZXEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSwgaXQpOworICAgIHJldHVybiBpbml0U2l6ZSAtIHF1ZXVlLT5zaXplKCk7Cit9CisKK2lubGluZSB2b2lkIEFBVkNBc3NlbWJsZXI6OnByaW50Tm93VGltZVVzKGludDY0X3Qgc3RhcnQsIGludDY0X3Qgbm93LCBpbnQ2NF90IHBsYXkpIHsKKyAgICBBTE9HRCgic3RhcnQ9JWxsZCwgbm93PSVsbGQsIHBsYXllZD0lbGxkIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpc3RhcnQsIChsb25nIGxvbmcpbm93LCAobG9uZyBsb25nKXBsYXkpOworfQorCitpbmxpbmUgdm9pZCBBQVZDQXNzZW1ibGVyOjpwcmludFJUUFRpbWUodWludDMyX3QgcnRwLCBpbnQ2NF90IHBsYXksIHVpbnQzMl90IGV4cCwgYm9vbCBpc0V4cCkgeworICAgIEFMT0dEKCJydHAtdGltZShKQik9JXUsIHBsYXllZC1ydHAtdGltZShKQik9JWxsZCwgZXhwaXJlZC1ydHAtdGltZShKQik9JXUgaXNFeHBpcmVkPSVkIiwKKyAgICAgICAgICAgIHJ0cCwgKGxvbmcgbG9uZylwbGF5LCBleHAsIGlzRXhwKTsKK30KKwogQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUFWQ0Fzc2VtYmxlcjo6YXNzZW1ibGVNb3JlKAogICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CiAgICAgQXNzZW1ibHlTdGF0dXMgc3RhdHVzID0gYWRkTkFMVW5pdChzb3VyY2UpOwogICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgewotICAgICAgICBtQWNjZXNzVW5pdERhbWFnZWQgPSB0cnVlOworICAgICAgICB1aW50NjRfdCBtc2Vjc1NpbmNlTGFzdElGcmFtZSA9IChBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMCkgLSBtTGFzdElGcmFtZVByb3ZpZGVkQXRNczsKKyAgICAgICAgaWYgKG1zZWNzU2luY2VMYXN0SUZyYW1lID4gMTAwMCkgeworICAgICAgICAgICAgQUxPR1YoInJlcXVlc3QgRklSIHRvIGdldCBhIG5ldyBJLUZyYW1lLCB0aW1lIHNpbmNlICIKKyAgICAgICAgICAgICAgICAgICAgImxhc3QgSS1GcmFtZSAlbGx1IG1zIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltc2Vjc1NpbmNlTGFzdElGcmFtZSk7CisgICAgICAgICAgICBzb3VyY2UtPm9uSXNzdWVGSVJCeUFzc2VtYmxlcigpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQUFWQ0Fzc2VtYmxlcjo6cGFja2V0TG9zdCgpIHsKICAgICBDSEVDSyhtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCk7Ci0gICAgQUxPR1YoInBhY2tldExvc3QgKGV4cGVjdGVkICVkKSIsIG1OZXh0RXhwZWN0ZWRTZXFObyk7Ci0KKyAgICBBTE9HRCgicGFja2V0TG9zdCAoZXhwZWN0ZWQgJXUpIiwgbU5leHRFeHBlY3RlZFNlcU5vKTsKICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKLQotICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IHRydWU7CiB9CiAKIHZvaWQgQUFWQ0Fzc2VtYmxlcjo6b25CeWVSZWNlaXZlZCgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmgKaW5kZXggZTE5NDgwYy4uOTEzYTg2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmgKQEAgLTMxLDYgKzMxLDcgQEAKIHN0cnVjdCBBQVZDQXNzZW1ibGVyIDogcHVibGljIEFSVFBBc3NlbWJsZXIgewogICAgIGV4cGxpY2l0IEFBVkNBc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCisgICAgdHlwZWRlZiBMaXN0PHNwPEFCdWZmZXI+ID4gUXVldWU7CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUFWQ0Fzc2VtYmxlcigpOwogCkBAIC00NSw4ICs0NiwxMiBAQAogICAgIGJvb2wgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQ7CiAgICAgdWludDMyX3QgbU5leHRFeHBlY3RlZFNlcU5vOwogICAgIGJvb2wgbUFjY2Vzc1VuaXREYW1hZ2VkOworICAgIGJvb2wgbUZpcnN0SUZyYW1lUHJvdmlkZWQ7CisgICAgdWludDY0X3QgbUxhc3RJRnJhbWVQcm92aWRlZEF0TXM7CiAgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1OQUxVbml0czsKIAorICAgIGludDMyX3QgYWRkTmFjayhjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2b2lkIGNoZWNrSUZyYW1lUHJvdmlkZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgQXNzZW1ibHlTdGF0dXMgYWRkTkFMVW5pdChjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKICAgICB2b2lkIGFkZFNpbmdsZU5BTFVuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgQXNzZW1ibHlTdGF0dXMgYWRkRnJhZ21lbnRlZE5BTFVuaXQoTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSk7CkBAIC01NCw2ICs1OSwxMyBAQAogCiAgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CiAKKyAgICBpbnQzMl90IHBpY2tQcm9wZXJTZXEoY29uc3QgUXVldWUgKnEsIHVpbnQzMl90IGppdCwgaW50NjRfdCBwbGF5KTsKKyAgICBib29sIHJlY3ljbGVVbml0KHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQsIHVpbnQzMl90IGNvbm5lY3RlZCwKKyAgICAgICAgICAgIHNpemVfdCBhdmFpbCwgZmxvYXQgZ29vZFJhdGlvKTsKKyAgICBpbnQzMl90IGRlbGV0ZVVuaXRVbmRlclNlcShRdWV1ZSAqcSwgdWludDMyX3Qgc2VxKTsKKyAgICB2b2lkIHByaW50Tm93VGltZVVzKGludDY0X3Qgc3RhcnQsIGludDY0X3Qgbm93LCBpbnQ2NF90IHBsYXkpOworICAgIHZvaWQgcHJpbnRSVFBUaW1lKHVpbnQzMl90IHJ0cCwgaW50NjRfdCBwbGF5LCB1aW50MzJfdCBleHAsIGJvb2wgaXNFeHApOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUFWQ0Fzc2VtYmxlcik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OGEwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmNwcApAQCAtMCwwICsxLDY2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUhFVkNBc3NlbWJsZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBSEVWQ0Fzc2VtYmxlci5oIgorCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8aW5jbHVkZS9IZXZjVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEgyNjVfTkFMVV9NQVNLIDB4M0YKKyNkZWZpbmUgSDI2NV9OQUxVX1ZQUyAweDIwCisjZGVmaW5lIEgyNjVfTkFMVV9TUFMgMHgyMQorI2RlZmluZSBIMjY1X05BTFVfUFBTIDB4MjIKKyNkZWZpbmUgSDI2NV9OQUxVX0FQIDB4MzAKKyNkZWZpbmUgSDI2NV9OQUxVX0ZVIDB4MzEKKyNkZWZpbmUgSDI2NV9OQUxVX1BBQ0kgMHgzMgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitBSEVWQ0Fzc2VtYmxlcjo6QUhFVkNBc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCisgICAgICBtQWNjZXNzVW5pdFJUUFRpbWUoMCksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCksCisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpLAorICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQoZmFsc2UpLAorICAgICAgbUxhc3RJRnJhbWVQcm92aWRlZEF0TXMoMCksCisgICAgICBtV2lkdGgoMCksCisgICAgICBtSGVpZ2h0KDApIHsKKworICAgICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7Cit9CisKK0FIRVZDQXNzZW1ibGVyOjp+QUhFVkNBc3NlbWJsZXIoKSB7Cit9CisKK2ludDMyX3QgQUhFVkNBc3NlbWJsZXI6OmFkZE5hY2soCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBMaXN0PHNwPEFCdWZmZXI+PiAqcXVldWUgPSBzb3VyY2UtPnF1ZXVlKCk7CisgICAgaW50MzJfdCBuYWNrQ291bnQgPSAwOworCisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IHF1ZXVlLT5iZWdpbigpOworCisgICAgaWYgKGl0ID09IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICByZXR1cm4gbmFja0NvdW50IC8qIDAgKi87CisgICAgfQorCisgICAgdWludDE2X3QgcXVldWVIZWFkU2VxTnVtID0gKCppdCktPmludDMyRGF0YSgpOworCisgICAgLy8gbW92ZSB0byB0aGUgcGFja2V0IGFmdGVyIHdoaWNoIFJUQ1A6TkFDSyB3YXMgc2VudC4KKyAgICBmb3IgKDsgaXQgIT0gcXVldWUtPmVuZCgpOyArK2l0KSB7CisgICAgICAgIGludDMyX3Qgc2VxTnVtID0gKCppdCktPmludDMyRGF0YSgpOworICAgICAgICBpZiAoc2VxTnVtID49IHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgbmFja1N0YXJ0QXQgPSAtMTsKKworICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgaW50MzJfdCBzZXFCZWZvcmVMYXN0ID0gKCppdCktPmludDMyRGF0YSgpOworICAgICAgICAvLyBpbmNyZWFzZSBpdGVyYXRvci4KKyAgICAgICAgaWYgKCgrK2l0KSA9PSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBzZXFMYXN0ID0gKCppdCktPmludDMyRGF0YSgpOworCisgICAgICAgIGlmICgoc2VxTGFzdCAtIHNlcUJlZm9yZUxhc3QpIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoImFkZE5hY2s6IGZvdW5kIGVuZCBvZiBzZXFOdW0gZnJvbSglZCkgdG8oJWQpIiwgc2VxQmVmb3JlTGFzdCwgc2VxTGFzdCk7CisgICAgICAgICAgICBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlciA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBtaXNzZWQgcGFja2V0IGZvdW5kCisgICAgICAgIGlmIChzZXFMYXN0ID4gKHNlcUJlZm9yZUxhc3QgKyAxKSAmJgorICAgICAgICAgICAgLy8gd2UgZGlkbid0IHNlbmQgUlRDUDpOQUNLIGZvciB0aGlzIHBhY2tldCB5ZXQuCisgICAgICAgICAgICAoc2VxTGFzdCAtIDEpID4gc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIpIHsKKyAgICAgICAgICAgIHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyID0gc2VxTGFzdCAtMTsKKyAgICAgICAgICAgIG5hY2tTdGFydEF0ID0gc2VxQmVmb3JlTGFzdCArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKG5hY2tTdGFydEF0ICE9IC0xKSB7CisgICAgICAgIG5hY2tDb3VudCA9IHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyIC0gbmFja1N0YXJ0QXQgKyAxOworICAgICAgICBBTE9HRCgiYWRkTmFjazogbmFja0NvdW50PSVkLCBuYWNrRnJvbT0lZCwgbmFja1RvPSVkIiwgbmFja0NvdW50LAorICAgICAgICAgICAgbmFja1N0YXJ0QXQsIHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyKTsKKworICAgICAgICB1aW50MTZfdCBtYXNrID0gKHVpbnQxNl90KSgweGZmZmYpID4+ICgxNiAtIG5hY2tDb3VudCArIDEpOworICAgICAgICBzb3VyY2UtPnNldFNlcU51bVRvTkFDSyhuYWNrU3RhcnRBdCwgbWFzaywgcXVldWVIZWFkU2VxTnVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmFja0NvdW50OworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBSEVWQ0Fzc2VtYmxlcjo6YWRkTkFMVW5pdCgKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUgPSBzb3VyY2UtPnF1ZXVlKCk7CisKKyAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKKyAgICB1aW50MzJfdCBydHBUaW1lOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworICAgIGludDY0X3Qgc3RhcnRUaW1lID0gc291cmNlLT5tRmlyc3RTeXNUaW1lIC8gMTAwMDsKKyAgICBpbnQ2NF90IG5vd1RpbWUgPSBBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMDsKKyAgICBpbnQ2NF90IHBsYXllZFRpbWUgPSBub3dUaW1lIC0gc3RhcnRUaW1lOworICAgIGludDY0X3QgcGxheWVkVGltZVJ0cCA9IHNvdXJjZS0+bUZpcnN0UnRwVGltZSArCisgICAgICAgICgoKHVpbnQzMl90KXBsYXllZFRpbWUpICogKHNvdXJjZS0+bUNsb2NrUmF0ZSAvIDEwMDApKTsKKyAgICBjb25zdCB1aW50MzJfdCBqaXR0ZXJUaW1lID0gKHVpbnQzMl90KShzb3VyY2UtPm1DbG9ja1JhdGUgLyAoKGZsb2F0KTEwMDAgLyAoc291cmNlLT5tSmJUaW1lTXMpKSk7CisgICAgdWludDMyX3QgZXhwaXJlZFRpbWVJbkpiID0gcnRwVGltZSArIGppdHRlclRpbWU7CisgICAgYm9vbCBpc0V4cGlyZWQgPSBleHBpcmVkVGltZUluSmIgPD0gKHBsYXllZFRpbWVSdHApOworICAgIGJvb2wgaXNUb29MYXRlMjAwID0gZXhwaXJlZFRpbWVJbkpiIDwgKHBsYXllZFRpbWVSdHAgLSBqaXR0ZXJUaW1lKTsKKyAgICBib29sIGlzVG9vTGF0ZTMwMCA9IGV4cGlyZWRUaW1lSW5KYiA8IChwbGF5ZWRUaW1lUnRwIC0gKGppdHRlclRpbWUgKiAzIC8gMikpOworCisgICAgaWYgKG1TaG93UXVldWVDbnQgPCAyMCkgeworICAgICAgICBzaG93Q3VycmVudFF1ZXVlKHF1ZXVlKTsKKyAgICAgICAgcHJpbnROb3dUaW1lVXMoc3RhcnRUaW1lLCBub3dUaW1lLCBwbGF5ZWRUaW1lKTsKKyAgICAgICAgcHJpbnRSVFBUaW1lKHJ0cFRpbWUsIHBsYXllZFRpbWVSdHAsIGV4cGlyZWRUaW1lSW5KYiwgaXNFeHBpcmVkKTsKKyAgICAgICAgbVNob3dRdWV1ZUNudCsrOworICAgIH0KKworICAgIEFIRVZDQXNzZW1ibGVyOjphZGROYWNrKHNvdXJjZSk7CisKKyAgICBpZiAoIWlzRXhwaXJlZCkgeworICAgICAgICBBTE9HVigiYnVmZmVyaW5nIGluIGppdHRlciBidWZmZXIuIik7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKGlzVG9vTGF0ZTIwMCkgeworICAgICAgICBBTE9HVygiPT09IFdBUk5JTkcgPT09IGJ1ZmZlciBhcnJpdmVkIDIwMG1zIGxhdGUuID09PSBXQVJOSU5HID09PSAiKTsKKyAgICB9CisKKyAgICBpZiAoaXNUb29MYXRlMzAwKSB7CisgICAgICAgIEFMT0dXKCJidWZmZXIgYXJyaXZlZCBhZnRlciAzMDBtcyAuLi4gXHQgRGlmZiBpbiBKYj0lbGxkIFx0IFNlcSMgJWQiLAorICAgICAgICAgICAgICAoKGxvbmcgbG9uZylwbGF5ZWRUaW1lUnRwKSAtIGV4cGlyZWRUaW1lSW5KYiwgYnVmZmVyLT5pbnQzMkRhdGEoKSk7CisgICAgICAgIHByaW50Tm93VGltZVVzKHN0YXJ0VGltZSwgbm93VGltZSwgcGxheWVkVGltZSk7CisgICAgICAgIHByaW50UlRQVGltZShydHBUaW1lLCBwbGF5ZWRUaW1lUnRwLCBleHBpcmVkVGltZUluSmIsIGlzRXhwaXJlZCk7CisKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gcGlja1Byb3BlclNlcShxdWV1ZSwgaml0dGVyVGltZSwgcGxheWVkVGltZVJ0cCk7CisgICAgfQorCisgICAgaWYgKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIGludDMyX3Qgc2l6ZSA9IHF1ZXVlLT5zaXplKCk7CisgICAgICAgIGludDMyX3QgY250UmVtb3ZlID0gZGVsZXRlVW5pdFVuZGVyU2VxKHF1ZXVlLCBtTmV4dEV4cGVjdGVkU2VxTm8pOworCisgICAgICAgIGlmIChjbnRSZW1vdmUgPiAwKSB7CisgICAgICAgICAgICBzb3VyY2UtPm5vdGljZUFiYW5kb25CdWZmZXIoY250UmVtb3ZlKTsKKyAgICAgICAgICAgIEFMT0dXKCJkZWxldGUgJWQgb2YgJWQgYnVmZmVycyIsIGNudFJlbW92ZSwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoIW1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7CisgICAgfSBlbHNlIGlmICgodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSAhPSBtTmV4dEV4cGVjdGVkU2VxTm8pIHsKKyAgICAgICAgQUxPR1YoIk5vdCB0aGUgc2VxdWVuY2UgbnVtYmVyIEkgZXhwZWN0ZWQiKTsKKworICAgICAgICByZXR1cm4gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgaWYgKHNpemUgPCAxIHx8IChkYXRhWzBdICYgMHg4MCkpIHsKKyAgICAgICAgLy8gQ29ycnVwdC4KKworICAgICAgICBBTE9HVigiSWdub3JpbmcgY29ycnVwdCBidWZmZXIuIik7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSAoZGF0YVswXSA+PiAxKSAmIEgyNjVfTkFMVV9NQVNLOworICAgIGlmIChuYWxUeXBlID4gMCAmJiBuYWxUeXBlIDwgSDI2NV9OQUxVX0FQKSB7CisgICAgICAgIGFkZFNpbmdsZU5BTFVuaXQoYnVmZmVyKTsKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gSDI2NV9OQUxVX0ZVKSB7CisgICAgICAgIC8vIEZVLUEKKyAgICAgICAgcmV0dXJuIGFkZEZyYWdtZW50ZWROQUxVbml0KHF1ZXVlKTsKKyAgICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gSDI2NV9OQUxVX0FQKSB7CisgICAgICAgIC8vIFNUQVAtQQorICAgICAgICBib29sIHN1Y2Nlc3MgPSBhZGRTaW5nbGVUaW1lQWdncmVnYXRpb25QYWNrZXQoYnVmZmVyKTsKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IDApIHsKKyAgICAgICAgQUxPR1YoIklnbm9yaW5nIHVuZGVmaW5lZCBuYWwgdHlwZS4iKTsKKworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIklnbm9yaW5nIHVuc3VwcG9ydGVkIGJ1ZmZlciAobmFsVHlwZT0lZCkiLCBuYWxUeXBlKTsKKworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKworICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICB9Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6OmNoZWNrU3BzVXBkYXRlZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgSGV2Y1BhcmFtZXRlclNldHMgcGFyYW1TZXRzOworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSAoZGF0YVswXSA+PiAxKSAmIEgyNjVfTkFMVV9NQVNLOworICAgIGlmIChuYWxUeXBlID09IEgyNjVfTkFMVV9TUFMpIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisgICAgICAgIHBhcmFtU2V0cy5GaW5kSEVWQ0RpbWVuc2lvbnMoYnVmZmVyLCAmd2lkdGgsICZoZWlnaHQpOworICAgICAgICBBTE9HVigiZXhpc3RpbmcgcmVzb2x1dGlvbiAoJXUgeCAldSkiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBpZiAod2lkdGggIT0gbVdpZHRoIHx8IGhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICBtRmlyc3RJRnJhbWVQcm92aWRlZCA9IGZhbHNlOworICAgICAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgQUxPR0QoImZvdW5kIGEgbmV3IHJlc29sdXRpb24gKCV1IHggJXUpIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBSEVWQ0Fzc2VtYmxlcjo6Y2hlY2tJRnJhbWVQcm92aWRlZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgdW5zaWduZWQgbmFsVHlwZSA9IChkYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0s7CisgICAgaWYgKG5hbFR5cGUgPiAweDBGICYmIG5hbFR5cGUgPCAweDE4KSB7CisgICAgICAgIG1MYXN0SUZyYW1lUHJvdmlkZWRBdE1zID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDA7CisgICAgICAgIGlmICghbUZpcnN0SUZyYW1lUHJvdmlkZWQpIHsKKyAgICAgICAgICAgIG1GaXJzdElGcmFtZVByb3ZpZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKyAgICAgICAgICAgIEFMT0dEKCJnb3QgRmlyc3QgSS1mcmFtZSB0byBiZSBkZWNvZGVkLiBydHBUaW1lPSVkLCBzaXplPSV6dSIsIHJ0cFRpbWUsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBBSEVWQ0Fzc2VtYmxlcjo6ZHJvcEZyYW1lc1VudGlsSWZyYW1lKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gKGRhdGFbMF0gPj4gMSkgJiBIMjY1X05BTFVfTUFTSzsKKyAgICByZXR1cm4gIW1GaXJzdElGcmFtZVByb3ZpZGVkICYmIG5hbFR5cGUgPCAweDEwOworfQorCit2b2lkIEFIRVZDQXNzZW1ibGVyOjphZGRTaW5nbGVOQUxVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBBTE9HVigiYWRkU2luZ2xlTkFMVW5pdCBvZiBzaXplICV6dSIsIGJ1ZmZlci0+c2l6ZSgpKTsKKyNpZiAhTE9HX05ERUJVRworICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyNlbmRpZgorICAgIGNoZWNrU3BzVXBkYXRlZChidWZmZXIpOworICAgIGNoZWNrSUZyYW1lUHJvdmlkZWQoYnVmZmVyKTsKKworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICBpZiAoZHJvcEZyYW1lc1VudGlsSWZyYW1lKGJ1ZmZlcikpIHsKKyAgICAgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gbnVsbHB0cjsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoInNvdXJjZSIsIChzcDxhbmRyb2lkOjpSZWZCYXNlPiopJnNvdXJjZSk7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIklzc3VlZCBGSVIgdG8gZ2V0IHRoZSBJLWZyYW1lIik7CisgICAgICAgICAgICBzb3VyY2UtPm9uSXNzdWVGSVJCeUFzc2VtYmxlcigpOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCJkcm9wIFAtZnJhbWVzIHRpbGwgYW4gSS1mcmFtZSBwcm92aWRlZC4gcnRwVGltZSAldSIsIHJ0cFRpbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtTkFMVW5pdHMuZW1wdHkoKSAmJiBydHBUaW1lICE9IG1BY2Nlc3NVbml0UlRQVGltZSkgeworICAgICAgICBzdWJtaXRBY2Nlc3NVbml0KCk7CisgICAgfQorICAgIG1BY2Nlc3NVbml0UlRQVGltZSA9IHJ0cFRpbWU7CisKKyAgICBtTkFMVW5pdHMucHVzaF9iYWNrKGJ1ZmZlcik7Cit9CisKK2Jvb2wgQUhFVkNBc3NlbWJsZXI6OmFkZFNpbmdsZVRpbWVBZ2dyZWdhdGlvblBhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBpZiAoc2l6ZSA8IDMpIHsKKyAgICAgICAgQUxPR1YoIkRpc2NhcmRpbmcgdG9vIHNtYWxsIFNUQVAtQSBwYWNrZXQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICArK2RhdGE7CisgICAgLS1zaXplOworICAgIHdoaWxlIChzaXplID49IDIpIHsKKyAgICAgICAgc2l6ZV90IG5hbFNpemUgPSAoZGF0YVswXSA8PCA4KSB8IGRhdGFbMV07CisKKyAgICAgICAgaWYgKHNpemUgPCBuYWxTaXplICsgMikgeworICAgICAgICAgICAgQUxPR1YoIkRpc2NhcmRpbmcgbWFsZm9ybWVkIFNUQVAtQSBwYWNrZXQuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiB1bml0ID0gbmV3IEFCdWZmZXIobmFsU2l6ZSk7CisgICAgICAgIG1lbWNweSh1bml0LT5kYXRhKCksICZkYXRhWzJdLCBuYWxTaXplKTsKKworICAgICAgICBDb3B5VGltZXModW5pdCwgYnVmZmVyKTsKKworICAgICAgICBhZGRTaW5nbGVOQUxVbml0KHVuaXQpOworCisgICAgICAgIGRhdGEgKz0gMiArIG5hbFNpemU7CisgICAgICAgIHNpemUgLT0gMiArIG5hbFNpemU7CisgICAgfQorCisgICAgaWYgKHNpemUgIT0gMCkgeworICAgICAgICBBTE9HVigiVW5leHBlY3RlZCBwYWRkaW5nIGF0IGVuZCBvZiBTVEFQLUEgcGFja2V0LiIpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBSEVWQ0Fzc2VtYmxlcjo6YWRkRnJhZ21lbnRlZE5BTFVuaXQoCisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUpIHsKKyAgICBDSEVDSyghcXVldWUtPmVtcHR5KCkpOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKnF1ZXVlLT5iZWdpbigpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgQ0hFQ0soc2l6ZSA+IDApOworICAgIC8qICAgSDI2NSBwYXlsb2FkIGhlYWRlciBpcyAxNiBiaXQKKyAgICAgICAgMCAxIDIgMyA0IDUgNiA3IDAgMSAyIDMgNCA1IDYgNworICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgIHxGfCAgICAgVHlwZSAgfCAgTGF5ZXIgSUQgfCBUSUQgfAorICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIHVuc2lnbmVkIGluZGljYXRvciA9IChkYXRhWzBdID4+IDEpOworCisgICAgQ0hFQ0soKGluZGljYXRvciAmIEgyNjVfTkFMVV9NQVNLKSA9PSBIMjY1X05BTFVfRlUpOworCisgICAgaWYgKHNpemUgPCAzKSB7CisgICAgICAgIEFMT0dWKCJJZ25vcmluZyBtYWxmb3JtZWQgRlUgYnVmZmVyIChzaXplID0gJXp1KSIsIHNpemUpOworCisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICB9CisKKyAgICBpZiAoIShkYXRhWzJdICYgMHg4MCkpIHsKKyAgICAgICAgLy8gU3RhcnQgYml0IG5vdCBzZXQgb24gdGhlIGZpcnN0IGJ1ZmZlci4KKworICAgICAgICBBTE9HVigiU3RhcnQgYml0IG5vdCBzZXQgb24gZmlyc3QgYnVmZmVyIik7CisKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIC8qICBGVSBJTkRJQ0FUT1IgSERSCisgICAgICAgIDAgMSAyIDMgNCA1IDYgNworICAgICAgICstKy0rLSstKy0rLSstKy0rCisgICAgICAgfFN8RXwgICBUeXBlICAgIHwKKyAgICAgICArLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIHVpbnQzMl90IG5hbFR5cGUgPSBkYXRhWzJdICYgSDI2NV9OQUxVX01BU0s7CisgICAgdWludDMyX3QgdGlkID0gZGF0YVsxXSAmIDB4NzsKKyAgICBBTE9HVigibmFsVHlwZSA9JXUsIHRpZCA9JXUiLCBuYWxUeXBlLCB0aWQpOworCisgICAgdWludDMyX3QgZXhwZWN0ZWRTZXFObyA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICsgMTsKKyAgICBzaXplX3QgdG90YWxTaXplID0gc2l6ZSAtIDM7CisgICAgc2l6ZV90IHRvdGFsQ291bnQgPSAxOworICAgIGJvb2wgY29tcGxldGUgPSBmYWxzZTsKKworICAgIHVpbnQzMl90IHJ0cFRpbWVTdGFydEF0OworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZVN0YXJ0QXQpKTsKKyAgICB1aW50MzJfdCBzdGFydFNlcU5vID0gYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICBib29sIHBGcmFtZSA9IChuYWxUeXBlIDwgMHgxMCk7CisKKyAgICBpZiAoZGF0YVsyXSAmIDB4NDApIHsKKyAgICAgICAgLy8gSHVoPyBFbmQgYml0IGFsc28gc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIuCisKKyAgICAgICAgQUxPR1YoIkdycnIuIFRoaXMgaXNuJ3QgZnJhZ21lbnRlZCBhdCBhbGwuIik7CisKKyAgICAgICAgY29tcGxldGUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSArK3F1ZXVlLT5iZWdpbigpOworICAgICAgICBpbnQzMl90IGNvbm5lY3RlZCA9IDE7CisgICAgICAgIGJvb2wgc25hcHBlZCA9IGZhbHNlOworICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbGVuZ3RoICV6dSIsIHRvdGFsQ291bnQpOworCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgICAgICAgICBpZiAoKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkgIT0gZXhwZWN0ZWRTZXFObykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBub3QgY29tcGxldGUsIGV4cGVjdGVkIHNlcU5vICV1LCBnb3QgJXUsIG5hbFR5cGUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRTZXFObywgKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCksIG5hbFR5cGUpOworICAgICAgICAgICAgICAgIHNuYXBwZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYgKCFwRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc25hcHBlZCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDMKKyAgICAgICAgICAgICAgICAgICAgfHwgKChkYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0spICE9IGluZGljYXRvcgorICAgICAgICAgICAgICAgICAgICB8fCAoZGF0YVsyXSAmIEgyNjVfTkFMVV9NQVNLKSAhPSBuYWxUeXBlCisgICAgICAgICAgICAgICAgICAgIHx8IChkYXRhWzJdICYgMHg4MCkKKyAgICAgICAgICAgICAgICAgICAgfHwgcnRwVGltZSAhPSBydHBUaW1lU3RhcnRBdCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJJZ25vcmluZyBtYWxmb3JtZWQgRlUgYnVmZmVyLiIpOworCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSB3aG9sZSBzdGFydCBvZiB0aGUgRlUuCisKKyAgICAgICAgICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vICsgMTsKKyAgICAgICAgICAgICAgICBkZWxldGVVbml0VW5kZXJTZXEocXVldWUsIG1OZXh0RXhwZWN0ZWRTZXFObyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG90YWxTaXplICs9IHNpemUgLSAzOworICAgICAgICAgICAgKyt0b3RhbENvdW50OworCisgICAgICAgICAgICBleHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkgKyAxOworCisgICAgICAgICAgICBpZiAoZGF0YVsyXSAmIDB4NDApIHsKKyAgICAgICAgICAgICAgICBpZiAocEZyYW1lICYmICFyZWN5Y2xlVW5pdChzdGFydFNlcU5vLCBleHBlY3RlZFNlcU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkLCB0b3RhbENvdW50LCAwLjVmKSkgeworICAgICAgICAgICAgICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vOworICAgICAgICAgICAgICAgICAgICBkZWxldGVVbml0VW5kZXJTZXEocXVldWUsIG1OZXh0RXhwZWN0ZWRTZXFObyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnQuCisgICAgICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb21wbGV0ZSkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIG1OZXh0RXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm87CisKKyAgICAvLyBXZSBmb3VuZCBhbGwgdGhlIGZyYWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGNvbXBsZXRlIE5BTCB1bml0LgorCisgICAgLy8gTGVhdmUgcm9vbSBmb3IgdGhlIGhlYWRlci4gU28gZmFyIHRvdGFsU2l6ZSBkaWQgbm90IGluY2x1ZGUgdGhlCisgICAgLy8gaGVhZGVyIGJ5dGUuCisgICAgdG90YWxTaXplICs9IDI7CisKKyAgICBzcDxBQnVmZmVyPiB1bml0ID0gbmV3IEFCdWZmZXIodG90YWxTaXplKTsKKyAgICBDb3B5VGltZXModW5pdCwgKnF1ZXVlLT5iZWdpbigpKTsKKworICAgIHVuaXQtPmRhdGEoKVswXSA9IChuYWxUeXBlIDw8IDEpOworICAgIHVuaXQtPmRhdGEoKVsxXSA9IHRpZDsKKworICAgIHNpemVfdCBvZmZzZXQgPSAyOworICAgIGludDMyX3QgY3ZvID0gLTE7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IHF1ZXVlLT5iZWdpbigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG90YWxDb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CisKKyAgICAgICAgQUxPR1YoInBpZWNlICMlenUvJXp1IiwgaSArIDEsIHRvdGFsQ291bnQpOworI2lmICFMT0dfTkRFQlVHCisgICAgICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyNlbmRpZgorCisgICAgICAgIG1lbWNweSh1bml0LT5kYXRhKCkgKyBvZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpICsgMywgYnVmZmVyLT5zaXplKCkgLSAzKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3ZvIiwgJmN2byk7CisgICAgICAgIG9mZnNldCArPSBidWZmZXItPnNpemUoKSAtIDM7CisKKyAgICAgICAgaXQgPSBxdWV1ZS0+ZXJhc2UoaXQpOworICAgIH0KKworICAgIHVuaXQtPnNldFJhbmdlKDAsIHRvdGFsU2l6ZSk7CisKKyAgICBpZiAoY3ZvID49IDApIHsKKyAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3ZvIiwgY3ZvKTsKKyAgICB9CisKKyAgICBhZGRTaW5nbGVOQUxVbml0KHVuaXQpOworCisgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSBhc3NlbWJsZWQgYSBOQUwgdW5pdCBmcm9tIGZyYWdtZW50cy4iKTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBSEVWQ0Fzc2VtYmxlcjo6c3VibWl0QWNjZXNzVW5pdCgpIHsKKyAgICBDSEVDSyghbU5BTFVuaXRzLmVtcHR5KCkpOworCisgICAgQUxPR1YoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglenUgbmFsIHVuaXRzKSIsIG1OQUxVbml0cy5zaXplKCkpOworCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbU5BTFVuaXRzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtTkFMVW5pdHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgdG90YWxTaXplICs9IDQgKyAoKml0KS0+c2l6ZSgpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcih0b3RhbFNpemUpOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIGludDMyX3QgY3ZvID0gLTE7CisgICAgZm9yIChMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbU5BTFVuaXRzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtTkFMVW5pdHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbmFsID0gKml0OworICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBuYWwtPmRhdGEoKSwgbmFsLT5zaXplKCkpOworICAgICAgICBvZmZzZXQgKz0gbmFsLT5zaXplKCk7CisgICAgICAgIG5hbC0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOworICAgIH0KKworICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCAqbU5BTFVuaXRzLmJlZ2luKCkpOworCisjaWYgMAorICAgIHByaW50ZihtQWNjZXNzVW5pdERhbWFnZWQgPyAiWCIgOiAiLiIpOworICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisgICAgaWYgKGN2byA+PSAwKSB7CisgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIGN2byk7CisgICAgfQorCisgICAgaWYgKG1BY2Nlc3NVbml0RGFtYWdlZCkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJkYW1hZ2VkIiwgdHJ1ZSk7CisgICAgfQorCisgICAgbU5BTFVuaXRzLmNsZWFyKCk7CisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gZmFsc2U7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRCdWZmZXIoImFjY2Vzcy11bml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK2ludDMyX3QgQUhFVkNBc3NlbWJsZXI6OnBpY2tQcm9wZXJTZXEoY29uc3QgUXVldWUgKnF1ZXVlLCB1aW50MzJfdCBqaXQsIGludDY0X3QgcGxheSkgeworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICoocXVldWUtPmJlZ2luKCkpOworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgaW50MzJfdCBuZXh0U2VxTm8gPSBidWZmZXItPmludDMyRGF0YSgpOworCisgICAgUXVldWU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICBDSEVDSygoKml0KS0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworICAgICAgICAvLyBpZiBwa3QgaW4gdGltZSBleGlzdHMsIHRoYXQgc2hvdWxkIGJlIHRoZSBuZXh0IHBpdm90CisgICAgICAgIGlmIChydHBUaW1lICsgaml0ID49IHBsYXkpIHsKKyAgICAgICAgICAgIG5leHRTZXFObyA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIHJldHVybiBuZXh0U2VxTm87Cit9CisKK2Jvb2wgQUhFVkNBc3NlbWJsZXI6OnJlY3ljbGVVbml0KHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQsICB1aW50MzJfdCBjb25uZWN0ZWQsCisgICAgICAgICBzaXplX3QgYXZhaWwsIGZsb2F0IGdvb2RSYXRpbykgeworICAgIGZsb2F0IHRvdGFsID0gZW5kIC0gc3RhcnQ7CisgICAgZmxvYXQgdmFsaWQgPSBjb25uZWN0ZWQ7CisgICAgZmxvYXQgZXhpc3QgPSBhdmFpbDsKKyAgICBib29sIGlzUmVjeWNsZSA9ICh2YWxpZCAvIHRvdGFsKSA+PSBnb29kUmF0aW87CisKKyAgICBBTE9HVigiY2hlY2tpbmcgcC1mcmFtZSBsb3NzZXMuLiByZWN2QnVmcyAlZiB2YWxpZCAlZiBkaWZmICVmIHJlY3ljbGU/ICVkIiwKKyAgICAgICAgICAgIGV4aXN0LCB2YWxpZCwgdG90YWwsIGlzUmVjeWNsZSk7CisKKyAgICByZXR1cm4gaXNSZWN5Y2xlOworfQorCitpbnQzMl90IEFIRVZDQXNzZW1ibGVyOjpkZWxldGVVbml0VW5kZXJTZXEoUXVldWUgKnF1ZXVlLCB1aW50MzJfdCBzZXEpIHsKKyAgICBpbnQzMl90IGluaXRTaXplID0gcXVldWUtPnNpemUoKTsKKyAgICBRdWV1ZTo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIGlmICgodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpID49IHNlcSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpLCBpdCk7CisgICAgcmV0dXJuIGluaXRTaXplIC0gcXVldWUtPnNpemUoKTsKK30KKworaW5saW5lIHZvaWQgQUhFVkNBc3NlbWJsZXI6OnByaW50Tm93VGltZVVzKGludDY0X3Qgc3RhcnQsIGludDY0X3Qgbm93LCBpbnQ2NF90IHBsYXkpIHsKKyAgICBBTE9HRCgic3RhcnQ9JWxsZCwgbm93PSVsbGQsIHBsYXllZD0lbGxkIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpc3RhcnQsIChsb25nIGxvbmcpbm93LCAobG9uZyBsb25nKXBsYXkpOworfQorCitpbmxpbmUgdm9pZCBBSEVWQ0Fzc2VtYmxlcjo6cHJpbnRSVFBUaW1lKHVpbnQzMl90IHJ0cCwgaW50NjRfdCBwbGF5LCB1aW50MzJfdCBleHAsIGJvb2wgaXNFeHApIHsKKyAgICBBTE9HRCgicnRwLXRpbWUoSkIpPSV1LCBwbGF5ZWQtcnRwLXRpbWUoSkIpPSVsbGQsIGV4cGlyZWQtcnRwLXRpbWUoSkIpPSV1IGlzRXhwaXJlZD0lZCIsCisgICAgICAgICAgICBydHAsIChsb25nIGxvbmcpcGxheSwgZXhwLCBpc0V4cCk7Cit9CisKKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUhFVkNBc3NlbWJsZXI6OmFzc2VtYmxlTW9yZSgKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1cyA9IGFkZE5BTFVuaXQoc291cmNlKTsKKyAgICBpZiAoc3RhdHVzID09IE1BTEZPUk1FRF9QQUNLRVQpIHsKKyAgICAgICAgdWludDY0X3QgbXNlY3NTaW5jZUxhc3RJRnJhbWUgPSAoQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDApIC0gbUxhc3RJRnJhbWVQcm92aWRlZEF0TXM7CisgICAgICAgIGlmIChtc2Vjc1NpbmNlTGFzdElGcmFtZSA+IDEwMDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXF1ZXN0IEZJUiB0byBnZXQgYSBuZXcgSS1GcmFtZSwgdGltZSBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICJsYXN0IEktRnJhbWUgaW4gJWxsdSBtcyIsICh1bnNpZ25lZCBsb25nIGxvbmcpbXNlY3NTaW5jZUxhc3RJRnJhbWUpOworICAgICAgICAgICAgc291cmNlLT5vbklzc3VlRklSQnlBc3NlbWJsZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEFIRVZDQXNzZW1ibGVyOjpwYWNrZXRMb3N0KCkgeworICAgIENIRUNLKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKTsKKyAgICBBTE9HRCgicGFja2V0TG9zdCAoZXhwZWN0ZWQgJXUpIiwgbU5leHRFeHBlY3RlZFNlcU5vKTsKKworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworfQorCit2b2lkIEFIRVZDQXNzZW1ibGVyOjpvbkJ5ZVJlY2VpdmVkKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5TXNnLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZjMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfSEVWQ19BU1NFTUJMRVJfSF8KKworI2RlZmluZSBBX0hFVkNfQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFNZXNzYWdlOworCitzdHJ1Y3QgQUhFVkNBc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CisgICAgQUhFVkNBc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdHlwZWRlZiBMaXN0PHNwPEFCdWZmZXI+ID4gUXVldWU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BSEVWQ0Fzc2VtYmxlcigpOworCisgICAgdmlydHVhbCBBc3NlbWJseVN0YXR1cyBhc3NlbWJsZU1vcmUoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCB2b2lkIG9uQnllUmVjZWl2ZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFja2V0TG9zdCgpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5TXNnOworCisgICAgdWludDMyX3QgbUFjY2Vzc1VuaXRSVFBUaW1lOworICAgIGJvb2wgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQ7CisgICAgdWludDMyX3QgbU5leHRFeHBlY3RlZFNlcU5vOworICAgIGJvb2wgbUFjY2Vzc1VuaXREYW1hZ2VkOworICAgIGJvb2wgbUZpcnN0SUZyYW1lUHJvdmlkZWQ7CisgICAgdWludDY0X3QgbUxhc3RJRnJhbWVQcm92aWRlZEF0TXM7CisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtTkFMVW5pdHM7CisKKyAgICBpbnQzMl90IGFkZE5hY2soY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBjaGVja1Nwc1VwZGF0ZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCBjaGVja0lGcmFtZVByb3ZpZGVkKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIGJvb2wgZHJvcEZyYW1lc1VudGlsSWZyYW1lKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIEFzc2VtYmx5U3RhdHVzIGFkZE5BTFVuaXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBhZGRTaW5nbGVOQUxVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIEFzc2VtYmx5U3RhdHVzIGFkZEZyYWdtZW50ZWROQUxVbml0KExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUpOworICAgIGJvb2wgYWRkU2luZ2xlVGltZUFnZ3JlZ2F0aW9uUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CisKKyAgICBpbnQzMl90IHBpY2tQcm9wZXJTZXEoY29uc3QgUXVldWUgKnF1ZXVlLCB1aW50MzJfdCBqaXQsIGludDY0X3QgcGxheSk7CisgICAgYm9vbCByZWN5Y2xlVW5pdCh1aW50MzJfdCBzdGFydCwgdWludDMyX3QgZW5kLCB1aW50MzJfdCBjb25uZWNldGVkLAorICAgICAgICAgICAgIHNpemVfdCBhdmFpbCwgZmxvYXQgZ29vZFJhdGlvKTsKKyAgICBpbnQzMl90IGRlbGV0ZVVuaXRVbmRlclNlcShRdWV1ZSAqcXVldWUsIHVpbnQzMl90IHNlcSk7CisgICAgdm9pZCBwcmludE5vd1RpbWVVcyhpbnQ2NF90IHN0YXJ0LCBpbnQ2NF90IG5vdywgaW50NjRfdCBwbGF5KTsKKyAgICB2b2lkIHByaW50UlRQVGltZSh1aW50MzJfdCBydHAsIGludDY0X3QgcGxheSwgdWludDMyX3QgZXhwLCBib29sIGlzRXhwKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFIRVZDQXNzZW1ibGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9IRVZDX0FTU0VNQkxFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKaW5kZXggNTc0YmQ3YS4uOGY0ZGY4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC00NTQsNiArNDU0LDE3IEBACiAKICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CiAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjY1LyIsIDUpKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmICghc2Vzc2lvbkRlc2MtPmdldERpbWVuc2lvbnMoaW5kZXgsIFBULCAmd2lkdGgsICZoZWlnaHQpKSB7CisgICAgICAgICAgICB3aWR0aCA9IC0xOworICAgICAgICAgICAgaGVpZ2h0ID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjMtMjAwMC8iLCAxMCkKICAgICAgICAgICAgIHx8ICFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjMtMTk5OC8iLCAxMCkpIHsKICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKaW5kZXggYmVmYzIyNi4uNTJhYTNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgIkFSVFBBc3NlbWJsZXIiCiAjaW5jbHVkZSAiQVJUUEFzc2VtYmxlci5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0yMSwxMiArMjIsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQVJUUEFzc2VtYmxlcjo6QVJUUEFzc2VtYmxlcigpCi0gICAgOiBtRmlyc3RGYWlsdXJlVGltZVVzKC0xKSB7CisgICAgOiBtU2hvd1F1ZXVlQ250KDApLAorICAgICAgbUZpcnN0RmFpbHVyZVRpbWVVcygtMSkgeworICAgIG1TaG93UXVldWUgPSBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0LnJ0cCIsIGZhbHNlKTsKIH0KIAogdm9pZCBBUlRQQXNzZW1ibGVyOjpvblBhY2tldFJlY2VpdmVkKGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKQEAgLTE0MSw0ICsxNDYsMTUgQEAKICAgICByZXR1cm4gYWNjZXNzVW5pdDsKIH0KIAordm9pZCBBUlRQQXNzZW1ibGVyOjpzaG93Q3VycmVudFF1ZXVlKExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUpIHsKKyAgICBBU3RyaW5nIHRlbXAoIlF1ZXVlIGVsZW0gc2l6ZSA6ICIpOworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIHRlbXAuYXBwZW5kKCgqaXQpLT5zaXplKCkpOworICAgICAgICB0ZW1wLmFwcGVuZCgiICBcdCIpOworICAgICAgICBpdCsrOworICAgIH0KKyAgICBBTE9HRCgiJXMiLHRlbXAuY19zdHIoKSk7Cit9OworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaAppbmRleCA0MDgyZDRjLi4xOTFmMDhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaApAQCAtNTYsNiArNTYsMTEgQEAKICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gTWFrZUNvbXBvdW5kRnJvbVBhY2tldHMoCiAgICAgICAgICAgICBjb25zdCBMaXN0PHNwPEFCdWZmZXI+ID4gJmZyYW1lcyk7CiAKKyAgICB2b2lkIHNob3dDdXJyZW50UXVldWUoTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSk7CisKKyAgICBib29sIG1TaG93UXVldWU7CisgICAgaW50MzJfdCBtU2hvd1F1ZXVlQ250OworCiBwcml2YXRlOgogICAgIGludDY0X3QgbUZpcnN0RmFpbHVyZVRpbWVVczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcAppbmRleCA2YTQ3MDZkLi5mNTcwNzdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcApAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tdWx0aW5ldHdvcmsuaD4KKwogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KIApAQCAtNTMsNiArNTUsNyBAQAogY29uc3QgaW50NjRfdCBBUlRQQ29ubmVjdGlvbjo6a1NlbGVjdFRpbWVvdXRVcyA9IDEwMDBMTDsKIAogc3RydWN0IEFSVFBDb25uZWN0aW9uOjpTdHJlYW1JbmZvIHsKKyAgICBib29sIGlzSVB2NjsKICAgICBpbnQgbVJUUFNvY2tldDsKICAgICBpbnQgbVJUQ1BTb2NrZXQ7CiAgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gbVNlc3Npb25EZXNjOwpAQCAtNjMsMTQgKzY2LDIxIEBACiAgICAgaW50NjRfdCBtTnVtUlRDUFBhY2tldHNSZWNlaXZlZDsKICAgICBpbnQ2NF90IG1OdW1SVFBQYWNrZXRzUmVjZWl2ZWQ7CiAgICAgc3RydWN0IHNvY2thZGRyX2luIG1SZW1vdGVSVENQQWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IG1SZW1vdGVSVENQQWRkcjY7CiAKICAgICBib29sIG1Jc0luamVjdGVkOworCisgICAgLy8gUlRDUCBFeHRlbnNpb24gZm9yIENWTworICAgIGludCBtQ1ZPRXh0TWFwOyAvLyB3aWxsIGJlIHNldCB0byAwIGlmIGN2byBpcyBub3QgbmVnb3RpYXRlZCBpbiBzZHAKIH07CiAKIEFSVFBDb25uZWN0aW9uOjpBUlRQQ29ubmVjdGlvbih1aW50MzJfdCBmbGFncykKICAgICA6IG1GbGFncyhmbGFncyksCiAgICAgICBtUG9sbEV2ZW50UGVuZGluZyhmYWxzZSksCi0gICAgICBtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzKC0xKSB7CisgICAgICBtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzKC0xKSwKKyAgICAgIG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcygtMSksCisgICAgICBtVGFyZ2V0Qml0cmF0ZSgtMSksCisgICAgICBtSmJUaW1lTXMoMzAwKSB7CiB9CiAKIEFSVFBDb25uZWN0aW9uOjp+QVJUUENvbm5lY3Rpb24oKSB7CkBAIC0xNDUsNiArMTU1LDExNyBAQAogICAgIFRSRVNQQVNTKCk7CiB9CiAKKy8vIHN0YXRpYwordm9pZCBBUlRQQ29ubmVjdGlvbjo6TWFrZVJUUFNvY2tldFBhaXIoCisgICAgICAgIGludCAqcnRwU29ja2V0LCBpbnQgKnJ0Y3BTb2NrZXQsIGNvbnN0IGNoYXIgKmxvY2FsSXAsIGNvbnN0IGNoYXIgKnJlbW90ZUlwLAorICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIHVuc2lnbmVkIHJlbW90ZVBvcnQsIGludDY0X3Qgc29ja2V0TmV0d29yaykgeworICAgIGJvb2wgaXNJUHY2ID0gZmFsc2U7CisgICAgaWYgKHN0cmNocihsb2NhbElwLCAnOicpICE9IE5VTEwpCisgICAgICAgIGlzSVB2NiA9IHRydWU7CisKKyAgICAqcnRwU29ja2V0ID0gc29ja2V0KGlzSVB2NiA/IEFGX0lORVQ2IDogQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UoKnJ0cFNvY2tldCwgMCk7CisKKyAgICBidW1wU29ja2V0QnVmZmVyU2l6ZSgqcnRwU29ja2V0KTsKKworICAgICpydGNwU29ja2V0ID0gc29ja2V0KGlzSVB2NiA/IEFGX0lORVQ2IDogQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UoKnJ0Y3BTb2NrZXQsIDApOworCisgICAgaWYgKHNvY2tldE5ldHdvcmsgIT0gMCkgeworICAgICAgICBBTE9HRCgidHJ5aW5nIHRvIGJpbmQgcnRwIHNvY2tldCglZCkgdG8gbmV0d29yayglbGx1KS4iLAorICAgICAgICAgICAgICAgICpydHBTb2NrZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpc29ja2V0TmV0d29yayk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGFuZHJvaWRfc2V0c29ja25ldHdvcmsoKG5ldF9oYW5kbGVfdClzb2NrZXROZXR3b3JrLCAqcnRwU29ja2V0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkKCVkKSB0byBiaW5kIHJ0cCBzb2NrZXQoJWQpIHRvIG5ldHdvcmsoJWxsdSkiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQsICpydHBTb2NrZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpc29ja2V0TmV0d29yayk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYW5kcm9pZF9zZXRzb2NrbmV0d29yaygobmV0X2hhbmRsZV90KXNvY2tldE5ldHdvcmssICpydGNwU29ja2V0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkKCVkKSB0byBiaW5kIHJ0Y3Agc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCAqcnRjcFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZylzb2NrZXROZXR3b3JrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1bXBTb2NrZXRCdWZmZXJTaXplKCpydGNwU29ja2V0KTsKKworICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjQ7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBhZGRyNjsKKworICAgIGlmIChpc0lQdjYpIHsKKyAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjY7CisgICAgICAgIG1lbXNldCgmYWRkcjYsIDAsIHNpemVvZihhZGRyNikpOworICAgICAgICBhZGRyNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBpbmV0X3B0b24oQUZfSU5FVDYsIGxvY2FsSXAsICZhZGRyNi5zaW42X2FkZHIpOworICAgICAgICBhZGRyNi5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpbG9jYWxQb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyNDsKKyAgICAgICAgbWVtc2V0KCZhZGRyNCwgMCwgc2l6ZW9mKGFkZHI0KSk7CisgICAgICAgIGFkZHI0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBhZGRyNC5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIobG9jYWxJcCk7CisgICAgICAgIGFkZHI0LnNpbl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KWxvY2FsUG9ydCk7CisgICAgfQorCisgICAgaW50IHNvY2tvcHQgPSAxOworICAgIHNldHNvY2tvcHQoKnJ0cFNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoaW50ICopJnNvY2tvcHQsIHNpemVvZihzb2Nrb3B0KSk7CisgICAgc2V0c29ja29wdCgqcnRjcFNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoaW50ICopJnNvY2tvcHQsIHNpemVvZihzb2Nrb3B0KSk7CisKKyAgICBpbnQgc2l6ZVNvY2tTdCA9IGlzSVB2NiA/IHNpemVvZihhZGRyNikgOiBzaXplb2YoYWRkcjQpOworCisgICAgaWYgKGJpbmQoKnJ0cFNvY2tldCwgYWRkciwgc2l6ZVNvY2tTdCkgPT0gMCkgeworICAgICAgICBBTE9HSSgicnRwIHNvY2tldCBzdWNjZXNzZnVsbHkgYmluZGVkLiBhZGRyPSVzOiVkIiwgbG9jYWxJcCwgbG9jYWxQb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGJpbmQgcnRwIHNvY2tldCBhZGRyPSVzOiVkIGVycj0lcyIsIGxvY2FsSXAsIGxvY2FsUG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc0lQdjYpCisgICAgICAgIGFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKGxvY2FsUG9ydCArIDEpOworICAgIGVsc2UKKyAgICAgICAgYWRkcjQuc2luX3BvcnQgPSBodG9ucyhsb2NhbFBvcnQgKyAxKTsKKworICAgIGlmIChiaW5kKCpydGNwU29ja2V0LCBhZGRyLCBzaXplU29ja1N0KSA9PSAwKSB7CisgICAgICAgIEFMT0dJKCJydGNwIHNvY2tldCBzdWNjZXNzZnVsbHkgYmluZGVkLiBhZGRyPSVzOiVkIiwgbG9jYWxJcCwgbG9jYWxQb3J0ICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBiaW5kIHJ0Y3Agc29ja2V0IGFkZHI9JXM6JWQgZXJyPSVzIiwgbG9jYWxJcCwKKyAgICAgICAgICAgICAgICBsb2NhbFBvcnQgKyAxLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIC8vIFJlIHVzZXMgYWRkciB2YXJpYWJsZSBhcyByZW1vdGUgYWRkci4KKyAgICBpZiAoaXNJUHY2KSB7CisgICAgICAgIG1lbXNldCgmYWRkcjYsIDAsIHNpemVvZihhZGRyNikpOworICAgICAgICBhZGRyNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBpbmV0X3B0b24oQUZfSU5FVDYsIHJlbW90ZUlwLCAmYWRkcjYuc2luNl9hZGRyKTsKKyAgICAgICAgYWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KXJlbW90ZVBvcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldCgmYWRkcjQsIDAsIHNpemVvZihhZGRyNCkpOworICAgICAgICBhZGRyNC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgYWRkcjQuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKHJlbW90ZUlwKTsKKyAgICAgICAgYWRkcjQuc2luX3BvcnQgPSBodG9ucygodWludDE2X3QpcmVtb3RlUG9ydCk7CisgICAgfQorICAgIGlmIChjb25uZWN0KCpydHBTb2NrZXQsIGFkZHIsIHNpemVTb2NrU3QpID09IDApIHsKKyAgICAgICAgQUxPR0koInJ0cCBzb2NrZXQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byByZW1vdGU9JXM6JWQiLCByZW1vdGVJcCwgcmVtb3RlUG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjb25uZWN0IHJ0cCBzb2NrZXQgdG8gcmVtb3RlIGFkZHI9JXM6JWQgZXJyPSVzIiwgcmVtb3RlSXAsCisgICAgICAgICAgICAgICAgcmVtb3RlUG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc0lQdjYpCisgICAgICAgIGFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQgKyAxKTsKKyAgICBlbHNlCisgICAgICAgIGFkZHI0LnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCArIDEpOworCisgICAgaWYgKGNvbm5lY3QoKnJ0Y3BTb2NrZXQsIGFkZHIsIHNpemVTb2NrU3QpID09IDApIHsKKyAgICAgICAgQUxPR0koInJ0Y3Agc29ja2V0IHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gcmVtb3RlPSVzOiVkIiwgcmVtb3RlSXAsIHJlbW90ZVBvcnQgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNvbm5lY3QgcnRjcCBzb2NrZXQgYWRkcj0lczolZCBlcnI9JXMiLCByZW1vdGVJcCwKKyAgICAgICAgICAgICAgICByZW1vdGVQb3J0ICsgMSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwogdm9pZCBBUlRQQ29ubmVjdGlvbjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRBZGRTdHJlYW06CkBAIC0yMDQsNiArMzI1LDE5IEBACiAgICAgaW5mby0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPSAwOwogICAgIGluZm8tPm1OdW1SVFBQYWNrZXRzUmVjZWl2ZWQgPSAwOwogICAgIG1lbXNldCgmaW5mby0+bVJlbW90ZVJUQ1BBZGRyLCAwLCBzaXplb2YoaW5mby0+bVJlbW90ZVJUQ1BBZGRyKSk7CisgICAgbWVtc2V0KCZpbmZvLT5tUmVtb3RlUlRDUEFkZHI2LCAwLCBzaXplb2YoaW5mby0+bVJlbW90ZVJUQ1BBZGRyNikpOworCisgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gc2Vzc2lvbkRlc2MgPSBpbmZvLT5tU2Vzc2lvbkRlc2M7CisgICAgaW5mby0+bUNWT0V4dE1hcCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzZXNzaW9uRGVzYy0+Y291bnRUcmFja3MoKTsgKytpKSB7CisgICAgICAgIGludDMyX3QgY3ZvRXh0TWFwOworICAgICAgICBpZiAoc2Vzc2lvbkRlc2MtPmdldEN2b0V4dE1hcChpLCAmY3ZvRXh0TWFwKSkgeworICAgICAgICAgICAgaW5mby0+bUNWT0V4dE1hcCA9IGN2b0V4dE1hcDsKKyAgICAgICAgICAgIEFMT0dJKCJ1cm46M2dwcDp2aWRlby1vcmllbnRhdGlvbihjdm8pIGZvdW5kIGFzIGV4dG1hcDolZCIsIGluZm8tPm1DVk9FeHRNYXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0koInVybjozZ3BwOnZpZGVvLW9yaWVudGF0aW9uKGN2bykgbm90IGZvdW5kIDolZCIsIGluZm8tPm1DVk9FeHRNYXApOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKCFpbmplY3RlZCkgewogICAgICAgICBwb3N0UG9sbEV2ZW50KCk7CkBAIC0yOTUsMTcgKzQyOSw0MyBAQAogCiAgICAgICAgICAgICBpZiAoZXJyID09IC1FQ09OTlJFU0VUKSB7CiAgICAgICAgICAgICAgICAgLy8gc29ja2V0IGZhaWx1cmUsIHRoaXMgc3RyZWFtIGlzIGRlYWQsIEppbS4KKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gaXQtPm1Ob3RpZnlNc2ctPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtZXZlbnQiLCAxKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCA0MDApOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZlZWRiYWNrLXR5cGUiLCAxKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZW5kZXIiLCBpdC0+bVNvdXJjZXMudmFsdWVBdCgwKS0+Z2V0U2VsZklEKCkpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byByZWNlaXZlIFJUUC9SVENQIGRhdGFncmFtLiIpOwogICAgICAgICAgICAgICAgIGl0ID0gbVN0cmVhbXMuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBhZGQgTkFDSyBhbmQgRklSIHRoYXQgbmVlZHMgdG8gYmUgc2VudCBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXQtPm1Tb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgY250ID0gaXQtPm1Tb3VyY2VzLnZhbHVlQXQoaSktPmFkZE5BQ0soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoY250ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2VuZCBOQUNLIGZvciBsb3N0ICVkIFBhY2tldHMiLCBjbnQpOworICAgICAgICAgICAgICAgICAgICBzZW5kKCYqaXQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBpdC0+bVNvdXJjZXMudmFsdWVBdChpKS0+YWRkRklSKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiU2VuZCBGSVIgaW1tZWRpYXRlbHkgZm9yIGxvc3QgUGFja2V0cyIpOworICAgICAgICAgICAgICAgICAgICBzZW5kKCYqaXQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICArK2l0OwogICAgICAgICB9CiAgICAgfQogCiAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgY2hlY2tSeEJpdHJhdGUobm93VXMpOworCiAgICAgaWYgKG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXMgPD0gMAogICAgICAgICAgICAgfHwgbUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcyArIDUwMDAwMDBMTCA8PSBub3dVcykgewogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihrTWF4VURQU2l6ZSk7CkBAIC0zNDAsMTMgKzUwMCw3IEBACiAgICAgICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlNlbmRpbmcgUlIuLi4iKTsKIAotICAgICAgICAgICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIG4gPSBzZW5kdG8oCi0gICAgICAgICAgICAgICAgICAgICAgICBzLT5tUlRDUFNvY2tldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZzLT5tUmVtb3RlUlRDUEFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+bVJlbW90ZVJUQ1BBZGRyKSk7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHNlbmQocywgYnVmZmVyKTsKIAogICAgICAgICAgICAgICAgIGlmIChuIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBzZW5kIFJUQ1AgcmVjZWl2ZXIgcmVwb3J0ICglcykuIiwKQEAgLTM3Nyw5ICs1MzEsMjIgQEAKIAogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDY1NTM2KTsKIAorICAgIHN0cnVjdCBzb2NrYWRkciAqcFJlbW90ZVJUQ1BBZGRyOworICAgIGludCBzaXplU29ja1N0OworICAgIGlmIChzLT5pc0lQdjYpIHsKKyAgICAgICAgcFJlbW90ZVJUQ1BBZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5tUmVtb3RlUlRDUEFkZHI2OworICAgICAgICBzaXplU29ja1N0ID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBSZW1vdGVSVENQQWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmcy0+bVJlbW90ZVJUQ1BBZGRyOworICAgICAgICBzaXplU29ja1N0ID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisgICAgfQogICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0KICAgICAgICAgKCFyZWNlaXZlUlRQICYmIHMtPm1OdW1SVENQUGFja2V0c1JlY2VpdmVkID09IDApCi0gICAgICAgICAgICA/IHNpemVvZihzLT5tUmVtb3RlUlRDUEFkZHIpIDogMDsKKyAgICAgICAgICAgID8gc2l6ZVNvY2tTdCA6IDA7CisKKyAgICBpZiAobUZsYWdzICYga1ZpTFRFQ29ubmVjdGlvbikgeworICAgICAgICByZW1vdGVBZGRyTGVuID0gMDsKKyAgICB9CiAKICAgICBzc2l6ZV90IG5ieXRlczsKICAgICBkbyB7CkBAIC0zODgsOCArNTU1LDkgQEAKICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLAogICAgICAgICAgICAgYnVmZmVyLT5jYXBhY2l0eSgpLAogICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIHJlbW90ZUFkZHJMZW4gPiAwID8gKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5tUmVtb3RlUlRDUEFkZHIgOiBOVUxMLAorICAgICAgICAgICAgcmVtb3RlQWRkckxlbiA+IDAgPyBwUmVtb3RlUlRDUEFkZHIgOiBOVUxMLAogICAgICAgICAgICAgcmVtb3RlQWRkckxlbiA+IDAgPyAmcmVtb3RlQWRkckxlbiA6IE5VTEwpOworICAgICAgICBtQ3VtdWxhdGl2ZUJ5dGVzICs9IG5ieXRlczsKICAgICB9IHdoaWxlIChuYnl0ZXMgPCAwICYmIGVycm5vID09IEVJTlRSKTsKIAogICAgIGlmIChuYnl0ZXMgPD0gMCkgewpAQCAtNDEwLDYgKzU3OCwzNiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3NzaXplX3QgQVJUUENvbm5lY3Rpb246OnNlbmQoY29uc3QgU3RyZWFtSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gYnVmZmVyKSB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkciogcFJlbW90ZVJUQ1BBZGRyOworICAgICAgICBpbnQgc2l6ZVNvY2tTdDsKKworICAgICAgICAvKiBJdCBzZWVtcyB0aGlzIGlzSVB2NiB2YXJpYWJsZSBpcyB1c2VsZXNzLgorICAgICAgICAgKiBXZSBzaG91bGQgcmVtb3ZlIGl0IHRvIHByZXZlbnQgY29uZnVzaW9uICovCisgICAgICAgIGlmIChpbmZvLT5pc0lQdjYpIHsKKyAgICAgICAgICAgIHBSZW1vdGVSVENQQWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmaW5mby0+bVJlbW90ZVJUQ1BBZGRyNjsKKyAgICAgICAgICAgIHNpemVTb2NrU3QgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUmVtb3RlUlRDUEFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJmluZm8tPm1SZW1vdGVSVENQQWRkcjsKKyAgICAgICAgICAgIHNpemVTb2NrU3QgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRmxhZ3MgJiBrVmlMVEVDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBBTE9HVigiVmlMVEUgUlRDUCIpOworICAgICAgICAgICAgcFJlbW90ZVJUQ1BBZGRyID0gTlVMTDsKKyAgICAgICAgICAgIHNpemVTb2NrU3QgPSAwOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBuOworICAgICAgICBkbyB7CisgICAgICAgICAgICBuID0gc2VuZHRvKAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5tUlRDUFNvY2tldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCAwLAorICAgICAgICAgICAgICAgICAgICBwUmVtb3RlUlRDUEFkZHIsIHNpemVTb2NrU3QpOworICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICAgICAgcmV0dXJuIG47Cit9CisKIHN0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVJUUChTdHJlYW1JbmZvICpzLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaWYgKHMtPm1OdW1SVFBQYWNrZXRzUmVjZWl2ZWQrKyA9PSAwKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBzLT5tTm90aWZ5TXNnLT5kdXAoKTsKQEAgLTQzMSw2ICs2MjksMTEgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIGlmICgoZGF0YVsxXSAmIDB4N2YpID09IDIwIC8qIGRlY2ltYWwgKi8pIHsKKyAgICAgICAgLy8gVW5hc3NpZ25lZCBwYXlsb2FkIHR5cGUKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwogICAgIGlmIChkYXRhWzBdICYgMHgyMCkgewogICAgICAgICAvLyBQYWRkaW5nIHByZXNlbnQuCiAKQEAgLTQ1NCw2ICs2NTcsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCisgICAgaW50MzJfdCBjdm9EZWdyZWVzID0gLTE7CiAgICAgaWYgKGRhdGFbMF0gJiAweDEwKSB7CiAgICAgICAgIC8vIEhlYWRlciBlWHRlbnNpb24gcHJlc2VudC4KIApAQCAtNDczLDYgKzY3Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAorICAgICAgICBwYXJzZVJUUEV4dChzLCAoY29uc3QgdWludDhfdCAqKWV4dGVuc2lvbkRhdGEsIGV4dGVuc2lvbkxlbmd0aCwgJmN2b0RlZ3JlZXMpOwogICAgICAgICBwYXlsb2FkT2Zmc2V0ICs9IDQgKyBleHRlbnNpb25MZW5ndGg7CiAgICAgfQogCkBAIC00ODcsNiArNjkyLDggQEAKICAgICBtZXRhLT5zZXRJbnQzMigicnRwLXRpbWUiLCBydHBUaW1lKTsKICAgICBtZXRhLT5zZXRJbnQzMigiUFQiLCBkYXRhWzFdICYgMHg3Zik7CiAgICAgbWV0YS0+c2V0SW50MzIoIk0iLCBkYXRhWzFdID4+IDcpOworICAgIGlmIChjdm9EZWdyZWVzID49IDApCisgICAgICAgIG1ldGEtPnNldEludDMyKCJjdm8iLCBjdm9EZWdyZWVzKTsKIAogICAgIGJ1ZmZlci0+c2V0SW50MzJEYXRhKHUxNmF0KCZkYXRhWzJdKSk7CiAgICAgYnVmZmVyLT5zZXRSYW5nZShwYXlsb2FkT2Zmc2V0LCBzaXplIC0gcGF5bG9hZE9mZnNldCk7CkBAIC00OTYsMTEgKzcwMyw2NSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUlRQRXh0KFN0cmVhbUluZm8gKnMsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmV4dEhlYWRlciwgc2l6ZV90IGV4dExlbiwgaW50MzJfdCAqY3ZvRGVncmVlcykgeworICAgIGlmIChleHRMZW4gPCA0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB1aW50MTZfdCBoZWFkZXIgPSAoZXh0SGVhZGVyWzBdIDw8IDgpIHwgKGV4dEhlYWRlclsxXSk7CisgICAgYm9vbCBpc09uZWJ5dGVIZWFkZXIgPSBmYWxzZTsKKworICAgIGlmIChoZWFkZXIgPT0gMHhCRURFKSB7CisgICAgICAgIGlzT25lYnl0ZUhlYWRlciA9IHRydWU7CisgICAgfSBlbHNlIGlmIChoZWFkZXIgPT0gMHgxMDAwKSB7CisgICAgICAgIEFMT0dXKCJwYXJzZVJUUEV4dDogdHdvLWJ5dGUgaGVhZGVyIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJwYXJzZVJUUEV4dDogY2FuIG5vdCByZWNvZ25pemUgaGVhZGVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpleHRQYXlsb2FkID0gZXh0SGVhZGVyICsgNDsKKyAgICBleHRMZW4gLT0gNDsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsgLy9zdGFydCBmcm9tIGZpcnN0IHBheWxvYWQgb2YgcnRwIGV4dGVuc2lvbi4KKyAgICAvLyBvbmUtYnl0ZSBoZWFkZXIgcGFyc2VyCisgICAgd2hpbGUgKGlzT25lYnl0ZUhlYWRlciAmJiBvZmZzZXQgPCBleHRMZW4pIHsKKyAgICAgICAgdWludDhfdCBleHRtYXBJZCA9IGV4dFBheWxvYWRbb2Zmc2V0XSA+PiA0OworICAgICAgICB1aW50OF90IGxlbmd0aCA9IChleHRQYXlsb2FkW29mZnNldF0gJiAweEYpICsgMTsKKyAgICAgICAgb2Zmc2V0Kys7CisKKyAgICAgICAgLy8gcGFkZGluZyBjYXNlCisgICAgICAgIGlmIChleHRtYXBJZCA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgdWludDhfdCBkYXRhWzE2XTsgLy8gbWF4aW11bSBsZW5ndGggdmFsdWUKKyAgICAgICAgZm9yICh1aW50OF90IGogPSAwOyBvZmZzZXQgKyBqIDw9IGV4dExlbiAmJiBqIDwgbGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIGRhdGFbal0gPSBleHRQYXlsb2FkW29mZnNldCArIGpdOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aDsKKworICAgICAgICBpZiAoZXh0bWFwSWQgPT0gcy0+bUNWT0V4dE1hcCkgeworICAgICAgICAgICAgKmN2b0RlZ3JlZXMgPSAoaW50MzJfdClkYXRhWzBdOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKwogc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUlRDUChTdHJlYW1JbmZvICpzLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaWYgKHMtPm1OdW1SVENQUGFja2V0c1JlY2VpdmVkKysgPT0gMCkgewogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gcy0+bU5vdGlmeU1zZy0+ZHVwKCk7CiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZpcnN0LXJ0Y3AiLCB0cnVlKTsKICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgQUxPR0koInNlbmQgZmlyc3QtcnRjcCBldmVudCB0byB1cHBlciBsYXllciBhcyBJbXNSeE5vdGljZSIpOworICAgICAgICBzcDxBTWVzc2FnZT4gaW1zTm90aWZ5ID0gcy0+bU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgICAgIGltc05vdGlmeS0+c2V0SW50MzIoInJ0Y3AtZXZlbnQiLCAxKTsKKyAgICAgICAgaW1zTm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgMTAxKTsKKyAgICAgICAgaW1zTm90aWZ5LT5zZXRJbnQzMigiZmVlZGJhY2stdHlwZSIsIDApOworICAgICAgICBpbXNOb3RpZnktPnBvc3QoKTsKICAgICB9CiAKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CkBAIC01NTEsOCArODEyLDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgMjA1OiAgLy8gVFNGQiAodHJhbnNwb3J0IGxheWVyIHNwZWNpZmljIGZlZWRiYWNrKQorICAgICAgICAgICAgICAgIHBhcnNlVFNGQihzLCBkYXRhLCBoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyMDY6ICAvLyBQU0ZCIChwYXlsb2FkIHNwZWNpZmljIGZlZWRiYWNrKQogICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwYXJzZVBTRkIocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiUlRDUCBwYWNrZXQgdHlwZSAldSBvZiBzaXplICV6dSIsICh1bnNpZ25lZClkYXRhWzFdLCBoZWFkZXJMZW5ndGgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIDIwMzoKQEAgLTYyMSw2ICs4ODYsMTQ0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVRTRkIoCisgICAgICAgIFN0cmVhbUluZm8gKnMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPCAxMikgeworICAgICAgICAvLyBicm9rZW4gcGFja2V0CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB1aW50OF90IG1zZ1R5cGUgPSBkYXRhWzBdICYgMHgxZjsKKyAgICB1aW50MzJfdCBpZCA9IHUzMmF0KCZkYXRhWzRdKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9ICZkYXRhWzEyXTsKKyAgICBzaXplIC09IDEyOworCisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBzaXplX3QgRkNJU2l6ZTsKKyAgICBzd2l0Y2gobXNnVHlwZSkgeworICAgICAgICBjYXNlIDE6ICAgICAvLyBHZW5lcmljIE5BQ0sKKyAgICAgICAgeworICAgICAgICAgICAgRkNJU2l6ZSA9IDQ7CisgICAgICAgICAgICB3aGlsZSAoc2l6ZSA+PSBGQ0lTaXplKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgUElEID0gdTE2YXQoJnB0clswXSk7ICAvLyBsb3N0IHBhY2tldCBSVFAgbnVtYmVyCisgICAgICAgICAgICAgICAgdWludDE2X3QgQkxQID0gdTE2YXQoJnB0clsyXSk7ICAvLyBCaXRtYXNrIG9mIGZvbGxvd2luZyBMb3N0IFBhY2tldHMKKworICAgICAgICAgICAgICAgIHNpemUgLT0gRkNJU2l6ZTsKKyAgICAgICAgICAgICAgICBwdHIgKz0gRkNJU2l6ZTsKKworICAgICAgICAgICAgICAgIEFTdHJpbmcgbGlzdF9vZl9sb3N0czsKKyAgICAgICAgICAgICAgICBsaXN0X29mX2xvc3RzLmFwcGVuZChQSUQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MTYgOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19sb3N0ID0gQkxQICYgKDB4MSA8PCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2xvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rfb2ZfbG9zdHMuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9vZl9sb3N0cy5hcHBlbmQoUElEICsgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR0koIk9wcG9uZW50IGxvc3RzIHBhY2tldCBvZiBSVFAgJXMiLCBsaXN0X29mX2xvc3RzLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAzOiAgICAgLy8gVE1NQlIKKyAgICAgICAgY2FzZSA0OiAgICAgLy8gVE1NQk4KKyAgICAgICAgeworICAgICAgICAgICAgRkNJU2l6ZSA9IDg7CisgICAgICAgICAgICB3aGlsZSAoc2l6ZSA+PSBGQ0lTaXplKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgTXhUQlIgPSB1MzJhdCgmcHRyWzRdKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBNeFRCUkV4cCA9IE14VEJSID4+IDI2OworICAgICAgICAgICAgICAgIHVpbnQzMl90IE14VEJSTWFudGlzc2EgPSAoTXhUQlIgPj4gOSkgJiAweDAxRkZGRjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBvdmVyaGVhZCA9IE14VEJSICYgMHgwMUZGOworCisgICAgICAgICAgICAgICAgc2l6ZSAtPSBGQ0lTaXplOworICAgICAgICAgICAgICAgIHB0ciArPSBGQ0lTaXplOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgYml0UmF0ZSA9ICgxIDw8IE14VEJSRXhwKSAqIE14VEJSTWFudGlzc2E7CisKKyAgICAgICAgICAgICAgICBpZiAobXNnVHlwZSA9PSAzKQorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiT3AgLT4gVUUgUmVxIFR4IGJpdHJhdGUgOiAlZCBYIDJeJWQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBNeFRCUk1hbnRpc3NhLCBNeFRCUkV4cCwgYml0UmF0ZSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobXNnVHlwZSA9PSA0KQorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiT1AgLT4gVUUgTm90aSBSeCBiaXRyYXRlIDogJWQgWCAyXiVkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgTXhUQlJNYW50aXNzYSwgTXhUQlJFeHAsIGJpdFJhdGUpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IHMtPm1Ob3RpZnlNc2ctPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtZXZlbnQiLCAxKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCAyMDUpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZlZWRiYWNrLXR5cGUiLCBtc2dUeXBlKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZW5kZXIiLCBpZCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYml0LXJhdGUiLCBiaXRSYXRlKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgib3ZlcmhlYWQgOiAlZCIsIG92ZXJoZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dJKCJOb3Qgc3VwcG9ydGVkIFRTRkIgdHlwZSAlZCIsIG1zZ1R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUFNGQigKKyAgICAgICAgU3RyZWFtSW5mbyAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEyKSB7CisgICAgICAgIC8vIGJyb2tlbiBwYWNrZXQKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHVpbnQ4X3QgbXNnVHlwZSA9IGRhdGFbMF0gJiAweDFmOworICAgIHVpbnQzMl90IGlkID0gdTMyYXQoJmRhdGFbNF0pOworCisgICAgY29uc3QgdWludDhfdCAqcHRyID0gJmRhdGFbMTJdOworICAgIHNpemUgLT0gMTI7CisKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIHN3aXRjaChtc2dUeXBlKSB7CisgICAgICAgIGNhc2UgMTogICAgIC8vIFBpY3R1cmUgTG9zcyBJbmRpY2F0aW9uIChQTEkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIC8vIFBMSSBkb2VzIG5vdCBuZWVkIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gcy0+bU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCAyMDYpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZmVlZGJhY2stdHlwZSIsIG1zZ1R5cGUpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2VuZGVyIiwgaWQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBBTE9HSSgiUExJIGRldGVjdGVkLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSA0OiAgICAgLy8gRnVsbCBJbnRyYSBSZXF1ZXN0IChGSVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgcmVxdWVzdGVkSWQgPSB1MzJhdCgmcHRyWzBdKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRJZCA9PSAodWludDMyX3QpbVNlbGZJRCkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBzLT5tTm90aWZ5TXNnLT5kdXAoKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgMjA2KTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmZWVkYmFjay10eXBlIiwgbXNnVHlwZSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2VuZGVyIiwgaWQpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJGSVIgZGV0ZWN0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HSSgiTm90IHN1cHBvcnRlZCBQU0ZCIHR5cGUgJWQiLCBtc2dUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CiBzcDxBUlRQU291cmNlPiBBUlRQQ29ubmVjdGlvbjo6ZmluZFNvdXJjZShTdHJlYW1JbmZvICppbmZvLCB1aW50MzJfdCBzcmNJZCkgewogICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZTsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5mby0+bVNvdXJjZXMuaW5kZXhPZktleShzcmNJZCk7CkBAIC02MzAsNiArMTAzMywxMiBAQAogICAgICAgICBzb3VyY2UgPSBuZXcgQVJUUFNvdXJjZSgKICAgICAgICAgICAgICAgICBzcmNJZCwgaW5mby0+bVNlc3Npb25EZXNjLCBpbmZvLT5tSW5kZXgsIGluZm8tPm1Ob3RpZnlNc2cpOwogCisgICAgICAgIGlmIChtRmxhZ3MgJiBrVmlMVEVDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBzb3VyY2UtPnNldFBlcmlvZGljRklSKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZS0+c2V0U2VsZklEKG1TZWxmSUQpOworICAgICAgICBzb3VyY2UtPnNldEpiVGltZShtSmJUaW1lTXMgPiAwID8gbUpiVGltZU1zIDogMzAwKTsKICAgICAgICAgaW5mby0+bVNvdXJjZXMuYWRkKHNyY0lkLCBzb3VyY2UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNvdXJjZSA9IGluZm8tPm1Tb3VyY2VzLnZhbHVlQXQoaW5kZXgpOwpAQCAtNjQ1LDYgKzEwNTQsNzIgQEAKICAgICBtc2ctPnBvc3QoKTsKIH0KIAordm9pZCBBUlRQQ29ubmVjdGlvbjo6c2V0U2VsZklEKGNvbnN0IHVpbnQzMl90IHNlbGZJRCkgeworICAgIG1TZWxmSUQgPSBzZWxmSUQ7Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246OnNldEpiVGltZShjb25zdCB1aW50MzJfdCBqYlRpbWVNcykgeworICAgIG1KYlRpbWVNcyA9IGpiVGltZU1zOworfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpzZXRUYXJnZXRCaXRyYXRlKGludDMyX3QgdGFyZ2V0Qml0cmF0ZSkgeworICAgIG1UYXJnZXRCaXRyYXRlID0gdGFyZ2V0Qml0cmF0ZTsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6Y2hlY2tSeEJpdHJhdGUoaW50NjRfdCBub3dVcykgeworICAgIGlmIChtTGFzdEJpdHJhdGVSZXBvcnRUaW1lVXMgPD0gMCkgeworICAgICAgICBtQ3VtdWxhdGl2ZUJ5dGVzID0gMDsKKyAgICAgICAgbUxhc3RCaXRyYXRlUmVwb3J0VGltZVVzID0gbm93VXM7CisgICAgfQorICAgIGVsc2UgaWYgKG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcyArIDEwMDAwMDBsbCA8PSBub3dVcykgeworICAgICAgICBpbnQzMl90IHRpbWVEaWZmID0gKG5vd1VzIC0gbUxhc3RCaXRyYXRlUmVwb3J0VGltZVVzKSAvIDEwMDAwMDBsbDsKKyAgICAgICAgaW50MzJfdCBiaXRyYXRlID0gbUN1bXVsYXRpdmVCeXRlcyAqIDggLyB0aW1lRGlmZjsKKyAgICAgICAgQUxPR0koIkFjdHVhbCBSeCBiaXRyYXRlIDogJWQgYml0cy9zZWMiLCBiaXRyYXRlKTsKKworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihrTWF4VURQU2l6ZSk7CisgICAgICAgIExpc3Q8U3RyZWFtSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbXMuYmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IG1TdHJlYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBTdHJlYW1JbmZvICpzID0gJippdDsKKyAgICAgICAgICAgIGlmIChzLT5tSXNJbmplY3RlZCkgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5tTnVtUlRDUFBhY2tldHNSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBuZXZlciByZWNlaXZlZCBhbnkgUlRDUCBwYWNrZXRzIG9uIHRoaXMgc3RyZWFtLAorICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGV2ZW4ga25vdyB3aGVyZSB0byBzZW5kIGEgcmVwb3J0LgorICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcy0+bVNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBzLT5tU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIHNvdXJjZS0+bm90aWZ5UGt0SW5mbyhiaXRyYXRlLCBub3dVcyk7CisgICAgICAgICAgICAgICAgc291cmNlLT5hZGRUTU1CUihidWZmZXIsIG1UYXJnZXRCaXRyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiU2VuZGluZyBUTU1CUi4uLiIpOworCisgICAgICAgICAgICAgICAgc3NpemVfdCBuID0gc2VuZChzLCBidWZmZXIpOworCisgICAgICAgICAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHNlbmQgUlRDUCBUTU1CUiAoJXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PSAwID8gImNvbm5lY3Rpb24gZ29uZSIgOiBzdHJlcnJvcihlcnJubykpOworCisgICAgICAgICAgICAgICAgICAgIGl0ID0gbVN0cmVhbXMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIG1DdW11bGF0aXZlQnl0ZXMgPSAwOworICAgICAgICBtTGFzdEJpdHJhdGVSZXBvcnRUaW1lVXMgPSBub3dVczsKKyAgICB9Cit9CiB2b2lkIEFSVFBDb25uZWN0aW9uOjpvbkluamVjdFBhY2tldChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDMyX3QgaW5kZXg7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CkBAIC02NzIsNCArMTE0NywzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaAppbmRleCBkNWY3YzJlLi43YzgyMThmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCkBAIC0zMCw2ICszMCw3IEBACiBzdHJ1Y3QgQVJUUENvbm5lY3Rpb24gOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBrUmVndWxhcmx5UmVxdWVzdEZJUiA9IDIsCisgICAgICAgIGtWaUxURUNvbm5lY3Rpb24gPSA0LAogICAgIH07CiAKICAgICBleHBsaWNpdCBBUlRQQ29ubmVjdGlvbih1aW50MzJfdCBmbGFncyA9IDApOwpAQCAtNDQsMTEgKzQ1LDIyIEBACiAKICAgICB2b2lkIGluamVjdFBhY2tldChpbnQgaW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCisgICAgdm9pZCBzZXRTZWxmSUQoY29uc3QgdWludDMyX3Qgc2VsZklEKTsKKyAgICB2b2lkIHNldEpiVGltZShjb25zdCB1aW50MzJfdCBqYlRpbWVNcyk7CisgICAgdm9pZCBzZXRUYXJnZXRCaXRyYXRlKGludDMyX3QgdGFyZ2V0Qml0cmF0ZSk7CisKICAgICAvLyBDcmVhdGVzIGEgcGFpciBvZiBVRFAgZGF0YWdyYW0gc29ja2V0cyBib3VuZCB0byBhZGphY2VudCBwb3J0cwogICAgIC8vICh0aGUgcnRwU29ja2V0IGlzIGJvdW5kIHRvIGFuIGV2ZW4gcG9ydCwgdGhlIHJ0Y3BTb2NrZXQgdG8gdGhlCiAgICAgLy8gbmV4dCBoaWdoZXIgcG9ydCkuCiAgICAgc3RhdGljIHZvaWQgTWFrZVBvcnRQYWlyKAogICAgICAgICAgICAgaW50ICpydHBTb2NrZXQsIGludCAqcnRjcFNvY2tldCwgdW5zaWduZWQgKnJ0cFBvcnQpOworICAgIC8vIENyZWF0ZXMgYSBwYWlyIG9mIFVEUCBkYXRhZ3JhbSBzb2NrZXRzIGJvdW5kIHRvIGFzc2lnbmVkIGlwIGFuZAorICAgIC8vIHBvcnRzICh0aGUgcnRwU29ja2V0IGlzIGJvdW5kIHRvIGFuIGV2ZW4gcG9ydCwgdGhlIHJ0Y3BTb2NrZXQKKyAgICAvLyB0byB0aGUgbmV4dCBoaWdoZXIgcG9ydCkuCisgICAgc3RhdGljIHZvaWQgTWFrZVJUUFNvY2tldFBhaXIoCisgICAgICAgICAgICBpbnQgKnJ0cFNvY2tldCwgaW50ICpydGNwU29ja2V0LAorICAgICAgICAgICAgY29uc3QgY2hhciAqbG9jYWxJcCwgY29uc3QgY2hhciAqcmVtb3RlSXAsCisgICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIHVuc2lnbmVkIHJlbW90ZVBvcnQsIGludDY0X3Qgc29ja2V0TmV0d29yayA9IDApOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QVJUUENvbm5lY3Rpb24oKTsKQEAgLTcxLDE4ICs4MywzMSBAQAogCiAgICAgYm9vbCBtUG9sbEV2ZW50UGVuZGluZzsKICAgICBpbnQ2NF90IG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXM7CisgICAgaW50NjRfdCBtTGFzdEJpdHJhdGVSZXBvcnRUaW1lVXM7CisKKyAgICBpbnQzMl90IG1TZWxmSUQ7CisgICAgaW50MzJfdCBtVGFyZ2V0Qml0cmF0ZTsKKworICAgIHVpbnQzMl90IG1KYlRpbWVNczsKKworICAgIGludDMyX3QgbUN1bXVsYXRpdmVCeXRlczsKIAogICAgIHZvaWQgb25BZGRTdHJlYW0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25SZW1vdmVTdHJlYW0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25Qb2xsU3RyZWFtcygpOwogICAgIHZvaWQgb25JbmplY3RQYWNrZXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25TZW5kUmVjZWl2ZXJSZXBvcnRzKCk7CisgICAgdm9pZCBjaGVja1J4Qml0cmF0ZShpbnQ2NF90IG5vd1VzKTsKIAogICAgIHN0YXR1c190IHJlY2VpdmUoU3RyZWFtSW5mbyAqaW5mbywgYm9vbCByZWNlaXZlUlRQKTsKKyAgICBzc2l6ZV90IHNlbmQoY29uc3QgU3RyZWFtSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gYnVmZmVyKTsKIAogICAgIHN0YXR1c190IHBhcnNlUlRQKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHN0YXR1c190IHBhcnNlUlRQRXh0KFN0cmVhbUluZm8gKnMsIGNvbnN0IHVpbnQ4X3QgKmV4dERhdGEsIHNpemVfdCBleHRMZW4sIGludDMyX3QgKmN2b0RlZ3JlZXMpOwogICAgIHN0YXR1c190IHBhcnNlUlRDUChTdHJlYW1JbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICBzdGF0dXNfdCBwYXJzZVNSKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVRTRkIoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlUFNGQihTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VCWUUoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgc3A8QVJUUFNvdXJjZT4gZmluZFNvdXJjZShTdHJlYW1JbmZvICppbmZvLCB1aW50MzJfdCBpZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcAppbmRleCBmNWY4MTI4Li42MzAzZmM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgIkFBTVJBc3NlbWJsZXIuaCIKICNpbmNsdWRlICJBQVZDQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAiQUhFVkNBc3NlbWJsZXIuaCIKICNpbmNsdWRlICJBSDI2M0Fzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFNUEVHMlRTQXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaCIKQEAgLTM1LDIxICszNiwzMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrU291cmNlSUQgPSAweGRlYWRiZWVmOworc3RhdGljIHVpbnQzMl90IGtTb3VyY2VJRCA9IDB4ZGVhZGJlZWY7CiAKIEFSVFBTb3VyY2U6OkFSVFBTb3VyY2UoCiAgICAgICAgIHVpbnQzMl90IGlkLAogICAgICAgICBjb25zdCBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiAmc2Vzc2lvbkRlc2MsIHNpemVfdCBpbmRleCwKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtSUQoaWQpLAorICAgIDogbUZpcnN0U2VxTnVtYmVyKDApLAorICAgICAgbUZpcnN0UnRwVGltZSgwKSwKKyAgICAgIG1GaXJzdFN5c1RpbWUoMCksCisgICAgICBtQ2xvY2tSYXRlKDApLAorICAgICAgbUpiVGltZU1zKDMwMCksIC8vIGRlZmF1bHQgaml0dGVyIGJ1ZmZlciB0aW1lIGlzIDMwMG1zLgorICAgICAgbUZpcnN0U3NyYygwKSwKKyAgICAgIG1IaWdoZXN0TmFja051bWJlcigwKSwKKyAgICAgIG1JRChpZCksCiAgICAgICBtSGlnaGVzdFNlcU51bWJlcigwKSwKICAgICAgIG1QcmV2RXhwZWN0ZWQoMCksCiAgICAgICBtQmFzZVNlcU51bWJlcigwKSwKICAgICAgIG1OdW1CdWZmZXJzUmVjZWl2ZWQoMCksCiAgICAgICBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZCgwKSwKKyAgICAgIG1QcmV2RXhwZWN0ZWRGb3JSUigwKSwKKyAgICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkRm9yUlIoMCksCiAgICAgICBtTGFzdE5UUFRpbWUoMCksCiAgICAgICBtTGFzdE5UUFRpbWVVcGRhdGVVcygwKSwKICAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzKGZhbHNlKSwKKyAgICAgIG1Jc3N1ZUZJUkJ5QXNzZW1ibGVyKGZhbHNlKSwKICAgICAgIG1MYXN0RklSUmVxdWVzdFVzKC0xKSwKICAgICAgIG1OZXh0RklSU2VxTm8oKHJhbmQoKSAqIDI1Ni4wKSAvIFJBTkRfTUFYKSwKICAgICAgIG1Ob3RpZnkobm90aWZ5KSB7CkBAIC02MSw2ICs3Miw5IEBACiAgICAgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjQvIiwgNSkpIHsKICAgICAgICAgbUFzc2VtYmxlciA9IG5ldyBBQVZDQXNzZW1ibGVyKG5vdGlmeSk7CiAgICAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjUvIiwgNSkpIHsKKyAgICAgICAgbUFzc2VtYmxlciA9IG5ldyBBSEVWQ0Fzc2VtYmxlcihub3RpZnkpOworICAgICAgICBtSXNzdWVGSVJSZXF1ZXN0cyA9IHRydWU7CiAgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJNUDRBLUxBVE0vIiwgMTApKSB7CiAgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQU1QRUc0QXVkaW9Bc3NlbWJsZXIobm90aWZ5LCBwYXJhbXMpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiSDI2My0xOTk4LyIsIDEwKQpAQCAtMTEyLDEzICsxMjYsMjkgQEAKIGJvb2wgQVJUUFNvdXJjZTo6cXVldWVQYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIHVpbnQzMl90IHNlcU51bSA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpOwogCi0gICAgaWYgKG1OdW1CdWZmZXJzUmVjZWl2ZWQrKyA9PSAwKSB7CisgICAgaW50MzJfdCBzc3JjID0gMDsKKyAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJzc3JjIiwgJnNzcmMpOworCisgICAgaWYgKG1OdW1CdWZmZXJzUmVjZWl2ZWQrKyA9PSAwICYmIG1GaXJzdFN5c1RpbWUgPT0gMCkgeworICAgICAgICB1aW50MzJfdCBmaXJzdFJ0cFRpbWU7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmZmlyc3RSdHBUaW1lKSk7CisgICAgICAgIG1GaXJzdFN5c1RpbWUgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogICAgICAgICBtSGlnaGVzdFNlcU51bWJlciA9IHNlcU51bTsKICAgICAgICAgbUJhc2VTZXFOdW1iZXIgPSBzZXFOdW07CisgICAgICAgIG1GaXJzdFJ0cFRpbWUgPSBmaXJzdFJ0cFRpbWU7CisgICAgICAgIG1GaXJzdFNzcmMgPSBzc3JjOworICAgICAgICBBTE9HRCgiZmlyc3QtcnRwIGFycml2ZWQ6IGZpcnN0LXJ0cC10aW1lPSVkLCBzeXMtdGltZT0lbGxkLCBzZXEtbnVtPSV1LCBzc3JjPSVkIiwKKyAgICAgICAgICAgICAgICBtRmlyc3RSdHBUaW1lLCAobG9uZyBsb25nKW1GaXJzdFN5c1RpbWUsIG1IaWdoZXN0U2VxTnVtYmVyLCBtRmlyc3RTc3JjKTsKKyAgICAgICAgbUNsb2NrUmF0ZSA9IDkwMDAwOwogICAgICAgICBtUXVldWUucHVzaF9iYWNrKGJ1ZmZlcik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIGlmIChtRmlyc3RTc3JjICE9IHNzcmMpIHsKKyAgICAgICAgQUxPR1coIkRpc2NhcmRpbmcgYSBidWZmZXIgZHVlIHRvIHVuZXhwZWN0ZWQgc3NyYyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgLy8gT25seSB0aGUgbG93ZXIgMTYtYml0IG9mIHRoZSBzZXF1ZW5jZSBudW1iZXJzIGFyZSB0cmFuc21pdHRlZCwKICAgICAvLyBkZXJpdmUgdGhlIGhpZ2gtb3JkZXIgYml0cyBieSBjaG9vc2luZyB0aGUgY2FuZGlkYXRlIGNsb3Nlc3QKICAgICAvLyB0byB0aGUgaGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgKGV4dGVuZGVkIHRvIDMyIGJpdHMpIHJlY2VpdmVkIHNvIGZhci4KQEAgLTE4MSwyMCArMjExLDM0IEBACiB9CiAKIHZvaWQgQVJUUFNvdXJjZTo6YWRkRklSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICBpZiAoIW1Jc3N1ZUZJUlJlcXVlc3RzKSB7CisgICAgaWYgKCFtSXNzdWVGSVJSZXF1ZXN0cyAmJiAhbUlzc3VlRklSQnlBc3NlbWJsZXIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGJvb2wgc2VuZCA9IGZhbHNlOwogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIGlmIChtTGFzdEZJUlJlcXVlc3RVcyA+PSAwICYmIG1MYXN0RklSUmVxdWVzdFVzICsgNTAwMDAwMExMID4gbm93VXMpIHsKLSAgICAgICAgLy8gU2VuZCBGSVIgcmVxdWVzdHMgYXQgbW9zdCBldmVyeSA1IHNlY3MuCisgICAgaW50NjRfdCB1c2Vjc1NpbmNlTGFzdEZJUiA9IG5vd1VzIC0gbUxhc3RGSVJSZXF1ZXN0VXM7CisgICAgaWYgKG1MYXN0RklSUmVxdWVzdFVzIDwgMCkgeworICAgICAgICAvLyBBIGZpcnN0IEZJUiwganVzdCBzZW5kIGl0LgorICAgICAgICBzZW5kID0gdHJ1ZTsKKyAgICB9ICBlbHNlIGlmIChtSXNzdWVGSVJCeUFzc2VtYmxlciAmJiAodXNlY3NTaW5jZUxhc3RGSVIgPiAxMDAwMDAwKSkgeworICAgICAgICAvLyBBIEZJUiBpc3N1ZWQgYnkgQXNzZW1ibGVyLgorICAgICAgICAvLyBTZW5kIGl0IGlmIGxhc3QgRklSIGlzIG5vdCBzZW50IHdpdGhpbiBhIHNlYy4KKyAgICAgICAgc2VuZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtSXNzdWVGSVJSZXF1ZXN0cyAmJiAodXNlY3NTaW5jZUxhc3RGSVIgPiA1MDAwMDAwKSkgeworICAgICAgICAvLyBBIEZJUiBpc3N1ZWQgcGVyaW9kaWNhbGx5IHJlYWdhcmRsZXNzIHBhY2tldCBsb3NzLgorICAgICAgICAvLyBTZW5kIGl0IGlmIGxhc3QgRklSIGlzIG5vdCBzZW50IHdpdGhpbiA1IHNlY3MuCisgICAgICAgIHNlbmQgPSB0cnVlOworICAgIH0KKworICAgIGlmICghc2VuZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgbUxhc3RGSVJSZXF1ZXN0VXMgPSBub3dVczsKIAogICAgIGlmIChidWZmZXItPnNpemUoKSArIDIwID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSBGSVIuIik7CisgICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21tb2RhdGUgRklSLiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMDMsNyArMjQ3LDcgQEAKICAgICBkYXRhWzBdID0gMHg4MCB8IDQ7CiAgICAgZGF0YVsxXSA9IDIwNjsgIC8vIFBTRkIKICAgICBkYXRhWzJdID0gMDsKLSAgICBkYXRhWzNdID0gNDsKKyAgICBkYXRhWzNdID0gNDsgICAgLy8gdG90YWwgKDQrMSkgKiBzaXplb2YoaW50MzJfdCkgPSAyMCBieXRlcwogICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CiAgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKICAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CkBAIC0yMjUsMTQgKzI2OSwxNiBAQAogICAgIGRhdGFbMThdID0gMHgwMDsKICAgICBkYXRhWzE5XSA9IDB4MDA7CiAKLSAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgMjApOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAoZGF0YVszXSArIDEpICogc2l6ZW9mKGludDMyX3QpKTsKKworICAgIG1Jc3N1ZUZJUkJ5QXNzZW1ibGVyID0gZmFsc2U7CiAKICAgICBBTE9HVigiQWRkZWQgRklSIHJlcXVlc3QuIik7CiB9CiAKIHZvaWQgQVJUUFNvdXJjZTo6YWRkUmVjZWl2ZXJSZXBvcnQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGlmIChidWZmZXItPnNpemUoKSArIDMyID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSBSUi4iKTsKKyAgICAgICAgQUxPR1coIlJUQ1AgYnVmZmVyIHRvbyBzbWFsbCB0byBhY2NvbW1vZGF0ZSBSUi4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjQwLDE2ICsyODYsMTYgQEAKIAogICAgIC8vIEFjY29yZGluZyB0byBhcHBlbmRpeCBBLjMgaW4gUkZDIDM1NTAKICAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOwotICAgIGludDY0X3QgaW50ZXJ2YWxFeHBlY3RlZCA9IGV4cGVjdGVkIC0gbVByZXZFeHBlY3RlZDsKLSAgICBpbnQ2NF90IGludGVydmFsUmVjZWl2ZWQgPSBtTnVtQnVmZmVyc1JlY2VpdmVkIC0gbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBpbnRlcnZhbEV4cGVjdGVkID0gZXhwZWN0ZWQgLSBtUHJldkV4cGVjdGVkRm9yUlI7CisgICAgaW50NjRfdCBpbnRlcnZhbFJlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZCAtIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkRm9yUlI7CiAgICAgaW50NjRfdCBpbnRlcnZhbFBhY2tldExvc3QgPSBpbnRlcnZhbEV4cGVjdGVkIC0gaW50ZXJ2YWxSZWNlaXZlZDsKIAogICAgIGlmIChpbnRlcnZhbEV4cGVjdGVkID4gMCAmJiBpbnRlcnZhbFBhY2tldExvc3QgPiAwKSB7CiAgICAgICAgIGZyYWN0aW9uID0gKGludGVydmFsUGFja2V0TG9zdCA8PCA4KSAvIGludGVydmFsRXhwZWN0ZWQ7CiAgICAgfQogCi0gICAgbVByZXZFeHBlY3RlZCA9IGV4cGVjdGVkOwotICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICBtUHJldkV4cGVjdGVkRm9yUlIgPSBleHBlY3RlZDsKKyAgICBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZEZvclJSID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKICAgICBpbnQzMl90IGN1bXVsYXRpdmVQYWNrZXRMb3N0ID0gKGludDMyX3QpZXhwZWN0ZWQgLSBtTnVtQnVmZmVyc1JlY2VpdmVkOwogCiAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CkBAIC0yNTcsNyArMzAzLDcgQEAKICAgICBkYXRhWzBdID0gMHg4MCB8IDE7CiAgICAgZGF0YVsxXSA9IDIwMTsgIC8vIFJSCiAgICAgZGF0YVsyXSA9IDA7Ci0gICAgZGF0YVszXSA9IDc7CisgICAgZGF0YVszXSA9IDc7ICAgIC8vIHRvdGFsICg3KzEpICogc2l6ZW9mKGludDMyX3QpID0gMzIgYnl0ZXMKICAgICBkYXRhWzRdID0ga1NvdXJjZUlEID4+IDI0OwogICAgIGRhdGFbNV0gPSAoa1NvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CiAgICAgZGF0YVs2XSA9IChrU291cmNlSUQgPj4gOCkgJiAweGZmOwpAQCAtMzAzLDkgKzM0OSwxOTMgQEAKICAgICBkYXRhWzMwXSA9IChETFNSID4+IDgpICYgMHhmZjsKICAgICBkYXRhWzMxXSA9IERMU1IgJiAweGZmOwogCi0gICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIDMyKTsKKyAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgKGRhdGFbM10gKyAxKSAqIHNpemVvZihpbnQzMl90KSk7CiB9CiAKK3ZvaWQgQVJUUFNvdXJjZTo6YWRkVE1NQlIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCB0YXJnZXRCaXRyYXRlKSB7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpICsgMjAgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR1coIlJUQ1AgYnVmZmVyIHRvbyBzbWFsbCB0byBhY2NvbW1vZGF0ZSBSUi4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0YXJnZXRCaXRyYXRlIDw9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCAzOyAvLyBUTU1CUgorICAgIGRhdGFbMV0gPSAyMDU7ICAgICAgLy8gVFNGQgorICAgIGRhdGFbMl0gPSAwOworICAgIGRhdGFbM10gPSA0OyAgICAgICAgLy8gdG90YWwgKDQrMSkgKiBzaXplb2YoaW50MzJfdCkgPSAyMCBieXRlcworICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IGtTb3VyY2VJRCAmIDB4ZmY7CisKKyAgICAqKGludDMyX3QqKSgmZGF0YVs4XSkgPSAwOyAgLy8gNCBieXRlcyBibGFuaworCisgICAgZGF0YVsxMl0gPSBtSUQgPj4gMjQ7CisgICAgZGF0YVsxM10gPSAobUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxNF0gPSAobUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzE1XSA9IG1JRCAmIDB4ZmY7CisKKyAgICBpbnQzMl90IGV4cCwgbWFudGlzc2E7CisKKyAgICAvLyBSb3VuZCBvZmYgdG8gdGhlIG5lYXJlc3QgMl40dGgKKyAgICBBTE9HSSgiVUUgLT4gT3AgUmVxIFJ4IGJpdHJhdGUgOiAlZCAiLCB0YXJnZXRCaXRyYXRlICYgMHhmZmZmZmZmMCk7CisgICAgZm9yIChleHA9NCA7IGV4cCA8IDMyIDsgZXhwKyspCisgICAgICAgIGlmICgoKHRhcmdldEJpdHJhdGUgPj4gZXhwKSAmIDB4MDEpICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICBtYW50aXNzYSA9IHRhcmdldEJpdHJhdGUgPj4gZXhwOworCisgICAgZGF0YVsxNl0gPSAoKGV4cCA8PCAyKSAmIDB4ZmMpIHwgKChtYW50aXNzYSAmIDB4MTgwMDApID4+IDE1KTsKKyAgICBkYXRhWzE3XSA9ICAgICAgICAgICAgICAgICAgICAgICAgKG1hbnRpc3NhICYgMHgwN2Y4MCkgPj4gNzsKKyAgICBkYXRhWzE4XSA9ICAgICAgICAgICAgICAgICAgICAgICAgKG1hbnRpc3NhICYgMHgwMDA3ZikgPDwgMTsKKyAgICBkYXRhWzE5XSA9IDQwOyAgICAgICAgICAgICAgLy8gNDAgYnl0ZXMgb3ZlcmhlYWQ7CisKKyAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgKGRhdGFbM10gKyAxKSAqIHNpemVvZihpbnQzMl90KSk7Cit9CisKK2ludCBBUlRQU291cmNlOjphZGROQUNLKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtNYXhGQ0lzID0gMTA7IC8vIG1heCBudW1iZXIgb2YgRkNJcworICAgIGlmIChidWZmZXItPnNpemUoKSArICgzICsga01heEZDSXMpICogc2l6ZW9mKGludDMyX3QpID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21tb2RhdGUgTkFDSy4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCAxOyAvLyBHZW5lcmljIE5BQ0sKKyAgICBkYXRhWzFdID0gMjA1OyAgICAgIC8vIFRTRkIKKyAgICBkYXRhWzJdID0gMDsKKyAgICBkYXRhWzNdID0gMDsgICAgICAgIC8vIHdpbGwgYmUgZGVjaWRlZCBsYXRlcgorICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IGtTb3VyY2VJRCAmIDB4ZmY7CisKKyAgICBkYXRhWzhdID0gbUlEID4+IDI0OworICAgIGRhdGFbOV0gPSAobUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxMF0gPSAobUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzExXSA9IG1JRCAmIDB4ZmY7CisKKyAgICBMaXN0PGludD4gbGlzdDsKKyAgICBMaXN0PGludD46Oml0ZXJhdG9yIGl0OworICAgIGdldFNlcU51bVRvTkFDSyhsaXN0LCBrTWF4RkNJcyk7CisgICAgc2l6ZV90IGNudCA9IDA7CisKKyAgICBpbnQgKkZDSSA9IChpbnQgKikoZGF0YSArIDEyKTsKKyAgICBmb3IgKGl0ID0gbGlzdC5iZWdpbigpOyBpdCAhPSBsaXN0LmVuZCgpICYmIGNudCA8IGtNYXhGQ0lzOyBpdCsrKSB7CisgICAgICAgICooRkNJICsgY250KSA9ICppdDsKKyAgICAgICAgY250Kys7CisgICAgfQorCisgICAgZGF0YVszXSA9ICgzICsgY250KSAtIDE7ICAvLyB0b3RhbCAoMyArICNvZkZDSSkgKiBzaXplb2YoaW50MzJfdCkgYnl0ZQorCisgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIChkYXRhWzNdICsgMSkgKiBzaXplb2YoaW50MzJfdCkpOworCisgICAgcmV0dXJuIGNudDsKK30KKworaW50IEFSVFBTb3VyY2U6OmdldFNlcU51bVRvTkFDSyhMaXN0PGludD4mIGxpc3QsIGludCBzaXplKSB7CisgICAgQXV0b011dGV4IF9sKG1NYXBMb2NrKTsKKyAgICBpbnQgY250ID0gMDsKKworICAgIHN0ZDo6bWFwPHVpbnQxNl90LCBpbmZvTkFDSz46Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IG1OQUNLTWFwLmJlZ2luKCk7IGl0ICE9IG1OQUNLTWFwLmVuZCgpICYmIGNudCA8IHNpemU7IGl0KyspIHsKKyAgICAgICAgaW5mb05BQ0sgJmluZm9faXQgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoaW5mb19pdC5uZWVkVG9OQUNLKSB7CisgICAgICAgICAgICBpbmZvX2l0Lm5lZWRUb05BQ0sgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIHN3aXRjaCBMU0IgdG8gTVNCIGZvciBzZW5kaW5nIE4vVworICAgICAgICAgICAgdWludDMyX3QgRkNJOworICAgICAgICAgICAgdWludDhfdCAqdGVtcCA9ICh1aW50OF90ICopJkZDSTsKKyAgICAgICAgICAgIHRlbXBbMF0gPSAoaW5mb19pdC5zZXFOdW0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgdGVtcFsxXSA9IChpbmZvX2l0LnNlcU51bSkgICAgICAmIDB4ZmY7CisgICAgICAgICAgICB0ZW1wWzJdID0gKGluZm9faXQubWFzayA+PiA4KSAgICYgMHhmZjsKKyAgICAgICAgICAgIHRlbXBbM10gPSAoaW5mb19pdC5tYXNrKSAgICAgICAgJiAweGZmOworCisgICAgICAgICAgICBsaXN0LnB1c2hfYmFjayhGQ0kpOworICAgICAgICAgICAgY250Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY250OworfQorCit2b2lkIEFSVFBTb3VyY2U6OnNldFNlcU51bVRvTkFDSyh1aW50MTZfdCBzZXFOdW0sIHVpbnQxNl90IG1hc2ssIHVpbnQxNl90IG5vd0ppdHRlckhlYWRTZXFOdW0pIHsKKyAgICBBdXRvTXV0ZXggX2wobU1hcExvY2spOworICAgIGluZm9OQUNLIGluZm8gPSB7c2VxTnVtLCBtYXNrLCBub3dKaXR0ZXJIZWFkU2VxTnVtLCB0cnVlfTsKKyAgICBzdGQ6Om1hcDx1aW50MTZfdCwgaW5mb05BQ0s+OjppdGVyYXRvciBpdDsKKworICAgIGl0ID0gbU5BQ0tNYXAuZmluZChzZXFOdW0pOworICAgIGlmIChpdCAhPSBtTkFDS01hcC5lbmQoKSkgeworICAgICAgICBpbmZvTkFDSyAmaW5mb19pdCA9IGl0LT5zZWNvbmQ7CisgICAgICAgIC8vIHJlbmV3IGlmIChtYXNrIG9yIGhlYWQgc2VxKSBpcyBjaGFuZ2VkCisgICAgICAgIGlmICgoaW5mb19pdC5tYXNrICE9IG1hc2spIHx8IChpbmZvX2l0Lm5vd0ppdHRlckhlYWRTZXFOdW0gIT0gbm93Sml0dGVySGVhZFNlcU51bSkpIHsKKyAgICAgICAgICAgIGluZm9faXQgPSBpbmZvOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU5BQ0tNYXBbc2VxTnVtXSA9IGluZm87CisgICAgfQorCisgICAgLy8gZGVsZXRlIGFsbCBOQUNLIGZhciBmcm9tIGN1cnJlbnQgSml0dGVyJ3MgZmlyc3Qgc2VxdWVuY2UgbnVtYmVyCisgICAgaXQgPSBtTkFDS01hcC5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtTkFDS01hcC5lbmQoKSkgeworICAgICAgICBpbmZvTkFDSyAmaW5mb19pdCA9IGl0LT5zZWNvbmQ7CisKKyAgICAgICAgaW50IGRpZmYgPSBub3dKaXR0ZXJIZWFkU2VxTnVtIC0gaW5mb19pdC5ub3dKaXR0ZXJIZWFkU2VxTnVtOworICAgICAgICBpZiAoZGlmZiA+IDEwMCkgeworICAgICAgICAgICAgQUxPR1YoIkRlbGV0ZSAlZCBwa3QgZnJvbSBOQUNLIG1hcCAiLCBpbmZvX2l0LnNlcU51bSk7CisgICAgICAgICAgICBpdCA9IG1OQUNLTWFwLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9CisKK30KKwordWludDMyX3QgQVJUUFNvdXJjZTo6Z2V0U2VsZklEKCkgeworICAgIHJldHVybiBrU291cmNlSUQ7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6c2V0U2VsZklEKGNvbnN0IHVpbnQzMl90IHNlbGZJRCkgeworICAgIGtTb3VyY2VJRCA9IHNlbGZJRDsKK30KKwordm9pZCBBUlRQU291cmNlOjpzZXRKYlRpbWUoY29uc3QgdWludDMyX3QgamJUaW1lTXMpIHsKKyAgICBtSmJUaW1lTXMgPSBqYlRpbWVNczsKK30KKwordm9pZCBBUlRQU291cmNlOjpzZXRQZXJpb2RpY0ZJUihib29sIGVuYWJsZSkgeworICAgIEFMT0dEKCJzZXRQZXJpb2RpY0ZJUiAlZCIsIGVuYWJsZSk7CisgICAgbUlzc3VlRklSUmVxdWVzdHMgPSBlbmFibGU7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6bm90aWZ5UGt0SW5mbyhpbnQzMl90IGJpdHJhdGUsIGludDY0X3QgLyp0aW1lKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBheWxvYWQtdHlwZSIsIDEwMik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZmVlZGJhY2stdHlwZSIsIDApOworICAgIC8vIHNlbmRpbmcgdGFyZ2V0IGJpdHJhdGUgdXAgdG8gYXBwbGljYXRpb24gdG8gc2hhcmUgcnRwIHF1YWxpdHkuCisgICAgbm90aWZ5LT5zZXRJbnQzMigiYml0LXJhdGUiLCBiaXRyYXRlKTsKKyAgICBub3RpZnktPnNldEludDMyKCJoaWdoZXN0LXNlcS1udW0iLCBtSGlnaGVzdFNlcU51bWJlcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYmFzZS1zZXEtbnVtIiwgbUJhc2VTZXFOdW1iZXIpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInByZXYtZXhwZWN0ZWQiLCBtUHJldkV4cGVjdGVkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJudW0tYnVmLXJlY3YiLCBtTnVtQnVmZmVyc1JlY2VpdmVkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJwcmV2LW51bS1idWYtcmVjdiIsIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworICAgIHVpbnQzMl90IGV4cGVjdGVkID0gbUhpZ2hlc3RTZXFOdW1iZXIgLSBtQmFzZVNlcU51bWJlciArIDE7CisgICAgbVByZXZFeHBlY3RlZCA9IGV4cGVjdGVkOworICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKK30KKwordm9pZCBBUlRQU291cmNlOjpvbklzc3VlRklSQnlBc3NlbWJsZXIoKSB7CisgICAgbUlzc3VlRklSQnlBc3NlbWJsZXIgPSB0cnVlOworfQorCit2b2lkIEFSVFBTb3VyY2U6Om5vdGljZUFiYW5kb25CdWZmZXIoaW50IGNudCkgeworICAgIG1OdW1CdWZmZXJzUmVjZWl2ZWQgLT0gY250OworfQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCmluZGV4IGY0NGU4M2YuLmVhNjgzYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCkBAIC0yMyw2ICsyMyw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDUsMjIgKzQ4LDU4IEBACiAKICAgICB2b2lkIGFkZFJlY2VpdmVyUmVwb3J0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgYWRkRklSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgYWRkVE1NQlIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCB0YXJnZXRCaXRyYXRlKTsKKyAgICBpbnQgYWRkTkFDSyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIHNldFNlcU51bVRvTkFDSyh1aW50MTZfdCBzZXFOdW0sIHVpbnQxNl90IG1hc2ssIHVpbnQxNl90IG5vd0ppdHRlckhlYWRTZXFOdW0pOworICAgIHVpbnQzMl90IGdldFNlbGZJRCgpOworICAgIHZvaWQgc2V0U2VsZklEKGNvbnN0IHVpbnQzMl90IHNlbGZJRCk7CisgICAgdm9pZCBzZXRKYlRpbWUoY29uc3QgdWludDMyX3QgamJUaW1lTXMpOworICAgIHZvaWQgc2V0UGVyaW9kaWNGSVIoYm9vbCBlbmFibGUpOworICAgIHZvaWQgbm90aWZ5UGt0SW5mbyhpbnQzMl90IGJpdHJhdGUsIGludDY0X3QgdGltZSk7CisgICAgLy8gRklSIG5lZWRzIHRvIGJlIHNlbnQgYnkgbWlzc2luZyBwYWNrZXQgb3IgYnJva2VuIHZpZGVvIGltYWdlLgorICAgIHZvaWQgb25Jc3N1ZUZJUkJ5QXNzZW1ibGVyKCk7CisKKyAgICB2b2lkIG5vdGljZUFiYW5kb25CdWZmZXIoaW50IGNudD0xKTsKKworICAgIGludDMyX3QgbUZpcnN0U2VxTnVtYmVyOworICAgIHVpbnQzMl90IG1GaXJzdFJ0cFRpbWU7CisgICAgaW50NjRfdCBtRmlyc3RTeXNUaW1lOworICAgIGludDMyX3QgbUNsb2NrUmF0ZTsKKworICAgIHVpbnQzMl90IG1KYlRpbWVNczsKKyAgICBpbnQzMl90IG1GaXJzdFNzcmM7CisgICAgaW50MzJfdCBtSGlnaGVzdE5hY2tOdW1iZXI7CiAKIHByaXZhdGU6CisKICAgICB1aW50MzJfdCBtSUQ7CiAgICAgdWludDMyX3QgbUhpZ2hlc3RTZXFOdW1iZXI7CiAgICAgdWludDMyX3QgbVByZXZFeHBlY3RlZDsKICAgICB1aW50MzJfdCBtQmFzZVNlcU51bWJlcjsKICAgICBpbnQzMl90IG1OdW1CdWZmZXJzUmVjZWl2ZWQ7CiAgICAgaW50MzJfdCBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICB1aW50MzJfdCBtUHJldkV4cGVjdGVkRm9yUlI7CisgICAgaW50MzJfdCBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZEZvclJSOwogCiAgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1RdWV1ZTsKICAgICBzcDxBUlRQQXNzZW1ibGVyPiBtQXNzZW1ibGVyOwogCisgICAgdHlwZWRlZiBzdHJ1Y3QgaW5mb05BQ0sgeworICAgICAgICB1aW50MTZfdCBzZXFOdW07CisgICAgICAgIHVpbnQxNl90IG1hc2s7CisgICAgICAgIHVpbnQxNl90IG5vd0ppdHRlckhlYWRTZXFOdW07CisgICAgICAgIGJvb2wgICAgbmVlZFRvTkFDSzsKKyAgICB9IGluZm9OQUNLOworCisgICAgTXV0ZXggbU1hcExvY2s7CisgICAgc3RkOjptYXA8dWludDE2X3QsIGluZm9OQUNLPiBtTkFDS01hcDsKKyAgICBpbnQgZ2V0U2VxTnVtVG9OQUNLKExpc3Q8aW50PiYgbGlzdCwgaW50IHNpemUpOworCiAgICAgdWludDY0X3QgbUxhc3ROVFBUaW1lOwogICAgIGludDY0X3QgbUxhc3ROVFBUaW1lVXBkYXRlVXM7CiAKICAgICBib29sIG1Jc3N1ZUZJUlJlcXVlc3RzOworICAgIGJvb2wgbUlzc3VlRklSQnlBc3NlbWJsZXI7CiAgICAgaW50NjRfdCBtTGFzdEZJUlJlcXVlc3RVczsKICAgICB1aW50OF90IG1OZXh0RklSU2VxTm87CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCmluZGV4IDU4ZDYwODYuLjc2YWZiMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtMzUsMTAgKzM1LDMyIEBACiAjZGVmaW5lIFBUICAgICAgOTcKICNkZWZpbmUgUFRfU1RSICAiOTciCiAKKyNkZWZpbmUgSDI2NF9OQUxVX01BU0sgMHgxRgorI2RlZmluZSBIMjY0X05BTFVfU1BTIDB4NworI2RlZmluZSBIMjY0X05BTFVfUFBTIDB4OAorI2RlZmluZSBIMjY0X05BTFVfSUZSQU1FIDB4NQorI2RlZmluZSBIMjY0X05BTFVfUEZSQU1FIDB4MQorCisjZGVmaW5lIEgyNjVfTkFMVV9NQVNLIDB4M0YKKyNkZWZpbmUgSDI2NV9OQUxVX1ZQUyAweDIwCisjZGVmaW5lIEgyNjVfTkFMVV9TUFMgMHgyMQorI2RlZmluZSBIMjY1X05BTFVfUFBTIDB4MjIKKworI2RlZmluZSBMSU5LX0hFQURFUl9TSVpFIDE0CisjZGVmaW5lIElQX0hFQURFUl9TSVpFIDIwCisjZGVmaW5lIFVEUF9IRUFERVJfU0laRSA4CisjZGVmaW5lIFRDUElQX0hFQURFUl9TSVpFIChMSU5LX0hFQURFUl9TSVpFICsgSVBfSEVBREVSX1NJWkUgKyBVRFBfSEVBREVSX1NJWkUpCisjZGVmaW5lIFJUUF9IRUFERVJfU0laRSAxMgorI2RlZmluZSBSVFBfSEVBREVSX0VYVF9TSVpFIDgKKyNkZWZpbmUgUlRQX0ZVX0hFQURFUl9TSVpFIDIKKyNkZWZpbmUgUlRQX1BBWUxPQURfUk9PTV9TSVpFIDEwMCAvLyBST09NIHNpemUgZm9yIElQdjYgaGVhZGVyLCBFU1AgYW5kIGV0Yy4KKworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFBhY2tldFNpemUgPSA2NTUwNzsgIC8vIG1heGltdW0gcGF5bG9hZCBpbiBVRFAgb3ZlciBJUAotc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGFja2V0U2l6ZSA9IDE1MDA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhQYWNrZXRTaXplID0gMTI4MDsKK3N0YXRpYyBjaGFyIGtDTkFNRVsyNTVdID0gInNvbWVvbmVAc29tZXdoZXJlIjsKIAogc3RhdGljIGludCBVbmlmb3JtUmFuZChpbnQgbGltaXQpIHsKICAgICByZXR1cm4gKChkb3VibGUpcmFuZCgpICogbGltaXQpIC8gUkFORF9NQVg7CkBAIC00OCwxNSArNzAsMTkgQEAKICAgICA6IG1GbGFncygwKSwKICAgICAgIG1GZChkdXAoZmQpKSwKICAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAotICAgICAgbVJlZmxlY3RvcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8QVJUUFdyaXRlcj4odGhpcykpIHsKKyAgICAgIG1SZWZsZWN0b3IobmV3IEFIYW5kbGVyUmVmbGVjdG9yPEFSVFBXcml0ZXI+KHRoaXMpKSwKKyAgICAgIG1UcmFmZmljUmVjKG5ldyBUcmFmZmljUmVjb3JkZXI8dWludDMyX3QsIHNpemVfdD4oMTI4KSkgewogICAgIENIRUNLX0dFKGZkLCAwKTsKKyAgICBtSXNJUHY2ID0gZmFsc2U7CiAKICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHAgd3JpdGVyIik7CiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOwogICAgIG1Mb29wZXItPnN0YXJ0KCk7CiAKLSAgICBtU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwotICAgIENIRUNLX0dFKG1Tb2NrZXQsIDApOworICAgIG1SVFBTb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UobVJUUFNvY2tldCwgMCk7CisgICAgbVJUQ1BTb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UobVJUQ1BTb2NrZXQsIDApOwogCiAgICAgbWVtc2V0KG1SVFBBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YobVJUUEFkZHIuc2luX3plcm8pKTsKICAgICBtUlRQQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKQEAgLTcyLDYgKzk4LDQ0IEBACiAKICAgICBtUlRDUEFkZHIgPSBtUlRQQWRkcjsKICAgICBtUlRDUEFkZHIuc2luX3BvcnQgPSBodG9ucyhudG9ocyhtUlRQQWRkci5zaW5fcG9ydCkgfCAxKTsKKyAgICBtU1BTQnVmID0gTlVMTDsKKyAgICBtUFBTQnVmID0gTlVMTDsKKworI2lmIExPR19UT19GSUxFUworICAgIG1SVFBGZCA9IG9wZW4oCisgICAgICAgICAgICAiL2RhdGEvbWlzYy9ydHBvdXQuYmluIiwKKyAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCisgICAgICAgICAgICAwNjQ0KTsKKyAgICBDSEVDS19HRShtUlRQRmQsIDApOworCisgICAgbVJUQ1BGZCA9IG9wZW4oCisgICAgICAgICAgICAiL2RhdGEvbWlzYy9ydGNwb3V0LmJpbiIsCisgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAorICAgICAgICAgICAgMDY0NCk7CisgICAgQ0hFQ0tfR0UobVJUQ1BGZCwgMCk7CisjZW5kaWYKK30KKworQVJUUFdyaXRlcjo6QVJUUFdyaXRlcihpbnQgZmQsIFN0cmluZzgmIGxvY2FsSXAsIGludCBsb2NhbFBvcnQsIFN0cmluZzgmIHJlbW90ZUlwLAorICAgIGludCByZW1vdGVQb3J0LCB1aW50MzJfdCBzZXFObykKKyAgICA6IG1GbGFncygwKSwKKyAgICAgIG1GZChkdXAoZmQpKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgbVJlZmxlY3RvcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8QVJUUFdyaXRlcj4odGhpcykpLAorICAgICAgbVRyYWZmaWNSZWMobmV3IFRyYWZmaWNSZWNvcmRlcjx1aW50MzJfdCwgc2l6ZV90PigxMjgpKSB7CisgICAgQ0hFQ0tfR0UoZmQsIDApOworICAgIG1Jc0lQdjYgPSBmYWxzZTsKKworICAgIG1Mb29wZXItPnNldE5hbWUoInJ0cCB3cml0ZXIiKTsKKyAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CisgICAgbUxvb3Blci0+c3RhcnQoKTsKKworICAgIG1ha2VTb2NrZXRQYWlyQW5kQmluZChsb2NhbElwLCBsb2NhbFBvcnQsIHJlbW90ZUlwICwgcmVtb3RlUG9ydCk7CisgICAgbVZQU0J1ZiA9IE5VTEw7CisgICAgbVNQU0J1ZiA9IE5VTEw7CisgICAgbVBQU0J1ZiA9IE5VTEw7CisKKyAgICBtU2VxTm8gPSBzZXFObzsKIAogI2lmIExPR19UT19GSUxFUwogICAgIG1SVFBGZCA9IG9wZW4oCkBAIC04OSw2ICsxNTMsMjEgQEAKIH0KIAogQVJUUFdyaXRlcjo6fkFSVFBXcml0ZXIoKSB7CisgICAgaWYgKG1WUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtVlBTQnVmLT5yZWxlYXNlKCk7CisgICAgICAgIG1WUFNCdWYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtU1BTQnVmICE9IE5VTEwpIHsKKyAgICAgICAgbVNQU0J1Zi0+cmVsZWFzZSgpOworICAgICAgICBtU1BTQnVmID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobVBQU0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1QUFNCdWYtPnJlbGVhc2UoKTsKKyAgICAgICAgbVBQU0J1ZiA9IE5VTEw7CisgICAgfQorCiAjaWYgTE9HX1RPX0ZJTEVTCiAgICAgY2xvc2UobVJUQ1BGZCk7CiAgICAgbVJUQ1BGZCA9IC0xOwpAQCAtOTcsOCArMTc2LDExIEBACiAgICAgbVJUUEZkID0gLTE7CiAjZW5kaWYKIAotICAgIGNsb3NlKG1Tb2NrZXQpOwotICAgIG1Tb2NrZXQgPSAtMTsKKyAgICBjbG9zZShtUlRQU29ja2V0KTsKKyAgICBtUlRQU29ja2V0ID0gLTE7CisKKyAgICBjbG9zZShtUlRDUFNvY2tldCk7CisgICAgbVJUQ1BTb2NrZXQgPSAtMTsKIAogICAgIGNsb3NlKG1GZCk7CiAgICAgbUZkID0gLTE7CkBAIC0xMTQsMjggKzE5Niw2MSBAQAogICAgIHJldHVybiAobUZsYWdzICYga0ZsYWdFT1MpICE9IDA7CiB9CiAKLXN0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CitzdGF0dXNfdCBBUlRQV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqIHBhcmFtcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKG1GbGFncyAmIGtGbGFnU3RhcnRlZCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgbUZsYWdzICY9IH5rRmxhZ0VPUzsKLSAgICBtU291cmNlSUQgPSByYW5kKCk7Ci0gICAgbVNlcU5vID0gVW5pZm9ybVJhbmQoNjU1MzYpOwotICAgIG1SVFBUaW1lQmFzZSA9IHJhbmQoKTsKKyAgICBpZiAobVNvdXJjZUlEID09IDApCisgICAgICAgIG1Tb3VyY2VJRCA9IHJhbmQoKTsKKyAgICBpZiAobVNlcU5vID09IDApCisgICAgICAgIG1TZXFObyA9IFVuaWZvcm1SYW5kKDY1NTM2KTsKKyAgICBtUlRQVGltZUJhc2UgPSAwOwogICAgIG1OdW1SVFBTZW50ID0gMDsKICAgICBtTnVtUlRQT2N0ZXRzU2VudCA9IDA7CiAgICAgbUxhc3RSVFBUaW1lID0gMDsKICAgICBtTGFzdE5UUFRpbWUgPSAwOworICAgIG1PcHBvbmVudElEID0gMDsKKyAgICBtQml0cmF0ZSA9IDE5MjAwMDsKICAgICBtTnVtU1JzU2VudCA9IDA7CisgICAgbVJUUENWT0V4dE1hcCA9IC0xOworICAgIG1SVFBDVk9EZWdyZWVzID0gMDsKKyAgICBtUlRQU29ja05ldHdvcmsgPSAwOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBDSEVDSyhtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCisgICAgaW50MzJfdCBzZWxmSUQgPSAwOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihrS2V5U2VsZklELCAmc2VsZklEKSkKKyAgICAgICAgbVNvdXJjZUlEID0gc2VsZklEOworCisgICAgaW50MzJfdCBwYXlsb2FkVHlwZSA9IDA7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKGtLZXlQYXlsb2FkVHlwZSwgJnBheWxvYWRUeXBlKSkKKyAgICAgICAgbVBheWxvYWRUeXBlID0gcGF5bG9hZFR5cGU7CisKKyAgICBpbnQzMl90IHJ0cEV4dE1hcCA9IDA7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKGtLZXlSdHBFeHRNYXAsICZydHBFeHRNYXApKQorICAgICAgICBtUlRQQ1ZPRXh0TWFwID0gcnRwRXh0TWFwOworCisgICAgaW50MzJfdCBydHBDVk9EZWdyZWVzID0gMDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVJ0cEN2b0RlZ3JlZXMsICZydHBDVk9EZWdyZWVzKSkKKyAgICAgICAgbVJUUENWT0RlZ3JlZXMgPSBydHBDVk9EZWdyZWVzOworCisgICAgaW50MzJfdCBkc2NwID0gMDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVJ0cERzY3AsICZkc2NwKSkKKyAgICAgICAgdXBkYXRlU29ja2V0RHNjcChkc2NwKTsKKworICAgIGludDY0X3Qgc29ja05ldHdvcmsgPSAwOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQ2NChrS2V5U29ja2V0TmV0d29yaywgJnNvY2tOZXR3b3JrKSkKKyAgICAgICAgdXBkYXRlU29ja2V0TmV0d29yayhzb2NrTmV0d29yayk7CisKICAgICBtTW9kZSA9IElOVkFMSUQ7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKICAgICAgICAgbU1vZGUgPSBIMjY0OworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICAgICAgbU1vZGUgPSBIMjY1OwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MykpIHsKICAgICAgICAgbU1vZGUgPSBIMjYzOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKSkgewpAQCAtMTg3LDExICszMDIsMTM3IEBACiAgICAgfQogfQogCitzdGF0aWMgY29uc3QgdWludDhfdCBTUENTaXplID0gNDsgICAgICAvLyBTdGFydCBQcmVmaXggQ29kZSBTaXplCitzdGF0aWMgY29uc3QgdWludDhfdCBzdGFydFByZWZpeENvZGVbU1BDU2l6ZV0gPSB7MCwgMCwgMCwgMX07CitzdGF0aWMgY29uc3QgdWludDhfdCBzcGNLTVBpZHhbU1BDU2l6ZV0gPSB7MCwgMCwgMiwgMH07CitzdGF0aWMgdm9pZCBTcHNQcHNQYXJzZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKnNwc0J1ZmZlciwgTWVkaWFCdWZmZXJCYXNlICoqcHBzQnVmZmVyKSB7CisKKyAgICB3aGlsZSAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqTkFMUHRyID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqdGFyZ2V0UHRyID0gTlVMTDsKKyAgICAgICAgaWYgKCgqTkFMUHRyICYgSDI2NF9OQUxVX01BU0spID09IEgyNjRfTkFMVV9TUFMpIHsKKyAgICAgICAgICAgIHRhcmdldFB0ciA9IHNwc0J1ZmZlcjsKKyAgICAgICAgfSBlbHNlIGlmICgoKk5BTFB0ciAmIEgyNjRfTkFMVV9NQVNLKSA9PSBIMjY0X05BTFVfUFBTKSB7CisgICAgICAgICAgICB0YXJnZXRQdHIgPSBwcHNCdWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlNQUyg3KSBvciBQUFMoOCkgZm91bmQuIFR5cGUgJWQiLCAqTkFMUHRyICYgSDI2NF9OQUxVX01BU0spOworCisgICAgICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKiZ0YXJnZXQgPSAqdGFyZ2V0UHRyOworICAgICAgICB1aW50MzJfdCBpID0gMCwgaiA9IDA7CisgICAgICAgIGJvb2wgaXNCb3VuZEZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJTaXplOyBpKyspIHsKKyAgICAgICAgICAgIHdoaWxlIChqID4gMCAmJiBOQUxQdHJbaV0gIT0gc3RhcnRQcmVmaXhDb2RlW2pdKSB7CisgICAgICAgICAgICAgICAgaiA9IHNwY0tNUGlkeFtqIC0gMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTkFMUHRyW2ldID09IHN0YXJ0UHJlZml4Q29kZVtqXSkgeworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBTUENTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlzQm91bmRGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHRhcmdldFNpemU7CisgICAgICAgIGlmICh0YXJnZXQgIT0gTlVMTCkgeworICAgICAgICAgICAgdGFyZ2V0LT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbm90ZSB0aGF0IHRhcmdldFNpemUgaXMgbmV2ZXIgMCBhcyB0aGUgZmlyc3QgYnl0ZSBpcyBuZXZlciBwYXJ0CisgICAgICAgIC8vIG9mIGEgc3RhcnQgcHJlZml4CisgICAgICAgIGlmIChpc0JvdW5kRm91bmQpIHsKKyAgICAgICAgICAgIHRhcmdldFNpemUgPSBpIC0gU1BDU2l6ZSArIDE7CisgICAgICAgICAgICB0YXJnZXQgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSh0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIG1lbWNweSh0YXJnZXQtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICB0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyB0YXJnZXRTaXplICsgU1BDU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSB0YXJnZXRTaXplIC0gU1BDU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YXJnZXRTaXplID0gYnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIHRhcmdldCA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKHRhcmdldFNpemUpOworICAgICAgICAgICAgbWVtY3B5KHRhcmdldC0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgIHRhcmdldFNpemUpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIGJ1ZmZlclNpemUsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBWcHNTcHNQcHNQYXJzZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKnZwc0J1ZmZlciwgTWVkaWFCdWZmZXJCYXNlICoqc3BzQnVmZmVyLCBNZWRpYUJ1ZmZlckJhc2UgKipwcHNCdWZmZXIpIHsKKworICAgIHdoaWxlIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gMCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpOQUxQdHIgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgdWludDhfdCBuYWxUeXBlID0gKCgqTkFMUHRyKSA+PiAxKSAmIEgyNjVfTkFMVV9NQVNLOworCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKnRhcmdldFB0ciA9IE5VTEw7CisgICAgICAgIGlmIChuYWxUeXBlID09IEgyNjVfTkFMVV9WUFMpIHsKKyAgICAgICAgICAgIHRhcmdldFB0ciA9IHZwc0J1ZmZlcjsKKyAgICAgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IEgyNjVfTkFMVV9TUFMpIHsKKyAgICAgICAgICAgIHRhcmdldFB0ciA9IHNwc0J1ZmZlcjsKKyAgICAgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IEgyNjVfTkFMVV9QUFMpIHsKKyAgICAgICAgICAgIHRhcmdldFB0ciA9IHBwc0J1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiVlBTKDMyKSBTUFMoMzMpIG9yIFBQUygzNCkgZm91bmQuIFR5cGUgJWQiLCBuYWxUeXBlKTsKKworICAgICAgICB1aW50MzJfdCBidWZmZXJTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlIComdGFyZ2V0ID0gKnRhcmdldFB0cjsKKyAgICAgICAgdWludDMyX3QgaSA9IDAsIGogPSAwOworICAgICAgICBib29sIGlzQm91bmRGb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB3aGlsZSAoaiA+IDAgJiYgTkFMUHRyW2ldICE9IHN0YXJ0UHJlZml4Q29kZVtqXSkgeworICAgICAgICAgICAgICAgIGogPSBzcGNLTVBpZHhbaiAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE5BTFB0cltpXSA9PSBzdGFydFByZWZpeENvZGVbal0pIHsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgaWYgKGogPT0gU1BDU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpc0JvdW5kRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRhcmdldC0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IHRhcmdldFNpemU7CisgICAgICAgIC8vIG5vdGUgdGhhdCB0YXJnZXRTaXplIGlzIG5ldmVyIDAgYXMgdGhlIGZpcnN0IGJ5dGUgaXMgbmV2ZXIgcGFydAorICAgICAgICAvLyBvZiBhIHN0YXJ0IHByZWZpeAorICAgICAgICBpZiAoaXNCb3VuZEZvdW5kKSB7CisgICAgICAgICAgICB0YXJnZXRTaXplID0gaSAtIFNQQ1NpemUgKyAxOworICAgICAgICAgICAgdGFyZ2V0ID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoaik7CisgICAgICAgICAgICBtZW1jcHkodGFyZ2V0LT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgaik7CisgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgdGFyZ2V0U2l6ZSArIFNQQ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gdGFyZ2V0U2l6ZSAtIFNQQ1NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFyZ2V0U2l6ZSA9IGJ1ZmZlclNpemU7CisgICAgICAgICAgICB0YXJnZXQgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSh0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIG1lbWNweSh0YXJnZXQtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICB0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBidWZmZXJTaXplLCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBBUlRQV3JpdGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19FUShtU291cmNlLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCAxMGxsKTsKKyAgICAgICAgICAgIENIRUNLX0VRKG1Tb3VyY2UtPnN0YXJ0KG1ldGEuZ2V0KCkpLCAoc3RhdHVzX3QpT0spOwogCiAjaWYgMAogICAgICAgICAgICAgaWYgKG1Nb2RlID09IEgyNjQpIHsKQEAgLTI2NCw2ICs1MDUsMTggQEAKICAgICB9CiB9CiAKK3ZvaWQgQVJUUFdyaXRlcjo6c2V0VE1NQk5JbmZvKHVpbnQzMl90IG9wcG9uZW50SUQsIHVpbnQzMl90IGJpdHJhdGUpIHsKKyAgICBtT3Bwb25lbnRJRCA9IG9wcG9uZW50SUQ7CisgICAgbUJpdHJhdGUgPSBiaXRyYXRlOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICBhZGRUTU1CTihidWZmZXIpOworCisgICAgc2VuZChidWZmZXIsIHRydWUgLyogaXNSVENQICovKTsKK30KKwogdm9pZCBBUlRQV3JpdGVyOjpvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmOwogICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJm1lZGlhQnVmKTsKQEAgLTI4MSw3ICs1MzQsMTYgQEAKIAogICAgICAgICBpZiAobU1vZGUgPT0gSDI2NCkgewogICAgICAgICAgICAgU3RyaXBTdGFydGNvZGUobWVkaWFCdWYpOwotICAgICAgICAgICAgc2VuZEFWQ0RhdGEobWVkaWFCdWYpOworICAgICAgICAgICAgU3BzUHBzUGFyc2VyKG1lZGlhQnVmLCAmbVNQU0J1ZiwgJm1QUFNCdWYpOworICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzZW5kQVZDRGF0YShtZWRpYUJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gSDI2NSkgeworICAgICAgICAgICAgU3RyaXBTdGFydGNvZGUobWVkaWFCdWYpOworICAgICAgICAgICAgVnBzU3BzUHBzUGFyc2VyKG1lZGlhQnVmLCAmbVZQU0J1ZiwgJm1TUFNCdWYsICZtUFBTQnVmKTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgc2VuZEhFVkNEYXRhKG1lZGlhQnVmKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBIMjYzKSB7CiAgICAgICAgICAgICBzZW5kSDI2M0RhdGEobWVkaWFCdWYpOwogICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEFNUl9OQiB8fCBtTW9kZSA9PSBBTVJfV0IpIHsKQEAgLTMwOSwxMiArNTcxLDM4IEBACiB9CiAKIHZvaWQgQVJUUFdyaXRlcjo6c2VuZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBib29sIGlzUlRDUCkgewotICAgIHNzaXplX3QgbiA9IHNlbmR0bygKLSAgICAgICAgICAgIG1Tb2NrZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgMCwKLSAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikoaXNSVENQID8gJm1SVENQQWRkciA6ICZtUlRQQWRkciksCi0gICAgICAgICAgICBzaXplb2YobVJUQ1BBZGRyKSk7CisgICAgaW50IHNpemVTb2NrU3Q7CisgICAgc3RydWN0IHNvY2thZGRyICpyZW1BZGRyOwogCi0gICAgQ0hFQ0tfRVEobiwgKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpOworICAgIGlmIChtSXNJUHY2KSB7CisgICAgICAgIHNpemVTb2NrU3QgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisgICAgICAgIGlmIChpc1JUQ1ApCisgICAgICAgICAgICByZW1BZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZtUlRDUEFkZHI2OworICAgICAgICBlbHNlCisgICAgICAgICAgICByZW1BZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZtUlRQQWRkcjY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZVNvY2tTdCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICAgICAgICBpZiAoaXNSVENQKQorICAgICAgICAgICAgcmVtQWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmbVJUQ1BBZGRyOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZW1BZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZtUlRQQWRkcjsKKyAgICB9CisKKyAgICAvLyBVbnNlYWwgY29kZSBpZiBtb2RlcmF0b3IgaXMgbmVlZGVkIChwcmV2ZW50IG92ZXJmbG93IG9mIGluc3RhbnQgYmFuZHdpZHRoKQorICAgIC8vIFNldCBsaW1pdCBiaXRzIHBlciBwZXJpb2QgdGhyb3VnaCB0aGUgbW9kZXJhdG9yLgorICAgIC8vIGV4KSA2S0J5dGUvMTBtcyA9IDQ4S0JpdC8xMG1zID0gNC44TUJpdC9zIGluc3RhbnQgbGltaXQKKyAgICAvLyBNb2RlcmF0ZUluc3RhbnRUcmFmZmljKDEwLCA2ICogMTAyNCk7CisKKyAgICBzc2l6ZV90IG4gPSBzZW5kdG8oaXNSVENQID8gbVJUQ1BTb2NrZXQgOiBtUlRQU29ja2V0LAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCAwLCByZW1BZGRyLCBzaXplU29ja1N0KTsKKworICAgIGlmIChuICE9IChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgIEFMT0dXKCJwYWNrZXRzIGNhbiBub3QgYmUgc2VudC4gcmV0PSVkLCBidWY9JWQiLCAoaW50KW4sIChpbnQpYnVmZmVyLT5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlY29yZCBjdXJyZW50IHRyYWZmaWMgJiBQcmludCBiaXRzIHdoaWxlIGxhc3QgMXNlYyAoMTAwMG1zKQorICAgICAgICBtVHJhZmZpY1JlYy0+d3JpdGVCeXRlcyhidWZmZXItPnNpemUoKSk7CisgICAgICAgIG1UcmFmZmljUmVjLT5wcmludEFjY3VCaXRzRm9yTGFzdFBlcmlvZCgxMDAwLCAxMDAwKTsKKyAgICB9CiAKICNpZiBMT0dfVE9fRklMRVMKICAgICBpbnQgZmQgPSBpc1JUQ1AgPyBtUlRDUEZkIDogbVJUUEZkOwpAQCAtMzc5LDcgKzY2Nyw2IEBACiAKICAgICBkYXRhW29mZnNldCsrXSA9IDE7ICAvLyBDTkFNRQogCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtDTkFNRSA9ICJzb21lb25lQHNvbWV3aGVyZSI7CiAgICAgZGF0YVtvZmZzZXQrK10gPSBzdHJsZW4oa0NOQU1FKTsKIAogICAgIG1lbWNweSgmZGF0YVtvZmZzZXRdLCBrQ05BTUUsIHN0cmxlbihrQ05BTUUpKTsKQEAgLTQxNiw5ICs3MDMsNTIgQEAKICAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgb2Zmc2V0KTsKIH0KIAordm9pZCBBUlRQV3JpdGVyOjphZGRUTU1CTihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpICsgMjAgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR1coIlJUQ1AgYnVmZmVyIHRvbyBzbWFsbCB0byBhY2NvbW1vZGF0ZSBTUi4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobU9wcG9uZW50SUQgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CisKKyAgICBkYXRhWzBdID0gMHg4MCB8IDQ7IC8vIFRNTUJOCisgICAgZGF0YVsxXSA9IDIwNTsgICAgICAvLyBUU0ZCCisgICAgZGF0YVsyXSA9IDA7CisgICAgZGF0YVszXSA9IDQ7ICAgICAgICAvLyB0b3RhbCAoNCsxKSAqIHNpemVvZihpbnQzMl90KSA9IDIwIGJ5dGVzCisgICAgZGF0YVs0XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICBkYXRhWzVdID0gKG1Tb3VyY2VJRCA+PiAxNikgJiAweGZmOworICAgIGRhdGFbNl0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzddID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICooaW50MzJfdCopKCZkYXRhWzhdKSA9IDA7ICAvLyA0IGJ5dGVzIGJsYW5rCisKKyAgICBkYXRhWzEyXSA9IG1PcHBvbmVudElEID4+IDI0OworICAgIGRhdGFbMTNdID0gKG1PcHBvbmVudElEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxNF0gPSAobU9wcG9uZW50SUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMTVdID0gbU9wcG9uZW50SUQgJiAweGZmOworCisgICAgaW50MzJfdCBleHAsIG1hbnRpc3NhOworCisgICAgLy8gUm91bmQgb2ZmIHRvIHRoZSBuZWFyZXN0IDJeNHRoCisgICAgQUxPR0koIlVFIC0+IE9wIE5vdGkgVHggYml0cmF0ZSA6ICVkICIsIG1CaXRyYXRlICYgMHhmZmZmZmZmMCk7CisgICAgZm9yIChleHA9NCA7IGV4cCA8IDMyIDsgZXhwKyspCisgICAgICAgIGlmICgoKG1CaXRyYXRlID4+IGV4cCkgJiAweDAxKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgbWFudGlzc2EgPSBtQml0cmF0ZSA+PiBleHA7CisKKyAgICBkYXRhWzE2XSA9ICgoZXhwIDw8IDIpICYgMHhmYykgfCAoKG1hbnRpc3NhICYgMHgxODAwMCkgPj4gMTUpOworICAgIGRhdGFbMTddID0gICAgICAgICAgICAgICAgICAgICAgICAobWFudGlzc2EgJiAweDA3ZjgwKSA+PiA3OworICAgIGRhdGFbMThdID0gICAgICAgICAgICAgICAgICAgICAgICAobWFudGlzc2EgJiAweDAwMDdmKSA8PCAxOworICAgIGRhdGFbMTldID0gNDA7ICAgICAgICAgICAgICAvLyA0MCBieXRlcyBvdmVyaGVhZDsKKworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAyMCk7Cit9CisKIC8vIHN0YXRpYwogdWludDY0X3QgQVJUUFdyaXRlcjo6R2V0Tm93TlRQKCkgewotICAgIHVpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICB1aW50NjRfdCBub3dVcyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpIC8gMTAwMGxsOwogCiAgICAgbm93VXMgKz0gKCg3MExMICogMzY1ICsgMTcpICogMjQpICogNjAgKiA2MCAqIDEwMDAwMDBMTDsKIApAQCAtNDYzLDcgKzc5Myw3IEBACiAgICAgICAgIHNkcC5hcHBlbmQoIm09YXVkaW8gIik7CiAgICAgfQogCi0gICAgc2RwLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIlZCIsIG50b2hzKG1SVFBBZGRyLnNpbl9wb3J0KSkpOworICAgIHNkcC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiJWQiLCBtSXNJUHY2ID8gbnRvaHMobVJUUEFkZHI2LnNpbjZfcG9ydCkgOiBudG9ocyhtUlRQQWRkci5zaW5fcG9ydCkpKTsKICAgICBzZHAuYXBwZW5kKAogICAgICAgICAgICIgUlRQL0FWUCAiIFBUX1NUUiAiXHJcbiIKICAgICAgICAgICAiYj1BUyAzMjAwMDBcclxuIgpAQCAtNTY5LDI0ICs4OTksOTEgQEAKICAgICBzZW5kKGJ1ZmZlciwgdHJ1ZSAvKiBpc1JUQ1AgKi8pOwogfQogCi12b2lkIEFSVFBXcml0ZXI6OnNlbmRBVkNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpIHsKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZFNQU1BQU0lmSUZyYW1lKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYsIGludDY0X3QgdGltZVVzKSB7CisgICAgQ0hFQ0sobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCk7CisgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOworCisgICAgaWYgKChtZWRpYURhdGFbMF0gJiBIMjY0X05BTFVfTUFTSykgIT0gSDI2NF9OQUxVX0lGUkFNRSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1TUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtU1BTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgbVNQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVNwcywgMSk7CisgICAgICAgIHNlbmRBVkNEYXRhKG1TUFNCdWYpOworICAgIH0KKworICAgIGlmIChtUFBTQnVmICE9IE5VTEwpIHsKKyAgICAgICAgbVBQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgIG1QUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlQcHMsIDEpOworICAgICAgICBzZW5kQVZDRGF0YShtUFBTQnVmKTsKKyAgICB9Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZFZQU1NQU1BQU0lmSUZyYW1lKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYsIGludDY0X3QgdGltZVVzKSB7CisgICAgQ0hFQ0sobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCk7CisgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOworCisgICAgaW50IG5hbFR5cGUgPSAoKG1lZGlhRGF0YVswXSA+PiAxKSAmIEgyNjVfTkFMVV9NQVNLKTsKKyAgICBpZiAoIShuYWxUeXBlID49IDE2ICYmIG5hbFR5cGUgPD0gMjEpIC8qSDI2NV9OQUxVX0lGUkFNRSovKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVZQU0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1WUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBtVlBTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VnBzLCAxKTsKKyAgICAgICAgc2VuZEhFVkNEYXRhKG1WUFNCdWYpOworICAgIH0KKworICAgIGlmIChtU1BTQnVmICE9IE5VTEwpIHsKKyAgICAgICAgbVNQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgIG1TUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlTcHMsIDEpOworICAgICAgICBzZW5kSEVWQ0RhdGEobVNQU0J1Zik7CisgICAgfQorCisgICAgaWYgKG1QUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtUFBTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgbVBQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVBwcywgMSk7CisgICAgICAgIHNlbmRIRVZDRGF0YShtUFBTQnVmKTsKKyAgICB9Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEhFVkNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpIHsKICAgICAvLyAxMiBieXRlcyBSVFAgaGVhZGVyICsgMiBieXRlcyBmb3IgdGhlIEZVLWluZGljYXRvciBhbmQgRlUtaGVhZGVyLgogICAgIENIRUNLX0dFKGtNYXhQYWNrZXRTaXplLCAxMnUgKyAydSk7CiAKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKLSAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBMTCk7CisgICAgc2VuZFZQU1NQU1BQU0lmSUZyYW1lKG1lZGlhQnVmLCB0aW1lVXMpOwogCisgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwbGwpOworCisgICAgQ0hFQ0sobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCk7CiAgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOwogCisgICAgaW50MzJfdCBpc05vblZDTCA9IDA7CisgICAgaWYgKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVZwcywgJmlzTm9uVkNMKSB8fAorICAgICAgICAgICAgbWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5U3BzLCAmaXNOb25WQ0wpIHx8CisgICAgICAgICAgICBtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlQcHMsICZpc05vblZDTCkpIHsKKyAgICAgICAgaXNOb25WQ0wgPSAxOworICAgIH0KKwogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhQYWNrZXRTaXplKTsKLSAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpICsgMTIgPD0gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisKKyAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpICsgVENQSVBfSEVBREVSX1NJWkUgKyBSVFBfSEVBREVSX1NJWkUgKyBSVFBfSEVBREVSX0VYVF9TSVpFCisgICAgICAgICAgICArIFJUUF9QQVlMT0FEX1JPT01fU0laRSA8PSBidWZmZXItPmNhcGFjaXR5KCkpIHsKICAgICAgICAgLy8gVGhlIGRhdGEgZml0cyBpbnRvIGEgc2luZ2xlIHBhY2tldAogICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgIGRhdGFbMF0gPSAweDgwOwotICAgICAgICBkYXRhWzFdID0gKDEgPDwgNykgfCBQVDsgIC8vIE0tYml0CisgICAgICAgIGlmIChpc05vblZDTCkgeworICAgICAgICAgICAgZGF0YVsxXSA9IG1QYXlsb2FkVHlwZTsgIC8vIE1hcmtlciBiaXQgc2hvdWxkIG5vdCBiZSBzZXQgaW4gY2FzZSBvZiBOb24tVkNMCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhWzFdID0gKDEgPDwgNykgfCBtUGF5bG9hZFR5cGU7ICAvLyBNLWJpdAorICAgICAgICB9CiAgICAgICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKICAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7CiAgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OwpAQCAtNjExLDIxICsxMDA4LDI0IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRlUtQQogCi0gICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBtZWRpYURhdGFbMF07Ci0gICAgICAgIHNpemVfdCBvZmZzZXQgPSAxOworICAgICAgICB1bnNpZ25lZCBuYWxUeXBlID0gKG1lZGlhRGF0YVswXSA+PiAxKSAmIEgyNjVfTkFMVV9NQVNLOworICAgICAgICBBTE9HVigiSDI2NSBuYWxUeXBlIDB4JXgsIGRhdGFbMF09MHgleCIsIG5hbFR5cGUsIG1lZGlhRGF0YVswXSk7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSAyOyAvL0gyNjUgcGF5bG9hZCBoZWFkZXIgaXMgMTYgYml0LgogCiAgICAgICAgIGJvb2wgZmlyc3RQYWNrZXQgPSB0cnVlOwogICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKSB7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSAtIG9mZnNldDsKICAgICAgICAgICAgIGJvb2wgbGFzdFBhY2tldCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoc2l6ZSArIDEyICsgMiA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgaWYgKHNpemUgKyBUQ1BJUF9IRUFERVJfU0laRSArIFJUUF9IRUFERVJfU0laRSArIFJUUF9IRUFERVJfRVhUX1NJWkUgKworICAgICAgICAgICAgICAgICAgICBSVFBfRlVfSEVBREVSX1NJWkUgKyBSVFBfUEFZTE9BRF9ST09NX1NJWkUgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKICAgICAgICAgICAgICAgICBsYXN0UGFja2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+Y2FwYWNpdHkoKSAtIDEyIC0gMjsKKyAgICAgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gVENQSVBfSEVBREVSX1NJWkUgLSBSVFBfSEVBREVSX1NJWkUgLQorICAgICAgICAgICAgICAgICAgICBSVFBfSEVBREVSX0VYVF9TSVpFIC0gUlRQX0ZVX0hFQURFUl9TSVpFIC0gUlRQX1BBWUxPQURfUk9PTV9TSVpFOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgICAgICBkYXRhWzBdID0gMHg4MDsKLSAgICAgICAgICAgIGRhdGFbMV0gPSAobGFzdFBhY2tldCA/ICgxIDw8IDcpIDogMHgwMCkgfCBQVDsgIC8vIE0tYml0CisgICAgICAgICAgICBkYXRhWzFdID0gKGxhc3RQYWNrZXQgPyAoMSA8PCA3KSA6IDB4MDApIHwgbVBheWxvYWRUeXBlOyAgLy8gTS1iaXQKICAgICAgICAgICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKICAgICAgICAgICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOwogICAgICAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CkBAIC02MzcsMTggKzEwMzcsMzkgQEAKICAgICAgICAgICAgIGRhdGFbMTBdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CiAgICAgICAgICAgICBkYXRhWzExXSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CiAKLSAgICAgICAgICAgIGRhdGFbMTJdID0gMjggfCAobmFsVHlwZSAmIDB4ZTApOworICAgICAgICAgICAgLyogIEgyNjUgcGF5bG9hZCBoZWFkZXIgaXMgMTYgYml0CisgICAgICAgICAgICAgICAgIDAgMSAyIDMgNCA1IDYgNyAwIDEgMiAzIDQgNSA2IDcKKyAgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgICB8RnwgICAgIFR5cGUgIHwgIExheWVyIElEIHwgVElEIHwKKyAgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBBTE9HVigiSDI2NSBwYXlsb2FkIGhlYWRlciAweCV4ICV4IiwgbWVkaWFEYXRhWzBdLCBtZWRpYURhdGFbMV0pOworICAgICAgICAgICAgLy8gZXhjbHVkZXMgVHlwZSBmcm9tIDFzdCBieXRlIG9mIEgyNjUgcGF5bG9hZCBoZWFkZXIuCisgICAgICAgICAgICBkYXRhWzEyXSA9IG1lZGlhRGF0YVswXSAmIDB4ODE7CisgICAgICAgICAgICAvLyBmaWxscyBUeXBlIGFzIEZVICg0OSA9PSAweDMxKQorICAgICAgICAgICAgZGF0YVsxMl0gPSBkYXRhWzEyXSB8ICgweDMxIDw8IDEpOworICAgICAgICAgICAgZGF0YVsxM10gPSBtZWRpYURhdGFbMV07CisKKyAgICAgICAgICAgIEFMT0dWKCJIMjY1IEZVIGhlYWRlciAweCV4ICV4IiwgZGF0YVsxMl0sIGRhdGFbMTNdKTsKIAogICAgICAgICAgICAgQ0hFQ0soIWZpcnN0UGFja2V0IHx8ICFsYXN0UGFja2V0KTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgRlUgSU5ESUNBVE9SIEhEUgorICAgICAgICAgICAgICAgIDAgMSAyIDMgNCA1IDYgNworICAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICAgIHxTfEV8ICAgVHlwZSAgfAorICAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKworICAgICAgICAgICAgKi8KIAotICAgICAgICAgICAgZGF0YVsxM10gPQorICAgICAgICAgICAgZGF0YVsxNF0gPQogICAgICAgICAgICAgICAgIChmaXJzdFBhY2tldCA/IDB4ODAgOiAweDAwKQogICAgICAgICAgICAgICAgIHwgKGxhc3RQYWNrZXQgPyAweDQwIDogMHgwMCkKLSAgICAgICAgICAgICAgICB8IChuYWxUeXBlICYgMHgxZik7CisgICAgICAgICAgICAgICAgfCAobmFsVHlwZSAmIEgyNjVfTkFMVV9NQVNLKTsKKyAgICAgICAgICAgIEFMT0dWKCJIMjY1IEZVIGluZGljYXRvciAweCV4IiwgZGF0YVsxNF0pOwogCi0gICAgICAgICAgICBtZW1jcHkoJmRhdGFbMTRdLCAmbWVkaWFEYXRhW29mZnNldF0sIHNpemUpOworICAgICAgICAgICAgbWVtY3B5KCZkYXRhWzE1XSwgJm1lZGlhRGF0YVtvZmZzZXRdLCBzaXplKTsKIAotICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAxNCArIHNpemUpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAxNSArIHNpemUpOwogCiAgICAgICAgICAgICBzZW5kKGJ1ZmZlciwgZmFsc2UgLyogaXNSVENQICovKTsKIApAQCAtNjYzLDYgKzEwODQsMTcyIEBACiAKICAgICBtTGFzdFJUUFRpbWUgPSBydHBUaW1lOwogICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOworCit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZikgeworICAgIC8vIDEyIGJ5dGVzIFJUUCBoZWFkZXIgKyAyIGJ5dGVzIGZvciB0aGUgRlUtaW5kaWNhdG9yIGFuZCBGVS1oZWFkZXIuCisgICAgQ0hFQ0tfR0Uoa01heFBhY2tldFNpemUsIDEydSArIDJ1KTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgIHNlbmRTUFNQUFNJZklGcmFtZShtZWRpYUJ1ZiwgdGltZVVzKTsKKworICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMExMKTsKKworICAgIENIRUNLKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSA+IDApOworICAgIGNvbnN0IHVpbnQ4X3QgKm1lZGlhRGF0YSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopbWVkaWFCdWYtPmRhdGEoKSArIG1lZGlhQnVmLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIGludDMyX3Qgc3BzLCBwcHM7CisgICAgYm9vbCBpc1Nwc1BwcyA9IGZhbHNlOworICAgIGlmIChtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlTcHMsICZzcHMpIHx8CisgICAgICAgICAgICBtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlQcHMsICZwcHMpKSB7CisgICAgICAgIGlzU3BzUHBzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtVHJhZmZpY1JlYy0+dXBkYXRlQ2xvY2soQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDApOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhQYWNrZXRTaXplKTsKKyAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpICsgVENQSVBfSEVBREVSX1NJWkUgKyBSVFBfSEVBREVSX1NJWkUgKyBSVFBfSEVBREVSX0VYVF9TSVpFCisgICAgICAgICAgICArIFJUUF9QQVlMT0FEX1JPT01fU0laRSA8PSBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgLy8gVGhlIGRhdGEgZml0cyBpbnRvIGEgc2luZ2xlIHBhY2tldAorICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgIGRhdGFbMF0gPSAweDgwOworICAgICAgICBpZiAobVJUUENWT0V4dE1hcCA+IDApCisgICAgICAgICAgICBkYXRhWzBdIHw9IDB4MTA7CisgICAgICAgIGlmIChpc1Nwc1BwcykKKyAgICAgICAgICAgIGRhdGFbMV0gPSBtUGF5bG9hZFR5cGU7ICAvLyBNYXJrZXIgYml0IHNob3VsZCBub3QgYmUgc2V0IGluIGNhc2Ugb2Ygc3BzL3BwcworICAgICAgICBlbHNlCisgICAgICAgICAgICBkYXRhWzFdID0gKDEgPDwgNykgfCBtUGF5bG9hZFR5cGU7CisgICAgICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKKyAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7CisgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OworICAgICAgICBkYXRhWzVdID0gKHJ0cFRpbWUgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKKyAgICAgICAgZGF0YVs3XSA9IHJ0cFRpbWUgJiAweGZmOworICAgICAgICBkYXRhWzhdID0gbVNvdXJjZUlEID4+IDI0OworICAgICAgICBkYXRhWzldID0gKG1Tb3VyY2VJRCA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzExXSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CisKKyAgICAgICAgaW50IHJ0cEV4dEluZGV4ID0gMDsKKyAgICAgICAgaWYgKG1SVFBDVk9FeHRNYXAgPiAwKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgIHwgICAgICAgMHhCRSAgICB8ICAgIDB4REUgICAgICAgfCAgICAgICAgICAgbGVuZ3RoPTMgICAgICAgICAgICB8CisgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICAgfCAgSUQgICB8IEw9MCAgIHwgICAgIGRhdGEgICAgICB8ICBJRCAgIHwgIEw9MSAgfCAgIGRhdGEuLi4KKyAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgICAgICAgICAuLi5kYXRhICAgfCAgICAwIChwYWQpICAgIHwgICAgMCAocGFkKSAgICB8ICBJRCAgIHwgTD0zICAgfAorICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisKKyAgICAgICAgICAgICAgSW4gdGhlIG9uZS1ieXRlIGhlYWRlciBmb3JtIG9mIGV4dGVuc2lvbnMsIHRoZSAxNi1iaXQgdmFsdWUgcmVxdWlyZWQKKyAgICAgICAgICAgICAgYnkgdGhlIFJUUCBzcGVjaWZpY2F0aW9uIGZvciBhIGhlYWRlciBleHRlbnNpb24sIGxhYmVsZWQgaW4gdGhlIFJUUAorICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uIGFzICJkZWZpbmVkIGJ5IHByb2ZpbGUiLCB0YWtlcyB0aGUgZml4ZWQgYml0IHBhdHRlcm4KKyAgICAgICAgICAgICAgMHhCRURFICh0aGUgZmlyc3QgdmVyc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24gd2FzIHdyaXR0ZW4gb24gdGhlCisgICAgICAgICAgICAgIGZlYXN0IGRheSBvZiB0aGUgVmVuZXJhYmxlIEJlZGUpLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRhdGFbMTJdID0gMHhCRTsKKyAgICAgICAgICAgIGRhdGFbMTNdID0gMHhERTsKKyAgICAgICAgICAgIC8vIHB1dCBhIGxlbmd0aCBvZiBSVFAgRXh0ZW5zaW9uLgorICAgICAgICAgICAgZGF0YVsxNF0gPSAweDAwOworICAgICAgICAgICAgZGF0YVsxNV0gPSAweDAxOworICAgICAgICAgICAgLy8gcHV0IGV4dG1hcCBvZiBSVFAgYXNzaWduZWQgZm9yIENWTy4KKyAgICAgICAgICAgIGRhdGFbMTZdID0gKG1SVFBDVk9FeHRNYXAgPDwgNCkgfCAweDA7CisgICAgICAgICAgICAvLyBwdXQgaW1hZ2UgZGVncmVlcyBhcyBwZXIgQ1ZPIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICBkYXRhWzE3XSA9IG1SVFBDVk9EZWdyZWVzOworICAgICAgICAgICAgZGF0YVsxOF0gPSAweDA7CisgICAgICAgICAgICBkYXRhWzE5XSA9IDB4MDsKKyAgICAgICAgICAgIHJ0cEV4dEluZGV4ID0gODsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSgmZGF0YVsxMiArIHJ0cEV4dEluZGV4XSwKKyAgICAgICAgICAgICAgIG1lZGlhRGF0YSwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKTsKKworICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSArICgxMiArIHJ0cEV4dEluZGV4KSk7CisKKyAgICAgICAgc2VuZChidWZmZXIsIGZhbHNlIC8qIGlzUlRDUCAqLyk7CisKKyAgICAgICAgKyttU2VxTm87CisgICAgICAgICsrbU51bVJUUFNlbnQ7CisgICAgICAgIG1OdW1SVFBPY3RldHNTZW50ICs9IGJ1ZmZlci0+c2l6ZSgpIC0gKDEyICsgcnRwRXh0SW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZVLUEKKworICAgICAgICB1bnNpZ25lZCBuYWxUeXBlID0gbWVkaWFEYXRhWzBdOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMTsKKworICAgICAgICBib29sIGZpcnN0UGFja2V0ID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSBvZmZzZXQ7CisgICAgICAgICAgICBib29sIGxhc3RQYWNrZXQgPSB0cnVlOworICAgICAgICAgICAgaWYgKHNpemUgKyBUQ1BJUF9IRUFERVJfU0laRSArIFJUUF9IRUFERVJfU0laRSArIFJUUF9IRUFERVJfRVhUX1NJWkUgKworICAgICAgICAgICAgICAgICAgICBSVFBfRlVfSEVBREVSX1NJWkUgKyBSVFBfUEFZTE9BRF9ST09NX1NJWkUgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICBsYXN0UGFja2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+Y2FwYWNpdHkoKSAtIFRDUElQX0hFQURFUl9TSVpFIC0gUlRQX0hFQURFUl9TSVpFIC0KKyAgICAgICAgICAgICAgICAgICAgUlRQX0hFQURFUl9FWFRfU0laRSAtIFJUUF9GVV9IRUFERVJfU0laRSAtIFJUUF9QQVlMT0FEX1JPT01fU0laRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgZGF0YVswXSA9IDB4ODA7CisgICAgICAgICAgICBpZiAobGFzdFBhY2tldCAmJiBtUlRQQ1ZPRXh0TWFwID4gMCkKKyAgICAgICAgICAgICAgICBkYXRhWzBdIHw9IDB4MTA7CisgICAgICAgICAgICBkYXRhWzFdID0gKGxhc3RQYWNrZXQgPyAoMSA8PCA3KSA6IDB4MDApIHwgbVBheWxvYWRUeXBlOyAgLy8gTS1iaXQKKyAgICAgICAgICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOworICAgICAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CisgICAgICAgICAgICBkYXRhWzVdID0gKHJ0cFRpbWUgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbNl0gPSAocnRwVGltZSA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzddID0gcnRwVGltZSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzhdID0gbVNvdXJjZUlEID4+IDI0OworICAgICAgICAgICAgZGF0YVs5XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbMTBdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzExXSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CisKKyAgICAgICAgICAgIGludCBydHBFeHRJbmRleCA9IDA7CisgICAgICAgICAgICBpZiAobGFzdFBhY2tldCAmJiBtUlRQQ1ZPRXh0TWFwID4gMCkgeworICAgICAgICAgICAgICAgIGRhdGFbMTJdID0gMHhCRTsKKyAgICAgICAgICAgICAgICBkYXRhWzEzXSA9IDB4REU7CisgICAgICAgICAgICAgICAgZGF0YVsxNF0gPSAweDAwOworICAgICAgICAgICAgICAgIGRhdGFbMTVdID0gMHgwMTsKKyAgICAgICAgICAgICAgICBkYXRhWzE2XSA9IChtUlRQQ1ZPRXh0TWFwIDw8IDQpIHwgMHgwOworICAgICAgICAgICAgICAgIGRhdGFbMTddID0gbVJUUENWT0RlZ3JlZXM7CisgICAgICAgICAgICAgICAgZGF0YVsxOF0gPSAweDA7CisgICAgICAgICAgICAgICAgZGF0YVsxOV0gPSAweDA7CisgICAgICAgICAgICAgICAgcnRwRXh0SW5kZXggPSA4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhWzEyICsgcnRwRXh0SW5kZXhdID0gMjggfCAobmFsVHlwZSAmIDB4ZTApOworCisgICAgICAgICAgICBDSEVDSyghZmlyc3RQYWNrZXQgfHwgIWxhc3RQYWNrZXQpOworCisgICAgICAgICAgICBkYXRhWzEzICsgcnRwRXh0SW5kZXhdID0KKyAgICAgICAgICAgICAgICAoZmlyc3RQYWNrZXQgPyAweDgwIDogMHgwMCkKKyAgICAgICAgICAgICAgICB8IChsYXN0UGFja2V0ID8gMHg0MCA6IDB4MDApCisgICAgICAgICAgICAgICAgfCAobmFsVHlwZSAmIDB4MWYpOworCisgICAgICAgICAgICBtZW1jcHkoJmRhdGFbMTQgKyBydHBFeHRJbmRleF0sICZtZWRpYURhdGFbb2Zmc2V0XSwgc2l6ZSk7CisKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMTQgKyBydHBFeHRJbmRleCArIHNpemUpOworCisgICAgICAgICAgICBzZW5kKGJ1ZmZlciwgZmFsc2UgLyogaXNSVENQICovKTsKKworICAgICAgICAgICAgKyttU2VxTm87CisgICAgICAgICAgICArK21OdW1SVFBTZW50OworICAgICAgICAgICAgbU51bVJUUE9jdGV0c1NlbnQgKz0gYnVmZmVyLT5zaXplKCkgLSAoMTIgKyBydHBFeHRJbmRleCk7CisKKyAgICAgICAgICAgIGZpcnN0UGFja2V0ID0gZmFsc2U7CisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1MYXN0UlRQVGltZSA9IHJ0cFRpbWU7CisgICAgbUxhc3ROVFBUaW1lID0gR2V0Tm93TlRQKCk7CiB9CiAKIHZvaWQgQVJUUFdyaXRlcjo6c2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpIHsKQEAgLTY5Niw3ICsxMjgzLDcgQEAKIAogICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgIGRhdGFbMF0gPSAweDgwOwotICAgICAgICBkYXRhWzFdID0gKGxhc3RQYWNrZXQgPyAweDgwIDogMHgwMCkgfCBQVDsgIC8vIE0tYml0CisgICAgICAgIGRhdGFbMV0gPSAobGFzdFBhY2tldCA/IDB4ODAgOiAweDAwKSB8IG1QYXlsb2FkVHlwZTsgIC8vIE0tYml0CiAgICAgICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKICAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7CiAgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OwpAQCAtNzI3LDYgKzEzMTQsNTQgQEAKICAgICBtTGFzdE5UUFRpbWUgPSBHZXROb3dOVFAoKTsKIH0KIAordm9pZCBBUlRQV3JpdGVyOjp1cGRhdGVDVk9EZWdyZWVzKGludDMyX3QgY3ZvRGVncmVlcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVJUUENWT0RlZ3JlZXMgPSBjdm9EZWdyZWVzOworfQorCit2b2lkIEFSVFBXcml0ZXI6OnVwZGF0ZVBheWxvYWRUeXBlKGludDMyX3QgcGF5bG9hZFR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1QYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlOworfQorCit2b2lkIEFSVFBXcml0ZXI6OnVwZGF0ZVNvY2tldERzY3AoaW50MzJfdCBkc2NwKSB7CisgICAgbVJ0cExheWVyM0RzY3AgPSBkc2NwIDw8IDI7CisKKyAgICAvKiBtUnRwTGF5ZXIzRHNjcCB3aWxsIGJlIG1hcHBlZCB0byBXTU0oV2lmaSkgYXMgcGVyIG9wZXJhdG9yJ3MgcmVxdWlyZW1lbnQgKi8KKyAgICBpZiAoc2V0c29ja29wdChtUlRQU29ja2V0LCBJUFBST1RPX0lQLCBJUF9UT1MsCisgICAgICAgICAgICAgICAgKGludCAqKSZtUnRwTGF5ZXIzRHNjcCwgc2l6ZW9mKG1SdHBMYXllcjNEc2NwKSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGRzY3Agb24gcnRwc29jay4gZXJyPSVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgic3VjY2Vzc2Z1bGx5IHNldCBkc2NwIG9uIHJ0cHNvY2suIG9wdD0lZCIsIG1SdHBMYXllcjNEc2NwKTsKKyAgICAgICAgc2V0c29ja29wdChtUlRDUFNvY2tldCwgSVBQUk9UT19JUCwgSVBfVE9TLAorICAgICAgICAgICAgICAgIChpbnQgKikmbVJ0cExheWVyM0RzY3AsIHNpemVvZihtUnRwTGF5ZXIzRHNjcCkpOworICAgICAgICBBTE9HRCgic3VjY2Vzc2Z1bGx5IHNldCBkc2NwIG9uIHJ0Y3Bzb2NrLiBvcHQ9JWQiLCBtUnRwTGF5ZXIzRHNjcCk7CisgICAgfQorfQorCit2b2lkIEFSVFBXcml0ZXI6OnVwZGF0ZVNvY2tldE5ldHdvcmsoaW50NjRfdCBzb2NrZXROZXR3b3JrKSB7CisgICAgbVJUUFNvY2tOZXR3b3JrID0gKG5ldF9oYW5kbGVfdClzb2NrZXROZXR3b3JrOworICAgIEFMT0dJKCJ0cnlpbmcgdG8gYmluZCBydHAgc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpLiIsCisgICAgICAgICAgICAgICAgbVJUUFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZyltUlRQU29ja05ldHdvcmspOworCisgICAgaW50IHJlc3VsdCA9IGFuZHJvaWRfc2V0c29ja25ldHdvcmsobVJUUFNvY2tOZXR3b3JrLCBtUlRQU29ja2V0KTsKKyAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCglZCkgdG8gYmluZCBydHAgc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpIiwKKyAgICAgICAgICAgICAgICByZXN1bHQsIG1SVFBTb2NrZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpbVJUUFNvY2tOZXR3b3JrKTsKKyAgICB9CisgICAgcmVzdWx0ID0gYW5kcm9pZF9zZXRzb2NrbmV0d29yayhtUlRQU29ja05ldHdvcmssIG1SVENQU29ja2V0KTsKKyAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCglZCkgdG8gYmluZCBydGNwIHNvY2tldCglZCkgdG8gbmV0d29yayglbGx1KSIsCisgICAgICAgICAgICAgICAgcmVzdWx0LCBtUlRDUFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZyltUlRQU29ja05ldHdvcmspOworICAgIH0KKyAgICBBTE9HSSgiZG9uZS4gYmluZCBydHAgc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpIiwKKyAgICAgICAgICAgICAgICBtUlRQU29ja2V0LCAodW5zaWduZWQgbG9uZyBsb25nKW1SVFBTb2NrTmV0d29yayk7Cit9CisKK3VpbnQzMl90IEFSVFBXcml0ZXI6OmdldFNlcXVlbmNlTnVtKCkgeworICAgIHJldHVybiBtU2VxTm87Cit9CisKIHN0YXRpYyBzaXplX3QgZ2V0RnJhbWVTaXplKGJvb2wgaXNXaWRlLCB1bnNpZ25lZCBGVCkgewogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZU5CWzhdID0gewogICAgICAgICA5NSwgMTAzLCAxMTgsIDEzNCwgMTQ4LCAxNTksIDIwNCwgMjQ0CkBAIC03NzgsNyArMTQxMyw3IEBACiAgICAgLy8gVGhlIGRhdGEgZml0cyBpbnRvIGEgc2luZ2xlIHBhY2tldAogICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKICAgICBkYXRhWzBdID0gMHg4MDsKLSAgICBkYXRhWzFdID0gUFQ7CisgICAgZGF0YVsxXSA9IG1QYXlsb2FkVHlwZTsKICAgICBpZiAobU51bVJUUFNlbnQgPT0gMCkgewogICAgICAgICAvLyBTaWduYWwgc3RhcnQgb2YgdGFsay1zcHVydC4KICAgICAgICAgZGF0YVsxXSB8PSAweDgwOyAgLy8gTS1iaXQKQEAgLTgzNCw1ICsxNDY5LDkxIEBACiAgICAgbUxhc3ROVFBUaW1lID0gR2V0Tm93TlRQKCk7CiB9CiAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit2b2lkIEFSVFBXcml0ZXI6Om1ha2VTb2NrZXRQYWlyQW5kQmluZChTdHJpbmc4JiBsb2NhbElwLCBpbnQgbG9jYWxQb3J0LAorICAgICAgICBTdHJpbmc4JiByZW1vdGVJcCwgaW50IHJlbW90ZVBvcnQpIHsKKyAgICBzdGF0aWMgY2hhciBrU29tZW9uZVsxNl0gPSAic29tZW9uZUAiOworICAgIGludCBuYW1lTGVuZ3RoID0gc3RybGVuKGtTb21lb25lKTsKKyAgICBtZW1jcHkoa0NOQU1FLCBrU29tZW9uZSwgbmFtZUxlbmd0aCk7CisgICAgbWVtY3B5KGtDTkFNRSArIG5hbWVMZW5ndGgsIGxvY2FsSXAuY19zdHIoKSwgbG9jYWxJcC5sZW5ndGgoKSArIDEpOwogCisgICAgaWYgKGxvY2FsSXAuY29udGFpbnMoIjoiKSkKKyAgICAgICAgbUlzSVB2NiA9IHRydWU7CisgICAgZWxzZQorICAgICAgICBtSXNJUHY2ID0gZmFsc2U7CisKKyAgICBtUlRQU29ja2V0ID0gc29ja2V0KG1Jc0lQdjYgPyBBRl9JTkVUNiA6IEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIENIRUNLX0dFKG1SVFBTb2NrZXQsIDApOworICAgIG1SVENQU29ja2V0ID0gc29ja2V0KG1Jc0lQdjYgPyBBRl9JTkVUNiA6IEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIENIRUNLX0dFKG1SVENQU29ja2V0LCAwKTsKKworICAgIGludCBzb2Nrb3B0ID0gMTsKKyAgICBzZXRzb2Nrb3B0KG1SVFBTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKGludCAqKSZzb2Nrb3B0LCBzaXplb2Yoc29ja29wdCkpOworICAgIHNldHNvY2tvcHQobVJUQ1BTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKGludCAqKSZzb2Nrb3B0LCBzaXplb2Yoc29ja29wdCkpOworCisgICAgaWYgKG1Jc0lQdjYpIHsKKyAgICAgICAgbWVtc2V0KCZtTG9jYWxBZGRyNiwgMCwgc2l6ZW9mKG1Mb2NhbEFkZHI2KSk7CisgICAgICAgIG1lbXNldCgmbVJUUEFkZHI2LCAwLCBzaXplb2YobVJUUEFkZHI2KSk7CisgICAgICAgIG1lbXNldCgmbVJUQ1BBZGRyNiwgMCwgc2l6ZW9mKG1SVENQQWRkcjYpKTsKKworICAgICAgICBtTG9jYWxBZGRyNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBpbmV0X3B0b24oQUZfSU5FVDYsIGxvY2FsSXAuc3RyaW5nKCksICZtTG9jYWxBZGRyNi5zaW42X2FkZHIpOworICAgICAgICBtTG9jYWxBZGRyNi5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpbG9jYWxQb3J0KTsKKworICAgICAgICBtUlRQQWRkcjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICAgaW5ldF9wdG9uKEFGX0lORVQ2LCByZW1vdGVJcC5zdHJpbmcoKSwgJm1SVFBBZGRyNi5zaW42X2FkZHIpOworICAgICAgICBtUlRQQWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KXJlbW90ZVBvcnQpOworCisgICAgICAgIG1SVENQQWRkcjYgPSBtUlRQQWRkcjY7CisgICAgICAgIG1SVENQQWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KShyZW1vdGVQb3J0ICsgMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldCgmbUxvY2FsQWRkciwgMCwgc2l6ZW9mKG1Mb2NhbEFkZHIpKTsKKyAgICAgICAgbWVtc2V0KCZtUlRQQWRkciwgMCwgc2l6ZW9mKG1SVFBBZGRyKSk7CisgICAgICAgIG1lbXNldCgmbVJUQ1BBZGRyLCAwLCBzaXplb2YobVJUQ1BBZGRyKSk7CisKKyAgICAgICAgbUxvY2FsQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbUxvY2FsQWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIobG9jYWxJcC5zdHJpbmcoKSk7CisgICAgICAgIG1Mb2NhbEFkZHIuc2luX3BvcnQgPSBodG9ucygodWludDE2X3QpbG9jYWxQb3J0KTsKKworICAgICAgICBtUlRQQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbVJUUEFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKHJlbW90ZUlwLnN0cmluZygpKTsKKyAgICAgICAgbVJUUEFkZHIuc2luX3BvcnQgPSBodG9ucygodWludDE2X3QpcmVtb3RlUG9ydCk7CisKKyAgICAgICAgbVJUQ1BBZGRyID0gbVJUUEFkZHI7CisgICAgICAgIG1SVENQQWRkci5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdCkocmVtb3RlUG9ydCArIDEpKTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmxvY2FsQWRkciA9IG1Jc0lQdjYgPworICAgICAgICAoc3RydWN0IHNvY2thZGRyKikmbUxvY2FsQWRkcjYgOiAoc3RydWN0IHNvY2thZGRyKikmbUxvY2FsQWRkcjsKKworICAgIGludCBzaXplU29ja1N0ID0gbUlzSVB2NiA/IHNpemVvZihtTG9jYWxBZGRyNikgOiBzaXplb2YobUxvY2FsQWRkcik7CisKKyAgICBpZiAoYmluZChtUlRQU29ja2V0LCBsb2NhbEFkZHIsIHNpemVTb2NrU3QpID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gYmluZCBydHAgJXM6JWQgZXJyPSVzIiwgbG9jYWxJcC5zdHJpbmcoKSwgbG9jYWxQb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJzdWNjZWVkIHRvIGJpbmQgcnRwICVzOiVkIiwgbG9jYWxJcC5zdHJpbmcoKSwgbG9jYWxQb3J0KTsKKyAgICB9CisKKyAgICBpZiAobUlzSVB2NikKKyAgICAgICAgbUxvY2FsQWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KShsb2NhbFBvcnQgKyAxKSk7CisgICAgZWxzZQorICAgICAgICBtTG9jYWxBZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KShsb2NhbFBvcnQgKyAxKSk7CisKKyAgICBpZiAoYmluZChtUlRDUFNvY2tldCwgbG9jYWxBZGRyLCBzaXplU29ja1N0KSA9PSAtMSkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGJpbmQgcnRjcCAlczolZCBlcnI9JXMiLCBsb2NhbElwLnN0cmluZygpLCBsb2NhbFBvcnQgKyAxLCBzdHJlcnJvcihlcnJubykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJzdWNjZWVkIHRvIGJpbmQgcnRjcCAlczolZCIsIGxvY2FsSXAuc3RyaW5nKCksIGxvY2FsUG9ydCArIDEpOworICAgIH0KK30KKworLy8gVE9ETyA6IERldmVsb3AgbW9yZSBhZHZhbmNlZCBtb2RlcmF0b3IgYmFzZWQgb24gQVMgJiBUTU1CUiB2YWx1ZQordm9pZCBBUlRQV3JpdGVyOjpNb2RlcmF0ZUluc3RhbnRUcmFmZmljKHVpbnQzMl90IHNhbXBsZVBlcmlvZCwgdWludDMyX3QgbGltaXRCeXRlcykgeworICAgIHVuc2lnbmVkIGludCBieXRlcyA9ICBtVHJhZmZpY1JlYy0+cmVhZEJ5dGVzRm9yTGFzdFBlcmlvZChzYW1wbGVQZXJpb2QpOworICAgIGlmIChieXRlcyA+IGxpbWl0Qnl0ZXMpIHsKKyAgICAgICAgQUxPR0koIk51Y2xlYXIgbW9kZXJhdG9yLiAjc2VxID0gJWQgXHRcdCAlZCBiaXRzIC8gMTBtcyIsCisgICAgICAgICAgICAgIG1TZXFObywgYnl0ZXMgKiA4KTsKKyAgICAgICAgdXNsZWVwKDQwMDApOworICAgICAgICBtVHJhZmZpY1JlYy0+dXBkYXRlQ2xvY2soQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDApOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKaW5kZXggMmYxMzQ4Ni4uNmYyNWE2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKQEAgLTI3LDYgKzI3LDkgQEAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL211bHRpbmV0d29yay5oPgorI2luY2x1ZGUgIlRyYWZmaWNSZWNvcmRlci5oIgorCiAjZGVmaW5lIExPR19UT19GSUxFUyAgICAwCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM2LDE0ICszOSwyMyBAQAogCiBzdHJ1Y3QgQVJUUFdyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiAgICAgZXhwbGljaXQgQVJUUFdyaXRlcihpbnQgZmQpOworICAgIGV4cGxpY2l0IEFSVFBXcml0ZXIoaW50IGZkLCBTdHJpbmc4JiBsb2NhbElwLCBpbnQgbG9jYWxQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiByZW1vdGVJcCwgaW50IHJlbW90ZVBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlcU5vKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKICAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworICAgIHZvaWQgdXBkYXRlQ1ZPRGVncmVlcyhpbnQzMl90IGN2b0RlZ3JlZXMpOworICAgIHZvaWQgdXBkYXRlUGF5bG9hZFR5cGUoaW50MzJfdCBwYXlsb2FkVHlwZSk7CisgICAgdm9pZCB1cGRhdGVTb2NrZXREc2NwKGludDMyX3QgZHNjcCk7CisgICAgdm9pZCB1cGRhdGVTb2NrZXROZXR3b3JrKGludDY0X3Qgc29ja2V0TmV0d29yayk7CisgICAgdWludDMyX3QgZ2V0U2VxdWVuY2VOdW0oKTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIHNldFRNTUJOSW5mbyh1aW50MzJfdCBvcHBvbmVudElELCB1aW50MzJfdCBiaXRyYXRlKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFSVFBXcml0ZXIoKTsKQEAgLTc2LDE1ICs4OCwyNyBAQAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8QVJUUFdyaXRlcj4gPiBtUmVmbGVjdG9yOwogCi0gICAgaW50IG1Tb2NrZXQ7CisgICAgYm9vbCBtSXNJUHY2OworICAgIGludCBtUlRQU29ja2V0LCBtUlRDUFNvY2tldDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbUxvY2FsQWRkcjsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJUUEFkZHI7CiAgICAgc3RydWN0IHNvY2thZGRyX2luIG1SVENQQWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IG1Mb2NhbEFkZHI2OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgbVJUUEFkZHI2OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgbVJUQ1BBZGRyNjsKKyAgICBpbnQzMl90IG1SdHBMYXllcjNEc2NwOworICAgIG5ldF9oYW5kbGVfdCBtUlRQU29ja05ldHdvcms7CiAKICAgICBBU3RyaW5nIG1Qcm9maWxlTGV2ZWw7CiAgICAgQVN0cmluZyBtU2VxUGFyYW1TZXQ7CiAgICAgQVN0cmluZyBtUGljUGFyYW1TZXQ7CiAKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1WUFNCdWY7CisgICAgTWVkaWFCdWZmZXJCYXNlICptU1BTQnVmOworICAgIE1lZGlhQnVmZmVyQmFzZSAqbVBQU0J1ZjsKKwogICAgIHVpbnQzMl90IG1Tb3VyY2VJRDsKKyAgICB1aW50MzJfdCBtUGF5bG9hZFR5cGU7CiAgICAgdWludDMyX3QgbVNlcU5vOwogICAgIHVpbnQzMl90IG1SVFBUaW1lQmFzZTsKICAgICB1aW50MzJfdCBtTnVtUlRQU2VudDsKQEAgLTkyLDEwICsxMTYsMTcgQEAKICAgICB1aW50MzJfdCBtTGFzdFJUUFRpbWU7CiAgICAgdWludDY0X3QgbUxhc3ROVFBUaW1lOwogCisgICAgdWludDMyX3QgbU9wcG9uZW50SUQ7CisgICAgdWludDMyX3QgbUJpdHJhdGU7CisgICAgc3A8VHJhZmZpY1JlY29yZGVyPHVpbnQzMl90LCBzaXplX3Q+ID4gbVRyYWZmaWNSZWM7CisKICAgICBpbnQzMl90IG1OdW1TUnNTZW50OworICAgIGludDMyX3QgbVJUUENWT0V4dE1hcDsKKyAgICBpbnQzMl90IG1SVFBDVk9EZWdyZWVzOwogCiAgICAgZW51bSB7CiAgICAgICAgIElOVkFMSUQsCisgICAgICAgIEgyNjUsCiAgICAgICAgIEgyNjQsCiAgICAgICAgIEgyNjMsCiAgICAgICAgIEFNUl9OQiwKQEAgLTEwOSwxNyArMTQwLDIzIEBACiAKICAgICB2b2lkIGFkZFNSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgYWRkU0RFUyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIGFkZFRNTUJOKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgdm9pZCBtYWtlSDI2NFNQcm9wUGFyYW1TZXRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKICAgICB2b2lkIGR1bXBTZXNzaW9uRGVzYygpOwogCiAgICAgdm9pZCBzZW5kQnllKCk7CisgICAgdm9pZCBzZW5kVlBTU1BTUFBTSWZJRnJhbWUoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZiwgaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgc2VuZFNQU1BQU0lmSUZyYW1lKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYsIGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIHNlbmRIRVZDRGF0YShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmKTsKICAgICB2b2lkIHNlbmRBVkNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpOwogICAgIHZvaWQgc2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpOwogICAgIHZvaWQgc2VuZEFNUkRhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zik7CiAKICAgICB2b2lkIHNlbmQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgYm9vbCBpc1JUQ1ApOworICAgIHZvaWQgbWFrZVNvY2tldFBhaXJBbmRCaW5kKFN0cmluZzgmIGxvY2FsSXAsIGludCBsb2NhbFBvcnQsIFN0cmluZzgmIHJlbW90ZUlwLCBpbnQgcmVtb3RlUG9ydCk7CiAKKyAgICB2b2lkIE1vZGVyYXRlSW5zdGFudFRyYWZmaWModWludDMyX3Qgc2FtcGxlUGVyaW9kLCB1aW50MzJfdCBsaW1pdEJ5dGVzKTsKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRQV3JpdGVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCBiYjY2ZjRjLi5jMzNiZjNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0zMjksNiArMzI5LDcgQEAKICAgICBtUGFzcy5jbGVhcigpOwogICAgIG1BdXRoVHlwZSA9IE5PTkU7CiAgICAgbU5vbmNlLmNsZWFyKCk7CisgICAgbVJlYWxtLmNsZWFyKCk7CiAKICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiB9CkBAIC05MTEsNiArOTEyLDE0IEBACiAgICAgICAgIENIRUNLX0dFKGosIDApOwogCiAgICAgICAgIG1Ob25jZS5zZXRUbyh2YWx1ZSwgaSArIDcsIGogLSBpIC0gNyk7CisKKyAgICAgICAgaSA9IHZhbHVlLmZpbmQoInJlYWxtPSIpOworICAgICAgICBDSEVDS19HRShpLCAwKTsKKyAgICAgICAgQ0hFQ0tfRVEodmFsdWUuY19zdHIoKVtpICsgNl0sICdcIicpOworICAgICAgICBqID0gdmFsdWUuZmluZCgiXCIiLCBpICsgNyk7CisgICAgICAgIENIRUNLX0dFKGosIDApOworCisgICAgICAgIG1SZWFsbS5zZXRUbyh2YWx1ZSwgaSArIDcsIGogLSBpIC0gNyk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC05OTMsNyArMTAwMiw3IEBACiAgICAgQVN0cmluZyBBMTsKICAgICBBMS5hcHBlbmQobVVzZXIpOwogICAgIEExLmFwcGVuZCgiOiIpOwotICAgIEExLmFwcGVuZCgiU3RyZWFtaW5nIFNlcnZlciIpOworICAgIEExLmFwcGVuZChtUmVhbG0pOwogICAgIEExLmFwcGVuZCgiOiIpOwogICAgIEExLmFwcGVuZChtUGFzcyk7CiAKQEAgLTEwMjksNiArMTAzOCw5IEBACiAgICAgZnJhZ21lbnQuYXBwZW5kKCJcIiwgIik7CiAgICAgZnJhZ21lbnQuYXBwZW5kKCJyZXNwb25zZT1cIiIpOwogICAgIGZyYWdtZW50LmFwcGVuZChkaWdlc3QpOworICAgIGZyYWdtZW50LmFwcGVuZCgiXCIsICIpOworICAgIGZyYWdtZW50LmFwcGVuZCgicmVhbG09XCIiKTsKKyAgICBmcmFnbWVudC5hcHBlbmQobVJlYWxtKTsKICAgICBmcmFnbWVudC5hcHBlbmQoIlwiIik7CiAgICAgZnJhZ21lbnQuYXBwZW5kKCJcclxuIik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCmluZGV4IDU2YjYwNGQuLjdjZGQ0YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaApAQCAtODQsNiArODQsNyBAQAogICAgIEFTdHJpbmcgbVVzZXIsIG1QYXNzOwogICAgIEF1dGhUeXBlIG1BdXRoVHlwZTsKICAgICBBU3RyaW5nIG1Ob25jZTsKKyAgICBBU3RyaW5nIG1SZWFsbTsKICAgICBpbnQgbVNvY2tldDsKICAgICBpbnQzMl90IG1Db25uZWN0aW9uSUQ7CiAgICAgaW50MzJfdCBtTmV4dENTZXE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCAyYjQyMDQwLi41YjViNGIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTI3LDYgKzI3LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjb25zdGV4cHIgdW5zaWduZWQga0RlZmF1bHRBcyA9IDk2MDsgLy8ga2Jwcz8KKwogQVNlc3Npb25EZXNjcmlwdGlvbjo6QVNlc3Npb25EZXNjcmlwdGlvbigpCiAgICAgOiBtSXNWYWxpZChmYWxzZSkgewogfQpAQCAtMTAzLDcgKzEwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGtleS5zZXRUbyhsaW5lLCAwLCBjb2xvblBvcyk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSAiYT1mbXRwIiB8fCBrZXkgPT0gImE9cnRwbWFwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGtleSA9PSAiYT1mcmFtZXNpemUiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwga2V5ID09ICJhPWZyYW1lc2l6ZSIgfHwga2V5ID09ICJhPWV4dG1hcCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3Qgc3BhY2VQb3MgPSBsaW5lLmZpbmQoIiAiLCBjb2xvblBvcyArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYWNlUG9zIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIwMSw2ICsyMDMsMzMgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpnZXRDdm9FeHRNYXAoCisgICAgICAgIHNpemVfdCBpbmRleCwgaW50MzJfdCAqY3ZvRXh0TWFwKSBjb25zdCB7CisgICAgQ0hFQ0tfR0UoaW5kZXgsIDB1KTsKKyAgICBDSEVDS19MVChpbmRleCwgbVRyYWNrcy5zaXplKCkpOworCisgICAgQVN0cmluZyBrZXksIHZhbHVlOworICAgICpjdm9FeHRNYXAgPSAwOworCisgICAgY29uc3QgQXR0cmlicyAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdChpbmRleCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFjay5zaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZSA9IHRyYWNrLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICh2YWx1ZS5zaXplKCkgPiAwICYmIHN0cmNtcCh2YWx1ZS5jX3N0cigpLCAidXJuOjNncHA6dmlkZW8tb3JpZW50YXRpb24iKSA9PSAwKSB7CisgICAgICAgICAgICBrZXkgPSB0cmFjay5rZXlBdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGtleS5zaXplKCkgPiAwKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RycmNocihrZXkuY19zdHIoKSwgJzonKTsKKyAgICAgICAgY29sb25Qb3MrKzsKKyAgICAgICAgKmN2b0V4dE1hcCA9IGF0b2koY29sb25Qb3MpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgQVNlc3Npb25EZXNjcmlwdGlvbjo6Z2V0Rm9ybWF0VHlwZSgKICAgICAgICAgc2l6ZV90IGluZGV4LCB1bnNpZ25lZCBsb25nICpQVCwKICAgICAgICAgQVN0cmluZyAqZGVzYywgQVN0cmluZyAqcGFyYW1zKSBjb25zdCB7CkBAIC0zNDUsNSArMzc0LDc0IEBACiAgICAgcmV0dXJuICpucHQyID4gKm5wdDE7CiB9CiAKKy8vIHN0YXRpYwordm9pZCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpTRFBTdHJpbmdGYWN0b3J5KEFTdHJpbmcgJnNkcCwKKyAgICAgICAgY29uc3QgY2hhciAqaXAsIGJvb2wgaXNBdWRpbywgdW5zaWduZWQgcG9ydCwgdW5zaWduZWQgcGF5bG9hZFR5cGUsCisgICAgICAgIHVuc2lnbmVkIGFzLCBjb25zdCBjaGFyICpjb2RlYywgY29uc3QgY2hhciAqZm10cCwKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgY3ZvRXh0TWFwKQoreworICAgIGJvb2wgaXNJUHY0ID0gKEFTdHJpbmcoaXApLmZpbmQoIjo6IikgPT0gLTEpID8gdHJ1ZSA6IGZhbHNlOworICAgIHNkcC5jbGVhcigpOworICAgIHNkcC5hcHBlbmQoInY9MFxyXG4iKTsKKworICAgIHNkcC5hcHBlbmQoImE9cmFuZ2U6bnB0PW5vdy1cclxuIik7CisKKyAgICBzZHAuYXBwZW5kKCJtPSIpOworICAgIHNkcC5hcHBlbmQoaXNBdWRpbyA/ICJhdWRpbyAiIDogInZpZGVvICIpOworICAgIHNkcC5hcHBlbmQocG9ydCk7CisgICAgc2RwLmFwcGVuZCgiIFJUUC9BVlAgIik7CisgICAgc2RwLmFwcGVuZChwYXlsb2FkVHlwZSk7CisgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworCisgICAgc2RwLmFwcGVuZCgiYz0gSU4gSVAiKTsKKyAgICBpZiAoaXNJUHY0KSB7CisgICAgICAgIHNkcC5hcHBlbmQoIjQgIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2RwLmFwcGVuZCgiNiAiKTsKKyAgICB9CisgICAgc2RwLmFwcGVuZChpcCk7CisgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworCisgICAgc2RwLmFwcGVuZCgiYj1BUzoiKTsKKyAgICBzZHAuYXBwZW5kKGFzID4gMCA/IGFzIDoga0RlZmF1bHRBcyk7CisgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworCisgICAgc2RwLmFwcGVuZCgiYT1ydHBtYXA6Iik7CisgICAgc2RwLmFwcGVuZChwYXlsb2FkVHlwZSk7CisgICAgc2RwLmFwcGVuZCgiICIpOworICAgIHNkcC5hcHBlbmQoY29kZWMpOworICAgIHNkcC5hcHBlbmQoIi8iKTsKKyAgICBzZHAuYXBwZW5kKGlzQXVkaW8gPyAiODAwMCIgOiAiOTAwMDAiKTsKKyAgICBzZHAuYXBwZW5kKCJcclxuIik7CisKKyAgICBpZiAoZm10cCAhPSBOVUxMKSB7CisgICAgICAgIHNkcC5hcHBlbmQoImE9Zm10cDoiKTsKKyAgICAgICAgc2RwLmFwcGVuZChwYXlsb2FkVHlwZSk7CisgICAgICAgIHNkcC5hcHBlbmQoIiAiKTsKKyAgICAgICAgc2RwLmFwcGVuZChmbXRwKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworICAgIH0KKworICAgIGlmICghaXNBdWRpbyAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgeworICAgICAgICBzZHAuYXBwZW5kKCJhPWZyYW1lc2l6ZToiKTsKKyAgICAgICAgc2RwLmFwcGVuZChwYXlsb2FkVHlwZSk7CisgICAgICAgIHNkcC5hcHBlbmQoIiAiKTsKKyAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7CisgICAgICAgIHNkcC5hcHBlbmQoIi0iKTsKKyAgICAgICAgc2RwLmFwcGVuZChoZWlnaHQpOworICAgICAgICBzZHAuYXBwZW5kKCJcclxuIik7CisgICAgfQorCisgICAgaWYgKGN2b0V4dE1hcCA+IDApIHsKKyAgICAgICAgc2RwLmFwcGVuZCgiYT1leHRtYXA6Iik7CisgICAgICAgIHNkcC5hcHBlbmQoY3ZvRXh0TWFwKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiICIpOworICAgICAgICBzZHAuYXBwZW5kKCJ1cm46M2dwcDp2aWRlby1vcmllbnRhdGlvbiIpOworICAgICAgICBzZHAuYXBwZW5kKCJcclxuIik7CisgICAgfQorCisgICAgQUxPR1YoIlNEUFN0cmluZ0ZhY3RvcnkgPT4gJXMiLCBzZHAuY19zdHIoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmgKaW5kZXggYjQ2Mjk4My4uOTFmNTQ0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmgKQEAgLTQwLDYgKzQwLDggQEAKICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKICAgICB2b2lkIGdldEZvcm1hdChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKnZhbHVlKSBjb25zdDsKIAorICAgIGJvb2wgZ2V0Q3ZvRXh0TWFwKHNpemVfdCBpbmRleCwgaW50MzJfdCAqY3ZvRXh0TWFwKSBjb25zdDsKKwogICAgIHZvaWQgZ2V0Rm9ybWF0VHlwZSgKICAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdW5zaWduZWQgbG9uZyAqUFQsCiAgICAgICAgICAgICBBU3RyaW5nICpkZXNjLCBBU3RyaW5nICpwYXJhbXMpIGNvbnN0OwpAQCAtNjMsNiArNjUsOSBAQAogICAgIC8vIGkuZS4gd2UgaGF2ZSBhIGZpeGVkIGR1cmF0aW9uLCBvdGhlcndpc2UgdGhpcyBpcyBsaXZlIHN0cmVhbWluZy4KICAgICBzdGF0aWMgYm9vbCBwYXJzZU5UUFJhbmdlKGNvbnN0IGNoYXIgKnMsIGZsb2F0ICpucHQxLCBmbG9hdCAqbnB0Mik7CiAKKyAgICBzdGF0aWMgdm9pZCBTRFBTdHJpbmdGYWN0b3J5KEFTdHJpbmcgJnNkcCwgY29uc3QgY2hhciAqaXAsIGJvb2wgaXNBdWRpbywgdW5zaWduZWQgcG9ydCwKKyAgICAgICAgdW5zaWduZWQgcGF5bG9hZFR5cGUsIHVuc2lnbmVkIGFzLCBjb25zdCBjaGFyICpjb2RlYywgY29uc3QgY2hhciAqZm10cCA9IE5VTEwsCisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwLCBpbnQzMl90IGhlaWdodCA9IDAsIGludDMyX3QgY3ZvRXh0TWFwID0gMCk7CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QVNlc3Npb25EZXNjcmlwdGlvbigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKaW5kZXggYTVhODk1ZS4uZjk5MGVjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icApAQCAtNCw2ICs0LDcgQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJBQU1SQXNzZW1ibGVyLmNwcCIsCiAgICAgICAgICJBQVZDQXNzZW1ibGVyLmNwcCIsCisgICAgICAgICJBSEVWQ0Fzc2VtYmxlci5jcHAiLAogICAgICAgICAiQUgyNjNBc3NlbWJsZXIuY3BwIiwKICAgICAgICAgIkFNUEVHMlRTQXNzZW1ibGVyLmNwcCIsCiAgICAgICAgICJBTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAiLApAQCAtMjAsNiArMjEsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYW5kcm9pZF9uZXQiLAogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmRhdGFzb3VyY2UiLAogICAgICAgICAibGlibWVkaWEiLApAQCAtMjgsNiArMzAsNyBAQAogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkIiwKICAgICBdLAogCiAgICAgYXJjaDogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggN2YwMjVhNS4uMGZkZjQzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC0xMDMyLDYgKzEwMzIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaW50MzJfdCBydGNwRXZlbnQ7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJydGNwLWV2ZW50IiwgJnJ0Y3BFdmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgKyttTnVtQWNjZXNzVW5pdHNSZWNlaXZlZDsKICAgICAgICAgICAgICAgICBwb3N0QWNjZXNzVW5pdFRpbWVvdXRDaGVjaygpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKaW5kZXggY2MzNmI3OC4uYzA1M2JlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhYTMyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJRdWFsTWFuYWdlciIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiUXVhbE1hbmFnZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitRdWFsTWFuYWdlcjo6V2F0Y2hlcjo6V2F0Y2hlcihpbnQzMl90IHRpbWVMaW1pdCkKKyAgICA6IFRocmVhZChmYWxzZSksIG1XYXRjaGluZyhmYWxzZSksIG1Td2l0Y2goZmFsc2UpLAorICAgICAgbVRpbWVMaW1pdCh0aW1lTGltaXQgKiAxMDAwMDAwTEwpICAgICAvLyB0aW1lTGltaXQgbXMKK3sKK30KKworYm9vbCBRdWFsTWFuYWdlcjo6V2F0Y2hlcjo6aXNFeHBpcmVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN3aXRjaDsKK30KKwordm9pZCBRdWFsTWFuYWdlcjo6V2F0Y2hlcjo6c2V0dXAoKSB7CisgICAgQXV0b011dGV4IF9sKG1NeUxvY2spOworICAgIGlmIChtV2F0Y2hpbmcgPT0gZmFsc2UpIHsKKyAgICAgICAgbVdhdGNoaW5nID0gdHJ1ZTsKKyAgICAgICAgbU15Q29uZC5zaWduYWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgUXVhbE1hbmFnZXI6OldhdGNoZXI6OnJlbGVhc2UoKSB7CisgICAgQXV0b011dGV4IF9sKG1NeUxvY2spOworICAgIGlmIChtU3dpdGNoKSB7CisgICAgICAgIEFMT0dXKCIlcyBESVNBUk1FRCIsIG5hbWUpOworICAgICAgICBtU3dpdGNoID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtV2F0Y2hpbmcgPT0gdHJ1ZSkgeworICAgICAgICBBTE9HVygiJXMgRElTQVJNRUQiLCBuYW1lKTsKKyAgICAgICAgbVdhdGNoaW5nID0gZmFsc2U7CisgICAgICAgIG1NeUNvbmQuc2lnbmFsKCk7CisgICAgfQorfQorCit2b2lkIFF1YWxNYW5hZ2VyOjpXYXRjaGVyOjpleGl0KCkgeworICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICAvLyBUaGUgb3JkZXIgaXMgaW1wb3J0YW50IHRvIGF2b2lkIGRlYWQgbG9jay4KKyAgICBUaHJlYWQ6OnJlcXVlc3RFeGl0KCk7CisgICAgbU15Q29uZC5zaWduYWwoKTsKK30KKworUXVhbE1hbmFnZXI6OldhdGNoZXI6On5XYXRjaGVyKCkgeworICAgIEFMT0dJKCIlcyB0aHJlYWQgZGVhZCIsIG5hbWUpOworfQorCitib29sIFF1YWxNYW5hZ2VyOjpXYXRjaGVyOjp0aHJlYWRMb29wKCkgeworICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICBwcmN0bChQUl9HRVRfTkFNRSwgbmFtZSwgMCwgMCwgMCk7CisjZW5kaWYKKyAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgQUxPR1coIiVzIFRpbWVyIGluaXQiLCBuYW1lKTsKKyAgICAgICAgbU15Q29uZC53YWl0KG1NeUxvY2spOyAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0cyBhcyBub24td2F0Y2hpbmcgc3RhdGUKKyAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIEFMT0dXKCIlcyB0aW1lciBCT09NIGFmdGVyICVkIG1zZWMiLCBuYW1lLCAoaW50KShtVGltZUxpbWl0IC8gMTAwMDAwMExMKSk7CisgICAgICAgIG1NeUNvbmQud2FpdFJlbGF0aXZlKG1NeUxvY2ssIG1UaW1lTGltaXQpOyAgLy8gd2FpdHMgYXMgd2F0Y2hpbmcgc2F0dGUKKyAgICAgICAgaWYgKG1XYXRjaGluZyA9PSB0cnVlKSB7CisgICAgICAgICAgICBtU3dpdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBCT09NISEhISIsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIG1XYXRjaGluZyA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworUXVhbE1hbmFnZXI6OlF1YWxNYW5hZ2VyKCkKKyAgICA6IG1NaW5CaXRyYXRlKC0xKSwgbU1heEJpdHJhdGUoLTEpLAorICAgICAgbVRhcmdldEJpdHJhdGUoNTEyMDAwKSwgbUxhc3RUYXJnZXRCaXRyYXRlKC0xKSwKKyAgICAgIG1MYXN0U2V0Qml0cmF0ZVRpbWUoMCksIG1Jc05ld1RhcmdldEJpdHJhdGUoZmFsc2UpCit7CisgICAgVkZQV2F0Y2hlciA9IG5ldyBXYXRjaGVyKDMwMDApOyAgICAgLy9WZXJ5IEZldyBQYWNrZXQgV2F0Y2hlcgorICAgIFZGUFdhdGNoZXItPnJ1bigiVmVyeUZld1B0ayIpOworICAgIExCUldhdGNoZXIgPSBuZXcgV2F0Y2hlcigxMDAwMCk7ICAgIC8vTG93IEJpdCBSYXRlIFdhdGNoZXIKKyAgICBMQlJXYXRjaGVyLT5ydW4oIkxvd0JpdFJhdGUiKTsKK30KKworUXVhbE1hbmFnZXI6On5RdWFsTWFuYWdlcigpIHsKKyAgICBWRlBXYXRjaGVyLT5leGl0KCk7CisgICAgTEJSV2F0Y2hlci0+ZXhpdCgpOworfQorCitpbnQzMl90IFF1YWxNYW5hZ2VyOjpnZXRUYXJnZXRCaXRyYXRlKCkgeworICAgIGlmIChtSXNOZXdUYXJnZXRCaXRyYXRlKSB7CisgICAgICAgIG1Jc05ld1RhcmdldEJpdHJhdGUgPSBmYWxzZTsKKyAgICAgICAgbUxhc3RUYXJnZXRCaXRyYXRlID0gY2xhbXBpbmdCaXRyYXRlKG1UYXJnZXRCaXRyYXRlKTsKKyAgICAgICAgbVRhcmdldEJpdHJhdGUgPSBtTGFzdFRhcmdldEJpdHJhdGU7CisgICAgICAgIHJldHVybiBtVGFyZ2V0Qml0cmF0ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitib29sIFF1YWxNYW5hZ2VyOjppc05lZWRUb0Rvd25ncmFkZSgpIHsKKyAgICByZXR1cm4gTEJSV2F0Y2hlci0+aXNFeHBpcmVkKCk7Cit9CisKK3ZvaWQgUXVhbE1hbmFnZXI6OnNldFRhcmdldEJpdHJhdGUodWludDhfdCBmcmFjdGlvbiwgaW50NjRfdCBub3dVcywgYm9vbCBpc1Rvb0xvd1BrdHMpIHsKKyAgICAvKiBUb28gTG93IFBhY2tldC4gTWF5YmUgb3Bwb25lbnQgaXMgc3dpdGNoaW5nIGNhbWVyYS4KKyAgICAgKiBJZiB0aGlzIGNvbmRpdGlvbiBnb2VzIGxvbmdlciwgd2Ugc2hvdWxkIGRvd24gYml0cmF0ZS4KKyAgICAgKi8KKyAgICBpZiAoaXNUb29Mb3dQa3RzKSB7CisgICAgICAgIFZGUFdhdGNoZXItPnNldHVwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVkZQV2F0Y2hlci0+cmVsZWFzZSgpOworICAgIH0KKworICAgIGlmICgoZnJhY3Rpb24gPiAoMjU2ICogNSAvIDEwMCkgJiYgIWlzVG9vTG93UGt0cykgfHwgVkZQV2F0Y2hlci0+aXNFeHBpcmVkKCkpIHsKKyAgICAgICAgLy8gbG9zcyBtb3JlIHRoYW4gNSUgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICBWRlBXYXRjaGVyIEJPT01FRAorICAgICAgICBtVGFyZ2V0Qml0cmF0ZSAtPSBtQml0cmF0ZVN0ZXAgKiAzOworICAgIH0gZWxzZSBpZiAoZnJhY3Rpb24gPD0gKDI1NiAqIDIgLzEwMCkpIHsKKyAgICAgICAgLy8gbG9zcyBsZXNzIHRoYW4gMiUKKyAgICAgICAgbVRhcmdldEJpdHJhdGUgKz0gbUJpdHJhdGVTdGVwOworICAgIH0KKworICAgIGlmIChtVGFyZ2V0Qml0cmF0ZSA+IG1NYXhCaXRyYXRlKSB7CisgICAgICAgIG1UYXJnZXRCaXRyYXRlID0gbU1heEJpdHJhdGUgKyBtQml0cmF0ZVN0ZXA7CisgICAgfSBlbHNlIGlmIChtVGFyZ2V0Qml0cmF0ZSA8IG1NaW5CaXRyYXRlKSB7CisgICAgICAgIExCUldhdGNoZXItPnNldHVwKCk7CisgICAgICAgIG1UYXJnZXRCaXRyYXRlID0gbU1pbkJpdHJhdGUgLSBtQml0cmF0ZVN0ZXA7CisgICAgfQorCisgICAgaWYgKG1MYXN0VGFyZ2V0Qml0cmF0ZSAhPSBjbGFtcGluZ0JpdHJhdGUobVRhcmdldEJpdHJhdGUpIHx8CisgICAgICAgIG5vd1VzIC0gbUxhc3RTZXRCaXRyYXRlVGltZSA+IDUwMDAwMDBsbCkgeworICAgICAgICBtSXNOZXdUYXJnZXRCaXRyYXRlID0gdHJ1ZTsKKyAgICAgICAgbUxhc3RTZXRCaXRyYXRlVGltZSA9IG5vd1VzOworICAgIH0KK30KKwordm9pZCBRdWFsTWFuYWdlcjo6c2V0TWluTWF4Qml0cmF0ZShpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgpIHsKKyAgICBtTWluQml0cmF0ZSA9IG1pbjsKKyAgICBtTWF4Qml0cmF0ZSA9IG1heDsKKyAgICBtQml0cmF0ZVN0ZXAgPSAobWF4IC0gbWluKSAvIDg7Cit9CisKK3ZvaWQgUXVhbE1hbmFnZXI6OnNldEJpdHJhdGVEYXRhKGludDMyX3QgYml0cmF0ZSwgaW50NjRfdCAvKm5vdyovKSB7CisgICAgLy8gQSBiaXRyYXRlIHRoYXQgaXMgY29uc2lkZXJlZCBwYWNrZXRsb3NzIGFsc28gc2hvdWxkIGJlIGdvb2QuCisgICAgaWYgKGJpdHJhdGUgPj0gbU1pbkJpdHJhdGUgJiYgbVRhcmdldEJpdHJhdGUgPj0gbU1pbkJpdHJhdGUpIHsKKyAgICAgICAgTEJSV2F0Y2hlci0+cmVsZWFzZSgpOworICAgIH0gZWxzZSBpZiAoYml0cmF0ZSA8IG1NaW5CaXRyYXRlKXsKKyAgICAgICAgTEJSV2F0Y2hlci0+c2V0dXAoKTsKKyAgICB9Cit9CisKK2ludDMyX3QgUXVhbE1hbmFnZXI6OmNsYW1waW5nQml0cmF0ZShpbnQzMl90IGJpdHJhdGUpIHsKKyAgICByZXR1cm4gc3RkOjptaW4oc3RkOjptYXgobU1pbkJpdHJhdGUsIGJpdHJhdGUpLCBtTWF4Qml0cmF0ZSk7Cit9Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkYzkyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBRVUFMX01BTkFHRVJfSF8KKworI2RlZmluZSBRVUFMX01BTkFHRVJfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBRdWFsTWFuYWdlciB7CitwdWJsaWM6CisgICAgUXVhbE1hbmFnZXIoKTsKKyAgICB+UXVhbE1hbmFnZXIoKTsKKworICAgIGludDMyX3QgZ2V0VGFyZ2V0Qml0cmF0ZSgpOworICAgIGJvb2wgaXNOZWVkVG9Eb3duZ3JhZGUoKTsKKworICAgIHZvaWQgc2V0VGFyZ2V0Qml0cmF0ZSh1aW50OF90IGZyYWN0aW9uLCBpbnQ2NF90IG5vd1VzLCBib29sIGlzVG9vTG93UGt0cyk7CisgICAgdm9pZCBzZXRNaW5NYXhCaXRyYXRlKGludDMyX3QgbWluLCBpbnQzMl90IG1heCk7CisgICAgdm9pZCBzZXRCaXRyYXRlRGF0YShpbnQzMl90IGJpdHJhdGUsIGludDY0X3Qgbm93KTsKK3ByaXZhdGU6CisgICAgY2xhc3MgV2F0Y2hlciA6IHB1YmxpYyBUaHJlYWQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBXYXRjaGVyKGludDMyX3QgdGltZUxpbWl0KTsKKworICAgICAgICB2b2lkIHNldHVwKCk7CisgICAgICAgIHZvaWQgcmVsZWFzZSgpOworICAgICAgICB2b2lkIGV4aXQoKTsKKyAgICAgICAgYm9vbCBpc0V4cGlyZWQoKSBjb25zdDsKKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIH5XYXRjaGVyKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CisKKyAgICAgICAgY2hhciBuYW1lWzMyXSA9IHswLH07CisKKyAgICAgICAgQ29uZGl0aW9uIG1NeUNvbmQ7CisgICAgICAgIE11dGV4IG1NeUxvY2s7CisKKyAgICAgICAgYm9vbCBtV2F0Y2hpbmc7CisgICAgICAgIGJvb2wgbVN3aXRjaDsKKyAgICAgICAgY29uc3QgbnNlY3NfdCBtVGltZUxpbWl0OworICAgIH07CisgICAgc3A8V2F0Y2hlcj4gVkZQV2F0Y2hlcjsKKyAgICBzcDxXYXRjaGVyPiBMQlJXYXRjaGVyOworICAgIGludDMyX3QgbU1pbkJpdHJhdGU7CisgICAgaW50MzJfdCBtTWF4Qml0cmF0ZTsKKyAgICBpbnQzMl90IG1CaXRyYXRlU3RlcDsKKworICAgIGludDMyX3QgbVRhcmdldEJpdHJhdGU7CisgICAgaW50MzJfdCBtTGFzdFRhcmdldEJpdHJhdGU7CisgICAgaW50NjRfdCBtTGFzdFNldEJpdHJhdGVUaW1lOworCisgICAgYm9vbCBtSXNOZXdUYXJnZXRCaXRyYXRlOworCisgICAgaW50MzJfdCBjbGFtcGluZ0JpdHJhdGUoaW50MzJfdCBiaXRyYXRlKTsKK307Cit9IC8vbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBRVUFMX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVHJhZmZpY1JlY29yZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTdjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX1RSQUZGSUNfUkVDT1JERVJfSF8KKworI2RlZmluZSBBX1RSQUZGSUNfUkVDT1JERVJfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIENpcmN1bGFyIGFycmF5IHRvIHNhdmUgcmVjZW50IGFtb3VudCBvZiBieXRlcwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgorY2xhc3MgVHJhZmZpY1JlY29yZGVyIDogcHVibGljIFJlZkJhc2UgeworcHJpdmF0ZToKKyAgICBzaXplX3QgbVNpemU7CisgICAgc2l6ZV90IG1TaXplTWFzazsKKyAgICBUaW1lICptVGltZUFycmF5ID0gTlVMTDsKKyAgICBCeXRlcyAqbUJ5dGVzQXJyYXkgPSBOVUxMOworICAgIHNpemVfdCBtSGVhZElkeCA9IDA7CisgICAgc2l6ZV90IG1UYWlsSWR4ID0gMDsKKworICAgIFRpbWUgbUNsb2NrID0gMDsKKyAgICBUaW1lIG1MYXN0VGltZU9mUHJpbnQgPSAwOworICAgIEJ5dGVzIG1BY2N1Qnl0ZXNPZlByaW50ID0gMDsKK3B1YmxpYzoKKyAgICBUcmFmZmljUmVjb3JkZXIoKTsKKyAgICBUcmFmZmljUmVjb3JkZXIoc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgflRyYWZmaWNSZWNvcmRlcigpOworCisgICAgdm9pZCBpbml0KCk7CisKKyAgICB2b2lkIHVwZGF0ZUNsb2NrKFRpbWUgbm93KTsKKworICAgIEJ5dGVzIHJlYWRCeXRlc0Zvckxhc3RQZXJpb2QoVGltZSBwZXJpb2QpOworICAgIHZvaWQgd3JpdGVCeXRlcyhCeXRlcyBieXRlcyk7CisKKyAgICB2b2lkIHByaW50QWNjdUJpdHNGb3JMYXN0UGVyaW9kKFRpbWUgcGVyaW9kLCBUaW1lIHVuaXQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgorVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6VHJhZmZpY1JlY29yZGVyKCkgeworICAgIFRyYWZmaWNSZWNvcmRlcigxMjgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVGltZSwgY2xhc3MgQnl0ZXM+CitUcmFmZmljUmVjb3JkZXI8VGltZSwgQnl0ZXM+OjpUcmFmZmljUmVjb3JkZXIoc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgZXhwOworICAgIGZvciAoZXhwID0gMDsgZXhwIDwgMzI7IGV4cCsrKSB7CisgICAgICAgIGlmIChzaXplIDw9ICgxdWwgPDwgZXhwKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbVNpemUgPSAoMXVsIDw8IGV4cCk7ICAgICAgICAgLy8gc2l6ZSA9IDJeZXhwCisgICAgbVNpemVNYXNrID0gbVNpemUgLSAxOworCisgICAgTE9HKFZFUkJPU0UpIDw8ICJUcmFmZmljUmVjb3JkZXIgSW5pdCBzaXplICIgPDwgbVNpemU7CisgICAgbVRpbWVBcnJheSA9IG5ldyBUaW1lW21TaXplXTsKKyAgICBtQnl0ZXNBcnJheSA9IG5ldyBCeXRlc1ttU2l6ZV07CisKKyAgICBpbml0KCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK1RyYWZmaWNSZWNvcmRlcjxUaW1lLCBCeXRlcz46On5UcmFmZmljUmVjb3JkZXIoKSB7CisgICAgZGVsZXRlW10gbVRpbWVBcnJheTsKKyAgICBkZWxldGVbXSBtQnl0ZXNBcnJheTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgordm9pZCBUcmFmZmljUmVjb3JkZXI8VGltZSwgQnl0ZXM+Ojppbml0KCkgeworICAgIG1IZWFkSWR4ID0gMDsKKyAgICBtVGFpbElkeCA9IDA7CisgICAgbVRpbWVBcnJheVswXSA9IDA7CisgICAgbUJ5dGVzQXJyYXlbMF0gPSAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVGltZSwgY2xhc3MgQnl0ZXM+Cit2b2lkIFRyYWZmaWNSZWNvcmRlcjxUaW1lLCBCeXRlcz46OnVwZGF0ZUNsb2NrKFRpbWUgbm93KSB7CisgICAgbUNsb2NrID0gbm93OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVGltZSwgY2xhc3MgQnl0ZXM+CitCeXRlcyBUcmFmZmljUmVjb3JkZXI8VGltZSwgQnl0ZXM+OjpyZWFkQnl0ZXNGb3JMYXN0UGVyaW9kKFRpbWUgcGVyaW9kKSB7CisgICAgQnl0ZXMgYnl0ZXMgPSAwOworCisgICAgc2l6ZV90IGkgPSBtVGFpbElkeDsKKyAgICB3aGlsZSAoaSAhPSBtSGVhZElkeCkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIlJFQUQgIiA8PCBpIDw8ICIgdGltZSAiIDw8IG1UaW1lQXJyYXlbaV0gPDwgIiBcdCBFbmRPZlBlcmlvZCAiIDw8IG1DbG9jayAtIHBlcmlvZDsKKyAgICAgICAgaWYgKG1UaW1lQXJyYXlbaV0gPCBtQ2xvY2sgLSBwZXJpb2QpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ5dGVzICs9IG1CeXRlc0FycmF5W2ldOworICAgICAgICBpID0gKGkgKyBtU2l6ZSAtIDEpICYgbVNpemVNYXNrOworICAgIH0KKyAgICBtSGVhZElkeCA9IGk7CisgICAgcmV0dXJuIGJ5dGVzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVGltZSwgY2xhc3MgQnl0ZXM+Cit2b2lkIFRyYWZmaWNSZWNvcmRlcjxUaW1lLCBCeXRlcz46OndyaXRlQnl0ZXMoQnl0ZXMgYnl0ZXMpIHsKKyAgICBzaXplX3Qgd3JpdGVJZHg7CisgICAgaWYgKG1DbG9jayA9PSBtVGltZUFycmF5W21UYWlsSWR4XSkgeworICAgICAgICB3cml0ZUlkeCA9IG1UYWlsSWR4OworICAgICAgICBtQnl0ZXNBcnJheVt3cml0ZUlkeF0gKz0gYnl0ZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVJZHggPSAobVRhaWxJZHggKyAxKSAlIG1TaXplOworICAgICAgICBtVGltZUFycmF5W3dyaXRlSWR4XSA9IG1DbG9jazsKKyAgICAgICAgbUJ5dGVzQXJyYXlbd3JpdGVJZHhdID0gYnl0ZXM7CisgICAgfQorCisgICAgTE9HKFZFUkJPU0UpIDw8ICJXUklURSAiIDw8IHdyaXRlSWR4IDw8ICIgdGltZSAiIDw8IG1DbG9jazsKKyAgICBpZiAod3JpdGVJZHggPT0gbUhlYWRJZHgpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJUcmFmZmljIHJlY29yZGVyIHNpemUgZXhjZWVkZWQgYXQgIiA8PCBtSGVhZElkeDsKKyAgICAgICAgbUhlYWRJZHggPSAobUhlYWRJZHggKyAxKSAmIG1TaXplTWFzazsKKyAgICB9CisKKyAgICBtVGFpbElkeCA9IHdyaXRlSWR4OworICAgIG1BY2N1Qnl0ZXNPZlByaW50ICs9IGJ5dGVzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVGltZSwgY2xhc3MgQnl0ZXM+Cit2b2lkIFRyYWZmaWNSZWNvcmRlcjxUaW1lLCBCeXRlcz46OnByaW50QWNjdUJpdHNGb3JMYXN0UGVyaW9kKFRpbWUgcGVyaW9kLCBUaW1lIHVuaXQpIHsKKyAgICBUaW1lIGR1cmF0aW9uID0gbUNsb2NrIC0gbUxhc3RUaW1lT2ZQcmludDsKKyAgICBmbG9hdCBudW1PZlVuaXQgPSAoZmxvYXQpZHVyYXRpb24gLyB1bml0OworICAgIGlmIChkdXJhdGlvbiA+IHBlcmlvZCkgeworICAgICAgICBBTE9HRCgiQWN0dWFsIFR4IHBlcmlvZCAlLjBmIG1zIFx0ICUuMGYgQml0cy9Vbml0IiwKKyAgICAgICAgICAgICAgbnVtT2ZVbml0ICogMTAwMC5mLCBtQWNjdUJ5dGVzT2ZQcmludCAqIDguZiAvIG51bU9mVW5pdCk7CisgICAgICAgIG1MYXN0VGltZU9mUHJpbnQgPSBtQ2xvY2s7CisgICAgICAgIG1BY2N1Qnl0ZXNPZlByaW50ID0gMDsKKyAgICAgICAgaW5pdCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX1RSQUZGSUNfUkVDT1JERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQxYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiRVNEU1Rlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiRVNEU1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmJjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgRVNEUyB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJFU0RTVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJFU0RTVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0UmVzLTEuMC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvRVNEU1Rlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJFU0RTVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvRVNEU1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWUwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0LmNwcApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRVNEU1Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxFU0RTLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKKyNpbmNsdWRlICJFU0RTVGVzdEVudmlyb25tZW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgRVNEU1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3N0cnVjdCBFU0RTUGFyYW1zIHsKKyAgICBjb25zdCBjaGFyICppbnB1dEZpbGU7CisgICAgaW50MzJfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKKyAgICBjb25zdCBjaGFyICpjb2RlY1NwZWNpZmljSW5mb0RhdGE7CisgICAgaW50MzJfdCBjb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplOworICAgIGludDMyX3QgYml0cmF0ZU1heDsKKyAgICBpbnQzMl90IGJpdHJhdGVBdmc7Cit9OworCitjbGFzcyBFU0RTVW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dEZpbGUgKi8gY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYmplY3RUeXBlSW5kaWNhdGlvbiAqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlY1NwZWNpZmljSW5mb0RhdGEgKi8gY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdHJhdGVNYXggKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQml0cmF0ZUF2ZyAqLyBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgRVNEU1VuaXRUZXN0KCkgOiBtRVNEU0RhdGEobnVsbHB0cikgeworICAgICAgICBtRVNEU1BhcmFtcy5pbnB1dEZpbGUgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLm9iamVjdFR5cGVJbmRpY2F0aW9uID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5jb2RlY1NwZWNpZmljSW5mb0RhdGEgPSBnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmNvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUgPSBnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmJpdHJhdGVNYXggPSBnZXQ8ND4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmJpdHJhdGVBdmcgPSBnZXQ8NT4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlKSBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICBpZiAobUlucHV0RnApIHsKKyAgICAgICAgICAgIGZjbG9zZShtSW5wdXRGcCk7CisgICAgICAgICAgICBtSW5wdXRGcCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlYWRFU0RTRGF0YSgpKTsgfQorICAgIGNvbnN0IHZvaWQgKm1FU0RTRGF0YTsKKyAgICBzaXplX3QgbUVTRFNTaXplOworICAgIEVTRFNQYXJhbXMgbUVTRFNQYXJhbXM7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHJlYWRFU0RTRGF0YSgpIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgbUVTRFNQYXJhbXMuaW5wdXRGaWxlOworICAgICAgICBtSW5wdXRGcCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEZwLCBudWxscHRyKSA8PCAiRmlsZSBvcGVuIGZhaWxlZCBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisgICAgICAgIGludDMyX3QgZmQgPSBmaWxlbm8obUlucHV0RnApOworICAgICAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGaWxlIGRlc2NyaXB0b3IgaW52YWxpZCBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlOiAiIDw8IG1FU0RTUGFyYW1zLmlucHV0RmlsZTsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisKKyAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShkdXAoZmQpLCAwLCBmaWxlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShtRGF0YVNvdXJjZSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UgZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUobURhdGFTb3VyY2UpOworICAgICAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlVuYWJsZSB0byBjcmVhdGUgZXh0cmFjdG9yIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJObyB0cmFja3MgaW4gZmlsZTogIiA8PCBpbnB1dEZpbGU7CisgICAgICAgIEFTU0VSVF9UUlVFKGVzZHNEYXRhUHJlc2VudChudW1UcmFja3MsIGV4dHJhY3RvcikpCisgICAgICAgICAgICAgICAgPDwgIlVuYWJsZSB0byBmaW5kIGVzZHMgaW4gYW55IHRyYWNrIGluIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworICAgIH0KKworICAgIGJvb2wgZXNkc0RhdGFQcmVzZW50KHNpemVfdCBudW1UcmFja3MsIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yKSB7CisgICAgICAgIGJvb2wgZm91bmRFU0RTID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisgICAgICAgICAgICBpZiAodHJhY2tNZXRhICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJm1FU0RTRGF0YSwgJm1FU0RTU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZm91bmRFU0RTID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm91bmRFU0RTOworICAgIH0KKworICAgIEZJTEUgKm1JbnB1dEZwOworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworfTsKKworVEVTVF9QKEVTRFNVbml0VGVzdCwgSW52YWxpZERhdGFUZXN0KSB7CisgICAgdm9pZCAqaW52YWxpZERhdGEgPSBjYWxsb2MobUVTRFNTaXplLCAxKTsKKyAgICBBU1NFUlRfTkUoaW52YWxpZERhdGEsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IjsKKyAgICBFU0RTIGVzZHMoaW52YWxpZERhdGEsIG1FU0RTU2l6ZSk7CisgICAgZnJlZShpbnZhbGlkRGF0YSk7CisgICAgQVNTRVJUX05FKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiaW52YWxpZCBFU0RTIGRhdGEgYWNjZXB0ZWQiOworfQorCitURVNUKEVTRFNTYW5pdHlVbml0VGVzdCwgQ29uc3RydWN0b3JTYW5pdHlUZXN0KSB7CisgICAgdm9pZCAqaW52YWxpZERhdGEgPSBtYWxsb2MoMSk7CisgICAgQVNTRVJUX05FKGludmFsaWREYXRhLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSI7CisgICAgRVNEUyBlc2RzX3plcm8oaW52YWxpZERhdGEsIDApOworICAgIGZyZWUoaW52YWxpZERhdGEpOworICAgIEFTU0VSVF9ORShlc2RzX3plcm8uSW5pdENoZWNrKCksIE9LKSA8PCAiaW52YWxpZCBFU0RTIGRhdGEgYWNjZXB0ZWQiOworCisgICAgRVNEUyBlc2RzX251bGwoTlVMTCwgMCk7CisgICAgQVNTRVJUX05FKGVzZHNfbnVsbC5Jbml0Q2hlY2soKSwgT0spIDw8ICJpbnZhbGlkIEVTRFMgZGF0YSBhY2NlcHRlZCI7Cit9CisKK1RFU1RfUChFU0RTVW5pdFRlc3QsIENyZWF0ZUFuZERlc3Ryb3lUZXN0KSB7CisgICAgRVNEUyBlc2RzKG1FU0RTRGF0YSwgbUVTRFNTaXplKTsKKyAgICBBU1NFUlRfRVEoZXNkcy5Jbml0Q2hlY2soKSwgT0spIDw8ICJFU0RTIGRhdGEgaW52YWxpZCI7Cit9CisKK1RFU1RfUChFU0RTVW5pdFRlc3QsIE9iamVjdFR5cGVJbmRpY2F0aW9uVGVzdCkgeworICAgIEVTRFMgZXNkcyhtRVNEU0RhdGEsIG1FU0RTU2l6ZSk7CisgICAgQVNTRVJUX0VRKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiRVNEUyBkYXRhIGludmFsaWQiOworICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRVNEUyBvYmplY3RUeXBlSW5kaWNhdGlvbiBkYXRhIGludmFsaWQiOworICAgIEFTU0VSVF9FUShvYmplY3RUeXBlSW5kaWNhdGlvbiwgbUVTRFNQYXJhbXMub2JqZWN0VHlwZUluZGljYXRpb24pCisgICAgICAgICAgICA8PCAiRVNEUyBvYmplY3RUeXBlSW5kaWNhdGlvbiBkYXRhIGRvZXNuJ3QgbWF0Y2giOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBDb2RlY1NwZWNpZmljSW5mb1Rlc3QpIHsKKyAgICBFU0RTIGVzZHMobUVTRFNEYXRhLCBtRVNEU1NpemUpOworICAgIEFTU0VSVF9FUShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgIkVTRFMgZGF0YSBpbnZhbGlkIjsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgY29uc3Qgdm9pZCAqY29kZWNTcGVjaWZpY0luZm87CisgICAgc2l6ZV90IGNvZGVjU3BlY2lmaWNJbmZvU2l6ZTsKKyAgICBzdGF0dXMgPSBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY1NwZWNpZmljSW5mbywgJmNvZGVjU3BlY2lmaWNJbmZvU2l6ZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJFU0RTIGdldENvZGVjU3BlY2lmaWNJbmZvIGRhdGEgaW52YWxpZCI7CisgICAgQVNTRVJUX0VRKG1FU0RTUGFyYW1zLmNvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUsIGNvZGVjU3BlY2lmaWNJbmZvU2l6ZSkKKyAgICAgICAgICAgIDw8ICJDb2RlY1NwZWNpZmljSW5mbyBkYXRhIGRvZXNuJ3QgbWF0Y2giOworICAgIHN0YXR1cyA9IG1lbWNtcChjb2RlY1NwZWNpZmljSW5mbywgbUVTRFNQYXJhbXMuY29kZWNTcGVjaWZpY0luZm9EYXRhLCBjb2RlY1NwZWNpZmljSW5mb1NpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJDb2RlY1NwZWNpZmljSW5mbyBkYXRhIGRvZXNuJ3QgbWF0Y2giOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBHZXRCaXRyYXRlVGVzdCkgeworICAgIEVTRFMgZXNkcyhtRVNEU0RhdGEsIG1FU0RTU2l6ZSk7CisgICAgQVNTRVJUX0VRKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiRVNEUyBkYXRhIGludmFsaWQiOworICAgIHVpbnQzMl90IGJpdHJhdGVNYXg7CisgICAgdWludDMyX3QgYml0cmF0ZUF2ZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBlc2RzLmdldEJpdFJhdGUoJmJpdHJhdGVNYXgsICZiaXRyYXRlQXZnKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkVTRFMgYml0UmF0ZSBkYXRhIGludmFsaWQiOworICAgIEFTU0VSVF9FUShiaXRyYXRlTWF4LCBtRVNEU1BhcmFtcy5iaXRyYXRlTWF4KSA8PCAiRVNEUyBiaXRyYXRlTWF4IGRvZXNuJ3QgbWF0Y2giOworICAgIEFTU0VSVF9FUShiaXRyYXRlQXZnLCBtRVNEU1BhcmFtcy5iaXRyYXRlQXZnKSA8PCAiRVNEUyBiaXRyYXRlQXZnIGRvZXNuJ3QgbWF0Y2giOworICAgIEFTU0VSVF9MRShiaXRyYXRlQXZnLCBiaXRyYXRlTWF4KSA8PCAiRVNEUyBiaXRyYXRlTWF4IGlzIGxlc3MgdGhhbiBiaXRyYXRlQXZnIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFU0RTVW5pdFRlc3RBbGwsIEVTRFNVbml0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gSW5wdXRGaWxlLCBPYmplY3RUeXBlSW5kaWNhdGlvbiwgQ29kZWNTcGVjaWZpY0luZm9EYXRhLAorICAgICAgICAgICAgICAgIC8vIENvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUsIEJpdHJhdGVNYXgsIEJpdHJhdGVBdmcKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ2aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzU2a2Jwc18xMmZwc19hYWNfc3RlcmVvXzEyOGticHNfMjIwNTBoei4zZ3AiLCA2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDEzXHg5MCIsIDIsIDEzMTA3MiwgMCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgidmlkZW9fMTI4MHg3MjBfbXA0X21wZWcyXzMwMDBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDFceEIzXHg1MFx4MDJceEQwXHgzNVx4RkZceEZGXHhFMVx4QTBceDAwXHgwMFx4MDFceEI1XHgxNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDZBXHgwMFx4MDFceDAwXHgwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwgMzQxNTQ1MiwgMzQxNTQ1MiksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgidmlkZW9fMTc2eDE0NF8zZ3BfaDI2M181NmticHNfMjVmcHNfYWFjX21vbm9fMjRrYnBzXzExMDI1aHouM2dwIiwgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgxNVx4MDgiLCAyLCAyNDU3NiwgMCkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgLy8gTWVkaWFFeHRyYWN0b3IgbmVlZHMgYmluZGVyIHRocmVhZCBwb29sCisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgIGdFbnYgPSBuZXcgRVNEU1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvRVNEU1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTIzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0VTRFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19FU0RTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEVTRFNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBFU0RTVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IEVTRFNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19FU0RTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMGZiODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL1JFQURNRS5tZApAQCAtMCwwICsxLDQwIEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgRVNEUyBVbml0IFRlc3QgOgorVGhlIEVTRFMgVW5pdCBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgRVNEUyBjbGFzcyBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEVTRFNUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0VTRFNUZXN0L0VTRFNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvRVNEU1Rlc3QvRVNEU1Rlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0UmVzLTEuMC56aXApCitEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggRVNEU1Rlc3RSZXMgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBFU0RTVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9FU0RTVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvRVNEU1Rlc3RSZXMvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEVTRFNUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjI1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJIRVZDVXRpbHNVbml0VGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJIRVZDVXRpbHNVbml0VGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODUwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgSEVWQyBVdGlscyB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iSEVWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkhFVkNVdGlsc1VuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvSEVWQ1V0aWxzL0hFVkNVdGlsc1VuaXRUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9IRVZDVXRpbHNVbml0VGVzdC8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkhFVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QvIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDgxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fSEVWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX0hFVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50IDogcHVibGljOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBIRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fSEVWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1VuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjRhMDQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhldmNVdGlsaXR5VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKyNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgorCisjaW5jbHVkZSAiSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBtYXggc2l6ZSBvZiBodmNjIGJveCBpcyAyIEtCCitjb25zdGV4cHIgdWludDMyX3Qga0h2Y2NCb3hNYXhTaXplID0gMjA0ODsKK2NvbnN0ZXhwciB1aW50MzJfdCBrSHZjY0JveE1pblNpemUgPSAyMDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrVlBTQ29kZSA9IDMyOworY29uc3RleHByIHVpbnQzMl90IGtTUFNDb2RlID0gMzM7Citjb25zdGV4cHIgdWludDMyX3Qga1BQU0NvZGUgPSAzNDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrTkFMU2l6ZUxlbmd0aCA9IDI7CisKK3N0YXRpYyBIRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBIRVZDVXRpbHNVbml0VGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LypmaWxlTmFtZSovIHN0cmluZywgLyppbmZvRmlsZU5hbWUqLyBzdHJpbmcsIC8qbnVtVlBTTmFscyovIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgLypudW1TUFNOYWxzKi8gc2l6ZV90LCAvKm51bVBQU05hbHMqLyBzaXplX3QsIC8qZnJhbWVSYXRlKi8gaW50MTZfdCwKKyAgICAgICAgICAgICAgICAgICAgLyppc0hkciovIGJvb2w+PiB7CisgIHB1YmxpYzoKKyAgICB+SEVWQ1V0aWxzVW5pdFRlc3QoKSB7CisgICAgICAgIGlmIChtTWVkaWFGaWxlU3RyZWFtLmlzX29wZW4oKSkgbU1lZGlhRmlsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgbUluZm9GaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHN0cmluZywgc2l6ZV90LCBzaXplX3QsIHNpemVfdCwgaW50MTZfdCwgYm9vbD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGlucHV0TWVkaWFGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbU1lZGlhRmlsZVN0cmVhbS5vcGVuKGlucHV0TWVkaWFGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBBU1NFUlRfVFJVRShtTWVkaWFGaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIG1lZGlhIGZpbGU6ICIgPDwgaW5wdXRNZWRpYUZpbGU7CisKKyAgICAgICAgc3RyaW5nIGlucHV0SW5mb0ZpbGUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihwYXJhbXMpOworICAgICAgICBtSW5mb0ZpbGVTdHJlYW0ub3BlbihpbnB1dEluZm9GaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBBU1NFUlRfVFJVRShtSW5mb0ZpbGVTdHJlYW0uaXNfb3BlbigpKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5mbyBmaWxlOiAiIDw8IGlucHV0SW5mb0ZpbGU7CisKKyAgICAgICAgbU51bVZQU05hbHMgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgbU51bVNQU05hbHMgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICAgICAgbU51bVBQU05hbHMgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IGdldDw1PihwYXJhbXMpOworICAgICAgICBtSXNIRFIgPSBnZXQ8Nj4ocGFyYW1zKTsKKyAgICB9CisKKyAgICBzaXplX3QgbU51bVZQU05hbHM7CisgICAgc2l6ZV90IG1OdW1TUFNOYWxzOworICAgIHNpemVfdCBtTnVtUFBTTmFsczsKKyAgICBpbnQxNl90IG1GcmFtZVJhdGU7CisgICAgYm9vbCBtSXNIRFI7CisgICAgaWZzdHJlYW0gbU1lZGlhRmlsZVN0cmVhbTsKKyAgICBpZnN0cmVhbSBtSW5mb0ZpbGVTdHJlYW07Cit9OworCitURVNUX1AoSEVWQ1V0aWxzVW5pdFRlc3QsIE5BTFVuaXRUZXN0KSB7CisgICAgSGV2Y1BhcmFtZXRlclNldHMgaGV2Y1BhcmFtczsKKworICAgIHN0cmluZyBsaW5lOworICAgIGludDMyX3QgaW5kZXggPSAwOworICAgIHN0YXR1c190IGVycjsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIHN0cmluZyB0eXBlOworICAgICAgICBpbnQzMl90IGNodW5rTGVuZ3RoOworCisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0eXBlID4+IGNodW5rTGVuZ3RoOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgZGF0YSBjaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKworICAgICAgICBjaGFyICpkYXRhID0gKGNoYXIgKiltYWxsb2MoY2h1bmtMZW5ndGgpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkYXRhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGNodW5rTGVuZ3RoOworCisgICAgICAgIG1NZWRpYUZpbGVTdHJlYW0ucmVhZChkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgIEFTU0VSVF9FUShtTWVkaWFGaWxlU3RyZWFtLmdjb3VudCgpLCBjaHVua0xlbmd0aCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBtTWVkaWFGaWxlU3RyZWFtLmdjb3VudCgpOworCisgICAgICAgIC8vIEEgdmFsaWQgc3RhcnRjb2RlIGNvbnNpc3RzIG9mIGF0IGxlYXN0IHR3byAweDAwIGJ5dGVzIGZvbGxvd2VkIGJ5IDB4MDEuCisgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgZm9yICg7IG9mZnNldCArIDIgPCBjaHVua0xlbmd0aDsgKytvZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChkYXRhW29mZnNldCArIDJdID09IDB4MDEgJiYgZGF0YVtvZmZzZXQgKyAxXSA9PSAweDAwICYmIGRhdGFbb2Zmc2V0XSA9PSAweDAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDM7CisgICAgICAgIEFTU0VSVF9MRShvZmZzZXQsIGNodW5rTGVuZ3RoKSA8PCAiTkFMIHVuaXQgb2Zmc2V0IG11c3Qgbm90IGV4Y2VlZCB0aGUgY2h1bmsgbGVuZ3RoIjsKKworICAgICAgICB1aW50OF90ICpuYWxVbml0ID0gKHVpbnQ4X3QgKikoZGF0YSArIG9mZnNldCk7CisgICAgICAgIHNpemVfdCBuYWxVbml0TGVuZ3RoID0gY2h1bmtMZW5ndGggLSBvZmZzZXQ7CisKKyAgICAgICAgLy8gQWRkIE5BTCB1bml0cyBvbmx5IGlmIHRoZXkncmUgb2YgdHlwZTogVlBTL1NQUy9QUFMvU0VJCisgICAgICAgIGlmICghKCh0eXBlLmNvbXBhcmUoIlZQUyIpICYmIHR5cGUuY29tcGFyZSgiU1BTIikgJiYgdHlwZS5jb21wYXJlKCJQUFMiKSAmJgorICAgICAgICAgICAgICAgdHlwZS5jb21wYXJlKCJTRUkiKSkpKSB7CisgICAgICAgICAgICBlcnIgPSBoZXZjUGFyYW1zLmFkZE5hbFVuaXQobmFsVW5pdCwgbmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWRkIE5BTCBVbml0IHR5cGU6ICIgPDwgdHlwZSA8PCAiIFNpemU6ICIgPDwgbmFsVW5pdExlbmd0aDsKKworICAgICAgICAgICAgc2l6ZV90IHNpemVOYWxVbml0ID0gaGV2Y1BhcmFtcy5nZXRTaXplKGluZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShzaXplTmFsVW5pdCwgbmFsVW5pdExlbmd0aCkgPDwgIkludmFsaWQgc2l6ZSByZXR1cm5lZCBmb3IgTkFMOiAiIDw8IHR5cGU7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RpbmF0aW9uID0gKHVpbnQ4X3QgKiltYWxsb2MobmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoZGVzdGluYXRpb24sIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemU6ICIgPDwgbmFsVW5pdExlbmd0aDsKKworICAgICAgICAgICAgYm9vbCBzdGF0dXMgPSBoZXZjUGFyYW1zLndyaXRlKGluZGV4LCBkZXN0aW5hdGlvbiwgbmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJVbmFibGUgdG8gd3JpdGUgTkFMIFVuaXQgZGF0YSI7CisKKyAgICAgICAgICAgIGZyZWUoZGVzdGluYXRpb24pOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IGhldmNQYXJhbXMuYWRkTmFsVW5pdChuYWxVbml0LCBuYWxVbml0TGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShlcnIsIChzdGF0dXNfdClPSykgPDwgIkludmFsaWQgTkFMIFVuaXQgYWRkZWQsIHR5cGU6ICIgPDwgdHlwZTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGRhdGEpOworICAgIH0KKworICAgIHNpemVfdCBudW1OYWxVbml0cyA9IGhldmNQYXJhbXMuZ2V0TnVtTmFsVW5pdHNPZlR5cGUoa1ZQU0NvZGUpOworICAgIEFTU0VSVF9FUShudW1OYWxVbml0cywgbU51bVZQU05hbHMpIDw8ICJXcm9uZyBudW1iZXIgb2YgVlBTIE5BTCBVbml0cyI7CisKKyAgICBudW1OYWxVbml0cyA9IGhldmNQYXJhbXMuZ2V0TnVtTmFsVW5pdHNPZlR5cGUoa1NQU0NvZGUpOworICAgIEFTU0VSVF9FUShudW1OYWxVbml0cywgbU51bVNQU05hbHMpIDw8ICJXcm9uZyBudW1iZXIgb2YgU1BTIE5BTCBVbml0cyI7CisKKyAgICBudW1OYWxVbml0cyA9IGhldmNQYXJhbXMuZ2V0TnVtTmFsVW5pdHNPZlR5cGUoa1BQU0NvZGUpOworICAgIEFTU0VSVF9FUShudW1OYWxVbml0cywgbU51bVBQU05hbHMpIDw8ICJXcm9uZyBudW1iZXIgb2YgUFBTIE5BTCBVbml0cyI7CisKKyAgICBIZXZjUGFyYW1ldGVyU2V0czo6SW5mbyBpbmZvID0gaGV2Y1BhcmFtcy5nZXRJbmZvKCk7CisgICAgQVNTRVJUX0VRKGluZm8gJiBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9Jc0hkciwKKyAgICAgICAgICAgICAgKG1Jc0hEUiA/IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb0lzSGRyIDogSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvTm9uZSkpCisgICAgICAgICAgICA8PCAiV3JvbmcgaW5mbyBhYm91dCBIRFIiOworCisgICAgQVNTRVJUX0VRKGluZm8gJiBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9IYXNDb2xvckRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAobUlzSERSID8gSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvSGFzQ29sb3JEZXNjcmlwdGlvbiA6IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb05vbmUpKQorICAgICAgICAgICAgPDwgIldyb25nIGluZm8gYWJvdXQgY29sb3IgZGVzY3JpcHRpb24iOworCisgICAgLy8gYW4gSEVWQyBmaWxlIHN0YXJ0cyB3aXRoIFZQUywgU1BTIGFuZCBQUFMgTkFMIHVuaXRzIGluIHNlcXVlbmNlLgorICAgIHVpbnQ4X3QgdHlwZU5hbFVuaXQgPSBoZXZjUGFyYW1zLmdldFR5cGUoMCk7CisgICAgQVNTRVJUX0VRKHR5cGVOYWxVbml0LCBrSGV2Y05hbFVuaXRUeXBlVnBzKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkIE5BTCB0eXBlOiAzMihWUFMpLCBmb3VuZDogIiA8PCB0eXBlTmFsVW5pdDsKKworICAgIHR5cGVOYWxVbml0ID0gaGV2Y1BhcmFtcy5nZXRUeXBlKDEpOworICAgIEFTU0VSVF9FUSh0eXBlTmFsVW5pdCwga0hldmNOYWxVbml0VHlwZVNwcykKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBOQUwgdHlwZTogMzMoU1BTKSwgZm91bmQ6ICIgPDwgdHlwZU5hbFVuaXQ7CisKKyAgICB0eXBlTmFsVW5pdCA9IGhldmNQYXJhbXMuZ2V0VHlwZSgyKTsKKyAgICBBU1NFUlRfRVEodHlwZU5hbFVuaXQsIGtIZXZjTmFsVW5pdFR5cGVQcHMpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgTkFMIHR5cGU6IDM0KFBQUyksIGZvdW5kOiAiIDw8IHR5cGVOYWxVbml0OworCisgICAgc2l6ZV90IGh2Y2NCb3hTaXplID0ga0h2Y2NCb3hNYXhTaXplOworICAgIHVpbnQ4X3QgKmh2Y2MgPSAodWludDhfdCAqKW1hbGxvYyhrSHZjY0JveE1heFNpemUpOworICAgIEFTU0VSVF9ORShodmNjLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGEgaHZjYyBidWZmZXIgb2Ygc2l6ZTogIiA8PCBrSHZjY0JveE1heFNpemU7CisKKyAgICBlcnIgPSBoZXZjUGFyYW1zLm1ha2VIdmNjKGh2Y2MsICZodmNjQm94U2l6ZSwga05BTFNpemVMZW5ndGgpOworICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIlVuYWJsZSB0byBjcmVhdGUgaHZjYyBib3giOworCisgICAgQVNTRVJUX0dUKGh2Y2NCb3hTaXplLCBrSHZjY0JveE1pblNpemUpCisgICAgICAgICAgICA8PCAiSHZjYyBib3ggc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAiIDw8IGtIdmNjQm94TWluU2l6ZTsKKworICAgIGludDE2X3QgZnJhbWVSYXRlID0gaHZjY1trSHZjY0JveE1pblNpemUgLSAxXSB8IChodmNjW2tIdmNjQm94TWluU2l6ZV0gPDwgOCk7CisgICAgaWYgKGZyYW1lUmF0ZSAhPSBtRnJhbWVSYXRlKQorICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gRXhwZWN0ZWQgZnJhbWUgcmF0ZTogIiA8PCBtRnJhbWVSYXRlIDw8ICIgRm91bmQ6ICIgPDwgZnJhbWVSYXRlCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZyZWUoaHZjYyk7Cit9CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEhFVkNVdGlsc1VuaXRUZXN0QWxsLCBIRVZDVXRpbHNVbml0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfMzg0MHgyMTYwcDUwZjMwMF8zMjUwMGticHMuaGV2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzM4NDB4MjE2MHA1MGYzMDBfMzI1MDBrYnBzLmluZm8iLCAxLCAxLCAxLCA1MCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBwMjRmMzAwXzQ1MDBrYnBzLmhldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xOTIweDEwODBwMjRmMzAwXzQ1MDBrYnBzLmluZm8iLCAxLCAxLCAxLCAyNCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xMjgweDcyMHAyNGYzMDBfMzAwMGticHMuaGV2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzEyODB4NzIwcDI0ZjMwMF8zMDAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgMjQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfNjQweDM2MHAyNGYzMDBfNTAwa2Jwcy5oZXZjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfNjQweDM2MHAyNGYzMDBfNTAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgMjQsIGZhbHNlKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IEhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMGU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgSEVWQyBVdGlscyBUZXN0CitUaGUgSEVWQyBVdGlsaXR5IFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIEhldmNVdGlscyBsaWJyYXJ5IGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gSEVWQ1V0aWxzVW5pdFRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvSEVWQ1V0aWxzVW5pdFRlc3QvSEVWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9IRVZDVXRpbHNVbml0VGVzdC9IRVZDVXRpbHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvSEVWQ1V0aWxzL0hFVkNVdGlsc1VuaXRUZXN0LnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBIRVZDVXRpbHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IEhFVkNVdGlsc1VuaXRUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0hFVkNVdGlsc1VuaXRUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9IRVZDVXRpbHNVbml0VGVzdC8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgSEVWQ1V0aWxzVW5pdFRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAKaW5kZXggZTNlNjFkNy4uMjZlYzUwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZXh0cmFjdG9yRmFjdG9yeS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2V4dHJhY3RvckZhY3RvcnkvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsNyBAQAogY2NfdGVzdCB7CiAgICAgbmFtZTogIkV4dHJhY3RvckZhY3RvcnlUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkV4dHJhY3RvckZhY3RvcnlUZXN0LmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmZjY5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUzIEBACitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKwkibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbWVkaWFjbG9ja19mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIk1lZGlhQ2xvY2tGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbWVkaWFzY2FubmVyX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXJGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc2tpcGN1dGJ1ZmZlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlNraXBDdXRCdWZmZXJGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbWVkaWFtdXhlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIk1lZGlhTXV4ZXJGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYUNsb2NrRnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFDbG9ja0Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3MzU0MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFDbG9ja0Z1enplci5jcHAKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgc3A8TWVkaWFDbG9jaz4gbUNsb2NrKG5ldyBNZWRpYUNsb2NrKTsKKworICBib29sIHJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKKyAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDUpKSB7CisgICAgY2FzZSAwOiB7CisgICAgICBpZiAocmVnaXN0ZXJlZCA9PSBmYWxzZSkgeworICAgICAgICBtQ2xvY2stPmluaXQoKTsKKyAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAxOiB7CisgICAgICBpbnQ2NF90IHN0YXJ0aW5nVGltZU1lZGlhVXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgICBtQ2xvY2stPnNldFN0YXJ0aW5nVGltZU1lZGlhKHN0YXJ0aW5nVGltZU1lZGlhVXMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjogeworICAgICAgbUNsb2NrLT5jbGVhckFuY2hvcigpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMzogeworICAgICAgaW50NjRfdCBhbmNob3JUaW1lUmVhbFVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgICAgaW50NjRfdCBhbmNob3JUaW1lTWVkaWFVcyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICAgIGludDY0X3QgbWF4VGltZU1lZGlhVXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgICBtQ2xvY2stPnVwZGF0ZUFuY2hvcihhbmNob3JUaW1lTWVkaWFVcywgYW5jaG9yVGltZVJlYWxVcywgbWF4VGltZU1lZGlhVXMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDogeworICAgICAgaW50NjRfdCBtYXhUaW1lTWVkaWFVcyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICAgIG1DbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1heFRpbWVNZWRpYVVzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDU6IHsKKyAgICAgIHdwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKTsKKyAgICAgIG1DbG9jay0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShtc2cucHJvbW90ZSgpKTsKKyAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTXV4ZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYU11eGVyRnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGYzMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYU11eGVyRnV6emVyLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjaW5jbHVkZSA8TWVkaWFNdXhlckZ1enplci5oPgorI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDYW4ndCBzZWVtIHRvIGdldCBzZXRCdWZmZXIgb3Igc2V0U3RyaW5nIHdvcmtpbmcuIEl0IGFsd2F5cyBzZWdmYXVsdHMgb24gYQorLy8gbnVsbCBwb2ludGVyIHJlYWQgb3IgbWVtbGVha3MuIFNvIHRoYXQgZnVuY3Rpb25hbGl0eSBpcyBtaXNzaW5nLgordm9pZCBjcmVhdGVNZXNzYWdlKEFNZXNzYWdlICptc2csIEZ1enplZERhdGFQcm92aWRlciAqZmRwKSB7CisgIHNpemVfdCBjb3VudCA9IGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIDMyKTsKKyAgd2hpbGUgKGZkcC0+cmVtYWluaW5nX2J5dGVzKCkgPiAwICYmIGNvdW50ID4gMCkgeworICAgIHVpbnQ4X3QgZnVuY3Rpb25faWQgPQorICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgYW1lc3NhZ2Vfc2V0dmFscy5zaXplKCkgLSAxKTsKKyAgICBhbWVzc2FnZV9zZXR2YWxzW2Z1bmN0aW9uX2lkXShtc2csIGZkcCk7CisgICAgY291bnQtLTsKKyAgfQorfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgc2l6ZSk7CisgIGludCBmZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKCJtZWRpYW11eGVyX2Z1enpfcmVnaW9uIiwgZGF0YV9zaXplKTsKKyAgaWYgKGZkIDwgMCkKKyAgICByZXR1cm4gMDsKKworICB1aW50OF90ICpzaF9kYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPigKKyAgICAgIG1tYXAoTlVMTCwgZGF0YV9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCkpOworICBpZiAoc2hfZGF0YSA9PSBNQVBfRkFJTEVEKQorICAgIHJldHVybiAwOworCisgIE1lZGlhTXV4ZXI6Ok91dHB1dEZvcm1hdCBmb3JtYXQgPQorICAgICAgKE1lZGlhTXV4ZXI6Ok91dHB1dEZvcm1hdClmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigwLCA0KTsKKyAgc3A8TWVkaWFNdXhlcj4gbU11eGVyKG5ldyBNZWRpYU11eGVyKGZkLCBmb3JtYXQpKTsKKworICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpID4gMSkgeworICAgIHN3aXRjaCAoZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgNCkpIHsKKyAgICBjYXNlIDA6IHsKKyAgICAgIC8vIEZvciBzb21lIHJlYXNvbiBpdCBvbmx5IGxpa2VzIG1wNHMgaGVyZS4uLgorICAgICAgaWYgKGZvcm1hdCA9PSAxIHx8IGZvcm1hdCA9PSA0KQorICAgICAgICBicmVhazsKKworICAgICAgc3A8QU1lc3NhZ2U+IGFfZm9ybWF0KG5ldyBBTWVzc2FnZSk7CisgICAgICBjcmVhdGVNZXNzYWdlKGFfZm9ybWF0LmdldCgpLCAmZmRwKTsKKyAgICAgIG1NdXhlci0+YWRkVHJhY2soYV9mb3JtYXQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMTogeworICAgICAgbU11eGVyLT5zdGFydCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjogeworICAgICAgaW50IGRlZ3JlZXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgIG1NdXhlci0+c2V0T3JpZW50YXRpb25IaW50KGRlZ3JlZXMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMzogeworICAgICAgaW50IGxhdGl0dWRlID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICBpbnQgbG9uZ2l0dWRlID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICBtTXV4ZXItPnNldExvY2F0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDogeworICAgICAgc2l6ZV90IGJ1Zl9zaXplID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBkYXRhX3NpemUpOworICAgICAgc3A8QUJ1ZmZlcj4gYV9idWZmZXIobmV3IEFCdWZmZXIoYnVmX3NpemUpKTsKKworICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBmZHAuQ29uc3VtZUludGVncmFsPHNpemVfdD4oKTsKKyAgICAgIGludDY0X3QgdGltZVVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgICAgdWludDMyX3QgZmxhZ3MgPSBmZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgICAgbU11eGVyLT53cml0ZVNhbXBsZURhdGEoYV9idWZmZXIsIHRyYWNrSW5kZXgsIHRpbWVVcywgZmxhZ3MpOworICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZmRwLkNvbnN1bWVCb29sKCkpCisgICAgbU11eGVyLT5zdG9wKCk7CisKKyAgbXVubWFwKHNoX2RhdGEsIGRhdGFfc2l6ZSk7CisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIDA7Cit9Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTXV4ZXJGdXp6ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFNdXhlckZ1enplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDQyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTXV4ZXJGdXp6ZXIuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gTWFwcGluZ3MgdmVjdG9ycyBhcmUgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0aGF0IHRoZSBNZWRpYU11eGVyCisvLyBjbGFzcyBsb29rcyBmb3IgaW4gdGhlIG1lc3NhZ2UuCitzdGF0aWMgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBmbG9hdE1hcHBpbmdzeworICAgICJjYXB0dXJlLXJhdGUiLAorICAgICJ0aW1lLWxhcHNlLWZwcyIsCisgICAgImZyYW1lLXJhdGUiLAorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gaW50NjRNYXBwaW5nc3sKKyAgICAiZXhpZi1vZmZzZXQiLCAgICAiZXhpZi1zaXplIiwgInRhcmdldC10aW1lIiwKKyAgICAidGh1bWJuYWlsLXRpbWUiLCAidGltZVVzIiwgICAgImR1cmF0aW9uVXMiLAorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gaW50MzJNYXBwaW5nc3sibG9vcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lLXNjYWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyeXB0by1tb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyeXB0by1kZWZhdWx0LWl2LXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyeXB0by1za2lwLWJ5dGUtYmxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUtY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4LWJpdHJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNtLWJpZy1lbmRpYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcG9yYWwtbGF5ZXItY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcG9yYWwtbGF5ZXItaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGh1bWJuYWlsLXdpZHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRodW1ibmFpbC1oZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2staWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsaWQtc2FtcGxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvci1mb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Etc3lzdGVtLWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzLXN5bmMtZnJhbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYml0cmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtYml0cmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FyLXdpZHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhci1oZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheS13aWR0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNwbGF5LWhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcy1kZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbGUtd2lkdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGlsZS1oZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JpZC1yb3dzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyaWQtY29scyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3RhdGlvbi1kZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwtY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlLXJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYml0cy1wZXItc2FtcGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwtbWFzayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVyLWRlbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZXItcGFkZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcy1hZHRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lLXJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4LWhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtd2lkdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4LWlucHV0LXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFwdGljLWNoYW5uZWwtY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNtLWVuY29kaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFhYy1wcm9maWxlIn07CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoQU1lc3NhZ2UgKiwgRnV6emVkRGF0YVByb3ZpZGVyICopPj4KKyAgICBhbWVzc2FnZV9zZXR2YWxzID0geworICAgICAgICBbXShBTWVzc2FnZSAqbXNnLCBGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCkgLT4gdm9pZCB7CisgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgIH0sCisgICAgICAgIFtdKEFNZXNzYWdlICptc2csIEZ1enplZERhdGFQcm92aWRlciAqZmRwKSAtPiB2b2lkIHsKKyAgICAgICAgICBtc2ctPnNldEZsb2F0KGZsb2F0TWFwcGluZ3NbZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmxvYXRNYXBwaW5ncy5zaXplKCkgLSAxKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oQU1lc3NhZ2UgKm1zZywgRnV6emVkRGF0YVByb3ZpZGVyICpmZHApIC0+IHZvaWQgeworICAgICAgICAgIG1zZy0+c2V0SW50NjQoaW50NjRNYXBwaW5nc1tmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbnQ2NE1hcHBpbmdzLnNpemUoKSAtIDEpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsPGludDY0X3Q+KCkpOworICAgICAgICB9LAorICAgICAgICBbXShBTWVzc2FnZSAqbXNnLCBGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCkgLT4gdm9pZCB7CisgICAgICAgICAgbXNnLT5zZXRJbnQzMihpbnQzMk1hcHBpbmdzW2ZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGludDMyTWFwcGluZ3Muc2l6ZSgpIC0gMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgIH19OworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9Ta2lwQ3V0QnVmZmVyRnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvU2tpcEN1dEJ1ZmZlckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3OGU2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvU2tpcEN1dEJ1ZmZlckZ1enplci5jcHAKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICBzaXplX3Qgc2tpcCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpOworICBzaXplX3QgY3V0ID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCk7CisgIHNpemVfdCBudW0xNkNoYW5uZWxzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCk7CisgIHNwPFNraXBDdXRCdWZmZXI+IHNCdWZmZXIobmV3IFNraXBDdXRCdWZmZXIoc2tpcCwgY3V0LCBudW0xNkNoYW5uZWxzKSk7CisKKyAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKKyAgICAvLyBDYXAgc2l6ZSB0byAxMDI0IHRvIGxpbWl0IG1heCBhbW91bnQgYWxsb2NhdGVkLgorICAgIHNpemVfdCBidWZfc2l6ZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgMTAyNCk7CisgICAgc2l6ZV90IHJhbmdlID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBidWZfc2l6ZSk7CisgICAgc2l6ZV90IGxlbmd0aCA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgYnVmX3NpemUgLSByYW5nZSk7CisKKyAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDQpKSB7CisgICAgY2FzZSAwOiB7CisgICAgICBzcDxBQnVmZmVyPiBhX2J1ZmZlcihuZXcgQUJ1ZmZlcihidWZfc2l6ZSkpOworICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdChuZXcgQU1lc3NhZ2UpOworICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gc19idWZmZXIobmV3IE1lZGlhQ29kZWNCdWZmZXIoZm9ybWF0LCBhX2J1ZmZlcikpOworICAgICAgc19idWZmZXItPnNldFJhbmdlKHJhbmdlLCBsZW5ndGgpOworICAgICAgc0J1ZmZlci0+c3VibWl0KHNfYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDE6IHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUJ1ZmZlckJhc2U+IG1fYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihidWZfc2l6ZSkpOworICAgICAgbV9idWZmZXItPnNldF9yYW5nZShyYW5nZSwgbGVuZ3RoKTsKKyAgICAgIHNCdWZmZXItPnN1Ym1pdChyZWludGVycHJldF9jYXN0PE1lZGlhQnVmZmVyICo+KG1fYnVmZmVyLmdldCgpKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOiB7CisgICAgICBzcDxBQnVmZmVyPiBhX2J1ZmZlcihuZXcgQUJ1ZmZlcihidWZfc2l6ZSkpOworICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdChuZXcgQU1lc3NhZ2UpOworICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gc19idWZmZXIobmV3IE1lZGlhQ29kZWNCdWZmZXIoZm9ybWF0LCBhX2J1ZmZlcikpOworICAgICAgYV9idWZmZXItPnNldFJhbmdlKHJhbmdlLCBsZW5ndGgpOworICAgICAgc0J1ZmZlci0+c3VibWl0KGFfYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDM6IHsKKyAgICAgIHNCdWZmZXItPmNsZWFyKCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA0OiB7CisgICAgICBzQnVmZmVyLT5zaXplKCk7CisgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3MmI3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXJGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyBBdXRob3JzOiBjb3JiaW4uc291ZmZyYW50QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorLy8gICAgICAgICAgZHlsYW4ua2F0ekBsZXZpYXRoYW5zZWN1cml0eS5jb20KKworI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaD4KKworI2luY2x1ZGUgPGNzdGRpbz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgRnV6ek1lZGlhU2Nhbm5lckNsaWVudCA6IHB1YmxpYyBNZWRpYVNjYW5uZXJDbGllbnQgeworcHVibGljOgorICB2aXJ0dWFsIHN0YXR1c190IHNjYW5GaWxlKGNvbnN0IGNoYXIgKiwgbG9uZyBsb25nLCBsb25nIGxvbmcsIGJvb2wsIGJvb2wpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlU3RyaW5nVGFnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSB7IHJldHVybiAwOyB9CisKKyAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaW1lVHlwZShjb25zdCBjaGFyICopIHsgcmV0dXJuIDA7IH0KK307CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIgbVNjYW5uZXIgPSBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcigpOworICAvLyBXaXRob3V0IHRoaXMsIHRoZSBmdXp6ZXIgY3Jhc2hlcyBmb3Igc29tZSByZWFzb24uCisgIG1TY2FubmVyLnNldExvY2FsZSgiIik7CisKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgc2l6ZSk7CisgIGludCBmZCA9CisgICAgICBhc2htZW1fY3JlYXRlX3JlZ2lvbigic3RhZ2VmcmlnaHRtZWRpYXNjYW5uZXJfZnV6el9yZWdpb24iLCBkYXRhX3NpemUpOworICBpZiAoZmQgPCAwKQorICAgIHJldHVybiAwOworCisgIHVpbnQ4X3QgKnNoX2RhdGEgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KAorICAgICAgbW1hcChOVUxMLCBkYXRhX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKSk7CisgIGlmIChzaF9kYXRhID09IE1BUF9GQUlMRUQpCisgICAgcmV0dXJuIDA7CisKKyAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSA+IDgpIHsKKyAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDEpKSB7CisgICAgY2FzZSAwOiB7CisgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoZmRwLnJlbWFpbmluZ19ieXRlcygpKTsKKyAgICAgIHN0ZDo6c3RyaW5nIG1pbWVUeXBlID0KKyAgICAgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhmZHAucmVtYWluaW5nX2J5dGVzKCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2Nhbm5lckNsaWVudD4gY2xpZW50KG5ldyBGdXp6TWVkaWFTY2FubmVyQ2xpZW50KCkpOworICAgICAgbVNjYW5uZXIucHJvY2Vzc0ZpbGUocGF0aC5jX3N0cigpLCBtaW1lVHlwZS5jX3N0cigpLCAqY2xpZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDE6IHsKKyAgICAgIHNpemVfdCB0b19jb3B5ID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigxLCBkYXRhX3NpemUpOworICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmFuZF9idWYgPSBmZHAuQ29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KHRvX2NvcHkpOworCisgICAgICAvLyBJZiBmZHAgZG9lc24ndCBoYXZlIGVub3VnaCBieXRlcyBsZWZ0IGl0IHdpbGwganVzdCBtYWtlIGEgc2hvcnRlcgorICAgICAgLy8gdmVjdG9yLgorICAgICAgdG9fY29weSA9IHN0ZDo6bWluKHJhbmRfYnVmLnNpemUoKSwgZGF0YV9zaXplKTsKKworICAgICAgc3RkOjpjb3B5KHNoX2RhdGEsIHNoX2RhdGEgKyB0b19jb3B5LCByYW5kX2J1Zi5iZWdpbigpKTsKKyAgICAgIG1TY2FubmVyLmV4dHJhY3RBbGJ1bUFydChmZCk7CisgICAgfQorICAgIH0KKyAgfQorCisgIG11bm1hcChzaF9kYXRhLCBkYXRhX3NpemUpOworICBjbG9zZShmZCk7CisgIHJldHVybiAwOworfQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZDA2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJtZWRpYWNvZGVjVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYUNvZGVjVGVzdC5jcHAiLAorICAgICAgICAiTWVkaWFUZXN0SGVscGVyLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY2xpc3QiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImdlbmVyYWwtdGVzdHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMGE1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcApAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmdXR1cmU+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KKworI2luY2x1ZGUgIk1lZGlhVGVzdEhlbHBlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1vY2tCdWZmZXJDaGFubmVsIDogcHVibGljIEJ1ZmZlckNoYW5uZWxCYXNlIHsKK3B1YmxpYzoKKyAgICB+TW9ja0J1ZmZlckNoYW5uZWwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzZXRDcnlwdG8sIChjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgc2V0RGVzY3JhbWJsZXIsIChjb25zdCBzcDxJRGVzY3JhbWJsZXI+ICZkZXNjcmFtYmxlciksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0YXR1c190LCBxdWV1ZUlucHV0QnVmZmVyLCAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0YXR1c190LCBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyLAorICAgICAgICAgICAgKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICAgYm9vbCBzZWN1cmUsCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LAorICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLAorICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuLAorICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLAorICAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSwKKyAgICAgICAgICAgIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0YXR1c190LCBhdHRhY2hCdWZmZXIsCisgICAgICAgICAgICAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJCdWZmZXIsIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpLAorICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIGF0dGFjaEVuY3J5cHRlZEJ1ZmZlciwKKyAgICAgICAgICAgIChjb25zdCBzcDxoYXJkd2FyZTo6SGlkbE1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsCisgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKKyAgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSwKKyAgICAgICAgICAgIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0YXR1c190LCByZW5kZXJPdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgaW50NjRfdCB0aW1lc3RhbXBOcyksCisgICAgICAgICAgICAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChzdGF0dXNfdCwgZGlzY2FyZEJ1ZmZlciwgKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBnZXRJbnB1dEJ1ZmZlckFycmF5LCAoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBnZXRPdXRwdXRCdWZmZXJBcnJheSwgKFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSwgKG92ZXJyaWRlKSk7Cit9OworCitjbGFzcyBNb2NrQ29kZWMgOiBwdWJsaWMgQ29kZWNCYXNlIHsKK3B1YmxpYzoKKyAgICBNb2NrQ29kZWMoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNb2NrQnVmZmVyQ2hhbm5lbD4gJik+IG1vY2spIHsKKyAgICAgICAgbU1vY2tCdWZmZXJDaGFubmVsID0gc3RkOjptYWtlX3NoYXJlZDxNb2NrQnVmZmVyQ2hhbm5lbD4oKTsKKyAgICAgICAgbW9jayhtTW9ja0J1ZmZlckNoYW5uZWwpOworICAgIH0KKyAgICB+TW9ja0NvZGVjKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgTU9DS19NRVRIT0Qodm9pZCwgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudCwgKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQsIChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlLCAoKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UsIChjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZVN0YXJ0LCAoKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgaW5pdGlhdGVTaHV0ZG93biwgKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIG9uTWVzc2FnZVJlY2VpdmVkLCAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChzdGF0dXNfdCwgc2V0U3VyZmFjZSwgKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgc2lnbmFsRmx1c2gsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzaWduYWxSZXN1bWUsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzaWduYWxSZXF1ZXN0SURSRnJhbWUsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzaWduYWxTZXRQYXJhbWV0ZXJzLCAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzaWduYWxFbmRPZklucHV0U3RyZWFtLCAoKSwgKG92ZXJyaWRlKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IGdldEJ1ZmZlckNoYW5uZWwoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTW9ja0J1ZmZlckNoYW5uZWw7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvZGVjQ2FsbGJhY2s+ICZjYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1DYWxsYmFjazsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TW9ja0J1ZmZlckNoYW5uZWw+IG1Nb2NrQnVmZmVyQ2hhbm5lbDsKK307CisKK2NsYXNzIENvdW50ZXIgeworcHVibGljOgorICAgIENvdW50ZXIoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgQ291bnRlcihpbnQzMl90IGluaXRDb3VudCkgOiBtQ291bnQoaW5pdENvdW50KSB7fQorICAgIH5Db3VudGVyKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBhZHZhbmNlKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgKyttQ291bnQ7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXAsIHR5cGVuYW1lIFBlcmlvZCwgdHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbnQzMl90IHdhaXRGb3IoY29uc3Qgc3RkOjpjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiAmZHVyYXRpb24sIEFyZ3MuLi4gdmFsdWVzKSB7CisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxpbnQzMl90PiBsaXN0ID0ge3ZhbHVlcy4uLn07CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtQ29uZGl0aW9uLndhaXRfZm9yKAorICAgICAgICAgICAgICAgIGxvY2ssCisgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgWyZsaXN0LCB0aGlzXXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZChsaXN0LmJlZ2luKCksIGxpc3QuZW5kKCksIG1Db3VudCkgIT0gbGlzdC5lbmQoKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG1Db3VudDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbnQzMl90IHdhaXQoQXJncy4uLiB2YWx1ZXMpIHsKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PGludDMyX3Q+IGxpc3QgPSB7dmFsdWVzLi4ufTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1Db25kaXRpb24ud2FpdCgKKyAgICAgICAgICAgICAgICBsb2NrLAorICAgICAgICAgICAgICAgIFsmbGlzdCwgdGhpc117CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQobGlzdC5iZWdpbigpLCBsaXN0LmVuZCgpLCBtQ291bnQpICE9IGxpc3QuZW5kKCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBtQ291bnQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgaW50MzJfdCBtQ291bnQgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyA6OnRlc3Rpbmc6Ol87CisKK3N0YXRpYyBzcDxNZWRpYUNvZGVjPiBTZXR1cE1lZGlhQ29kZWMoCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJm93bmVyLAorICAgICAgICBjb25zdCBBU3RyaW5nICZjb2RlY05hbWUsCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSwKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyKT4gZ2V0Q29kZWNCYXNlKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhQ29kZWNMaXN0V3JpdGVyPiBsaXN0V3JpdGVyID0KKyAgICAgICAgTWVkaWFUZXN0SGVscGVyOjpDcmVhdGVDb2RlY0xpc3RXcml0ZXIoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGluZm9Xcml0ZXIgPSBsaXN0V3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpOworICAgIGluZm9Xcml0ZXItPnNldE5hbWUoY29kZWNOYW1lLmNfc3RyKCkpOworICAgIGluZm9Xcml0ZXItPnNldE93bmVyKG93bmVyLmNfc3RyKCkpOworICAgIGluZm9Xcml0ZXItPmFkZE1lZGlhVHlwZShtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiBjb2RlY0luZm9zOworICAgIE1lZGlhVGVzdEhlbHBlcjo6V3JpdGVDb2RlY0luZm9zKGxpc3RXcml0ZXIsICZjb2RlY0luZm9zKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8gPQorICAgICAgICBbY29kZWNJbmZvc10oY29uc3QgQVN0cmluZyAmbmFtZSwgc3A8TWVkaWFDb2RlY0luZm8+ICppbmZvKSAtPiBzdGF0dXNfdCB7CisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm9zLmJlZ2luKCksIGNvZGVjSW5mb3MuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIFsmbmFtZV0oY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICppbmZvID0gKGl0ID09IGNvZGVjSW5mb3MuZW5kKCkpID8gbnVsbHB0ciA6ICppdDsKKyAgICAgICAgICAgIHJldHVybiAoKmluZm8pID8gT0sgOiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfTsKKworICAgIGxvb3Blci0+c3RhcnQoKTsKKyAgICByZXR1cm4gTWVkaWFUZXN0SGVscGVyOjpDcmVhdGVDb2RlYygKKyAgICAgICAgICAgIGNvZGVjTmFtZSwgbG9vcGVyLCBnZXRDb2RlY0Jhc2UsIGdldENvZGVjSW5mbyk7Cit9CisKK1RFU1QoTWVkaWFDb2RlY1Rlc3QsIFJlY2xhaW1SZWxlYXNlUmFjZSkgeworICAgIC8vIFRlc3Qgc2NlbmFyaW86CisgICAgLy8KKyAgICAvLyAxKSBSZXNvdXJjZU1hbmFnZXIgdGhyZWFkIGNhbGxzIHJlY2xhaW0oKSwgbWVzc2FnZSBwb3N0ZWQgdG8KKyAgICAvLyAgICBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQuCisgICAgLy8gMikgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkIGNhbGxzIGluaXRpYXRlU2h1dGRvd24oKSwgc2h1dGRvd24gYmVpbmcKKyAgICAvLyAgICBoYW5kbGVkIGF0IHRoZSBjb21wb25lbnQgdGhyZWFkLgorICAgIC8vIDMpIENsaWVudCB0aHJlYWQgY2FsbHMgcmVsZWFzZSgpLCBtZXNzYWdlIHBvc3RlZCB0byAmIGhhbmRsZSBhdAorICAgIC8vICAgIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZC4KKyAgICAvLyA0KSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgbWF5IGNhbGwgaW5pdGlhdGVTaHV0ZG93bigpLgorICAgIC8vIDUpIGluaXRpYXRlU2h1dGRvd24oKSBmcm9tIDIpIGlzIGhhbmRsZWQgYXQgb25SZWxlYXNlQ29tcGxldGUoKSBldmVudAorICAgIC8vICAgIHBvc3RlZCB0byBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQuCisgICAgLy8gNikgSWYgY2FsbGVkLCBpbml0aWF0ZVNodXRkb3duKCkgZnJvbSA0KSBpcyBoYW5kbGVkIGFuZAorICAgIC8vICAgIG9uUmVsZWFzZUNvbXBsZXRlKCkgZXZlbnQgcG9zdGVkIHRvIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZC4KKworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtDb2RlY05hbWV7InRlc3QuY29kZWMifTsKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrQ29kZWNPd25lcnsibm9ib2R5In07CisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga01lZGlhVHlwZXsidmlkZW8veC10ZXN0In07CisKKyAgICBlbnVtIHsKKyAgICAgICAga0luaXQsCisgICAgICAgIGtTaHV0ZG93bkZyb21SZWNsYWltUmVjZWl2ZWQsCisgICAgICAgIGtSZWxlYXNlQ2FsbGVkLAorICAgIH07CisgICAgQ291bnRlciBjb3VudGVye2tJbml0fTsKKyAgICBzcDxNb2NrQ29kZWM+IG1vY2tDb2RlYzsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjQmFzZT4oY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIpPiBnZXRDb2RlY0Jhc2UgPQorICAgICAgICBbJm1vY2tDb2RlYywgJmNvdW50ZXJdKGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKSB7CisgICAgICAgICAgICBtb2NrQ29kZWMgPSBuZXcgTW9ja0NvZGVjKFtdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNb2NrQnVmZmVyQ2hhbm5lbD4gJikgeworICAgICAgICAgICAgICAgIC8vIE5vIG1vY2sgc2V0dXAsIGFzIHdlIGRvbid0IGV4cGVjdCBhbnkgYnVmZmVyIG9wZXJhdGlvbnMKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNjZW5hcmlvLgorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoXykpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlY10oY29uc3Qgc3A8QU1lc3NhZ2U+ICYpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkNvbXBvbmVudEFsbG9jYXRlZChrQ29kZWNOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZVNodXRkb3duKF8pKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWMsICZjb3VudGVyXShib29sKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhZ2UgPSBjb3VudGVyLndhaXQoa0luaXQsIGtSZWxlYXNlQ2FsbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWdlID09IGtJbml0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoYXQgMikgaGFwcGVuZWQsIHNvIHRlc3QgY2FuIHByb2NlZWQgdG8gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIuYWR2YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWdlID09IGtSZWxlYXNlQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgNikKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBtb2NrQ29kZWM7CisgICAgICAgIH07CisKKyAgICBzcDxBTG9vcGVyPiBsb29wZXJ7bmV3IEFMb29wZXJ9OworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gU2V0dXBNZWRpYUNvZGVjKAorICAgICAgICAgICAga0NvZGVjT3duZXIsIGtDb2RlY05hbWUsIGtNZWRpYVR5cGUsIGxvb3BlciwgZ2V0Q29kZWNCYXNlKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29kZWMpIDw8ICJDb2RlYyBtdXN0IG5vdCBiZSBudWxsIjsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgbW9ja0NvZGVjKSA8PCAiTW9ja0NvZGVjIG11c3Qgbm90IGJlIG51bGwiOworICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiByZWNsYWltQ29tcGxldGVkOworICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiByZWxlYXNlQ29tcGxldGVkOworICAgIENvdW50ZXIgdGhyZWFkRXhpdENvdW50ZXI7CisgICAgc3RkOjp0aHJlYWQoW2NvZGVjLCAmcmVjbGFpbUNvbXBsZXRlZF17CisgICAgICAgIC8vIFNpbXVsYXRlIFJlc291cmNlTWFuYWdlciB0aHJlYWQuIFByb2NlZWQgd2l0aCAxKQorICAgICAgICBNZWRpYVRlc3RIZWxwZXI6OlJlY2xhaW0oY29kZWMsIHRydWUgLyogZm9yY2UgKi8pOworICAgICAgICByZWNsYWltQ29tcGxldGVkLnNldF92YWx1ZSgpOworICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFtjb2RlYywgJmNvdW50ZXIsICZyZWxlYXNlQ29tcGxldGVkXXsKKyAgICAgICAgLy8gU2ltdWxhdGUgY2xpZW50IHRocmVhZC4gV2FpdCB1bnRpbCAyKSBpcyBjb21wbGV0ZQorICAgICAgICAodm9pZCljb3VudGVyLndhaXQoa1NodXRkb3duRnJvbVJlY2xhaW1SZWNlaXZlZCk7CisgICAgICAgIC8vIFByb2NlZWQgdG8gMyksIGFuZCBtYXJrIHRoYXQgNSkgaXMgcmVhZHkgdG8gaGFwcGVuLgorICAgICAgICAvLyBOT1RFOiBpdCdzIGRpZmZpY3VsdCB0byBwaW5wb2ludCB3aGVuIDQpIGhhcHBlbnMsIHNvIHdlIHdpbGwgc2xlZXAKKyAgICAgICAgLy8gICAgICAgdG8gbWVldCB0aGUgdGltaW5nLgorICAgICAgICBjb3VudGVyLmFkdmFuY2UoKTsKKyAgICAgICAgY29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgcmVsZWFzZUNvbXBsZXRlZC5zZXRfdmFsdWUoKTsKKyAgICB9KS5kZXRhY2goKTsKKyAgICBzdGQ6OnRocmVhZChbbW9ja0NvZGVjLCAmY291bnRlcl17CisgICAgICAgIC8vIFNpbXVsYXRlIGNvbXBvbmVudCB0aHJlYWQuIFdhaXQgdW50aWwgMykgaXMgY29tcGxldGUKKyAgICAgICAgKHZvaWQpY291bnRlci53YWl0KGtSZWxlYXNlQ2FsbGVkKTsKKyAgICAgICAgLy8gV2Ugd2FudCA0KSB0byBjb21wbGV0ZSBiZWZvcmUgbW92aW5nIGZvcndhcmQsIGJ1dCBpdCBpcyBoYXJkIHRvCisgICAgICAgIC8vIHdhaXQgZm9yIHRoaXMgZXhhY3QgZXZlbnQuIEp1c3Qgc2xlZXAgc28gdGhhdCB0aGUgb3RoZXIgdGhyZWFkIGNhbgorICAgICAgICAvLyBwcm9jZWVkIGFuZCBjb21wbGV0ZSA0KS4KKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7CisgICAgICAgIC8vIFByb2NlZWQgdG8gNSkuCisgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgfSkuZGV0YWNoKCk7CisgICAgRVhQRUNUX0VRKAorICAgICAgICAgICAgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSwKKyAgICAgICAgICAgIHJlY2xhaW1Db21wbGV0ZWQuZ2V0X2Z1dHVyZSgpLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSkKKyAgICAgICAgPDwgInJlY2xhaW0gdGltZWQgb3V0IjsKKyAgICBFWFBFQ1RfRVEoCisgICAgICAgICAgICBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LAorICAgICAgICAgICAgcmVsZWFzZUNvbXBsZXRlZC5nZXRfZnV0dXJlKCkud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoNSkpKQorICAgICAgICA8PCAicmVsZWFzZSB0aW1lZCBvdXQiOworICAgIGxvb3Blci0+c3RvcCgpOworfQorCitURVNUKE1lZGlhQ29kZWNUZXN0LCBFcnJvcldoaWxlU3RvcHBpbmcpIHsKKyAgICAvLyBUZXN0IHNjZW5hcmlvOgorICAgIC8vCisgICAgLy8gMSkgQ2xpZW50IHRocmVhZCBjYWxscyBzdG9wKCk7IE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZCBjYWxscworICAgIC8vICAgIGluaXRpYXRlU2h1dGRvd24oKTsgc2h1dGRvd24gaXMgYmVpbmcgaGFuZGxlZCBhdCB0aGUgY29tcG9uZW50IHRocmVhZC4KKyAgICAvLyAyKSBFcnJvciBvY2N1cnJlZCwgYnV0IHRoZSBzaHV0ZG93biBvcGVyYXRpb24gaXMgc3RpbGwgYmVpbmcgZG9uZS4KKyAgICAvLyAzKSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgaGFuZGxlcyB0aGUgZXJyb3IuCisgICAgLy8gNCkgQ29tcG9uZW50IHRocmVhZCBjb21wbGV0ZXMgc2h1dGRvd24gYW5kIHBvc3RzIG9uU3RvcENvbXBsZXRlZCgpCisKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrQ29kZWNOYW1leyJ0ZXN0LmNvZGVjIn07CisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjT3duZXJ7Im5vYm9keSJ9OworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtNZWRpYVR5cGV7InZpZGVvL3gtdGVzdCJ9OworCisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IGVycm9yT2NjdXJyZWQ7CisgICAgc3A8TW9ja0NvZGVjPiBtb2NrQ29kZWM7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyKT4gZ2V0Q29kZWNCYXNlID0KKyAgICAgICAgWyZtb2NrQ29kZWMsICZlcnJvck9jY3VycmVkXShjb25zdCBBU3RyaW5nICYsIGNvbnN0IGNoYXIgKikgeworICAgICAgICAgICAgbW9ja0NvZGVjID0gbmV3IE1vY2tDb2RlYyhbXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TW9ja0J1ZmZlckNoYW5uZWw+ICYpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBtb2NrIHNldHVwLCBhcyB3ZSBkb24ndCBleHBlY3QgYW55IGJ1ZmZlciBvcGVyYXRpb25zCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzY2VuYXJpby4KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KF8pKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGNvbnN0IHNwPEFNZXNzYWdlPiAmKSB7CisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25Db21wb25lbnRBbGxvY2F0ZWQoa0NvZGVjTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIE9OX0NBTEwoKm1vY2tDb2RlYywgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoXykpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlY10oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkNvbXBvbmVudENvbmZpZ3VyZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5kdXAoKSwgbXNnLT5kdXAoKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlU3RhcnQoKSkKKyAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vblN0YXJ0Q29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlU2h1dGRvd24odHJ1ZSkpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlYywgJmVycm9yT2NjdXJyZWRdKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB0aGF0IDEpIGFuZCAyKSBhcmUgY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIGVycm9yT2NjdXJyZWQuc2V0X3ZhbHVlKCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlU2h1dGRvd24oZmFsc2UpKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBtb2NrQ29kZWM7CisgICAgICAgIH07CisKKyAgICBzcDxBTG9vcGVyPiBsb29wZXJ7bmV3IEFMb29wZXJ9OworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gU2V0dXBNZWRpYUNvZGVjKAorICAgICAgICAgICAga0NvZGVjT3duZXIsIGtDb2RlY05hbWUsIGtNZWRpYVR5cGUsIGxvb3BlciwgZ2V0Q29kZWNCYXNlKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29kZWMpIDw8ICJDb2RlYyBtdXN0IG5vdCBiZSBudWxsIjsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgbW9ja0NvZGVjKSA8PCAiTW9ja0NvZGVjIG11c3Qgbm90IGJlIG51bGwiOworCisgICAgc3RkOjp0aHJlYWQoW21vY2tDb2RlYywgJmVycm9yT2NjdXJyZWRdeworICAgICAgICAvLyBTaW11bGF0ZSBjb21wb25lbnQgdGhyZWFkIHRoYXQgaGFuZGxlcyBzdG9wKCkKKyAgICAgICAgZXJyb3JPY2N1cnJlZC5nZXRfZnV0dXJlKCkud2FpdCgpOworICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCBidXQgc2h1dGRvd24gcmVxdWVzdCBzdGlsbCBnb3QgcHJvY2Vzc2VkLgorICAgICAgICBtb2NrQ29kZWMtPmNhbGxiYWNrKCktPm9uU3RvcENvbXBsZXRlZCgpOworICAgIH0pLmRldGFjaCgpOworCisgICAgY29kZWMtPmNvbmZpZ3VyZShuZXcgQU1lc3NhZ2UsIG51bGxwdHIsIG51bGxwdHIsIDApOworICAgIGNvZGVjLT5zdGFydCgpOworICAgIGNvZGVjLT5zdG9wKCk7CisgICAgLy8gU2xlZXAgaGVyZSB0byBnaXZlIHRpbWUgZm9yIHRoZSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQKKyAgICAvLyB0byBwcm9jZXNzIHRoZSBtZXNzYWdlcy4KKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgIGxvb3Blci0+c3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYVRlc3RIZWxwZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYVRlc3RIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTNjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhVGVzdEhlbHBlci5jcHAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KKworI2luY2x1ZGUgIk1lZGlhVGVzdEhlbHBlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8TWVkaWFDb2RlYz4gTWVkaWFUZXN0SGVscGVyOjpDcmVhdGVDb2RlYygKKyAgICAgICAgY29uc3QgQVN0cmluZyAmbmFtZSwKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKT4gZ2V0Q29kZWNCYXNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8pIHsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKAorICAgICAgICAgICAgbG9vcGVyLCBNZWRpYUNvZGVjOjprTm9QaWQsIE1lZGlhQ29kZWM6OmtOb1VpZCwgZ2V0Q29kZWNCYXNlLCBnZXRDb2RlY0luZm8pOworICAgIGlmIChjb2RlYy0+aW5pdChuYW1lKSAhPSBPSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvZGVjOworfQorCisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFUZXN0SGVscGVyOjpSZWNsYWltKGNvbnN0IHNwPE1lZGlhQ29kZWM+ICZjb2RlYywgYm9vbCBmb3JjZSkgeworICAgIGNvZGVjLT5yZWNsYWltKGZvcmNlKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8TWVkaWFDb2RlY0xpc3RXcml0ZXI+IE1lZGlhVGVzdEhlbHBlcjo6Q3JlYXRlQ29kZWNMaXN0V3JpdGVyKCkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFDb2RlY0xpc3RXcml0ZXI+KG5ldyBNZWRpYUNvZGVjTGlzdFdyaXRlcik7Cit9CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYVRlc3RIZWxwZXI6OldyaXRlQ29kZWNJbmZvcygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhQ29kZWNMaXN0V3JpdGVyPiAmd3JpdGVyLAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICpjb2RlY0luZm9zKSB7CisgICAgd3JpdGVyLT53cml0ZUNvZGVjSW5mb3MoY29kZWNJbmZvcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhVGVzdEhlbHBlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYVRlc3RIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q2MTEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYVRlc3RIZWxwZXIuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1RFU1RfSEVMUEVSX0hfCisKKyNkZWZpbmUgTUVESUFfVEVTVF9IRUxQRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBDb2RlY0Jhc2U7CitzdHJ1Y3QgTWVkaWFDb2RlYzsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKK3N0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlcjsKKworY2xhc3MgTWVkaWFUZXN0SGVscGVyIHsKK3B1YmxpYzoKKyAgICAvLyBNZWRpYUNvZGVjCisgICAgc3RhdGljIHNwPE1lZGlhQ29kZWM+IENyZWF0ZUNvZGVjKAorICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjQmFzZT4oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopPiBnZXRDb2RlY0Jhc2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8pOworICAgIHN0YXRpYyB2b2lkIFJlY2xhaW0oY29uc3Qgc3A8TWVkaWFDb2RlYz4gJmNvZGVjLCBib29sIGZvcmNlKTsKKworICAgIC8vIE1lZGlhQ29kZWNMaXN0V3JpdGVyCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYUNvZGVjTGlzdFdyaXRlcj4gQ3JlYXRlQ29kZWNMaXN0V3JpdGVyKCk7CisgICAgc3RhdGljIHZvaWQgV3JpdGVDb2RlY0luZm9zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhQ29kZWNMaXN0V3JpdGVyPiAmd3JpdGVyLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAqY29kZWNJbmZvcyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1RFU1RfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4MzBmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIk1ldGFEYXRhVXRpbHNUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk1ldGFEYXRhVXRpbHNUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDk3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTWV0YURhdGFVdGlscyB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNZXRhRGF0YVV0aWxzVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTWV0YURhdGFVdGlsc1Rlc3QtPi9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdFJlcy0xLjAuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9Ik1ldGFEYXRhVXRpbHNUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvTWV0YURhdGFVdGlsc1Rlc3RSZXMvIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkNWZkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3QuY3BwCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YVV0aWxzVGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8RVNEUy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKworI2luY2x1ZGUgIk1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQuaCIKKworY29uc3RleHByIHVpbnQ4X3Qga0FkdHNDc2RTaXplID0gNzsKKy8vIGZyb20gQUFDIHNwZWNzOiBodHRwczovL3d3dy5pc28ub3JnL3N0YW5kYXJkLzQzMzQ1Lmh0bWwKK2NvbnN0ZXhwciBpbnQzMl90IGtTYW1wbGluZ0ZyZXFbXSA9IHs5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMH07Citjb25zdGV4cHIgdWludDhfdCBrTWF4U2FtcGxpbmdGcmVxSW5kZXggPSBzaXplb2Yoa1NhbXBsaW5nRnJlcSkgLyBzaXplb2Yoa1NhbXBsaW5nRnJlcVswXSk7CisKK3N0YXRpYyBNZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1ldGFEYXRhVmFsaWRhdGUgeworICBwdWJsaWM6CisgICAgTWV0YURhdGFWYWxpZGF0ZSgpIDogbUlucHV0QnVmZmVyKG51bGxwdHIpIHt9CisKKyAgICB+TWV0YURhdGFWYWxpZGF0ZSgpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgZGVsZXRlW10gbUlucHV0QnVmZmVyOworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgU2V0VXBNZXRhRGF0YVZhbGlkYXRlKHN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIGludDhfdCBlcnIgPSBzdGF0KGZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBmaWxlIGluZm9ybWF0aW9uIGZvciBmaWxlOiAiIDw8IGZpbGVOYW1lOworCisgICAgICAgIG1JbnB1dEJ1ZmZlclNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICAgICAgRklMRSAqaW5wdXRGaWxlUHRyID0gZm9wZW4oZmlsZU5hbWUuY19zdHIoKSwgInJiKyIpOworICAgICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlUHRyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBmaWxlTmFtZTsKKworICAgICAgICBtSW5wdXRCdWZmZXIgPSBuZXcgdWludDhfdFttSW5wdXRCdWZmZXJTaXplXTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBvZiBzaXplOiAiIDw8IG1JbnB1dEJ1ZmZlclNpemU7CisKKyAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9CisgICAgICAgICAgICAgICAgZnJlYWQoKGNoYXIgKiltSW5wdXRCdWZmZXIsIHNpemVvZih1aW50OF90KSwgbUlucHV0QnVmZmVyU2l6ZSwgaW5wdXRGaWxlUHRyKTsKKyAgICAgICAgQVNTRVJUX0VRKG51bUJ5dGVzLCBtSW5wdXRCdWZmZXJTaXplKSA8PCBudW1CeXRlcyA8PCAiIG9mICIgPDwgbUlucHV0QnVmZmVyU2l6ZSA8PCAiIHJlYWQiOworCisgICAgICAgIGZjbG9zZShpbnB1dEZpbGVQdHIpOworICAgIH0KKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJTaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKK307CisKK2NsYXNzIEF2Y0NTRFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8c3RyaW5nIC8qaW5wdXRGaWxlKi8sIHNpemVfdCAvKmF2Y1dpZHRoKi8sIHNpemVfdCAvKmF2Y0hlaWdodCovPj4geworICBwdWJsaWM6CisgICAgQXZjQ1NEVGVzdCgpIDogbUlucHV0QnVmZmVyKG51bGxwdHIpIHt9CisKKyAgICB+QXZjQ1NEVGVzdCgpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgZGVsZXRlW10gbUlucHV0QnVmZmVyOworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHN0cmluZywgc2l6ZV90LCBzaXplX3Q+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwwPihwYXJhbXMpOworICAgICAgICBtRnJhbWVXaWR0aCA9IGdldDwxPihwYXJhbXMpOworICAgICAgICBtRnJhbWVIZWlnaHQgPSBnZXQ8Mj4ocGFyYW1zKTsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIGludDhfdCBlcnIgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgMCkgPDwgIkZhaWxlZCB0byBnZXQgaW5mb3JtYXRpb24gZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIG1JbnB1dEJ1ZmZlclNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICAgICAgRklMRSAqaW5wdXRGaWxlUHRyID0gZm9wZW4oaW5wdXRGaWxlLmNfc3RyKCksICJyYisiKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0RmlsZVB0ciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG5ldyB1aW50OF90W21JbnB1dEJ1ZmZlclNpemVdOworICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgbUlucHV0QnVmZmVyU2l6ZTsKKworICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0KKyAgICAgICAgICAgICAgICBmcmVhZCgoY2hhciAqKW1JbnB1dEJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpLCBtSW5wdXRCdWZmZXJTaXplLCBpbnB1dEZpbGVQdHIpOworICAgICAgICBBU1NFUlRfRVEobnVtQnl0ZXMsIG1JbnB1dEJ1ZmZlclNpemUpIDw8IG51bUJ5dGVzIDw8ICIgb2YgIiA8PCBtSW5wdXRCdWZmZXJTaXplIDw8ICIgcmVhZCI7CisKKyAgICAgICAgZmNsb3NlKGlucHV0RmlsZVB0cik7CisgICAgfQorCisgICAgc2l6ZV90IG1GcmFtZVdpZHRoOworICAgIHNpemVfdCBtRnJhbWVIZWlnaHQ7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlclNpemU7CisgICAgY29uc3QgdWludDhfdCAqbUlucHV0QnVmZmVyOworfTsKKworY2xhc3MgQXZjQ1NEVmFsaWRhdGVUZXN0IDogcHVibGljIE1ldGFEYXRhVmFsaWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0cmluZyAvKmlucHV0RmlsZSovPiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCk7CisKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0VXBNZXRhRGF0YVZhbGlkYXRlKGlucHV0RmlsZSkpOworICAgIH0KK307CisKK2NsYXNzIEFhY0NTRFRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8dWludDMyX3QgLypwcm9maWxlKi8sIHVpbnQzMl90IC8qc2FtcGxpbmdGcmVxSW5kZXgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgLypjaGFubmVsQ29uZmlnKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3Q+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIG1BYWNQcm9maWxlID0gZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1BYWNTYW1wbGluZ0ZyZXFJbmRleCA9IGdldDwxPihwYXJhbXMpOworICAgICAgICBtQWFjQ2hhbm5lbENvbmZpZyA9IGdldDwyPihwYXJhbXMpOworICAgIH0KKworICAgIHVpbnQzMl90IG1BYWNQcm9maWxlOworICAgIHVpbnQzMl90IG1BYWNTYW1wbGluZ0ZyZXFJbmRleDsKKyAgICB1aW50MzJfdCBtQWFjQ2hhbm5lbENvbmZpZzsKK307CisKK2NsYXNzIEFhY0FEVFNUZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTxzdHJpbmcgLyphZHRzRmlsZSovLCB1aW50MzJfdCAvKmNoYW5uZWxDb3VudCovLCB1aW50MzJfdCAvKnNhbXBsZVJhdGUqLz4+IHsKKyAgcHVibGljOgorICAgIEFhY0FEVFNUZXN0KCkgOiBtSW5wdXRCdWZmZXIobnVsbHB0cikge30KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCB1aW50MzJfdCwgdWludDMyX3Q+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIHN0cmluZyBmaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1BYWNDaGFubmVsQ291bnQgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUFhY1NhbXBsZVJhdGUgPSBnZXQ8Mj4ocGFyYW1zKTsKKworICAgICAgICBGSUxFICpmaWxlUHRyID0gZm9wZW4oZmlsZU5hbWUuY19zdHIoKSwgInIiKTsKKyAgICAgICAgQVNTRVJUX05FKGZpbGVQdHIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IGZpbGVOYW1lOworCisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG5ldyB1aW50OF90W2tBZHRzQ3NkU2l6ZV07CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgYSBtZW1vcnkgb2Ygc2l6ZTogIiA8PCBrQWR0c0NzZFNpemU7CisKKyAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IGZyZWFkKCh2b2lkICopbUlucHV0QnVmZmVyLCBzaXplb2YodWludDhfdCksIGtBZHRzQ3NkU2l6ZSwgZmlsZVB0cik7CisgICAgICAgIEFTU0VSVF9FUShudW1CeXRlcywga0FkdHNDc2RTaXplKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG51bUJ5dGVzOworCisgICAgICAgIGZjbG9zZShmaWxlUHRyKTsKKyAgICB9CisgICAgaW50MzJfdCBtQWFjQ2hhbm5lbENvdW50OworICAgIGludDMyX3QgbUFhY1NhbXBsZVJhdGU7CisgICAgY29uc3QgdWludDhfdCAqbUlucHV0QnVmZmVyOworfTsKKworY2xhc3MgQWFjQ1NEVmFsaWRhdGVUZXN0IDogcHVibGljIE1ldGFEYXRhVmFsaWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0cmluZyAvKmlucHV0RmlsZSovPiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCk7CisKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0VXBNZXRhRGF0YVZhbGlkYXRlKGlucHV0RmlsZSkpOworICAgIH0KK307CisKK2NsYXNzIFZvcmJpc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nIC8qZmlsZU5hbWUqLywgc3RyaW5nIC8qaW5mb0ZpbGUqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGlucHV0TWVkaWFGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBwYXJhbXMuZmlyc3Q7CisgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ub3BlbihpbnB1dE1lZGlhRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobUlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbiBkYXRhIGZpbGU6ICIgPDwgaW5wdXRNZWRpYUZpbGU7CisKKyAgICAgICAgc3RyaW5nIGlucHV0SW5mb0ZpbGUgPSBnRW52LT5nZXRSZXMoKSArIHBhcmFtcy5zZWNvbmQ7CisgICAgICAgIG1JbmZvRmlsZVN0cmVhbS5vcGVuKGlucHV0SW5mb0ZpbGUsIGlmc3RyZWFtOjppbik7CisgICAgICAgIEFTU0VSVF9UUlVFKG1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSA8PCAiRmFpbGVkIHRvIG9wZW4gZGF0YSBmaWxlOiAiIDw8IGlucHV0SW5mb0ZpbGU7CisgICAgICAgIEFTU0VSVF9GQUxTRShpbnB1dEluZm9GaWxlLmVtcHR5KCkpIDw8ICJFbXB0eSBpbmZvIGZpbGU6ICIgPDwgaW5wdXRJbmZvRmlsZTsKKyAgICB9CisKKyAgICB+Vm9yYmlzVGVzdCgpIHsKKyAgICAgICAgaWYgKG1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSBtSW5wdXRGaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIGlmIChtSW5mb0ZpbGVTdHJlYW0uaXNfb3BlbigpKSBtSW5mb0ZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBpZnN0cmVhbSBtSW5wdXRGaWxlU3RyZWFtOworICAgIGlmc3RyZWFtIG1JbmZvRmlsZVN0cmVhbTsKK307CisKK1RFU1RfUChBdmNDU0RUZXN0LCBBdmNDU0RWYWxpZGF0aW9uVGVzdCkgeworICAgIEFNZWRpYUZvcm1hdCAqY3NkRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUoY3NkRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgQU1lZGlhIGZvcm1hdCI7CisKKyAgICBib29sIHN0YXR1cyA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShjc2REYXRhLCBtSW5wdXRCdWZmZXIsIG1JbnB1dEJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFWQyBDU0QgZnJvbSBBTWVkaWFGb3JtYXQiOworCisgICAgaW50MzJfdCBhdmNXaWR0aCA9IC0xOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmYXZjV2lkdGgpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgYXZjIHdpZHRoIjsKKyAgICBBU1NFUlRfRVEoYXZjV2lkdGgsIG1GcmFtZVdpZHRoKTsKKworICAgIGludDMyX3QgYXZjSGVpZ2h0ID0gLTE7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmYXZjSGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGF2YyBoZWlnaHQiOworICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lVHlwZSA9ICIiOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG1pbWUgdHlwZSI7CisgICAgQVNTRVJUX1NUUkVRKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIE1ldGFEYXRhIEJhc2UiOworCisgICAgc3RhdHVzID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUlucHV0QnVmZmVyLCBtSW5wdXRCdWZmZXJTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gbWFrZSBBVkMgQ1NEIGZyb20gTWV0YURhdGFCYXNlIjsKKworICAgIGF2Y1dpZHRoID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZhdmNXaWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGZpbmQgdGhlIHdpZHRoIjsKKyAgICBBU1NFUlRfRVEoYXZjV2lkdGgsIG1GcmFtZVdpZHRoKTsKKworICAgIGF2Y0hlaWdodCA9IC0xOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmF2Y0hlaWdodCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGZpbmQgdGhlIGhlaWdodCI7CisgICAgQVNTRVJUX0VRKGF2Y0hlaWdodCwgbUZyYW1lSGVpZ2h0KTsKKworICAgIHZvaWQgKmNzZEFNZWRpYUZvcm1hdEJ1ZmZlciA9IG51bGxwdHI7CisgICAgc2l6ZV90IGNzZEFNZWRpYUZvcm1hdFNpemU7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsICZjc2RBTWVkaWFGb3JtYXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3NkQU1lZGlhRm9ybWF0U2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgQ1NEIGZyb20gQU1lZGlhRm9ybWF0IjsKKyAgICBBU1NFUlRfTkUoY3NkQU1lZGlhRm9ybWF0QnVmZmVyLCBudWxscHRyKSA8PCAiSW52YWxpZCBDU0QgZnJvbSBBTWVkaWFGb3JtYXQiOworCisgICAgY29uc3Qgdm9pZCAqY3NkTWV0YURhdGFCYXNlQnVmZmVyID0gbnVsbHB0cjsKKyAgICBzaXplX3QgY3NkTWV0YURhdGFCYXNlU2l6ZSA9IDA7CisgICAgdWludDMyX3QgbWVkaWFUeXBlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kRGF0YShrS2V5QVZDQywgJm1lZGlhVHlwZSwgJmNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgJmNzZE1ldGFEYXRhQmFzZVNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisgICAgQVNTRVJUX05FKGNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgbnVsbHB0cikgPDwgIkludmFsaWQgQ1NEIGZyb20gTWV0YURhdGFCYXNlIjsKKyAgICBBU1NFUlRfR1QoY3NkTWV0YURhdGFCYXNlU2l6ZSwgMCkgPDwgIkNTRCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOworICAgIEFTU0VSVF9FUShjc2RNZXRhRGF0YUJhc2VTaXplLCBjc2RBTWVkaWFGb3JtYXRTaXplKQorICAgICAgICAgICAgPDwgIkNTRCBzaXplIG9mIE1ldGFEYXRhIHR5cGUgYW5kIEFNZWRpYUZvcm1hdCB0eXBlIG11c3QgYmUgc2FtZSI7CisKKyAgICBpbnQzMl90IHJlc3VsdCA9IG1lbWNtcChjc2RBTWVkaWFGb3JtYXRCdWZmZXIsIGNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgY3NkQU1lZGlhRm9ybWF0U2l6ZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgMCkgPDwgIkNTRCBmcm9tIEFNZWRpYUZvcm1hdCBhbmQgTWV0YURhdGFCYXNlIGRvIG5vdCBtYXRjaCI7CisKKyAgICBkZWxldGUgbWV0YURhdGE7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShjc2REYXRhKTsKK30KKworVEVTVF9QKEF2Y0NTRFZhbGlkYXRlVGVzdCwgQXZjVmFsaWRhdGVUZXN0KSB7CisgICAgQU1lZGlhRm9ybWF0ICpjc2REYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORShjc2REYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBBTWVkaWEgZm9ybWF0IjsKKworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGNzZERhdGEsIG1JbnB1dEJ1ZmZlciwgbUlucHV0QnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIk1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSB3aXRoIEFNZWRpYUZvcm1hdCBzdWNjZWVkcyB3aXRoIGludmFsaWQgZGF0YSI7CisKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgTWV0YURhdGEgQmFzZSI7CisKKyAgICBzdGF0dXMgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtSW5wdXRCdWZmZXIsIG1JbnB1dEJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEgd2l0aCBNZXRhRGF0YUJhc2Ugc3VjY2VlZHMgd2l0aCBpbnZhbGlkIGRhdGEiOworfQorCitURVNUX1AoQWFjQ1NEVGVzdCwgQWFjQ1NEVmFsaWRhdGlvblRlc3QpIHsKKyAgICBBTWVkaWFGb3JtYXQgKmNzZERhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQVNTRVJUX05FKGNzZERhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFNZWRpYSBmb3JtYXQiOworCisgICAgQVNTRVJUX0dFKG1BYWNTYW1wbGluZ0ZyZXFJbmRleCwgMCk7CisgICAgQVNTRVJUX0xUKG1BYWNTYW1wbGluZ0ZyZXFJbmRleCwga01heFNhbXBsaW5nRnJlcUluZGV4KTsKKyAgICBib29sIHN0YXR1cyA9IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShjc2REYXRhLCBtQWFjUHJvZmlsZSwgbUFhY1NhbXBsaW5nRnJlcUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BYWNDaGFubmVsQ29uZmlnKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gbWFrZSBBQUMgQ1NEIGZyb20gQU1lZGlhRm9ybWF0IjsKKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IC0xOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBzYW1wbGUgcmF0ZSI7CisgICAgQVNTRVJUX0VRKGtTYW1wbGluZ0ZyZXFbbUFhY1NhbXBsaW5nRnJlcUluZGV4XSwgc2FtcGxlUmF0ZSk7CisKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IC0xOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZjaGFubmVsQ291bnQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBjb3VudCI7CisgICAgQVNTRVJUX0VRKGNoYW5uZWxDb3VudCwgbUFhY0NoYW5uZWxDb25maWcpOworCisgICAgY29uc3QgY2hhciAqbWltZVR5cGUgPSAiIjsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBtaW1lIHR5cGUiOworICAgIEFTU0VSVF9TVFJFUShtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBNZXRhRGF0YSBCYXNlIjsKKworICAgIHN0YXR1cyA9IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbWV0YURhdGEsIG1BYWNQcm9maWxlLCBtQWFjU2FtcGxpbmdGcmVxSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BYWNDaGFubmVsQ29uZmlnKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gbWFrZSBBQUMgQ1NEIGZyb20gTWV0YURhdGFCYXNlIjsKKworICAgIHNhbXBsZVJhdGUgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBzYW1wbGluZyByYXRlIjsKKyAgICBBU1NFUlRfRVEoa1NhbXBsaW5nRnJlcVttQWFjU2FtcGxpbmdGcmVxSW5kZXhdLCBzYW1wbGVSYXRlKTsKKworICAgIGNoYW5uZWxDb3VudCA9IC0xOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJmNoYW5uZWxDb3VudCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBjaGFubmVsIGNvdW50IjsKKyAgICBBU1NFUlRfRVEoY2hhbm5lbENvdW50LCBtQWFjQ2hhbm5lbENvbmZpZyk7CisKKyAgICBtaW1lVHlwZSA9ICIiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lVHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBtaW1lIHR5cGUiOworICAgIEFTU0VSVF9TVFJFUShtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIHZvaWQgKmNzZEFNZWRpYUZvcm1hdEJ1ZmZlciA9IG51bGxwdHI7CisgICAgc2l6ZV90IGNzZEFNZWRpYUZvcm1hdFNpemUgPSAwOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjc2RBTWVkaWFGb3JtYXRTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBBTWVkaWFGb3JtYXQgQ1NEIjsKKyAgICBBU1NFUlRfR1QoY3NkQU1lZGlhRm9ybWF0U2l6ZSwgMCkgPDwgIkNTRCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOworICAgIEFTU0VSVF9ORShjc2RBTWVkaWFGb3JtYXRCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnZhbGlkIENTRCBmb3VuZCI7CisKKyAgICBjb25zdCB2b2lkICpjc2RNZXRhRGF0YUJhc2VCdWZmZXI7CisgICAgc2l6ZV90IGNzZE1ldGFEYXRhQmFzZVNpemUgPSAwOworICAgIHVpbnQzMl90IG1lZGlhVHlwZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZERhdGEoa0tleUVTRFMsICZtZWRpYVR5cGUsICZjc2RNZXRhRGF0YUJhc2VCdWZmZXIsICZjc2RNZXRhRGF0YUJhc2VTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBFU0RTIGRhdGEgZnJvbSBNZXRhRGF0YUJhc2UiOworICAgIEFTU0VSVF9HVChjc2RNZXRhRGF0YUJhc2VTaXplLCAwKSA8PCAiQ1NEIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisKKyAgICBFU0RTIGVzZHMoY3NkTWV0YURhdGFCYXNlQnVmZmVyLCBjc2RNZXRhRGF0YUJhc2VTaXplKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjc2RNZXRhRGF0YUJhc2VCdWZmZXIsICZjc2RNZXRhRGF0YUJhc2VTaXplKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCAoc3RhdHVzX3QpT0spIDw8ICJGYWlsZWQgdG8gZ2V0IENTRCBmcm9tIEVTRFMgZGF0YSI7CisgICAgQVNTRVJUX05FKGNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgbnVsbHB0cikgPDwgIkludmFsaWQgQ1NEIGZvdW5kIjsKKyAgICBBU1NFUlRfRVEoY3NkQU1lZGlhRm9ybWF0U2l6ZSwgY3NkTWV0YURhdGFCYXNlU2l6ZSkKKyAgICAgICAgICAgIDw8ICJDU0Qgc2l6ZSBkbyBub3QgbWF0Y2ggYmV0d2VlbiBBTWVkaWFGb3JtYXQgdHlwZSBhbmQgTWV0YURhdGFCYXNlIHR5cGUiOworCisgICAgaW50MzJfdCBtZW1jbXBSZXN1bHQgPQorICAgICAgICAgICAgbWVtY21wKGNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwgY3NkTWV0YURhdGFCYXNlQnVmZmVyLCBjc2RBTWVkaWFGb3JtYXRTaXplKTsKKyAgICBBU1NFUlRfRVEobWVtY21wUmVzdWx0LCAwKSA8PCAiQU1lZGlhRm9ybWF0IGFuZCBNZXRhRGF0YUJhc2UgQ1NEcyBkbyBub3QgbWF0Y2giOworCisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShjc2REYXRhKTsKKyAgICBkZWxldGUgbWV0YURhdGE7Cit9CisKK1RFU1RfUChBYWNBRFRTVGVzdCwgQWFjQURUU1ZhbGlkYXRpb25UZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICBib29sIHN0YXR1cyA9IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbWV0YURhdGEsIG1JbnB1dEJ1ZmZlciwga0FkdHNDc2RTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gbWFrZSBBQUMgQ1NEIGZyb20gTWV0YURhdGFCYXNlIjsKKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IC0xOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHNhbXBsaW5nIHJhdGUiOworICAgIEFTU0VSVF9FUShzYW1wbGVSYXRlLCBtQWFjU2FtcGxlUmF0ZSk7CisKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IC0xOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJmNoYW5uZWxDb3VudCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBjaGFubmVsIGNvdW50IjsKKyAgICBBU1NFUlRfRVEoY2hhbm5lbENvdW50LCBtQWFjQ2hhbm5lbENvdW50KTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlID0gIiI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IG1pbWUgdHlwZSI7CisgICAgQVNTRVJUX1NUUkVRKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgZGVsZXRlIG1ldGFEYXRhOworfQorCitURVNUX1AoQWFjQ1NEVmFsaWRhdGVUZXN0LCBBYWNJbnZhbGlkSW5wdXRUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICBib29sIHN0YXR1cyA9IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbWV0YURhdGEsIG1JbnB1dEJ1ZmZlciwga0FkdHNDc2RTaXplKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhIHN1Y2NlZWRzIHdpdGggaW52YWxpZCBkYXRhIjsKK30KKworVEVTVF9QKFZvcmJpc1Rlc3QsIFZvcmJpc0NvbW1lbnRUZXN0KSB7CisgICAgc3RyaW5nIGxpbmU7CisgICAgc3RyaW5nIHRhZzsKKyAgICBzdHJpbmcga2V5OworICAgIHN0cmluZyB2YWx1ZTsKKyAgICBzaXplX3QgY29tbWVudExlbmd0aDsKKyAgICBib29sIHN0YXR1czsKKworICAgIHdoaWxlIChnZXRsaW5lKG1JbmZvRmlsZVN0cmVhbSwgbGluZSkpIHsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSBzdHJpbmdMaW5lKGxpbmUpOworICAgICAgICBzdHJpbmdMaW5lID4+IHRhZyA+PiBrZXkgPj4gdmFsdWUgPj4gY29tbWVudExlbmd0aDsKKyAgICAgICAgQVNTRVJUX0dUKGNvbW1lbnRMZW5ndGgsIDApIDw8ICJWb3JiaXMgY29tbWVudCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOworCisgICAgICAgIHN0cmluZyBjb21tZW50OworICAgICAgICBzdHJpbmcgZGF0YUxpbmU7CisKKyAgICAgICAgZ2V0bGluZShtSW5wdXRGaWxlU3RyZWFtLCBkYXRhTGluZSk7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gZGF0YVN0cmluZ0xpbmUoZGF0YUxpbmUpOworICAgICAgICBkYXRhU3RyaW5nTGluZSA+PiBjb21tZW50OworCisgICAgICAgIGNoYXIgKmJ1ZmZlciA9IHN0cm5kdXAoY29tbWVudC5jX3N0cigpLCBjb21tZW50TGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX05FKGJ1ZmZlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBjb21tZW50TGVuZ3RoOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShmaWxlTWV0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgQU1lZGlhIGZvcm1hdCI7CisKKyAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KGZpbGVNZXRhLCBidWZmZXIsIGNvbW1lbnRMZW5ndGgpOworICAgICAgICBmcmVlKGJ1ZmZlcik7CisKKyAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh0YWcuY19zdHIoKSwgIkFORFJPSURfSEFQVElDIiwgc2l6ZW9mKHRhZykpKSB7CisgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxFeHBlY3RlZCA9IHN0b2kodmFsdWUpOworICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsRm91bmQgPSAtMTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmaWxlTWV0YSwga2V5LmNfc3RyKCksICZudW1DaGFubmVsRm91bmQpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY2hhbm5lbCBjb3VudCI7CisgICAgICAgICAgICBBU1NFUlRfRVEobnVtQ2hhbm5lbEV4cGVjdGVkLCBudW1DaGFubmVsRm91bmQpOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh0YWcuY19zdHIoKSwgIkFORFJPSURfTE9PUCIsIHNpemVvZih0YWcpKSkgeworICAgICAgICAgICAgaW50MzJfdCBsb29wRXhwZWN0ZWQgPSAhdmFsdWUuY29tcGFyZSgidHJ1ZSIpOworICAgICAgICAgICAgaW50MzJfdCBsb29wRm91bmQgPSAtMTsKKworICAgICAgICAgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGZpbGVNZXRhLCAibG9vcCIsICZsb29wRm91bmQpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbG9vcCBjb3VudCI7CisgICAgICAgICAgICBBU1NFUlRfRVEobG9vcEV4cGVjdGVkLCBsb29wRm91bmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnVmFsdWUgPSAiIjsKKyAgICAgICAgICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZmlsZU1ldGEsIGtleS5jX3N0cigpLCAmdGFnVmFsdWUpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgdGFnIHZhbHVlIjsKKyAgICAgICAgICAgIEFTU0VSVF9TVFJFUSh2YWx1ZS5jX3N0cigpLCB0YWdWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmaWxlTWV0YSk7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWV0YURhdGFVdGlsc1Rlc3RBbGwsIEF2Y0NTRFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgic3BzX3Bwc191c2VyZGF0YS5oMjY0IiwgOCwgOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3BzX3VzZXJkYXRhX3Bwcy5oMjY0IiwgOCwgOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3BzX3Bwc19zcHNfcHBzLmgyNjQiLCA4LCA4KSkpOworCisvLyBUT0RPKGIvMTU4MDY3NjkxKTogQWRkIGludmFsaWQgdGVzdCB2ZWN0b3JzIHdpdGggaW5jb21wbGV0ZSBQUFMgb3Igbm8gUFBTCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWV0YURhdGFVdGlsc1Rlc3RBbGwsIEF2Y0NTRFZhbGlkYXRlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygic3BzX3Bwc19vbmx5X3N0YXJ0Y29kZS5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BzX2luY29tcGxldGVfcHBzLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xNTgwNjc2OTEpICJzcHNfcHBzX2luY29tcGxldGUuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbmRvbWRhdGEuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE1ODA2NzY5MSkgInNwcy5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHBzLmgyNjQiKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChNZXRhRGF0YVV0aWxzVGVzdEFsbCwgQWFjQ1NEVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKEFBQ09iamVjdE1haW4sIDEsIDEpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChNZXRhRGF0YVV0aWxzVGVzdEFsbCwgQWFjQURUU1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgibG91ZHNvZnRhYWNhZHRzIiwgMSwgNDQxMDApKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChNZXRhRGF0YVV0aWxzVGVzdEFsbCwgQWFjQ1NEVmFsaWRhdGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCJsb3Vkc29mdGFhY2FkdHNfaW52YWxpZGhlYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvdWRzb2Z0YWFjYWR0c19pbnZhbGlkcHJvZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvdWRzb2Z0YWFjYWR0c19pbnZhbGlkY2hhbm5lbGNvbmZpZyIpKTsKKworLy8gVE9ETyhiLzE1Nzk3NDUwOCkgQWRkIHRlc3QgdmVjdG9yIGZvciB2b3JiaXMgdGh1bWJuYWlsIHRhZworLy8gSW5mbyBmaWxlIGNvbnRhaW5zIFRBRywgS2V5LCBWYWx1ZSBhbmQgc2l6ZSBvZiB0aGUgdm9yYmlzIGNvbW1lbnQKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgTWV0YURhdGFVdGlsc1Rlc3RBbGwsIFZvcmJpc1Rlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigidm9yYmlzY29tbWVudF9zaW50ZWwuZGF0IiwgInZvcmJpc2NvbW1lbnRfc2ludGVsLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ2b3JiaXNjb21tZW50X2FsYnVtLmRhdCIsICJ2b3JiaXNjb21tZW50X2FsYnVtLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ2b3JiaXNjb21tZW50X2xvb3AuZGF0IiwgInZvcmJpc2NvbW1lbnRfbG9vcC5pbmZvIikpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBNZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NDJiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTUVUQURBVEFfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19NRVRBREFUQV9VVElMU19URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBNZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50IDogcHVibGljOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBNZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19NRVRBREFUQV9VVElMU19URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODYyYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIE1ldGFEYXRhVXRpbHMgVGVzdAorVGhlIE1ldGFEYXRhVXRpbHMgVW5pdCBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgbGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyBsaWJyYXJ5IGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gTWV0YURhdGFVdGlsc1Rlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvTWV0YURhdGFVdGlsc1Rlc3QvTWV0YURhdGFVdGlsc1Rlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9NZXRhRGF0YVV0aWxzVGVzdC9NZXRhRGF0YVV0aWxzVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3RSZXMtMS4wLnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBNZXRhRGF0YVV0aWxzVGVzdFJlcy0xLjAgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBNZXRhRGF0YVV0aWxzVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWV0YURhdGFVdGlsc1Rlc3RSZXMtMS4wLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBNZXRhRGF0YVV0aWxzVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKaW5kZXggN2UxNjljYi4uYjVkNDUzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKQEAgLTI4LDEzICsyOCwxNSBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKLSAgICAgICAgImxpYmRhdGFzb3VyY2UiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlib2dnIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwKaW5kZXggZDgzMTU1NS4uY2M4OTBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0xOSwxMiArMTksMTMgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0id3JpdGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXIuemlwP3VuemlwPXRydWUiCi0gICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3RSZXMvIiAvPgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0UmVzLTEuMS56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJ3cml0ZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvd3JpdGVyVGVzdFJlcy8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9Xcml0ZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLUMgdHJ1ZSIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZAppbmRleCBhZTA3OTE3Li4wZTU0Y2E3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9SRUFETUUubWQKQEAgLTE5LDEzICsxOSwxOCBAQAogCiBhZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L3dyaXRlclRlc3Qvd3JpdGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCiAKLVRoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvd3JpdGVyVGVzdFJlcy56aXApLgorVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0UmVzLTEuMS56aXApLgogRG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIGZvbGRlci4gUHVzaCBhbGwgdGhlIGZpbGVzIGluIHRoaXMgZm9sZGVyIHRvIC9kYXRhL2xvY2FsL3RtcC8gb24gdGhlIGRldmljZS4KIGBgYAotYWRiIHB1c2ggd3JpdGVyVGVzdFJlcyAvZGF0YS9sb2NhbC90bXAvCithZGIgcHVzaCBXcml0ZXJUZXN0UmVzLTEuMS8uIC9kYXRhL2xvY2FsL3RtcC9Xcml0ZXJUZXN0UmVzLwogYGBgCiAKLXVzYWdlOiB3cml0ZXJUZXN0IC1QIFw8cGF0aF90b19yZXNfZm9sZGVyXD4KK3VzYWdlOiB3cml0ZXJUZXN0IC1QIFw8cGF0aF90b19yZXNfZm9sZGVyXD4gLUMgPHJlbW92ZV9vdXRwdXRfZmlsZT4KIGBgYAotYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC8KK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvd3JpdGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8gLUMgdHJ1ZQorYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCB3cml0ZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKIGBgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlckxpc3RlbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWYwYTdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlckxpc3RlbmVyLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV1JJVEVSX0xJU1RFTkVSX0hfCisjZGVmaW5lIFdSSVRFUl9MSVNURU5FUl9IXworCisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBXcml0ZXJMaXN0ZW5lciA6IHB1YmxpYyBCbk1lZGlhUmVjb3JkZXJDbGllbnQgeworICBwdWJsaWM6CisgICAgV3JpdGVyTGlzdGVuZXIoKSA6IG1TaWduYWxlZFNpemUoZmFsc2UpLCBtU2lnbmFsZWREdXJhdGlvbihmYWxzZSkge30KKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50MzJfdCBtc2csIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKSB7CisgICAgICAgIEFMT0dWKCJtc2cgOiAlZCwgZXh0MSA6ICVkLCBleHQyIDogJWQiLCBtc2csIGV4dDEsIGV4dDIpOworICAgICAgICBpZiAoZXh0MSA9PSBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVEKSB7CisgICAgICAgICAgICBtU2lnbmFsZWRTaXplID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChleHQxID09IE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0RVUkFUSU9OX1JFQUNIRUQpIHsKKyAgICAgICAgICAgIG1TaWduYWxlZER1cmF0aW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvbGF0aWxlIGJvb2wgbVNpZ25hbGVkU2l6ZTsKKyAgICB2b2xhdGlsZSBib29sIG1TaWduYWxlZER1cmF0aW9uOworfTsKKworI2VuZGlmICAvLyBXUklURVJfTElTVEVORVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcAppbmRleCBmZjA2M2UzLi5kMTcwZTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwCkBAIC0xOCw5ICsxOCwxMyBAQAogI2RlZmluZSBMT0dfVEFHICJXcml0ZXJUZXN0IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC0zOSwxOCArNDMsNDAgQEAKIAogI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvd3JpdGVyLm91dCIKIAorLy8gU3R0cyB2YWx1ZXMgd2l0aGluIDAuMW1zKDEwMHVzKSBkaWZmZXJlbmNlIGFyZSBmdWRnZWQgdG8gc2F2ZSB0b28KKy8vIG1hbnkgc3R0cyBlbnRyaWVzIGluIE1QRUc0V3JpdGVyLgorY29uc3RleHByIGludDMyX3Qga01wZWc0TXV4VG9sZXJhbmNlVGltZVVzID0gMTAwOworLy8gVG9sZXJhbmNlIHZhbHVlIGZvciBvdGhlciB3cml0ZXJzCitjb25zdGV4cHIgaW50MzJfdCBrTXV4VG9sZXJhbmNlVGltZVVzID0gMTsKKwogc3RhdGljIFdyaXRlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CiAKLXN0cnVjdCBjb25maWdGb3JtYXQgewotICAgIGNoYXIgbWltZVsxMjhdOwotICAgIGludDMyX3Qgd2lkdGg7Ci0gICAgaW50MzJfdCBoZWlnaHQ7Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgIGludDMyX3QgY2hhbm5lbENvdW50OworZW51bSBpbnB1dElkIHsKKyAgICAvLyBhdWRpbyBzdHJlYW1zCisgICAgQUFDXzEsCisgICAgQUFDX0FEVFNfMSwKKyAgICBBTVJfTkJfMSwKKyAgICBBTVJfV0JfMSwKKyAgICBGTEFDXzEsCisgICAgT1BVU18xLAorICAgIFZPUkJJU18xLAorICAgIC8vIHZpZGVvIHN0cmVhbXMKKyAgICBBVjFfMSwKKyAgICBBVkNfMSwKKyAgICBIMjYzXzEsCisgICAgSEVWQ18xLAorICAgIE1QRUc0XzEsCisgICAgVlA4XzEsCisgICAgVlA5XzEsCisgICAgLy8gaGVpZiBzdHJlYW0KKyAgICBIRUlDXzEsCisgICAgVU5VU0VEX0lELAorICAgIFVOS05PV05fSUQsCiB9OwogCiAvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCiBzdGF0aWMgY29uc3Qgc3RydWN0IElucHV0RGF0YSB7CisgICAgaW5wdXRJZCBpbnBJZDsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIHN0cmluZyBpbnB1dEZpbGU7CiAgICAgc3RyaW5nIGluZm87CkBAIC01OCw2NSArODQsNzMgQEAKICAgICBpbnQzMl90IHNlY29uZFBhcmFtOwogICAgIGJvb2wgaXNBdWRpbzsKIH0ga0lucHV0RGF0YVtdID0gewotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyIsCi0gICAgICAgICAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCi0gICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUywgIk1wc18yX2MyX2ZyMV9TYzFfRGMyXzB4MDNfcmF3LmFkdHMiLAorICAgICAgICB7QUFDXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgImF1ZGlvX2FhY19zdGVyZW9fOGticHNfMTEwMjVoei5hYWMiLAorICAgICAgICAgImF1ZGlvX2FhY19zdGVyZW9fOGticHNfMTEwMjVoei5pbmZvIiwgMTEwMjUsIDIsIHRydWV9LAorICAgICAgICB7QUFDX0FEVFNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMsICJNcHNfMl9jMl9mcjFfU2MxX0RjMl8weDAzX3Jhdy5hZHRzIiwKICAgICAgICAgICJNcHNfMl9jMl9mcjFfU2MxX0RjMl8weDAzX3Jhdy5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiIsCisgICAgICAgIHtBTVJfTkJfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiIsCiAgICAgICAgICAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIiwgODAwMCwgMSwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKKyAgICAgICAge0FNUl9XQl8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKICAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8iLCAxNjAwMCwgMSwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIiwKLSAgICAgICAgICJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLAorICAgICAgICB7RkxBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwKICAgICAgICAgICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19WUDksICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAotICAgICAgICAgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKLSAgICAgICAgICJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLAotICAgICAgICAgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwKLSAgICAgICAgICJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsICJiYmJfYXYxXzE3Nl8xNDQuYXYxIiwgImJiYl9hdjFfMTc2XzE0NC5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyIsCisgICAgICAgIHtPUFVTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLAorICAgICAgICAgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKKyAgICAgICAge1ZPUkJJU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJiYmJfdm9yYmlzXzFjaF82NGticHNfMTZrSHoudm9yYmlzIiwKKyAgICAgICAgICJiYmJfdm9yYmlzXzFjaF82NGticHNfMTZrSHouaW5mbyIsIDE2MDAwLCAxLCB0cnVlfSwKKworICAgICAgICB7QVYxXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwgImJiYl9hdjFfMTc2XzE0NC5hdjEiLCAiYmJiX2F2MV8xNzZfMTQ0LmluZm8iLCAxNzYsIDE0NCwKKyAgICAgICAgIGZhbHNlfSwKKyAgICAgICAge0FWQ18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJiYmJfYXZjXzM1MngyODhfNzY4a2Jwc18zMGZwcy5hdmMiLAorICAgICAgICAgImJiYl9hdmNfMzUyeDI4OF83NjhrYnBzXzMwZnBzLmluZm8iLCAzNTIsIDI4OCwgZmFsc2V9LAorICAgICAgICB7SDI2M18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMiLAogICAgICAgICAgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIiwgMzUyLCAyODgsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYiLAorICAgICAgICB7SEVWQ18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCAiYmJiX2hldmNfMzQweDI4MF83NjhrYnBzXzMwZnBzLmhldmMiLAorICAgICAgICAgImJiYl9oZXZjXzM0MHgyODBfNzY4a2Jwc18zMGZwcy5pbmZvIiwgMzQwLCAyODAsIGZhbHNlfSwKKyAgICAgICAge01QRUc0XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYiLAogICAgICAgICAgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyIsIDM1MiwgMjg4LCBmYWxzZX0sCisgICAgICAgIHtWUDhfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKKyAgICAgICAgICJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKKyAgICAgICAge1ZQOV8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAorICAgICAgICAgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAorCisgICAgICAgIHtIRUlDXzEsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwKKyAgICAgICAgICJiYmJfaGVpY18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCiB9OwogCi1jbGFzcyBXcml0ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgaW50MzJfdD4+IHsKK2NsYXNzIFdyaXRlclRlc3QgewogICBwdWJsaWM6Ci0gICAgV3JpdGVyVGVzdCgpIDogbVdyaXRlcihudWxscHRyKSwgbUZpbGVNZXRhKG51bGxwdHIpLCBtQ3VycmVudFRyYWNrKG51bGxwdHIpIHt9CisgICAgV3JpdGVyVGVzdCgpIDogbVdyaXRlcihudWxscHRyKSwgbUZpbGVNZXRhKG51bGxwdHIpIHt9CiAKICAgICB+V3JpdGVyVGVzdCgpIHsKLSAgICAgICAgaWYgKG1Xcml0ZXIpIHsKLSAgICAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Xcml0ZXIgPSBudWxscHRyOwotICAgICAgICB9CiAgICAgICAgIGlmIChtRmlsZU1ldGEpIHsKICAgICAgICAgICAgIG1GaWxlTWV0YS5jbGVhcigpOwogICAgICAgICAgICAgbUZpbGVNZXRhID0gbnVsbHB0cjsKICAgICAgICAgfQotICAgICAgICBpZiAobUN1cnJlbnRUcmFjaykgewotICAgICAgICAgICAgbUN1cnJlbnRUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRUcmFjayA9IG51bGxwdHI7CisgICAgICAgIGlmIChtV3JpdGVyKSB7CisgICAgICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgICAgICAgICBtV3JpdGVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ0Vudi0+Y2xlYW5VcCgpKSByZW1vdmUoT1VUUFVUX0ZJTEVfTkFNRSk7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IGtNYXhUcmFja0NvdW50OyBpZHgrKykgeworICAgICAgICAgICAgbUJ1ZmZlckluZm9baWR4XS5jbGVhcigpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50VHJhY2tbaWR4XSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XS0+c3RvcCgpOworICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XS5jbGVhcigpOworICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlucHV0U3RyZWFtW2lkeF0uaXNfb3BlbigpKSBtSW5wdXRTdHJlYW1baWR4XS5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgICAgICBtTnVtQ3NkcyA9IDA7Ci0gICAgICAgIG1JbnB1dEZyYW1lSWQgPSAwOworICAgIHZvaWQgc2V0dXBXcml0ZXJUeXBlKHN0cmluZyB3cml0ZXJGb3JtYXQpIHsKICAgICAgICAgbVdyaXRlck5hbWUgPSB1bmtub3duX2NvbXA7CiAgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOwotCiAgICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RhbmRhcmRXcml0ZXJzPiBtYXBXcml0ZXIgPSB7CiAgICAgICAgICAgICAgICAgeyJvZ2ciLCBPR0d9LCAgICAgeyJhYWMiLCBBQUN9LCAgICAgIHsiYWFjX2FkdHMiLCBBQUNfQURUU30sIHsid2VibSIsIFdFQk19LAogICAgICAgICAgICAgICAgIHsibXBlZzQiLCBNUEVHNH0sIHsiYW1ybmIiLCBBTVJfTkJ9LCB7ImFtcndiIiwgQU1SX1dCfSwgICAgICB7Im1wZWcyVHMiLCBNUEVHMlRTfX07CiAgICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAgICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OwogICAgICAgICBpZiAobWFwV3JpdGVyLmZpbmQod3JpdGVyRm9ybWF0KSAhPSBtYXBXcml0ZXIuZW5kKCkpIHsKICAgICAgICAgICAgIG1Xcml0ZXJOYW1lID0gbWFwV3JpdGVyLmF0KHdyaXRlckZvcm1hdCk7CiAgICAgICAgIH0KQEAgLTEyNiwxNiArMTYwLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgICAgIG1CdWZmZXJJbmZvLmNsZWFyKCk7Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0uaXNfb3BlbigpKSBtSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGdldElucHV0QnVmZmVySW5mbyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgc3RyaW5nIGlucHV0SW5mbyk7CisgICAgdm9pZCBnZXRJbnB1dEJ1ZmZlckluZm8oc3RyaW5nIGlucHV0RmlsZU5hbWUsIHN0cmluZyBpbnB1dEluZm8sIGludDMyX3QgaWR4ID0gMCk7CiAKICAgICBpbnQzMl90IGNyZWF0ZVdyaXRlcihpbnQzMl90IGZkKTsKIAotICAgIGludDMyX3QgYWRkV3JpdGVyU291cmNlKGJvb2wgaXNBdWRpbywgY29uZmlnRm9ybWF0IHBhcmFtcyk7CisgICAgaW50MzJfdCBhZGRXcml0ZXJTb3VyY2UoYm9vbCBpc0F1ZGlvLCBjb25maWdGb3JtYXQgcGFyYW1zLCBpbnQzMl90IGlkeCA9IDApOworCisgICAgdm9pZCBzZXR1cEV4dHJhY3RvcihBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3Rvciwgc3RyaW5nIGlucHV0RmlsZU5hbWUsIGludDMyX3QgJnRyYWNrQ291bnQpOworCisgICAgdm9pZCBleHRyYWN0KEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25maWdGb3JtYXQgJnBhcmFtcywgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLAorICAgICAgICAgICAgICAgICB1aW50OF90ICpidWZmZXIsIHNpemVfdCBidWZTaXplLCBzaXplX3QgKmJ5dGVzRXh0cmFjdGVkLCBpbnQzMl90IGlkeCk7CisKKyAgICB2b2lkIGNvbXBhcmVQYXJhbXMoY29uZmlnRm9ybWF0IHNyY1BhcmFtLCBjb25maWdGb3JtYXQgZHN0UGFyYW0sIHZlY3RvcjxCdWZmZXJJbmZvPiBkc3RCdWZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4KTsKIAogICAgIGVudW0gc3RhbmRhcmRXcml0ZXJzIHsKICAgICAgICAgT0dHLApAQCAtMTUyLDMyICsxODksNDIgQEAKICAgICBzdGFuZGFyZFdyaXRlcnMgbVdyaXRlck5hbWU7CiAgICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXI7CiAgICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YTsKLSAgICBzcDxNZWRpYUFkYXB0ZXI+IG1DdXJyZW50VHJhY2s7CisgICAgc3A8TWVkaWFBZGFwdGVyPiBtQ3VycmVudFRyYWNrW2tNYXhUcmFja0NvdW50XXt9OwogCiAgICAgYm9vbCBtRGlzYWJsZVRlc3Q7Ci0gICAgaW50MzJfdCBtTnVtQ3NkczsKLSAgICBpbnQzMl90IG1JbnB1dEZyYW1lSWQ7Ci0gICAgaWZzdHJlYW0gbUlucHV0U3RyZWFtOwotICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVySW5mbzsKKyAgICBpbnQzMl90IG1OdW1Dc2RzW2tNYXhUcmFja0NvdW50XXt9OworICAgIGludDMyX3QgbUlucHV0RnJhbWVJZFtrTWF4VHJhY2tDb3VudF17fTsKKyAgICBpZnN0cmVhbSBtSW5wdXRTdHJlYW1ba01heFRyYWNrQ291bnRde307CisgICAgdmVjdG9yPEJ1ZmZlckluZm8+IG1CdWZmZXJJbmZvW2tNYXhUcmFja0NvdW50XTsKIH07CiAKLXZvaWQgV3JpdGVyVGVzdDo6Z2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvKSB7CitjbGFzcyBXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0CisgICAgOiBwdWJsaWMgV3JpdGVyVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8c3RyaW5nIC8qIHdyaXRlckZvcm1hdCovLCBpbnB1dElkIC8qIGlucHV0SWQwKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SWQgLyogaW5wdXRJZDEqLywgZmxvYXQgLyogQnVmZmVySW50ZXJ2YWwqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBXcml0ZXJUeXBlKGdldDwwPihHZXRQYXJhbSgpKSk7IH0KK307CisKK3ZvaWQgV3JpdGVyVGVzdDo6Z2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvLCBpbnQzMl90IGlkeCkgewogICAgIHN0ZDo6aWZzdHJlYW0gZWxlSW5mbzsKICAgICBlbGVJbmZvLm9wZW4oaW5wdXRJbmZvLmNfc3RyKCkpOwogICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CiAgICAgaW50MzJfdCBieXRlc0NvdW50ID0gMDsKICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIGludDMyX3QgbnVtQ3NkcyA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CiAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CiAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOwotICAgICAgICBtQnVmZmVySW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKLSAgICAgICAgaWYgKGZsYWdzID09IENPREVDX0NPTkZJR19GTEFHKSBtTnVtQ3NkcysrOworICAgICAgICBtQnVmZmVySW5mb1tpZHhdLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICBpZiAoZmxhZ3MgPT0gQ09ERUNfQ09ORklHX0ZMQUcpIG51bUNzZHMrKzsKICAgICB9CiAgICAgZWxlSW5mby5jbG9zZSgpOwotICAgIG1JbnB1dFN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUuY19zdHIoKSwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKLSAgICBBU1NFUlRfRVEobUlucHV0U3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgbU51bUNzZHNbaWR4XSA9IG51bUNzZHM7CisgICAgbUlucHV0U3RyZWFtW2lkeF0ub3BlbihpbnB1dEZpbGVOYW1lLmNfc3RyKCksIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1JbnB1dFN0cmVhbVtpZHhdLmlzX29wZW4oKSwgdHJ1ZSk7CiB9CiAKIGludDMyX3QgV3JpdGVyVGVzdDo6Y3JlYXRlV3JpdGVyKGludDMyX3QgZmQpIHsKQEAgLTIyMywxMCArMjcwLDEwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludDMyX3QgV3JpdGVyVGVzdDo6YWRkV3JpdGVyU291cmNlKGJvb2wgaXNBdWRpbywgY29uZmlnRm9ybWF0IHBhcmFtcykgewotICAgIGlmIChtSW5wdXRGcmFtZUlkKSByZXR1cm4gLTE7CitpbnQzMl90IFdyaXRlclRlc3Q6OmFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMsIGludDMyX3QgaWR4KSB7CisgICAgaWYgKG1JbnB1dEZyYW1lSWRbaWR4XSkgcmV0dXJuIC0xOwogICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgaWYgKG1JbnB1dFN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICBpZiAobUlucHV0U3RyZWFtW2lkeF0uaXNfb3BlbigpKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgcGFyYW1zLm1pbWUpOwogICAgICAgICBpZiAoaXNBdWRpbykgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5jaGFubmVsQ291bnQpOwpAQCAtMjM1LDI1ICsyODIsMzQgQEAKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgcGFyYW1zLndpZHRoKTsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHBhcmFtcy5oZWlnaHQpOwogICAgICAgICB9Ci0KLSAgICAgICAgaW50MzJfdCBzdGF0dXMgPQotICAgICAgICAgICAgICAgIHdyaXRlSGVhZGVyQnVmZmVycyhtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBmb3JtYXQsIG1OdW1Dc2RzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChtTnVtQ3Nkc1tpZHhdKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YXR1cyA9IHdyaXRlSGVhZGVyQnVmZmVycyhtSW5wdXRTdHJlYW1baWR4XSwgbUJ1ZmZlckluZm9baWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWRbaWR4XSwgZm9ybWF0LCBtTnVtQ3Nkc1tpZHhdKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgfQorCiAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoZm9ybWF0LCB0cmFja01ldGEpOwotICAgIG1DdXJyZW50VHJhY2sgPSBuZXcgTWVkaWFBZGFwdGVyKHRyYWNrTWV0YSk7Ci0gICAgaWYgKG1DdXJyZW50VHJhY2sgPT0gbnVsbHB0cikgeworICAgIG1DdXJyZW50VHJhY2tbaWR4XSA9IG5ldyBNZWRpYUFkYXB0ZXIodHJhY2tNZXRhKTsKKyAgICBpZiAobUN1cnJlbnRUcmFja1tpZHhdID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIk1lZGlhQWRhcHRlciByZXR1cm5lZCBudWxscHRyIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVdyaXRlci0+YWRkU291cmNlKG1DdXJyZW50VHJhY2spOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1Xcml0ZXItPmFkZFNvdXJjZShtQ3VycmVudFRyYWNrW2lkeF0pOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQgZ2V0RmlsZURldGFpbHMoc3RyaW5nICZpbnB1dEZpbGVQYXRoLCBzdHJpbmcgJmluZm8sIGNvbmZpZ0Zvcm1hdCAmcGFyYW1zLCBib29sICZpc0F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUluZGV4ID0gMCkgewotICAgIGlmIChzdHJlYW1JbmRleCA+PSBzaXplb2Yoa0lucHV0RGF0YSkgLyBzaXplb2Yoa0lucHV0RGF0YVswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJZCBpbnBJZCkgeworICAgIGludDMyX3QgaW5wdXREYXRhU2l6ZSA9IHNpemVvZihrSW5wdXREYXRhKSAvIHNpemVvZihrSW5wdXREYXRhWzBdKTsKKyAgICBpbnQzMl90IHN0cmVhbUluZGV4ID0gMDsKKyAgICBmb3IgKDsgc3RyZWFtSW5kZXggPCBpbnB1dERhdGFTaXplOyBzdHJlYW1JbmRleCsrKSB7CisgICAgICAgIGlmIChpbnBJZCA9PSBrSW5wdXREYXRhW3N0cmVhbUluZGV4XS5pbnBJZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cmVhbUluZGV4ID09IGlucHV0RGF0YVNpemUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpbnB1dEZpbGVQYXRoICs9IGtJbnB1dERhdGFbc3RyZWFtSW5kZXhdLmlucHV0RmlsZTsKQEAgLTI3MCw3ICszMjYsMTQ3IEBACiAgICAgcmV0dXJuOwogfQogCi1URVNUX1AoV3JpdGVyVGVzdCwgQ3JlYXRlV3JpdGVyVGVzdCkgewordm9pZCBXcml0ZXJUZXN0OjpzZXR1cEV4dHJhY3RvcihBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3Rvciwgc3RyaW5nIGlucHV0RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJnRyYWNrQ291bnQpIHsKKyAgICBBTE9HVigiSW5wdXQgZmlsZSBmb3IgZXh0cmFjdG9yOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisKKyAgICBpbnQzMl90IGZkID0gb3BlbihpbnB1dEZpbGVOYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiB3cml0ZXIncyBvdXRwdXQgZmlsZSB0byB2YWxpZGF0ZSI7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50MzJfdCBzdGF0dXMgPSBmc3RhdChmZCwgJmJ1Zik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlIGZvciBleHRyYWN0b3IiOworCisgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgQUxPR1YoIlNpemUgb2YgaW5wdXQgZmlsZSB0byBleHRyYWN0b3I6ICV6dSIsIGZpbGVTaXplKTsKKworICAgIHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoZXh0cmFjdG9yLCBmZCwgMCwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UgZm9yIGV4dHJhY3RvciI7CisKKyAgICB0cmFja0NvdW50ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoZXh0cmFjdG9yKTsKKyAgICBBU1NFUlRfR1QodHJhY2tDb3VudCwgMCkgPDwgIk5vIHRyYWNrcyByZXBvcnRlZCBieSBleHRyYWN0b3IiOworICAgIEFMT0dWKCJOdW1iZXIgb2YgdHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciA6ICVkIiwgdHJhY2tDb3VudCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIFdyaXRlclRlc3Q6OmV4dHJhY3QoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbmZpZ0Zvcm1hdCAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywgdWludDhfdCAqYnVmZmVyLCBzaXplX3QgYnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzRXh0cmFjdGVkLCBpbnQzMl90IGlkeCkgeworICAgIEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhleHRyYWN0b3IsIGlkeCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQoZXh0cmFjdG9yLCBpZHgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJUcmFjayBmb3JtYXQgaXMgTlVMTCI7CisgICAgQUxPR0koIlRyYWNrIGZvcm1hdCA9ICVzIiwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKGZvcm1hdCkpOworCisgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgIEFTU0VSVF9ORShtaW1lLCBudWxscHRyKSA8PCAiVHJhY2sgbWltZSBpcyBOVUxMIjsKKyAgICBBTE9HSSgiVHJhY2sgbWltZSA9ICVzIiwgbWltZSk7CisgICAgc3RybGNweShwYXJhbXMubWltZSwgbWltZSwga01pbWVTaXplKTsKKworICAgIGlmICghc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmcGFyYW1zLmNoYW5uZWxDb3VudCkpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBkaWQgbm90IHJlcG9ydCBjaGFubmVsIGNvdW50IjsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnBhcmFtcy5zYW1wbGVSYXRlKSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGRpZCBub3QgcmVwb3J0IHNhbXBsZSByYXRlIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSB8fCAhc3RybmNtcChtaW1lLCAiaW1hZ2UvIiwgNikpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJnBhcmFtcy53aWR0aCkpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBkaWQgbm90IHJlcG9ydCB3aWR0aCI7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmcGFyYW1zLmhlaWdodCkpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBkaWQgbm90IHJlcG9ydCBoZWlnaHQiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiSW52YWxpZCBtaW1lICIgPDwgbWltZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGJ1ZmZlck9mZnNldCA9IDA7CisgICAgLy8gR2V0IENTRCBkYXRhCisgICAgaW50IGluZGV4ID0gMDsKKyAgICB2b2lkICpjc2RCdWY7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgY3NkQnVmID0gbnVsbHB0cjsKKyAgICAgICAgY2hhciBjc2ROYW1lWzE2XTsKKyAgICAgICAgc25wcmludGYoY3NkTmFtZSwgMTYsICJjc2QtJWQiLCBpbmRleCk7CisgICAgICAgIHNpemVfdCBjc2RTaXplID0gMDsKKyAgICAgICAgYm9vbCBjc2RGb3VuZCA9IEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBjc2ROYW1lLCAmY3NkQnVmLCAmY3NkU2l6ZSk7CisgICAgICAgIGlmICghY3NkRm91bmQgfHwgIWNzZEJ1ZiB8fCAhY3NkU2l6ZSkgYnJlYWs7CisKKyAgICAgICAgYnVmZmVySW5mby5wdXNoX2JhY2soe3N0YXRpY19jYXN0PGludDMyX3Q+KGNzZFNpemUpLCBDT0RFQ19DT05GSUdfRkxBRywgMH0pOworICAgICAgICBtZW1jcHkoYnVmZmVyICsgYnVmZmVyT2Zmc2V0LCBjc2RCdWYsIGNzZFNpemUpOworICAgICAgICBidWZmZXJPZmZzZXQgKz0gY3NkU2l6ZTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisKKyAgICAvLyBHZXQgZnJhbWUgZGF0YQorICAgIHdoaWxlICgxKSB7CisgICAgICAgIHNzaXplX3Qgc2FtcGxlU2l6ZSA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplKGV4dHJhY3Rvcik7CisgICAgICAgIGlmIChzYW1wbGVTaXplIDwgMCkgYnJlYWs7CisKKyAgICAgICAgdWludDhfdCAqc2FtcGxlQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2Moc2FtcGxlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShzYW1wbGVCdWZmZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplICIgPDwgc2FtcGxlU2l6ZTsKKworICAgICAgICBpbnQgYnl0ZXNSZWFkID0gQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKGV4dHJhY3Rvciwgc2FtcGxlQnVmZmVyLCBzYW1wbGVTaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGJ5dGVzUmVhZCwgc2FtcGxlU2l6ZSkKKyAgICAgICAgICAgICAgICA8PCAiTnVtYmVyIG9mIGJ5dGVzIGV4dHJhY3RlZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHNhbXBsZSBzaXplIjsKKyAgICAgICAgaW50NjRfdCBwdHMgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShleHRyYWN0b3IpOworICAgICAgICB1aW50MzJfdCBmbGFnID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKGV4dHJhY3Rvcik7CisKKyAgICAgICAgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSB7CisgICAgICAgICAgICAvLyBSZW1vdmluZyA0IGJ5dGVzIG9mIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyBmcm9tIHNhbXBsZSBzaXplCisgICAgICAgICAgICBieXRlc1JlYWQgPSBieXRlc1JlYWQgLSA0OworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX0xFKGJ1ZmZlck9mZnNldCArIGJ5dGVzUmVhZCwgYnVmU2l6ZSkKKyAgICAgICAgICAgICAgICA8PCAiU2l6ZSBvZiB0aGUgYnVmZmVyIGlzIGluc3VmZmljaWVudCB0byBzdG9yZSB0aGUgZXh0cmFjdGVkIGRhdGEiOworICAgICAgICBidWZmZXJJbmZvLnB1c2hfYmFjayh7Ynl0ZXNSZWFkLCBmbGFnLCBwdHN9KTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlck9mZnNldCwgc2FtcGxlQnVmZmVyLCBieXRlc1JlYWQpOworICAgICAgICBidWZmZXJPZmZzZXQgKz0gYnl0ZXNSZWFkOworCisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKGV4dHJhY3Rvcik7CisgICAgICAgIGZyZWUoc2FtcGxlQnVmZmVyKTsKKyAgICB9CisgICAgKmJ5dGVzRXh0cmFjdGVkID0gYnVmZmVyT2Zmc2V0OworICAgIHJldHVybjsKK30KKwordm9pZCBXcml0ZXJUZXN0Ojpjb21wYXJlUGFyYW1zKGNvbmZpZ0Zvcm1hdCBzcmNQYXJhbSwgY29uZmlnRm9ybWF0IGRzdFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBkc3RCdWZJbmZvLCBpbnQzMl90IGluZGV4KSB7CisgICAgQVNTRVJUX1NUUkVRKHNyY1BhcmFtLm1pbWUsIGRzdFBhcmFtLm1pbWUpCisgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIG1pbWUgdHlwZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IG1pbWUgdHlwZSI7CisKKyAgICBpZiAoIXN0cm5jbXAoc3JjUGFyYW0ubWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIEFTU0VSVF9FUShzcmNQYXJhbS5jaGFubmVsQ291bnQsIGRzdFBhcmFtLmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIGNoYW5uZWwgY291bnQgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBjaGFubmVsIGNvdW50IjsKKyAgICAgICAgQVNTRVJUX0VRKHNyY1BhcmFtLnNhbXBsZVJhdGUsIGRzdFBhcmFtLnNhbXBsZVJhdGUpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBzYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IHNhbXBsZSByYXRlIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHNyY1BhcmFtLm1pbWUsICJ2aWRlby8iLCA2KSB8fCAhc3RybmNtcChzcmNQYXJhbS5taW1lLCAiaW1hZ2UvIiwgNikpIHsKKyAgICAgICAgQVNTRVJUX0VRKHNyY1BhcmFtLndpZHRoLCBkc3RQYXJhbS53aWR0aCkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIHdpZHRoIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgd2lkdGgiOworICAgICAgICBBU1NFUlRfRVEoc3JjUGFyYW0uaGVpZ2h0LCBkc3RQYXJhbS5oZWlnaHQpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBoZWlnaHQgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBoZWlnaHQiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiSW52YWxpZCBtaW1lIHR5cGUiIDw8IHNyY1BhcmFtLm1pbWU7CisgICAgfQorCisgICAgaW50MzJfdCB0b2xlcmFuY2VWYWx1ZVVzID0ga011eFRvbGVyYW5jZVRpbWVVczsKKyAgICBpZiAobVdyaXRlck5hbWUgPT0gTVBFRzQpIHsKKyAgICAgICAgdG9sZXJhbmNlVmFsdWVVcyA9IGtNcGVnNE11eFRvbGVyYW5jZVRpbWVVczsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZHN0QnVmSW5mby5zaXplKCk7IGkrKykgeworICAgICAgICBBU1NFUlRfRVEobUJ1ZmZlckluZm9baW5kZXhdW2ldLnNpemUsIGRzdEJ1ZkluZm9baV0uc2l6ZSkKKyAgICAgICAgICAgICAgICA8PCAiSW5wdXQgc2l6ZSAiIDw8IG1CdWZmZXJJbmZvW2luZGV4XVtpXS5zaXplIDw8ICIgbWlzbWF0Y2hlZCB3aXRoIGV4dHJhY3RlZCBzaXplICIKKyAgICAgICAgICAgICAgICA8PCBkc3RCdWZJbmZvW2ldLnNpemU7CisgICAgICAgIEFTU0VSVF9FUShtQnVmZmVySW5mb1tpbmRleF1baV0uZmxhZ3MsIGRzdEJ1ZkluZm9baV0uZmxhZ3MpCisgICAgICAgICAgICAgICAgPDwgIklucHV0IGZsYWcgIiA8PCBtQnVmZmVySW5mb1tpbmRleF1baV0uZmxhZ3MKKyAgICAgICAgICAgICAgICA8PCAiIG1pc21hdGNoZWQgd2l0aCBleHRyYWN0ZWQgc2l6ZSAiIDw8IGRzdEJ1ZkluZm9baV0uZmxhZ3M7CisgICAgICAgIEFTU0VSVF9MRShhYnMobUJ1ZmZlckluZm9baW5kZXhdW2ldLnRpbWVVcyAtIGRzdEJ1ZkluZm9baV0udGltZVVzKSwgdG9sZXJhbmNlVmFsdWVVcykKKyAgICAgICAgICAgICAgICA8PCAiRGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWdpbmFsIHRpbWVzdGFtcCAiIDw8IG1CdWZmZXJJbmZvW2luZGV4XVtpXS50aW1lVXMKKyAgICAgICAgICAgICAgICA8PCAiIGFuZCBleHRyYWN0ZWQgdGltZXN0YW1wICIgPDwgZHN0QnVmSW5mb1tpXS50aW1lVXMKKyAgICAgICAgICAgICAgICA8PCAiaXMgZ3JlYXRlciB0aGFuIHRvbGVyYW5jZSB2YWx1ZSA9ICIgPDwgdG9sZXJhbmNlVmFsdWVVcyA8PCAiIG1pY3JvIHNlY29uZHMiOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBDcmVhdGVXcml0ZXJUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogICAgIEFMT0dWKCJUZXN0cyB0aGUgY3JlYXRpb24gb2Ygd3JpdGVycyIpOwogCkBAIC0yODEsMTQgKzQ3NywxNCBAQAogCiAgICAgLy8gQ3JlYXRpbmcgd3JpdGVyIHdpdGhpbiBhIHRlc3Qgc2NvcGUuIERlc3RydWN0b3Igc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSB0ZXN0IGVuZHMKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBjcmVhdGVXcml0ZXIoZmQpKQotICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgR2V0UGFyYW0oKS5maXJzdDsKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IGdldDwwPihHZXRQYXJhbSgpKTsKIH0KIAotVEVTVF9QKFdyaXRlclRlc3QsIFdyaXRlclRlc3QpIHsKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBXcml0ZXJUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogICAgIEFMT0dWKCJDaGVja3MgaWYgZm9yIGEgZ2l2ZW4gaW5wdXQsIGEgdmFsaWQgbXV4ZWQgZmlsZSBoYXMgYmVlbiBjcmVhdGVkIG9yIG5vdCIpOwogCi0gICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKICAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IE9VVFBVVF9GSUxFX05BTUU7CiAgICAgaW50MzJfdCBmZCA9CiAgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwpAQCAtMjk3LDM1ICs0OTMsMTEwIEBACiAgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OwogCi0gICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOwotICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKLSAgICBjb25maWdGb3JtYXQgcGFyYW07Ci0gICAgYm9vbCBpc0F1ZGlvOwotICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gR2V0UGFyYW0oKS5zZWNvbmQ7Ci0gICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOwotICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisgICAgaW5wdXRJZCBpbnBJZFtdID0ge2dldDwxPihHZXRQYXJhbSgpKSwgZ2V0PDI+KEdldFBhcmFtKCkpfTsKKyAgICBBU1NFUlRfTkUoaW5wSWRbMF0sIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOwogCi0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7Ci0gICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKLSAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIldyaXRlciI7CisgICAgaW50MzJfdCBudW1UcmFja3MgPSAxOworICAgIGlmIChpbnBJZFsxXSAhPSBVTlVTRURfSUQpIHsKKyAgICAgICAgbnVtVHJhY2tzKys7CisgICAgfQorCisgICAgc2l6ZV90IGZpbGVTaXplW251bVRyYWNrc107CisgICAgY29uZmlnRm9ybWF0IHBhcmFtW251bVRyYWNrc107CisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgICAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgICAgIGJvb2wgaXNBdWRpbzsKKyAgICAgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtW2lkeF0sIGlzQXVkaW8sIGlucElkW2lkeF0pOworICAgICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgc3RhdHVzID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZToiIDw8IGlucHV0RmlsZTsKKyAgICAgICAgZmlsZVNpemVbaWR4XSA9IGJ1Zi5zdF9zaXplOworCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbywgaWR4KSk7CisgICAgICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbVtpZHhdLCBpZHgpOworICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIldyaXRlciI7CisgICAgfQogCiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpOwotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJJbmZvLnNpemUoKSk7Ci0gICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKLSAgICBtQ3VycmVudFRyYWNrLT5zdG9wKCk7CisgICAgZmxvYXQgaW50ZXJ2YWwgPSBnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX0xFKGludGVydmFsLCAxLjBmKSA8PCAiQnVmZmVyIGludGVydmFsIGludmFsaWQuIFNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMS4wIjsKIAorICAgIHNpemVfdCByYW5nZSA9IDA7CisgICAgaW50MzJfdCBsb29wQ291bnQgPSAwOworICAgIGludDMyX3Qgb2Zmc2V0W2tNYXhUcmFja0NvdW50XXt9OworICAgIHdoaWxlIChsb29wQ291bnQgPCBjZWlsKDEuMCAvIGludGVydmFsKSkgeworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICAgICAgcmFuZ2UgPSBtQnVmZmVySW5mb1tpZHhdLnNpemUoKSAqIGludGVydmFsOworICAgICAgICAgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1baWR4XSwgbUJ1ZmZlckluZm9baWR4XSwgbUlucHV0RnJhbWVJZFtpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0sIG9mZnNldFtpZHhdLCByYW5nZSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworICAgICAgICAgICAgb2Zmc2V0W2lkeF0gKz0gcmFuZ2U7CisgICAgICAgIH0KKyAgICAgICAgbG9vcENvdW50Kys7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBrTWF4VHJhY2tDb3VudDsgaWR4KyspIHsKKyAgICAgICAgaWYgKG1DdXJyZW50VHJhY2tbaWR4XSkgeworICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB3cml0ZXIiOwogICAgIGNsb3NlKGZkKTsKKworICAgIC8vIFZhbGlkYXRlIHRoZSBvdXRwdXQgbXV4ZWQgZmlsZSBjcmVhdGVkIGJ5IHdyaXRlcgorICAgIC8vIFRPRE8oYi8xNDY0MjMwMjIpOiBTa2lwIHZhbGlkYXRpbmcgb3V0cHV0IGZvciB3ZWJtIHdyaXRlcgorICAgIC8vIFRPRE8oYi8xNDY0MjEwMTgpOiBTa2lwIHZhbGlkYXRpbmcgb3V0cHV0IGZvciBvZ2cgd3JpdGVyCisgICAgaWYgKG1Xcml0ZXJOYW1lICE9IE9HRyAmJiBtV3JpdGVyTmFtZSAhPSBXRUJNKSB7CisgICAgICAgIGNvbmZpZ0Zvcm1hdCBleHRyYWN0b3JQYXJhbXNbbnVtVHJhY2tzXTsKKyAgICAgICAgdmVjdG9yPEJ1ZmZlckluZm8+IGV4dHJhY3RvckJ1ZmZlckluZm9bbnVtVHJhY2tzXTsKKyAgICAgICAgaW50MzJfdCB0cmFja0NvdW50ID0gLTE7CisKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShleHRyYWN0b3IsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGV4dHJhY3RvciI7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldHVwRXh0cmFjdG9yKGV4dHJhY3Rvciwgb3V0cHV0RmlsZSwgdHJhY2tDb3VudCkpOworICAgICAgICBBU1NFUlRfRVEodHJhY2tDb3VudCwgbnVtVHJhY2tzKQorICAgICAgICAgICAgICAgIDw8ICJUcmFja3MgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgbnVtYmVyIG9mIHRyYWNrcyI7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgICAgIGNoYXIgKmlucHV0QnVmZmVyID0gKGNoYXIgKiltYWxsb2MoZmlsZVNpemVbaWR4XSk7CisgICAgICAgICAgICBBU1NFUlRfTkUoaW5wdXRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplICIgPDwgZmlsZVNpemVbaWR4XTsKKyAgICAgICAgICAgIG1JbnB1dFN0cmVhbVtpZHhdLnNlZWtnKDAsIG1JbnB1dFN0cmVhbVtpZHhdLmJlZyk7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW1baWR4XS5yZWFkKGlucHV0QnVmZmVyLCBmaWxlU2l6ZVtpZHhdKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShtSW5wdXRTdHJlYW1baWR4XS5nY291bnQoKSwgZmlsZVNpemVbaWR4XSk7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgKmV4dHJhY3RlZEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplW2lkeF0pOworICAgICAgICAgICAgQVNTRVJUX05FKGV4dHJhY3RlZEJ1ZmZlciwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIG9mIHNpemUgIiA8PCBmaWxlU2l6ZVtpZHhdOworICAgICAgICAgICAgc2l6ZV90IGJ5dGVzRXh0cmFjdGVkID0gMDsKKworICAgICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZXh0cmFjdChleHRyYWN0b3IsIGV4dHJhY3RvclBhcmFtc1tpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3JCdWZmZXJJbmZvW2lkeF0sIGV4dHJhY3RlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemVbaWR4XSwgJmJ5dGVzRXh0cmFjdGVkLCBpZHgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9HVChieXRlc0V4dHJhY3RlZCwgMCkgPDwgIlRvdGFsIGJ5dGVzIGV4dHJhY3RlZCBieSBleHRyYWN0b3IgY2Fubm90IGJlIHplcm8iOworCisgICAgICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgICAgICAgICAgY29tcGFyZVBhcmFtcyhwYXJhbVtpZHhdLCBleHRyYWN0b3JQYXJhbXNbaWR4XSwgZXh0cmFjdG9yQnVmZmVySW5mb1tpZHhdLCBpZHgpKTsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG1lbWNtcChleHRyYWN0ZWRCdWZmZXIsICh1aW50OF90ICopaW5wdXRCdWZmZXIsIGJ5dGVzRXh0cmFjdGVkKSwgMCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBiaXQgc3RyZWFtIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgYml0IHN0cmVhbSI7CisKKyAgICAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOworICAgICAgICAgICAgZnJlZShleHRyYWN0ZWRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUoZXh0cmFjdG9yKTsKKyAgICB9CiB9CiAKLVRFU1RfUChXcml0ZXJUZXN0LCBQYXVzZVdyaXRlclRlc3QpIHsKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBQYXVzZVdyaXRlclRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAgICAgQUxPR1YoIlZhbGlkYXRlcyB0aGUgcGF1c2UoKSBhcGkgb2Ygd3JpdGVycyIpOwogCi0gICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKICAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IE9VVFBVVF9GSUxFX05BTUU7CiAgICAgaW50MzJfdCBmZCA9CiAgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwpAQCAtMzM4LDggKzYwOSwxMCBAQAogICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKICAgICBjb25maWdGb3JtYXQgcGFyYW07CiAgICAgYm9vbCBpc0F1ZGlvOwotICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gR2V0UGFyYW0oKS5zZWNvbmQ7Ci0gICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOwogICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CiAKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKQEAgLTM0OCw4ICs2MjEsOCBAQAogCiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpOwotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJJbmZvLnNpemUoKSAvIDQpOworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIDAsIG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKICAgICBib29sIGlzUGF1c2VkID0gZmFsc2U7CkBAIC0zNTksMjYgKzYzMiwyNiBAQAogICAgICAgICBpc1BhdXNlZCA9IHRydWU7CiAgICAgfQogICAgIC8vIEluIHRoZSBwYXVzZSBzdGF0ZSwgd3JpdGVycyBzaG91bGRuJ3Qgd3JpdGUgYW55dGhpbmcuIFRlc3RpbmcgdGhlIHdyaXRlcnMgZm9yIHRoZSBzYW1lCi0gICAgaW50MzJfdCBudW1GcmFtZXNQYXVzZWQgPSBtQnVmZmVySW5mby5zaXplKCkgLyA0OwotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkLCBudW1GcmFtZXNQYXVzZWQsIGlzUGF1c2VkKTsKKyAgICBpbnQzMl90IG51bUZyYW1lc1BhdXNlZCA9IG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQ7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgbUlucHV0RnJhbWVJZFswXSwgbnVtRnJhbWVzUGF1c2VkLCBpc1BhdXNlZCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKIAogICAgIGlmIChpc1BhdXNlZCkgewogICAgICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOwogICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpOwogICAgIH0KLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbUJ1ZmZlckluZm8uc2l6ZSgpKTsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCBtSW5wdXRGcmFtZUlkWzBdLCBtQnVmZmVySW5mb1swXS5zaXplKCkpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7Ci0gICAgbUN1cnJlbnRUcmFjay0+c3RvcCgpOworICAgIG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKIAogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKICAgICBjbG9zZShmZCk7CiB9CiAKLVRFU1RfUChXcml0ZXJUZXN0LCBNdWx0aVN0YXJ0U3RvcFBhdXNlVGVzdCkgeworVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIE11bHRpU3RhcnRTdG9wUGF1c2VUZXN0KSB7CiAgICAgLy8gVE9ETzogKGIvMTQ0ODIxODA0KQogICAgIC8vIEVuYWJsZSB0aGUgdGVzdCBmb3IgTVBFMlRTIHdyaXRlcgogICAgIGlmIChtRGlzYWJsZVRlc3QgfHwgbVdyaXRlck5hbWUgPT0gc3RhbmRhcmRXcml0ZXJzOjpNUEVHMlRTKSByZXR1cm47CkBAIC0zODksNyArNjYyLDcgQEAKICAgICAgICAgICAgIG9wZW4ob3V0cHV0RmlsZS5jX3N0cigpLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CiAgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgdG8gZHVtcCB3cml0ZXIncyBkYXRhIjsKIAotICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOwogICAgIEFTU0VSVF9FUShzdGF0dXMsIChzdGF0dXNfdClPSykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OwogCkBAIC0zOTcsOCArNjcwLDEwIEBACiAgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOwogICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKICAgICBib29sIGlzQXVkaW87Ci0gICAgaW50MzJfdCBpbnB1dEZpbGVJZHggPSBHZXRQYXJhbSgpLnNlY29uZDsKLSAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucHV0RmlsZUlkeCk7CisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CiAgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKIAogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOwpAQCAtNDE1LDggKzY5MCw4IEBACiAgICAgICAgIG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgfQogCi0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNCk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgMCwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpIC8gNCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKIAogICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CkBAIC00MjUsMjAgKzcwMCwyMCBAQAogICAgIH0KIAogICAgIG1Xcml0ZXItPnBhdXNlKCk7Ci0gICAgaW50MzJfdCBudW1GcmFtZXNQYXVzZWQgPSBtQnVmZmVySW5mby5zaXplKCkgLyA0OwotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWQsIG51bUZyYW1lc1BhdXNlZCwgdHJ1ZSk7CisgICAgaW50MzJfdCBudW1GcmFtZXNQYXVzZWQgPSBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0OworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIG1JbnB1dEZyYW1lSWRbMF0sIG51bUZyYW1lc1BhdXNlZCwgdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKIAogICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CiAgICAgICAgIG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgfQogCi0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbUJ1ZmZlckluZm8uc2l6ZSgpKTsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCBtSW5wdXRGcmFtZUlkWzBdLCBtQnVmZmVySW5mb1swXS5zaXplKCkpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKLSAgICBtQ3VycmVudFRyYWNrLT5zdG9wKCk7CisgICAgbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOwogCiAgICAgLy8gZmlyc3Qgc3RvcCBzaG91bGQgc3VjY2VlZC4KICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CkBAIC00NTEsMTkgKzcyNiwzODAgQEAKICAgICBjbG9zZShmZCk7CiB9CiAKK2NsYXNzIFdyaXRlclZhbGlkaXR5VGVzdAorICAgIDogcHVibGljIFdyaXRlclRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTxzdHJpbmcgLyogd3JpdGVyRm9ybWF0Ki8sIGlucHV0SWQgLyogaW5wdXRJZDAqLywgYm9vbCAvKiBhZGRTb3VyY2VGYWlsKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwV3JpdGVyVHlwZShnZXQ8MD4oR2V0UGFyYW0oKSkpOyB9Cit9OworCitURVNUX1AoV3JpdGVyVmFsaWRpdHlUZXN0LCBJbnZhbGlkSW5wdXRUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJWYWxpZGF0ZXMgd3JpdGVyJ3MgYmVoYXZpb3IgZm9yIGludmFsaWQgaW5wdXRzIik7CisKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgYm9vbCBhZGRTb3VyY2VGYWlsRXhwZWN0ZWQgPSBnZXQ8Mj4oR2V0UGFyYW0oKSk7CisKKyAgICAvLyBUZXN0IHdyaXRlcnMgZm9yIGludmFsaWQgRkQgdmFsdWUKKyAgICBpbnQzMl90IGZkID0gLTE7CisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR1YoImNyZWF0ZVdyaXRlciBmYWlsZWQgZm9yIGludmFsaWQgRkQsIHRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHdyaXRlciB3YXMgY3JlYXRlZCBmb3IgaW52YWxpZCBmZCwgdGVzdCBpdCBmdXJ0aGVyLgorICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgIGJvb2wgaXNBdWRpbzsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CisgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOworICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBU1NFUlRfVFJVRShhZGRTb3VyY2VGYWlsRXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciI7CisgICAgICAgIEFMT0dWKCJhZGRXcml0ZXJTb3VyY2UgZmFpbGVkIGZvciBpbnZhbGlkIEZELCB0aGlzIGlzIGV4cGVjdGVkIGJlaGF2aW9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzdGFydCB0aGUgd3JpdGVyIHdpdGggdmFsaWQgYXJndW1lbnQgYnV0IGludmFsaWQgRkQKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9ORSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIldyaXRlciBkaWQgbm90IGZhaWwgZm9yIGludmFsaWQgRkQiOworCisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgMCwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKKyAgICBBU1NFUlRfTkUoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJXcml0ZXIgZGlkIG5vdCByZXBvcnQgZXJyb3IgZm9yIGludmFsaWQgRkQiOworCisgICAgc3RhdHVzID0gbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIiOworfQorCitURVNUX1AoV3JpdGVyVmFsaWRpdHlUZXN0LCBNYWxGb3JtZWREYXRhVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICAvLyBFbmFibGUgdGVzdCBmb3IgT2dnIHdyaXRlcgorICAgIEFTU0VSVF9ORShtV3JpdGVyTmFtZSwgT0dHKSA8PCAiVE9ETyhiLzE2MDEwNTY0NikiOworICAgIEFMT0dWKCJUZXN0IHdyaXRlciBmb3IgbWFsZm9ybWVkIGlucHV0cyIpOworCisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIGJvb2wgYWRkU291cmNlRmFpbEV4cGVjdGVkID0gZ2V0PDI+KEdldFBhcmFtKCkpOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihPVVRQVVRfRklMRV9OQU1FLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgdG8gZHVtcCB3cml0ZXIncyBkYXRhIjsKKworICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAoc3RhdHVzX3QpT0spCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgb3V0cHV0IGZvcm1hdCI7CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKKyAgICBib29sIGlzQXVkaW87CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICAvLyBSZW1vdmUgQ1NEIGRhdGEgZnJvbSBpbnB1dAorICAgIG1OdW1Dc2RzWzBdID0gMDsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoYWRkU291cmNlRmFpbEV4cGVjdGVkKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIiOworICAgICAgICBBTE9HVigiJXMgd3JpdGVyIGZhaWxlZCB0byBhZGRTb3VyY2UgYWZ0ZXIgcmVtb3ZpbmcgQ1NEIGZyb20gaW5wdXQiLCB3cml0ZXJGb3JtYXQuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkNvdWxkIG5vdCBzdGFydCAiIDw8IHdyaXRlckZvcm1hdCA8PCAid3JpdGVyIjsKKworICAgIC8vIFNraXAgZmlyc3QgZmV3IGZyYW1lcy4gVGhlc2UgbWF5IGNvbnRhaW4gc3luYyBmcmFtZXMgYWxzby4KKyAgICBpbnQzMl90IGZyYW1lSUQgPSBtSW5wdXRGcmFtZUlkWzBdICsgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpIC8gNDsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIGZyYW1lSUQsIG1DdXJyZW50VHJhY2tbMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVySW5mb1swXS5zaXplKCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5kdW1wKGZkLCBhcmdzKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZHVtcCBzdGF0aXN0aWNzIGZyb20gd3JpdGVyIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciI7CisgICAgY2xvc2UoZmQpOworfQorCisvLyBUaGlzIHRlc3QgaXMgc3BlY2lmaWMgdG8gTVBFRzRXcml0ZXIgdG8gdGVzdCBtb3JlIEFQSXMKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBNcGVnNFdyaXRlclRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgaWYgKG1Xcml0ZXJOYW1lICE9IHN0YW5kYXJkV3JpdGVyczo6TVBFRzQpIHJldHVybjsKKyAgICBBTE9HVigiVGVzdCBNUEVHNCB3cml0ZXIgc3BlY2lmaWMgQVBJcyIpOworCisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBpbnQzMl90IGZkID0KKyAgICAgICAgICAgIG9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgKHN0YXR1c190KU9LKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG1wZWc0IG91dHB1dCBmb3JtYXQiOworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CisgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgbXBlZzQgV3JpdGVyIjsKKworICAgIC8vIHNpZ25hbCBtZXRhIGRhdGEgZm9yIHRoZSB3cml0ZXIKKyAgICBzcDxNUEVHNFdyaXRlcj4gbXA0d3JpdGVyID0gc3RhdGljX2Nhc3Q8TVBFRzRXcml0ZXIgKj4obVdyaXRlci5nZXQoKSk7CisgICAgc3RhdHVzID0gbXA0d3JpdGVyLT5zZXRJbnRlcmxlYXZlRHVyYXRpb24oa0RlZmF1bHRJbnRlcmxlYXZlRHVyYXRpb24pOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgInNldEludGVybGVhdmVEdXJhdGlvbiBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbXA0d3JpdGVyLT5zZXRHZW9EYXRhKGtEZWZhdWx0TGF0aXR1ZGV4MTAwMDAsIGtEZWZhdWx0TG9uZ2l0dWRleDEwMDAwKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJzZXRHZW9EYXRhIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtcDR3cml0ZXItPnNldENhcHR1cmVSYXRlKGtEZWZhdWx0RlBTKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJzZXRDYXB0dXJlUmF0ZSBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJDb3VsZCBub3Qgc3RhcnQgdGhlIHdyaXRlciI7CisKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCAwLCBtQnVmZmVySW5mb1swXS5zaXplKCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIm1wZWc0IHdyaXRlciBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHdyaXRlciI7CisgICAgbXA0d3JpdGVyLmNsZWFyKCk7CisgICAgY2xvc2UoZmQpOworfQorCitjbGFzcyBMaXN0ZW5lclRlc3QKKyAgICA6IHB1YmxpYyBXcml0ZXJUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTwKKyAgICAgICAgICAgICAgc3RyaW5nIC8qIHdyaXRlckZvcm1hdCovLCBpbnB1dElkIC8qIGlucHV0SWQwKi8sIGlucHV0SWQgLyogaW5wdXRJZDEqLywKKyAgICAgICAgICAgICAgZmxvYXQgLyogRmlsZVNpemVMaW1pdCovLCBmbG9hdCAvKiBGaWxlRHVyYXRpb25MaW1pdCovLCBmbG9hdCAvKiBCdWZmZXJJbnRlcnZhbCovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cFdyaXRlclR5cGUoZ2V0PDA+KEdldFBhcmFtKCkpKTsgfQorfTsKKworVEVTVF9QKExpc3RlbmVyVGVzdCwgU2V0TWF4RmlsZUxpbWl0c1Rlc3QpIHsKKyAgICAvLyBUT0RPKGIvMTUxODkyNDE0KTogRW5hYmxlIHRlc3QgZm9yIG90aGVyIHdyaXRlcnMKKyAgICBpZiAobURpc2FibGVUZXN0IHx8IG1Xcml0ZXJOYW1lICE9IE1QRUc0KSByZXR1cm47CisgICAgQUxPR1YoIlZhbGlkYXRlcyB3cml0ZXIgd2hlbiBtYXggZmlsZSBsaW1pdHMgYXJlIHNldCIpOworCisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IE9VVFBVVF9GSUxFX05BTUU7CisgICAgaW50MzJfdCBmZCA9CisgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG91dHB1dCBmb3JtYXQ6IiA8PCB3cml0ZXJGb3JtYXQ7CisKKyAgICBpbnB1dElkIGlucElkW10gPSB7Z2V0PDE+KEdldFBhcmFtKCkpLCBnZXQ8Mj4oR2V0UGFyYW0oKSl9OworICAgIEFTU0VSVF9ORShpbnBJZFswXSwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBzaXplX3QgaW5wdXRGaWxlU2l6ZSA9IDA7CisgICAgaW50NjRfdCBsYXN0RnJhbWVUaW1lU3RhbXBVcyA9IElOVF9NQVg7CisgICAgaW50MzJfdCBudW1UcmFja3MgPSAxOworICAgIGlmIChpbnBJZFsxXSAhPSBVTlVTRURfSUQpIHsKKyAgICAgICAgbnVtVHJhY2tzKys7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICAgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgICAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgICAgIGJvb2wgaXNBdWRpbzsKKyAgICAgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZFtpZHhdKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8sIGlkeCkpOworICAgICAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0sIGlkeCk7CisgICAgICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiV3JpdGVyIjsKKworICAgICAgICAvLyBSZWFkIGZpbGUgcHJvcGVydGllcworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1cyA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoMCwgc3RhdHVzKTsKKworICAgICAgICBpbnB1dEZpbGVTaXplICs9IGJ1Zi5zdF9zaXplOworICAgICAgICBpZiAobGFzdEZyYW1lVGltZVN0YW1wVXMgPiBtQnVmZmVySW5mb1tpZHhdW21CdWZmZXJJbmZvW2lkeF0uc2l6ZSgpIC0gMV0udGltZVVzKSB7CisgICAgICAgICAgICBsYXN0RnJhbWVUaW1lU3RhbXBVcyA9IG1CdWZmZXJJbmZvW2lkeF1bbUJ1ZmZlckluZm9baWR4XS5zaXplKCkgLSAxXS50aW1lVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBmaWxlU2l6ZUxpbWl0ID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIGZsb2F0IGZpbGVEdXJhdGlvbkxpbWl0ID0gZ2V0PDQ+KEdldFBhcmFtKCkpOworICAgIGludDY0X3QgbWF4RmlsZVNpemUgPSAwOworICAgIGludDY0X3QgbWF4RmlsZUR1cmF0aW9uID0gMDsKKyAgICBpZiAoZmlsZVNpemVMaW1pdCA+IDApIHsKKyAgICAgICAgbWF4RmlsZVNpemUgPSAoaW50NjRfdCkoZmlsZVNpemVMaW1pdCAqIGlucHV0RmlsZVNpemUpOworICAgICAgICBtV3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtYXhGaWxlU2l6ZSk7CisgICAgfQorICAgIGlmIChmaWxlRHVyYXRpb25MaW1pdCA+IDApIHsKKyAgICAgICAgbWF4RmlsZUR1cmF0aW9uID0gKGludDY0X3QpKGZpbGVEdXJhdGlvbkxpbWl0ICogbGFzdEZyYW1lVGltZVN0YW1wVXMpOworICAgICAgICBtV3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obWF4RmlsZUR1cmF0aW9uKTsKKyAgICB9CisKKyAgICBzcDxXcml0ZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBuZXcgV3JpdGVyTGlzdGVuZXIoKTsKKyAgICBBU1NFUlRfTkUobGlzdGVuZXIsIG51bGxwdHIpIDw8ICJ1bmFibGUgdG8gYWxsb2NhdGUgbGlzdGVuZXIiOworCisgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKKworICAgIGZsb2F0IGludGVydmFsID0gZ2V0PDU+KEdldFBhcmFtKCkpOworICAgIEFTU0VSVF9MRShpbnRlcnZhbCwgMS4wZikgPDwgIkJ1ZmZlciBpbnRlcnZhbCBpbnZhbGlkLiBTaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEuMCI7CisKKyAgICBzaXplX3QgcmFuZ2UgPSAwOworICAgIGludDMyX3QgbG9vcENvdW50ID0gMDsKKyAgICBpbnQzMl90IG9mZnNldFtrTWF4VHJhY2tDb3VudF17fTsKKyAgICB3aGlsZSAobG9vcENvdW50IDwgY2VpbCgxLjAgLyBpbnRlcnZhbCkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgICAgIHJhbmdlID0gbUJ1ZmZlckluZm9baWR4XS5zaXplKCkgKiBpbnRlcnZhbDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtW2lkeF0sIG1CdWZmZXJJbmZvW2lkeF0sIG1JbnB1dEZyYW1lSWRbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLCBvZmZzZXRbaWR4XSwgcmFuZ2UsIGZhbHNlLCBsaXN0ZW5lcik7CisgICAgICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworICAgICAgICAgICAgb2Zmc2V0W2lkeF0gKz0gcmFuZ2U7CisgICAgICAgIH0KKyAgICAgICAgbG9vcENvdW50Kys7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUobVdyaXRlci0+cmVhY2hlZEVPUygpKSA8PCAiRU9TIG5vdCBzaWduYWxsZWQuIjsKKworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBrTWF4VHJhY2tDb3VudDsgaWR4KyspIHsKKyAgICAgICAgaWYgKG1DdXJyZW50VHJhY2tbaWR4XSkgeworICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHdyaXRlciI7CisgICAgY2xvc2UoZmQpOworCisgICAgaWYgKG1heEZpbGVTaXplIDw9IDApIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1heEZpbGVEdXJhdGlvbiA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24pOworICAgIH0gZWxzZSBpZiAobWF4RmlsZVNpemUgPiAwICYmIG1heEZpbGVEdXJhdGlvbiA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1heEZpbGVEdXJhdGlvbiA+IDAgJiYgbWF4RmlsZVNpemUgPD0gMCkgeworICAgICAgICBBU1NFUlRfVFJVRShsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplIHx8IGxpc3RlbmVyLT5tU2lnbmFsZWREdXJhdGlvbik7CisgICAgfQorCisgICAgaWYgKG1heEZpbGVTaXplID4gMCkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1cyA9IHN0YXQob3V0cHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHN0YXR1cyk7CisgICAgICAgIEFTU0VSVF9MRShidWYuc3Rfc2l6ZSwgbWF4RmlsZVNpemUpOworICAgIH0KK30KKworLy8gVE9ETzogKGIvMTUwOTIzMzg3KQorLy8gQWRkIFdFQk0gaW5wdXQKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChMaXN0ZW5lclRlc3RBbGwsIExpc3RlbmVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJhYWMiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjYsIDAuNywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1ybmIiLCBBTVJfTkJfMSwgVU5VU0VEX0lELCAwLjIsIDAuNiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1yd2IiLCBBTVJfV0JfMSwgVU5VU0VEX0lELCAwLjUsIDAuNSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJUcyIsIEFBQ18xLCBVTlVTRURfSUQsIDAuMiwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjQsIDAuMywgMC4yNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjMsIDEsIDAuNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgT1BVU18xLCBVTlVTRURfSUQsIDAuNywgMC4zLCAxKSkpOworCiAvLyBUT0RPOiAoYi8xNDQ0NzYxNjQpCiAvLyBBZGQgQUFDX0FEVFMsIEZMQUMsIEFWMSBpbnB1dAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFdyaXRlclRlc3RBbGwsIFdyaXRlclRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJvZ2ciLCAwKSwgbWFrZV9wYWlyKCJ3ZWJtIiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhYWMiLCAxKSwgbWFrZV9wYWlyKCJtcGVnNCIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1ybmIiLCAzKSwgbWFrZV9wYWlyKCJhbXJ3YiIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigid2VibSIsIDUpLCBtYWtlX3BhaXIoIndlYm0iLCA3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndlYm0iLCA4KSwgbWFrZV9wYWlyKCJtcGVnNCIsIDkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAxMCksIG1ha2VfcGFpcigibXBlZzQiLCAxMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsIDEzKSwgbWFrZV9wYWlyKCJtcGVnMlRzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMlRzIiwgOSkpKTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgV3JpdGVyVGVzdEFsbCwgV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYWFjIiwgQUFDXzEsIFVOVVNFRF9JRCwgMSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJuYiIsIEFNUl9OQl8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcndiIiwgQU1SX1dCXzEsIFVOVVNFRF9JRCwgMSksCisKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTQ0OTAyMDE4KTogRW5hYmxlIHRlc3QgZm9yIG1wZWcydHMKKyAgICAgICAgICAgICAgICAvLyBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgQUFDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgLy8gbWFrZV90dXBsZSgibXBlZzJUcyIsIEFWQ18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xNTYzNTU4NTcpOiBBZGQgbXVsdGl0cmFjayBmb3IgbXBlZzJ0cworICAgICAgICAgICAgICAgIC8vIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBQUNfMSwgQVZDXzEsIDAuNTApLAorICAgICAgICAgICAgICAgIC8vIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBVkNfMSwgQUFDXzEsIDAuMjUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9OQl8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQU1SX1dCXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBVkNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEgyNjNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFSUNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFVkNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIE1QRUc0XzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgQVZDXzEsIDAuMjUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQVZDXzEsIEFBQ18xLCAwLjc1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9XQl8xLCBBQUNfMSwgMC43NSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRVZDXzEsIEFNUl9XQl8xLCAwLjI1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEgyNjNfMSwgQU1SX05CXzEsIDAuNTApLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgTVBFRzRfMSwgQUFDXzEsIDAuNzUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQU1SX05CXzEsIEFNUl9XQl8xLCAwLjI1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEgyNjNfMSwgQU1SX05CXzEsIDAuNTApLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgTVBFRzRfMSwgSEVWQ18xLCAwLjc1KSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsIE9QVVNfMSwgVU5VU0VEX0lELCAxKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBPUFVTXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZPUkJJU18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDhfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA5XzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOF8xLCBPUFVTXzEsIDAuNTApLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWT1JCSVNfMSwgVlA4XzEsIDAuMjUpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgV3JpdGVyVmFsaWRpdHlUZXN0LCBXcml0ZXJWYWxpZGl0eVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFhYyIsIEFBQ18xLCB0cnVlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcm5iIiwgQU1SX05CXzEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcndiIiwgQU1SX1dCXzEsIHRydWUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQU1SX05CXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFWQ18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIMjYzXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFSUNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSEVWQ18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBNUEVHNF8xLCBmYWxzZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCBPUFVTXzEsIHRydWUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIE9QVVNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWT1JCSVNfMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOF8xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOV8xLCBmYWxzZSkpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIGdFbnYgPSBuZXcgV3JpdGVyVGVzdEVudmlyb25tZW50KCk7CiAgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdEVudmlyb25tZW50LmgKaW5kZXggOTllNjg2Zi4uN2RhMGE2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0RW52aXJvbm1lbnQuaApAQCAtMjUsNyArMjUsNyBAQAogCiBjbGFzcyBXcml0ZXJUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CiAgIHB1YmxpYzoKLSAgICBXcml0ZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisgICAgV3JpdGVyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSwgZGVsZXRlT3V0cHV0KHRydWUpIHt9CiAKICAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CkBAIC0zNCwxNiArMzQsMjEgQEAKIAogICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KIAorICAgIGJvb2wgY2xlYW5VcCgpIGNvbnN0IHsgcmV0dXJuIGRlbGV0ZU91dHB1dDsgfQorCiAgIHByaXZhdGU6CiAgICAgc3RyaW5nIHJlczsKKyAgICBib29sIGRlbGV0ZU91dHB1dDsKIH07CiAKIGludCBXcml0ZXJUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJjbGVhblVwIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdDJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CiAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6QzoiLCBvcHRpb25zLCAmaW5kZXgpOwogICAgICAgICBpZiAoYyA9PSAtMSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTUyLDYgKzU3LDExIEBACiAgICAgICAgICAgICBjYXNlICdQJzoKICAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG9wdGFyZywgImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlT3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNjIsNyArNzIsOCBAQAogICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCiAgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgogICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCi0gICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iCisgICAgICAgICAgICAgICAgIi1DLCBkZWZhdWx0OnRydWUuIERlbGV0ZSBvdXRwdXQgZmlsZSBhZnRlciB0ZXN0IGNvbXBsZXRlc1xuIiwKICAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CiAgICAgICAgIHJldHVybiAyOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmNwcAppbmRleCBmMjRjY2I2Li5hMzA0M2ZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuY3BwCkBAIC0yNCw5ICsyNCwxNiBAQAogCiBpbnQzMl90IHNlbmRCdWZmZXJzVG9Xcml0ZXIoaWZzdHJlYW0gJmlucHV0U3RyZWFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmaW5wdXRGcmFtZUlkLCBzcDxNZWRpYUFkYXB0ZXI+ICZjdXJyZW50VHJhY2ssIGludDMyX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2UsIGJvb2wgaXNQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBib29sIGlzUGF1c2VkLCBzcDxXcml0ZXJMaXN0ZW5lcj4gbGlzdGVuZXIpIHsKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoaW5wdXRGcmFtZUlkID49IChpbnQpYnVmZmVySW5mby5zaXplKCkgfHwgaW5wdXRGcmFtZUlkID49IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKGxpc3RlbmVyLT5tU2lnbmFsZWREdXJhdGlvbiB8fCBsaXN0ZW5lci0+bVNpZ25hbGVkU2l6ZSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJNYXggRmlsZSBsaW1pdCByZWFjaGVkLiBObyBtb3JlIGJ1ZmZlcnMgd2lsbCBiZSBzZW50IHRvIHRoZSB3cml0ZXIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3Qgc2l6ZSA9IGJ1ZmZlckluZm9baW5wdXRGcmFtZUlkXS5zaXplOwogICAgICAgICBjaGFyICpkYXRhID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CiAgICAgICAgIGlmICghZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmgKaW5kZXggY2RkNjI0Ni4uNmI0NTZmYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oCkBAIC0yNywxMyArMjcsMTkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5oPgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CisjaW5jbHVkZSAiV3JpdGVyTGlzdGVuZXIuaCIKIAogI2RlZmluZSBDT0RFQ19DT05GSUdfRkxBRyAzMgogCitjb25zdGV4cHIgdWludDMyX3Qga01heFRyYWNrQ291bnQgPSAyOwogY29uc3RleHByIHVpbnQzMl90IGtNYXhDU0RTdHJsZW4gPSAxNjsKIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4Q291bnQgPSAyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNaW1lU2l6ZSA9IDEyODsKK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0SW50ZXJsZWF2ZUR1cmF0aW9uID0gMDsKKy8vIEdlb2RhdGEgaXMgc2V0IGFjY29yZGluZyB0byBJU08tNjcwOSBzdGFuZGFyZC4KK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0TGF0aXR1ZGV4MTAwMDAgPSA1MDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdExvbmdpdHVkZXgxMDAwMCA9IDEwMDAwMDA7Citjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRGUFMgPSAzMC4wZjsKIAogc3RydWN0IEJ1ZmZlckluZm8gewogICAgIGludDMyX3Qgc2l6ZTsKQEAgLTQxLDkgKzQ3LDE4IEBACiAgICAgaW50NjRfdCB0aW1lVXM7CiB9OwogCitzdHJ1Y3QgY29uZmlnRm9ybWF0IHsKKyAgICBjaGFyIG1pbWVba01pbWVTaXplXTsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKK307CisKIGludDMyX3Qgc2VuZEJ1ZmZlcnNUb1dyaXRlcihpZnN0cmVhbSAmaW5wdXRTdHJlYW0sIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZpbnB1dEZyYW1lSWQsIHNwPE1lZGlhQWRhcHRlcj4gJmN1cnJlbnRUcmFjaywgaW50MzJfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgYm9vbCBpc1BhdXNlZCA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBib29sIGlzUGF1c2VkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8V3JpdGVyTGlzdGVuZXI+IGxpc3RlbmVyID0gbnVsbHB0cik7CiAKIGludDMyX3Qgd3JpdGVIZWFkZXJCdWZmZXJzKGlmc3RyZWFtICZpbnB1dFN0cmVhbSwgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmaW5wdXRGcmFtZUlkLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgaW50MzJfdCBudW1Dc2RzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTViMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsOSBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0Cit7CisgIC8vIHRlc3RzIHdoaWNoIHJlcXVpcmUgZHluYW1pYyBjb250ZW50CisgIC8vIGludm9rZSB3aXRoOiBhdGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCisgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKKyAgImR5bmFtaWMtcHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiVGltZWRUZXh0VW5pdFRlc3QiIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlNTA3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJUaW1lZFRleHRVbml0VGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJUaW1lZFRleHRVbml0VGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjU0ZTIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBUaW1lZFRleHQgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iVGltZWRUZXh0VW5pdFRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iVGltZWRUZXh0VW5pdFRlc3QtPi9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iVGltZWRUZXh0VW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzc0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIFRpbWVkVGV4dCBVbml0IFRlc3QgOgorVGhlIFRpbWVkVGV4dCBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBUZXh0RGVzY3JpcHRpb24gY2xhc3MgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBUaW1lZFRleHRVbml0VGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9UaW1lZFRleHRVbml0VGVzdC9UaW1lZFRleHRVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L1RpbWVkVGV4dFVuaXRUZXN0L1RpbWVkVGV4dFVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuemlwKS4KK0Rvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBUaW1lZFRleHRVbml0VGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogVGltZWRUZXh0VW5pdFRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBUaW1lZFRleHRVbml0VGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyODBjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fVElNRURURVhUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fVElNRURURVhUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19USU1FRFRFWFRfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVhZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUaW1lZFRleHRVbml0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisKKyNpbmNsdWRlICJ0aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oIgorCisjaW5jbHVkZSAiVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtTdGFydFRpbWVNcyA9IDEwMDAwOworCitlbnVtIHsKKyAgICAvLyBUaGVzZSBrZXlzIG11c3QgYmUgaW4gc3luYyB3aXRoIHRoZSBrZXlzIGluCisgICAgLy8gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oCisgICAgS0VZX0RJU1BMQVlfRkxBR1MgPSAxLAorICAgIEtFWV9TVFlMRV9GTEFHUyA9IDIsCisgICAgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSA9IDMsCisgICAgS0VZX0hJR0hMSUdIVF9DT0xPUl9SR0JBID0gNCwKKyAgICBLRVlfU0NST0xMX0RFTEFZID0gNSwKKyAgICBLRVlfV1JBUF9URVhUID0gNiwKKyAgICBLRVlfU1RBUlRfVElNRSA9IDcsCisgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgPSA4LAorICAgIEtFWV9TVFJVQ1RfRk9OVF9MSVNUID0gOSwKKyAgICBLRVlfU1RSVUNUX0hJR0hMSUdIVF9MSVNUID0gMTAsCisgICAgS0VZX1NUUlVDVF9IWVBFUl9URVhUX0xJU1QgPSAxMSwKKyAgICBLRVlfU1RSVUNUX0tBUkFPS0VfTElTVCA9IDEyLAorICAgIEtFWV9TVFJVQ1RfU1RZTEVfTElTVCA9IDEzLAorICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgPSAxNCwKKyAgICBLRVlfU1RSVUNUX0pVU1RJRklDQVRJT04gPSAxNSwKKyAgICBLRVlfU1RSVUNUX1RFWFQgPSAxNiwKKworICAgIEtFWV9HTE9CQUxfU0VUVElORyA9IDEwMSwKKyAgICBLRVlfTE9DQUxfU0VUVElORyA9IDEwMiwKKyAgICBLRVlfU1RBUlRfQ0hBUiA9IDEwMywKKyAgICBLRVlfRU5EX0NIQVIgPSAxMDQsCisgICAgS0VZX0ZPTlRfSUQgPSAxMDUsCisgICAgS0VZX0ZPTlRfU0laRSA9IDEwNiwKKyAgICBLRVlfVEVYVF9DT0xPUl9SR0JBID0gMTA3LAorfTsKKworc3RydWN0IEZvbnRJbmZvIHsKKyAgICBpbnQzMl90IGRpc3BsYXlGbGFnID0gLTE7CisgICAgaW50MzJfdCBob3Jpem9udGFsSnVzdGlmaWNhdGlvbiA9IC0xOworICAgIGludDMyX3QgdmVydGljYWxKdXN0aWZpY2F0aW9uID0gLTE7CisgICAgaW50MzJfdCByZ2JhQmFja2dyb3VuZCA9IC0xOworICAgIGludDMyX3QgbGVmdFBvcyA9IC0xOworICAgIGludDMyX3QgdG9wUG9zID0gLTE7CisgICAgaW50MzJfdCBib3R0b21Qb3MgPSAtMTsKKyAgICBpbnQzMl90IHJpZ2h0UG9zID0gLTE7CisgICAgaW50MzJfdCBzdGFydGNoYXIgPSAtMTsKKyAgICBpbnQzMl90IGVuZENoYXIgPSAtMTsKKyAgICBpbnQzMl90IGZvbnRJZCA9IC0xOworICAgIGludDMyX3QgZmFjZVN0eWxlID0gLTE7CisgICAgaW50MzJfdCBmb250U2l6ZSA9IC0xOworICAgIGludDMyX3QgcmdiYVRleHQgPSAtMTsKKyAgICBpbnQzMl90IGVudHJ5Q291bnQgPSAtMTsKK307CisKK3N0cnVjdCBGb250UmVjb3JkIHsKKyAgICBpbnQzMl90IGZvbnRJRCA9IC0xOworICAgIGludDMyX3QgZm9udE5hbWVMZW5ndGggPSAtMTsKKyAgICBjb25zdCB1aW50OF90ICpmb250ID0gbnVsbHB0cjsKK307CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgVGltZWRUZXh0VGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgVGltZWRUZXh0VW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPC8qZmlsZW5hbWUqLyBzdHJpbmc+IHsKKyAgcHVibGljOgorICAgIFRpbWVkVGV4dFVuaXRUZXN0KCl7fTsKKworICAgIH5UaW1lZFRleHRVbml0VGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbGVTdHJlYW0pIG1FbGVTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1JbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworICAgICAgICBtRWxlU3RyZWFtLm9wZW4obUlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IEdldFBhcmFtKCk7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0KG1JbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGU6ICIgPDwgR2V0UGFyYW0oKTsKKyAgICAgICAgbUZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIEFMT0dJKCJTaXplIG9mIHRoZSBpbnB1dCBmaWxlICVzID0gJXp1IiwgR2V0UGFyYW0oKS5jX3N0cigpLCBtRmlsZVNpemUpOworICAgIH0KKworICAgIHN0cmluZyBtSW5wdXRGaWxlTmFtZTsKKyAgICBzaXplX3QgbUZpbGVTaXplOworICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07Cit9OworCitjbGFzcyBTUlREZXNjcmlwdGlvblRlc3QgOiBwdWJsaWMgVGltZWRUZXh0VW5pdFRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBUaW1lZFRleHRVbml0VGVzdDo6U2V0VXAoKTsgfQorfTsKKworY2xhc3MgVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QgOiBwdWJsaWMgVGltZWRUZXh0VW5pdFRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBUaW1lZFRleHRVbml0VGVzdDo6U2V0VXAoKTsgfQorfTsKKworVEVTVF9QKFNSVERlc2NyaXB0aW9uVGVzdCwgZXh0cmFjdFNSVERlc2NyaXB0aW9uVGVzdCkgeworICAgIGNoYXIgZGF0YVttRmlsZVNpemVdOworICAgIG1FbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBtRmlsZVNpemUpOworCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpPVVRfT0ZfQkFORF9URVhUX1NSVCB8IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBUZXh0RGVzY3JpcHRpb25zOjpnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucygoY29uc3QgdWludDhfdCAqKWRhdGEsIG1GaWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLCBrU3RhcnRUaW1lTXMsICZwYXJjZWwpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucyByZXR1cm5lZCBlcnJvciI7CisgICAgQUxPR0koIlNpemUgb2YgdGhlIFBhcmNlbDogJXp1IiwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgIEFTU0VSVF9HVChwYXJjZWwuZGF0YVNpemUoKSwgMCkgPDwgIlBhcmNlbCBpcyBlbXB0eSI7CisKKyAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIGludDMyX3Qga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9MT0NBTF9TRVRUSU5HKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUQVJUX1RJTUUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgc3RhcnQgdGltZSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGtTdGFydFRpbWVNcykgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB0aW1pbmdzIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1RFWFQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgc3RydWN0IHRleHQga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBtRmlsZVNpemUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdGV4dCBkYXRhIjsKKyAgICBpbnQzMl90IGZpbGVTaXplID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShmaWxlU2l6ZSwgbUZpbGVTaXplKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGZpbGUgc2l6ZSB2YWx1ZSI7CisgICAgdWludDhfdCB0bXBEYXRhW2ZpbGVTaXplXTsKKyAgICBzdGF0dXMgPSBwYXJjZWwucmVhZCgodm9pZCAqKXRtcERhdGEsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSBwYXJjZWwiOworICAgIC8vIFRvIG1ha2Ugc3VyZSBlbmQgb2YgcGFyY2VsIGlzIHJlYWNoZWQKKyAgICBBU1NFUlRfRVEocGFyY2VsLmRhdGFBdmFpbCgpLCAwKSA8PCAiUGFyY2VsIGhhcyBzb21lIGRhdGEgbGVmdCB0byByZWFkIjsKK30KKworLy8gVGhpcyB0ZXN0IHVzZXMgdGhlIHByb3BlcnRpZXMgb2YgdHgzZyBib3ggbWVudGlvbmVkIGluIDNHUFAgVGltZWQgVGV4dCBGb3JtYXQKKy8vIFNwZWNpZmljYXRpb24jOiAyNi4yNDUgLyBTZWN0aW9uOiA1LjE2KFNhbXBsZSBEZXNjcmlwdGlvbiBGb3JtYXQpCisvLyBodHRwczovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS8yNl9zZXJpZXMvMjYuMjQ1LworCitURVNUX1AoVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QsIFRleHQzR1BQR2xvYmFsRGVzY3JpcHRpb25UZXN0KSB7CisgICAgY2hhciBkYXRhW21GaWxlU2l6ZV07CisgICAgbUVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIG1GaWxlU2l6ZSk7CisKKyAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgIGludDMyX3QgcmVtYWluaW5nID0gbUZpbGVTaXplOworICAgIEZvbnRJbmZvIGZvbnRJbmZvOworICAgIHZlY3RvcjxGb250UmVjb3JkPiBmb250UmVjb3JkRW50cmllczsKKworICAgIC8vIFNraXBwaW5nIHRoZSBieXRlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHN1YmJveCh0eDNnKQorICAgIHRtcERhdGEgKz0gMTY7CisgICAgcmVtYWluaW5nIC09IDE2OworCisgICAgZm9udEluZm8uZGlzcGxheUZsYWcgPSBVMzJfQVQodG1wRGF0YSk7CisgICAgQUxPR0koIkRpc3BsYXkgZmxhZzogJWQiLCBmb250SW5mby5kaXNwbGF5RmxhZyk7CisgICAgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24gPSB0bXBEYXRhWzRdOworICAgIEFMT0dJKCJIb3Jpem9udGFsIEp1c3RpZmljYXRpb246ICVkIiwgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24pOworICAgIGZvbnRJbmZvLnZlcnRpY2FsSnVzdGlmaWNhdGlvbiA9IHRtcERhdGFbNV07CisgICAgQUxPR0koIlZlcnRpY2FsIEp1c3RpZmljYXRpb246ICVkIiwgZm9udEluZm8udmVydGljYWxKdXN0aWZpY2F0aW9uKTsKKyAgICBmb250SW5mby5yZ2JhQmFja2dyb3VuZCA9CisgICAgICAgICAgICAqKHRtcERhdGEgKyA2KSA8PCAyNCB8ICoodG1wRGF0YSArIDcpIDw8IDE2IHwgKih0bXBEYXRhICsgOCkgPDwgOCB8ICoodG1wRGF0YSArIDkpOworICAgIEFMT0dJKCJyZ2JhIHZhbHVlIG9mIGJhY2tncm91bmQ6ICVkIiwgZm9udEluZm8ucmdiYUJhY2tncm91bmQpOworCisgICAgdG1wRGF0YSArPSAxMDsKKyAgICByZW1haW5pbmcgLT0gMTA7CisKKyAgICBpZiAocmVtYWluaW5nID49IDgpIHsKKyAgICAgICAgZm9udEluZm8ubGVmdFBvcyA9IFUxNl9BVCh0bXBEYXRhKTsKKyAgICAgICAgQUxPR0koIkxlZnQ6ICVkIiwgZm9udEluZm8ubGVmdFBvcyk7CisgICAgICAgIGZvbnRJbmZvLnRvcFBvcyA9IFUxNl9BVCh0bXBEYXRhICsgMik7CisgICAgICAgIEFMT0dJKCJUb3A6ICVkIiwgZm9udEluZm8udG9wUG9zKTsKKyAgICAgICAgZm9udEluZm8uYm90dG9tUG9zID0gVTE2X0FUKHRtcERhdGEgKyA0KTsKKyAgICAgICAgQUxPR0koIkJvdHRvbTogJWQiLCBmb250SW5mby5ib3R0b21Qb3MpOworICAgICAgICBmb250SW5mby5yaWdodFBvcyA9IFUxNl9BVCh0bXBEYXRhICsgNik7CisgICAgICAgIEFMT0dJKCJSaWdodDogJWQiLCBmb250SW5mby5yaWdodFBvcyk7CisKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICByZW1haW5pbmcgLT0gODsKKworICAgICAgICBpZiAocmVtYWluaW5nID49IDEyKSB7CisgICAgICAgICAgICBmb250SW5mby5zdGFydGNoYXIgPSBVMTZfQVQodG1wRGF0YSk7CisgICAgICAgICAgICBBTE9HSSgiU3RhcnQgY2hhcmFjdGVyOiAlZCIsIGZvbnRJbmZvLnN0YXJ0Y2hhcik7CisgICAgICAgICAgICBmb250SW5mby5lbmRDaGFyID0gVTE2X0FUKHRtcERhdGEgKyAyKTsKKyAgICAgICAgICAgIEFMT0dJKCJFbmQgY2hhcmFjdGVyOiAlZCIsIGZvbnRJbmZvLmVuZENoYXIpOworICAgICAgICAgICAgZm9udEluZm8uZm9udElkID0gVTE2X0FUKHRtcERhdGEgKyA0KTsKKyAgICAgICAgICAgIEFMT0dJKCJWYWx1ZSBvZiBmb250IElkZW50aWZpZXI6ICVkIiwgZm9udEluZm8uZm9udElkKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmZhY2VTdHlsZSA9ICoodG1wRGF0YSArIDYpOworICAgICAgICAgICAgQUxPR0koIkZhY2Ugc3R5bGUgZmxhZyA6ICVkIiwgZm9udEluZm8uZmFjZVN0eWxlKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmZvbnRTaXplID0gKih0bXBEYXRhICsgNyk7CisgICAgICAgICAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgZm9udDogJWQiLCBmb250SW5mby5mb250U2l6ZSk7CisgICAgICAgICAgICBmb250SW5mby5yZ2JhVGV4dCA9ICoodG1wRGF0YSArIDgpIDw8IDI0IHwgKih0bXBEYXRhICsgOSkgPDwgMTYgfCAqKHRtcERhdGEgKyAxMCkgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodG1wRGF0YSArIDExKTsKKyAgICAgICAgICAgIEFMT0dJKCJyZ2JhIHZhbHVlIG9mIHRoZSB0ZXh0OiAlZCIsIGZvbnRJbmZvLnJnYmFUZXh0KTsKKworICAgICAgICAgICAgdG1wRGF0YSArPSAxMjsKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxMjsKKworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+PSAxMCkgeworICAgICAgICAgICAgICAgIC8vIFNraXBwaW5nIHRoZSBieXRlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHN1YmJveChmdGFiKQorICAgICAgICAgICAgICAgIGZvbnRJbmZvLmVudHJ5Q291bnQgPSBVMTZfQVQodG1wRGF0YSArIDgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJWYWx1ZSBvZiBlbnRyeSBjb3VudDogJWQiLCBmb250SW5mby5lbnRyeUNvdW50KTsKKworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMTA7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDEwOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9udEluZm8uZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wRm9udElEID0gVTE2X0FUKHRtcERhdGEpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiRm9udCBJZDogJWQiLCB0ZW1wRm9udElEKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wRm9udE5hbWVMZW5ndGggPSAqKHRtcERhdGEgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkxlbmd0aCBvZiBmb250IG5hbWU6ICVkIiwgdGVtcEZvbnROYW1lTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDM7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAzOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCB0ZW1wRm9udE5hbWVMZW5ndGgpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0bXBGb250ID0gdG1wRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqdG1wRm9udE5hbWUgPSBzdHJuZHVwKChjb25zdCBjaGFyICopdG1wRm9udCwgdGVtcEZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05FKHRtcEZvbnROYW1lLCBudWxscHRyKSA8PCAiRm9udCBOYW1lIGlzIG51bGwiOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiRm9udE5hbWUgPSAlcyIsIHRtcEZvbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh0bXBGb250TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gdGVtcEZvbnROYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gdGVtcEZvbnROYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBmb250UmVjb3JkRW50cmllcy5wdXNoX2JhY2soe3RlbXBGb250SUQsIHRlbXBGb250TmFtZUxlbmd0aCwgdG1wRm9udH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFAgfCBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TOworICAgIHN0YXR1c190IHN0YXR1cyA9IFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKChjb25zdCB1aW50OF90ICopZGF0YSwgbUZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcsIGtTdGFydFRpbWVNcywgJnBhcmNlbCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImdldFBhcmNlbE9mRGVzY3JpcHRpb25zIHJldHVybmVkIGVycm9yIjsKKyAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgUGFyY2VsOiAlenUiLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgQVNTRVJUX0dUKHBhcmNlbC5kYXRhU2l6ZSgpLCAwKSA8PCAiUGFyY2VsIGlzIGVtcHR5IjsKKworICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgaW50MzJfdCBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0dMT0JBTF9TRVRUSU5HKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0RJU1BMQVlfRkxBR1MpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRElTUExBWSBGTEFHUyBLZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmRpc3BsYXlGbGFnKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBkaXNwbGF5IGZsYWciOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTikgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBTVFJVQ1QgSlVTVElGSUNBVElPTiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmhvcml6b250YWxKdXN0aWZpY2F0aW9uKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBIb3Jpem9udGFsIGp1c3RpZmljYXRpb24iOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnZlcnRpY2FsSnVzdGlmaWNhdGlvbikKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgVmVydGljYWwganVzdGlmaWNhdGlvbiI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBCQUNLR1JPVU5EIENPTE9SIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ucmdiYUJhY2tncm91bmQpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisKKyAgICBpZiAocGFyY2VsLmRhdGFBdmFpbCgpID09IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbXBsZXRlZCByZWFkaW5nIHRoZSBwYXJjZWwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1RFWFRfUE9TKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBURVhUIFBPU0lUSU9OIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ubGVmdFBvcykKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgcmdiYSBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby50b3BQb3MpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uYm90dG9tUG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnJpZ2h0UG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworCisgICAgaWYgKHBhcmNlbC5kYXRhQXZhaWwoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJDb21wbGV0ZWQgcmVhZGluZyB0aGUgcGFyY2VsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9TVFlMRV9MSVNUKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBTVFlMRSBMSVNUIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUQVJUX0NIQVIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RBUlQgQ0hBUiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnN0YXJ0Y2hhcikKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2Ygc3RhcnQgY2hhcmFjdGVyIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRU5EX0NIQVIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRU5EIENIQVIga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5lbmRDaGFyKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGVuZCBjaGFyYWN0ZXIiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9GT05UX0lEKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEZPTlQgSUQga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5mb250SWQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBJZCI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUWUxFX0ZMQUdTKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUWUxFIEZMQUdTIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZmFjZVN0eWxlKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIHN0eWxlIGZsYWdzIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRk9OVF9TSVpFKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEZPTlQgU0laRSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmZvbnRTaXplKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgc2l6ZSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1RFWFRfQ09MT1JfUkdCQSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBURVhUIENPTE9SIFJHQkEga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5yZ2JhVGV4dCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIHRleHQgY29sb3IgdmFsdWUiOworCisgICAgaWYgKHBhcmNlbC5kYXRhQXZhaWwoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJDb21wbGV0ZWQgcmVhZGluZyB0aGUgcGFyY2VsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9GT05UX0xJU1QpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RSVUNUIEZPTlQgTElTVCBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmVudHJ5Q291bnQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZW50cnkgY291bnQiOworICAgIEFTU0VSVF9FUShmb250SW5mby5lbnRyeUNvdW50LCBmb250UmVjb3JkRW50cmllcy5zaXplKCkpCisgICAgICAgICAgICA8PCAiQXJyYXkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyI7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9udEluZm8uZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnRJRCkKKyAgICAgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgSWQiOworICAgICAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCkKKyAgICAgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgbmFtZSBsZW5ndGgiOworICAgICAgICB1aW50OF90IGZvbnROYW1lW2ZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoXTsKKyAgICAgICAgLy8gd3JpdHRlbiB3aXRoIHdyaXRlQnl0ZUFycmF5KCkgd3JpdGVzIGNvdW50LCB0aGVuIHRoZSBhY3R1YWwgZGF0YQorICAgICAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCk7CisgICAgICAgIHN0YXR1cyA9IHBhcmNlbC5yZWFkKCh2b2lkICopZm9udE5hbWUsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byByZWFkIHRoZSBmb250IG5hbWUgZnJvbSBwYXJjZWwiOworICAgICAgICBBU1NFUlRfRVEobWVtY21wKGZvbnROYW1lLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250LCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCksCisgICAgICAgICAgICAgICAgICAwKQorICAgICAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgZm9udCI7CisgICAgfQorICAgIC8vIFRvIG1ha2Ugc3VyZSBlbmQgb2YgcGFyY2VsIGlzIHJlYWNoZWQKKyAgICBBU1NFUlRfRVEocGFyY2VsLmRhdGFBdmFpbCgpLCAwKSA8PCAiUGFyY2VsIGhhcyBzb21lIGRhdGEgbGVmdCB0byByZWFkIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFRpbWVkVGV4dFVuaXRUZXN0QWxsLCBTUlREZXNjcmlwdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoKCJzYW1wbGVUZXN0MS5zcnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInNhbXBsZVRlc3QyLnNydCIpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChUaW1lZFRleHRVbml0VGVzdEFsbCwgVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoKCJ0eDNnQm94MSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgidHgzZ0JveDIiKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAppbmRleCBhMjMyMTUwLi5kYmRiNDNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKQEAgLTQ5Myw3ICs0OTMsNyBAQAogICAgICAgbVBhdGgocGF0aCksCiAgICAgICBtU3RhdHVzKE5PX0lOSVQpIHsKICAgICAvLyBkZXRlcm1pbmUgaHJlZl9iYXNlCi0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBlbmQgPSBwYXRoLnJmaW5kKCIvIik7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBlbmQgPSBwYXRoLnJmaW5kKCcvJyk7CiAgICAgaWYgKGVuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBtSHJlZkJhc2UgPSBwYXRoLnN1YnN0cigwLCBlbmQgKyAxKTsKICAgICB9CkBAIC0xNTI1LDcgKzE1MjUsNyBAQAogICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXsicmFuayIsIHJhbmt9KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGVMaXN0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcmRlciksIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKKyAgICAgICAgICAgICAgICAgICAgb3JkZXIsIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjZkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNiBAQAorLy8gdGVzdCBtYXBwaW5nIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlcgoreworICAicHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiWE1MUGFyc2VyVGVzdCIgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAyZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlhNTFBhcnNlclRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiWE1MUGFyc2VyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGRhdGE6IFsiOnhtbHBhcnNlcnRlc3RfdGVzdF9maWxlcyIsXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAieG1scGFyc2VydGVzdF90ZXN0X2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbCIsCisgICAgICAgICJ0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMWIxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgeG1sIHBhcnNlciB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJYTUxQYXJzZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Im1lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sLT4vZGF0YS9sb2NhbC90bXAvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Im1lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iWE1MUGFyc2VyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL1hNTFBhcnNlclRlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IlhNTFBhcnNlclRlc3QiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzYzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwzMyBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIFhNTCBQYXJzZXIKK1RoZSBYTUxQYXJzZXIgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIFhNTFBhcnNlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIFhNTFBhcnNlclRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvWE1MUGFyc2VyVGVzdC9YTUxQYXJzZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvWE1MUGFyc2VyVGVzdC9YTUxQYXJzZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogWE1MUGFyc2VyVGVzdAorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL1hNTFBhcnNlclRlc3QKK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgWE1MUGFyc2VyVGVzdAorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZGQzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0LmNwcApAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiWE1MUGFyc2VyVGVzdCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSAiWE1MUGFyc2VyVGVzdEVudmlyb25tZW50LmgiCisKKyNkZWZpbmUgWE1MX0ZJTEVfTkFNRSAibWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3N0cnVjdCBDb2RlY1Byb3BlcnRpZXMgeworICAgIHN0cmluZyBjb2RlY05hbWU7CisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyBjb2RlY1Byb3A7Cit9OworCitzdHJ1Y3QgUm9sZVByb3BlcnRpZXMgeworICAgIHN0cmluZyByb2xlTmFtZTsKKyAgICBzdHJpbmcgdHlwZU5hbWU7CisgICAgc3RyaW5nIGNvZGVjTmFtZTsKKyAgICBib29sIGlzRW5jb2RlcjsKKyAgICBzaXplX3Qgb3JkZXI7CisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBhdHRyaWJ1dGVNYXA7Cit9OworCitjbGFzcyBYTUxQYXJzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIH5YTUxQYXJzZVRlc3QoKSB7CisgICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBtSW5wdXREYXRhVmVjdG9yLmNsZWFyKCk7CisgICAgICAgIG1JbnB1dFJvbGVWZWN0b3IuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldFVwRGF0YWJhc2UoKTsgfQorCisgICAgdm9pZCBzZXRVcERhdGFiYXNlKCk7CisKKyAgICB2b2lkIHNldENvZGVjUHJvcGVydGllcyhzdHJpbmcgY29kZWNOYW1lLCBib29sIGlzRW5jb2RlciwgaW50MzJfdCBvcmRlciwgc2V0PHN0cmluZz4gcXVpcmtTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHN0cmluZz4gZG9tYWluU2V0LCBzZXQ8c3RyaW5nPiB2YXJpYW50U2V0LCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBkb21haW4sIHZlY3RvcjxzdHJpbmc+IGFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJhbmspOworCisgICAgdm9pZCBzZXRSb2xlUHJvcGVydGllcyhzdHJpbmcgcm9sZU5hbWUsIGJvb2wgaXNFbmNvZGVyLCBpbnQzMl90IG9yZGVyLCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29kZWNOYW1lLCB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IGRvbWFpbik7CisKKyAgICB2b2lkIHNldFNlcnZpY2VBdHRyaWJ1dGUobWFwPHN0cmluZywgc3RyaW5nPiBzZXJ2aWNlQXR0cmlidXRlTmFtZVZhbHVlUGFpcik7CisKKyAgICB2b2lkIHByaW50Q29kZWNNYXAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjIG1jb2RlYyk7CisKKyAgICB2b2lkIGNoZWNrUm9sZU1hcChpbnQzMl90IGluZGV4LCBib29sIGlzRW5jb2Rlciwgc3RyaW5nIHR5cGVOYW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gYXR0ck1hcCk7CisKKyAgICBib29sIGNvbXBhcmVNYXAoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiAmbGhzLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+ICZyaHMpOworCisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBtUGFyc2VyOworICAgIHZlY3RvcjxDb2RlY1Byb3BlcnRpZXM+IG1JbnB1dERhdGFWZWN0b3I7CisgICAgdmVjdG9yPFJvbGVQcm9wZXJ0aWVzPiBtSW5wdXRSb2xlVmVjdG9yOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcDsKK307CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpzZXRVcERhdGFiYXNlKCkgeworICAgIC8vIFRoZSB2YWx1ZXMgc2V0IGJlbG93IGFyZSBzcGVjaWZpYyB0byB0ZXN0IHZlY3RvciB0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbAorICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDEuZGVjb2RlciIsIGZhbHNlLCAxLCB7ImF0dHJpYnV0ZTo6ZGlzYWJsZWQiLCAicXVpcms6OnF1aXJrMSJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7InRlbGVwaG9ueSJ9LCB7fSwgImF1ZGlvL21wZWciLCB7fSwgeyJhbGlhczEuZGVjb2RlciJ9LCAiNCIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0Mi5kZWNvZGVyIiwgZmFsc2UsIDIsIHsicXVpcms6OnF1aXJrMSJ9LCB7fSwge30sICJhdWRpby8zZ3BwIiwge30sIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3QzLmRlY29kZXIiLCBmYWxzZSwgMywge30sIHt9LCB7fSwgImF1ZGlvL2Ftci13YiIsCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMSIsICJmZWF0dXJlMVZhbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUyIiwgIjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMyIsICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q0LmRlY29kZXIiLCBmYWxzZSwgNCwge30sIHt9LCB7fSwgImF1ZGlvL2ZsYWMiLAorICAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTEiLCAiZmVhdHVyZTFWYWwiKX0sIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q1LmRlY29kZXIiLCBmYWxzZSwgNSwgeyJhdHRyaWJ1dGU6OmF0dHJpYnV0ZVF1aXJrMSJ9LCB7fSwge30sCisgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9nNzExLW1sYXciLCB7fSwge30sICIiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDYuZGVjb2RlciIsIGZhbHNlLCA2LCB7fSwge30sIHsidmFyaWFudDEiLCAidmFyaWFudDIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL21wNGEtbGF0bSIsCisgICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDE6Ojp2YXJpYW50MUxpbWl0MS1yYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFudDFMaW1pdDFNaW4tdmFyaWFudDFMaW1pdDFNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50MTo6OnZhcmlhbnQxTGltaXQyLXJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYW50MUxpbWl0Mkxvdy12YXJpYW50MUxpbWl0MkhpZ2giKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50Mjo6OnZhcmlhbnQyTGltaXQxIiwgInZhcmlhbnQyTGltaXQxVmFsdWUiKX0sCisgICAgICAgICAgICAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoCisgICAgICAgICAgICAidGVzdDcuZGVjb2RlciIsIGZhbHNlLCA3LCB7fSwge30sIHt9LCAiYXVkaW8vdm9yYmlzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oIi1taW4tbGltaXQxIiwgImxpbWl0MU1pbiIpLAorICAgICAgICAgICAgICAgICAgICAvKnBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDEtaW4iLCAibGltaXQxSW4iKSwqLworICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQyLXJhbmdlIiwgImxpbWl0Mk1pbi1saW1pdDJNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0Mi1zY2FsZSIsICJsaW1pdDJTY2FsZSIpLAorICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLWRlZmF1bHQiLCAibGltaXQzVmFsMyIpLAorICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLXJhbmdlcyIsICJsaW1pdDNWYWwxLGxpbWl0M1ZhbDIsbGltaXQzVmFsMyIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q4LmVuY29kZXIiLCB0cnVlLCA4LCB7fSwge30sIHt9LCAiYXVkaW8vb3B1cyIsCisgICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigibWF4LWxpbWl0MSIsICJsaW1pdDFNYXgiKX0sIHt9LCAiIik7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5tcDMiLCBmYWxzZSwgMSwgImF1ZGlvL21wZWciLCAidGVzdDEuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJhdHRyaWJ1dGU6OmRpc2FibGVkIiwgInByZXNlbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInJhbmsiLCAiNCIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5hbXJuYiIsIGZhbHNlLCAyLCAiYXVkaW8vM2dwcCIsICJ0ZXN0Mi5kZWNvZGVyIiwge30pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2RlY29kZXIuYW1yd2IiLCBmYWxzZSwgMywgImF1ZGlvL2Ftci13YiIsICJ0ZXN0My5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTEiLCAiZmVhdHVyZTFWYWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTIiLCAiMCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMyIsICIwIil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpby9mbGFjIiwgZmFsc2UsIDQsICJhdWRpby9mbGFjIiwgInRlc3Q0LmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMSIsICJmZWF0dXJlMVZhbCIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsIGZhbHNlLCA1LCAiYXVkaW8vZzcxMS1tbGF3IiwgInRlc3Q1LmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiYXR0cmlidXRlOjphdHRyaWJ1dGVRdWlyazEiLCAicHJlc2VudCIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5hYWMiLCBmYWxzZSwgNiwgImF1ZGlvL21wNGEtbGF0bSIsICJ0ZXN0Ni5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQxOjo6dmFyaWFudDFMaW1pdDEtcmFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFudDFMaW1pdDFNaW4tdmFyaWFudDFMaW1pdDFNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQxOjo6dmFyaWFudDFMaW1pdDItcmFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFudDFMaW1pdDJMb3ctdmFyaWFudDFMaW1pdDJIaWdoIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50Mjo6OnZhcmlhbnQyTGltaXQxIiwgInZhcmlhbnQyTGltaXQxVmFsdWUiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgZmFsc2UsIDcsICJhdWRpby92b3JiaXMiLCAidGVzdDcuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCItbWluLWxpbWl0MSIsICJsaW1pdDFNaW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgLypwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQxLWluIiwgImxpbWl0MUluIiksKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0Mi1yYW5nZSIsICJsaW1pdDJNaW4tbGltaXQyTWF4IiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDItc2NhbGUiLCAibGltaXQyU2NhbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0My1kZWZhdWx0IiwgImxpbWl0M1ZhbDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0My1yYW5nZXMiLCAibGltaXQzVmFsMSxsaW1pdDNWYWwyLGxpbWl0M1ZhbDMiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2VuY29kZXIub3B1cyIsIHRydWUsIDgsICJhdWRpby9vcHVzIiwgInRlc3Q4LmVuY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigibWF4LWxpbWl0MSIsICJsaW1pdDFNYXgiKX0pOworCisgICAgc2V0U2VydmljZUF0dHJpYnV0ZSgKKyAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiZG9tYWluLXRlbGVwaG9ueSIsICIwIiksIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJkb21haW4tdHYiLCAiMCIpLAorICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJzZXR0aW5nMiIsICIwIiksIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50LXZhcmlhbnQxIiwgIjAiKX0pOworfQorCitib29sIFhNTFBhcnNlVGVzdDo6Y29tcGFyZU1hcChjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+ICZsaHMsIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJnJocykgeworICAgIHJldHVybiBsaHMuc2l6ZSgpID09IHJocy5zaXplKCkgJiYgZXF1YWwobGhzLmJlZ2luKCksIGxocy5lbmQoKSwgcmhzLmJlZ2luKCkpOworfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6c2V0Q29kZWNQcm9wZXJ0aWVzKHN0cmluZyBjb2RlY05hbWUsIGJvb2wgaXNFbmNvZGVyLCBpbnQzMl90IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiBxdWlya1NldCwgc2V0PHN0cmluZz4gZG9tYWluU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiB2YXJpYW50U2V0LCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gZG9tYWluLCB2ZWN0b3I8c3RyaW5nPiBhbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmFuaykgeworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gQXR0cmlidXRlTWFwREI7CisgICAgZm9yIChjb25zdCBhdXRvICZBdHRyU3RyIDogZG9tYWluKSB7CisgICAgICAgIEF0dHJpYnV0ZU1hcERCLmluc2VydChBdHRyU3RyKTsKKyAgICB9CisgICAgbWFwPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4gVHlwZU1hcERhdGFCYXNlOworICAgIFR5cGVNYXBEYXRhQmFzZS5pbnNlcnQoCisgICAgICAgICAgICBwYWlyPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4odHlwZU5hbWUsIEF0dHJpYnV0ZU1hcERCKSk7CisgICAgQ29kZWNQcm9wZXJ0aWVzIGNvZGVjUHJvcGVydHk7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY05hbWUgPSBjb2RlY05hbWU7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLm9yZGVyID0gb3JkZXI7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AucXVpcmtTZXQgPSBxdWlya1NldDsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5kb21haW5TZXQgPSBkb21haW5TZXQ7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AudmFyaWFudFNldCA9IHZhcmlhbnRTZXQ7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AudHlwZU1hcCA9IFR5cGVNYXBEYXRhQmFzZTsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5hbGlhc2VzID0gYWxpYXNlczsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5yYW5rID0gcmFuazsKKyAgICBtSW5wdXREYXRhVmVjdG9yLnB1c2hfYmFjayhjb2RlY1Byb3BlcnR5KTsKK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OnNldFJvbGVQcm9wZXJ0aWVzKHN0cmluZyByb2xlTmFtZSwgYm9vbCBpc0VuY29kZXIsIGludDMyX3Qgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGVOYW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gYXR0cmlidXRlTmFtZVZhbHVlUGFpcikgeworICAgIHN0cnVjdCBSb2xlUHJvcGVydGllcyByb2xlUHJvcGVydHk7CisgICAgcm9sZVByb3BlcnR5LnJvbGVOYW1lID0gcm9sZU5hbWU7CisgICAgcm9sZVByb3BlcnR5LnR5cGVOYW1lID0gdHlwZU5hbWU7CisgICAgcm9sZVByb3BlcnR5LmNvZGVjTmFtZSA9IGNvZGVjTmFtZTsKKyAgICByb2xlUHJvcGVydHkuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIHJvbGVQcm9wZXJ0eS5vcmRlciA9IG9yZGVyOworICAgIHJvbGVQcm9wZXJ0eS5hdHRyaWJ1dGVNYXAgPSBhdHRyaWJ1dGVOYW1lVmFsdWVQYWlyOworICAgIG1JbnB1dFJvbGVWZWN0b3IucHVzaF9iYWNrKHJvbGVQcm9wZXJ0eSk7Cit9CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpzZXRTZXJ2aWNlQXR0cmlidXRlKG1hcDxzdHJpbmcsIHN0cmluZz4gc2VydmljZUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXIpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNlcnZpY2VBdHRyU3RyIDogc2VydmljZUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXIpIHsKKyAgICAgICAgbUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcC5pbnNlcnQoc2VydmljZUF0dHJTdHIpOworICAgIH0KK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OnByaW50Q29kZWNNYXAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjIG1jb2RlYykgeworICAgIGNvbnN0IHN0cmluZyAmbmFtZSA9IG1jb2RlYy5maXJzdDsKKyAgICBBTE9HVigiY29kZWMgbmFtZSA9ICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJnByb3BlcnRpZXMgPSBtY29kZWMuc2Vjb25kOworICAgIGJvb2wgaXNFbmNvZGVyID0gcHJvcGVydGllcy5pc0VuY29kZXI7CisgICAgQUxPR1YoImlzRW5jb2RlciA9ICVkXG4iLCBpc0VuY29kZXIpOworICAgIHNpemVfdCBvcmRlciA9IHByb3BlcnRpZXMub3JkZXI7CisgICAgQUxPR1YoIm9yZGVyID0gJXp1XG4iLCBvcmRlcik7CisgICAgc3RyaW5nIHJhbmsgPSBwcm9wZXJ0aWVzLnJhbms7CisgICAgQUxPR1YoInJhbmsgPSAlc1xuIiwgcmFuay5jX3N0cigpKTsKKworICAgIGZvciAoYXV0byAmaXRyUXVpcmtTZXQgOiBwcm9wZXJ0aWVzLnF1aXJrU2V0KSB7CisgICAgICAgIEFMT0dWKCJxdWlya1NldD0gJXMiLCBpdHJRdWlya1NldC5jX3N0cigpKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gJml0ckRvbWFpblNldCA6IHByb3BlcnRpZXMuZG9tYWluU2V0KSB7CisgICAgICAgIEFMT0dWKCJkb21haW5TZXQ9ICVzIiwgaXRyRG9tYWluU2V0LmNfc3RyKCkpOworICAgIH0KKworICAgIGZvciAoYXV0byAmaXRyVmFyaWFudFNldCA6IHByb3BlcnRpZXMudmFyaWFudFNldCkgeworICAgICAgICBBTE9HVigidmFyaWFudFNldD0gJXMiLCBpdHJWYXJpYW50U2V0LmNfc3RyKCkpOworICAgIH0KKworICAgIG1hcDxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+IFR5cGVNYXAgPSBwcm9wZXJ0aWVzLnR5cGVNYXA7CisgICAgQUxPR1YoIlRoZSBUeXBlTWFwIGlzIDoiKTsKKworICAgIGZvciAoYXV0byAmaXRyVHlwZU1hcCA6IFR5cGVNYXApIHsKKyAgICAgICAgQUxPR1YoIml0clR5cGVNYXAtPmZpcnN0XHQlc1x0IiwgaXRyVHlwZU1hcC5maXJzdC5jX3N0cigpKTsKKworICAgICAgICBmb3IgKGF1dG8gJml0ckF0dHJpYnV0ZU1hcCA6IGl0clR5cGVNYXAuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HVigiQXR0cmlidXRlTWFwLT5maXJzdCA9ICVzIiwgaXRyQXR0cmlidXRlTWFwLmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR1YoIkF0dHJpYnV0ZU1hcC0+c2Vjb25kID0gJXMiLCBpdHJBdHRyaWJ1dGVNYXAuc2Vjb25kLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6Y2hlY2tSb2xlTWFwKGludDMyX3QgaW5kZXgsIGJvb2wgaXNFbmNvZGVyLCBzdHJpbmcgdHlwZU5hbWUsIHN0cmluZyBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gQXR0cmlidXRlUGFpck1hcCkgeworICAgIEFTU0VSVF9FUShpc0VuY29kZXIsIG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLmlzRW5jb2RlcikKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIFJvbGVNYXAgZGF0YS4gSXNFbmNvZGVyIG1pc21hdGNoIjsKKyAgICBBU1NFUlRfRVEodHlwZU5hbWUsIG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLnR5cGVOYW1lKQorICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiB0eXBlTmFtZSBtaXNtYXRjaCI7CisgICAgQVNTRVJUX0VRKGNvZGVjTmFtZSwgbUlucHV0Um9sZVZlY3Rvci5hdChpbmRleCkuY29kZWNOYW1lKQorICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBjb2RlY05hbWUgbWlzbWF0Y2giOworCisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+Pjo6aXRlcmF0b3IgaXRyX2F0dHJpYnV0ZU1hcERCID0KKyAgICAgICAgICAgIChtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS5hdHRyaWJ1dGVNYXApLmJlZ2luKCk7CisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+Pjo6aXRlcmF0b3IgaXRyX2F0dHJpYnV0ZU1hcCA9IEF0dHJpYnV0ZVBhaXJNYXAuYmVnaW4oKTsKKyAgICBmb3IgKDsgaXRyX2F0dHJpYnV0ZU1hcCAhPSBBdHRyaWJ1dGVQYWlyTWFwLmVuZCgpICYmCisgICAgICAgICAgIGl0cl9hdHRyaWJ1dGVNYXBEQiAhPSBtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS5hdHRyaWJ1dGVNYXAuZW5kKCk7CisgICAgICAgICArK2l0cl9hdHRyaWJ1dGVNYXAsICsraXRyX2F0dHJpYnV0ZU1hcERCKSB7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVOYW1lID0gaXRyX2F0dHJpYnV0ZU1hcC0+Zmlyc3Q7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVOYW1lREIgPSBpdHJfYXR0cmlidXRlTWFwREItPmZpcnN0OworICAgICAgICBzdHJpbmcgYXR0cmlidXRldmFsdWUgPSBpdHJfYXR0cmlidXRlTWFwLT5zZWNvbmQ7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVWYWx1ZURCID0gaXRyX2F0dHJpYnV0ZU1hcERCLT5zZWNvbmQ7CisgICAgICAgIEFTU0VSVF9FUShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lREIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBBdHRyaWJ1dGUgbmFtZSBtaXNtYXRjaFx0IiA8PCBhdHRyaWJ1dGVOYW1lIDw8ICIgIT0gIgorICAgICAgICAgICAgICAgIDw8ICJhdHRyaWJ1dGVOYW1lREIiOworICAgICAgICBBU1NFUlRfRVEoYXR0cmlidXRldmFsdWUsIGF0dHJpYnV0ZVZhbHVlREIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBBdHRyaWJ1dGUgdmFsdWUgbWlzbWF0Y2hcdCIgPDwgYXR0cmlidXRldmFsdWUgPDwgIiAhPSAiCisgICAgICAgICAgICAgICAgPDwgImF0dHJpYnV0ZVZhbHVlREIiOworICAgIH0KK30KKworVEVTVF9GKFhNTFBhcnNlVGVzdCwgQ29kZWNNYXBQYXJzZVRlc3QpIHsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgWE1MX0ZJTEVfTkFNRTsKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5wdXRmaWxlICIgPDwgaW5wdXRGaWxlTmFtZTsKKworICAgIG1QYXJzZXIucGFyc2VYbWxQYXRoKGlucHV0RmlsZU5hbWUpOworICAgIGZvciAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjICZtY29kZWMgOiBtUGFyc2VyLmdldENvZGVjTWFwKCkpIHsKKyAgICAgICAgcHJpbnRDb2RlY01hcChtY29kZWMpOworICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzID0gbWNvZGVjLnNlY29uZDsKKyAgICAgICAgaW50MzJfdCBpbmRleCA9IHByb3BlcnRpZXMub3JkZXIgLSAxOworICAgICAgICBBU1NFUlRfR0UoaW5kZXgsIDApIDw8ICJJbnZhbGlkIG9yZGVyIjsKKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjTmFtZSwgbWNvZGVjLmZpcnN0LmNfc3RyKCkpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gY29kZWNOYW1lIG1pc21hdGNoIjsKKyAgICAgICAgQVNTRVJUX0VRKHByb3BlcnRpZXMuaXNFbmNvZGVyLCBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3AuaXNFbmNvZGVyKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIGlzRW5jb2RlciBtaXNtYXRjaCI7CisgICAgICAgIEFTU0VSVF9FUShwcm9wZXJ0aWVzLm9yZGVyLCBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3Aub3JkZXIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gb3JkZXIgbWlzbWF0Y2giOworCisgICAgICAgIHNldDxzdHJpbmc+IHF1aXJrU2V0REIgPSBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3AucXVpcmtTZXQ7CisgICAgICAgIHNldDxzdHJpbmc+IHF1aXJrU2V0ID0gcHJvcGVydGllcy5xdWlya1NldDsKKyAgICAgICAgc2V0PHN0cmluZz4gcXVpcmtEaWZmZXJlbmNlOworICAgICAgICBzZXRfZGlmZmVyZW5jZShxdWlya1NldERCLmJlZ2luKCksIHF1aXJrU2V0REIuZW5kKCksIHF1aXJrU2V0LmJlZ2luKCksIHF1aXJrU2V0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlcihxdWlya0RpZmZlcmVuY2UsIHF1aXJrRGlmZmVyZW5jZS5lbmQoKSkpOworICAgICAgICBBU1NFUlRfRVEocXVpcmtEaWZmZXJlbmNlLnNpemUoKSwgMCkgPDwgIkNvZGVjTWFwOnF1aXJrIG1pc21hdGNoIjsKKworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPiBUeXBlTWFwREIgPQorICAgICAgICAgICAgICAgIG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC50eXBlTWFwOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPiBUeXBlTWFwID0gcHJvcGVydGllcy50eXBlTWFwOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPjo6aXRlcmF0b3IgaXRyX1R5cGVNYXBEQiA9IFR5cGVNYXBEQi5iZWdpbigpOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPjo6aXRlcmF0b3IgaXRyX1R5cGVNYXAgPSBUeXBlTWFwLmJlZ2luKCk7CisKKyAgICAgICAgQVNTRVJUX0VRKFR5cGVNYXBEQi5zaXplKCksIFR5cGVNYXAuc2l6ZSgpKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIFR5cGVtYXAgc2l6ZSBtaXNtYXRjaCI7CisKKyAgICAgICAgZm9yICg7IGl0cl9UeXBlTWFwICE9IFR5cGVNYXAuZW5kKCkgJiYgaXRyX1R5cGVNYXBEQiAhPSBUeXBlTWFwREIuZW5kKCk7CisgICAgICAgICAgICAgKytpdHJfVHlwZU1hcCwgKytpdHJfVHlwZU1hcERCKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoaXRyX1R5cGVNYXAtPmZpcnN0LCBpdHJfVHlwZU1hcERCLT5maXJzdCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gdHlwZSBtaXNtYXRjaCI7CisgICAgICAgICAgICBib29sIGZsYWcgPSBjb21wYXJlTWFwKGl0cl9UeXBlTWFwLT5zZWNvbmQsIGl0cl9UeXBlTWFwREItPnNlY29uZCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmbGFnKSA8PCAidHlwZU1hcCBtaXNtYXRjaCI7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC5yYW5rLCBwcm9wZXJ0aWVzLnJhbmspCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gcmFuayBtaXNtYXRjaCI7CisgICAgfQorfQorCitURVNUX0YoWE1MUGFyc2VUZXN0LCBSb2xlTWFwUGFyc2VUZXN0KSB7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIFhNTF9GSUxFX05BTUU7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGlucHV0RmlsZU5hbWU7CisKKyAgICBtUGFyc2VyLnBhcnNlWG1sUGF0aChpbnB1dEZpbGVOYW1lKTsKKworICAgIGZvciAoYXV0byAmbVJvbGUgOiBtUGFyc2VyLmdldFJvbGVNYXAoKSkgeworICAgICAgICB0eXBlZGVmIHBhaXI8c3RyaW5nLCBzdHJpbmc+IEF0dHJpYnV0ZTsKKyAgICAgICAgY29uc3Qgc3RyaW5nICZyb2xlTmFtZSA9IG1Sb2xlLmZpcnN0OworICAgICAgICBBTE9HVigiUm9sZSBtYXA6bmFtZSA9ICVzXG4iLCByb2xlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OlJvbGVQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzID0gbVJvbGUuc2Vjb25kOworICAgICAgICBzdHJpbmcgdHlwZSA9IHByb3BlcnRpZXMudHlwZTsKKyAgICAgICAgQUxPR1YoIlJvbGUgbWFwOiB0eXBlID0gJXNcbiIsIHR5cGUuY19zdHIoKSk7CisKKyAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBwcm9wZXJ0aWVzLmlzRW5jb2RlcjsKKyAgICAgICAgQUxPR1YoIlJvbGUgbWFwOiBpc0VuY29kZXIgPSAlZFxuIiwgaXNFbmNvZGVyKTsKKworICAgICAgICBtdWx0aW1hcDxzaXplX3QsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbz4gbm9kZUxpc3QgPSBwcm9wZXJ0aWVzLm5vZGVMaXN0OworICAgICAgICBtdWx0aW1hcDxzaXplX3QsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbz46Oml0ZXJhdG9yIGl0cl9Ob2RlOworICAgICAgICBBTE9HVigiXG5UaGUgbXVsdGltYXAgbm9kZUxpc3QgaXMgOiBcbiIpOworICAgICAgICBmb3IgKGl0cl9Ob2RlID0gbm9kZUxpc3QuYmVnaW4oKTsgaXRyX05vZGUgIT0gbm9kZUxpc3QuZW5kKCk7ICsraXRyX05vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJpdHJfTm9kZS0+Zmlyc3Q9T1JERVI9XHQlenVcdCIsIGl0cl9Ob2RlLT5maXJzdCk7CisgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gaXRyX05vZGUtPmZpcnN0IC0gMTsKKyAgICAgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbyBub2RlUHRyID0gaXRyX05vZGUtPnNlY29uZDsKKyAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDppdHJfTm9kZS0+c2Vjb25kLm5hbWUgPSAlc1xuIiwgbm9kZVB0ci5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgdmVjdG9yPEF0dHJpYnV0ZT4gYXR0ckxpc3QgPSBub2RlUHRyLmF0dHJpYnV0ZUxpc3Q7CisgICAgICAgICAgICBmb3IgKGF1dG8gYXR0ck5hbWVWYWx1ZUxpc3QgPSBhdHRyTGlzdC5iZWdpbigpOyBhdHRyTmFtZVZhbHVlTGlzdCAhPSBhdHRyTGlzdC5lbmQoKTsKKyAgICAgICAgICAgICAgICAgKythdHRyTmFtZVZhbHVlTGlzdCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDpub2RlUHRyLmF0dHJpYnV0ZUxpc3QtPmZpcnN0ID0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVWYWx1ZUxpc3QtPmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDpub2RlUHRyLmF0dHJpYnV0ZUxpc3QtPnNlY29uZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lVmFsdWVMaXN0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja1JvbGVNYXAoaW5kZXgsIGlzRW5jb2RlciwgcHJvcGVydGllcy50eXBlLCBub2RlUHRyLm5hbWUuY19zdHIoKSwgYXR0ckxpc3QpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoWE1MUGFyc2VUZXN0LCBTZXJ2aWNlQXR0cmlidXRlTWFwUGFyc2VUZXN0KSB7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIFhNTF9GSUxFX05BTUU7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGlucHV0RmlsZU5hbWU7CisKKyAgICBtUGFyc2VyLnBhcnNlWG1sUGF0aChpbnB1dEZpbGVOYW1lKTsKKyAgICBjb25zdCBhdXRvIHNlcnZpY2VBdHRyaWJ1dGVNYXAgPSBtUGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZVBhaXIgOiBzZXJ2aWNlQXR0cmlidXRlTWFwKSB7CisgICAgICAgIEFMT0dWKCJzZXJ2aWNlQXR0cmlidXRlLmtleSA9ICVzIFx0IHNlcnZpY2VBdHRyaWJ1dGUudmFsdWUgPSAlcyIsCisgICAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXIuZmlyc3QuY19zdHIoKSwgYXR0cmlidXRlUGFpci5zZWNvbmQuY19zdHIoKSk7CisgICAgfQorICAgIGJvb2wgZmxhZyA9IGNvbXBhcmVNYXAobUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcCwgc2VydmljZUF0dHJpYnV0ZU1hcCk7CisgICAgQVNTRVJUX1RSVUUoZmxhZykgPDwgIlNlcnZpY2VNYXBQYXJzZVRlc3Q6IHR5cGVNYXAgbWlzbWF0Y2giOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR0QoIlhNTCBQYXJzZXIgVGVzdCBSZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvWE1MUGFyc2VyVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhMDllNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fWE1MX1BBUlNFUl9URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX1hNTF9QQVJTRVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX1hNTF9QQVJTRVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyOTlkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sCkBAIC0wLDAgKzEsODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFJFRkVSRU5DRSA6IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QgLS0+Cis8SW5jbHVkZWQ+CisgICAgPFNldHRpbmdzPgorICAgICAgICA8RG9tYWluIG5hbWU9InRlbGVwaG9ueSIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgICAgIDxEb21haW4gbmFtZT0idHYiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgICAgICA8VmFyaWFudCBuYW1lPSJ2YXJpYW50MSIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgICAgIDxTZXR0aW5nIG5hbWU9InNldHRpbmcxIiB2YWx1ZT0ic2V0dGluZ1ZhbHVlMSIgdXBkYXRlPSJ0cnVlIiAvPgorICAgICAgICA8U2V0dGluZyBuYW1lPSJzZXR0aW5nMiIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgPC9TZXR0aW5ncz4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIGVuYWJsZWQsIGRvbWFpbiwgcmFuayBhbmQgdXBkYXRlIHByb3BlcnRpZXMgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3QxLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wZWciIHVwZGF0ZT0iZmFsc2UiIGRvbWFpbj0idGVsZXBob255IiBlbmFibGVkPSJmYWxzZSIgcmFuaz0iNCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iYWxpYXMxLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8UXVpcmsgbmFtZT0icXVpcmsxIiB2YWx1ZT0icXVpcmsxVmFsdWUiLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIFF1aXJrIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0Mi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIiBlbmFibGVkPSJ0cnVlIiA+CisgICAgICAgICAgICA8UXVpcmsgbmFtZT0icXVpcmsxIiB2YWx1ZT0icXVpcmsxVmFsdWUiLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIEZlYXR1cmUgLS0+CisgICAgICAgIDwhLS0gZmVhdHVyZTIgdGFrZXMgdmFsdWUgMCAoZmVhdHVyZSB3aXRoIHNhbWUgbmFtZSB0YWtlcyBsb3dlciBmZWF0dXJlJ3MgdmFsdWUpIC0tPgorICAgICAgICA8IS0tIGZlYXR1cmUzIGdpdmVzIHZhbHVlIGFzIDAgc2luY2UgaXQncyBvcHRpb25hbCAtLT4KKyAgICAgICAgPCEtLSBvcHRpb25hbD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIGlzIG5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uLiAtLT4KKyAgICAgICAgPCEtLSBvcHRpb25hbD0iZmFsc2UiIHJlcXVpcmVkPSJmYWxzZSIgaXMgbm90IGEgdmFsaWQgY29tYmluYXRpb24uIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0My5kZWNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiID4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUxIiB2YWx1ZT0iZmVhdHVyZTFWYWwiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMiIgdmFsdWU9ImZlYXR1cmUyVmFsIi8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMiIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUzIiBvcHRpb25hbD0idHJ1ZSIgcmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgVHlwZSAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDQuZGVjb2RlciI+CisgICAgICAgICAgICA8VHlwZSBuYW1lPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMSIgdmFsdWU9ImZlYXR1cmUxVmFsIiAvPgorICAgICAgICAgICAgPC9UeXBlPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgQXR0cmlidXRlIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0NS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciID4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlUXVpcmsxIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgVmFyaWFudCAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDYuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIiB2YXJpYW50PSJ2YXJpYW50MSx2YXJpYW50MiIgPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0idmFyaWFudDEiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJ2YXJpYW50MUxpbWl0MSIgbWluPSJ2YXJpYW50MUxpbWl0MU1pbiIgbWF4PSJ2YXJpYW50MUxpbWl0MU1heCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0idmFyaWFudDFMaW1pdDIiIHJhbmdlPSJ2YXJpYW50MUxpbWl0Mkxvdy12YXJpYW50MUxpbWl0MkhpZ2giIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJ2YXJpYW50MiI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InZhcmlhbnQyTGltaXQxIiB2YWx1ZT0idmFyaWFudDJMaW1pdDFWYWx1ZSIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIExpbWl0IC0tPgorICAgICAgICA8IS0tICdpbicgaXMgcHJlc2VudCBpbiB4c2QgZmlsZSBidXQgbm90IGhhbmRsZWQgaW4gTWVkaWFDb2RlY3NYbWxQYXJzZXIgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyIgPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MSIgaW49ImxpbWl0MUluIiBtaW49ImxpbWl0MU1pbiIvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MiIgbWluPSJsaW1pdDJNaW4iIG1heD0ibGltaXQyTWF4IiBzY2FsZT0ibGltaXQyU2NhbGUiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ibGltaXQzIiByYW5nZXM9ImxpbWl0M1ZhbDEsbGltaXQzVmFsMixsaW1pdDNWYWwzIiBkZWZhdWx0PSJsaW1pdDNWYWwzIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q4LmVuY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MSIgbWF4PSJsaW1pdDFNYXgiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0VuY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODY0Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sCkBAIC0wLDAgKzEsNCBAQAorPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBJbmNsdWRlIC0tPgorPE1lZGlhQ29kZWNzPgorICAgIDxJbmNsdWRlIGhyZWY9Im1lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sIiAvPgorPC9NZWRpYUNvZGVjcz4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyOTBiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gVnRzVmFsaWRhdGVNZWRpYUNvZGVjcwotaW5jbHVkZSB0ZXN0L3Z0cy90b29scy9idWlsZC9BbmRyb2lkLmhvc3RfY29uZmlnLm1rCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZFRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2VlMTA3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIFZUUyBWdHNWYWxpZGF0ZU1lZGlhQ29kZWNzLiI+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJwbGFuIiB2YWx1ZT0idnRzLXRyZWJsZSIgLz4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLlZ0c0ZpbGVQdXNoZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImFib3J0LW9uLXB1c2gtZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1ncm91cCIgdmFsdWU9Ikhvc3REcml2ZW5UZXN0LnB1c2giLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iREFUQS9ldGMvbWVkaWFfY29kZWNzLnhzZC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX2NvZGVjcy54c2QiLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuVnRzTXVsdGlEZXZpY2VUZXN0Ij4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LW1vZHVsZS1uYW1lIiB2YWx1ZT0iVnRzVmFsaWRhdGVNZWRpYUNvZGVjcyIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXNvdXJjZSIgdmFsdWU9Il8zMmJpdDo6REFUQS9uYXRpdmV0ZXN0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXNvdXJjZSIgdmFsdWU9Il82NGJpdDo6REFUQS9uYXRpdmV0ZXN0NjQvdnRzX21lZGlhQ29kZWNzX3ZhbGlkYXRlX3Rlc3QvdnRzX21lZGlhQ29kZWNzX3ZhbGlkYXRlX3Rlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3QtdHlwZSIgdmFsdWU9Imd0ZXN0Ii8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMzBzIi8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icCBiL21lZGlhL2xpYndhdGNoZG9nL0FuZHJvaWQuYnAKaW5kZXggMWE4NzgyNC4uZjdmMGRiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJ3YXRjaGRvZy9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCw3IEBACiAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJ3YXRjaGRvZyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc3JjczogWwogICAgICAgICAiV2F0Y2hkb2cuY3BwIiwKICAgICBdLApAQCAtMjksNiArMzAsMTEgQEAKICAgICAgICAgZGFyd2luOiB7CiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKKyAgICAgICAgbGludXhfZ2xpYmM6IHsKKyAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICItRHNpZ2V2X25vdGlmeV90aHJlYWRfaWQ9X3NpZ2V2X3VuLl90aWQiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKICAgICB9LAogICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhIl0sCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggYWZjYTdjNC4uOGQ1Yzc3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0zNCw4ICszNCwxMCBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciIsCiAgICAgXSwKIAotICAgIC8vIGJhY2sgdG8gMzItYml0LCBiLzEyNjUwMjYxMwotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgLy8gbWVkaWFzZXJ2ZXIgaGFzIG9ubHkgYmVlbiB2ZXJpZmllZCBvbiAzMi1iaXQsIHNlZSBiLzEyNjUwMjYxMworICAgIC8vIHVzZSAicHJlZmVyMzIiIHRvICpvbmx5KiBlbmFibGUgNjQtYml0IGJ1aWxkcyBvbiA2NC1iaXQtb25seSBsdW5jaAorICAgIC8vIHRhcmdldHMsIHdoaWNoIGFsbG93cyB0aGVtIHRvIHJlYWNoICdib290X2NvbXBsZXRlJy4KKyAgICBjb21waWxlX211bHRpbGliOiAicHJlZmVyMzIiLAogCiAgICAgaW5pdF9yYzogWyJtZWRpYXNlcnZlci5yYyJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcCBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCmluZGV4IDMxNjczMmIuLjU4ZTJkMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCkBAIC0xOCw3ICsxOCw2IEBACiAjZGVmaW5lIExPR19UQUcgIm1lZGlhc2VydmVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8YWljdS9BSWN1Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTM5LDcgKzM4LDYgQEAKICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOwogICAgIEFMT0dJKCJTZXJ2aWNlTWFuYWdlcjogJXAiLCBzbS5nZXQoKSk7Ci0gICAgQUljdV9pbml0aWFsaXplSWN1T3JEaWUoKTsKICAgICBNZWRpYVBsYXllclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICByZWdpc3RlckV4dGVuc2lvbnMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLmJwIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKaW5kZXggNjZhMzEzOS4uZTU3MjI0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKQEAgLTUyLDUgKzUyLDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1c2Job3N0IiwKICAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmN1dGlsc19oZWFkZXJzIl0sCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKaW5kZXggYmQ2YTZjNi4uYzhiNGEwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKQEAgLTExNCwxMSArMTE0LDExIEBACiB2b2lkIE10cEZmc0hhbmRsZTo6YWR2aXNlKGludCBmZCkgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOVU1fSU9fQlVGUzsgaSsrKSB7CiAgICAgICAgIGlmIChwb3NpeF9tYWR2aXNlKG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKLSAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKSA8IDApCisgICAgICAgICAgICAgICAgUE9TSVhfTUFEVl9TRVFVRU5USUFMIHwgUE9TSVhfTUFEVl9XSUxMTkVFRCkgIT0gMCkKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbWFkdmlzZSI7CiAgICAgfQogICAgIGlmIChwb3NpeF9mYWR2aXNlKGZkLCAwLCAwLAotICAgICAgICAgICAgICAgIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSB8IFBPU0lYX0ZBRFZfV0lMTE5FRUQpIDwgMCkKKyAgICAgICAgICAgICAgICBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UgfCBQT1NJWF9GQURWX1dJTExORUVEKSAhPSAwKQogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZhZHZpc2UiOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzUwMjA4Li4wMDAwMDAwCi0tLSBhL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm10cF9mZnNfaGFuZGxlX3Rlc3QiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIHNyY3M6IFsiTXRwRmZzSGFuZGxlX3Rlc3QuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGlibXRwIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXh0cmEiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogInBvc2l4X2FzeW5jX2lvX3Rlc3QiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIHNyY3M6IFsiUG9zaXhBc3luY0lPX3Rlc3QuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGlibXRwIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXh0cmEiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZFRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWY0NzUzLi4wMDAwMDAwCi0tLSBhL21lZGlhL210cC90ZXN0cy9BbmRyb2lkVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgbXRwX2Zmc19oYW5kbGVfdGVzdCI+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ibXRwX2Zmc19oYW5kbGVfdGVzdC0+L2RhdGEvbG9jYWwvdG1wL210cF9mZnNfaGFuZGxlX3Rlc3QiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QiIC8+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJtdHBfZmZzX2hhbmRsZV90ZXN0IiAvPgotICAgIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlVGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZmc0hhbmRsZVRlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzkzMDY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZmc0hhbmRsZVRlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDMyIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAibXRwX2Zmc19oYW5kbGVfdGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3JjczogWyJNdHBGZnNIYW5kbGVfdGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJtdHAiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlVGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlVGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiYWIyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVUZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgbXRwX2Zmc19oYW5kbGVfdGVzdCI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ibXRwX2Zmc19oYW5kbGVfdGVzdC0+L2RhdGEvbG9jYWwvdG1wL210cF9mZnNfaGFuZGxlX3Rlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QiIC8+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJtdHBfZmZzX2hhbmRsZV90ZXN0IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZmc0hhbmRsZVRlc3QvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlVGVzdC9NdHBGZnNIYW5kbGVfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Q0NjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzEgQEAKK2NjX2Z1enogeworICAgIG5hbWU6ICJtdHBfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJtdHBfZnV6emVyLmNwcCIsCisgICAgICAgICJNdHBNb2NrRGF0YWJhc2UuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisJImxpYm10cCIsCisJImxpYmJhc2UiLAorCSJsaWJsb2ciLAorCSJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItRE1UUF9ERVZJQ0UiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBdLAorICAgIGRpY3Rpb25hcnk6ICJtdHBfZnV6emVyLmRpY3QiLAorICAgIGNvcnB1czogWyJjb3JwdXMvKiJdLAorCisgICAgZnV6el9jb25maWc6IHsKKworICAgICAgICBjYzogWyJqYW1lc3dlaUBnb29nbGUuY29tIl0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxMzQ0LAorICAgICAgICBhY2tub3dsZWRnZW1lbnQ6IFsKKyAgICAgICAgICAgICJHcmFudCBIZXJuYW5kZXogb2YgR29vZ2xlIiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9NdHBNb2NrRGF0YWJhc2UuY3BwIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9NdHBNb2NrRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTVhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL010cE1vY2tEYXRhYmFzZS5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2RlZmluZSBMT0dfVEFHICJNdHBGdXp6ZXIiCisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cE1vY2tEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBNb2NrRGF0YWJhc2U6Ok10cE1vY2tEYXRhYmFzZSgpIDogbUxhc3RPYmplY3RIYW5kbGUoMCkge30KKworTXRwTW9ja0RhdGFiYXNlOjp+TXRwTW9ja0RhdGFiYXNlKCkgeworICAgIGZvciAoTXRwT2JqZWN0SW5mbyogaSA6IG1PYmplY3RzKSB7CisgICAgICAgIGRlbGV0ZSBpOworICAgIH0KKyAgICBtT2JqZWN0cy5jbGVhcigpOworfQorCit2b2lkIE10cE1vY2tEYXRhYmFzZTo6YWRkT2JqZWN0KE10cE9iamVjdEluZm8qIGluZm8pIHsKKyAgICBhc3NlcnQoaGFzU3RvcmFnZShpbmZvLT5zdG9yYWdlSUQpKTsKKworICAgIC8vIHdlIHRha2Ugb3duZXJzaGlwCisgICAgbU9iamVjdHMucHVzaF9iYWNrKGluZm8pOworCisgICAgcmV0dXJuOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwTW9ja0RhdGFiYXNlOjphbGxvY2F0ZU9iamVjdEhhbmRsZSgpIHsKKyAgICAvLyB0aGlzIGlzIGluIHN5bmMgd2l0aCBvdXIgbU9iamVjdHMgZGF0YWJhc2UKKyAgICByZXR1cm4gbUxhc3RPYmplY3RIYW5kbGUrKzsKK30KKworLy8gQ2FsbGVkIGZyb20gU2VuZE9iamVjdEluZm8gdG8gcmVzZXJ2ZSBhIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgaW5jb21pbmcgZmlsZS4KK010cE9iamVjdEhhbmRsZSBNdHBNb2NrRGF0YWJhc2U6OmJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsIE10cFN0b3JhZ2VJRCBzdG9yYWdlKSB7CisgICAgaWYgKCFoYXNTdG9yYWdlKHN0b3JhZ2UpKSB7CisgICAgICAgIEFMT0dXKCIlczogVHJpZWQgdG8gbG9va3VwIHN0b3JhZ2VJRCAldSwgYnV0IGRvZXNuJ3QgZXhpc3RcbiIsIF9fZnVuY19fLCBzdG9yYWdlKTsKKyAgICAgICAgcmV0dXJuIGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgIH0KKworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IHBhdGg9JXMgb2Zvcm1hdD0weCUwNHggcGFyZW50X2hhbmRsZT0ldSAiCisgICAgICAgICAgInN0b3JhZ2VfaWQ9JXVcbiIsCisgICAgICAgICAgX19mdW5jX18sIHBhdGgsIGZvcm1hdCwgcGFyZW50LCBzdG9yYWdlKTsKKworICAgIHJldHVybiBtTGFzdE9iamVjdEhhbmRsZTsKK30KKworLy8gQ2FsbGVkIHRvIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIFNlbmRPYmplY3QgZmlsZSB0cmFuc2Zlci4KK3ZvaWQgTXRwTW9ja0RhdGFiYXNlOjplbmRTZW5kT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGJvb2wgc3VjY2VlZGVkKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldSBzdWNjZWVkZWQ9JWRcbiIsIF9fZnVuY19fLCBoYW5kbGUsIHN1Y2NlZWRlZCk7Cit9CisKKy8vIENhbGxlZCB0byByZXNjYW4gYSBmaWxlLCBzdWNoIGFzIGFmdGVyIGFuIGVkaXQuCit2b2lkIE10cE1vY2tEYXRhYmFzZTo6cmVzY2FuRmlsZShjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogcGF0aD0lcyBvaGFuZGxlPSV1LCBvZm9ybWF0PTB4JTA0eFxuIiwgX19mdW5jX18sIHBhdGgsIGhhbmRsZSwgZm9ybWF0KTsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXRwTW9ja0RhdGFiYXNlOjpnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IHN0b3JhZ2VfaWQ9JXUgb2Zvcm1hdD0weCUwNHggb2hhbmRsZT0ldVxuIiwgX19mdW5jX18sIHN0b3JhZ2VJRCwgZm9ybWF0LAorICAgICAgICAgIHBhcmVudCk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2ludCBNdHBNb2NrRGF0YWJhc2U6OmdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IHN0b3JhZ2VfaWQ9JXUgb2Zvcm1hdD0weCUwNHggb2hhbmRsZT0ldVxuIiwgX19mdW5jX18sIHN0b3JhZ2VJRCwgZm9ybWF0LAorICAgICAgICAgIHBhcmVudCk7CisgICAgLy8gVE9ETzogcmV0dXJuIE1UUF9SRVNQT05TRV9PSyB3aGVuIGl0IHN0b3BzIHNlZ2ZhdWx0aW5nCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQorLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAorTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXRwTW9ja0RhdGFiYXNlOjpnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlc1xuIiwgX19mdW5jX18pOworICAgIHJldHVybiBudWxscHRyOworfQorTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXRwTW9ja0RhdGFiYXNlOjpnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzXG4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CitNdHBPYmplY3RQcm9wZXJ0eUxpc3QqIE10cE1vY2tEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2Zvcm1hdD0weCUwNHhcbiIsIF9fZnVuY19fLCBmb3JtYXQpOworICAgIHJldHVybiBudWxscHRyOworfQorTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBNdHBNb2NrRGF0YWJhc2U6OmdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlc1xuIiwgX19mdW5jX18pOworICAgIHJldHVybiBudWxscHRyOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpnZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1IHByb3BlcnR5PSVzXG4iLCBfX2Z1bmNfXywgaGFuZGxlLAorICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1IHByb3BlcnR5PSVzXG4iLCBfX2Z1bmNfXywgaGFuZGxlLAorICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpnZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBwcm9wZXJ0eT0lc1xuIiwgX19mdW5jX18sIE10cERlYnVnOjpnZXREZXZpY2VQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpzZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBwcm9wZXJ0eT0lc1xuIiwgX19mdW5jX18sIE10cERlYnVnOjpnZXREZXZpY2VQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpyZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogcHJvcGVydHk9JXNcbiIsIF9fZnVuY19fLCBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlMaXN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9wZXJ0eSwgaW50IGdyb3VwQ29kZSwgaW50IGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9oYW5kbGU9JXUgZm9ybWF0PSVzIHByb3BlcnR5PSVzIGdyb3VwQ29kZT0lZCAiCisgICAgICAgICAgImRlcHRoPSVkXG4iLAorICAgICAgICAgIF9fZnVuY19fLCBoYW5kbGUsIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShmb3JtYXQpLAorICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpLCBncm91cENvZGUsIGRlcHRoKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEluZm8mIGluZm8pIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1XG4iLCBfX2Z1bmNfXywgaGFuZGxlKTsKKworICAgIC8vIHVzZWQgZm9yIHRoZSByb290CisgICAgaWYgKGhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobU9iamVjdHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBpcyB1c2VkIHRvIGxldCB0aGUgZnV6emVyIG1ha2UgcHJvZ3Jlc3MsIG90aGVyd2lzZQorICAgICAgICAvLyBpdCBoYXMgdG8gYnJ1dGUtZm9yY2UgYSAzMi1iaXQgaGFuZGxlCisgICAgICAgIE10cE9iamVjdEhhbmRsZSByZWR1Y2VkSGFuZGxlID0gaGFuZGxlICUgbU9iamVjdHMuc2l6ZSgpOworICAgICAgICBNdHBPYmplY3RJbmZvKiBvYmogPSBtT2JqZWN0c1tyZWR1Y2VkSGFuZGxlXTsKKworICAgICAgICAvLyBtYWtlIGEgY29weSwgYnV0IG1ha2Ugc3VyZSB0byBtYWludGFpbiBvd25lcnNoaXAgb2Ygc3RyaW5nIHBvaW50ZXJzCisgICAgICAgIGluZm8gPSAqb2JqOworCisgICAgICAgIC8vIGZpeHVwIHRoZSByZXNwb25zZSBoYW5kbGUKKyAgICAgICAgaW5mby5tSGFuZGxlID0gaGFuZGxlOworCisgICAgICAgIGlmIChvYmotPm1OYW1lKSBpbmZvLm1OYW1lID0gc3RyZHVwKG9iai0+bU5hbWUpOworICAgICAgICBpZiAob2JqLT5tS2V5d29yZHMpIGluZm8ubUtleXdvcmRzID0gc3RyZHVwKG9iai0+bUtleXdvcmRzKTsKKworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgIH0KK30KKwordm9pZCogTXRwTW9ja0RhdGFiYXNlOjpnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgc2l6ZV90JiBvdXRUaHVtYlNpemUpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1XG4iLCBfX2Z1bmNfXywgaGFuZGxlKTsKKworICAgIHNpemVfdCBhbGxvY1NpemUgPSBoYW5kbGUgJSAweDEwMDA7CisgICAgdm9pZCogZGF0YSA9IGNhbGxvYyhhbGxvY1NpemUsIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFkYXRhKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXNcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgb3V0VGh1bWJTaXplID0gYWxsb2NTaXplOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBNb2NrRGF0YWJhc2U6OmdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXImIG91dEZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgb3V0RmlsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCYgb3V0Rm9ybWF0KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisKKyAgICBpZiAobU9iamVjdHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfQorCisgICAgLy8gdGhpcyBpcyB1c2VkIHRvIGxldCB0aGUgZnV6emVyIG1ha2UgcHJvZ3Jlc3MsIG90aGVyd2lzZQorICAgIC8vIGl0IGhhcyB0byBicnV0ZS1mb3JjZSBhIDMyLWJpdCBoYW5kbGUKKyAgICBNdHBPYmplY3RIYW5kbGUgcmVkdWNlZEhhbmRsZSA9IGhhbmRsZSAlIG1PYmplY3RzLnNpemUoKTsKKyAgICBNdHBPYmplY3RJbmZvKiBvYmogPSBtT2JqZWN0c1tyZWR1Y2VkSGFuZGxlXTsKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gbVN0b3JhZ2Vbb2JqLT5tU3RvcmFnZUlEXTsKKworICAgIC8vIHdhbGsgdXAgdGhlIHRyZWUgdG8gYnVpbGQgYSBmdWxsIHBhdGggb2YgdGhlIG9iamVjdAorICAgIE10cE9iamVjdEhhbmRsZSBjdXJyZW50SGFuZGxlID0gcmVkdWNlZEhhbmRsZTsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gIiI7CisKKyAgICB3aGlsZSAoY3VycmVudEhhbmRsZSAhPSBNVFBfUEFSRU5UX1JPT1QpIHsKKyAgICAgICAgTXRwT2JqZWN0SW5mbyogbmV4dCA9IG1PYmplY3RzW2N1cnJlbnRIYW5kbGVdOworCisgICAgICAgIC8vIHByZXBlbmQgdGhlIG5hbWUKKyAgICAgICAgaWYgKHBhdGggPT0gIiIpCisgICAgICAgICAgICBwYXRoID0gc3RkOjpzdHJpbmcobmV4dC0+bU5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXRoID0gc3RkOjpzdHJpbmcobmV4dC0+bU5hbWUpICsgIi8iICsgcGF0aDsKKworICAgICAgICBjdXJyZW50SGFuZGxlID0gbmV4dC0+bVBhcmVudDsKKyAgICB9CisKKyAgICBvdXRGaWxlUGF0aC5zZXQoc3RvcmFnZS0+Z2V0UGF0aCgpKTsKKyAgICBvdXRGaWxlUGF0aC5hcHBlbmQoIi8iKTsKKyAgICBvdXRGaWxlUGF0aC5hcHBlbmQocGF0aC5jX3N0cigpKTsKKworICAgIG91dEZvcm1hdCA9IG9iai0+bUZvcm1hdDsKKworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IGdldCBmaWxlICVzXG4iLCBfX2Z1bmNfXywgKGNvbnN0IGNoYXIqKW91dEZpbGVQYXRoKTsKKworICAgIHN0cnVjdCBzdGF0IHNzdGF0OworICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIG91ciBkYXRhYmFzZSB2aWV3IG9mIHRoZSBmaWxlc3lzdGVtIGlzIG91dCBvZgorICAgIC8vIHN5bmMKKyAgICBpZiAoc3RhdCgoY29uc3QgY2hhciopb3V0RmlsZVBhdGgsICZzc3RhdCkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJNb2NrRGF0YWJhc2UgJXM6IHVuYWJsZSB0byBzdGF0ICVzXG4iLCBfX2Z1bmNfXywgKGNvbnN0IGNoYXIqKW91dEZpbGVQYXRoKTsKKworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9CisKKyAgICBvdXRGaWxlTGVuZ3RoID0gc3N0YXQuc3Rfc2l6ZTsKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBNb2NrRGF0YWJhc2U6OmJlZ2luRGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1XG4iLCBfX2Z1bmNfXywgaGFuZGxlKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQordm9pZCBNdHBNb2NrRGF0YWJhc2U6OmVuZERlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9oYW5kbGU9JXUgc3VjY2VlZGVkPSVkXG4iLCBfX2Z1bmNfXywgaGFuZGxlLCBzdWNjZWVkZWQpOworICAgIHJldHVybjsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXRwTW9ja0RhdGFiYXNlOjpnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1XG4iLCBfX2Z1bmNfXywgaGFuZGxlKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6c2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUHJvcGVydHkqIE10cE1vY2tEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlEZXNjKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBwcm9wZXJ0eT0lcyBmb3JtYXQ9JXNcbiIsIF9fZnVuY19fLAorICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpLCBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoZm9ybWF0KSk7CisKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworTXRwUHJvcGVydHkqIE10cE1vY2tEYXRhYmFzZTo6Z2V0RGV2aWNlUHJvcGVydHlEZXNjKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogcHJvcGVydHk9JXNcbiIsIF9fZnVuY19fLCBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBNb2NrRGF0YWJhc2U6OmJlZ2luTW92ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBPYmplY3RIYW5kbGUgbmV3UGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldSBuZXdQYXJlbnQ9JXUgbmV3U3RvcmFnZT0ldVxuIiwgX19mdW5jX18sIGhhbmRsZSwgbmV3UGFyZW50LAorICAgICAgICAgIG5ld1N0b3JhZ2UpOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK3ZvaWQgTXRwTW9ja0RhdGFiYXNlOjplbmRNb3ZlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBvbGRQYXJlbnQsIE10cE9iamVjdEhhbmRsZSBuZXdQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgb2xkU3RvcmFnZSwgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9sZFBhcmVudD0ldSBuZXdQYXJlbnQ9JXUgb2xkU3RvcmFnZT0ldSBuZXdTdG9yYWdlPSV1ICIKKyAgICAgICAgICAib2hhbmRsZT0ldSBzdWNjZWVkZWQ9JWRcbiIsCisgICAgICAgICAgX19mdW5jX18sIG9sZFBhcmVudCwgbmV3UGFyZW50LCBvbGRTdG9yYWdlLCBuZXdTdG9yYWdlLCBoYW5kbGUsIHN1Y2NlZWRlZCk7CisgICAgcmV0dXJuOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpiZWdpbkNvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgbmV3U3RvcmFnZSkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9oYW5kbGU9JXUgbmV3UGFyZW50PSV1IG5ld1N0b3JhZ2U9JXVcbiIsIF9fZnVuY19fLCBoYW5kbGUsIG5ld1BhcmVudCwKKyAgICAgICAgICBuZXdTdG9yYWdlKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCit2b2lkIE10cE1vY2tEYXRhYmFzZTo6ZW5kQ29weU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9oYW5kbGU9JXUgc3VjY2VlZGVkPSVkXG4iLCBfX2Z1bmNfXywgaGFuZGxlLCBzdWNjZWVkZWQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9NdHBNb2NrRGF0YWJhc2UuaCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvTXRwTW9ja0RhdGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2NzE5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvTXRwTW9ja0RhdGFiYXNlLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfTVRQX01PQ0tfREFUQUJBU0VfSAorI2RlZmluZSBfTVRQX01PQ0tfREFUQUJBU0VfSAorCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSAiSU10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cE1vY2tEYXRhYmFzZSA6IHB1YmxpYyBJTXRwRGF0YWJhc2UgeworICAgIHN0ZDo6bWFwPE10cFN0b3JhZ2VJRCwgTXRwU3RvcmFnZSo+IG1TdG9yYWdlOworICAgIHN0ZDo6dmVjdG9yPE10cE9iamVjdEluZm8qPiBtT2JqZWN0czsKKyAgICB1aW50MzJfdCBtTGFzdE9iamVjdEhhbmRsZTsKKworcHVibGljOgorICAgIE10cE1vY2tEYXRhYmFzZSgpOworICAgIHZpcnR1YWwgfk10cE1vY2tEYXRhYmFzZSgpOworCisgICAgLy8gTXRwRnV6emVyIG1ldGhvZHMKKyAgICB2b2lkIGFkZFN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgeworICAgICAgICAvLyB3ZSBkb24ndCBvd24gdGhpcworICAgICAgICBtU3RvcmFnZVtzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKV0gPSBzdG9yYWdlOworICAgIH0KKworICAgIGJvb2wgaGFzU3RvcmFnZShNdHBTdG9yYWdlSUQgc3RvcmFnZSkgeyByZXR1cm4gbVN0b3JhZ2UuZmluZChzdG9yYWdlKSAhPSBtU3RvcmFnZS5lbmQoKTsgfQorCisgICAgdm9pZCBhZGRPYmplY3QoTXRwT2JqZWN0SW5mbyogaW5mbyk7CisgICAgTXRwT2JqZWN0SGFuZGxlIGFsbG9jYXRlT2JqZWN0SGFuZGxlKCk7CisKKyAgICAvLyBsaWJtdHAgaW50ZXJmYWNlIG1ldGhvZHMKKyAgICAvLyBDYWxsZWQgZnJvbSBTZW5kT2JqZWN0SW5mbyB0byByZXNlcnZlIGEgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBpbmNvbWluZworICAgIC8vIGZpbGUuCisgICAgTXRwT2JqZWN0SGFuZGxlIGJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwgTXRwU3RvcmFnZUlEIHN0b3JhZ2UpOworCisgICAgLy8gQ2FsbGVkIHRvIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIFNlbmRPYmplY3QgZmlsZSB0cmFuc2Zlci4KKyAgICB2b2lkIGVuZFNlbmRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpOworCisgICAgLy8gQ2FsbGVkIHRvIHJlc2NhbiBhIGZpbGUsIHN1Y2ggYXMgYWZ0ZXIgYW4gZWRpdC4KKyAgICB2b2lkIHJlc2NhbkZpbGUoY29uc3QgY2hhciogcGF0aCwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCk7CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIGludCBnZXROdW1PYmplY3RzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworCisgICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCisgICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAorICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCk7CisgICAgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgTXRwUmVzcG9uc2VDb2RlIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBzZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LCBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc2V0RGV2aWNlUHJvcGVydHkoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOworCisgICAgTXRwUmVzcG9uc2VDb2RlIGdldE9iamVjdFByb3BlcnR5TGlzdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9wZXJ0eSwgaW50IGdyb3VwQ29kZSwgaW50IGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEluZm8mIGluZm8pOworCisgICAgdm9pZCogZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHNpemVfdCYgb3V0VGh1bWJTaXplKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBTdHJpbmdCdWZmZXImIG91dEZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBvdXRGaWxlTGVuZ3RoLCBNdHBPYmplY3RGb3JtYXQmIG91dEZvcm1hdCk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgYmVnaW5EZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCBlbmREZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpOworCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogZ2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBzZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpOworCisgICAgTXRwUHJvcGVydHkqIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCk7CisKKyAgICBNdHBQcm9wZXJ0eSogZ2V0RGV2aWNlUHJvcGVydHlEZXNjKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBiZWdpbk1vdmVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKTsKKworICAgIHZvaWQgZW5kTW92ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgb2xkUGFyZW50LCBNdHBPYmplY3RIYW5kbGUgbmV3UGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgb2xkU3RvcmFnZSwgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBiZWdpbkNvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKTsKKyAgICB2b2lkIGVuZENvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfTU9DS19EQVRBQkFTRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL010cE1vY2tIYW5kbGUuaCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvTXRwTW9ja0hhbmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTQ4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL010cE1vY2tIYW5kbGUuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX01PQ0tfSEFORExFX0gKKyNkZWZpbmUgX01UUF9NT0NLX0hBTkRMRV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0X3Q7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2NsYXNzIE10cE1vY2tIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Citwcml2YXRlOgorICAgIHNpemVfdCBtUGFja2V0TnVtYmVyOworICAgIHNpemVfdCBtUGFja2V0T2Zmc2V0OworICAgIHN0ZDo6dmVjdG9yPHBhY2tldF90PiBtUGFja2V0czsKKworcHVibGljOgorICAgIE10cE1vY2tIYW5kbGUoKSA6IG1QYWNrZXROdW1iZXIoMCksIG1QYWNrZXRPZmZzZXQoMCkge30KKworICAgIHZvaWQgYWRkX3BhY2tldChwYWNrZXRfdCBwa3QpIHsgbVBhY2tldHMucHVzaF9iYWNrKHBrdCk7IH0KKworICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZC93cml0dGVuLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0CisgICAgaW50IHJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgeworICAgICAgICBpZiAobVBhY2tldE51bWJlciA+PSBtUGFja2V0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJlYWRBbXQgPSAwOworICAgICAgICAgICAgcGFja2V0X3QgcGt0ID0gbVBhY2tldHNbbVBhY2tldE51bWJlcl07CisKKyAgICAgICAgICAgIEFMT0dEKCIlczogc3ogJXp1LCBwa3QgJXp1KyV6dS8lenVcbiIsIF9fZnVuY19fLCBsZW4sIG1QYWNrZXROdW1iZXIsIG1QYWNrZXRPZmZzZXQsCisgICAgICAgICAgICAgICAgICBwa3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gcGFja2V0IGlzIGJpZ2dlciB0aGFuIHdoYXQgdGhlIGNhbGxlciBjYW4gaGFuZGxlLAorICAgICAgICAgICAgaWYgKHBrdC5zaXplKCkgPiBsZW4pIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZGF0YSwgcGt0LmRhdGEoKSArIG1QYWNrZXRPZmZzZXQsIGxlbik7CisKKyAgICAgICAgICAgICAgICBtUGFja2V0T2Zmc2V0ICs9IGxlbjsKKyAgICAgICAgICAgICAgICByZWFkQW10ID0gbGVuOworICAgICAgICAgICAgICAgIC8vIHBhY2tldCBpcyBlcXVhbCBvciBzbWFsbGVyIHRoYW4gdGhlIGNhbGxlciBidWZmZXIKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHBrdC5kYXRhKCkgKyBtUGFja2V0T2Zmc2V0LCBwa3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIG1QYWNrZXROdW1iZXIrKzsKKyAgICAgICAgICAgICAgICBtUGFja2V0T2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICByZWFkQW10ID0gcGt0LnNpemUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlYWRBbXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICAgICAgQUxPR0QoIk1vY2tIYW5kbGUgJXM6IGxlbj0lenVcbiIsIF9fZnVuY19fLCBsZW4pOworICAgICAgICAvLyBmYWtlIHRoZSB3cml0ZQorICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIC8vIFJldHVybiAwIGlmIHNlbmQvcmVjZWl2ZSBpcyBzdWNjZXNzZnVsLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0CisgICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCkgeworICAgICAgICBBTE9HRCgiTW9ja0hhbmRsZSAlc1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgeworICAgICAgICBBTE9HRCgiTW9ja0hhbmRsZSAlc1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpIHsKKyAgICAgICAgQUxPR0QoIk1vY2tIYW5kbGUgJXM6IGxlbj0lenVcbiIsIF9fZnVuY19fLCBtZS5sZW5ndGgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gMCBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgb3IgLTEgZWxzZQorICAgIGludCBzdGFydChib29sIHB0cCkgeyByZXR1cm4gMDsgfQorCisgICAgdm9pZCBjbG9zZSgpIHt9CisKKyAgICB2aXJ0dWFsIH5NdHBNb2NrSGFuZGxlKCkge30KK307Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9NT0NLX0hBTkRMRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy8xLW10cC1vcGVuX3Nlc3Npb24ucGt0IGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMS1tdHAtb3Blbl9zZXNzaW9uLnBrdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY4ZWQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMS1tdHAtb3Blbl9zZXNzaW9uLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy8yLW10cC1nZXRfZGV2aWNlX2luZm8ucGt0IGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMi1tdHAtZ2V0X2RldmljZV9pbmZvLnBrdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzU5MzgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMi1tdHAtZ2V0X2RldmljZV9pbmZvLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy8zLW10cC1nZXRfb2JqZWN0X2hhbmRsZXMucGt0IGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMy1tdHAtZ2V0X29iamVjdF9oYW5kbGVzLnBrdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg0MTBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMy1tdHAtZ2V0X29iamVjdF9oYW5kbGVzLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy80LW10cC1nZXRfb2JqZWN0X2luZm8ucGt0IGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvNC1tdHAtZ2V0X29iamVjdF9pbmZvLnBrdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjgzZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvNC1tdHAtZ2V0X29iamVjdF9pbmZvLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy81LW10cC1zZW5kX29iamVjdF9pbmZvLnBrdCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvY29ycHVzLzUtbXRwLXNlbmRfb2JqZWN0X2luZm8ucGt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjdmODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy81LW10cC1zZW5kX29iamVjdF9pbmZvLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL210cF9mdXp6ZXIuY3BwIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9tdHBfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTc4NDYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9tdHBfZnV6emVyLmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRnV6emVyIgorCisjaW5jbHVkZSAiSU10cEhhbmRsZS5oIgorI2luY2x1ZGUgIk10cE1vY2tEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cE1vY2tIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU2VydmVyLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK2NvbnN0IGNoYXIqIHN0b3JhZ2VfZGVzYyA9ICJGdXp6IFN0b3JhZ2UiOworLy8gcHJlZmVyIHRtcGZzIGZvciBmaWxlIG9wZXJhdGlvbnMgdG8gYXZvaWQgd2VhcmluZyBvdXQgZmxhc2gKK2NvbnN0IGNoYXIqIHN0b3JhZ2VfcGF0aCA9ICIvc3RvcmFnZS9mdXp6ZXIvMCI7Citjb25zdCBjaGFyKiBzb3VyY2VfZGF0YWJhc2UgPSAic3JjZGIvIjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgTXRwTW9ja1NlcnZlciB7CitwdWJsaWM6CisgICAgc3RkOjp1bmlxdWVfcHRyPE10cE1vY2tIYW5kbGU+IG1IYW5kbGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPE10cFN0b3JhZ2U+IG1TdG9yYWdlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNdHBNb2NrRGF0YWJhc2U+IG1EYXRhYmFzZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TXRwU2VydmVyPiBtTXRwOworICAgIGludCBtU3RvcmFnZUlkOworCisgICAgTXRwTW9ja1NlcnZlcihjb25zdCBjaGFyKiBzdG9yYWdlX3BhdGgpIDogbVN0b3JhZ2VJZCgwKSB7CisgICAgICAgIGJvb2wgcHRwID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGNoYXIqIG1hbnUgPSAiR29vZ2xlIjsKKyAgICAgICAgY29uc3QgY2hhciogbW9kZWwgPSAiUGl4ZWwgM1hMIjsKKyAgICAgICAgY29uc3QgY2hhciogdmVyc2lvbiA9ICIxLjAiOworICAgICAgICBjb25zdCBjaGFyKiBzZXJpYWwgPSAiQUJERUYxMjMxIjsKKworICAgICAgICAvLyBUaGlzIGlzIHVudXNlZCBpbiBvdXIgaGFybmVzcworICAgICAgICBpbnQgY29udHJvbEZkID0gLTE7CisKKyAgICAgICAgbUhhbmRsZSA9IHN0ZDo6bWFrZV91bmlxdWU8TXRwTW9ja0hhbmRsZT4oKTsKKyAgICAgICAgbVN0b3JhZ2UgPSBzdGQ6Om1ha2VfdW5pcXVlPE10cFN0b3JhZ2U+KG1TdG9yYWdlSWQsIHN0b3JhZ2VfcGF0aCwgc3RvcmFnZV9kZXNjLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMDBMKTsKKyAgICAgICAgbURhdGFiYXNlID0gc3RkOjptYWtlX3VuaXF1ZTxNdHBNb2NrRGF0YWJhc2U+KCk7CisgICAgICAgIG1EYXRhYmFzZS0+YWRkU3RvcmFnZShtU3RvcmFnZS5nZXQoKSk7CisKKyAgICAgICAgbU10cCA9IHN0ZDo6bWFrZV91bmlxdWU8TXRwU2VydmVyPihtRGF0YWJhc2UuZ2V0KCksIGNvbnRyb2xGZCwgcHRwLCBtYW51LCBtb2RlbCwgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWwpOworICAgICAgICBtTXRwLT5hZGRTdG9yYWdlKG1TdG9yYWdlLmdldCgpKTsKKworICAgICAgICAvLyBjbGVhciB0aGUgb2xkIGhhbmRsZSBmaXJzdCwgc28gd2UgZG9uJ3QgbGVhayBtZW1vcnkKKyAgICAgICAgZGVsZXRlIG1NdHAtPm1IYW5kbGU7CisgICAgICAgIG1NdHAtPm1IYW5kbGUgPSBtSGFuZGxlLmdldCgpOworICAgIH0KKworICAgIHZvaWQgcnVuKCkgeyBtTXRwLT5ydW4oKTsgfQorCisgICAgaW50IGNyZWF0ZURhdGFiYXNlRnJvbVNvdXJjZURpcihjb25zdCBjaGFyKiBmcm9tUGF0aCwgY29uc3QgY2hhciogdG9QYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudEhhbmRsZSkgeworICAgICAgICBpbnQgcmV0ID0gMDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZnJvbVBhdGhTdHIoZnJvbVBhdGgpOworICAgICAgICBzdGQ6OnN0cmluZyB0b1BhdGhTdHIodG9QYXRoKTsKKworICAgICAgICBESVIqIGRpciA9IG9wZW5kaXIoZnJvbVBhdGgpOworICAgICAgICBpZiAoIWRpcikgeworICAgICAgICAgICAgQUxPR0UoIm9wZW5kaXIgJXMgZmFpbGVkIiwgZnJvbVBhdGgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChmcm9tUGF0aFN0cltmcm9tUGF0aFN0ci5zaXplKCkgLSAxXSAhPSAnLycpIGZyb21QYXRoU3RyICs9ICcvJzsKKyAgICAgICAgaWYgKHRvUGF0aFN0clt0b1BhdGhTdHIuc2l6ZSgpIC0gMV0gIT0gJy8nKSB0b1BhdGhTdHIgKz0gJy8nOworCisgICAgICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7CisKKyAgICAgICAgICAgIC8vIGlnbm9yZSAiLiIgYW5kICIuLiIKKyAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvbGRGaWxlID0gZnJvbVBhdGhTdHIgKyBuYW1lOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3RmlsZSA9IHRvUGF0aFN0ciArIG5hbWU7CisKKyAgICAgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX0RJUikgeworICAgICAgICAgICAgICAgIHJldCArPSBtYWtlRm9sZGVyKG5ld0ZpbGUuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKiBvYmplY3RJbmZvID0gbmV3IE10cE9iamVjdEluZm8obURhdGFiYXNlLT5hbGxvY2F0ZU9iamVjdEhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBvYmplY3RJbmZvLT5tU3RvcmFnZUlEID0gbVN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1QYXJlbnQgPSBwYXJlbnRIYW5kbGU7CisgICAgICAgICAgICAgICAgb2JqZWN0SW5mby0+bUZvcm1hdCA9IE1UUF9GT1JNQVRfQVNTT0NJQVRJT047IC8vIGZvbGRlcgorICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1OYW1lID0gc3RyZHVwKG5hbWUpOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1LZXl3b3JkcyA9IHN0cmR1cCgiIik7CisKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UtPmFkZE9iamVjdChvYmplY3RJbmZvKTsKKworICAgICAgICAgICAgICAgIHJldCArPSBjcmVhdGVEYXRhYmFzZUZyb21Tb3VyY2VEaXIob2xkRmlsZS5jX3N0cigpLCBuZXdGaWxlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ICs9IGNvcHlGaWxlKG9sZEZpbGUuY19zdHIoKSwgbmV3RmlsZS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8qIG9iamVjdEluZm8gPSBuZXcgTXRwT2JqZWN0SW5mbyhtRGF0YWJhc2UtPmFsbG9jYXRlT2JqZWN0SGFuZGxlKCkpOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1TdG9yYWdlSUQgPSBtU3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCk7CisgICAgICAgICAgICAgICAgb2JqZWN0SW5mby0+bVBhcmVudCA9IHBhcmVudEhhbmRsZTsKKyAgICAgICAgICAgICAgICBvYmplY3RJbmZvLT5tRm9ybWF0ID0gTVRQX0ZPUk1BVF9URVhUOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1OYW1lID0gc3RyZHVwKG5hbWUpOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1LZXl3b3JkcyA9IHN0cmR1cCgiIik7CisKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UtPmFkZE9iamVjdChvYmplY3RJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsb3NlZGlyKGRpcik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfTsKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIF9fYXR0cmlidXRlX18oKG9wdG5vbmUpKSB7CisgICAgLy8gcmVzZXQgb3VyIHN0b3JhZ2UgKGZyb20gTXRwVXRpbHMuaCkKKyAgICBhbmRyb2lkOjpkZWxldGVQYXRoKHN0b3JhZ2VfcGF0aCk7CisgICAgYW5kcm9pZDo6bWFrZUZvbGRlcigiL3N0b3JhZ2UvZnV6emVyIik7CisgICAgYW5kcm9pZDo6bWFrZUZvbGRlcihzdG9yYWdlX3BhdGgpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6Ok10cE1vY2tTZXJ2ZXI+IG10cCA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGFuZHJvaWQ6Ok10cE1vY2tTZXJ2ZXI+KHN0b3JhZ2VfcGF0aCk7CisKKyAgICBzaXplX3Qgb2ZmID0gMDsKKworICAgIC8vIFBhY2tldGl6ZSB0aGUgaW5wdXQgc3RyZWFtCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgLy8gQSBsb25nZXIgZGVsaW1pdGVyIGNvdWxkIGJlIHVzZWQsIGJ1dCB0aGlzIHdvcmtlZCBpbiBwcmFjdGljZQorICAgICAgICBpZiAoZGF0YVtpXSA9PSAnQCcpIHsKKyAgICAgICAgICAgIHNpemVfdCBwa3RzeiA9IGkgLSBvZmY7CisgICAgICAgICAgICBpZiAocGt0c3ogPiAwKSB7CisgICAgICAgICAgICAgICAgcGFja2V0X3QgcGt0ID0gcGFja2V0X3QoKHVuc2lnbmVkIGNoYXIqKWRhdGEgKyBvZmYsICh1bnNpZ25lZCBjaGFyKilkYXRhICsgaSk7CisgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gcGFja2V0IGJ1ZmZlcgorICAgICAgICAgICAgICAgIG10cC0+bUhhbmRsZS0+YWRkX3BhY2tldChwa3QpOworICAgICAgICAgICAgICAgIG9mZiA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtdHAtPmNyZWF0ZURhdGFiYXNlRnJvbVNvdXJjZURpcihzb3VyY2VfZGF0YWJhc2UsIHN0b3JhZ2VfcGF0aCwgTVRQX1BBUkVOVF9ST09UKTsKKyAgICBtdHAtPnJ1bigpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL210cF9mdXp6ZXIuZGljdCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvbXRwX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2YxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL210cF9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDc0IEBACittdHBfb3BlcmF0aW9uX2dldF9kZXZpY2VfaW5mbz0iXHgwMVx4MTAiCittdHBfb3BlcmF0aW9uX29wZW5fc2Vzc2lvbj0iXHgwMlx4MTAiCittdHBfb3BlcmF0aW9uX2Nsb3NlX3Nlc3Npb249Ilx4MDNceDEwIgorbXRwX29wZXJhdGlvbl9nZXRfc3RvcmFnZV9pZHM9Ilx4MDRceDEwIgorbXRwX29wZXJhdGlvbl9nZXRfc3RvcmFnZV9pbmZvPSJceDA1XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X251bV9vYmplY3RzPSJceDA2XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X29iamVjdF9oYW5kbGVzPSJceDA3XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X29iamVjdF9pbmZvPSJceDA4XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X29iamVjdD0iXHgwOVx4MTAiCittdHBfb3BlcmF0aW9uX2dldF90aHVtYj0iXHgwQVx4MTAiCittdHBfb3BlcmF0aW9uX2RlbGV0ZV9vYmplY3Q9Ilx4MEJceDEwIgorbXRwX29wZXJhdGlvbl9zZW5kX29iamVjdF9pbmZvPSJceDBDXHgxMCIKK210cF9vcGVyYXRpb25fc2VuZF9vYmplY3Q9Ilx4MERceDEwIgorbXRwX29wZXJhdGlvbl9pbml0aWF0ZV9jYXB0dXJlPSJceDBFXHgxMCIKK210cF9vcGVyYXRpb25fZm9ybWF0X3N0b3JlPSJceDBGXHgxMCIKK210cF9vcGVyYXRpb25fcmVzZXRfZGV2aWNlPSJceDEwXHgxMCIKK210cF9vcGVyYXRpb25fc2VsZl90ZXN0PSJceDExXHgxMCIKK210cF9vcGVyYXRpb25fc2V0X29iamVjdF9wcm90ZWN0aW9uPSJceDEyXHgxMCIKK210cF9vcGVyYXRpb25fcG93ZXJfZG93bj0iXHgxM1x4MTAiCittdHBfb3BlcmF0aW9uX2dldF9kZXZpY2VfcHJvcF9kZXNjPSJceDE0XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X2RldmljZV9wcm9wX3ZhbHVlPSJceDE1XHgxMCIKK210cF9vcGVyYXRpb25fc2V0X2RldmljZV9wcm9wX3ZhbHVlPSJceDE2XHgxMCIKK210cF9vcGVyYXRpb25fcmVzZXRfZGV2aWNlX3Byb3BfdmFsdWU9Ilx4MTdceDEwIgorbXRwX29wZXJhdGlvbl90ZXJtaW5hdGVfb3Blbl9jYXB0dXJlPSJceDE4XHgxMCIKK210cF9vcGVyYXRpb25fbW92ZV9vYmplY3Q9Ilx4MTlceDEwIgorbXRwX29wZXJhdGlvbl9jb3B5X29iamVjdD0iXHgxQVx4MTAiCittdHBfb3BlcmF0aW9uX2dldF9wYXJ0aWFsX29iamVjdD0iXHgxQlx4MTAiCittdHBfb3BlcmF0aW9uX2luaXRpYXRlX29wZW5fY2FwdHVyZT0iXHgxQ1x4MTAiCittdHBfb3BlcmF0aW9uX2dldF9vYmplY3RfcHJvcHNfc3VwcG9ydGVkPSJceDAxXHg5OCIKK210cF9vcGVyYXRpb25fZ2V0X29iamVjdF9wcm9wX2Rlc2M9Ilx4MDJceDk4IgorbXRwX29wZXJhdGlvbl9nZXRfb2JqZWN0X3Byb3BfdmFsdWU9Ilx4MDNceDk4IgorbXRwX29wZXJhdGlvbl9zZXRfb2JqZWN0X3Byb3BfdmFsdWU9Ilx4MDRceDk4IgorbXRwX29wZXJhdGlvbl9nZXRfb2JqZWN0X3Byb3BfbGlzdD0iXHgwNVx4OTgiCittdHBfb3BlcmF0aW9uX3NldF9vYmplY3RfcHJvcF9saXN0PSJceDA2XHg5OCIKK210cF9vcGVyYXRpb25fZ2V0X2ludGVyZGVwZW5kZW50X3Byb3BfZGVzYz0iXHgwN1x4OTgiCittdHBfb3BlcmF0aW9uX3NlbmRfb2JqZWN0X3Byb3BfbGlzdD0iXHgwOFx4OTgiCittdHBfb3BlcmF0aW9uX2dldF9vYmplY3RfcmVmZXJlbmNlcz0iXHgxMFx4OTgiCittdHBfb3BlcmF0aW9uX3NldF9vYmplY3RfcmVmZXJlbmNlcz0iXHgxMVx4OTgiCittdHBfb3BlcmF0aW9uX3NraXA9Ilx4MjBceDk4IgorbXRwX29wZXJhdGlvbl9nZXRfcGFydGlhbF9vYmplY3RfNjQ9Ilx4QzFceDk1IgorbXRwX29wZXJhdGlvbl9zZW5kX3BhcnRpYWxfb2JqZWN0PSJceEMyXHg5NSIKK210cF9vcGVyYXRpb25fdHJ1bmNhdGVfb2JqZWN0PSJceEMzXHg5NSIKK210cF9vcGVyYXRpb25fYmVnaW5fZWRpdF9vYmplY3Q9Ilx4QzRceDk1IgorbXRwX29wZXJhdGlvbl9lbmRfZWRpdF9vYmplY3Q9Ilx4QzVceDk1IgorCisjIEFzc29jaWF0aW9uIChmb3IgZXhhbXBsZSwgYSBmb2xkZXIpCittdHBfZm9ybWF0X2Fzc29jaWF0aW9uPSJceDAxXHgzMCIKKworIyB0eXBlcworbXRwX3R5cGVfdW5kZWZpbmVkPSJceDAwXHgwMCIKK210cF90eXBlX2ludDg9Ilx4MDFceDAwIgorbXRwX3R5cGVfdWludDg9Ilx4MDJceDAwIgorbXRwX3R5cGVfaW50MTY9Ilx4MDNceDAwIgorbXRwX3R5cGVfdWludDE2PSJceDA0XHgwMCIKK210cF90eXBlX2ludDMyPSJceDA1XHgwMCIKK210cF90eXBlX3VpbnQzMj0iXHgwNlx4MDAiCittdHBfdHlwZV9pbnQ2ND0iXHgwN1x4MDAiCittdHBfdHlwZV91aW50NjQ9Ilx4MDhceDAwIgorbXRwX3R5cGVfaW50MTI4PSJceDA5XHgwMCIKK210cF90eXBlX3VpbnQxMjg9Ilx4MEFceDAwIgorbXRwX3R5cGVfYWludDg9Ilx4MDFceDQwIgorbXRwX3R5cGVfYXVpbnQ4PSJceDAyXHg0MCIKK210cF90eXBlX2FpbnQxNj0iXHgwM1x4NDAiCittdHBfdHlwZV9hdWludDE2PSJceDA0XHg0MCIKK210cF90eXBlX2FpbnQzMj0iXHgwNVx4NDAiCittdHBfdHlwZV9hdWludDMyPSJceDA2XHg0MCIKK210cF90eXBlX2FpbnQ2ND0iXHgwN1x4NDAiCittdHBfdHlwZV9hdWludDY0PSJceDA4XHg0MCIKK210cF90eXBlX2FpbnQxMjg9Ilx4MDlceDQwIgorbXRwX3R5cGVfYXVpbnQxMjg9Ilx4MEFceDQwIgorbXRwX3R5cGVfc3RyPSJceEZGXHhGRiIKKworIyBhbHNvIHVzZWQgZm9yIG1heCBzaXplICg+NEdCKQorbXRwX3BhcmVudF9yb290PSJceEZGXHhGRlx4RkZceEZGIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL1Bvc2l4QXN5bmNJT1Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9UZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0MDFiOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9UZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworY2NfdGVzdCB7CisgICAgbmFtZTogInBvc2l4X2FzeW5jX2lvX3Rlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHNyY3M6IFsiUG9zaXhBc3luY0lPX3Rlc3QuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibXRwIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9UZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9UZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmIxMGZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL1Bvc2l4QXN5bmNJT1Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBwb3NpeF9hc3luY19pb190ZXN0Ij4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJwb3NpeF9hc3luY19pb190ZXN0LT4vZGF0YS9sb2NhbC90bXAvcG9zaXhfYXN5bmNfaW9fdGVzdCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iYXBjdCIgLz4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9InBvc2l4X2FzeW5jX2lvX3Rlc3QiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9fdGVzdC5jcHAgYi9tZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPVGVzdC9Qb3NpeEFzeW5jSU9fdGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9fdGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9UZXN0L1Bvc2l4QXN5bmNJT190ZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9uZGsvQW5kcm9pZC5icAppbmRleCA0Mzk4OWJiLi5lZTRkZWY1IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvQW5kcm9pZC5icAorKysgYi9tZWRpYS9uZGsvQW5kcm9pZC5icApAQCAtNDMsMTEgKzQzLDE4IEBACiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICBdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXQorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAorICAgIGxsbmRrX3N0dWJzOiAibGlibWVkaWFuZGsubGxuZGsiLAogCiAgICAgc3JjczogWwogICAgICAgICAiTmRrSmF2YVZNSGVscGVyLmNwcCIsCkBAIC03OSw2ICs4Niw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJqbmlfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKICAgICBdLApAQCAtMTA2LDcgKzExNCwxMiBAQAogICAgICAgICAibGlibmF0aXZlaGVscGVyIiwKICAgICBdLAogCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJqbmlfaGVhZGVycyJdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbmNsdWRlX3BsYXRmb3JtIiwKKyAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGliZ3VpIiwKQEAgLTEyNSw3ICsxMzgsNyBAQAogfQogCiBsbG5ka19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlibWVkaWFuZGsiLAorICAgIG5hbWU6ICJsaWJtZWRpYW5kay5sbG5kayIsCiAgICAgc3ltYm9sX2ZpbGU6ICJsaWJtZWRpYW5kay5tYXAudHh0IiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJpbmNsdWRlIiwKQEAgLTE3Miw2ICsxODUsNyBAQAogCiBjY190ZXN0IHsKICAgICBuYW1lOiAiQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAgICAgc3JjczogWyJ0ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLApAQCAtMTk1LDMgKzIwOSw0MSBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvIiwKICAgICBdLAogfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYm1lZGlhbmRrX2Zvcm1hdCIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VQcml2LmggYi9tZWRpYS9uZGsvTmRrSW1hZ2VQcml2LmgKaW5kZXggMGU4Y2JjYi4uYjAxOTQ0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUHJpdi5oCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVByaXYuaApAQCAtMzAsNiArMzAsMTggQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKKy8vIEZvcm1hdHMgbm90IGxpc3RlZCBpbiB0aGUgcHVibGljIEFQSSwgYnV0IHN0aWxsIGF2YWlsYWJsZSB0byBBSW1hZ2VSZWFkZXIKK2VudW0gQUlNQUdFX1BSSVZBVEVfRk9STUFUUyB7CisgICAgLyoqCisgICAgICogVW5wcm9jZXNzZWQgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHJhdworICAgICAqIGRlcHRoIG1lYXN1cmVtZW50cywgb3BhcXVlIHdpdGggMTYgYml0CisgICAgICogc2FtcGxlcy4KKyAgICAgKgorICAgICAqLworCisgICAgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEggPSAweDEwMDIsCit9OworCiAvLyBUT0RPOiB0aGlzIG9ubHkgc3VwcG9ydHMgSW1hZ2VSZWFkZXIKIHN0cnVjdCBBSW1hZ2UgewogICAgIEFJbWFnZShBSW1hZ2VSZWFkZXIqIHJlYWRlciwgaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCBCdWZmZXJJdGVtKiBidWZmZXIsCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAppbmRleCBjMGNlYjNkLi41ZDhmMGI4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2luY2x1ZGUgIk5ka0ltYWdlUHJpdi5oIgogI2luY2x1ZGUgIk5ka0ltYWdlUmVhZGVyUHJpdi5oIgotI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvTmRrSW1hZ2UuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCBhZjIxYTk5Li4xMDU1ZGM0IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhQ29kZWMiCiAKLSNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlY1BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvUHJpdi5oIgpAQCAtNDUsNiArNDUsMTAgQEAKICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9IGVsc2UgaWYgKGVyciA9PSAtRUFHQUlOKSB7CiAgICAgICAgIHJldHVybiAobWVkaWFfc3RhdHVzX3QpIEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSOworICAgIH0gZWxzZSBpZiAoZXJyID09IE5PX01FTU9SWSkgeworICAgICAgICByZXR1cm4gQU1FRElBQ09ERUNfRVJST1JfSU5TVUZGSUNJRU5UX1JFU09VUkNFOworICAgIH0gZWxzZSBpZiAoZXJyID09IERFQURfT0JKRUNUKSB7CisgICAgICAgIHJldHVybiBBTUVESUFDT0RFQ19FUlJPUl9SRUNMQUlNRUQ7CiAgICAgfQogICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CiAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwpAQCAtMjU1LDcgKzI1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpOwotICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgcmVwb3J0ZWQgZXJyb3IoMHgleCksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnJvcigweCV4KSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBkZXRhaWwuY19zdHIoKSk7CiAKICAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrTG9jayk7CkBAIC0zMDgsNyArMzEyLDExIEBACiAKIGV4dGVybiAiQyIgewogCi1zdGF0aWMgQU1lZGlhQ29kZWMgKiBjcmVhdGVBTWVkaWFDb2RlYyhjb25zdCBjaGFyICpuYW1lLCBib29sIG5hbWVfaXNfdHlwZSwgYm9vbCBlbmNvZGVyKSB7CitzdGF0aWMgQU1lZGlhQ29kZWMgKiBjcmVhdGVBTWVkaWFDb2RlYyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX2lzX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSBhbmRyb2lkOjpNZWRpYUNvZGVjOjprTm9QaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBhbmRyb2lkOjpNZWRpYUNvZGVjOjprTm9VaWQpIHsKICAgICBBTWVkaWFDb2RlYyAqbURhdGEgPSBuZXcgQU1lZGlhQ29kZWMoKTsKICAgICBtRGF0YS0+bUxvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgIG1EYXRhLT5tTG9vcGVyLT5zZXROYW1lKCJOREsgTWVkaWFDb2RlY19sb29wZXIiKTsKQEAgLTMyMiw5ICszMzAsMjAgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChuYW1lX2lzX3R5cGUpIHsKLSAgICAgICAgbURhdGEtPm1Db2RlYyA9IGFuZHJvaWQ6Ok1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShtRGF0YS0+bUxvb3BlciwgbmFtZSwgZW5jb2Rlcik7CisgICAgICAgIG1EYXRhLT5tQ29kZWMgPSBhbmRyb2lkOjpNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCisgICAgICAgICAgICAgICAgbURhdGEtPm1Mb29wZXIsCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBlbmNvZGVyLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogZXJyICovLAorICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICB1aWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1EYXRhLT5tQ29kZWMgPSBhbmRyb2lkOjpNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobURhdGEtPm1Mb29wZXIsIG5hbWUpOworICAgICAgICBtRGF0YS0+bUNvZGVjID0gYW5kcm9pZDo6TWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgIG1EYXRhLT5tTG9vcGVyLAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBlcnIgKi8sCisgICAgICAgICAgICAgICAgcGlkLAorICAgICAgICAgICAgICAgIHVpZCk7CiAgICAgfQogICAgIGlmIChtRGF0YS0+bUNvZGVjID09IE5VTEwpIHsgIC8vIGZhaWxlZCB0byBjcmVhdGUgY29kZWMKICAgICAgICAgQU1lZGlhQ29kZWNfZGVsZXRlKG1EYXRhKTsKQEAgLTM0NCwxNyArMzYzLDM4IEBACiAKIEVYUE9SVAogQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICByZXR1cm4gY3JlYXRlQU1lZGlhQ29kZWMobmFtZSwgZmFsc2UsIGZhbHNlKTsKKyAgICByZXR1cm4gY3JlYXRlQU1lZGlhQ29kZWMobmFtZSwgZmFsc2UgLyogbmFtZV9pc190eXBlICovLCBmYWxzZSAvKiBlbmNvZGVyICovKTsKIH0KIAogRVhQT1JUCiBBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpIHsKLSAgICByZXR1cm4gY3JlYXRlQU1lZGlhQ29kZWMobWltZV90eXBlLCB0cnVlLCBmYWxzZSk7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG1pbWVfdHlwZSwgdHJ1ZSAvKiBuYW1lX2lzX3R5cGUgKi8sIGZhbHNlIC8qIGVuY29kZXIgKi8pOwogfQogCiBFWFBPUlQKIEFNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICByZXR1cm4gY3JlYXRlQU1lZGlhQ29kZWMobmFtZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIHRydWUgLyogbmFtZV9pc190eXBlICovLCB0cnVlIC8qIGVuY29kZXIgKi8pOworfQorCitFWFBPUlQKK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZUZvckNsaWVudChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gY3JlYXRlQU1lZGlhQ29kZWMobmFtZSwgZmFsc2UgLyogbmFtZV9pc190eXBlICovLCBmYWxzZSAvKiBlbmNvZGVyICovLCBwaWQsIHVpZCk7Cit9CisKK0VYUE9SVAorQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGVGb3JDbGllbnQoY29uc3QgY2hhciAqbWltZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG1pbWVfdHlwZSwgdHJ1ZSAvKiBuYW1lX2lzX3R5cGUgKi8sIGZhbHNlIC8qIGVuY29kZXIgKi8sIHBpZCwgdWlkKTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZUZvckNsaWVudChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIHRydWUgLyogbmFtZV9pc190eXBlICovLCB0cnVlIC8qIGVuY29kZXIgKi8sIHBpZCwgdWlkKTsKIH0KIAogRVhQT1JUCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAppbmRleCBhYjBjYjYzLi40NzIxNGM1IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTI2LDkgKzI2LDYgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KLQotI2luY2x1ZGUgPGpuaS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMzY3LDEyICszNjQsMTQgQEAKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCA9ICJzYXItd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0VJID0gInNlaSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQgPSAic2xpY2UtaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMT1dfTU9USU9OX01BUktFUlMgPSAic2xvdy1tb3Rpb24tbWFya2VycyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgPSAic3RyaWRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FID0gInRhcmdldC10aW1lIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UID0gInRlbXBvcmFsLWxheWVyLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEID0gInRlbXBvcmFsLWxheWVyLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HID0gInRzLXNjaGVtYSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBID0gInRleHQtZm9ybWF0LWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9BVjFDID0gInRodW1ibmFpbC1jc2QtYXYxYyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMgPSAidGh1bWJuYWlsLWNzZC1oZXZjIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQgPSAidGh1bWJuYWlsLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSA9ICJ0aHVtYm5haWwtdGltZSI7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbmRrL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTgxNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDYgQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL25kaworeworICAicHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCIgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKaW5kZXggOGZiNmE4Ny4uODBkNWQ1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaApAQCAtMTE0LDEyICsxMTQsMTIgQEAKICAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlLAogICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwpOwogCi1zdHJ1Y3QgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgewordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgewogICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jSW5wdXRBdmFpbGFibGUgIG9uQXN5bmNJbnB1dEF2YWlsYWJsZTsKICAgICAgIEFNZWRpYUNvZGVjT25Bc3luY091dHB1dEF2YWlsYWJsZSBvbkFzeW5jT3V0cHV0QXZhaWxhYmxlOwogICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jRm9ybWF0Q2hhbmdlZCAgIG9uQXN5bmNGb3JtYXRDaGFuZ2VkOwogICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jRXJyb3IgICAgICAgICAgIG9uQXN5bmNFcnJvcjsKLX07Cit9IEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrOwogCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDE0MzE5YzQuLmExY2Q5ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtMzYsNiArMzYsNyBAQAogI2lmbmRlZiBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICiAjZGVmaW5lIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKIAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKaW5kZXggNDlkOGI0YS4uOGYzOTkyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCkBAIC0zNiw5ICszNiwyNCBAQAogI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9ICiAjZGVmaW5lIF9OREtfTUVESUFfRk9STUFUX0gKIAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2lmbmRlZiBfX0FORFJPSURfXworLy8gVmFsdWUgY29waWVkIGZyb20gJ2Jpb25pYy9saWJjL2luY2x1ZGUvYW5kcm9pZC9hcGktbGV2ZWwuaCcgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbgorLy8gbm9uIEFuZHJvaWQgc3lzdGVtcy4gSXQgaXMgc2V0IHRvIDEwMDAwIHdoaWNoIGlzIHNhbWUgYXMgX19BTkRST0lEX0FQSV9GVVRVUkVfXyB2YWx1ZS4KKyNpZm5kZWYgX19BTkRST0lEX0FQSV9fCisjZGVmaW5lIF9fQU5EUk9JRF9BUElfXyAxMDAwMAorI2VuZGlmCisKKy8vIFZhbHVlIGNvcGllZCBmcm9tICdiaW9uaWMvbGliYy9pbmNsdWRlL2FuZHJvaWQvdmVyc2lvbmluZy5oJyB3aGljaCBpcyBub3QgYXZhaWxhYmxlIG9uCisvLyBub24gQW5kcm9pZCBzeXN0ZW1zCisjaWZuZGVmIF9fSU5UUk9EVUNFRF9JTgorI2RlZmluZSBfX0lOVFJPRFVDRURfSU4oYXBpX2xldmVsKQorI2VuZGlmCisjZW5kaWYKKwogI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKIAogX19CRUdJTl9ERUNMUwpAQCAtMzA3LDYgKzMyMiwxMSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9XX0xBVEVOQ1kgX19JTlRST0RVQ0VEX0lOKDMwKTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMzAgKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAzMQorZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0xPV19NT1RJT05fTUFSS0VSUyBfX0lOVFJPRFVDRURfSU4oMzEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9BVjFDIF9fSU5UUk9EVUNFRF9JTigzMSk7CisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDMxICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9wcml2YXRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9wcml2YXRlL21lZGlhL05ka0ltYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjhhNTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1BSSVZBVEVfTUVESUFfTkRLSU1BR0VfSF8KLSNkZWZpbmUgX1BSSVZBVEVfTUVESUFfTkRLSU1BR0VfSF8KLS8vIEZvcm1hdHMgbm90IGxpc3RlZCBpbiB0aGUgcHVibGljIEFQSSwgYnV0IHN0aWxsIGF2YWlsYWJsZSB0byBBSW1hZ2VSZWFkZXIKLWVudW0gQUlNQUdFX1BSSVZBVEVfRk9STUFUUyB7Ci0gICAgLyoqCi0gICAgICogVW5wcm9jZXNzZWQgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHJhdwotICAgICAqIGRlcHRoIG1lYXN1cmVtZW50cywgb3BhcXVlIHdpdGggMTYgYml0Ci0gICAgICogc2FtcGxlcy4KLSAgICAgKgotICAgICAqLwotCi0gICAgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEggPSAweDEwMDIsCi19OwotI2VuZGlmIC8vIF9QUklWQVRFX01FRElBX05ES0lNQUdFCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZV9wbGF0Zm9ybS9tZWRpYS9OZGtNZWRpYUNvZGVjUGxhdGZvcm0uaCBiL21lZGlhL25kay9pbmNsdWRlX3BsYXRmb3JtL21lZGlhL05ka01lZGlhQ29kZWNQbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODM0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZV9wbGF0Zm9ybS9tZWRpYS9OZGtNZWRpYUNvZGVjUGxhdGZvcm0uaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DT0RFQ19QTEFURk9STV9ICisjZGVmaW5lIF9OREtfTUVESUFfQ09ERUNfUExBVEZPUk1fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoqCisgKiBTcGVjaWFsIHVpZCBhbmQgcGlkIHZhbHVlcyB1c2VkIHdpdGggQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWVGb3JDbGllbnQsCisgKiBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlRm9yQ2xpZW50IGFuZCBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlRm9yQ2xpZW50LgorICoKKyAqIEludHJvZHVjZWQgaW4gQVBJIDMxLgorICovCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBVaWQgdmFsdWUgdG8gaW5kaWNhdGUgdXNpbmcgY2FsbGluZyB1aWQuCisgICAgICovCisgICAgQU1FRElBQ09ERUNfQ0FMTElOR19VSUQgPSAtMSwKKyAgICAvKioKKyAgICAgKiBQaWQgdmFsdWUgdG8gaW5kaWNhdGUgdXNpbmcgY2FsbGluZyBwaWQuCisgICAgICovCisgICAgQU1FRElBQ09ERUNfQ0FMTElOR19QSUQgPSAtMSwKK307CisKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMzEKKworLyoqCisgKiBDcmVhdGUgY29kZWMgYnkgbmFtZSBvbiBiZWhhbGYgb2YgYSBjbGllbnQuCisgKgorICogVGhlIHVzYWdlIGlzIHNpbWlsYXIgdG8gQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWUoKSwgZXhjZXB0IHRoYXQgdGhlIGNvZGVjIGluc3RhbmNlCisgKiB3aWxsIGJlIGF0dHJpYnV0ZWQgdG8gdGhlIGNsaWVudCBvZiB7dWlkLCBwaWR9LCBpbnN0ZWFkIG9mIHRoZSBjYWxsZXIuCisgKgorICogT25seSBjZXJ0YWluIHByaXZpbGVnZWQgdXNlcnMgYXJlIGFsbG93ZWQgdG8gc3BlY2lmeSB7dWlkLCBwaWR9IHRoYXQncyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAqIGNhbGxlcidzLiBXaXRob3V0IHRoZSBwcml2aWxlZ2UsIHRoaXMgQVBJIHdpbGwgYmVoYXZlIHRoZSBzYW1lIGFzCisgKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZSgpLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzEuCisgKi8KK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZUZvckNsaWVudChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIF9fSU5UUk9EVUNFRF9JTigzMSk7CisKKy8qKgorICogQ3JlYXRlIGNvZGVjIGJ5IG1pbWUgdHlwZSBvbiBiZWhhbGYgb2YgYSBjbGllbnQuCisgKgorICogVGhlIHVzYWdlIGlzIHNpbWlsYXIgdG8gQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZSgpLCBleGNlcHQgdGhhdCB0aGUgY29kZWMgaW5zdGFuY2UKKyAqIHdpbGwgYmUgYXR0cmlidXRlZCB0byB0aGUgY2xpZW50IG9mIHt1aWQsIHBpZH0sIGluc3RlYWQgb2YgdGhlIGNhbGxlci4KKyAqCisgKiBPbmx5IGNlcnRhaW4gcHJpdmlsZWdlZCB1c2VycyBhcmUgYWxsb3dlZCB0byBzcGVjaWZ5IHt1aWQsIHBpZH0gdGhhdCdzIGRpZmZlcmVudCBmcm9tIHRoZQorICogY2FsbGVyJ3MuIFdpdGhvdXQgdGhlIHByaXZpbGVnZSwgdGhpcyBBUEkgd2lsbCBiZWhhdmUgdGhlIHNhbWUgYXMKKyAqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoKS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgorICovCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZUZvckNsaWVudChjb25zdCBjaGFyICptaW1lX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIF9fSU5UUk9EVUNFRF9JTigzMSk7CisKKy8qKgorICogQ3JlYXRlIGVuY29kZXIgYnkgbmFtZSBvbiBiZWhhbGYgb2YgYSBjbGllbnQuCisgKgorICogVGhlIHVzYWdlIGlzIHNpbWlsYXIgdG8gQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZSgpLCBleGNlcHQgdGhhdCB0aGUgY29kZWMgaW5zdGFuY2UKKyAqIHdpbGwgYmUgYXR0cmlidXRlZCB0byB0aGUgY2xpZW50IG9mIHt1aWQsIHBpZH0sIGluc3RlYWQgb2YgdGhlIGNhbGxlci4KKyAqCisgKiBPbmx5IGNlcnRhaW4gcHJpdmlsZWdlZCB1c2VycyBhcmUgYWxsb3dlZCB0byBzcGVjaWZ5IHt1aWQsIHBpZH0gdGhhdCdzIGRpZmZlcmVudCBmcm9tIHRoZQorICogY2FsbGVyJ3MuIFdpdGhvdXQgdGhlIHByaXZpbGVnZSwgdGhpcyBBUEkgd2lsbCBiZWhhdmUgdGhlIHNhbWUgYXMKKyAqIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGUoKS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgorICovCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZUZvckNsaWVudChjb25zdCBjaGFyICptaW1lX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIF9fSU5UUk9EVUNFRF9JTigzMSk7CisKKyNlbmRpZiAvLyBfX0FORFJPSURfQVBJX18gPj0gMzEKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8vX05ES19NRURJQV9DT0RFQ19QTEFURk9STV9ICisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAppbmRleCAyOWYxZGE4Li45NmYxNzEwIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAorKysgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dApAQCAtMTMxLDEyICsxMzEsMTQgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NMT1dfTU9USU9OX01BUktFUlM7ICMgdmFyIGludHJvZHVjZWQ9MzEKICAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfQVYxQzsgIyB2YXIgaW50cm9kdWNlZD0zMQogICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9IRVZDOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRTsgIyB2YXIgaW50cm9kdWNlZD0yOQpAQCAtMTYzLDggKzE2NSwxMSBAQAogICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19zZXRQYXR0ZXJuOyAjIGludHJvZHVjZWQ9MjQKICAgICBBTWVkaWFDb2RlY19jb25maWd1cmU7CiAgICAgQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWU7CisgICAgQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWVGb3JDbGllbnQ7ICMgYXBleCAjaW50cm9kdWNlZCA9IDMxCiAgICAgQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZTsKKyAgICBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlRm9yQ2xpZW50OyAjIGFwZXggI2ludHJvZHVjZWQgPSAzMQogICAgIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGU7CisgICAgQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZUZvckNsaWVudDsgIyBhcGV4ICNpbnRyb2R1Y2VkID0gMzEKICAgICBBTWVkaWFDb2RlY19kZWxldGU7CiAgICAgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyOwogICAgIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAgYi9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAKaW5kZXggNWI2NTA2NC4uMjc4NjRjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCisrKyBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApAQCAtMTcsMTAgKzE3LDEwIEBACiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8TmRrSW1hZ2VQcml2Lmg+CiAjaW5jbHVkZSA8TmRrSW1hZ2VSZWFkZXJQcml2Lmg+CiAjaW5jbHVkZSA8dm5kay9oYXJkd2FyZV9idWZmZXIuaD4KICNpbmNsdWRlIDxtZW1vcnk+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuamF2YQppbmRleCA0OGUxNDIyLi40MjAyNzMyIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5OYXRpdmU7CiBpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnkuU3RhdHM7CiAKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtNTcsNDAgKzU4LDg3IEBACiBwdWJsaWMgY2xhc3MgRW5jb2RlclRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRleHQgbUNvbnRleHQgPQogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtRmlsZURpclBhdGggPSBtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi8iOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtSW5wdXRGaWxlUGF0aCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5pbnB1dF9maWxlX3BhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtT3V0cHV0RmlsZVBhdGggPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcub3V0cHV0X2ZpbGVfcGF0aCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1TdGF0c0ZpbGUgPQogICAgICAgICAgICAgbUNvbnRleHQuZ2V0RXh0ZXJuYWxGaWxlc0RpcihudWxsKSArICIvRW5jb2Rlci4iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmNzdiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFbmNvZGVyVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQRVJfVEVTVF9USU1FT1VUX01TID0gMTIwMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFX09VVFBVVCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEVSX1RFU1RfVElNRU9VVF9NUyA9IDEyMDAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSA9IDI1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9CSVRfUkFURSA9IDgwMDAwMDAgLyogOCBNYnBzICovOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfTUlOX0JJVF9SQVRFID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSA9IDgwMDAwMDAgLyogOCBNYnBzICovOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfTUlOX1ZJREVPX0JJVF9SQVRFID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSA9IDEyODAwMCAvKiAxMjggS2JwcyAqLzsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBtRGVjb2RlZEZpbGVRY2lmOworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgbURlY29kZWRGaWxlRnVsbEhkOworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgbURlY29kZWRGaWxlQXVkaW87CiAgICAgcHJpdmF0ZSBTdHJpbmcgbUlucHV0RmlsZTsKKyAgICBwcml2YXRlIFN0cmluZyBtTWltZTsKKyAgICBwcml2YXRlIGludCBtQml0UmF0ZTsKKyAgICBwcml2YXRlIGludCBtSUZyYW1lSW50ZXJ2YWw7CisgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7CisgICAgcHJpdmF0ZSBpbnQgbVByb2ZpbGU7CisgICAgcHJpdmF0ZSBpbnQgbUxldmVsOworICAgIHByaXZhdGUgaW50IG1TYW1wbGVSYXRlOworICAgIHByaXZhdGUgaW50IG1OdW1DaGFubmVsOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfRlVMTEhEX0lOUFVUID0gImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1rdiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9RQ0lGX0lOUFVUID0gImNyb3dkXzE3NngxNDRfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX0FVRElPX0lOUFVUID0gImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfMzBzZWMud2VibSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9GVUxMSERfVU5QQUNLRUQgPSAiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUueXV2IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX1FDSUZfVU5QQUNLRUQgPSAiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC55dXYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfQVVESU9fVU5QQUNLRUQgPSAiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c18zMHNlYy5yYXciOwogCiAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycwogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gaW5wdXRGaWxlcygpIHsKICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CiAgICAgICAgICAgICAgICAgLy8gQXVkaW8gVGVzdAotICAgICAgICAgICAgICAgIHsiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfYWFjXzMwc2VjLm1wNCJ9LAotICAgICAgICAgICAgICAgIHsiYmJiXzgwMDBoel8xY2hfOGticHNfYW1ybmJfMzBzZWMuM2dwIn0sCi0gICAgICAgICAgICAgICAgeyJiYmJfMTYwMDBoel8xY2hfOWticHNfYW1yd2JfMzBzZWMuM2dwIn0sCi0gICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfNjAwa2Jwc19mbGFjXzMwc2VjLm1wNCJ9LAotICAgICAgICAgICAgICAgIHsiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c18zMHNlYy53ZWJtIn0sCisgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyczogRmlsZW5hbWUsIG1pbWVUeXBlLCBiaXRyYXRlLCB3aWR0aCwgaGVpZ2h0LCBpRnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAvLyBwcm9maWxlLCBsZXZlbCwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fQUFDLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDQxMDAsIDJ9LAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0FNUl9OQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDgwMDAsIDF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0FNUl9XQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE2MDAwLCAxfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0FVRElPX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19GTEFDLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDQxMDAsIDJ9LAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0ODAwMCwgMn0sCisKICAgICAgICAgICAgICAgICAvLyBWaWRlbyBUZXN0Ci0gICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0ifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIn0sCi0gICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDkud2VibSJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE3NngxNDRfMjVmcHNfNjAwMGticHNfaDI2My4zZ3AifX0pOworICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlcnM6IEZpbGVuYW1lLCBtaW1lVHlwZSwgYml0cmF0ZSwgd2lkdGgsIGhlaWdodCwgaUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgLy8gcHJvZmlsZSwgbGV2ZWwsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgIHtERUNPREVfRlVMTEhEX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19WUDgsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSwgMTkyMCwgMTA4MCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfRlVMTEhEX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSwgMTkyMCwgMTA4MCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfRlVMTEhEX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfVklERU9fQklUX1JBVEUsIDE5MjAsIDEwODAsIDEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0ZVTExIRF9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fVlA5LAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfVklERU9fQklUX1JBVEUsIDE5MjAsIDEwODAsIDEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX1FDSUZfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX01QRUc0LCBFTkNPREVfTUlOX1ZJREVPX0JJVF9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgMTc2LCAxNDQsIDEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX1FDSUZfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0gyNjMsIEVOQ09ERV9NSU5fVklERU9fQklUX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAxNzYsIDE0NCwgMSwgLTEsIC0xLCAtMSwgLTF9fSk7CiAgICAgfQogCi0gICAgcHVibGljIEVuY29kZXJUZXN0KFN0cmluZyBpbnB1dEZpbGVOYW1lKSB7Ci0gICAgICAgIHRoaXMubUlucHV0RmlsZSA9IGlucHV0RmlsZU5hbWU7CisgICAgcHVibGljIEVuY29kZXJUZXN0KFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIG1pbWUsIGludCBiaXRyYXRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUludGVydmFsLCBpbnQgcHJvZmlsZSwgaW50IGxldmVsLCBpbnQgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCkgeworICAgICAgICB0aGlzLm1JbnB1dEZpbGUgPSBmaWxlbmFtZTsKKyAgICAgICAgdGhpcy5tTWltZSA9IG1pbWU7CisgICAgICAgIHRoaXMubUJpdFJhdGUgPSBiaXRyYXRlOworICAgICAgICB0aGlzLm1JRnJhbWVJbnRlcnZhbCA9IGZyYW1lSW50ZXJ2YWw7CisgICAgICAgIHRoaXMubVdpZHRoID0gd2lkdGg7CisgICAgICAgIHRoaXMubUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgdGhpcy5tUHJvZmlsZSA9IHByb2ZpbGU7CisgICAgICAgIHRoaXMubUxldmVsID0gbGV2ZWw7CisgICAgICAgIHRoaXMubVNhbXBsZVJhdGUgPSBzYW1wbGVyYXRlOworICAgICAgICB0aGlzLm1OdW1DaGFubmVsID0gY2hhbm5lbENvdW50OwogICAgIH0KIAogICAgIEBCZWZvcmVDbGFzcwpAQCAtMTAxLDMzICsxNDksMzYgQEAKICAgICAgICAgTG9nLmQoVEFHLCAiU2F2aW5nIEJlbmNobWFyayByZXN1bHRzIGluOiAiICsgbVN0YXRzRmlsZSk7CiAgICAgfQogCi0gICAgQFRlc3QodGltZW91dCA9IFBFUl9URVNUX1RJTUVPVVRfTVMpCi0gICAgcHVibGljIHZvaWQgdGVzdEVuY29kZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHN0YXR1czsKLSAgICAgICAgaW50IGZyYW1lU2l6ZTsKLSAgICAgICAgLy9QYXJhbWV0ZXJzIGZvciB2aWRlbwotICAgICAgICBpbnQgd2lkdGggPSAwOwotICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgaW50IHByb2ZpbGUgPSAwOwotICAgICAgICBpbnQgbGV2ZWwgPSAwOwotICAgICAgICBpbnQgZnJhbWVSYXRlID0gMDsKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlcGFyZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAotICAgICAgICAvL1BhcmFtZXRlcnMgZm9yIGF1ZGlvCi0gICAgICAgIGludCBiaXRSYXRlID0gMDsKLSAgICAgICAgaW50IHNhbXBsZVJhdGUgPSAwOwotICAgICAgICBpbnQgbnVtQ2hhbm5lbHMgPSAwOwotICAgICAgICBGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKG1JbnB1dEZpbGVQYXRoICsgbUlucHV0RmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kICIgKyBtSW5wdXRGaWxlICsgIiBpbiBkaXJlY3RvcnkgIiArIG1JbnB1dEZpbGVQYXRoLAotICAgICAgICAgICAgICAgIGlucHV0RmlsZS5leGlzdHMoKSk7CisgICAgICAgIG1EZWNvZGVkRmlsZUZ1bGxIZCA9IG5ldyBGaWxlKG1GaWxlRGlyUGF0aCArIERFQ09ERV9GVUxMSERfVU5QQUNLRUQpOworICAgICAgICBpbnQgc3RhdHVzID0gZGVjb2RlRmlsZShtSW5wdXRGaWxlUGF0aCArIERFQ09ERV9GVUxMSERfSU5QVVQsIG1EZWNvZGVkRmlsZUZ1bGxIZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVjb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzLCAwLCBzdGF0dXMpOworCisgICAgICAgIG1EZWNvZGVkRmlsZVFjaWYgPSBuZXcgRmlsZShtRmlsZURpclBhdGggKyBERUNPREVfUUNJRl9VTlBBQ0tFRCk7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZUZpbGUobUlucHV0RmlsZVBhdGggKyBERUNPREVfUUNJRl9JTlBVVCwgbURlY29kZWRGaWxlUWNpZik7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVjb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzLCAwLCBzdGF0dXMpOworCisgICAgICAgIG1EZWNvZGVkRmlsZUF1ZGlvID0gbmV3IEZpbGUobUZpbGVEaXJQYXRoICsgREVDT0RFX0FVRElPX1VOUEFDS0VEKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlRmlsZShtSW5wdXRGaWxlUGF0aCArIERFQ09ERV9BVURJT19JTlBVVCwgbURlY29kZWRGaWxlQXVkaW8pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cywgMCwgc3RhdHVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVjb2RlRmlsZShTdHJpbmcgaW5wdXRGaWxlTmFtZSwgRmlsZSBvdXRwdXREZWNvZGVGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgc3RhdHVzID0gLTE7CisgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUoaW5wdXRGaWxlTmFtZSk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgIiArIGlucHV0RmlsZU5hbWUsIGlucHV0RmlsZS5leGlzdHMoKSk7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7CiAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0gZmlsZUlucHV0LmdldEZEKCk7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZGVjb2RlT3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RGVjb2RlRmlsZSk7CisKICAgICAgICAgRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3IoKTsKICAgICAgICAgaW50IHRyYWNrQ291bnQgPSBleHRyYWN0b3Iuc2V0VXBFeHRyYWN0b3IoZmlsZURlc2NyaXB0b3IpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHRyYWN0aW9uIGZhaWxlZC4gTm8gdHJhY2tzIGZvciBmaWxlOiAiICsgbUlucHV0RmlsZSwgKHRyYWNrQ291bnQgPiAwKSk7CisgICAgICAgIGFzc2VydFRydWUoIkV4dHJhY3Rpb24gZmFpbGVkLiBObyB0cmFja3MgZm9yIHRoZSBnaXZlbiBpbnB1dCBmaWxlIiwgKHRyYWNrQ291bnQgPiAwKSk7CiAgICAgICAgIEFycmF5TGlzdDxCeXRlQnVmZmVyPiBpbnB1dEJ1ZmZlciA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBBcnJheUxpc3Q8TWVkaWFDb2RlYy5CdWZmZXJJbmZvPiBmcmFtZUluZm8gPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yIChpbnQgY3VycmVudFRyYWNrID0gMDsgY3VycmVudFRyYWNrIDwgdHJhY2tDb3VudDsgY3VycmVudFRyYWNrKyspIHsKLSAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOwogICAgICAgICAgICAgZXh0cmFjdG9yLnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7CiAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBleHRyYWN0b3IuZ2V0Rm9ybWF0KGN1cnJlbnRUcmFjayk7CiAgICAgICAgICAgICAvLyBHZXQgc2FtcGxlcyBmcm9tIGV4dHJhY3RvcgpAQCAtMTQ2LDE2MyArMTk3LDEzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZkluZm8ucHJlc2VudGF0aW9uVGltZVVzICsgIiBzaXplID0gIiArIGJ1ZkluZm8uc2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAoc2FtcGxlU2l6ZSA+IDApOwotICAgICAgICAgICAgaW50IHRpZCA9IGFuZHJvaWQub3MuUHJvY2Vzcy5teVRpZCgpOwotICAgICAgICAgICAgRmlsZSBkZWNvZGVkRmlsZSA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiL2RlY29kZXJfIiArIHRpZCArICIub3V0Iik7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGRlY29kZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlY29kZWRGaWxlKTsKICAgICAgICAgICAgIERlY29kZXIgZGVjb2RlciA9IG5ldyBEZWNvZGVyKCk7CiAgICAgICAgICAgICBkZWNvZGVyLnNldHVwRGVjb2RlcihkZWNvZGVPdXRwdXRTdHJlYW0pOwogICAgICAgICAgICAgc3RhdHVzID0gZGVjb2Rlci5kZWNvZGUoaW5wdXRCdWZmZXIsIGZyYW1lSW5mbywgZmFsc2UsIGZvcm1hdCwgIiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZWNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMgKyAiIGZvciBmaWxlOiAiICsgbUlucHV0RmlsZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGRlY29kZXJGb3JtYXQgPSBkZWNvZGVyLmdldEZvcm1hdCgpOworICAgICAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCkpIHsKKyAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQgPSBkZWNvZGVyRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWNvZGVyLmRlSW5pdENvZGVjKCk7CiAgICAgICAgICAgICBleHRyYWN0b3IudW5zZWxlY3RFeHRyYWN0b3JUcmFjayhjdXJyZW50VHJhY2spOwogICAgICAgICAgICAgaW5wdXRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgICAgIGZyYW1lSW5mby5jbGVhcigpOwotICAgICAgICAgICAgaWYgKGRlY29kZU91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGVjb2RlT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbWVkaWFDb2RlY3MgPSBDb2RlY1V0aWxzLnNlbGVjdENvZGVjcyhtaW1lLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIHN1aXRhYmxlIGNvZGVjcyBmb3VuZCBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUgKyAiIHRyYWNrIDogIiArCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayArICIgbWltZTogIiArIG1pbWUsIChtZWRpYUNvZGVjcy5zaXplKCkgPiAwKSk7Ci0gICAgICAgICAgICBCb29sZWFuW10gZW5jb2RlTW9kZSA9IHt0cnVlLCBmYWxzZX07Ci0gICAgICAgICAgICAvKiBFbmNvZGluZyB0aGUgZGVjb2RlcidzIG91dHB1dCAqLwotICAgICAgICAgICAgZm9yIChCb29sZWFuIGFzeW5jTW9kZSA6IGVuY29kZU1vZGUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjb2RlY05hbWUgOiBtZWRpYUNvZGVjcykgewotICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGVuY29kZU91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChXUklURV9PVVRQVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgb3V0RW5jb2RlRmlsZSA9IG5ldyBGaWxlKG1PdXRwdXRGaWxlUGF0aCArICJlbmNvZGVyLm91dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dEVuY29kZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBleGlzdGluZyBmaWxlIiArIG91dEVuY29kZUZpbGUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEVuY29kZUZpbGUuZGVsZXRlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGNyZWF0ZSBmaWxlIHRvIHdyaXRlIGVuY29kZXIgb3V0cHV0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLCBvdXRFbmNvZGVGaWxlLmNyZWF0ZU5ld0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRFbmNvZGVGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGaWxlIHJhd0ZpbGUgPSBuZXcgRmlsZShtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi9kZWNvZGVyXyIgKyB0aWQgKyAiLm91dCIpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3Qgb3BlbiBmaWxlIHRvIHdyaXRlIGRlY29kZWQgb3V0cHV0IiwgcmF3RmlsZS5leGlzdHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUGF0aCBvZiBkZWNvZGVkIGlucHV0IGZpbGU6ICIgKyByYXdGaWxlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBlbGVTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHJhd0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfV0lEVEgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0hFSUdIVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9GUkFNRV9SQVRFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9GUkFNRV9SQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVSYXRlIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVJhdGUgPSBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpdFJhdGUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLmNvbnRhaW5zKCJ2aWRlby8zZ3BwIikgfHwgbWltZS5jb250YWlucygidmlkZW8vbXA0di1lcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUgPSBFTkNPREVfTUlOX0JJVF9SQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUgPSBFTkNPREVfREVGQVVMVF9CSVRfUkFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0xFVkVMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQgPSBkZWNvZGVyRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1NBTVBMRV9SQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NIQU5ORUxfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUgPSBkZWNvZGVyRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qU2V0dXAgRW5jb2RlIEZvcm1hdCovCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGVuY29kZUZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogMyAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVWaWRlb0Zvcm1hdChtaW1lLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBiaXRSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFLCBwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MRVZFTCwgbGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lfRlJBTUVfSU5URVJWQUwsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX01BWF9JTlBVVF9TSVpFLCBmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCwgY29sb3JGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlQXVkaW9Gb3JtYXQobWltZSwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBiaXRSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDQwOTY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRW5jb2RlciBlbmNvZGVyID0gbmV3IEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5zZXR1cEVuY29kZXIoZW5jb2RlT3V0cHV0U3RyZWFtLCBlbGVTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbmNvZGVyLmVuY29kZShjb2RlY05hbWUsIGVuY29kZUZvcm1hdCwgbWltZSwgZnJhbWVSYXRlLCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwgYXN5bmNNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5kZUluaXRFbmNvZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05hbWUgKyAiIGVuY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yICIgKyAiZmlsZToiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiArIG1JbnB1dEZpbGUsIDAsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuZHVtcFN0YXRpc3RpY3MobUlucHV0RmlsZSwgY29kZWNOYW1lLCAoYXN5bmNNb2RlID8gImFzeW5jIiA6ICJzeW5jIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLmdldENsaXBEdXJhdGlvbigpLCBtU3RhdHNGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW5jb2RpbmcgY29tcGxldGUgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlICsgIiB3aXRoIGNvZGVjOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05hbWUgKyAiIGZvciBhU3luY01vZGUgPSAiICsgYXN5bmNNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5yZXNldEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVPdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ2xlYW51cCB0ZW1wb3JhcnkgaW5wdXQgZmlsZQotICAgICAgICAgICAgaWYgKGRlY29kZWRGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZGVjb2RlZCBmaWxlIiArIGRlY29kZWRGaWxlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRmlsZS5kZWxldGUoKSk7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZGVjb2RlZCBmaWxlIik7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXh0cmFjdG9yLmRlaW5pdEV4dHJhY3RvcigpOwogICAgICAgICBmaWxlSW5wdXQuY2xvc2UoKTsKKyAgICAgICAgZGVjb2RlT3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgQFRlc3QodGltZW91dCA9IFBFUl9URVNUX1RJTUVPVVRfTVMpCi0gICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUVuY29kZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShtSW5wdXRGaWxlUGF0aCArIG1JbnB1dEZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3QgZmluZCAiICsgbUlucHV0RmlsZSArICIgaW4gZGlyZWN0b3J5ICIgKyBtSW5wdXRGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICBpbnB1dEZpbGUuZXhpc3RzKCkpOwotICAgICAgICBpbnQgdGlkID0gYW5kcm9pZC5vcy5Qcm9jZXNzLm15VGlkKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtRGVjb2RlZEZpbGUgPSBtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi9kZWNvZGVyXyIgKyB0aWQgKyAiLm91dCI7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7Ci0gICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0gZmlsZUlucHV0LmdldEZEKCk7Ci0gICAgICAgIEV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRXh0cmFjdG9yKCk7Ci0gICAgICAgIGludCB0cmFja0NvdW50ID0gZXh0cmFjdG9yLnNldFVwRXh0cmFjdG9yKGZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0cmFjdGlvbiBmYWlsZWQuIE5vIHRyYWNrcyBmb3IgZmlsZTogIiwgdHJhY2tDb3VudCA+IDApOwotICAgICAgICBmb3IgKGludCBjdXJyZW50VHJhY2sgPSAwOyBjdXJyZW50VHJhY2sgPCB0cmFja0NvdW50OyBjdXJyZW50VHJhY2srKykgewotICAgICAgICAgICAgZXh0cmFjdG9yLnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7Ci0gICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBleHRyYWN0b3IuZ2V0Rm9ybWF0KGN1cnJlbnRUcmFjayk7Ci0gICAgICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbWVkaWFDb2RlY3MgPSBDb2RlY1V0aWxzLnNlbGVjdENvZGVjcyhtaW1lLCB0cnVlKTsKLSAgICAgICAgICAgIC8vIEVuY29kaW5nIHRoZSBkZWNvZGVyJ3Mgb3V0cHV0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgaW50IGZyYW1lU2l6ZTsKKworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1NaW1lLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gc3VpdGFibGUgY29kZWNzIGZvdW5kIGZvciBtaW1ldHlwZTogIiArIG1NaW1lLCAobWVkaWFDb2RlY3Muc2l6ZSgpID4gMCkpOworICAgICAgICBCb29sZWFuW10gZW5jb2RlTW9kZSA9IHt0cnVlLCBmYWxzZX07CisgICAgICAgIC8vIEVuY29kaW5nIHRoZSBkZWNvZGVkIGlucHV0IGZpbGUKKyAgICAgICAgZm9yIChCb29sZWFuIGFzeW5jTW9kZSA6IGVuY29kZU1vZGUpIHsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvZGVjTmFtZSA6IG1lZGlhQ29kZWNzKSB7Ci0gICAgICAgICAgICAgICAgTmF0aXZlIG5hdGl2ZUVuY29kZXIgPSBuZXcgTmF0aXZlKCk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IG5hdGl2ZUVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5FbmNvZGUobUlucHV0RmlsZVBhdGgsIG1JbnB1dEZpbGUsIG1EZWNvZGVkRmlsZSwgbVN0YXRzRmlsZSwgY29kZWNOYW1lKTsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGVuY29kZU91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKFdSSVRFX09VVFBVVCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIG91dEVuY29kZUZpbGUgPSBuZXcgRmlsZShtT3V0cHV0RmlsZVBhdGggKyAiZW5jb2Rlci5vdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dEVuY29kZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGV4aXN0aW5nIGZpbGUiICsgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFbmNvZGVGaWxlLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gY3JlYXRlIGZpbGUgdG8gd3JpdGUgZW5jb2RlciBvdXRwdXQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEVuY29kZUZpbGUudG9TdHJpbmcoKSwgb3V0RW5jb2RlRmlsZS5jcmVhdGVOZXdGaWxlKCkpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRFbmNvZGVGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZSByYXdGaWxlID0gbmV3IEZpbGUobUZpbGVEaXJQYXRoICsgbUlucHV0RmlsZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IG9wZW4gZGVjb2RlZCBpbnB1dCBmaWxlIiwgcmF3RmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlBhdGggb2YgZGVjb2RlZCBpbnB1dCBmaWxlOiAiICsgcmF3RmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGVsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmF3RmlsZSk7CisgICAgICAgICAgICAgICAgLy8gU2V0dXAgRW5jb2RlIEZvcm1hdAorICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGVuY29kZUZvcm1hdDsKKyAgICAgICAgICAgICAgICBpZiAobU1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVWaWRlb0Zvcm1hdChtTWltZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUsIEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEUpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSV9GUkFNRV9JTlRFUlZBTCwgbUlGcmFtZUludGVydmFsKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBtQml0UmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUHJvZmlsZSAhPSAtMSAmJiBtTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFLCBtUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTEVWRUwsIG1MZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSA0MDk2OworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVBdWRpb0Zvcm1hdChtTWltZSwgbVNhbXBsZVJhdGUsIG1OdW1DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBtQml0UmF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVuY29kZXIgZW5jb2RlciA9IG5ldyBFbmNvZGVyKCk7CisgICAgICAgICAgICAgICAgZW5jb2Rlci5zZXR1cEVuY29kZXIoZW5jb2RlT3V0cHV0U3RyZWFtLCBlbGVTdHJlYW0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVuY29kZXIuZW5jb2RlKGNvZGVjTmFtZSwgZW5jb2RlRm9ybWF0LCBtTWltZSwgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBmcmFtZVNpemUsIGFzeW5jTW9kZSk7CisgICAgICAgICAgICAgICAgZW5jb2Rlci5kZUluaXRFbmNvZGVyKCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNOYW1lICsgIiBlbmNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMgKyAiIGZvciAiICsgImZpbGU6IiArICIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZpbGUsIDAsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05hbWUgKyAiIGVuY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yICIgKyAibWltZToiICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1pbWUsIDAsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlucHV0UmVmZXJlbmNlOworICAgICAgICAgICAgICAgIGxvbmcgZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAobU1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRSZWZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZpbGUgKyAiXyIgKyBtV2lkdGggKyAieCIgKyBtSGVpZ2h0ICsgIl8iICsgbUJpdFJhdGUgKyAiYnBzIjsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9ICgoKGVsZVN0cmVhbS5nZXRDaGFubmVsKCkuc2l6ZSgpICsgZnJhbWVTaXplIC0gMSkgLyBmcmFtZVNpemUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFKSAqIDEwMDAwMDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRSZWZlcmVuY2UgPSBtSW5wdXRGaWxlICsgIl8iICsgbVNhbXBsZVJhdGUgKyAiaHpfIiArIG1OdW1DaGFubmVsICsgImNoXyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRSYXRlICsgImJwcyI7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbGVTdHJlYW0uZ2V0Q2hhbm5lbCgpLnNpemUoKSAvIChtU2FtcGxlUmF0ZSAqIG1OdW1DaGFubmVsKSkgKiAxMDAwMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbmNvZGVyLmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBjb2RlY05hbWUsIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMsIG1TdGF0c0ZpbGUpOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkVuY29kaW5nIGNvbXBsZXRlIGZvciBtaW1lOiAiICsgbU1pbWUgKyAiIHdpdGggY29kZWM6ICIgKyBjb2RlY05hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgYVN5bmNNb2RlID0gIiArIGFzeW5jTW9kZSk7CisgICAgICAgICAgICAgICAgZW5jb2Rlci5yZXNldEVuY29kZXIoKTsKKyAgICAgICAgICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlT3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEZpbGUgZGVjb2RlZEZpbGUgPSBuZXcgRmlsZShtRGVjb2RlZEZpbGUpOwotICAgICAgICAvLyBDbGVhbnVwIHRlbXBvcmFyeSBpbnB1dCBmaWxlCi0gICAgICAgIGlmIChkZWNvZGVkRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGRlbGV0ZSAtICIgKyBtRGVjb2RlZEZpbGUsIGRlY29kZWRGaWxlLmRlbGV0ZSgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIC0gIiArIG1EZWNvZGVkRmlsZSk7CisgICAgfQorCisgICAgQFRlc3QodGltZW91dCA9IFBFUl9URVNUX1RJTUVPVVRfTVMpCisgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUVuY29kZXIoKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1lZGlhQ29kZWNzID0gQ29kZWNVdGlscy5zZWxlY3RDb2RlY3MobU1pbWUsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBzdWl0YWJsZSBjb2RlY3MgZm91bmQgZm9yIG1pbWV0eXBlOiAiICsgbU1pbWUsIChtZWRpYUNvZGVjcy5zaXplKCkgPiAwKSk7CisgICAgICAgIGZvciAoU3RyaW5nIGNvZGVjTmFtZSA6IG1lZGlhQ29kZWNzKSB7CisgICAgICAgICAgICBOYXRpdmUgbmF0aXZlRW5jb2RlciA9IG5ldyBOYXRpdmUoKTsKKyAgICAgICAgICAgIGludCBzdGF0dXMgPSBuYXRpdmVFbmNvZGVyCisgICAgICAgICAgICAgICAgICAgIC5FbmNvZGUobUZpbGVEaXJQYXRoLCBtSW5wdXRGaWxlLCBtU3RhdHNGaWxlLCBjb2RlY05hbWUsIG1NaW1lLCBtQml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIG1JRnJhbWVJbnRlcnZhbCwgbVdpZHRoLCBtSGVpZ2h0LCBtUHJvZmlsZSwgbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29kZWNOYW1lICsgIiBlbmNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMgKyAiIGZvciAiICsgIm1pbWU6IiArICIgIiArCisgICAgICAgICAgICAgICAgICAgIG1NaW1lLCAwLCBzdGF0dXMpOwogICAgICAgICB9Ci0gICAgICAgIGZpbGVJbnB1dC5jbG9zZSgpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURlY29kZWRGaWxlcygpIHsKKyAgICAgICAgaWYgKG1EZWNvZGVkRmlsZUZ1bGxIZC5leGlzdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZUZ1bGxIZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZEZpbGVGdWxsSGQuZGVsZXRlKCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZUZ1bGxIZC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobURlY29kZWRGaWxlUWNpZi5leGlzdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZVFjaWYudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgbURlY29kZWRGaWxlUWNpZi5kZWxldGUoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlUWNpZi50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobURlY29kZWRGaWxlQXVkaW8uZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVBdWRpby50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZEZpbGVBdWRpby5kZWxldGUoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlQXVkaW8udG9TdHJpbmcoKSk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFbmNvZGVyLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwCmluZGV4IDEyNzdjOGIuLjJmNjU4ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwCkBAIC0zMCwxODkgKzMwLDgxIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogY29uc3RleHByIGludDMyX3QgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSA9IDI1OwotY29uc3RleHByIGludDMyX3QgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUgPSAxMjgwMDAgLyogMTI4IEticHMgKi87Ci1jb25zdGV4cHIgaW50MzJfdCBFTkNPREVfREVGQVVMVF9CSVRfUkFURSA9IDgwMDAwMDAgLyogOCBNYnBzICovOwotY29uc3RleHByIGludDMyX3QgRU5DT0RFX01JTl9CSVRfUkFURSA9IDYwMDAwMCAvKiA2MDAgS2JwcyAqLzsKIAogZXh0ZXJuICJDIiBKTklFWFBPUlQgaW50IEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9tZWRpYV9iZW5jaG1hcmtfbGlicmFyeV9OYXRpdmVfRW5jb2RlKAotICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIGpGaWxlUGF0aCwganN0cmluZyBqRmlsZU5hbWUsIGpzdHJpbmcgak91dEZpbGVQYXRoLAotICAgICAgICBqc3RyaW5nIGpTdGF0c0ZpbGUsIGpzdHJpbmcgakNvZGVjTmFtZSkgeworICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIGpGaWxlUGF0aCwganN0cmluZyBqRmlsZU5hbWUsIGpzdHJpbmcgalN0YXRzRmlsZSwKKyAgICAgICAganN0cmluZyBqQ29kZWNOYW1lLCBqc3RyaW5nIGpNaW1lLCBqaW50IGpCaXRSYXRlLCBqaW50IGpDb2xvckZvcm1hdCwgamludCBqRnJhbWVJbnRlcnZhbCwKKyAgICAgICAgamludCBqV2lkdGgsIGppbnQgakhlaWdodCwgamludCBqUHJvZmlsZSwgamludCBqTGV2ZWwsIGppbnQgalNhbXBsZVJhdGUsCisgICAgICAgIGppbnQgak51bUNoYW5uZWxzKSB7CisgICAgVU5VU0VEKHRoaXopOwogICAgIGNvbnN0IGNoYXIgKmZpbGVQYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIG51bGxwdHIpOwogICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIG51bGxwdHIpOwotICAgIHN0cmluZyBzRmlsZVBhdGggPSBzdHJpbmcoZmlsZVBhdGgpICsgc3RyaW5nKGZpbGVOYW1lKTsKLSAgICBVTlVTRUQodGhpeik7Ci0gICAgRklMRSAqaW5wdXRGcCA9IGZvcGVuKHNGaWxlUGF0aC5jX3N0cigpLCAicmIiKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGZpbGVOYW1lKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIGZpbGVQYXRoKTsKLSAgICBpZiAoIWlucHV0RnApIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmciKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gc3RyaW5nKGZpbGVQYXRoKSArIHN0cmluZyhmaWxlTmFtZSk7CisgICAgY29uc3QgY2hhciAqY29kZWNOYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqQ29kZWNOYW1lLCBudWxscHRyKTsKKyAgICBzdHJpbmcgc0NvZGVjTmFtZSA9IHN0cmluZyhjb2RlY05hbWUpOworICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpNaW1lLCBudWxscHRyKTsKKworICAgIGlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBlbGVTdHJlYW0ub3BlbihpbnB1dEZpbGUsIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKKyAgICBpZiAoIWVsZVN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIC0gRmlsZSBmYWlsZWQgdG8gb3BlbiBmb3IgcmVhZGluZyEiLCBmaWxlTmFtZSk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgZmlsZU5hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgRGVjb2RlciAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKCk7Ci0gICAgRXh0cmFjdG9yICpleHRyYWN0b3IgPSBkZWNvZGVyLT5nZXRFeHRyYWN0b3IoKTsKLSAgICBpZiAoIWV4dHJhY3RvcikgewotICAgICAgICBBTE9HRSgiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgIGJvb2wgYXN5bmNNb2RlWzJdID0ge3RydWUsIGZhbHNlfTsKKyAgICBmb3IgKGJvb2wgbW9kZSA6IGFzeW5jTW9kZSkgeworICAgICAgICBzaXplX3QgZWxlU2l6ZSA9IGVsZVN0cmVhbS50ZWxsZygpOworICAgICAgICBlbGVTdHJlYW0uc2Vla2coMCwgaWZzdHJlYW06OmJlZyk7CiAKLSAgICAvLyBSZWFkIGZpbGUgcHJvcGVydGllcwotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBzdGF0KHNGaWxlUGF0aC5jX3N0cigpLCAmYnVmKTsKLSAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKLSAgICBpZiAoZmlsZVNpemUgPiBrTWF4QnVmZmVyU2l6ZSkgewotICAgICAgICBBTE9HRSgiRmlsZSBzaXplIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIGJ1ZmZlciBzaXplIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50MzJfdCBmZCA9IGZpbGVubyhpbnB1dEZwKTsKLSAgICBpbnQzMl90IHRyYWNrQ291bnQgPSBleHRyYWN0b3ItPmluaXRFeHRyYWN0b3IoZmQsIGZpbGVTaXplKTsKLSAgICBpZiAodHJhY2tDb3VudCA8PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJpbml0RXh0cmFjdG9yIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgICAgICAvLyBTZXQgZW5jb2RlciBwYXJhbXMKKyAgICAgICAgZW5jUGFyYW1ldGVyIGVuY1BhcmFtczsKKyAgICAgICAgZW5jUGFyYW1zLndpZHRoID0galdpZHRoOworICAgICAgICBlbmNQYXJhbXMuaGVpZ2h0ID0gakhlaWdodDsKKyAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBqQml0UmF0ZTsKKyAgICAgICAgZW5jUGFyYW1zLmlGcmFtZUludGVydmFsID0gakZyYW1lSW50ZXJ2YWw7CisgICAgICAgIGVuY1BhcmFtcy5zYW1wbGVSYXRlID0galNhbXBsZVJhdGU7CisgICAgICAgIGVuY1BhcmFtcy5udW1DaGFubmVscyA9IGpOdW1DaGFubmVsczsKKyAgICAgICAgZW5jUGFyYW1zLmZyYW1lUmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEU7CisgICAgICAgIGVuY1BhcmFtcy5jb2xvckZvcm1hdCA9IGpDb2xvckZvcm1hdDsKKyAgICAgICAgZW5jUGFyYW1zLnByb2ZpbGUgPSBqUHJvZmlsZTsKKyAgICAgICAgZW5jUGFyYW1zLmxldmVsID0gakxldmVsOwogCi0gICAgZm9yIChpbnQgY3VyVHJhY2sgPSAwOyBjdXJUcmFjayA8IHRyYWNrQ291bnQ7IGN1clRyYWNrKyspIHsKLSAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBleHRyYWN0b3ItPnNldHVwVHJhY2tGb3JtYXQoY3VyVHJhY2spOwotICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFjayBGb3JtYXQgaW52YWxpZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgKmlucHV0QnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MoZmlsZVNpemUpOwotICAgICAgICBpZiAoIWlucHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW5zdWZmaWNpZW50IG1lbW9yeSIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHZlY3RvcjxBTWVkaWFDb2RlY0J1ZmZlckluZm8+IGZyYW1lSW5mbzsKLSAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvIGluZm87Ci0gICAgICAgIHVpbnQzMl90IGlucHV0QnVmZmVyT2Zmc2V0ID0gMDsKLQotICAgICAgICAvLyBHZXQgZnJhbWUgZGF0YQotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgc3RhdHVzID0gZXh0cmFjdG9yLT5nZXRGcmFtZVNhbXBsZShpbmZvKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgfHwgIWluZm8uc2l6ZSkgYnJlYWs7Ci0gICAgICAgICAgICAvLyBjb3B5IHRoZSBtZXRhIGRhdGEgYW5kIGJ1ZmZlciB0byBiZSBwYXNzZWQgdG8gZGVjb2RlcgotICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyT2Zmc2V0ICsgaW5mby5zaXplID4ga01heEJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiTWVtb3J5IGFsbG9jYXRlZCBub3Qgc3VmZmljaWVudCIpOwotICAgICAgICAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShpbnB1dEJ1ZmZlciArIGlucHV0QnVmZmVyT2Zmc2V0LCBleHRyYWN0b3ItPmdldEZyYW1lQnVmKCksIGluZm8uc2l6ZSk7Ci0gICAgICAgICAgICBmcmFtZUluZm8ucHVzaF9iYWNrKGluZm8pOwotICAgICAgICAgICAgaW5wdXRCdWZmZXJPZmZzZXQgKz0gaW5mby5zaXplOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBkZWNOYW1lID0gIiI7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dEZpbGVQYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqT3V0RmlsZVBhdGgsIG51bGxwdHIpOwotICAgICAgICBGSUxFICpvdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVQYXRoLCAid2IiKTsKLSAgICAgICAgaWYgKG91dEZwID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyAtIEZpbGUgZmFpbGVkIHRvIG9wZW4gZm9yIHdyaXRpbmchIiwgb3V0cHV0RmlsZVBhdGgpOwotICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZGVjb2Rlci0+c2V0dXBEZWNvZGVyKCk7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZXItPmRlY29kZShpbnB1dEJ1ZmZlciwgZnJhbWVJbmZvLCBkZWNOYW1lLCBmYWxzZSAvKmFzeW5jTW9kZSAqLywgb3V0RnApOworICAgICAgICBFbmNvZGVyICplbmNvZGVyID0gbmV3IEVuY29kZXIoKTsKKyAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7CisgICAgICAgIGF1dG8gc3RhdHVzID0gZW5jb2Rlci0+ZW5jb2RlKHNDb2RlY05hbWUsIGVsZVN0cmVhbSwgZWxlU2l6ZSwgbW9kZSwgZW5jUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4obWltZSkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkRlY29kZSByZXR1cm5lZCBlcnJvciIpOwotICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBBTE9HRSgiRW5jb2RlciByZXR1cm5lZCBlcnJvciIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0KLSAgICAgICAgQU1lZGlhRm9ybWF0ICpkZWNvZGVyRm9ybWF0ID0gZGVjb2Rlci0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gZXh0cmFjdG9yLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgaWYgKGlucHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKLSAgICAgICAgICAgIGlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgQUxPR1YoIkVuY29kaW5nIGNvbXBsZXRlIHdpdGggY29kZWMgJXMgZm9yIGFzeW5jTW9kZSA9ICVkIiwgc0NvZGVjTmFtZS5jX3N0cigpLCBtb2RlKTsKKyAgICAgICAgZW5jb2Rlci0+ZGVJbml0Q29kZWMoKTsKKyAgICAgICAgY29uc3QgY2hhciAqc3RhdHNGaWxlID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqU3RhdHNGaWxlLCBudWxscHRyKTsKKyAgICAgICAgc3RyaW5nIGlucHV0UmVmZXJlbmNlOworICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvblVzOworICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSA9IHN0cmluZyhmaWxlTmFtZSkgKyAiXyIgKyB0b19zdHJpbmcoaldpZHRoKSArICJ4IiArIHRvX3N0cmluZyhqSGVpZ2h0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIHRvX3N0cmluZyhqQml0UmF0ZSkgKyAiYnBzIjsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVTaXplID0galdpZHRoICogakhlaWdodCAqIDMgLyAyOworICAgICAgICAgICAgY2xpcER1cmF0aW9uVXMgPQorICAgICAgICAgICAgICAgICAgICAoKChlbGVTaXplICsgZnJhbWVTaXplIC0gMSkgLyBmcmFtZVNpemUpIC8gRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSkgKiAxMDAwMDAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5wdXRSZWZlcmVuY2UgPSBzdHJpbmcoZmlsZU5hbWUpICsgIl8iICsgdG9fc3RyaW5nKGpTYW1wbGVSYXRlKSArICJoel8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fc3RyaW5nKGpOdW1DaGFubmVscykgKyAiY2hfIiArIHRvX3N0cmluZyhqQml0UmF0ZSkgKyAiYnBzIjsKKyAgICAgICAgICAgIGNsaXBEdXJhdGlvblVzID0gKGVsZVNpemUgLyAoalNhbXBsZVJhdGUgKiBqTnVtQ2hhbm5lbHMpKSAqIDEwMDAwMDA7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7Ci0gICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKLSAgICAgICAgaWYgKCFtaW1lKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gQU1lZGlhRm9ybWF0X2dldFN0cmluZyIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICAgICAgZWxlU3RyZWFtLm9wZW4ob3V0cHV0RmlsZVBhdGgsIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKLSAgICAgICAgaWYgKCFlbGVTdHJlYW0uaXNfb3BlbigpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMgLSBGaWxlIGZhaWxlZCB0byBvcGVuIGZvciByZWFkaW5nISIsIG91dHB1dEZpbGVQYXRoKTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpPdXRGaWxlUGF0aCwgb3V0cHV0RmlsZVBhdGgpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjTmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgTlVMTCk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmlucHV0UmVmZXJlbmNlID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIG51bGxwdHIpOwotICAgICAgICBzdHJpbmcgc0NvZGVjTmFtZSA9IHN0cmluZyhjb2RlY05hbWUpOwotICAgICAgICBzdHJpbmcgc0lucHV0UmVmZXJlbmNlID0gc3RyaW5nKGlucHV0UmVmZXJlbmNlKTsKLQotICAgICAgICBib29sIGFzeW5jTW9kZVsyXSA9IHt0cnVlLCBmYWxzZX07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICBzaXplX3QgZWxlU2l6ZSA9IGVsZVN0cmVhbS50ZWxsZygpOwotICAgICAgICAgICAgZWxlU3RyZWFtLnNlZWtnKDAsIGlmc3RyZWFtOjpiZWcpOwotCi0gICAgICAgICAgICAvLyBHZXQgZW5jb2RlciBwYXJhbXMKLSAgICAgICAgICAgIGVuY1BhcmFtZXRlciBlbmNQYXJhbXM7Ci0gICAgICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJmVuY1BhcmFtcy53aWR0aCk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZlbmNQYXJhbXMuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsICZlbmNQYXJhbXMuZnJhbWVSYXRlKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmZW5jUGFyYW1zLmJpdHJhdGUpOwotICAgICAgICAgICAgICAgIGlmIChlbmNQYXJhbXMuYml0cmF0ZSA8PSAwIHx8IGVuY1BhcmFtcy5mcmFtZVJhdGUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuZnJhbWVSYXRlID0gRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgInZpZGVvLzNncHAiKSB8fCAhc3RyY21wKG1pbWUsICJ2aWRlby9tcDR2LWVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gRU5DT0RFX01JTl9CSVRfUkFURSAvKiA2MDAgS2JwcyAqLzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gRU5DT0RFX0RFRkFVTFRfQklUX1JBVEUgLyogOCBNYnBzICovOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgJmVuY1BhcmFtcy5wcm9maWxlKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCAmZW5jUGFyYW1zLmxldmVsKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZGVjb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMuY29sb3JGb3JtYXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmZW5jUGFyYW1zLnNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5udW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVuY29kZXIgKmVuY29kZXIgPSBuZXcgRW5jb2RlcigpOwotICAgICAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBlbmNvZGVyLT5lbmNvZGUoc0NvZGVjTmFtZSwgZWxlU3RyZWFtLCBlbGVTaXplLCBhc3luY01vZGVbaV0sIGVuY1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1pbWUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb2RlciByZXR1cm5lZCBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJFbmNvZGluZyBjb21wbGV0ZSB3aXRoIGNvZGVjICVzIGZvciBhc3luY01vZGUgPSAlZCIsIHNDb2RlY05hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIGFzeW5jTW9kZVtpXSk7Ci0gICAgICAgICAgICBlbmNvZGVyLT5kZUluaXRDb2RlYygpOwotICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhdHNGaWxlID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqU3RhdHNGaWxlLCBudWxscHRyKTsKLSAgICAgICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKHNJbnB1dFJlZmVyZW5jZSwgZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKSwgc0NvZGVjTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3luY01vZGVbaV0gPyAiYXN5bmMiIDogInN5bmMiKSwgc3RhdHNGaWxlKTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIHN0YXRzRmlsZSk7Ci0gICAgICAgICAgICBlbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKLSAgICAgICAgICAgIGRlbGV0ZSBlbmNvZGVyOwotICAgICAgICAgICAgZW5jb2RlciA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIGlmIChvdXRGcCkgewotICAgICAgICAgICAgZmNsb3NlKG91dEZwKTsKLSAgICAgICAgICAgIG91dEZwID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGlucHV0UmVmZXJlbmNlKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgY29kZWNOYW1lKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak91dEZpbGVQYXRoLCBvdXRwdXRGaWxlUGF0aCk7Ci0gICAgICAgIGlmIChmb3JtYXQpIHsKLSAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKLSAgICAgICAgICAgIGZvcm1hdCA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQpIHsKLSAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZGVjb2RlckZvcm1hdCk7Ci0gICAgICAgICAgICBkZWNvZGVyRm9ybWF0ID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBkZWNvZGVyLT5kZUluaXRDb2RlYygpOwotICAgICAgICBkZWNvZGVyLT5yZXNldERlY29kZXIoKTsKKyAgICAgICAgZW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGNsaXBEdXJhdGlvblVzLCBzQ29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZSA/ICJhc3luYyIgOiAic3luYyIpLCBzdGF0c0ZpbGUpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqU3RhdHNGaWxlLCBzdGF0c0ZpbGUpOworICAgICAgICBlbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKKyAgICAgICAgZGVsZXRlIGVuY29kZXI7CisgICAgICAgIGVuY29kZXIgPSBudWxscHRyOwogICAgIH0KLSAgICBpZiAoaW5wdXRGcCkgewotICAgICAgICBmY2xvc2UoaW5wdXRGcCk7Ci0gICAgICAgIGlucHV0RnAgPSBudWxscHRyOwotICAgIH0KLSAgICBleHRyYWN0b3ItPmRlSW5pdEV4dHJhY3RvcigpOwotICAgIGRlbGV0ZSBkZWNvZGVyOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlUGF0aCwgZmlsZVBhdGgpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgZmlsZU5hbWUpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpNaW1lLCBtaW1lKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqQ29kZWNOYW1lLCBjb2RlY05hbWUpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0VuY29kZXIuamF2YSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9FbmNvZGVyLmphdmEKaW5kZXggNDVlNTU3NC4uNzU0Y2Q4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0VuY29kZXIuamF2YQorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhCkBAIC0xNzUsMTAgKzE3NSwxMCBAQAogCiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihATm9uTnVsbCBNZWRpYUNvZGVjIG1lZGlhQ29kZWMsIEBOb25OdWxsIENvZGVjRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVkaWFDb2RlYy5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lZGlhQ29kZWMucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb2RlY0Vycm9yOiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ29kZWMgRXJyb3I6ICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7IG1Mb2NrLm5vdGlmeSgpOyB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEKaW5kZXggMzhiNjA4YS4uM2UzOTY5YyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L05hdGl2ZS5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9OYXRpdmUuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogICAgIHB1YmxpYyBuYXRpdmUgaW50IERlY29kZShTdHJpbmcgaW5wdXRGaWxlUGF0aCwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIFN0cmluZyBzdGF0c0ZpbGUsCiAgICAgICAgICAgICBTdHJpbmcgY29kZWNOYW1lLCBib29sZWFuIGFzeW5jTW9kZSk7CiAKLSAgICBwdWJsaWMgbmF0aXZlIGludCBFbmNvZGUoU3RyaW5nIGlucHV0RmlsZVBhdGgsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBTdHJpbmcgb3V0cHV0RmlsZVBhdGgsCi0gICAgICAgICAgICBTdHJpbmcgc3RhdHNGaWxlLCBTdHJpbmcgY29kZWNOYW1lKTsKKyAgICBwdWJsaWMgbmF0aXZlIGludCBFbmNvZGUoU3RyaW5nIGlucHV0RmlsZVBhdGgsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBTdHJpbmcgc3RhdHNGaWxlLAorICAgICAgICAgICAgU3RyaW5nIGNvZGVjTmFtZSwgU3RyaW5nIG1pbWUsIGludCBiaXRSYXRlLCBpbnQgY29sb3JGb3JtYXQsIGludCBmcmFtZUludGVydmFsLAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcHJvZmlsZSwgaW50IGxldmVsLCBpbnQgc2FtcGxlUmF0ZSwgaW50IG51bUNoYW5uZWwpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS5tZCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9SRUFETUUubWQKaW5kZXggMDVmYmU2Zi4uMDQ3YzI4OSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS5tZAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kCkBAIC0xLDcgKzEsNyBAQAogIyBCZW5jaG1hcmsgdGVzdHMKIAogQmVuY2htYXJrIGFwcCBhbmFseXNlcyB0aGUgdGltZSB0YWtlbiBieSBNZWRpYUNvZGVjLCBNZWRpYUV4dHJhY3RvciBhbmQgTWVkaWFNdXhlciBmb3IgZ2l2ZW4gc2V0IG9mIGlucHV0cy4gSXQgaXMgdXNlZCB0byBiZW5jaG1hcmsgdGhlc2UgbW9kdWxlcyBvbiBhbmRyb2lkIGRldmljZXMuCi1CZW5jaG1hcmsgcmVzdWx0cyBhcmUgZW1pdHRlZCB0byBsb2djYXQuCitCZW5jaG1hcmsgcmVzdWx0cyBhcmUgcHVibGlzaGVkIGFzIGEgQ1NWIHJlcG9ydC4KIAogVGhpcyBwYWdlIGRlc2NyaWJlcyBzdGVwcyB0byBydW4gdGhlIE5ESyBhbmQgU0RLIGxheWVyIHRlc3QuCiAKQEAgLTEwLDM1ICsxMCw0OSBAQAogbW1tIGZyYW1ld29ya3MvYXYvbWVkaWEvdGVzdHMvYmVuY2htYXJrLwogYGBgCiAKLSMgTkRLCi0KLVRvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBuYXRpdmUgbGF5ZXIsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCi1UaGUgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvCi0KLWFkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvKiAvZGF0YS9sb2NhbC90bXAvCi0KLUVnLiBhZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdDY0L2V4dHJhY3RvclRlc3QvZXh0cmFjdG9yVGVzdCAvZGF0YS9sb2NhbC90bXAvCi0KLVRvIHJ1biB0aGUgYmluYXJ5LCBmb2xsb3cgdGhlIGNvbW1hbmRzIG1lbnRpb25lZCBiZWxvdyB1bmRlciBlYWNoIG1vZHVsZS4KLQotVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL2RyaXZlLmdvb2dsZS5jb20vb3Blbj9pZD0xZ2hNcjE3QkJKN24wcHFibTdvUkVpVE5fTU5lbUpVcXkpCisjIFJlc291cmNlcworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFyay56aXApCiAKIERvd25sb2FkIHRoZSBNZWRpYUJlbmNobWFyay56aXAgZmlsZSwgdW56aXAgYW5kIHB1c2ggaXQgdG8gL2RhdGEvbG9jYWwvdG1wLyBvbiB0aGUgZGV2aWNlLgogCiBgYGAKIHVuemlwIE1lZGlhQmVuY2htYXJrLnppcAotYWRiIHB1c2ggTWVkaWFCZW5jaG1hcmsgL2RhdGEvbG9jYWwvdG1wCithZGIgcHVzaCBNZWRpYUJlbmNobWFyayAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCiAKK1RoZSByZXNvdXJjZSBmaWxlcyBhcmUgYXNzdW1lZCB0byBiZSBhdCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLy4gWW91IGNhbiB1c2UgYSBkaWZmZXJlbnQgbG9jYXRpb24sIGJ1dCB5b3UgaGF2ZSB0byBtb2RpZnkgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB0byByZXBsYWNlIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvIHdpdGggd2hlcmV2ZXIgeW91IGNob3NlIHRvIHB1dCB0aGUgZmlsZXMuCisKKyMgTkRLIENMSSBUZXN0cworTm90ZTogW0JlbmNobWFyayBBcHBsaWNhdGlvbl0oI0JlbmNobWFya0FwcGxpY2F0aW9uKSBub3cgc3VwcG9ydHMgcHJvZmlsaW5nIGJvdGggU0RLIGFuZCBOREsgQVBJcyBhbmQgdGhhdCBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBiZW5jaG1hcmsgY29kZWNzCisKK1RvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBuYXRpdmUgbGF5ZXIsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdDY0LyogL2RhdGEvbG9jYWwvdG1wLy4gRm9yIGV4YW1wbGUKKworYGBgCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdDY0L2V4dHJhY3RvclRlc3QvZXh0cmFjdG9yVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdC8qIC9kYXRhL2xvY2FsL3RtcC8uIEZvciBleGFtcGxlCisKK2BgYAorYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3QvZXh0cmFjdG9yVGVzdC9leHRyYWN0b3JUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyBydW4gdGhlIGJpbmFyeSwgZm9sbG93IHRoZSBjb21tYW5kcyBtZW50aW9uZWQgYmVsb3cgdW5kZXIgZWFjaCBtb2R1bGUuCisKICMjIEV4dHJhY3RvcgogCiBUaGUgdGVzdCBleHRyYWN0cyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZXh0cmFjdG9ycyBhdmFpbGFibGUgaW4gTkRLLgogCi1UaGUgcmVzb3VyY2UgZmlsZXMgYXJlIGFzc3VtZWQgdG8gYmUgYXQgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8uIFlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IGxvY2F0aW9uLCBidXQgeW91IGhhdmUgdG8gbW9kaWZ5IHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbnMgdG8gcmVwbGFjZSAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLyB3aXRoIHdoZXJldmVyIHlvdSBjaG9zZSB0byBwdXQgdGhlIGZpbGVzLgotCi1UaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciB0aGUgdGVzdC4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL2V4dHJhY3RvclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYApAQCAtNDcsOCArNjEsNiBAQAogCiBUaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZGVjb2RlcnMgYXZhaWxhYmxlIGluIE5ESy4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgZXh0cmFjdG9yLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvZGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYApAQCAtNTcsOCArNjksNiBAQAogCiBUaGUgdGVzdCBtdXhlcyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgbXV4ZXJzIGF2YWlsYWJsZSBpbiBOREsuCiAKLVNldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIGV4dHJhY3Rvci4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL211eGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCkBAIC02Nyw1NSArNzcsODIgQEAKIAogVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBOREsuCiAKLVNldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIGV4dHJhY3Rvci4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL2VuY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKIAotIyBTREsKKyMgPGEgbmFtZT0iQmVuY2htYXJrQXBwbGljYXRpb24iPjwvYT4gQmVuY2htYXJrIEFwcGxpY2F0aW9uCitUbyBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBvZiB0aGUgU0RLIGFuZCBOREsgQVBJcywgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6CitCZW5jaG1hcmsgQXBwbGljYXRpb24gY2FuIGJlIHJ1biBpbiB0d28gd2F5cy4KIAotVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIFNESyBBUElzLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKKyMjIFN0ZXBzIHRvIHJ1biB3aXRoIGF0ZXN0CitOb3RlIHRoYXQgYXRlc3QgY29tbWFuZCB3aWxsIGluc3RhbGwgQmVuY2htYXJrIGFwcGxpY2F0aW9uIGFuZCBwdXNoIHRoZSByZXF1aXJlZCB0ZXN0IGZpbGVzIHRvIHRoZSBkZXZpY2UgYXMgd2VsbC4KKworRm9yIHJ1bm5pbmcgYWxsIHRoZSB0ZXN0cywgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZAorYGBgCithdGVzdCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCisKK0ZvciBydW5uaW5nIHRoZSB0ZXN0cyBpbmRpdmlkdWFsbHksIHJ1biB0aGUgZm9sbG93aW5nIGF0ZXN0IGNvbW1hbmRzOgorCitgYGAKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5FeHRyYWN0b3JUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5EZWNvZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCithdGVzdCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuTXV4ZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5FbmNvZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKKworIyMgU3RlcHMgdG8gcnVuIHdpdGhvdXQgYXRlc3QKIAogVGhlIGFwayB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIGZvbGxvd2luZyBwYXRoOgotJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybTY0LwogCi1UbyBnZXQgdGhlIHJlc29yY2UgZmlsZXMgZm9yIHRoZSB0ZXN0IGZvbGxvdyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gW05ES10oI05ESykKK1RoZSA2NC1iaXQgYXBrIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOgorJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybTY0LwogCiBGb3IgaW5zdGFsbGluZyB0aGUgYXBrLCBydW4gdGhlIGNvbW1hbmQ6CiBgYGAKIGFkYiBpbnN0YWxsIC1mIC1yICRPVVQvdGVzdGNhc2VzL01lZGlhQmVuY2htYXJrVGVzdC9hcm02NC9NZWRpYUJlbmNobWFya1Rlc3QuYXBrCiBgYGAKIAotRm9yIHJ1bm5pbmcgYWxsIHRoZSB0ZXN0cywgcnVuIHRoZSBjb21tYW5kOgorVGhlIDMyLWJpdCBhcGsgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6CiskT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtLworCitGb3IgaW5zdGFsbGluZyB0aGUgYXBrLCBydW4gdGhlIGNvbW1hbmQ6CitgYGAKK2FkYiBpbnN0YWxsIC1mIC1yICRPVVQvdGVzdGNhc2VzL01lZGlhQmVuY2htYXJrVGVzdC9hcm0vTWVkaWFCZW5jaG1hcmtUZXN0LmFwaworYGBgCisKK1RvIGdldCB0aGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoZSB0ZXN0IGZvbGxvdyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gW1Jlc291cmNlc10oI1Jlc291cmNlcykKKworRm9yIHJ1bm5pbmcgYWxsIHRoZSB0ZXN0cywgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZAogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKIAogIyMgRXh0cmFjdG9yCiAKLVRoZSB0ZXN0IGV4dHJhY3RzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBleHRyYWN0b3JzIGF2YWlsYWJsZSBpbiBTREsuCitUaGUgdGVzdCBleHRyYWN0cyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZXh0cmFjdG9ycyBhdmFpbGFibGUgaW4gU0RLIGFuZCBOREsuCiBgYGAKIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1yIC1lIGNsYXNzICdjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuRXh0cmFjdG9yVGVzdCcgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogYGBgCiAKICMjIERlY29kZXIKIAotVGhlIHRlc3QgZGVjb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGRlY29kZXJzIGF2YWlsYWJsZSBpbiBTREsuCitUaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZGVjb2RlcnMgYXZhaWxhYmxlIGluIFNESyBhbmQgTkRLLgogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkRlY29kZXJUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKIAogIyMgTXV4ZXIKIAotVGhlIHRlc3QgbXV4ZXMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgZGlmZmVyZW50IHdyaXRlcnMgYXZhaWxhYmxlIGluIFNESy4KK1RoZSB0ZXN0IG11eGVzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIGRpZmZlcmVudCB3cml0ZXJzIGF2YWlsYWJsZSBpbiBTREsgYW5kIE5ESy4KIGBgYAogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJ2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5NdXhlclRlc3QnIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIGBgYAogCiAjIyBFbmNvZGVyCiAKLVRoZSB0ZXN0IGVuY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBlbmNvZGVycyBhdmFpbGFibGUgaW4gU0RLLgorVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBTREsgYW5kIE5ESy4KIGBgYAogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJ2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5FbmNvZGVyVGVzdCcgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogYGBgCkBAIC0xMjQsMjQgKzE2MSwyNyBAQAogVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIGNvZGVjMiBsYXllciwgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAKIFRoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKIFRoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KIAogVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0NjQvKiAvZGF0YS9sb2NhbC90bXAvCi1FZy4gYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdDY0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKK2FkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3Q2NC9DMkRlY29kZXJUZXN0L0MyRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCiAKIFRvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KIGFkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3QvKiAvZGF0YS9sb2NhbC90bXAvCi1FZy4gYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdC9DMkRlY29kZXJUZXN0L0MyRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCithZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKIAotVG8gZ2V0IHRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhlIHRlc3QgZm9sbG93IGluc3RydWN0aW9ucyBnaXZlbiBpbiBbTkRLXSgjTkRLKQorVG8gZ2V0IHRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhlIHRlc3QgZm9sbG93IGluc3RydWN0aW9ucyBnaXZlbiBpbiBbUmVzb3VyY2VzXSgjUmVzb3VyY2VzKQogCiAjIyBDMiBEZWNvZGVyCiAKIFRoZSB0ZXN0IGRlY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBjb2RlYzIgZGVjb2RlcnMgYXZhaWxhYmxlIGluIGRldmljZS4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgW2V4dHJhY3Rvcl0oI2V4dHJhY3RvcikuCi0KIGBgYAogYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9DMkRlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKQEAgLTE0OSw4ICsxODksOTUgQEAKIAogVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGNvZGVjMiBlbmNvZGVycyBhdmFpbGFibGUgaW4gZGV2aWNlLgogCi1TZXR1cCBzdGVwcyBhcmUgc2FtZSBhcyBbZXh0cmFjdG9yXSgjZXh0cmFjdG9yKS4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0MyRW5jb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYAorCisjIEFuYWx5c2lzCisKK1RoZSBiZW5jaG1hcmsgcmVzdWx0cyBhcmUgc3RvcmVkIGluIGEgQ1NWIGZpbGUgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGFuYWx5c2lzLiBUaGVzZSByZXN1bHRzIGFyZSBzdG9yZWQgaW4gZm9sbG93aW5nIGZvcm1hdDoKKzxhcHAgZGlyZWN0b3J5Pi88bW9kdWxlX25hbWU+Ljx0aW1lc3RhbXA+LmNzdgorCitOb3RlOiBUaGlzIHRpbWVzdGFtcCBpcyBpbiBuYW5vIHNlY29uZHMgYW5kIHdpbGwgY2hhbmdlIGJhc2VkIG9uIGN1cnJlbnQgc3lzdGVtIHRpbWUuCisKK1RvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBDU1YgZmlsZSwgbG9vayBmb3IgdGhlIHBhdGggaW4gbG9ncy4gRXhhbXBsZSBsb2cgYmVsb3cgLQorCitgYGAKK2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyayBEL0RlY29kZXJUZXN0OiBTYXZpbmcgQmVuY2htYXJrIHJlc3VsdHMgaW46IC9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9maWxlcy9EZWNvZGVyLjE1ODc3MzIzOTUzODcuY3N2CitgYGAKKworVGhpcyBmaWxlIGNhbiBiZSBwdWxsZWQgZnJvbSB0aGUgZGV2aWNlIHVzaW5nICJhZGIgcHVsbCIgY29tbWFuZC4KK2BgYAorYWRiIHB1bGwgL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2ZpbGVzL0RlY29kZXIuMTU4NzczMjM5NTM4Ny5jc3YgLi9EZWNvZGVyLjE1ODc3MzIzOTUzODcuY3N2CitgYGAKKworIyMgQ1NWIENvbHVtbnMKKworRm9sbG93aW5nIGNvbHVtbnMgYXJlIGF2YWlsYWJsZSBpbiBDU1YuCisKK05vdGU6IEFsbCB0aW1lIHZhbHVlcyBhcmUgaW4gbmFubyBzZWNvbmRzCisKKzEuICoqY3VycmVudFRpbWUqKiA6IFRoZSB0aW1lIHJlY29yZGVkIGF0IHRoZSBjcmVhdGlvbiBvZiB0aGUgc3RhdHMuIFRoaXMgbWF5IGJlIHVzZWQgdG8gZXN0aW1hdGUgdGltZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIHRlc3QgY2xpcHMuCisKKzIuICoqZmlsZU5hbWUqKjogVGhlIGZpbGUgYmVpbmcgdXNlZCBhcyBhbiBpbnB1dCBmb3IgdGhlIGJlbmNobWFyayB0ZXN0LgorCiszLiAqKm9wZXJhdGlvbioqOiBUaGUgY3VycmVudCBvcGVyYXRpb24gb24gdGhlIGlucHV0IHRlc3QgdmVjdG9yIGkuZS4gRXh0cmFjdC9NdXgvRW5jb2RlL0RlY29kZS4KKworNC4gKipOREsvU0RLKio6IFRoZSB0YXJnZXQgQVBJcyBpLmUuIEFNZWRpYSB2cyBNZWRpYSBjYWxscyBmb3IgdGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQuCisKKzUuICoqc3luYy9hc3luYyoqOiBUaGlzIGlzIHNwZWNpZmljIHRvIE1lZGlhQ29kZWMgb2JqZWN0cyAoaS5lLiBFbmNvZGVyIGFuZCBEZWNvZGVyKS4gSXQgc3BlY2lmaWVzIHRoZSBtb2RlIGluIHdoaWNoIE1lZGlhQ29kZWMgQVBJcyBhcmUgd29ya2luZy4gRm9yIGFzeW5jIG1vZGUsIGNhbGxiYWNrcyBhcmUgc2V0LiBGb3Igc3luYyBtb2RlLCB3ZSBoYXZlIHRvIHBvbGwgdGhlIGRlcXVldWVCdWZmZXIgQVBJcyB0byBxdWV1ZSBhbmQgZGVxdWV1ZSBpbnB1dCBvdXRwdXQgYnVmZmVycyByZXNwZWN0aXZlbHkuCisKKzYuICoqc2V0dXBUaW1lKio6IFRoZSB0aW1lIHRha2VuIHRvIHNldCB1cCB0aGUgTWVkaWFFeHRyYWN0b3IvTXV4ZXIvQ29kZWMgaW5zdGFuY2UuCisKKyAgICAqIE1lZGlhQ29kZWM6IGluY2x1ZGVzIHNldHRpbmcgYXN5bmMvc3luYyBtb2RlLCBjb25maWd1cmluZyB3aXRoIGEgZm9ybWF0IGFuZCBjb2RlYy5zdGFydAorCisgICAgKiBNZWRpYUV4dHJhY3RvcjogaW5jbHVkZXMgQU1lZGlhRXh0cmFjdG9yX25ldyBhbmQgc2V0RGF0YVNvdXJjZS4KKworICAgICogTWVkaWFNdXhlcjogaW5jbHVkZXMgY3JlYXRpbmcgdGhlIG9iamVjdCwgYWRkaW5nIHRyYWNrLCBhbmQgc3RhcnRpbmcgdGhlIG11eGVyLgorCis3LiAqKmRlc3Ryb3lUaW1lKio6IFRoZSB0aW1lIHRha2VuIHRvIHN0b3AgYW5kIGNsb3NlIE1lZGlhRXh0cmFjdG9yL011eGVyL0NvZGVjIGluc3RhbmNlLgorCis4LiAqKm1pbmltdW1UaW1lKio6IFRoZSBtaW5pbXVtIHRpbWUgdGFrZW4gdG8gZXh0cmFjdC9tdXgvZW5jb2RlL2RlY29kZSBhIGZyYW1lLgorCis5LiAqKm1heGltdW1UaW1lKio6IFRoZSBtYXhpbXVtIHRpbWUgdGFrZW4gdG8gZXh0cmFjdC9tdXgvZW5jb2RlL2RlY29kZSBhIGZyYW1lLgorCisxMC4gKiphdmVyYWdlVGltZSoqOiBBdmVyYWdlIHRpbWUgdGFrZW4gdG8gZXh0cmFjdC9tdXgvZW5jb2RlL2RlY29kZSBwZXIgZnJhbWUuCisKKyAgICAqIE1lZGlhQ29kZWM6IGNvbXB1dGVkIGFzIHRoZSB0b3RhbCB0aW1lIHRha2VuIHRvIGVuY29kZS9kZWNvZGUgYWxsIGZyYW1lcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIGVuY29kZWQvZGVjb2RlZC4KKworICAgICogTWVkaWFFeHRyYWN0b3I6IGNvbXB1dGVkIGFzIHRoZSB0b3RhbCB0aW1lIHRha2VuIHRvIGV4dHJhY3QgYWxsIGZyYW1lcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIGV4dHJhY3RlZC4KKworICAgICogTWVkaWFNdXhlcjogY29tcHV0ZWQgYXMgdGhlIHRvdGFsIHRpbWUgdGFrZW4gdG8gbXV4IGFsbCBmcmFtZXMgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBtdXhlZC4KKworMTEuICoqdGltZVRvUHJvY2VzczFTZWNDb250ZW50Kio6IFRoZSB0aW1lIHJlcXVpcmVkIHRvIHByb2Nlc3Mgb25lIHNlY29uZCB3b3J0aCBpbnB1dCBkYXRhLgorCisxMi4gKip0b3RhbEJ5dGVzUHJvY2Vzc2VkUGVyU2VjKio6IFRoZSBudW1iZXIgb2YgYnl0ZXMgZXh0cmFjdGVkL211eGVkL2RlY29kZWQvZW5jb2RlZCBwZXIgc2Vjb25kLgorCisxMy4gKip0aW1lVG9GaXJzdEZyYW1lKio6IFRoZSB0aW1lIHRha2VuIHRvIHJlY2VpdmUgdGhlIGZpcnN0IG91dHB1dCBmcmFtZS4KKworMTQuICoqdG90YWxTaXplSW5CeXRlcyoqOiBUaGUgdG90YWwgb3V0cHV0IHNpemUgb2YgdGhlIG9wZXJhdGlvbiAoaW4gYnl0ZXMpLgorCisxNS4gKip0b3RhbFRpbWUqKjogVGhlIHRpbWUgdGFrZW4gdG8gcGVyZm9ybSB0aGUgY29tcGxldGUgb3BlcmF0aW9uIChpLmUuIEV4dHJhY3QvTXV4L0RlY29kZS9FbmNvZGUpIGZvciByZXNwZWN0aXZlIHRlc3QgdmVjdG9yLgorCisKKyMjIE11eGVyCisxLiAqKmNvbXBvbmVudE5hbWUqKjogVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IE1lZGlhIGZpbGUuIEZvbGxvd2luZyBtdXhlcnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisgICAgICogT2dnLCBXZWJtLCAzZ3BwLCBhbmQgbXA0LgorCisjIyBEZWNvZGVyCisxLiAqKmNvbXBvbmVudE5hbWUqKjogSW5jbHVkZXMgYWxsIHN1cHBvcnRlZCBjb2RlY3Mgb24gdGhlIGRldmljZS4gQWxpYXNlZCBjb21wb25lbnRzIGFyZSBza2lwcGVkLgorICAgICogICBWaWRlbzogSDI2MywgSDI2NCwgSDI2NSwgVlB4LCBNcGVnNCwgTXBlZzIsIEFWMQorICAgICogICBBdWRpbzogQUFDLCBGbGFjLCBPcHVzLCBNUDMsIFZvcmJpcywgR1NNLCBBTVItTkIvV0IKKworIyMgRW5jb2RlcgorMS4gKipjb21wb25lbnROYW1lKio6IEluY2x1ZGVzIGFsbCBzdXBwb3J0ZWQgY29kZWNzIG9uIHRoZSBkZXZpY2UuIEFsaWFzZWQgY29tcG9uZW50cyBhcmUgc2tpcHBlZC4KKyAgICAqICAgVmlkZW86IEgyNjMsIEgyNjQsIEgyNjUsIFZQeCwgTXBlZzQKKyAgICAqICAgQXVkaW86IEFBQywgRmxhYywgT3B1cywgQU1SLU5CL1dCCisKKyMjIENvbW1vbiBGYWlsdXJlcworT24gc29tZSBkZXZpY2VzLCBpZiBhIGNvZGVjIGlzbid0IHN1cHBvcnRlZCBzb21lIHRlc3RzIG1heSByZXBvcnQgYSBmYWlsdXJlIGxpa2UgImNvZGVjIG5vdCBmb3VuZCBmb3IiCisKK0ZvciBleGFtcGxlOiBPbiBtb2JpbGUgZGV2aWNlcyB3aXRob3V0IHN1cHBvcnQgZm9yIG1wZWcyIGRlY29kZXIsIGZvbGxvd2luZyBmYWlsdXJlIGlzIG9ic2VydmVkOgorYGBgCitVbmFibGUgdG8gY3JlYXRlIGNvZGVjIGJ5IG1pbWU6IHZpZGVvL21wZWcyCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmNwcAppbmRleCAyMGExNDY4Li40NmM0YTdjIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwCkBAIC0xNTYsOSArMTU2LDExIEBACiAgICAgbVN0YXRzLT5zZXREZUluaXRUaW1lKHRpbWVUYWtlbik7CiB9CiAKLXZvaWQgQzJEZWNvZGVyOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcykgewordm9pZCBDMkRlY29kZXI6OmR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzLCBzdHJpbmcgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdHNGaWxlKSB7CiAgICAgc3RyaW5nIG9wZXJhdGlvbiA9ICJjMmRlY29kZSI7Ci0gICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzKTsKKyAgICBzdHJpbmcgbW9kZSA9ICJhc3luYyI7CisgICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzLCBjb21wb25lbnROYW1lLCBtb2RlLCBzdGF0c0ZpbGUpOwogfQogCiB2b2lkIEMyRGVjb2Rlcjo6cmVzZXREZWNvZGVyKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmgKaW5kZXggNGEzZWI5Ni4uZmIzNWE2NiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5oCkBAIC0zMSw3ICszMSw4IEBACiAKICAgICB2b2lkIGRlSW5pdENvZGVjKCk7CiAKLSAgICB2b2lkIGR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzKTsKKyAgICB2b2lkIGR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzLCBzdHJpbmcgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0c0ZpbGUpOwogCiAgICAgdm9pZCByZXNldERlY29kZXIoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuY3BwCmluZGV4IDMzNDI5ZWYuLjZhNTBkNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAKQEAgLTI1MSw5ICsyNTEsMTEgQEAKICAgICBtU3RhdHMtPnNldERlSW5pdFRpbWUodGltZVRha2VuKTsKIH0KIAotdm9pZCBDMkVuY29kZXI6OmR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzKSB7Cit2b2lkIEMyRW5jb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0c0ZpbGUpIHsKICAgICBzdHJpbmcgb3BlcmF0aW9uID0gImMyZW5jb2RlIjsKLSAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIGR1cmF0aW9uVXMpOworICAgIHN0cmluZyBtb2RlID0gImFzeW5jIjsKKyAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIGR1cmF0aW9uVXMsIGNvbXBvbmVudE5hbWUsIG1vZGUsIHN0YXRzRmlsZSk7CiB9CiAKIHZvaWQgQzJFbmNvZGVyOjpyZXNldEVuY29kZXIoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuaAppbmRleCBhNGNhMDk3Li43YTAyMWY0IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5oCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmgKQEAgLTQ0LDcgKzQ0LDggQEAKIAogICAgIHZvaWQgZGVJbml0Q29kZWMoKTsKIAotICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMpOworICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSk7CiAKICAgICB2b2lkIHJlc2V0RW5jb2RlcigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmNwcAppbmRleCAyNmZiMWI5Li4xNWM0NzlkIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5jcHAKQEAgLTIwMywxMyArMjAzLDEzIEBACiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBtUGFyYW1zLndpZHRoKTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBtUGFyYW1zLmhlaWdodCk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIG1QYXJhbXMuZnJhbWVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwgbVBhcmFtcy5pRnJhbWVJbnRlcnZhbCk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBtUGFyYW1zLmJpdHJhdGUpOwotICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMLCAxKTsKLSAgICAgICAgaWYgKG1QYXJhbXMucHJvZmlsZSAmJiBtUGFyYW1zLmxldmVsKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwgbVBhcmFtcy5jb2xvckZvcm1hdCk7CisgICAgICAgIGlmIChtUGFyYW1zLnByb2ZpbGUgIT0gLTEgJiYgbVBhcmFtcy5sZXZlbCAhPSAtMSkgewogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgbVBhcmFtcy5wcm9maWxlKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCBtUGFyYW1zLmxldmVsKTsKICAgICAgICAgfQotICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQsIG1QYXJhbXMuY29sb3JGb3JtYXQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtUGFyYW1zLnNhbXBsZVJhdGUpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtUGFyYW1zLm51bUNoYW5uZWxzKTsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmgKaW5kZXggNWFkMTQyYi4uMzI0MzE3YyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmgKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmgKQEAgLTIzLDEwICsyMywxMSBAQAogI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHRocmVhZD4KIAotI2luY2x1ZGUgIm1lZGlhL05ka0ltYWdlLmgiCiAjaW5jbHVkZSAiQmVuY2htYXJrQ29tbW9uLmgiCiAjaW5jbHVkZSAiU3RhdHMuaCIKIAorLy8gY29uc3RhbnQgbm90IGRlZmluZWQgaW4gTkRLIGFwaQorY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgPSAweDdGNDIwODg4OwogCiBzdHJ1Y3QgZW5jUGFyYW1ldGVyIHsKICAgICBpbnQzMl90IGJpdHJhdGUgPSAtMTsKQEAgLTM4LDkgKzM5LDEwIEBACiAgICAgaW50MzJfdCB3aWR0aCA9IDA7CiAgICAgaW50MzJfdCBoZWlnaHQgPSAwOwogICAgIGludDMyX3QgZnJhbWVSYXRlID0gLTE7Ci0gICAgaW50MzJfdCBwcm9maWxlID0gMDsKLSAgICBpbnQzMl90IGxldmVsID0gMDsKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4ODsKKyAgICBpbnQzMl90IGlGcmFtZUludGVydmFsID0gMDsKKyAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKKyAgICBpbnQzMl90IGxldmVsID0gLTE7CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOwogfTsKIAogY2xhc3MgRW5jb2RlciA6IHB1YmxpYyBDYWxsQmFja0hhbmRsZSB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgKaW5kZXggYWUyZWVlMS4uNGVkYjA0OCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0JlbmNobWFya1Rlc3RFbnZpcm9ubWVudC5oCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9CZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaApAQCAtMjUsNyArMjUsOSBAQAogCiBjbGFzcyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CiAgIHB1YmxpYzoKLSAgICBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL3NkY2FyZC9tZWRpYS8iKSB7fQorICAgIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpCisgICAgICAgIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLyIpLAorICAgICAgICAgIHN0YXRzRmlsZSgiL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy9zdGF0cy5jc3YiKSB7fQogCiAgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQKICAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CkBAIC0zNCw4ICszNiwxNSBAQAogCiAgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQogCisgICAgdm9pZCBzZXRTdGF0c0ZpbGUoY29uc3Qgc3RyaW5nIG1vZHVsZSkgeyBzdGF0c0ZpbGUgPSBnZXRSZXMoKSArIG1vZHVsZTsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFN0YXRzRmlsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRzRmlsZTsgfQorCisgICAgYm9vbCB3cml0ZVN0YXRzSGVhZGVyKCk7CisKICAgcHJpdmF0ZToKICAgICBzdHJpbmcgcmVzOworICAgIHN0cmluZyBzdGF0c0ZpbGU7CiB9OwogCiBpbnQgQmVuY2htYXJrVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CkBAIC03MCw0ICs3OSwyNiBAQAogICAgIHJldHVybiAwOwogfQogCisvKioKKyAqIFdyaXRlcyB0aGUgc3RhdHMgaGVhZGVyIHRvIGEgZmlsZQorICogPHA+CisgKiBccGFyYW0gc3RhdHNGaWxlICAgIGZpbGUgd2hlcmUgdGhlIHN0YXRzIGRhdGEgaXMgdG8gYmUgd3JpdHRlbgorICoqLworYm9vbCBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQ6OndyaXRlU3RhdHNIZWFkZXIoKSB7CisgICAgY2hhciBzdGF0c0hlYWRlcltdID0KKyAgICAgICAgImN1cnJlbnRUaW1lLCBmaWxlTmFtZSwgb3BlcmF0aW9uLCBjb21wb25lbnROYW1lLCBOREsvU0RLLCBzeW5jL2FzeW5jLCBzZXR1cFRpbWUsICIKKyAgICAgICAgImRlc3Ryb3lUaW1lLCBtaW5pbXVtVGltZSwgbWF4aW11bVRpbWUsIGF2ZXJhZ2VUaW1lLCB0aW1lVG9Qcm9jZXNzMVNlY0NvbnRlbnQsICIKKyAgICAgICAgInRvdGFsQnl0ZXNQcm9jZXNzZWRQZXJTZWMsIHRpbWVUb0ZpcnN0RnJhbWUsIHRvdGFsU2l6ZUluQnl0ZXMsIHRvdGFsVGltZVxuIjsKKyAgICBGSUxFICpmcFN0YXRzID0gZm9wZW4oc3RhdHNGaWxlLmNfc3RyKCksICJ3Iik7CisgICAgaWYoIWZwU3RhdHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IG51bUJ5dGVzID0gZndyaXRlKHN0YXRzSGVhZGVyLCBzaXplb2YoY2hhciksIHNpemVvZihzdGF0c0hlYWRlciksIGZwU3RhdHMpOworICAgIGZjbG9zZShmcFN0YXRzKTsKKyAgICBpZihudW1CeXRlcyAhPSBzaXplb2Yoc3RhdHNIZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKICNlbmRpZiAgLy8gX19CRU5DSE1BUktfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcAppbmRleCBkZWRjNzQzLi44NWRjYmMxIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJEZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRGVjb2RlclRlc3QuY3BwCkBAIC0xMzYsNyArMTM2LDggQEAKICAgICAgICAgICAgICAgICBtRGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJjb2RlYyA6ICVzIiwgY29kZWNOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBtRGVjb2Rlci0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgZHVyYXRpb25VcywgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgICAgICAgICAgbURlY29kZXItPnJlc2V0RGVjb2RlcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNzgsNiArMTc5LDkgQEAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwogICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIkMyRGVjb2Rlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CiAgICAgICAgIEFMT0dWKCJDMiBEZWNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwCmluZGV4IDk4ZWIxN2EuLmIxOGQ4NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkVuY29kZXJUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJFbmNvZGVyVGVzdC5jcHAKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKLSAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gImRlY29kZS5vdXQiOworICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiL2RhdGEvbG9jYWwvdG1wL2RlY29kZS5vdXQiOwogICAgICAgICBGSUxFICpvdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksICJ3YiIpOwogICAgICAgICBBU1NFUlRfTkUob3V0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSIgPDwgb3V0cHV0RmlsZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBkdW1waW5nIGRlY29kZXIncyBvdXRwdXQiOwpAQCAtMTQwLDcgKzE0MCw4IEBACiAgICAgICAgICAgICAgICAgbUVuY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgbUVuY29kZXItPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QsIGR1cmF0aW9uVXMsIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTgwLDYgKzE4MSw5IEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJDMkVuY29kZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICAgICAgICBBTE9HVigiQzIgRW5jb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCmluZGV4IDlmOTZkM2IuLjgxZWYwMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcApAQCAtODQsNyArODQsOCBAQAogICAgICAgICBkZWNvZGVyLT5kZUluaXRDb2RlYygpOwogICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKICAgICAgICAgc3RyaW5nIGlucHV0UmVmZXJlbmNlID0gZ2V0PDA+KHBhcmFtcyk7Ci0gICAgICAgIGRlY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlKTsKKyAgICAgICAgZGVjb2Rlci0+ZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGNvZGVjTmFtZSwgKGFzeW5jTW9kZSA/ICJhc3luYyIgOiAic3luYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwogICAgICAgICBkZWNvZGVyLT5yZXNldERlY29kZXIoKTsKICAgICB9CkBAIC0xNzksOCArMTgwLDExIEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJEZWNvZGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKLSAgICAgICAgQUxPR0QoIkRlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIkRlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmNwcAppbmRleCBkYzJhMmRkLi43ZTE2ODFkIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5jcHAKQEAgLTIzLDYgKzIzLDEwIEBACiAjaW5jbHVkZSAiRGVjb2Rlci5oIgogI2luY2x1ZGUgIkVuY29kZXIuaCIKIAorY29uc3RleHByIGludDMyX3Qga0VuY29kZURlZmF1bHRWaWRlb0JpdFJhdGUgPSA4MDAwMDAwIC8qIDggTWJwcyAqLzsKK2NvbnN0ZXhwciBpbnQzMl90IGtFbmNvZGVNaW5WaWRlb0JpdFJhdGUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87Citjb25zdGV4cHIgaW50MzJfdCBrRW5jb2RlRGVmYXVsdEF1ZGlvQml0UmF0ZSA9IDEyODAwMCAvKiAxMjggS2JwcyAqLzsKKwogc3RhdGljIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CiAKIGNsYXNzIEVuY29kZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcsIHN0cmluZywgYm9vbD4+IHt9OwpAQCAtNzgsNyArODIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKLSAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gImRlY29kZS5vdXQiOworICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiL2RhdGEvbG9jYWwvdG1wL2RlY29kZS5vdXQiOwogICAgICAgICBGSUxFICpvdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksICJ3YiIpOwogICAgICAgICBBU1NFUlRfTkUob3V0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSIgPDwgb3V0cHV0RmlsZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBkdW1waW5nIGRlY29kZXIncyBvdXRwdXQiOwpAQCAtODYsNiArOTAsNyBAQAogICAgICAgICBkZWNvZGVyLT5zZXR1cERlY29kZXIoKTsKICAgICAgICAgc3RhdHVzID0gZGVjb2Rlci0+ZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGRlY05hbWUsIGZhbHNlIC8qYXN5bmNNb2RlICovLCBvdXRGcCk7CiAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkRlY29kZSByZXR1cm5lZCBlcnJvciA6ICIgPDwgc3RhdHVzOworICAgICAgICBBTWVkaWFGb3JtYXQgKmRlY29kZXJGb3JtYXQgPSBkZWNvZGVyLT5nZXRGb3JtYXQoKTsKIAogICAgICAgICBpZnN0cmVhbSBlbGVTdHJlYW07CiAgICAgICAgIGVsZVN0cmVhbS5vcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKQEAgLTEwOCwxMSArMTEzLDEzIEBACiAgICAgICAgICAgICBpZiAoZW5jUGFyYW1zLmJpdHJhdGUgPD0gMCB8fCBlbmNQYXJhbXMuZnJhbWVSYXRlIDw9IDApIHsKICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuZnJhbWVSYXRlID0gMjU7CiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgInZpZGVvLzNncHAiKSB8fCAhc3RyY21wKG1pbWUsICJ2aWRlby9tcDR2LWVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CisgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0ga0VuY29kZU1pblZpZGVvQml0UmF0ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IDgwMDAwMDAgLyogOCBNYnBzICovOworICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGtFbmNvZGVEZWZhdWx0VmlkZW9CaXRSYXRlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihkZWNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jUGFyYW1zLmNvbG9yRm9ybWF0KTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgJmVuY1BhcmFtcy5wcm9maWxlKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsICZlbmNQYXJhbXMubGV2ZWwpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTIwLDggKzEyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5zYW1wbGVSYXRlKSk7CiAgICAgICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5udW1DaGFubmVscykpOwotICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuc2FtcGxlUmF0ZSAqIGVuY1BhcmFtcy5udW1DaGFubmVscyAqIDE2IC8qIGJpdHNQZXJTYW1wbGUgKi87CisgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGtFbmNvZGVEZWZhdWx0QXVkaW9CaXRSYXRlOwogICAgICAgICB9CiAKICAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7CkBAIC0xMzMsNyArMTM5LDggQEAKICAgICAgICAgZW5jb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgQUxPR1YoImNvZGVjIDogJXMiLCBjb2RlY05hbWUuY19zdHIoKSk7CiAgICAgICAgIHN0cmluZyBpbnB1dFJlZmVyZW5jZSA9IGdldDwwPihwYXJhbXMpOwotICAgICAgICBlbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKSk7CisgICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpLCBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKICAgICAgICAgaWYgKG91dEZwKSBmY2xvc2Uob3V0RnApOwogCkBAIC0xNDEsNiArMTQ4LDEwIEBACiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CiAgICAgICAgICAgICBmb3JtYXQgPSBudWxscHRyOwogICAgICAgICB9CisgICAgICAgIGlmIChkZWNvZGVyRm9ybWF0KSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGRlY29kZXJGb3JtYXQpOworICAgICAgICAgICAgZGVjb2RlckZvcm1hdCA9IG51bGxwdHI7CisgICAgICAgIH0KICAgICAgICAgZW5jb2Rlci0+cmVzZXRFbmNvZGVyKCk7CiAgICAgICAgIGRlY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwpAQCAtMjE0LDggKzIyNSwxMSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiRW5jb2Rlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7Ci0gICAgICAgIEFMT0dEKCJFbmNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJFbmNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKaW5kZXggYWQ4ZjFlNi4uZDE0ZDE1YiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcApAQCAtNDgsOCArNDgsNyBAQAogICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkV4dHJhY3Rpb24gZmFpbGVkIFxuIjsKIAogICAgIGV4dHJhY3RPYmotPmRlSW5pdEV4dHJhY3RvcigpOwotCi0gICAgZXh0cmFjdE9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCk7CisgICAgZXh0cmFjdE9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgIiIsIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKIAogICAgIGZjbG9zZShpbnB1dEZwKTsKICAgICBkZWxldGUgZXh0cmFjdE9iajsKQEAgLTc5LDggKzc4LDExIEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJFeHRyYWN0b3IuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HRCgiIEV4dHJhY3RvciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICBBTE9HVigiRXh0cmFjdG9yIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvTXV4ZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCmluZGV4IGZhMjYzNWQuLjk5MTY0NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIk11eCBmYWlsZWQiOwogCiAgICAgICAgIG11eGVyT2JqLT5kZUluaXRNdXhlcigpOwotICAgICAgICBtdXhlck9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCArICIuIiArIGZtdC5jX3N0cigpKTsKKyAgICAgICAgbXV4ZXJPYmotPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QgKyAiLiIgKyBmbXQuY19zdHIoKSwgZm10LCBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwogICAgICAgICBmY2xvc2Uob3V0cHV0RnApOwogICAgICAgICBtdXhlck9iai0+cmVzZXRNdXhlcigpOwpAQCAtMTUxLDggKzE1MSwxMSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiTXV4ZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIk11eGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCmluZGV4IDY3ZjBlYTguLmMzOTdmMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCisrKyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCkBAIC0zMSw3ICszMSw3IEBACiAjIDY6IFBlcmNlbnQKICMgRGVmYXVsdCB2YWx1ZSBmb3IgZGF0YSBvZiB0eXBlIGludC9sb25nIGlzIDIgKGJ5dGVzKS4KICMKLSMgU2VlIHN5c3RlbS9jb3JlL2xvZ2NhdC9ldmVudC5sb2d0YWdzIGZvciB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHRhZ3MuCisjIFNlZSBzeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQubG9ndGFncyBmb3IgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIHRhZ3MuCiAKICMgNjEwMDAgLSA2MTE5OSByZXNlcnZlZCBmb3IgYXVkaW9zZXJ2ZXIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwIGIvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwCmluZGV4IDExM2U0YTcuLjE5MjI1ZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcAorKysgYi9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAKQEAgLTI3LDYgKzI3LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgY29uc3RleHByIGludDMyX3QgSU5WQUxJRF9BREogPSAtMTAwMDA7CitzdGF0aWMgY29uc3RleHByIGludDMyX3QgTkFUSVZFX0FESiA9IC0xMDAwOworCiBQcm9jZXNzSW5mbzo6UHJvY2Vzc0luZm8oKSB7fQogCiBib29sIFByb2Nlc3NJbmZvOjpnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KSB7CkBAIC0zNSw4ICszOCw2IEBACiAKICAgICBzaXplX3QgbGVuZ3RoID0gMTsKICAgICBpbnQzMl90IHN0YXRlOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IElOVkFMSURfQURKID0gLTEwMDAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE5BVElWRV9BREogPSAtMTAwMDsKICAgICBpbnQzMl90IHNjb3JlID0gSU5WQUxJRF9BREo7CiAgICAgc3RhdHVzX3QgZXJyID0gc2VydmljZS0+Z2V0UHJvY2Vzc1N0YXRlc0FuZE9vbVNjb3Jlc0Zyb21QaWRzKGxlbmd0aCwgJnBpZCwgJnN0YXRlLCAmc2NvcmUpOwogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTQ1LDggKzQ2LDE3IEBACiAgICAgfQogICAgIEFMT0dWKCJwaWQgJWQgc3RhdGUgJWQgc2NvcmUgJWQiLCBwaWQsIHN0YXRlLCBzY29yZSk7CiAgICAgaWYgKHNjb3JlIDw9IE5BVElWRV9BREopIHsKLSAgICAgICAgQUxPR0UoInBpZCAlZCBpbnZhbGlkIE9PTSBhZGp1c3RtZW50cyB2YWx1ZSAlZCIsIHBpZCwgc2NvcmUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttT3ZlcnJpZGVMb2NrfTsKKworICAgICAgICAvLyBJZiB0aGlzIHByb2Nlc3MgaWYgbm90IHRyYWNrZWQgYnkgQWN0aXZpdHlNYW5hZ2VyU2VydmljZSwgbG9vayBmb3Igb3ZlcnJpZGVzLgorICAgICAgICBhdXRvIGl0ID0gbU92ZXJyaWRlTWFwLmZpbmQocGlkKTsKKyAgICAgICAgaWYgKGl0ICE9IG1PdmVycmlkZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0koInBpZCAlZCBpbnZhbGlkIE9PTSBzY29yZSAlZCwgb3ZlcnJpZGUgdG8gJWQiLCBwaWQsIHNjb3JlLCBpdC0+c2Vjb25kLm9vbVNjb3JlKTsKKyAgICAgICAgICAgIHNjb3JlID0gaXQtPnNlY29uZC5vb21TY29yZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJwaWQgJWQgaW52YWxpZCBPT00gc2NvcmUgJWQiLCBwaWQsIHNjb3JlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFVzZSBPT00gYWRqdXN0bWVudHMgdmFsdWUgYXMgdGhlIHByaW9yaXR5LiBMb3dlciB0aGUgdmFsdWUsIGhpZ2hlciB0aGUgcHJpb3JpdHkuCkBAIC02MSw2ICs3MSwyNiBAQAogICAgIHJldHVybiAoY2FsbGluZ1BpZCA9PSBnZXRwaWQoKSkgfHwgKGNhbGxpbmdQaWQgPT0gcGlkKSB8fCAoY2FsbGluZ1VpZCA9PSBBSURfTUVESUEpOwogfQogCitib29sIFByb2Nlc3NJbmZvOjpvdmVycmlkZVByb2Nlc3NJbmZvKGludCBwaWQsIGludCBwcm9jU3RhdGUsIGludCBvb21TY29yZSkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttT3ZlcnJpZGVMb2NrfTsKKworICAgIG1PdmVycmlkZU1hcC5lcmFzZShwaWQpOworCisgICAgLy8gRGlzYWJsZSB0aGUgb3ZlcnJpZGUgaWYgb29tU2NvcmUgaXMgc2V0IHRvIE5BVElWRV9BREogb3IgYmVsb3cuCisgICAgaWYgKG9vbVNjb3JlIDw9IE5BVElWRV9BREopIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1PdmVycmlkZU1hcC5lbXBsYWNlKHBpZCwgUHJvY2Vzc0luZm9PdmVycmlkZXtwcm9jU3RhdGUsIG9vbVNjb3JlfSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJvY2Vzc0luZm86OnJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUoaW50IHBpZCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttT3ZlcnJpZGVMb2NrfTsKKworICAgIG1PdmVycmlkZU1hcC5lcmFzZShwaWQpOworfQorCiBQcm9jZXNzSW5mbzo6flByb2Nlc3NJbmZvKCkge30KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggODdlYTA4NC4uMTQzYTRlMSAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTg5LDE0ICs4OSwxOCBAQAogICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwogICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKICAgICBpZiAoc3RhcnQpIHsKLSAgICAgICAgaWYgKGFwcE9wcy5zdGFydE9wTm9UaHJvdyhvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpCi0gICAgICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKKyAgICAgICAgaWYgKGludDMyX3QgbW9kZSA9IGFwcE9wcy5zdGFydE9wTm9UaHJvdygKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSwgLypzdGFydElmTW9kZURlZmF1bHQqLyBmYWxzZSk7CisgICAgICAgICAgICAgICAgbW9kZSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IHN0YXJ0IGZvciBcIiVzXCIgKHVpZCAlZCkgZGVuaWVkIGJ5IGFwcCBvcDogJWQsIG1vZGU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChyZXNvbHZlZE9wUGFja2FnZU5hbWUpLmNfc3RyKCksIHVpZCwgb3AsIG1vZGUpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFwcE9wcy5jaGVja09wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSkgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKKyAgICAgICAgaWYgKGludDMyX3QgbW9kZSA9IGFwcE9wcy5jaGVja09wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgbW9kZSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGNoZWNrIGZvciBcIiVzXCIgKHVpZCAlZCkgZGVuaWVkIGJ5IGFwcCBvcDogJWQsIG1vZGU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChyZXNvbHZlZE9wUGFja2FnZU5hbWUpLmNfc3RyKCksIHVpZCwgb3AsIG1vZGUpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTEyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9kZWZhdWx0cyIsCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWMrKzJhLWV4dGVuc2lvbnMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKKyAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfYmF0dGVyeV9ub3RpZmllciIsCisgICAgZGVmYXVsdHM6IFsibGlibWVkaWF1dGlsc19mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIkJhdHRlcnlOb3RpZmllckZ1enouY3BwIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9zY2hlZHVsaW5nX3BvbGljeV9zZXJ2aWNlIiwKKyAgICBkZWZhdWx0czogWyJsaWJtZWRpYXV0aWxzX2Z1enplcl9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2VGdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfc2VydmljZV91dGlsaXRpZXMiLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfZnV6emVyX3RpbWVfY2hlY2siLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJUaW1lQ2hlY2tGdXp6LmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9CYXR0ZXJ5Tm90aWZpZXJGdXp6LmNwcCBiL21lZGlhL3V0aWxzL2Z1enplcnMvQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiM2NjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oIgorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4T3BlcmF0aW9ucyA9IDMwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbmd0aCA9IDUwMDsKK3VzaW5nIGFuZHJvaWQ6OkJhdHRlcnlOb3RpZmllcjsKKworc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIC8qZmxhc2hsaWdodF9uYW1lKi8sIHN0ZDo6c3RyaW5nIC8qY2FtZXJhX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCAvKnZpZGVvX2lkKi8sIHVpZF90IC8qYXVkaW9faWQqLywgdWlkX3QgLypsaWdodF9pZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IC8qY2FtZXJhX2lkKi8pPj4KKyAgICBvcGVyYXRpb25zID0geworICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRWaWRlbygpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRBdWRpbygpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRGbGFzaGxpZ2h0KCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVSZXNldENhbWVyYSgpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90IHZpZGVvX2lkLCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRWaWRlbyh2aWRlb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QgdmlkZW9faWQsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wVmlkZW8odmlkZW9faWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCBhdWRpb19pZCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRBdWRpbyhhdWRpb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90IGF1ZGlvX2lkLCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wQXVkaW8oYXVkaW9faWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90IGxpZ2h0X2lkLCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoZmxhc2hsaWdodF9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVGbGFzaGxpZ2h0T24obmFtZSwgbGlnaHRfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90IGxpZ2h0X2lkLCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoZmxhc2hsaWdodF9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVGbGFzaGxpZ2h0T2ZmKG5hbWUsIGxpZ2h0X2lkKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nIGNhbWVyYV9uYW1lLCB1aWRfdCwgdWlkX3QsIHVpZF90LCB1aWRfdCBjYW1lcmFfaWQpIC0+IHZvaWQgeworICAgICAgICAgICAgYW5kcm9pZDo6U3RyaW5nOCBuYW1lKGNhbWVyYV9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdGFydENhbWVyYShuYW1lLCBjYW1lcmFfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcgY2FtZXJhX25hbWUsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90IGNhbWVyYV9pZCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoY2FtZXJhX25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0b3BDYW1lcmEobmFtZSwgY2FtZXJhX2lkKTsKKyAgICAgICAgfSwKK307CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBzdGQ6OnN0cmluZyBjYW1lcmFfbmFtZSA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCk7CisgICAgdWlkX3QgdmlkZW9faWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICB1aWRfdCBhdWRpb19pZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgIHVpZF90IGxpZ2h0X2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgdWlkX3QgY2FtZXJhX2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgc2l6ZV90IG9wc19ydW4gPSAwOworICAgIHdoaWxlIChkYXRhX3Byb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCAmJiBvcHNfcnVuKysgPCBrTWF4T3BlcmF0aW9ucykgeworICAgICAgICB1aW50OF90IG9wID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIG9wZXJhdGlvbnMuc2l6ZSgpIC0gMSk7CisgICAgICAgIG9wZXJhdGlvbnNbb3BdKGZsYXNobGlnaHRfbmFtZSwgY2FtZXJhX25hbWUsIHZpZGVvX2lkLCBhdWRpb19pZCwgbGlnaHRfaWQsIGNhbWVyYV9pZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9TY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjE4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlRnV6ei5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQmF0dGVyeU5vdGlmaWVyRnV6emVyIgorI2luY2x1ZGUgPGJpbmRlci9JQmF0dGVyeVN0YXRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgordXNpbmcgYW5kcm9pZDo6SUJhdHRlcnlTdGF0czsKK3VzaW5nIGFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyBhbmRyb2lkOjpJSW50ZXJmYWNlOwordXNpbmcgYW5kcm9pZDo6SVNlcnZpY2VNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKK3VzaW5nIGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OnJlcXVlc3RDcHVzZXRCb29zdDsKK3VzaW5nIGFuZHJvaWQ6OnJlcXVlc3RQcmlvcml0eTsKK3NwPElCYXR0ZXJ5U3RhdHM+IGdldEJhdHRlcnlTZXJ2aWNlKCkgeworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTdGF0U2VydmljZTsKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgYmF0dGVyeVN0YXRTZXJ2aWNlID0gY2hlY2tlZF9pbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKGJhdHRlcnlTdGF0U2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiYmF0dGVyeXN0YXRzIHNlcnZpY2UgdW5hdmFpbGFibGUhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmF0dGVyeVN0YXRTZXJ2aWNlOworfQorZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTdGF0U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlKCk7CisgICAgLy8gVGhlcmUgaXMgc29tZSBzdGF0ZSBoZXJlLCBidXQgaXQncyBtb3N0bHkgZm9jdXNlZCBhcm91bmQgdGhyZWFkLXNhZmV0eSwgc28KKyAgICAvLyB3ZSB3b24ndCB3b3JyeSBhYm91dCBvcmRlci4KKyAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBib29sIGlzX2Zvcl9hcHAgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVCb29sKCk7CisgICAgYm9vbCBhc3luYyA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUJvb2woKTsKKyAgICByZXF1ZXN0UHJpb3JpdHkoZ2V0cGlkKCksIGdldHRpZCgpLCBwcmlvcml0eSwgaXNfZm9yX2FwcCwgYXN5bmMpOworICAgIC8vIFRPRE86IFZlcmlmeSBhbmQgcmUtZW5hYmxlIGluIEFPU1AgKFIpLgorICAgIC8vIGJvb2wgZW5hYmxlID0gZGF0YV9wcm92aWRlci5Db25zdW1lQm9vbCgpOworICAgIC8vIFdlIGFyZSBqdXN0IHVzaW5nIGJhdHRlcnlzdGF0cyB0byBhdm9pZCB0aGUgbmVlZAorICAgIC8vIHRvIHJlZ2lzdGVyIGEgbmV3IHNlcnZpY2UuCisgICAgLy8gcmVxdWVzdENwdXNldEJvb3N0KGVuYWJsZSwgSUludGVyZmFjZTo6YXNCaW5kZXIoYmF0dGVyeVN0YXRTZXJ2aWNlKSk7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxNDFiNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCIKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heE9wZXJhdGlvbnMgPSA1MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhTdHJpbmdMZW4gPSAyNTY7CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyKT4+CisgICAgb3BlcmF0aW9ucyA9IHsKKyAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhX3Byb3ZpZGVyLCBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyIHBtKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIHVpZF90IHVpZCA9IGRhdGFfcHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICAgICAgICAgIHBtLmFsbG93UGxheWJhY2tDYXB0dXJlKHVpZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZGF0YV9wcm92aWRlciwgYW5kcm9pZDo6TWVkaWFQYWNrYWdlTWFuYWdlciBwbSkgLT4gdm9pZCB7CisgICAgICAgICAgICBpbnQgc3BhY2VzID0gZGF0YV9wcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludD4oKTsKKworICAgICAgICAgICAgLy8gRHVtcCBldmVyeXRoaW5nIGludG8gL2Rldi9udWxsCisgICAgICAgICAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1dST05MWSk7CisgICAgICAgICAgICBwbS5kdW1wKGZkLCBzcGFjZXMpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICB9LAorfTsKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHVpZF90IHVpZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgIHBpZF90IHBpZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHBpZF90PigpOworCisgICAgLy8gVGhlcmUgaXMgbm90IHN0YXRlIGhlcmUsIGFuZCBvcmRlciBpcyBub3Qgc2lnbmlmaWNhbnQsCisgICAgLy8gc28gd2UgY2FuIHNpbXBseSBjYWxsIGFsbCBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9ucworICAgIGFuZHJvaWQ6OmlzU2VydmljZVVpZCh1aWQpOworICAgIGFuZHJvaWQ6OmlzQXVkaW9TZXJ2ZXJVaWQodWlkKTsKKyAgICBhbmRyb2lkOjppc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkKTsKKyAgICBhbmRyb2lkOjppc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZCh1aWQpOworICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VOYW1lU3RyID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW4pOworICAgIGFuZHJvaWQ6OlN0cmluZzE2IG9wUGFja2FnZU5hbWUocGFja2FnZU5hbWVTdHIuY19zdHIoKSk7CisgICAgYW5kcm9pZDo6cmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6c3RhcnRSZWNvcmRpbmcob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQpOworICAgIGFuZHJvaWQ6OmZpbmlzaFJlY29yZGluZyhvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGFuZHJvaWQ6OmNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkLCB1aWQpOworICAgIGFuZHJvaWQ6OmNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQocGlkLCB1aWQpOworICAgIGFuZHJvaWQ6OmNhcHR1cmVIb3R3b3JkQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6bW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQodWlkLCBwaWQpOworICAgIGFuZHJvaWQ6OmJ5cGFzc0ludGVycnVwdGlvblBvbGljeUFsbG93ZWQodWlkLCBwaWQpOworICAgIGFuZHJvaWQ6OnNldHRpbmdzQWxsb3dlZCgpOworICAgIGFuZHJvaWQ6Om1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKKyAgICBhbmRyb2lkOjptb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpOworICAgIGFuZHJvaWQ6OmR1bXBBbGxvd2VkKCk7CisKKyAgICAvLyBNZWRpYVBhY2thZ2VNYW5hZ2VyIGRvZXMgaGF2ZSBzdGF0ZSwgc28gd2UgbmVlZCB0aGUgZnV6emVyIHRvIGRlY2lkZSBvcmRlcgorICAgIGFuZHJvaWQ6Ok1lZGlhUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXI7CisgICAgc2l6ZV90IG9wc19ydW4gPSAwOworICAgIHdoaWxlIChkYXRhX3Byb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCAmJiBvcHNfcnVuKysgPCBrTWF4T3BlcmF0aW9ucykgeworICAgICAgICB1aW50OF90IG9wID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIG9wZXJhdGlvbnMuc2l6ZSgpIC0gMSk7CisgICAgICAgIG9wZXJhdGlvbnNbb3BdKCZkYXRhX3Byb3ZpZGVyLCBwYWNrYWdlTWFuYWdlcik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWI2YmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisjaW5jbHVkZSAibWVkaWF1dGlscy9UaW1lQ2hlY2suaCIKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbiA9IDI1NjsKKworLy8gV2hpbGUgaXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8gdGVzdCBsb25nLXJ1bm5pbmcKKy8vIGpvYnMsIGl0IHNlZW1zIHVubGlrZWx5IGl0J2QgbGVhZCB0byB0aGUgdHlwZXMgb2YgY3Jhc2hlcworLy8gd2UncmUgbG9va2luZyBmb3IsIGFuZCB3b3VsZCBtZWFuIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gZnV6emVyIHRpbWUuCisvLyBUaGVyZWZvcmUsIHdlIGFyZSBzZXR0aW5nIGEgbG93IGNhcC4KK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heFRpbWVvdXRNcyA9IDEwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNaW5UaW1lb3V0TXMgPSAyMDA7CitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFfcHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICAvLyBUaGVyZSdzIGVzc2VudGlhbGx5IDUgb3BlcmF0aW9ucyB0aGF0IHdlIGNhbiBhY2Nlc3MgaW4gdGhpcyBjbGFzcworICAgIC8vIDEuIFRoZSB0aW1lIGl0IHRha2VzIHRvIHJ1biB0aGlzIG9wZXJhdGlvbi4gQXMgbWVudGlvbmVkIGFib3ZlLAorICAgIC8vICAgIGxvbmctcnVubmluZyB0YXNrcyBhcmUgbm90IGdvb2QgZm9yIGZ1enppbmcsIGJ1dCB0aGVyZSB3aWxsIGJlCisgICAgLy8gICAgc29tZSBjaGFuZ2UgaW4gdGhlIHJ1biB0aW1lLgorICAgIHVpbnQzMl90IHRpbWVvdXRNcyA9CisgICAgICAgIGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oa01pblRpbWVvdXRNcywga01heFRpbWVvdXRNcyk7CisgICAgdWludDhfdCBwaWRfc2l6ZSA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCk7CisgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHMocGlkX3NpemUpOworICAgIGZvciAoYXV0byYgcGlkIDogcGlkcykgeworICAgICAgICBwaWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDxwaWRfdD4oKTsKKyAgICB9CisKKyAgICAvLyAyLiBXZSBhbHNvIGhhdmUgc2V0QXVkaW9IYWxQaWRzLCB3aGljaCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgcGlkcyBzZXQKKyAgICAvLyBhYm92ZS4KKyAgICBhbmRyb2lkOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW4pOworCisgICAgLy8gMy4gVGhlIGNvbnN0cnVjdG9yLCB3aGljaCBpcyBmdXp6ZWQgaGVyZToKKyAgICBhbmRyb2lkOjpUaW1lQ2hlY2sgdGltZUNoZWNrKG5hbWUuY19zdHIoKSwgdGltZW91dE1zKTsKKyAgICAvLyBXZSB3aWxsIGxlYXZlIHNvbWUgYnVmZmVyIHRvIGF2b2lkIHNsZWVwaW5nIHRvbyBsb25nCisgICAgdWludDhfdCBzbGVlcF9hbW91bnRfbXMgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdGltZW91dE1zIC8gMik7CisKKyAgICAvLyBXZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gY292ZXIgdGhlIHRpbWUgb3V0IGZ1bmN0aW9uYWxpdHkuCisgICAgaWYgKHNsZWVwX2Ftb3VudF9tcykgeworICAgICAgICBhdXRvIG1zID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhzbGVlcF9hbW91bnRfbXMpOworICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IobXMpOworICAgIH0KKworICAgIC8vIDQuIEZpbmFsbHksIHRoZSBkZXN0cnVjdG9yIG9uIHRpbWVjaGVjay4gVGhlc2Ugc2VlbSB0byBiZSB0aGUgb25seSBmYWN0b3JzCisgICAgLy8gaW4gcGxheS4KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL09XTkVSUyBiL3NlcnZpY2VzL09XTkVSUwppbmRleCA2NmE0YmNiLi5mMGI1ZTJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9PV05FUlMKKysrIGIvc2VydmljZXMvT1dORVJTCkBAIC01LDMgKzUsNSBAQAogZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBtYXJjb25lQGdvb2dsZS5jb20KK25jaGFsa29AZ29vZ2xlLmNvbQorcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icAppbmRleCAzODczNjAwLi44N2I1ZmY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icApAQCAtMzUsNiArMzUsMTEgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLXVuc3RhYmxlLWNwcCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLXVuc3RhYmxlLWNwcCIsCisgICAgICAgICJhdi10eXBlcy1haWRsLXVuc3RhYmxlLWNwcCIsCisgICAgICAgICJlZmZlY3QtYWlkbC11bnN0YWJsZS1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJhdWRpb2hhbCIsCiAgICAgICAgICJsaWJhdWRpb3Byb2Nlc3NpbmciLApAQCAtNTQsNiArNTksNyBAQAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlic2htZW1jb21wYXQiLAogICAgICAgICAibGlidmlicmF0b3IiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggZjAxNDIwOS4uZDQ0MmFmNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDx0aHJlYWQ+CiAKKwogI2luY2x1ZGUgPGFuZHJvaWQvb3MvSUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtNDEsOCArNDIsMTAgQEAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgPG1lbXVucmVhY2hhYmxlL21lbXVucmVhY2hhYmxlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC02MSwxMiArNjQsMTUgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfaGFwdGljZ2VuZXJhdG9yLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZhbGlkYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KQEAgLTgwLDYgKzg2LDE1IEBACiAKICNpbmNsdWRlICJUeXBlZExvZ2dlci5oIgogCisjZGVmaW5lIFZBTFVFX09SX0ZBVEFMKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgXAorICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdXRvIF90bXAgPSAocmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighX3RtcC5vaygpLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCByZXN1bHQgKCVkKSIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF90bXAuZXJyb3IoKSk7ICAgICAgICBcCisgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICB9KQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIE5vdGU6IHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgdXNlZCBmb3IgZXh0cmVtZWx5IHZlcmJvc2UgbG9nZ2luZyBtZXNzYWdlLiAgSW4KQEAgLTk3LDYgKzExMiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OklFZmZlY3RDbGllbnQ7CisKIHN0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9GbGluZ2VyIG1heSBiZSBkZWFkbG9ja2VkXG4iOwogc3RhdGljIGNvbnN0IGNoYXIga0hhcmR3YXJlTG9ja2VkU3RyaW5nW10gPSAiSGFyZHdhcmUgbG9jayBpcyB0YWtlblxuIjsKIHN0YXRpYyBjb25zdCBjaGFyIGtDbGllbnRMb2NrZWRTdHJpbmdbXSA9ICJDbGllbnQgbG9jayBpcyB0YWtlblxuIjsKQEAgLTE2OCw5ICsxODUsMTUgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6aW5zdGFudGlhdGUoKSB7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbShkZWZhdWx0U2VydmljZU1hbmFnZXIoKSk7CisgICAgc20tPmFkZFNlcnZpY2UoU3RyaW5nMTYoSUF1ZGlvRmxpbmdlcjo6REVGQVVMVF9TRVJWSUNFX05BTUUpLAorICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyKG5ldyBBdWRpb0ZsaW5nZXIoKSksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgIElTZXJ2aWNlTWFuYWdlcjo6RFVNUF9GTEFHX1BSSU9SSVRZX0RFRkFVTFQpOworfQorCiBBdWRpb0ZsaW5nZXI6OkF1ZGlvRmxpbmdlcigpCi0gICAgOiBCbkF1ZGlvRmxpbmdlcigpLAotICAgICAgbU1lZGlhTG9nTm90aWZpZXIobmV3IEF1ZGlvRmxpbmdlcjo6TWVkaWFMb2dOb3RpZmllcigpKSwKKyAgICA6IG1NZWRpYUxvZ05vdGlmaWVyKG5ldyBBdWRpb0ZsaW5nZXI6Ok1lZGlhTG9nTm90aWZpZXIoKSksCiAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2KE5VTEwpLAogICAgICAgbUF1ZGlvSHdEZXZzKE5VTEwpLAogICAgICAgbUhhcmR3YXJlU3RhdHVzKEFVRElPX0hXX0lETEUpLApAQCAtMTk0LDcgKzIxNywxMiBAQAogICAgICAgICBtTmV4dFVuaXF1ZUlkc1t1c2VdID0gQVVESU9fVU5JUVVFX0lEX1VTRV9NQVg7CiAgICAgfQogCisjaWYgMQorICAgIC8vIEZJWE1FIFNlZSBidWcgMTY1NzAyMzk0IGFuZCBidWcgMTY4NTExNDg1CisgICAgY29uc3QgYm9vbCBkb0xvZyA9IGZhbHNlOworI2Vsc2UKICAgICBjb25zdCBib29sIGRvTG9nID0gcHJvcGVydHlfZ2V0X2Jvb2woInJvLnRlc3RfaGFybmVzcyIsIGZhbHNlKTsKKyNlbmRpZgogICAgIGlmIChkb0xvZykgewogICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLAogICAgICAgICAgICAgICAgIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpOwpAQCAtMzk4LDcgKzQyNiw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihvczo6SGFwdGljU2NhbGU6Ok1VVEUpOwogfQogCiAvKiBzdGF0aWMgKi8KQEAgLTY4NCw4ICs3MTIsOCBAQAogCiBzcDxOQkxvZzo6V3JpdGVyPiBBdWRpb0ZsaW5nZXI6Om5ld1dyaXRlcl9sKHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIC8vIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxvZ3MsIHJldHVybiBhIGR1bW15IHdyaXRlciB0aGF0IGRvZXMgbm90aGluZy4KLSAgICAvLyBTaW1pbGFybHkgaWYgd2UgY2FuJ3QgY29udGFjdCB0aGUgbWVkaWEubG9nIHNlcnZpY2UsIGFsc28gcmV0dXJuIGEgZHVtbXkgd3JpdGVyLgorICAgIC8vIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxvZ3MsIHJldHVybiBhIG5vLW9wIHdyaXRlciB0aGF0IGRvZXMgbm90aGluZy4KKyAgICAvLyBTaW1pbGFybHkgaWYgd2UgY2FuJ3QgY29udGFjdCB0aGUgbWVkaWEubG9nIHNlcnZpY2UsIGFsc28gcmV0dXJuIGEgbm8tb3Agd3JpdGVyLgogICAgIGlmIChtTG9nTWVtb3J5RGVhbGVyID09IDAgfHwgc01lZGlhTG9nU2VydmljZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOwogICAgIH0KQEAgLTcxMSw3ICs3MzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIEV2ZW4gYWZ0ZXIgZ2FyYmFnZS1jb2xsZWN0aW5nIGFsbCBvbGQgd3JpdGVycywgdGhlcmUgaXMgc3RpbGwgbm90IGVub3VnaCBtZW1vcnksCi0gICAgICAgIC8vIHNvIHJldHVybiBhIGR1bW15IHdyaXRlcgorICAgICAgICAvLyBzbyByZXR1cm4gYSBuby1vcCB3cml0ZXIKICAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CiAgICAgfQogc3VjY2VzczoKQEAgLTczOSwxMCArNzY3LDEzIEBACiAKIC8vIElBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCiAKLXNwPElBdWRpb1RyYWNrPiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZVRyYWNrKGNvbnN0IENyZWF0ZVRyYWNrSW5wdXQmIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVHJhY2tPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZVRyYWNrKGNvbnN0IG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QmIF9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2UmIF9vdXRwdXQpCiB7CisgICAgLy8gTG9jYWwgdmVyc2lvbiBvZiBWQUxVRV9PUl9SRVRVUk4sIHNwZWNpZmljIHRvIHRoaXMgbWV0aG9kJ3MgY2FsbGluZyBjb252ZW50aW9ucy4KKyAgICBDcmVhdGVUcmFja0lucHV0IGlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhDcmVhdGVUcmFja0lucHV0Ojpmcm9tQWlkbChfaW5wdXQpKTsKKyAgICBDcmVhdGVUcmFja091dHB1dCBvdXRwdXQ7CisKICAgICBzcDxQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrOwogICAgIHNwPFRyYWNrSGFuZGxlPiB0cmFja0hhbmRsZTsKICAgICBzcDxDbGllbnQ+IGNsaWVudDsKQEAgLTg1Miw3ICs4ODMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5ub3RpZmljYXRpb25zUGVyQnVmZmVyLCBpbnB1dC5zcGVlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsICZvdXRwdXQuZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsU3RhdHVzLCBwb3J0SWQsIGlucHV0LmF1ZGlvVHJhY2tDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsU3RhdHVzLCBwb3J0SWQsIGlucHV0LmF1ZGlvVHJhY2tDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQub3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmICh0cmFjayA9PSAwKSk7CiAgICAgICAgIC8vIHdlIGRvbid0IGFib3J0IHlldCBpZiBsU3RhdHVzICE9IE5PX0VSUk9SOyB0aGVyZSBpcyBzdGlsbCB3b3JrIHRvIGJlIGRvbmUgcmVnYXJkbGVzcwogCkBAIC05OTgsMTUgKzEwMzAsMTQgQEAKICAgICAgICAgQXVkaW9TeXN0ZW06Om1vdmVFZmZlY3RzVG9JbyhlZmZlY3RJZHMsIGVmZmVjdFRocmVhZElkKTsKICAgICB9CiAKLSAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAotICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKKyAgICBvdXRwdXQuYXVkaW9UcmFjayA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7CisgICAgX291dHB1dCA9IFZBTFVFX09SX0ZBVEFMKG91dHB1dC50b0FpZGwoKSk7CiAKIEV4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgb3V0cHV0Lm91dHB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgfQotICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIHJldHVybiB0cmFja0hhbmRsZTsKKyAgICByZXR1cm4gbFN0YXR1czsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpzYW1wbGVSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdApAQCAtMTI4Myw5ICsxMzE0LDkgQEAKICAgICB9CiAKICAgICAvLyBOb3cgc2V0IHRoZSBtYXN0ZXIgbXV0ZSBpbiBlYWNoIHBsYXliYWNrIHRocmVhZC4gIFBsYXliYWNrIHRocmVhZHMKLSAgICAvLyBhc3NpZ25lZCB0byBIQUxzIHdoaWNoIGRvIG5vdCBoYXZlIG1hc3RlciBtdXRlIHN1cHBvcnQgd2lsbCBhcHBseSBtYXN0ZXIKLSAgICAvLyBtdXRlIGR1cmluZyB0aGUgbWl4IG9wZXJhdGlvbi4gIFRocmVhZHMgd2l0aCBIQUxzIHdoaWNoIGRvIHN1cHBvcnQgbWFzdGVyCi0gICAgLy8gbXV0ZSB3aWxsIHNpbXBseSBpZ25vcmUgdGhlIHNldHRpbmcuCisgICAgLy8gYXNzaWduZWQgdG8gSEFMcyB3aGljaCBkbyBub3QgaGF2ZSBtYXN0ZXIgbXV0ZSBzdXBwb3J0IHdpbGwgYXBwbHkgbWFzdGVyIG11dGUKKyAgICAvLyBkdXJpbmcgdGhlIG1peCBvcGVyYXRpb24uICBUaHJlYWRzIHdpdGggSEFMcyB3aGljaCBkbyBzdXBwb3J0IG1hc3RlciBtdXRlCisgICAgLy8gd2lsbCBzaW1wbHkgaWdub3JlIHRoZSBzZXR0aW5nLgogICAgIFZlY3RvcjxWb2x1bWVJbnRlcmZhY2UgKj4gdm9sdW1lSW50ZXJmYWNlcyA9IGdldEFsbFZvbHVtZUludGVyZmFjZXNfbCgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdm9sdW1lSW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICB2b2x1bWVJbnRlcmZhY2VzW2ldLT5zZXRNYXN0ZXJNdXRlKG11dGVkKTsKQEAgLTE0MzAsNyArMTQ2MSw3IEBACiB9CiAKIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit2b2lkIEF1ZGlvRmxpbmdlcjo6YnJvYWRjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwpAQCAtMTU4OCw3ICsxNjE5LDcgQEAKICAgICAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgICAgIGlmICgocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpICYmCiAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAhPSAwKSkgewotICAgICAgICAgICAgICAgIGJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzY1LDcgKzE3OTYsNyBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KQordm9pZCBBdWRpb0ZsaW5nZXI6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CkBAIC0xODQwLDEzICsxODcxLDE4IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpIHsKKyAgICBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3IgZGVzY0FpZGwgPSBWQUxVRV9PUl9GQVRBTCgKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKGlvRGVzYykpOworICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgZXZlbnRBaWRsID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfQXVkaW9Jb0NvbmZpZ0V2ZW50KGV2ZW50KSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudExvY2spOwogICAgIHNpemVfdCBzaXplID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmICgocGlkID09IDApIHx8IChtTm90aWZpY2F0aW9uQ2xpZW50cy5rZXlBdChpKSA9PSBwaWQpKSB7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5hdWRpb0ZsaW5nZXJDbGllbnQoKS0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0Rlc2MpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+YXVkaW9GbGluZ2VyQ2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NBaWRsKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE5MjAsNyArMTk1Niw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiAgICAgOiBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksIG1QaWQocGlkKSwgbVVpZCh1aWQpLCBtQXVkaW9GbGluZ2VyQ2xpZW50KGNsaWVudCkKQEAgLTE5NzUsMTAgKzIwMTEsMTIgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZVJlY29yZChjb25zdCBDcmVhdGVSZWNvcmRJbnB1dCYgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZWNvcmRPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZVJlY29yZChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlJiBfb3V0cHV0KQogeworICAgIENyZWF0ZVJlY29yZElucHV0IGlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhDcmVhdGVSZWNvcmRJbnB1dDo6ZnJvbUFpZGwoX2lucHV0KSk7CisgICAgQ3JlYXRlUmVjb3JkT3V0cHV0IG91dHB1dDsKKwogICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IHJlY29yZFRyYWNrOwogICAgIHNwPFJlY29yZEhhbmRsZT4gcmVjb3JkSGFuZGxlOwogICAgIHNwPENsaWVudD4gY2xpZW50OwpAQCAtMjA2OCw4ICsyMTA2LDggQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKG91dHB1dC5pbnB1dElkKTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQsIGlucHV0IGhhbmRsZSAlZCIsIG91dHB1dC5pbnB1dElkKTsKLSAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBBTE9HVygiY3JlYXRlUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQsIGlucHV0IGhhbmRsZSAlZCIsIG91dHB1dC5pbnB1dElkKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KIApAQCAtMjExNiw4ICsyMTU0LDggQEAKICAgICBvdXRwdXQuYnVmZmVycyA9IHJlY29yZFRyYWNrLT5nZXRCdWZmZXJzKCk7CiAgICAgb3V0cHV0LnBvcnRJZCA9IHBvcnRJZDsKIAotICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50Ci0gICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7CisgICAgb3V0cHV0LmF1ZGlvUmVjb3JkID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7CisgICAgX291dHB1dCA9IFZBTFVFX09SX0ZBVEFMKG91dHB1dC50b0FpZGwoKSk7CiAKIEV4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTIxMzUsOCArMjE3Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICByZXR1cm4gcmVjb3JkSGFuZGxlOworICAgIHJldHVybiBsU3RhdHVzOwogfQogCiAKQEAgLTIzMDgsNiArMjM0NSwxMSBAQAogewogICAgIEFMT0dWKF9fZnVuY19fKTsKIAorICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydENvbmZpZygqY29uZmlnKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKICAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKICAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKQEAgLTI1NDEsMjAgKzI1ODMsMjggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlKiByZXNwb25zZSkKIHsKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KHJlcXVlc3QubW9kdWxlKSk7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KHJlcXVlc3QuY29uZmlnKSk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VEZXNjcmlwdG9yQmFzZShyZXF1ZXN0LmRldmljZSkpOworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2F1ZGlvX291dHB1dF9mbGFnc19tYXNrKHJlcXVlc3QuZmxhZ3MpKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKKyAgICB1aW50MzJfdCBsYXRlbmN5TXM7CisKICAgICBBTE9HSSgib3Blbk91dHB1dCgpIHRoaXMgJXAsIG1vZHVsZSAlZCBEZXZpY2UgJXMsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICUjMDh4LCAiCiAgICAgICAgICAgICAgICJDaGFubmVscyAlI3gsIGZsYWdzICUjeCIsCiAgICAgICAgICAgICAgIHRoaXMsIG1vZHVsZSwKICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICBjb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICBmbGFncyk7CiAKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldmljZS0+dHlwZSgpOwpAQCAtMjU2NiwxMSArMjYxNiwxMSBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5PdXRwdXRfbChtb2R1bGUsIG91dHB1dCwgY29uZmlnLCBkZXZpY2VUeXBlLCBhZGRyZXNzLCBmbGFncyk7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3Blbk91dHB1dF9sKG1vZHVsZSwgJm91dHB1dCwgJmNvbmZpZywgZGV2aWNlVHlwZSwgYWRkcmVzcywgZmxhZ3MpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSkgPT0gMCkgewogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHBsYXliYWNrVGhyZWFkLT5sYXRlbmN5KCk7CisgICAgICAgICAgICBsYXRlbmN5TXMgPSBwbGF5YmFja1RocmVhZC0+bGF0ZW5jeSgpOwogCiAgICAgICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IG91dHB1dCBjcmVhdGlvbgogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfT1BFTkVEKTsKQEAgLTI1OTAsNiArMjY0MCwxMCBAQAogICAgICAgICAgICAgTW1hcFRocmVhZCAqbW1hcFRocmVhZCA9IChNbWFwVGhyZWFkICopdGhyZWFkLmdldCgpOwogICAgICAgICAgICAgbW1hcFRocmVhZC0+aW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9PUEVORUQpOwogICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLT5vdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CisgICAgICAgIHJlc3BvbnNlLT5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZykpOworICAgICAgICByZXNwb25zZS0+bGF0ZW5jeU1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGF0ZW5jeU1zKSk7CisgICAgICAgIHJlc3BvbnNlLT5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX21hc2soZmxhZ3MpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIApAQCAtMjc0MiwyMiArMjc5NiwzNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0KGNvbnN0IG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlKiByZXNwb25zZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKCpkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgaWYgKHJlcXVlc3QuZGV2aWNlLnR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KHJlcXVlc3QuaW5wdXQpKTsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVxdWVzdC5jb25maWcpKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKHJlcXVlc3QuZGV2aWNlKSk7CisKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvcGVuSW5wdXRfbCgKLSAgICAgICAgICAgIG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MsIEFVRElPX0RFVklDRV9OT05FLCBTdHJpbmc4e30pOworICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChyZXF1ZXN0Lm1vZHVsZSkpLAorICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgIGRldmljZS5tVHlwZSwKKyAgICAgICAgICAgIGRldmljZS5hZGRyZXNzKCkuY19zdHIoKSwKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KHJlcXVlc3Quc291cmNlKSksCisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2F1ZGlvX2lucHV0X2ZsYWdzX21hc2socmVxdWVzdC5mbGFncykpLAorICAgICAgICAgICAgQVVESU9fREVWSUNFX05PTkUsCisgICAgICAgICAgICBTdHJpbmc4e30pOworCisgICAgcmVzcG9uc2UtPmlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlucHV0KSk7CisgICAgcmVzcG9uc2UtPmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnKSk7CisgICAgcmVzcG9uc2UtPmRldmljZSA9IHJlcXVlc3QuZGV2aWNlOwogCiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KQEAgLTI3NzEsNyArMjgzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLApAQCAtMjgwMSw3ICsyODY5LDcgQEAKICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGluSHdIYWwgPSBpbkh3RGV2LT5od0RldmljZSgpOwogICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiBpblN0cmVhbTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsCisgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UsCiAgICAgICAgICAgICBvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZpblN0cmVhbSk7CiAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBkZXZpY2VzICUjeCwgU2FtcGxpbmdSYXRlICVkIgogICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAlI3gsIGZsYWdzICUjeCwgc3RhdHVzICVkIGFkZHIgJXMiLApAQCAtMjgxMSw3ICsyODc5LDcgQEAKICAgICAgICAgICAgIGhhbGNvbmZpZy5mb3JtYXQsCiAgICAgICAgICAgICBoYWxjb25maWcuY2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICBzdGF0dXMsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgc3RhdHVzLCBhZGRyZXNzKTsKIAogICAgIC8vIElmIHRoZSBpbnB1dCBjb3VsZCBub3QgYmUgb3BlbmVkIHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIGFuZCB3ZSBjYW4gaGFuZGxlIHRoZQogICAgIC8vIGNvbnZlcnNpb24gaW50ZXJuYWxseSwgdHJ5IHRvIG9wZW4gYWdhaW4gd2l0aCB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycy4KQEAgLTI4MjUsNyArMjg5Myw3IEBACiAgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgbWFzayIpOwogICAgICAgICBpblN0cmVhbS5jbGVhcigpOwogICAgICAgICBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLAorICAgICAgICAgICAgICAgICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSwKICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZpblN0cmVhbSk7CiAgICAgICAgIC8vIEZJWE1FIGxvZyB0aGlzIG5ldyBzdGF0dXM7IEhBTCBzaG91bGQgbm90IHByb3Bvc2UgYW55IGZ1cnRoZXIgY2hhbmdlcwogICAgIH0KQEAgLTMxNDEsNyArMzIwOSw4IEBACiAvLyBkdW1wVG9UaHJlYWRMb2dfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFRvVGhyZWFkTG9nX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4gJnRocmVhZCkKIHsKLSAgICBhdWRpb191dGlsczo6RmRUb1N0cmluZyBmZFRvU3RyaW5nOworICAgIGNvbnN0ZXhwciBpbnQgVEhSRUFEX0RVTVBfVElNRU9VVF9NUyA9IDI7CisgICAgYXVkaW9fdXRpbHM6OkZkVG9TdHJpbmcgZmRUb1N0cmluZygiLSAiLCBUSFJFQURfRFVNUF9USU1FT1VUX01TKTsKICAgICBjb25zdCBpbnQgZmQgPSBmZFRvU3RyaW5nLmZkKCk7CiAgICAgaWYgKGZkID49IDApIHsKICAgICAgICAgdGhyZWFkLT5kdW1wKGZkLCB7fSAvKiBhcmdzICovKTsKQEAgLTMyOTcsNiArMzM2NiwxNiBAQAogICAgIHJldHVybiBtaW5UaHJlYWQ7CiB9CiAKK0F1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZSAqQXVkaW9GbGluZ2VyOjpoYXB0aWNQbGF5YmFja1RocmVhZF9sKCkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGkgID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKKyAgICAgICAgaWYgKHRocmVhZC0+aGFwdGljQ2hhbm5lbE1hc2soKSAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIHNwPEF1ZGlvRmxpbmdlcjo6U3luY0V2ZW50PiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZVN5bmNFdmVudChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbGlzdGVuZXJTZXNzaW9uLApAQCAtMzQyNywyMyArMzUwNiwyOSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXNwPElFZmZlY3Q+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKLSAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKLSAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgYm9vbCBwcm9iZSwKLSAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgaW50ICppZCwKLSAgICAgICAgaW50ICplbmFibGVkKQotewotICAgIHN0YXR1c190IGxTdGF0dXMgPSBOT19FUlJPUjsKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KGNvbnN0IG1lZGlhOjpDcmVhdGVFZmZlY3RSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlc3BvbnNlKiByZXNwb25zZSkgeworICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQgPSByZXF1ZXN0LmNsaWVudDsKKyAgICBjb25zdCBpbnQzMl90IHByaW9yaXR5ID0gcmVxdWVzdC5wcmlvcml0eTsKKyAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKHJlcXVlc3QuZGV2aWNlKSk7CisgICAgY29uc3QgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmcxNihyZXF1ZXN0Lm9wUGFja2FnZU5hbWUpKTsKKyAgICBwaWRfdCBwaWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QocmVxdWVzdC5waWQpKTsKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KHJlcXVlc3Quc2Vzc2lvbklkKSk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChyZXF1ZXN0Lm91dHB1dCkpOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY0luID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0VmZmVjdERlc2NyaXB0b3JfZWZmZWN0X2Rlc2NyaXB0b3JfdChyZXF1ZXN0LmRlc2MpKTsKKyAgICBjb25zdCBib29sIHByb2JlID0gcmVxdWVzdC5wcm9iZTsKKwogICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NPdXQ7CisgICAgaW50IGVuYWJsZWRPdXQgPSAwOworICAgIGludCBpZE91dCA9IC0xOworCisgICAgc3RhdHVzX3QgbFN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICBpZiAocGlkID09IC0xIHx8ICFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewpAQCAtMzQ1NSwxMiArMzU0MCw3IEBACiAgICAgfQogCiAgICAgQUxPR1YoImNyZWF0ZUVmZmVjdCBwaWQgJWQsIGVmZmVjdENsaWVudCAlcCwgcHJpb3JpdHkgJWQsIHNlc3Npb25JZCAlZCwgaW8gJWQsIGZhY3RvcnkgJXAiLAotICAgICAgICAgICAgcGlkLCBlZmZlY3RDbGllbnQuZ2V0KCksIHByaW9yaXR5LCBzZXNzaW9uSWQsIGlvLCBtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpOwotCi0gICAgaWYgKHBEZXNjID09IE5VTEwpIHsKLSAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KKyAgICAgICAgICBwaWQsIGVmZmVjdENsaWVudC5nZXQoKSwgcHJpb3JpdHksIHNlc3Npb25JZCwgaW8sIG1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSk7CiAKICAgICBpZiAobUVmZmVjdHNGYWN0b3J5SGFsID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBubyBlZmZlY3RzIGZhY3RvcnkgaGFsIiwgX19mdW5jX18pOwpAQCAtMzUxNyw3ICszNTk3LDcgQEAKICAgICAgICAgLy8gb3RoZXJ3aXNlIG5vIHByZWZlcmVuY2UuCiAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGUgPSAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkgOiBFRkZFQ1RfRkxBR19UWVBFX01BU0spOwotICAgICAgICBsU3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmcERlc2MtPnV1aWQsICZwRGVzYy0+dHlwZSwgcHJlZmVycmVkVHlwZSwgJmRlc2MpOworICAgICAgICBsU3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmZGVzY0luLnV1aWQsICZkZXNjSW4udHlwZSwgcHJlZmVycmVkVHlwZSwgJmRlc2NPdXQpOwogICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIGdldEVmZmVjdERlc2NyaXB0b3IiLCBsU3RhdHVzKTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTM1MjUsMjYgKzM2MDUsMzQgQEAKIAogICAgICAgICAvLyBEbyBub3QgYWxsb3cgYXV4aWxpYXJ5IGVmZmVjdHMgb24gYSBzZXNzaW9uIGRpZmZlcmVudCBmcm9tIDAgKG91dHB1dCBtaXgpCiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCi0gICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgICAgICAgKGRlc2NPdXQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayByZWNvcmRpbmcgcGVybWlzc2lvbiBmb3IgdmlzdWFsaXplcgotICAgICAgICBpZiAoKG1lbWNtcCgmZGVzYy50eXBlLCBTTF9JSURfVklTVUFMSVpBVElPTiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSAmJgorICAgICAgICBpZiAoKG1lbWNtcCgmZGVzY091dC50eXBlLCBTTF9JSURfVklTVUFMSVpBVElPTiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSAmJgogICAgICAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBzdGFydC9zdG9wIG9wIC0gaS5lLiBpcyB0aGVyZSByZWNvcmRpbmcgYmVpbmcgcGVyZm9ybWVkPwogICAgICAgICAgICAgIXJlY29yZGluZ0FsbG93ZWQob3BQYWNrYWdlTmFtZSwgcGlkLCBjYWxsaW5nVWlkKSkgewogICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAKLSAgICAgICAgLy8gcmV0dXJuIGVmZmVjdCBkZXNjcmlwdG9yCi0gICAgICAgICpwRGVzYyA9IGRlc2M7CisgICAgICAgIGNvbnN0IGJvb2wgaGFwdGljUGxheWJhY2tSZXF1aXJlZCA9IEVmZmVjdE1vZHVsZTo6aXNIYXB0aWNHZW5lcmF0b3IoJmRlc2NPdXQudHlwZSk7CisgICAgICAgIGlmIChoYXB0aWNQbGF5YmFja1JlcXVpcmVkCisgICAgICAgICAgICAgICAgJiYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX0RFVklDRQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSkgeworICAgICAgICAgICAgLy8gaGFwdGljLWdlbmVyYXRpbmcgZWZmZWN0IGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgc2Vzc2lvbiBpZCBpcyBhIGdlbmVyYWwgc2Vzc2lvbiBpZAorICAgICAgICAgICAgbFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKICAgICAgICAgICAgIC8vIGlmIHRoZSBvdXRwdXQgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgaXMgcmVtb3ZlZCBiZWZvcmUgd2UgbG9jayB0aGUKICAgICAgICAgICAgIC8vIG11dGV4IGJlbG93LCB0aGUgY2FsbCB0byBjaGVja1BsYXliYWNrVGhyZWFkX2woaW8pIGJlbG93IHdpbGwgZGV0ZWN0IGl0CiAgICAgICAgICAgICAvLyBhbmQgd2Ugd2lsbCBleGl0IHNhZmVseQotICAgICAgICAgICAgaW8gPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KCZkZXNjKTsKKyAgICAgICAgICAgIGlvID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckVmZmVjdCgmZGVzY091dCk7CiAgICAgICAgICAgICBBTE9HVigiY3JlYXRlRWZmZWN0IGdvdCBvdXRwdXQgJWQiLCBpbyk7CiAgICAgICAgIH0KIApAQCAtMzU1NCwxNSArMzY0MiwxNSBAQAogICAgICAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSByZWdpc3RlclBpZChwaWQpOwogICAgICAgICAgICAgQUxPR1YoIiVzIGRldmljZSB0eXBlICUjeCBhZGRyZXNzICVzIiwgX19mdW5jX18sIGRldmljZS5tVHlwZSwgZGV2aWNlLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICBoYW5kbGUgPSBtRGV2aWNlRWZmZWN0TWFuYWdlci5jcmVhdGVFZmZlY3RfbCgKLSAgICAgICAgICAgICAgICAgICAgJmRlc2MsIGRldmljZSwgY2xpZW50LCBlZmZlY3RDbGllbnQsIG1QYXRjaFBhbmVsLnBhdGNoZXNfbCgpLAotICAgICAgICAgICAgICAgICAgICBlbmFibGVkLCAmbFN0YXR1cywgcHJvYmUpOworICAgICAgICAgICAgICAgICAgICAmZGVzY091dCwgZGV2aWNlLCBjbGllbnQsIGVmZmVjdENsaWVudCwgbVBhdGNoUGFuZWwucGF0Y2hlc19sKCksCisgICAgICAgICAgICAgICAgICAgICZlbmFibGVkT3V0LCAmbFN0YXR1cywgcHJvYmUpOwogICAgICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgbFN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKICAgICAgICAgICAgICAgICBjbGllbnQuY2xlYXIoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG11c3QgYmUgdmFsaWQgaGVyZSwgYnV0IGNoZWNrIGFnYWluIHRvIGJlIHNhZmUuCi0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5nZXQoKSAhPSBudWxscHRyICYmIGlkICE9IG51bGxwdHIpICppZCA9IGhhbmRsZS0+aWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmdldCgpICE9IG51bGxwdHIpIGlkT3V0ID0gaGFuZGxlLT5pZCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZ290byBSZWdpc3RlcjsKICAgICAgICAgfQpAQCAtMzU5Miw4ICszNjgwLDggQEAKICAgICAgICAgICAgIC8vIERldGVjdCBpZiB0aGUgZWZmZWN0IGlzIGNyZWF0ZWQgYWZ0ZXIgYW4gQXVkaW9SZWNvcmQgaXMgZGVzdHJveWVkLgogICAgICAgICAgICAgaWYgKGdldE9ycGhhbkVmZmVjdENoYWluX2woc2Vzc2lvbklkKS5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBlZmZlY3QgJXMgd2l0aCBubyBzcGVjaWZpZWQgaW8gaGFuZGxlIGlzIGRlbmllZCBiZWNhdXNlIHRoZSBBdWRpb1JlY29yZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIHNlc3Npb24gJWQgbm8gbG9uZ2VyIGV4aXN0cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MubmFtZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAiIGZvciBzZXNzaW9uICVkIG5vIGxvbmdlciBleGlzdHMiLAorICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjT3V0Lm5hbWUsIHNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KQEAgLTM2MDcsMTcgKzM2OTUsMjcgQEAKICAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBtUGxheWJhY2tUaHJlYWRzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgICBpbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlRWZmZWN0KCkgZ290IGlvICVkIGZvciBlZmZlY3QgJXMiLCBpbywgZGVzYy5uYW1lKTsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVFZmZlY3QoKSBnb3QgaW8gJWQgZm9yIGVmZmVjdCAlcyIsIGlvLCBkZXNjT3V0Lm5hbWUpOwogICAgICAgICB9IGVsc2UgaWYgKGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbykgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgLy8gYWxsb3cgb25seSBvbmUgZWZmZWN0IGNoYWluIHBlciBzZXNzaW9uSWQgb24gbVBsYXliYWNrVGhyZWFkcy4KICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGNoZWNrSW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChpbyA9PSBjaGVja0lvKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoaW8gPT0gY2hlY2tJbykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFwdGljUGxheWJhY2tSZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5oYXB0aWNDaGFubmVsTWFzaygpID09IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBoYXB0aWMgcGxheWJhY2sgdGhyZWFkIGlzIHJlcXVpcmVkIHdoaWxlIHRoZSByZXF1aXJlZCBwbGF5YmFjayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkKGlvPSVkKSBkb2Vzbid0IHN1cHBvcnQiLCBfX2Z1bmNfXywgKGludClpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzZXNzaW9uVHlwZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIGlmICgoc2Vzc2lvblR5cGUgJiBUaHJlYWRCYXNlOjpFRkZFQ1RfU0VTU0lPTikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGVmZmVjdCAlcyBpbyAlZCBkZW5pZWQgYmVjYXVzZSBzZXNzaW9uICVkIGVmZmVjdCBleGlzdHMgb24gaW8gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLm5hbWUsIChpbnQpaW8sIChpbnQpc2Vzc2lvbklkLCAoaW50KWNoZWNrSW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzY091dC5uYW1lLCAoaW50KSBpbywgKGludCkgc2Vzc2lvbklkLCAoaW50KSBjaGVja0lvKTsKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjMyMzc5NzQiKTsKICAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBFeGl0OwpAQCAtMzY0OSwxNSArMzc0NywzNCBAQAogCiAgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3Qgb24gc2VsZWN0ZWQgb3V0cHV0IHRocmVhZAogICAgICAgICBib29sIHBpbm5lZCA9ICFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihzZXNzaW9uSWQpICYmIGlzU2Vzc2lvbkFjcXVpcmVkX2woc2Vzc2lvbklkKTsKKyAgICAgICAgVGhyZWFkQmFzZSAqb3JpVGhyZWFkID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKGhhcHRpY1BsYXliYWNrUmVxdWlyZWQgJiYgdGhyZWFkLT5oYXB0aWNDaGFubmVsTWFzaygpID09IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgVGhyZWFkQmFzZSAqaGFwdGljVGhyZWFkID0gaGFwdGljUGxheWJhY2tUaHJlYWRfbCgpOworICAgICAgICAgICAgaWYgKGhhcHRpY1RocmVhZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGhhcHRpYyB0aHJlYWQgbm90IGZvdW5kIHdoaWxlIGl0IGlzIHJlcXVpcmVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFwdGljVGhyZWFkICE9IHRocmVhZCkgeworICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRvIHVzZSBoYXB0aWMgdGhyZWFkIGZvciBoYXB0aWMtZ2VuZXJhdGluZyBlZmZlY3QuCisgICAgICAgICAgICAgICAgb3JpVGhyZWFkID0gdGhyZWFkOworICAgICAgICAgICAgICAgIHRocmVhZCA9IGhhcHRpY1RocmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBoYW5kbGUgPSB0aHJlYWQtPmNyZWF0ZUVmZmVjdF9sKGNsaWVudCwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICZkZXNjLCBlbmFibGVkLCAmbFN0YXR1cywgcGlubmVkLCBwcm9iZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NPdXQsICZlbmFibGVkT3V0LCAmbFN0YXR1cywgcGlubmVkLCBwcm9iZSk7CiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIGxTdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOwogICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBoYW5kbGUgbXVzdCBiZSB2YWxpZCBoZXJlLCBidXQgY2hlY2sgYWdhaW4gdG8gYmUgc2FmZS4KLSAgICAgICAgICAgIGlmIChoYW5kbGUuZ2V0KCkgIT0gbnVsbHB0ciAmJiBpZCAhPSBudWxscHRyKSAqaWQgPSBoYW5kbGUtPmlkKCk7CisgICAgICAgICAgICBpZiAoaGFuZGxlLmdldCgpICE9IG51bGxwdHIpIGlkT3V0ID0gaGFuZGxlLT5pZCgpOworICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBhdWRpbyBzZXNzaW9uIHdoZW4gaGFwdGljIHBsYXliYWNrIGlzIGNyZWF0ZWQuCisgICAgICAgICAgICBpZiAoaGFwdGljUGxheWJhY2tSZXF1aXJlZCAmJiBvcmlUaHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGVUcmFja3NGb3JBdWRpb1Nlc3Npb24gd2lsbCB0cmlnZ2VyIGxvY2tpbmcgdGhlIHRocmVhZC4KKyAgICAgICAgICAgICAgICBvcmlUaHJlYWQtPmludmFsaWRhdGVUcmFja3NGb3JBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMzY3NSw5ICszNzkyLDE0IEBACiAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgIH0KIAorICAgIHJlc3BvbnNlLT5pZCA9IGlkT3V0OworICAgIHJlc3BvbnNlLT5lbmFibGVkID0gZW5hYmxlZE91dCAhPSAwOworICAgIHJlc3BvbnNlLT5lZmZlY3QgPSBoYW5kbGU7CisgICAgcmVzcG9uc2UtPmRlc2MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKGRlc2NPdXQpKTsKKwogRXhpdDoKLSAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICByZXR1cm4gaGFuZGxlOworICAgIHJldHVybiBsU3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKQEAgLTM5MjYsMTAgKzQwNDgsMTA5IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvblByZVRyYW5zYWN0KAorICAgICAgICBUcmFuc2FjdGlvbkNvZGUgY29kZSwgY29uc3QgUGFyY2VsJiAvKiBkYXRhICovLCB1aW50MzJfdCAvKiBmbGFncyAqLykKIHsKLSAgICByZXR1cm4gQm5BdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAvLyBtYWtlIHN1cmUgdHJhbnNhY3Rpb25zIHJlc2VydmVkIHRvIEF1ZGlvUG9saWN5TWFuYWdlciBkbyBub3QgY29tZSBmcm9tIG90aGVyIHByb2Nlc3NlcworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX1NUUkVBTV9WT0xVTUU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfU1RSRUFNX01VVEU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpPUEVOX09VVFBVVDoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6Ok9QRU5fRFVQTElDQVRFX09VVFBVVDoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OkNMT1NFX09VVFBVVDoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNVU1BFTkRfT1VUUFVUOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6UkVTVE9SRV9PVVRQVVQ6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpPUEVOX0lOUFVUOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6Q0xPU0VfSU5QVVQ6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpJTlZBTElEQVRFX1NUUkVBTToKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9WT0lDRV9WT0xVTUU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpNT1ZFX0VGRkVDVFM6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfRUZGRUNUX1NVU1BFTkRFRDoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OkxPQURfSFdfTU9EVUxFOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6R0VUX0FVRElPX1BPUlQ6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpDUkVBVEVfQVVESU9fUEFUQ0g6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpSRUxFQVNFX0FVRElPX1BBVENIOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6TElTVF9BVURJT19QQVRDSEVTOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX0FVRElPX1BPUlRfQ09ORklHOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX1JFQ09SRF9TSUxFTkNFRDoKKyAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKKyAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfUkVDT1JEX1NJTEVOQ0VEOgorICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfRUZGRUNUX1NVU1BFTkRFRDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb25zIGNvbWUgZnJvbSBzeXN0ZW0gY29tcG9uZW50cworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX01BU1RFUl9WT0xVTUU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfTUFTVEVSX01VVEU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpNQVNURVJfTVVURToKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9NT0RFOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX01JQ19NVVRFOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX0xPV19SQU1fREVWSUNFOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U1lTVEVNX1JFQURZOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX0FVRElPX0hBTF9QSURTOiB7CisgICAgICAgICAgICBpZiAoIWlzU2VydmljZVVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCisgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTWVNURU1fUkVBRFk6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gTGlzdCBvZiByZWxldmFudCBldmVudHMgdGhhdCB0cmlnZ2VyIGxvZyBtZXJnaW5nLgorICAgIC8vIExvZyBtZXJnaW5nIHNob3VsZCBhY3RpdmF0ZSBkdXJpbmcgYXVkaW8gYWN0aXZpdHkgb2YgYW55IGtpbmQuIFRoaXMgYXJlIGNvbnNpZGVyZWQgdGhlCisgICAgLy8gbW9zdCByZWxldmFudCBldmVudHMuCisgICAgLy8gVE9ETyBzaG91bGQgc2VsZWN0IG1vcmUgd2lzZWx5IHRoZSBpdGVtcyBmcm9tIHRoZSBsaXN0CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpDUkVBVEVfVFJBQ0s6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpDUkVBVEVfUkVDT1JEOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX01BU1RFUl9WT0xVTUU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfTUFTVEVSX01VVEU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfTUlDX01VVEU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfUEFSQU1FVEVSUzoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OkNSRUFURV9FRkZFQ1Q6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTWVNURU1fUkVBRFk6IHsKKyAgICAgICAgICAgIHJlcXVlc3RMb2dNZXJnZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvRmxpbmdlciBjb21tYW5kICIgKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZV90PFRyYW5zYWN0aW9uQ29kZT4+KGNvZGUpKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBjb25uZWN0IHRvIEF1ZGlvIFBvbGljeSBTZXJ2aWNlIGJlZm9yZSBjYWxsaW5nIGludG8gQXVkaW9GbGluZ2VyOgorICAgIC8vICAtIEF1ZGlvRmxpbmdlciBjYW4gY2FsbCBpbnRvIEF1ZGlvIFBvbGljeSBTZXJ2aWNlIHdpdGggaXRzIGdsb2JhbCBtdXRleCBoZWxkCisgICAgLy8gIC0gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBBdWRpbyBQb2xpY3kgU2VydmljZSBpcyBxdWVyaWVkIGZyb20gaW5zaWRlIGF1ZGlvc2VydmVyIHByb2Nlc3MKKyAgICAvLyAgdGhpcyB3aWxsIHRyaWdnZXIgQXVkaW8gUG9saWN5IE1hbmFnZXIgaW5pdGlhbGl6YXRpb24uCisgICAgLy8gIC0gQXVkaW8gUG9saWN5IE1hbmFnZXIgaW5pdGlhbGl6YXRpb24gY2FsbHMgaW50byBBdWRpb0ZsaW5nZXIgd2hpY2ggd2lsbCB0cnkgdG8gbG9jaworICAgIC8vICBpdHMgZ2xvYmFsIG11dGV4IGFuZCBhIGRlYWRsb2NrIHdpbGwgb2NjdXIuCisgICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgeworICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggMjBmNTYxZS4uMWNmMWU2NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtMzMsMTcgKzMzLDE3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUF1ZGlvVHJhY2tDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvb3MvQm5FeHRlcm5hbFZpYnJhdGlvbkNvbnRyb2xsZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmg+CkBAIC05MSwxNSArOTEsMTcgQEAKICNpbmNsdWRlICJUaHJlYWRNZXRyaWNzLmgiCiAjaW5jbHVkZSAiVHJhY2tNZXRyaWNzLmgiCiAKLSNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvb3MvSVBvd2VyTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKICNpbmNsdWRlIDx2aWJyYXRvci9FeHRlcm5hbFZpYnJhdGlvbi5oPgorI2luY2x1ZGUgPHZpYnJhdG9yL0V4dGVybmFsVmlicmF0aW9uVXRpbHMuaD4KIAogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQm5BdWRpb1JlY29yZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQm5FZmZlY3QuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMjEsMjUgKzEyMywxOSBAQAogCiAjZGVmaW5lIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICiAKLWNsYXNzIEF1ZGlvRmxpbmdlciA6Ci0gICAgcHVibGljIEJpbmRlclNlcnZpY2U8QXVkaW9GbGluZ2VyPiwKLSAgICBwdWJsaWMgQm5BdWRpb0ZsaW5nZXIKK2NsYXNzIEF1ZGlvRmxpbmdlciA6IHB1YmxpYyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpEZWxlZ2F0ZQogewotICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPEF1ZGlvRmxpbmdlcj47ICAgLy8gZm9yIEF1ZGlvRmxpbmdlcigpCi0KIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSBBTkRST0lEX0FQSSB7IHJldHVybiAibWVkaWEuYXVkaW9fZmxpbmdlciI7IH0KKyAgICBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZSgpIEFORFJPSURfQVBJOwogCi0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIAogICAgIC8vIElBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlLCBpbiBiaW5kZXIgb3Bjb2RlIG9yZGVyCi0gICAgdmlydHVhbCBzcDxJQXVkaW9UcmFjaz4gY3JlYXRlVHJhY2soY29uc3QgQ3JlYXRlVHJhY2tJbnB1dCYgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVHJhY2tPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICBzdGF0dXNfdCBjcmVhdGVUcmFjayhjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlVHJhY2tSZXNwb25zZSYgb3V0cHV0KSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gY3JlYXRlUmVjb3JkKGNvbnN0IENyZWF0ZVJlY29yZElucHV0JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZWNvcmRPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICBzdGF0dXNfdCBjcmVhdGVSZWNvcmQoY29uc3QgbWVkaWE6OkNyZWF0ZVJlY29yZFJlcXVlc3QmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVzcG9uc2UmIG91dHB1dCkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKQEAgLTE3NSwxNyArMTcxLDEzIEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgY29uc3Q7CiAKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICByZWdpc3RlckNsaWVudChjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCk7CiAKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlKiByZXNwb25zZSk7CiAKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7CkBAIC0xOTYsMTMgKzE4OCw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoY29uc3QgbWVkaWE6Ok9wZW5JbnB1dFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlKiByZXNwb25zZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwogCkBAIC0yMzEsMTkgKzIxOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdDsKIAotICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlc3BvbnNlKiByZXNwb25zZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCk7CkBAIC0yNjQsNyArMjQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyk7CiAKICAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKIAogICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0yOTAsMTEgKzI2Niw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpOwogCi0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgc3RhdHVzX3Qgb25QcmVUcmFuc2FjdChUcmFuc2FjdGlvbkNvZGUgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCB1aW50MzJfdCBmbGFncykgb3ZlcnJpZGU7CiAKICAgICAvLyBlbmQgb2YgSUF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKIApAQCAtNDA1LDcgKzM3Nyw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewogICAgICAgICAgICAgLy8gSGFwdGljIGNoYW5uZWwgbWFzayBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGNoYW5uZWwgcG9zaXRpb24gbWFzay4KICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KGNoYW5uZWxNYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkpOwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWF4Q2hhbm5lbENvdW50ID0ga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMKICAgICAgICAgICAgICAgICAgICAgPyBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTIDogRkNDXzI7CiAgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQpAQCAtNDg4LDEyICs0NjAsMTIgQEAKICAgICBjbGFzcyBOb3RpZmljYXRpb25DbGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Tm90aWZpY2F0aW9uQ2xpZW50KCk7CiAKLSAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiBhdWRpb0ZsaW5nZXJDbGllbnQoKSBjb25zdCB7IHJldHVybiBtQXVkaW9GbGluZ2VyQ2xpZW50OyB9CisgICAgICAgICAgICAgICAgc3A8bWVkaWE6OklBdWRpb0ZsaW5nZXJDbGllbnQ+IGF1ZGlvRmxpbmdlckNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb0ZsaW5nZXJDbGllbnQ7IH0KICAgICAgICAgICAgICAgICBwaWRfdCBnZXRQaWQoKSBjb25zdCB7IHJldHVybiBtUGlkOyB9CiAgICAgICAgICAgICAgICAgdWlkX3QgZ2V0VWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQogCkBAIC01MDYsNyArNDc4LDcgQEAKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiAgbUF1ZGlvRmxpbmdlcjsKICAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgbVBpZDsKICAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgbVVpZDsKLSAgICAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4gbUF1ZGlvRmxpbmdlckNsaWVudDsKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb0ZsaW5nZXJDbGllbnQ+IG1BdWRpb0ZsaW5nZXJDbGllbnQ7CiAgICAgfTsKIAogICAgIC8vIC0tLSBNZWRpYUxvZ05vdGlmaWVyIC0tLQpAQCAtNTM5LDYgKzUxMSw3IEBACiAgICAgY29uc3Qgc3A8TWVkaWFMb2dOb3RpZmllcj4gbU1lZGlhTG9nTm90aWZpZXI7CiAKICAgICAvLyBUaGlzIGlzIGEgaGVscGVyIHRoYXQgaXMgY2FsbGVkIGR1cmluZyBpbmNvbWluZyBiaW5kZXIgY2FsbHMuCisgICAgLy8gUmVxdWVzdHMgbWVkaWEubG9nIHRvIHN0YXJ0IG1lcmdpbmcgbG9nIGJ1ZmZlcnMKICAgICB2b2lkIHJlcXVlc3RMb2dNZXJnZSgpOwogCiAgICAgY2xhc3MgVHJhY2tIYW5kbGU7CkBAIC02MjQsMjcgKzU5NywzMCBAQAogICAgIH0KIAogICAgIC8vIHNlcnZlciBzaWRlIG9mIHRoZSBjbGllbnQncyBJQXVkaW9UcmFjawotICAgIGNsYXNzIFRyYWNrSGFuZGxlIDogcHVibGljIGFuZHJvaWQ6OkJuQXVkaW9UcmFjayB7CisgICAgY2xhc3MgVHJhY2tIYW5kbGUgOiBwdWJsaWMgYW5kcm9pZDo6bWVkaWE6OkJuQXVkaW9UcmFjayB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCAgICAgICAgICAgIFRyYWNrSGFuZGxlKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkOjpUcmFjaz4mIHRyYWNrKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2tIYW5kbGUoKTsKLSAgICAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZmx1c2goKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBwYXVzZSgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7Ci0gICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7Ci0gICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNpZ25hbCgpOyAvLyBzaWduYWwgcGxheWJhY2sgdGhyZWFkIGZvciBhIGNoYW5nZSBpbiBjb250cm9sIGJsb2NrCiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIGdldENibGsoc3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0KGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgZmx1c2goKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgcGF1c2UoKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgYXR0YWNoQXV4RWZmZWN0KGludDMyX3QgZWZmZWN0SWQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHNldFBhcmFtZXRlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc2VsZWN0UHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgZ2V0VGltZXN0YW1wKG1lZGlhOjpBdWRpb1RpbWVzdGFtcEludGVybmFsKiB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBzaWduYWwoKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJPcGVyYXRpb24mIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoCisgICAgICAgICAgICAgICAgaW50MzJfdCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpWb2x1bWVTaGFwZXJTdGF0ZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCBzcDxQbGF5YmFja1RocmVhZDo6VHJhY2s+IG1UcmFjazsKQEAgLTY1OSw3ICs2MzUsNyBAQAogICAgICAgICAgICAgICAgIGludCAvKmF1ZGlvX3Nlc3Npb25fdCovIHRyaWdnZXJTZXNzaW9uKTsKICAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgIHN0b3AoKTsKICAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm9EYXRhPiogYWN0aXZlTWljcm9waG9uZXMpOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKICAgICAgICAgICAgICAgICBpbnQgLyphdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90Ki8gZGlyZWN0aW9uKTsKICAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKQEAgLTY4Miw2ICs2NTgsNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEV4dGVybmFsUG9zaXRpb24odWludDY0X3QgKnBvc2l0aW9uLCBpbnQ2NF90ICp0aW1lTmFub3MpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KGNvbnN0IEF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSk7CkBAIC03MDQsNyArNjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLApAQCAtNzU2LDYgKzczMyw4IEBACiAKICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gZ2V0RWZmZWN0VGhyZWFkX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgaW50IGVmZmVjdElkKTsKIAorICAgICAgICAgICAgICBUaHJlYWRCYXNlICpoYXB0aWNQbGF5YmFja1RocmVhZF9sKCkgY29uc3Q7CisKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZUNsaWVudF9sKHBpZF90IHBpZCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHBpZF90IHBpZCk7CkBAIC03ODIsNyArNzYxLDcgQEAKIAogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPCBzcDxFZmZlY3RNb2R1bGU+ID4gcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOwogCi0gICAgICAgICAgICAgICAgdm9pZCBicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICB2b2lkIGJyb2FkY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgICAgICB2b2lkIHVwZGF0ZU91dERldmljZXNGb3JSZWNvcmRUaHJlYWRzX2woY29uc3QgRGV2aWNlRGVzY3JpcHRvckJhc2VWZWN0b3ImIGRldmljZXMpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2woCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCB1cFN0cmVhbSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcAppbmRleCBkZGExNjRjLi4xNmIyNWY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwCkBAIC05OCw1ICs5OCw5IEBACiAgICAgcmV0dXJuIG1Id0RldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoJnJlc3VsdCkgPT0gT0sgPyByZXN1bHQgOiBmYWxzZTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Id0RldmljZTo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdCB7CisgICAgcmV0dXJuIG1Id0RldmljZS0+Z2V0QXVkaW9Qb3J0KHBvcnQpOworfQorCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAppbmRleCA2NzA5ZDE3Li5mYzJjNjkzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKQEAgLTgzLDYgKzgzLDggQEAKIAogICAgIGJvb2wgc3VwcG9ydHNBdWRpb1BhdGNoZXMoKSBjb25zdDsKIAorICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgY29uc3QgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgY29uc3QgY2hhciAqIGNvbnN0ICAgICAgICAgIG1Nb2R1bGVOYW1lOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwCmluZGV4IDVmZjcyMTUuLmNlY2Q1MmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5jcHAKQEAgLTMwLDYgKzMwLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBtZWRpYTo6SUVmZmVjdENsaWVudDsKKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICBjb25zdCBQYXRjaFBhbmVsOjpQYXRjaCYgcGF0Y2gpIHsKICAgICBBTE9HVigiJXMgaGFuZGxlICVkIG1IYWxIYW5kbGUgJWQgbnVtIHNpbmtzICVkIGRldmljZSBzaW5rICUwOHgiLApAQCAtMTE1LDEwICsxMTcsMTkgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RNYW5hZ2VyOjpjaGVja0VmZmVjdENvbXBhdGliaWxpdHkoCiAgICAgICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpIHsKKyAgICBzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gZWZmZWN0c0ZhY3RvcnkgPSBtQXVkaW9GbGluZ2VyLmdldEVmZmVjdHNGYWN0b3J5KCk7CisgICAgaWYgKGVmZmVjdHNGYWN0b3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLSAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DCi0gICAgICAgICYmIChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0MpIHsKLSAgICAgICAgQUxPR1coIiVzKCkgbm9uIHByZS9wb3N0IHByb2Nlc3NpbmcgZGV2aWNlIGVmZmVjdCAlcyIsIF9fZnVuY19fLCBkZXNjLT5uYW1lKTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc01pbkRldmljZUVmZmVjdEhhbFZlcnNpb24gPSA2LjA7CisgICAgZmxvYXQgaGFsVmVyc2lvbiA9IGVmZmVjdHNGYWN0b3J5LT5nZXRIYWxWZXJzaW9uKCk7CisKKyAgICBpZiAoKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQworICAgICAgICAgICAgJiYgKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykKKyAgICAgICAgICAgIHx8IGhhbFZlcnNpb24gPCBzTWluRGV2aWNlRWZmZWN0SGFsVmVyc2lvbikgeworICAgICAgICBBTE9HVygiJXMoKSBub24gcHJlL3Bvc3QgcHJvY2Vzc2luZyBkZXZpY2UgZWZmZWN0ICVzIG9yIGluY29tcGF0aWJsZSBBUEkgdmVyc2lvbiAlZiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUsIGhhbFZlcnNpb24pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmgKaW5kZXggODFlNjA2NS4uZDE4N2RmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5oCkBAIC0zMyw3ICszMyw3IEBACiAgICAgc3A8RWZmZWN0SGFuZGxlPiBjcmVhdGVFZmZlY3RfbChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBQYXRjaFBhbmVsOjpQYXRjaD4mIHBhdGNoZXMsCiAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkLAogICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCkBAIC0xNjUsNiArMTY1LDcgQEAKICAgICB1aW50MzJfdCAgc2FtcGxlUmF0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsgfQogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsgfQogICAgIHNpemVfdCAgICBmcmFtZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIDA7IH0KICAgICB1aW50MzJfdCAgbGF0ZW5jeSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCAzZGZlYjgzLi5lYWFkNmVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9keW5hbWljc3Byb2Nlc3NpbmcuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfaGFwdGljZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3Zpc3VhbGl6ZXIuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgpAQCAtMzMsNiArMzQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgorI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KQEAgLTU4LDYgKzYwLDI3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgYmluZGVyOjpTdGF0dXM7CisKK25hbWVzcGFjZSB7CisKKy8vIEFwcGVuZCBhIFBPRCB2YWx1ZSBpbnRvIGEgdmVjdG9yIG9mIGJ5dGVzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgYXBwZW5kVG9CdWZmZXIoY29uc3QgVCYgdmFsdWUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBidWZmZXIpIHsKKyAgICBjb25zdCB1aW50OF90KiBhcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmdmFsdWUpKTsKKyAgICBidWZmZXItPmluc2VydChidWZmZXItPmVuZCgpLCBhciwgYXIgKyBzaXplb2YoVCkpOworfQorCisvLyBXcml0ZSBhIFBPRCB2YWx1ZSBpbnRvIGEgdmVjdG9yIG9mIGJ5dGVzIChjbGVhcnMgdGhlIHByZXZpb3VzIGJ1ZmZlcgorLy8gY29udGVudCkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCB3cml0ZVRvQnVmZmVyKGNvbnN0IFQmIHZhbHVlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogYnVmZmVyKSB7CisgICAgYnVmZmVyLT5jbGVhcigpOworICAgIGFwcGVuZFRvQnVmZmVyKHZhbHVlLCBidWZmZXIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gIEVmZmVjdEJhc2UgaW1wbGVtZW50YXRpb24KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI5Miw2ICszMTUsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gUHJldmVudCBjYWxscyB0byBwcm9jZXNzKCkgYW5kIG90aGVyIGZ1bmN0aW9ucyBvbiBlZmZlY3QgaW50ZXJmYWNlIGZyb20gbm93IG9uLgorICAgIC8vIFRoZSBlZmZlY3QgZW5naW5lIHdpbGwgYmUgcmVsZWFzZWQgYnkgdGhlIGRlc3RydWN0b3Igd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9uCisgICAgLy8gdGhpcyBvYmplY3QgaXMgcmVsZWFzZWQgd2hpY2ggY2FuIGhhcHBlbiBhZnRlciBuZXh0IHByb2Nlc3MgaXMgY2FsbGVkLgogICAgIGlmIChtSGFuZGxlcy5zaXplKCkgPT0gMCAmJiAhbVBpbm5lZCkgewogICAgICAgICBtU3RhdGUgPSBERVNUUk9ZRUQ7CiAgICAgfQpAQCAtNTY1LDIwICs1OTEsNiBAQAogCiB9CiAKLXNzaXplX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnJlbW92ZUhhbmRsZV9sKEVmZmVjdEhhbmRsZSAqaGFuZGxlKQotewotICAgIHNzaXplX3Qgc3RhdHVzID0gRWZmZWN0QmFzZTo6cmVtb3ZlSGFuZGxlX2woaGFuZGxlKTsKLQotICAgIC8vIFByZXZlbnQgY2FsbHMgdG8gcHJvY2VzcygpIGFuZCBvdGhlciBmdW5jdGlvbnMgb24gZWZmZWN0IGludGVyZmFjZSBmcm9tIG5vdyBvbi4KLSAgICAvLyBUaGUgZWZmZWN0IGVuZ2luZSB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBkZXN0cnVjdG9yIHdoZW4gdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBvbgotICAgIC8vIHRoaXMgb2JqZWN0IGlzIHJlbGVhc2VkIHdoaWNoIGNhbiBoYXBwZW4gYWZ0ZXIgbmV4dCBwcm9jZXNzIGlzIGNhbGxlZC4KLSAgICBpZiAoc3RhdHVzID09IDAgJiYgIW1QaW5uZWQpIHsKLSAgICAgICAgbUVmZmVjdEludGVyZmFjZS0+Y2xvc2UoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjp1cGRhdGVTdGF0ZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCkBAIC04NzksNiArODkxLDExIEBACiAgICAgICAgIH0KICNlbmRpZgogICAgIH0KKyAgICBpZiAoaXNIYXB0aWNHZW5lcmF0b3IoKSkgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzayA9IG1DYWxsYmFjay0+aGFwdGljQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyB8PSBoYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgfD0gaGFwdGljQ2hhbm5lbE1hc2s7CisgICAgfQogICAgIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCA9CiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAgICAgbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCA9CkBAIC0xMTYwLDExICsxMTc3LDEwIEBACiAgICAgcmV0dXJuIHJlbWFpbmRlciA9PSAwID8gMCA6IGRpdmlzb3IgLSByZW1haW5kZXI7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpjb21tYW5kKGludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhSZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogcmVwbHkpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVlYoImNvbW1hbmQoKSwgY21kQ29kZTogJWQsIG1FZmZlY3RJbnRlcmZhY2U6ICVwIiwgY21kQ29kZSwgbUVmZmVjdEludGVyZmFjZS5nZXQoKSk7CkBAIC0xMTc1LDYzICsxMTkxLDY4IEBACiAgICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CiAgICAgfQorICAgIGlmIChtYXhSZXBseVNpemUgPCAwIHx8IG1heFJlcGx5U2l6ZSA+IEVGRkVDVF9QQVJBTV9TSVpFX01BWCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc2l6ZV90IGNtZFNpemUgPSBjbWREYXRhLnNpemUoKTsKKyAgICBjb25zdCBlZmZlY3RfcGFyYW1fdCogcGFyYW0gPSBjbWRTaXplID49IHNpemVvZihlZmZlY3RfcGFyYW1fdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZWZmZWN0X3BhcmFtX3QqPihjbWREYXRhLmRhdGEoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CiAgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfUEFSQU0gJiYKLSAgICAgICAgICAgIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpID4gY21kU2l6ZSB8fAotICAgICAgICAgICAgICAgICAgICAoKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGEpLT5wc2l6ZSA+IGNtZFNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpKSB7CisgICAgICAgICAgICAocGFyYW0gPT0gbnVsbHB0ciB8fCBwYXJhbS0+cHNpemUgPiBjbWRTaXplIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSkpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzODU5NCIpOwogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMzMDAzODIyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAmJgotICAgICAgICAgICAgKCpyZXBseVNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YSktPnBzaXplID4gKnJlcGx5U2l6ZSAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpKSB7CisgICAgICAgICAgICAobWF4UmVwbHlTaXplIDwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fAorICAgICAgICAgICAgICAgICAgIHBhcmFtLT5wc2l6ZSA+IG1heFJlcGx5U2l6ZSAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjkyNTE1NTMiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX1BBUkFNICYmCi0gICAgICAgIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpID4gKnJlcGx5U2l6ZQotICAgICAgICAgIHx8ICgoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YSktPnBzaXplID4gKnJlcGx5U2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCi0gICAgICAgICAgfHwgKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+dnNpemUgPiAqcmVwbHlTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUKLSAgICAgICAgICB8fCByb3VuZFVwRGVsdGEoKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUsICh1aW50MzJfdClzaXplb2YoaW50KSkgPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YSktPnBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YSktPnZzaXplKSkgeworICAgICAgICAgICAgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgPiBtYXhSZXBseVNpemUKKyAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnBzaXplID4gbWF4UmVwbHlTaXplIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KQorICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+dnNpemUgPiBtYXhSZXBseVNpemUgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwYXJhbS0+cHNpemUKKyAgICAgICAgICAgICAgICAgICAgfHwgcm91bmRVcERlbHRhKHBhcmFtLT5wc2l6ZSwgKHVpbnQzMl90KSBzaXplb2YoaW50KSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlcGx5U2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBhcmFtLT5wc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwYXJhbS0+dnNpemUpKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVGRkVDVF9DTURfR0VUX1BBUkFNOiByZXBseSBzaXplIGluY29uc2lzdGVudCIpOwogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjcwNTQzOCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgaWYgKChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX1BBUkFNCi0gICAgICAgICAgICB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVEKSAmJiAgLy8gREVGRVJSRUQgbm90IGdlbmVyYWxseSB1c2VkCi0gICAgICAgIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpID4gY21kU2l6ZQotICAgICAgICAgICAgfHwgKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUgPiBjbWRTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KQotICAgICAgICAgICAgfHwgKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+dnNpemUgPiBjbWRTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YSktPnBzaXplCi0gICAgICAgICAgICB8fCByb3VuZFVwRGVsdGEoKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUsICh1aW50MzJfdClzaXplb2YoaW50KSkgPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YSktPnBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+dnNpemUpKSB7CisgICAgICAgICAgICB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVEKQorICAgICAgICAgICAgJiYgIC8vIERFRkVSUkVEIG5vdCBnZW5lcmFsbHkgdXNlZAorICAgICAgICAgICAgICAgICAgICAocGFyYW0gPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5wc2l6ZSA+IGNtZFNpemUgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnZzaXplID4gY21kU2l6ZSAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcGFyYW0tPnBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcm91bmRVcERlbHRhKHBhcmFtLT5wc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBzaXplb2YoaW50KSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwYXJhbS0+cHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwYXJhbS0+dnNpemUpKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzAyMDQzMDEiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQorICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IG1heFJlcGx5U2l6ZTsKKyAgICByZXBseS0+cmVzaXplKHJlcGx5U2l6ZSk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVmZmVjdEludGVyZmFjZS0+Y29tbWFuZChjbWRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihjbWREYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHktPmRhdGEoKSk7CisgICAgcmVwbHktPnJlc2l6ZShzdGF0dXMgPT0gTk9fRVJST1IgPyByZXBseVNpemUgOiAwKTsKICAgICBpZiAoY21kQ29kZSAhPSBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAmJiBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgdWludDMyX3Qgc2l6ZSA9IChyZXBseVNpemUgPT0gTlVMTCkgPyAwIDogKnJlcGx5U2l6ZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtSGFuZGxlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRWZmZWN0SGFuZGxlICpoID0gbUhhbmRsZXNbaV07CiAgICAgICAgICAgICBpZiAoaCAhPSBOVUxMICYmICFoLT5kaXNjb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIGgtPmNvbW1hbmRFeGVjdXRlZChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgc2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgICAgICAgICAgICAgaC0+Y29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZERhdGEsICpyZXBseSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTIyLDYgKzE1NDMsNDEgQEAKICAgICByZXR1cm4gbU9mZmxvYWRlZDsKIH0KIAorLypzdGF0aWMqLworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNIYXB0aWNHZW5lcmF0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSkgeworICAgIHJldHVybiBtZW1jbXAodHlwZSwgRlhfSUlEX0hBUFRJQ0dFTkVSQVRPUiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwOworfQorCitib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppc0hhcHRpY0dlbmVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNIYXB0aWNHZW5lcmF0b3IoJm1EZXNjcmlwdG9yLnR5cGUpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0SGFwdGljSW50ZW5zaXR5KGludCBpZCwgaW50IGludGVuc2l0eSkKK3sKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gbVN0YXR1czsKKyAgICB9CisgICAgaWYgKCFpc0hhcHRpY0dlbmVyYXRvcigpKSB7CisgICAgICAgIEFMT0dXKCJTaG91bGQgbm90IHNldCBoYXB0aWMgaW50ZW5zaXR5IGZvciBlZmZlY3RzIHRoYXQgYXJlIG5vdCBIYXB0aWNHZW5lcmF0b3IiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Qoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIDMgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBlZmZlY3RfcGFyYW1fdCAqcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QqKSByZXF1ZXN0LmRhdGEoKTsKKyAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoaW50MzJfdCk7CisgICAgcGFyYW0tPnZzaXplID0gc2l6ZW9mKGludDMyX3QpICogMjsKKyAgICAqKGludDMyX3QqKXBhcmFtLT5kYXRhID0gSEdfUEFSQU1fSEFQVElDX0lOVEVOU0lUWTsKKyAgICAqKChpbnQzMl90KilwYXJhbS0+ZGF0YSArIDEpID0gaWQ7CisgICAgKigoaW50MzJfdCopcGFyYW0tPmRhdGEgKyAyKSA9IGludGVuc2l0eTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNLCByZXF1ZXN0LCBzaXplb2YoaW50MzJfdCksICZyZXNwb25zZSk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3BvbnNlLnNpemUoKSAhPSA0KTsKKyAgICAgICAgc3RhdHVzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RhdHVzX3QqPihyZXNwb25zZS5kYXRhKCkpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEluT3V0QnVmZmVyKGJvb2wgaXNJbnB1dCwgY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiAmYnVmZmVyKSB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAKQEAgLTE2MDAsOSArMTY1Niw5IEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlIgogCiBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6RWZmZWN0SGFuZGxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkpCiAgICAgOiBCbkVmZmVjdCgpLAogICAgIG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdENsaWVudChlZmZlY3RDbGllbnQpLCBtQ2xpZW50KGNsaWVudCksIG1DYmxrKE5VTEwpLAogICAgIG1Qcmlvcml0eShwcmlvcml0eSksIG1IYXNDb250cm9sKGZhbHNlKSwgbUVuYWJsZWQoZmFsc2UpLCBtRGlzY29ubmVjdGVkKGZhbHNlKQpAQCAtMTYzNiwyMCArMTY5MiwyNCBAQAogICAgIHJldHVybiBtQ2xpZW50ID09IDAgfHwgbUNibGtNZW1vcnkgIT0gMCA/IE9LIDogTk9fTUVNT1JZOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZW5hYmxlKCkKKyNkZWZpbmUgUkVUVVJOKGNvZGUpIFwKKyAgKl9haWRsX3JldHVybiA9IChjb2RlKTsgXAorICByZXR1cm4gU3RhdHVzOjpvaygpOworCitTdGF0dXMgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmVuYWJsZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pCiB7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKICAgICBBTE9HVigiZW5hYmxlICVwIiwgdGhpcyk7CiAgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgaWYgKGVmZmVjdCA9PSAwIHx8IG1EaXNjb25uZWN0ZWQpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICBSRVRVUk4oREVBRF9PQkpFQ1QpOwogICAgIH0KICAgICBpZiAoIW1IYXNDb250cm9sKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgUkVUVVJOKElOVkFMSURfT1BFUkFUSU9OKTsKICAgICB9CiAKICAgICBpZiAobUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBSRVRVUk4oTk9fRVJST1IpOwogICAgIH0KIAogICAgIG1FbmFibGVkID0gdHJ1ZTsKQEAgLTE2NTcsNTQgKzE3MTcsNTUgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBlZmZlY3QtPnVwZGF0ZVBvbGljeVN0YXRlKCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBSRVRVUk4oc3RhdHVzKTsKICAgICB9CiAKICAgICBlZmZlY3QtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZCh0cnVlLCBmYWxzZSAvKnRocmVhZExvY2tlZCovKTsKIAogICAgIC8vIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZCgpIGNhbiBzdXNwZW5kIHRoaXMgc2FtZSBlZmZlY3Qgd2hlbiBlbmFibGVkCiAgICAgaWYgKGVmZmVjdC0+c3VzcGVuZGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBSRVRVUk4oTk9fRVJST1IpOwogICAgIH0KIAogICAgIHN0YXR1cyA9IGVmZmVjdC0+c2V0RW5hYmxlZCh0cnVlLCB0cnVlIC8qZnJvbUhhbmRsZSovKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgUkVUVVJOKHN0YXR1cyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkaXNhYmxlKCkKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZGlzYWJsZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pCiB7CiAgICAgQUxPR1YoImRpc2FibGUgJXAiLCB0aGlzKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgIHNwPEVmZmVjdEJhc2U+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgIGlmIChlZmZlY3QgPT0gMCB8fCBtRGlzY29ubmVjdGVkKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgUkVUVVJOKERFQURfT0JKRUNUKTsKICAgICB9CiAgICAgaWYgKCFtSGFzQ29udHJvbCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIFJFVFVSTihJTlZBTElEX09QRVJBVElPTik7CiAgICAgfQogCiAgICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIFJFVFVSTihOT19FUlJPUik7CiAgICAgfQogICAgIG1FbmFibGVkID0gZmFsc2U7CiAKICAgICBlZmZlY3QtPnVwZGF0ZVBvbGljeVN0YXRlKCk7CiAKICAgICBpZiAoZWZmZWN0LT5zdXNwZW5kZWQoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIFJFVFVSTihOT19FUlJPUik7CiAgICAgfQogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZWZmZWN0LT5zZXRFbmFibGVkKGZhbHNlLCB0cnVlIC8qZnJvbUhhbmRsZSovKTsKLSAgICByZXR1cm4gc3RhdHVzOworICAgIFJFVFVSTihzdGF0dXMpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkaXNjb25uZWN0KCkKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZGlzY29ubmVjdCgpCiB7CiAgICAgQUxPR1YoIiVzICVwIiwgX19GVU5DVElPTl9fLCB0aGlzKTsKICAgICBkaXNjb25uZWN0KHRydWUpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmRpc2Nvbm5lY3QoYm9vbCB1bnBpbklmTGFzdCkKQEAgLTE3NDEsMTEgKzE4MDIsMTYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6Z2V0Q2JsayhtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbiogX2FpZGxfcmV0dXJuKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighY29udmVydElNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24obUNibGtNZW1vcnksIF9haWRsX3JldHVybikpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6Y29tbWFuZChpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJlc3BvbnNlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pCiB7CiAgICAgQUxPR1ZWKCJjb21tYW5kKCksIGNtZENvZGU6ICVkLCBtSGFzQ29udHJvbDogJWQsIG1FZmZlY3Q6ICVwIiwKICAgICAgICAgICAgIGNtZENvZGUsIG1IYXNDb250cm9sLCBtRWZmZWN0LnVuc2FmZV9nZXQoKSk7CkBAIC0xNzY1LDQ5ICsxODMxLDQ2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYyMDE5OTkyIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgUkVUVVJOKEJBRF9WQUxVRSk7CiAgICAgfQogCiAgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9FTkFCTEUpIHsKLSAgICAgICAgaWYgKCpyZXBseVNpemUgPCBzaXplb2YoaW50KSkgeworICAgICAgICBpZiAobWF4UmVzcG9uc2VTaXplIDwgc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIwOTU3MTMiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBSRVRVUk4oQkFEX1ZBTFVFKTsKICAgICAgICAgfQotICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBOT19FUlJPUjsKLSAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICByZXR1cm4gZW5hYmxlKCk7CisgICAgICAgIHdyaXRlVG9CdWZmZXIoTk9fRVJST1IsIHJlc3BvbnNlKTsKKyAgICAgICAgcmV0dXJuIGVuYWJsZShfYWlkbF9yZXR1cm4pOwogICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0RJU0FCTEUpIHsKLSAgICAgICAgaWYgKCpyZXBseVNpemUgPCBzaXplb2YoaW50KSkgeworICAgICAgICBpZiAobWF4UmVzcG9uc2VTaXplIDwgc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIwOTU3MTMiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBSRVRVUk4oQkFEX1ZBTFVFKTsKICAgICAgICAgfQotICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBOT19FUlJPUjsKLSAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICByZXR1cm4gZGlzYWJsZSgpOworICAgICAgICB3cml0ZVRvQnVmZmVyKE5PX0VSUk9SLCByZXNwb25zZSk7CisgICAgICAgIHJldHVybiBkaXNhYmxlKF9haWRsX3JldHVybik7CiAgICAgfQogCiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKICAgICBzcDxFZmZlY3RCYXNlPiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICBpZiAoZWZmZWN0ID09IDAgfHwgbURpc2Nvbm5lY3RlZCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIFJFVFVSTihERUFEX09CSkVDVCk7CiAgICAgfQogICAgIC8vIG9ubHkgZ2V0IHBhcmFtZXRlciBjb21tYW5kIGlzIHBlcm1pdHRlZCBmb3IgYXBwbGljYXRpb25zIG5vdCBjb250cm9sbGluZyB0aGUgZWZmZWN0CiAgICAgaWYgKCFtSGFzQ29udHJvbCAmJiBjbWRDb2RlICE9IEVGRkVDVF9DTURfR0VUX1BBUkFNKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgUkVUVVJOKElOVkFMSURfT1BFUkFUSU9OKTsKICAgICB9CiAKICAgICAvLyBoYW5kbGUgY29tbWFuZHMgdGhhdCBhcmUgbm90IGZvcndhcmRlZCB0cmFuc3BhcmVudGx5IHRvIGVmZmVjdCBlbmdpbmUKICAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQpIHsKICAgICAgICAgaWYgKG1DbGllbnQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgUkVUVVJOKElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgqcmVwbHlTaXplIDwgc2l6ZW9mKGludCkpIHsKKyAgICAgICAgaWYgKG1heFJlc3BvbnNlU2l6ZSA8IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyMDk1NzEzIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgUkVUVVJOKEJBRF9WQUxVRSk7CiAgICAgICAgIH0KLSAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gTk9fRVJST1I7Ci0gICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgd3JpdGVUb0J1ZmZlcihOT19FUlJPUiwgcmVzcG9uc2UpOwogCiAgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJ5bG9jaygpIGhlcmUgYXMgdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBpbiB0aGUgYmluZGVyIHRocmVhZCBzZXJ2aW5nIGEKICAgICAgICAgLy8gcGFydGljdWxhciBjbGllbnQgcHJvY2VzczogIG5vIHJpc2sgdG8gYmxvY2sgdGhlIHdob2xlIG1lZGlhIHNlcnZlciBwcm9jZXNzIG9yIG1peGVyCkBAIC0xODIwLDEwICsxODgzLDEwIEBACiAgICAgICAgICAgICBzZXJ2ZXJJbmRleCA+IEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSkgewogICAgICAgICAgICAgbUNibGstPnNlcnZlckluZGV4ID0gMDsKICAgICAgICAgICAgIG1DYmxrLT5jbGllbnRJbmRleCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgUkVUVVJOKEJBRF9WQUxVRSk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIGVmZmVjdF9wYXJhbV90ICpwYXJhbSA9IE5VTEw7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcmFtOwogICAgICAgICBmb3IgKHVpbnQzMl90IGluZGV4ID0gc2VydmVySW5kZXg7IGluZGV4IDwgY2xpZW50SW5kZXg7KSB7CiAgICAgICAgICAgICBpbnQgKnAgPSAoaW50ICopKG1CdWZmZXIgKyBpbmRleCk7CiAgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSA9ICpwKys7CkBAIC0xODM1LDIzICsxODk4LDE2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIGNvcHkgdG8gbG9jYWwgbWVtb3J5IGluIGNhc2Ugb2YgY2xpZW50IGNvcnJ1cHRpb24gYi8zMjIyMDc2OQotICAgICAgICAgICAgYXV0byAqbmV3UGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKilyZWFsbG9jKHBhcmFtLCBzaXplKTsKLSAgICAgICAgICAgIGlmIChuZXdQYXJhbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvbW1hbmQoKTogb3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtID0gbmV3UGFyYW07Ci0gICAgICAgICAgICBtZW1jcHkocGFyYW0sIHAsIHNpemUpOworICAgICAgICAgICAgc3RkOjpjb3B5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHApLAorICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHApICsgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIocGFyYW0pKTsKIAotICAgICAgICAgICAgaW50IHJlcGx5ID0gMDsKLSAgICAgICAgICAgIHVpbnQzMl90IHJzaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcGx5QnVmZmVyOwogICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gZWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5QnVmZmVyKTsKKyAgICAgICAgICAgIGludCByZXBseSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGludCo+KHJlcGx5QnVmZmVyLmRhdGEoKSk7CiAKICAgICAgICAgICAgIC8vIHZlcmlmeSBzaGFyZWQgbWVtb3J5OiBzZXJ2ZXIgaW5kZXggc2hvdWxkbid0IGNoYW5nZTsgY2xpZW50IGluZGV4IGNhbid0IGdvIGJhY2suCiAgICAgICAgICAgICBpZiAoc2VydmVySW5kZXggIT0gbUNibGstPnNlcnZlckluZGV4CkBAIC0xODY0LDIxICsxOTIwLDI0IEBACiAgICAgICAgICAgICAvLyBzdG9wIGF0IGZpcnN0IGVycm9yIGVuY291bnRlcmVkCiAgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmV0OwotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IHJlcGx5OworICAgICAgICAgICAgICAgIHdyaXRlVG9CdWZmZXIocmVwbHksIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVwbHkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSByZXBseTsKKyAgICAgICAgICAgICAgICB3cml0ZVRvQnVmZmVyKHJlcGx5LCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbmRleCArPSBzaXplOwogICAgICAgICB9Ci0gICAgICAgIGZyZWUocGFyYW0pOwogICAgICAgICBtQ2Jsay0+c2VydmVySW5kZXggPSAwOwogICAgICAgICBtQ2Jsay0+Y2xpZW50SW5kZXggPSAwOwotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBSRVRVUk4oc3RhdHVzKTsKICAgICB9CiAKLSAgICByZXR1cm4gZWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXNwb25zZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKTsKKyAgICBSRVRVUk4oc3RhdHVzKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6c2V0Q29udHJvbChib29sIGhhc0NvbnRyb2wsIGJvb2wgc2lnbmFsLCBib29sIGVuYWJsZWQpCkBAIC0xODk0LDEzICsxOTUzLDExIEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlcGx5RGF0YSkKIHsKICAgICBpZiAobUVmZmVjdENsaWVudCAhPSAwKSB7Ci0gICAgICAgIG1FZmZlY3RDbGllbnQtPmNvbW1hbmRFeGVjdXRlZChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgbUVmZmVjdENsaWVudC0+Y29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZERhdGEsIHJlcGx5RGF0YSk7CiAgICAgfQogfQogCkBAIC0xOTEzLDEzICsxOTcwLDYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIEJuRWZmZWN0OjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLQogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZHVtcFRvQnVmZmVyKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgICAgYm9vbCBsb2NrZWQgPSBtQ2JsayAhPSBOVUxMICYmIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUNibGstPmxvY2spOwpAQCAtMjM4NSw2ICsyNDM1LDI1IEBACiAgICAgfQogfQogCisvLyBjb250YWluc0hhcHRpY0dlbmVyYXRpbmdFZmZlY3RfbCBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIG9yIEVmZmVjdENoYWluOjptTG9jayBoZWxkCitib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmNvbnRhaW5zSGFwdGljR2VuZXJhdGluZ0VmZmVjdF9sKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtRWZmZWN0c1tpXS0+aXNIYXB0aWNHZW5lcmF0b3IoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnNldEhhcHRpY0ludGVuc2l0eV9sKGludCBpZCwgaW50IGludGVuc2l0eSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbUVmZmVjdHNbaV0tPnNldEhhcHRpY0ludGVuc2l0eShpZCwgaW50ZW5zaXR5KTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c3luY0hhbEVmZmVjdHNTdGF0ZSgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTI4MzksNiArMjkwOCwxNCBAQAogICAgIHJldHVybiB0LT5jaGFubmVsQ291bnQoKTsKIH0KIAorYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmhhcHRpY0NoYW5uZWxNYXNrKCkgY29uc3QgeworICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIHJldHVybiB0LT5oYXB0aWNDaGFubmVsTWFzaygpOworfQorCiBzaXplX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmZyYW1lQ291bnQoKSBjb25zdCB7CiAgICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKQEAgLTI5NDMsMTAgKzMwMjAsMTQgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVByb3h5TG9jayk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IG1FZmZlY3RIYW5kbGVzKSB7CisgICAgICAgICAgICBTdGF0dXMgYnM7CiAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGhhbmRsZS5zZWNvbmQtPmVuYWJsZSgpOworICAgICAgICAgICAgICAgIGJzID0gaGFuZGxlLnNlY29uZC0+ZW5hYmxlKCZzdGF0dXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBoYW5kbGUuc2Vjb25kLT5kaXNhYmxlKCk7CisgICAgICAgICAgICAgICAgYnMgPSBoYW5kbGUuc2Vjb25kLT5kaXNhYmxlKCZzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFicy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgc3RhdHVzID0gYnMudHJhbnNhY3Rpb25FcnJvcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzAwNSw3ICszMDg2LDcgQEAKICAgICAgICAgICAgIF9fZnVuY19fLCBwb3J0LT50eXBlLCBwb3J0LT5leHQuZGV2aWNlLnR5cGUsCiAgICAgICAgICAgICBwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIHBvcnQtPmlkLCBwYXRjaC5pc1NvZnR3YXJlKCkpOwogICAgIGlmIChwb3J0LT50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfHwgcG9ydC0+ZXh0LmRldmljZS50eXBlICE9IG1EZXZpY2UubVR5cGUKLSAgICAgICAgfHwgcG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzICE9IG1EZXZpY2UubUFkZHJlc3MpIHsKKyAgICAgICAgfHwgcG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzICE9IG1EZXZpY2UuYWRkcmVzcygpKSB7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CkBAIC0zMDU0LDEwICszMTM1LDE0IEBACiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiB8fCBzdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgU3RhdHVzIGJzOwogICAgICAgICBpZiAoaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICgqaGFuZGxlKS0+ZW5hYmxlKCk7CisgICAgICAgICAgICBicyA9ICgqaGFuZGxlKS0+ZW5hYmxlKCZzdGF0dXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKCpoYW5kbGUpLT5kaXNhYmxlKCk7CisgICAgICAgICAgICBicyA9ICgqaGFuZGxlKS0+ZGlzYWJsZSgmc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWJzLmlzT2soKSkgeworICAgICAgICAgICAgc3RhdHVzID0gYnMudHJhbnNhY3Rpb25FcnJvcigpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAppbmRleCAyODI2Mjk3Li4wM2JkYzYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKQEAgLTM2LDYgKzM2LDcgQEAKICAgICB2aXJ0dWFsIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdCA9IDA7CiAKICAgICAvLyBOb24gdHJpdmlhbCBtZXRob2RzIHVzdWFsbHkgaW1wbGVtZW50ZWQgd2l0aCBoZWxwIGZyb20gVGhyZWFkQmFzZToKQEAgLTEzMiwxMSArMTMzLDEwIEBACiAgICAgdm9pZCAgICAgICAgICAgICBzZXRTdXNwZW5kZWQoYm9vbCBzdXNwZW5kZWQpOwogICAgIGJvb2wgICAgICAgICAgICAgc3VzcGVuZGVkKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEgX191bnVzZWQpIHsgcmV0dXJuIE5PX0VSUk9SOyB9OworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZChpbnQzMl90IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfX3VudXNlZCkgeyByZXR1cm4gTk9fRVJST1I7IH07CiAKICAgICB2b2lkIHNldENhbGxiYWNrKGNvbnN0IHNwPEVmZmVjdENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2spIHsgbUNhbGxiYWNrID0gY2FsbGJhY2s7IH0KICAgICBzcDxFZmZlY3RDYWxsYmFja0ludGVyZmFjZT4mICAgICBjYWxsYmFjaygpIHsgcmV0dXJuIG1DYWxsYmFjazsgfQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgc3RhdHVzX3QgYWRkSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKICAgICBzc2l6ZV90IGRpc2Nvbm5lY3RIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUsIGJvb2wgdW5waW5JZkxhc3QpOwogICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpOworICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpOwogICAgIEVmZmVjdEhhbmRsZSogY29udHJvbEhhbmRsZV9sKCk7CiAgICAgYm9vbCBwdXJnZUhhbmRsZXMoKTsKIApAQCAtMjEzLDExICsyMTMsMTAgQEAKIAogICAgIHZvaWQgcHJvY2VzcygpOwogICAgIGJvb2wgdXBkYXRlU3RhdGUoKTsKLSAgICBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY29tbWFuZChpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgY21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4UmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIHJlcGx5KSBvdmVycmlkZTsKIAogICAgIHZvaWQgcmVzZXRfbCgpOwogICAgIHN0YXR1c190IGNvbmZpZ3VyZSgpOwpAQCAtMjQwLDggKzIzOSw2IEBACiAgICAgICAgIHJldHVybiBtT3V0QnVmZmVyICE9IDAgPyByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtT3V0QnVmZmVyLT5wdHIoKSkgOiBOVUxMOwogICAgIH0KIAotICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpIG92ZXJyaWRlOwotCiAgICAgc3RhdHVzX3QgICAgICAgICBzZXREZXZpY2VzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOwogICAgIHN0YXR1c190ICAgICAgICAgc2V0SW5wdXREZXZpY2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKICAgICBzdGF0dXNfdCAgICAgICAgIHNldFZvbHVtZSh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGNvbnRyb2xsZXIpOwpAQCAtMjU3LDYgKzI1NCwxMSBAQAogCiAgICAgc3A8RWZmZWN0TW9kdWxlPiBhc0VmZmVjdE1vZHVsZSgpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KIAorICAgIHN0YXRpYyBib29sICAgICAgaXNIYXB0aWNHZW5lcmF0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCogdHlwZSk7CisgICAgYm9vbCAgICAgICAgICAgICBpc0hhcHRpY0dlbmVyYXRvcigpIGNvbnN0OworCisgICAgc3RhdHVzX3QgICAgICAgICBzZXRIYXB0aWNJbnRlbnNpdHkoaW50IGlkLCBpbnQgaW50ZW5zaXR5KTsKKwogICAgIHZvaWQgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcml2YXRlOgpAQCAtMzE2LDMyICszMTgsMjkgQEAKIC8vIFRoZXJlIGlzIG9uZSBFZmZlY3RIYW5kbGUgb2JqZWN0IGZvciBlYWNoIGFwcGxpY2F0aW9uIGNvbnRyb2xsaW5nIChvciB1c2luZykKIC8vIGFuIGVmZmVjdCBtb2R1bGUuCiAvLyBUaGUgRWZmZWN0SGFuZGxlIGlzIG9idGFpbmVkIGJ5IGNhbGxpbmcgQXVkaW9GbGluZ2VyOjpjcmVhdGVFZmZlY3QoKS4KLWNsYXNzIEVmZmVjdEhhbmRsZTogcHVibGljIGFuZHJvaWQ6OkJuRWZmZWN0IHsKK2NsYXNzIEVmZmVjdEhhbmRsZTogcHVibGljIGFuZHJvaWQ6Om1lZGlhOjpCbkVmZmVjdCB7CiBwdWJsaWM6CiAKICAgICBFZmZlY3RIYW5kbGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCwKICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAogICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSk7CiAgICAgdmlydHVhbCB+RWZmZWN0SGFuZGxlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKIAogICAgIC8vIElFZmZlY3QKLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzYWJsZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKLXByaXZhdGU6Ci0gICAgICAgICAgICB2b2lkIGRpc2Nvbm5lY3QoYm9vbCB1bnBpbklmTGFzdCk7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QgeyByZXR1cm4gbUNibGtNZW1vcnk7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOworICAgIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGVuYWJsZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGRpc2FibGUoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBjb21tYW5kKGludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhSZXNwb25zZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKyAgICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBnZXRDYmxrKG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCitwcml2YXRlOgorICAgIHZvaWQgZGlzY29ubmVjdChib29sIHVucGluSWZMYXN0KTsKIAogICAgIC8vIEdpdmUgb3IgdGFrZSBjb250cm9sIG9mIGVmZmVjdCBtb2R1bGUKICAgICAvLyAtIGhhc0NvbnRyb2w6IHRydWUgaWYgY29udHJvbCBpcyBnaXZlbiwgZmFsc2UgaWYgcmVtb3ZlZApAQCAtMzQ5LDEwICszNDgsOCBAQAogICAgIC8vIC0gZW5hYmxlZDogc3RhdGUgb2YgdGhlIGVmZmVjdCB3aGVuIGNvbnRyb2wgaXMgcGFzc2VkCiAgICAgdm9pZCBzZXRDb250cm9sKGJvb2wgaGFzQ29udHJvbCwgYm9vbCBzaWduYWwsIGJvb2wgZW5hYmxlZCk7CiAgICAgdm9pZCBjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgY21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVwbHlEYXRhKTsKICAgICB2b2lkIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKICAgICBib29sIGVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtRW5hYmxlZDsgfQogCkBAIC0zNzUsMTkgKzM3MiwyMCBAQAogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgICAgIC8vIGZvciBtRWZmZWN0LCBtSGFzQ29udHJvbCwgbUVuYWJsZWQKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRWZmZWN0SGFuZGxlKTsKIAotICAgIE11dGV4IG1Mb2NrOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RzIElFZmZlY3QgbWV0aG9kIGNhbGxzCi0gICAgd3A8RWZmZWN0QmFzZT4gbUVmZmVjdDsgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gY29udHJvbGxlZCBFZmZlY3RNb2R1bGUKLSAgICBzcDxJRWZmZWN0Q2xpZW50PiBtRWZmZWN0Q2xpZW50OyAgICAvLyBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIGNsaWVudCBub3RpZmljYXRpb25zCi0gICAgLypjb25zdCovIHNwPENsaWVudD4gbUNsaWVudDsgICAgICAgLy8gY2xpZW50IGZvciBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24sIHNlZSBkaXNjb25uZWN0KCkKLSAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCi0gICAgZWZmZWN0X3BhcmFtX2NibGtfdCogbUNibGs7ICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcgdmlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hhcmVkIG1lbW9yeQotICAgIHVpbnQ4X3QqICAgICAgICAgICAgbUJ1ZmZlcjsgICAgICAgIC8vIHBvaW50ZXIgdG8gcGFyYW1ldGVyIGFyZWEgaW4gc2hhcmVkIG1lbW9yeQotICAgIGludCBtUHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBhcHBsaWNhdGlvbiBwcmlvcml0eSB0byBjb250cm9sIHRoZSBlZmZlY3QKLSAgICBib29sIG1IYXNDb250cm9sOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHRoaXMgaGFuZGxlIGlzIGNvbnRyb2xsaW5nIHRoZSBlZmZlY3QKLSAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZWQgZW5hYmxlIHN0YXRlOiBuZWVkZWQgd2hlbiB0aGUgZWZmZWN0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZWQgYWZ0ZXIgYmVpbmcgc3VzcGVuZGVkCi0gICAgYm9vbCBtRGlzY29ubmVjdGVkOyAgICAgICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgYnkgZGlzY29ubmVjdCgpCisgICAgTXV0ZXggbUxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0cyBJRWZmZWN0IG1ldGhvZCBjYWxscworICAgIHdwPEVmZmVjdEJhc2U+IG1FZmZlY3Q7ICAgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byBjb250cm9sbGVkIEVmZmVjdE1vZHVsZQorICAgIHNwPG1lZGlhOjpJRWZmZWN0Q2xpZW50PiBtRWZmZWN0Q2xpZW50OyAgLy8gY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBjbGllbnQgbm90aWZpY2F0aW9ucworICAgIC8qY29uc3QqLyBzcDxDbGllbnQ+IG1DbGllbnQ7ICAgICAgICAgICAgLy8gY2xpZW50IGZvciBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24sIHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkaXNjb25uZWN0KCkKKyAgICBzcDxJTWVtb3J5PiBtQ2Jsa01lbW9yeTsgICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBtZW1vcnkgZm9yIGNvbnRyb2wgYmxvY2sKKyAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiBtQ2JsazsgICAgICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nIHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hhcmVkIG1lbW9yeQorICAgIHVpbnQ4X3QqIG1CdWZmZXI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byBwYXJhbWV0ZXIgYXJlYSBpbiBzaGFyZWQgbWVtb3J5CisgICAgaW50IG1Qcmlvcml0eTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgYXBwbGljYXRpb24gcHJpb3JpdHkgdG8gY29udHJvbCB0aGUgZWZmZWN0CisgICAgYm9vbCBtSGFzQ29udHJvbDsgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHRoaXMgaGFuZGxlIGlzIGNvbnRyb2xsaW5nIHRoZSBlZmZlY3QKKyAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZCBlbmFibGUgc3RhdGU6IG5lZWRlZCB3aGVuIHRoZSBlZmZlY3QgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmVkIGFmdGVyIGJlaW5nIHN1c3BlbmRlZAorICAgIGJvb2wgbURpc2Nvbm5lY3RlZDsgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgYnkgZGlzY29ubmVjdCgpCiB9OwogCiAvLyB0aGUgRWZmZWN0Q2hhaW4gY2xhc3MgcmVwcmVzZW50cyBhIGdyb3VwIG9mIGVmZmVjdHMgYXNzb2NpYXRlZCB0byBvbmUgYXVkaW8gc2Vzc2lvbi4KQEAgLTUwMyw2ICs1MDEsMTAgQEAKICAgICAvLyBpc0NvbXBhdGlibGVXaXRoVGhyZWFkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZC0+bUxvY2sgaGVsZAogICAgIGJvb2wgaXNDb21wYXRpYmxlV2l0aFRocmVhZF9sKGNvbnN0IHNwPFRocmVhZEJhc2U+JiB0aHJlYWQpIGNvbnN0OwogCisgICAgYm9vbCBjb250YWluc0hhcHRpY0dlbmVyYXRpbmdFZmZlY3RfbCgpOworCisgICAgdm9pZCBzZXRIYXB0aWNJbnRlbnNpdHlfbChpbnQgaWQsIGludCBpbnRlbnNpdHkpOworCiAgICAgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+IGVmZmVjdENhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdENhbGxiYWNrOyB9CiAgICAgd3A8VGhyZWFkQmFzZT4gdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdENhbGxiYWNrLT50aHJlYWQoKTsgfQogCkBAIC01MzQsNiArNTM2LDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSgpIGNvbnN0IG92ZXJyaWRlOwogCkBAIC02ODUsNiArNjg4LDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7IH0KICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdCBvdmVycmlkZSAgeyByZXR1cm4gMDsgfQogICAgICAgICB1aW50MzJfdCBsYXRlbmN5KCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIDA7IH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCAzZWFjYzhjLi5jZDNjNzQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC00MCw2ICszOSw3IEBACiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvTWl4ZXIuaD4KICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJUeXBlZExvZ2dlci5oIgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAppbmRleCBhNDJlMDljLi4zZjIwMjgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKICNlbmRpZgotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggMzk2Yzc5Ny4uODU3ZDNkZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CisjaW5jbHVkZSA8dmlicmF0b3IvRXh0ZXJuYWxWaWJyYXRpb25VdGlscy5oPgogI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00OSw4ICs1MCw3IEBACiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAvLyB0cmFjayBmb3JtYXQKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbjsgICAgIC8vIGluY3JlbWVudCB3aGVuIGFueSBmaWVsZCBpcyBhc3NpZ25lZAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsgLy8gaGFwdGljIHBsYXliYWNrIGlzIGVuYWJsZWQgb3Igbm90Ci0gICAgQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IG1IYXB0aWNJbnRlbnNpdHkgPSBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsgLy8gaW50ZW5zaXR5IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFwdGljIGRhdGEKKyAgICBvczo6SGFwdGljU2NhbGUgICAgICAgICBtSGFwdGljSW50ZW5zaXR5ID0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFOyAvLyBpbnRlbnNpdHkgb2YgaGFwdGljIGRhdGEKIH07CiAKIC8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIGZhc3QgbWl4ZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCmluZGV4IGQwMmQ5ZTAuLjAzNGQxNjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpAQCAtMSw0ICsxLDQgQEAKK2drYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCi1na2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCBiNThmZDhiLi4xZTExNjYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVmFsaWRhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KQEAgLTU1LDggKzU2LDEyIEBACiB9CiAKIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKLXsKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9Qb3J0KCpwb3J0KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICByZXR1cm4gbVBhdGNoUGFuZWwuZ2V0QXVkaW9Qb3J0KHBvcnQpOwogfQpAQCAtNjUsNiArNzAsMTEgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogeworICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUGF0Y2goKnBhdGNoKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICByZXR1cm4gbVBhdGNoUGFuZWwuY3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKIH0KQEAgLTEwMywxMCArMTEzLDIyIEBACiB9CiAKIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KQogewotICAgIEFMT0dWKF9fZnVuY19fKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgaWYgKHBvcnQtPnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAvLyBPbmx5IHF1ZXJ5IHRoZSBIQUwgd2hlbiB0aGUgcG9ydCBpcyBhIGRldmljZS4KKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGdldEF1ZGlvUG9ydCBmb3IgbWl4LgorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIEF1ZGlvSHdEZXZpY2UqIGh3RGV2aWNlID0gZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSk7CisgICAgaWYgKGh3RGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzIGNhbm5vdCBmaW5kIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghaHdEZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gaHdEZXZpY2UtPmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KIAogLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCmluZGV4IDg5ZDRlYjEuLjI1NjhkZDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaApAQCAtNTIsNyArNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKTsKIAogICAgIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCi0gICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOwogCiAgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogICAgIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggZDhlZWJmMy4uYTRiODY1MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTI2LDEwICsyNiwxMSBAQAogICAgIGJvb2wgaGFzT3BQbGF5QXVkaW8oKSBjb25zdDsKIAogICAgIHN0YXRpYyBzcDxPcFBsYXlBdWRpb01vbml0b3I+IGNyZWF0ZUlmTmVlZGVkKAotICAgICAgICAgICAgdWlkX3QgdWlkLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsIGludCBpZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgIHVpZF90IHVpZCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLCBpbnQgaWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lKTsKIAogcHJpdmF0ZToKLSAgICBPcFBsYXlBdWRpb01vbml0b3IodWlkX3QgdWlkLCBhdWRpb191c2FnZV90IHVzYWdlLCBpbnQgaWQpOworICAgIE9wUGxheUF1ZGlvTW9uaXRvcih1aWRfdCB1aWQsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsIGludCBpZCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogICAgIHZvaWQgb25GaXJzdFJlZigpIG92ZXJyaWRlOwogICAgIHN0YXRpYyB2b2lkIGdldFBhY2thZ2VzRm9yVWlkKHVpZF90IHVpZCwgVmVjdG9yPFN0cmluZzE2PiYgcGFja2FnZXMpOwogCkBAIC00OSwxMCArNTAsMTAgQEAKICAgICB2b2lkIGNoZWNrUGxheUF1ZGlvRm9yVXNhZ2UoKTsKIAogICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUhhc09wUGxheUF1ZGlvOwotICAgIFZlY3RvcjxTdHJpbmcxNj4gbVBhY2thZ2VzOwogICAgIGNvbnN0IHVpZF90IG1VaWQ7CiAgICAgY29uc3QgaW50MzJfdCBtVXNhZ2U7IC8vIG9uIHB1cnBvc2Ugbm90IGF1ZGlvX3VzYWdlX3QgYmVjYXVzZSBhbHdheXMgY2hlY2tlZCBpbiBhcHBPcHMgYXMgaW50MzJfdAogICAgIGNvbnN0IGludCBtSWQ7IC8vIGZvciBsb2dnaW5nIHB1cnBvc2VzIG9ubHkKKyAgICBjb25zdCBTdHJpbmcxNiBtT3BQYWNrYWdlTmFtZTsKIH07CiAKIC8vIHBsYXliYWNrIHRyYWNrCkBAIC03Nyw3ICs3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHN0YXJ0IHdoZW4gdGhlcmUgYXJlIGFzIG1hbnkgZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWFkeSBhcyBwb3NzaWJsZSAoYWthLiBCdWZmZXIgaXMgZnVsbCkuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5ID0gU0laRV9NQVgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudFRvQmVSZWFkeSA9IFNJWkVfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lID0gIiIpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRyYWNrKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtMTU5LDEyICsxNjEsMTIgQEAKICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gaGFwdGljUGxheWJhY2tFbmFibGVkOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyoqIFJldHVybiBhdCB3aGF0IGludGVuc2l0eSB0byBwbGF5IGhhcHRpY3MsIHVzZWQgaW4gbWl4ZXIuICovCi0gICAgICAgICAgICBBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3QgZ2V0SGFwdGljSW50ZW5zaXR5KCkgY29uc3QgeyByZXR1cm4gbUhhcHRpY0ludGVuc2l0eTsgfQorICAgICAgICAgICAgb3M6OkhhcHRpY1NjYWxlIGdldEhhcHRpY0ludGVuc2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1IYXB0aWNJbnRlbnNpdHk7IH0KICAgICAgICAgICAgIC8qKiBTZXQgaW50ZW5zaXR5IG9mIGhhcHRpYyBwbGF5YmFjaywgc2hvdWxkIGJlIHNldCBhZnRlciBxdWVyeWluZyB2aWJyYXRvciBzZXJ2aWNlLiAqLwotICAgICAgICAgICAgdm9pZCAgICBzZXRIYXB0aWNJbnRlbnNpdHkoQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSkgewotICAgICAgICAgICAgICAgIGlmIChBdWRpb01peGVyOjppc1ZhbGlkSGFwdGljSW50ZW5zaXR5KGhhcHRpY0ludGVuc2l0eSkpIHsKKyAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljSW50ZW5zaXR5KG9zOjpIYXB0aWNTY2FsZSBoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgICAgICAgICBpZiAob3M6OmlzVmFsaWRIYXB0aWNTY2FsZShoYXB0aWNJbnRlbnNpdHkpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNJbnRlbnNpdHkgPSBoYXB0aWNJbnRlbnNpdHk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChtSGFwdGljSW50ZW5zaXR5ICE9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0SGFwdGljUGxheWJhY2tFbmFibGVkKG1IYXB0aWNJbnRlbnNpdHkgIT0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+IGdldEV4dGVybmFsVmlicmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUV4dGVybmFsVmlicmF0aW9uOyB9CkBAIC0yNjUsNyArMjY3LDcgQEAKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgaGFwdGljIHBsYXliYWNrIGVuYWJsZWQgb3Igbm90CiAgICAgLy8gaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljIGRhdGEKLSAgICBBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3QgbUhhcHRpY0ludGVuc2l0eSA9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFOworICAgIG9zOjpIYXB0aWNTY2FsZSBtSGFwdGljSW50ZW5zaXR5ID0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFOwogICAgIGNsYXNzIEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlciA6IHB1YmxpYyBvczo6Qm5FeHRlcm5hbFZpYnJhdGlvbkNvbnRyb2xsZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyKFRyYWNrKiB0cmFjaykgOiBtVHJhY2sodHJhY2spIHt9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmNwcAppbmRleCBjN2FiYTc5Li4wY2U1NjgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgLCBtU3BkaWZFbmNvZGVyKHRoaXMsIGZvcm1hdCkKICAgICAgICAgLCBtQXBwbGljYXRpb25Gb3JtYXQoQVVESU9fRk9STUFUX0RFRkFVTFQpCiAgICAgICAgICwgbUFwcGxpY2F0aW9uU2FtcGxlUmF0ZSgwKQotICAgICAgICAsIG1BcHBsaWNhdGlvbkNoYW5uZWxNYXNrKDApCisgICAgICAgICwgbUFwcGxpY2F0aW9uQ2hhbm5lbE1hc2soQVVESU9fQ0hBTk5FTF9OT05FKQogewogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggMmFmMjdkOC4uYWIyYmMzMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaD4KQEAgLTExNSw2ICsxMTYsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjpJRWZmZWN0Q2xpZW50OworCiAvLyByZXRyeSBjb3VudHMgZm9yIGJ1ZmZlciBmaWxsIHRpbWVvdXQKIC8vIDUwICogfjIwbXNlY3MgPSAxIHNlY29uZAogc3RhdGljIGNvbnN0IGludDhfdCBrTWF4VHJhY2tSZXRyaWVzID0gNTA7CkBAIC05ODUsMTUgKzk4OCwxNiBAQAogICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbmV3IEJCaW5kZXIoKTsKICAgICAgICAgLy8gVXNlcyBBSURfQVVESU9TRVJWRVIgZm9yIHdha2Vsb2NrLiAgdXBkYXRlV2FrZUxvY2tVaWRzX2woKSB1cGRhdGVzIHdpdGggY2xpZW50IHVpZHMuCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jayhQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCi0gICAgICAgICAgICAgICAgICAgIGJpbmRlciwKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrQXN5bmMoYmluZGVyLAorICAgICAgICAgICAgICAgICAgICBQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgICAgIGdldFdha2VMb2NrVGFnKCksCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAge30gLyogd29ya1NvdXJjZSAqLywKKyAgICAgICAgICAgICAgICAgICAge30gLyogaGlzdG9yeVRhZyAqLyk7CisgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiYWNxdWlyZVdha2VMb2NrX2woKSAlcyBzdGF0dXMgJWQiLCBtVGhyZWFkTmFtZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoImFjcXVpcmVXYWtlTG9ja19sKCkgJXMgc3RhdHVzICVkIiwgbVRocmVhZE5hbWUsIHN0YXR1cy5leGNlcHRpb25Db2RlKCkpOwogICAgIH0KIAogICAgIGdCb290dGltZS5hY3F1aXJlKG1XYWtlTG9ja1Rva2VuKTsKQEAgLTEwMTMsOCArMTAxNyw3IEBACiAgICAgaWYgKG1XYWtlTG9ja1Rva2VuICE9IDApIHsKICAgICAgICAgQUxPR1YoInJlbGVhc2VXYWtlTG9ja19sKCkgJXMiLCBtVGhyZWFkTmFtZSk7CiAgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKLSAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrQXN5bmMobVdha2VMb2NrVG9rZW4sIDApOwogICAgICAgICB9CiAgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CiAgICAgfQpAQCAtMTAyOCw3ICsxMDMxLDcgQEAKICAgICAgICAgaWYgKGJpbmRlciA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HVygiVGhyZWFkICVzIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiLCBtVGhyZWFkTmFtZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SVBvd2VyTWFuYWdlcj4oYmluZGVyKTsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxvczo6SVBvd2VyTWFuYWdlcj4oYmluZGVyKTsKICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNTUsMTAgKzEwNTgsOSBAQAogICAgIH0KICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdWlkc0FzSW50KHVpZHMuYmVnaW4oKSwgdWlkcy5lbmQoKSk7IC8vIHBvd2VybWFuYWdlciBleHBlY3RzIHVpZHMgYXMgaW50cwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT51cGRhdGVXYWtlTG9ja1VpZHMoCi0gICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4sIHVpZHNBc0ludC5zaXplKCksIHVpZHNBc0ludC5kYXRhKCksCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwotICAgICAgICBBTE9HVigidXBkYXRlV2FrZUxvY2tVaWRzX2woKSAlcyBzdGF0dXMgJWQiLCBtVGhyZWFkTmFtZSwgc3RhdHVzKTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+dXBkYXRlV2FrZUxvY2tVaWRzQXN5bmMoCisgICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4sIHVpZHNBc0ludCk7CisgICAgICAgIEFMT0dWKCJ1cGRhdGVXYWtlTG9ja1VpZHNfbCgpICVzIHN0YXR1cyAlZCIsIG1UaHJlYWROYW1lLCBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpKTsKICAgICB9CiB9CiAKQEAgLTEyNDMsNiArMTI0NSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0KKworICAgIGlmIChFZmZlY3RNb2R1bGU6OmlzSGFwdGljR2VuZXJhdG9yKCZkZXNjLT50eXBlKSkgeworICAgICAgICBBTE9HRSgiJXMoKTogSGFwdGljR2VuZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUmVjb3JkVGhyZWFkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTEyNjIsNiArMTI2OSwxMiBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCisgICAgaWYgKEVmZmVjdE1vZHVsZTo6aXNIYXB0aWNHZW5lcmF0b3IoJmRlc2MtPnR5cGUpICYmIG1IYXB0aWNDaGFubmVsQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IHRocmVhZCBkb2Vzbid0IHN1cHBvcnQgaGFwdGljIHBsYXliYWNrIHdoaWxlIHRoZSBlZmZlY3QgaXMgSGFwdGljR2VuZXJhdG9yIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgc3dpdGNoIChtVHlwZSkgewogICAgIGNhc2UgTUlYRVI6IHsKICNpZm5kZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgpAQCAtMTkwMSw5ICsxOTE0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKICAgICB9CiAKLSAgICAvLyArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCi0gICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsKLSAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoc3RyZWFtICsgMSkpIHsKKyAgICBmb3IgKGludCBpID0gQVVESU9fU1RSRUFNX01JTjsgaSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFte3N0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGkpfTsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gMC4wZjsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbU11dGVfbChzdHJlYW0pOwogICAgIH0KQEAgLTE5MzMsNyArMTk0NSw3IEBACiAgICAgICAgIC8vIGhlcmUgaW5zdGVhZCBvZiBjb25zdHJ1Y3RvciBvZiBQbGF5YmFja1RocmVhZCBzbyB0aGF0IHRoZSBvbkZpcnN0UmVmCiAgICAgICAgIC8vIGNhbGxiYWNrIHdvdWxkIG5vdCBiZSBtYWRlIG9uIGFuIGluY29tcGxldGVseSBjb25zdHJ1Y3RlZCBvYmplY3QuCiAgICAgICAgIGlmIChtT3V0cHV0LT5zdHJlYW0tPnNldEV2ZW50Q2FsbGJhY2sodGhpcykgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIGV2ZW50IGNhbGxiYWNrIik7CisgICAgICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGFkZCBldmVudCBjYWxsYmFjayIpOwogICAgICAgICB9CiAgICAgfQogICAgIHJ1bihtVGhyZWFkTmFtZSwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOwpAQCAtMjA2Nyw3ICsyMDc5LDggQEAKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaykKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUpCiB7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAqcEZyYW1lQ291bnQ7CiAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CkBAIC0yMzQ1LDEwICsyMzU4LDIxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBTZXQgRElSRUNUIGZsYWcgaWYgY3VycmVudCB0aHJlYWQgaXMgRGlyZWN0T3V0cHV0VGhyZWFkLiBUaGlzIGNhbgorICAgICAgICAvLyBoYXBwZW4gd2hlbiB0aGUgcGxheWJhY2sgaXMgcmVyb3V0ZWQgdG8gZGlyZWN0IG91dHB1dCB0aHJlYWQgYnkKKyAgICAgICAgLy8gZHluYW1pYyBhdWRpbyBwb2xpY3kuCisgICAgICAgIC8vIERvIE5PVCByZXBvcnQgdGhlIGZsYWcgY2hhbmdlcyBiYWNrIHRvIGNsaWVudCwgc2luY2UgdGhlIGNsaWVudAorICAgICAgICAvLyBkb2Vzbid0IGV4cGxpY2l0bHkgcmVxdWVzdCBhIGRpcmVjdCBmbGFnLgorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCB0cmFja0ZsYWdzID0gKmZsYWdzOworICAgICAgICBpZiAobVR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgICAgICB0cmFja0ZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KHRyYWNrRmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICB9CisKICAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLCB1aWQsICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgY3JlYXRvclBpZCwgdWlkLCB0cmFja0ZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFX01BWCAvKmZyYW1lQ291bnRUb0JlUmVhZHkqLywgb3BQYWNrYWdlTmFtZSk7CiAKICAgICAgICAgbFN0YXR1cyA9IHRyYWNrICE9IDAgPyB0cmFjay0+aW5pdENoZWNrKCkgOiAoc3RhdHVzX3QpIE5PX01FTU9SWTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTIzNjAsNyArMjM4NCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfYXRDYkwobUF1ZGlvVHJhY2tDYkxvY2spOwogICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0NhbGxiYWNrcy5lbXBsYWNlKGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0NhbGxiYWNrcy5lbXBsYWNlKHRyYWNrLCBjYWxsYmFjayk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjUyNywxNSArMjU1MSwxNyBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCA/IFRyYWNrOjpGU19GSUxMRUQgOiBUcmFjazo6RlNfRklMTElORzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgodHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQotICAgICAgICAgICAgICAgICYmIG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBpZiAobUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmICgodHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoYWluICE9IG51bGxwdHIgJiYgY2hhaW4tPmNvbnRhaW5zSGFwdGljR2VuZXJhdGluZ0VmZmVjdF9sKCkpKSkgewogICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKICAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBjb25zdCBpbnQgaW50ZW5zaXR5ID0gQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5nZXRFeHRlcm5hbFZpYnJhdGlvbigpKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgIHRyYWNrLT5zZXRIYXB0aWNJbnRlbnNpdHkoc3RhdGljX2Nhc3Q8QXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90PihpbnRlbnNpdHkpKTsKKyAgICAgICAgICAgIHRyYWNrLT5zZXRIYXB0aWNJbnRlbnNpdHkoc3RhdGljX2Nhc3Q8b3M6OkhhcHRpY1NjYWxlPihpbnRlbnNpdHkpKTsKICAgICAgICAgICAgIC8vIEhhcHRpYyBwbGF5YmFjayBzaG91bGQgYmUgZW5hYmxlZCBieSB2aWJyYXRvciBzZXJ2aWNlLgogICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIERpc2FibGUgaGFwdGljIHBsYXliYWNrIG9mIGFsbCBhY3RpdmUgdHJhY2sgdG8gZW5zdXJlIG9ubHkKQEAgLTI1NDQsMTIgKzI1NzAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgdC0+c2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNldCBoYXB0aWMgaW50ZW5zaXR5IGZvciBlZmZlY3QKKyAgICAgICAgICAgIGlmIChjaGFpbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY2hhaW4tPnNldEhhcHRpY0ludGVuc2l0eV9sKHRyYWNrLT5pZCgpLCBpbnRlbnNpdHkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdHJhY2stPm1SZXNldERvbmUgPSBmYWxzZTsKICAgICAgICAgdHJhY2stPm1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyA9IDA7CiAgICAgICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKLSAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewogICAgICAgICAgICAgQUxPR1YoImFkZFRyYWNrX2woKSBzdGFydGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOwpAQCAtMjU4OCw2ICsyNjE4LDEwIEBACiAgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tfbCAoJXApICVzIiwgdHJhY2suZ2V0KCksIHJlc3VsdC5zdHJpbmcoKSk7CiAKICAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2F0Q2JMKG1BdWRpb1RyYWNrQ2JMb2NrKTsKKyAgICAgICAgbUF1ZGlvVHJhY2tDYWxsYmFja3MuZXJhc2UodHJhY2spOworICAgIH0KICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKICAgICAgICAgaW50IGluZGV4ID0gdHJhY2stPm1GYXN0SW5kZXg7CiAgICAgICAgIEFMT0dfQVNTRVJUKDAgPCBpbmRleCAmJiBpbmRleCA8IChpbnQpRmFzdE1peGVyU3RhdGU6OnNNYXhGYXN0VHJhY2tzKTsKQEAgLTI2ODMsOCArMjcxNyw4IEBACiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjptZXRhZGF0YTo6Ynl0ZVN0cmluZ0Zyb21EYXRhKG1ldGFkYXRhKTsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yIG1ldGFkYXRhVmVjKG1ldGFEYXRhU3RyLmJlZ2luKCksIG1ldGFEYXRhU3RyLmVuZCgpKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQXVkaW9UcmFja0NiTG9jayk7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNhbGxiYWNrIDogbUF1ZGlvVHJhY2tDYWxsYmFja3MpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25Db2RlY0Zvcm1hdENoYW5nZWQobWV0YWRhdGFWZWMpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjYWxsYmFja1BhaXIgOiBtQXVkaW9UcmFja0NhbGxiYWNrcykgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrUGFpci5zZWNvbmQtPm9uQ29kZWNGb3JtYXRDaGFuZ2VkKG1ldGFkYXRhVmVjKTsKICAgICAgICAgICAgIH0KICAgICB9KS5kZXRhY2goKTsKIH0KQEAgLTI4NjIsOCArMjg5Niw4IEBACiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOwogICAgIH0KIAotICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKLSAgICBtQ2hhbm5lbE1hc2sgJj0gfm1IYXB0aWNDaGFubmVsTWFzazsKKyAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obUNoYW5uZWxNYXNrICYgfm1IYXB0aWNDaGFubmVsTWFzayk7CiAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtSGFwdGljQ2hhbm5lbE1hc2spOwogICAgIG1DaGFubmVsQ291bnQgLT0gbUhhcHRpY0NoYW5uZWxDb3VudDsKIApAQCAtMzQ4MSw3ICszNTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiA1IHNlY29uZHMpLgogICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluTGF0ZW5jeSA9IDAuLCBtYXhMYXRlbmN5ID0gNTAwMC47CiAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPj0gbWluTGF0ZW5jeSAmJiBsYXRlbmN5TXMgPD0gbWF4TGF0ZW5jeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5ldyBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWVigibmV3IGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm91dCBvZiByYW5nZSBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCBtaW5MYXRlbmN5KSBsYXRlbmN5TXMgPSBtaW5MYXRlbmN5OwpAQCAtMzUzMCw3ICszNTY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsIGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOwogICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CkBAIC0zNTM4LDcgKzM1NzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKIApAQCAtMzczMiw5ICszNzY2LDE1IEBACiAKICAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBzZXNzaW9uIHRvIHBpY2sgdXAgaGFwdGljIGRhdGEuCiAgICAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgZG9uZSB1bmRlciB0aGUgc2FtZSBsb2NrIGFzIHByZXBhcmVUcmFja3NfbCgpLgorICAgICAgICAgICAgLy8gVGhlIGhhcHRpYyBkYXRhIGZyb20gdGhlIGVmZmVjdCBpcyBhdCBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBvbmUgZnJvbSB0cmFjay4KICAgICAgICAgICAgIC8vIFRPRE86IFdyaXRlIGhhcHRpYyBkYXRhIGRpcmVjdGx5IHRvIHNpbmsgYnVmZmVyIHdoZW4gbWl4aW5nLgogICAgICAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwICYmIGVmZmVjdENoYWlucy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGVmZmVjdENoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0Q2hhaW4gIT0gbnVsbHB0ciAmJiBlZmZlY3RDaGFpbi0+Y29udGFpbnNIYXB0aWNHZW5lcmF0aW5nRWZmZWN0X2woKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gdHJhY2stPnNlc3Npb25JZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gdHJhY2stPnNlc3Npb25JZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00MTA0LDEzICs0MTQ0LDIwIEBACiAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBvdXIgdHJhY2tzIHZlY3RvcgogICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCi0gICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwICYmCisgICAgICAgICAgICAgICAgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2hhaW4gIT0gbnVsbHB0ciAmJiBjaGFpbi0+Y29udGFpbnNIYXB0aWNHZW5lcmF0aW5nRWZmZWN0X2woKSkpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIC8vIFVubG9jayBkdWUgdG8gVmlicmF0b3JTZXJ2aWNlIHdpbGwgbG9jayBmb3IgdGhpcyBjYWxsIGFuZCB3aWxsCiAgICAgICAgICAgICAvLyBjYWxsIFRyYWNrcy5tdXRlL3VubXV0ZSB3aGljaCBhbHNvIHJlcXVpcmUgdGhyZWFkJ3MgbG9jay4KICAgICAgICAgICAgIEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0b3AodHJhY2stPmdldEV4dGVybmFsVmlicmF0aW9uKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOworCisgICAgICAgICAgICAvLyBXaGVuIHRoZSB0cmFjayBpcyBzdG9wLCBzZXQgdGhlIGhhcHRpYyBpbnRlbnNpdHkgYXMgTVVURQorICAgICAgICAgICAgLy8gZm9yIHRoZSBIYXB0aWNHZW5lcmF0b3IgZWZmZWN0LgorICAgICAgICAgICAgaWYgKGNoYWluICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjaGFpbi0+c2V0SGFwdGljSW50ZW5zaXR5X2wodHJhY2stPmlkKCksIHN0YXRpY19jYXN0PGludD4ob3M6OkhhcHRpY1NjYWxlOjpNVVRFKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC00MTk5LDcgKzQyNDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnVtZXJhdGVkIGRldmljZSB0eXBlKCUjeCkgbXVzdCBub3QgYmUgdXNlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzIGl0IGRvZXMgbm90IHN1cHBvcnQgYXVkaW8gcGF0Y2hlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSk7Ci0gICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4odHlwZSB8IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUpOwogICAgICAgICBkZXZpY2VUeXBlQWRkcnMucHVzaF9iYWNrKEF1ZGlvRGV2aWNlVHlwZUFkZHIocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSwKICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS5hZGRyZXNzKSk7CiAgICAgfQpAQCAtNDQ0OSwxMSArNDQ5NiwxMiBAQAogICAgICAgICAvLyB3cmFwIHRoZSBzb3VyY2Ugc2lkZSBvZiB0aGUgTW9ub1BpcGUgdG8gbWFrZSBpdCBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gbmV3IFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIobmV3IE1vbm9QaXBlUmVhZGVyKG1vbm9QaXBlKSk7CiAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyB0byBGYXN0TWl4ZXIKKyAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oCisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKTsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyB0byBGYXN0TWl4ZXIKICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gbUZvcm1hdDsgLy8gbVBpcGVTaW5rIGZvcm1hdCBmb3IgYXVkaW8gdG8gRmFzdE1peGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY0ludGVuc2l0eSA9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9OT05FOworICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkgPSBvczo6SGFwdGljU2NhbGU6Ok5PTkU7CiAgICAgICAgIGZhc3RUcmFjay0+bUdlbmVyYXRpb24rKzsKICAgICAgICAgc3RhdGUtPm1GYXN0VHJhY2tzR2VuKys7CiAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrID0gMTsKQEAgLTQ0NjQsNyArNDUxMiw4IEBACiAgICAgICAgIC8vIHNwZWNpZnkgc2luayBjaGFubmVsIG1hc2sgd2hlbiBoYXB0aWMgY2hhbm5lbCBtYXNrIHByZXNlbnQgYXMgaXQgY2FuIG5vdAogICAgICAgICAvLyBiZSBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gY2hhbm5lbCBjb3VudAogICAgICAgICBzdGF0ZS0+bVNpbmtDaGFubmVsTWFzayA9IG1IYXB0aWNDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUKLSAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfTk9ORSA6IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzayk7CiAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEU7CiAgICAgICAgIC8vIGFscmVhZHkgZG9uZSBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0CiAgICAgICAgIC8vbUZhc3RNaXhlckZ1dGV4ID0gMDsKQEAgLTY4ODEsNyArNjkzMCw3IEBACiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9Jbl8lWCIsIGlkKTsKICAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CiAKLSAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5hdWRpb0h3RGV2ICE9IG51bGxwdHIpIHsKKyAgICBpZiAobUlucHV0LT5hdWRpb0h3RGV2ICE9IG51bGxwdHIpIHsKICAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAogICAgICAgICAgICAgICAgIG1JbnB1dC0+YXVkaW9Id0Rldi0+bW9kdWxlTmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwOwogICAgIH0KQEAgLTczMTIsNyArNzM2MSw3IEBACiAKICAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgYXZhaWxhYmxlVG9SZWFkID0gbVBpcGVTb3VyY2UtPmF2YWlsYWJsZVRvUmVhZCgpOwogICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVRvUmVhZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gUGlwZVNvdXJjZSBpcyB0aGUgbWFzdGVyIGNsb2NrLiAgSXQgaXMgdXAgdG8gdGhlIEF1ZGlvUmVjb3JkIGNsaWVudCB0byBrZWVwIHVwLgorICAgICAgICAgICAgICAgIC8vIFBpcGVTb3VyY2UgaXMgdGhlIHByaW1hcnkgY2xvY2suICBJdCBpcyB1cCB0byB0aGUgQXVkaW9SZWNvcmQgY2xpZW50IHRvIGtlZXAgdXAuCiAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoc2l6ZV90KWF2YWlsYWJsZVRvUmVhZCA+IG1QaXBlRnJhbWVzUDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSBmcmFtZXMgdG8gcmVhZCB0aGFuIGZpZm8gc2l6ZSwgJXpkID4gJXp1IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVRvUmVhZCwgbVBpcGVGcmFtZXNQMik7CkBAIC03MzczLDEyICs3NDIyLDEyIEBACiAKICAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IHRpbWVzdGFtcHMKICAgICAgICAgICAgICAgICBpZiAoaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dWVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgdGltZSA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dWVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc0MjgsNyArNzQ3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVzUmVhZCAtIHBhcnQxKSAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJlYXIgPSBtUnNtcEluUmVhciArPSBmcmFtZXNSZWFkOworICAgICAgICBtUnNtcEluUmVhciA9IGF1ZGlvX3V0aWxzOjpzYWZlX2FkZF9vdmVyZmxvdyhtUnNtcEluUmVhciwgKGludDMyX3QpZnJhbWVzUmVhZCk7CiAKICAgICAgICAgc2l6ZSA9IGFjdGl2ZVRyYWNrcy5zaXplKCk7CiAKQEAgLTc4NjksNyArNzkxOCw4IEBACiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgewogICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIEFMT0dXKCIlcyB0cmFjayAlZDogaW52YWxpZGF0ZWQgYmVmb3JlIHN0YXJ0SW5wdXQiLCBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICAgICAgfQogICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA+PSAwKSB7CiAgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKQEAgLTc4OTksNyArNzk0OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNUQVJUSU5HXzIgZm9yY2VzIGRlc3Ryb3kgdG8gY2FsbCBzdG9wSW5wdXQuCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgdHJhY2sgJWQ6IGludmFsaWRhdGVkIGFmdGVyIHN0YXJ0SW5wdXQiLCBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBtU3RhdGU6JWQgY2hhbmdlIiwKQEAgLTg1NTQsNyArODYwNSw3IEBACiAKICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKICAgICBtSW5EZXZpY2VUeXBlQWRkci5tVHlwZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKLSAgICBtSW5EZXZpY2VUeXBlQWRkci5tQWRkcmVzcyA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzczsKKyAgICBtSW5EZXZpY2VUeXBlQWRkci5zZXRBZGRyZXNzKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IHBhdGNoLT5zb3VyY2VzWzBdLmlkOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewogICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRJbnB1dERldmljZV9sKGluRGV2aWNlVHlwZUFkZHIoKSk7CkBAIC04NjMzLDYgKzg2ODQsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp1cGRhdGVPdXREZXZpY2VzKGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBvdXREZXZpY2VzKQogeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbU91dERldmljZXMgPSBvdXREZXZpY2VzOwogICAgIG1PdXREZXZpY2VUeXBlQWRkcnMgPSBkZXZpY2VUeXBlQWRkcnNGcm9tRGVzY3JpcHRvcnMobU91dERldmljZXMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewpAQCAtODY5Niw2ICs4NzQ4LDExIEBACiAgICAgcmV0dXJuIG1UaHJlYWQtPmdldE1tYXBQb3NpdGlvbihwb3NpdGlvbik7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6Z2V0RXh0ZXJuYWxQb3NpdGlvbih1aW50NjRfdCAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgcmV0dXJuIG1UaHJlYWQtPmdldEV4dGVybmFsUG9zaXRpb24ocG9zaXRpb24sIHRpbWVOYW5vcyk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6c3RhcnQoY29uc3QgQXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLCBhdWRpb19wb3J0X2hhbmRsZV90ICpoYW5kbGUpCiAKQEAgLTg3MzEsNyArODc4OCw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6fk1tYXBUaHJlYWQoKQogewotICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpvbkZpcnN0UmVmKCkKQEAgLTg3ODEsNyArODgzNyw2IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBtU3RhbmRieSA9IHRydWU7Ci0gICAgYWNxdWlyZVdha2VMb2NrKCk7CiAgICAgcmV0dXJuIG1IYWxTdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIobWluU2l6ZUZyYW1lcywgaW5mbyk7CiB9CiAKQEAgLTg4MjAsOCArODg3NSwxMiBAQAogICAgIHN0YXR1c190IHJldDsKIAogICAgIGlmICgqaGFuZGxlID09IG1Qb3J0SWQpIHsKLSAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCB0cmFjaywgcmV1c2UgcG9ydElkIGFuZCBzZXNzaW9uIGFsbG9jYXRlZCB3aGVuIHRoZSBzdHJlYW0gd2FzIG9wZW5lZAotICAgICAgICByZXR1cm4gZXhpdFN0YW5kYnkoKTsKKyAgICAgICAgLy8gRm9yIHRoZSBmaXJzdCB0cmFjaywgcmV1c2UgcG9ydElkIGFuZCBzZXNzaW9uIGFsbG9jYXRlZCB3aGVuIHRoZSBzdHJlYW0gd2FzIG9wZW5lZC4KKyAgICAgICAgcmV0ID0gZXhpdFN0YW5kYnkoKTsKKyAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CkBAIC04OTQyLDYgKzkwMDEsNyBAQAogCiAgICAgaWYgKGhhbmRsZSA9PSBtUG9ydElkKSB7CiAgICAgICAgIG1IYWxTdHJlYW0tPnN0b3AoKTsKKyAgICAgICAgcmVsZWFzZVdha2VMb2NrKCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKQEAgLTkxODQsNyArOTI0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnVtZXJhdGVkIGRldmljZSB0eXBlKCUjeCkgbXVzdCBub3QgYmUgdXNlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHBhdGNoZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKLSAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHR5cGUgfCBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgICAgIHNpbmtEZXZpY2VUeXBlQWRkcnMucHVzaF9iYWNrKEF1ZGlvRGV2aWNlVHlwZUFkZHIocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSwKICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuYWRkcmVzcykpOwogICAgICAgICB9CkBAIC05MTk1LDcgKzkyNTUsNyBAQAogICAgICAgICBkZXZpY2VJZCA9IHBhdGNoLT5zb3VyY2VzWzBdLmlkOwogICAgICAgICBudW1EZXZpY2VzID0gbVBhdGNoLm51bV9zb3VyY2VzOwogICAgICAgICBzb3VyY2VEZXZpY2VUeXBlQWRkci5tVHlwZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKLSAgICAgICAgc291cmNlRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3M7CisgICAgICAgIHNvdXJjZURldmljZVR5cGVBZGRyLnNldEFkZHJlc3MocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKQEAgLTkzOTMsNiArOTQ1MywxMSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIGlmIChFZmZlY3RNb2R1bGU6OmlzSGFwdGljR2VuZXJhdG9yKCZkZXNjLT50eXBlKSkgeworICAgICAgICBBTE9HRSgiJXMoKTogSGFwdGljR2VuZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIE1tYXBUaHJlYWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC05NjQ1LDYgKzk3MTAsMjAgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjpnZXRFeHRlcm5hbFBvc2l0aW9uKHVpbnQ2NF90ICpwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykKK3sKKyAgICBpZiAobU91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZXN0YW1wOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PdXRwdXQtPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHBvc2l0aW9uLCAmdGltZXN0YW1wKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCArIHRpbWVzdGFtcC50dl9uc2VjOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIE1tYXBUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChmZCwgYXJncyk7CkBAIC05NzQ5LDQgKzk4MjgsMTMgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OmdldEV4dGVybmFsUG9zaXRpb24oCisgICAgICAgIHVpbnQ2NF90ICpwb3NpdGlvbiwgaW50NjRfdCAqdGltZU5hbm9zKQoreworICAgIGlmIChtSW5wdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JbnB1dC0+Z2V0Q2FwdHVyZVBvc2l0aW9uKChpbnQ2NF90Kilwb3NpdGlvbiwgdGltZU5hbm9zKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggYzFhYzJlNC4uMDE0ZjJkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC0yNzIsNiArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAvLyBDYWxsZWQgYnkgQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgYW5kIGVmZmVjdHMsCiAgICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIFtub3JtYWwgbWl4XSBidWZmZXIncyBmcmFtZSBjb3VudC4KICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOyB9CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgbGF0ZW5jeV9sKCkgY29uc3QgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFZvbHVtZUZvck91dHB1dF9sKGZsb2F0IGxlZnQgX191bnVzZWQsIGZsb2F0IHJpZ2h0IF9fdW51c2VkKSBjb25zdCB7fQogCkBAIC0zNDgsNyArMzQ5LDcgQEAKIAogICAgICAgICAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gY3JlYXRlRWZmZWN0X2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKQEAgLTQ3OCw2ICs0NzksMjUgQEAKICAgICAgICAgICAgICAgICB2b2lkIG9uRWZmZWN0RW5hYmxlKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAgICAgICAgICAgICAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoKTsKIAorICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGVUcmFja3NGb3JBdWRpb1Nlc3Npb25fbCBtdXN0IGJlIGNhbGxlZCB3aXRoIGhvbGRpbmcgbUxvY2suCisgICAgdmlydHVhbCAgICAgdm9pZCBpbnZhbGlkYXRlVHJhY2tzRm9yQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCBfX3VudXNlZCkgY29uc3QgeyB9CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBhbGwgdGhlIHRyYWNrcyB3aXRoIHRoZSBnaXZlbiBhdWRpbyBzZXNzaW9uLgorICAgICAgICAgICAgICAgIHZvaWQgaW52YWxpZGF0ZVRyYWNrc0ZvckF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVUcmFja3NGb3JBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgICAgIHZvaWQgaW52YWxpZGF0ZVRyYWNrc0ZvckF1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdHJhY2tzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0Jhc2U+JiB0cmFjayA9IHRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgLy8gZW50cnkgZGVzY3JpYmluZyBhbiBlZmZlY3QgYmVpbmcgc3VzcGVuZGVkIGluIG1TdXNwZW5kZWRTZXNzaW9ucyBrZXllZCB2ZWN0b3IKQEAgLTU3NSw3ICs1OTUsNyBAQAogCiAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAga1RocmVhZE5hbWVMZW5ndGggPSAxNjsgLy8gcHJjdGwoUFJfU0VUX05BTUUpIGxpbWl0CiAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbVRocmVhZE5hbWVba1RocmVhZE5hbWVMZW5ndGhdOyAvLyBndWFyYW50ZWVkIE5VTC10ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgc3A8SVBvd2VyTWFuYWdlcj4gICAgICAgbVBvd2VyTWFuYWdlcjsKKyAgICAgICAgICAgICAgICBzcDxvczo6SVBvd2VyTWFuYWdlcj4gICBtUG93ZXJNYW5hZ2VyOwogICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuOwogICAgICAgICAgICAgICAgIGNvbnN0IHNwPFBNRGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKICAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIHN1c3BlbmRlZCBlZmZlY3RzIHBlciBzZXNzaW9uIGFuZCBwZXIgdHlwZS4gVGhlIGZpcnN0IChvdXRlcikgdmVjdG9yIGlzCkBAIC04NjQsNyArODg0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZSk7CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogZ2V0T3V0cHV0KCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGNsZWFyT3V0cHV0KCk7CkBAIC05MzksNiArOTYwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3V0RGV2aWNlVHlwZXMoKS5jb3VudChtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlKSAhPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUhhcHRpY0NoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIHN1cHBvcnRzSGFwdGljUGxheWJhY2soKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobUhhcHRpY0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgICAgICAgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCkBAIC0xMDYxLDYgKzEwODksMTEgQEAKIAogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHRyYWNrQ291bnRGb3JVaWRfbCh1aWRfdCB1aWQpIGNvbnN0OwogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW52YWxpZGF0ZVRyYWNrc0ZvckF1ZGlvU2Vzc2lvbl9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRCYXNlOjppbnZhbGlkYXRlVHJhY2tzRm9yQXVkaW9TZXNzaW9uX2woc2Vzc2lvbklkLCBtVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByaXZhdGU6CiAKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgIC8vIGZvciBudW1lcm91cwpAQCAtMTE4Niw3ICsxMjE5LDcgQEAKIAogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tDYkxvY2s7CiAgICAgLy8gUmVjb3JkIG9mIElBdWRpb1RyYWNrQ2FsbGJhY2sKLSAgICBzdGQ6OnNldDxzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4+IG1BdWRpb1RyYWNrQ2FsbGJhY2tzOworICAgIHN0ZDo6bWFwPHNwPFRyYWNrPiwgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+PiBtQXVkaW9UcmFja0NhbGxiYWNrczsKIAogcHJpdmF0ZToKICAgICAvLyBUaGUgSEFMIG91dHB1dCBzaW5rIGlzIHRyZWF0ZWQgYXMgbm9uLWJsb2NraW5nLCBidXQgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBibG9ja2luZwpAQCAtMTc5MSw2ICsxODI0LDcgQEAKICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHN0YXR1c190IHN0b3AoYXVkaW9fcG9ydF9oYW5kbGVfdCBoYW5kbGUpOwogICAgIHN0YXR1c190IHN0YW5kYnkoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEV4dGVybmFsUG9zaXRpb24odWludDY0X3QgKnBvc2l0aW9uLCBpbnQ2NF90ICp0aW1lTmFvcykgPSAwOwogCiAgICAgLy8gUmVmQmFzZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKQEAgLTE5MDIsNiArMTkzNiw4IEBACiAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRFeHRlcm5hbFBvc2l0aW9uKHVpbnQ2NF90ICpwb3NpdGlvbiwgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKwogcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCkBAIC0xOTMyLDYgKzE5NjgsOCBAQAogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgZ2V0RXh0ZXJuYWxQb3NpdGlvbih1aW50NjRfdCAqcG9zaXRpb24sIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKIHByb3RlY3RlZDoKIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qICBtSW5wdXQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDEyNjAxNWYuLjY4YjcwOWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC01NCw2ICs1NCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgYmluZGVyOjpTdGF0dXM7CiB1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBUcmFja0Jhc2UKQEAgLTMxOSw2NCArMzIwLDk4IEBACiAgICAgbVRyYWNrLT5kZXN0cm95KCk7CiB9CiAKLXNwPElNZW1vcnk+IEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmdldENibGsoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0Q2JsaygpOworU3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmdldENibGsoCisgICAgICAgIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OlNoYXJlZEZpbGVSZWdpb24+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gbGVnYWN5MmFpZGxfTnVsbGFibGVJTWVtb3J5X1NoYXJlZEZpbGVSZWdpb24obVRyYWNrLT5nZXRDYmxrKCkpLnZhbHVlKCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c3RhcnQoKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzdGFydChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gbVRyYWNrLT5zdGFydCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c3RvcCgpIHsKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzdG9wKCkgewogICAgIG1UcmFjay0+c3RvcCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6Zmx1c2goKSB7CitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6Zmx1c2goKSB7CiAgICAgbVRyYWNrLT5mbHVzaCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6cGF1c2UoKSB7CitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6cGF1c2UoKSB7CiAgICAgbVRyYWNrLT5wYXVzZSgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpCi17Ci0gICAgcmV0dXJuIG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KEVmZmVjdElkKTsKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjphdHRhY2hBdXhFZmZlY3QoaW50MzJfdCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKLSAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworU3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnNldFBhcmFtZXRlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKFN0cmluZzgoa2V5VmFsdWVQYWlycy5jX3N0cigpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgewotICAgIHJldHVybiBtVHJhY2stPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZWxlY3RQcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBtVHJhY2stPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1Wb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjphcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKLSAgICByZXR1cm4gbVRyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworU3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmdldFRpbWVzdGFtcChtZWRpYTo6QXVkaW9UaW1lc3RhbXBJbnRlcm5hbCogdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBBdWRpb1RpbWVzdGFtcCBsZWdhY3k7CisgICAgKl9haWRsX3JldHVybiA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKGxlZ2FjeSk7CisgICAgaWYgKCpfYWlkbF9yZXR1cm4gIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisgICAgKnRpbWVzdGFtcCA9IGxlZ2FjeTJhaWRsX0F1ZGlvVGltZXN0YW1wKGxlZ2FjeSkudmFsdWUoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpIHsKLSAgICByZXR1cm4gbVRyYWNrLT5nZXRWb2x1bWVTaGFwZXJTdGF0ZShpZCk7CitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2lnbmFsKCkgeworICAgIG1UcmFjay0+c2lnbmFsKCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApCi17Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6YXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyT3BlcmF0aW9uJiBvcGVyYXRpb24sCisgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4gY29uZiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gY29uZi0+cmVhZEZyb21QYXJjZWxhYmxlKGNvbmZpZ3VyYXRpb24pOworICAgIGlmICgqX2FpZGxfcmV0dXJuICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+IG9wID0gbmV3IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uKCk7CisgICAgKl9haWRsX3JldHVybiA9IG9wLT5yZWFkRnJvbVBhcmNlbGFibGUob3BlcmF0aW9uKTsKKyAgICBpZiAoKl9haWRsX3JldHVybiAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSBtVHJhY2stPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmYsIG9wKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi0KLXZvaWQgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2lnbmFsKCkKLXsKLSAgICByZXR1cm4gbVRyYWNrLT5zaWduYWwoKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHJldHVybiBCbkF1ZGlvVHJhY2s6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRWb2x1bWVTaGFwZXJTdGF0ZSgKKyAgICAgICAgaW50MzJfdCBpZCwKKyAgICAgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6Vm9sdW1lU2hhcGVyU3RhdGU+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBsZWdhY3kgPSBtVHJhY2stPmdldFZvbHVtZVNoYXBlclN0YXRlKGlkKTsKKyAgICBpZiAobGVnYWN5ID09IG51bGxwdHIpIHsKKyAgICAgICAgX2FpZGxfcmV0dXJuLT5yZXNldCgpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKyAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyU3RhdGUgYWlkbDsKKyAgICBsZWdhY3ktPndyaXRlVG9QYXJjZWxhYmxlKCZhaWRsKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gYWlkbDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zODYsMTEgKzQyMSwxMiBAQAogLy8gc3RhdGljCiBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I+CiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6OmNyZWF0ZUlmTmVlZGVkKAotICAgICAgICAgICAgdWlkX3QgdWlkLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsIGludCBpZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorICAgICAgICAgICAgdWlkX3QgdWlkLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsIGludCBpZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUpCiB7CisgICAgVmVjdG9yIDxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7CiAgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7Ci0gICAgICAgIFZlY3RvciA8U3RyaW5nMTY+IHBhY2thZ2VzOwotICAgICAgICBnZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKICAgICAgICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgQUxPR0QoIk9wUGxheUF1ZGlvOiBub3QgbXV0aW5nIHRyYWNrOiVkIHVzYWdlOiVkIGZvciBzZXJ2aWNlIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICBpZCwKQEAgLTQxMCwxMiArNDQ2LDMyIEBACiAgICAgICAgICAgICBpZCwgYXR0ci5mbGFncyk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLSAgICByZXR1cm4gbmV3IE9wUGxheUF1ZGlvTW9uaXRvcih1aWQsIGF0dHIudXNhZ2UsIGlkKTsKKworICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWVTdHIob3BQYWNrYWdlTmFtZS5jX3N0cigpKTsKKyAgICBpZiAob3BQYWNrYWdlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIElmIG5vIHBhY2thZ2UgbmFtZSBpcyBwcm92aWRlZCBieSB0aGUgY2xpZW50LCB1c2UgdGhlIGZpcnN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdWlkCisgICAgICAgIGlmICghcGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBvcFBhY2thZ2VOYW1lU3RyID0gcGFja2FnZXNbMF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGUgcHJvdmlkZWQgcGFja2FnZSBuYW1lIGlzIGludmFsaWQsIHdlIGZvcmNlIGFwcCBvcHMgZGVuaWFsIGJ5IGNsZWFyaW5nIHRoZSBwYWNrYWdlCisgICAgICAgIC8vIG5hbWUgcGFzc2VkIHRvIE9wUGxheUF1ZGlvTW9uaXRvcgorICAgICAgICBpZiAoc3RkOjpmaW5kX2lmKHBhY2thZ2VzLmJlZ2luKCksIHBhY2thZ2VzLmVuZCgpLAorICAgICAgICAgICAgICAgIFsmb3BQYWNrYWdlTmFtZVN0cl0oY29uc3QgYXV0byYgcGFja2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lU3RyID09IHBhY2thZ2U7IH0pID09IHBhY2thZ2VzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVygiVGhlIHBhY2thZ2UgbmFtZSglcykgcHJvdmlkZWQgZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgdWlkICVkLCAiCisgICAgICAgICAgICAgICAgICAiZm9yY2UgbXV0aW5nIHRoZSB0cmFjayIsIG9wUGFja2FnZU5hbWUuY19zdHIoKSwgdWlkKTsKKyAgICAgICAgICAgIC8vIFNldCBwYWNrYWdlIG5hbWUgYXMgYW4gZW1wdHkgc3RyaW5nIHNvIHRoYXQgaGFzT3BQbGF5QXVkaW8gd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLgorICAgICAgICAgICAgb3BQYWNrYWdlTmFtZVN0ciA9IFN0cmluZzE2KCIiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IE9wUGxheUF1ZGlvTW9uaXRvcih1aWQsIGF0dHIudXNhZ2UsIGlkLCBvcFBhY2thZ2VOYW1lU3RyKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjpPcFBsYXlBdWRpb01vbml0b3IoCi0gICAgICAgIHVpZF90IHVpZCwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwgaW50IGlkKQotICAgICAgICA6IG1IYXNPcFBsYXlBdWRpbyh0cnVlKSwgbVVpZCh1aWQpLCBtVXNhZ2UoKGludDMyX3QpIHVzYWdlKSwgbUlkKGlkKQorICAgICAgICB1aWRfdCB1aWQsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsIGludCBpZCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCisgICAgICAgIDogbUhhc09wUGxheUF1ZGlvKHRydWUpLCBtVWlkKHVpZCksIG1Vc2FnZSgoaW50MzJfdCkgdXNhZ2UpLCBtSWQoaWQpLAorICAgICAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCiB7CiB9CiAKQEAgLTQyOSwxMSArNDg1LDEwIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjpvbkZpcnN0UmVmKCkKIHsKLSAgICBnZXRQYWNrYWdlc0ZvclVpZChtVWlkLCBtUGFja2FnZXMpOwogICAgIGNoZWNrUGxheUF1ZGlvRm9yVXNhZ2UoKTsKLSAgICBpZiAoIW1QYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICBpZiAobU9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKICAgICAgICAgbU9wQ2FsbGJhY2sgPSBuZXcgUGxheUF1ZGlvT3BDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgbUFwcE9wc01hbmFnZXIuc3RhcnRXYXRjaGluZ01vZGUoQXBwT3BzTWFuYWdlcjo6T1BfUExBWV9BVURJTywgbVBhY2thZ2VzWzBdLCBtT3BDYWxsYmFjayk7CisgICAgICAgIG1BcHBPcHNNYW5hZ2VyLnN0YXJ0V2F0Y2hpbmdNb2RlKEFwcE9wc01hbmFnZXI6Ok9QX1BMQVlfQVVESU8sIG1PcFBhY2thZ2VOYW1lLCBtT3BDYWxsYmFjayk7CiAgICAgfQogfQogCkBAIC00NDYsMTggKzUwMSwxMSBAQAogLy8gLSBub3QgY2FsbGVkIGZyb20gUGxheUF1ZGlvT3BDYWxsYmFjayBiZWNhdXNlIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkIGluIHRoaXMgY2FzZQogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6OmNoZWNrUGxheUF1ZGlvRm9yVXNhZ2UoKQogewotICAgIGlmIChtUGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgaWYgKG1PcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIG1IYXNPcFBsYXlBdWRpby5zdG9yZShmYWxzZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYm9vbCBoYXNJdCA9IHRydWU7Ci0gICAgICAgIGZvciAoY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lIDogbVBhY2thZ2VzKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IG1vZGUgPSBtQXBwT3BzTWFuYWdlci5jaGVja0F1ZGlvT3BOb1Rocm93KEFwcE9wc01hbmFnZXI6Ok9QX1BMQVlfQVVESU8sCi0gICAgICAgICAgICAgICAgICAgIG1Vc2FnZSwgbVVpZCwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgaWYgKG1vZGUgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICAgICAgaGFzSXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBib29sIGhhc0l0ID0gbUFwcE9wc01hbmFnZXIuY2hlY2tBdWRpb09wTm9UaHJvdyhBcHBPcHNNYW5hZ2VyOjpPUF9QTEFZX0FVRElPLAorICAgICAgICAgICAgICAgICAgICBtVXNhZ2UsIG1VaWQsIG1PcFBhY2thZ2VOYW1lKSA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQ7CiAgICAgICAgIEFMT0dEKCJPcFBsYXlBdWRpbzogdHJhY2s6JWQgdXNhZ2U6JWQgJXNtdXRlZCIsIG1JZCwgbVVzYWdlLCBoYXNJdCA/ICJub3QgIiA6ICIiKTsKICAgICAgICAgbUhhc09wUGxheUF1ZGlvLnN0b3JlKGhhc0l0KTsKICAgICB9CkBAIC01MTEsNyArNTU5LDggQEAKICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudFRvQmVSZWFkeSkKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb3BQYWNrYWdlTmFtZSkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwogICAgICAgICAgICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCkBAIC01MzQsNyArNTgzLDggQEAKICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMoMCksCiAgICAgbUZyYW1lTWFwKDE2IC8qIHNpbmstZnJhbWUtdG8tdHJhY2stZnJhbWUgbWFwIG1lbW9yeSAqLyksCiAgICAgbVZvbHVtZUhhbmRsZXIobmV3IG1lZGlhOjpWb2x1bWVIYW5kbGVyKHNhbXBsZVJhdGUpKSwKLSAgICBtT3BQbGF5QXVkaW9Nb25pdG9yKE9wUGxheUF1ZGlvTW9uaXRvcjo6Y3JlYXRlSWZOZWVkZWQodWlkLCBhdHRyLCBpZCgpLCBzdHJlYW1UeXBlKSksCisgICAgbU9wUGxheUF1ZGlvTW9uaXRvcihPcFBsYXlBdWRpb01vbml0b3I6OmNyZWF0ZUlmTmVlZGVkKAorICAgICAgICAgICAgdWlkLCBhdHRyLCBpZCgpLCBzdHJlYW1UeXBlLCBvcFBhY2thZ2VOYW1lKSksCiAgICAgLy8gbVNpbmtUaW1lc3RhbXAKICAgICBtRnJhbWVDb3VudFRvQmVSZWFkeShmcmFtZUNvdW50VG9CZVJlYWR5KSwKICAgICBtRmFzdEluZGV4KC0xKSwKQEAgLTU5NSwxMCArNjQ1LDEzIEBACiAgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX1QiKTsKICNlbmRpZgogCi0gICAgaWYgKGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgaWYgKHRocmVhZC0+c3VwcG9ydHNIYXB0aWNQbGF5YmFjaygpKSB7CisgICAgICAgIC8vIElmIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0byBoYXB0aWMgcGxheWJhY2sgdGhyZWFkLCBpdCBpcyBwb3RlbnRpYWxseSB0byBoYXZlCisgICAgICAgIC8vIEhhcHRpY0dlbmVyYXRvciBlZmZlY3QsIHdoaWNoIHdpbGwgZ2VuZXJhdGUgaGFwdGljIGRhdGEsIG9uIHRoZSB0cmFjay4gSW4gdGhhdCBjYXNlLAorICAgICAgICAvLyBleHRlcm5hbCB2aWJyYXRpb24gaXMgYWx3YXlzIGNyZWF0ZWQgZm9yIGFsbCB0cmFja3MgYXR0YWNoZWQgdG8gaGFwdGljIHBsYXliYWNrIHRocmVhZC4KICAgICAgICAgbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlciA9IG5ldyBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIodGhpcyk7CiAgICAgICAgIG1FeHRlcm5hbFZpYnJhdGlvbiA9IG5ldyBvczo6RXh0ZXJuYWxWaWJyYXRpb24oCi0gICAgICAgICAgICAgICAgbVVpZCwgIiIgLyogcGtnICovLCBtQXR0ciwgbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgbVVpZCwgb3BQYWNrYWdlTmFtZSwgbUF0dHIsIG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIpOwogICAgIH0KIAogICAgIC8vIE9uY2UgdGhpcyBpdGVtIGlzIGxvZ2dlZCBieSB0aGUgc2VydmVyLCB0aGUgY2xpZW50IGNhbiBhZGQgcHJvcGVydGllcy4KQEAgLTkzNiw2ICs5ODksMTEgQEAKICAgICAgICAgLy8gaW5pdGlhbCBzdGF0ZS1zdG9wcGluZy4gbmV4dCBzdGF0ZS1wYXVzaW5nLgogICAgICAgICAvLyBXaGF0IGlmIHJlc3VtZSBpcyBjYWxsZWQgPwogCisgICAgICAgIGlmIChzdGF0ZSA9PSBGTFVTSEVEKSB7CisgICAgICAgICAgICAvLyBhdm9pZCB1bmRlcnJ1biBnbGl0Y2hlcyB3aGVuIHN0YXJ0aW5nIGFmdGVyIGZsdXNoCisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHN0YXRlID09IFBBVVNFRCB8fCBzdGF0ZSA9PSBQQVVTSU5HKSB7CiAgICAgICAgICAgICBpZiAobVJlc3VtZVRvU3RvcHBpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBoYXBwZW5lZCB3ZSBuZWVkIHRvIHJlc3VtZSB0byBTVE9QUElOR18xCkBAIC0xOTE4LDYgKzE5NzYsMjUgQEAKIHsKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKICAgICByZXN0YXJ0SWZEaXNhYmxlZCgpOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIFBhdGNoVHJhY2sgaGFzIGVub3VnaCBkYXRhIHRvIHdyaXRlIG9uY2UgaW4gcmVsZWFzZUJ1ZmZlcigpLgorICAgIC8vIElmIG5vdCwgcHJldmVudCBhbiB1bmRlcnJ1biBmcm9tIG9jY3VycmluZyBieSBtb3ZpbmcgdGhlIHRyYWNrIGludG8gRlNfRklMTElORzsKKyAgICAvLyB0aGlzIGxvZ2ljIGF2b2lkcyBnbGl0Y2hlcyB3aGVuIHN1c3BlbmRpbmcgQTJEUCB3aXRoIEF1ZGlvUGxheWJhY2tDYXB0dXJlLgorICAgIC8vIFRPRE86IHBlcmhhcHMgdW5kZXJydW4gYXZvaWRhbmNlIGNvdWxkIGJlIGEgdHJhY2sgcHJvcGVydHkgY2hlY2tlZCBpbiBpc1JlYWR5KCkgaW5zdGVhZC4KKyAgICBpZiAobUZpbGxpbmdVcFN0YXR1cyA9PSBGU19BQ1RJVkUKKyAgICAgICAgICAgICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkKKyAgICAgICAgICAgICYmICFpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgaWYgKHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICAgICAgdGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIHNhbXBsZVJhdGUoKQorICAgICAgICAgICAgICAgICAgICAvIHBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkoKSA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpIE5vdCBlbm91Z2ggZGF0YSwgd2FpdCBmb3IgYnVmZmVyIHRvIGZpbGwiLCBfX2Z1bmNfXywgbUlkKTsKKyAgICAgICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTElORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZXN0YXJ0SWZEaXNhYmxlZCgpCkBAIC0yMDcwLDEwICsyMTQ3LDE1IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YT4qIGFjdGl2ZU1pY3JvcGhvbmVzKSB7CiAgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKLSAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpKTsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+IG1pY3M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVJlY29yZFRyYWNrLT5nZXRBY3RpdmVNaWNyb3Bob25lcygmbWljcyk7CisgICAgYWN0aXZlTWljcm9waG9uZXMtPnJlc2l6ZShtaWNzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IHN0YXR1cyA9PSBPSyAmJiBpIDwgbWljcy5zaXplKCk7ICsraSkgeworICAgICAgIHN0YXR1cyA9IG1pY3NbaV0ud3JpdGVUb1BhcmNlbGFibGUoJmFjdGl2ZU1pY3JvcGhvbmVzLT5hdChpKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCkBAIC0yMjA3LDcgKzIyODksOCBAQAogICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CiAgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPnN0YXJ0KHRoaXMsIGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR1coIiVzIHRyYWNrICVkOiB0aHJlYWQgd2FzIGRlc3Ryb3llZCIsIF9fZnVuY19fLCBwb3J0SWQoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKaW5kZXggNmVmMTliZi4uZmViNzFlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKQEAgLTgwLDcgKzgwLDcgQEAKIAogLy8gVE9ETyBQZXJtaXQgZGlzYWJsaW5nIG9mIGxvZ2dpbmcgYXQgY29tcGlsZS10aW1lLgogCi0vLyBUT0RPIEEgbm9uLW51bGxwdHIgZHVtbXkgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBhIG5vcCB3b3VsZCBiZSBmYXN0ZXIgdGhhbiBjaGVja2luZyBmb3IgbnVsbHB0cgorLy8gVE9ETyBBIG5vbi1udWxscHRyIHN0dWIgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBhIG5vcCB3b3VsZCBiZSBmYXN0ZXIgdGhhbiBjaGVja2luZyBmb3IgbnVsbHB0cgogLy8gICAgICBpbiB0aGUgY2FzZSB3aGVuIGxvZ2dpbmcgaXMgZW5hYmxlZCBhdCBjb21waWxlLXRpbWUgYW5kIGVuYWJsZWQgYXQgcnVudGltZSwgYnV0IGl0IG1pZ2h0IGJlCiAvLyAgICAgIHNsb3dlciB0aGFuIG51bGxwdHIgY2hlY2sgd2hlbiBsb2dnaW5nIGlzIGVuYWJsZWQgYXQgY29tcGlsZS10aW1lIGFuZCBkaXNhYmxlZCBhdCBydW50aW1lLgogCkBAIC0xMjksOCArMTI5LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogZXh0ZXJuICJDIiB7Ci0vLyBUT0RPIGNvbnNpZGVyIGFkZGluZyBhIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyIHRsRHVtbXlOQkxvZ1dyaXRlciBhbmQgdGhlbgotLy8gaW5pdGlhbGl6ZSBiZWxvdyB0bE5CTG9nV3JpdGVyIHRvICZ0bER1bW15TkJMb2dXcml0ZXIgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvCisvLyBUT0RPIGNvbnNpZGVyIGFkZGluZyBhIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyIHRsU3R1Yk5CTG9nV3JpdGVyIGFuZCB0aGVuCisvLyBpbml0aWFsaXplIGJlbG93IHRsTkJMb2dXcml0ZXIgdG8gJnRsU3R1Yk5CTG9nV3JpdGVyIHRvIHJlbW92ZSB0aGUgbmVlZCB0bwogLy8gY2hlY2sgZm9yIG51bGxwdHIgZXZlcnkgdGltZS4gQWxzbyByZWR1Y2VzIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyBsb2dnaW5nIG1hY3JvIGFib3ZlCiAvLyBlYWNoIHRpbWUgd2Ugd2FudCB0byBsb2cgYSBuZXcgdHlwZS4KIGV4dGVybiB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciAqdGxOQkxvZ1dyaXRlcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IDhkMGU1ZGIuLmIwMDQyNmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtMjUwLDEyICsyNTAsMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykKICAgICAgICAgICAgID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgPSAwOworICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCkBAIC0yOTUsMTMgKzI5NSwzNiBAQAogCiAgICAgdmlydHVhbCBib29sICAgICBpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CiB9OwogCiAKQEAgLTQyMSw2ICs0NDQsOCBAQAogICAgIC8vIHNlc3Npb25zIHRvIGJlIHByZWVtcHRlZCBvbiBtb2R1bGVzIHRoYXQgZG8gbm90IHN1cHBvcnQgc291bmQgdHJpZ2dlcgogICAgIC8vIHJlY29nbml0aW9uIGNvbmN1cnJlbnRseSB3aXRoIGF1ZGlvIGNhcHR1cmUuCiAgICAgdmlydHVhbCB2b2lkIHNldFNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpID0gMDsKIH07CiAKIGV4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUwppbmRleCBhODQ4M2ZhLi5kYTlkMzJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCkBAIC0xLDMgKzEsMiBAQAogam10cml2aUBnb29nbGUuY29tCi1rcm9jYXJkQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggN2M4Y2U4My4uNzM2ZjhiMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTEyNiw2ICsxMjYsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVDsKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRDsKQEAgLTEzOSw2ICsxNDAsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVI6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVI7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAppbmRleCAzOWQxMTQwLi4xMzAyNDg2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC0xODIsNiArMTgyLDcgQEAKICAgICAgKiBBY3RpdmUgcmVmIGNvdW50IG9mIHRoZSBjbGllbnQgd2lsbCBiZSBpbmNyZW1lbnRlZC9kZWNyZW1lbnRlZCB0aHJvdWdoIHNldEFjdGl2ZSBBUEkKICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpOworICAgIGJvb2wgaXNDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KTsKIAogICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0OwogICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSA9IFZPTFVNRV9TT1VSQ0VfTk9ORSwKQEAgLTQ5OCwxMSArNDk5LDYgQEAKICAgICAgKi8KICAgICBib29sIGlzQTJkcE9mZmxvYWRlZE9uUHJpbWFyeSgpIGNvbnN0OwogCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0cnVlIGlmIEEyRFAgaXMgc3VwcG9ydGVkIChlaXRoZXIgdmlhIGhhcmR3YXJlIG9mZmxvYWQgb3Igc29mdHdhcmUgZW5jb2RpbmcpCi0gICAgICovCi0gICAgYm9vbCBpc0EyZHBTdXBwb3J0ZWQoKSBjb25zdDsKLQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAppbmRleCAzOTViYzcwLi5jZjFmNjRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaApAQCAtMzMsNiArMzMsMTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBUaGlzIGNsYXNzIGdhdGhlcnMgdG9nZXRoZXIgdmFyaW91cyBiaXRzIG9mIEF1ZGlvUG9saWN5TWFuYWdlcgorLy8gY29uZmlndXJhdGlvbiwgd2hpY2ggYXJlIHVzdWFsbHkgZmlsbGVkIG91dCBhcyBhIHJlc3VsdCBvZiBwYXJzaW5nCisvLyB0aGUgYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGZpbGUuCisvLworLy8gTm90ZSB0aGF0IEF1ZGlvUG9saWN5Q29uZmlnIGRvZXNuJ3Qgb3duIHNvbWUgb2YgdGhlIGRhdGEsCisvLyBpdCBzaW1wbHkgcHJveGllcyBhY2Nlc3MgdG8gdGhlIGZpZWxkcyBvZiBBdWRpb1BvbGljeU1hbmFnZXIKKy8vIGNsYXNzLiBCZSBjYXJlZnVsIGFib3V0IHRoZSBmaWVsZHMgdGhhdCBhcmUgcmVmZXJlbmNlcywKKy8vIGUuZy4gJ21PdXRwdXREZXZpY2VzJy4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgaXQncyBpbXBvc3NpYmxlCisvLyB0byBpbXBsZW1lbnQgImRlZXAgY29weWluZyIgb2YgdGhpcyBjbGFzcyB3aXRob3V0IHJlLWRlc2lnbmluZyBpdC4KIGNsYXNzIEF1ZGlvUG9saWN5Q29uZmlnCiB7CiBwdWJsaWM6CkBAIC00MCwxNCArNDksMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJm91dHB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZpbnB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2UpCi0gICAgICAgIDogbUVuZ2luZUxpYnJhcnlOYW1lU3VmZml4KGtEZWZhdWx0RW5naW5lTGlicmFyeU5hbWVTdWZmaXgpLAotICAgICAgICAgIG1Id01vZHVsZXMoaHdNb2R1bGVzKSwKKyAgICAgICAgOiBtSHdNb2R1bGVzKGh3TW9kdWxlcyksCiAgICAgICAgICAgbU91dHB1dERldmljZXMob3V0cHV0RGV2aWNlcyksCiAgICAgICAgICAgbUlucHV0RGV2aWNlcyhpbnB1dERldmljZXMpLAotICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpLAotICAgICAgICAgIG1Jc1NwZWFrZXJEcmNFbmFibGVkKGZhbHNlKSwKLSAgICAgICAgICBtSXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZChmYWxzZSkKLSAgICB7fQorICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBtU291cmNlID0ge307CisgICAgICAgIG1FbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeCA9IGtEZWZhdWx0RW5naW5lTGlicmFyeU5hbWVTdWZmaXg7CisgICAgICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKKyAgICAgICAgbU91dHB1dERldmljZXMuY2xlYXIoKTsKKyAgICAgICAgbUlucHV0RGV2aWNlcy5jbGVhcigpOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS5jbGVhcigpOworICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZCA9IGZhbHNlOworICAgICAgICBtSXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7CisgICAgfQogCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFNvdXJjZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Tb3VyY2U7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCmluZGV4IGI4MjMwNWQuLmM2YmRiMDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgKiAgICBBbiBleGFtcGxlIG9mIGZhaWx1cmUgaXMgd2hlbiB0aGVyZSBhcmUgYWxyZWFkeSBydWxlcyBpbiBwbGFjZSB0byByZXN0cmljdAogICAgICAqICAgIGEgbWl4IHRvIHRoZSBnaXZlbiB1aWQgKGkuZS4gd2hlbiBhIE1BVENIX1VJRCBydWxlIHdhcyBzZXQgZm9yIGl0KS4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CiAgICAgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOwogICAgIHN0YXR1c190IGdldERldmljZXNGb3JVaWQodWlkX3QgdWlkLCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIGNvbnN0OwogCkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgKiAgICBBbiBleGFtcGxlIG9mIGZhaWx1cmUgaXMgd2hlbiB0aGVyZSBhcmUgYWxyZWFkeSBydWxlcyBpbiBwbGFjZSB0byByZXN0cmljdAogICAgICAqICAgIGEgbWl4IHRvIHRoZSBnaXZlbiB1c2VySWQgKGkuZS4gd2hlbiBhIE1BVENIX1VTRVJJRCBydWxlIHdhcyBzZXQgZm9yIGl0KS4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKICAgICBzdGF0dXNfdCByZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQpOwogICAgIHN0YXR1c190IGdldERldmljZXNGb3JVc2VySWQoaW50IHVzZXJJZCwgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKaW5kZXggOTIzMzEwYy4uODBhZmU5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCkBAIC0xMTMsNiArMTEzLDkgQEAKICAgICBjb25zdCBzcDxBdWRpb1BvbGljeU1peD4gZ2V0UHJpbWFyeU1peCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1QcmltYXJ5TWl4LnByb21vdGUoKTsKICAgICB9OworICAgIGJvb2wgaGFzTG9zdFByaW1hcnlNaXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHJpbWFyeU1peC51bnNhZmVfZ2V0KCkgJiYgIW1QcmltYXJ5TWl4LnByb21vdGUoKTsKKyAgICB9CiAKICAgICB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgb3ZlcnJpZGUKICAgICB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAppbmRleCBkZDE0OTljLi43YzcxMmUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKQEAgLTg1LDYgKzg1LDcgQEAKIAogICAgIC8vIEF1ZGlvUG9ydAogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdDsKIAogICAgIHZvaWQgaW1wb3J0QXVkaW9Qb3J0QW5kUGlja0F1ZGlvUHJvZmlsZShjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+JiBwb2xpY3lQb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UpOwpAQCAtOTQsNiArOTUsMTMgQEAKICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIHN0cnVjdCBhdWRpb19wb3J0X3Y3Pjo6dmFsdWUsIGludD4gPSAwPgorICAgIHZvaWQgdG9BdWRpb1BvcnRJbnRlcm5hbChUKiBwb3J0KSBjb25zdCB7CisgICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydChwb3J0KTsKKyAgICAgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKKyAgICB9CisKICAgICBzdGQ6OnN0cmluZyBtVGFnTmFtZTsgLy8gVW5pcXVlIGh1bWFuIHJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIGEgZGV2aWNlIHBvcnQgZm91bmQgaW4gY29uZiBmaWxlLgogICAgIEZvcm1hdFZlY3RvciAgICAgICAgbUVuY29kZWRGb3JtYXRzOwogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0OwpAQCAtMTQ2LDYgKzE1NCwxNSBAQAogICAgIC8vICAgICA0KSB0aGUgY29tYmluYXRpb24gb2YgYWxsIGRldmljZXMgaXMgaW52YWxpZCBmb3Igc2VsZWN0aW9uCiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRm9yT3BlbmluZygpIGNvbnN0OwogCisgICAgLy8gUmV0dXJuIHRoZSBkZXZpY2UgZGVzY3JpcHRvciB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIEF1ZGlvRGV2aWNlVHlwZUFkZHIKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tRGV2aWNlVHlwZUFkZHIoCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2VUeXBlQWRkcikgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdGhlIGRldmljZSB2ZWN0b3IgdGhhdCBjb250YWlucyBkZXZpY2UgZGVzY3JpcHRvciB3aG9zZSBBdWRpb0RldmljZVR5cGVBZGRyIGFwcGVhcnMKKyAgICAvLyBpbiB0aGUgZ2l2ZW4gQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcgorICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbURldmljZVR5cGVBZGRyVmVjKAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlVHlwZUFkZHJWZWN0b3IpIGNvbnN0OworCiAgICAgLy8gSWYgdGhlcmUgYXJlIGRldmljZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgdGhlIGRldmljZXMgdG8gYWRkIGlzIG5vdCBlbXB0eSwKICAgICAvLyByZW1vdmUgYWxsIHRoZSBkZXZpY2VzIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGFkZCBhbGwgdGhlIGRldmljZXMgdG8gYWRkLgogICAgIHZvaWQgcmVwbGFjZURldmljZXNCeVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVUb1JlbW92ZSwgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzVG9BZGQpOwpAQCAtMjQ4LDcgKzI2NSw5IEBACiAgICAgICAgIHJldHVybiBTdHJpbmc4KCIiKTsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworICAgIC8vIFJldHVybiBhIHN0cmluZyB0byBkZXNjcmliZSB0aGUgRGV2aWNlVmVjdG9yLiBUaGUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdpbGwgb25seSBiZQorICAgIC8vIGFkZGVkIHRvIHRoZSBzdHJpbmcgaWYgYGluY2x1ZGVTZW5zaXRpdmVJbmZvYCBpcyB0cnVlLgorICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8gPSBmYWxzZSkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKaW5kZXggYzRlYWIzMC4uNTllZWU1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCkBAIC03Miw2ICs3Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOwogICAgIHZvaWQgbW92ZUVmZmVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOwogCisgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW9Gb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKmVmZmVjdFR5cGUgPSBudWxscHRyKTsKKwogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAppbmRleCBiOTYzMTIxLi40OTIyZWJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCkBAIC01MTYsNyArNTE2LDcgQEAKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzICVzXG4iLCBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOwogICAgIG1FbmFibGVkRWZmZWN0cy5kdW1wKGRzdCwgMSAvKnNwYWNlcyovLCBmYWxzZSAvKnZlcmJvc2UqLyk7CiAgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1JlY29yZCBDbGllbnRzOlxuIik7CiAgICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggZDZkNDcyYi4uMTc1NjAyMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0xMjMsNiArMTIzLDEyIEBACiAgICAgY2xpZW50LT5zZXRBY3RpdmUoYWN0aXZlKTsKIH0KIAorYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQ2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKK3sKKyAgICByZXR1cm4gY2xpZW50ICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIHN0ZDo6ZmluZChiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksIGNsaWVudCkgIT0gZW5kKG1BY3RpdmVDbGllbnRzKTsKK30KKwogYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2cywgdWludDMyX3QgaW5QYXN0TXMsIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKIHsKICAgICByZXR1cm4gKHZzID09IFZPTFVNRV9TT1VSQ0VfTk9ORSkgPwpAQCAtMjQ1LDcgKzI1MSw3IEBACiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlc1xuIiwgZGV2aWNlcygpLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlc1xuIiwgZGV2aWNlcygpLnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOwogICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgewogICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7CkBAIC03NjQsMTEgKzc3MCw2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0EyZHBTdXBwb3J0ZWQoKSBjb25zdAotewotICAgIHJldHVybiAoaXNBMmRwT2ZmbG9hZGVkT25QcmltYXJ5KCkgfHwgKGdldEEyZHBPdXRwdXQoKSAhPSAwKSk7Ci19Ci0KIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCmluZGV4IGI2ZGU0YmUuLmZjMWQwZTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKQEAgLTQ2Myw3ICs0NjMsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAotICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIC8vIHZlcmlmeSBmZWFzaWJpbGl0eTogZm9yIGVhY2ggcGxheWVyIG1peDogaWYgaXQgYWxyZWFkeSBjb250YWlucyBhCiAgICAgLy8gICAgIm1hdGNoIHVpZCIgcnVsZSBmb3IgdGhpcyB1aWQsIHJldHVybiBhbiBlcnJvcgogICAgIC8vICAgIChhZGRpbmcgYSB1aWQtZGV2aWNlIGFmZmluaXR5IHdvdWxkIHJlc3VsdCBpbiBjb250cmFkaWN0b3J5IHJ1bGVzKQpAQCAtNTY1LDcgKzU2NSw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIC8vIHZlcmlmeSBmZWFzaWJpbGl0eTogZm9yIGVhY2ggcGxheWVyIG1peDogaWYgaXQgYWxyZWFkeSBjb250YWlucyBhCiAgICAgLy8gICAgIm1hdGNoIHVzZXJJZCIgcnVsZSBmb3IgdGhpcyB1c2VySWQsIHJldHVybiBhbiBlcnJvcgogICAgIC8vICAgIChhZGRpbmcgYSB1c2VySWQtZGV2aWNlIGFmZmluaXR5IHdvdWxkIHJlc3VsdCBpbiBjb250cmFkaWN0b3J5IHJ1bGVzKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAppbmRleCBhMjllNjBlLi4zMGI3MzljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtMTU1LDggKzE1NSwxMiBAQAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKIHsKICAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAlMDh4IiwgbUlkLCBtRGV2aWNlVHlwZUFkZHIubVR5cGUpOwotICAgIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydChwb3J0KTsKLSAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOworICAgIHRvQXVkaW9Qb3J0SW50ZXJuYWwocG9ydCk7Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIGNvbnN0IHsKKyAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSB2NyBoYW5kbGUgJWQgdHlwZSAlMDh4IiwgbUlkLCBtRGV2aWNlVHlwZUFkZHIubVR5cGUpOworICAgIHRvQXVkaW9Qb3J0SW50ZXJuYWwocG9ydCk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6aW1wb3J0QXVkaW9Qb3J0QW5kUGlja0F1ZGlvUHJvZmlsZSgKQEAgLTIyNyw2ICsyMzEsNyBAQAogewogICAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZGV2aWNlICE9IG51bGxwdHIsICJOdWxsIHBvaW50ZXIgZm91bmQgd2hlbiBhZGRpbmcgRGV2aWNlVmVjdG9yIik7CiAgICAgICAgIGlmIChpbmRleE9mKGRldmljZSkgPCAwICYmIFNvcnRlZFZlY3Rvcjo6YWRkKGRldmljZSkgPj0gMCkgewogICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwogICAgICAgICB9CkBAIC0yMzgsNiArMjQzLDcgQEAKIAogc3NpemVfdCBEZXZpY2VWZWN0b3I6OmFkZChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkKIHsKKyAgICBBTE9HX0FTU0VSVChpdGVtICE9IG51bGxwdHIsICJBZGRpbmcgbnVsbCBwb2ludGVyIHRvIERldmljZVZlY3RvciIpOwogICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKIAogICAgIGlmIChyZXQgPCAwKSB7CkBAIC0zNzUsNyArMzgxLDcgQEAKICAgICBpZiAoaXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIFJldHVybiBudWxscHRyIGlmIHRoaXMgY29sbGVjdGlvbiBpcyBlbXB0eS4KICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfSBlbHNlIGlmIChhcmVBbGxPZlNhbWVEZXZpY2VUeXBlKHR5cGVzKCksIGF1ZGlvX2lzX2lucHV0X2RldmljZSkpIHsKKyAgICB9IGVsc2UgaWYgKGFyZUFsbE9mU2FtZURldmljZVR5cGUodHlwZXMoKSwgYXVkaW9fY2FsbF9pc19pbnB1dF9kZXZpY2UpKSB7CiAgICAgICAgIC8vIEZvciBpbnB1dCBjYXNlLCByZXR1cm4gdGhlIGZpcnN0IG9uZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZS4KICAgICAgICAgcmV0dXJuIHNpemUoKSA+IDEgPyBudWxscHRyIDogKmJlZ2luKCk7CiAgICAgfSBlbHNlIGlmIChhcmVBbGxPZlNhbWVEZXZpY2VUeXBlKHR5cGVzKCksIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UpKSB7CkBAIC0zODgsNiArMzk0LDI0IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKK3NwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbURldmljZVR5cGVBZGRyKAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlVHlwZUFkZHIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RGV2aWNlKGRldmljZVR5cGVBZGRyLm1UeXBlLCBTdHJpbmc4KGRldmljZVR5cGVBZGRyLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZVR5cGVBZGRyVmVjdG9yKSBjb25zdCB7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VUeXBlQWRkciA6IGRldmljZVR5cGVBZGRyVmVjdG9yKSB7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGdldERldmljZUZyb21EZXZpY2VUeXBlQWRkcihkZXZpY2VUeXBlQWRkcik7CisgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKwogdm9pZCBEZXZpY2VWZWN0b3I6OnJlcGxhY2VEZXZpY2VzQnlUeXBlKAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZVRvUmVtb3ZlLCBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNUb0FkZCkgewogICAgIERldmljZVZlY3RvciBkZXZpY2VzVG9SZW1vdmUgPSBnZXREZXZpY2VzRnJvbVR5cGUodHlwZVRvUmVtb3ZlKTsKQEAgLTQwOCw3ICs0MzIsNyBAQAogICAgIH0KIH0KIAotc3RkOjpzdHJpbmcgRGV2aWNlVmVjdG9yOjp0b1N0cmluZygpIGNvbnN0CitzdGQ6OnN0cmluZyBEZXZpY2VWZWN0b3I6OnRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8pIGNvbnN0CiB7CiAgICAgaWYgKGlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4geyJBVURJT19ERVZJQ0VfTk9ORSJ9OwpAQCAtNDE4LDcgKzQ0Miw3IEBACiAgICAgICAgIGlmIChkZXZpY2UgIT0gKmJlZ2luKCkpIHsKICAgICAgICAgICAgcmVzdWx0ICs9ICI7IjsKICAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZygpOworICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZyhpbmNsdWRlU2Vuc2l0aXZlSW5mbyk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQgKyAifSI7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCmluZGV4IDQxNTk2MmEuLjg0M2Y1ZGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCkBAIC0yMDIsNiArMjAyLDE5IEBACiAgICAgfQogfQogCithdWRpb19pb19oYW5kbGVfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0SW9Gb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKmVmZmVjdFR5cGUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3QgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoZWZmZWN0LT5tU2Vzc2lvbiA9PSBzZXNzaW9uSWQgJiYgKGVmZmVjdFR5cGUgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgICAgIG1lbWNtcCgmZWZmZWN0LT5tRGVzYy50eXBlLCBlZmZlY3RUeXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gZWZmZWN0LT5tSW87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworfQorCiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0c0ZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGlvKSBjb25zdAogewogICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVmZmVjdHM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAppbmRleCBiZjFhMGY3Li5hZTkyYjQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpJT1Byb2ZpbGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgpAQCAtMTEyLDEyICsxMTIsMTEgQEAKICAgICBkc3QtPmFwcGVuZChwb3J0U3RyLmNfc3RyKCkpOwogCiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIGZsYWdzOiAweCUwNHgiLCBnZXRGbGFncygpKTsKLSAgICBzdGQ6OnN0cmluZyBmbGFnc0xpdGVyYWw7Ci0gICAgaWYgKGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwotICAgIH0gZWxzZSBpZiAoZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKLSAgICAgICAgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGdldEZsYWdzKCksIGZsYWdzTGl0ZXJhbCk7Ci0gICAgfQorICAgIHN0ZDo6c3RyaW5nIGZsYWdzTGl0ZXJhbCA9CisgICAgICAgICAgICBnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgPworICAgICAgICAgICAgdG9TdHJpbmcoc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZ2V0RmxhZ3MoKSkpIDoKKyAgICAgICAgICAgIGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFID8KKyAgICAgICAgICAgIHRvU3RyaW5nKHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PihnZXRGbGFncygpKSkgOiAiIjsKICAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7CiAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgKCVzKSIsIGZsYWdzTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCmluZGV4IDg4M2U3MTMuLjBjYzNhNjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCkBAIC0yNTQsOSArMjU0LDggQEAKIGNvbnN0ZXhwciB2b2lkICgqeG1sRGVsZXRlcikoVCogdCk7CiB0ZW1wbGF0ZSA8PgogY29uc3RleHByIGF1dG8geG1sRGVsZXRlcjx4bWxEb2M+ID0geG1sRnJlZURvYzsKLS8vIGh0dHA6Ly9iLzExMTA2NzI3NyAtIEFkZCBiYWNrIGNvbnN0ZXhwciB3aGVuIHdlIHN3aXRjaCB0byBDKysxNy4KIHRlbXBsYXRlIDw+Ci1hdXRvIHhtbERlbGV0ZXI8eG1sQ2hhcj4gPSBbXSh4bWxDaGFyICpzKSB7IHhtbEZyZWUocyk7IH07Citjb25zdGV4cHIgYXV0byB4bWxEZWxldGVyPHhtbENoYXI+ID0gW10oeG1sQ2hhciAqcykgeyB4bWxGcmVlKHMpOyB9OwogCiAvKiogQHJldHVybiBhIHVuaXF1ZV9wdHIgd2l0aCB0aGUgY29ycmVjdCBkZWxldGVyIGZvciB0aGUgbGlieG1sMiBvYmplY3QuICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVD4KQEAgLTMzNyw3ICszMzYsNyBAQAogCiAgICAgc3RkOjpzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1vZGUpOwogICAgIGlmICghbW9kZS5lbXB0eSgpKSB7Ci0gICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG1vZGUpKTsKKyAgICAgICAgZ2Fpbi0+c2V0TW9kZShHYWluTW9kZUNvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobW9kZSwgIiAiKSk7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOwpAQCAtNTAxLDcgKzUwMCw3IEBACiAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBpZiAoIWRldmljZUZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CisgICAgaWYgKCFEZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpIHsKICAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19mdW5jX18sIHR5cGUpOwpAQCAtODA0LDcgKzgwMyw5IEBACiBzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShjb25zdCBjaGFyICpmaWxlTmFtZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKIHsKICAgICBQb2xpY3lTZXJpYWxpemVyIHNlcmlhbGl6ZXI7Ci0gICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZmlsZU5hbWUsIGNvbmZpZyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShmaWxlTmFtZSwgY29uZmlnKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSBjb25maWctPmNsZWFyKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2EyZHBfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMjNmNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQTJkcCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYTJkcCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgb3V0cHV0IiByb2xlPSJzb3VyY2UiLz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iYTJkcCBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgSGVhZHBob25lcyIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIFNwZWFrZXIiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgPC9kZXZpY2VQb3J0cz4KKyAgICA8cm91dGVzPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgSGVhZHBob25lcyIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgU3BlYWtlciIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImEyZHAgaW5wdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBBMkRQIEluIi8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2luX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWFkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEJsdWV0b290aCBJbnB1dCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYTJkcCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgPC9taXhQb3J0cz4KKyAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgSW4iIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iYTJkcCBpbnB1dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9IkJUIEEyRFAgSW4iLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggYjI4MzgxYi4uZGNkYzAzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgICAgICAgICAgPCEtLSBPdXRwdXQgZGV2aWNlcyBkZWNsYXJhdGlvbiwgaS5lLiBTaW5rIERFVklDRSBQT1JUIC0tPgogICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkVhcnBpZWNlIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFIiByb2xlPSJzaW5rIj4KICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiByb2xlPSJzaW5rIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIGFkZHJlc3M9IiI+CiAgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjODk1NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsMjExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPCEtLSB2ZXJzaW9uIHNlY3Rpb24gY29udGFpbnMgYSDigJx2ZXJzaW9u4oCdIHRhZyBpbiB0aGUgZm9ybSDigJxtYWpvci5taW5vcuKAnSBlLmcgdmVyc2lvbj3igJ0xLjDigJ0gLS0+CisKKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKworICAgIDwhLS0gTW9kdWxlcyBzZWN0aW9uOgorICAgICAgICBUaGVyZSBpcyBvbmUgc2VjdGlvbiBwZXIgYXVkaW8gSFcgbW9kdWxlIHByZXNlbnQgb24gdGhlIHBsYXRmb3JtLgorICAgICAgICBFYWNoIG1vZHVsZSBzZWN0aW9uIHdpbGwgY29udGFpbnMgdHdvIG1hbmRhdG9yeSB0YWdzIGZvciBhdWRpbyBIQUwg4oCcaGFsVmVyc2lvbuKAnSBhbmQg4oCcbmFtZeKAnS4KKyAgICAgICAgVGhlIG1vZHVsZSBuYW1lcyBhcmUgdGhlIHNhbWUgYXMgaW4gY3VycmVudCAuY29uZiBmaWxlOgorICAgICAgICAgICAgICAgIOKAnHByaW1hcnnigJ0sIOKAnEEyRFDigJ0sIOKAnHJlbW90ZV9zdWJtaXjigJ0sIOKAnFVTQuKAnQorICAgICAgICBFYWNoIG1vZHVsZSB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uczoKKyAgICAgICAg4oCcZGV2aWNlUG9ydHPigJ06IGEgbGlzdCBvZiBkZXZpY2UgZGVzY3JpcHRvcnMgZm9yIGFsbCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgYWNjZXNzaWJsZSB2aWEgdGhpcworICAgICAgICBtb2R1bGUuCisgICAgICAgIFRoaXMgY29udGFpbnMgYm90aCBwZXJtYW5lbnRseSBhdHRhY2hlZCBkZXZpY2VzIGFuZCByZW1vdmFibGUgZGV2aWNlcy4KKyAgICAgICAg4oCcbWl4UG9ydHPigJ06IGxpc3RpbmcgYWxsIG91dHB1dCBhbmQgaW5wdXQgc3RyZWFtcyBleHBvc2VkIGJ5IHRoZSBhdWRpbyBIQUwKKyAgICAgICAg4oCccm91dGVz4oCdOiBsaXN0IG9mIHBvc3NpYmxlIGNvbm5lY3Rpb25zIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIG9yIGJldHdlZW4gc3RyZWFtIGFuZAorICAgICAgICBkZXZpY2VzLgorICAgICAgICAgICAgInJvdXRlIjogaXMgZGVmaW5lZCBieSBhbiBhdHRyaWJ1dGU6CisgICAgICAgICAgICAgICAgLSJ0eXBlIjogPG11eHxtaXg+IG1lYW5zIGFsbCBzb3VyY2VzIGFyZSBtdXR1YWwgZXhjbHVzaXZlIChtdXgpIG9yIGNhbiBiZSBtaXhlZCAobWl4KQorICAgICAgICAgICAgICAgIC0ic2luayI6IHRoZSBzaW5rIGludm9sdmVkIGluIHRoaXMgcm91dGUKKyAgICAgICAgICAgICAgICAtInNvdXJjZXMiOiBhbGwgdGhlIHNvdXJjZXMgdGhhbiBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBzaW5rIHZpYSB2aXMgcm91dGUKKyAgICAgICAg4oCcYXR0YWNoZWREZXZpY2Vz4oCdOiBwZXJtYW5lbnRseSBhdHRhY2hlZCBkZXZpY2VzLgorICAgICAgICBUaGUgYXR0YWNoZWREZXZpY2VzIHNlY3Rpb24gaXMgYSBsaXN0IG9mIGRldmljZXMgbmFtZXMuIFRoZSBuYW1lcyBjb3JyZXNwb25kIHRvIGRldmljZSBuYW1lcworICAgICAgICBkZWZpbmVkIGluIDxkZXZpY2VQb3J0cz4gc2VjdGlvbi4KKyAgICAgICAg4oCcZGVmYXVsdE91dHB1dERldmljZeKAnTogZGV2aWNlIHRvIGJlIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5vIHBvbGljeSBydWxlIGFwcGxpZXMKKyAgICAtLT4KKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIzLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICAgICAgICAgIDxpdGVtPkJ1aWx0LUluIE1pYzwvaXRlbT4KKyAgICAgICAgICAgICAgICA8aXRlbT5CdWlsdC1JbiBCYWNrIE1pYzwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9ImRlZXBfYnVmZmVyIiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJjb21wcmVzc2VkX29mZmxvYWQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9NUDMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQUMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQUNfTEMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0idm9pY2VfdHgiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJ2b2ljZV9yeCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICAgPGRldmljZVBvcnRzPgorICAgICAgICAgICAgICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVjbGFyYXRpb24sIGkuZS4gU2luayBERVZJQ0UgUE9SVCAtLT4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJFYXJwaWVjZSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgcm9sZT0ic2luayIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiBhZGRyZXNzPSIiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgICAgICA8Z2FpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z2FpbiBuYW1lPSJnYWluXzEiIG1vZGU9IkFVRElPX0dBSU5fTU9ERV9KT0lOVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblZhbHVlTUI9Ii04NDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVNQj0iNDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZU1CPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFZhbHVlTUI9IjEwMCIvPgorICAgICAgICAgICAgICAgICAgICA8L2dhaW5zPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJXaXJlZCBIZWFkc2V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJXaXJlZCBIZWFkcGhvbmVzIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIFNDTyIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIEhlYWRzZXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIENhciBLaXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJUZWxlcGhvbnkgVHgiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisKKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDExMDI1IDEyMDAwIDE2MDAwIDIyMDUwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQnVpbHQtSW4gQmFjayBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CQUNLX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDExMDI1IDEyMDAwIDE2MDAwIDIyMDUwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iV2lyZWQgSGVhZHNldCBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08gSGVhZHNldCBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iVGVsZXBob255IFJ4IiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgPC9kZXZpY2VQb3J0cz4KKyAgICAgICAgICAgIDwhLS0gcm91dGUgZGVjbGFyYXRpb24sIGkuZS4gbGlzdCBhbGwgYXZhaWxhYmxlIHNvdXJjZXMgZm9yIGEgZ2l2ZW4gc2luayAtLT4KKyAgICAgICAgICAgIDxyb3V0ZXM+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iRWFycGllY2UiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0LGRlZXBfYnVmZmVyLEJUIFNDTyBIZWFkc2V0IE1pYyIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0LGRlZXBfYnVmZmVyLGNvbXByZXNzZWRfb2ZmbG9hZCxCVCBTQ08gSGVhZHNldCBNaWMsVGVsZXBob255IFJ4Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iV2lyZWQgSGVhZHNldCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGVlcF9idWZmZXIsY29tcHJlc3NlZF9vZmZsb2FkLEJUIFNDTyBIZWFkc2V0IE1pYyxUZWxlcGhvbnkgUngiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJXaXJlZCBIZWFkcGhvbmVzIgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCxkZWVwX2J1ZmZlcixjb21wcmVzc2VkX29mZmxvYWQsQlQgU0NPIEhlYWRzZXQgTWljLFRlbGVwaG9ueSBSeCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxCdWlsdC1JbiBCYWNrIE1pYyxXaXJlZCBIZWFkc2V0IE1pYyxCVCBTQ08gSGVhZHNldCBNaWMiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJUZWxlcGhvbnkgVHgiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxCdWlsdC1JbiBCYWNrIE1pYyxXaXJlZCBIZWFkc2V0IE1pYyxCVCBTQ08gSGVhZHNldCBNaWMsIHZvaWNlX3R4Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0idm9pY2VfcngiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IlRlbGVwaG9ueSBSeCIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisKKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPCEtLSBBMmRwIElucHV0IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIi8+CisKKyAgICAgICAgPCEtLSBVc2IgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJ1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBCbHVldG9vdGggQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCIvPgorCisgICAgICAgIDwhLS0gTVNEIEF1ZGlvIEhBTCAob3B0aW9uYWwpIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJtc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCIvPgorCisgICAgPC9tb2R1bGVzPgorICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KKworICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZmZTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEJsdWV0b290aCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYmx1ZXRvb3RoIiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJhMmRwIG91dHB1dCIgcm9sZT0ic291cmNlIi8+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJoZWFyaW5nIGFpZCBvdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIyNDAwMCAxNjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCA4ODIwMCA5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBIZWFkcGhvbmVzIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAgODgyMDAgOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIDg4MjAwIDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8IS0tIEhlYXJpbmcgQUlEcyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgSGVhcmluZyBBaWQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEIiByb2xlPSJzaW5rIi8+CisgICAgPC9kZXZpY2VQb3J0cz4KKyAgICA8cm91dGVzPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgSGVhZHBob25lcyIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgU3BlYWtlciIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEhlYXJpbmcgQWlkIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImhlYXJpbmcgYWlkIG91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvaGVhcmluZ19haWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9oZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMzY0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvaGVhcmluZ19haWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBIZWFyaW5nIGFpZCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iaGVhcmluZ19haWQiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJoZWFyaW5nIGFpZCBvdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIyNDAwMCAxNjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgSGVhcmluZyBBaWQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEIiByb2xlPSJzaW5rIi8+CisgICAgPC9kZXZpY2VQb3J0cz4KKyAgICA8cm91dGVzPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHNvdXJjZXM9ImhlYXJpbmcgYWlkIG91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2N2YwYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9tc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTctMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIE11bHRpIFN0cmVhbSBEZWNvZGVyIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9Im1zZCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICA8aXRlbT5NUzEyIElucHV0PC9pdGVtPgorICAgICAgICA8aXRlbT5NUzEyIE91dHB1dDwvaXRlbT4KKyAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgaW5wdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGNvbXByZXNzZWQgaW5wdXQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzX0pPQyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDwhLS0gVGhlIEhXIEFWIFN5bmMgZmxhZyBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpcyByZWNvbW1lbmRlZCAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBvdXRwdXQiIHJvbGU9InNpbmsiIGZsYWdzPSJBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgIDwvbWl4UG9ydHM+CisgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBJbnB1dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CVVMiICByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzX0pPQyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJNUzEyIE91dHB1dCIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVUyIgIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iTVMxMiBJbnB1dCIgc291cmNlcz0ibXMxMiBpbnB1dCxtczEyIGNvbXByZXNzZWQgaW5wdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0ibXMxMiBvdXRwdXQiIHNvdXJjZXM9Ik1TMTIgT3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTU2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIERlZmF1bHQgUHJpbWFyeSBBdWRpbyBIQUwgTW9kdWxlIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGluY2x1ZGUgZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0icHJpbWFyeSIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICA8aXRlbT5CdWlsdC1JbiBNaWM8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgb3V0cHV0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgPC9taXhQb3J0cz4KKyAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiByb2xlPSJzaW5rIj4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorCisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJ1aWx0LUluIE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDIiByb2xlPSJzb3VyY2UiPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgPC9kZXZpY2VQb3J0cz4KKyAgICA8cm91dGVzPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJTcGVha2VyIgorICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3ZjMzOWRjLi4zZTQyZTJkCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaApAQCAtOTMsMTMgKzkzLDEzIEBACiAKICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIG92ZXJyaWRlOwogCi0gICAgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlKSBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgZW5naW5lQ29uZmlnOjpQYXJzaW5nUmVzdWx0IGxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOwogCkBAIC0xMjcsMTEgKzEyNyw1MiBAQAogCiAgICAgc3RhdHVzX3QgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIAorICAgIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGRldmljZXMgcm9sZSBmb3IgY2FwdHVyZSBwcmVzZXQuIFdoZW4gYGZvcmNlTWF0Y2hlZGAgaXMgdHJ1ZSwgdGhlIGRldmljZXMgdG8gYmUKKyAgICAgKiByZW1vdmVkIG11c3QgYWxsIHNob3cgYXMgcm9sZSBmb3IgdGhlIGNhcHR1cmUgcHJlc2V0LiBPdGhlcndpc2UsIG9ubHkgZGV2aWNlcyB0aGF0IGhhcyBzaG93bgorICAgICAqIGFzIHJvbGUgZm9yIHRoZSBjYXB0dXJlIHByZXNldCB3aWxsIGJlIHJlbW92ZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBkb1JlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgIGJvb2wgZm9yY2VNYXRjaGVkPXRydWUpOworCisgICAgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0QWN0aXZlTWVkaWFEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlRGV2aWNlcykgY29uc3Qgb3ZlcnJpZGU7CisKIHByaXZhdGU6CisgICAgLyoqCisgICAgICogR2V0IG1lZGlhIGRldmljZXMgYXMgdGhlIGdpdmVuIHJvbGUKKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIHRoZSBhdWRpbyBkZXZpY2VzIHJvbGUKKyAgICAgKiBAcGFyYW0gYXZhaWxhYmxlRGV2aWNlcyBhbGwgYXZhaWxhYmxlIGRldmljZXMKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0aGUgRGV2aWNlVmVjdG9yIHRvIHN0b3JlIGRldmljZXMgYXMgdGhlIGdpdmVuIHJvbGUKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGFsbCBkZXZpY2VzIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIHByZXNlbnQgaW4gYXZhaWxhYmxlIGRldmljZXMKKyAgICAgKiAgICAgICAgIE5BTUVfTk9fRk9VTkQgaWYgdGhlcmUgaXMgbm8gc3RyYXRlZ3kgZm9yIG1lZGlhIG9yIHRoZXJlIGFyZSBubyBkZXZpY2VzIGFzc29jaWF0ZSB0bworICAgICAqICAgICAgICAgdGhlIGdpdmVuIHJvbGUKKyAgICAgKiAgICAgICAgIE5PVF9FTk9VR0hfREFUQSBpZiBub3QgYWxsIGRldmljZXMgYXMgZ2l2ZW4gcm9sZSBhcmUgcHJlc2VudCBpbiBhdmFpbGFibGUgZGV2aWNlcworICAgICAqLworICAgIHN0YXR1c190IGdldE1lZGlhRGV2aWNlc0ZvclJvbGUoZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMsCisgICAgICAgICAgICBEZXZpY2VWZWN0b3ImIGRldmljZXMpIGNvbnN0OworCiAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlciA9IG51bGxwdHI7CiAKICAgICBQcm9kdWN0U3RyYXRlZ3lNYXAgbVByb2R1Y3RTdHJhdGVnaWVzOwogICAgIFByb2R1Y3RTdHJhdGVneVByZWZlcnJlZFJvdXRpbmdNYXAgbVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXM7CisgICAgQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGU7CiAgICAgVm9sdW1lR3JvdXBNYXAgbVZvbHVtZUdyb3VwczsKICAgICBMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzIG1MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzOwogICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZSA9IEFVRElPX01PREVfTk9STUFMOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBhMzA1M2E0Li5kN2Y4YjFlCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaApAQCAtMzYsNiArMzYsOCBAQAogICAgIHZvaWQgc2V0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKHNwPERldmljZURlc2NyaXB0b3I+IGRlc2MsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7CiAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKAogICAgICAgICAgICAgZGV2aWNlX291dF9ncm91cF90IGdyb3VwID0gR1JPVVBfTk9ORSkgY29uc3Q7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlKAorICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBleGNsdWRlZERldmljZXMsIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCA9IEdST1VQX05PTkUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHN0cnVjdCBEZXZpY2VHcm91cERlc2NyaXB0b3IgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oCmluZGV4IDNlYmU3ZDEuLmM1MDU0NTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTI4LDggKzI4LDExIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8qKgpAQCAtMTY0LDcgKzE2Nyw4IEBACiAgICAgcHJvZHVjdF9zdHJhdGVneV90IG1EZWZhdWx0U3RyYXRlZ3kgPSBQUk9EVUNUX1NUUkFURUdZX05PTkU7CiB9OwogCi1jbGFzcyBQcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWRSb3V0aW5nTWFwIDogcHVibGljIHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgQXVkaW9EZXZpY2VUeXBlQWRkcj4KK2NsYXNzIFByb2R1Y3RTdHJhdGVneVByZWZlcnJlZFJvdXRpbmdNYXAgOiBwdWJsaWMgc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPgogewogcHVibGljOgogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKaW5kZXggMWJjN2ZlMy4uMjEzN2RkMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKQEAgLTMzOSw4ICszMzksOCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRW5naW5lQmFzZTo6c2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQorc3RhdHVzX3QgRW5naW5lQmFzZTo6c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCiB7CiAgICAgLy8gdmVyaWZ5IHN0cmF0ZWd5IGV4aXN0cwogICAgIGlmIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgPT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7CkBAIC0zNDgsMTEgKzM0OCwyNCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzW3N0cmF0ZWd5XSA9IGRldmljZTsKKyAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICBjYXNlIERFVklDRV9ST0xFX1BSRUZFUlJFRDoKKyAgICAgICAgbVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXNbc3RyYXRlZ3ldID0gZGV2aWNlczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9ESVNBQkxFRDoKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzZXQgZGV2aWNlcyByb2xlIGFzIGRpc2FibGVkIGZvciBzdHJhdGVneS4KKyAgICAgICAgQUxPR0koIiVzIG5vIGltcGxlbWVudGVkIGZvciByb2xlIGFzICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX05PTkU6CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgZmFsbC10aHJvdWdoIGFzIGl0IGlzIG5vIG5lZWQgdG8gc2V0IGRldmljZSByb2xlIGFzIG5vbmUgZm9yIGEgc3RyYXRlZ3kuCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcm9sZSAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFbmdpbmVCYXNlOjpyZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpyZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlKQogewogICAgIC8vIHZlcmlmeSBzdHJhdGVneSBleGlzdHMKICAgICBpZiAobVByb2R1Y3RTdHJhdGVnaWVzLmZpbmQoc3RyYXRlZ3kpID09IG1Qcm9kdWN0U3RyYXRlZ2llcy5lbmQoKSkgewpAQCAtMzYwLDMyICszNzMsMjYwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzLmVyYXNlKHN0cmF0ZWd5KSA9PSAwKSB7Ci0gICAgICAgIC8vIG5vIHByZWZlcnJlZCBkZXZpY2Ugd2FzIHNldAotICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9QUkVGRVJSRUQ6CisgICAgICAgIGlmIChtUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkRGV2aWNlcy5lcmFzZShzdHJhdGVneSkgPT0gMCkgeworICAgICAgICAgICAgLy8gbm8gcHJlZmVycmVkIGRldmljZSB3YXMgc2V0CisgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9ESVNBQkxFRDoKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCByZW1vdmUgZGV2aWNlcyByb2xlIGFzIGRpc2FibGVkIGZvciBzdHJhdGVneS4KKyAgICAgICAgQUxPR0koIiVzIG5vIGltcGxlbWVudGVkIGZvciByb2xlIGFzICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX05PTkU6CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgZmFsbC10aHJvdWdoIGFzIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlbW92ZSBkZXZpY2VzIHdpdGgKKyAgICAgICAgLy8gcm9sZSBhcyBERVZJQ0VfUk9MRV9OT05FIGZvciBhIHN0cmF0ZWd5CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcm9sZSAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFbmdpbmVCYXNlOjpnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpIGNvbnN0CitzdGF0dXNfdCBFbmdpbmVCYXNlOjpnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3QKIHsKICAgICAvLyB2ZXJpZnkgc3RyYXRlZ3kgZXhpc3RzCiAgICAgaWYgKG1Qcm9kdWN0U3RyYXRlZ2llcy5maW5kKHN0cmF0ZWd5KSA9PSBtUHJvZHVjdFN0cmF0ZWdpZXMuZW5kKCkpIHsKICAgICAgICAgQUxPR0UoIiVzIHVua25vd24gc3RyYXRlZ3kgJXUiLCBfX2Z1bmNfXywgc3RyYXRlZ3kpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICAvLyBwcmVmZXJyZWQgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5PwotICAgIGF1dG8gZGV2SXQgPSBtUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkRGV2aWNlcy5maW5kKHN0cmF0ZWd5KTsKLSAgICBpZiAoZGV2SXQgPT0gbVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXMuZW5kKCkpIHsKLSAgICAgICAgQUxPR1YoIiVzIG5vIHByZWZlcnJlZCBkZXZpY2UgZm9yIHN0cmF0ZWd5ICV1IiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKLSAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9QUkVGRVJSRUQ6IHsKKyAgICAgICAgLy8gcHJlZmVycmVkIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneT8KKyAgICAgICAgYXV0byBkZXZJdCA9IG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzLmZpbmQoc3RyYXRlZ3kpOworICAgICAgICBpZiAoZGV2SXQgPT0gbVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBubyBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSAldSIsIF9fZnVuY19fLCBzdHJhdGVneSk7CisgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIH0KKworICAgICAgICBkZXZpY2VzID0gZGV2SXQtPnNlY29uZDsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfTk9ORToKKyAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsLXRocm91Z2ggYXMgdGhlIERFVklDRV9ST0xFX05PTkUgaXMgbmV2ZXIgc2V0CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcm9sZSAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKK3sKKyAgICAvLyB2ZXJpZnkgaWYgdGhlIGF1ZGlvIHNvdXJjZSBpcyB2YWxpZAorICAgIGlmICghYXVkaW9faXNfdmFsaWRfYXVkaW9fc291cmNlKGF1ZGlvU291cmNlKSkgeworICAgICAgICBBTE9HRSgiJXMgdW5rbm93biBhdWRpbyBzb3VyY2UgJXUiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UpOwogICAgIH0KIAotICAgIGRldmljZSA9IGRldkl0LT5zZWNvbmQ7CisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9QUkVGRVJSRUQ6CisgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdW3JvbGVdID0gZGV2aWNlczsKKyAgICAgICAgLy8gV2hlbiB0aGUgZGV2aWNlcyBhcmUgc2V0IGFzIHByZWZlcnJlZCBkZXZpY2VzLCByZW1vdmUgdGhlbSBmcm9tIHRoZSBkaXNhYmxlZCBkZXZpY2VzLgorICAgICAgICBkb1JlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZSwgREVWSUNFX1JPTEVfRElTQUJMRUQsIGRldmljZXMsIGZhbHNlIC8qZm9yY2VNYXRjaGVkKi8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX0RJU0FCTEVEOgorICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IHNldHRpbmcgZGV2aWNlcyByb2xlIGFzIGRpc2FibGVkIGZvciBjYXB0dXJlIHByZXNldC4KKyAgICAgICAgQUxPR0koIiVzIG5vIGltcGxlbWVudGVkIGZvciByb2xlIGFzICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX05PTkU6CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgZmFsbC10aHJvdWdoIGFzIGl0IGlzIG5vIG5lZWQgdG8gc2V0IGRldmljZSByb2xlIGFzIG5vbmUKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCByb2xlICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEVuZ2luZUJhc2U6OmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIC8vIHZlcmlmeSBpZiB0aGUgYXVkaW8gc291cmNlIGlzIHZhbGlkCisgICAgaWYgKCFhdWRpb19pc192YWxpZF9hdWRpb19zb3VyY2UoYXVkaW9Tb3VyY2UpKSB7CisgICAgICAgIEFMT0dFKCIlcyB1bmtub3duIGF1ZGlvIHNvdXJjZSAldSIsIF9fZnVuY19fLCBhdWRpb1NvdXJjZSk7CisgICAgfQorCisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9QUkVGRVJSRUQ6CisgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdW3JvbGVdID0gZXhjbHVkZURldmljZVR5cGVBZGRyc0Zyb20oCisgICAgICAgICAgICAgICAgbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZVthdWRpb1NvdXJjZV1bcm9sZV0sIGRldmljZXMpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdW3JvbGVdLnB1c2hfYmFjayhkZXZpY2UpOworICAgICAgICB9CisgICAgICAgIC8vIFdoZW4gdGhlIGRldmljZXMgYXJlIHNldCBhcyBwcmVmZXJyZWQgZGV2aWNlcywgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZGlzYWJsZWQgZGV2aWNlcy4KKyAgICAgICAgZG9SZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2UsIERFVklDRV9ST0xFX0RJU0FCTEVELCBkZXZpY2VzLCBmYWxzZSAvKmZvcmNlTWF0Y2hlZCovKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9ESVNBQkxFRDoKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzZXR0aW5nIGRldmljZXMgcm9sZSBhcyBkaXNhYmxlZCBmb3IgY2FwdHVyZSBwcmVzZXQuCisgICAgICAgIEFMT0dJKCIlcyBubyBpbXBsZW1lbnRlZCBmb3Igcm9sZSBhcyAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9OT05FOgorICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwtdGhyb3VnaCBhcyBpdCBpcyBubyBuZWVkIHRvIHNldCBkZXZpY2Ugcm9sZSBhcyBub25lCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcm9sZSAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpyZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIHsKKyAgICByZXR1cm4gZG9SZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpkb1JlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLCBib29sIGZvcmNlTWF0Y2hlZCkKK3sKKyAgICAvLyB2ZXJpZnkgaWYgdGhlIGF1ZGlvIHNvdXJjZSBpcyB2YWxpZAorICAgIGlmICghYXVkaW9faXNfdmFsaWRfYXVkaW9fc291cmNlKGF1ZGlvU291cmNlKSkgeworICAgICAgICBBTE9HRSgiJXMgdW5rbm93biBhdWRpbyBzb3VyY2UgJXUiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UpOworICAgIH0KKworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgREVWSUNFX1JPTEVfUFJFRkVSUkVEOgorICAgIGNhc2UgREVWSUNFX1JPTEVfRElTQUJMRUQ6IHsKKyAgICAgICAgaWYgKG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGUuY291bnQoYXVkaW9Tb3VyY2UpID09IDAgfHwKKyAgICAgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlW2F1ZGlvU291cmNlXS5jb3VudChyb2xlKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciByZW1haW5pbmdEZXZpY2VzID0gZXhjbHVkZURldmljZVR5cGVBZGRyc0Zyb20oCisgICAgICAgICAgICAgICAgbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZVthdWRpb1NvdXJjZV1bcm9sZV0sIGRldmljZXMpOworICAgICAgICBpZiAoZm9yY2VNYXRjaGVkICYmIHJlbWFpbmluZ0RldmljZXMuc2l6ZSgpICE9CisgICAgICAgICAgICAgICAgbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZVthdWRpb1NvdXJjZV1bcm9sZV0uc2l6ZSgpIC0gZGV2aWNlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIGRldmljZXMgZnJvbSBgZGV2aWNlc1RvUmVtb3ZlYCB0aGF0IGFyZSBub3Qgc2hvd24gaW4gdGhlIGNhY2hlZCByZWNvcmQKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZVthdWRpb1NvdXJjZV1bcm9sZV0gPSByZW1haW5pbmdEZXZpY2VzOworICAgICAgICBpZiAobUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZVthdWRpb1NvdXJjZV1bcm9sZV0uZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByb2xlIHdoZW4gZGV2aWNlIGxpc3QgaXMgZW1wdHkKKyAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdLmVyYXNlKHJvbGUpOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX05PTkU6CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgZmFsbC10aHJvdWdoIGFzIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlbW92ZSBkZXZpY2VzIHdpdGgKKyAgICAgICAgLy8gcm9sZSBhcyBERVZJQ0VfUk9MRV9OT05FCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcm9sZSAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkKK3sKKyAgICAvLyB2ZXJpZnkgaWYgdGhlIGF1ZGlvIHNvdXJjZSBpcyB2YWxpZAorICAgIGlmICghYXVkaW9faXNfdmFsaWRfYXVkaW9fc291cmNlKGF1ZGlvU291cmNlKSkgeworICAgICAgICBBTE9HRSgiJXMgdW5rbm93biBhdWRpbyBzb3VyY2UgJXUiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UpOworICAgIH0KKworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgREVWSUNFX1JPTEVfUFJFRkVSUkVEOgorICAgICAgICBpZiAobUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZS5jb3VudChhdWRpb1NvdXJjZSkgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdLmVyYXNlKHJvbGUpID09IDApIHsKKyAgICAgICAgICAgIC8vIG5vIHByZWZlcnJlZCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBhdWRpbyBzb3VyY2UKKyAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX0RJU0FCTEVEOgorICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IHJlbW92ZSBkZXZpY2VzIHJvbGUgYXMgZGlzYWJsZWQgZm9yIHN0cmF0ZWd5LgorICAgICAgICBBTE9HSSgiJXMgbm8gaW1wbGVtZW50ZWQgZm9yIHJvbGUgYXMgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfTk9ORToKKyAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsLXRocm91Z2ggYXMgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmVtb3ZlIGRldmljZXMgd2l0aAorICAgICAgICAvLyByb2xlIGFzIERFVklDRV9ST0xFX05PTkUgZm9yIGEgc3RyYXRlZ3kKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCByb2xlICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIC8vIHZlcmlmeSBpZiB0aGUgYXVkaW8gc291cmNlIGlzIHZhbGlkCisgICAgaWYgKCFhdWRpb19pc192YWxpZF9hdWRpb19zb3VyY2UoYXVkaW9Tb3VyY2UpKSB7CisgICAgICAgIEFMT0dFKCIlcyB1bmtub3duIGF1ZGlvIHNvdXJjZSAldSIsIF9fZnVuY19fLCBhdWRpb1NvdXJjZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9QUkVGRVJSRUQ6CisgICAgY2FzZSBERVZJQ0VfUk9MRV9ESVNBQkxFRDogeworICAgICAgICBpZiAobUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZS5jb3VudChhdWRpb1NvdXJjZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGF1dG8gZGV2SXQgPSBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlLmF0KGF1ZGlvU291cmNlKS5maW5kKHJvbGUpOworICAgICAgICBpZiAoZGV2SXQgPT0gbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZS5hdChhdWRpb1NvdXJjZSkuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBubyBkZXZpY2VzIHJvbGUoJWQpIGZvciBjYXB0dXJlIHByZXNldCAldSIsIF9fZnVuY19fLCByb2xlLCBhdWRpb1NvdXJjZSk7CisgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIH0KKworICAgICAgICBkZXZpY2VzID0gZGV2SXQtPnNlY29uZDsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfTk9ORToKKyAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsLXRocm91Z2ggYXMgdGhlIERFVklDRV9ST0xFX05PTkUgaXMgbmV2ZXIgc2V0CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcm9sZSAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpnZXRNZWRpYURldmljZXNGb3JSb2xlKGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVEZXZpY2VzLCBEZXZpY2VWZWN0b3ImIGRldmljZXMpIGNvbnN0Cit7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKCJTVFJBVEVHWV9NRURJQSIgLypuYW1lKi8pOworICAgIGlmIChzdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpIHsKKyAgICAgICAgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICB9CisgICAgaWYgKHN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlQWRkclZlYzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlLCBkZXZpY2VBZGRyVmVjKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGRldmljZXMgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMoZGV2aWNlQWRkclZlYyk7CisgICAgcmV0dXJuIGRldmljZUFkZHJWZWMuc2l6ZSgpID09IGRldmljZXMuc2l6ZSgpID8gTk9fRVJST1IgOiBOT1RfRU5PVUdIX0RBVEE7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmVCYXNlOjpnZXRBY3RpdmVNZWRpYURldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVEZXZpY2VzKSBjb25zdAoreworICAgIC8vIFRoZSBwcmlvcml0eSBvZiBhY3RpdmUgZGV2aWNlcyBhcyBmb2xsb3dzOgorICAgIC8vIDE6IHRoZSBhdmFpbGFibGUgcHJlZmVycmVkIGRldmljZXMgZm9yIG1lZGlhCisgICAgLy8gMjogdGhlIGxhdGVzdCBjb25uZWN0ZWQgcmVtb3ZhYmxlIG1lZGlhIGRldmljZSB0aGF0IGlzIGVuYWJsZWQKKyAgICBEZXZpY2VWZWN0b3IgYWN0aXZlRGV2aWNlczsKKyAgICBpZiAoZ2V0TWVkaWFEZXZpY2VzRm9yUm9sZSgKKyAgICAgICAgICAgIERFVklDRV9ST0xFX1BSRUZFUlJFRCwgYXZhaWxhYmxlRGV2aWNlcywgYWN0aXZlRGV2aWNlcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgYWN0aXZlRGV2aWNlcy5jbGVhcigpOworICAgICAgICBEZXZpY2VWZWN0b3IgZGlzYWJsZWREZXZpY2VzOworICAgICAgICBnZXRNZWRpYURldmljZXNGb3JSb2xlKERFVklDRV9ST0xFX0RJU0FCTEVELCBhdmFpbGFibGVEZXZpY2VzLCBkaXNhYmxlZERldmljZXMpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgICAgIG1MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmdldExhc3RSZW1vdmFibGVNZWRpYURldmljZShkaXNhYmxlZERldmljZXMpOworICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGFjdGl2ZURldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZURldmljZXM7Cit9CisKIHZvaWQgRW5naW5lQmFzZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7CiAgICAgbVByb2R1Y3RTdHJhdGVnaWVzLmR1bXAoZHN0LCAyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaAppbmRleCA5ODE1ODJlLi5kMzllZmY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCkBAIC0yNiw4ICsyNiw4IEBACiAgICAgeyJTVFJBVEVHWV9QSE9ORSIsCiAgICAgIHsKICAgICAgICAgIHsicGhvbmUiLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgIkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiwKLSAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwKLSAgICAgICAgICAgICIifX0sCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifX0sCiAgICAgICAgICB9LAogICAgICAgICAgeyJzY28iLCBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTywgIkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiwKICAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19TQ08sCkBAIC0zOSwxMCArMzksMTEgQEAKICAgICAgewogICAgICAgICAgeyJyaW5nIiwgQVVESU9fU1RSRUFNX1JJTkcsICJBVURJT19TVFJFQU1fUklORyIsCiAgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSwKLSAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn19CiAgICAgICAgICB9LAogICAgICAgICAgeyJhbGFybSIsIEFVRElPX1NUUkVBTV9BTEFSTSwgIkFVRElPX1NUUkVBTV9BTEFSTSIsCi0gICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQUxBUk0sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19LAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FMQVJNLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9fSwKICAgICAgICAgIH0KICAgICAgfSwKICAgICB9LApAQCAtNTgsNyArNTksNyBAQAogICAgICB7CiAgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCAiQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiLAogICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKLSAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn19CiAgICAgICAgICB9CiAgICAgIH0sCiAgICAgfSwKQEAgLTY2LDE1ICs2NywxNiBAQAogICAgICB7CiAgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sICJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiwKICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAotICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAotICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAotICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0KICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0sCkBAIC04MywyMSArODUsMjUgQEAKICAgICAgewogICAgICAgICAgeyJhc3Npc3RhbnQiLCBBVURJT19TVFJFQU1fQVNTSVNUQU5ULCAiQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIsCiAgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfU1BFRUNILCBBVURJT19VU0FHRV9BU1NJU1RBTlQsCi0gICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9fQogICAgICAgICAgfSwKICAgICAgICAgIHsibXVzaWMiLCBBVURJT19TVFJFQU1fTVVTSUMsICJBVURJT19TVFJFQU1fTVVTSUMiLAogICAgICAgICAgIHsKLSAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9NRURJQSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKLSAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9HQU1FLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9NRURJQSwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9HQU1FLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9CiAgICAgICAgICAgfSwKICAgICAgICAgIH0sCiAgICAgICAgICB7InN5c3RlbSIsIEFVRElPX1NUUkVBTV9TWVNURU0sICJBVURJT19TVFJFQU1fU1lTVEVNIiwKICAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiwKLSAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn19CiAgICAgICAgICB9CiAgICAgIH0sCiAgICAgfSwKQEAgLTEwNiw3ICsxMTIsNyBAQAogICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fRFRNRiwgIkFVRElPX1NUUkVBTV9EVE1GIiwKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAotICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9CiAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9LApAQCAtMTE0LDcgKzEyMCw4IEBACiAgICAgeyJTVFJBVEVHWV9DQUxMX0FTU0lTVEFOVCIsCiAgICAgIHsKICAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0NBTExfQVNTSVNUQU5ULCAiQVVESU9fU1RSRUFNX0NBTExfQVNTSVNUQU5UIiwKLSAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVCwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVCwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9LApAQCAtMTM2LDE0ICsxNDMsMTYgQEAKICAgICB7InJlcm91dGluZyIsCiAgICAgIHsKICAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1JFUk9VVElORywgIkFVRElPX1NUUkVBTV9SRVJPVVRJTkciLAotICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UsIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn19CiAgICAgICAgICB9CiAgICAgIH0sCiAgICAgfSwKICAgICB7InBhdGNoIiwKICAgICAgewogICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fUEFUQ0gsICJBVURJT19TVFJFQU1fUEFUQ0giLAotICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggODdiNmFhZi4uYjNmODk0NwotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcApAQCAtNTUsNiArNTUsMTcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzOjpnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2UoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZXhjbHVkZWREZXZpY2VzLCBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXApIGNvbnN0IHsKKyAgICBmb3IgKGF1dG8gaXRlciA9IG1NZWRpYURldmljZXMuYmVnaW4oKTsgaXRlciAhPSBtTWVkaWFEZXZpY2VzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgaWYgKChncm91cCA9PSBHUk9VUF9OT05FIHx8IGdyb3VwID09IGdldERldmljZU91dEdyb3VwKChpdGVyLT5kZXNjKS0+dHlwZSgpKSkgJiYKKyAgICAgICAgICAgICAgICAhZXhjbHVkZWREZXZpY2VzLmNvbnRhaW5zKGl0ZXItPmRlc2MpKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+ZGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwogZGV2aWNlX291dF9ncm91cF90IExhc3RSZW1vdmFibGVNZWRpYURldmljZXM6OmdldERldmljZU91dEdyb3VwKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0CiB7CiAgICAgc3dpdGNoIChkZXZpY2UpIHsKQEAgLTY5LDYgKzgwLDExIEBACiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgorICAgIC8vIFRPRE8gKGIvMTIyOTMxMjYxKTogcmVtb3ZlIHdoZW4gcHJlZmVycmVkIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YKKyAgICAvLyAgQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFAuCisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVDoKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVI6CiAgICAgICAgIHJldHVybiBHUk9VUF9CVF9BMkRQOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBHUk9VUF9OT05FOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKaW5kZXggMTUxYzdiYi4uMDYwNTY4YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0zMjEsMTAgKzMyMSwxMSBAQAogdm9pZCBQcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWRSb3V0aW5nTWFwOjpkdW1wKGFuZHJvaWQ6OlN0cmluZzgqIGRzdCwgaW50IHNwYWNlcykgY29uc3QgewogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1ByZWZlcnJlZCBkZXZpY2VzIHBlciBwcm9kdWN0IHN0cmF0ZWd5IGR1bXA6Iiwgc3BhY2VzLCAiIik7CiAgICAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogKnRoaXMpIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzU3RyYXRlZ3kgJXUgZGV2OiUwOHggYWRkcjolcyIsCisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1N0cmF0ZWd5ICV1ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzICsgMiwgIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkgaXRlci5maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5zZWNvbmQubVR5cGUsIGl0ZXIuc2Vjb25kLm1BZGRyZXNzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihpdGVyLnNlY29uZCwgdHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwogICAgIH0KICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4iKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcAppbmRleCBjMzUyNTc4Li44YWE0YjA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwCkBAIC00MywxMCArNDMsMjQgQEAKICAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNYXg7CiAgICAgfQogCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgdm9sdW1lIGluZGV4CiAgICAgc2l6ZV90IG5iQ3VydmVQb2ludHMgPSBtQ3VydmVQb2ludHMuc2l6ZSgpOwotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0KLSAgICBpbnQgbmJTdGVwcyA9IDEgKyBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1JbmRleCAtIG1DdXJ2ZVBvaW50c1swXS5tSW5kZXg7Ci0gICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIHZvbEluZGV4TWluKSkgLyAodm9sSW5kZXhNYXggLSB2b2xJbmRleE1pbik7CisKKyAgICBpbnQgdm9sSWR4OworICAgIGlmICh2b2xJbmRleE1pbiA9PSB2b2xJbmRleE1heCkgeworICAgICAgICBpZiAoaW5kZXhJblVpID09IHZvbEluZGV4TWluKSB7CisgICAgICAgICAgICB2b2xJZHggPSB2b2xJbmRleE1pbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd291bGQgcmVzdWx0IGluIGEgZGl2aWRlLWJ5LXplcm8gYmVsb3cKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHZvbEluZGV4bWluICE9IHZvbEluZGV4TWF4LCAiSW52YWxpZCB2b2x1bWUgaW5kZXggcmFuZ2UgJiB2YWx1ZTogMCIpOworICAgICAgICAgICAgcmV0dXJuIE5BTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGludGVycG9sYWF0ZQorICAgICAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtCisgICAgICAgIGludCBuYlN0ZXBzID0gMSArIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUluZGV4IC0gbUN1cnZlUG9pbnRzWzBdLm1JbmRleDsKKyAgICAgICAgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gdm9sSW5kZXhNaW4pKSAvICh2b2xJbmRleE1heCAtIHZvbEluZGV4TWluKTsKKyAgICB9CiAKICAgICAvLyBXaGVyZSB3b3VsZCB0aGlzIHZvbHVtZSBpbmRleCBiZWVuIGluc2VydGVkIGluIHRoZSBjdXJ2ZSBwb2ludAogICAgIHNpemVfdCBpbmRleEluVWlQb3NpdGlvbiA9IG1DdXJ2ZVBvaW50cy5vcmRlck9mKEN1cnZlUG9pbnQodm9sSWR4LCAwKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Y2UxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiYXVkaW9wb2xpY3lfZW5naW5lY29uZmlnX3Rlc3RzIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCmluZGV4IDVkMjJjMjQuLmM1NjU5MjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKQEAgLTExMSw2ICsxMTEsOCBAQAogICovCiBQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOwogYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKTsKKy8vIEV4cG9zZWQgZm9yIHRlc3RpbmcuCithbmRyb2lkOjpzdGF0dXNfdCBwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoY29uc3QgY2hhciogcGF0aCwgVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMpOwogCiB9IC8vIG5hbWVzcGFjZSBlbmdpbmVDb25maWcKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwCmluZGV4IDQ4NDJjYjIuLjdjZmVmNWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApAQCAtMjI4LDcgKzIyOCw4IEBACiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmbGFncyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJ2YWx1ZSIpOwogCiAgICAgICAgICAgICBBTE9HVigiJXMgZmxhZ3MgJXMiLCAgX19GVU5DVElPTl9fLCBmbGFncy5jX3N0cigpKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuZmxhZ3MgPSBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzLCAiICIpOworICAgICAgICAgICAgYXR0cmlidXRlcy5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsICIgIikpOwogICAgICAgICB9CiAgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkJ1bmRsZSIpKSkgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgYnVuZGxlS2V5ID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgImtleSIpOwpAQCAtNTg4LDYgKzU4OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgVm9sdW1lR3JvdXBzIHRlbXBWb2x1bWVHcm91cHMgPSB2b2x1bWVHcm91cHM7CiAgICAgZm9yIChjb25zdCBhdXRvICZ2b2x1bWVNYXBJdGVyIDogbGVnYWN5Vm9sdW1lTWFwKSB7CiAgICAgICAgIC8vIEluIG9yZGVyIHRvIGxldCBBdWRpb1NlcnZpY2Ugc2V0dGluZyB0aGUgbWluIGFuZCBtYXggKGNvbXBhdGliaWxpdHkpLCBzZXQgTWluIGFuZCBNYXgKICAgICAgICAgLy8gdG8gLTEgZXhjZXB0IGZvciBwcml2YXRlIHN0cmVhbXMKQEAgLTU5OCw4ICs2MDAsMTAgQEAKICAgICAgICAgfQogICAgICAgICBpbnQgaW5kZXhNaW4gPSBzdHJlYW1UeXBlID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UID8gMCA6IC0xOwogICAgICAgICBpbnQgaW5kZXhNYXggPSBzdHJlYW1UeXBlID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UID8gMTAwIDogLTE7Ci0gICAgICAgIHZvbHVtZUdyb3Vwcy5wdXNoX2JhY2soeyB2b2x1bWVNYXBJdGVyLmZpcnN0LCBpbmRleE1pbiwgaW5kZXhNYXgsIHZvbHVtZU1hcEl0ZXIuc2Vjb25kIH0pOworICAgICAgICB0ZW1wVm9sdW1lR3JvdXBzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICB7IHZvbHVtZU1hcEl0ZXIuZmlyc3QsIGluZGV4TWluLCBpbmRleE1heCwgdm9sdW1lTWFwSXRlci5zZWNvbmQgfSk7CiAgICAgfQorICAgIHN0ZDo6c3dhcCh0ZW1wVm9sdW1lR3JvdXBzLCB2b2x1bWVHcm91cHMpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNjk0LDM1ICs2OTgsMTQgQEAKICAgICByZXR1cm4gZGVzZXJpYWxpemVMZWdhY3lWb2x1bWVDb2xsZWN0aW9uKGRvYywgY3VyLCB2b2x1bWVHcm91cHMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKIH0KIAotc3RhdGljIGNvbnN0IGludCBnQXBtWG1sQ29uZmlnRmlsZVBhdGhNYXhMZW5ndGggPSAxMjg7Ci0KLXN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYXBtWG1sQ29uZmlnRmlsZU5hbWUgPSAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIjsKLXN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYXBtQTJkcE9mZmxvYWREaXNhYmxlZFhtbENvbmZpZ0ZpbGVOYW1lID0KLSAgICAgICAgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2EyZHBfb2ZmbG9hZF9kaXNhYmxlZC54bWwiOwotCiBhbmRyb2lkOjpzdGF0dXNfdCBwYXJzZUxlZ2FjeVZvbHVtZXMoVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMpIHsKLSAgICBjaGFyIGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZVtnQXBtWG1sQ29uZmlnRmlsZVBhdGhNYXhMZW5ndGhdOwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gZmlsZU5hbWVzOwotICAgIHN0YXR1c190IHJldDsKLQotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5zdXBwb3J0ZWQiLCBmYWxzZSkgJiYKLSAgICAgICAgICAgIHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5hMmRwX29mZmxvYWQuZGlzYWJsZWQiLCBmYWxzZSkpIHsKLSAgICAgICAgLy8gQTJEUCBvZmZsb2FkIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQ6IHRyeSB0byB1c2Ugc3BlY2lhbCBYTUwgZmlsZQotICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKGFwbUEyZHBPZmZsb2FkRGlzYWJsZWRYbWxDb25maWdGaWxlTmFtZSk7CisgICAgaWYgKHN0ZDo6c3RyaW5nIGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSA9IGF1ZGlvX2dldF9hdWRpb19wb2xpY3lfY29uZmlnX2ZpbGUoKTsKKyAgICAgICAgICAgICFhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gcGFyc2VMZWdhY3lWb2x1bWVGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZS5jX3N0cigpLCB2b2x1bWVHcm91cHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJObyByZWFkYWJsZSBhdWRpbyBwb2xpY3kgY29uZmlnIGZpbGUgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgZmlsZU5hbWVzLnB1c2hfYmFjayhhcG1YbWxDb25maWdGaWxlTmFtZSk7Ci0KLSAgICBmb3IgKGNvbnN0IGNoYXIqIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IGF1ZGlvX2dldF9jb25maWd1cmF0aW9uX3BhdGhzKCkpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgc2l6ZW9mKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAiJXMvJXMiLCBwYXRoLmNfc3RyKCksIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIHJldCA9IHBhcnNlTGVnYWN5Vm9sdW1lRmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHZvbHVtZUdyb3Vwcyk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCiB9IC8vIG5hbWVzcGFjZSBlbmdpbmVDb25maWcKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjA3NzRmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjUgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJhdWRpb3BvbGljeV9lbmdpbmVjb25maWdfdGVzdHMiLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb25maWciLAorICAgIF0sCisKKyAgICBzcmNzOiBbImVuZ2luZWNvbmZpZ190ZXN0cy5jcHAiXSwKKworICAgIGRhdGE6IFsiOmF1ZGlvcG9saWN5X2VuZ2luZWNvbmZpZ19maWxlcyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL2VuZ2luZWNvbmZpZ190ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL2VuZ2luZWNvbmZpZ190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZTAyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvZW5naW5lY29uZmlnX3Rlc3RzLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX1Rlc3QiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJFbmdpbmVDb25maWcuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK1RFU1QoRW5naW5lQ29uZmlnVGVzdEluaXQsIExlZ2FjeVZvbHVtZUdyb3Vwc0xvYWRpbmdJc1RyYW5zYWN0aW9uYWwpIHsKKyAgICBlbmdpbmVDb25maWc6OlZvbHVtZUdyb3VwcyBncm91cHM7CisgICAgQVNTRVJUX1RSVUUoZ3JvdXBzLmVtcHR5KCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGVuZ2luZUNvbmZpZzo6cGFyc2VMZWdhY3lWb2x1bWVGaWxlKAorICAgICAgICAgICAgKGJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKSArICIvdGVzdF9pbnZhbGlkX2FwbV92b2x1bWVfdGFibGVzLnhtbCIpLmNfc3RyKCksCisgICAgICAgICAgICBncm91cHMpOworICAgIEFTU0VSVF9ORShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBFWFBFQ1RfVFJVRShncm91cHMuZW1wdHkoKSk7CisgICAgc3RhdHVzID0gZW5naW5lQ29uZmlnOjpwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoCisgICAgICAgICAgICAoYmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpICsgIi90ZXN0X2FwbV92b2x1bWVfdGFibGVzLnhtbCIpLmNfc3RyKCksCisgICAgICAgICAgICBncm91cHMpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBFWFBFQ1RfRkFMU0UoZ3JvdXBzLmVtcHR5KCkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9yZXNvdXJjZXMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlZTBlOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3IEBACitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb3BvbGljeV9lbmdpbmVjb25maWdfZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RfYXBtX3ZvbHVtZV90YWJsZXMueG1sIiwKKyAgICAgICAgInRlc3RfaW52YWxpZF9hcG1fdm9sdW1lX3RhYmxlcy54bWwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2FwbV92b2x1bWVfdGFibGVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXBtX3ZvbHVtZV90YWJsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTI2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2FwbV92b2x1bWVfdGFibGVzLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPGdsb2JhbENvbmZpZ3VyYXRpb24gc3BlYWtlcl9kcmNfZW5hYmxlZD0idHJ1ZSIvPgorICAgIDx2b2x1bWVzPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVzPgorICAgIDx2b2x1bWVzPgorICAgICAgICA8cmVmZXJlbmNlIG5hbWU9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIj4KKyAgICAgICAgICAgIDwhLS0gRnVsbCBTY2FsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICAgICAgPHBvaW50PjAsMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICA8L3ZvbHVtZXM+Cis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfaW52YWxpZF9hcG1fdm9sdW1lX3RhYmxlcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXBtX3ZvbHVtZV90YWJsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzVkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXBtX3ZvbHVtZV90YWJsZXMueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUaGlzIGZpbGUgdXNlcyBhIG5vbi1leGlzdGVudCBhdWRpbyBzdHJlYW0gbmFtZS4gLS0+Cis8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9InRydWUiLz4KKyAgICA8dm9sdW1lcz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9OT05fRVhJU1RJTkciIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUklORyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9NVVNJQyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BTEFSTSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yOTcwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjAxMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTEwMjA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiCisgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9EVE1GIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiCisgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lcz4KKyAgICA8dm9sdW1lcz4KKyAgICAgICAgPHJlZmVyZW5jZSBuYW1lPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSI+CisgICAgICAgICAgICA8IS0tIEZ1bGwgU2NhbGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgICAgIDxwb2ludD4wLDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgPC92b2x1bWVzPgorPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0VuZ2luZUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9FbmdpbmVJbnRlcmZhY2UuaAppbmRleCBkZmIyMGI1Li5hOWI1MzZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0VuZ2luZUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvRW5naW5lSW50ZXJmYWNlLmgKQEAgLTM0LDYgKzM0LDggQEAKIHVzaW5nIERldmljZVN0cmF0ZWd5TWFwID0gc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBEZXZpY2VWZWN0b3I+OwogdXNpbmcgU3RyYXRlZ3lWZWN0b3IgPSBzdGQ6OnZlY3Rvcjxwcm9kdWN0X3N0cmF0ZWd5X3Q+OwogdXNpbmcgVm9sdW1lR3JvdXBWZWN0b3IgPSBzdGQ6OnZlY3Rvcjx2b2x1bWVfZ3JvdXBfdD47Cit1c2luZyBDYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVNYXAgPQorICAgICAgICBzdGQ6Om1hcDxhdWRpb19zb3VyY2VfdCwgc3RkOjptYXA8ZGV2aWNlX3JvbGVfdCwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4+OwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIGlzIGRlZGljYXRlZCB0byB0aGUgcG9saWN5IG1hbmFnZXIgdGhhdCBhIFBvbGljeSBFbmdpbmUgc2hhbGwgaW1wbGVtZW50LgpAQCAtMjkzLDM3ICsyOTUsMTIwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdCA9IDA7CiAKICAgICAvKioKLSAgICAgKiBAYnJpZWYgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kgc2V0cyB0aGUgZGVmYXVsdCBkZXZpY2UgdG8gYmUgdXNlZCBmb3IgYQotICAgICAqIHN0cmF0ZWd5IHdoZW4gYXZhaWxhYmxlCisgICAgICogQGJyaWVmIHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kgc2V0cyBkZXZpY2VzIHJvbGUgZm9yIGEgc3RyYXRlZ3kgd2hlbiBhdmFpbGFibGUuIFRvIHJlbW92ZQorICAgICAqIGRldmljZXMgcm9sZSwgcmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneSBtdXN0IGJlIGNhbGxlZC4gV2hlbiBkZXZpY2VzIHJvbGUgaXMgc2V0CisgICAgICogc3VjY2Vzc2Z1bGx5LCBwcmV2aW91c2x5IHNldCBkZXZpY2VzIGZvciB0aGUgc2FtZSByb2xlIGFuZCBzdHJhdGVneSB3aWxsIGJlIHJlbW92ZWQuCiAgICAgICogQHBhcmFtIHN0cmF0ZWd5IHRoZSBhdWRpbyBzdHJhdGVneSB3aG9zZSByb3V0aW5nIHdpbGwgYmUgYWZmZWN0ZWQKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBhdWRpbyBkZXZpY2UgdG8gcm91dGUgdG8gd2hlbiBhdmFpbGFibGUKLSAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiB0aGUgc3RyYXRlZ3kgaXMgaW52YWxpZCwKLSAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIHByZWZlcnJlZCBkZXZpY2Ugd2FzIHNldAorICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIGZvciB0aGUgc3RyYXRlZ3kuIEFsbCBkZXZpY2Ugcm9sZXMgYXJlIGRlZmluZWQgYXQKKyAgICAgKiAgICAgICAgICAgICBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW9fcG9saWN5LmguIERFVklDRV9ST0xFX05PTkUgaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgIGZvciBzZXR0aW5nLgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBhdWRpbyBkZXZpY2VzIHRvIGJlIHNldAorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBvciByb2xlIGlzIGludmFsaWQsCisgICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIGZvciBzdHJhdGVneSB3YXMgc2V0CiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBAYnJpZWYgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kgcmVtb3ZlcyB0aGUgcHJlZmVycmVkIGRldmljZSBwcmV2aW91c2x5IHNldAorICAgICAqIEBicmllZiByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5IHJlbW92ZXMgdGhlIHJvbGUgb2YgZGV2aWNlKHMpIHByZXZpb3VzbHkgc2V0CiAgICAgICogZm9yIHRoZSBnaXZlbiBzdHJhdGVneQogICAgICAqIEBwYXJhbSBzdHJhdGVneSB0aGUgYXVkaW8gc3RyYXRlZ3kgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCi0gICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIHN0cmF0ZWd5IGlzIGludmFsaWQsCi0gICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHdhcyByZW1vdmVkCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIHN0cmF0ZWd5CisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIHN0cmF0ZWd5IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZXMgZm9yIHRoaXMgcm9sZSB3YXMgcmVtb3ZlZAogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkgPSAwOwogCiAgICAgLyoqCi0gICAgICogQGJyaWVmIGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5IHF1ZXJpZXMgd2hpY2ggZGV2aWNlIGlzIHNldCBhcyB0aGUKLSAgICAgKiBwcmVmZXJyZWQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kKKyAgICAgKiBAYnJpZWYgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneSBxdWVyaWVzIHdoaWNoIGRldmljZXMgaGF2ZSB0aGUgc3BlY2lmaWVkIHJvbGUgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCBzdHJhdGVneQogICAgICAqIEBwYXJhbSBzdHJhdGVneSB0aGUgc3RyYXRlZ3kgdG8gcXVlcnkKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHJldHVybnMgY29uZmlndXJlZCBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBpZiBvbmUgd2FzIHNldAotICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBpcyBpbnZhbGlkLAotICAgICAqICAgICBvciBOQU1FX05PVF9GT1VORCBpZiBubyBwcmVmZXJyZWQgZGV2aWNlIHdhcyBzZXQKLSAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZSBwYXJhbWV0ZXIgd2FzIGluaXRpYWxpemVkIHRvIHRoZSBwcmVmZXJyZWQgZGV2aWNlCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyByZXR1cm5zIGxpc3Qgb2YgZGV2aWNlcyB3aXRoIG1hdGNoaW5nIHJvbGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kuCisgICAgICogICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfTk9ORSBpcyBpbnZhbGlkIGFzIGlucHV0LgorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBvciByb2xlIGlzIGludmFsaWQsCisgICAgICogICAgIG9yIE5BTUVfTk9UX0ZPVU5EIGlmIG5vIGRldmljZSBmb3IgdGhlIHJvbGUgYW5kIHN0cmF0ZWd5IHdhcyBzZXQKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZXMgcGFyYW1ldGVyIGNvbnRhaW5zIGEgbGlzdCBvZiBkZXZpY2VzCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBjb25zdCA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0IHNldHMgZGV2aWNlcyByb2xlIGZvciBhIGNhcHR1cmUgcHJlc2V0IHdoZW4gYXZhaWxhYmxlLgorICAgICAqIFRvIHJlbW92ZSBkZXZpY2VzIHJvbGUsIHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCBtdXN0IGJlIGNhbGxlZC4gQ2FsbGluZworICAgICAqIGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0IHdpbGwgcmVtb3ZlIGFsbCBkZXZpY2VzIGFzIHJvbGUuIFdoZW4gZGV2aWNlcyByb2xlIGlzIHNldAorICAgICAqIHN1Y2Nlc3NmdWxseSwgcHJldmlvdXNseSBzZXQgZGV2aWNlcyBmb3IgdGhlIHNhbWUgcm9sZSBhbmQgY2FwdHVyZSBwcmVzZXQgd2lsbCBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgYXVkaW8gY2FwdHVyZSBwcmVzZXQgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIHRoZSBjYXB0dXJlIHByZXNldC4gQWxsIGRldmljZSByb2xlcyBhcmUgZGVmaW5lZCBhdAorICAgICAqICAgICAgICAgICAgIHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpb19wb2xpY3kuaC4gREVWSUNFX1JPTEVfTk9ORSBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgZm9yIHNldHRpbmcuCisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIGF1ZGlvIGRldmljZXMgdG8gYmUgc2V0CisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIGNhcHR1cmUgcHJlc2V0IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIGNhcHR1cmUgcHJlc2V0IHdhcyBzZXQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCBhZGRzIGRldmljZXMgcm9sZSBmb3IgYSBjYXB0dXJlIHByZXNldCB3aGVuIGF2YWlsYWJsZS4KKyAgICAgKiBUbyByZW1vdmUgZGV2aWNlcyByb2xlLCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQgbXVzdCBiZSBjYWxsZWQuIENhbGxpbmcKKyAgICAgKiBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCB3aWxsIHJlbW92ZSBhbGwgZGV2aWNlcyBhcyByb2xlLgorICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgYXVkaW8gY2FwdHVyZSBwcmVzZXQgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIHRoZSBjYXB0dXJlIHByZXNldC4gQWxsIGRldmljZSByb2xlcyBhcmUgZGVmaW5lZCBhdAorICAgICAqICAgICAgICAgICAgIHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpb19wb2xpY3kuaC4gREVWSUNFX1JPTEVfTk9ORSBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgZm9yIHNldHRpbmcuCisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIGF1ZGlvIGRldmljZXMgdG8gYmUgYWRkZWQKKyAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiB0aGUgY2FwdHVyZSBwcmVzZXQgb3Igcm9sZSBpcyBpbnZhbGlkLAorICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyBmb3IgY2FwdHVyZSBwcmVzZXQgd2FzIGFkZGVkCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQgcmVtb3ZlcyB0aGUgcm9sZSBvZiBkZXZpY2UocykgcHJldmlvdXNseSBzZXQKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGNhcHR1cmUgcHJlc2V0CisgICAgICogQHBhcmFtIGF1ZGlvU291cmNlIHRoZSBhdWRpbyBjYXB0dXJlIHByZXNldCB3aG9zZSByb3V0aW5nIHdpbGwgYmUgYWZmZWN0ZWQKKyAgICAgKiBAcGFyYW0gcm9sZSB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyBmb3IgdGhlIGNhcHR1cmUgcHJlc2V0CisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIGRldmljZXMgdG8gYmUgcmVtb3ZlZAorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIDEpIHRoZSBjYXB0dXJlIHByZXNldCBpcyBpbnZhbGlkLCAyKSByb2xlIGlzIGludmFsaWQgb3IgMykgdGhlIGxpc3Qgb2YKKyAgICAgKiAgICAgZGV2aWNlcyB0byBiZSByZW1vdmVkIGFyZSBub3QgYWxsIHByZXNlbnQgYXMgcm9sZSBmb3IgYSBjYXB0dXJlIHByZXNldAorICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgZGV2aWNlcyBmb3IgdGhpcyByb2xlIHdhcyByZW1vdmVkCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCByZW1vdmVzIHRoZSByb2xlIG9mIGFsbCBkZXZpY2UocykgcHJldmlvdXNseSBzZXQKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGNhcHR1cmUgcHJlc2V0CisgICAgICogQHBhcmFtIGF1ZGlvU291cmNlIHRoZSBhdWRpbyBjYXB0dXJlIHByZXNldCB3aG9zZSByb3V0aW5nIHdpbGwgYmUgYWZmZWN0ZWQKKyAgICAgKiBAcGFyYW0gcm9sZSB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyBmb3IgdGhlIGNhcHR1cmUgcHJlc2V0CisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIGNhcHR1cmUgcHJlc2V0IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZXMgZm9yIHRoaXMgcm9sZSB3YXMgcmVtb3ZlZAorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldCBxdWVyaWVzIHdoaWNoIGRldmljZXMgaGF2ZSB0aGUgc3BlY2lmaWVkIHJvbGUgZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBjYXB0dXJlIHByZXNldAorICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgY2FwdHVyZSBwcmVzZXQgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gcm9sZSB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyB0byBxdWVyeQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHJldHVybnMgbGlzdCBvZiBkZXZpY2VzIHdpdGggbWF0Y2hpbmcgcm9sZSBmb3IgdGhlIHNwZWNpZmllZCBjYXB0dXJlIHByZXNldC4KKyAgICAgKiAgICAgICAgICAgICAgICBERVZJQ0VfUk9MRV9OT05FIGlzIGludmFsaWQgYXMgaW5wdXQuCisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIGNhcHR1cmUgcHJlc2V0IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTkFNRV9OT1RfRk9VTkQgaWYgbm8gZGV2aWNlIGZvciB0aGUgcm9sZSBhbmQgY2FwdHVyZSBwcmVzZXQgd2FzIHNldAorICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgZGV2aWNlcyBwYXJhbWV0ZXIgY29udGFpbnMgYSBsaXN0IG9mIGRldmljZXMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEFjdGl2ZU1lZGlhRGV2aWNlcyByZXR1cm5zIHdoaWNoIGRldmljZXMgd2lsbCBtb3N0IGxpa2VseSB0byBiZSB1c2VkIGZvciBtZWRpYQorICAgICAqIEBwYXJhbSBhdmFpbGFibGVEZXZpY2VzIGFsbCBhdmFpbGFibGUgZGV2aWNlcworICAgICAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBhY3RpdmUgZGV2aWNlcworICAgICAqLworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGdldEFjdGl2ZU1lZGlhRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3QgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAppbmRleCBhNzM4OGRhLi5iYzMyNDE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTY1LDYgKzY1LDEyIEBACiAgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CiAKICAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX01FRElBIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiB2b2x1bWVHcm91cD0iYXNzaXN0YW50Ij4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgorICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiIHZvbHVtZUdyb3VwPSJtdXNpYyI+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9HQU1FIi8+IDwvQXR0cmlidXRlcz4KQEAgLTcyLDEyICs3OCw2IEBACiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KLSAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiB2b2x1bWVHcm91cD0iYXNzaXN0YW50Ij4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgotICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgotICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+Ci0gICAgICAgICAgICA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCmluZGV4IGY5MWY4ZDcuLmY4YTZmYzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcApAQCAtNDUsNyArNDUsNyBAQAogCiBib29sIElucHV0U291cmNlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCiB7Ci0gICAgdWludDMyX3QgYXBwbGljYWJsZUlucHV0RGV2aWNlOworICAgIGF1ZGlvX2RldmljZXNfdCBhcHBsaWNhYmxlSW5wdXREZXZpY2U7CiAgICAgYmxhY2tib2FyZFJlYWQoJmFwcGxpY2FibGVJbnB1dERldmljZSwgc2l6ZW9mKGFwcGxpY2FibGVJbnB1dERldmljZSkpOwogICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXREZXZpY2VGb3JJbnB1dFNvdXJjZShtSWQsIGFwcGxpY2FibGVJbnB1dERldmljZSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKaW5kZXggMjQ0ZjA4Mi4uNmM4ZWI2NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMzIsNyArMzIsNyBAQAogCiAgICAgc3RydWN0IERldmljZQogICAgIHsKLSAgICAgICAgdWludDMyX3QgYXBwbGljYWJsZURldmljZTsgLyoqPCBhcHBsaWNhYmxlIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGFwcGxpY2FibGVEZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCiAgICAgICAgIGNoYXIgZGV2aWNlQWRkcmVzc1ttTWF4U3RyaW5nU2l6ZV07IC8qKjwgZGV2aWNlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyYXRlZ3kuICovCiAgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAppbmRleCBhYTA2YWUzLi5mNDY0NWU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcApAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBtQXBwbGljYWJsZURldmljZXMgPSBkZXZpY2VzOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQotICAgIGRldmljZXMgfD0gQVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBkZXZpY2VzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihkZXZpY2VzIHwgQVVESU9fREVWSUNFX0JJVF9JTik7CiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlcykpIHsKICAgICAgICAgQUxPR0UoIiVzOiB0cnlpbmcgdG8gc2V0IGFuIGludmFsaWQgZGV2aWNlIDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5CmluZGV4IDlhN2ZhOGYuLjUwODNiMTQgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weQorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkKQEAgLTUyLDEzICs1MiwxOSBAQAogZGVmIGZpbmRCaXRQb3MoZGVjaW1hbCk6CiAgICAgcG9zID0gMAogICAgIGkgPSAxCi0gICAgd2hpbGUgaSAhPSBkZWNpbWFsOgorICAgIHdoaWxlIGkgPCBkZWNpbWFsOgogICAgICAgICBpID0gaSA8PCAxCiAgICAgICAgIHBvcyA9IHBvcyArIDEKICAgICAgICAgaWYgcG9zID09IDMyOgogICAgICAgICAgICAgcmV0dXJuIC0xCi0gICAgcmV0dXJuIHBvcwogCisgICAgIyBUT0RPOiBiLzE2ODA2NTcwNi4gVGhpcyBpcyBqdXN0IHRvIGZpeCB0aGUgYnVpbGQuIFRoYXQgdGhlIHByb2JsZW0gb2YgZGV2aWNlcyB3aXRoCisgICAgIyBtdWx0aXBsZSBiaXRzIHNldCBtdXN0IGJlIGFkZHJlc3NlZCBtb3JlIGdlbmVyYWxseSBpbiB0aGUgY29uZmlndXJhYmxlIGF1ZGlvIHBvbGljeQorICAgICMgYW5kIHBhcmFtZXRlciBmcmFtZXdvcmsuCisgICAgaWYgaSA+IGRlY2ltYWw6CisgICAgICAgIGxvZ2dpbmcuaW5mbygiRGV2aWNlOnt9IHdoaWNoIGhhcyBtdWx0aXBsZSBiaXRzIHNldCBpcyBza2lwcGVkLiBiLzE2ODA2NTcwNiIuZm9ybWF0KGRlY2ltYWwpKQorICAgICAgICByZXR1cm4gLTIKKyAgICByZXR1cm4gcG9zCiAKIGRlZiBnZW5lcmF0ZVhtbFN0cnVjdHVyZUZpbGUoY29tcG9uZW50VHlwZURpY3QsIHN0cnVjdHVyZVR5cGVzRmlsZSwgb3V0cHV0RmlsZSk6CiAKQEAgLTc0LDEwICs4MCwxMiBAQAogICAgICAgICAgICAgICAgIGlmIGJpdHBhcmFtZXRlcnNfbm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF92YWx1ZXMgPSBPcmRlcmVkRGljdChzb3J0ZWQodmFsdWVzX2RpY3QuaXRlbXMoKSwga2V5PWxhbWJkYSB4OiB4WzFdKSkKICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3JkZXJlZF92YWx1ZXMuaXRlbXMoKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KGJpdHBhcmFtZXRlcnNfbm9kZSwgIkJpdFBhcmFtZXRlciIpCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnTmFtZScsIGtleSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdTaXplJywgIjEiKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ1BvcycsIHN0cihmaW5kQml0UG9zKHZhbHVlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBmaW5kQml0UG9zKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcG9zID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZSA9IEVULlN1YkVsZW1lbnQoYml0cGFyYW1ldGVyc19ub2RlLCAiQml0UGFyYW1ldGVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnTmFtZScsIGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnU2l6ZScsICIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnUG9zJywgc3RyKHBvcykpCiAKICAgICAgICAgICAgICAgICBlbnVtX3BhcmFtZXRlcl9ub2RlID0gY29tcG9uZW50X3R5cGUuZmluZCgiRW51bVBhcmFtZXRlciIpCiAgICAgICAgICAgICAgICAgaWYgZW51bV9wYXJhbWV0ZXJfbm9kZSBpcyBub3QgTm9uZToKQEAgLTExOCw5ICsxMjYsOSBAQAogICAgIGlnbm9yZWRfdmFsdWVzID0gWydDTlQnLCAnTUFYJywgJ0FMTCcsICdOT05FJ10KIAogICAgIGNyaXRlcmlhX3BhdHRlcm4gPSByZS5jb21waWxlKAotICAgICAgICByIlxzKig/UDx0eXBlPig/OiIrJ3wnLmpvaW4oY29tcG9uZW50X3R5cGVfbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXyIgXAotICAgICAgICByIig/UDxsaXRlcmFsPig/ISIgKyAnfCcuam9pbihpZ25vcmVkX3ZhbHVlcykgKyAiKVx3Kilccyo9XHMqIiBcCi0gICAgICAgIHIiKD9QPHZhbHVlcz4oPzowW3hYXSk/WzAtOWEtZkEtRl0rKSIpCisgICAgICAgIHIiXHMqVlwoKD9QPHR5cGU+KD86IisnfCcuam9pbihjb21wb25lbnRfdHlwZV9tYXBwaW5nX3RhYmxlLmtleXMoKSkgKyAiKSlfIiBcCisgICAgICAgIHIiKD9QPGxpdGVyYWw+KD8hIiArICd8Jy5qb2luKGlnbm9yZWRfdmFsdWVzKSArICIpXHcqKVxzKixccyoiIFwKKyAgICAgICAgciIoPzpBVURJT19ERVZJQ0VfQklUX0lOIFx8ICk/KD9QPHZhbHVlcz4oPzowW3hYXSlbMC05YS1mQS1GXSt8WzAtOV0rKSIpCiAKICAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEFuZHJvaWQgSGVhZGVyIGZpbGUge30iLmZvcm1hdChhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSkpCiAKQEAgLTE1Niw2ICsxNjQsMTMgQEAKIAogICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidHlwZTp7fSwgbGl0ZXJhbDp7fSwgdmFsdWVzOnt9LiIuZm9ybWF0KGNvbXBvbmVudF90eXBlX25hbWUsIGNvbXBvbmVudF90eXBlX2xpdGVyYWwsIGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSkpCiAKKyAgICBpZiAic3R1YiIgbm90IGluIGFsbF9jb21wb25lbnRfdHlwZXNbIk91dHB1dERldmljZXNNYXNrIl06CisgICAgICAgIGFsbF9jb21wb25lbnRfdHlwZXNbIk91dHB1dERldmljZXNNYXNrIl1bInN0dWIiXSA9IDB4NDAwMDAwMDAKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJhZGRlZCBzdHViIG91dHB1dCBkZXZpY2UgbWFzayIpCisgICAgaWYgInN0dWIiIG5vdCBpbiBhbGxfY29tcG9uZW50X3R5cGVzWyJJbnB1dERldmljZXNNYXNrIl06CisgICAgICAgIGFsbF9jb21wb25lbnRfdHlwZXNbIklucHV0RGV2aWNlc01hc2siXVsic3R1YiJdID0gMHg0MDAwMDAwMAorICAgICAgICBsb2dnaW5nLmluZm8oImFkZGVkIHN0dWIgaW5wdXQgZGV2aWNlIG1hc2siKQorCiAgICAgIyBUcmFuc2Zvcm0gaW5wdXQgc291cmNlIGluIGluY2x1c2l2ZSBjcml0ZXJpb24KICAgICBzaGlmdCA9IGxlbihhbGxfY29tcG9uZW50X3R5cGVzWydPdXRwdXREZXZpY2VzTWFzayddKQogICAgIGlmIHNoaWZ0ID4gMzI6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCmluZGV4IGE3Mzg4ZGEuLmJjMzI0MTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC02NSw2ICs2NSwxMiBAQAogICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgogCiAgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9NRURJQSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgdm9sdW1lR3JvdXA9ImFzc2lzdGFudCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4KKyAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPgorICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibXVzaWMiPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CkBAIC03MiwxMiArNzgsNiBAQAogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+Ci0gICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgdm9sdW1lR3JvdXA9ImFzc2lzdGFudCI+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4KLSAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KLSAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPgotICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgotICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGIxNGQyYmIuLmVjY2RlN2IKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCkBAIC0yNDEsMTAgKzI0MSwxNSBAQAogICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCiAgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCk7CiAgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKKworICAgICAgICAgICAgLy8gVE9ETyAoYi8xNjEzNTg0MjgpOiByZW1vdmUgd2hlbiBwcmVmZXJyZWQgZGV2aWNlCisgICAgICAgICAgICAvLyAgZm9yIHN0cmF0ZWd5IHBob25lIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTgorICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQpOworICAgICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7CisKICAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoewogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FU30pOwpAQCAtMjY3LDEyICsyNzIsMTYgQEAKICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUjoKICAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvCiAgICAgICAgICAgICAvLyBBMkRQIHNwZWFrZXIgd2hlbiBmb3JjaW5nIHRvIHNwZWFrZXIgb3V0cHV0Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIpOwogICAgICAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSkgewogICAgICAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcyh7CkBAIC0zODYsMTggKzM5NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIEZJWE1FOiBGaW5kIGEgYmV0dGVyIHNvbHV0aW9uIHRvIHByZXZlbnQgcm91dGluZyB0byBCVCBoZWFyaW5nIGFpZChiLzEyMjkzMTI2MSkuCi0gICAgICAgIGlmICgoZGV2aWNlczIuaXNFbXB0eSgpKSAmJgotICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkpIHsKLSAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCk7Ci0gICAgICAgIH0KKwogICAgICAgICBpZiAoKGRldmljZXMyLmlzRW1wdHkoKSkgJiYKICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKICAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZGV2aWNlczIuaXNFbXB0eSgpICYmIChnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKCkuc2l6ZSgpID4gMCkpIHsKLSAgICAgICAgICAgIGlmICgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIGlmICgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApKSB7CiAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGNvbm5lY3RlZCBkZXZpY2Ugb2Ygd2lyZWQgYW5kIGJsdWV0b290aCBhMmRwCiAgICAgICAgICAgICAgICAgZGV2aWNlczIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcygKICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoKSk7CkBAIC00NTIsMjIgKzQ1NiwyNiBAQAogICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpOwogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgU1RSQVRFR1lfTk9ORToKKyAgICAgICAgLy8gSGFwcGVucyB3aGVuIGludGVybmFsIHN0cmF0ZWdpZXMgYXJlIHByb2Nlc3NlZCAoInJlcm91dGluZyIsICJwYXRjaCIuLi4pCisgICAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coImdldERldmljZXNGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzdHJhdGVneTogJWQiLCBfX2Z1bmNfXywgc3RyYXRlZ3kpOwogICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAoZGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR1YoImdldERldmljZXNGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3Igc3RyYXRlZ3kgJWQiLCBzdHJhdGVneSk7CisgICAgICAgIEFMT0dWKCIlcyBubyBkZXZpY2UgZm91bmQgZm9yIHN0cmF0ZWd5ICVkIiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdE91dHB1dERldmljZSA9IGdldEFwbU9ic2VydmVyKCktPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKTsKICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIH0KICAgICAgICAgQUxPR0VfSUYoZGV2aWNlcy5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICJnZXREZXZpY2VzRm9yU3RyYXRlZ3koKSBubyBkZWZhdWx0IGRldmljZSBkZWZpbmVkIik7CisgICAgICAgICAgICAgICAgICIlcyBubyBkZWZhdWx0IGRldmljZSBkZWZpbmVkIiwgX19mdW5jX18pOwogICAgIH0KIAotICAgIEFMT0dWVigiZ2V0RGV2aWNlcyBGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXMiLAorICAgIEFMT0dWVigiJXMgc3RyYXRlZ3kgJWQsIGRldmljZSAlcyIsIF9fZnVuY19fLAogICAgICAgICAgICBzdHJhdGVneSwgZHVtcERldmljZVR5cGVzKGRldmljZXMudHlwZXMoKSkuY19zdHIoKSk7CiAgICAgcmV0dXJuIGRldmljZXM7CiB9CkBAIC01MTQsOCArNTIyLDkgQEAKICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULAotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKQEAgLTUzOSw5ICs1NDgsMTMgQEAKICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogCiAgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKKyAgICAgICAgICAgIC8vIFRPRE8gKGIvMTYxMzU4NDI4KTogcmVtb3ZlIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCBmcm9tIHRoZSBsaXN0CisgICAgICAgICAgICAvLyAgd2hlbiBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZgorICAgICAgICAgICAgLy8gIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTi4KICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgpAQCAtNTY2LDggKzU3OSw5IEBACiAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7Ci0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CiAgICAgICAgIC8vIEZvciBhIGRldmljZSB3aXRob3V0IGJ1aWx0LWluIG1pYywgYWRkaW5nIHVzYiBkZXZpY2UKQEAgLTYzMSwxOSArNjQ1LDE3IEBACiAKICAgICAvLyBjaGVjayBpZiB0aGlzIHN0cmF0ZWd5IGhhcyBhIHByZWZlcnJlZCBkZXZpY2UgdGhhdCBpcyBhdmFpbGFibGUsCiAgICAgLy8gaWYgeWVzLCBnaXZlIHByaW9yaXR5IHRvIGl0Ci0gICAgQXVkaW9EZXZpY2VUeXBlQWRkciBwcmVmZXJyZWRTdHJhdGVneURldmljZTsKLSAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2VzOworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koCisgICAgICAgICAgICBzdHJhdGVneSwgREVWSUNFX1JPTEVfUFJFRkVSUkVELCBwcmVmZXJyZWRTdHJhdGVneURldmljZXMpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGhlcmUgaXMgYSBwcmVmZXJyZWQgZGV2aWNlLCBpcyBpdCBhdmFpbGFibGU/Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHByZWZlcnJlZEF2YWlsYWJsZURldkRlc2NyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCi0gICAgICAgICAgICAgICAgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UubVR5cGUsCi0gICAgICAgICAgICAgICAgU3RyaW5nOChwcmVmZXJyZWRTdHJhdGVneURldmljZS5tQWRkcmVzcy5jX3N0cigpKSwKLSAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7Ci0gICAgICAgIGlmIChwcmVmZXJyZWRBdmFpbGFibGVEZXZEZXNjciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIHVzaW5nIHByZWYgZGV2aWNlIDB4JTA4eC8lcyBmb3Igc3RyYXRlZ3kgJXUiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwcmVmZXJyZWRTdHJhdGVneURldmljZS5tVHlwZSwKLSAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRTdHJhdGVneURldmljZS5tQWRkcmVzcy5jX3N0cigpLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKHByZWZlcnJlZEF2YWlsYWJsZURldkRlc2NyKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIHByZWZlcnJlZEF2YWlsYWJsZURldlZlYyA9CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbURldmljZVR5cGVBZGRyVmVjKHByZWZlcnJlZFN0cmF0ZWd5RGV2aWNlcyk7CisgICAgICAgIGlmIChwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMuc2l6ZSgpID09IHByZWZlcnJlZEF2YWlsYWJsZURldlZlYy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgdXNpbmcgcHJlZiBkZXZpY2UgJXMgZm9yIHN0cmF0ZWd5ICV1IiwKKyAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjLnRvU3RyaW5nKCkuY19zdHIoKSwgc3RyYXRlZ3kpOworICAgICAgICAgICAgcmV0dXJuIHByZWZlcnJlZEF2YWlsYWJsZURldlZlYzsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjQzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeW1hbmFnZXIiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIiCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW91dGlsc19oZWFkZXJzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTZjZmEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFVTRV9DVVNUT01fQVVESU9fUE9MSUNZKSwgMSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBBdWRpb1BvbGljeUZhY3RvcnkuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAotICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIFwKLSAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotZW5kaWYgI2lmbmVxICgkKFVTRV9DVVNUT01fQVVESU9fUE9MSUNZKSwgMSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IGM1YzEzZTkuLjExNmY5MmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMjksMjkgKzI5LDI2IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi0jZGVmaW5lIEFVRElPX1BPTElDWV9YTUxfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIIDEyOAotI2RlZmluZSBBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX05BTUUgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIKLSNkZWZpbmUgQVVESU9fUE9MSUNZX0EyRFBfT0ZGTE9BRF9ESVNBQkxFRF9YTUxfQ09ORklHX0ZJTEVfTkFNRSBcCi0gICAgICAgICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9hMmRwX29mZmxvYWRfZGlzYWJsZWQueG1sIgotI2RlZmluZSBBVURJT19QT0xJQ1lfQkxVRVRPT1RIX0xFR0FDWV9IQUxfWE1MX0NPTkZJR19GSUxFX05BTUUgXAotICAgICAgICAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sIgotCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPFNlcmlhbGl6ZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19jb25maWcuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfaGFwdGljZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKLSNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotI2luY2x1ZGUgPHBvbGljeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTIwOSw2ICsyMDYsOSBAQAogICAgICAgICAgICAgLy8gUmVzZXQgYWN0aXZlIGRldmljZSBjb2RlYwogICAgICAgICAgICAgZGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKIAorICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIG1SZXBvcnRlZEZvcm1hdHNNYXAgY2FjaGUKKyAgICAgICAgICAgIG1SZXBvcnRlZEZvcm1hdHNNYXAuZXJhc2UoZGV2aWNlKTsKKwogICAgICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMzM3LDYgKzMzNyw5IEBACiAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwogCiAgICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlKTsKKworICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIG1SZXBvcnRlZEZvcm1hdHNNYXAgY2FjaGUKKyAgICAgICAgICAgIG1SZXBvcnRlZEZvcm1hdHNNYXAuZXJhc2UoZGV2aWNlKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtNDYxLDcgKzQ2NCwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCisgICAgYXV0byBtdXNpY1N0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgLy8gbXV0ZSBtZWRpYSBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0CisgICAgICAgLy8gVGhpcyBhdm9pZCBzZW5kaW5nIHRoZSBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCisgICAgICAgc2V0U3RyYXRlZ3lNdXRlKG11c2ljU3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CisgICAgfQogICAgIC8vIFRvZ2dsZSB0aGUgZGV2aWNlIHN0YXRlOiBVTkFWQUlMQUJMRSAtPiBBVkFJTEFCTEUKICAgICAvLyBUaGlzIHdpbGwgZm9yY2UgcmVhZGluZyBhZ2FpbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLApAQCAtODkzLDcgKzkwNSw4IEBACiAgICAgLy8gT25seSBob25vciBhdWRpYmlsaXR5IGVuZm9yY2VkIHdoZW4gcmVxdWlyZWQuIFRoZSBjbGllbnQgd2lsbCBiZQogICAgIC8vIGZvcmNlZCB0byByZWNvbm5lY3QgaWYgdGhlIGZvcmNlZCB1c2FnZSBjaGFuZ2VzLgogICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBkc3RBdHRyLT5mbGFncyAmPSB+QVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEOworICAgICAgICBkc3RBdHRyLT5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oCisgICAgICAgICAgICAgICAgZHN0QXR0ci0+ZmxhZ3MgJiB+QVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKTsKICAgICB9CiAKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC05MjUsNyArOTM4LDcgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKGF1dG8gaXQgPSBtQWxsb3dlZENhcHR1cmVQb2xpY2llcy5maW5kKHVpZCk7IGl0ICE9IGVuZChtQWxsb3dlZENhcHR1cmVQb2xpY2llcykpIHsKLSAgICAgICAgcmVzdWx0QXR0ci0+ZmxhZ3MgfD0gaXQtPnNlY29uZDsKKyAgICAgICAgcmVzdWx0QXR0ci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KHJlc3VsdEF0dHItPmZsYWdzIHwgaXQtPnNlY29uZCk7CiAgICAgfQogICAgICpzdHJlYW0gPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygqcmVzdWx0QXR0cik7CiAKQEAgLTEyNDMsNyArMTI1Niw4IEBACiAKICAgICAvLyBEaXNjYXJkIGhhcHRpYyBjaGFubmVsIG1hc2sgd2hlbiBmb3JjaW5nIG11dGluZyBoYXB0aWMgY2hhbm5lbHMuCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBmb3JjZU11dGluZ0hhcHRpYwotICAgICAgICAgICAgPyAoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSA6IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oY29uZmlnLT5jaGFubmVsX21hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKQorICAgICAgICAgICAgOiBjb25maWctPmNoYW5uZWxfbWFzazsKIAogICAgIC8vIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IGlmIHJlcXVpcmVkIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQpAQCAtMTI5OSw3ICsxMzEzLDggQEAKIAogICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIHNob3VsZCBpZ25vcmUgdGhlIERJUkVDVCBmbGFnIGFzIG5vIGRpcmVjdCBvdXRwdXQgY291bGQgYmUgZm91bmQgZWFybGllcgogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwgY2hhbm5lbE1hc2ssIGNvbmZpZy0+c2FtcGxlX3JhdGUpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQoCisgICAgICAgICAgICAgICAgb3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwgY2hhbm5lbE1hc2ssIGNvbmZpZy0+c2FtcGxlX3JhdGUsIHNlc3Npb24pOwogICAgIH0KICAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0Rm9yRGV2aWNlcygpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCAiCiAgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbHMgJSN4LCBmbGFncyAlI3giLApAQCAtMTQ3MiwxNCArMTQ4NywyNiBAQAogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9JTlZBTElEIHx8IGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSksCiAgICAgICAgICIlcyBjYWxsZWQgd2l0aCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CiAKKyAgICAvLyBSZXR1cm4gdGhlIG91dHB1dCB0aGF0IGhhcHRpYy1nZW5lcmF0aW5nIGF0dGFjaGVkIHRvIHdoZW4gMSkgc2Vzc2lvbiBpZCBpcyBzcGVjaWZpZWQsCisgICAgLy8gMikgaGFwdGljLWdlbmVyYXRpbmcgZWZmZWN0IGV4aXN0cyBmb3IgZ2l2ZW4gc2Vzc2lvbiBpZCBhbmQgMykgdGhlIG91dHB1dCB0aGF0CisgICAgLy8gaGFwdGljLWdlbmVyYXRpbmcgZWZmZWN0IGF0dGFjaGVkIHRvIGlzIGluIGdpdmVuIG91dHB1dHMuCisgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX05PTkUpIHsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFwdGljR2VuZXJhdGluZ091dHB1dCA9IG1FZmZlY3RzLmdldElvRm9yU2Vzc2lvbigKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIEZYX0lJRF9IQVBUSUNHRU5FUkFUT1IpOworICAgICAgICBpZiAob3V0cHV0cy5pbmRleE9mKGhhcHRpY0dlbmVyYXRpbmdPdXRwdXQpID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiBoYXB0aWNHZW5lcmF0aW5nT3V0cHV0OworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gRmxhZ3MgZGlzcXVhbGlmeWluZyBhbiBvdXRwdXQ6IHRoZSBtYXRjaCBtdXN0IGhhcHBlbiBiZWZvcmUgY2FsbGluZyBzZWxlY3RPdXRwdXQoKQogICAgIHN0YXRpYyBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBrRXhjbHVkZWRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKQEAgLTE3NjUsNyArMTc5Miw4IEBACiAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSwgMCAvKmRlbGF5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnVzZUh3R2FpbigpIC8qZm9yY2UqLyk7CiAKICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KICAgICAgICAgLy8gcm91dGluZwpAQCAtMTkzMiw2ICsxOTYwLDEyIEBACiAKICAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpICVkIiwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKIAorICAgIHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gb3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MtPmlzQ2xpZW50QWN0aXZlKGNsaWVudCkpIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBpbmFjdGl2YXRlcyBwb3J0SWQgJWQgaW4gZ29vZCBmYWl0aCIsIHBvcnRJZCk7CisgICAgICAgIHN0b3BPdXRwdXQocG9ydElkKTsKKyAgICB9CisKICAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CiAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIGZvciBvdXRwdXQgJWQiLApAQCAtMTk0Myw5ICsxOTc3LDcgQEAKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBzdG9wT3V0cHV0KCkgbmVlZHMgdG8gYmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBiZWZvcmUgcmVsZWFzZU91dHB1dCgpCi0gICAgLy8gb3RoZXJ3aXNlIHRoZXJlIG1heSBiZSBpbmFjY3VyYXRlIHN0cmVhbSByZWZlcmVuY2UgY291bnRzLgotICAgIC8vIFRoaXMgaXMgY2hlY2tlZCBpbiBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQgYmVsb3cuCisKICAgICBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQocG9ydElkKTsKIH0KIApAQCAtMjI1Niw3ICsyMjg4LDcgQEAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOwogICAgIGlmIChpbnB1dERlc2MgPT0gMCkgewogICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOwogICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CkBAIC0zMDgzLDE2ICszMTE1LDE2IEBACiAKIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGV2aWNlcyB0eXBlcyBtYXRjaCB0aGUgcHJlZGljYXRlIGFuZCBhcmUgc3VwcG9ydGVkIGJ5IG9uZSBIVyBtb2R1bGUKIGJvb2wgIEF1ZGlvUG9saWN5TWFuYWdlcjo6YXJlQWxsRGV2aWNlc1N1cHBvcnRlZCgKLSAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLAogICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woYXVkaW9fZGV2aWNlc190KT4gcHJlZGljYXRlLAogICAgICAgICBjb25zdCBjaGFyICpjb250ZXh0KSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcy5jX3N0cigpLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5nZXRBZGRyZXNzKCksIFN0cmluZzgoKSwKICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwgZmFsc2UgLyphbGxvd1RvQ3JlYXRlKi8sIHRydWUgLyptYXRjaEFkZHJlc3MqLyk7CiAgICAgICAgIGlmIChkZXZEZXNjID09IG51bGxwdHIgfHwgKHByZWRpY2F0ZSAhPSBudWxscHRyICYmICFwcmVkaWNhdGUoZGV2aWNlc1tpXS5tVHlwZSkpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGRldmljZSB0eXBlICUjeCBhZGRyZXNzICVzIG5vdCBzdXBwb3J0ZWQgb3Igbm90IGFuIG91dHB1dCBkZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiBkZXZpY2UgdHlwZSAlI3ggYWRkcmVzcyAlcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBtYXRjaCBwcmVkaWNhdGUiLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTAwLDcgKzMxMzIsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAotICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIEFMT0dWKCIlcygpIHVpZD0lZCBudW0gZGV2aWNlcyAlenUiLCBfX0ZVTkNUSU9OX18sIHVpZCwgZGV2aWNlcy5zaXplKCkpOwogICAgIGlmICghYXJlQWxsRGV2aWNlc1N1cHBvcnRlZChkZXZpY2VzLCBhdWRpb19pc19vdXRwdXRfZGV2aWNlLCBfX2Z1bmNfXykpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTMxMzIsMjAgKzMxNjQsMTkgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgewotICAgIEFMT0dWKCIlcygpIHN0cmF0ZWd5PSVkIGRldmljZT0lMDh4IGFkZHI9JXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICBzdHJhdGVneSwgZGV2aWNlLm1UeXBlLCBkZXZpY2UubUFkZHJlc3MuY19zdHIoKSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSB7CisgICAgQUxPR1YoIiVzKCkgc3RyYXRlZ3k9JWQgcm9sZT0lZCAlcyIsIF9fZnVuY19fLCBzdHJhdGVneSwgcm9sZSwKKyAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGRldmljZXMpLmNfc3RyKCkpOwogCi0gICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+IGRldmljZXM7Ci0gICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICBpZiAoIWFyZUFsbERldmljZXNTdXBwb3J0ZWQoZGV2aWNlcywgYXVkaW9faXNfb3V0cHV0X2RldmljZSwgX19mdW5jX18pKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIkVuZ2luZSBjb3VsZCBub3Qgc2V0IHByZWZlcnJlZCBkZXZpY2UgJTA4eCAlcyBmb3Igc3RyYXRlZ3kgJWQiLAotICAgICAgICAgICAgICAgIGRldmljZS5tVHlwZSwgZGV2aWNlLm1BZGRyZXNzLmNfc3RyKCksIHN0cmF0ZWd5KTsKKyAgICAgICAgQUxPR1coIkVuZ2luZSBjb3VsZCBub3Qgc2V0IHByZWZlcnJlZCBkZXZpY2VzICVzIGZvciBzdHJhdGVneSAlZCByb2xlICVkIiwKKyAgICAgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzKS5jX3N0cigpLCBzdHJhdGVneSwgcm9sZSk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC0zMTYxLDYgKzMxOTIsOCBAQAogICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewogICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIHdhaXRNcyA9IHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMsIGRlbGF5TXMpOworICAgICAgICAvLyBPbmx5IGFwcGx5IHNwZWNpYWwgdG91Y2ggc291bmQgZGVsYXkgb25jZQorICAgICAgICBkZWxheU1zID0gMDsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CkBAIC0zMTcwLDYgKzMyMDMsOCBAQAogICAgICAgICAgICAgLy8gcHJldmVudGluZyB0aGUgZm9yY2UgcmUtcm91dGluZyBpbiBjYXNlIG9mIGRlZmF1bHQgZGV2IHRoYXQgZGlzdGluZ3Vpc2hlcyBvbiBhZGRyZXNzLgogICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBiYWNrIHRvIGVuZ2luZSBmdWxsIGRldmljZSBjaG9pY2UgZGVjaXNpb24gaG93ZXZlci4KICAgICAgICAgICAgIHdhaXRNcyA9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgIW5ld0RldmljZXMuaXNFbXB0eSgpLCBkZWxheU1zKTsKKyAgICAgICAgICAgIC8vIE9ubHkgYXBwbHkgc3BlY2lhbCB0b3VjaCBzb3VuZCBkZWxheSBvbmNlCisgICAgICAgICAgICBkZWxheU1zID0gMDsKICAgICAgICAgfQogICAgICAgICBpZiAoZm9yY2VWb2x1bWVSZWV2YWwgJiYgIW5ld0RldmljZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcy50eXBlcygpLCB3YWl0TXMsIHRydWUpOwpAQCAtMzE3NywxMSArMzIxMiwxMiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkKIHsKLSAgICBBTE9HSSgiJXMoKSBzdHJhdGVneT0lZCIsIF9fRlVOQ1RJT05fXywgc3RyYXRlZ3kpOworICAgIEFMT0dJKCIlcygpIHN0cmF0ZWd5PSVkIHJvbGU9JWQiLCBfX2Z1bmNfXywgc3RyYXRlZ3ksIHJvbGUpOwogCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+cmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coIkVuZ2luZSBjb3VsZCBub3QgcmVtb3ZlIHByZWZlcnJlZCBkZXZpY2UgZm9yIHN0cmF0ZWd5ICVkIiwgc3RyYXRlZ3kpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMzE5MywxNCArMzIyOSw4MSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpIHsKLSAgICByZXR1cm4gbUVuZ2luZS0+Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSB7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgeworICAgIEFMT0dWKCIlcygpIGF1ZGlvU291cmNlPSVkIHJvbGU9JWQgJXMiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UsIHJvbGUsCisgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzKS5jX3N0cigpKTsKKworICAgIGlmICghYXJlQWxsRGV2aWNlc1N1cHBvcnRlZChkZXZpY2VzLCBhdWRpb19jYWxsX2lzX2lucHV0X2RldmljZSwgX19mdW5jX18pKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7CisgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgIkVuZ2luZSBjb3VsZCBub3Qgc2V0IHByZWZlcnJlZCBkZXZpY2VzICVzIGZvciBhdWRpbyBzb3VyY2UgJWQgcm9sZSAlZCIsCisgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzKS5jX3N0cigpLCBhdWRpb1NvdXJjZSwgcm9sZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgeworICAgIEFMT0dWKCIlcygpIGF1ZGlvU291cmNlPSVkIHJvbGU9JWQgJXMiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UsIHJvbGUsCisgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzKS5jX3N0cigpKTsKKworICAgIGlmICghYXJlQWxsRGV2aWNlc1N1cHBvcnRlZChkZXZpY2VzLCBhdWRpb19jYWxsX2lzX2lucHV0X2RldmljZSwgX19mdW5jX18pKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7CisgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgIkVuZ2luZSBjb3VsZCBub3QgYWRkIHByZWZlcnJlZCBkZXZpY2VzICVzIGZvciBhdWRpbyBzb3VyY2UgJWQgcm9sZSAlZCIsCisgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzKS5jX3N0cigpLCBhdWRpb1NvdXJjZSwgcm9sZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBBTE9HVigiJXMoKSBhdWRpb1NvdXJjZT0lZCByb2xlPSVkIGRldmljZXM9JXMiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UsIHJvbGUsCisgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzKS5jX3N0cigpKTsKKworICAgIGlmICghYXJlQWxsRGV2aWNlc1N1cHBvcnRlZChkZXZpY2VzLCBhdWRpb19jYWxsX2lzX2lucHV0X2RldmljZSwgX19mdW5jX18pKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICJFbmdpbmUgY291bGQgbm90IHJlbW92ZSBkZXZpY2VzIHJvbGUgKCVkKSBmb3IgY2FwdHVyZSBwcmVzZXQgJWQiLCByb2xlLCBhdWRpb1NvdXJjZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpIHsKKyAgICBBTE9HVigiJXMoKSBhdWRpb1NvdXJjZT0lZCByb2xlPSVkIiwgX19mdW5jX18sIGF1ZGlvU291cmNlLCByb2xlKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlKTsKKyAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAiRW5naW5lIGNvdWxkIG5vdCBjbGVhciBkZXZpY2VzIHJvbGUgKCVkKSBmb3IgY2FwdHVyZSBwcmVzZXQgJWQiLCByb2xlLCBhdWRpb1NvdXJjZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldCgKKyAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgeworICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwKLSAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSB7Ci0gICAgQUxPR0koIiVzKCkgdXNlcklkPSVkIG51bSBkZXZpY2VzICV6dSIsIF9fRlVOQ1RJT05fXywgdXNlcklkLCBkZXZpY2VzLnNpemUoKSk7XAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CisgICAgQUxPR0koIiVzKCkgdXNlcklkPSVkIG51bSBkZXZpY2VzICV6dSIsIF9fZnVuY19fLCB1c2VySWQsIGRldmljZXMuc2l6ZSgpKTsKICAgICBpZiAoIWFyZUFsbERldmljZXNTdXBwb3J0ZWQoZGV2aWNlcywgYXVkaW9faXNfb3V0cHV0X2RldmljZSwgX19mdW5jX18pKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtNDIzNSwxNCArNDMzOCwyOCBAQAogICAgICAgICAvLyBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4KICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV07Ci0gICAgICAgICAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0cyA9Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZS0+Z2V0QXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5nZXRTdXBwb3J0ZWRGb3JtYXRzKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHN1cHBvcnRlZEZvcm1hdHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHN1cHBvcnRlZEZvcm1hdHNbal0pOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBkZXZpY2UtPnR5cGUoKTsKKyAgICAgICAgICAgIC8vIEVuYWJsaW5nL2Rpc2FibGluZyBmb3JtYXRzIGFyZSBhcHBsaWVkIHRvIG9ubHkgSERNSSBkZXZpY2VzLiBTbywgdGhpcyBmdW5jdGlvbgorICAgICAgICAgICAgLy8gcmV0dXJucyBmb3JtYXRzIHJlcG9ydGVkIGJ5IEhETUkgZGV2aWNlcy4KKyAgICAgICAgICAgIGlmIChkZXZpY2VUeXBlICE9IEFVRElPX0RFVklDRV9PVVRfSERNSSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRm9ybWF0cyByZXBvcnRlZCBieSBzaW5rIGRldmljZXMKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0c2V0OworICAgICAgICAgICAgaWYgKGF1dG8gaXQgPSBtUmVwb3J0ZWRGb3JtYXRzTWFwLmZpbmQoZGV2aWNlKTsgaXQgIT0gbVJlcG9ydGVkRm9ybWF0c01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGZvcm1hdHNldC5pbnNlcnQoaXQtPnNlY29uZC5iZWdpbigpLCBpdC0+c2Vjb25kLmVuZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9ybWF0cyBoYXJkLWNvZGVkIGluIHRoZSBpbiBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIChpZiBhbnkpLgorICAgICAgICAgICAgRm9ybWF0VmVjdG9yIGVuY29kZWRGb3JtYXRzID0gZGV2aWNlLT5lbmNvZGVkRm9ybWF0cygpOworICAgICAgICAgICAgZm9ybWF0c2V0Lmluc2VydChlbmNvZGVkRm9ybWF0cy5iZWdpbigpLCBlbmNvZGVkRm9ybWF0cy5lbmQoKSk7CisgICAgICAgICAgICAvLyBGaWx0ZXIgdGhlIGZvcm1hdHMgd2hpY2ggYXJlIHN1cHBvcnRlZCBieSB0aGUgdmVuZG9yIGhhcmR3YXJlLgorICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZm9ybWF0c2V0LmJlZ2luKCk7IGl0ICE9IGZvcm1hdHNldC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGlmIChtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmNvdW50KCppdCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLmluc2VydCgqaXQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyLnNlY29uZC5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpci5zZWNvbmQuY291bnQoKml0KSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00NDQxLDM3ICs0NTU4LDE1IEBACiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5WG1sQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpIHsKLSAgICBjaGFyIGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZVtBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX1BBVEhfTUFYX0xFTkdUSF07Ci0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGZpbGVOYW1lczsKLSAgICBzdGF0dXNfdCByZXQ7Ci0KLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInJvLmJsdWV0b290aC5hMmRwX29mZmxvYWQuc3VwcG9ydGVkIiwgZmFsc2UpKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYmx1ZXRvb3RoX2F1ZGlvX2hhbC5kaXNhYmxlZCIsIGZhbHNlKSAmJgotICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIGZhbHNlKSkgewotICAgICAgICAgICAgLy8gQm90aCBCbHVldG9vdGhBdWRpb0AyLjAgYW5kIEJsdWV0b290aEEyZHBAMS4wIChPZmZsYW9kKSBhcmUgZGlzYWJsZWQsIGFuZCB1c2VzCi0gICAgICAgICAgICAvLyB0aGUgbGVnYWN5IGhhcmR3YXJlIG1vZHVsZSBmb3IgQTJEUCBhbmQgaGVhcmluZyBhaWQuCi0gICAgICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9CTFVFVE9PVEhfTEVHQUNZX0hBTF9YTUxfQ09ORklHX0ZJTEVfTkFNRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIGZhbHNlKSkgewotICAgICAgICAgICAgLy8gQTJEUCBvZmZsb2FkIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQ6IHRyeSB0byB1c2Ugc3BlY2lhbCBYTUwgZmlsZQotICAgICAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfQTJEUF9PRkZMT0FEX0RJU0FCTEVEX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKKyAgICBpZiAoc3RkOjpzdHJpbmcgYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlID0gYXVkaW9fZ2V0X2F1ZGlvX3BvbGljeV9jb25maWdfZmlsZSgpOworICAgICAgICAgICAgIWF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZS5lbXB0eSgpKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZS5jX3N0cigpLCAmY29uZmlnKTsKKyAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgY29uZmlnLnNldFNvdXJjZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYmx1ZXRvb3RoX2F1ZGlvX2hhbC5kaXNhYmxlZCIsIGZhbHNlKSkgewotICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9CTFVFVE9PVEhfTEVHQUNZX0hBTF9YTUxfQ09ORklHX0ZJTEVfTkFNRSk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQotICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKLQotICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogYXVkaW9fZ2V0X2NvbmZpZ3VyYXRpb25fcGF0aHMoKSkgewotICAgICAgICAgICAgc25wcmludGYoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBzaXplb2YoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICIlcy8lcyIsIHBhdGguY19zdHIoKSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgcmV0ID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCAmY29uZmlnKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0U291cmNlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UsCkBAIC00NzYyLDcgKzQ4NTcsMTUgQEAKICAgICB9CiAKICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKLSAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgLy8gZmlyc3QgY2FsbCBnZXRBdWRpb1BvcnQgdG8gZ2V0IHRoZSBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBIQUwKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfdjcgcG9ydCA9IHt9OworICAgICAgICBkZXZpY2UtPnRvQXVkaW9Qb3J0KCZwb3J0KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldEF1ZGlvUG9ydCgmcG9ydCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHBvcnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlbiBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQpAQCAtNDgyNCw4ICs0OTI3LDggQEAKICAgICAgICAgICAgICAgICAgIGRldmljZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CisgICAgICAgICAgICBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZApAQCAtNDg0OSw5ICs0OTUyLDggQEAKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CiAKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbigmY29uZmlnLCBEZXZpY2VWZWN0b3IoZGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZGVzYy0+b3BlbigmY29uZmlnLCBEZXZpY2VWZWN0b3IoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00ODgxLDggKzQ5ODMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBhIGR1cGxpY2F0aW5nIG91dHB1dCB0aHJlYWQgZm9yIHRoZSBuZXcgb3V0cHV0IGFuZCB0aGUgcHJpbWFyeSBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGR1cE91dHB1dERlc2MtPm9wZW5EdXBsaWNhdGluZyhtUHJpbWFyeU91dHB1dCwgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBkdXBPdXRwdXREZXNjLT5vcGVuRHVwbGljYXRpbmcobVByaW1hcnlPdXRwdXQsIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cGxpY2F0ZWRPdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBkdXBsaWNhdGVkIG91dHB1dCBkZXNjcmlwdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQsIGR1cE91dHB1dERlc2MpOwpAQCAtNTI1OCw3ICs1MzYwLDcgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbGllbnQtPmdldFByaW1hcnlNaXgoKSAhPSBwcmltYXJ5TWl4KSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5nZXRQcmltYXJ5TWl4KCkgIT0gcHJpbWFyeU1peCB8fCBjbGllbnQtPmhhc0xvc3RQcmltYXJ5TWl4KCkpIHsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwc0lkKSkgewogICAgICAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpOwpAQCAtNTI4OSw3ICs1MzkxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+ZmxhZ3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Y29uZmlnKCkuZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5jb25maWcoKS5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmNvbmZpZygpLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Y29uZmlnKCkuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnNlc3Npb24oKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdPdXRwdXQgIT0gc3JjT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTQ0Niw2ICs1NTQ5LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBEbyBub3QgcmV0cmlldmUgZW5naW5lIGRldmljZSBmb3Igb3V0cHV0cyB0aHJvdWdoIE1TRAorICAgIC8vIFRPRE86IHN1cHBvcnQgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBieSByZXNldHRpbmcgTVNEIHBhdGNoIHRvIGVuZ2luZSBkZXZpY2UuCisgICAgaWYgKG91dHB1dERlc2MtPmRldmljZXMoKSA9PSBnZXRNc2RBdWRpb091dERldmljZXMoKSkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOworICAgIH0KKwogICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCiAgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KICAgICBib29sIGFjdGl2ZTsgLy8gdW51c2VkCkBAIC01NTMzLDggKzU2NDIsOCBAQAogICAgIH0KICAgICBEZXZpY2VWZWN0b3IgYWN0aXZlRGV2aWNlczsKICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3QgY3VyU3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQ7Ci0gICAgICAgICBjdXJTdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKGN1clN0cmVhbSArIDEpKSB7CisgICAgZm9yIChpbnQgaSA9IEFVRElPX1NUUkVBTV9NSU47IGkgPCBBVURJT19TVFJFQU1fUFVCTElDX0NOVDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgY3VyU3RyZWFte3N0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGkpfTsKICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCBjdXJTdHJlYW0pKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtNTY0OCw3ICs1NzU3LDcgQEAKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUodHRzVm9sdW1lU291cmNlLCBtdXRlLypvbiovLCBkZXNjLCAwIC8qZGVsYXkqLywgRGV2aWNlVHlwZVNldCgpKTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOwotICAgICAgICAgICAgaWYgKGxhdGVuY3kgPiBtYXhMYXRlbmN5KSB7CisgICAgICAgICAgICBpZiAoZGVzYy0+aXNBY3RpdmUobGF0ZW5jeSAqIDIpICYmIGxhdGVuY3kgPiBtYXhMYXRlbmN5KSB7CiAgICAgICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IGxhdGVuY3k7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYwMzEsNyArNjE0MCw4IEBACiAgICAgaWYgKCFJbnRlcnNlY3Rpb24oZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICB7QVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTLAogICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUsCi0gICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRH0pLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlELAorICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVR9KS5lbXB0eSgpICYmCiAgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAogICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwKICAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pKSB8fApAQCAtNjEzNSw3ICs2MjQ1LDkgQEAKICAgICAgICAgICAgICAoaXNCdFNjb1ZvbFNyYyAmJiBmb3JjZVVzZUZvckNvbW0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSB7CiAgICAgICAgIEFMT0dWKCIlcyBjYW5ub3Qgc2V0IHZvbHVtZSBncm91cCAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsIF9fZnVuY19fLAogICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSwgZm9yY2VVc2VGb3JDb21tKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAvLyBEbyBub3QgcmV0dXJuIGFuIGVycm9yIGhlcmUgYXMgQXVkaW9TZXJ2aWNlIHdpbGwgYWx3YXlzIHNldCBib3RoIHZvaWNlIGNhbGwKKyAgICAgICAgLy8gYW5kIGJsdWV0b290aCBTQ08gdm9sdW1lcyBkdWUgdG8gc3RyZWFtIGFsaWFzaW5nLgorICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogICAgIGlmIChkZXZpY2VUeXBlcy5lbXB0eSgpKSB7CiAgICAgICAgIGRldmljZVR5cGVzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCk7CkBAIC02MTQzLDkgKzYyNTUsOCBAQAogCiAgICAgZmxvYXQgdm9sdW1lRGIgPSBjb21wdXRlVm9sdW1lKGN1cnZlcywgdm9sdW1lU291cmNlLCBpbmRleCwgZGV2aWNlVHlwZXMpOwogICAgIGlmIChvdXRwdXREZXNjLT5pc0ZpeGVkVm9sdW1lKGRldmljZVR5cGVzKSB8fAotICAgICAgICAgICAgLy8gRm9yY2UgVm9JUCB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPCi0KLSAgICAgICAgICAgICgoaXNWb2ljZVZvbFNyYyB8fCBpc0J0U2NvVm9sU3JjKSAmJgorICAgICAgICAgICAgLy8gRm9yY2UgVm9JUCB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGRldmljZSBleGNlcHQgaWYgbXV0ZWQKKyAgICAgICAgICAgIChpbmRleCAhPSAwICYmIChpc1ZvaWNlVm9sU3JjIHx8IGlzQnRTY29Wb2xTcmMpICYmCiAgICAgICAgICAgICAgICAgICAgIGlzU2luZ2xlRGV2aWNlVHlwZShkZXZpY2VUeXBlcywgYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKSkpIHsKICAgICAgICAgdm9sdW1lRGIgPSAwLjBmOwogICAgIH0KQEAgLTY0NDcsNiArNjU1OCw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSk7CisgICAgICAgIG1SZXBvcnRlZEZvcm1hdHNNYXBbZGV2RGVzY10gPSBmb3JtYXRzOwogICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSQogICAgICAgICAgICAgICAgIHx8IGlzRGV2aWNlT2ZNb2R1bGUoZGV2RGVzYywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkpIHsKICAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kRm9ybWF0cyhkZXZEZXNjLCAmZm9ybWF0cyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IGI1ODhmODkuLjAxMmVkNmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0yNjMsMTcgKzI2Myw0MiBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQpOwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKTsKKworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCkBAIC02MDgsNyArNjMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9OT05FKTsKICAgICAgICAgLy8gc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrIGFyZSBpbi9vdXQgYW5kIHNvIG1heSBiZSBtb2RpZmllZAogICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldElucHV0UHJvZmlsZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKQEAgLTc4Nyw2ICs4MTMsOSBAQAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1NYW51YWxTdXJyb3VuZEZvcm1hdHM7CiAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBhdWRpb19mbGFnc19tYXNrX3Q+IG1BbGxvd2VkQ2FwdHVyZVBvbGljaWVzOworCisgICAgICAgIC8vIFRoZSBtYXAgb2YgZGV2aWNlIGRlc2NyaXB0b3IgYW5kIGZvcm1hdHMgcmVwb3J0ZWQgYnkgdGhlIGRldmljZS4KKyAgICAgICAgc3RkOjptYXA8d3A8RGV2aWNlRGVzY3JpcHRvcj4sIEZvcm1hdFZlY3Rvcj4gbVJlcG9ydGVkRm9ybWF0c01hcDsKIHByaXZhdGU6CiAgICAgICAgIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGVJbnQoRGV2aWNlVmVjdG9yICpuZXdEZXZpY2VzKTsKIApAQCAtOTM4LDcgKzk2Nyw3IEBACiAgICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gKnBhdGNoRGVzY1B0cik7CiAKICAgICAgICAgYm9vbCBhcmVBbGxEZXZpY2VzU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLAogICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChhdWRpb19kZXZpY2VzX3QpPiBwcmVkaWNhdGUsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODIzZWZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTggQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3lzZXJ2aWNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAiLAorICAgICAgICAiQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCIsCisgICAgICAgICJBdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIiwKKyAgICAgICAgIkF1ZGlvUG9saWN5U2VydmljZS5jcHAiLAorICAgICAgICAiQ2FwdHVyZVN0YXRlTm90aWZpZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciIKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9wb2xpY3ltYW5hZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJlZmZlY3RzY29uZmlnIiwKKyAgICAgICAgImxpYmhhcmR3YXJlX2xlZ2FjeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnNlbnNvcnByaXZhY3kiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC11bnN0YWJsZS1jcHAiLAorICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtdW5zdGFibGUtY3BwIiwKKyAgICAgICAgImNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV3RocmVhZC1zYWZldHkiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODBiMDc3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIEF1ZGlvUG9saWN5U2VydmljZS5jcHAgXAotICAgIEF1ZGlvUG9saWN5RWZmZWN0cy5jcHAgXAotICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgXAotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgXAotICAgIENhcHR1cmVTdGF0ZU5vdGlmaWVyLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCi0gICAgbGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMgXAotICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliYXVkaW9jbGllbnQgXAotICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgIGxpYmF1ZGlvZm91bmRhdGlvbiBcCi0gICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKLSAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXIgXAotICAgIGxpYm1lZGlhX2hlbHBlciBcCi0gICAgbGlibWVkaWFtZXRyaWNzIFwKLSAgICBsaWJtZWRpYXV0aWxzIFwKLSAgICBsaWJlZmZlY3RzY29uZmlnIFwKLSAgICBsaWJzZW5zb3Jwcml2YWN5IFwKLSAgICBjYXB0dXJlX3N0YXRlX2xpc3RlbmVyLWFpZGwtY3BwCi0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IFwKLSAgICBsaWJzZW5zb3Jwcml2YWN5Ci0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeXNlcnZpY2UKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yIC1XdGhyZWFkLXNhZmV0eQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCA5ZmE3YTUzLi5kZDEyOGEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC01MCw3ICs1MCwyMiBAQAogICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChtb2R1bGUsIG91dHB1dCwgY29uZmlnLCBkZXZpY2UsIGxhdGVuY3lNcywgZmxhZ3MpOworCisgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0IHJlcXVlc3Q7CisgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSByZXNwb25zZTsKKworICAgIHJlcXVlc3QubW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChtb2R1bGUpKTsKKyAgICByZXF1ZXN0LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoKmNvbmZpZykpOworICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9EZXZpY2VEZXNjcmlwdG9yQmFzZShkZXZpY2UpKTsKKyAgICByZXF1ZXN0LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfbWFzayhmbGFncykpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWYtPm9wZW5PdXRwdXQocmVxdWVzdCwgJnJlc3BvbnNlKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICpvdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QocmVzcG9uc2Uub3V0cHV0KSk7CisgICAgICAgICpjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KHJlc3BvbnNlLmNvbmZpZykpOworICAgICAgICAqbGF0ZW5jeU1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KHJlc3BvbnNlLmxhdGVuY3lNcykpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuRHVwbGljYXRlT3V0cHV0KApAQCAtMTExLDcgKzEyNiwyMiBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQobW9kdWxlLCBpbnB1dCwgY29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlVHlwZUFkZHIoKmRldmljZSwgYWRkcmVzcy5jX3N0cigpKTsKKworICAgIG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0IHJlcXVlc3Q7CisgICAgcmVxdWVzdC5tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KG1vZHVsZSkpOworICAgIHJlcXVlc3QuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoKmlucHV0KSk7CisgICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKCpjb25maWcpKTsKKyAgICByZXF1ZXN0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhkZXZpY2VUeXBlQWRkcikpOworICAgIHJlcXVlc3Quc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgcmVxdWVzdC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfbWFzayhmbGFncykpOworCisgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlIHJlc3BvbnNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5vcGVuSW5wdXQocmVxdWVzdCwgJnJlc3BvbnNlKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICppbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QocmVzcG9uc2UuaW5wdXQpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTI0Niw0ICsyNzYsMTQgQEAKICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5tQ2FwdHVyZVN0YXRlTm90aWZpZXIuc2V0Q2FwdHVyZVN0YXRlKGFjdGl2ZSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5nZXRBdWRpb1BvcnQocG9ydCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAppbmRleCAxZWMwYzVlLi5iNzM4NjMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0xMjEsOCArMTIxLDggQEAKICAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBlZmZlY3RzW2ldOwotICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsIFN0cmluZzE2KCJhbmRyb2lkIiksICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBhdWRpb1Nlc3Npb24sIGlucHV0KTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChTdHJpbmcxNigiYW5kcm9pZCIpKTsKKyAgICAgICAgICAgIGZ4LT5zZXQoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIC0xLCAwLCAwLCBhdWRpb1Nlc3Npb24sIGlucHV0KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coImFkZElucHV0RWZmZWN0cygpOiBmYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIHNvdXJjZSAlZCIsCkBAIC0yNzAsOCArMjcwLDggQEAKICAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKLSAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0LT5tVXVpZCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sIG91dHB1dCk7CisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoU3RyaW5nMTYoImFuZHJvaWQiKSk7CisgICAgICAgICAgICBmeC0+c2V0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAwLCAwLCAwLCBhdWRpb1Nlc3Npb24sIG91dHB1dCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBmYWlsZWQgdG8gY3JlYXRlIEZ4ICAlcyBvbiBzZXNzaW9uICVkIiwKQEAgLTk3MCwxMSArOTcwLDExIEBACiAgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VFZmZlY3RzSXRlciA6IG1EZXZpY2VFZmZlY3RzKSB7CiAgICAgICAgIGNvbnN0IGF1dG8mIGRldmljZUVmZmVjdHMgPSAgZGV2aWNlRWZmZWN0c0l0ZXIuc2Vjb25kOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdERlc2MgOiBkZXZpY2VFZmZlY3RzLT5tRWZmZWN0RGVzY3JpcHRvcnMtPm1FZmZlY3RzKSB7Ci0gICAgICAgICAgICBhdXRvIGZ4ID0gc3RkOjptYWtlX3VuaXF1ZTxBdWRpb0VmZmVjdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfVVVJRF9OVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0RGVzYy0+bVV1aWQsIDAsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBBVURJT19TRVNTSU9OX0RFVklDRSwgQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRye2RldmljZUVmZmVjdHMtPmdldERldmljZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlQWRkcmVzcygpfSk7CisgICAgICAgICAgICBhdXRvIGZ4ID0gc3RkOjptYWtlX3VuaXF1ZTxBdWRpb0VmZmVjdD4oU3RyaW5nMTYoImFuZHJvaWQiKSk7CisgICAgICAgICAgICBmeC0+c2V0KEVGRkVDVF9VVUlEX05VTEwsICZlZmZlY3REZXNjLT5tVXVpZCwgMCwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgQVVESU9fU0VTU0lPTl9ERVZJQ0UsIEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRye2RldmljZUVmZmVjdHMtPmdldERldmljZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VFZmZlY3RzLT5nZXREZXZpY2VBZGRyZXNzKCl9KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCk6IGZhaWxlZCB0byBjcmVhdGUgRnggJXMgb24gcG9ydCB0eXBlPSVkIGFkZHJlc3M9JXMiLCBfX2Z1bmNfXywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAppbmRleCAzNGQwN2I2Li5kZjhlNGM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0yNDQsMTEgKzI0NCwxMiBAQAogICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwogICAgIH0KICAgICBpZiAoIW1QYWNrYWdlTWFuYWdlci5hbGxvd1BsYXliYWNrQ2FwdHVyZSh1aWQpKSB7Ci0gICAgICAgIGF0dHItPmZsYWdzIHw9IEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTjsKKyAgICAgICAgYXR0ci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KGF0dHItPmZsYWdzIHwgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OKTsKICAgICB9CiAgICAgaWYgKCgoYXR0ci0+ZmxhZ3MgJiAoQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWXxBVURJT19GTEFHX0JZUEFTU19NVVRFKSkgIT0gMCkKICAgICAgICAgICAgICYmICFieXBhc3NJbnRlcnJ1cHRpb25Qb2xpY3lBbGxvd2VkKHBpZCwgdWlkKSkgewotICAgICAgICBhdHRyLT5mbGFncyAmPSB+KEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1l8QVVESU9fRkxBR19CWVBBU1NfTVVURSk7CisgICAgICAgIGF0dHItPmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgICAgICBhdHRyLT5mbGFncyAmIH4oQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWXxBVURJT19GTEFHX0JZUEFTU19NVVRFKSk7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6Om91dHB1dF90eXBlX3Qgb3V0cHV0VHlwZTsKQEAgLTEyNTcsNyArMTI1OCw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCi0gICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKQEAgLTEyODIsNyArMTI4Myw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CkBAIC0xNDk0LDMzICsxNDk1LDM2IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlLCBkZXZpY2VzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIoCkBAIC0xNTMxLDQgKzE1MzUsNTUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5jbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggZTg0N2Y5Zi4uYTZlODk4OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtNDg4LDkgKzQ4OCw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBib29sIGlzQWNjZXNzaWJpbGl0eSA9IG1VaWRQb2xpY3ktPmlzQTExeVVpZChjdXJyZW50LT51aWQpOwotICAgICAgICAvLyBDbGllbnRzIGNhcHR1cmluZyBmb3IgQWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyBhcmUgbm90IGNvbnNpZGVyZWQKKyAgICAgICAgLy8gQ2xpZW50cyBjYXB0dXJpbmcgZm9yIEFjY2Vzc2liaWxpdHkgc2VydmljZXMgb3IgdmlydHVhbCBzb3VyY2VzIGFyZSBub3QgY29uc2lkZXJlZAogICAgICAgICAvLyBmb3IgdG9wIG9yIGxhdGVzdCBhY3RpdmUgdG8gYXZvaWQgbWFza2luZyByZWd1bGFyIGNsaWVudHMgc3RhcnRlZCBiZWZvcmUKLSAgICAgICAgaWYgKCFpc0FjY2Vzc2liaWxpdHkpIHsKKyAgICAgICAgaWYgKCFpc0FjY2Vzc2liaWxpdHkgJiYgIWlzVmlydHVhbFNvdXJjZShjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkpIHsKICAgICAgICAgICAgIGJvb2wgaXNBc3Npc3RhbnQgPSBtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpOwogICAgICAgICAgICAgYm9vbCBpc1ByaXZhY3lTZW5zaXRpdmUgPQogICAgICAgICAgICAgICAgICAgICAoY3VycmVudC0+YXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFKSAhPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggODY5YTk2My4uNzBhMGUzYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yMjYsMTkgKzIyNiw0MSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKTsKIApAQCAtNzQzLDYgKzc2NSw4IEBACiAKICAgICAgICAgdm9pZCBzZXRTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpIG92ZXJyaWRlOwogCisgICAgICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgb3ZlcnJpZGU7CisKICAgICAgcHJpdmF0ZToKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICptQXVkaW9Qb2xpY3lTZXJ2aWNlOwogICAgIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlZmRiMjQxLi5kYWVkZjMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE4LDcgKzE4LDEwIEBACiAgICAgICAgICJsaWJ4bWwyIiwKICAgICBdLAogCi0gICAgc3RhdGljX2xpYnM6IFsibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisgICAgICAgICJsaWJnbW9jayIKKyAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKQEAgLTQyLDYgKzQ1LDcgQEAKIAogY2NfdGVzdCB7CiAgICAgbmFtZTogImF1ZGlvX2hlYWx0aF90ZXN0cyIsCisgICAgcmVxdWlyZV9yb290OiB0cnVlLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgKaW5kZXggZTE3MjFlYS4uNDMzYTZmZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaApAQCAtNzUsNiArNzUsMTAgQEAKICAgICBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1BY3RpdmVQYXRjaGVzLmZpbmQoKmhhbmRsZSk7CisgICAgICAgIGlmIChpdGVyICE9IG1BY3RpdmVQYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICBtQWN0aXZlUGF0Y2hlcy5lcmFzZSgqaGFuZGxlKTsKKyAgICAgICAgfQogICAgICAgICAqaGFuZGxlID0gbU5leHRQYXRjaEhhbmRsZSsrOwogICAgICAgICBtQWN0aXZlUGF0Y2hlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmhhbmRsZSwgKnBhdGNoKSk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTExNyw2ICsxMjEsOCBAQAogCiAgICAgc2l6ZV90IGdldEF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRMaXN0VXBkYXRlQ291bnQ7IH0KIAorICAgIHZpcnR1YWwgdm9pZCBhZGRTdXBwb3J0ZWRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgLyogZm9ybWF0ICovKSB7fQorCiBwcml2YXRlOgogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtTmV4dE1vZHVsZUhhbmRsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSArIDE7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgbU5leHRJb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FICsgMTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50Rm9ySGRtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YWQ5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50Rm9ySGRtaS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIkF1ZGlvUG9saWN5VGVzdENsaWVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQgeworcHVibGljOgorICAgIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCAvKiBpb0hhbmRsZSAqLywgY29uc3QgU3RyaW5nOCYgIC8qIGtleXMqLyApIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1BhcmFtZXRlcnMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFN1cHBvcnRlZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIG92ZXJyaWRlIHsKKyAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGQoCisgICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksCisgICAgICAgICAgICAgICAgU3RyaW5nOChhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGZvcm1hdCkpKTsKKyAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIDQ4MDAwKTsKKyAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCBTdHJpbmc4KCIiKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEF1ZGlvUGFyYW1ldGVyIG1BdWRpb1BhcmFtZXRlcnM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaAppbmRleCBjNjI4ZTcwLi5mYTZiOTBmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaApAQCAtODcsNiArODcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQgX191bnVzZWQpIHt9CiAgICAgdm9pZCBzZXRTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUgX191bnVzZWQpIG92ZXJyaWRlIHt9OworICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaAppbmRleCA4YmFiMDIwLi5iZTg2MGU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzOwogICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF2YWlsYWJsZUlucHV0RGV2aWNlczsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZDsKICAgICB1aW50MzJfdCBnZXRBdWRpb1BvcnRHZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb247IH0KIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb19oZWFsdGhfdGVzdHMuY3BwCmluZGV4IGI1YzY3YTEuLjlhNjJlNzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5X0Jvb3RfVGVzdCIKIAorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KQEAgLTc0LDMgKzc1LDQzIEBACiAgICAgICAgIEFTU0VSVF9ORShhdHRhY2hlZERldmljZXMuZW5kKCksIGF0dGFjaGVkRGV2aWNlcy5maW5kKGRlc2MtPnR5cGUoKSkpOwogICAgIH0KIH0KKworVEVTVChBdWRpb0hlYWx0aFRlc3QsIENvbm5lY3RTdXBwb3J0ZWREZXZpY2UpIHsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50IGNsaWVudDsKKyAgICBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyIG1hbmFnZXIoJmNsaWVudCk7CisgICAgbWFuYWdlci5sb2FkQ29uZmlnKCk7CisgICAgQVNTRVJUX05FKCJBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdCIsIG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0U291cmNlKCkpOworCisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SHdNb2R1bGVzKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGRldmljZXMubWVyZ2UocHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBkZXZpY2VzLm1lcmdlKHByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKGRldmljZS0+dHlwZSgpKSAmJgorICAgICAgICAgICAgIWF1ZGlvX2lzX2JsdWV0b290aF9pbl9zY29fZGV2aWNlKGRldmljZS0+dHlwZSgpKSkgeworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIHRvIG9ubHkgdGVzdCBjb25uZWN0aW5nIEJUIGRldmljZXMuCisgICAgICAgICAgICAvLyAxKSBJdCBpcyBlYXNpZXIgdG8gY29uc3RydWN0IGEgZmFrZSBhZGRyZXNzLgorICAgICAgICAgICAgLy8gMikgVGhpcyB0ZXN0IHdpbGwgYmUgcnVuIGluIHByZXN1Ym1pdC4gSW4gdGhhdCBjYXNlLCBpdCBtYWtlcyBzZW5zZSB0byBtYWtlIHRoZSB0ZXN0CisgICAgICAgICAgICAvLyAgICBwcm9jZXNzaW5nIHRpbWUgc2hvcnQuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhZGRyZXNzID0gIjExOjIyOjMzOjQ0OjU1OjY2IjsKKyAgICAgICAgQVNTRVJUX0VRKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcy5jX3N0cigpKSk7CisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgICAgICBkZXZpY2UtPnR5cGUoKSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsIGFkZHJlc3MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAiIiAvKmRldmljZV9uYW1lKi8sIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgICAgIEFTU0VSVF9FUShBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzLmNfc3RyKCkpKTsKKyAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgIGRldmljZS0+dHlwZSgpLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLCBhZGRyZXNzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIiIgLypkZXZpY2VfbmFtZSovLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOworICAgICAgICBBU1NFUlRfRVEoQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzLmNfc3RyKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCBhMDA3NGJjLi5hYmM0ZDgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KIAogI2RlZmluZSBMT0dfVEFHICJBUE1fVGVzdCIKICNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CkBAIC0zMiwxMCArMzMsMTIgQEAKIAogI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oIgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIHRlc3Rpbmc6OlVub3JkZXJlZEVsZW1lbnRzQXJlOwogCiBURVNUKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RJbml0LCBFbmdpbmVGYWlsdXJlKSB7CiAgICAgQXVkaW9Qb2xpY3lUZXN0Q2xpZW50IGNsaWVudDsKQEAgLTU2LDYgKzU5LDM0IEBACiAgICAgQVNTRVJUX0VRKE5PX0lOSVQsIG1hbmFnZXIuaW5pdENoZWNrKCkpOwogfQogCisvLyBWZXJpZmllcyB0aGF0IGEgZmFpbHVyZSB3aGlsZSBsb2FkaW5nIGEgY29uZmlnIGRvZXNuJ3QgbGVhdmUKKy8vIEFQTSBjb25maWcgaW4gYSAiZGlydHkiIHN0YXRlLiBTaW5jZSBBdWRpb1BvbGljeUNvbmZpZyBvYmplY3QKKy8vIGlzIGEgcHJveHkgZm9yIHRoZSBkYXRhIGhvc3RlZCBieSBBUE0sIGl0IGlzbid0IHBvc3NpYmxlCisvLyB0byAiZGVlcCBjb3B5IiBpdCwgYW5kIHRodXMgd2UgaGF2ZSB0byB0ZXN0IGl0cyBlbGVtZW50cworLy8gaW5kaXZpZHVhbGx5LgorVEVTVChBdWRpb1BvbGljeU1hbmFnZXJUZXN0SW5pdCwgQ29uZmlnTG9hZGluZ0lzVHJhbnNhY3Rpb25hbCkgeworICAgIEF1ZGlvUG9saWN5VGVzdENsaWVudCBjbGllbnQ7CisgICAgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlciBtYW5hZ2VyKCZjbGllbnQpOworICAgIEFTU0VSVF9UUlVFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SHdNb2R1bGVzKCkuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlRfVFJVRShtYW5hZ2VyLmdldENvbmZpZygpLmdldElucHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgQVNTRVJUX1RSVUUobWFuYWdlci5nZXRDb25maWcoKS5nZXRPdXRwdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZSgKKyAgICAgICAgICAgIChiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgICAgICAgICAiL3Rlc3RfaW52YWxpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiKS5jX3N0cigpLAorICAgICAgICAgICAgJm1hbmFnZXIuZ2V0Q29uZmlnKCkpOworICAgIEFTU0VSVF9ORShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBFWFBFQ1RfVFJVRShtYW5hZ2VyLmdldENvbmZpZygpLmdldEh3TW9kdWxlcygpLmlzRW1wdHkoKSk7CisgICAgRVhQRUNUX1RSVUUobWFuYWdlci5nZXRDb25maWcoKS5nZXRJbnB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIEVYUEVDVF9UUlVFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0T3V0cHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoCisgICAgICAgICAgICAoYmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpICsgIi90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIpLmNfc3RyKCksCisgICAgICAgICAgICAmbWFuYWdlci5nZXRDb25maWcoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzdGF0dXMpOworICAgIEVYUEVDVF9GQUxTRShtYW5hZ2VyLmdldENvbmZpZygpLmdldEh3TW9kdWxlcygpLmlzRW1wdHkoKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SW5wdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UobWFuYWdlci5nZXRDb25maWcoKS5nZXRPdXRwdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKK30KKwogCiBjbGFzcyBQYXRjaENvdW50Q2hlY2sgewogICBwdWJsaWM6CkBAIC04Nyw3ICsxMTgsNyBAQAogICAgIHZvaWQgZ2V0T3V0cHV0Rm9yQXR0cigKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCA9IG51bGxwdHIsCkBAIC05OCw3ICsxMjksNyBAQAogICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IG51bGxwdHIpOwpAQCAtMTA5LDEzICsxNDAsMTQgQEAKICAgICBib29sIGZpbmREZXZpY2VQb3J0KGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MsIGF1ZGlvX3BvcnQgKmZvdW5kUG9ydCk7CiAgICAgc3RhdGljIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0RGV2aWNlSWRGcm9tUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCk7CisgICAgdmlydHVhbCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50KiBnZXRDbGllbnQoKSB7IHJldHVybiBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudDsgfQogCiAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQ+IG1DbGllbnQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUG9saWN5VGVzdE1hbmFnZXI+IG1NYW5hZ2VyOwogfTsKIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcCgpIHsKLSAgICBtQ2xpZW50LnJlc2V0KG5ldyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50KTsKKyAgICBtQ2xpZW50LnJlc2V0KGdldENsaWVudCgpKTsKICAgICBtTWFuYWdlci5yZXNldChuZXcgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlcihtQ2xpZW50LmdldCgpKSk7CiAgICAgU2V0VXBNYW5hZ2VyQ29uZmlnKCk7ICAvLyBTdWJjbGFzc2VzIG1heSB3YW50IHRvIGN1c3RvbWl6ZSB0aGUgY29uZmlnLgogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRpYWxpemUoKSk7CkBAIC0xNjQsNyArMTk2LDcgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0T3V0cHV0Rm9yQXR0cigKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCkBAIC0xOTQsNyArMjI2LDcgQEAKICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSB7CkBAIC02MzgsNiArNjcwLDE2MyBAQAogICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgcmV0KTsKIH0KIAorY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWkKKyAgICAgICAgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZSB7Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIGdldENvbmZpZ0ZpbGUoKSBvdmVycmlkZSB7IHJldHVybiBzVHZDb25maWc7IH0KKyAgICBzdGQ6Om1hcDxhdWRpb19mb3JtYXRfdCwgYm9vbD4gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKGJvb2wgcmVwb3J0ZWQpOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZ2V0Rm9ybWF0c0Zyb21Qb3J0cygpOworICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQqIGdldENsaWVudCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50Rm9ySGRtaTsKKyAgICB9CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIHNUdkNvbmZpZzsKKworfTsKKworY29uc3Qgc3RkOjpzdHJpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWk6OnNUdkNvbmZpZyA9CisgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pOjpzRXhlY3V0YWJsZURpciArCisgICAgICAgICJ0ZXN0X3NldHRvcF9ib3hfc3Vycm91bmRfY29uZmlndXJhdGlvbi54bWwiOworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pOjpTZXRVcCgpIHsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcCgpOworICAgIG1DbGllbnQtPmFkZFN1cHBvcnRlZEZvcm1hdChBVURJT19GT1JNQVRfRV9BQzMpOworICAgIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUksIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgIiIgLyphZGRyZXNzKi8sICIiIC8qbmFtZSovLCBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWk6OlRlYXJEb3duKCkgeworICAgIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUksIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAiIiAvKmFkZHJlc3MqLywgIiIgLypuYW1lKi8sIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpUZWFyRG93bigpOworfQorCitzdGQ6Om1hcDxhdWRpb19mb3JtYXRfdCwgYm9vbD4KKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWk6OmdldFN1cnJvdW5kRm9ybWF0c0hlbHBlcihib29sIHJlcG9ydGVkKSB7CisgICAgdW5zaWduZWQgaW50IG51bVN1cnJvdW5kRm9ybWF0cyA9IDA7CisgICAgc3RkOjptYXA8YXVkaW9fZm9ybWF0X3QsIGJvb2w+IHN1cnJvdW5kRm9ybWF0c01hcDsKKyAgICBzdGF0dXNfdCByZXQgPSBtTWFuYWdlci0+Z2V0U3Vycm91bmRGb3JtYXRzKAorICAgICAgICAgICAgJm51bVN1cnJvdW5kRm9ybWF0cywgbnVsbHB0ciAvKiBzdXJyb3VuZEZvcm1hdHMgKi8sCisgICAgICAgICAgICBudWxscHRyIC8qIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgKi8sIHJlcG9ydGVkKTsKKyAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIHJldCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3Vycm91bmRGb3JtYXRzTWFwOworICAgIH0KKyAgICBhdWRpb19mb3JtYXRfdCBzdXJyb3VuZEZvcm1hdHNbbnVtU3Vycm91bmRGb3JtYXRzXTsKKyAgICBtZW1zZXQoc3Vycm91bmRGb3JtYXRzLCAwLCBzaXplb2YoYXVkaW9fZm9ybWF0X3QpICogbnVtU3Vycm91bmRGb3JtYXRzKTsKKyAgICBib29sIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRbbnVtU3Vycm91bmRGb3JtYXRzXTsKKyAgICBtZW1zZXQoc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgMCwgc2l6ZW9mKGJvb2wpICogbnVtU3Vycm91bmRGb3JtYXRzKTsKKyAgICByZXQgPSBtTWFuYWdlci0+Z2V0U3Vycm91bmRGb3JtYXRzKAorICAgICAgICAgICAgJm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CisgICAgRVhQRUNUX0VRKE5PX0VSUk9SLCByZXQpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN1cnJvdW5kRm9ybWF0c01hcDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGk8IG51bVN1cnJvdW5kRm9ybWF0czsgaSsrKSB7CisgICAgICAgIHN1cnJvdW5kRm9ybWF0c01hcFtzdXJyb3VuZEZvcm1hdHNbaV1dID0gc3Vycm91bmRGb3JtYXRzRW5hYmxlZFtpXTsKKyAgICB9CisgICAgcmV0dXJuIHN1cnJvdW5kRm9ybWF0c01hcDsKK30KKworc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PgorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaTo6Z2V0Rm9ybWF0c0Zyb21Qb3J0cygpIHsKKyAgICB1aW50MzJfdCBudW1Qb3J0cyA9IDA7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjE7CisgICAgc3RhdHVzX3QgcmV0OworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0czsKKyAgICByZXQgPSBtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMoCisgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU0lOSywgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBudWxscHRyLCAmZ2VuZXJhdGlvbjEpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KSA8PCAibU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzIHJldHVybmVkIGVycm9yIjsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmb3JtYXRzOworICAgIH0KKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBwb3J0c1tudW1Qb3J0c107CisgICAgcmV0ID0gbU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKAorICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NJTkssIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICZudW1Qb3J0cywgcG9ydHMsICZnZW5lcmF0aW9uMSk7CisgICAgRVhQRUNUX0VRKE5PX0VSUk9SLCByZXQpIDw8ICJtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMgcmV0dXJuZWQgZXJyb3IiOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdHM7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmcG9ydCA6IHBvcnRzKSB7CisgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBvcnQuZm9ybWF0cywgcG9ydC5mb3JtYXRzICsgcG9ydC5udW1fZm9ybWF0cyk7CisgICAgfQorICAgIHJldHVybiBmb3JtYXRzOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksIEdldFN1cnJvdW5kRm9ybWF0c1JldHVybnNTdXBwb3J0ZWRGb3JtYXRzKSB7CisgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpOworICAgIGF1dG8gc3Vycm91bmRGb3JtYXRzID0gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKGZhbHNlIC8qcmVwb3J0ZWQqLyk7CisgICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorICAgICAgICBHZXRTdXJyb3VuZEZvcm1hdHNSZXR1cm5zTWFuaXB1bGF0ZWRGb3JtYXRzKSB7CisgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpOworCisgICAgc3RhdHVzX3QgcmV0ID0KKyAgICAgICAgICAgIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCBmYWxzZSAvKmVuYWJsZWQqLyk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpOworICAgIGF1dG8gc3Vycm91bmRGb3JtYXRzID0gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKGZhbHNlIC8qcmVwb3J0ZWQqLyk7CisgICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3Vycm91bmRGb3JtYXRzW0FVRElPX0ZPUk1BVF9FX0FDM10pOworCisgICAgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIHRydWUgLyplbmFibGVkKi8pOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKKyAgICBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoZmFsc2UgLypyZXBvcnRlZCovKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9UUlVFKHN1cnJvdW5kRm9ybWF0c1tBVURJT19GT1JNQVRfRV9BQzNdKTsKKworICAgIHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCBmYWxzZSAvKmVuYWJsZWQqLyk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpOworICAgIHN1cnJvdW5kRm9ybWF0cyA9IGdldFN1cnJvdW5kRm9ybWF0c0hlbHBlcihmYWxzZSAvKnJlcG9ydGVkKi8pOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7CisgICAgQVNTRVJUX0ZBTFNFKHN1cnJvdW5kRm9ybWF0c1tBVURJT19GT1JNQVRfRV9BQzNdKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorICAgICAgICBMaXN0QXVkaW9Qb3J0c1JldHVybk1hbmlwdWxhdGVkSGRtaUZvcm1hdHMpIHsKKyAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCk7CisKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCBmYWxzZSAvKmVuYWJsZWQqLykpOworICAgIGF1dG8gZm9ybWF0cyA9IGdldEZvcm1hdHNGcm9tUG9ydHMoKTsKKyAgICBBU1NFUlRfRVEoMCwgZm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKKworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIHRydWUgLyplbmFibGVkKi8pKTsKKyAgICBmb3JtYXRzID0gZ2V0Rm9ybWF0c0Zyb21Qb3J0cygpOworICAgIEFTU0VSVF9FUSgxLCBmb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCisgICAgICAgIEdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzUmV0dXJuc0hkbWlSZXBvcnRlZEZvcm1hdHMpIHsKKyAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUyk7CisgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIodHJ1ZSAvKnJlcG9ydGVkKi8pOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwKKyAgICAgICAgR2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHNSZXR1cm5zTm9uTWFuaXB1bGF0ZWRIZG1pUmVwb3J0ZWRGb3JtYXRzKSB7CisgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpOworCisgICAgc3RhdHVzX3QgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIGZhbHNlIC8qZW5hYmxlZCovKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CisgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIodHJ1ZSAvKnJlcG9ydGVkKi8pOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7CisKKyAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgdHJ1ZSAvKmVuYWJsZWQqLyk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpOworICAgIHN1cnJvdW5kRm9ybWF0cyA9IGdldFN1cnJvdW5kRm9ybWF0c0hlbHBlcih0cnVlIC8qcmVwb3J0ZWQqLyk7CisgICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKK30KKwogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTm9SZW1vdGVTdWJtaXhNb2R1bGUgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3kgewogcHJvdGVjdGVkOgogICAgIHN0ZDo6c3RyaW5nIGdldENvbmZpZ0ZpbGUoKSBvdmVycmlkZSB7IHJldHVybiBzUHJpbWFyeU9ubHlDb25maWc7IH0KQEAgLTcwNyw3ICs4OTYsOCBAQAogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgc291cmNlLCAwLCAiIn07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7CisgICAgICAgIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBzb3VyY2UsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OwogICAgIHN0ZDo6c3RyaW5nIHRhZ3MgPSAiYWRkcj0iICsgbU1peEFkZHJlc3M7CiAgICAgc3RybmNweShhdHRyLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CiAgICAgZ2V0SW5wdXRGb3JBdHRyKGF0dHIsIG1UcmFja2VyLT5nZXRSaWlkKCksICZzZWxlY3RlZERldmljZUlkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKQEAgLTc1Nyw5ICs5NDcsOSBAQAogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywKICAgICAgICAgdGVzdGluZzo6VmFsdWVzKAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9BTEFSTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9CiAgICAgICAgICAgICAgICAgKQogICAgICAgICApOwogCkBAIC03NjgsNDcgKzk1OCw0NyBAQAogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywKICAgICAgICAgdGVzdGluZzo6VmFsdWVzKAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0FMQVJNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFLAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9HQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0KKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9CiAgICAgICAgICAgICAgICAgKQogICAgICAgICApOwogCkBAIC04MTcsNDEgKzEwMDcsNDEgQEAKICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQUGxheWJhY2tSZVJvdXRpbmcsCiAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfR0FNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfU1BFRUNILCBBVURJT19VU0FHRV9BU1NJU1RBTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifQogICAgICAgICAgICAgICAgICkKICAgICAgICAgKTsKIApAQCAtODkyLDcgKzEwODIsOCBAQAogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBhdWRpb191c2FnZV90IHVzYWdlID0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0U7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIHVzYWdlLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9OworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0KKyAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgdXNhZ2UsIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifTsKICAgICBzdGQ6OnN0cmluZyB0YWdzID0gc3RkOjpzdHJpbmcoImFkZHI9IikgKyBtTWl4QWRkcmVzczsKICAgICBzdHJuY3B5KGF0dHIudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLApAQCAtOTQxLDE3ICsxMTMyLDE5IEBACiAgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUE1peFJlY29yZEluamVjdGlvbiwKICAgICAgICAgdGVzdGluZzo6VmFsdWVzKAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9DQU1DT1JERVIsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0NBTUNPUkRFUiwgQVVESU9fRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywgQVVESU9fRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sIEFVRElPX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0KICAgICAgICAgICAgICAgICApCiAgICAgICAgICk7CkBAIC05NjIsMTQgKzExNTUsMTUgQEAKICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTWl4UmVjb3JkSW5qZWN0aW9uLAogICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfSE9UV09SRCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9IT1RXT1JELCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCBBVURJT19GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9IT1RXT1JELCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfSE9UV09SRCwgQVVESU9fRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifQogICAgICAgICAgICAgICAgICkKICAgICAgICAgKTsKIApAQCAtMTE4OCwzICsxMzgyLDEwOSBAQAogICAgIEVYUEVDVF9HVChtQ2xpZW50LT5nZXRBdWRpb1BvcnRMaXN0VXBkYXRlQ291bnQoKSwgcHJldkF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudCk7CiAgICAgRVhQRUNUX0dUKG1NYW5hZ2VyLT5nZXRBdWRpb1BvcnRHZW5lcmF0aW9uKCksIHByZXZBdWRpb1BvcnRHZW5lcmF0aW9uKTsKIH0KKwordXNpbmcgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0gPSBzdGQ6OnR1cGxlPGF1ZGlvX3NvdXJjZV90LCBkZXZpY2Vfcm9sZV90PjsKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0VGVzdAorICAgICAgICA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlLAorICAgICAgICAgIHB1YmxpYyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0+IHsKK3Byb3RlY3RlZDoKKyAgICAvLyBUaGUgYGlucHV0RGV2aWNlYCBhbmQgYGlucHV0RGV2aWNlMmAgaW5kaWNhdGUgdGhlIGF1ZGlvIGRldmljZXMgdHlwZSB0byBiZSB1c2VkIGZvciBzZXR0aW5nCisgICAgLy8gZGV2aWNlIHJvbGUuIFRoZXkgbXVzdCBiZSBkZWNsYXJlZCBpbiB0aGUgdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGlucHV0RGV2aWNlID0gQXVkaW9EZXZpY2VUeXBlQWRkcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMsICIiKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGlucHV0RGV2aWNlMiA9IEF1ZGlvRGV2aWNlVHlwZUFkZHIoQVVESU9fREVWSUNFX0lOX0hETUksICIiKTsKK307CisKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRUZXN0LCBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQpIHsKKyAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgIGNvbnN0IGRldmljZV9yb2xlX3Qgcm9sZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworCisgICAgLy8gVGVzdCBpbnZhbGlkIGRldmljZSB3aGVuIHNldHRpbmcKKyAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyIG91dHB1dERldmljZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsICIiKTsKKyAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIG91dHB1dERldmljZXMgPSB7b3V0cHV0RGV2aWNlfTsKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLAorICAgICAgICAgICAgICBtTWFuYWdlci0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBvdXRwdXREZXZpY2VzKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgb3V0cHV0RGV2aWNlcykpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICBBU1NFUlRfRVEoTkFNRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKKyAgICBBU1NFUlRfVFJVRShkZXZpY2VzLmVtcHR5KCkpOworICAgIEFTU0VSVF9FUShCQURfVkFMVUUsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIG91dHB1dERldmljZXMpKTsKKworICAgIC8vIFdpdGhvdXQgc2V0dGluZywgY2FsbCBnZXQvcmVtb3ZlL2NsZWFyIG11c3QgZmFpbAorICAgIEFTU0VSVF9FUShOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworICAgIEFTU0VSVF9FUShOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworICAgIEFTU0VSVF9FUShOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlKSk7CisKKyAgICAvLyBUZXN0IHNldC9nZXQgZGV2aWNlcyByb2xlCisgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBpbnB1dERldmljZXMgPSB7aW5wdXREZXZpY2V9OworICAgIEFTU0VSVF9FUShOT19FUlJPUiwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgaW5wdXREZXZpY2VzKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSk7CisgICAgRVhQRUNUX1RIQVQoZGV2aWNlcywgVW5vcmRlcmVkRWxlbWVudHNBcmUoaW5wdXREZXZpY2UpKTsKKworICAgIC8vIFRlc3Qgc2V0dGluZyB3aWxsIGNoYW5nZSB0aGUgcHJldmlvdXNseSBzZXQgZGV2aWNlcworICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgaW5wdXREZXZpY2VzMiA9IHtpbnB1dERldmljZTJ9OworICAgIEFTU0VSVF9FUShOT19FUlJPUiwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgaW5wdXREZXZpY2VzMikpOworICAgIGRldmljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXZpY2VzLCBVbm9yZGVyZWRFbGVtZW50c0FyZShpbnB1dERldmljZTIpKTsKKworICAgIC8vIFRlc3QgYWRkIGRldmljZXMKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5hZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGlucHV0RGV2aWNlcykpOworICAgIGRldmljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXZpY2VzLCBVbm9yZGVyZWRFbGVtZW50c0FyZShpbnB1dERldmljZSwgaW5wdXREZXZpY2UyKSk7CisKKyAgICAvLyBUZXN0IHJlbW92ZSBkZXZpY2VzCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLAorICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBpbnB1dERldmljZXMpKTsKKyAgICBkZXZpY2VzLmNsZWFyKCk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSk7CisgICAgRVhQRUNUX1RIQVQoZGV2aWNlcywgVW5vcmRlcmVkRWxlbWVudHNBcmUoaW5wdXREZXZpY2UyKSk7CisKKyAgICAvLyBUZXN0IHJlbW92ZSBkZXZpY2VzIHRoYXQgYXJlIG5vdCBzZXQgYXMgdGhlIGRldmljZSByb2xlCisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgaW5wdXREZXZpY2VzKSk7CisKKyAgICAvLyBUZXN0IGNsZWFyIGRldmljZXMKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5jbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSkpOworICAgIGRldmljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfRVEoTkFNRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldE9wZXJhdGlvbiwKKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0VGVzdCwKKyAgICAgICAgdGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfTUlDLCBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9DQUxMLCBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX0NBTUNPUkRFUiwgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfRk1fVFVORVIsIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfSE9UV09SRCwgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwCmluZGV4IGQ5NDc2ZDkuLjJmNmU5MjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwCkBAIC0zLDYgKzMsOCBAQAogICAgIHNyY3M6IFsKICAgICAgICAgInRlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIiwKICAgICAgICAgInRlc3RfYXVkaW9fcG9saWN5X3ByaW1hcnlfb25seV9jb25maWd1cmF0aW9uLnhtbCIsCisgICAgICAgICJ0ZXN0X2ludmFsaWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIiwKICAgICAgICAgInRlc3RfdHZfYXBtX2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICAgICAgInRlc3Rfc2V0dG9wX2JveF9zdXJyb3VuZF9jb25maWd1cmF0aW9uLnhtbCIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfaW52YWxpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2NDFkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMTEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIGFuIHVubmFtZWQgZGV2aWNlIHBvcnQgaW4gdGhlICJyX3N1Ym1peCIgbW9kdWxlIHNlY3Rpb24uIC0tPgorPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IG1vZHVsZSAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICAgICAgICAgIDxpdGVtPkJ1aWx0LUluIE1pYzwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1peHBvcnRfYnRfaGZwX291dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0ibWl4cG9ydF9idF9oZnBfaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTYwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgPC9taXhQb3J0cz4KKyAgICAgICAgICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRE1JIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaS1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9IRE1JIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08iIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPSJzaW5rIiBhZGRyZXNzPSJoZnBfY2xpZW50X291dCI+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIFNDTyBIZWFkc2V0IE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPSJzb3VyY2UiIGFkZHJlc3M9ImhmcF9jbGllbnRfaW4iPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEhkbWktSW4gTWljIi8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iSGRtaSIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBTQ08iCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9Im1peHBvcnRfYnRfaGZwX291dHB1dCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1peHBvcnRfYnRfaGZwX2lucHV0IgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBTQ08gSGVhZHNldCBNaWMiLz4KKyAgICAgICAgICAgIDwvcm91dGVzPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8IS0tIFJlbW90ZSBTdWJtaXggbW9kdWxlIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9InJfc3VibWl4IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5SZW1vdGUgU3VibWl4IEluPC9pdGVtPgorICAgICAgICAgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICA8bWl4UG9ydHM+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icl9zdWJtaXggb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJyX3N1Ym1peCBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgICAgICAgICA8IS0tIFRoaXMgcG9ydCBpcyBtaXNzaW5nICJ0YWdOYW1lIiBhdHRyaWJ1dGUuIC0tPgorICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdHlwZT0iQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iUmVtb3RlIFN1Ym1peCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlJlbW90ZSBTdWJtaXggT3V0IgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJyX3N1Ym1peCBvdXRwdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJyX3N1Ym1peCBpbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iUmVtb3RlIFN1Ym1peCBJbiIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisgICAgICAgIDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3Rfc2V0dG9wX2JveF9zdXJyb3VuZF9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X3NldHRvcF9ib3hfc3Vycm91bmRfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3Mzc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X3NldHRvcF9ib3hfc3Vycm91bmRfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CisgICAgICAgICAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgICAgIDxpdGVtPlN0dWI8L2l0ZW0+CisgICAgICAgICAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgIDxkZWZhdWx0T3V0cHV0RGV2aWNlPlN0dWI8L2RlZmF1bHRPdXRwdXREZXZpY2U+CisgICAgICAgICAgICA8bWl4UG9ydHM+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icHJpbWFyeSBwY20iIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9Im11bHRpY2hhbm5lbCBvdXRwdXQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiAvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgIDwvbWl4UG9ydHM+CisgICAgICAgICAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3R1YiIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TVFVCIiByb2xlPSJzaW5rIiAvPgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkhETUkiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSERNSSIgcm9sZT0ic2luayIgLz4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlN0dWIiIHNvdXJjZXM9InByaW1hcnkgcGNtIi8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iSERNSSIgc291cmNlcz0icHJpbWFyeSBwY20sbXVsdGljaGFubmVsIG91dHB1dCIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisgICAgICAgIDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggNTAxZDkyMi4uOGNiNDBlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCkBAIC0zMCw3ICszMCw2IEBACiAgICAgICAgICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCIsCiAgICAgICAgICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAiLAogICAgICAgICAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAiLAotICAgICAgICAiYXBpMS9DYW1lcmFDbGllbnQuY3BwIiwKICAgICAgICAgImFwaTEvQ2FtZXJhMkNsaWVudC5jcHAiLAogICAgICAgICAiYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIiwKICAgICAgICAgImFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAiLApAQCAtNDYsNyArNDUsNiBAQAogICAgICAgICAiYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAiLAogICAgICAgICAiYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcCIsCiAgICAgICAgICJhcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwIiwKLSAgICAgICAgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIiwKICAgICAgICAgImRldmljZTMvQnVmZmVyVXRpbHMuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwIiwKQEAgLTU0LDcgKzUyLDcgQEAKICAgICAgICAgImRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAiLAotICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAiLAogICAgICAgICAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCIsCkBAIC03MSwxMSArNjksMTMgQEAKICAgICAgICAgImhpZGwvQ29udmVydC5jcHAiLAogICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAiLAogICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAiLAogICAgICAgICAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwIiwKICAgICAgICAgInV0aWxzL0NhbWVyYVRyYWNlcy5jcHAiLAogICAgICAgICAidXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIiwKICAgICAgICAgInV0aWxzL0V4aWZVdGlscy5jcHAiLAogICAgICAgICAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAiLAorICAgICAgICAidXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5jcHAiLAogICAgICAgICAidXRpbHMvVGFnTW9uaXRvci5jcHAiLAogICAgICAgICAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAiLAogICAgIF0sCkBAIC0xMTcsMTIgKzExNywxMyBAQAogICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuY29tbW9uQDIuMCIsCiAgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMCIsCiAgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMSIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMiIsCiAgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZUAyLjEiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNiIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKaW5kZXggZTYyOWNkZC4uY2NkZDllNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKQEAgLTU5LDkgKzU5LDggQEAKICAgICBpZiAobVByb3ZpZGVyTWFuYWdlci0+c3VwcG9ydFNldFRvcmNoTW9kZShjYW1lcmFJZC5zdHJpbmcoKSkpIHsKICAgICAgICAgbUZsYXNoQ29udHJvbCA9IG5ldyBQcm92aWRlckZsYXNoQ29udHJvbChtUHJvdmlkZXJNYW5hZ2VyKTsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBPbmx5IEhBTDEgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBzZXRUb3JjaE1vZGUKLSAgICAgICAgbUZsYXNoQ29udHJvbCA9Ci0gICAgICAgICAgICAgICAgbmV3IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKG1Qcm92aWRlck1hbmFnZXIsIG1DYWxsYmFja3MpOworICAgICAgICBBTE9HRSgiRmxhc2hsaWdodCBjb250cm9sIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UhIik7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTMwOSwyNzEgKzMwOCw0IEBACiB9CiAvLyBQcm92aWRlckZsYXNoQ29udHJvbCBpbXBsZW1lbnRhdGlvbiBlbmRzCiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gYmVnaW5zCi0vLyBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjEKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1DYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2woCi0gICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKLSAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lciogY2FsbGJhY2tzKSA6Ci0gICAgICAgIG1Qcm92aWRlck1hbmFnZXIobWFuYWdlciksCi0gICAgICAgIG1DYWxsYmFja3MoY2FsbGJhY2tzKSwKLSAgICAgICAgbVRvcmNoRW5hYmxlZChmYWxzZSkgewotfQotCi1DYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6fkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKCkgewotICAgIGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKLQotICAgIG1TdXJmYWNlLmNsZWFyKCk7Ci0gICAgbVN1cmZhY2VUZXh0dXJlLmNsZWFyKCk7Ci0gICAgbVByb2R1Y2VyLmNsZWFyKCk7Ci0gICAgbUNvbnN1bWVyLmNsZWFyKCk7Ci0KLSAgICBpZiAobVRvcmNoRW5hYmxlZCkgewotICAgICAgICBpZiAobUNhbGxiYWNrcykgewotICAgICAgICAgICAgQUxPR1YoIiVzOiBub3RpZnkgdGhlIGZyYW1ld29yayB0aGF0IHRvcmNoIHdhcyB0dXJuZWQgb2ZmIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIG1DYWxsYmFja3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKG1DYW1lcmFJZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OnNldFRvcmNoTW9kZSgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLQotICAgIC8vIHByZS1jaGVjawotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBib29sIGhhc0ZsYXNoID0gZmFsc2U7Ci0gICAgICAgIC8vIENoZWNrIGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQgYW5kIGxlYXZlIGNhbWVyYSBkZXZpY2Ugb3Blbi4KLSAgICAgICAgcmVzID0gaGFzRmxhc2hVbml0TG9ja2VkKGNhbWVyYUlkLCAmaGFzRmxhc2gsIC8qa2VlcERldmljZU9wZW4qL3RydWUpOwotICAgICAgICAvLyBpbnZhbGlkIGNhbWVyYT8KLSAgICAgICAgaWYgKHJlcykgewotICAgICAgICAgICAgLy8gaGFzRmxhc2hVbml0TG9ja2VkKCkgcmV0dXJucyBCQURfSU5ERVggaWYgbURldmljZSBpcyBjb25uZWN0ZWQgdG8KLSAgICAgICAgICAgIC8vIGFub3RoZXIgY2FtZXJhIGRldmljZS4KLSAgICAgICAgICAgIHJldHVybiByZXMgPT0gQkFEX0lOREVYID8gQkFEX0lOREVYIDogLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICAvLyBubyBmbGFzaCB1bml0PwotICAgICAgICBpZiAoIWhhc0ZsYXNoKSB7Ci0gICAgICAgICAgICAvLyBEaXNjb25uZWN0IGNhbWVyYSBkZXZpY2UgaWYgaXQgaGFzIG5vIGZsYXNoLgotICAgICAgICAgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOwotICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgPT0gTlVMTCB8fCBjYW1lcmFJZCAhPSBtQ2FtZXJhSWQpIHsKLSAgICAgICAgLy8gZGlzYWJsaW5nIHRoZSB0b3JjaCBtb2RlIG9mIGFuIHVuLW9wZW5lZCBvciBkaWZmZXJlbnQgZGV2aWNlLgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZGlzYWJsaW5nIHRoZSB0b3JjaCBtb2RlIG9mIGN1cnJlbnRseSBvcGVuZWQgZGV2aWNlCi0gICAgICAgIGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKLSAgICAgICAgbVRvcmNoRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICBtQ2FsbGJhY2tzLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChjYW1lcmFJZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJlcyA9IHN0YXJ0UHJldmlld0FuZFRvcmNoKCk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIG1Ub3JjaEVuYWJsZWQgPSB0cnVlOwotICAgIG1DYWxsYmFja3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6aGFzRmxhc2hVbml0KAotICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgLy8gQ2xvc2UgZGV2aWNlIGFmdGVyIGNoZWNraW5nIGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQuCi0gICAgcmV0dXJuIGhhc0ZsYXNoVW5pdExvY2tlZChjYW1lcmFJZCwgaGFzRmxhc2gsIC8qa2VlcERldmljZU9wZW4qL2ZhbHNlKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6Omhhc0ZsYXNoVW5pdExvY2tlZCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoLCBib29sIGtlZXBEZXZpY2VPcGVuKSB7Ci0gICAgYm9vbCBjbG9zZUNhbWVyYURldmljZSA9IGZhbHNlOwotCi0gICAgaWYgKCFoYXNGbGFzaCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAobURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIENvbm5lY3QgdG8gY2FtZXJhIGRldmljZSB0byBxdWVyeSBpZiBpdCBoYXMgYSBmbGFzaCB1bml0LgotICAgICAgICByZXMgPSBjb25uZWN0Q2FtZXJhRGV2aWNlKGNhbWVyYUlkKTsKLSAgICAgICAgaWYgKHJlcykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICAvLyBDbG9zZSBjYW1lcmEgZGV2aWNlIG9ubHkgd2hlbiBpdCBpcyBqdXN0IG9wZW5lZCBhbmQgdGhlIGNhbGxlciBkb2Vzbid0IHdhbnQgdG8ga2VlcAotICAgICAgICAvLyB0aGUgY2FtZXJhIGRldmljZSBvcGVuLgotICAgICAgICBjbG9zZUNhbWVyYURldmljZSA9ICFrZWVwRGV2aWNlT3BlbjsKLSAgICB9Ci0KLSAgICBpZiAoY2FtZXJhSWQgIT0gbUNhbWVyYUlkKSB7Ci0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqZmxhc2hNb2RlID0KLSAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTKTsKLSAgICBpZiAoZmxhc2hNb2RlICYmIHN0cnN0cihmbGFzaE1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfVE9SQ0gpKSB7Ci0gICAgICAgICpoYXNGbGFzaCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmhhc0ZsYXNoID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGNsb3NlQ2FtZXJhRGV2aWNlKSB7Ci0gICAgICAgIHJlcyA9IGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZGlzY29ubmVjdCBjYW1lcmEgZGV2aWNlLiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpzdGFydFByZXZpZXdBbmRUb3JjaCgpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLSAgICByZXMgPSBtRGV2aWNlLT5zdGFydFByZXZpZXcoKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogc3RhcnQgcHJldmlldyBmYWlsZWQuICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgbVBhcmFtZXRlcnMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAotICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9UT1JDSCk7Ci0KLSAgICByZXR1cm4gbURldmljZS0+c2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpnZXRTbWFsbGVzdFN1cmZhY2VTaXplKAotICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7Ci0gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaW50MzJfdCB3ID0gSU5UMzJfTUFYOwotICAgIGludDMyX3QgaCA9IDE7Ci0gICAgVmVjdG9yPFNpemU+IHNpemVzOwotCi0gICAgbVBhcmFtZXRlcnMuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKHNpemVzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIFNpemUgcyA9IHNpemVzW2ldOwotICAgICAgICBpZiAodyAqIGggPiBzLndpZHRoICogcy5oZWlnaHQpIHsKLSAgICAgICAgICAgIHcgPSBzLndpZHRoOwotICAgICAgICAgICAgaCA9IHMuaGVpZ2h0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHcgPT0gSU5UMzJfTUFYKSB7Ci0gICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICAqd2lkdGggPSB3OwotICAgICpoZWlnaHQgPSBoOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6aW5pdGlhbGl6ZVByZXZpZXdXaW5kb3coCi0gICAgICAgIGNvbnN0IHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiYgZGV2aWNlLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotICAgIHN0YXR1c190IHJlczsKLSAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7Ci0KLSAgICBtU3VyZmFjZVRleHR1cmUgPSBuZXcgR0xDb25zdW1lcihtQ29uc3VtZXIsIDAsIEdMQ29uc3VtZXI6OlRFWFRVUkVfRVhURVJOQUwsCi0gICAgICAgICAgICB0cnVlLCB0cnVlKTsKLSAgICBpZiAobVN1cmZhY2VUZXh0dXJlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKLSAgICByZXMgPSBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmVzID0gbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KGZvcm1hdCk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVByb2R1Y2VyLCAvKnVzZUFzeW5jKi8gdHJ1ZSk7Ci0gICAgaWYgKG1TdXJmYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICByZXMgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1TdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGV2aWNlLT5zZXRQcmV2aWV3V2luZG93KG1TdXJmYWNlKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OmNvbm5lY3RDYW1lcmFEZXZpY2UoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7Ci0gICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGRldmljZSA9Ci0gICAgICAgICAgICBuZXcgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoY2FtZXJhSWQuc3RyaW5nKCkpOwotCi0gICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlLT5pbml0aWFsaXplKG1Qcm92aWRlck1hbmFnZXIpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBpbml0aWFsaXppbmcgY2FtZXJhICVzIGZhaWxlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLy8gbmVlZCB0byBzZXQgX19nZXRfbWVtb3J5IGluIHNldF9jYWxsYmFja3MoKS4KLSAgICBkZXZpY2UtPnNldENhbGxiYWNrcyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotICAgIG1QYXJhbWV0ZXJzID0gZGV2aWNlLT5nZXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgcmVzID0gZ2V0U21hbGxlc3RTdXJmYWNlU2l6ZSgmd2lkdGgsICZoZWlnaHQpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gZ2V0IHNtYWxsZXN0IHN1cmZhY2Ugc2l6ZSBmb3IgY2FtZXJhICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBpbml0aWFsaXplUHJldmlld1dpbmRvdyhkZXZpY2UsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcmV2aWV3IHdpbmRvdyBmb3IgY2FtZXJhICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBtQ2FtZXJhSWQgPSBjYW1lcmFJZDsKLSAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OmRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG1QYXJhbWV0ZXJzLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSkpIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgYSBmbGFzaCwgdHVybiBpZiBvZmYuCi0gICAgICAgIC8vIChJZiB0aGVyZSBpc24ndCBvbmUsIGxlYXZlIHRoZSBwYXJhbWV0ZXIgbnVsbCkKLSAgICAgICAgbVBhcmFtZXRlcnMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAotICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKLSAgICAgICAgbURldmljZS0+c2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7Ci0gICAgfQotICAgIG1EZXZpY2UtPnN0b3BQcmV2aWV3KCk7Ci0gICAgc3RhdHVzX3QgcmVzID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtU3VyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBBTE9HVygiJXM6IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgIH0KLSAgICBtRGV2aWNlLT5zZXRQcmV2aWV3V2luZG93KE5VTEwpOwotICAgIG1EZXZpY2UtPnJlbGVhc2UoKTsKLSAgICBtRGV2aWNlID0gTlVMTDsKLQotICAgIHJldHVybiBPSzsKLX0KLS8vIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sIGltcGxlbWVudGF0aW9uIGVuZHMKLQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oCmluZGV4IDFiYWFiYTIuLmI5N2ZhNWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKLSNpbmNsdWRlICJkZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgiCi0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMjQsNTkgKzEyMiw2IEBACiAgICAgICAgIE11dGV4IG1Mb2NrOwogfTsKIAotLyoqCi0gKiBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjEKLSAqLwotY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgOiBwdWJsaWMgRmxhc2hDb250cm9sQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgKLSAgICAgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lciogY2FsbGJhY2tzKTsKLSAgICAgICAgdmlydHVhbCB+Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2woKTsKLQotICAgICAgICAvLyBGbGFzaENvbnRyb2xCYXNlCi0gICAgICAgIHN0YXR1c190IHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKTsKLSAgICAgICAgc3RhdHVzX3QgaGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBjb25uZWN0IHRvIGEgY2FtZXJhIGRldmljZQotICAgICAgICBzdGF0dXNfdCBjb25uZWN0Q2FtZXJhRGV2aWNlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKLQotICAgICAgICAvLyBkaXNjb25uZWN0IGFuZCBmcmVlIG1EZXZpY2UKLSAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdENhbWVyYURldmljZSgpOwotCi0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHByZXZpZXcgd2luZG93Ci0gICAgICAgIHN0YXR1c190IGluaXRpYWxpemVQcmV2aWV3V2luZG93KGNvbnN0IHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiYgZGV2aWNlLAotICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKLQotICAgICAgICAvLyBzdGFydCBwcmV2aWV3IGFuZCBlbmFibGUgdG9yY2gKLSAgICAgICAgc3RhdHVzX3Qgc3RhcnRQcmV2aWV3QW5kVG9yY2goKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHNtYWxsZXN0IHN1cmZhY2UKLSAgICAgICAgc3RhdHVzX3QgZ2V0U21hbGxlc3RTdXJmYWNlU2l6ZShpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KTsKLQotICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKLSAgICAgICAgLy8gSWYgdGhpcyBmdW5jdGlvbiBvcGVucyBjYW1lcmEgZGV2aWNlIGluIG9yZGVyIHRvIGNoZWNrIGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQsIHRoZQotICAgICAgICAvLyBjYW1lcmEgZGV2aWNlIHdpbGwgcmVtYWluIG9wZW4gaWYga2VlcERldmljZU9wZW4gaXMgdHJ1ZSBhbmQgdGhlIGNhbWVyYSBkZXZpY2Ugd2lsbCBiZQotICAgICAgICAvLyBjbG9zZWQgaWYga2VlcERldmljZU9wZW4gaXMgZmFsc2UuIElmIGNhbWVyYSBkZXZpY2UgaXMgYWxyZWFkeSBvcGVuIHdoZW4gY2FsbGluZyB0aGlzCi0gICAgICAgIC8vIGZ1bmN0aW9uLCBrZWVwRGV2aWNlT3BlbiBpcyBpZ25vcmVkLgotICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoLCBib29sIGtlZXBEZXZpY2VPcGVuKTsKLQotICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7Ci0gICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXIqIG1DYWxsYmFja3M7Ci0gICAgICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBtRGV2aWNlOwotICAgICAgICBTdHJpbmc4IG1DYW1lcmFJZDsKLSAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBtUGFyYW1ldGVyczsKLSAgICAgICAgYm9vbCBtVG9yY2hFbmFibGVkOwotCi0gICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gIG1Db25zdW1lcjsKLSAgICAgICAgc3A8R0xDb25zdW1lcj4gbVN1cmZhY2VUZXh0dXJlOwotICAgICAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLQotICAgICAgICBNdXRleCBtTG9jazsKLX07Ci0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IGFmMWUwMWQuLjg0MDBkYWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8YmluZGVyL0FjdGl2aXR5TWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CkBAIC03MCwxMiArNjksMTIgQEAKICNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYTJDbGllbnQuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKIAogbmFtZXNwYWNlIHsKICAgICBjb25zdCBjaGFyKiBrUGVybWlzc2lvblNlcnZpY2VOYW1lID0gInBlcm1pc3Npb24iOwpAQCAtODgsNyArODcsNiBAQAogdXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmE7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYUNsaWVudDsKLXVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzOwpAQCAtMTM1LDkgKzEzMyw2IEBACiBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1ZlbmRvckNsaWVudFN0YXRlID0gMTsKIGNvbnN0IFN0cmluZzggQ2FtZXJhU2VydmljZTo6a09mZmxpbmVEZXZpY2UoIm9mZmxpbmUtIik7CiAKLU11dGV4IENhbWVyYVNlcnZpY2U6OnNQcm94eU11dGV4Owotc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IENhbWVyYVNlcnZpY2U6OnNDYW1lcmFTZXJ2aWNlUHJveHk7Ci0KIENhbWVyYVNlcnZpY2U6OkNhbWVyYVNlcnZpY2UoKSA6CiAgICAgICAgIG1FdmVudExvZyhERUZBVUxUX0VWRU5UX0xPR19MRU5HVEgpLAogICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzKDApLApAQCAtMTc5LDcgKzE3NCw3IEBACiAKICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGxhc3QgY2FsbCBpbiB0aGlzIGZ1bmN0aW9uLCBzbyB0aGF0IGl0J3MgYXMgY2xvc2UgdG8KICAgICAvLyBTZXJ2aWNlTWFuYWdlcjo6YWRkU2VydmljZSgpIGFzIHBvc3NpYmxlLgotICAgIENhbWVyYVNlcnZpY2U6OnBpbmdDYW1lcmFTZXJ2aWNlUHJveHkoKTsKKyAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpwaW5nQ2FtZXJhU2VydmljZVByb3h5KCk7CiAgICAgQUxPR0koIkNhbWVyYVNlcnZpY2UgcGluZ2VkIGNhbWVyYXNlcnZpY2UgcHJveHkiKTsKIH0KIApAQCAtMjI5LDI5ICsyMjQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhU2VydmljZVByb3h5KCkgewotI2lmbmRlZiBfX0JSSUxMT19fCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNQcm94eU11dGV4KTsKLSAgICBpZiAoc0NhbWVyYVNlcnZpY2VQcm94eSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgLy8gVXNlIGNoZWNrU2VydmljZSBiZWNhdXNlIGNhbWVyYXNlcnZlciBub3JtYWxseSBzdGFydHMgYmVmb3JlIHRoZQotICAgICAgICAvLyBzeXN0ZW0gc2VydmVyIGFuZCB0aGUgcHJveHkgc2VydmljZS4gU28gdGhlIGxvbmcgdGltZW91dCB0aGF0IGdldFNlcnZpY2UKLSAgICAgICAgLy8gaGFzIGJlZm9yZSBnaXZpbmcgdXAgaXMgaW5hcHByb3ByaWF0ZS4KLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmNoZWNrU2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhLnByb3h5IikpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlUHJveHkgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZVByb3h5PihiaW5kZXIpOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIHNDYW1lcmFTZXJ2aWNlUHJveHk7Ci19Ci0KLXZvaWQgQ2FtZXJhU2VydmljZTo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpIHsKLSAgICBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBwcm94eUJpbmRlciA9IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOwotICAgIGlmIChwcm94eUJpbmRlciA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgcHJveHlCaW5kZXItPnBpbmdGb3JVc2VyVXBkYXRlKCk7Ci19Ci0KIHZvaWQgQ2FtZXJhU2VydmljZTo6YnJvYWRjYXN0VG9yY2hNb2RlU3RhdHVzKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXMgc3RhdHVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CiAKQEAgLTY3OSw5ICs2NTEsMTUgQEAKICAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwgY2FtZXJhSW5mbyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIlVuYWJsZSB0byByZXRyaWV2ZSBjYW1lcmEgIgotICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBpZiAocmVzID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVW5hYmxlIHRvIHJldHJpZXZlIGNhbWVyYSAiCisgICAgICAgICAgICAgICAgICAgICJjaGFyYWN0ZXJpc3RpY3MgZm9yIHVua25vd24gZGV2aWNlICVzOiAlcyAoJWQpIiwgU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sICJVbmFibGUgdG8gcmV0cmlldmUgY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICAgImNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwgU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CiAgICAgfQogICAgIFN5c3RlbUNhbWVyYUtpbmQgZGV2aWNlS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICBpZiAoZ2V0U3lzdGVtQ2FtZXJhS2luZChTdHJpbmc4KGNhbWVyYUlkKSwgJmRldmljZUtpbmQpICE9IE9LKSB7CkBAIC04MDIsMzUgKzc4MCwyNiBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgZmVhdHVyZUlkLCAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCiAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKLSAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgIC8vIERlZmF1bHQgcGF0aDogSEFMIHZlcnNpb24gaXMgdW5zcGVjaWZpZWQgYnkgY2FsbGVyLCBjcmVhdGUgQ2FtZXJhQ2xpZW50Ci0gICAgICAgIC8vIGJhc2VkIG9uIGRldmljZSB2ZXJzaW9uIHJlcG9ydGVkIGJ5IHRoZSBIQUwuCi0gICAgICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgICAgICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeyAgLy8gQ2FtZXJhMSBBUEkgcm91dGUKLSAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwotICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCi0gICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfREVQUkVDQVRFRF9IQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBcIiVzXCIgSEFMIHZlcnNpb24gJWQgZG9lcyBub3Qgc3VwcG9ydCBjYW1lcmEyIEFQSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICB9CisgICAgLy8gQ3JlYXRlIENhbWVyYUNsaWVudCBiYXNlZCBvbiBkZXZpY2UgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgSEFMLgorICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIHVzaW5nIG9sZCBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RFUFJFQ0FURURfSEFMLAorICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBcIiVzXCIgSEFMIHZlcnNpb24gJWQgbm8gbG9uZ2VyIHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBkZXZpY2VWZXJzaW9uKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzY6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzY6CiAgICAgICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgLy8gQ2FtZXJhMSBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBmZWF0dXJlSWQsCkBAIC04NDQsMzIgKzgxMywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgYmUgcmVhY2hhYmxlCiAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwogICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIFwiJXNcIiBoYXMgdW5rbm93biBIQUwgdmVyc2lvbiAlZCIsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEEgcGFydGljdWxhciBIQUwgdmVyc2lvbiBpcyByZXF1ZXN0ZWQgYnkgY2FsbGVyLiBDcmVhdGUgQ2FtZXJhQ2xpZW50Ci0gICAgICAgIC8vIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgSEFMIHZlcnNpb24uCi0gICAgICAgIGlmIChkZXZpY2VWZXJzaW9uID4gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgJiYKLSAgICAgICAgICAgIGhhbFZlcnNpb24gPT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKLSAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydCBoaWdoZXIgSEFMIHZlcnNpb24gZGV2aWNlIG9wZW5lZCBhcyBIQUwxLjAgZGV2aWNlLgotICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKLSAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICAgICAgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE90aGVyIGNvbWJpbmF0aW9ucyAoZS5nLiBIQUwzLnggb3BlbiBhcyBIQUwyLngpIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBIQUwgdmVyc2lvbiAleDogSEFMICV4IGRldmljZSBjYW4gb25seSBiZSIKLSAgICAgICAgICAgICAgICAgICAgIiBvcGVuZWQgYXMgSEFMICV4IGRldmljZSIsIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIFwiJXNcIiAoSEFMIHZlcnNpb24gJWQpIGNhbm5vdCBiZSBvcGVuZWQgYXMgSEFMIHZlcnNpb24gJWQiLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbiwgaGFsVmVyc2lvbik7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KQEAgLTk1Nyw4ICs5MDYsNyBAQAogICAgIHNwPENsaWVudD4gdG1wID0gbnVsbHB0cjsKICAgICBpZiAoIShyZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PigKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+e251bGxwdHJ9LCBpZCwgY2FtZXJhSWQsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQpLAotICAgICAgICAgICAgaW50ZXJuYWxQYWNrYWdlTmFtZSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKKyAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHt9LCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKICAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluaXRpYWxpemluZyBzaGltIG1ldGFkYXRhOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKQEAgLTE0NzYsMzQgKzE0MjQsNyBAQAogICAgIFN0cmluZzggaWQgPSBjYW1lcmFJZEludFRvU3RyKGFwaTFDYW1lcmFJZCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwKLSAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksCi0gICAgICAgICAgICBjbGllbnRVaWQsIGNsaWVudFBpZCwgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7Ci0KLSAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCi0gICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAqZGV2aWNlID0gY2xpZW50OwotICAgIHJldHVybiByZXQ7Ci19Ci0KLVN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0TGVnYWN5KAotICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPElDYW1lcmE+KiBkZXZpY2UpIHsKLQotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU3RyaW5nOCBpZCA9IGNhbWVyYUlkSW50VG9TdHIoYXBpMUNhbWVyYUlkKTsKLQotICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7Ci0gICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwotICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCB7fSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAogICAgICAgICAgICAgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7CkBAIC0xNTQ1LDggKzE0NjYsOSBAQAogICAgIGludCBjVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQgPSBTeXN0ZW1DYW1lcmFLaW5kOjpQVUJMSUM7CiAgICAgaWYgKGdldFN5c3RlbUNhbWVyYUtpbmQoY2FtZXJhSWQsICZzeXN0ZW1DYW1lcmFLaW5kKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGlkICVzLCAiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgLy8gVGhpcyBpc24ndCBhIGtub3duIGNhbWVyYSBJRCwgc28gaXQncyBub3QgYSBzeXN0ZW0gY2FtZXJhCisgICAgICAgIEFMT0dWKCIlczogVW5rbm93biBjYW1lcmEgaWQgJXMsICIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyAoMSkgQ2FtZXJhc2VydmVyIHRyeWluZyB0byBjb25uZWN0LCBhY2NlcHQuCkBAIC0xNTc4LDcgKzE1MDAsNyBAQAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIGNhbWVyYUNiLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4qIGRldmljZSkgewpAQCAtMTU5NSw4ICsxNTE3LDcgQEAKICAgICAgICAgY2xpZW50UGFja2FnZU5hbWVBZGogPSBTdHJpbmcxNih2ZW5kb3JDbGllbnQuY19zdHIoKSk7CiAgICAgfQogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MsQ2FtZXJhRGV2aWNlQ2xpZW50PihjYW1lcmFDYiwgaWQsCi0gICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsCi0gICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZUFkaiwgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgLyphcGkxQ2FtZXJhSWQqLy0xLCBjbGllbnRQYWNrYWdlTmFtZUFkaiwgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKQEAgLTE2MTEsOCArMTUzMiw4IEBACiAKIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCiAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKSB7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CkBAIC0xNjIxLDEyICsxNTQyLDE1IEBACiAKICAgICBpbnQgb3JpZ2luYWxDbGllbnRQaWQgPSAwOwogCi0gICAgQUxPR0koIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgY2FsbCAoUElEICVkIFwiJXNcIiwgY2FtZXJhIElEICVzKSBmb3IgSEFMIHZlcnNpb24gJXMgYW5kICIKKyAgICBBTE9HSSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBjYWxsIChQSUQgJWQgXCIlc1wiLCBjYW1lcmEgSUQgJXMpIGFuZCAiCiAgICAgICAgICAgICAiQ2FtZXJhIEFQSSB2ZXJzaW9uICVkIiwgY2xpZW50UGlkLCBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2FtZXJhSWQuc3RyaW5nKCksCi0gICAgICAgICAgICAoaGFsVmVyc2lvbiA9PSAtMSkgPyAiZGVmYXVsdCIgOiBzdGQ6OnRvX3N0cmluZyhoYWxWZXJzaW9uKS5jX3N0cigpLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihlZmZlY3RpdmVBcGlMZXZlbCkpOwogCisgICAgbnNlY3NfdCBvcGVuVGltZU5zID0gc3lzdGVtVGltZSgpOworCiAgICAgc3A8Q0xJRU5UPiBjbGllbnQgPSBudWxscHRyOworICAgIGludCBmYWNpbmcgPSAtMTsKKyAgICBib29sIGlzTmRrID0gKGNsaWVudFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKTsKICAgICB7CiAgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gbG9jayA9CkBAIC0xNjkxLDcgKzE2MTUsNiBAQAogICAgICAgICAvLyBnaXZlIGZsYXNobGlnaHQgYSBjaGFuY2UgdG8gY2xvc2UgZGV2aWNlcyBpZiBuZWNlc3NhcnkuCiAgICAgICAgIG1GbGFzaGxpZ2h0LT5wcmVwYXJlRGV2aWNlT3BlbihjYW1lcmFJZCk7CiAKLSAgICAgICAgaW50IGZhY2luZyA9IC0xOwogICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsIC8qb3V0Ki8mZmFjaW5nKTsKICAgICAgICAgaWYgKGZhY2luZyA9PSAtMSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGNhbWVyYSBkZXZpY2UgXCIlc1wiICBmYWNpbmciLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKQEAgLTE3MDMsNyArMTYyNiw3IEBACiAgICAgICAgIGlmKCEocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLAotICAgICAgICAgICAgICAgIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mdG1wKSkuaXNPaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CkBAIC0xNzc2LDYgKzE2OTksMTEgQEAKICAgICAvLyBJbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMKICAgICAvLyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKICAgICBkZXZpY2UgPSBjbGllbnQ7CisKKyAgICBpbnQzMl90IG9wZW5MYXRlbmN5TXMgPSBuczJtcyhzeXN0ZW1UaW1lKCkgLSBvcGVuVGltZU5zKTsKKyAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dPcGVuKGNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgZWZmZWN0aXZlQXBpTGV2ZWwsIGlzTmRrLCBvcGVuTGF0ZW5jeU1zKTsKKwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTI3MTQsNyArMjY0Miw3IEBACiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCkBAIC0yNzUxLDI0ICsyNjc5LDE4IEBACiAKIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpCYXNpY0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIG1DYW1lcmFJZFN0cihjYW1lcmFJZFN0ciksIG1DYW1lcmFGYWNpbmcoY2FtZXJhRmFjaW5nKSwKLSAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKGNsaWVudFBhY2thZ2VOYW1lKSwgbUNsaWVudEZlYXR1cmVJZChjbGllbnRGZWF0dXJlSWQpLAogICAgICAgICBtQ2xpZW50UGlkKGNsaWVudFBpZCksIG1DbGllbnRVaWQoY2xpZW50VWlkKSwKICAgICAgICAgbVNlcnZpY2VQaWQoc2VydmljZVBpZCksCiAgICAgICAgIG1EaXNjb25uZWN0ZWQoZmFsc2UpLCBtVWlkSXNUcnVzdGVkKGZhbHNlKSwKICAgICAgICAgbUF1ZGlvUmVzdHJpY3Rpb24oaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpBVURJT19SRVNUUklDVElPTl9OT05FKSwKICAgICAgICAgbVJlbW90ZUJpbmRlcihyZW1vdGVDYWxsYmFjaykKIHsKLSAgICBpZiAoY2xpZW50RmVhdHVyZUlkKSB7Ci0gICAgICAgIG1DbGllbnRGZWF0dXJlSWQgPSBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KG5ldyBTdHJpbmcxNigqY2xpZW50RmVhdHVyZUlkKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUNsaWVudEZlYXR1cmVJZCA9IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKTsKLSAgICB9Ci0KICAgICBpZiAoc0NhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgewogICAgICAgICBzQ2FtZXJhU2VydmljZSA9IGNhbWVyYVNlcnZpY2U7CiAgICAgfQpAQCAtMjkzOSwxNCArMjg2MSw2IEBACiAgICAgLy8gVHJhbnNpdGlvbiBkZXZpY2UgYXZhaWxhYmlsaXR5IGxpc3RlbmVycyBmcm9tIFBSRVNFTlQgLT4gTk9UX0FWQUlMQUJMRQogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoU3RhdHVzSW50ZXJuYWw6Ok5PVF9BVkFJTEFCTEUsIG1DYW1lcmFJZFN0cik7CiAKLSAgICBpbnQgYXBpTGV2ZWwgPSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xOwotICAgIGlmIChjYW5DYXN0VG9BcGlDbGllbnQoQVBJXzIpKSB7Ci0gICAgICAgIGFwaUxldmVsID0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMjsKLSAgICB9Ci0gICAgLy8gVHJhbnNpdGlvbiBkZXZpY2Ugc3RhdGUgdG8gT1BFTgotICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKElDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9PUEVOLAotICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsIGFwaUxldmVsKTsKLQogICAgIHNDYW1lcmFTZXJ2aWNlLT5tVWlkUG9saWN5LT5yZWdpc3Rlck1vbml0b3JVaWQobUNsaWVudFVpZCk7CiAKICAgICAvLyBOb3RpZnkgbGlzdGVuZXJzIG9mIGNhbWVyYSBvcGVuL2Nsb3NlIHN0YXR1cwpAQCAtMjk3NSwxNCArMjg4OSw2IEBACiAgICAgICAgIC8vIFRyYW5zaXRpb24gdG8gUFJFU0VOVCBpZiB0aGUgY2FtZXJhIGlzIG5vdCBpbiBlaXRoZXIgb2YgdGhlIHJlamVjdGVkIHN0YXRlcwogICAgICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlU3RhdHVzKFN0YXR1c0ludGVybmFsOjpQUkVTRU5ULAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgcmVqZWN0ZWQpOwotCi0gICAgICAgIGludCBhcGlMZXZlbCA9IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzE7Ci0gICAgICAgIGlmIChjYW5DYXN0VG9BcGlDbGllbnQoQVBJXzIpKSB7Ci0gICAgICAgICAgICBhcGlMZXZlbCA9IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVHJhbnNpdGlvbiBkZXZpY2Ugc3RhdGUgdG8gQ0xPU0VECi0gICAgICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKElDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9DTE9TRUQsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsIGFwaUxldmVsKTsKICAgICB9CiAgICAgLy8gQWx3YXlzIHN0b3Agd2F0Y2hpbmcsIGV2ZW4gaWYgbm8gY2FtZXJhIG9wIGlzIGFjdGl2ZQogICAgIGlmIChtT3BzQ2FsbGJhY2sgIT0gbnVsbHB0ciAmJiBtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CkBAIC0zNzUxLDkgKzM2NTcsMTQgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIC8vIENvbGxlY3QgdGhlIGxvZ2ljYWwgY2FtZXJhcyB3aXRob3V0IGhvbGRpbmcgbVN0YXR1c0xvY2sgaW4gdXBkYXRlU3RhdHVzCisgICAgLy8gYXMgdGhhdCBjYW4gbGVhZCB0byBhIGRlYWRsb2NrKGIvMTYyMTkyMzMxKS4KKyAgICBhdXRvIGxvZ2ljYWxDYW1lcmFJZHMgPSBnZXRMb2dpY2FsQ2FtZXJhcyhjYW1lcmFJZCk7CiAgICAgLy8gVXBkYXRlIHRoZSBzdGF0dXMgZm9yIHRoaXMgY2FtZXJhIHN0YXRlLCB0aGVuIHNlbmQgdGhlIG9uU3RhdHVzQ2hhbmdlZENhbGxiYWNrcyB0byBlYWNoCiAgICAgLy8gb2YgdGhlIGxpc3RlbmVycyB3aXRoIGJvdGggdGhlIG1TdGF0dXNMb2NrIGFuZCBtU3RhdHVzTGlzdGVuZXJMb2NrIGhlbGQKLSAgICBzdGF0ZS0+dXBkYXRlU3RhdHVzKHN0YXR1cywgY2FtZXJhSWQsIHJlamVjdFNvdXJjZVN0YXRlcywgW3RoaXMsICZkZXZpY2VLaW5kLCAmc3VwcG9ydHNIQUwzXQorICAgIHN0YXRlLT51cGRhdGVTdGF0dXMoc3RhdHVzLCBjYW1lcmFJZCwgcmVqZWN0U291cmNlU3RhdGVzLCBbdGhpcywgJmRldmljZUtpbmQsICZzdXBwb3J0c0hBTDMsCisgICAgICAgICAgICAgICAgICAgICAgICAmbG9naWNhbENhbWVyYUlkc10KICAgICAgICAgICAgIChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgU3RhdHVzSW50ZXJuYWwgc3RhdHVzKSB7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzSW50ZXJuYWw6OkVOVU1FUkFUSU5HKSB7CkBAIC0zNzczLDggKzM2ODQsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKLQotICAgICAgICAgICAgbm90aWZ5UGh5c2ljYWxDYW1lcmFTdGF0dXNMb2NrZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgY2FtZXJhSWQsIGRldmljZUtpbmQpOworICAgICAgICAgICAgbm90aWZ5UGh5c2ljYWxDYW1lcmFTdGF0dXNMb2NrZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTYoY2FtZXJhSWQpLAorICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWRzLCBkZXZpY2VLaW5kKTsKIAogICAgICAgICAgICAgZm9yIChhdXRvJiBsaXN0ZW5lciA6IG1MaXN0ZW5lckxpc3QpIHsKICAgICAgICAgICAgICAgICBib29sIGlzVmVuZG9yTGlzdGVuZXIgPSBsaXN0ZW5lci0+aXNWZW5kb3JMaXN0ZW5lcigpOwpAQCAtMzg1NywxNCArMzc2OCw2IEBACiAgICAgb25TdGF0dXNVcGRhdGVkTG9ja2VkKGNhbWVyYUlkLCBzdGF0dXMpOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoaW50IG5ld1N0YXRlLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGZhY2luZywgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCkgewotICAgIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IHByb3h5QmluZGVyID0gZ2V0Q2FtZXJhU2VydmljZVByb3h5KCk7Ci0gICAgaWYgKHByb3h5QmluZGVyID09IG51bGxwdHIpIHJldHVybjsKLSAgICBTdHJpbmcxNiBpZChjYW1lcmFJZCk7Ci0gICAgcHJveHlCaW5kZXItPm5vdGlmeUNhbWVyYVN0YXRlKGlkLCBuZXdTdGF0ZSwgZmFjaW5nLCBjbGllbnROYW1lLCBhcGlMZXZlbCk7Ci19Ci0KIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldFRvcmNoU3RhdHVzTG9ja2VkKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgVG9yY2hNb2RlU3RhdHVzICpzdGF0dXMpIGNvbnN0IHsKQEAgLTM4OTIsOCArMzc5NSw5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6Om5vdGlmeVBoeXNpY2FsQ2FtZXJhU3RhdHVzTG9ja2VkKGludDMyX3Qgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kKSB7CitzdGQ6Omxpc3Q8U3RyaW5nMTY+IENhbWVyYVNlcnZpY2U6OmdldExvZ2ljYWxDYW1lcmFzKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkKSB7CisgICAgc3RkOjpsaXN0PFN0cmluZzE2PiByZXRMaXN0OwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0YXRlIDogbUNhbWVyYVN0YXRlcykgewogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CkBAIC0zOTAxLDI2ICszODA1LDM5IEBACiAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgY2FtZXJhSWQuY19zdHIoKSkKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKQogICAgICAgICAgICAgICAgID09IHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7CiAgICAgICAgICAgICAvLyBjYW1lcmFJZCBpcyBub3QgYSBwaHlzaWNhbCBjYW1lcmEgb2YgdGhpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nMTYgaWQxNihzdGF0ZS5maXJzdCksIHBoeXNpY2FsSWQxNihjYW1lcmFJZCk7CisgICAgICAgIHJldExpc3QuZW1wbGFjZV9iYWNrKFN0cmluZzE2KHN0YXRlLmZpcnN0KSk7CisgICAgfQorICAgIHJldHVybiByZXRMaXN0OworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6Om5vdGlmeVBoeXNpY2FsQ2FtZXJhU3RhdHVzTG9ja2VkKGludDMyX3Qgc3RhdHVzLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxDYW1lcmFJZCwgY29uc3Qgc3RkOjpsaXN0PFN0cmluZzE2PiYgbG9naWNhbENhbWVyYUlkcywKKyAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kKSB7CisgICAgLy8gbVN0YXR1c0xpc3RlbmVyTG9jayBpcyBleHBlY3RlZCB0byBiZSBsb2NrZWQKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGxvZ2ljYWxDYW1lcmFJZCA6IGxvZ2ljYWxDYW1lcmFJZHMpIHsKICAgICAgICAgZm9yIChhdXRvJiBsaXN0ZW5lciA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IHdlIGNoZWNrIG9ubHkgdGhlIGRldmljZUtpbmQgb2YgdGhlIHBoeXNpY2FsIGNhbWVyYSBpZAorICAgICAgICAgICAgLy8gc2luY2UsIGxvZ2ljYWwgY2FtZXJhIGlkcyBhbmQgdGhlaXIgcGh5c2ljYWwgY2FtZXJhIGlkcyBhcmUKKyAgICAgICAgICAgIC8vIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgc2FtZSBzeXN0ZW0gY2FtZXJhIGtpbmQuCiAgICAgICAgICAgICBpZiAoc2hvdWxkU2tpcFN0YXR1c1VwZGF0ZXMoZGV2aWNlS2luZCwgbGlzdGVuZXItPmlzVmVuZG9yTGlzdGVuZXIoKSwKICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXItPmdldExpc3RlbmVyUGlkKCksIGxpc3RlbmVyLT5nZXRMaXN0ZW5lclVpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJTa2lwcGluZyBkaXNjb3ZlcnkgY2FsbGJhY2sgZm9yIHN5c3RlbS1vbmx5IGNhbWVyYSBkZXZpY2UgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHBoeXNpY2FsQ2FtZXJhSWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbGlzdGVuZXItPmdldExpc3RlbmVyKCktPm9uUGh5c2ljYWxDYW1lcmFTdGF0dXNDaGFuZ2VkKHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgaWQxNiwgcGh5c2ljYWxJZDE2KTsKKyAgICAgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLCBwaHlzaWNhbENhbWVyYUlkKTsKICAgICAgICAgfQogICAgIH0KIH0KIAorCiB2b2lkIENhbWVyYVNlcnZpY2U6OmJsb2NrQ2xpZW50c0ZvclVpZCh1aWRfdCB1aWQpIHsKICAgICBjb25zdCBhdXRvIGNsaWVudHMgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKTsKICAgICBmb3IgKGF1dG8mIGN1cnJlbnQgOiBjbGllbnRzKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggNDMyMTIwMS4uZDI2YzYyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtNDksOCArNDgsMTAgQEAKIAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgpAQCAtNjksNyArNzAsNiBAQAogICAgIHB1YmxpYyB2aXJ0dWFsIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXIKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxDYW1lcmFTZXJ2aWNlPjsKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhQ2xpZW50OwogICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDsKIHB1YmxpYzoKICAgICBjbGFzcyBDbGllbnQ7CkBAIC0xMzMsMTUgKzEzMyw5IEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYT4qIGRldmljZSk7CiAKLSAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgICBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwgaW50MzJfdCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQzMl90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhPiogZGV2aWNlKTsKLQogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgIGNvbm5lY3REZXZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiogZGV2aWNlKTsKQEAgLTIxNiwxNiArMjEwLDYgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgIGxvYWRTb3VuZExvY2tlZChzb3VuZF9raW5kIGtpbmQpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgZGVjcmVhc2VTb3VuZFJlZigpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgaW5jcmVhc2VTb3VuZFJlZigpOwotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBnaXZlbiBjYW1lcmEgZGV2aWNlIChvcGVuL2Nsb3NlL2FjdGl2ZS9pZGxlKSB3aXRoCi0gICAgICogdGhlIGNhbWVyYSBwcm94eSBzZXJ2aWNlIGluIHRoZSBzeXN0ZW0gc2VydmljZQotICAgICAqLwotICAgIHN0YXRpYyB2b2lkICAgICAgICAgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKLSAgICAgICAgICAgIGludCBuZXdTdGF0ZSwKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICAgICAgaW50IGZhY2luZywKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnROYW1lLAotICAgICAgICAgICAgaW50IGFwaUxldmVsKTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENhbWVyYURldmljZUZhY3RvcnkgZnVuY3Rpb25hbGl0eQpAQCAtMjk4LDcgKzI4Miw3IEBACiAgICAgICAgIEJhc2ljQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWRTdHIsCiAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLApAQCAtMzE4LDcgKzMwMiw3IEBACiAgICAgICAgIGNvbnN0IFN0cmluZzggICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyOwogICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFGYWNpbmc7CiAgICAgICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lOwotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+ICAgICAgIG1DbGllbnRGZWF0dXJlSWQ7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+ICAgICAgICAgbUNsaWVudEZlYXR1cmVJZDsKICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7CiAgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VQaWQ7CkBAIC0zOTAsNyArMzc0LDcgQEAKICAgICAgICAgQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC03MjcsOCArNzExLDggQEAKICAgICAvLyBTaW5nbGUgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJldHdlZW4gdGhlIHZhcmlvdXMgY29ubmVjdCBjYWxscwogICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiAgICAgYmluZGVyOjpTdGF0dXMgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCisgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwogCiAgICAgLy8gTG9jayBndWFyZGluZyBjYW1lcmEgc2VydmljZSBzdGF0ZQpAQCAtMTAwNSw4ICs5ODksMTMgQEAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIHN0YXR1cyk7CiAKICAgICAvLyBub3RpZnkgcGh5c2ljYWwgY2FtZXJhIHN0YXR1cyB3aGVuIHRoZSBwaHlzaWNhbCBjYW1lcmEgaXMgcHVibGljLgotICAgIHZvaWQgbm90aWZ5UGh5c2ljYWxDYW1lcmFTdGF0dXNMb2NrZWQoaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kKTsKKyAgICAvLyBFeHBlY3RzIG1TdGF0dXNMaXN0ZW5lckxvY2sgdG8gYmUgbG9ja2VkLgorICAgIHZvaWQgbm90aWZ5UGh5c2ljYWxDYW1lcmFTdGF0dXNMb2NrZWQoaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PFN0cmluZzE2PiYgbG9naWNhbENhbWVyYUlkcywgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kKTsKKworICAgIC8vIGdldCBsaXN0IG9mIGxvZ2ljYWwgY2FtZXJhcyB3aGljaCBhcmUgYmFja2VkIGJ5IHBoeXNpY2FsQ2FtZXJhSWQKKyAgICBzdGQ6Omxpc3Q8U3RyaW5nMTY+IGdldExvZ2ljYWxDYW1lcmFzKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQpOworCiAKICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKQEAgLTEwNTcsOCArMTA0Niw4IEBACiAKICAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgZmVhdHVyZUlkLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGFwaTFDYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCisgICAgICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAogICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKIApAQCAtMTA2OSwxMyArMTA1OCw2IEBACiAgICAgc3RhdGljIFN0YXR1c0ludGVybmFsIG1hcFRvSW50ZXJuYWwoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKTsKICAgICBzdGF0aWMgaW50MzJfdCBtYXBUb0ludGVyZmFjZShTdGF0dXNJbnRlcm5hbCBzdGF0dXMpOwogCi0gICAgLy8gR3VhcmQgbUNhbWVyYVNlcnZpY2VQcm94eQotICAgIHN0YXRpYyBNdXRleCBzUHJveHlNdXRleDsKLSAgICAvLyBDYWNoZWQgaW50ZXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZSBwcm94eSBpbiBzeXN0ZW0gc2VydmljZQotICAgIHN0YXRpYyBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eT4gc0NhbWVyYVNlcnZpY2VQcm94eTsKLQotICAgIHN0YXRpYyBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eT4gZ2V0Q2FtZXJhU2VydmljZVByb3h5KCk7Ci0gICAgc3RhdGljIHZvaWQgcGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOwogCiAgICAgdm9pZCBicm9hZGNhc3RUb3JjaE1vZGVTdGF0dXMoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HCmluZGV4IDZmZGFjNjguLmNhNmNjNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcKQEAgLTEsNyArMSwxMiBAQAogewogICAicHJlc3VibWl0IjogWwogICAgIHsKLSAgICAgICAibmFtZSI6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiCisgICAgICAibmFtZSI6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiCisgICAgfQorICBdLAorICAiaW1wb3J0cyI6IFsKKyAgICB7CisgICAgICAicGF0aCI6ICJmcmFtZXdvcmtzL2F2L2NhbWVyYSIKICAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IGIwNDNjMGIuLjY2MmI1OGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcApAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKIAogI2RlZmluZSBBTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIEFMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKQEAgLTUwLDcgKzUxLDcgQEAKIENhbWVyYTJDbGllbnQ6OkNhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhRGV2aWNlSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC0zOTYsNiArMzk3LDcgQEAKIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhMkNsaWVudDo6ZGlzY29ubmVjdCgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIG5zZWNzX3Qgc3RhcnRUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwpAQCAtNDU3LDYgKzQ1OSw5IEBACiAKICAgICBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKIAorICAgIGludDMyX3QgY2xvc2VMYXRlbmN5TXMgPSBuczJtcyhzeXN0ZW1UaW1lKCkgLSBzdGFydFRpbWUpOworICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0Nsb3NlKG1DYW1lcmFJZFN0ciwgY2xvc2VMYXRlbmN5TXMpOworCiAgICAgcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCAwM2NhNDRhLi5mOGRhMGI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtOTQsNyArOTQsNyBAQAogICAgIENhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFEZXZpY2VJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTI5OTZjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhQ2xpZW50IgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotCi0jaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKLSNpbmNsdWRlICJkZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgotI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBMT0cxKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDEsIF9fVkFfQVJHU19fKTsKLSNkZWZpbmUgTE9HMiguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAyLCBfX1ZBX0FSR1NfXyk7Ci0KLUNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKLSAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQpOgotICAgICAgICBDbGllbnQoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCksIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCi17Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwotICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwotCi0gICAgbUhhcmR3YXJlID0gTlVMTDsKLSAgICBtTXNnRW5hYmxlZCA9IDA7Ci0gICAgbVN1cmZhY2UgPSAwOwotICAgIG1QcmV2aWV3V2luZG93ID0gMDsKLSAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkID0gZmFsc2U7Ci0KLSAgICAvLyBDYWxsYmFjayBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwotICAgIG1PcmllbnRhdGlvbiA9IGdldE9yaWVudGF0aW9uKDAsIG1DYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7Ci0gICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwotICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAotICAgICAgICBjb25zdCBTdHJpbmc4JiAvKm1vbml0b3JUYWdzKi8pIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7Ci0gICAgc3RhdHVzX3QgcmVzOwotCi0gICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplIEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgbUNhbWVyYUlkKTsKLQotICAgIC8vIFZlcmlmeSBvcHMgcGVybWlzc2lvbnMKLSAgICByZXMgPSBzdGFydENhbWVyYU9wcygpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBjaGFyIGNhbWVyYV9kZXZpY2VfbmFtZVsxMF07Ci0gICAgc25wcmludGYoY2FtZXJhX2RldmljZV9uYW1lLCBzaXplb2YoY2FtZXJhX2RldmljZV9uYW1lKSwgIiVkIiwgbUNhbWVyYUlkKTsKLQotICAgIG1IYXJkd2FyZSA9IG5ldyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShjYW1lcmFfZGV2aWNlX25hbWUpOwotICAgIHJlcyA9IG1IYXJkd2FyZS0+aW5pdGlhbGl6ZShtYW5hZ2VyKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgbUhhcmR3YXJlLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgbUhhcmR3YXJlLT5zZXRDYWxsYmFja3Mobm90aWZ5Q2FsbGJhY2ssCi0gICAgICAgICAgICBkYXRhQ2FsbGJhY2ssCi0gICAgICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAsCi0gICAgICAgICAgICBoYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoLAotICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1DYW1lcmFJZCk7Ci0KLSAgICAvLyBFbmFibGUgem9vbSwgZXJyb3IsIGZvY3VzLCBhbmQgbWV0YWRhdGEgbWVzc2FnZXMgYnkgZGVmYXVsdAotICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19FUlJPUiB8IENBTUVSQV9NU0dfWk9PTSB8IENBTUVSQV9NU0dfRk9DVVMgfAotICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19QUkVWSUVXX01FVEFEQVRBIHwgQ0FNRVJBX01TR19GT0NVU19NT1ZFKTsKLQotICAgIExPRzEoIkNhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZSBYIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIG1DYW1lcmFJZCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLS8vIHRlYXIgZG93biB0aGUgY2xpZW50Ci1DYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQoKSB7Ci0gICAgbURlc3RydWN0aW9uU3RhcnRlZCA9IHRydWU7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwotICAgIExPRzEoIkNhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCBFIChwaWQgJWQsIHRoaXMgJXApIiwgY2FsbGluZ1BpZCwgdGhpcyk7Ci0KLSAgICBkaXNjb25uZWN0KCk7Ci0gICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewotICAgIHJldHVybiBCYXNpY0NsaWVudDo6ZHVtcChmZCwgYXJncyk7Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6ZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNpemVfdCBsZW4gPSBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDbGllbnRbJWRdICglcCkgd2l0aCBVSUQgJWRcbiIsCi0gICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICAoZ2V0UmVtb3RlQ2FsbGJhY2soKSAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkgOiBOVUxMKSwKLSAgICAgICAgICAgIG1DbGllbnRVaWQpOwotICAgIGxlbiA9IChsZW4gPiBTSVpFIC0gMSkgPyBTSVpFIC0gMSA6IGxlbjsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBsZW4pOwotCi0gICAgbGVuID0gc25wcmludGYoYnVmZmVyLCBTSVpFLCAiTGF0ZXN0IHNldCBwYXJhbWV0ZXJzOlxuIik7Ci0gICAgbGVuID0gKGxlbiA+IFNJWkUgLSAxKSA/IFNJWkUgLSAxIDogbGVuOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIGxlbik7Ci0KLSAgICBtTGF0ZXN0U2V0UGFyYW1ldGVycy5kdW1wKGZkLCBhcmdzKTsKLQotICAgIGNvbnN0IGNoYXIgKmVuZGR1bXAgPSAiXG5cbiI7Ci0gICAgd3JpdGUoZmQsIGVuZGR1bXAsIHN0cmxlbihlbmRkdW1wKSk7Ci0KLSAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gaGFyZHdhcmUgPSBtSGFyZHdhcmU7Ci0gICAgaWYgKGhhcmR3YXJlICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIGhhcmR3YXJlLT5kdW1wKGZkLCBhcmdzKTsKLSAgICB9Ci0gICAgQUxPR0koIiVzOiBjYW1lcmEgZGV2aWNlIGNsb3NlZCBhbHJlYWR5LCBza2lwIGR1bXBpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBPSzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNoZWNrUGlkKCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKLSAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICBBTE9HVygiYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKLSAgICAgICAgICIgKG9sZCBwaWQgJWQsIG5ldyBwaWQgJWQpIiwgbUNsaWVudFBpZCwgY2FsbGluZ1BpZCk7Ci0gICAgcmV0dXJuIEVCVVNZOwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNoZWNrUGlkQW5kSGFyZHdhcmUoKSBjb25zdCB7Ci0gICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLAotICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmxvY2soKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwotICAgIExPRzEoImxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICAvLyBsb2NrIGNhbWVyYSB0byB0aGlzIGNsaWVudCBpZiB0aGUgdGhlIGNhbWVyYSBpcyB1bmxvY2tlZAotICAgIGlmIChtQ2xpZW50UGlkID09IDApIHsKLSAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm5zIE5PX0VSUk9SIGlmIHRoZSBjbGllbnQgYWxyZWFkeSBvd25zIHRoZSBjYW1lcmEsIEVCVVNZIG90aGVyd2lzZQotICAgIHJldHVybiBjaGVja1BpZCgpOwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnVubG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7Ci0gICAgTE9HMSgidW5sb2NrIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgLy8gYWxsb3cgYW55b25lIHRvIHVzZSBjYW1lcmEgKGFmdGVyIHRoZXkgbG9jayB0aGUgY2FtZXJhKQotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICBpZiAobUhhcmR3YXJlLT5yZWNvcmRpbmdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJOb3QgYWxsb3dlZCB0byB1bmxvY2sgY2FtZXJhIGR1cmluZyByZWNvcmRpbmcuIik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgbUNsaWVudFBpZCA9IDA7Ci0gICAgICAgIExPRzEoImNsZWFyIG1SZW1vdGVDYWxsYmFjayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIElDYW1lcmFDbGllbnQgc28gdGhhdCB3aGVuIHRoZSBhcHAKLSAgICAgICAgLy8gZ29lcyBhd2F5LCB0aGUgcmVmZXJlbmNlIGNvdW50IGdvZXMgdG8gMC4KLSAgICAgICAgbVJlbW90ZUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIGNvbm5lY3QgYSBuZXcgY2xpZW50IHRvIHRoZSBjYW1lcmEKLXN0YXR1c190IENhbWVyYUNsaWVudDo6Y29ubmVjdChjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNsaWVudCkgewotICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKLSAgICBMT0cxKCJjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUNsaWVudFBpZCAhPSAwICYmIGNoZWNrUGlkKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNvbm5lY3QgdG8gYSBsb2NrZWQgY2FtZXJhIChvbGQgcGlkICVkLCBuZXcgcGlkICVkKSIsCi0gICAgICAgICAgICAgICAgbUNsaWVudFBpZCwgY2FsbGluZ1BpZCk7Ci0gICAgICAgIHJldHVybiBFQlVTWTsKLSAgICB9Ci0KLSAgICBpZiAobVJlbW90ZUNhbGxiYWNrICE9IDAgJiYKLSAgICAgICAgKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobVJlbW90ZUNhbGxiYWNrKSkpIHsKLSAgICAgICAgTE9HMSgiQ29ubmVjdCB0byB0aGUgc2FtZSBjbGllbnQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKLSAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKLSAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQ7Ci0KLSAgICBMT0cxKCJjb25uZWN0IFggKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2Nvbm5lY3RXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIHdpbmRvdykgewotICAgIGlmICh3aW5kb3cgIT0gMCkgewotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KHdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygibmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzdWx0KSwKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYmluZGVyOjpTdGF0dXMgQ2FtZXJhQ2xpZW50OjpkaXNjb25uZWN0KCkgewotICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKLSAgICBMT0cxKCJkaXNjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKLSAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIGNhbWVyYXNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwotICAgIGlmIChjYWxsaW5nUGlkICE9IG1DbGllbnRQaWQgJiYgY2FsbGluZ1BpZCAhPSBtU2VydmljZVBpZCkgewotICAgICAgICBBTE9HVygiZGlmZmVyZW50IGNsaWVudCAtIGRvbid0IGRpc2Nvbm5lY3QiKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgZGlzY29ubmVjdCgpIGlzIGRvbmUgb25jZSBhbmQgb25jZSBvbmx5LCB3aGV0aGVyIGl0IGlzIGNhbGxlZAotICAgIC8vIGZyb20gdGhlIHVzZXIgZGlyZWN0bHksIG9yIGNhbGxlZCBieSB0aGUgZGVzdHJ1Y3Rvci4KLSAgICBpZiAobUhhcmR3YXJlID09IDApIHJldHVybiByZXM7Ci0KLSAgICBMT0cxKCJoYXJkd2FyZSB0ZWFyZG93biIpOwotICAgIC8vIEJlZm9yZSBkZXN0cm95aW5nIG1IYXJkd2FyZSwgd2UgbXVzdCBtYWtlIHN1cmUgaXQncyBpbiB0aGUKLSAgICAvLyBpZGxlIHN0YXRlLgotICAgIC8vIFR1cm4gb2ZmIGFsbCBtZXNzYWdlcy4KLSAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX0FMTF9NU0dTKTsKLSAgICBtSGFyZHdhcmUtPnN0b3BQcmV2aWV3KCk7Ci0gICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoCi0gICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0lETEUsCi0gICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpOwotICAgIG1IYXJkd2FyZS0+Y2FuY2VsUGljdHVyZSgpOwotICAgIC8vIFJlbGVhc2UgdGhlIGhhcmR3YXJlIHJlc291cmNlcy4KLSAgICBtSGFyZHdhcmUtPnJlbGVhc2UoKTsKLQotICAgIC8vIFJlbGVhc2UgdGhlIGhlbGQgQU5hdGl2ZVdpbmRvdyByZXNvdXJjZXMuCi0gICAgaWYgKG1QcmV2aWV3V2luZG93ICE9IDApIHsKLSAgICAgICAgZGlzY29ubmVjdFdpbmRvdyhtUHJldmlld1dpbmRvdyk7Ci0gICAgICAgIG1QcmV2aWV3V2luZG93ID0gMDsKLSAgICAgICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KG1QcmV2aWV3V2luZG93KTsKLSAgICB9Ci0gICAgbUhhcmR3YXJlLmNsZWFyKCk7Ci0KLSAgICBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKLQotICAgIExPRzEoImRpc2Nvbm5lY3QgWCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwKLSAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIHdpbmRvdykgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKLQotICAgIC8vIHJldHVybiBpZiBubyBjaGFuZ2UgaW4gc3VyZmFjZS4KLSAgICBpZiAoYmluZGVyID09IG1TdXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAod2luZG93ICE9IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdCh3aW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXN1bHQpLAotICAgICAgICAgICAgICAgICAgICByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHByZXZpZXcgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkLCByZWdpc3RlciBwcmV2aWV3IGJ1ZmZlcnMgbm93LgotICAgIGlmIChtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKLSAgICAgICAgaWYgKHdpbmRvdyAhPSAwKSB7Ci0gICAgICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdTY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOwotICAgICAgICAgICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3VHJhbnNmb3JtKG1PcmllbnRhdGlvbik7Ci0gICAgICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cod2luZG93KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy8gRXZlcnl0aGluZyBoYXMgc3VjY2VlZGVkLiAgRGlzY29ubmVjdCB0aGUgb2xkIHdpbmRvdyBhbmQgcmVtZW1iZXIgdGhlCi0gICAgICAgIC8vIG5ldyB3aW5kb3cuCi0gICAgICAgIGRpc2Nvbm5lY3RXaW5kb3cobVByZXZpZXdXaW5kb3cpOwotICAgICAgICBtU3VyZmFjZSA9IGJpbmRlcjsKLSAgICAgICAgbVByZXZpZXdXaW5kb3cgPSB3aW5kb3c7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgYWZ0ZXIgd2UgY29ubmVjdGVkIHRvIHRoZSBuZXcgd2luZG93LCBzbwotICAgICAgICAvLyBkaXNjb25uZWN0IGhlcmUuCi0gICAgICAgIGRpc2Nvbm5lY3RXaW5kb3cod2luZG93KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzZXQgdGhlIGJ1ZmZlciBjb25zdW1lciB0aGF0IHRoZSBwcmV2aWV3IHdpbGwgdXNlCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdUYXJnZXQoCi0gICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcikgewotICAgIExPRzEoInNldFByZXZpZXdUYXJnZXQoJXApIChwaWQgJWQpIiwgYnVmZmVyUHJvZHVjZXIuZ2V0KCksCi0gICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKLQotICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKLSAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7Ci0gICAgaWYgKGJ1ZmZlclByb2R1Y2VyICE9IDApIHsKLSAgICAgICAgYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpOwotICAgICAgICAvLyBVc2luZyBjb250cm9sbGVkQnlBcHAgZmxhZyB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIHF1ZXVlIHJlbWFpbnMgaW4KLSAgICAgICAgLy8gYXN5bmMgbW9kZSBmb3IgdGhlIG9sZCBjYW1lcmEgQVBJLCB3aGVyZSBtYW55IGFwcGxpY2F0aW9ucyBkZXBlbmQKLSAgICAgICAgLy8gb24gdGhhdCBiZWhhdmlvci4KLSAgICAgICAgd2luZG93ID0gbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7Ci0gICAgfQotICAgIHJldHVybiBzZXRQcmV2aWV3V2luZG93KGJpbmRlciwgd2luZG93KTsKLX0KLQotLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KLS8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCi12b2lkIENhbWVyYUNsaWVudDo6c2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgY2FsbGJhY2tfZmxhZykgewotICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKLQotICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gY2FsbGJhY2tfZmxhZzsKLSAgICBpZiAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykgewotICAgICAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UHJldmlld0NhbGxiYWNrVGFyZ2V0KAotICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgY2FsbGJhY2tQcm9kdWNlcikgewotICAgICh2b2lkKWNhbGxiYWNrUHJvZHVjZXI7Ci0gICAgQUxPR0UoIiVzOiBVbmltcGxlbWVudGVkISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi0vLyBzdGFydCBwcmV2aWV3IG1vZGUKLXN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRQcmV2aWV3KCkgewotICAgIExPRzEoInN0YXJ0UHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1BSRVZJRVdfTU9ERSk7Ci19Ci0KLS8vIHN0YXJ0IHJlY29yZGluZyBtb2RlCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnN0YXJ0UmVjb3JkaW5nKCkgewotICAgIExPRzEoInN0YXJ0UmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0gICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUkVDT1JESU5HX01PREUpOwotfQotCi0vLyBzdGFydCBwcmV2aWV3IG9yIHJlY29yZGluZwotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydENhbWVyYU1vZGUoY2FtZXJhX21vZGUgbW9kZSkgewotICAgIExPRzEoInN0YXJ0Q2FtZXJhTW9kZSglZCkiLCBtb2RlKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICBzd2l0Y2gobW9kZSkgewotICAgICAgICBjYXNlIENBTUVSQV9QUkVWSUVXX01PREU6Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCAmJiBtUHJldmlld1dpbmRvdyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HMSgibVN1cmZhY2UgaXMgbm90IHNldCB5ZXQuIik7Ci0gICAgICAgICAgICAgICAgLy8gc3RpbGwgYWJsZSB0byBzdGFydCBwcmV2aWV3IGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGFydFByZXZpZXdNb2RlKCk7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1JFQ09SRElOR19NT0RFOgotICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDAgJiYgbVByZXZpZXdXaW5kb3cgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtU3VyZmFjZSBvciBtUHJldmlld1dpbmRvdyBtdXN0IGJlIHNldCBiZWZvcmUgc3RhcnRSZWNvcmRpbmdNb2RlLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGFydFJlY29yZGluZ01vZGUoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFByZXZpZXdNb2RlKCkgewotICAgIExPRzEoInN0YXJ0UHJldmlld01vZGUiKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19FUlJPUjsKLQotICAgIC8vIGlmIHByZXZpZXcgaGFzIGJlZW4gZW5hYmxlZCwgbm90aGluZyBuZWVkcyB0byBiZSBkb25lCi0gICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKG1QcmV2aWV3V2luZG93ICE9IDApIHsKLSAgICAgICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3U2NhbGluZ01vZGUoCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOwotICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdUcmFuc2Zvcm0obU9yaWVudGF0aW9uKTsKLSAgICB9Ci0gICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KG1QcmV2aWV3V2luZG93KTsKLSAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOwotICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoCi0gICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0FDVElWRSwKLSAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRSZWNvcmRpbmdNb2RlKCkgewotICAgIExPRzEoInN0YXJ0UmVjb3JkaW5nTW9kZSIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOwotCi0gICAgLy8gaWYgcmVjb3JkaW5nIGhhcyBiZWVuIGVuYWJsZWQsIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQotICAgIGlmIChtSGFyZHdhcmUtPnJlY29yZGluZ0VuYWJsZWQoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gaWYgcHJldmlldyBoYXMgbm90IGJlZW4gc3RhcnRlZCwgc3RhcnQgcHJldmlldyBmaXJzdAotICAgIGlmICghbUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHN0YXJ0UHJldmlld01vZGUoKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHN0YXJ0IHJlY29yZGluZyBtb2RlCi0gICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKTsKLSAgICBzQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKENhbWVyYVNlcnZpY2U6OlNPVU5EX1JFQ09SRElOR19TVEFSVCk7Ci0gICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zdGFydFJlY29yZGluZygpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIm1IYXJkd2FyZS0+c3RhcnRSZWNvcmRpbmcoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzdG9wIHByZXZpZXcgbW9kZQotdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BQcmV2aWV3KCkgewotICAgIExPRzEoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKLQotCi0gICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICBtSGFyZHdhcmUtPnN0b3BQcmV2aWV3KCk7Ci0gICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoCi0gICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfU1RBVEVfSURMRSwKLSAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpOwotICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7Ci19Ci0KLS8vIHN0b3AgcmVjb3JkaW5nIG1vZGUKLXZvaWQgQ2FtZXJhQ2xpZW50OjpzdG9wUmVjb3JkaW5nKCkgewotICAgIExPRzEoInN0b3BSZWNvcmRpbmcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwotCi0gICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpOwotICAgICAgICBtSGFyZHdhcmUtPnN0b3BSZWNvcmRpbmcoKTsKLSAgICAgICAgc0NhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChDYW1lcmFTZXJ2aWNlOjpTT1VORF9SRUNPUkRJTkdfU1RPUCk7Ci0KLSAgICAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnNMb2NrKTsKLSAgICAgICAgaWYgKCFtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gcmVsZWFzZSBhIHJlY29yZGluZyBmcmFtZQotdm9pZCBDYW1lcmFDbGllbnQ6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKLSAgICBpZiAobWVtID09IG51bGxwdHIpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coQ2FtZXJhU2VydmljZTo6U05fRVZFTlRfTE9HX0lELCAiMjYxNjQyNzIiLAotICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUhhcmR3YXJlLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUobWVtKTsKLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgewotICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzcDxJTWVtb3J5PiBkYXRhUHRyOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVyc0xvY2spOwotICAgICAgICBpZiAoIW1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICAgICAgZGF0YVB0ciA9IG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnMuYmFjaygpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVycy5wb3BfYmFjaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGRhdGFQdHIgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6ICVkOiBObyBjYWxsYmFjayBidWZmZXIgYXZhaWxhYmxlLiBEcm9wcGluZyBhIG5hdGl2ZSBoYW5kbGUuIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIF9fTElORV9fKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChkYXRhUHRyLT5zaXplKCkgIT0gc2l6ZW9mKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogJWQ6IENhbGxiYWNrIGJ1ZmZlciBzaXplIGRvZXNuJ3QgbWF0Y2ggVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBfX0xJTkVfXyk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSGFyZHdhcmUgIT0gbnVsbHB0cikgewotICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhICptZXRhZGF0YSA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoZGF0YVB0ci0+dW5zZWN1cmVQb2ludGVyKCkpOwotICAgICAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOwotICAgICAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgbUhhcmR3YXJlLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZGF0YVB0cik7Ci0gICAgfQotfQotCi12b2lkIENhbWVyYUNsaWVudDo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgYm9vbCBkaXNjb25uZWN0ZWQgPSAobUhhcmR3YXJlID09IG51bGxwdHIpOwotICAgIHNpemVfdCBuID0gaGFuZGxlcy5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4+IGZyYW1lczsKLSAgICBpZiAoIWRpc2Nvbm5lY3RlZCkgewotICAgICAgICBmcmFtZXMucmVzZXJ2ZShuKTsKLSAgICB9Ci0gICAgYm9vbCBlcnJvciA9IGZhbHNlOwotICAgIGZvciAoYXV0byYgaGFuZGxlIDogaGFuZGxlcykgewotICAgICAgICBzcDxJTWVtb3J5PiBkYXRhUHRyOwotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzTG9jayk7Ci0gICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGRhdGFQdHIgPSBtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzLmJhY2soKTsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzLnBvcF9iYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YVB0ciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVkOiBObyBjYWxsYmFjayBidWZmZXIgYXZhaWxhYmxlLiBEcm9wcGluZyBmcmFtZXMuIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhUHRyLT5zaXplKCkgIT0gc2l6ZW9mKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVkOiBDYWxsYmFjayBidWZmZXIgbXVzdCBiZSBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZGlzY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhICptZXRhZGF0YSA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoZGF0YVB0ci0+dW5zZWN1cmVQb2ludGVyKCkpOwotICAgICAgICAgICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKLSAgICAgICAgICAgIG1ldGFkYXRhLT5wSGFuZGxlID0gaGFuZGxlOwotICAgICAgICAgICAgZnJhbWVzLnB1c2hfYmFjayhkYXRhUHRyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXMpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFkaXNjb25uZWN0ZWQpIHsKLSAgICAgICAgbUhhcmR3YXJlLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWVCYXRjaChmcmFtZXMpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0VmlkZW9CdWZmZXJNb2RlKGludDMyX3QgdmlkZW9CdWZmZXJNb2RlKSB7Ci0gICAgTE9HMSgic2V0VmlkZW9CdWZmZXJNb2RlOiAlZCIsIHZpZGVvQnVmZmVyTW9kZSk7Ci0gICAgYm9vbCBlbmFibGVNZXRhZGF0YUluQnVmZmVycyA9IGZhbHNlOwotCi0gICAgaWYgKHZpZGVvQnVmZmVyTW9kZSA9PSBWSURFT19CVUZGRVJfTU9ERV9EQVRBX0NBTExCQUNLX01FVEFEQVRBKSB7Ci0gICAgICAgIGVuYWJsZU1ldGFkYXRhSW5CdWZmZXJzID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHZpZGVvQnVmZmVyTW9kZSAhPSBWSURFT19CVUZGRVJfTU9ERV9EQVRBX0NBTExCQUNLX1lVVikgewotICAgICAgICBBTE9HRSgiJXM6ICVkOiB2aWRlb0J1ZmZlck1vZGUgJWQgaXMgbm90IHN1cHBvcnRlZC4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAotICAgICAgICAgICAgICAgIHZpZGVvQnVmZmVyTW9kZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1IYXJkd2FyZS0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhlbmFibGVNZXRhZGF0YUluQnVmZmVycyk7Ci19Ci0KLWJvb2wgQ2FtZXJhQ2xpZW50OjpwcmV2aWV3RW5hYmxlZCgpIHsKLSAgICBMT0cxKCJwcmV2aWV3RW5hYmxlZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gbUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpOwotfQotCi1ib29sIENhbWVyYUNsaWVudDo6cmVjb3JkaW5nRW5hYmxlZCgpIHsKLSAgICBMT0cxKCJyZWNvcmRpbmdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBtSGFyZHdhcmUtPnJlY29yZGluZ0VuYWJsZWQoKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjphdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICByZXR1cm4gbUhhcmR3YXJlLT5hdXRvRm9jdXMoKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjYW5jZWxBdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICByZXR1cm4gbUhhcmR3YXJlLT5jYW5jZWxBdXRvRm9jdXMoKTsKLX0KLQotLy8gdGFrZSBhIHBpY3R1cmUgLSBpbWFnZSBpcyByZXR1cm5lZCBpbiBjYWxsYmFjawotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgewotICAgIExPRzEoInRha2VQaWN0dXJlIChwaWQgJWQpOiAweCV4IiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbXNnVHlwZSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICBpZiAoKG1zZ1R5cGUgJiBDQU1FUkFfTVNHX1JBV19JTUFHRSkgJiYKLSAgICAgICAgKG1zZ1R5cGUgJiBDQU1FUkFfTVNHX1JBV19JTUFHRV9OT1RJRlkpKSB7Ci0gICAgICAgIEFMT0dFKCJDQU1FUkFfTVNHX1JBV19JTUFHRSBhbmQgQ0FNRVJBX01TR19SQVdfSU1BR0VfTk9USUZZIgotICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIGJvdGggZW5hYmxlZCIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIFdlIG9ubHkgYWNjZXB0IHBpY3R1cmUgcmVsYXRlZCBtZXNzYWdlIHR5cGVzCi0gICAgLy8gYW5kIGlnbm9yZSBvdGhlciB0eXBlcyBvZiBtZXNzYWdlcyBmb3IgdGFrZVBpY3R1cmUoKS4KLSAgICBpbnQgcGljTXNnVHlwZSA9IG1zZ1R5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICYgKENBTUVSQV9NU0dfU0hVVFRFUiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfUkFXX0lNQUdFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfUkFXX0lNQUdFX05PVElGWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpOwotCi0gICAgZW5hYmxlTXNnVHlwZShwaWNNc2dUeXBlKTsKLQotICAgIHJldHVybiBtSGFyZHdhcmUtPnRha2VQaWN0dXJlKCk7Ci19Ci0KLS8vIHNldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgewotICAgIExPRzEoInNldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICBtTGF0ZXN0U2V0UGFyYW1ldGVycyA9IENhbWVyYVBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICBDYW1lcmFQYXJhbWV0ZXJzIHAocGFyYW1zKTsKLSAgICByZXR1cm4gbUhhcmR3YXJlLT5zZXRQYXJhbWV0ZXJzKHApOwotfQotCi0vLyBnZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKLVN0cmluZzggQ2FtZXJhQ2xpZW50OjpnZXRQYXJhbWV0ZXJzKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCi0gICAgaWYgKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkuZmxhdHRlbigpKTsKLSAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwotICAgIHJldHVybiBwYXJhbXM7Ci19Ci0KLS8vIGVuYWJsZSBzaHV0dGVyIHNvdW5kCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSkgewotICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotCi0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICBpZiAoZW5hYmxlKSB7Ci0gICAgICAgIG1QbGF5U2h1dHRlclNvdW5kID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMikgewotICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0gICAgaW50IG9yaWVudGF0aW9uOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKLQotICAgIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9TRVRfRElTUExBWV9PUklFTlRBVElPTikgewotICAgICAgICAvLyBNaXJyb3IgdGhlIHByZXZpZXcgaWYgdGhlIGNhbWVyYSBpcyBmcm9udC1mYWNpbmcuCi0gICAgICAgIG9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oYXJnMSwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKLSAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IC0xKSByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgICAgIGlmIChtT3JpZW50YXRpb24gIT0gb3JpZW50YXRpb24pIHsKLSAgICAgICAgICAgIG1PcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOwotICAgICAgICAgICAgaWYgKG1QcmV2aWV3V2luZG93ICE9IDApIHsKLSAgICAgICAgICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdUcmFuc2Zvcm0obU9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9FTkFCTEVfU0hVVFRFUl9TT1VORCkgewotICAgICAgICBzd2l0Y2ggKGFyZzEpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlU2h1dHRlclNvdW5kKGZhbHNlKTsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlU2h1dHRlclNvdW5kKHRydWUpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYgKGNtZCA9PSBDQU1FUkFfQ01EX1BMQVlfUkVDT1JESU5HX1NPVU5EKSB7Ci0gICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5wbGF5U291bmQoQ2FtZXJhU2VydmljZTo6U09VTkRfUkVDT1JESU5HX1NUQVJUKTsKLSAgICB9IGVsc2UgaWYgKGNtZCA9PSBDQU1FUkFfQ01EX1NFVF9WSURFT19CVUZGRVJfQ09VTlQpIHsKLSAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIHRoaXMgY29tbWFuZAotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfSBlbHNlIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9QSU5HKSB7Ci0gICAgICAgIC8vIElmIG1IYXJkd2FyZSBpcyAwLCBjaGVja1BpZEFuZEhhcmR3YXJlIHdpbGwgcmV0dXJuIGVycm9yLgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1IYXJkd2FyZS0+c2VuZENvbW1hbmQoY21kLCBhcmcxLCBhcmcyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIENhbWVyYUNsaWVudDo6ZW5hYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpIHsKLSAgICBhbmRyb2lkX2F0b21pY19vcihtc2dUeXBlLCAmbU1zZ0VuYWJsZWQpOwotICAgIG1IYXJkd2FyZS0+ZW5hYmxlTXNnVHlwZShtc2dUeXBlKTsKLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OmRpc2FibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkgewotICAgIGFuZHJvaWRfYXRvbWljX2FuZCh+bXNnVHlwZSwgJm1Nc2dFbmFibGVkKTsKLSAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKG1zZ1R5cGUpOwotfQotCi0jZGVmaW5lIENIRUNLX01FU1NBR0VfSU5URVJWQUwgMTAgLy8gMTBtcwotYm9vbCBDYW1lcmFDbGllbnQ6OmxvY2tJZk1lc3NhZ2VXYW50ZWQoaW50MzJfdCBtc2dUeXBlKSB7Ci0gICAgaW50IHNsZWVwQ291bnQgPSAwOwotICAgIHdoaWxlIChtTXNnRW5hYmxlZCAmIG1zZ1R5cGUpIHsKLSAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKHNsZWVwQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HMSgibG9ja0lmTWVzc2FnZVdhbnRlZCglZCk6IHdhaXRlZCBmb3IgJWQgbXMiLAotICAgICAgICAgICAgICAgICAgICBtc2dUeXBlLCBzbGVlcENvdW50ICogQ0hFQ0tfTUVTU0FHRV9JTlRFUlZBTCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIG1lc3NhZ2VzIGFyZSBubyBsb25nZXIgZW5hYmxlZCBhZnRlciBhY3F1aXJpbmcgbG9jaywgcmVsZWFzZSBhbmQgZHJvcCBtZXNzYWdlCi0gICAgICAgICAgICBpZiAoKG1Nc2dFbmFibGVkICYgbXNnVHlwZSkgPT0gMCkgewotICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2xlZXBDb3VudCsrID09IDApIHsKLSAgICAgICAgICAgIExPRzEoImxvY2tJZk1lc3NhZ2VXYW50ZWQoJWQpOiBlbnRlciBzbGVlcCIsIG1zZ1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChDSEVDS19NRVNTQUdFX0lOVEVSVkFMICogMTAwMCk7Ci0gICAgfQotICAgIEFMT0dXKCJsb2NrSWZNZXNzYWdlV2FudGVkKCVkKTogZHJvcHBlZCB1bndhbnRlZCBtZXNzYWdlIiwgbXNnVHlwZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zcDxDYW1lcmFDbGllbnQ+IENhbWVyYUNsaWVudDo6Z2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKSB7Ci0gICAgU3RyaW5nOCBjYW1lcmFJZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCAoaW50KShpbnRwdHJfdCkgdXNlcik7Ci0gICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0gc0NhbWVyYVNlcnZpY2UtPm1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChjYW1lcmFJZCk7Ci0gICAgaWYgKGNsaWVudERlc2NyaXB0b3IgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gc3A8Q2FtZXJhQ2xpZW50PnsKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDbGllbnQqPihjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpLmdldCgpKX07Ci0gICAgfQotICAgIHJldHVybiBzcDxDYW1lcmFDbGllbnQ+e251bGxwdHJ9OwotfQotCi0vLyBDYWxsYmFjayBtZXNzYWdlcyBjYW4gYmUgZGlzcGF0Y2hlZCB0byBpbnRlcm5hbCBoYW5kbGVycyBvciBwYXNzIHRvIG91cgotLy8gY2xpZW50J3MgY2FsbGJhY2sgZnVuY3Rpb25zLCBkZXBlbmRpbmcgb24gdGhlIG1lc3NhZ2UgdHlwZS4KLS8vCi0vLyBub3RpZnlDYWxsYmFjazoKLS8vICAgICAgQ0FNRVJBX01TR19TSFVUVEVSICAgICAgICAgICAgICBoYW5kbGVTaHV0dGVyCi0vLyAgICAgIChvdGhlcnMpICAgICAgICAgICAgICAgICAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2sKLS8vIGRhdGFDYWxsYmFjazoKLS8vICAgICAgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FICAgICAgICBoYW5kbGVQcmV2aWV3RGF0YQotLy8gICAgICBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FICAgICAgIGhhbmRsZVBvc3R2aWV3Ci0vLyAgICAgIENBTUVSQV9NU0dfUkFXX0lNQUdFICAgICAgICAgICAgaGFuZGxlUmF3UGljdHVyZQotLy8gICAgICBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UgICAgIGhhbmRsZUNvbXByZXNzZWRQaWN0dXJlCi0vLyAgICAgIChvdGhlcnMpICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrCi0vLyBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAKLS8vICAgICAgKG90aGVycykgICAgICAgICAgICAgICAgICAgICAgICBjLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAKLQotdm9pZCBDYW1lcmFDbGllbnQ6Om5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLAotICAgICAgICBpbnQzMl90IGV4dDIsIHZvaWQqIHVzZXIpIHsKLSAgICBMT0cyKCJub3RpZnlDYWxsYmFjayglZCkiLCBtc2dUeXBlKTsKLQotICAgIHNwPENhbWVyYUNsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHJldHVybjsKLQotICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKG1zZ1R5cGUpIHsKLSAgICAgICAgY2FzZSBDQU1FUkFfTVNHX1NIVVRURVI6Ci0gICAgICAgICAgICAvLyBleHQxIGlzIHRoZSBkaW1lbnNpb24gb2YgdGhlIHl1diBwaWN0dXJlLgotICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVTaHV0dGVyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY05vdGlmeShtc2dUeXBlLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OmRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsIHZvaWQqIHVzZXIpIHsKLSAgICBMT0cyKCJkYXRhQ2FsbGJhY2soJWQpIiwgbXNnVHlwZSk7Ci0KLSAgICBzcDxDYW1lcmFDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudEZyb21Db29raWUodXNlcik7Ci0gICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgICBpZiAoIWNsaWVudC0+bG9ja0lmTWVzc2FnZVdhbnRlZChtc2dUeXBlKSkgcmV0dXJuOwotICAgIGlmIChkYXRhUHRyID09IDAgJiYgbWV0YWRhdGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiTnVsbCBkYXRhIHJldHVybmVkIGluIGRhdGEgY2FsbGJhY2siKTsKLSAgICAgICAgY2xpZW50LT5oYW5kbGVHZW5lcmljTm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIFVOS05PV05fRVJST1IsIDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChtc2dUeXBlICYgfkNBTUVSQV9NU0dfUFJFVklFV19NRVRBREFUQSkgewotICAgICAgICBjYXNlIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRToKLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlUHJldmlld0RhdGEobXNnVHlwZSwgZGF0YVB0ciwgbWV0YWRhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRToKLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlUG9zdHZpZXcoZGF0YVB0cik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfTVNHX1JBV19JTUFHRToKLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlUmF3UGljdHVyZShkYXRhUHRyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRToKLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoZGF0YVB0cik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY0RhdGEobXNnVHlwZSwgZGF0YVB0ciwgbWV0YWRhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIENhbWVyYUNsaWVudDo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKSB7Ci0gICAgTE9HMigiZGF0YUNhbGxiYWNrVGltZXN0YW1wKCVkKSIsIG1zZ1R5cGUpOwotCi0gICAgc3A8Q2FtZXJhQ2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpOwotICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgaWYgKCFjbGllbnQtPmxvY2tJZk1lc3NhZ2VXYW50ZWQobXNnVHlwZSkpIHJldHVybjsKLQotICAgIGlmIChkYXRhUHRyID09IDApIHsKLSAgICAgICAgQUxPR0UoIk51bGwgZGF0YSByZXR1cm5lZCBpbiBkYXRhIHdpdGggdGltZXN0YW1wIGNhbGxiYWNrIik7Ci0gICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY05vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY0RhdGFUaW1lc3RhbXAodGltZXN0YW1wLCBtc2dUeXBlLCBkYXRhUHRyKTsKLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OmhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8SGFuZGxlVGltZXN0YW1wTWVzc2FnZT4mIG1zZ3MsIHZvaWQqIHVzZXIpIHsKLSAgICBMT0cyKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCIpOwotICAgIHNwPENhbWVyYUNsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoIWNsaWVudC0+bG9ja0lmTWVzc2FnZVdhbnRlZChtc2dUeXBlKSkgcmV0dXJuOwotCi0gICAgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+IGMgPSBjbGllbnQtPm1SZW1vdGVDYWxsYmFjazsKLSAgICBjbGllbnQtPm1Mb2NrLnVubG9jaygpOwotICAgIGlmIChjICE9IDAgJiYgbXNncy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBuID0gbXNncy5zaXplKCk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPG5zZWNzX3Q+IHRpbWVzdGFtcHM7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGhhbmRsZXM7Ci0gICAgICAgIHRpbWVzdGFtcHMucmVzZXJ2ZShuKTsKLSAgICAgICAgaGFuZGxlcy5yZXNlcnZlKG4pOwotICAgICAgICBmb3IgKGF1dG8mIG1zZyA6IG1zZ3MpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGlmIChtc2cuZGF0YVB0ci0+c2l6ZSgpICE9IHNpemVvZihWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZGF0YVB0ciBkb2VzIG5vdCBjb250YWluIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCi0gICAgICAgICAgICAvLyAgICAgICAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KLSAgICAgICAgICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcyB0aGUKLSAgICAgICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgotICAgICAgICAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSAqbWV0YWRhdGEgPQotICAgICAgICAgICAgICAgIChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikobXNnLmRhdGFQdHItPnVuc2VjdXJlUG9pbnRlcigpKTsKLSAgICAgICAgICAgIGlmIChtZXRhZGF0YS0+ZVR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZSA9IG1ldGFkYXRhLT5wSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgdHlwZSBtaXNtYXRjaCBvciBudWxsIGhhbmRsZSBwYXNzZWQhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKGNsaWVudC0+bUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVyc0xvY2spOwotICAgICAgICAgICAgICAgIGNsaWVudC0+bUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVycy5wdXNoX2JhY2sobXNnLmRhdGFQdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGltZXN0YW1wcy5wdXNoX2JhY2sobXNnLnRpbWVzdGFtcCk7Ci0gICAgICAgICAgICBoYW5kbGVzLnB1c2hfYmFjayhoYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIGMtPnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCh0aW1lc3RhbXBzLCBoYW5kbGVzKTsKLSAgICB9Ci19Ci0KLS8vIHNuYXBzaG90IHRha2VuIGNhbGxiYWNrCi12b2lkIENhbWVyYUNsaWVudDo6aGFuZGxlU2h1dHRlcih2b2lkKSB7Ci0gICAgaWYgKG1QbGF5U2h1dHRlclNvdW5kKSB7Ci0gICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5wbGF5U291bmQoQ2FtZXJhU2VydmljZTo6U09VTkRfU0hVVFRFUik7Ci0gICAgfQotCi0gICAgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+IGMgPSBtUmVtb3RlQ2FsbGJhY2s7Ci0gICAgaWYgKGMgIT0gMCkgewotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19TSFVUVEVSLCAwLCAwKTsKLSAgICAgICAgaWYgKCFsb2NrSWZNZXNzYWdlV2FudGVkKENBTUVSQV9NU0dfU0hVVFRFUikpIHJldHVybjsKLSAgICB9Ci0gICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19TSFVUVEVSKTsKLQotICAgIC8vIFNodXR0ZXJzIG9ubHkgaGFwcGVuIGluIHJlc3BvbnNlIHRvIHRha2VQaWN0dXJlLCBzbyBtYXJrIGRldmljZSBhcwotICAgIC8vIGlkbGUgbm93LCB1bnRpbCBwcmV2aWV3IGlzIHJlc3RhcnRlZAotICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKAotICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0lETEUsCi0gICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKTsKLQotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi0vLyBwcmV2aWV3IGNhbGxiYWNrIC0gZnJhbWUgYnVmZmVyIHVwZGF0ZQotdm9pZCBDYW1lcmFDbGllbnQ6OmhhbmRsZVByZXZpZXdEYXRhKGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgbWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSkgewotICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgIHNpemVfdCBzaXplOwotICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotCi0gICAgLy8gbG9jYWwgY29weSBvZiB0aGUgY2FsbGJhY2sgZmxhZ3MKLSAgICBpbnQgZmxhZ3MgPSBtUHJldmlld0NhbGxiYWNrRmxhZzsKLQotICAgIC8vIGlzIGNhbGxiYWNrIGVuYWJsZWQ/Ci0gICAgaWYgKCEoZmxhZ3MgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykpIHsKLSAgICAgICAgLy8gSWYgdGhlIGVuYWJsZSBiaXQgaXMgb2ZmLCB0aGUgY29weS1vdXQgYW5kIG9uZS1zaG90IGJpdHMgYXJlIGlnbm9yZWQKLSAgICAgICAgTE9HMigiZnJhbWUgY2FsbGJhY2sgaXMgZGlzYWJsZWQiKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBob2xkIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGNsaWVudAotICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiBjID0gbVJlbW90ZUNhbGxiYWNrOwotCi0gICAgLy8gY2xlYXIgY2FsbGJhY2sgZmxhZ3MgaWYgbm8gY2xpZW50IG9yIG9uZS1zaG90IG1vZGUKLSAgICBpZiAoYyA9PSAwIHx8IChtUHJldmlld0NhbGxiYWNrRmxhZyAmIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0spKSB7Ci0gICAgICAgIExPRzIoIkRpc2FibGUgcHJldmlldyBjYWxsYmFjayIpOwotICAgICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyAmPSB+KENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKTsKLSAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICB9Ci0KLSAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIC8vIElzIHRoZSByZWNlaXZlZCBmcmFtZSBjb3BpZWQgb3V0IG9yIG5vdD8KLSAgICAgICAgaWYgKGZsYWdzICYgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSykgewotICAgICAgICAgICAgTE9HMigiZnJhbWUgaXMgY29waWVkIik7Ci0gICAgICAgICAgICBjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUobXNnVHlwZSwgYywgaGVhcCwgb2Zmc2V0LCBzaXplLCBtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0cyKCJmcmFtZSBpcyBmb3J3YXJkZWQiKTsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIG1lbSwgbWV0YWRhdGEpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgfQotfQotCi0vLyBwaWN0dXJlIGNhbGxiYWNrIC0gcG9zdHZpZXcgaW1hZ2UgcmVhZHkKLXZvaWQgQ2FtZXJhQ2xpZW50OjpoYW5kbGVQb3N0dmlldyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtKSB7Ci0gICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSk7Ci0KLSAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4gYyA9IG1SZW1vdGVDYWxsYmFjazsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FLCBtZW0sIE5VTEwpOwotICAgIH0KLX0KLQotLy8gcGljdHVyZSBjYWxsYmFjayAtIHJhdyBpbWFnZSByZWFkeQotdm9pZCBDYW1lcmFDbGllbnQ6OmhhbmRsZVJhd1BpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgewotICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUkFXX0lNQUdFKTsKLQotICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgIHNpemVfdCBzaXplOwotICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotCi0gICAgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+IGMgPSBtUmVtb3RlQ2FsbGJhY2s7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgaWYgKGMgIT0gMCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19SQVdfSU1BR0UsIG1lbSwgTlVMTCk7Ci0gICAgfQotfQotCi0vLyBwaWN0dXJlIGNhbGxiYWNrIC0gY29tcHJlc3NlZCBwaWN0dXJlIHJlYWR5Ci12b2lkIENhbWVyYUNsaWVudDo6aGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgewotICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSk7Ci0KLSAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4gYyA9IG1SZW1vdGVDYWxsYmFjazsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UsIG1lbSwgTlVMTCk7Ci0gICAgfQotfQotCi0KLXZvaWQgQ2FtZXJhQ2xpZW50OjpoYW5kbGVHZW5lcmljTm90aWZ5KGludDMyX3QgbXNnVHlwZSwKLSAgICBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgewotICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiBjID0gbVJlbW90ZUNhbGxiYWNrOwotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIGlmIChjICE9IDApIHsKLSAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2sobXNnVHlwZSwgZXh0MSwgZXh0Mik7Ci0gICAgfQotfQotCi12b2lkIENhbWVyYUNsaWVudDo6aGFuZGxlR2VuZXJpY0RhdGEoaW50MzJfdCBtc2dUeXBlLAotICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpIHsKLSAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4gYyA9IG1SZW1vdGVDYWxsYmFjazsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIGMtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhUHRyLCBtZXRhZGF0YSk7Ci0gICAgfQotfQotCi12b2lkIENhbWVyYUNsaWVudDo6aGFuZGxlR2VuZXJpY0RhdGFUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikgewotICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiBjID0gbVJlbW90ZUNhbGxiYWNrOwotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIGlmIChjICE9IDAgJiYgZGF0YVB0ciAhPSBudWxscHRyKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKLQotICAgICAgICAvLyBDaGVjayBpZiBkYXRhUHRyIGNvbnRhaW5zIGEgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YS4KLSAgICAgICAgaWYgKGRhdGFQdHItPnNpemUoKSA9PSBzaXplb2YoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFVzaW5nIHVuc2VjdXJlUG9pbnRlcigpIGhhcyBzb21lIGFzc29jaWF0ZWQgc2VjdXJpdHkgcGl0ZmFsbHMKLSAgICAgICAgICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAgICAgLy8gICAgICAgRWl0aGVyIGRvY3VtZW50IHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgY2FzZSBvciBhZGRyZXNzIHRoZQotICAgICAgICAgICAgLy8gICAgICAgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCi0gICAgICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhICptZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShkYXRhUHRyLT51bnNlY3VyZVBvaW50ZXIoKSk7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEtPmVUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBtZXRhZGF0YS0+cEhhbmRsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGRhdGFQdHIgY29udGFpbnMgYSBuYXRpdmUgaGFuZGxlLCBzZW5kIGl0IHZpYSByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wLgotICAgICAgICBpZiAoaGFuZGxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzTG9jayk7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVycy5wdXNoX2JhY2soZGF0YVB0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjLT5yZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcCwgaGFuZGxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ1R5cGUsIGRhdGFQdHIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENhbWVyYUNsaWVudDo6Y29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKAotICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLAotICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpIHsKLSAgICBMT0cyKCJjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUiKTsKLSAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gY29weSBvdXQgb2YgcG1lbSBiZWZvcmUgc2VuZGluZyB0aGlzIHRvCi0gICAgLy8gdGhlIGNhbGxiYWNrLiBGb3IgZWZmaWNpZW5jeSwgcmV1c2UgdGhlIHNhbWUgTWVtb3J5SGVhcEJhc2UKLSAgICAvLyBwcm92aWRlZCBpdCdzIGJpZyBlbm91Z2guIERvbid0IGFsbG9jYXRlIHRoZSBtZW1vcnkgb3IKLSAgICAvLyBwZXJmb3JtIHRoZSBjb3B5IGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2suCi0gICAgLy8gaG9sZCB0aGUgcHJldmlldyBsb2NrIHdoaWxlIHdlIGdyYWIgYSByZWZlcmVuY2UgdG8gdGhlIHByZXZpZXcgYnVmZmVyCi0gICAgc3A8TWVtb3J5SGVhcEJhc2U+IHByZXZpZXdCdWZmZXI7Ci0KLSAgICBpZiAobVByZXZpZXdCdWZmZXIgPT0gMCkgewotICAgICAgICBtUHJldmlld0J1ZmZlciA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCBOVUxMKTsKLSAgICB9IGVsc2UgaWYgKHNpemUgPiBtUHJldmlld0J1ZmZlci0+dmlydHVhbFNpemUoKSkgewotICAgICAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwotICAgICAgICBtUHJldmlld0J1ZmZlciA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKG1QcmV2aWV3QnVmZmVyID09IDApIHsKLSAgICAgICAgQUxPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgcHJldmlldyBidWZmZXIiKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcHJldmlld0J1ZmZlciA9IG1QcmV2aWV3QnVmZmVyOwotCi0gICAgdm9pZCogcHJldmlld0J1ZmZlckJhc2UgPSBwcmV2aWV3QnVmZmVyLT5iYXNlKCk7Ci0gICAgdm9pZCogaGVhcEJhc2UgPSBoZWFwLT5iYXNlKCk7Ci0KLSAgICBpZiAoaGVhcEJhc2UgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBtbWFwIGhlYXAgZm9yIHByZXZpZXcgZnJhbWUuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKHByZXZpZXdCdWZmZXJCYXNlID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbW1hcCBwcmV2aWV3IGJ1ZmZlciBmb3IgcHJldmlldyBmcmFtZS4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1lbWNweShwcmV2aWV3QnVmZmVyQmFzZSwgKHVpbnQ4X3QgKikgaGVhcEJhc2UgKyBvZmZzZXQsIHNpemUpOwotCi0gICAgc3A8TWVtb3J5QmFzZT4gZnJhbWUgPSBuZXcgTWVtb3J5QmFzZShwcmV2aWV3QnVmZmVyLCAwLCBzaXplKTsKLSAgICBpZiAoZnJhbWUgPT0gMCkgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBmcmFtZSBjYWxsYmFjayIpOwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIGNsaWVudC0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGZyYW1lLCBtZXRhZGF0YSk7Ci19Ci0KLWludCBDYW1lcmFDbGllbnQ6OmdldE9yaWVudGF0aW9uKGludCBkZWdyZWVzLCBib29sIG1pcnJvcikgewotICAgIGlmICghbWlycm9yKSB7Ci0gICAgICAgIGlmIChkZWdyZWVzID09IDApIHJldHVybiAwOwotICAgICAgICBlbHNlIGlmIChkZWdyZWVzID09IDkwKSByZXR1cm4gSEFMX1RSQU5TRk9STV9ST1RfOTA7Ci0gICAgICAgIGVsc2UgaWYgKGRlZ3JlZXMgPT0gMTgwKSByZXR1cm4gSEFMX1RSQU5TRk9STV9ST1RfMTgwOwotICAgICAgICBlbHNlIGlmIChkZWdyZWVzID09IDI3MCkgcmV0dXJuIEhBTF9UUkFOU0ZPUk1fUk9UXzI3MDsKLSAgICB9IGVsc2UgeyAgLy8gRG8gbWlycm9yIChob3Jpem9udGFsIGZsaXApCi0gICAgICAgIGlmIChkZWdyZWVzID09IDApIHsgICAgICAgICAgIC8vIEZMSVBfSCBhbmQgUk9UXzAKLSAgICAgICAgICAgIHJldHVybiBIQUxfVFJBTlNGT1JNX0ZMSVBfSDsKLSAgICAgICAgfSBlbHNlIGlmIChkZWdyZWVzID09IDkwKSB7ICAgLy8gRkxJUF9IIGFuZCBST1RfOTAKLSAgICAgICAgICAgIHJldHVybiBIQUxfVFJBTlNGT1JNX0ZMSVBfSCB8IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOwotICAgICAgICB9IGVsc2UgaWYgKGRlZ3JlZXMgPT0gMTgwKSB7ICAvLyBGTElQX0ggYW5kIFJPVF8xODAKLSAgICAgICAgICAgIHJldHVybiBIQUxfVFJBTlNGT1JNX0ZMSVBfVjsKLSAgICAgICAgfSBlbHNlIGlmIChkZWdyZWVzID09IDI3MCkgeyAgLy8gRkxJUF9IIGFuZCBST1RfMjcwCi0gICAgICAgICAgICByZXR1cm4gSEFMX1RSQU5TRk9STV9GTElQX1YgfCBIQUxfVFJBTlNGT1JNX1JPVF85MDsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HRSgiSW52YWxpZCBzZXREaXNwbGF5T3JpZW50YXRpb24gZGVncmVlcz0lZCIsIGRlZ3JlZXMpOwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRWaWRlb1RhcmdldChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpIHsKLSAgICAodm9pZClidWZmZXJQcm9kdWNlcjsKLSAgICBBTE9HRSgiJXM6ICVkOiBDYW1lcmFDbGllbnQgZG9lc24ndCBzdXBwb3J0IHNldHRpbmcgYSB2aWRlbyB0YXJnZXQuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldEF1ZGlvUmVzdHJpY3Rpb24oaW50IG1vZGUpIHsKLSAgICBpZiAoIWlzVmFsaWRBdWRpb1Jlc3RyaWN0aW9uKG1vZGUpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhdWRpbyByZXN0cmljdGlvbiBtb2RlICVkIiwgX19GVU5DVElPTl9fLCBtb2RlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBCYXNpY0NsaWVudDo6c2V0QXVkaW9SZXN0cmljdGlvbihtb2RlKTsKLX0KLQotaW50MzJfdCBDYW1lcmFDbGllbnQ6OmdldEdsb2JhbEF1ZGlvUmVzdHJpY3Rpb24oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gQmFzaWNDbGllbnQ6OmdldFNlcnZpY2VBdWRpb1Jlc3RyaWN0aW9uKCk7Ci19Ci0KLS8vIEFQSTEtPkRldmljZTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUKLXN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKHVpbnQ4X3QgLypyb3RhdGVBbmRDcm9wKi8pIHsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlYjk2MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFDTElFTlRfSAotCi0jaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lbW9yeUhlYXBCYXNlOwotY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIGJldHdlZW4gYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEgQVBJIGFuZCBDYW1lcmEgSEFMIGRldmljZSBmb3IgdmVyc2lvbgotICogQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAuCi0gKi8KLQotY2xhc3MgQ2FtZXJhQ2xpZW50IDogcHVibGljIENhbWVyYVNlcnZpY2U6OkNsaWVudAotewotcHVibGljOgotICAgIC8vIElDYW1lcmEgaW50ZXJmYWNlIChzZWUgSUNhbWVyYSBmb3IgZGV0YWlscykKLSAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICBkaXNjb25uZWN0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY29ubmVjdChjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNsaWVudCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgbG9jaygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHVubG9jaygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdUYXJnZXQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBmbGFnKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tUYXJnZXQoCi0gICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgY2FsbGJhY2tQcm9kdWNlcik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRQcmV2aWV3KCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcFByZXZpZXcoKTsKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICBwcmV2aWV3RW5hYmxlZCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvQnVmZmVyTW9kZShpbnQzMl90IHZpZGVvQnVmZmVyTW9kZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRSZWNvcmRpbmcoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wUmVjb3JkaW5nKCk7Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVjb3JkaW5nRW5hYmxlZCgpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGF1dG9Gb2N1cygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNhbmNlbEF1dG9Gb2N1cygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHRha2VQaWN0dXJlKGludCBtc2dUeXBlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7Ci0gICAgdmlydHVhbCBTdHJpbmc4ICAgICAgICAgZ2V0UGFyYW1ldGVycygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9UYXJnZXQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Jlc3RyaWN0aW9uKGludCBtb2RlKTsKLSAgICB2aXJ0dWFsIGludDMyX3QgICAgICAgICBnZXRHbG9iYWxBdWRpb1Jlc3RyaWN0aW9uKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUodWludDhfdCBvdmVycmlkZSk7Ci0KLSAgICAvLyBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCi0gICAgQ2FtZXJhQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAotICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7Ci0gICAgfkNhbWVyYUNsaWVudCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLXByaXZhdGU6Ci0KLSAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBjYWxsaW5nIHByb2Nlc3MgbWF0Y2hlcyBtQ2xpZW50UGlkLgotICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIGNoZWNrUGlkKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgY2hlY2tQaWRBbmRIYXJkd2FyZSgpIGNvbnN0OyAgLy8gYWxzbyBjaGVjayBtSGFyZHdhcmUgIT0gMAotCi0gICAgLy8gdGhlc2UgYXJlIGludGVybmFsIGZ1bmN0aW9ucyB1c2VkIHRvIHNldCB1cCBwcmV2aWV3IGJ1ZmZlcnMKLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICByZWdpc3RlclByZXZpZXdCdWZmZXJzKCk7Ci0KLSAgICAvLyBjYW1lcmEgb3BlcmF0aW9uIG1vZGUKLSAgICBlbnVtIGNhbWVyYV9tb2RlIHsKLSAgICAgICAgQ0FNRVJBX1BSRVZJRVdfTU9ERSAgID0gMCwgIC8vIGZyYW1lIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQKLSAgICAgICAgQ0FNRVJBX1JFQ09SRElOR19NT0RFID0gMSwgIC8vIGZyYW1lIGhhcyB0byBiZSBleHBsaWNpdGx5IHJlbGVhc2VkIGJ5IHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpCi0gICAgfTsKLSAgICAvLyB0aGVzZSBhcmUgaW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgZm9yIHByZXZpZXcvcmVjb3JkaW5nCi0gICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc3RhcnRDYW1lcmFNb2RlKGNhbWVyYV9tb2RlIG1vZGUpOwotICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHN0YXJ0UHJldmlld01vZGUoKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzdGFydFJlY29yZGluZ01vZGUoKTsKLQotICAgIC8vIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgc2VuZENvbW1hbmQgdG8gZW5hYmxlL2Rpc2FibGUgc2h1dHRlciBzb3VuZC4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBlbmFibGVTaHV0dGVyU291bmQoYm9vbCBlbmFibGUpOwotCi0gICAgc3RhdGljIHNwPENhbWVyYUNsaWVudD4gICAgICAgIGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7Ci0KLSAgICAvLyB0aGVzZSBhcmUgc3RhdGljIGNhbGxiYWNrIGZ1bmN0aW9ucwotICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIsIHZvaWQqIHVzZXIpOwotICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLAotICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLCB2b2lkKiB1c2VyKTsKLSAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpOwotICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIGhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPEhhbmRsZVRpbWVzdGFtcE1lc3NhZ2U+Jiwgdm9pZCogdXNlcik7Ci0gICAgLy8gaGFuZGxlcnMgZm9yIG1lc3NhZ2VzCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2h1dHRlcih2b2lkKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVQcmV2aWV3RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBtZW0sCi0gICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvc3R2aWV3KGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVJhd1BpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlR2VuZXJpY05vdGlmeShpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5lcmljRGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLAotICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5lcmljRGF0YVRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cik7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUoCi0gICAgICAgIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKLSAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsCi0gICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSk7Ci0KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRPcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24sIGJvb2wgbWlycm9yKTsKLQotICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldFByZXZpZXdXaW5kb3coCi0gICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsCi0gICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiB3aW5kb3cpOwotCi0KLSAgICAvLyB0aGVzZSBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiAgICAgbUhhcmR3YXJlOyAgICAgICAvLyBjbGVhcmVkIGFmdGVyIGRpc2Nvbm5lY3QoKQotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWc7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb247ICAgICAvLyBDdXJyZW50IGRpc3BsYXkgb3JpZW50YXRpb24KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5U2h1dHRlclNvdW5kOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeU1vZGU7IC8vIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlPwotCi0gICAgLy8gRW5zdXJlcyBhdG9taWNpdHkgYW1vbmcgdGhlIHB1YmxpYyBtZXRob2RzCi0gICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKLSAgICAvLyBUaGlzIGlzIGEgYmluZGVyIG9mIFN1cmZhY2Ugb3IgU3VyZmFjZS4KLSAgICBzcDxJQmluZGVyPiAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgICAgICAgbVByZXZpZXdXaW5kb3c7Ci0KLSAgICAvLyBJZiB0aGUgdXNlciB3YW50IHVzIHRvIHJldHVybiBhIGNvcHkgb2YgdGhlIHByZXZpZXcgZnJhbWUgKGluc3RlYWQKLSAgICAvLyBvZiB0aGUgb3JpZ2luYWwgb25lKSwgd2UgYWxsb2NhdGUgbVByZXZpZXdCdWZmZXIgYW5kIHJldXNlIGl0IGlmIHBvc3NpYmxlLgotICAgIHNwPE1lbW9yeUhlYXBCYXNlPiAgICAgICAgICAgICAgbVByZXZpZXdCdWZmZXI7Ci0KLSAgICAvLyBEZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSAgICBDYW1lcmFQYXJhbWV0ZXJzICAgICAgICAgICAgICAgIG1MYXRlc3RTZXRQYXJhbWV0ZXJzOwotCi0gICAgLy8gbUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVycyBzdG9yZXMgc3A8SU1lbW9yeT4gdGhhdCBIQUwgdXNlcyB0byBzZW5kIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEuCi0gICAgLy8gSXQgd2lsbCBiZSB1c2VkIHRvIHNlbmQgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSBiYWNrIHRvIEhBTCB3aGVuIGNhbWVyYSByZWNlaXZlcyB0aGUKLSAgICAvLyBuYXRpdmUgaGFuZGxlIGZyb20gcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlLgotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVyc0xvY2s7Ci0gICAgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4+ICAgICAgICBtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzOwotCi0gICAgLy8gV2UgbmVlZCB0byBhdm9pZCB0aGUgZGVhZGxvY2sgd2hlbiB0aGUgaW5jb21pbmcgY29tbWFuZCB0aHJlYWQgYW5kCi0gICAgLy8gdGhlIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIGNhbGxiYWNrIHRocmVhZCBib3RoIHdhbnQgdG8gZ3JhYiBtTG9jay4KLSAgICAvLyBBbiBleHRyYSBmbGFnIGlzIHVzZWQgdG8gdGVsbCB0aGUgY2FsbGJhY2sgdGhyZWFkIHRoYXQgaXQgc2hvdWxkIHN0b3AKLSAgICAvLyB0cnlpbmcgdG8gZGVsaXZlciB0aGUgY2FsbGJhY2sgbWVzc2FnZXMgaWYgdGhlIGNsaWVudCBpcyBub3QKLSAgICAvLyBpbnRlcmVzdGVkIGluIGl0IGFueW1vcmUuIEZvciBleGFtcGxlLCBpZiB0aGUgY2xpZW50IGlzIGNhbGxpbmcKLSAgICAvLyBzdG9wUHJldmlldygpLCB0aGUgcHJldmlldyBmcmFtZSBtZXNzYWdlcyBkbyBub3QgbmVlZCB0byBiZSBkZWxpdmVyZWQKLSAgICAvLyBhbnltb3JlLgotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXIgYXMgdGhlIGVuYWJsZU1zZ1R5cGUoKSBhbmQKLSAgICAvLyBkaXNhYmxlTXNnVHlwZSgpIGZ1bmN0aW9ucyBpbiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS4KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBlbmFibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZGlzYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKTsKLSAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICBtTXNnRW5hYmxlZDsKLQotICAgIC8vIFRoaXMgZnVuY3Rpb24ga2VlcHMgdHJ5aW5nIHRvIGdyYWIgbUxvY2ssIG9yIGdpdmUgdXAgaWYgdGhlIG1lc3NhZ2UKLSAgICAvLyBpcyBmb3VuZCB0byBiZSBkaXNhYmxlZC4gSXQgcmV0dXJucyB0cnVlIGlmIG1Mb2NrIGlzIGdyYWJiZWQuCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbG9ja0lmTWVzc2FnZVdhbnRlZChpbnQzMl90IG1zZ1R5cGUpOwotfTsKLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCBkYmM4NjNiLi5kNTQzY2FiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC0zMjUzLDYgKzMyNTMsOCBAQAogCiBzdGF0dXNfdCBQYXJhbWV0ZXJzOjpjYWxjdWxhdGVQaWN0dXJlRm92cyhmbG9hdCAqaG9yaXpGb3YsIGZsb2F0ICp2ZXJ0Rm92KQogICAgICAgICBjb25zdCB7CisgICAgLy8gRm9yIGV4dGVybmFsIGNhbWVyYSwgdXNlIEZPVnMgPSAoLTEuMCwgLTEuMCkgYXMgZGVmYXVsdCB2YWx1ZXMuIENhbGN1bGF0ZQorICAgIC8vIEZPVnMgb25seSBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IGluZm9ybWF0aW9uLgogICAgIGlmIChmYXN0SW5mby5pc0V4dGVybmFsQ2FtZXJhKSB7CiAgICAgICAgIGlmIChob3JpekZvdiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqaG9yaXpGb3YgPSAtMS4wOwpAQCAtMzI2MCwxNiArMzI2MiwyOSBAQAogICAgICAgICBpZiAodmVydEZvdiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqdmVydEZvdiA9IC0xLjA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IHNlbnNvclNpemUgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkUsIDIsIDIpOwotICAgIGlmICghc2Vuc29yU2l6ZS5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKCFzZW5zb3JTaXplLmNvdW50KSB7CisgICAgICAgIC8vIEl0IGlzIG5vbi1mYXRhbCBmb3IgZXh0ZXJuYWwgY2FtZXJhcyBzaW5jZSBpdCBoYXMgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgIGlmIChmYXN0SW5mby5pc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IHBpeGVsQXJyYXlTaXplID0KICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TRU5TT1JfSU5GT19QSVhFTF9BUlJBWV9TSVpFLCAyLCAyKTsKLSAgICBpZiAoIXBpeGVsQXJyYXlTaXplLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAoIXBpeGVsQXJyYXlTaXplLmNvdW50KSB7CisgICAgICAgIC8vIEl0IGlzIG5vbi1mYXRhbCBmb3IgZXh0ZXJuYWwgY2FtZXJhcyBzaW5jZSBpdCBoYXMgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgIGlmIChmYXN0SW5mby5pc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGZsb2F0IGFycmF5QXNwZWN0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGZhc3RJbmZvLmFycmF5V2lkdGgpIC8KICAgICAgICAgICAgIGZhc3RJbmZvLmFycmF5SGVpZ2h0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAppbmRleCA4ZGM5ODYzLi44NzUzZGNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcApAQCAtMTcyLDcgKzE3Miw3IEBACiAgICAgbUJ1ZmZlclF1ZXVlRGVwdGggPSBtRnJhbWVMaXN0RGVwdGggKyAxOwogCiAgICAgbVpzbFF1ZXVlLmluc2VydEF0KDAsIG1CdWZmZXJRdWV1ZURlcHRoKTsKLSAgICBtRnJhbWVMaXN0Lmluc2VydEF0KDAsIG1GcmFtZUxpc3REZXB0aCk7CisgICAgbUZyYW1lTGlzdC5yZXNpemUobUZyYW1lTGlzdERlcHRoKTsKICAgICBzcDxDYXB0dXJlU2VxdWVuY2VyPiBjYXB0dXJlU2VxdWVuY2VyID0gbVNlcXVlbmNlci5wcm9tb3RlKCk7CiAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZXIgIT0gMCkgY2FwdHVyZVNlcXVlbmNlci0+c2V0WnNsUHJvY2Vzc29yKHRoaXMpOwogfQpAQCAtMjA4LDcgKzIwOCw3IEBACiAgICAgLy8gQ29ycmVzcG9uZGluZyBidWZmZXIgaGFzIGJlZW4gY2xlYXJlZC4gTm8gbmVlZCB0byBwdXNoIGludG8gbUZyYW1lTGlzdAogICAgIGlmICh0aW1lc3RhbXAgPD0gbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXApIHJldHVybjsKIAotICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSByZXN1bHQubU1ldGFkYXRhOworICAgIG1GcmFtZUxpc3RbbUZyYW1lTGlzdEhlYWRdID0gcmVzdWx0Lm1NZXRhZGF0YTsKICAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUgbUZyYW1lTGlzdERlcHRoOwogfQogCkBAIC02NzEsNyArNjcxLDcgQEAKIHZvaWQgWnNsUHJvY2Vzc29yOjpjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCkgewogICAgIG1GcmFtZUxpc3QuY2xlYXIoKTsKICAgICBtRnJhbWVMaXN0SGVhZCA9IDA7Ci0gICAgbUZyYW1lTGlzdC5pbnNlcnRBdCgwLCBtRnJhbWVMaXN0RGVwdGgpOworICAgIG1GcmFtZUxpc3QucmVzaXplKG1GcmFtZUxpc3REZXB0aCk7CiB9CiAKIHZvaWQgWnNsUHJvY2Vzc29yOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaAppbmRleCAxZGIyNDAzLi4zMTg2MjMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVmYXVsdE1heFBpcGVsaW5lRGVwdGggPSA0OwogICAgIHNpemVfdCBtQnVmZmVyUXVldWVEZXB0aDsKICAgICBzaXplX3QgbUZyYW1lTGlzdERlcHRoOwotICAgIFZlY3RvcjxDYW1lcmFNZXRhZGF0YT4gbUZyYW1lTGlzdDsKKyAgICBzdGQ6OnZlY3RvcjxDYW1lcmFNZXRhZGF0YT4gbUZyYW1lTGlzdDsKICAgICBzaXplX3QgbUZyYW1lTGlzdEhlYWQ7CiAKICAgICBac2xQYWlyIG1OZXh0UGFpcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCBlMzViNDM2Li42NmVkYTVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KQEAgLTMwLDYgKzMxLDcgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKIAogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KIApAQCAtNTQsNyArNTYsNyBAQAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtODAsNyArODIsNyBAQAogQ2FtZXJhRGV2aWNlQ2xpZW50OjpDYW1lcmFEZXZpY2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKQEAgLTQ3MCw3ICs0NzIsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlJiBzZXNzaW9uUGFyYW1zLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmUmIHNlc3Npb25QYXJhbXMsIGludDY0X3Qgc3RhcnRUaW1lTXMsCiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIG9mZmxpbmVTdHJlYW1JZHMgLypvdXQqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBlbmRpbmcgY29uZmlndXJlICglZCBpbnB1dCBzdHJlYW0sICV6dSBvdXRwdXQgc3VyZmFjZXMpIiwKQEAgLTQ5Miw3ICs0OTQsOCBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CiAgICAgfQogCi0gICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUsIG1EZXZpY2UtPmluZm8oKSwgbUNhbWVyYUlkU3RyKTsKKyAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja09wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSwgbURldmljZS0+aW5mbygpLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyKTsKICAgICBpZiAoIXJlcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC01NDUsMjUyICs1NDgsMTYgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvZmZsaW5lU3RyZWFtSWQgOiAqb2ZmbGluZVN0cmVhbUlkcykgewogICAgICAgICAgICAgbVN0cmVhbUluZm9NYXBbb2ZmbGluZVN0cmVhbUlkXS5zdXBwb3J0c09mZmxpbmUgPSB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBjb25maWd1cmVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGludDMyX3QgY29uZmlndXJlRHVyYXRpb25NcyA9IG5zMm1zKGNvbmZpZ3VyZUVuZCkgLSBzdGFydFRpbWVNczsKKyAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nU3RyZWFtQ29uZmlndXJlZChtQ2FtZXJhSWRTdHIsIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgZmFsc2UgLyppbnRlcm5hbFJlY29uZmlnKi8sIGNvbmZpZ3VyZUR1cmF0aW9uTXMpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tTdXJmYWNlVHlwZShzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAotICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIsIGludCBzdXJmYWNlVHlwZSkgIHsKLSAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1CdWZmZXJQcm9kdWNlcnMsIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOwotICAgIH0gZWxzZSBpZiAoKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSAmJiAoIWRlZmVycmVkQ29uc3VtZXIpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTnVtYmVyIG9mIGNvbnN1bWVycyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJObyB2YWxpZCBjb25zdW1lcnMuIik7Ci0gICAgfQotCi0gICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAotICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKLQotICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZVR5cGUgPSAlZC4iLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VUeXBlKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOwotICAgIH0KLQotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCkgewotICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKLSAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCi0gICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tPcGVyYXRpbmdNb2RlKGludCBvcGVyYXRpbmdNb2RlLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQpIHsKLSAgICBpZiAob3BlcmF0aW5nTW9kZSA8IDApIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCi0gICAgICAgICAgICAiQ2FtZXJhICVzOiBJbnZhbGlkIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZCIsIGNhbWVyYUlkLnN0cmluZygpLCBvcGVyYXRpbmdNb2RlKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gKG9wZXJhdGluZ01vZGUgPT0gSUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSk7Ci0gICAgaWYgKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwotICAgICAgICBib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07Ci0gICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19DT05TVFJBSU5FRF9ISUdIX1NQRUVEX1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBUcnkgdG8gY3JlYXRlIGEgY29uc3RyYWluZWQgaGlnaCBzcGVlZCBjb25maWd1cmF0aW9uIG9uIGEgZGV2aWNlIgotICAgICAgICAgICAgICAgICIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuIiwgY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgewotICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RyZWFtLT52M18yLnN0cmVhbVR5cGUgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKLSAgICBzdHJlYW0tPnYzXzIud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOwotICAgIHN0cmVhbS0+djNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKLSAgICBzdHJlYW0tPnYzXzIuZm9ybWF0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzdHJlYW1JbmZvLmZvcm1hdCk7Ci0gICAgYXV0byB1ID0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlOwotICAgIGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhzdHJlYW1JbmZvLmZvcm1hdCwgJnUpOwotICAgIHN0cmVhbS0+djNfMi51c2FnZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSh1KTsKLSAgICBzdHJlYW0tPnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKLSAgICBzdHJlYW0tPnYzXzIucm90YXRpb24gPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKLSAgICBzdHJlYW0tPnYzXzIuaWQgPSAtMTsgLy8gSW52YWxpZCBzdHJlYW0gaWQKLSAgICBzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKLSAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSAwOwotfQotCi1iaW5kZXI6OlN0YXR1cwotQ2FtZXJhRGV2aWNlQ2xpZW50Ojpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCi0gICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8sCi0gICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAotICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ3VyYXRpb24sCi0gICAgICAgIGJvb2wgKnVuc3VwcG9ydGVkKSB7Ci0gICAgYXV0byBvcGVyYXRpbmdNb2RlID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3BlcmF0aW5nTW9kZSgpOwotICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZShvcGVyYXRpbmdNb2RlLCBkZXZpY2VJbmZvLCBsb2dpY2FsQ2FtZXJhSWQpOwotICAgIGlmICghcmVzLmlzT2soKSkgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIGlmICh1bnN1cHBvcnRlZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIFN0cmluZzggbXNnKCJ1bnN1cHBvcnRlZCBudWxscHRyIik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICB9Ci0gICAgKnVuc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgYXV0byByZXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Q+IChvcGVyYXRpbmdNb2RlKSwKLSAgICAgICAgICAgIC8qb3V0Ki8gJnN0cmVhbUNvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSk7Ci0gICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICJDYW1lcmEgJXM6IEZhaWxlZCBtYXBwaW5nIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIG9wZXJhdGluZ01vZGUsIHN0cmVycm9yKC1yZXQpLCByZXQpOwotICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKLSAgICB9Ci0KLSAgICBib29sIGlzSW5wdXRWYWxpZCA9IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkgPiAwKSAmJgotICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkgPiAwKSAmJgotICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkgPiAwKTsKLSAgICBhdXRvIG91dHB1dENvbmZpZ3MgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOwotICAgIHNpemVfdCBzdHJlYW1Db3VudCA9IG91dHB1dENvbmZpZ3Muc2l6ZSgpOwotICAgIHN0cmVhbUNvdW50ID0gaXNJbnB1dFZhbGlkID8gc3RyZWFtQ291bnQgKyAxIDogc3RyZWFtQ291bnQ7Ci0gICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7Ci0gICAgc2l6ZV90IHN0cmVhbUlkeCA9IDA7Ci0gICAgaWYgKGlzSW5wdXRWYWxpZCkgewotICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdID0ge3svKnN0cmVhbUlkKi8wLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6SU5QVVQsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKSwKLSAgICAgICAgICAgICAgICAvKnVzYWdlKi8gMCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzB9LAotICAgICAgICAgICAgICAgIC8qcGh5c2ljYWxJZCovIG51bGxwdHIsIC8qYnVmZmVyU2l6ZSovMH07Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG91dHB1dENvbmZpZ3MpIHsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBidWZmZXJQcm9kdWNlcnMgPQotICAgICAgICAgICAgaXQuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOwotICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBpdC5pc0RlZmVycmVkKCk7Ci0gICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgoaXQuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKLSAgICAgICAgc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycyA9IGJ1ZmZlclByb2R1Y2Vycy5zaXplKCk7Ci0gICAgICAgIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyBzdHJlYW1JbmZvOwotCi0gICAgICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGUobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLCBpdC5nZXRTdXJmYWNlVHlwZSgpKTsKLSAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9IGNoZWNrUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkcywgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQpOwotICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVmZXJyZWRDb25zdW1lcikgewotICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IGl0LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGl0LmdldEhlaWdodCgpOwotICAgICAgICAgICAgc3RyZWFtSW5mby5mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7Ci0gICAgICAgICAgICBzdHJlYW1JbmZvLmRhdGFTcGFjZSA9IGFuZHJvaWRfZGF0YXNwYWNlX3Q6OkhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKLSAgICAgICAgICAgIGF1dG8gc3VyZmFjZVR5cGUgPSBpdC5nZXRTdXJmYWNlVHlwZSgpOwotICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRTsKLSAgICAgICAgICAgIGlmIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlIHw9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7Ci0gICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChhdXRvJiBidWZmZXJQcm9kdWNlciA6IGJ1ZmZlclByb2R1Y2VycykgewotICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZwaHlzaWNhbERldmljZUluZm8gPSBnZXRNZXRhZGF0YShwaHlzaWNhbENhbWVyYUlkKTsKLSAgICAgICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDAgPyBwaHlzaWNhbERldmljZUluZm8gOiBkZXZpY2VJbmZvICk7Ci0KLSAgICAgICAgICAgIGlmICghcmVzLmlzT2soKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotCi0gICAgICAgICAgICBpZiAoIWlzU3RyZWFtSW5mb1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2UpOwotICAgICAgICAgICAgICAgIGJvb2wgaXNIZWljQ29tcG9zaXRlU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSB8fCBpc0hlaWNDb21wb3NpdGVTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIGluIHRvIGFjY291bnQgdGhhdCBjb21wb3NpdGUgc3RyZWFtcyBjYW4gaGF2ZQotICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGludGVybmFsIGNhbWVyYSBzdHJlYW1zLgotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiBjb21wb3NpdGVTdHJlYW1zOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oc3RyZWFtSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mbywgJmNvbXBvc2l0ZVN0cmVhbXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8sICZjb21wb3NpdGVTdHJlYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogRmFpbGVkIGFkZGluZyBjb21wb3NpdGUgc3RyZWFtczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLXJldCksIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZVN0cmVhbXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGludGVybmFsIHN0cmVhbXMgbWVhbnMgY29tcG9zaXRlIHN0cmVhbSBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICp1bnN1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db3VudCArPSBjb21wb3NpdGVTdHJlYW1zLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY29tcG9zaXRlU3RyZWFtIDogY29tcG9zaXRlU3RyZWFtcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhjb21wb3NpdGVTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLCBib29sICpzdGF0dXMgLypvdXQqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CkBAIC04MDYsNyArNTczLDggQEAKICAgICB9CiAKICAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7Ci0gICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUsIG1EZXZpY2UtPmluZm8oKSwgbUNhbWVyYUlkU3RyKTsKKyAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja09wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSwgbURldmljZS0+aW5mbygpLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyKTsKICAgICBpZiAoIXJlcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC04MjEsOCArNTg5LDkgQEAKICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSA9IFt0aGlzXShjb25zdCBTdHJpbmc4ICZpZCkge3JldHVybiBtRGV2aWNlLT5pbmZvUGh5c2ljYWwoaWQpO307CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwogICAgIG1Qcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtQ2FtZXJhSWRTdHIuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7Ci0gICAgcmVzID0gY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oc2Vzc2lvbkNvbmZpZ3VyYXRpb24sIG1DYW1lcmFJZFN0ciwKLSAgICAgICAgICAgIG1EZXZpY2UtPmluZm8oKSwgZ2V0TWV0YWRhdGEsIHBoeXNpY2FsQ2FtZXJhSWRzLCBzdHJlYW1Db25maWd1cmF0aW9uLCAmZWFybHlFeGl0KTsKKyAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihzZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbURldmljZS0+aW5mbygpLCBnZXRNZXRhZGF0YSwgcGh5c2ljYWxDYW1lcmFJZHMsIHN0cmVhbUNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAmZWFybHlFeGl0KTsKICAgICBpZiAoIXJlcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC05NzAsNyArNzM5LDcgQEAKICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKICAgICBib29sIGRlZmVycmVkQ29uc3VtZXJPbmx5ID0gZGVmZXJyZWRDb25zdW1lciAmJiBudW1CdWZmZXJQcm9kdWNlcnMgPT0gMDsKIAotICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGUobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLAorICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrU3VyZmFjZVR5cGUobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLAogICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlVHlwZSgpKTsKICAgICBpZiAoIXJlcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTk4MSw3ICs3NTAsOCBAQAogICAgIH0KICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CiAgICAgbVByb3ZpZGVyTWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICByZXMgPSBjaGVja1BoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZHMsIHBoeXNpY2FsQ2FtZXJhSWQsIG1DYW1lcmFJZFN0cik7CisgICAgcmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y2hlY2tQaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWRzLCBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyKTsKICAgICBpZiAoIXJlcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC0xMDA5LDggKzc3OSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwotICAgICAgICByZXMgPSBjcmVhdGVTdXJmYWNlRnJvbUdicChzdHJlYW1JbmZvLCBpc1N0cmVhbUluZm9WYWxpZCwgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxDYW1lcmFJZCkpOworICAgICAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicChzdHJlYW1JbmZvLCBpc1N0cmVhbUluZm9WYWxpZCwKKyAgICAgICAgICAgICAgICBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwgbUNhbWVyYUlkU3RyLCBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxDYW1lcmFJZCkpOwogCiAgICAgICAgIGlmICghcmVzLmlzT2soKSkKICAgICAgICAgICAgIHJldHVybiByZXM7CkBAIC0xMzEzLDggKzEwODMsOSBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3T3V0cHV0c01hcC5zaXplKCk7IGkrKykgewogICAgICAgICBPdXRwdXRTdHJlYW1JbmZvIG91dEluZm87CiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7Ci0gICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKG91dEluZm8sIC8qaXNTdHJlYW1JbmZvVmFsaWQqLyBmYWxzZSwgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICBuZXdPdXRwdXRzTWFwLnZhbHVlQXQoaSksIG1DYW1lcmFJZFN0ciwgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpKTsKKyAgICAgICAgcmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y3JlYXRlU3VyZmFjZUZyb21HYnAob3V0SW5mbywgLyppc1N0cmVhbUluZm9WYWxpZCovIGZhbHNlLAorICAgICAgICAgICAgICAgIHN1cmZhY2UsIG5ld091dHB1dHNNYXAudmFsdWVBdChpKSwgbUNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSk7CiAgICAgICAgIGlmICghcmVzLmlzT2soKSkKICAgICAgICAgICAgIHJldHVybiByZXM7CiAKQEAgLTEzNjQsMjI2ICsxMTM1LDYgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1ib29sIENhbWVyYURldmljZUNsaWVudDo6aXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpCi17Ci0gICAgc3dpdGNoKGZvcm1hdCkgewotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWTg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZMTY6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNjoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzEwOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTI6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0k6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y3JlYXRlU3VyZmFjZUZyb21HYnAoCi0gICAgICAgIE91dHB1dFN0cmVhbUluZm8mIHN0cmVhbUluZm8sIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQsCi0gICAgICAgIHNwPFN1cmZhY2U+JiBzdXJmYWNlLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLAotICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpIHsKLQotICAgIC8vIGJ1ZmZlclByb2R1Y2VyIG11c3QgYmUgbm9uLW51bGwKLSAgICBpZiAoZ2JwID09IG51bGxwdHIpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogU3VyZmFjZSBpcyBOVUxMIiwgY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICBBTE9HVygiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIC8vIEhBQ0sgYi8xMDk0OTEwNQotICAgIC8vIFF1ZXJ5IGNvbnN1bWVyIHVzYWdlIGJpdHMgdG8gc2V0IGFzeW5jIG9wZXJhdGlvbiBtb2RlIGZvcgotICAgIC8vIEdMQ29uc3VtZXIgdXNpbmcgY29udHJvbGxlZEJ5QXBwIHBhcmFtZXRlci4KLSAgICBib29sIHVzZUFzeW5jID0gZmFsc2U7Ci0gICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gZ2JwLT5nZXRDb25zdW1lclVzYWdlKCZjb25zdW1lclVzYWdlKSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgY29uc3VtZXIgdXNhZ2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKGNvbnN1bWVyVXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFKSB7Ci0gICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzIHdpdGggY29uc3VtZXIgdXNhZ2UgZmxhZzogJSIgUFJJdTY0ICI6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSwgY29uc3VtZXJVc2FnZSk7Ci0gICAgICAgIHVzZUFzeW5jID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUOwotICAgIHVpbnQ2NF90IGFsbG93ZWRGbGFncyA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1JFQURfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSOwotICAgIGJvb2wgZmxleGlibGVDb25zdW1lciA9IChjb25zdW1lclVzYWdlICYgZGlzYWxsb3dlZEZsYWdzKSA9PSAwICYmCi0gICAgICAgICAgICAoY29uc3VtZXJVc2FnZSAmIGFsbG93ZWRGbGFncykgIT0gMDsKLQotICAgIHN1cmZhY2UgPSBuZXcgU3VyZmFjZShnYnAsIHVzZUFzeW5jKTsKLSAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOwotCi0gICAgaW50IHdpZHRoLCBoZWlnaHQsIGZvcm1hdDsKLSAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2U7Ci0gICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19XSURUSCwgJndpZHRoKSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2Ugd2lkdGg6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfSEVJR0hULCAmaGVpZ2h0KSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgaGVpZ2h0OiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZm9ybWF0OiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludCo+KCZkYXRhU3BhY2UpKSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IHJlbW92ZSB0aGlzIG92ZXJyaWRlIHNpbmNlIHRoZSBkZWZhdWx0IGZvcm1hdCBzaG91bGQgYmUKLSAgICAvLyAgICAgICBJTVBMRU1FTlRBVElPTl9ERUZJTkVELiBiLzk0ODc0ODIgJiBiLzM1MzE3OTQ0Ci0gICAgaWYgKChmb3JtYXQgPj0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggJiYgZm9ybWF0IDw9IEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4KSAmJgotICAgICAgICAgICAgKChjb25zdW1lclVzYWdlICYgR1JBTExPQ19VU0FHRV9IV19NQVNLKSAmJgotICAgICAgICAgICAgICgoY29uc3VtZXJVc2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLKSA9PSAwKSkpIHsKLSAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJXM6IE92ZXJyaWRpbmcgZm9ybWF0ICUjeCB0byBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpLCBmb3JtYXQpOwotICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7Ci0gICAgfQotICAgIC8vIFJvdW5kIGRpbWVuc2lvbnMgdG8gdGhlIG5lYXJlc3QgZGltZW5zaW9ucyBhdmFpbGFibGUgZm9yIHRoaXMgZm9ybWF0Ci0gICAgaWYgKGZsZXhpYmxlQ29uc3VtZXIgJiYgaXNQdWJsaWNGb3JtYXQoZm9ybWF0KSAmJgotICAgICAgICAgICAgIUNhbWVyYURldmljZUNsaWVudDo6cm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwgLypvdXQqLyZ3aWR0aCwgLypvdXQqLyZoZWlnaHQpKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IE5vIHN1cHBvcnRlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aCAiCi0gICAgICAgICAgICAgICAgImZvcm1hdCAlI3ggZGVmaW5lZCwgZmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZm9ybWF0KTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0KLQotICAgIGlmICghaXNTdHJlYW1JbmZvVmFsaWQpIHsKLSAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IHdpZHRoOwotICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgc3RyZWFtSW5mby5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIHN0cmVhbUluZm8uZGF0YVNwYWNlID0gZGF0YVNwYWNlOwotICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgPSBjb25zdW1lclVzYWdlOwotICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmICh3aWR0aCAhPSBzdHJlYW1JbmZvLndpZHRoKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6U3VyZmFjZSB3aWR0aCBkb2Vzbid0IG1hdGNoOiAlZCB2cyAlZCIsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHdpZHRoLCBzdHJlYW1JbmZvLndpZHRoKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0KLSAgICBpZiAoaGVpZ2h0ICE9IHN0cmVhbUluZm8uaGVpZ2h0KSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6U3VyZmFjZSBoZWlnaHQgZG9lc24ndCBtYXRjaDogJWQgdnMgJWQiLAotICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgaGVpZ2h0LCBzdHJlYW1JbmZvLmhlaWdodCk7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKGZvcm1hdCAhPSBzdHJlYW1JbmZvLmZvcm1hdCkgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOlN1cmZhY2UgZm9ybWF0IGRvZXNuJ3QgbWF0Y2g6ICVkIHZzICVkIiwKLSAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGZvcm1hdCwgc3RyZWFtSW5mby5mb3JtYXQpOwotICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7Ci0gICAgICAgIGlmIChkYXRhU3BhY2UgIT0gc3RyZWFtSW5mby5kYXRhU3BhY2UpIHsKLSAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6U3VyZmFjZSBkYXRhU3BhY2UgZG9lc24ndCBtYXRjaDogJWQgdnMgJWQiLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGF0YVNwYWNlLCBzdHJlYW1JbmZvLmRhdGFTcGFjZSk7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vQXQgdGhlIG5hdGl2ZSBzaWRlLCB0aGVyZSBpc24ndCBhIHdheSB0byBjaGVjayB3aGV0aGVyIDIgc3VyZmFjZXMgY29tZSBmcm9tIHRoZSBzYW1lCi0gICAgICAgIC8vc3VyZmFjZSBjbGFzcyB0eXBlLiBVc2UgdXNhZ2UgZmxhZyB0byBhcHByb3hpbWF0ZSB0aGUgY29tcGFyaXNvbi4KLSAgICAgICAgaWYgKGNvbnN1bWVyVXNhZ2UgIT0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczpTdXJmYWNlIHVzYWdlIGZsYWcgZG9lc24ndCBtYXRjaCAlIiBQUkl1NjQgIiB2cyAlIiBQUkl1NjQgIiIsCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBjb25zdW1lclVzYWdlLCBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLWJvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpyb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3QoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgIGludDMyX3QgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLAotICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpIHsKLQotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzdHJlYW1Db25maWdzID0KLSAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgPwotICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUykgOgotICAgICAgICAgICAgKGRhdGFTcGFjZSA9PSBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9IRUlGKSkgPwotICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMpIDoKLSAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKLQotICAgIGludDMyX3QgYmVzdFdpZHRoID0gLTE7Ci0gICAgaW50MzJfdCBiZXN0SGVpZ2h0ID0gLTE7Ci0KLSAgICAvLyBJdGVyYXRlIHRocm91Z2ggbGlzdGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhbmQgZmluZCB0aGUgb25lIHdpdGggdGhlIHNtYWxsZXN0IGV1Y2xpZGVhbgotICAgIC8vIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIGRpbWVuc2lvbnMgZm9yIHRoZSBnaXZlbiBmb3JtYXQuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdzLmNvdW50OyBpICs9IDQpIHsKLSAgICAgICAgaW50MzJfdCBmbXQgPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2ldOwotICAgICAgICBpbnQzMl90IHcgPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyAxXTsKLSAgICAgICAgaW50MzJfdCBoID0gc3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgMl07Ci0KLSAgICAgICAgLy8gSWdub3JlIGlucHV0L291dHB1dCB0eXBlIGZvciBub3cKLSAgICAgICAgaWYgKGZtdCA9PSBmb3JtYXQpIHsKLSAgICAgICAgICAgIGlmICh3ID09IHdpZHRoICYmIGggPT0gaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgYmVzdFdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgYmVzdEhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodyA8PSBST1VORElOR19XSURUSF9DQVAgJiYgKGJlc3RXaWR0aCA9PSAtMSB8fAotICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VDbGllbnQ6OmV1Y2xpZERpc3RTcXVhcmUodywgaCwgd2lkdGgsIGhlaWdodCkgPAotICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VDbGllbnQ6OmV1Y2xpZERpc3RTcXVhcmUoYmVzdFdpZHRoLCBiZXN0SGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KSkpIHsKLSAgICAgICAgICAgICAgICBiZXN0V2lkdGggPSB3OwotICAgICAgICAgICAgICAgIGJlc3RIZWlnaHQgPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGJlc3RXaWR0aCA9PSAtMSkgewotICAgICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgbm8gY29uZmlndXJhdGlvbnMgZm9yIHRoaXMgZm9ybWF0IHdlcmUgbGlzdGVkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dHMgdG8gdGhlIGNsb3NldCB3aWR0aC9oZWlnaHQKLSAgICBpZiAob3V0V2lkdGggIT0gTlVMTCkgewotICAgICAgICAqb3V0V2lkdGggPSBiZXN0V2lkdGg7Ci0gICAgfQotICAgIGlmIChvdXRIZWlnaHQgIT0gTlVMTCkgewotICAgICAgICAqb3V0SGVpZ2h0ID0gYmVzdEhlaWdodDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBmb3JtYXQgd2FzIGxpc3RlZAotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQ2NF90IENhbWVyYURldmljZUNsaWVudDo6ZXVjbGlkRGlzdFNxdWFyZShpbnQzMl90IHgwLCBpbnQzMl90IHkwLCBpbnQzMl90IHgxLCBpbnQzMl90IHkxKSB7Ci0gICAgaW50NjRfdCBkMCA9IHgwIC0geDE7Ci0gICAgaW50NjRfdCBkMSA9IHkwIC0geTE7Ci0gICAgcmV0dXJuIGQwICogZDAgKyBkMSAqIGQxOwotfQotCiAvLyBDcmVhdGUgYSByZXF1ZXN0IG9iamVjdCBmcm9tIGEgdGVtcGxhdGUuCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAogICAgICAgICAvKm91dCovCkBAIC0xODk2LDggKzE0NDcsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKLSAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAobVN0cmVhbUluZm9NYXBbc3RyZWFtSWRdLCB0cnVlIC8qaXNTdHJlYW1JbmZvVmFsaWQqLywKLSAgICAgICAgICAgICAgICBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwgbUNhbWVyYUlkU3RyLCBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxJZCkpOworICAgICAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicChtU3RyZWFtSW5mb01hcFtzdHJlYW1JZF0sCisgICAgICAgICAgICAgICAgdHJ1ZSAvKmlzU3RyZWFtSW5mb1ZhbGlkKi8sIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLCBtQ2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsSWQpKTsKIAogICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjE2MiwxNCArMTcxNCwxNiBAQAogICAgIG1TdHJlYW1pbmdSZXF1ZXN0SWQgPSBSRVFVRVNUX0lEX05PTkU7CiB9CiAKLXZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlJZGxlKCkgewordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeUlkbGUoCisgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAKICAgICBpZiAocmVtb3RlQ2IgIT0gMCkgewogICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VJZGxlKCk7CiAgICAgfQotICAgIENhbWVyYTJDbGllbnRCYXNlOjpub3RpZnlJZGxlKCk7CisgICAgQ2FtZXJhMkNsaWVudEJhc2U6Om5vdGlmeUlkbGUocmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgc3RyZWFtU3RhdHMpOwogfQogCiB2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCkBAIC0yMjA1LDYgKzE3NTksNyBAQAogdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6OmRldGFjaERldmljZSgpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm47CiAKKyAgICBuc2Vjc190IHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBBTE9HVigiQ2FtZXJhICVzOiBTdG9wcGluZyBwcm9jZXNzb3JzIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKIAogICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVtb3ZlTGlzdGVuZXIoY2FtZXJhMjo6RnJhbWVQcm9jZXNzb3JCYXNlOjpGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lELApAQCAtMjIzOSw2ICsxNzk0LDkgQEAKICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLmNsZWFyKCk7CiAKICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6ZGV0YWNoRGV2aWNlKCk7CisKKyAgICBpbnQzMl90IGNsb3NlTGF0ZW5jeU1zID0gbnMybXMoc3lzdGVtVGltZSgpIC0gc3RhcnRUaW1lKTsKKyAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dDbG9zZShtQ2FtZXJhSWRTdHIsIGNsb3NlTGF0ZW5jeU1zKTsKIH0KIAogLyoqIERldmljZS1yZWxhdGVkIG1ldGhvZHMgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IDlkMzg3NGYuLjVkNDBiODIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtNTAsNyArNTAsNyBAQAogICAgIENhbWVyYURldmljZUNsaWVudEJhc2UoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC05NSw2ICs5NSw3IEBACiAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lTXMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBvZmZsaW5lU3RyZWFtSWRzKSBvdmVycmlkZTsKIApAQCAtMTc1LDcgKzE3Niw3IEBACiAgICAgQ2FtZXJhRGV2aWNlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLApAQCAtMTk2LDcgKzE5Nyw4IEBACiAgICAgICogRGV2aWNlIGxpc3RlbmVyIGludGVyZmFjZQogICAgICAqLwogCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCk7CkBAIC0yMDQsMTYgKzIwNiw2IEBACiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVJlcXVlc3RRdWV1ZUVtcHR5KCk7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVJlcGVhdGluZ1JlcXVlc3RFcnJvcihsb25nIGxhc3RGcmFtZU51bWJlcik7CiAKLSAgICAvLyB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgQUlETCBTZXNzaW9uQ29uZmlndXJhdGlvbiB0byBISURMCi0gICAgLy8gc3RyZWFtQ29uZmlndXJhdGlvbi4gQWxzbyBjaGVja3MgZm9yIHZhbGlkaXR5IG9mIFNlc3Npb25Db25maWd1cmF0aW9uIGFuZAotICAgIC8vIHJldHVybnMgYSBub24tb2sgYmluZGVyOjpTdGF0dXMgaWYgdGhlIHBhc3NlZCBpbiBzZXNzaW9uIGNvbmZpZ3VyYXRpb24KLSAgICAvLyBpc24ndCB2YWxpZC4KLSAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMKLSAgICBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8sCi0gICAgICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGJvb2wgKmVhcmx5RXhpdCk7CiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgaW5kZXBlbmRlbnQgY29tcG9uZW50cyBvZiBDYW1lcmFEZXZpY2VDbGllbnQuCiAgICAgICovCkBAIC0yNjYsMTggKzI1OCw4IEBACiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaWRTdGF0dXMoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbik7Ci0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7Ci0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywgYm9vbCBkZWZlcnJlZENvbnN1bWVyLAotICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlKTsKLSAgICBzdGF0aWMgdm9pZCBtYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBTdHJpbmc4IHBoeXNpY2FsSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pOwogICAgIGJvb2wgZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOwogCi0gICAgLy8gRmluZCB0aGUgc3F1YXJlIG9mIHRoZSBldWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzCi0gICAgc3RhdGljIGludDY0X3QgZXVjbGlkRGlzdFNxdWFyZShpbnQzMl90IHgwLCBpbnQzMl90IHkwLCBpbnQzMl90IHgxLCBpbnQzMl90IHkxKTsKLQogICAgIC8vIENyZWF0ZSBhbiBvdXRwdXQgc3RyZWFtIHdpdGggc3VyZmFjZSBkZWZlcnJlZCBmb3IgZnV0dXJlLgogICAgIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZURlZmVycmVkU3VyZmFjZVN0cmVhbUxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24sCkBAIC0yODgsMzMgKzI3MCwxMSBAQAogICAgIC8vIGNhc2VzLgogICAgIGJpbmRlcjo6U3RhdHVzIHNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChpbnQgc3RyZWFtSWQpOwogCi0gICAgLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKLSAgICAvLyBhIHdpZHRoIDw9IFJPVU5ESU5HX1dJRFRIX0NBUAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFJPVU5ESU5HX1dJRFRIX0NBUCA9IDE5MjA7Ci0gICAgc3RhdGljIGJvb2wgcm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sCi0gICAgICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpOwotCi0gICAgLy9jaGVjayBpZiBmb3JtYXQgaXMgbm90IGN1c3RvbSBmb3JtYXQKLSAgICBzdGF0aWMgYm9vbCBpc1B1YmxpY0Zvcm1hdChpbnQzMl90IGZvcm1hdCk7Ci0KLSAgICAvLyBDcmVhdGUgYSBTdXJmYWNlIGZyb20gYW4gSUdyYXBoaWNCdWZmZXJQcm9kdWNlci4gUmV0dXJucyBlcnJvciBpZgotICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXIncyBwcm9wZXJ0eSBkb2Vzbid0IG1hdGNoIHdpdGggc3RyZWFtSW5mbwotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjcmVhdGVTdXJmYWNlRnJvbUdicChPdXRwdXRTdHJlYW1JbmZvJiBzdHJlYW1JbmZvLCBib29sIGlzU3RyZWFtSW5mb1ZhbGlkLAotICAgICAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAotICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOwotCi0KICAgICAvLyBVdGlsaXR5IG1ldGhvZCB0byBpbnNlcnQgdGhlIHN1cmZhY2UgaW50byBTdXJmYWNlTWFwCiAgICAgYmluZGVyOjpTdGF0dXMgaW5zZXJ0R2JwTG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCiAgICAgICAgICAgICAvKm91dCovU3VyZmFjZU1hcCogc3VyZmFjZU1hcCwgLypvdXQqL1ZlY3RvcjxpbnQzMl90Piogc3RyZWFtSWRzLAogICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqICBjdXJyZW50U3RyZWFtSWQpOwogCi0gICAgLy8gQ2hlY2sgdGhhdCB0aGUgcGh5c2ljYWxDYW1lcmFJZCBwYXNzZWQgaW4gaXMgc3Bwb3J0ZWQgYnkgdGhlIGNhbWVyYQotICAgIC8vIGRldmljZS4KLSAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgY2hlY2tQaHlzaWNhbENhbWVyYUlkKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLCBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQpOwotCiAgICAgLy8gSUdyYXBoaWNzQnVmZmVyUHJvZHVjZXIgYmluZGVyIC0+IFN0cmVhbSBJRCArIFN1cmZhY2UgSUQgZm9yIG91dHB1dCBzdHJlYW1zCiAgICAgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIFN0cmVhbVN1cmZhY2VJZD4gbVN0cmVhbU1hcDsKIApAQCAtMzQ2LDcgKzMwNiw2IEBACiAKICAgICBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgc3A8Q29tcG9zaXRlU3RyZWFtPj4gbUNvbXBvc2l0ZVN0cmVhbU1hcDsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gNDsKICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuY3BwCmluZGV4IDIzN2MyNGIuLjYyYjU0NzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuY3BwCkBAIC0yNjUsNyArMjY1LDkgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6Om5vdGlmeUlkbGUoKSB7Cit2b2lkIENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50Ojpub3RpZnlJZGxlKAorICAgICAgICBpbnQ2NF90IC8qcmVxdWVzdENvdW50Ki8sIGludDY0X3QgLypyZXN1bHRFcnJvckNvdW50Ki8sIGJvb2wgLypkZXZpY2VFcnJvciovLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiAvKnN0cmVhbVN0YXRzKi8pIHsKICAgICBpZiAobVJlbW90ZUNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vbkRldmljZUlkbGUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgKaW5kZXggYjY3ZmNiMy4uODM5YzQzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaApAQCAtNDgsNyArNDgsNyBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIHNwPENvbXBvc2l0ZVN0cmVhbT4+JiBvZmZsaW5lQ29tcG9zaXRlU3RyZWFtTWFwLAogICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCkgOgogICAgICAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoCkBAIC04Niw3ICs4Niw4IEBACiAgICAgLy8gTm90aWZpY2F0aW9uTGlzdGVuZXIgQVBJCiAgICAgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKICAgICB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBub3RpZnlJZGxlKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBub3RpZnlJZGxlKGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cykgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlBdXRvV2hpdGViYWxhbmNlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKaW5kZXggYTYzZjQwMi4uYTcxNzNkMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCkBAIC02NSw3ICs2NSw2IEBACiAgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZChmYWxzZSksCiAgICAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBQcm9kdWNlckxpc3RlbmVyKCkpLAogICAgICAgICBtRGVxdWV1ZWRPdXRwdXRCdWZmZXJDbnQoMCksCi0gICAgICAgIG1Mb2NrZWRBcHBTZWdtZW50QnVmZmVyQ250KDApLAogICAgICAgICBtQ29kZWNPdXRwdXRDb3VudGVyKDApLAogICAgICAgICBtUXVhbGl0eSgtMSksCiAgICAgICAgIG1HcmlkVGltZXN0YW1wVXMoMCksCkBAIC01MTAsNyArNTA5LDggQEAKIAogICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CiAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgewotICAgICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6c3RyaW5nKCJIZWljU3RyZWFtICIpICsgc3RkOjp0b19zdHJpbmcoZ2V0U3RyZWFtSWQoKSk7CisgICAgICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudChuYW1lKTsKICAgICB9CiAKICAgICBydW4oIkhlaWNDb21wb3NpdGVTdHJlYW1Qcm9jIik7CkBAIC02MzQsNyArNjM0LDYgQEAKICAgICAgICAgICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tmcmFtZU51bWJlcl0uYXBwU2VnbWVudEJ1ZmZlciA9IGltZ0J1ZmZlcjsKLSAgICAgICAgICAgIG1Mb2NrZWRBcHBTZWdtZW50QnVmZmVyQ250Kys7CiAgICAgICAgIH0KICAgICAgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuZXJhc2UoaXQpOwogICAgICAgICBtQXBwU2VnbWVudEZyYW1lTnVtYmVycy5wb3AoKTsKQEAgLTg5NywxMCArODk2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobUxvY2tlZEFwcFNlZ21lbnRCdWZmZXJDbnQgPT0ga01heEFjcXVpcmVkQXBwU2VnbWVudCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXQtb2Ytb3JkZXIgYXBwIHNlZ21lbnQgYnVmZmVycyByZWFjaGVzIGxpbWl0ICV1IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBrTWF4QWNxdWlyZWRBcHBTZWdtZW50KTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTAzOCw3ICsxMDMzLDYgQEAKICAgICBtQXBwU2VnbWVudENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyKTsKICAgICBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSA9IG51bGxwdHI7CiAgICAgaW5wdXRGcmFtZS5leGlmRXJyb3IgPSBmYWxzZTsKLSAgICBtTG9ja2VkQXBwU2VnbWVudEJ1ZmZlckNudC0tOwogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaAppbmRleCAzM2NhNjlhLi5hMzczMTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaApAQCAtMjUzLDcgKzI1Myw2IEBACiAKICAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBBUFAgc2VnbWVudCBCbG9iIGJ1ZmZlciBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXRBcHBTZWdtZW50QnVmZmVyczsKLSAgICBpbnQzMl90ICAgICAgICAgICBtTG9ja2VkQXBwU2VnbWVudEJ1ZmZlckNudDsKIAogICAgIC8vIEtlZXAgYWxsIGluY29taW5nIEhFSUMgYmxvYiBidWZmZXIgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCiAgICAgc3RkOjp2ZWN0b3I8Q29kZWNPdXRwdXRCdWZmZXJJbmZvPiBtQ29kZWNPdXRwdXRCdWZmZXJzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggMGE0MTc3Ni4uNmZkOGQ0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC0yNywxMiArMjcsMTUgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmg+CisKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCIKIAogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTI7CkBAIC00NCw3ICs0Nyw3IEBACiAgICAgICAgIGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxUQ2FtQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKQEAgLTE5NCw3ICsxOTcsNyBAQAogCiAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKIAotICAgIEFMT0dWKCJDYW1lcmEgJXM6IFNodXQgZG93biBjb21wbGV0ZSBjb21wbGV0ZSIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgIEFMT0dWKCJDYW1lcmEgJXM6IFNodXQgZG93biBjb21wbGV0ZSIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogCiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTI0NSwxMyArMjQ4LDEyIEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlJZGxlKCkgewordm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUlkbGUoCisgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CiAgICAgaWYgKG1EZXZpY2VBY3RpdmUpIHsKLSAgICAgICAgZ2V0Q2FtZXJhU2VydmljZSgpLT51cGRhdGVQcm94eURldmljZVN0YXRlKAotICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9JRExFLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLAotICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFGYWNpbmcsIFRDbGllbnRCYXNlOjptQ2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAoKG1BcGkxQ2FtZXJhSWQgPCAwKSA/IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzIgOgotICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpKTsKKyAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nSWRsZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKICAgICB9CiAgICAgbURldmljZUFjdGl2ZSA9IGZhbHNlOwogCkBAIC0yNjUsMTEgKzI2Nyw3IEBACiAgICAgKHZvaWQpdGltZXN0YW1wOwogCiAgICAgaWYgKCFtRGV2aWNlQWN0aXZlKSB7Ci0gICAgICAgIGdldENhbWVyYVNlcnZpY2UoKS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfU1RBVEVfQUNUSVZFLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLAotICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFGYWNpbmcsIFRDbGllbnRCYXNlOjptQ2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAoKG1BcGkxQ2FtZXJhSWQgPCAwKSA/IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzIgOgotICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpKTsKKyAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQWN0aXZlKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIpOwogICAgIH0KICAgICBtRGV2aWNlQWN0aXZlID0gdHJ1ZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCAwNDJmNWFhLi4xY2U0MzkzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtNDgsNyArNDgsNyBAQAogICAgIENhbWVyYTJDbGllbnRCYXNlKGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtNjYsNyArNjYsOSBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlJZGxlKCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUlkbGUoaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRldmljZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgKaW5kZXggMWY4MzVhOS4uZTAyZTE0NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuaApAQCAtMTcsMTEgKzE3LDE0IEBACiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBT0ZGTElORVNFU1NJT05CQVNFX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFPRkZMSU5FU0VTU0lPTkJBU0VfSAogCisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCisjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oIgogI2luY2x1ZGUgIkZyYW1lUHJvZHVjZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzksNyArNDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMpID0gMDsKIAogICAgIC8vIFJlcXVpcmVkIG9ubHkgZm9yIEFQSTIKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvciwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IDMyZDExOGQuLmU5ZGNiMDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC00MTcsNDYgKzQxNyw2IEBACiAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKSB7Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwotCi0gICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsCi0gICAgICAgICAgICAvKm1pblZlcnNpb24qLyB7MSwwfSwgLyptYXhWZXJzaW9uKi8gezIsMH0pOwotICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLQotICAgIGF1dG8gKmRldmljZUluZm8xID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMSo+KGRldmljZUluZm8pOwotICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIgPSBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpOwotICAgIGlmIChwYXJlbnRQcm92aWRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPSBwYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOwotICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7Ci0KLSAgICBhdXRvIGludGVyZmFjZSA9IGRldmljZUluZm8xLT5zdGFydERldmljZUludGVyZmFjZTwKLSAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6SW50ZXJmYWNlVD4oKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgcmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOwotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgKnNlc3Npb24gPSBpbnRlcmZhY2U7Ci0gICAgfQotICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLX0KLQogdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpIHsKICAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CkBAIC0xMzQ0LDYgKzEzMDQsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZSBjYWxsYmFja3MgbWF5IGJlIGNhbGxlZCAoYW5kIGNhdXNpbmcgbmV3IGRldmljZXMgYWRkZWQpCisgICAgLy8gYmVmb3JlIHNldENhbGxiYWNrIHJldHVybnMKKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBzZXR0aW5nIHVwIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byByZWdpc3RlciBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCiAgICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKICAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCkBAIC0xMzcyLDcgKzEzNDYsNiBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgdGhpcywgJmRldmljZXNdKApAQCAtMTQzNywyNiArMTQxMCw0MyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKLSAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucy4gc2V0Q2FsbGJhY2sgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWRkRGV2aWNlIHNvIHRoYXQKLSAgICAvLyB0aGUgcGh5c2ljYWwgY2FtZXJhIHN0YXR1cyBjYWxsYmFjayBjYW4gbG9vayB1cCBhdmFpbGFibGUgcmVndWxhcgotICAgIC8vIGNhbWVyYXMuCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0ID0gaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKLSAgICBpZiAoIXN0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3QuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAoc3QgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byByZWdpc3RlciBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0KTsKLSAgICB9Ci0KICAgICBBTE9HSSgiQ2FtZXJhIHByb3ZpZGVyICVzIHJlYWR5IHdpdGggJXp1IGNhbWVyYSBkZXZpY2VzIiwKICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZXMuc2l6ZSgpKTsKIAotICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgLy8gUHJvY2VzcyBjYWNoZWQgc3RhdHVzIGNhbGxiYWNrcworICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+IGNhY2hlZFN0YXR1cyA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPj4oKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Jbml0TG9jayk7CisKKyAgICAgICAgZm9yIChhdXRvJiBzdGF0dXNJbmZvIDogbUNhY2hlZFN0YXR1cykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgaWQsIHBoeXNpY2FsSWQ7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgICAgIGlmIChzdGF0dXNJbmZvLmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgmaWQsICZwaHlzaWNhbElkLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNJbmZvLmNhbWVyYUlkLCBzdGF0dXNJbmZvLnBoeXNpY2FsQ2FtZXJhSWQsIHN0YXR1c0luZm8uc3RhdHVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgc3RhdHVzSW5mby5jYW1lcmFJZCwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIGNhY2hlZFN0YXR1cy0+ZW1wbGFjZV9iYWNrKHN0YXR1c0luZm8uaXNQaHlzaWNhbENhbWVyYVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLmNfc3RyKCksIHBoeXNpY2FsSWQuY19zdHIoKSwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYWNoZWRTdGF0dXMuY2xlYXIoKTsKKworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIFRoZSBjYWNoZWQgc3RhdHVzIGNoYW5nZSBjYWxsYmFja3MgY2Fubm90IGJlIGZpcmVkIGRpcmVjdGx5IGZyb20gdGhpcworICAgIC8vIGZ1bmN0aW9uLCBkdWUgdG8gc2FtZS10aHJlYWQgZGVhZGxvY2sgdHJ5aW5nIHRvIGFjcXVpcmUgbUludGVyZmFjZU11dGV4CisgICAgLy8gdHdpY2UuCisgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUluaXRpYWxTdGF0dXNDYWxsYmFja0Z1dHVyZSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLAorICAgICAgICAgICAgICAgICZDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5SW5pdGlhbFN0YXR1c0NoYW5nZSwgdGhpcywKKyAgICAgICAgICAgICAgICBsaXN0ZW5lciwgc3RkOjptb3ZlKGNhY2hlZFN0YXR1cykpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTUzNyw5ICsxNTI3LDkgQEAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4gZGV2aWNlSW5mbzsKICAgICBzd2l0Y2ggKG1ham9yKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGRldmljZUluZm8gPSBpbml0aWFsaXplRGV2aWNlSW5mbzxEZXZpY2VJbmZvMT4obmFtZSwgbVByb3ZpZGVyVGFnaWQsCi0gICAgICAgICAgICAgICAgICAgIGlkLCBtaW5vcik7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbnN1cHBvcnRlZCBISURMIGRldmljZSBIQUwgbWFqb3IgdmVyc2lvbiAlZDoiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgbWFqb3IpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgZGV2aWNlSW5mbyA9IGluaXRpYWxpemVEZXZpY2VJbmZvPERldmljZUluZm8zPihuYW1lLCBtUHJvdmlkZXJUYWdpZCwKICAgICAgICAgICAgICAgICAgICAgaWQsIG1pbm9yKTsKQEAgLTE3MzQsMTA0ICsxNzI0LDEzOSBAQAogICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHN0ZDo6c3RyaW5nIGlkOwotICAgIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5pdExvY2spOworCisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUNhY2hlZFN0YXR1cy5lbXBsYWNlX2JhY2soZmFsc2UgLyppc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKi8sCisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBzdGQ6OnN0cmluZygpLmNfc3RyKCksIG5ld1N0YXR1cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKwogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgICAgICBib29sIGtub3duID0gZmFsc2U7Ci0gICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IG1EZXZpY2VzKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bU5hbWUgPT0gY2FtZXJhRGV2aWNlTmFtZSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgZGV2aWNlICVzIHN0YXR1cyBpcyBub3cgJXMsIHdhcyAlcyIsIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cyksIGRldmljZVN0YXR1c1RvU3RyaW5nKGRldmljZUluZm8tPm1TdGF0dXMpKTsKLSAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tU3RhdHVzID0gbmV3U3RhdHVzOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBkZXZpY2UgcmVtb3ZhbCAoTk9UX1BSRVNFTlQpCi0gICAgICAgICAgICAgICAgaWQgPSBkZXZpY2VJbmZvLT5tSWQ7Ci0gICAgICAgICAgICAgICAga25vd24gPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFByZXZpb3VzbHkgdW5zZWVuIGRldmljZTsgc3RhdHVzIG11c3Qgbm90IGJlIE5PVF9QUkVTRU5UCi0gICAgICAgIGlmICgha25vd24pIHsKLSAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgcHJvdmlkZXIgJXMgc2F5cyBhbiB1bmtub3duIGNhbWVyYSBkZXZpY2UgJXMgaXMgbm90IHByZXNlbnQuIEN1cmlvdXMuIiwKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkRGV2aWNlKGNhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cywgJmlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVCkgewotICAgICAgICAgICAgcmVtb3ZlRGV2aWNlKGlkKTsKKyAgICAgICAgaWYgKE9LICE9IGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgmaWQsIGNhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cykpIHsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgICAgICB9CiAgICAgICAgIGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7Ci0gICAgICAgIGluaXRpYWxpemVkID0gbUluaXRpYWxpemVkOwotICAgICAgICBpZiAocmVDYWNoZUNvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHNMb2NrZWQoKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmFQcm92aWRlciAlcyBjb3VsZCBub3QgcmUtY2FjaGUgY29uY3VycmVudCBzdHJlYW1pbmcgY2FtZXJhIGlkIGxpc3QgIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgIH0KICAgICB9CisKICAgICAvLyBDYWxsIHdpdGhvdXQgbG9jayBoZWxkIHRvIGFsbG93IHJlZW50cmFuY3kgaW50byBwcm92aWRlciBtYW5hZ2VyCi0gICAgLy8gRG9uJ3Qgc2VuZCB0aGUgY2FsbGJhY2sgaWYgcHJvdmlkZXJJbmZvIGhhc24ndCBiZWVuIGluaXRpYWxpemVkLgotICAgIC8vIENhbWVyYVNlcnZpY2Ugd2lsbCBpbml0aWFsaXplIGRldmljZSBzdGF0dXMgYWZ0ZXIgcHJvdmlkZXIgaXMKLSAgICAvLyBpbml0aWFsaXplZAotICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyICYmIGluaXRpYWxpemVkKSB7CisgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKICAgICAgICAgbGlzdGVuZXItPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLCBuZXdTdGF0dXMpOwogICAgIH0KKwogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKAorICAgICAgICBzdGQ6OnN0cmluZyogaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgeworICAgIGJvb2wga25vd24gPSBmYWxzZTsKKyAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKKyAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBtRGV2aWNlcykgeworICAgICAgICBpZiAoZGV2aWNlSW5mby0+bU5hbWUgPT0gY2FtZXJhRGV2aWNlTmFtZSkgeworICAgICAgICAgICAgQUxPR0koIkNhbWVyYSBkZXZpY2UgJXMgc3RhdHVzIGlzIG5vdyAlcywgd2FzICVzIiwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpLCBkZXZpY2VTdGF0dXNUb1N0cmluZyhkZXZpY2VJbmZvLT5tU3RhdHVzKSk7CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tU3RhdHVzID0gbmV3U3RhdHVzOworICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGRldmljZSByZW1vdmFsIChOT1RfUFJFU0VOVCkKKyAgICAgICAgICAgIGNhbWVyYUlkID0gZGV2aWNlSW5mby0+bUlkOworICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gUHJldmlvdXNseSB1bnNlZW4gZGV2aWNlOyBzdGF0dXMgbXVzdCBub3QgYmUgTk9UX1BSRVNFTlQKKyAgICBpZiAoIWtub3duKSB7CisgICAgICAgIGlmIChuZXdTdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVCkgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBwcm92aWRlciAlcyBzYXlzIGFuIHVua25vd24gY2FtZXJhIGRldmljZSAlcyBpcyBub3QgcHJlc2VudC4gQ3VyaW91cy4iLAorICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYWRkRGV2aWNlKGNhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cywgJmNhbWVyYUlkKTsKKyAgICB9IGVsc2UgaWYgKG5ld1N0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UKSB7CisgICAgICAgIHJlbW92ZURldmljZShjYW1lcmFJZCk7CisgICAgfQorICAgIGlmIChyZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhUHJvdmlkZXIgJXMgY291bGQgbm90IHJlLWNhY2hlIGNvbmN1cnJlbnQgc3RyZWFtaW5nIGNhbWVyYSBpZCBsaXN0ICIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgfQorICAgICppZCA9IGNhbWVyYUlkOworICAgIHJldHVybiBPSzsKK30KKwogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCiAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIHsKICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXI7CiAgICAgc3RkOjpzdHJpbmcgaWQ7Ci0gICAgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsSWQ7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluaXRMb2NrKTsKKworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIG1DYWNoZWRTdGF0dXMuZW1wbGFjZV9iYWNrKHRydWUgLyppc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKi8sIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICAgICAgYm9vbCBrbm93biA9IGZhbHNlOwotICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBtRGV2aWNlcykgewotICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1OYW1lID09IGNhbWVyYURldmljZU5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZCA9IGRldmljZUluZm8tPm1JZDsKIAotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY29tYmluYXRpb24gb2YgY2FtZXJhIGlkICVzLCBwaHlzaWNhbCBpZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5iZWdpbigpLCBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYURldmljZU5hbWUpID09IGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY29tYmluYXRpb24gb2YgY2FtZXJhIGlkICVzLCBwaHlzaWNhbCBpZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhIGRldmljZSAlcyBwaHlzaWNhbCBkZXZpY2UgJXMgc3RhdHVzIGlzIG5vdyAlcywgd2FzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpLCBkZXZpY2VTdGF0dXNUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1QaHlzaWNhbFN0YXR1c1twaHlzaWNhbENhbWVyYURldmljZU5hbWVdKSk7Ci0gICAgICAgICAgICAgICAga25vd24gPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFByZXZpb3VzbHkgdW5zZWVuIGRldmljZTsgc3RhdHVzIG11c3Qgbm90IGJlIE5PVF9QUkVTRU5UCi0gICAgICAgIGlmICgha25vd24pIHsKLSAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgcHJvdmlkZXIgJXMgc2F5cyBhbiB1bmtub3duIGNhbWVyYSBkZXZpY2UgJXMtJXMgaXMgbm90IHByZXNlbnQuIEN1cmlvdXMuIiwKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKE9LICE9IHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgJnBoeXNpY2FsSWQsIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMpKSB7CiAgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICAgICAgfQorCiAgICAgICAgIGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7Ci0gICAgICAgIGluaXRpYWxpemVkID0gbUluaXRpYWxpemVkOwogICAgIH0KICAgICAvLyBDYWxsIHdpdGhvdXQgbG9jayBoZWxkIHRvIGFsbG93IHJlZW50cmFuY3kgaW50byBwcm92aWRlciBtYW5hZ2VyCi0gICAgLy8gRG9uJ3Qgc2VuZCB0aGUgY2FsbGJhY2sgaWYgcHJvdmlkZXJJbmZvIGhhc24ndCBiZWVuIGluaXRpYWxpemVkLgotICAgIC8vIENhbWVyYVNlcnZpY2Ugd2lsbCBpbml0aWFsaXplIGRldmljZSBzdGF0dXMgYWZ0ZXIgcHJvdmlkZXIgaXMKLSAgICAvLyBpbml0aWFsaXplZAotICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyICYmIGluaXRpYWxpemVkKSB7Ci0gICAgICAgIFN0cmluZzggcGh5c2ljYWxJZChwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKSk7CisgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKICAgICAgICAgbGlzdGVuZXItPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLAotICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQsIG5ld1N0YXR1cyk7CisgICAgICAgICAgICAgICAgU3RyaW5nOChwaHlzaWNhbElkLmNfc3RyKCkpLCBuZXdTdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBzdGQ6OnN0cmluZyogcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgeworICAgIGJvb2wga25vd24gPSBmYWxzZTsKKyAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKKyAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBtRGV2aWNlcykgeworICAgICAgICBpZiAoZGV2aWNlSW5mby0+bU5hbWUgPT0gY2FtZXJhRGV2aWNlTmFtZSkgeworICAgICAgICAgICAgY2FtZXJhSWQgPSBkZXZpY2VJbmZvLT5tSWQ7CisgICAgICAgICAgICBpZiAoIWRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY29tYmluYXRpb24gb2YgY2FtZXJhIGlkICVzLCBwaHlzaWNhbCBpZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLmNfc3RyKCksIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuYmVnaW4oKSwgZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYURldmljZU5hbWUpID09IGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb21iaW5hdGlvbiBvZiBjYW1lcmEgaWQgJXMsIHBoeXNpY2FsIGlkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuY19zdHIoKSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhIGRldmljZSAlcyBwaHlzaWNhbCBkZXZpY2UgJXMgc3RhdHVzIGlzIG5vdyAlcyIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOworICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gUHJldmlvdXNseSB1bnNlZW4gZGV2aWNlOyBzdGF0dXMgbXVzdCBub3QgYmUgTk9UX1BSRVNFTlQKKyAgICBpZiAoIWtub3duKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgcHJvdmlkZXIgJXMgc2F5cyBhbiB1bmtub3duIGNhbWVyYSBkZXZpY2UgJXMtJXMgaXMgbm90IHByZXNlbnQuIEN1cmlvdXMuIiwKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKmlkID0gY2FtZXJhSWQ7CisgICAgKnBoeXNpY2FsSWQgPSBwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnRvcmNoTW9kZVN0YXR1c0NoYW5nZSgKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSB7CkBAIC0xOTg2LDYgKzIwMTEsMjAgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86Om5vdGlmeUluaXRpYWxTdGF0dXNDaGFuZ2UoCisgICAgICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciwKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPj4gY2FjaGVkU3RhdHVzKSB7CisgICAgZm9yIChhdXRvJiBzdGF0dXNJbmZvIDogKmNhY2hlZFN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzSW5mby5pc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKFN0cmluZzgoc3RhdHVzSW5mby5jYW1lcmFJZC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChzdGF0dXNJbmZvLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSksIHN0YXR1c0luZm8uc3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc3RhdHVzSW5mby5jYW1lcmFJZC5jX3N0cigpKSwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICB9CisgICAgfQorfQorCiB0ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbz4KICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZURldmljZUluZm8oCkBAIC0yMDM0LDM1ICsyMDczLDYgQEAKIH0KIAogdGVtcGxhdGU8Pgotc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7Ci0gICAgU3RhdHVzIHN0YXR1czsKLSAgICBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WMV94KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKLSAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gb2J0YWluIGludGVyZmFjZSBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvYnRhaW4gaW50ZXJmYWNlIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIGNhbWVyYUludGVyZmFjZTsKLX0KLQotdGVtcGxhdGU8Pgogc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPgogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCiAgICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CkBAIC0yMTE1LDEyNiArMjEyNSw2IEBACiAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzKTsKIH0KIAotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpEZXZpY2VJbmZvMShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAotICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKLSAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCi0gICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgotICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewotICAgIC8vIEdldCBkZWZhdWx0IHBhcmFtZXRlcnMgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKLSAgICAvLyBSZXF1aXJlcyBwb3dlcmluZyBvbiB0aGUgY2FtZXJhIGRldmljZQotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPm9wZW4obnVsbHB0cik7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBjYW1lcmEgZGV2aWNlICVzIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvcGVuIGNhbWVyYSBkZXZpY2UgJXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgaWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBpbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoW3RoaXNdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGFybXMpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdFBhcmFtZXRlcnMudW5mbGF0dGVuKFN0cmluZzgocGFybXMuY19zdHIoKSkpOwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgcmVhZGluZyBjYW1lcmEgZGV2aWNlICVzIHBhcmFtcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjb25zdCBjaGFyICpmbGFzaE1vZGUgPQotICAgICAgICAgICAgbURlZmF1bHRQYXJhbWV0ZXJzLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTKTsKLSAgICBpZiAoZmxhc2hNb2RlICYmIHN0cnN0cihmbGFzaE1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfVE9SQ0gpKSB7Ci0gICAgICAgIG1IYXNGbGFzaFVuaXQgPSB0cnVlOwotICAgIH0KLQotICAgIHN0YXR1c190IHJlcyA9IGNhY2hlQ2FtZXJhSW5mbyhpbnRlcmZhY2UpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgY2FjaGUgQ2FtZXJhSW5mbyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZXQgPSBpbnRlcmZhY2UtPmNsb3NlKCk7Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2xvc2luZyBjYW1lcmEgZGV2aWNlICVzIGFmdGVyIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKLSAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQotICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0gICAgfQotfQotCi1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6On5EZXZpY2VJbmZvMSgpIHt9Ci0KLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIHJldHVybiBzZXRUb3JjaE1vZGVGb3JEZXZpY2U8SW50ZXJmYWNlVD4oZW5hYmxlZCk7Ci19Ci0KLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6Z2V0Q2FtZXJhSW5mbygKLSAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IHsKLSAgICBpZiAoaW5mbyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICppbmZvID0gbUluZm87Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmNhY2hlQ2FtZXJhSW5mbygKLSAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIHsKLSAgICBTdGF0dXMgc3RhdHVzOwotICAgIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjSW5mbzsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUluZm8oWyZzdGF0dXMsICZjSW5mb10oU3RhdHVzIHMsIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjYW1JbmZvKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBjSW5mbyA9IGNhbUluZm87Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciByZWFkaW5nIGNhbWVyYSBpbmZvIGZyb20gZGV2aWNlICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2goY0luZm8uZmFjaW5nKSB7Ci0gICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkJBQ0s6Ci0gICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkVYVEVSTkFMOgotICAgICAgICAgICAgLy8gTWFwIGV4dGVybmFsIHRvIGZyb250IGZvciBsZWdhY3kgQVBJCi0gICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkZST05UOgotICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfRlJPTlQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCIlczogRGV2aWNlICVzOiBVbmtub3duIGNhbWVyYSBmYWNpbmc6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgY0luZm8uZmFjaW5nKTsKLSAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7Ci0gICAgfQotICAgIG1JbmZvLm9yaWVudGF0aW9uID0gY0luZm8ub3JpZW50YXRpb247Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6ZHVtcFN0YXRlKGludCBmZCkgewotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKLSAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzID0gaW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgIGlmICghcy5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHMpOwotfQotCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkRldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCkBAIC0yNjg5LDkgKzI1NzksMTEgQEAKIAogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6flByb3ZpZGVySW5mbygpIHsKKyAgICBpZiAobUluaXRpYWxTdGF0dXNDYWxsYmFja0Z1dHVyZS52YWxpZCgpKSB7CisgICAgICAgIG1Jbml0aWFsU3RhdHVzQ2FsbGJhY2tGdXR1cmUud2FpdCgpOworICAgIH0KICAgICAvLyBEZXN0cnVjdGlvbiBvZiBQcm92aWRlckluZm8gaXMgb25seSBzdXBwb3NlZCB0byBoYXBwZW4gd2hlbiB0aGUgcmVzcGVjdGl2ZQogICAgIC8vIENhbWVyYVByb3ZpZGVyIGludGVyZmFjZSBkaWVzLCBzbyBkbyBub3QgdW5yZWdpc3RlciBjYWxsYmFja3MuCi0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoY29uc3QgU3RhdHVzJiBzKSAgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IDI1ZDM2MzkuLjg3MjdlN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxmdXR1cmU+CiAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9Db25jdXJyZW50Q2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CkBAIC0yNjksMTEgKzI3MCw2IEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbik7CiAKLSAgICBzdGF0dXNfdCBvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbik7Ci0KICAgICAvKioKICAgICAgKiBTYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBvciB0b3JjaCBjbGllbnQKICAgICAgKi8KQEAgLTQwMyw2ICszOTksMTUgQEAKICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOwogCisgICAgICAgIHN0YXR1c190IGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOworICAgICAgICBzdGF0dXNfdCBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIHN0ZDo6c3RyaW5nKiBwaHlzaWNhbElkLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOworCiAgICAgICAgIC8vIGhpZGxfZGVhdGhfcmVjaXBpZW50IGludGVyZmFjZSAtIHRoaXMgbG9ja3MgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKICAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pIG92ZXJyaWRlOwogCkBAIC00NDQsOCArNDQ5LDYgQEAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IG1SZXNvdXJjZUNvc3Q7CiAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG1TdGF0dXM7Ci0gICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM+Ci0gICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbFN0YXR1czsKIAogICAgICAgICAgICAgd3A8UHJvdmlkZXJJbmZvPiBtUGFyZW50UHJvdmlkZXI7CiAKQEAgLTUxMywyNyArNTE2LDYgQEAKICAgICAgICAgLy8gcGh5c2ljYWwgY2FtZXJhIElEcy4KICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkczsKIAotICAgICAgICAvLyBIQUx2MS1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCi0gICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMSA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKLSAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7Ci0KLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICAgICAgLy9JbiBjYXNlIG9mIERldmljZTFJbmZvIGFzc3VtZSB0aGF0IHdlIGFyZSBhbHdheXMgQVBJMSBjb21wYXRpYmxlCi0gICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7Ci0gICAgICAgICAgICBEZXZpY2VJbmZvMShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKLSAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKLSAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8xKCk7Ci0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzMiBtRGVmYXVsdFBhcmFtZXRlcnM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBjYWNoZUNhbWVyYUluZm8oc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKLSAgICAgICAgfTsKLQogICAgICAgICAvLyBIQUx2My1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMyA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7CkBAIC02MDAsNyArNTgyLDI3IEBACiAKICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptTWFuYWdlcjsKIAorICAgICAgICBzdHJ1Y3QgQ2FtZXJhU3RhdHVzSW5mb1QgeworICAgICAgICAgICAgYm9vbCBpc1BoeXNpY2FsQ2FtZXJhU3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgY2FtZXJhSWQ7CisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgcGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1czsKKyAgICAgICAgICAgIENhbWVyYVN0YXR1c0luZm9UKGJvb2wgaXNGb3JQaHlzaWNhbENhbWVyYSwgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBpZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwaHlzaWNhbElkLAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzKSA6CisgICAgICAgICAgICAgICAgICAgIGlzUGh5c2ljYWxDYW1lcmFTdGF0dXMoaXNGb3JQaHlzaWNhbENhbWVyYSksIGNhbWVyYUlkKGlkKSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbElkKSwgc3RhdHVzKHMpIHt9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gTG9jayB0byBzeW5jaHJvbml6ZSBiZXR3ZWVuIGluaXRpYWxpemUoKSBhbmQgY2FtZXJhIHN0YXR1cyBjYWxsYmFja3MKKyAgICAgICAgc3RkOjptdXRleCBtSW5pdExvY2s7CiAgICAgICAgIGJvb2wgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPiBtQ2FjaGVkU3RhdHVzOworICAgICAgICAvLyBFbmQgb2Ygc2NvcGUgZm9yIG1Jbml0TG9jaworCisgICAgICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IG1Jbml0aWFsU3RhdHVzQ2FsbGJhY2tGdXR1cmU7CisgICAgICAgIHZvaWQgbm90aWZ5SW5pdGlhbFN0YXR1c0NoYW5nZShzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPj4gY2FjaGVkU3RhdHVzKTsKIAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+PiBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmVmNjgxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2RlZmluZSBMT0dfVEFHICJDYW1lcmFIYXJkd2FyZUludGVyZmFjZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4gLy8gRm9yIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEKLSNpbmNsdWRlICJDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA7Ci11c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOwotdXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwotCi1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6fkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKCkKLXsKLSAgICBBTE9HSSgiRGVzdHJveWluZyBjYW1lcmEgJXMiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUhpZGxEZXZpY2UtPmNsb3NlKCk7Ci0gICAgICAgIG1IaWRsRGV2aWNlLmNsZWFyKCk7Ci0gICAgICAgIGNsZWFudXBDaXJjdWxhdGluZ0J1ZmZlcnMoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgewotICAgIEFMT0dJKCJPcGVuaW5nIGNhbWVyYSAlcyIsIG1OYW1lLnN0cmluZygpKTsKLQotICAgIHN0YXR1c190IHJldCA9IG1hbmFnZXItPm9wZW5TZXNzaW9uKG1OYW1lLnN0cmluZygpLCB0aGlzLCAmbUhpZGxEZXZpY2UpOwotICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBvcGVuU2Vzc2lvbiBmYWlsZWQhICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXQpLCByZXQpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0UHJldmlld1NjYWxpbmdNb2RlKGludCBzY2FsaW5nTW9kZSkKLXsKLSAgICBpbnQgcmMgPSBPSzsKLSAgICBtUHJldmlld1NjYWxpbmdNb2RlID0gc2NhbGluZ01vZGU7Ci0gICAgaWYgKG1QcmV2aWV3V2luZG93ICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUobVByZXZpZXdXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgc2NhbGluZ01vZGUpOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzZXRQcmV2aWV3VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pIHsKLSAgICBpbnQgcmMgPSBPSzsKLSAgICBtUHJldmlld1RyYW5zZm9ybSA9IHRyYW5zZm9ybTsKLSAgICBpZiAobVByZXZpZXdXaW5kb3cgIT0gbnVsbHB0cikgewotICAgICAgICByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKG1QcmV2aWV3V2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIG1QcmV2aWV3VHJhbnNmb3JtKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrCi0gKi8KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6Om5vdGlmeUNhbGxiYWNrKAotICAgICAgICBOb3RpZnlDYWxsYmFja01zZyBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgewotICAgIHNOb3RpZnlDYigoaW50MzJfdCkgbXNnVHlwZSwgZXh0MSwgZXh0MiwgKHZvaWQqKSB0aGlzKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx1aW50MzJfdD4gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnJlZ2lzdGVyTWVtb3J5KAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9oYW5kbGUmIGRlc2NyaXB0b3IsCi0gICAgICAgIHVpbnQzMl90IGJ1ZmZlclNpemUsIHVpbnQzMl90IGJ1ZmZlckNvdW50KSB7Ci0gICAgaWYgKGRlc2NyaXB0b3ItPm51bUZkcyAhPSAxKSB7Ci0gICAgICAgIEFMT0dFKCIlczogY2FtZXJhIG1lbW9yeSBkZXNjcmlwdG9yIGhhcyBudW1GZHMgJWQgKGV4cGVjdCAxKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXNjcmlwdG9yLT5udW1GZHMpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGRlc2NyaXB0b3ItPmRhdGFbMF0gPCAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogY2FtZXJhIG1lbW9yeSBkZXNjcmlwdG9yIGhhcyBGRCAlZCAoZXhwZWN0ID49IDApIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlc2NyaXB0b3ItPmRhdGFbMF0pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjYW1lcmFfbWVtb3J5X3QqIG1lbSA9IHNHZXRNZW1vcnkoZGVzY3JpcHRvci0+ZGF0YVswXSwgYnVmZmVyU2l6ZSwgYnVmZmVyQ291bnQsIHRoaXMpOwotICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IGNhbU1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KG1lbS0+aGFuZGxlKSk7Ci0gICAgaW50IG1lbVBvb2xJZCA9IGNhbU1lbS0+bUhlYXAtPmdldEhlYXBJRCgpOwotICAgIGlmIChtZW1Qb29sSWQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhSGVhcE1lbW9yeSBoYXMgRkQgJWQgKGV4cGVjdCA+PSAwKSIsIF9fRlVOQ1RJT05fXywgbWVtUG9vbElkKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOwotICAgIG1IaWRsTWVtUG9vbE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIobWVtUG9vbElkLCBtZW0pKTsKLSAgICByZXR1cm4gbWVtUG9vbElkOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjp1bnJlZ2lzdGVyTWVtb3J5KHVpbnQzMl90IG1lbUlkKSB7Ci0gICAgY2FtZXJhX21lbW9yeV90KiBtZW0gPSBudWxscHRyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhpZGxNZW1Qb29sTWFwTG9jayk7Ci0gICAgICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQobWVtSWQpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBtZW1JZCk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBtZW0gPSBtSGlkbE1lbVBvb2xNYXAuYXQobWVtSWQpOwotICAgICAgICBtSGlkbE1lbVBvb2xNYXAuZXJhc2UobWVtSWQpOwotICAgIH0KLSAgICBzUHV0TWVtb3J5KG1lbSk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmRhdGFDYWxsYmFjaygKLSAgICAgICAgRGF0YUNhbGxiYWNrTXNnIG1zZ1R5cGUsIHVpbnQzMl90IGRhdGEsIHVpbnQzMl90IGJ1ZmZlckluZGV4LAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OkNhbWVyYUZyYW1lTWV0YWRhdGEmIG1ldGFkYXRhKSB7Ci0gICAgY2FtZXJhX21lbW9yeV90KiBtZW0gPSBudWxscHRyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhpZGxNZW1Qb29sTWFwTG9jayk7Ci0gICAgICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQoZGF0YSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBtZW1vcnkgcG9vbCBJRCAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtID0gbUhpZGxNZW1Qb29sTWFwLmF0KGRhdGEpOwotICAgIH0KLSAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCBtZDsKLSAgICBtZC5udW1iZXJfb2ZfZmFjZXMgPSBtZXRhZGF0YS5mYWNlcy5zaXplKCk7Ci0gICAgbWQuZmFjZXMgPSAoY2FtZXJhX2ZhY2VfdCopIG1ldGFkYXRhLmZhY2VzLmRhdGEoKTsKLSAgICBzRGF0YUNiKChpbnQzMl90KSBtc2dUeXBlLCBtZW0sIGJ1ZmZlckluZGV4LCAmbWQsIHRoaXMpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCi0gICAgICAgIERhdGFDYWxsYmFja01zZyBtc2dUeXBlLCB1aW50MzJfdCBkYXRhLAotICAgICAgICB1aW50MzJfdCBidWZmZXJJbmRleCwgaW50NjRfdCB0aW1lc3RhbXApIHsKLSAgICBjYW1lcmFfbWVtb3J5X3QqIG1lbSA9IG51bGxwdHI7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGlkbE1lbVBvb2xNYXBMb2NrKTsKLSAgICAgICAgaWYgKG1IaWRsTWVtUG9vbE1hcC5jb3VudChkYXRhKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBtZW0gPSBtSGlkbE1lbVBvb2xNYXAuYXQoZGF0YSk7Ci0gICAgfQotICAgIHNEYXRhQ2JUaW1lc3RhbXAodGltZXN0YW1wLCAoaW50MzJfdCkgbXNnVHlwZSwgbWVtLCBidWZmZXJJbmRleCwgdGhpcyk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKAotICAgICAgICBEYXRhQ2FsbGJhY2tNc2cgbXNnVHlwZSwgY29uc3QgaGlkbF9oYW5kbGUmIGZyYW1lRGF0YSwgdWludDMyX3QgZGF0YSwKLSAgICAgICAgdWludDMyX3QgYnVmZmVySW5kZXgsIGludDY0X3QgdGltZXN0YW1wKSB7Ci0gICAgY2FtZXJhX21lbW9yeV90KiBtZW0gPSBudWxscHRyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhpZGxNZW1Qb29sTWFwTG9jayk7Ci0gICAgICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQoZGF0YSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBtZW1vcnkgcG9vbCBJRCAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtID0gbUhpZGxNZW1Qb29sTWFwLmF0KGRhdGEpOwotICAgIH0KLSAgICBzcDxDYW1lcmFIZWFwTWVtb3J5PiBoZWFwTWVtKHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4obWVtLT5oYW5kbGUpKTsKLSAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCi0gICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCi0gICAgLy8gICAgICAgRWl0aGVyIGRvY3VtZW50IHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgY2FzZSBvciBhZGRyZXNzIHRoZQotICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgotICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqIG1kID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKQotICAgICAgICAgICAgaGVhcE1lbS0+bUJ1ZmZlcnNbYnVmZmVySW5kZXhdLT51bnNlY3VyZVBvaW50ZXIoKTsKLSAgICBtZC0+cEhhbmRsZSA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oZnJhbWVEYXRhLmdldE5hdGl2ZUhhbmRsZSgpKTsKLSAgICBzRGF0YUNiVGltZXN0YW1wKHRpbWVzdGFtcCwgKGludDMyX3QpIG1zZ1R5cGUsIG1lbSwgYnVmZmVySW5kZXgsIHRoaXMpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpoYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAotICAgICAgICBEYXRhQ2FsbGJhY2tNc2cgbXNnVHlwZSwKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SGFuZGxlVGltZXN0YW1wTWVzc2FnZT4mIG1lc3NhZ2VzKSB7Ci0gICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6SGFuZGxlVGltZXN0YW1wTWVzc2FnZT4gbXNnczsKLSAgICBtc2dzLnJlc2VydmUobWVzc2FnZXMuc2l6ZSgpKTsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGhpZGxfbXNnIDogbWVzc2FnZXMpIHsKLSAgICAgICAgICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQoaGlkbF9tc2cuZGF0YSkgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBoaWRsX21zZy5kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbSgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGVhcE1lbW9yeSAqPihtSGlkbE1lbVBvb2xNYXAuYXQoaGlkbF9tc2cuZGF0YSktPmhhbmRsZSkpOwotCi0gICAgICAgICAgICBpZiAoaGlkbF9tc2cuYnVmZmVySW5kZXggPj0gbWVtLT5tTnVtQnVmcykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBidWZmZXIgaW5kZXggJWQsIG1heCBhbGxvd2VkIGlzICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgaGlkbF9tc2cuYnVmZmVySW5kZXgsIG1lbS0+bU51bUJ1ZnMpOwotICAgICAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwotICAgICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCi0gICAgICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MgdGhlCi0gICAgICAgICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KLSAgICAgICAgICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqIG1kID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKQotICAgICAgICAgICAgICAgICAgICBtZW0tPm1CdWZmZXJzW2hpZGxfbXNnLmJ1ZmZlckluZGV4XS0+dW5zZWN1cmVQb2ludGVyKCk7Ci0gICAgICAgICAgICBtZC0+cEhhbmRsZSA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oaGlkbF9tc2cuZnJhbWVEYXRhLmdldE5hdGl2ZUhhbmRsZSgpKTsKLQotICAgICAgICAgICAgbXNncy5wdXNoX2JhY2soe2hpZGxfbXNnLnRpbWVzdGFtcCwgbWVtLT5tQnVmZmVyc1toaWRsX21zZy5idWZmZXJJbmRleF19KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtRGF0YUNiVGltZXN0YW1wQmF0Y2goKGludDMyX3QpIG1zZ1R5cGUsIG1zZ3MsIG1DYlVzZXIpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1zdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpnZXRCdWZmZXJJZCgKLSAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlcklkTWFwTG9jayk7Ci0KLSAgICBidWZmZXJfaGFuZGxlX3QmIGJ1ZiA9IGFuYi0+aGFuZGxlOwotICAgIGF1dG8gaXQgPSBtQnVmZmVySWRNYXAuZmluZChidWYpOwotICAgIGlmIChpdCA9PSBtQnVmZmVySWRNYXAuZW5kKCkpIHsKLSAgICAgICAgdWludDY0X3QgYnVmSWQgPSBtTmV4dEJ1ZmZlcklkKys7Ci0gICAgICAgIG1CdWZmZXJJZE1hcFtidWZdID0gYnVmSWQ7Ci0gICAgICAgIG1SZXZlcnNlZEJ1Zk1hcFtidWZJZF0gPSBhbmI7Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCBidWZJZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCBpdC0+c2Vjb25kKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmNsZWFudXBDaXJjdWxhdGluZ0J1ZmZlcnMoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlcklkTWFwTG9jayk7Ci0gICAgbUJ1ZmZlcklkTWFwLmNsZWFyKCk7Ci0gICAgbVJldmVyc2VkQnVmTWFwLmNsZWFyKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4KLUNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpkZXF1ZXVlQnVmZmVyKGRlcXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIHsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICB9Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotICAgIGludCByYyA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQoYSwgJmFuYik7Ci0gICAgU3RhdHVzIHMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gMDsKLSAgICB1aW50MzJfdCBzdHJpZGUgPSAwOwotICAgIGhpZGxfaGFuZGxlIGJ1ZiA9IG51bGxwdHI7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgIHMgPSBTdGF0dXM6Ok9LOwotICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChhbmIpOwotICAgICAgICBidWYgPSAocGFpci5maXJzdCkgPyBhbmItPmhhbmRsZSA6IG51bGxwdHI7Ci0gICAgICAgIGJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7Ci0gICAgICAgIHN0cmlkZSA9IGFuYi0+c3RyaWRlOwotICAgIH0KLQotICAgIF9oaWRsX2NiKHMsIGJ1ZmZlcklkLCBidWYsIHN0cmlkZSk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPgotQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmVucXVldWVCdWZmZXIodWludDY0X3QgYnVmZmVySWQpIHsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKG1SZXZlcnNlZEJ1Zk1hcC5jb3VudChidWZmZXJJZCkgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlcklkICUiIFBSSXU2NCAiIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOwotICAgIH0KLSAgICBpbnQgcmMgPSBhLT5xdWV1ZUJ1ZmZlcihhLCBtUmV2ZXJzZWRCdWZNYXAuYXQoYnVmZmVySWQpLCAtMSk7Ci0gICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6T0s7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4KLUNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpjYW5jZWxCdWZmZXIodWludDY0X3QgYnVmZmVySWQpIHsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKG1SZXZlcnNlZEJ1Zk1hcC5jb3VudChidWZmZXJJZCkgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlcklkICUiIFBSSXU2NCAiIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOwotICAgIH0KLSAgICBpbnQgcmMgPSBhLT5jYW5jZWxCdWZmZXIoYSwgbVJldmVyc2VkQnVmTWFwLmF0KGJ1ZmZlcklkKSwgLTEpOwotICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLX0KLQotaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0QnVmZmVyQ291bnQodWludDMyX3QgY291bnQpIHsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgIT0gbnVsbHB0cikgewotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBiLzI3MDM5Nzc1Ci0gICAgICAgIC8vIFByZXZpb3VzbHksIHNldHRpbmcgdGhlIGJ1ZmZlciBjb3VudCB3b3VsZCByZXNldCB0aGUgYnVmZmVyCi0gICAgICAgIC8vIHF1ZXVlJ3MgZmxhZyB0aGF0IGFsbG93cyBmb3IgYWxsIGJ1ZmZlcnMgdG8gYmUgZGVxdWV1ZWQgb24gdGhlCi0gICAgICAgIC8vIHByb2R1Y2VyIHNpZGUsIGluc3RlYWQgb2YganVzdCB0aGUgcHJvZHVjZXIncyBkZWNsYXJlZCBtYXggY291bnQsCi0gICAgICAgIC8vIGlmIG5vIGZpbGxlZCBidWZmZXJzIGhhdmUgeWV0IGJlZW4gcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4gIFRoaXMKLSAgICAgICAgLy8gcmVzZXQgbm8gbG9uZ2VyIGhhcHBlbnMsIGJ1dCBzb21lIEhBTHMgZGVwZW5kIG9uIHRoaXMgYmVoYXZpb3IsCi0gICAgICAgIC8vIHNvIGl0IG5lZWRzIHRvIGJlIG1haW50YWluZWQgZm9yIEhBTCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgLy8gU2ltdWxhdGUgdGhlIHByaW9yIGJlaGF2aW9yIGJ5IGRpc2Nvbm5lY3RpbmcvcmVjb25uZWN0aW5nIHRvIHRoZQotICAgICAgICAvLyB3aW5kb3cgYW5kIHNldHRpbmcgdGhlIHZhbHVlcyBhZ2Fpbi4gIFRoaXMgaGFzIHRoZSBkcmF3YmFjayBvZgotICAgICAgICAvLyBhY3R1YWxseSBjYXVzaW5nIG1lbW9yeSByZWFsbG9jYXRpb24sIHdoaWNoIG1heSBub3QgaGF2ZSBoYXBwZW5lZAotICAgICAgICAvLyBpbiB0aGUgcGFzdC4KLSAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChhLCBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOwotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KGEsIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7Ci0gICAgICAgIGlmIChtUHJldmlld1NjYWxpbmdNb2RlICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZShhLCBtUHJldmlld1NjYWxpbmdNb2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByZXZpZXdUcmFuc2Zvcm0gIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oYSwgbVByZXZpZXdUcmFuc2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJldmlld1dpZHRoICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhhLAotICAgICAgICAgICAgICAgICAgICBtUHJldmlld1dpZHRoLCBtUHJldmlld0hlaWdodCk7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChhLCBtUHJldmlld0Zvcm1hdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QcmV2aWV3VXNhZ2UgIT0gMCkgewotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYSwgbVByZXZpZXdVc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QcmV2aWV3U3dhcEludGVydmFsICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIGEtPnNldFN3YXBJbnRlcnZhbChhLCBtUHJldmlld1N3YXBJbnRlcnZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QcmV2aWV3Q3JvcC5sZWZ0ICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoYSwgJihtUHJldmlld0Nyb3ApKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYSwgY291bnQpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICBjbGVhbnVwQ2lyY3VsYXRpbmdCdWZmZXJzKCk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLX0KLQotaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0QnVmZmVyc0dlb21ldHJ5KAotICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgZm9ybWF0KSB7Ci0gICAgU3RhdHVzIHMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBtUHJldmlld1dpbmRvdy5nZXQoKTsKLSAgICBpZiAoYSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcHJldmlldyB3aW5kb3cgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLSAgICBtUHJldmlld1dpZHRoID0gdzsKLSAgICBtUHJldmlld0hlaWdodCA9IGg7Ci0gICAgbVByZXZpZXdGb3JtYXQgPSAoaW50KSBmb3JtYXQ7Ci0gICAgaW50IHJjID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKGEsIHcsIGgpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KGEsIG1QcmV2aWV3Rm9ybWF0KTsKLSAgICB9Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgIGNsZWFudXBDaXJjdWxhdGluZ0J1ZmZlcnMoKTsKLSAgICAgICAgcyA9IFN0YXR1czo6T0s7Ci0gICAgfQotICAgIHJldHVybiBzOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4KLUNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzZXRDcm9wKGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSB7Ci0gICAgU3RhdHVzIHMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBtUHJldmlld1dpbmRvdy5nZXQoKTsKLSAgICBpZiAoYSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcHJldmlldyB3aW5kb3cgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLSAgICBtUHJldmlld0Nyb3AubGVmdCA9IGxlZnQ7Ci0gICAgbVByZXZpZXdDcm9wLnRvcCA9IHRvcDsKLSAgICBtUHJldmlld0Nyb3AucmlnaHQgPSByaWdodDsKLSAgICBtUHJldmlld0Nyb3AuYm90dG9tID0gYm90dG9tOwotICAgIGludCByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoYSwgJm1QcmV2aWV3Q3JvcCk7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgIHMgPSBTdGF0dXM6Ok9LOwotICAgIH0KLSAgICByZXR1cm4gczsKLX0KLQotaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0VXNhZ2UoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OkJ1ZmZlclVzYWdlIHVzYWdlKSB7Ci0gICAgU3RhdHVzIHMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBtUHJldmlld1dpbmRvdy5nZXQoKTsKLSAgICBpZiAoYSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcHJldmlldyB3aW5kb3cgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLSAgICBtUHJldmlld1VzYWdlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+ICh1c2FnZSk7Ci0gICAgaW50IHJjID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYSwgbVByZXZpZXdVc2FnZSk7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgIGNsZWFudXBDaXJjdWxhdGluZ0J1ZmZlcnMoKTsKLSAgICAgICAgcyA9IFN0YXR1czo6T0s7Ci0gICAgfQotICAgIHJldHVybiBzOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4KLUNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzZXRTd2FwSW50ZXJ2YWwoaW50MzJfdCBpbnRlcnZhbCkgewotICAgIFN0YXR1cyBzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAgbVByZXZpZXdTd2FwSW50ZXJ2YWwgPSBpbnRlcnZhbDsKLSAgICBpbnQgcmMgPSBhLT5zZXRTd2FwSW50ZXJ2YWwoYSwgaW50ZXJ2YWwpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICBzID0gU3RhdHVzOjpPSzsKLSAgICB9Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4KLUNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpnZXRNaW5VbmRlcXVldWVkQnVmZmVyQ291bnQoZ2V0TWluVW5kZXF1ZXVlZEJ1ZmZlckNvdW50X2NiIF9oaWRsX2NiKSB7Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IG1QcmV2aWV3V2luZG93LmdldCgpOwotICAgIGlmIChhID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBwcmV2aWV3IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgfQotICAgIGludCBjb3VudCA9IDA7Ci0gICAgaW50IHJjID0gYS0+cXVlcnkoYSwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmY291bnQpOwotICAgIFN0YXR1cyBzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgcyA9IFN0YXR1czo6T0s7Ci0gICAgfQotICAgIF9oaWRsX2NiKHMsIGNvdW50KTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0VGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wKSB7Ci0gICAgU3RhdHVzIHMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBtUHJldmlld1dpbmRvdy5nZXQoKTsKLSAgICBpZiAoYSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcHJldmlldyB3aW5kb3cgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLSAgICBpbnQgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChhLCB0aW1lc3RhbXApOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICBzID0gU3RhdHVzOjpPSzsKLSAgICB9Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSBidWYgJXAiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpLCBidWYuZ2V0KCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgbVByZXZpZXdXaW5kb3cgPSBidWY7Ci0gICAgICAgIGlmIChidWYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgaWYgKG1QcmV2aWV3U2NhbGluZ01vZGUgIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgICAgIHNldFByZXZpZXdTY2FsaW5nTW9kZShtUHJldmlld1NjYWxpbmdNb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUHJldmlld1RyYW5zZm9ybSAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICAgICAgc2V0UHJldmlld1RyYW5zZm9ybShtUHJldmlld1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAotICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zZXRQcmV2aWV3V2luZG93KGJ1Zi5nZXQoKSA/IHRoaXMgOiBudWxscHRyKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0Q2FsbGJhY2tzKG5vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCi0gICAgICAgIGRhdGFfY2FsbGJhY2sgZGF0YV9jYiwKLSAgICAgICAgZGF0YV9jYWxsYmFja190aW1lc3RhbXAgZGF0YV9jYl90aW1lc3RhbXAsCi0gICAgICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wX2JhdGNoIGRhdGFfY2JfdGltZXN0YW1wX2JhdGNoLAotICAgICAgICB2b2lkKiB1c2VyKQotewotICAgIG1Ob3RpZnlDYiA9IG5vdGlmeV9jYjsKLSAgICBtRGF0YUNiID0gZGF0YV9jYjsKLSAgICBtRGF0YUNiVGltZXN0YW1wID0gZGF0YV9jYl90aW1lc3RhbXA7Ci0gICAgbURhdGFDYlRpbWVzdGFtcEJhdGNoID0gZGF0YV9jYl90aW1lc3RhbXBfYmF0Y2g7Ci0gICAgbUNiVXNlciA9IHVzZXI7Ci0KLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmVuYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIG1IaWRsRGV2aWNlLT5lbmFibGVNc2dUeXBlKG1zZ1R5cGUpOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6ZGlzYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIG1IaWRsRGV2aWNlLT5kaXNhYmxlTXNnVHlwZShtc2dUeXBlKTsKLSAgICB9Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6bXNnVHlwZUVuYWJsZWQoaW50MzJfdCBtc2dUeXBlKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbERldmljZS0+bXNnVHlwZUVuYWJsZWQobXNnVHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnN0YXJ0UHJldmlldygpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAotICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zdGFydFByZXZpZXcoKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c3RvcFByZXZpZXcoKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIG1IaWRsRGV2aWNlLT5zdG9wUHJldmlldygpOwotICAgIH0KLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpwcmV2aWV3RW5hYmxlZCgpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRGV2aWNlLT5wcmV2aWV3RW5hYmxlZCgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKGludCBlbmFibGUpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAotICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKGVuYWJsZSkpOwotICAgIH0KLSAgICByZXR1cm4gZW5hYmxlID8gSU5WQUxJRF9PUEVSQVRJT046IE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c3RhcnRSZWNvcmRpbmcoKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKLSAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c3RhcnRSZWNvcmRpbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotLyoqCi0gKiBTdG9wIGEgcHJldmlvdXNseSBzdGFydGVkIHJlY29yZGluZy4KLSAqLwotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c3RvcFJlY29yZGluZygpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgbUhpZGxEZXZpY2UtPnN0b3BSZWNvcmRpbmcoKTsKLSAgICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHJlY29yZGluZyBpcyBlbmFibGVkLgotICovCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnJlY29yZGluZ0VuYWJsZWQoKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbERldmljZS0+cmVjb3JkaW5nRW5hYmxlZCgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBzc2l6ZV90IG9mZnNldDsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICBpbnQgaGVhcElkID0gaGVhcC0+Z2V0SGVhcElEKCk7Ci0gICAgaW50IGJ1ZmZlckluZGV4ID0gb2Zmc2V0IC8gc2l6ZTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIGlmIChzaXplID09IHNpemVvZihWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKSkgewotICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwotICAgICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCi0gICAgICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MgdGhlCi0gICAgICAgICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KLSAgICAgICAgICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqIG1kID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKSBtZW0tPnVuc2VjdXJlUG9pbnRlcigpOwotICAgICAgICAgICAgLy8gQ2FjaGluZyB0aGUgaGFuZGxlIGhlcmUgYmVjYXVzZSBtZC0+cEhhbmRsZSB3aWxsIGJlIHN1YmplY3QgdG8gSEFMJ3MgZWRpdAotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG1kLT5wSGFuZGxlOwotICAgICAgICAgICAgaGlkbF9oYW5kbGUgZnJhbWUgPSBuaDsKLSAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoaGVhcElkLCBidWZmZXJJbmRleCwgZnJhbWUpOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShuaCk7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSGlkbERldmljZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGhlYXBJZCwgYnVmZmVySW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpyZWxlYXNlUmVjb3JkaW5nRnJhbWVCYXRjaChjb25zdCBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5Pj4mIGZyYW1lcykKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgc2l6ZV90IG4gPSBmcmFtZXMuc2l6ZSgpOwotICAgIHN0ZDo6dmVjdG9yPFZpZGVvRnJhbWVNZXNzYWdlPiBtc2dzOwotICAgIG1zZ3MucmVzZXJ2ZShuKTsKLSAgICBmb3IgKGF1dG8mIG1lbSA6IGZyYW1lcykgewotICAgICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IG9mZnNldDsKLSAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA9PSBzaXplb2YoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSkpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWFwSWQgPSBoZWFwLT5nZXRIZWFwSUQoKTsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJJbmRleCA9IG9mZnNldCAvIHNpemU7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwotICAgICAgICAgICAgICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAgICAgICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcyB0aGUKLSAgICAgICAgICAgICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KLSAgICAgICAgICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKiBtZCA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikgbWVtLT51bnNlY3VyZVBvaW50ZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBDYWNoaW5nIHRoZSBoYW5kbGUgaGVyZSBiZWNhdXNlIG1kLT5wSGFuZGxlIHdpbGwgYmUgc3ViamVjdCB0byBIQUwncyBlZGl0Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG1kLT5wSGFuZGxlOwotICAgICAgICAgICAgICAgIFZpZGVvRnJhbWVNZXNzYWdlIG1zZzsKLSAgICAgICAgICAgICAgICBtc2dzLnB1c2hfYmFjayh7bmgsIGhlYXBJZCwgYnVmZmVySW5kZXh9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzIG9ubHkgc3VwcG9ydHMgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtSGlkbERldmljZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2gobXNncyk7Ci0KLSAgICBmb3IgKGF1dG8mIG1zZyA6IG1zZ3MpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obXNnLmZyYW1lRGF0YS5nZXROYXRpdmVIYW5kbGUoKSk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobmgpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6YXV0b0ZvY3VzKCkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCi0gICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPmF1dG9Gb2N1cygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6Y2FuY2VsQXV0b0ZvY3VzKCkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCi0gICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPmNhbmNlbEF1dG9Gb2N1cygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6dGFrZVBpY3R1cmUoKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKLSAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+dGFrZVBpY3R1cmUoKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmNhbmNlbFBpY3R1cmUoKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKLSAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+Y2FuY2VsUGljdHVyZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0UGFyYW1ldGVycyhjb25zdCBDYW1lcmFQYXJhbWV0ZXJzICZwYXJhbXMpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAotICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkuc3RyaW5nKCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1DYW1lcmFQYXJhbWV0ZXJzIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpnZXRQYXJhbWV0ZXJzKCkgY29uc3QKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJtczsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBvdXRQYXJhbTsKLSAgICAgICAgbUhpZGxEZXZpY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICAgICAgWyZvdXRQYXJhbV0oY29uc3QgYXV0byYgb3V0U3RyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dFBhcmFtID0gb3V0U3RyOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBTdHJpbmc4IHRtcChvdXRQYXJhbS5jX3N0cigpKTsKLSAgICAgICAgcGFybXMudW5mbGF0dGVuKHRtcCk7Ci0gICAgfQotICAgIHJldHVybiBwYXJtczsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMikKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCi0gICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnNlbmRDb21tYW5kKChDb21tYW5kVHlwZSkgY21kLCBhcmcxLCBhcmcyKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotLyoqCi0gKiBSZWxlYXNlIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMgb3duZWQgYnkgdGhpcyBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBpcwotICogKm5vdCogZG9uZSBpbiB0aGUgZGVzdHJ1Y3Rvci4KLSAqLwotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6cmVsZWFzZSgpIHsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICBtSGlkbERldmljZS0+Y2xvc2UoKTsKLSAgICAgICAgbUhpZGxEZXZpY2UuY2xlYXIoKTsKLSAgICB9Ci19Ci0KLS8qKgotICogRHVtcCBzdGF0ZSBvZiB0aGUgY2FtZXJhIGhhcmR3YXJlCi0gKi8KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0Ci17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICAgICAgU3RhdHVzIHMgPSBtSGlkbERldmljZS0+ZHVtcFN0YXRlKGhhbmRsZSk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOyAvLyBJdCdzIGZpbmUgaWYgdGhlIEhBTCBkb2Vzbid0IGltcGxlbWVudCBkdW1wKCkKLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c05vdGlmeUNiKGludDMyX3QgbXNnX3R5cGUsIGludDMyX3QgZXh0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0Miwgdm9pZCAqdXNlcikKLXsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpvYmplY3QgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7Ci0gICAgb2JqZWN0LT5tTm90aWZ5Q2IobXNnX3R5cGUsIGV4dDEsIGV4dDIsIG9iamVjdC0+bUNiVXNlcik7Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNEYXRhQ2IoaW50MzJfdCBtc2dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcikKLXsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpvYmplY3QgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7Ci0gICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gbWVtKHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4oZGF0YS0+aGFuZGxlKSk7Ci0gICAgaWYgKGluZGV4ID49IG1lbS0+bU51bUJ1ZnMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGJ1ZmZlciBpbmRleCAlZCwgbWF4IGFsbG93ZWQgaXMgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgaW5kZXgsIG1lbS0+bU51bUJ1ZnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG9iamVjdC0+bURhdGFDYihtc2dfdHlwZSwgbWVtLT5tQnVmZmVyc1tpbmRleF0sIG1ldGFkYXRhLCBvYmplY3QtPm1DYlVzZXIpOwotfQotCi12b2lkIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzRGF0YUNiVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IG1zZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwgdW5zaWduZWQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcikKLXsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpvYmplY3QgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7Ci0gICAgLy8gU3RhcnQgcmVmY291bnRpbmcgdGhlIGhlYXAgb2JqZWN0IGZyb20gaGVyZSBvbi4gIFdoZW4gdGhlIGNsaWVudHMKLSAgICAvLyBkcm9wIGFsbCByZWZlcmVuY2VzLCBpdCB3aWxsIGJlIGRlc3Ryb3llZCAoYXMgd2VsbCBhcyB0aGUgZW5jbG9zZWQKLSAgICAvLyBNZW1vcnlIZWFwQmFzZS4KLSAgICBzcDxDYW1lcmFIZWFwTWVtb3J5PiBtZW0oc3RhdGljX2Nhc3Q8Q2FtZXJhSGVhcE1lbW9yeSAqPihkYXRhLT5oYW5kbGUpKTsKLSAgICBpZiAoaW5kZXggPj0gbWVtLT5tTnVtQnVmcykgewotICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYnVmZmVyIGluZGV4ICVkLCBtYXggYWxsb3dlZCBpcyAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICBpbmRleCwgbWVtLT5tTnVtQnVmcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgb2JqZWN0LT5tRGF0YUNiVGltZXN0YW1wKHRpbWVzdGFtcCwgbXNnX3R5cGUsIG1lbS0+bUJ1ZmZlcnNbaW5kZXhdLCBvYmplY3QtPm1DYlVzZXIpOwotfQotCi1jYW1lcmFfbWVtb3J5X3QqIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzR2V0TWVtb3J5KAotICAgICAgICBpbnQgZmQsIHNpemVfdCBidWZfc2l6ZSwgdWludF90IG51bV9idWZzLAotICAgICAgICB2b2lkICp1c2VyIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQotewotICAgIENhbWVyYUhlYXBNZW1vcnkgKm1lbTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIG1lbSA9IG5ldyBDYW1lcmFIZWFwTWVtb3J5KGJ1Zl9zaXplLCBudW1fYnVmcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWVtID0gbmV3IENhbWVyYUhlYXBNZW1vcnkoZmQsIGJ1Zl9zaXplLCBudW1fYnVmcyk7Ci0gICAgfQotICAgIG1lbS0+aW5jU3Ryb25nKG1lbSk7Ci0gICAgcmV0dXJuICZtZW0tPmhhbmRsZTsKLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1B1dE1lbW9yeShjYW1lcmFfbWVtb3J5X3QgKmRhdGEpCi17Ci0gICAgaWYgKCFkYXRhKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDYW1lcmFIZWFwTWVtb3J5ICptZW0gPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSk7Ci0gICAgbWVtLT5kZWNTdHJvbmcobWVtKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxOWIwNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkFfSEFSRFdBUkVfSU5URVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkFfSEFSRFdBUkVfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgotI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgotCi0jaW5jbHVkZSA8Y29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgdm9pZCAoKm5vdGlmeV9jYWxsYmFjaykoaW50MzJfdCBtc2dUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7Ci0KLXR5cGVkZWYgdm9pZCAoKmRhdGFfY2FsbGJhY2spKGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7Ci0KLXR5cGVkZWYgdm9pZCAoKmRhdGFfY2FsbGJhY2tfdGltZXN0YW1wKShuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcik7Ci0KLXN0cnVjdCBIYW5kbGVUaW1lc3RhbXBNZXNzYWdlIHsKLSAgICBuc2Vjc190IHRpbWVzdGFtcDsKLSAgICBjb25zdCBzcDxJTWVtb3J5PiBkYXRhUHRyOwotfTsKLQotdHlwZWRlZiB2b2lkICgqZGF0YV9jYWxsYmFja190aW1lc3RhbXBfYmF0Y2gpKAotICAgICAgICBpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEhhbmRsZVRpbWVzdGFtcE1lc3NhZ2U+Jiwgdm9pZCogdXNlcik7Ci0KLS8qKgotICogQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlCi0gKiBjYW1lcmEgaGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIsIHVzZWQgZm9yIHNldHRpbmcgYW5kIGdldHRpbmcKLSAqIHBhcmFtZXRlcnMsIGxpdmUgcHJldmlld2luZywgYW5kIHRha2luZyBwaWN0dXJlcy4gSXQgaXMgdXNlZCBmb3IKLSAqIEhBTCBkZXZpY2VzIHdpdGggdmVyc2lvbiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCBvbmx5LgotICoKLSAqIEl0IGlzIGEgcmVmZXJlbmNlZCBjb3VudGVkIGludGVyZmFjZSB3aXRoIFJlZkJhc2UgYXMgaXRzIGJhc2UgY2xhc3MuCi0gKiBDYW1lcmFTZXJ2aWNlIGNhbGxzIG9wZW5DYW1lcmFIYXJkd2FyZSgpIHRvIHJldHJpZXZlIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlCi0gKiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBhbmQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlCi0gKiBmb2xsb3dpbmcgc3RlcHMgZGVzY3JpYmUgYSB0eXBpY2FsIHNlcXVlbmNlOgotICoKLSAqICAgLSMgQWZ0ZXIgQ2FtZXJhU2VydmljZSBjYWxscyBvcGVuQ2FtZXJhSGFyZHdhcmUoKSwgZ2V0UGFyYW1ldGVycygpIGFuZAotICogICAgICBzZXRQYXJhbWV0ZXJzKCkgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY2FtZXJhIGluc3RhbmNlLgotICogICAtIyBzdGFydFByZXZpZXcoKSBpcyBjYWxsZWQuCi0gKgotICogUHJpb3IgdG8gdGFraW5nIGEgcGljdHVyZSwgQ2FtZXJhU2VydmljZSBvZnRlbiBjYWxscyBhdXRvZm9jdXMoKS4gV2hlbiBhdXRvCi0gKiBmb2N1c2luZyBoYXMgY29tcGxldGVkLCB0aGUgY2FtZXJhIGluc3RhbmNlIHNlbmRzIGEgQ0FNRVJBX01TR19GT0NVUyBub3RpZmljYXRpb24sCi0gKiB3aGljaCBpbmZvcm1zIHRoZSBhcHBsaWNhdGlvbiB3aGV0aGVyIGZvY3VzaW5nIHdhcyBzdWNjZXNzZnVsLiBUaGUgY2FtZXJhIGluc3RhbmNlCi0gKiBvbmx5IHNlbmRzIHRoaXMgbWVzc2FnZSBvbmNlIGFuZCBpdCBpcyB1cCAgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIGNhbGwgYXV0b0ZvY3VzKCkKLSAqIGFnYWluIGlmIHJlZm9jdXNpbmcgaXMgZGVzaXJlZC4KLSAqCi0gKiBDYW1lcmFTZXJ2aWNlIGNhbGxzIHRha2VQaWN0dXJlKCkgdG8gcmVxdWVzdCB0aGUgY2FtZXJhIGluc3RhbmNlIHRha2UgYQotICogcGljdHVyZS4gQXQgdGhpcyBwb2ludCwgaWYgYSBzaHV0dGVyLCBwb3N0dmlldywgcmF3LCBhbmQvb3IgY29tcHJlc3NlZAotICogY2FsbGJhY2sgaXMgZGVzaXJlZCwgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBtdXN0IGJlIGVuYWJsZWQuIEFueSBtZW1vcnkKLSAqIHByb3ZpZGVkIGluIGEgZGF0YSBjYWxsYmFjayBtdXN0IGJlIGNvcGllZCBpZiBpdCdzIG5lZWRlZCBhZnRlciByZXR1cm5pbmcuCi0gKi8KLQotY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgOgotICAgICAgICBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLAotICAgICAgICBwdWJsaWMgdmlydHVhbCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaywKLSAgICAgICAgcHVibGljIHZpcnR1YWwgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlUHJldmlld0NhbGxiYWNrIHsKLQotcHVibGljOgotICAgIGV4cGxpY2l0IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUpOgotICAgICAgICAgICAgbUhpZGxEZXZpY2UobnVsbHB0ciksCi0gICAgICAgICAgICBtTmFtZShuYW1lKSwKLSAgICAgICAgICAgIG1QcmV2aWV3U2NhbGluZ01vZGUoTk9UX1NFVCksCi0gICAgICAgICAgICBtUHJldmlld1RyYW5zZm9ybShOT1RfU0VUKSwKLSAgICAgICAgICAgIG1QcmV2aWV3V2lkdGgoTk9UX1NFVCksCi0gICAgICAgICAgICBtUHJldmlld0hlaWdodChOT1RfU0VUKSwKLSAgICAgICAgICAgIG1QcmV2aWV3Rm9ybWF0KE5PVF9TRVQpLAotICAgICAgICAgICAgbVByZXZpZXdVc2FnZSgwKSwKLSAgICAgICAgICAgIG1QcmV2aWV3U3dhcEludGVydmFsKE5PVF9TRVQpLAotICAgICAgICAgICAgbVByZXZpZXdDcm9we05PVF9TRVQsTk9UX1NFVCxOT1RfU0VULE5PVF9TRVR9Ci0gICAgewotICAgIH0KLQotICAgIH5DYW1lcmFIYXJkd2FyZUludGVyZmFjZSgpOwotCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpOwotCi0gICAgLyoqIFNldCB0aGUgQU5hdGl2ZVdpbmRvdyB0byB3aGljaCBwcmV2aWV3IGZyYW1lcyBhcmUgc2VudCAqLwotICAgIHN0YXR1c190IHNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGJ1Zik7Ci0KLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3U2NhbGluZ01vZGUoaW50IHNjYWxpbmdNb2RlKTsKLQotICAgIHN0YXR1c190IHNldFByZXZpZXdUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSk7Ci0KLSAgICAvKiogU2V0IHRoZSBub3RpZmljYXRpb24gYW5kIGRhdGEgY2FsbGJhY2tzICovCi0gICAgdm9pZCBzZXRDYWxsYmFja3Mobm90aWZ5X2NhbGxiYWNrIG5vdGlmeV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICBkYXRhX2NhbGxiYWNrIGRhdGFfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgZGF0YV9jYWxsYmFja190aW1lc3RhbXAgZGF0YV9jYl90aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgZGF0YV9jYWxsYmFja190aW1lc3RhbXBfYmF0Y2ggZGF0YV9jYl90aW1lc3RhbXBfYmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhbGwgdGFrZSBhIG1zZ3R5cGUsCi0gICAgICogd2hpY2ggaXMgYSBiaXRtYXNrIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluCi0gICAgICogaW5jbHVkZS91aS9DYW1lcmEuaAotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIGEgbWVzc2FnZSwgb3Igc2V0IG9mIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHZvaWQgZW5hYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpOwotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBhIG1lc3NhZ2UsIG9yIGEgc2V0IG9mIG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogT25jZSByZWNlaXZlZCBhIGNhbGwgdG8gZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSksIGNhbWVyYSBoYWwKLSAgICAgKiBzaG91bGQgbm90IHJlbHkgb24gaXRzIGNsaWVudCB0byBjYWxsIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpIHRvIHJlbGVhc2UKLSAgICAgKiB2aWRlbyByZWNvcmRpbmcgZnJhbWVzIHNlbnQgb3V0IGJ5IHRoZSBjYW1lcmFsIGhhbCBiZWZvcmUgYW5kIGFmdGVyIHRoZQotICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpIGNhbGwuIENhbWVyYSBoYWwgY2xpZW50cyBtdXN0IG5vdAotICAgICAqIG1vZGlmeS9hY2Nlc3MgYW55IHZpZGVvIHJlY29yZGluZyBmcmFtZSBhZnRlciBjYWxsaW5nCi0gICAgICogZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSkuCi0gICAgICovCi0gICAgdm9pZCBkaXNhYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpOwotCi0gICAgLyoqCi0gICAgICogUXVlcnkgd2hldGhlciBhIG1lc3NhZ2UsIG9yIGEgc2V0IG9mIG1lc3NhZ2VzLCBpcyBlbmFibGVkLgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9wZXJhdGVzIGFzIGFuIEFORCwgaWYgYW55IG9mIHRoZSBtZXNzYWdlcwotICAgICAqIHF1ZXJpZWQgYXJlIG9mZiwgdGhpcyB3aWxsIHJldHVybiBmYWxzZS4KLSAgICAgKi8KLSAgICBpbnQgbXNnVHlwZUVuYWJsZWQoaW50MzJfdCBtc2dUeXBlKTsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0IHByZXZpZXcgbW9kZS4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBzdGFydFByZXZpZXcoKTsKLQotICAgIC8qKgotICAgICAqIFN0b3AgYSBwcmV2aW91c2x5IHN0YXJ0ZWQgcHJldmlldy4KLSAgICAgKi8KLSAgICB2b2lkIHN0b3BQcmV2aWV3KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcHJldmlldyBpcyBlbmFibGVkLgotICAgICAqLwotICAgIGludCBwcmV2aWV3RW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCB0aGUgY2FtZXJhIGhhbCB0byBzdG9yZSBtZXRhIGRhdGEgb3IgcmVhbCBZVVYgZGF0YSBpbgotICAgICAqIHRoZSB2aWRlbyBidWZmZXJzIHNlbmQgb3V0IHZpYSBDQU1FUkFfTVNHX1ZJREVPX0ZSUkFNRSBmb3IgYQotICAgICAqIHJlY29yZGluZyBzZXNzaW9uLiBJZiBpdCBpcyBub3QgY2FsbGVkLCB0aGUgZGVmYXVsdCBjYW1lcmEKLSAgICAgKiBoYWwgYmVoYXZpb3IgaXMgdG8gc3RvcmUgcmVhbCBZVVYgZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVycy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nKCkgaW4gb3JkZXIKLSAgICAgKiB0byBiZSBlZmZlY3RpdmUuCi0gICAgICoKLSAgICAgKiBJZiBtZXRhIGRhdGEgaXMgc3RvcmVkIGluIHRoZSB2aWRlbyBidWZmZXJzLCBpdCBpcyB1cCB0byB0aGUKLSAgICAgKiByZWNlaXZlciBvZiB0aGUgdmlkZW8gYnVmZmVycyB0byBpbnRlcnByZXQgdGhlIGNvbnRlbnRzIGFuZAotICAgICAqIHRvIGZpbmQgdGhlIGFjdHVhbCBmcmFtZSBkYXRhIHdpdGggdGhlIGhlbHAgb2YgdGhlIG1ldGEgZGF0YQotICAgICAqIGluIHRoZSBidWZmZXIuIEhvdyB0aGlzIGlzIGRvbmUgaXMgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YKLSAgICAgKiB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIFNvbWUgY2FtZXJhIGhhbCBtYXkgbm90IHN1cHBvcnQgc3RvcmluZyBtZXRhIGRhdGEgaW4gdGhlIHZpZGVvCi0gICAgICogYnVmZmVycywgYnV0IGFsbCBjYW1lcmEgaGFsIHNob3VsZCBzdXBwb3J0IHN0b3JpbmcgcmVhbCBZVVYgZGF0YQotICAgICAqIGluIHRoZSB2aWRlbyBidWZmZXJzLiBJZiB0aGUgY2FtZXJhIGhhbCBkb2VzIG5vdCBzdXBwb3J0IHN0b3JpbmcKLSAgICAgKiB0aGUgbWV0YSBkYXRhIGluIHRoZSB2aWRlbyBidWZmZXJzIHdoZW4gaXQgaXMgcmVxdWVzdGVkIHRvIGRvCi0gICAgICogZG8sIElOVkFMSURfT1BFUkFUSU9OIG11c3QgYmUgcmV0dXJuZWQuIEl0IGlzIHZlcnkgdXNlZnVsIGZvcgotICAgICAqIHRoZSBjYW1lcmEgaGFsIHRvIHBhc3MgbWV0YSBkYXRhIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgZnJhbWUKLSAgICAgKiBkYXRhIGRpcmVjdGx5IHRvIHRoZSB2aWRlbyBlbmNvZGVyLCBzaW5jZSB0aGUgYW1vdW50IG9mIHRoZQotICAgICAqIHVuY29tcHJlc3NlZCBmcmFtZSBkYXRhIGNhbiBiZSB2ZXJ5IGxhcmdlIGlmIHZpZGVvIHNpemUgaXMgbGFyZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5hYmxlIGlmIHRydWUgdG8gaW5zdHJ1Y3QgdGhlIGNhbWVyYSBoYWwgdG8gc3RvcmUKLSAgICAgKiAgICAgIG1ldGEgZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVyczsgZmFsc2UgdG8gaW5zdHJ1Y3QKLSAgICAgKiAgICAgIHRoZSBjYW1lcmEgaGFsIHRvIHN0b3JlIHJlYWwgWVVWIGRhdGEgaW4gdGhlIHZpZGVvCi0gICAgICogICAgICBidWZmZXJzLgotICAgICAqCi0gICAgICogQHJldHVybiBPSyBvbiBzdWNjZXNzLgotICAgICAqLwotCi0gICAgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVycyhpbnQgZW5hYmxlKTsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0IHJlY29yZCBtb2RlLiBXaGVuIGEgcmVjb3JkIGltYWdlIGlzIGF2YWlsYWJsZSBhIENBTUVSQV9NU0dfVklERU9fRlJBTUUKLSAgICAgKiBtZXNzYWdlIGlzIHNlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmcmFtZS4gRXZlcnkgcmVjb3JkIGZyYW1lIG11c3QgYmUgcmVsZWFzZWQKLSAgICAgKiBieSBhIGNhbWVyYWwgaGFsIGNsaWVudCB2aWEgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkgYmVmb3JlIHRoZSBjbGllbnQgY2FsbHMKLSAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4gQWZ0ZXIgdGhlIGNsaWVudCBjYWxscwotICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBpdCBpcyBjYW1lcmEgaGFsJ3MgcmVzcG9uc2liaWxpdHkKLSAgICAgKiB0byBtYW5hZ2UgdGhlIGxpZmUtY3ljbGUgb2YgdGhlIHZpZGVvIHJlY29yZGluZyBmcmFtZXMsIGFuZCB0aGUgY2xpZW50IG11c3QKLSAgICAgKiBub3QgbW9kaWZ5L2FjY2VzcyBhbnkgdmlkZW8gcmVjb3JkaW5nIGZyYW1lcy4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBzdGFydFJlY29yZGluZygpOwotCi0gICAgLyoqCi0gICAgICogU3RvcCBhIHByZXZpb3VzbHkgc3RhcnRlZCByZWNvcmRpbmcuCi0gICAgICovCi0gICAgdm9pZCBzdG9wUmVjb3JkaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcmVjb3JkaW5nIGlzIGVuYWJsZWQuCi0gICAgICovCi0gICAgaW50IHJlY29yZGluZ0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgYSByZWNvcmQgZnJhbWUgcHJldmlvdXNseSByZXR1cm5lZCBieSBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FLgotICAgICAqCi0gICAgICogSXQgaXMgY2FtZXJhIGhhbCBjbGllbnQncyByZXNwb25zaWJpbGl0eSB0byByZWxlYXNlIHZpZGVvIHJlY29yZGluZwotICAgICAqIGZyYW1lcyBzZW50IG91dCBieSB0aGUgY2FtZXJhIGhhbCBiZWZvcmUgdGhlIGNhbWVyYSBoYWwgcmVjZWl2ZXMKLSAgICAgKiBhIGNhbGwgdG8gZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSkuIEFmdGVyIGl0IHJlY2VpdmVzCi0gICAgICogdGhlIGNhbGwgdG8gZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSksIGl0IGlzIGNhbWVyYSBoYWwncwotICAgICAqIHJlc3BvbnNpYmlsaXR5IG9mIG1hbmFnaW5nIHRoZSBsaWZlLWN5Y2xlIG9mIHRoZSB2aWRlbyByZWNvcmRpbmcKLSAgICAgKiBmcmFtZXMuCi0gICAgICovCi0gICAgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIGEgYmF0Y2ggb2YgcmVjb3JkaW5nIGZyYW1lcyBwcmV2aW91c2x5IHJldHVybmVkIGJ5Ci0gICAgICogQ0FNRVJBX01TR19WSURFT19GUkFNRS4gVGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBmcmFtZXMgdGhhdCBhcmUKLSAgICAgKiBzdG9yZWQgYXMgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YS4KLSAgICAgKgotICAgICAqIEl0IGlzIGNhbWVyYSBoYWwgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gcmVsZWFzZSB2aWRlbyByZWNvcmRpbmcKLSAgICAgKiBmcmFtZXMgc2VudCBvdXQgYnkgdGhlIGNhbWVyYSBoYWwgYmVmb3JlIHRoZSBjYW1lcmEgaGFsIHJlY2VpdmVzCi0gICAgICogYSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLiBBZnRlciBpdCByZWNlaXZlcwotICAgICAqIHRoZSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBpdCBpcyBjYW1lcmEgaGFsJ3MKLSAgICAgKiByZXNwb25zaWJpbGl0eSBvZiBtYW5hZ2luZyB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgdmlkZW8gcmVjb3JkaW5nCi0gICAgICogZnJhbWVzLgotICAgICAqLwotICAgIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lQmF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4+JiBmcmFtZXMpOwotCi0gICAgLyoqCi0gICAgICogU3RhcnQgYXV0byBmb2N1cywgdGhlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayByb3V0aW5lIGlzIGNhbGxlZAotICAgICAqIHdpdGggQ0FNRVJBX01TR19GT0NVUyBvbmNlIHdoZW4gZm9jdXNpbmcgaXMgY29tcGxldGUuIGF1dG9Gb2N1cygpCi0gICAgICogd2lsbCBiZSBjYWxsZWQgYWdhaW4gaWYgYW5vdGhlciBhdXRvIGZvY3VzIGlzIG5lZWRlZC4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBhdXRvRm9jdXMoKTsKLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgYXV0by1mb2N1cyBmdW5jdGlvbi4gSWYgdGhlIGF1dG8tZm9jdXMgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MsCi0gICAgICogdGhpcyBmdW5jdGlvbiB3aWxsIGNhbmNlbCBpdC4gV2hldGhlciB0aGUgYXV0by1mb2N1cyBpcyBpbiBwcm9ncmVzcwotICAgICAqIG9yIG5vdCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgZm9jdXMgcG9zaXRpb24gdG8gdGhlIGRlZmF1bHQuCi0gICAgICogSWYgdGhlIGNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IGF1dG8tZm9jdXMsIHRoaXMgaXMgYSBuby1vcC4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBjYW5jZWxBdXRvRm9jdXMoKTsKLQotICAgIC8qKgotICAgICAqIFRha2UgYSBwaWN0dXJlLgotICAgICAqLwotICAgIHN0YXR1c190IHRha2VQaWN0dXJlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWwgYSBwaWN0dXJlIHRoYXQgd2FzIHN0YXJ0ZWQgd2l0aCB0YWtlUGljdHVyZS4gIENhbGxpbmcgdGhpcwotICAgICAqIG1ldGhvZCB3aGVuIG5vIHBpY3R1cmUgaXMgYmVpbmcgdGFrZW4gaXMgYSBuby1vcC4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBjYW5jZWxQaWN0dXJlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNhbWVyYSBwYXJhbWV0ZXJzLiBUaGlzIHJldHVybnMgQkFEX1ZBTFVFIGlmIGFueSBwYXJhbWV0ZXIgaXMKLSAgICAgKiBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQuICovCi0gICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBDYW1lcmFQYXJhbWV0ZXJzICZwYXJhbXMpOwotCi0gICAgLyoqIFJldHVybiB0aGUgY2FtZXJhIHBhcmFtZXRlcnMuICovCi0gICAgQ2FtZXJhUGFyYW1ldGVycyBnZXRQYXJhbWV0ZXJzKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGNvbW1hbmQgdG8gY2FtZXJhIGRyaXZlci4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpOwotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZSB0aGUgaGFyZHdhcmUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoaXMgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgaXMKLSAgICAgKiAqbm90KiBkb25lIGluIHRoZSBkZXN0cnVjdG9yLgotICAgICAqLwotICAgIHZvaWQgcmVsZWFzZSgpOwotCi0gICAgLyoqCi0gICAgICogRHVtcCBzdGF0ZSBvZiB0aGUgY2FtZXJhIGhhcmR3YXJlCi0gICAgICovCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IG1IaWRsRGV2aWNlOwotICAgIFN0cmluZzggbU5hbWU7Ci0KLSAgICBzdGF0aWMgdm9pZCBzTm90aWZ5Q2IoaW50MzJfdCBtc2dfdHlwZSwgaW50MzJfdCBleHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0Miwgdm9pZCAqdXNlcik7Ci0KLSAgICBzdGF0aWMgdm9pZCBzRGF0YUNiKGludDMyX3QgbXNnX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpOwotCi0gICAgc3RhdGljIHZvaWQgc0RhdGFDYlRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLCB1bnNpZ25lZCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcik7Ci0KLSAgICAvLyBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0aGF0IGNvbWJpbmVzIGEgTWVtb3J5SGVhcEJhc2UgYW5kIGEgTWVtb3J5QmFzZQotICAgIC8vIGluIG9uZS4gIFNpbmNlIHdlIHRlbmQgdG8gdXNlIHRoZW0gaW4gYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCwgdGhpcyBpcwotICAgIC8vIGhhbmR5LgotICAgIGNsYXNzIENhbWVyYUhlYXBNZW1vcnkgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBDYW1lcmFIZWFwTWVtb3J5KGludCBmZCwgc2l6ZV90IGJ1Zl9zaXplLCB1aW50X3QgbnVtX2J1ZmZlcnMgPSAxKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZlNpemUoYnVmX3NpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1CdWZzKG51bV9idWZmZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtSGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShmZCwgYnVmX3NpemUgKiBudW1fYnVmZmVycyk7Ci0gICAgICAgICAgICBjb21tb25Jbml0aWFsaXphdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhwbGljaXQgQ2FtZXJhSGVhcE1lbW9yeShzaXplX3QgYnVmX3NpemUsIHVpbnRfdCBudW1fYnVmZmVycyA9IDEpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmU2l6ZShidWZfc2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUJ1ZnMobnVtX2J1ZmZlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1IZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKGJ1Zl9zaXplICogbnVtX2J1ZmZlcnMpOwotICAgICAgICAgICAgY29tbW9uSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tbW9uSW5pdGlhbGl6YXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGUuZGF0YSA9IG1IZWFwLT5iYXNlKCk7Ci0gICAgICAgICAgICBoYW5kbGUuc2l6ZSA9IG1CdWZTaXplICogbU51bUJ1ZnM7Ci0gICAgICAgICAgICBoYW5kbGUuaGFuZGxlID0gdGhpczsKLQotICAgICAgICAgICAgbUJ1ZmZlcnMgPSBuZXcgc3A8TWVtb3J5QmFzZT5bbU51bUJ1ZnNdOwotICAgICAgICAgICAgZm9yICh1aW50X3QgaSA9IDA7IGkgPCBtTnVtQnVmczsgaSsrKQotICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldID0gbmV3IE1lbW9yeUJhc2UobUhlYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICogbUJ1ZlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmU2l6ZSk7Ci0KLSAgICAgICAgICAgIGhhbmRsZS5yZWxlYXNlID0gc1B1dE1lbW9yeTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgfkNhbWVyYUhlYXBNZW1vcnkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGUgW10gbUJ1ZmZlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbUJ1ZlNpemU7Ci0gICAgICAgIHVpbnRfdCBtTnVtQnVmczsKLSAgICAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG1IZWFwOwotICAgICAgICBzcDxNZW1vcnlCYXNlPiAqbUJ1ZmZlcnM7Ci0KLSAgICAgICAgY2FtZXJhX21lbW9yeV90IGhhbmRsZTsKLSAgICB9OwotCi0gICAgc3RhdGljIGNhbWVyYV9tZW1vcnlfdCogc0dldE1lbW9yeShpbnQgZmQsIHNpemVfdCBidWZfc2l6ZSwgdWludF90IG51bV9idWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKTsKLQotICAgIHN0YXRpYyB2b2lkIHNQdXRNZW1vcnkoY2FtZXJhX21lbW9yeV90ICpkYXRhKTsKLQotICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iKTsKLSAgICB2b2lkIGNsZWFudXBDaXJjdWxhdGluZ0J1ZmZlcnMoKTsKLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrCi0gICAgICovCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBub3RpZnlDYWxsYmFjaygKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6Tm90aWZ5Q2FsbGJhY2tNc2cgbXNnVHlwZSwKLSAgICAgICAgICAgIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHVpbnQzMl90PiByZWdpc3Rlck1lbW9yeSgKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX2hhbmRsZSYgZGVzY3JpcHRvciwKLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlclNpemUsIHVpbnQzMl90IGJ1ZmZlckNvdW50KSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHVucmVnaXN0ZXJNZW1vcnkodWludDMyX3QgbWVtSWQpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZGF0YUNhbGxiYWNrKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpEYXRhQ2FsbGJhY2tNc2cgbXNnVHlwZSwKLSAgICAgICAgICAgIHVpbnQzMl90IGRhdGEsIHVpbnQzMl90IGJ1ZmZlckluZGV4LAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpDYW1lcmFGcmFtZU1ldGFkYXRhJiBtZXRhZGF0YSkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OkRhdGFDYWxsYmFja01zZyBtc2dUeXBlLAotICAgICAgICAgICAgdWludDMyX3QgZGF0YSwgdWludDMyX3QgYnVmZmVySW5kZXgsIGludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpEYXRhQ2FsbGJhY2tNc2cgbXNnVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX2hhbmRsZSYgZnJhbWVEYXRhLCB1aW50MzJfdCBkYXRhLAotICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySW5kZXgsIGludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OkRhdGFDYWxsYmFja01zZyBtc2dUeXBlLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OkhhbmRsZVRpbWVzdGFtcE1lc3NhZ2U+Jikgb3ZlcnJpZGU7Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VQcmV2aWV3Q2FsbGJhY2sKLSAgICAgKi8KLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGRlcXVldWVCdWZmZXIoZGVxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cz4KLSAgICAgICAgICAgIGVucXVldWVCdWZmZXIodWludDY0X3QgYnVmZmVySWQpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM+Ci0gICAgICAgICAgICBjYW5jZWxCdWZmZXIodWludDY0X3QgYnVmZmVySWQpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM+Ci0gICAgICAgICAgICBzZXRCdWZmZXJDb3VudCh1aW50MzJfdCBjb3VudCkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cz4KLSAgICAgICAgICAgIHNldEJ1ZmZlcnNHZW9tZXRyeSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgZm9ybWF0KSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzPgotICAgICAgICAgICAgc2V0Q3JvcChpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cz4KLSAgICAgICAgICAgIHNldFVzYWdlKGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpCdWZmZXJVc2FnZSB1c2FnZSkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cz4KLSAgICAgICAgICAgIHNldFN3YXBJbnRlcnZhbChpbnQzMl90IGludGVydmFsKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGdldE1pblVuZGVxdWV1ZWRCdWZmZXJDb3VudCgKLSAgICAgICAgZ2V0TWluVW5kZXF1ZXVlZEJ1ZmZlckNvdW50X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzPgotICAgICAgICAgICAgc2V0VGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKLQotICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICBtUHJldmlld1dpbmRvdzsKLQotICAgIG5vdGlmeV9jYWxsYmFjayAgICAgICAgICAgICAgIG1Ob3RpZnlDYjsKLSAgICBkYXRhX2NhbGxiYWNrICAgICAgICAgICAgICAgICBtRGF0YUNiOwotICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wICAgICAgIG1EYXRhQ2JUaW1lc3RhbXA7Ci0gICAgZGF0YV9jYWxsYmFja190aW1lc3RhbXBfYmF0Y2ggbURhdGFDYlRpbWVzdGFtcEJhdGNoOwotICAgIHZvaWQgKm1DYlVzZXI7Ci0KLSAgICAvLyBDYWNoZWQgdmFsdWVzIGZvciBwcmV2aWV3IHN0cmVhbSBwYXJhbWV0ZXJzCi0gICAgc3RhdGljIGNvbnN0IGludCBOT1RfU0VUID0gLTE7Ci0gICAgaW50IG1QcmV2aWV3U2NhbGluZ01vZGU7Ci0gICAgaW50IG1QcmV2aWV3VHJhbnNmb3JtOwotICAgIGludCBtUHJldmlld1dpZHRoOwotICAgIGludCBtUHJldmlld0hlaWdodDsKLSAgICBpbnQgbVByZXZpZXdGb3JtYXQ7Ci0gICAgdWludDY0X3QgbVByZXZpZXdVc2FnZTsKLSAgICBpbnQgbVByZXZpZXdTd2FwSW50ZXJ2YWw7Ci0gICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IG1QcmV2aWV3Q3JvcDsKLQotICAgIHN0cnVjdCBCdWZmZXJIYXNoZXIgewotICAgICAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZikgY29uc3QgewotICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxscHRyKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICBzaXplX3QgcmVzdWx0ID0gMTsKLSAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgYnVmLT5udW1GZHM7Ci0gICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGJ1Zi0+bnVtSW50czsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBidWYtPm51bUZkcyArIGJ1Zi0+bnVtSW50czsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGJ1Zi0+ZGF0YVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc3RydWN0IEJ1ZmZlckNvbXBhcmF0b3IgewotICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYxLCBjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZjIpIGNvbnN0IHsKLSAgICAgICAgICAgIGlmIChidWYxLT5udW1GZHMgPT0gYnVmMi0+bnVtRmRzICYmIGJ1ZjEtPm51bUludHMgPT0gYnVmMi0+bnVtSW50cykgewotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBidWYxLT5udW1GZHMgKyBidWYxLT5udW1JbnRzOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZjEtPmRhdGFbaV0gIT0gYnVmMi0+ZGF0YVtpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHN0ZDo6bXV0ZXggbUJ1ZmZlcklkTWFwTG9jazsgLy8gcHJvdGVjdGluZyBtQnVmZmVySWRNYXAgYW5kIG1OZXh0QnVmZmVySWQKLSAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxjb25zdCBidWZmZXJfaGFuZGxlX3QsIHVpbnQ2NF90LAotICAgICAgICAgICAgQnVmZmVySGFzaGVyLCBCdWZmZXJDb21wYXJhdG9yPiBCdWZmZXJJZE1hcDsKLSAgICAvLyBzdHJlYW0gSUQgLT4gcGVyIHN0cmVhbSBidWZmZXIgSUQgbWFwCi0gICAgQnVmZmVySWRNYXAgbUJ1ZmZlcklkTWFwOwotICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgQU5hdGl2ZVdpbmRvd0J1ZmZlcio+IG1SZXZlcnNlZEJ1Zk1hcDsKLSAgICB1aW50NjRfdCBtTmV4dEJ1ZmZlcklkID0gMTsKLSAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7Ci0KLSAgICBzdGQ6Om11dGV4IG1IaWRsTWVtUG9vbE1hcExvY2s7IC8vIHByb3RlY3RpbmcgbUhpZGxNZW1Qb29sTWFwCi0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgY2FtZXJhX21lbW9yeV90Kj4gbUhpZGxNZW1Qb29sTWFwOwotfTsKLQotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggNGE1MDlhYS4uNTBlZjk1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC01NiwxMSArNTYsMTIgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIgotI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogI2luY2x1ZGUgInV0aWxzL1RyYWNlSEZSLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHR1cGxlPgpAQCAtMjcwLDcgKzI3MSw3IEBACiAgICAgfQogCiAgICAgLyoqIFJlZ2lzdGVyIGluLWZsaWdodCBtYXAgdG8gdGhlIHN0YXR1cyB0cmFja2VyICovCi0gICAgbUluRmxpZ2h0U3RhdHVzSWQgPSBtU3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CisgICAgbUluRmxpZ2h0U3RhdHVzSWQgPSBtU3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCJJbmZsaWdodFJlcXVlc3RzIik7CiAKICAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICAgICAgcmVzID0gbVJlcXVlc3RCdWZmZXJTTS5pbml0aWFsaXplKG1TdGF0dXNUcmFja2VyKTsKQEAgLTMwOSw3ICszMTAsNyBAQAogCiAgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX1VOQ09ORklHVVJFRCk7CiAgICAgbU5leHRTdHJlYW1JZCA9IDA7Ci0gICAgbUR1bW15U3RyZWFtSWQgPSBOT19TVFJFQU07CisgICAgbUZha2VTdHJlYW1JZCA9IE5PX1NUUkVBTTsKICAgICBtTmVlZENvbmZpZyA9IHRydWU7CiAgICAgbVBhdXNlU3RhdGVOb3RpZnkgPSBmYWxzZTsKIApAQCAtODY3LDcgKzg2OCw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCgKICAgICAgICAgY29uc3QgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gJm1ldGFkYXRhTGlzdCwKICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKLSAgICAgICAgYm9vbCByZXBlYXRpbmcsCisgICAgICAgIGJvb2wgcmVwZWF0aW5nLCBuc2Vjc190IHJlcXVlc3RUaW1lTnMsCiAgICAgICAgIFJlcXVlc3RMaXN0ICpyZXF1ZXN0TGlzdCkgewogICAgIGlmIChyZXF1ZXN0TGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIENMT0dFKCJyZXF1ZXN0TGlzdCBjYW5ub3QgYmUgTlVMTC4iKTsKQEAgLTg4Niw2ICs4ODcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbmV3UmVxdWVzdC0+bVJlcGVhdGluZyA9IHJlcGVhdGluZzsKKyAgICAgICAgbmV3UmVxdWVzdC0+bVJlcXVlc3RUaW1lTnMgPSByZXF1ZXN0VGltZU5zOwogCiAgICAgICAgIC8vIFNldHVwIGJ1cnN0IElkIGFuZCByZXF1ZXN0IElkCiAgICAgICAgIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCA9IGJ1cnN0SWQrKzsKQEAgLTk1Myw2ICs5NTUsOCBAQAogICAgICAgICAvKm91dCovCiAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgbnNlY3NfdCByZXF1ZXN0VGltZU5zID0gc3lzdGVtVGltZSgpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTk2NSw3ICs5NjksNyBAQAogICAgIFJlcXVlc3RMaXN0IHJlcXVlc3RMaXN0OwogCiAgICAgcmVzID0gY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQocmVxdWVzdHMsIHN1cmZhY2VNYXBzLAotICAgICAgICAgICAgcmVwZWF0aW5nLCAvKm91dCovJnJlcXVlc3RMaXN0KTsKKyAgICAgICAgICAgIHJlcGVhdGluZywgcmVxdWVzdFRpbWVOcywgLypvdXQqLyZyZXF1ZXN0TGlzdCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAvLyBlcnJvciBsb2dnZWQgYnkgcHJldmlvdXMgY2FsbAogICAgICAgICByZXR1cm4gcmVzOwpAQCAtOTk3LDcgKzEwMDEsNyBAQAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIHsKICAgICBSZXF1ZXN0QnVmZmVyU3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsCisgICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLAogICAgICAgICAqdGhpcywgKm1JbnRlcmZhY2UsICp0aGlzfTsKICAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIF9oaWRsX2NiKTsKICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKQEAgLTEwMDYsNyArMTAxMCw3IEBACiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnJldHVyblN0cmVhbUJ1ZmZlcnMoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKICAgICBSZXR1cm5CdWZmZXJTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsICptSW50ZXJmYWNlfTsKKyAgICAgICAgbUlkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCAqbUludGVyZmFjZX07CiAgICAgY2FtZXJhMzo6cmV0dXJuU3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZmZlcnMpOwogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQpAQCAtMTA1NCw3ICsxMDU4LDggQEAKICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCiAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKICAgICAgICAgbVJlc3VsdE1ldGFkYXRhUXVldWUsIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKLSAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsICptSW50ZXJmYWNlCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgKm1JbnRlcmZhY2UKICAgICB9OwogCiAgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7CkBAIC0xMTEyLDcgKzExMTcsOCBAQAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAogICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywgKm1JbnRlcmZhY2UKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICAqbUludGVyZmFjZQogICAgIH07CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKQEAgLTExNTIsNyArMTE1OCw4IEBACiAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAogICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCiAgICAgICAgIG1SZXN1bHRNZXRhZGF0YVF1ZXVlLCBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCi0gICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLCAqbUludGVyZmFjZQorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgICptSW50ZXJmYWNlCiAgICAgfTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKICAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKQEAgLTE0NTUsNiArMTQ2Miw4IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgbVNlc3Npb25TdGF0c0J1aWxkZXIuYWRkU3RyZWFtKG1OZXh0U3RyZWFtSWQpOworCiAgICAgKmlkID0gbU5leHRTdHJlYW1JZCsrOwogICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKIApAQCAtMTU3OCw2ICsxNTg3LDcgQEAKICAgICAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLnJlbW92ZVN0cmVhbShpZCk7CiAgICAgfQogCiAgICAgLy8gRGVsZXRlIG91dHB1dCBzdHJlYW0gb3IgdGhlIG91dHB1dCBwYXJ0IG9mIGEgYmktZGlyZWN0aW9uYWwgc3RyZWFtLgpAQCAtMTc2OCw2ICsxNzc4LDcgQEAKICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24pOwogICAgIHN0YXR1c190IHJlcyA9IHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIGZhbHNlLCBtYXhFeHBlY3RlZER1cmF0aW9uKTsKICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIG1TdGF0dXNUcmFja2VyLT5kdW1wQWN0aXZlQ29tcG9uZW50cygpOwogICAgICAgICBTRVRfRVJSX0woIkVycm9yIHdhaXRpbmcgZm9yIEhBTCB0byBkcmFpbjogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLAogICAgICAgICAgICAgICAgIHJlcyk7CiAgICAgfQpAQCAtMTgzMywxMCArMTg0NCwxMiBAQAogCiAgICAgbVN0YXR1c1dhaXRlcnMrKzsKIAorICAgIGJvb2wgc2lnbmFsUGlwZWxpbmVEcmFpbiA9IGZhbHNlOwogICAgIGlmICghYWN0aXZlICYmIG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgICAgIGF1dG8gc3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7CiAgICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpIHsKICAgICAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgICAgICBzaWduYWxQaXBlbGluZURyYWluID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uV2FpdFVudGlsSWRsZSgpOwogICAgIH0KQEAgLTE4NjYsNiArMTg3OSwxMCBAQAogICAgICAgICB9CiAgICAgfSB3aGlsZSAoIXN0YXRlU2Vlbik7CiAKKyAgICBpZiAoc2lnbmFsUGlwZWxpbmVEcmFpbikgeworICAgICAgICBtUmVxdWVzdFRocmVhZC0+cmVzZXRQaXBlbGluZURyYWluKCk7CisgICAgfQorCiAgICAgbVN0YXR1c1dhaXRlcnMtLTsKIAogICAgIHJldHVybiByZXM7CkBAIC0yMDAzLDYgKzIwMjAsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyKC8qb3V0Ki9mcmFtZU51bWJlcik7CisKKyAgICAgICAgLy8gU3RvcCBzZXNzaW9uIGFuZCBzdHJlYW0gY291bnRlcgorICAgICAgICBtU2Vzc2lvblN0YXRzQnVpbGRlci5zdG9wQ291bnRlcigpOwogICAgIH0KIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+Zmx1c2goKTsKQEAgLTIwODAsNiArMjEwMCw5IEBACiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5U3RhdHVzKGJvb2wgaWRsZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBzdHJlYW1JZHM7CisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiBzdHJlYW1TdGF0czsKKwogICAgIHsKICAgICAgICAgLy8gTmVlZCBtTG9jayB0byBzYWZlbHkgdXBkYXRlIHN0YXRlIGFuZCBzeW5jaHJvbml6ZSB0byBjdXJyZW50CiAgICAgICAgIC8vIHN0YXRlIG9mIG1ldGhvZHMgaW4gZmxpZ2h0LgpAQCAtMjA5Nyw2ICsyMTIwLDI0IEBACiAgICAgICAgIC8vIFNraXAgbm90aWZ5aW5nIGxpc3RlbmVyIGlmIHdlJ3JlIGRvaW5nIHNvbWUgdXNlci10cmFuc3BhcmVudAogICAgICAgICAvLyBzdGF0ZSBjaGFuZ2VzCiAgICAgICAgIGlmIChtUGF1c2VTdGF0ZU5vdGlmeSkgcmV0dXJuOworCisgICAgICAgIC8vIFBvcHVsYXRlIHN0cmVhbSBzdGF0aXN0aWNzIGluIGNhc2Ugb2YgSWRsZQorICAgICAgICBpZiAoaWRsZSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGF1dG8gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1JZHMucHVzaF9iYWNrKHN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbSogY2FtZXJhM1N0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3RyZWFtLT5hc0hhbFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHVzYWdlID0gMExMOworICAgICAgICAgICAgICAgIGlmIChjYW1lcmEzU3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UgPSBjYW1lcmEzU3RyZWFtLT5nZXRVc2FnZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJlYW1TdGF0cy5lbXBsYWNlX2JhY2soc3RyZWFtLT5nZXRXaWR0aCgpLCBzdHJlYW0tPmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldEZvcm1hdCgpLCBzdHJlYW0tPmdldERhdGFTcGFjZSgpLCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRNYXhIYWxCdWZmZXJzKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0TWF4VG90YWxCdWZmZXJzKCkgLSBzdHJlYW0tPmdldE1heEhhbEJ1ZmZlcnMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CkBAIC0yMTA1LDcgKzIxNDYsMjIgQEAKICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwogICAgIH0KICAgICBpZiAoaWRsZSAmJiBsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5ub3RpZnlJZGxlKCk7CisgICAgICAgIC8vIEdldCBzZXNzaW9uIHN0YXRzIGZyb20gdGhlIGJ1aWxkZXIsIGFuZCBub3RpZnkgdGhlIGxpc3RlbmVyLgorICAgICAgICBpbnQ2NF90IHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudDsKKyAgICAgICAgYm9vbCBkZXZpY2VFcnJvcjsKKyAgICAgICAgc3RkOjptYXA8aW50LCBTdHJlYW1TdGF0cz4gc3RyZWFtU3RhdHNNYXA7CisgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLmJ1aWxkQW5kUmVzZXQoJnJlcXVlc3RDb3VudCwgJnJlc3VsdEVycm9yQ291bnQsCisgICAgICAgICAgICAgICAgJmRldmljZUVycm9yLCAmc3RyZWFtU3RhdHNNYXApOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbUlkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gc3RyZWFtSWRzW2ldOworICAgICAgICAgICAgYXV0byBzdGF0cyA9IHN0cmVhbVN0YXRzTWFwLmZpbmQoc3RyZWFtSWQpOworICAgICAgICAgICAgaWYgKHN0YXRzICE9IHN0cmVhbVN0YXRzTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtU3RhdHNbaV0ubVJlcXVlc3RDb3VudCA9IHN0YXRzLT5zZWNvbmQubVJlcXVlc3RlZEZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgc3RyZWFtU3RhdHNbaV0ubUVycm9yQ291bnQgPSBzdGF0cy0+c2Vjb25kLm1Ecm9wcGVkRnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICBzdHJlYW1TdGF0c1tpXS5tU3RhcnRMYXRlbmN5TXMgPSBzdGF0cy0+c2Vjb25kLm1TdGFydExhdGVuY3lNczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsaXN0ZW5lci0+bm90aWZ5SWRsZShyZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLCBzdHJlYW1TdGF0cyk7CiAgICAgfQogfQogCkBAIC0yMjE1LDYgKzIyNzEsMTIgQEAKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgaXMgbm90IGZvdW5kLiIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKworICAgIGlmIChkcm9wcGluZykgeworICAgICAgICBtU2Vzc2lvblN0YXRzQnVpbGRlci5zdG9wQ291bnRlcihzdHJlYW1JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlc3Npb25TdGF0c0J1aWxkZXIuc3RhcnRDb3VudGVyKHN0cmVhbUlkKTsKKyAgICB9CiAgICAgcmV0dXJuIHN0cmVhbS0+ZHJvcEJ1ZmZlcnMoZHJvcHBpbmcpOwogfQogCkBAIC0yMzA2LDYgKzIzNjgsMTUgQEAKICAgICAgICAgbmV3UmVxdWVzdC0+bVJvdGF0ZUFuZENyb3BBdXRvID0gZmFsc2U7CiAgICAgfQogCisgICAgYXV0byB6b29tUmF0aW9FbnRyeSA9CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8pOworICAgIGlmICh6b29tUmF0aW9FbnRyeS5jb3VudCA+IDAgJiYKKyAgICAgICAgICAgIHpvb21SYXRpb0VudHJ5LmRhdGEuZlswXSA9PSAxLjBmKSB7CisgICAgICAgIG5ld1JlcXVlc3QtPm1ab29tUmF0aW9JczF4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXdSZXF1ZXN0LT5tWm9vbVJhdGlvSXMxeCA9IGZhbHNlOworICAgIH0KKwogICAgIHJldHVybiBuZXdSZXF1ZXN0OwogfQogCkBAIC0yMzYwLDYgKzI0MzEsOCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgYm9vbCByZXQgPSBmYWxzZTsKIAorICAgIG5zZWNzX3Qgc3RhcnRUaW1lID0gc3lzdGVtVGltZSgpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24gPSBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKIApAQCAtMjQwNyw2ICsyNDgwLDkgQEAKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcGF1c2Ugc3RyZWFtaW5nOiAlZCIsIF9fRlVOQ1RJT05fXywgcmMpOwogICAgIH0KIAorICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ1N0cmVhbUNvbmZpZ3VyZWQobUlkLCBtT3BlcmF0aW5nTW9kZSwgdHJ1ZSAvKmludGVybmFsUmVjb25maWcqLywKKyAgICAgICAgbnMybXMoc3lzdGVtVGltZSgpIC0gc3RhcnRUaW1lKSk7CisKICAgICBpZiAobWFya0NsaWVudEFjdGl2ZSkgewogICAgICAgICBtU3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShjbGllbnRTdGF0dXNJZCk7CiAgICAgfQpAQCAtMjQ2NiwxMiArMjU0MiwxMiBAQAogICAgIH0KIAogICAgIC8vIFdvcmthcm91bmQgZm9yIGRldmljZSBIQUx2My4yIG9yIG9sZGVyIHNwZWMgYnVnIC0gemVybyBzdHJlYW1zIHJlcXVpcmVzCi0gICAgLy8gYWRkaW5nIGEgZHVtbXkgc3RyZWFtIGluc3RlYWQuCisgICAgLy8gYWRkaW5nIGEgZmFrZSBzdHJlYW0gaW5zdGVhZC4KICAgICAvLyBUT0RPOiBCdWc6IDE3MzIxNDA0IGZvciBmaXhpbmcgdGhlIEhBTCBzcGVjIGFuZCByZW1vdmluZyB0aGlzIHdvcmthcm91bmQuCiAgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIGFkZER1bW15U3RyZWFtTG9ja2VkKCk7CisgICAgICAgIGFkZEZha2VTdHJlYW1Mb2NrZWQoKTsKICAgICB9IGVsc2UgewotICAgICAgICB0cnlSZW1vdmVEdW1teVN0cmVhbUxvY2tlZCgpOworICAgICAgICB0cnlSZW1vdmVGYWtlU3RyZWFtTG9ja2VkKCk7CiAgICAgfQogCiAgICAgLy8gU3RhcnQgY29uZmlndXJpbmcgdGhlIHN0cmVhbXMKQEAgLTI2MzMsNyArMjcwOSw3IEBACiAKICAgICBtTmVlZENvbmZpZyA9IGZhbHNlOwogCi0gICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgPworICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKChtRmFrZVN0cmVhbUlkID09IE5PX1NUUkVBTSkgPwogICAgICAgICAgICAgU1RBVFVTX0NPTkZJR1VSRUQgOiBTVEFUVVNfVU5DT05GSUdVUkVEKTsKIAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBTdHJlYW0gY29uZmlndXJhdGlvbiBjb21wbGV0ZSIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKQEAgLTI2NDcsNjkgKzI3MjMsNjkgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAotICAgIGlmIChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKKyAgICBpZiAobUZha2VTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKICAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vblN0cmVhbXNDb25maWd1cmVkKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjphZGREdW1teVN0cmVhbUxvY2tlZCgpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmFkZEZha2VTdHJlYW1Mb2NrZWQoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKLSAgICBpZiAobUR1bW15U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7Ci0gICAgICAgIC8vIFNob3VsZCBuZXZlciBiZSBhZGRpbmcgYSBzZWNvbmQgZHVtbXkgc3RyZWFtIHdoZW4gb25lIGlzIGFscmVhZHkKKyAgICBpZiAobUZha2VTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKKyAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGJlIGFkZGluZyBhIHNlY29uZCBmYWtlIHN0cmVhbSB3aGVuIG9uZSBpcyBhbHJlYWR5CiAgICAgICAgIC8vIGFjdGl2ZQotICAgICAgICBTRVRfRVJSX0woIiVzOiBDYW1lcmEgJXM6IEEgZHVtbXkgc3RyZWFtIGFscmVhZHkgZXhpc3RzISIsCisgICAgICAgIFNFVF9FUlJfTCgiJXM6IENhbWVyYSAlczogQSBmYWtlIHN0cmVhbSBhbHJlYWR5IGV4aXN0cyEiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBBZGRpbmcgYSBkdW1teSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IEFkZGluZyBhIGZha2Ugc3RyZWFtIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwogCi0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gZHVtbXlTdHJlYW0gPQotICAgICAgICAgICAgbmV3IENhbWVyYTNEdW1teVN0cmVhbShtTmV4dFN0cmVhbUlkKTsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBmYWtlU3RyZWFtID0KKyAgICAgICAgICAgIG5ldyBDYW1lcmEzRmFrZVN0cmVhbShtTmV4dFN0cmVhbUlkKTsKIAotICAgIHJlcyA9IG1PdXRwdXRTdHJlYW1zLmFkZChtTmV4dFN0cmVhbUlkLCBkdW1teVN0cmVhbSk7CisgICAgcmVzID0gbU91dHB1dFN0cmVhbXMuYWRkKG1OZXh0U3RyZWFtSWQsIGZha2VTdHJlYW0pOwogICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgYWRkIGR1bW15IHN0cmVhbSB0byBzZXQ6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBhZGQgZmFrZSBzdHJlYW0gdG8gc2V0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgbUR1bW15U3RyZWFtSWQgPSBtTmV4dFN0cmVhbUlkOworICAgIG1GYWtlU3RyZWFtSWQgPSBtTmV4dFN0cmVhbUlkOwogICAgIG1OZXh0U3RyZWFtSWQrKzsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6dHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp0cnlSZW1vdmVGYWtlU3RyZWFtTG9ja2VkKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCi0gICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgcmV0dXJuIE9LOworICAgIGlmIChtRmFrZVN0cmVhbUlkID09IE5PX1NUUkVBTSkgcmV0dXJuIE9LOwogICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgPT0gMSkgcmV0dXJuIE9LOwogCi0gICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IFJlbW92aW5nIHRoZSBkdW1teSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IFJlbW92aW5nIHRoZSBmYWtlIHN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKIAotICAgIC8vIE9rLCBoYXZlIGEgZHVtbXkgc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAotICAgIC8vIHNvIHJlbW92ZSB0aGUgZHVtbXkKKyAgICAvLyBPaywgaGF2ZSBhIGZha2Ugc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAorICAgIC8vIHNvIHJlbW92ZSB0aGUgZmFrZQogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChtRHVtbXlTdHJlYW1JZCk7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChtRmFrZVN0cmVhbUlkKTsKICAgICBpZiAoZGVsZXRlZFN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgIFNFVF9FUlJfTCgiRHVtbXkgc3RyZWFtICVkIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCIsIG1EdW1teVN0cmVhbUlkKTsKKyAgICAgICAgU0VUX0VSUl9MKCJGYWtlIHN0cmVhbSAlZCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QiLCBtRmFrZVN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUobUR1bW15U3RyZWFtSWQpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShtRmFrZVN0cmVhbUlkKTsKIAogICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCiAgICAgcmVzID0gZGVsZXRlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOwogICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBkaXNjb25uZWN0IGRlbGV0ZWQgZHVtbXkgc3RyZWFtICVkIiwgbUR1bW15U3RyZWFtSWQpOworICAgICAgICBTRVRfRVJSX0woIkNhbid0IGRpc2Nvbm5lY3QgZGVsZXRlZCBmYWtlIHN0cmVhbSAlZCIsIG1GYWtlU3RyZWFtSWQpOwogICAgICAgICAvLyBmYWxsIHRocm91Z2ggc2luY2Ugd2Ugd2FudCB0byBzdGlsbCBsaXN0IHRoZSBzdHJlYW0gYXMgZGVsZXRlZC4KICAgICB9CiAgICAgbURlbGV0ZWRTdHJlYW1zLmFkZChkZWxldGVkU3RyZWFtKTsKLSAgICBtRHVtbXlTdHJlYW1JZCA9IE5PX1NUUkVBTTsKKyAgICBtRmFrZVN0cmVhbUlkID0gTk9fU1RSRUFNOwogCiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTI3NjAsNiArMjgzNiw3IEBACiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFLAogICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CisgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLm9uRGV2aWNlRXJyb3IoKTsKICAgICB9CiAKICAgICAvLyBTYXZlIHN0YWNrIHRyYWNlLiBWaWV3IGJ5IGR1bXBpbmcgaXQgbGF0ZXIuCkBAIC0yNzc2LDE0ICsyODUzLDE0IEBACiAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKICAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzLCBib29sIGlzU3RpbGxDYXB0dXJlLAogICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSwgYm9vbCByb3RhdGVBbmRDcm9wQXV0bywgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBjYW1lcmFJZHNXaXRoWm9vbSwKLSAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMpIHsKKyAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsIG5zZWNzX3QgcmVxdWVzdFRpbWVOcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUluRmxpZ2h0TG9jayk7CiAKICAgICBzc2l6ZV90IHJlczsKICAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCwKICAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKLSAgICAgICAgICAgIHJvdGF0ZUFuZENyb3BBdXRvLCBjYW1lcmFJZHNXaXRoWm9vbSwgb3V0cHV0U3VyZmFjZXMpKTsKKyAgICAgICAgICAgIHJvdGF0ZUFuZENyb3BBdXRvLCBjYW1lcmFJZHNXaXRoWm9vbSwgcmVxdWVzdFRpbWVOcywgb3V0cHV0U3VyZmFjZXMpKTsKICAgICBpZiAocmVzIDwgMCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDEpIHsKQEAgLTI4MTQsNyArMjg5MSw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6Y2hlY2tJbmZsaWdodE1hcExlbmd0aExvY2tlZCgpIHsKLSAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiB3ZSBoYXZlIHRvbyBtYW55IGluLWZsaWdodCBmcmFtZXMgd2l0aCBsb25nIHRvdGFsIGluZmxpZ2h0IGR1cmF0aW9uLAorICAgIC8vIFZhbGlkYXRpb24gY2hlY2sgLSBpZiB3ZSBoYXZlIHRvbyBtYW55IGluLWZsaWdodCBmcmFtZXMgd2l0aCBsb25nIHRvdGFsIGluZmxpZ2h0IGR1cmF0aW9uLAogICAgIC8vIHNvbWV0aGluZyBoYXMgbGlrZWx5IGdvbmUgd3JvbmcuIFRoaXMgbWlnaHQgc3RpbGwgYmUgbGVnaXQgb25seSBpZiBhcHBsaWNhdGlvbiBzZW5kIGluCiAgICAgLy8gYSBsb25nIGJ1cnN0IG9mIGxvbmcgZXhwb3N1cmUgcmVxdWVzdHMuCiAgICAgaWYgKG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPiBrTWluV2FybkluZmxpZ2h0RHVyYXRpb24pIHsKQEAgLTI4NTMsNyArMjkzMCw3IEBACiAKICAgICBGbHVzaEluZmxpZ2h0UmVxU3RhdGVzIHN0YXRlcyB7CiAgICAgICAgIG1JZCwgbUluRmxpZ2h0TG9jaywgbUluRmxpZ2h0TWFwLCBtVXNlSGFsQnVmTWFuYWdlciwKLSAgICAgICAgbGlzdGVuZXIsICp0aGlzLCAqbUludGVyZmFjZSwgKnRoaXN9OworICAgICAgICBsaXN0ZW5lciwgKnRoaXMsICptSW50ZXJmYWNlLCAqdGhpcywgbVNlc3Npb25TdGF0c0J1aWxkZXJ9OwogCiAgICAgY2FtZXJhMzo6Zmx1c2hJbmZsaWdodFJlcXVlc3RzKHN0YXRlcyk7CiB9CkBAIC0zNzYyLDYgKzM4MzksNyBAQAogICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCiAgICAgICAgIG1MaXN0ZW5lcihudWxscHRyKSwKICAgICAgICAgbUlkKGdldElkKHBhcmVudCkpLAorICAgICAgICBtRmlyc3RSZXBlYXRpbmcoZmFsc2UpLAogICAgICAgICBtUmVjb25maWd1cmVkKGZhbHNlKSwKICAgICAgICAgbURvUGF1c2UoZmFsc2UpLAogICAgICAgICBtUGF1c2VkKHRydWUpLApAQCAtMzc3OSw3ICszODU3LDcgQEAKICAgICAgICAgbVNlc3Npb25QYXJhbUtleXMoc2Vzc2lvblBhcmFtS2V5cyksCiAgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zKHNlc3Npb25QYXJhbUtleXMuc2l6ZSgpKSwKICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewotICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgiUmVxdWVzdFRocmVhZCIpOwogfQogCiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp+UmVxdWVzdFRocmVhZCgpIHt9CkBAIC0zODkyLDYgKzM5NzAsNyBAQAogICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKICAgICB9CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisgICAgbUZpcnN0UmVwZWF0aW5nID0gdHJ1ZTsKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuaW5zZXJ0KG1SZXBlYXRpbmdSZXF1ZXN0cy5iZWdpbigpLAogICAgICAgICAgICAgcmVxdWVzdHMuYmVnaW4oKSwgcmVxdWVzdHMuZW5kKCkpOwogCkBAIC00NDA1LDExICs0NDg0LDExIEBACiAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY2FtZXJhSWRzV2l0aFpvb207CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEhBTCB3b3JrYXJvdW5kOgotICAgICAgICAgICAgICogSW5zZXJ0IGEgZHVtbXkgdHJpZ2dlciBJRCBpZiBhIHRyaWdnZXIgaXMgc2V0IGJ1dCBubyB0cmlnZ2VyIElEIGlzCisgICAgICAgICAgICAgKiBJbnNlcnQgYSBmYWtlIHRyaWdnZXIgSUQgaWYgYSB0cmlnZ2VyIGlzIHNldCBidXQgbm8gdHJpZ2dlciBJRCBpcwogICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXMgPSBhZGREdW1teVRyaWdnZXJJZHMoY2FwdHVyZVJlcXVlc3QpOworICAgICAgICAgICAgcmVzID0gYWRkRmFrZVRyaWdnZXJJZHMoY2FwdHVyZVJlcXVlc3QpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBpbnNlcnQgZHVtbXkgdHJpZ2dlciBJRHMgIgorICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBpbnNlcnQgZmFrZSB0cmlnZ2VyIElEcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTQ0MjYsMTMgKzQ1MDUsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlcnMuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhcmVudC0+bURpc3RvcnRpb25NYXBwZXJzW2l0LT5jYW1lcmFJZF0uY29ycmVjdENhcHR1cmVSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaXQtPm1ldGFkYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIGNvcnJlY3QgY2FwdHVyZSByZXF1ZXN0cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGxlbnMgZGlzdG9ydGlvbiBmb3IgcmVxdWVzdCAlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXB0dXJlUmVxdWVzdC0+bURpc3RvcnRpb25Db3JyZWN0aW9uVXBkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhcmVudC0+bURpc3RvcnRpb25NYXBwZXJzW2l0LT5jYW1lcmFJZF0uY29ycmVjdENhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihpdC0+bWV0YWRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBjb3JyZWN0IGNhcHR1cmUgcmVxdWVzdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgbGVucyBkaXN0b3J0aW9uIGZvciByZXF1ZXN0ICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tRGlzdG9ydGlvbkNvcnJlY3Rpb25VcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00NDQzLDIxICs0NTI2LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGUgPSBpdC0+bWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfWk9PTV9SQVRJTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5jb3VudCA+IDAgJiYgZS5kYXRhLmZbMF0gIT0gMS4wZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXB0dXJlUmVxdWVzdC0+bVpvb21SYXRpb0lzMXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZHNXaXRoWm9vbS5pbnNlcnQoaXQtPmNhbWVyYUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tWm9vbVJhdGlvTWFwcGVyc1tpdC0+Y2FtZXJhSWRdLnVwZGF0ZUNhcHR1cmVSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaXQtPm1ldGFkYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIGNvcnJlY3QgY2FwdHVyZSByZXF1ZXN0cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHpvb20gcmF0aW8gZm9yIHJlcXVlc3QgJWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsUmVxdWVzdC0+ZnJhbWVfbnVtYmVyLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmVSZXF1ZXN0LT5tWm9vbVJhdGlvVXBkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhcmVudC0+bVpvb21SYXRpb01hcHBlcnNbaXQtPmNhbWVyYUlkXS51cGRhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaXQtPm1ldGFkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gY29ycmVjdCBjYXB0dXJlIHJlcXVlc3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHpvb20gcmF0aW8gZm9yIHJlcXVlc3QgJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1ab29tUmF0aW9VcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVJlcXVlc3QtPm1Sb3RhdGVBbmRDcm9wQXV0bykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVJlcXVlc3QtPm1Sb3RhdGVBbmRDcm9wQXV0byAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjYXB0dXJlUmVxdWVzdC0+bVJvdGF0aW9uQW5kQ3JvcFVwZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXQgPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5lbmQoKTsgaXQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gbWFwcGVyID0gcGFyZW50LT5tUm90YXRlQW5kQ3JvcE1hcHBlcnMuZmluZChpdC0+Y2FtZXJhSWQpOwpAQCAtNDQ3MSw2ICs0NTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUm90YXRpb25BbmRDcm9wVXBkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00NjczLDcgKzQ3NjAsNyBAQAogICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVJvdGF0ZUFuZENyb3BBdXRvLCBtUHJldkNhbWVyYUlkc1dpdGhab29tLAogICAgICAgICAgICAgICAgIChtVXNlSGFsQnVmTWFuYWdlcikgPyB1bmlxdWVTdXJmYWNlSWRNYXAgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlTWFwe30pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlTWFwe30sIGNhcHR1cmVSZXF1ZXN0LT5tUmVxdWVzdFRpbWVOcyk7CiAgICAgICAgIEFMT0dWVigiJXM6IHJlZ2lzdGVyZWQgaW4gZmxpZ2h0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAogICAgICAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiAiLiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLApAQCAtNDc4NSw2ICs0ODcyLDEyIEBACiAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkID0gc3RyZWFtSWRzOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnJlc2V0UGlwZWxpbmVEcmFpbigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgcGwobVBhdXNlTG9jayk7CisgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSBmYWxzZTsKKyAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQuY2xlYXIoKTsKK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhclByZXZpb3VzUmVxdWVzdCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIG1QcmV2UmVxdWVzdC5jbGVhcigpOwpAQCAtNDk4OSw2ICs1MDgyLDE3IEBACiAgICAgICAgICAgICAvLyBsaXN0LiBHdWFyYW50ZWVzIGEgY29tcGxldGUgaW4tc2VxdWVuY2Ugc2V0IG9mIGNhcHR1cmVzIHRvCiAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgIGNvbnN0IFJlcXVlc3RMaXN0ICZyZXF1ZXN0cyA9IG1SZXBlYXRpbmdSZXF1ZXN0czsKKyAgICAgICAgICAgIGlmIChtRmlyc3RSZXBlYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtRmlyc3RSZXBlYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiByZXF1ZXN0IDogcmVxdWVzdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHJlcGVhdGluZyByZXF1ZXN0cywgb3ZlcnJpZGUgdGltZXN0YW1wIHJlcXVlc3QgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgYSByZXF1ZXN0IGlzIGluc2VydGVkIGludG8gdGhlIHJlcXVlc3QgcXVldWUsCisgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIG9yaWdpbmFsIHJlcGVhdGluZyByZXF1ZXN0IHdpbGwgaGF2ZSBhbiBvbGQKKyAgICAgICAgICAgICAgICAgICAgLy8gZml4ZWQgdGltZXN0YW1wLgorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5tUmVxdWVzdFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBSZXF1ZXN0TGlzdDo6Y29uc3RfaXRlcmF0b3IgZmlyc3RSZXF1ZXN0ID0KICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMuYmVnaW4oKTsKICAgICAgICAgICAgIG5leHRSZXF1ZXN0ID0gKmZpcnN0UmVxdWVzdDsKQEAgLTUzMTMsMjYgKzU0MTcsMjYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmFkZER1bW15VHJpZ2dlcklkcygKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmFkZEZha2VUcmlnZ2VySWRzKAogICAgICAgICBjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcXVlc3QpIHsKICAgICAvLyBUcmlnZ2VyIElEIDAgaGFkIHNwZWNpYWwgbWVhbmluZyBpbiB0aGUgSEFMMiBzcGVjLCBzbyBhdm9pZCBpdCBoZXJlCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgZHVtbXlUcmlnZ2VySWQgPSAxOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGZha2VUcmlnZ2VySWQgPSAxOwogICAgIHN0YXR1c190IHJlczsKIAogICAgIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IHJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGE7CiAKLSAgICAvLyBJZiBBRiB0cmlnZ2VyIGlzIGFjdGl2ZSwgaW5zZXJ0IGEgZHVtbXkgQUYgdHJpZ2dlciBJRCBpZiBub25lIGFscmVhZHkKKyAgICAvLyBJZiBBRiB0cmlnZ2VyIGlzIGFjdGl2ZSwgaW5zZXJ0IGEgZmFrZSBBRiB0cmlnZ2VyIElEIGlmIG5vbmUgYWxyZWFkeQogICAgIC8vIGV4aXN0cwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBhZlRyaWdnZXIgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSKTsKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYWZJZCA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQpOwogICAgIGlmIChhZlRyaWdnZXIuY291bnQgPiAwICYmCiAgICAgICAgICAgICBhZlRyaWdnZXIuZGF0YS51OFswXSAhPSBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRExFICYmCiAgICAgICAgICAgICBhZklkLmNvdW50ID09IDApIHsKLSAgICAgICAgcmVzID0gbWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELCAmZHVtbXlUcmlnZ2VySWQsIDEpOworICAgICAgICByZXMgPSBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsICZmYWtlVHJpZ2dlcklkLCAxKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICAvLyBJZiBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgaXMgYWN0aXZlLCBpbnNlcnQgYSBkdW1teSBwcmVjYXB0dXJlIHRyaWdnZXIgSUQKKyAgICAvLyBJZiBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgaXMgYWN0aXZlLCBpbnNlcnQgYSBmYWtlIHByZWNhcHR1cmUgdHJpZ2dlciBJRAogICAgIC8vIGlmIG5vbmUgYWxyZWFkeSBleGlzdHMKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgcGNUcmlnZ2VyID0KICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUik7CkBAIC01MzQxLDcgKzU0NDUsNyBAQAogICAgICAgICAgICAgcGNUcmlnZ2VyLmRhdGEudThbMF0gIT0gQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUl9JRExFICYmCiAgICAgICAgICAgICBwY0lkLmNvdW50ID09IDApIHsKICAgICAgICAgcmVzID0gbWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAotICAgICAgICAgICAgICAgICZkdW1teVRyaWdnZXJJZCwgMSk7CisgICAgICAgICAgICAgICAgJmZha2VUcmlnZ2VySWQsIDEpOwogICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgIH0KIApAQCAtNTYwNyw3ICs1NzExLDcgQEAKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICBtU3RhdHVzVHJhY2tlciA9IHN0YXR1c1RyYWNrZXI7Ci0gICAgbVJlcXVlc3RCdWZmZXJTdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgIG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoIkJ1ZmZlclJlcXVlc3RTTSIpOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCA0MDhmMWY5Li5kZTdkZjgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtNDcxLDEwICs0NzEsMTIgQEAKIAogICAgIGNhbWVyYTM6OlN0cmVhbVNldCAgICAgICAgIG1PdXRwdXRTdHJlYW1zOwogICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+IG1JbnB1dFN0cmVhbTsKKyAgICBTZXNzaW9uU3RhdHNCdWlsZGVyICAgICAgICBtU2Vzc2lvblN0YXRzQnVpbGRlcjsKKwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0U3RyZWFtSWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbU5lZWRDb25maWc7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtRHVtbXlTdHJlYW1JZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtRmFrZVN0cmVhbUlkOwogCiAgICAgLy8gV2hldGhlciB0byBzZW5kIHN0YXRlIHVwZGF0ZXMgdXBzdHJlYW0KICAgICAvLyBQYXVzZSB3aGVuIGRvaW5nIHRyYW5zcGFyZW50IHJlY29uZmlndXJhdGlvbgpAQCAtNTE3LDYgKzUxOSwyMSBAQAogICAgICAgICAvLyBvdmVycmlkaW5nIG9mIFJPVEFURV9BTkRfQ1JPUCB2YWx1ZSBhbmQgYWRqdXN0bWVudCBvZiBjb29yZGluYXRlcwogICAgICAgICAvLyBpbiBzZXZlcmFsIG90aGVyIGNvbnRyb2xzIGluIGJvdGggdGhlIHJlcXVlc3QgYW5kIHRoZSByZXN1bHQKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdGF0ZUFuZENyb3BBdXRvOworICAgICAgICAvLyBXaGV0aGVyIHRoaXMgY2FwdHVyZSByZXF1ZXN0IGhhcyBpdHMgem9vbSByYXRpbyBzZXQgdG8gMS4weCBiZWZvcmUKKyAgICAgICAgLy8gdGhlIGZyYW1ld29yayBvdmVycmlkZXMgaXQgZm9yIGNhbWVyYSBIQUwgY29uc3VtcHRpb24uCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tUmF0aW9JczF4OworICAgICAgICAvLyBUaGUgc3lzdGVtVGltZSB0aW1lc3RhbXAgd2hlbiB0aGUgcmVxdWVzdCBpcyBjcmVhdGVkLgorICAgICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdFRpbWVOczsKKworCisgICAgICAgIC8vIFdoZXRoZXIgdGhpcyBjYXB0dXJlIHJlcXVlc3QncyBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gdXBkYXRlIGhhcworICAgICAgICAvLyBiZWVuIGRvbmUuCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaXN0b3J0aW9uQ29ycmVjdGlvblVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gV2hldGhlciB0aGlzIGNhcHR1cmUgcmVxdWVzdCdzIHJvdGF0aW9uIGFuZCBjcm9wIHVwZGF0ZSBoYXMgYmVlbgorICAgICAgICAvLyBkb25lLgorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm90YXRpb25BbmRDcm9wVXBkYXRlZCA9IGZhbHNlOworICAgICAgICAvLyBXaGV0aGVyIHRoaXMgY2FwdHVyZSByZXF1ZXN0J3Mgem9vbSByYXRpbyB1cGRhdGUgaGFzIGJlZW4gZG9uZS4KKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21SYXRpb1VwZGF0ZWQgPSBmYWxzZTsKICAgICB9OwogICAgIHR5cGVkZWYgTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiBSZXF1ZXN0TGlzdDsKIApAQCAtNTI1LDcgKzU0Miw3IEBACiAgICAgc3RhdHVzX3QgY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmbWV0YWRhdGFMaXN0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKLSAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgYm9vbCByZXBlYXRpbmcsIG5zZWNzX3QgcmVxdWVzdFRpbWVOcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIFJlcXVlc3RMaXN0ICpyZXF1ZXN0TGlzdCk7CiAKQEAgLTY2OCwxNSArNjg1LDE1IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgIGNhbmNlbFN0cmVhbXNDb25maWd1cmF0aW9uTG9ja2VkKCk7CiAKICAgICAvKioKLSAgICAgKiBBZGQgYSBkdW1teSBzdHJlYW0gdG8gdGhlIGN1cnJlbnQgc3RyZWFtIHNldCBhcyBhIHdvcmthcm91bmQgZm9yCisgICAgICogQWRkIGEgZmFrZSBzdHJlYW0gdG8gdGhlIGN1cnJlbnQgc3RyZWFtIHNldCBhcyBhIHdvcmthcm91bmQgZm9yCiAgICAgICogbm90IGFsbG93aW5nIDAgc3RyZWFtcyBpbiB0aGUgY2FtZXJhIEhBTCBzcGVjLgogICAgICAqLwotICAgIHN0YXR1c190ICAgICAgICAgICBhZGREdW1teVN0cmVhbUxvY2tlZCgpOworICAgIHN0YXR1c190ICAgICAgICAgICBhZGRGYWtlU3RyZWFtTG9ja2VkKCk7CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBkdW1teSBzdHJlYW0gaWYgdGhlIGN1cnJlbnQgY29uZmlnIGluY2x1ZGVzIHJlYWwgc3RyZWFtcy4KKyAgICAgKiBSZW1vdmUgYSBmYWtlIHN0cmVhbSBpZiB0aGUgY3VycmVudCBjb25maWcgaW5jbHVkZXMgcmVhbCBzdHJlYW1zLgogICAgICAqLwotICAgIHN0YXR1c190ICAgICAgICAgICB0cnlSZW1vdmVEdW1teVN0cmVhbUxvY2tlZCgpOworICAgIHN0YXR1c190ICAgICAgICAgICB0cnlSZW1vdmVGYWtlU3RyZWFtTG9ja2VkKCk7CiAKICAgICAvKioKICAgICAgKiBTZXQgZGV2aWNlIGludG8gYW4gZXJyb3Igc3RhdGUgZHVlIHRvIHNvbWUgZmF0YWwgZmFpbHVyZSwgYW5kIHNldCBhbgpAQCAtODMyLDYgKzg0OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKyAgICAgICAgdm9pZCByZXNldFBpcGVsaW5lRHJhaW4oKTsKIAogICAgICAgICBzdGF0dXNfdCBzd2l0Y2hUb09mZmxpbmUoCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCkBAIC04NjAsNyArODc4LDcgQEAKIAogICAgICAgICAvLyBIQUwgd29ya2Fyb3VuZDogTWFrZSBzdXJlIGEgdHJpZ2dlciBJRCBhbHdheXMgZXhpc3RzIGlmCiAgICAgICAgIC8vIGEgdHJpZ2dlciBkb2VzCi0gICAgICAgIHN0YXR1c190ICAgICAgICAgICBhZGREdW1teVRyaWdnZXJJZHMoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXF1ZXN0KTsKKyAgICAgICAgc3RhdHVzX3QgICAgICAgICAgIGFkZEZha2VUcmlnZ2VySWRzKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0PiAmcmVxdWVzdCk7CiAKICAgICAgICAgLy8gT3ZlcnJpZGUgcm90YXRlX2FuZF9jcm9wIGNvbnRyb2wgaWYgbmVlZGVkOyByZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgd2FzIGNoYW5nZWQKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG92ZXJyaWRlQXV0b1JvdGF0ZUFuZENyb3AoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXF1ZXN0KTsKQEAgLTk0Nyw2ICs5NjUsNyBAQAogICAgICAgICBDb25kaXRpb24gICAgICAgICAgbVJlcXVlc3RTdWJtaXR0ZWRTaWduYWw7CiAgICAgICAgIFJlcXVlc3RMaXN0ICAgICAgICBtUmVxdWVzdFF1ZXVlOwogICAgICAgICBSZXF1ZXN0TGlzdCAgICAgICAgbVJlcGVhdGluZ1JlcXVlc3RzOworICAgICAgICBib29sICAgICAgICAgICAgICAgbUZpcnN0UmVwZWF0aW5nOwogICAgICAgICAvLyBUaGUgbmV4dCBiYXRjaCBvZiByZXF1ZXN0cyBiZWluZyBwcmVwcGVkIGZvciBzdWJtaXNzaW9uIHRvIHRoZSBIQUwsIG5vIGxvbmdlcgogICAgICAgICAvLyBvbiB0aGUgcmVxdWVzdCBxdWV1ZS4gUmVhZC1vbmx5IGV2ZW4gd2l0aCBtUmVxdWVzdExvY2sgaGVsZCwgb3V0c2lkZQogICAgICAgICAvLyBvZiB0aHJlYWRMb29wCkBAIC0xMDIxLDcgKzEwNDAsOCBAQAogICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKICAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzLAogICAgICAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSwgYm9vbCBpc1pzbENhcHR1cmUsIGJvb2wgcm90YXRlQW5kQ3JvcEF1dG8sCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGNhbWVyYUlkc1dpdGhab29tLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGNhbWVyYUlkc1dpdGhab29tLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgIG5zZWNzX3QgcmVxdWVzdFRpbWVOcyk7CiAKICAgICAvKioKICAgICAgKiBUcmFja2luZyBmb3IgaWRsZSBkZXRlY3Rpb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzNzE2MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUR1bW15U3RyZWFtIgotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotI2luY2x1ZGUgIkNhbWVyYTNEdW1teVN0cmVhbS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBjYW1lcmEzIHsKLQotY29uc3QgU3RyaW5nOCBDYW1lcmEzRHVtbXlTdHJlYW06OkRVTU1ZX0lEOwotCi1DYW1lcmEzRHVtbXlTdHJlYW06OkNhbWVyYTNEdW1teVN0cmVhbShpbnQgaWQpIDoKLSAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCBEVU1NWV9XSURUSCwgRFVNTVlfSEVJR0hULAotICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgRFVNTVlfRk9STUFULCBEVU1NWV9EQVRBU1BBQ0UsIERVTU1ZX1JPVEFUSU9OLAotICAgICAgICAgICAgICAgIERVTU1ZX0lEKSB7Ci0KLX0KLQotQ2FtZXJhM0R1bW15U3RyZWFtOjp+Q2FtZXJhM0R1bW15U3RyZWFtKCkgewotCi19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcHJvZHVjZSBidWZmZXJzISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAotICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKLSAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICAgICAgbnNlY3NfdCwKLSAgICAgICAgICAgIGJvb2wsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIHNwPEZlbmNlPiopIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXZvaWQgQ2FtZXJhM0R1bW15U3RyZWFtOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgewotICAgICh2b2lkKSBhcmdzOwotICAgIFN0cmluZzggbGluZXM7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgU3RyZWFtWyVkXTogRHVtbXlcbiIsIG1JZCk7Ci0gICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwotCi0gICAgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChmZCwgYXJncyk7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgLy8gRG8gbm90aGluZwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpkZXRhY2hCdWZmZXIoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKSB7Ci0gICAgKHZvaWQpIGJ1ZmZlcjsKLSAgICAodm9pZCkgZmVuY2VGZDsKLSAgICAvLyBEbyBub3RoaW5nCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkgewotICAgIC8vIERvIG5vdGhpbmcKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKLSAgICBtU3RhdGUgPSAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSA/IFNUQVRFX0lOX0NPTkZJRwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU1RBVEVfQ09OU1RSVUNURUQ7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDY0X3QgKnVzYWdlKSBjb25zdCB7Ci0gICAgKnVzYWdlID0gRFVNTVlfVVNBR0U7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIENhbWVyYTNEdW1teVN0cmVhbTo6aXNWaWRlb1N0cmVhbSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ2FtZXJhM0R1bW15U3RyZWFtOjppc0NvbnN1bWVyQ29uZmlndXJhdGlvbkRlZmVycmVkKHNpemVfdCAvKnN1cmZhY2VfaWQqLykgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpkcm9wQnVmZmVycyhib29sIC8qZHJvcHBpbmcqLykgewotICAgIHJldHVybiBPSzsKLX0KLQotY29uc3QgU3RyaW5nOCYgQ2FtZXJhM0R1bW15U3RyZWFtOjpnZXRQaHlzaWNhbENhbWVyYUlkKCkgY29uc3QgewotICAgIHJldHVybiBEVU1NWV9JRDsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpzZXRDb25zdW1lcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiAvKmNvbnN1bWVycyovKSB7Ci0gICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBkb2Vzbid0IHN1cHBvcnQgc2V0IGNvbnN1bWVyIHN1cmZhY2UhIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6dXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmLypvdXRwdXRTdXJmYWNlcyovLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJi8qb3V0cHV0SW5mbyovLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmLypyZW1vdmVkU3VyZmFjZUlkcyovLAotICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKiAvKm91dHB1dE1hcCovKSB7Ci0gICAgQUxPR0UoIiVzOiB0aGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19OyAvLyBuYW1lc3BhY2UgY2FtZXJhMwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjdlYTUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX0RVTU1ZX1NUUkVBTV9ICi0jZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX0RVTU1ZX1NUUkVBTV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW0uaCIKLSNpbmNsdWRlICJDYW1lcmEzSU9TdHJlYW1CYXNlLmgiCi0jaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMyB7Ci0KLS8qKgotICogQSBkdW1teSBvdXRwdXQgc3RyZWFtIGNsYXNzLCB0byBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgd2hlbiBubyB2YWxpZAotICogc3RyZWFtcyBhcmUgY29uZmlndXJlZCBieSB0aGUgY2xpZW50LgotICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBjYW1lcmEgSEFMIHYzLjIgb3Igb2xkZXIgZGlzYWxsb3cgY29uZmlndXJpbmcKLSAqIDAgb3V0cHV0IHN0cmVhbXMsIHdoaWxlIHRoZSBwdWJsaWMgY2FtZXJhMiBBUEkgYWxsb3dzIGZvciBpdC4KLSAqLwotY2xhc3MgQ2FtZXJhM0R1bW15U3RyZWFtIDoKLSAgICAgICAgcHVibGljIENhbWVyYTNJT1N0cmVhbUJhc2UsCi0gICAgICAgIHB1YmxpYyBDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlIHsKLQotICBwdWJsaWM6Ci0gICAgLyoqCi0gICAgICogU2V0IHVwIGEgZHVtbXkgc3RyZWFtOyBkb2Vzbid0IGFjdHVhbGx5IGNvbm5lY3QgdG8gYW55dGhpbmcsIGFuZCB1c2VzCi0gICAgICogYSBkZWZhdWx0IGR1bW15IGZvcm1hdCBhbmQgc2l6ZS4KLSAgICAgKi8KLSAgICBleHBsaWNpdCBDYW1lcmEzRHVtbXlTdHJlYW0oaW50IGlkKTsKLQotICAgIHZpcnR1YWwgfkNhbWVyYTNEdW1teVN0cmVhbSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKLSAgICAgKi8KLQotICAgIHZpcnR1YWwgdm9pZCAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgICAgICAgICBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRldGFjaEJ1ZmZlcihzcDxHcmFwaGljQnVmZmVyPiogYnVmZmVyLCBpbnQqIGZlbmNlRmQpOwotCi0gICAgLyoqCi0gICAgICogRHJvcCBidWZmZXJzIGZvciBzdHJlYW0gb2Ygc3RyZWFtSWQgaWYgZHJvcHBpbmcgaXMgdHJ1ZS4gSWYgZHJvcHBpbmcgaXMgZmFsc2UsIGRvIG5vdAotICAgICAqIGRyb3AgYnVmZmVycyBmb3Igc3RyZWFtIG9mIHN0cmVhbUlkLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJvcEJ1ZmZlcnMoYm9vbCAvKmRyb3BwaW5nKi8pIG92ZXJyaWRlOwotCi0gICAgLyoqCi0gICAgICogUXVlcnkgdGhlIHBoeXNpY2FsIGNhbWVyYSBpZCBmb3IgdGhlIG91dHB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgdmlydHVhbCBjb25zdCBTdHJpbmc4JiBnZXRQaHlzaWNhbENhbWVyYUlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gaWYgdGhpcyBvdXRwdXQgc3RyZWFtIGlzIGZvciB2aWRlbyBlbmNvZGluZy4KLSAgICAgKi8KLSAgICBib29sIGlzVmlkZW9TdHJlYW0oKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBpZiB0aGUgY29uc3VtZXIgY29uZmlndXJhdGlvbiBvZiB0aGlzIHN0cmVhbSBpcyBkZWZlcnJlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgaXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZChzaXplX3Qgc3VyZmFjZV9pZCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbnN1bWVyIHN1cmZhY2VzIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzKTsKLQotICAgIC8qKgotICAgICAqIFF1ZXJ5IHRoZSBvdXRwdXQgc3VyZmFjZSBpZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICYvKnN1cmZhY2UqLykgeyByZXR1cm4gMDsgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAotICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICpvdXRwdXRNYXAvKm91dCovKTsKLQotICBwcm90ZWN0ZWQ6Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlIHRoYXQgd2UgcmVsZWFzZSB0aGUgbG9jayBicmllZmx5IGluIHRoaXMgZnVuY3Rpb24KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCi0gICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICAgICAgYm9vbCBvdXRwdXQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOwotCi0gIHByaXZhdGU6Ci0KLSAgICAvLyBEZWZhdWx0IGR1bW15IHBhcmFtZXRlcnM7IDMyMHgyNDAgaXMgYSByZXF1aXJlZCBzaXplIGZvciBhbGwgZGV2aWNlcywKLSAgICAvLyBvdGhlcndpc2UgYWN0IGxpa2UgYSBTdXJmYWNlVmlldyB3b3VsZC4KLSAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX1dJRFRIID0gMzIwOwotICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfSEVJR0hUID0gMjQwOwotICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOwotICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBEVU1NWV9EQVRBU1BBQ0UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047Ci0gICAgc3RhdGljIGNvbnN0IGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QgRFVNTVlfUk9UQVRJT04gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOwotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBEVU1NWV9VU0FHRSA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVI7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzggRFVNTVlfSUQ7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAotICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3Q7Ci0KLX07IC8vIGNsYXNzIENhbWVyYTNEdW1teVN0cmVhbQotCi19IC8vIG5hbWVzcGFjZSBjYW1lcmEzCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDUxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmNwcApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUZha2VTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiQ2FtZXJhM0Zha2VTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NvbnN0IFN0cmluZzggQ2FtZXJhM0Zha2VTdHJlYW06OkZBS0VfSUQ7CisKK0NhbWVyYTNGYWtlU3RyZWFtOjpDYW1lcmEzRmFrZVN0cmVhbShpbnQgaWQpIDoKKyAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCBGQUtFX1dJRFRILCBGQUtFX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIEZBS0VfRk9STUFULCBGQUtFX0RBVEFTUEFDRSwgRkFLRV9ST1RBVElPTiwKKyAgICAgICAgICAgICAgICBGQUtFX0lEKSB7CisKK30KKworQ2FtZXJhM0Zha2VTdHJlYW06On5DYW1lcmEzRmFrZVN0cmVhbSgpIHsKKworfQorCitzdGF0dXNfdCBDYW1lcmEzRmFrZVN0cmVhbTo6Z2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZha2Ugc3RyZWFtIGNhbm5vdCBwcm9kdWNlIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKKyAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCisgICAgICAgIG5zZWNzX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRmFrZSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpyZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAorICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCisgICAgICAgICAgICBuc2Vjc190LAorICAgICAgICAgICAgYm9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8RmVuY2U+KikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZha2Ugc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit2b2lkIENhbWVyYTNGYWtlU3RyZWFtOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgICh2b2lkKSBhcmdzOworICAgIFN0cmluZzggbGluZXM7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgU3RyZWFtWyVkXTogRmFrZVxuIiwgbUlkKTsKKyAgICB3cml0ZShmZCwgbGluZXMuc3RyaW5nKCksIGxpbmVzLnNpemUoKSk7CisKKyAgICBDYW1lcmEzSU9TdHJlYW1CYXNlOjpkdW1wKGZkLCBhcmdzKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnNldFRyYW5zZm9ybShpbnQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIC8vIERvIG5vdGhpbmcKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpkZXRhY2hCdWZmZXIoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKSB7CisgICAgKHZvaWQpIGJ1ZmZlcjsKKyAgICAodm9pZCkgZmVuY2VGZDsKKyAgICAvLyBEbyBub3RoaW5nCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRmFrZVN0cmVhbTo6Y29uZmlndXJlUXVldWVMb2NrZWQoKSB7CisgICAgLy8gRG8gbm90aGluZworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OmRpc2Nvbm5lY3RMb2NrZWQoKSB7CisgICAgbVN0YXRlID0gKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRykgPyBTVEFURV9JTl9DT05GSUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNUQVRFX0NPTlNUUlVDVEVEOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDY0X3QgKnVzYWdlKSBjb25zdCB7CisgICAgKnVzYWdlID0gRkFLRV9VU0FHRTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ2FtZXJhM0Zha2VTdHJlYW06OmlzVmlkZW9TdHJlYW0oKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENhbWVyYTNGYWtlU3RyZWFtOjppc0NvbnN1bWVyQ29uZmlndXJhdGlvbkRlZmVycmVkKHNpemVfdCAvKnN1cmZhY2VfaWQqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OmRyb3BCdWZmZXJzKGJvb2wgLypkcm9wcGluZyovKSB7CisgICAgcmV0dXJuIE9LOworfQorCitjb25zdCBTdHJpbmc4JiBDYW1lcmEzRmFrZVN0cmVhbTo6Z2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRkFLRV9JRDsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIC8qY29uc3VtZXJzKi8pIHsKKyAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRmFrZSBzdHJlYW0gZG9lc24ndCBzdXBwb3J0IHNldCBjb25zdW1lciBzdXJmYWNlISIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBDYW1lcmEzRmFrZVN0cmVhbTo6dXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmLypvdXRwdXRTdXJmYWNlcyovLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJi8qb3V0cHV0SW5mbyovLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmLypyZW1vdmVkU3VyZmFjZUlkcyovLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKiAvKm91dHB1dE1hcCovKSB7CisgICAgQUxPR0UoIiVzOiB0aGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjM3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfRkFLRV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19GQUtFX1NUUkVBTV9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKworI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW0uaCIKKyNpbmNsdWRlICJDYW1lcmEzSU9TdHJlYW1CYXNlLmgiCisjaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKKy8qKgorICogQSBmYWtlIG91dHB1dCBzdHJlYW0gY2xhc3MsIHRvIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciB3aGVuIG5vIHZhbGlkCisgKiBzdHJlYW1zIGFyZSBjb25maWd1cmVkIGJ5IHRoZSBjbGllbnQuCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNhbWVyYSBIQUwgdjMuMiBvciBvbGRlciBkaXNhbGxvdyBjb25maWd1cmluZworICogMCBvdXRwdXQgc3RyZWFtcywgd2hpbGUgdGhlIHB1YmxpYyBjYW1lcmEyIEFQSSBhbGxvd3MgZm9yIGl0LgorICovCitjbGFzcyBDYW1lcmEzRmFrZVN0cmVhbSA6CisgICAgICAgIHB1YmxpYyBDYW1lcmEzSU9TdHJlYW1CYXNlLAorICAgICAgICBwdWJsaWMgQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZSB7CisKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFNldCB1cCBhIGZha2Ugc3RyZWFtOyBkb2Vzbid0IGFjdHVhbGx5IGNvbm5lY3QgdG8gYW55dGhpbmcsIGFuZCB1c2VzCisgICAgICogYSBkZWZhdWx0IGZha2UgZm9ybWF0IGFuZCBzaXplLgorICAgICAqLworICAgIGV4cGxpY2l0IENhbWVyYTNGYWtlU3RyZWFtKGludCBpZCk7CisKKyAgICB2aXJ0dWFsIH5DYW1lcmEzRmFrZVN0cmVhbSgpOworCisgICAgLyoqCisgICAgICogQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKKyAgICAgKi8KKworICAgIHZpcnR1YWwgdm9pZCAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OworCisgICAgc3RhdHVzX3QgICAgICAgICBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRldGFjaEJ1ZmZlcihzcDxHcmFwaGljQnVmZmVyPiogYnVmZmVyLCBpbnQqIGZlbmNlRmQpOworCisgICAgLyoqCisgICAgICogRHJvcCBidWZmZXJzIGZvciBzdHJlYW0gb2Ygc3RyZWFtSWQgaWYgZHJvcHBpbmcgaXMgdHJ1ZS4gSWYgZHJvcHBpbmcgaXMgZmFsc2UsIGRvIG5vdAorICAgICAqIGRyb3AgYnVmZmVycyBmb3Igc3RyZWFtIG9mIHN0cmVhbUlkLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJvcEJ1ZmZlcnMoYm9vbCAvKmRyb3BwaW5nKi8pIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHBoeXNpY2FsIGNhbWVyYSBpZCBmb3IgdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4JiBnZXRQaHlzaWNhbENhbWVyYUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaWYgdGhpcyBvdXRwdXQgc3RyZWFtIGlzIGZvciB2aWRlbyBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBib29sIGlzVmlkZW9TdHJlYW0oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBpZiB0aGUgY29uc3VtZXIgY29uZmlndXJhdGlvbiBvZiB0aGlzIHN0cmVhbSBpcyBkZWZlcnJlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgaXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZChzaXplX3Qgc3VyZmFjZV9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnN1bWVyIHN1cmZhY2VzIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzKTsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBvdXRwdXQgc3VyZmFjZSBpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICYvKnN1cmZhY2UqLykgeyByZXR1cm4gMDsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICpvdXRwdXRNYXAvKm91dCovKTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgd2UgcmVsZWFzZSB0aGUgbG9jayBicmllZmx5IGluIHRoaXMgZnVuY3Rpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOworCisgIHByaXZhdGU6CisKKyAgICAvLyBEZWZhdWx0IGZha2UgcGFyYW1ldGVyczsgMzIweDI0MCBpcyBhIHJlcXVpcmVkIHNpemUgZm9yIGFsbCBkZXZpY2VzLAorICAgIC8vIG90aGVyd2lzZSBhY3QgbGlrZSBhIFN1cmZhY2VWaWV3IHdvdWxkLgorICAgIHN0YXRpYyBjb25zdCBpbnQgRkFLRV9XSURUSCA9IDMyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IEZBS0VfSEVJR0hUID0gMjQwOworICAgIHN0YXRpYyBjb25zdCBpbnQgRkFLRV9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIEZBS0VfREFUQVNQQUNFID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgIHN0YXRpYyBjb25zdCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IEZBS0VfUk9UQVRJT04gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBGQUtFX1VTQUdFID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUjsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBGQUtFX0lEOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0OworCit9OyAvLyBjbGFzcyBDYW1lcmEzRmFrZVN0cmVhbQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDQ0ODM3OWMuLmNhNjIyMzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC00OCw2ICs0OCw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKIAorICAgIGludCAgICAgICAgICAgICAgZ2V0TWF4VG90YWxCdWZmZXJzKCkgY29uc3QgeyByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7IH0KICAgcHJvdGVjdGVkOgogICAgIHNpemVfdCAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50OwogICAgIC8vIHN1bSBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgdGhhdCBhcmUgY3VycmVudGx5IGFjcXVpcmVkIGJ5IEhBTApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IGNiNTlhNzYuLmViZDMzZTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTI3LDEzICsyNywxMyBAQAogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKLWNvbnN0IFN0cmluZzggQ2FtZXJhM0lucHV0U3RyZWFtOjpEVU1NWV9JRDsKK2NvbnN0IFN0cmluZzggQ2FtZXJhM0lucHV0U3RyZWFtOjpGQUtFX0lEOwogCiBDYW1lcmEzSW5wdXRTdHJlYW06OkNhbWVyYTNJbnB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fSU5QVVQsIHdpZHRoLCBoZWlnaHQsIC8qbWF4U2l6ZSovMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVU1NWV9JRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBS0VfSUQpIHsKIAogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CiAgICAgICAgIEFMT0dFKCIlczogQmFkIGZvcm1hdCwgQkxPQiBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IDk3YTYyN2EuLjIyNjk3YjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNTMsNyArNTMsNyBAQAogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKICAgICBWZWN0b3I8QnVmZmVySXRlbT4gbUJ1ZmZlcnNJbkZsaWdodDsKIAotICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IERVTU1ZX0lEOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IEZBS0VfSUQ7CiAKICAgICAvKioKICAgICAgKiBDYW1lcmEzSU9TdHJlYW1CYXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAKaW5kZXggOTVmOTYzMy4uYTdlNjRjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcApAQCAtMTc2LDcgKzE3Niw3IEBACiAKICAgICBGbHVzaEluZmxpZ2h0UmVxU3RhdGVzIHN0YXRlcyB7CiAgICAgICAgIG1JZCwgbU9mZmxpbmVSZXFzTG9jaywgbU9mZmxpbmVSZXFzLCBtVXNlSGFsQnVmTWFuYWdlciwKLSAgICAgICAgbGlzdGVuZXIsICp0aGlzLCBtQnVmZmVyUmVjb3JkcywgKnRoaXN9OworICAgICAgICBsaXN0ZW5lciwgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAqdGhpcywgbVNlc3Npb25TdGF0c0J1aWxkZXJ9OwogCiAgICAgY2FtZXJhMzo6Zmx1c2hJbmZsaWdodFJlcXVlc3RzKHN0YXRlcyk7CiAKQEAgLTI2MCw3ICsyNjAsOCBAQAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAogICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywgbUJ1ZmZlclJlY29yZHMKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICBtQnVmZmVyUmVjb3JkcwogICAgIH07CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKQEAgLTI5OSw3ICszMDAsOCBAQAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAogICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywgbUJ1ZmZlclJlY29yZHMKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICBtQnVmZmVyUmVjb3JkcwogICAgIH07CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKQEAgLTMzMyw3ICszMzUsOCBAQAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAogICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywgbUJ1ZmZlclJlY29yZHMKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICBtQnVmZmVyUmVjb3JkcwogICAgIH07CiAgICAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiBtc2dzKSB7CiAgICAgICAgIGNhbWVyYTM6Om5vdGlmeShzdGF0ZXMsIG1zZyk7CkBAIC0zNTMsNyArMzU2LDcgQEAKICAgICB9CiAKICAgICBSZXF1ZXN0QnVmZmVyU3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsCisgICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLAogICAgICAgICAqdGhpcywgbUJ1ZmZlclJlY29yZHMsICp0aGlzfTsKICAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIF9oaWRsX2NiKTsKICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKQEAgLTM3MCw3ICszNzMsNyBAQAogICAgIH0KIAogICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbUJ1ZmZlclJlY29yZHN9OworICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIG1CdWZmZXJSZWNvcmRzfTsKICAgICBjYW1lcmEzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmZmVycyk7CiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaAppbmRleCBjNGM3YTg1Li41NTgxOTY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlICJkZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuaCIKICNpbmNsdWRlICJkZXZpY2UzL1pvb21SYXRpb01hcHBlci5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKLSNpbmNsdWRlICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmgiCiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yMDksNiArMjA4LDcgQEAKICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBtSW5wdXRTdHJlYW07CiAgICAgY2FtZXJhMzo6U3RyZWFtU2V0IG1PdXRwdXRTdHJlYW1zOwogICAgIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMgbUJ1ZmZlclJlY29yZHM7CisgICAgU2Vzc2lvblN0YXRzQnVpbGRlciBtU2Vzc2lvblN0YXRzQnVpbGRlcjsKIAogICAgIHN0ZDo6bXV0ZXggbU9mZmxpbmVSZXFzTG9jazsKICAgICBjYW1lcmEzOjpJbkZsaWdodFJlcXVlc3RNYXAgbU9mZmxpbmVSZXFzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggMDFjYTAwNi4uN2I4MTJmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgbVN0YXRlID0gU1RBVEVfRVJST1I7CiAgICAgfQogCi0gICAgLy8gU2FuaXR5IGNoZWNrIGZvciB0aGUgY29uc3VtZXIgdXNhZ2UgZmxhZy4KKyAgICAvLyBWYWxpZGF0aW9uIGNoZWNrIGZvciB0aGUgY29uc3VtZXIgdXNhZ2UgZmxhZy4KICAgICBpZiAoKGNvbnN1bWVyVXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFKSA9PSAwICYmCiAgICAgICAgICAgICAoY29uc3VtZXJVc2FnZSAmIEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSKSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogRGVmZXJyZWQgY29uc3VtZXIgdXNhZ2UgZmxhZyBpcyBpbGxlZ2FsICUiIFBSSXU2NCAiISIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAKaW5kZXggZWVhNWVmMS4uZjg4YjA2MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmNwcApAQCAtMTgyLDcgKzE4MiwzMyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaW5zZXJ0UmVzdWx0TG9ja2VkKHN0YXRlcywgJmNhcHR1cmVSZXN1bHQsIGZyYW1lTnVtYmVyKTsKKyAgICAvLyBVcGRhdGUgcGFydGlhbCByZXN1bHQgYnkgcmVtb3Zpbmcga2V5cyByZW1hcHBlZCBieSBEaXN0b3J0aW9uQ29ycmVjdGlvbiwgWm9vbVJhdGlvLAorICAgIC8vIGFuZCBSb3RhdGlvbkFuZENyb3AgbWFwcGVycy4KKyAgICBzdGQ6OnNldDx1aW50MzJfdD4ga2V5c1RvUmVtb3ZlOworCisgICAgYXV0byBpdGVyID0gc3RhdGVzLmRpc3RvcnRpb25NYXBwZXJzLmZpbmQoc3RhdGVzLmNhbWVyYUlkLmNfc3RyKCkpOworICAgIGlmIChpdGVyICE9IHN0YXRlcy5kaXN0b3J0aW9uTWFwcGVycy5lbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiByZW1hcHBlZEtleXMgPSBpdGVyLT5zZWNvbmQuZ2V0UmVtYXBwZWRLZXlzKCk7CisgICAgICAgIGtleXNUb1JlbW92ZS5pbnNlcnQocmVtYXBwZWRLZXlzLmJlZ2luKCksIHJlbWFwcGVkS2V5cy5lbmQoKSk7CisgICAgfQorCisgICAgY29uc3QgYXV0byYgcmVtYXBwZWRLZXlzID0gc3RhdGVzLnpvb21SYXRpb01hcHBlcnNbc3RhdGVzLmNhbWVyYUlkLmNfc3RyKCldLmdldFJlbWFwcGVkS2V5cygpOworICAgIGtleXNUb1JlbW92ZS5pbnNlcnQocmVtYXBwZWRLZXlzLmJlZ2luKCksIHJlbWFwcGVkS2V5cy5lbmQoKSk7CisKKyAgICBhdXRvIG1hcHBlciA9IHN0YXRlcy5yb3RhdGVBbmRDcm9wTWFwcGVycy5maW5kKHN0YXRlcy5jYW1lcmFJZC5jX3N0cigpKTsKKyAgICBpZiAobWFwcGVyICE9IHN0YXRlcy5yb3RhdGVBbmRDcm9wTWFwcGVycy5lbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiByZW1hcHBlZEtleXMgPSBpdGVyLT5zZWNvbmQuZ2V0UmVtYXBwZWRLZXlzKCk7CisgICAgICAgIGtleXNUb1JlbW92ZS5pbnNlcnQocmVtYXBwZWRLZXlzLmJlZ2luKCksIHJlbWFwcGVkS2V5cy5lbmQoKSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBrZXkgOiBrZXlzVG9SZW1vdmUpIHsKKyAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEuZXJhc2Uoa2V5KTsKKyAgICB9CisKKyAgICAvLyBTZW5kIHBhcnRpYWwgcmVzdWx0CisgICAgaWYgKGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLmVudHJ5Q291bnQoKSA+IDApIHsKKyAgICAgICAgaW5zZXJ0UmVzdWx0TG9ja2VkKHN0YXRlcywgJmNhcHR1cmVSZXN1bHQsIGZyYW1lTnVtYmVyKTsKKyAgICB9CiB9CiAKIHZvaWQgc2VuZENhcHR1cmVSZXN1bHQoCkBAIC0zOTcsNiArNDIzLDcgQEAKICAgICBJbkZsaWdodFJlcXVlc3RNYXAmIGluZmxpZ2h0TWFwID0gc3RhdGVzLmluZmxpZ2h0TWFwOwogICAgIGNvbnN0IEluRmxpZ2h0UmVxdWVzdCAmcmVxdWVzdCA9IGluZmxpZ2h0TWFwLnZhbHVlQXQoaWR4KTsKICAgICBjb25zdCB1aW50MzJfdCBmcmFtZU51bWJlciA9IGluZmxpZ2h0TWFwLmtleUF0KGlkeCk7CisgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlciA9IHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyOwogCiAgICAgbnNlY3NfdCBzZW5zb3JUaW1lc3RhbXAgPSByZXF1ZXN0LnNlbnNvclRpbWVzdGFtcDsKICAgICBuc2Vjc190IHNodXR0ZXJUaW1lc3RhbXAgPSByZXF1ZXN0LnNodXR0ZXJUaW1lc3RhbXA7CkBAIC00MTYsNyArNDQzLDcgQEAKIAogICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJmcmFtZSBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOwogCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayAtIGlmIHNlbnNvciB0aW1lc3RhbXAgbWF0Y2hlcyBzaHV0dGVyIHRpbWVzdGFtcCBpbiB0aGUKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjaGVjayAtIGlmIHNlbnNvciB0aW1lc3RhbXAgbWF0Y2hlcyBzaHV0dGVyIHRpbWVzdGFtcCBpbiB0aGUKICAgICAgICAgLy8gY2FzZSBvZiByZXF1ZXN0IGhhdmluZyBjYWxsYmFjay4KICAgICAgICAgaWYgKHJlcXVlc3QuaGFzQ2FsbGJhY2sgJiYgcmVxdWVzdC5yZXF1ZXN0U3RhdHVzID09IE9LICYmCiAgICAgICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wICE9IHNodXR0ZXJUaW1lc3RhbXApIHsKQEAgLTQzMyw3ICs0NjAsOSBAQAogICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICAgICAgc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIHN0YXRlcy5saXN0ZW5lciwKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLCAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCisgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwKKyAgICAgICAgICAgIC8qcmVxdWVzdGVkKi90cnVlLCByZXF1ZXN0LnJlcXVlc3RUaW1lTnMsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyLAorICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAogICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICByZXF1ZXN0LmVycm9yQnVmU3RyYXRlZ3kpOwogCkBAIC00NDYsNiArNDc1LDggQEAKICAgICAgICAgICAgIHN0YXRlcy5sYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAgICAgICAgIH0KIAorICAgICAgICBzZXNzaW9uU3RhdHNCdWlsZGVyLmluY1Jlc3VsdENvdW50ZXIocmVxdWVzdC5za2lwUmVzdWx0TWV0YWRhdGEpOworCiAgICAgICAgIHJlbW92ZUluRmxpZ2h0TWFwRW50cnlMb2NrZWQoc3RhdGVzLCBpZHgpOwogICAgICAgICBBTE9HVlYoIiVzOiByZW1vdmVkIGZyYW1lICVkIGZyb20gSW5GbGlnaHRNYXAiLCBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyKTsKICAgICB9CkBAIC02MDIsNyArNjMzLDcgQEAKICAgICAgICAgaWYgKHNodXR0ZXJUaW1lc3RhbXAgIT0gMCkgewogICAgICAgICAgICAgcmV0dXJuQW5kUmVtb3ZlUGVuZGluZ091dHB1dEJ1ZmZlcnMoCiAgICAgICAgICAgICAgICAgc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIHN0YXRlcy5saXN0ZW5lciwKLSAgICAgICAgICAgICAgICByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlcik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJiAhaXNQYXJ0aWFsUmVzdWx0KSB7CkBAIC03OTksNyArODMwLDggQEAKICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAogICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIsCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCBzaXplX3QgbnVtQnVmZmVycywKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgcmVxdWVzdGVkLCBuc2Vjc190IHJlcXVlc3RUaW1lTnMsCisgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsCiAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmluUmVzdWx0RXh0cmFzLAogICAgICAgICBFUlJPUl9CVUZfU1RSQVRFR1kgZXJyb3JCdWZTdHJhdGVneSkgewpAQCAtODI3LDYgKzg1OSwxMCBAQAogICAgICAgICAgICAgICAgIC8vIGhhcyBub3QgZ290IGEgb3V0cHV0IGJ1ZmZlciBoYW5kbGUgZmlsbGVkIHlldC4gVGhpcyBpcyB0aG91Z2ggaWxsZWdhbCBpZiBIQUwKICAgICAgICAgICAgICAgICAvLyBidWZmZXIgbWFuYWdlbWVudCBBUEkgaXMgbm90IGJlaW5nIHVzZWQuCiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgbnVsbCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RhdHNCdWlsZGVyLmluY0NvdW50ZXIoc3RyZWFtSWQsIC8qZHJvcHBlZCovdHJ1ZSwgMCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTg1MCwxMCArODg2LDIyIEBACiAgICAgICAgIH0KICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMKICAgICAgICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgorICAgICAgICBib29sIGRyb3BwZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgQUxPR1YoIkNhbid0IHJldHVybiBidWZmZXIgdG8gaXRzIHN0cmVhbTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgc2Vzc2lvblN0YXRzQnVpbGRlci5zdG9wQ291bnRlcihzdHJlYW1JZCk7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciB0byBpdHMgc3RyZWFtOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBkcm9wcGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJzW2ldLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgdGltZXN0YW1wID09IDApIHsKKyAgICAgICAgICAgICAgICBkcm9wcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVxdWVzdGVkKSB7CisgICAgICAgICAgICBuc2Vjc190IGJ1ZmZlclRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZUxhdGVuY3lNcyA9IG5zMm1zKGJ1ZmZlclRpbWVOcyAtIHJlcXVlc3RUaW1lTnMpOworICAgICAgICAgICAgc2Vzc2lvblN0YXRzQnVpbGRlci5pbmNDb3VudGVyKHN0cmVhbUlkLCBkcm9wcGVkLCBjYXB0dXJlTGF0ZW5jeU1zKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIExvbmcgcHJvY2Vzc2luZyBjb25zdW1lcnMgY2FuIGNhdXNlIHJldHVybkJ1ZmZlciB0aW1lb3V0IGZvciBzaGFyZWQgc3RyZWFtCkBAIC04NjMsNyArOTExLDggQEAKICAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgYnVmZmVyCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzYiA9IG91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICBzdHJlYW0tPnJldHVybkJ1ZmZlcihzYiwgLyp0aW1lc3RhbXAqLzAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCisgICAgICAgICAgICBzdHJlYW0tPnJldHVybkJ1ZmZlcihzYiwgLyp0aW1lc3RhbXAqLzAsCisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcEluY3JlYXNpbmcsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCiAgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKIAogICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKQEAgLTg3OCwxMiArOTI3LDE0IEBACiB9CiAKIHZvaWQgcmV0dXJuQW5kUmVtb3ZlUGVuZGluZ091dHB1dEJ1ZmZlcnMoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAotICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIsIEluRmxpZ2h0UmVxdWVzdCYgcmVxdWVzdCkgeworICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIsIEluRmxpZ2h0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlcikgewogICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9ICEocmVxdWVzdC56c2xDYXB0dXJlIHx8IHJlcXVlc3QuaGFzSW5wdXRCdWZmZXIpOwogICAgIHJldHVybk91dHB1dEJ1ZmZlcnModXNlSGFsQnVmTWFuYWdlciwgbGlzdGVuZXIsCiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwKLSAgICAgICAgICAgIHJlcXVlc3Quc2h1dHRlclRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgIHJlcXVlc3Quc2h1dHRlclRpbWVzdGFtcCwgLypyZXF1ZXN0ZWQqL3RydWUsCisgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3RUaW1lTnMsIHNlc3Npb25TdGF0c0J1aWxkZXIsIHRpbWVzdGFtcEluY3JlYXNpbmcsCiAgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JCdWZTdHJhdGVneSk7CiAKQEAgLTk2Niw3ICsxMDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgci5yb3RhdGVBbmRDcm9wQXV0bywgci5jYW1lcmFJZHNXaXRoWm9vbSwgci5waHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm5BbmRSZW1vdmVQZW5kaW5nT3V0cHV0QnVmZmVycygKLSAgICAgICAgICAgICAgICAgICAgc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIHN0YXRlcy5saXN0ZW5lciwgcik7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCBzdGF0ZXMubGlzdGVuZXIsIHIsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKIAogICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChzdGF0ZXMsIGlkeCk7CiAgICAgICAgIH0KQEAgLTEyMTgsMTMgKzEyNjksMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIGJ1ZlJldC5zdHJlYW1JZCA9IHN0cmVhbUlkOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7CiAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgYnVmUmV0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CiAgICAgICAgIHNpemVfdCBoYW5kT3V0QnVmZmVyQ291bnQgPSBvdXRwdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCk7CiAgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQgPSBidWZSZXEubnVtQnVmZmVyc1JlcXVlc3RlZDsKICAgICAgICAgc2l6ZV90IHRvdGFsSGFuZG91dCA9IGhhbmRPdXRCdWZmZXJDb3VudCArIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CkBAIC0xMjU1LDYgKzEzMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyLnN0b3BDb3VudGVyKHN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTMyMCw3ICsxMzcyLDggQEAKICAgICAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCAvKmxpc3RlbmVyKi9udWxscHRyLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUJ1ZmZlcnMuZGF0YSgpLCBudW1BbGxvY2F0ZWRCdWZmZXJzLCAwLCAvKnJlcXVlc3RlZCovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIC8qcmVxdWVzdFRpbWVOcyovMCwgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzc3LDIyICsxNDMwLDIzIEBACiAgICAgICAgIH0KICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhzdGF0ZXMudXNlSGFsQnVmTWFuYWdlciwgLypsaXN0ZW5lciovbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCk7CisgICAgICAgICAgICAgICAgJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDAsIC8qcmVxdWVzdGVkKi9mYWxzZSwKKyAgICAgICAgICAgICAgICAvKnJlcXVlc3RUaW1lTnMqLzAsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKICAgICB9CiB9CiAKIHZvaWQgZmx1c2hJbmZsaWdodFJlcXVlc3RzKEZsdXNoSW5mbGlnaHRSZXFTdGF0ZXMmIHN0YXRlcykgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgeyAvLyBGaXJzdCByZXR1cm4gYnVmZmVycyBjYWNoZWQgaW4gbUluRmxpZ2h0TWFwCisgICAgeyAvLyBGaXJzdCByZXR1cm4gYnVmZmVycyBjYWNoZWQgaW4gaW5GbGlnaHRNYXAKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwoc3RhdGVzLmluZmxpZ2h0TG9jayk7CiAgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IHN0YXRlcy5pbmZsaWdodE1hcC5zaXplKCk7IGlkeCsrKSB7CiAgICAgICAgICAgICBjb25zdCBJbkZsaWdodFJlcXVlc3QgJnJlcXVlc3QgPSBzdGF0ZXMuaW5mbGlnaHRNYXAudmFsdWVBdChpZHgpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgICAgICAgICBzdGF0ZXMudXNlSGFsQnVmTWFuYWdlciwgc3RhdGVzLmxpc3RlbmVyLAogICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwKLSAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMsIHJlcXVlc3QuZXJyb3JCdWZTdHJhdGVneSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDAsIC8qcmVxdWVzdGVkKi90cnVlLAorICAgICAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdFRpbWVOcywgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIsIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5KTsKICAgICAgICAgICAgIEFMT0dXKCIlczogRnJhbWUgJWQgfCAgVGltZXN0YW1wOiAlIiBQUklkNjQgIiwgbWV0YWRhdGEiCiAgICAgICAgICAgICAgICAgICAgICIgYXJyaXZlZDogJXMsIGJ1ZmZlcnMgbGVmdDogJWQuXG4iLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5pbmZsaWdodE1hcC5rZXlBdChpZHgpLCByZXF1ZXN0LnNodXR0ZXJUaW1lc3RhbXAsCkBAIC0xNDY0LDcgKzE1MTgsOCBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFsU3RyZWFtLT5zdHJlYW1fdHlwZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX09VVFBVVDoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKHN0cmVhbUJ1ZmZlciwgLyp0aW1lc3RhbXAqLyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCByZXR1cm4gb3V0cHV0IGJ1ZmZlciBmb3IgZnJhbWUgJWQgdG8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdHJlYW0gJWQ6ICVzICglZCkiLCAgX19GVU5DVElPTl9fLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmgKaW5kZXggOTk0NjMxMi4uNDVjOGE0MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmgiCiAjaW5jbHVkZSAidXRpbHMvVGFnTW9uaXRvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01MSw3ICs1Miw4IEBACiAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCiAgICAgICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIsIC8vIE9ubHkgbmVlZGVkIHdoZW4gb3V0cHV0U3VyZmFjZXMgaXMgbm90IGVtcHR5CiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywKLSAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCByZXF1ZXN0ZWQsIG5zZWNzX3QgcmVxdWVzdFRpbWVOcywKKyAgICAgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCiAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgb25seSBtZWFudCBmb3Igc3VyZmFjZSBzaGFyaW5nIHVzZSBjYXNlCiAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSwKICAgICAgICAgICAgIC8vIFVzZWQgdG8gc2VuZCBidWZmZXIgZXJyb3IgY2FsbGJhY2sgd2hlbiBmYWlsaW5nIHRvIHJldHVybiBidWZmZXIKQEAgLTY0LDcgKzY2LDcgQEAKICAgICB2b2lkIHJldHVybkFuZFJlbW92ZVBlbmRpbmdPdXRwdXRCdWZmZXJzKAogICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAogICAgICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyLCAvLyBPbmx5IG5lZWRlZCB3aGVuIG91dHB1dFN1cmZhY2VzIGlzIG5vdCBlbXB0eQotICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0JiByZXF1ZXN0KTsKKyAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCYgcmVxdWVzdCwgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlcik7CiAKICAgICAvLyBDYW1lcmEzRGV2aWNlL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbiBpbnRlcm5hbCBzdGF0ZXMgdXNlZCBpbiBub3RpZnkvcHJvY2Vzc0NhcHR1cmVSZXN1bHQKICAgICAvLyBjYWxsYmFja3MKQEAgLTcyLDggKzc0LDggQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQ7CiAgICAgICAgIHN0ZDo6bXV0ZXgmIGluZmxpZ2h0TG9jazsKICAgICAgICAgaW50NjRfdCYgbGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlcjsKLSAgICAgICAgaW50NjRfdCYgbGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyOwogICAgICAgICBpbnQ2NF90JiBsYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXI7CisgICAgICAgIGludDY0X3QmIGxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlcjsKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0TWFwJiBpbmZsaWdodE1hcDsgLy8gZW5kIG9mIGluZmxpZ2h0TG9jayBzY29wZQogICAgICAgICBzdGQ6Om11dGV4JiBvdXRwdXRMb2NrOwogICAgICAgICBzdGQ6Omxpc3Q8Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdFF1ZXVlOwpAQCAtOTgsNiArMTAwLDcgQEAKICAgICAgICAgVGFnTW9uaXRvciYgdGFnTW9uaXRvcjsKICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbT4gaW5wdXRTdHJlYW07CiAgICAgICAgIFN0cmVhbVNldCYgb3V0cHV0U3RyZWFtczsKKyAgICAgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlcjsKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgICAgICBTZXRFcnJvckludGVyZmFjZSYgc2V0RXJySW50ZjsKICAgICAgICAgSW5mbGlnaHRSZXF1ZXN0VXBkYXRlSW50ZXJmYWNlJiBpbmZsaWdodEludGY7CkBAIC0xMjEsNiArMTI0LDcgQEAKICAgICAgICAgc3RkOjptdXRleCYgcmVxQnVmZmVyTG9jazsgLy8gbG9jayB0byBzZXJpYWxpemUgcmVxdWVzdCBidWZmZXIgY2FsbHMKICAgICAgICAgY29uc3QgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyOwogICAgICAgICBTdHJlYW1TZXQmIG91dHB1dFN0cmVhbXM7CisgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXI7CiAgICAgICAgIFNldEVycm9ySW50ZXJmYWNlJiBzZXRFcnJJbnRmOwogICAgICAgICBCdWZmZXJSZWNvcmRzSW50ZXJmYWNlJiBidWZmZXJSZWNvcmRzSW50ZjsKICAgICAgICAgUmVxdWVzdEJ1ZmZlckludGVyZmFjZSYgcmVxQnVmZmVySW50ZjsKQEAgLTEzNCw2ICsxMzgsNyBAQAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZDsKICAgICAgICAgY29uc3QgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyOwogICAgICAgICBTdHJlYW1TZXQmIG91dHB1dFN0cmVhbXM7CisgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXI7CiAgICAgICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHNJbnRmOwogICAgIH07CiAKQEAgLTE0OSw2ICsxNTQsNyBAQAogICAgICAgICBJbmZsaWdodFJlcXVlc3RVcGRhdGVJbnRlcmZhY2UmIGluZmxpZ2h0SW50ZjsKICAgICAgICAgQnVmZmVyUmVjb3Jkc0ludGVyZmFjZSYgYnVmZmVyUmVjb3Jkc0ludGY7CiAgICAgICAgIEZsdXNoQnVmZmVySW50ZXJmYWNlJiBmbHVzaEJ1ZmZlckludGY7CisgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXI7CiAgICAgfTsKIAogICAgIHZvaWQgZmx1c2hJbmZsaWdodFJlcXVlc3RzKEZsdXNoSW5mbGlnaHRSZXFTdGF0ZXMmIHN0YXRlcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCAyMGY2MTY4Li45YThmNmZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTE1Miw2ICsxNTIsMTAgQEAKICAgICByZXR1cm4gbVBoeXNpY2FsQ2FtZXJhSWQ7CiB9CiAKK2ludCBDYW1lcmEzU3RyZWFtOjpnZXRNYXhIYWxCdWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7Cit9CisKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6c2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KGJvb2wgc3VwcG9ydCkgewogICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSBzdXBwb3J0OwogfQpAQCAtMzMwLDcgKzMzNCw4IEBACiAgICAgLy8gUmVnaXN0ZXIgZm9yIGlkbGUgdHJhY2tpbmcKICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDAgJiYgbVN0YXR1c0lkID09IFN0YXR1c1RyYWNrZXI6Ok5PX1NUQVRVU19JRCkgewotICAgICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6c3RyaW5nKCJTdHJlYW0gIikgKyBzdGQ6OnRvX3N0cmluZyhtSWQpOworICAgICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQobmFtZS5jX3N0cigpKTsKICAgICB9CiAKICAgICAvLyBDaGVjayBpZiB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaXMgdW5jaGFuZ2VkLCBhbmQgc2tpcCByZWFsbG9jYXRpb24gaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggZDc2OGQzZC4uMzY1NGY4OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTE2NSw2ICsxNjUsNyBAQAogICAgIHZvaWQgICAgICAgICAgICAgIHNldERhdGFTcGFjZU92ZXJyaWRlKGJvb2wgZGF0YVNwYWNlT3ZlcnJpZGVuKTsKICAgICBib29sICAgICAgICAgICAgICBpc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSBjb25zdDsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBnZXRPcmlnaW5hbERhdGFTcGFjZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgIGdldE1heEhhbEJ1ZmZlcnMoKSBjb25zdDsKICAgICBjb25zdCBTdHJpbmc4JiAgICBwaHlzaWNhbENhbWVyYUlkKCkgY29uc3Q7CiAKICAgICB2b2lkICAgICAgICAgICAgICBzZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoYm9vbCkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDY2N2UzYmIuLmEwNTMyNjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC05OSw2ICs5OSw4IEBACiAgICAgdmlydHVhbCB2b2lkIHNldERhdGFTcGFjZU92ZXJyaWRlKGJvb2wgZGF0YVNwYWNlT3ZlcnJpZGVuKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGFuZHJvaWRfZGF0YXNwYWNlIGdldE9yaWdpbmFsRGF0YVNwYWNlKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldE1heEhhbEJ1ZmZlcnMoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgZ2V0TWF4VG90YWxCdWZmZXJzKCkgY29uc3QgPSAwOwogCiAgICAgLyoqCiAgICAgICogT2ZmbGluZSBwcm9jZXNzaW5nCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Nvb3JkaW5hdGVNYXBwZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ29vcmRpbmF0ZU1hcHBlci5oCmluZGV4IDUxNjQ4NTYuLjU1OGY0YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ29vcmRpbmF0ZU1hcHBlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ29vcmRpbmF0ZU1hcHBlci5oCkBAIC0xOCwxNiArMTgsMjMgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NPT1JESU5BVEVNQVBQRVJfSAogCiAjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8c2V0PgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAogY2xhc3MgQ29vcmRpbmF0ZU1hcHBlciB7Ci0gICAgLy8gUmlnaHQgbm93IG9ubHkgc3RvcmVzIG1ldGFkYXRhIHRhZ3MgY29udGFpbmluZyAyRCBjb29yZGluYXRlcwotICAgIC8vIHRvIGJlIGNvcnJlY3RlZC4KK3B1YmxpYzoKKyAgICAvLyBUaGUgcmVzdWx0IG1ldGFkYXRhIHRhZ3MgdGhhdCBhcmUgdG8gYmUgcmUtbWFwcGVkCisgICAgY29uc3Qgc3RkOjpzZXQ8dWludDMyX3Q+JiBnZXRSZW1hcHBlZEtleXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVtYXBwZWRLZXlzOworICAgIH0KKworICAgIHZpcnR1YWwgfkNvb3JkaW5hdGVNYXBwZXIoKSA9IGRlZmF1bHQ7CisKIHByb3RlY3RlZDoKLSAgICAvLyBNZXRhZGF0YSBrZXkgbGlzdHMgdG8gY29ycmVjdAorICAgIC8vIE1ldGFkYXRhIHRhZ3MgY29udGFpbmluZyAyRCBjb29yZGluYXRlcyB0byBiZSBjb3JyZWN0ZWQuCiAKICAgICAvLyBCb3RoIGNhcHR1cmUgcmVxdWVzdCBhbmQgcmVzdWx0CiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8dWludDMyX3QsIDM+IGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3Q7CkBAIC0zNyw2ICs0NCwxMCBAQAogCiAgICAgLy8gT25seSBmb3IgY2FwdHVyZSByZXN1bHRzOyBkb24ndCBjbGFtcAogICAgIHN0YXRpYyBjb25zdCBzdGQ6OmFycmF5PHVpbnQzMl90LCAyPiBrUmVzdWx0UG9pbnRzVG9Db3JyZWN0Tm9DbGFtcDsKKworICAgIHZpcnR1YWwgdm9pZCBpbml0UmVtYXBwZWRLZXlzKCkgPSAwOworICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBtUmVtYXBwZWRLZXlzOworCiB9OyAvLyBjbGFzcyBDb29yZGluYXRlTWFwcGVyCiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCmluZGV4IDgxMzIyMjUuLjMxNjMwM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcApAQCAtMjksNiArMjksMjAgQEAKIAogCiBEaXN0b3J0aW9uTWFwcGVyOjpEaXN0b3J0aW9uTWFwcGVyKCkgOiBtVmFsaWRNYXBwaW5nKGZhbHNlKSwgbVZhbGlkR3JpZHMoZmFsc2UpIHsKKyAgICBpbml0UmVtYXBwZWRLZXlzKCk7Cit9CisKK3ZvaWQgRGlzdG9ydGlvbk1hcHBlcjo6aW5pdFJlbWFwcGVkS2V5cygpIHsKKyAgICBtUmVtYXBwZWRLZXlzLmluc2VydCgKKyAgICAgICAgICAgIGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3QuYmVnaW4oKSwKKyAgICAgICAgICAgIGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3QuZW5kKCkpOworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KAorICAgICAgICAgICAga1JlY3RzVG9Db3JyZWN0LmJlZ2luKCksCisgICAgICAgICAgICBrUmVjdHNUb0NvcnJlY3QuZW5kKCkpOworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KAorICAgICAgICAgICAga1Jlc3VsdFBvaW50c1RvQ29ycmVjdE5vQ2xhbXAuYmVnaW4oKSwKKyAgICAgICAgICAgIGtSZXN1bHRQb2ludHNUb0NvcnJlY3ROb0NsYW1wLmVuZCgpKTsKKyAgICBtUmVtYXBwZWRLZXlzLmluc2VydChBTkRST0lEX0RJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFKTsKIH0KIAogYm9vbCBEaXN0b3J0aW9uTWFwcGVyOjppc0Rpc3RvcnRpb25TdXBwb3J0ZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pIHsKQEAgLTQ4NSw3ICs0OTksNyBAQAogCiAgICAgZmxvYXQgZGV0ID0gYiAqIGIgLSA0ICogYSAqIGM7CiAgICAgaWYgKGRldCA8IDApIHsKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIC0gc2hvdWxkIG5vdCBoYXBwZW4gaWYgcHQgaXMgd2l0aGluIHRoZSBxdWFkCisgICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2sgLSBzaG91bGQgbm90IGhhcHBlbiBpZiBwdCBpcyB3aXRoaW4gdGhlIHF1YWQKICAgICAgICAgQUxPR0UoIkJhZCBkZXRlcm1pbmFudCEgYTogJWYsIGI6ICVmLCBjOiAlZiwgZGV0OiAlZiIsIGEsYixjLGRldCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oCmluZGV4IDdkY2I2N2IuLjUwMjdiZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oCkBAIC0zMiw3ICszMiw3IEBACiAgKiBVdGlsaXRpZXMgdG8gdHJhbnNmb3JtIGJldHdlZW4gcmF3IChkaXN0b3J0ZWQpIGFuZCB3YXJwZWQgKGNvcnJlY3RlZCkgY29vcmRpbmF0ZSBzeXN0ZW1zCiAgKiBmb3IgY2FtZXJhcyB0aGF0IHN1cHBvcnQgZ2VvbWV0cmljIGRpc3RvcnRpb24KICAqLwotY2xhc3MgRGlzdG9ydGlvbk1hcHBlciA6IHByaXZhdGUgQ29vcmRpbmF0ZU1hcHBlciB7CitjbGFzcyBEaXN0b3J0aW9uTWFwcGVyIDogcHVibGljIENvb3JkaW5hdGVNYXBwZXIgewogICBwdWJsaWM6CiAgICAgRGlzdG9ydGlvbk1hcHBlcigpOwogCkBAIC00Myw3ICs0MywxMCBAQAogICAgICAgICAgICAgbUFycmF5V2lkdGgob3RoZXIubUFycmF5V2lkdGgpLCBtQXJyYXlIZWlnaHQob3RoZXIubUFycmF5SGVpZ2h0KSwKICAgICAgICAgICAgIG1BY3RpdmVXaWR0aChvdGhlci5tQWN0aXZlV2lkdGgpLCBtQWN0aXZlSGVpZ2h0KG90aGVyLm1BY3RpdmVIZWlnaHQpLAogICAgICAgICAgICAgbUFycmF5RGlmZlgob3RoZXIubUFycmF5RGlmZlgpLCBtQXJyYXlEaWZmWShvdGhlci5tQXJyYXlEaWZmWSksCi0gICAgICAgICAgICBtQ29ycmVjdGVkR3JpZChvdGhlci5tQ29ycmVjdGVkR3JpZCksIG1EaXN0b3J0ZWRHcmlkKG90aGVyLm1EaXN0b3J0ZWRHcmlkKSB7fQorICAgICAgICAgICAgbUNvcnJlY3RlZEdyaWQob3RoZXIubUNvcnJlY3RlZEdyaWQpLCBtRGlzdG9ydGVkR3JpZChvdGhlci5tRGlzdG9ydGVkR3JpZCkgeworICAgICAgICAgICAgaW5pdFJlbWFwcGVkS2V5cygpOyB9CisKKyAgICB2b2lkIGluaXRSZW1hcHBlZEtleXMoKSBvdmVycmlkZTsKIAogICAgIC8qKgogICAgICAqIENoZWNrIHdoZXRoZXIgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIEhBTApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgKaW5kZXggZGE0ZjIyOC4uYzdiNzQ3NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oCkBAIC0xMTUsNiArMTE1LDkgQEAKICAgICAvLyBSZXF1ZXN0ZWQgY2FtZXJhIGlkcyAoYm90aCBsb2dpY2FsIGFuZCBwaHlzaWNhbCkgd2l0aCB6b29tUmF0aW8gIT0gMS4wZgogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjYW1lcmFJZHNXaXRoWm9vbTsKIAorICAgIC8vIFRpbWUgb2YgY2FwdHVyZSByZXF1ZXN0IChmcm9tIHN5c3RlbVRpbWUpIGluIE5zCisgICAgbnNlY3NfdCByZXF1ZXN0VGltZU5zOworCiAgICAgLy8gV2hhdCBzaGFyZWQgc3VyZmFjZXMgYW4gb3V0cHV0IHNob3VsZCBnbyB0bwogICAgIFN1cmZhY2VNYXAgb3V0cHV0U3VyZmFjZXM7CiAKQEAgLTEzNSwxNCArMTM4LDE1IEBACiAgICAgICAgICAgICBlcnJvckJ1ZlN0cmF0ZWd5KEVSUk9SX0JVRl9DQUNIRSksCiAgICAgICAgICAgICBzdGlsbENhcHR1cmUoZmFsc2UpLAogICAgICAgICAgICAgenNsQ2FwdHVyZShmYWxzZSksCi0gICAgICAgICAgICByb3RhdGVBbmRDcm9wQXV0byhmYWxzZSkgeworICAgICAgICAgICAgcm90YXRlQW5kQ3JvcEF1dG8oZmFsc2UpLAorICAgICAgICAgICAgcmVxdWVzdFRpbWVOcygwKSB7CiAgICAgfQogCiAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcywgYm9vbCBoYXNJbnB1dCwKICAgICAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RHVyYXRpb24sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCwgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKICAgICAgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLCBib29sIHJvdGF0ZUFuZENyb3BBdXRvLCBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGlkc1dpdGhab29tLAotICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0U3VyZmFjZXMgPSBTdXJmYWNlTWFwe30pIDoKKyAgICAgICAgICAgIG5zZWNzX3QgcmVxdWVzdE5zLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSkgOgogICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgIHNlbnNvclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLApAQCAtMTU5LDYgKzE2Myw3IEBACiAgICAgICAgICAgICB6c2xDYXB0dXJlKGlzWnNsQ2FwdHVyZSksCiAgICAgICAgICAgICByb3RhdGVBbmRDcm9wQXV0byhyb3RhdGVBbmRDcm9wQXV0byksCiAgICAgICAgICAgICBjYW1lcmFJZHNXaXRoWm9vbShpZHNXaXRoWm9vbSksCisgICAgICAgICAgICByZXF1ZXN0VGltZU5zKHJlcXVlc3ROcyksCiAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcyhvdXRTdXJmYWNlcykgewogICAgIH0KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmNwcAppbmRleCAzNzE4ZjU0Li5hMDJlNWY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvUm90YXRlQW5kQ3JvcE1hcHBlci5jcHAKQEAgLTI3LDYgKzI3LDE4IEBACiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAordm9pZCBSb3RhdGVBbmRDcm9wTWFwcGVyOjppbml0UmVtYXBwZWRLZXlzKCkgeworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KAorICAgICAgICAgICAga01ldGVyaW5nUmVnaW9uc1RvQ29ycmVjdC5iZWdpbigpLAorICAgICAgICAgICAga01ldGVyaW5nUmVnaW9uc1RvQ29ycmVjdC5lbmQoKSk7CisgICAgbVJlbWFwcGVkS2V5cy5pbnNlcnQoCisgICAgICAgICAgICBrUmVzdWx0UG9pbnRzVG9Db3JyZWN0Tm9DbGFtcC5iZWdpbigpLAorICAgICAgICAgICAga1Jlc3VsdFBvaW50c1RvQ29ycmVjdE5vQ2xhbXAuZW5kKCkpOworCisgICAgbVJlbWFwcGVkS2V5cy5pbnNlcnQoQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QKTsKKyAgICBtUmVtYXBwZWRLZXlzLmluc2VydChBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTik7Cit9CisKIGJvb2wgUm90YXRlQW5kQ3JvcE1hcHBlcjo6aXNOZWVkZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEqIGRldmljZUluZm8pIHsKICAgICBhdXRvIGVudHJ5ID0gZGV2aWNlSW5mby0+ZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUk9UQVRFX0FORF9DUk9QX01PREVTKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKQEAgLTM2LDYgKzQ4LDggQEAKIH0KIAogUm90YXRlQW5kQ3JvcE1hcHBlcjo6Um90YXRlQW5kQ3JvcE1hcHBlcihjb25zdCBDYW1lcmFNZXRhZGF0YSogZGV2aWNlSW5mbykgeworICAgIGluaXRSZW1hcHBlZEtleXMoKTsKKwogICAgIGF1dG8gZW50cnkgPSBkZXZpY2VJbmZvLT5maW5kKEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUpOwogICAgIGlmIChlbnRyeS5jb3VudCAhPSA0KSByZXR1cm47CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvUm90YXRlQW5kQ3JvcE1hcHBlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmgKaW5kZXggNDU5ZTI3Zi4uZjllMjI2MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmgKQEAgLTMyLDEyICszMiwxNCBAQAogICogVXRpbGl0aWVzIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHVucm90YXRlZCBhbmQgcm90YXRlZC1hbmQtY3JvcHBlZCBjb29yZGluYXRlIHN5c3RlbXMKICAqIGZvciBjYW1lcmFzIHRoYXQgc3VwcG9ydCBTQ0FMRVJfUk9UQVRFX0FORF9DUk9QIGNvbnRyb2xzIGluIEFVVE8gbW9kZS4KICAqLwotY2xhc3MgUm90YXRlQW5kQ3JvcE1hcHBlciA6IHByaXZhdGUgQ29vcmRpbmF0ZU1hcHBlciB7CitjbGFzcyBSb3RhdGVBbmRDcm9wTWFwcGVyIDogcHVibGljIENvb3JkaW5hdGVNYXBwZXIgewogICBwdWJsaWM6CiAgICAgc3RhdGljIGJvb2wgaXNOZWVkZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEqIGRldmljZUluZm8pOwogCiAgICAgUm90YXRlQW5kQ3JvcE1hcHBlcihjb25zdCBDYW1lcmFNZXRhZGF0YSogZGV2aWNlSW5mbyk7CiAKKyAgICB2b2lkIGluaXRSZW1hcHBlZEtleXMoKSBvdmVycmlkZTsKKwogICAgIC8qKgogICAgICAqIEFkanVzdCBjYXB0dXJlIHJlcXVlc3QgYXNzdW1pbmcgcm90YXRlIGFuZCBjcm9wIEFVVE8gaXMgZW5hYmxlZAogICAgICAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5jcHAKaW5kZXggNzIzYjVjMi4uZWExZjJjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwCkBAIC00MCw3ICs0MCw3IEBACiBTdGF0dXNUcmFja2VyOjp+U3RhdHVzVHJhY2tlcigpIHsKIH0KIAotaW50IFN0YXR1c1RyYWNrZXI6OmFkZENvbXBvbmVudCgpIHsKK2ludCBTdGF0dXNUcmFja2VyOjphZGRDb21wb25lbnQoc3RkOjpzdHJpbmcgY29tcG9uZW50TmFtZSkgewogICAgIGludCBpZDsKICAgICBzc2l6ZV90IGVycjsKICAgICB7CkBAIC00OSw4ICs0OSwxMiBAQAogICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBuZXcgY29tcG9uZW50ICVkIiwgX19GVU5DVElPTl9fLCBpZCk7CiAKICAgICAgICAgZXJyID0gbVN0YXRlcy5hZGQoaWQsIElETEUpOwotICAgICAgICBBTE9HRV9JRihlcnIgPCAwLCAiJXM6IENhbid0IGFkZCBuZXcgY29tcG9uZW50ICVkOiAlcyAoJXpkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIGlmIChjb21wb25lbnROYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBzdGQ6OnRvX3N0cmluZyhpZCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbXBvbmVudE5hbWVzLmFkZChpZCwgY29tcG9uZW50TmFtZSk7CisgICAgICAgIEFMT0dFX0lGKGVyciA8IDAsICIlczogQ2FuJ3QgYWRkIG5ldyBjb21wb25lbnQgJWQgKCVzKTogJXMgKCV6ZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQsIGNvbXBvbmVudE5hbWUuY19zdHIoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgfQogCiAgICAgaWYgKGVyciA+PSAwKSB7CkBAIC02OCw2ICs3Miw3IEBACiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICAgICAgQUxPR1YoIiVzOiBSZW1vdmluZyBjb21wb25lbnQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKICAgICAgICAgaWR4ID0gbVN0YXRlcy5yZW1vdmVJdGVtKGlkKTsKKyAgICAgICAgbUNvbXBvbmVudE5hbWVzLnJlbW92ZUl0ZW0oaWQpOwogICAgIH0KIAogICAgIGlmIChpZHggPj0gMCkgewpAQCAtODAsNiArODUsMjAgQEAKIH0KIAogCit2b2lkIFN0YXR1c1RyYWNrZXI6OmR1bXBBY3RpdmVDb21wb25lbnRzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobURldmljZVN0YXRlID09IElETEUpIHsKKyAgICAgICAgQUxPR0koIiVzOiBhbGwgY29tcG9uZW50cyBhcmUgSURMRSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtU3RhdGVzLnZhbHVlQXQoaSkgPT0gQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HSSgiJXM6IGNvbXBvbmVudCAlZCAoJXMpIGlzIGFjdGl2ZSIsIF9fRlVOQ1RJT05fXywgbVN0YXRlcy5rZXlBdChpKSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWVzLnZhbHVlQXQoaSkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgU3RhdHVzVHJhY2tlcjo6bWFya0NvbXBvbmVudElkbGUoaW50IGlkLCBjb25zdCBzcDxGZW5jZT4mIGNvbXBvbmVudEZlbmNlKSB7CiAgICAgbWFya0NvbXBvbmVudChpZCwgSURMRSwgY29tcG9uZW50RmVuY2UpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9TdGF0dXNUcmFja2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuaAppbmRleCAzYTFkODVjLi4zNzQxY2NlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TVEFUVVNUUkFDS0VSX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RBVFVTVFJBQ0tFUl9ICiAKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgpAQCAtNTQsNyArNTUsNyBAQAogICAgIC8vIEFkZCBhIGNvbXBvbmVudCB0byB0cmFjazsgcmV0dXJucyBub24tbmVnYXRpdmUgdW5pcXVlIElEIGZvciB0aGUgbmV3CiAgICAgLy8gY29tcG9uZW50IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAgICAvLyBOZXcgY29tcG9uZW50cyBzdGFydCBpbiB0aGUgaWRsZSBzdGF0ZS4KLSAgICBpbnQgYWRkQ29tcG9uZW50KCk7CisgICAgaW50IGFkZENvbXBvbmVudChzdGQ6OnN0cmluZyBjb21wb25lbnROYW1lKTsKIAogICAgIC8vIFJlbW92ZSBleGlzdGluZyBjb21wb25lbnQgZnJvbSBpZGxlIHRyYWNraW5nLiBJZ25vcmVzIHVua25vd24gSURzCiAgICAgdm9pZCByZW1vdmVDb21wb25lbnQoaW50IGlkKTsKQEAgLTY4LDYgKzY5LDggQEAKICAgICAvLyBTZXQgdGhlIHN0YXRlIG9mIGEgdHJhY2tlZCBjb21wb25lbnQgdG8gYmUgYWN0aXZlLiBJZ25vcmVzIHVua25vd24gSURzLgogICAgIHZvaWQgbWFya0NvbXBvbmVudEFjdGl2ZShpbnQgaWQpOwogCisgICAgdm9pZCBkdW1wQWN0aXZlQ29tcG9uZW50cygpOworCiAgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RFeGl0KCk7CiAgIHByb3RlY3RlZDoKIApAQCAtMTA1LDYgKzEwOCw3IEBACiAKICAgICAvLyBDdXJyZW50IGNvbXBvbmVudCBzdGF0ZXMKICAgICBLZXllZFZlY3RvcjxpbnQsIENvbXBvbmVudFN0YXRlPiBtU3RhdGVzOworICAgIEtleWVkVmVjdG9yPGludCwgc3RkOjpzdHJpbmc+IG1Db21wb25lbnROYW1lczsKICAgICAvLyBNZXJnZWQgZmVuY2UgZm9yIGFsbCBwcm9jZXNzZWQgc3RhdGUgY2hhbmdlcwogICAgIHNwPEZlbmNlPiBtSWRsZUZlbmNlOwogICAgIC8vIEN1cnJlbnQgb3ZlcmFsbCBkZXZpY2Ugc3RhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcAppbmRleCBhODdkZTc3Li4xYmMyMDgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwCkBAIC0yNSw2ICsyNSwxOSBAQAogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKK3ZvaWQgWm9vbVJhdGlvTWFwcGVyOjppbml0UmVtYXBwZWRLZXlzKCkgeworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KAorICAgICAgICAgICAga01ldGVyaW5nUmVnaW9uc1RvQ29ycmVjdC5iZWdpbigpLAorICAgICAgICAgICAga01ldGVyaW5nUmVnaW9uc1RvQ29ycmVjdC5lbmQoKSk7CisgICAgbVJlbWFwcGVkS2V5cy5pbnNlcnQoCisgICAgICAgICAgICBrUmVjdHNUb0NvcnJlY3QuYmVnaW4oKSwKKyAgICAgICAgICAgIGtSZWN0c1RvQ29ycmVjdC5lbmQoKSk7CisgICAgbVJlbWFwcGVkS2V5cy5pbnNlcnQoCisgICAgICAgICAgICBrUmVzdWx0UG9pbnRzVG9Db3JyZWN0Tm9DbGFtcC5iZWdpbigpLAorICAgICAgICAgICAga1Jlc3VsdFBvaW50c1RvQ29ycmVjdE5vQ2xhbXAuZW5kKCkpOworCisgICAgbVJlbWFwcGVkS2V5cy5pbnNlcnQoQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8pOworfQogCiBzdGF0dXNfdCBab29tUmF0aW9NYXBwZXI6OmluaXRab29tUmF0aW9JblRlbXBsYXRlKENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CkBAIC0xMTcsNiArMTMwLDggQEAKIAogWm9vbVJhdGlvTWFwcGVyOjpab29tUmF0aW9NYXBwZXIoY29uc3QgQ2FtZXJhTWV0YWRhdGEqIGRldmljZUluZm8sCiAgICAgICAgIGJvb2wgc3VwcG9ydE5hdGl2ZVpvb21SYXRpbywgYm9vbCB1c2VQcmVjb3JyZWN0QXJyYXkpIHsKKyAgICBpbml0UmVtYXBwZWRLZXlzKCk7CisKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKIAogICAgIGVudHJ5ID0gZGV2aWNlSW5mby0+ZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFKTsKQEAgLTE1Myw2ICsxNjgsMTkgQEAKICAgICBlbnRyeSA9IHJlcXVlc3QtPmZpbmQoQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8pOwogICAgIGlmIChlbnRyeS5jb3VudCA9PSAxICYmIGVudHJ5LmRhdGEuZlswXSAhPSAxLjBmKSB7CiAgICAgICAgIHpvb21SYXRpb0lzMSA9IGZhbHNlOworCisgICAgICAgIC8vIElmIGNyb3BSZWdpb24gaXMgd2luZG93Ym94aW5nLCBvdmVycmlkZSBpdCB3aXRoIGFjdGl2ZUFycmF5CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGNyb3BSZWdpb25FbnRyeSA9IHJlcXVlc3QtPmZpbmQoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pOworICAgICAgICBpZiAoY3JvcFJlZ2lvbkVudHJ5LmNvdW50ID09IDQpIHsKKyAgICAgICAgICAgIGludCBjcm9wV2lkdGggPSBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbMl07CisgICAgICAgICAgICBpbnQgY3JvcEhlaWdodCA9IGNyb3BSZWdpb25FbnRyeS5kYXRhLmkzMlszXTsKKyAgICAgICAgICAgIGlmIChjcm9wV2lkdGggPCBtQXJyYXlXaWR0aCAmJiBjcm9wSGVpZ2h0IDwgbUFycmF5SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgY3JvcFJlZ2lvbkVudHJ5LmRhdGEuaTMyWzBdID0gMDsKKyAgICAgICAgICAgICAgICBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbMV0gPSAwOworICAgICAgICAgICAgICAgIGNyb3BSZWdpb25FbnRyeS5kYXRhLmkzMlsyXSA9IG1BcnJheVdpZHRoOworICAgICAgICAgICAgICAgIGNyb3BSZWdpb25FbnRyeS5kYXRhLmkzMlszXSA9IG1BcnJheUhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtSGFsU3VwcG9ydHNab29tUmF0aW8gJiYgem9vbVJhdGlvSXMxKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuaAppbmRleCA2OThmODdmLi4zNzY5Mjk5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmgKQEAgLTMzLDcgKzMzLDcgQEAKICAqIC0gSEFMIHN1cHBvcnRzIHpvb21SYXRpbyBhbmQgdGhlIGFwcGxpY2F0aW9uIHVzZXMgY3JvcFJlZ2lvbiwgb3IKICAqIC0gSEFMIGRvZXNuJ3Qgc3VwcG9ydCB6b29tUmF0aW8sIGJ1dCB0aGUgYXBwbGljYXRpb24gdXNlcyB6b29tUmF0aW8KICAqLwotY2xhc3MgWm9vbVJhdGlvTWFwcGVyIDogcHJpdmF0ZSBDb29yZGluYXRlTWFwcGVyIHsKK2NsYXNzIFpvb21SYXRpb01hcHBlciA6IHB1YmxpYyBDb29yZGluYXRlTWFwcGVyIHsKICAgcHVibGljOgogICAgIFpvb21SYXRpb01hcHBlcigpID0gZGVmYXVsdDsKICAgICBab29tUmF0aW9NYXBwZXIoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmRldmljZUluZm8sCkBAIC00MSw3ICs0MSw5IEBACiAgICAgWm9vbVJhdGlvTWFwcGVyKGNvbnN0IFpvb21SYXRpb01hcHBlciYgb3RoZXIpIDoKICAgICAgICAgICAgIG1IYWxTdXBwb3J0c1pvb21SYXRpbyhvdGhlci5tSGFsU3VwcG9ydHNab29tUmF0aW8pLAogICAgICAgICAgICAgbUFycmF5V2lkdGgob3RoZXIubUFycmF5V2lkdGgpLCBtQXJyYXlIZWlnaHQob3RoZXIubUFycmF5SGVpZ2h0KSwKLSAgICAgICAgICAgIG1Jc1ZhbGlkKG90aGVyLm1Jc1ZhbGlkKSB7fQorICAgICAgICAgICAgbUlzVmFsaWQob3RoZXIubUlzVmFsaWQpIHsgaW5pdFJlbWFwcGVkS2V5cygpOyB9CisKKyAgICB2b2lkIGluaXRSZW1hcHBlZEtleXMoKSBvdmVycmlkZTsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgcmVxdWVzdCB0ZW1wbGF0ZSB3aXRoIHZhbGlkIHpvb21SYXRpbyBpZiBuZWNlc3NhcnkuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjdmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2VfZnV6el9kZWZhdWx0cyIsCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY29tcG9uZW50aWQ6IDQxNzI3CisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2VfZGlzdG9ydGlvbl9tYXBwZXJfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJsaWJjYW1lcmFzZXJ2aWNlX2Z1enpfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJEaXN0b3J0aW9uTWFwcGVyRnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGliY2FtZXJhc2VydmljZV9kZXB0aF9wcm9jZXNzb3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJsaWJjYW1lcmFzZXJ2aWNlX2Z1enpfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJEZXB0aFByb2Nlc3NvckZ1enplci5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNhbWVyYXNlcnZpY2UiLAorICAgIF0sCisgICAgY29ycHVzOiBbImNvcnB1cy8qLmpwZyJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL0RlcHRoUHJvY2Vzc29yRnV6emVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9EZXB0aFByb2Nlc3NvckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwY2E5MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9EZXB0aFByb2Nlc3NvckZ1enplci5jcHAKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisKKyNpbmNsdWRlICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVyV2lkdGggPSA2NDA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVySGVpZ2h0ID0gNDgwOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZSAoa1Rlc3RCdWZmZXJXaWR0aCAqIGtUZXN0QnVmZmVySGVpZ2h0KTsKKwordm9pZCBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUsIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiAqZGVwdGgxNkJ1ZmZlciAvKm91dCovKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlcHRoMTZCdWZmZXItPnNpemUoKTsgaSsrKSB7CisgICAgICAgICgqZGVwdGgxNkJ1ZmZlcilbaV0gPSBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOworICAgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisKKyAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoZGF0YSwgc2l6ZSwgJmRlcHRoMTZCdWZmZXIpOworCisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoZGF0YSk7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gc2l6ZTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIHByb2Nlc3NEZXB0aFBob3RvRnJhbWUoCisgICAgICAgIGlucHV0RnJhbWUsCisgICAgICAgIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLAorICAgICAgICBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9EaXN0b3J0aW9uTWFwcGVyRnV6emVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9EaXN0b3J0aW9uTWFwcGVyRnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmJhYjRlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL0Rpc3RvcnRpb25NYXBwZXJGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorCisjaW5jbHVkZSAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmgiCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CisKK2ludDMyX3QgdGVzdEFjdGl2ZUFycmF5W10gPSB7MTAwLCAxMDAsIDEwMDAsIDc1MH07CitmbG9hdCB0ZXN0SUNhbFtdID0geyAxMDAwLmYsIDEwMDAuZiwgNTAwLmYsIDUwMC5mLCAwLmYgfTsKK2Zsb2F0IGlkZW50aXR5RGlzdG9ydGlvbltdID0geyAwLmYsIDAuZiwgMC5mLCAwLmYsIDAuZn07CisKK3ZvaWQgc2V0dXBUZXN0TWFwcGVyKERpc3RvcnRpb25NYXBwZXIgKm0sCisgICAgICAgIGZsb2F0IGRpc3RvcnRpb25bNV0sIGZsb2F0IGludHJpbnNpY3NbNV0sCisgICAgICAgIGludDMyX3QgYWN0aXZlQXJyYXlbNF0sIGludDMyX3QgcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5WzRdKSB7CisgICAgQ2FtZXJhTWV0YWRhdGEgZGV2aWNlSW5mbzsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUsCisgICAgICAgICAgICBwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXksIDQpOworCisgICAgZGV2aWNlSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSwKKyAgICAgICAgICAgIGFjdGl2ZUFycmF5LCA0KTsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04sCisgICAgICAgICAgICBpbnRyaW5zaWNzLCA1KTsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfTEVOU19ESVNUT1JUSU9OLAorICAgICAgICAgICAgZGlzdG9ydGlvbiwgNSk7CisKKyAgICBtLT5zZXR1cFN0YXRpY0luZm8oZGV2aWNlSW5mbyk7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwKGRhdGEsIHNpemUpOworCisgICAgRGlzdG9ydGlvbk1hcHBlciBtOworICAgIHNldHVwVGVzdE1hcHBlcigmbSwgaWRlbnRpdHlEaXN0b3J0aW9uLCB0ZXN0SUNhbCwKKyAgICAgICAgLyphY3RpdmVBcnJheSovIHRlc3RBY3RpdmVBcnJheSwKKyAgICAgICAgLypwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXkqLyB0ZXN0QWN0aXZlQXJyYXkpOworCisgICAgYm9vbCBjbGFtcCA9IGZkcC5Db25zdW1lQm9vbCgpOworICAgIGJvb2wgc2ltcGxlID0gZmRwLkNvbnN1bWVCb29sKCk7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaW5wdXQ7CisgICAgZm9yIChpbnQgaW5kZXggPSAwOyBmZHAucmVtYWluaW5nX2J5dGVzKCkgPiAwOyBpbmRleCsrKSB7CisgICAgICAgIGlucHV0LnB1c2hfYmFjayhmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIH0KKworICAgIC8vIFRoZSBzaXplIGFyZ3VtZW50IGNvdW50cyBob3cgbWFueSBjb29yZGluYXRlIHBhaXJzIHRoZXJlIGFyZSwgc28KKyAgICAvLyBpdCBpcyBleHBlY3RlZCB0byBiZSAxLzIgdGhlIHNpemUgb2YgdGhlIGlucHV0LgorICAgIG0ubWFwQ29ycmVjdGVkVG9SYXcoaW5wdXQuZGF0YSgpLCBpbnB1dC5zaXplKCkvMiwgIGNsYW1wLCBzaW1wbGUpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL0Nhbm9uX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMS5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL0Nhbm9uX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViMzdkMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvQ2Fub25fTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8xLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL0Z1amlfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8xLmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvRnVqaV9NYWtlck5vdGVfdmFyaWFudF90eXBlXzEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTAzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL0Z1amlfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8xLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8yLmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MWQ2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8yLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8zLmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzMuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNDk4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8zLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV80LmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzQuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzM2ZmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV80LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV81LmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODNmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV81LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzIuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8yLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWYwZWYyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8yLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzMuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8zLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNiODZmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8zLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzQuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV80LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdlYTFjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV80LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCmluZGV4IGJmODljYTUuLjI1MDllNmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCkBAIC0yOCw3ICsyOCw3IEBACiBuYW1lc3BhY2UgZnJhbWV3b3JrcyB7CiBuYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CiBuYW1lc3BhY2UgZGV2aWNlIHsKLW5hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBWMl8xIHsKIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CiAKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBzZXJpYWxseSBieSB0aGUgY2xpZW50IGlmIGl0IGRlY2lkZXMgdG8KICAgICAgICAgLy8gdXNlIGZtcS4KICAgICAgICAgaWYgKGUuc2V0dGluZ3MuZ2V0RGlzY3JpbWluYXRvcigpID09Ci0gICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjpmbXFNZXRhZGF0YVNpemUpIHsKKyAgICAgICAgICAgIFYyXzA6OkZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgewogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBHZXQgc2V0dGluZ3MgZnJvbSB0aGUgZm1xLgogICAgICAgICAgICAgICovCkBAIC0xOTYsNiArMTk2LDEyIEBACiAKIFJldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcykgeworICAgIHJldHVybiBlbmRDb25maWd1cmVfMl8xKG9wZXJhdGluZ01vZGUsIHNlc3Npb25QYXJhbXMsIHN5c3RlbVRpbWUoKSk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZW5kQ29uZmlndXJlXzJfMShTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN0YXJ0VGltZU5zKSB7CiAgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CiAgICAgaWYgKCFjb252ZXJ0RnJvbUhpZGwoc2Vzc2lvblBhcmFtcywgJmNhbWVyYU1ldGFkYXRhKSkgewogICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKQEAgLTIwMyw3ICsyMDksOCBAQAogCiAgICAgc3RkOjp2ZWN0b3I8aW50PiBvZmZsaW5lU3RyZWFtSWRzOwogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmVuZENvbmZpZ3VyZShjb252ZXJ0RnJvbUhpZGwob3BlcmF0aW5nTW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYU1ldGFkYXRhLCAmb2ZmbGluZVN0cmVhbUlkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYU1ldGFkYXRhLCBuczJtcyhzdGFydFRpbWVOcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZsaW5lU3RyZWFtSWRzKTsKICAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaAppbmRleCBjM2E4MGZlLi4wZTJhYjNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjEvSUNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CkBAIC0zNiw3ICszNyw3IEBACiBuYW1lc3BhY2UgZnJhbWV3b3JrcyB7CiBuYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CiBuYW1lc3BhY2UgZGV2aWNlIHsKLW5hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBWMl8xIHsKIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CiAKIHVzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7CkBAIC01MCw3ICs1MSw3IEBACiB1c2luZyBDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47CiB1c2luZyBUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOwogCi11c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGRldmljZTo6VjJfMTo6SUNhbWVyYURldmljZVVzZXI7CiB1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKIHVzaW5nIEhDYXB0dXJlUmVxdWVzdCA9IGRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q7CiB1c2luZyBIU2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlNlc3Npb25Db25maWd1cmF0aW9uOwpAQCAtODMsNiArODQsMTAgQEAKICAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBlbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25QYXJhbXMpOwogCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gZW5kQ29uZmlndXJlXzJfMShTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzdGFydFRpbWVOcyk7CisKICAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBkZWxldGVTdHJlYW0oaW50MzJfdCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVTdHJlYW0oY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIG91dHB1dENvbmZpZ3VyYXRpb24sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCmluZGV4IGE0NjEzM2UuLmFhMWU5NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCkBAIC0zOCw3ICszOCw3IEBACiB1c2luZyBoYXJkd2FyZTo6Vm9pZDsKIAogdXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwotdXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYURldmljZVVzZXI7Cit1c2luZyBkZXZpY2U6OlYyXzE6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcjsKIHVzaW5nIHNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CiB1c2luZyBIQ2FtZXJhTWV0YWRhdGFUeXBlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpDYW1lcmFNZXRhZGF0YVR5cGU7CiB1c2luZyBIVmVuZG9yVGFnID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWc7CkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICB9CiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyA9IGh5YnJpZENhbGxiYWNrczsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0gbUFpZGxJQ2FtZXJhU2VydmljZS0+Y29ubmVjdERldmljZSgKLSAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLAorICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZC5jX3N0cigpKSwgU3RyaW5nMTYoIiIpLCB7fSwKICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCAvKm91dCovJmRldmljZVJlbW90ZSk7CiAgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKICAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKaW5kZXggMDk3ZjRjNS4uODZhN2NlYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHRocmVhZD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMS9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4yL0lDYW1lcmFTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CiAKQEAgLTQyLDcgKzQyLDcgQEAKIAogdXNpbmcgSENhbWVyYURldmljZUNhbGxiYWNrID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7CiB1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKLXVzaW5nIEhDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMTo6SUNhbWVyYVNlcnZpY2U7Cit1c2luZyBIQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzI6OklDYW1lcmFTZXJ2aWNlOwogdXNpbmcgSENhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CiB1c2luZyBIQ2FtZXJhU2VydmljZUxpc3RlbmVyMl8xID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKIHVzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1N2ZjYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuY3BwCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTsKK3VzaW5nIGhhcmR3YXJlOjpDYW1lcmFTZXNzaW9uU3RhdHM7CisKK011dGV4IENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OnNQcm94eU11dGV4Oworc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OnNDYW1lcmFTZXJ2aWNlUHJveHk7CisKK011dGV4IENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6Om1Mb2NrOworc3RkOjptYXA8U3RyaW5nOCwgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OkNhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI+PgorICAgICAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjptU2Vzc2lvblN0YXRzTWFwOworCisvKioKKyAqIENhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXIgZnVuY3Rpb25zCisgKi8KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbk9wZW4oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZShtU2Vzc2lvblN0YXRzKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbkNsb3NlKGludDMyX3QgbGF0ZW5jeU1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgbVNlc3Npb25TdGF0cy5tTmV3Q2FtZXJhU3RhdGUgPSBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9TVEFURV9DTE9TRUQ7CisgICAgbVNlc3Npb25TdGF0cy5tTGF0ZW5jeU1zID0gbGF0ZW5jeU1zOworICAgIHVwZGF0ZVByb3h5RGV2aWNlU3RhdGUobVNlc3Npb25TdGF0cyk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcjo6b25TdHJlYW1Db25maWd1cmVkKAorICAgICAgICBpbnQgb3BlcmF0aW5nTW9kZSwgYm9vbCBpbnRlcm5hbFJlY29uZmlnLCBpbnQzMl90IGxhdGVuY3lNcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGlmIChpbnRlcm5hbFJlY29uZmlnKSB7CisgICAgICAgIG1TZXNzaW9uU3RhdHMubUludGVybmFsUmVjb25maWd1cmUrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2Vzc2lvblN0YXRzLm1MYXRlbmN5TXMgPSBsYXRlbmN5TXM7CisgICAgICAgIG1TZXNzaW9uU3RhdHMubVNlc3Npb25UeXBlID0gb3BlcmF0aW5nTW9kZTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcjo6b25BY3RpdmUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgbVNlc3Npb25TdGF0cy5tTmV3Q2FtZXJhU3RhdGUgPSBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9TVEFURV9BQ1RJVkU7CisgICAgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZShtU2Vzc2lvblN0YXRzKTsKKworICAgIC8vIFJlc2V0IG1DcmVhdGlvbkR1cmF0aW9uIHRvIC0xIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gMXN0IHNlc3Npb24KKyAgICAvLyBhZnRlciBjb25maWd1cmF0aW9uLCBhbmQgYWxsIG90aGVyIHNlc3Npb25zIGFmdGVyIGNvbmZpZ3VyYXRpb24uCisgICAgbVNlc3Npb25TdGF0cy5tTGF0ZW5jeU1zID0gLTE7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcjo6b25JZGxlKAorICAgICAgICBpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIG1TZXNzaW9uU3RhdHMubU5ld0NhbWVyYVN0YXRlID0gQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfU1RBVEVfSURMRTsKKyAgICBtU2Vzc2lvblN0YXRzLm1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CisgICAgbVNlc3Npb25TdGF0cy5tUmVzdWx0RXJyb3JDb3VudCA9IHJlc3VsdEVycm9yQ291bnQ7CisgICAgbVNlc3Npb25TdGF0cy5tRGV2aWNlRXJyb3IgPSBkZXZpY2VFcnJvcjsKKyAgICBtU2Vzc2lvblN0YXRzLm1TdHJlYW1TdGF0cyA9IHN0cmVhbVN0YXRzOworICAgIHVwZGF0ZVByb3h5RGV2aWNlU3RhdGUobVNlc3Npb25TdGF0cyk7CisKKyAgICBtU2Vzc2lvblN0YXRzLm1JbnRlcm5hbFJlY29uZmlndXJlID0gMDsKKyAgICBtU2Vzc2lvblN0YXRzLm1TdHJlYW1TdGF0cy5jbGVhcigpOworfQorCisvKioKKyAqIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIgZnVuY3Rpb25zCisgKi8KKworc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Z2V0Q2FtZXJhU2VydmljZVByb3h5KCkgeworI2lmbmRlZiBfX0JSSUxMT19fCisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNQcm94eU11dGV4KTsKKyAgICBpZiAoc0NhbWVyYVNlcnZpY2VQcm94eSA9PSBudWxscHRyKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgLy8gVXNlIGNoZWNrU2VydmljZSBiZWNhdXNlIGNhbWVyYXNlcnZlciBub3JtYWxseSBzdGFydHMgYmVmb3JlIHRoZQorICAgICAgICAvLyBzeXN0ZW0gc2VydmVyIGFuZCB0aGUgcHJveHkgc2VydmljZS4gU28gdGhlIGxvbmcgdGltZW91dCB0aGF0IGdldFNlcnZpY2UKKyAgICAgICAgLy8gaGFzIGJlZm9yZSBnaXZpbmcgdXAgaXMgaW5hcHByb3ByaWF0ZS4KKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmNoZWNrU2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhLnByb3h5IikpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlUHJveHkgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZVByb3h5PihiaW5kZXIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHNDYW1lcmFTZXJ2aWNlUHJveHk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpIHsKKyAgICBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBwcm94eUJpbmRlciA9IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOworICAgIGlmIChwcm94eUJpbmRlciA9PSBudWxscHRyKSByZXR1cm47CisgICAgcHJveHlCaW5kZXItPnBpbmdGb3JVc2VyVXBkYXRlKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6dXBkYXRlUHJveHlEZXZpY2VTdGF0ZShjb25zdCBDYW1lcmFTZXNzaW9uU3RhdHMmIHNlc3Npb25TdGF0cykgeworICAgIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IHByb3h5QmluZGVyID0gZ2V0Q2FtZXJhU2VydmljZVByb3h5KCk7CisgICAgaWYgKHByb3h5QmluZGVyID09IG51bGxwdHIpIHJldHVybjsKKyAgICBwcm94eUJpbmRlci0+bm90aWZ5Q2FtZXJhU3RhdGUoc2Vzc2lvblN0YXRzKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dTdHJlYW1Db25maWd1cmVkKGNvbnN0IFN0cmluZzgmIGlkLAorICAgICAgICBpbnQgb3BlcmF0aW5nTW9kZSwgYm9vbCBpbnRlcm5hbENvbmZpZywgaW50MzJfdCBsYXRlbmN5TXMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcj4gc2Vzc2lvblN0YXRzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBzZXNzaW9uU3RhdHMgPSBtU2Vzc2lvblN0YXRzTWFwW2lkXTsKKyAgICAgICAgaWYgKHNlc3Npb25TdGF0cyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb25TdGF0c01hcCBzaG91bGQgY29udGFpbiBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBpZCAlcywgb3BlcmF0aW5nTW9kZSAlZCwgaW50ZXJuYWxDb25maWcgJWQsIGxhdGVuY3lNcyAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIG9wZXJhdGluZ01vZGUsIGludGVybmFsQ29uZmlnLCBsYXRlbmN5TXMpOworICAgIHNlc3Npb25TdGF0cy0+b25TdHJlYW1Db25maWd1cmVkKG9wZXJhdGluZ01vZGUsIGludGVybmFsQ29uZmlnLCBsYXRlbmN5TXMpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0FjdGl2ZShjb25zdCBTdHJpbmc4JiBpZCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyPiBzZXNzaW9uU3RhdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIHNlc3Npb25TdGF0cyA9IG1TZXNzaW9uU3RhdHNNYXBbaWRdOworICAgICAgICBpZiAoc2Vzc2lvblN0YXRzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvblN0YXRzTWFwIHNob3VsZCBjb250YWluIGNhbWVyYSAlcyB3aGVuIGxvZ0FjdGl2ZSBpcyBjYWxsZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBpZCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSk7CisgICAgc2Vzc2lvblN0YXRzLT5vbkFjdGl2ZSgpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0lkbGUoY29uc3QgU3RyaW5nOCYgaWQsCisgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI+IHNlc3Npb25TdGF0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgc2Vzc2lvblN0YXRzID0gbVNlc3Npb25TdGF0c01hcFtpZF07CisgICAgfQorCisgICAgaWYgKHNlc3Npb25TdGF0cyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvblN0YXRzTWFwIHNob3VsZCBjb250YWluIGNhbWVyYSAlcyB3aGVuIGxvZ0lkbGUgaXMgY2FsbGVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBpZCAlcywgcmVxdWVzdENvdW50ICUiIFBSSWQ2NCAiLCByZXN1bHRFcnJvckNvdW50ICUiIFBSSWQ2NCAiLCBkZXZpY2VFcnJvciAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtU3RhdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW1TdGF0c1slenVdOiB3ICVkIGggJWQsIHJlcXVlc3RlZENvdW50ICUiIFBSSWQ2NCAiLCBkcm9wQ291bnQgJSIKKyAgICAgICAgICAgICAgICBQUklkNjQgIiwgc3RhcnRUaW1lTXMgJWQiICwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHN0cmVhbVN0YXRzW2ldLm1XaWR0aCwgc3RyZWFtU3RhdHNbaV0ubUhlaWdodCwKKyAgICAgICAgICAgICAgICBzdHJlYW1TdGF0c1tpXS5tUmVxdWVzdENvdW50LCBzdHJlYW1TdGF0c1tpXS5tRXJyb3JDb3VudCwKKyAgICAgICAgICAgICAgICBzdHJlYW1TdGF0c1tpXS5tU3RhcnRMYXRlbmN5TXMpOworICAgIH0KKworICAgIHNlc3Npb25TdGF0cy0+b25JZGxlKHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dPcGVuKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgZmFjaW5nLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgaXNOZGssCisgICAgICAgICAgICBpbnQzMl90IGxhdGVuY3lNcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyPiBzZXNzaW9uU3RhdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIGlmIChtU2Vzc2lvblN0YXRzTWFwLmNvdW50KGlkKSA+IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvblN0YXRzTWFwIHNob3VsZG4ndCBjb250YWluIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgYXBpTGV2ZWwgPSBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9BUElfTEVWRUxfMTsKKyAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IDIpIHsKKyAgICAgICAgICAgIGFwaUxldmVsID0gQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfQVBJX0xFVkVMXzI7CisgICAgICAgIH0KKworICAgICAgICBzZXNzaW9uU3RhdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI+KFN0cmluZzE2KGlkKSwgZmFjaW5nLAorICAgICAgICAgICAgICAgIENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX1NUQVRFX09QRU4sIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIGFwaUxldmVsLCBpc05kaywgbGF0ZW5jeU1zKTsKKyAgICAgICAgbVNlc3Npb25TdGF0c01hcC5lbXBsYWNlKGlkLCBzZXNzaW9uU3RhdHMpOworICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBpZCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSk7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBpZCAlcywgZmFjaW5nICVkLCBlZmZlY3RpdmVBcGlMZXZlbCAlZCwgaXNOZGsgJWQsIGxhdGVuY3lNcyAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIGZhY2luZywgZWZmZWN0aXZlQXBpTGV2ZWwsIGlzTmRrLCBsYXRlbmN5TXMpOworICAgIHNlc3Npb25TdGF0cy0+b25PcGVuKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQ2xvc2UoY29uc3QgU3RyaW5nOCYgaWQsIGludDMyX3QgbGF0ZW5jeU1zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI+IHNlc3Npb25TdGF0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TZXNzaW9uU3RhdHNNYXAuY291bnQoaWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvblN0YXRzTWFwIHNob3VsZCBjb250YWluIGNhbWVyYSAlcyBiZWZvcmUgaXQncyBjbG9zZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2Vzc2lvblN0YXRzID0gbVNlc3Npb25TdGF0c01hcFtpZF07CisgICAgICAgIGlmIChzZXNzaW9uU3RhdHMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uU3RhdHNNYXAgc2hvdWxkIGNvbnRhaW4gY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvblN0YXRzTWFwLmVyYXNlKGlkKTsKKyAgICAgICAgQUxPR1YoIiVzOiBFcmFzaW5nIGlkICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpKTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IGlkICVzLCBsYXRlbmN5TXMgJWQiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIGxhdGVuY3lNcyk7CisgICAgc2Vzc2lvblN0YXRzLT5vbkNsb3NlKGxhdGVuY3lNcyk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyNTkzNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1NFUlZJQ0VfUFJPWFlfV1JBUFBFUl9IXworI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1NFUlZJQ0VfUFJPWFlfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyIHsKK3ByaXZhdGU6CisgICAgLy8gR3VhcmQgbUNhbWVyYVNlcnZpY2VQcm94eQorICAgIHN0YXRpYyBNdXRleCBzUHJveHlNdXRleDsKKyAgICAvLyBDYWNoZWQgaW50ZXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZSBwcm94eSBpbiBzeXN0ZW0gc2VydmljZQorICAgIHN0YXRpYyBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eT4gc0NhbWVyYVNlcnZpY2VQcm94eTsKKworICAgIHN0cnVjdCBDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyIHsKKyAgICAgICAgaGFyZHdhcmU6OkNhbWVyYVNlc3Npb25TdGF0cyBtU2Vzc2lvblN0YXRzOworICAgICAgICBNdXRleCBtTG9jazsgLy8gbG9jayBmb3IgcGVyIGNhbWVyYSBzZXNzaW9uIHN0YXRzCisKKyAgICAgICAgQ2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcihjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBuZXdDYW1lcmFTdGF0ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwgaW50IGFwaUxldmVsLCBib29sIGlzTmRrLCBpbnQzMl90IGxhdGVuY3lNcykgOgorICAgICAgICAgICAgbVNlc3Npb25TdGF0cyhjYW1lcmFJZCwgZmFjaW5nLCBuZXdDYW1lcmFTdGF0ZSwgY2xpZW50TmFtZSwgYXBpTGV2ZWwsIGlzTmRrLCBsYXRlbmN5TXMpCisgICAgICAgICAgICB7fQorCisgICAgICAgIHZvaWQgb25PcGVuKCk7CisgICAgICAgIHZvaWQgb25DbG9zZShpbnQzMl90IGxhdGVuY3lNcyk7CisgICAgICAgIHZvaWQgb25TdHJlYW1Db25maWd1cmVkKGludCBvcGVyYXRpbmdNb2RlLCBib29sIGludGVybmFsUmVjb25maWcsIGludDMyX3QgbGF0ZW5jeU1zKTsKKyAgICAgICAgdm9pZCBvbkFjdGl2ZSgpOworICAgICAgICB2b2lkIG9uSWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKKyAgICB9OworCisgICAgLy8gTG9jayBmb3IgY2FtZXJhIHNlc3Npb24gc3RhdHMgbWFwCisgICAgc3RhdGljIE11dGV4IG1Mb2NrOworICAgIC8vIE1hcCBmcm9tIGNhbWVyYSBpZCB0byB0aGUgY2FtZXJhJ3Mgc2Vzc2lvbiBzdGF0aXN0aWNzCisgICAgc3RhdGljIHN0ZDo6bWFwPFN0cmluZzgsIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyPj4gbVNlc3Npb25TdGF0c01hcDsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgc2Vzc2lvbiBzdGF0cyBvZiBhIGdpdmVuIGNhbWVyYSBkZXZpY2UgKG9wZW4vY2xvc2UvYWN0aXZlL2lkbGUpIHdpdGgKKyAgICAgKiB0aGUgY2FtZXJhIHByb3h5IHNlcnZpY2UgaW4gdGhlIHN5c3RlbSBzZXJ2aWNlCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpDYW1lcmFTZXNzaW9uU3RhdHMmIHNlc3Npb25TdGF0cyk7CisKKyAgICBzdGF0aWMgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOworCitwdWJsaWM6CisgICAgLy8gT3BlbgorICAgIHN0YXRpYyB2b2lkIGxvZ09wZW4oY29uc3QgU3RyaW5nOCYgaWQsIGludCBmYWNpbmcsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBhcGlMZXZlbCwgYm9vbCBpc05kaywKKyAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zKTsKKworICAgIC8vIENsb3NlCisgICAgc3RhdGljIHZvaWQgbG9nQ2xvc2UoY29uc3QgU3RyaW5nOCYgaWQsIGludDMyX3QgbGF0ZW5jeU1zKTsKKworICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgc3RhdGljIHZvaWQgbG9nU3RyZWFtQ29uZmlndXJlZChjb25zdCBTdHJpbmc4JiBpZCwgaW50IG9wZXJhdGluZ01vZGUsIGJvb2wgaW50ZXJuYWxSZWNvbmZpZywKKyAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zKTsKKworICAgIC8vIFNlc3Npb24gc3RhdGUgYmVjb21lcyBhY3RpdmUKKyAgICBzdGF0aWMgdm9pZCBsb2dBY3RpdmUoY29uc3QgU3RyaW5nOCYgaWQpOworCisgICAgLy8gU2Vzc2lvbiBzdGF0ZSBiZWNvbWVzIGlkbGUKKyAgICBzdGF0aWMgdm9pZCBsb2dJZGxlKGNvbnN0IFN0cmluZzgmIGlkLAorICAgICAgICAgICAgaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKKworICAgIC8vIFBpbmcgY2FtZXJhIHNlcnZpY2UgcHJveHkgZm9yIHVzZXIgdXBkYXRlCisgICAgc3RhdGljIHZvaWQgcGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOworfTsKKworfSAvLyBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1NFUlZJQ0VfUFJPWFlfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmNwcAppbmRleCA4ODg2NzFjLi5iYTY4YTYzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmNwcApAQCAtMTQsMjAgKzE0LDQ5MyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KICNpbmNsdWRlICJTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCi0jaW5jbHVkZSAiLi4vYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKKyNpbmNsdWRlICIuLi9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgiCisjaW5jbHVkZSAiLi4vYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgiCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICIuLi9DYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCisKKyNkZWZpbmUgU1RBVFVTX0VSUk9SKGVycm9yQ29kZSwgZXJyb3JTdHJpbmcpIFwKKyAgICBiaW5kZXI6OlN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycm9yQ29kZSwgXAorICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlczolZDogJXMiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBlcnJvclN0cmluZykpCisKKyNkZWZpbmUgU1RBVFVTX0VSUk9SX0ZNVChlcnJvckNvZGUsIGVycm9yU3RyaW5nLCAuLi4pIFwKKyAgICBiaW5kZXI6OlN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycm9yQ29kZSwgXAorICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlczolZDogIiBlcnJvclN0cmluZywgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgXAorICAgICAgICAgICAgICAgICAgICBfX1ZBX0FSR1NfXykpCisKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87Cit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2ludDY0X3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6ZXVjbGlkRGlzdFNxdWFyZShpbnQzMl90IHgwLCBpbnQzMl90IHkwLCBpbnQzMl90IHgxLCBpbnQzMl90IHkxKSB7CisgICAgaW50NjRfdCBkMCA9IHgwIC0geDE7CisgICAgaW50NjRfdCBkMSA9IHkwIC0geTE7CisgICAgcmV0dXJuIGQwICogZDAgKyBkMSAqIGQxOworfQorCitib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OnJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCBmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sCisgICAgICAgIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCkgeworCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgKGRhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RFUFRIKSA/CisgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKSA6CisgICAgICAgICAgICAoZGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0hFSUYpKSA/CisgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUykgOgorICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworCisgICAgaW50MzJfdCBiZXN0V2lkdGggPSAtMTsKKyAgICBpbnQzMl90IGJlc3RIZWlnaHQgPSAtMTsKKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBsaXN0ZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGFuZCBmaW5kIHRoZSBvbmUgd2l0aCB0aGUgc21hbGxlc3QgZXVjbGlkZWFuCisgICAgLy8gZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZGltZW5zaW9ucyBmb3IgdGhlIGdpdmVuIGZvcm1hdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbUNvbmZpZ3MuY291bnQ7IGkgKz0gNCkgeworICAgICAgICBpbnQzMl90IGZtdCA9IHN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaV07CisgICAgICAgIGludDMyX3QgdyA9IHN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIDFdOworICAgICAgICBpbnQzMl90IGggPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyAyXTsKKworICAgICAgICAvLyBJZ25vcmUgaW5wdXQvb3V0cHV0IHR5cGUgZm9yIG5vdworICAgICAgICBpZiAoZm10ID09IGZvcm1hdCkgeworICAgICAgICAgICAgaWYgKHcgPT0gd2lkdGggJiYgaCA9PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBiZXN0V2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBiZXN0SGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmICh3IDw9IFJPVU5ESU5HX1dJRFRIX0NBUCAmJiAoYmVzdFdpZHRoID09IC0xIHx8CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmV1Y2xpZERpc3RTcXVhcmUodywgaCwgd2lkdGgsIGhlaWdodCkgPAorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpldWNsaWREaXN0U3F1YXJlKGJlc3RXaWR0aCwgYmVzdEhlaWdodCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KSkpIHsKKyAgICAgICAgICAgICAgICBiZXN0V2lkdGggPSB3OworICAgICAgICAgICAgICAgIGJlc3RIZWlnaHQgPSBoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJlc3RXaWR0aCA9PSAtMSkgeworICAgICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgbm8gY29uZmlndXJhdGlvbnMgZm9yIHRoaXMgZm9ybWF0IHdlcmUgbGlzdGVkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIG91dHB1dHMgdG8gdGhlIGNsb3NldCB3aWR0aC9oZWlnaHQKKyAgICBpZiAob3V0V2lkdGggIT0gTlVMTCkgeworICAgICAgICAqb3V0V2lkdGggPSBiZXN0V2lkdGg7CisgICAgfQorICAgIGlmIChvdXRIZWlnaHQgIT0gTlVMTCkgeworICAgICAgICAqb3V0SGVpZ2h0ID0gYmVzdEhlaWdodDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBmb3JtYXQgd2FzIGxpc3RlZAorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzUHVibGljRm9ybWF0KGludDMyX3QgZm9ybWF0KQoreworICAgIHN3aXRjaChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4ODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl84ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1k4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWTE2OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTY6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMDoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzEyOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXX09QQVFVRToKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0JMT0I6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4ODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUDoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitiaW5kZXI6OlN0YXR1cyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicCgKKyAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyYgc3RyZWFtSW5mbywgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCwKKyAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCisgICAgICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkgeworCisgICAgLy8gYnVmZmVyUHJvZHVjZXIgbXVzdCBiZSBub24tbnVsbAorICAgIGlmIChnYnAgPT0gbnVsbHB0cikgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBTdXJmYWNlIGlzIE5VTEwiLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIEFMT0dXKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgLy8gSEFDSyBiLzEwOTQ5MTA1CisgICAgLy8gUXVlcnkgY29uc3VtZXIgdXNhZ2UgYml0cyB0byBzZXQgYXN5bmMgb3BlcmF0aW9uIG1vZGUgZm9yCisgICAgLy8gR0xDb25zdW1lciB1c2luZyBjb250cm9sbGVkQnlBcHAgcGFyYW1ldGVyLgorICAgIGJvb2wgdXNlQXN5bmMgPSBmYWxzZTsKKyAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMDsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSBnYnAtPmdldENvbnN1bWVyVXNhZ2UoJmNvbnN1bWVyVXNhZ2UpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBjb25zdW1lciB1c2FnZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoY29uc3VtZXJVc2FnZSAmIEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkUpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJXMgd2l0aCBjb25zdW1lciB1c2FnZSBmbGFnOiAlIiBQUkl1NjQgIjogRm9yY2luZyBhc3luY2hyb25vdXMgbW9kZSBmb3IiCisgICAgICAgICAgICAgICAgInN0cmVhbSIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCksIGNvbnN1bWVyVXNhZ2UpOworICAgICAgICB1c2VBc3luYyA9IHRydWU7CisgICAgfQorCisgICAgdWludDY0X3QgZGlzYWxsb3dlZEZsYWdzID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVklERU9fRU5DT0RFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVDsKKyAgICB1aW50NjRfdCBhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKKyAgICBib29sIGZsZXhpYmxlQ29uc3VtZXIgPSAoY29uc3VtZXJVc2FnZSAmIGRpc2FsbG93ZWRGbGFncykgPT0gMCAmJgorICAgICAgICAgICAgKGNvbnN1bWVyVXNhZ2UgJiBhbGxvd2VkRmxhZ3MpICE9IDA7CisKKyAgICBzdXJmYWNlID0gbmV3IFN1cmZhY2UoZ2JwLCB1c2VBc3luYyk7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gc3VyZmFjZS5nZXQoKTsKKworICAgIGludCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQ7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfV0lEVEgsICZ3aWR0aCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIHdpZHRoOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0hFSUdIVCwgJmhlaWdodCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGhlaWdodDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGZvcm1hdDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0RFRkFVTFRfREFUQVNQQUNFLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQqPigmZGF0YVNwYWNlKSkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGRhdGFzcGFjZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIEZJWE1FOiByZW1vdmUgdGhpcyBvdmVycmlkZSBzaW5jZSB0aGUgZGVmYXVsdCBmb3JtYXQgc2hvdWxkIGJlCisgICAgLy8gICAgICAgSU1QTEVNRU5UQVRJT05fREVGSU5FRC4gYi85NDg3NDgyICYgYi8zNTMxNzk0NAorICAgIGlmICgoZm9ybWF0ID49IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4ICYmIGZvcm1hdCA8PSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCkgJiYKKyAgICAgICAgICAgICgoY29uc3VtZXJVc2FnZSAmIEdSQUxMT0NfVVNBR0VfSFdfTUFTSykgJiYKKyAgICAgICAgICAgICAoKGNvbnN1bWVyVXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSykgPT0gMCkpKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzOiBPdmVycmlkaW5nIGZvcm1hdCAlI3ggdG8gSU1QTEVNRU5UQVRJT05fREVGSU5FRCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSwgZm9ybWF0KTsKKyAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIH0KKyAgICAvLyBSb3VuZCBkaW1lbnNpb25zIHRvIHRoZSBuZWFyZXN0IGRpbWVuc2lvbnMgYXZhaWxhYmxlIGZvciB0aGlzIGZvcm1hdAorICAgIGlmIChmbGV4aWJsZUNvbnN1bWVyICYmIGlzUHVibGljRm9ybWF0KGZvcm1hdCkgJiYKKyAgICAgICAgICAgICFTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpyb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3Qod2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhLCAvKm91dCovJndpZHRoLCAvKm91dCovJmhlaWdodCkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogTm8gc3VwcG9ydGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aXRoICIKKyAgICAgICAgICAgICAgICAiZm9ybWF0ICUjeCBkZWZpbmVkLCBmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBzdHJlYW0iLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgaWYgKCFpc1N0cmVhbUluZm9WYWxpZCkgeworICAgICAgICBzdHJlYW1JbmZvLndpZHRoID0gd2lkdGg7CisgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBzdHJlYW1JbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgc3RyZWFtSW5mby5kYXRhU3BhY2UgPSBkYXRhU3BhY2U7CisgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSA9IGNvbnN1bWVyVXNhZ2U7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisgICAgaWYgKHdpZHRoICE9IHN0cmVhbUluZm8ud2lkdGgpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczpTdXJmYWNlIHdpZHRoIGRvZXNuJ3QgbWF0Y2g6ICVkIHZzICVkIiwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgd2lkdGgsIHN0cmVhbUluZm8ud2lkdGgpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGlmIChoZWlnaHQgIT0gc3RyZWFtSW5mby5oZWlnaHQpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczpTdXJmYWNlIGhlaWdodCBkb2Vzbid0IG1hdGNoOiAlZCB2cyAlZCIsCisgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBoZWlnaHQsIHN0cmVhbUluZm8uaGVpZ2h0KTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoZm9ybWF0ICE9IHN0cmVhbUluZm8uZm9ybWF0KSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6U3VyZmFjZSBmb3JtYXQgZG9lc24ndCBtYXRjaDogJWQgdnMgJWQiLAorICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZm9ybWF0LCBzdHJlYW1JbmZvLmZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgaWYgKGRhdGFTcGFjZSAhPSBzdHJlYW1JbmZvLmRhdGFTcGFjZSkgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczpTdXJmYWNlIGRhdGFTcGFjZSBkb2Vzbid0IG1hdGNoOiAlZCB2cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBkYXRhU3BhY2UsIHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy9BdCB0aGUgbmF0aXZlIHNpZGUsIHRoZXJlIGlzbid0IGEgd2F5IHRvIGNoZWNrIHdoZXRoZXIgMiBzdXJmYWNlcyBjb21lIGZyb20gdGhlIHNhbWUKKyAgICAgICAgLy9zdXJmYWNlIGNsYXNzIHR5cGUuIFVzZSB1c2FnZSBmbGFnIHRvIGFwcHJveGltYXRlIHRoZSBjb21wYXJpc29uLgorICAgICAgICBpZiAoY29uc3VtZXJVc2FnZSAhPSBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UpIHsKKyAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOlN1cmZhY2UgdXNhZ2UgZmxhZyBkb2Vzbid0IG1hdGNoICUiIFBSSXU2NCAiIHZzICUiIFBSSXU2NCAiIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGNvbnN1bWVyVXNhZ2UsIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSk7CisgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworCit2b2lkIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6Om1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgeworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyZWFtLT52M18yLnN0cmVhbVR5cGUgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICBzdHJlYW0tPnYzXzIud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOworICAgIHN0cmVhbS0+djNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKKyAgICBzdHJlYW0tPnYzXzIuZm9ybWF0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzdHJlYW1JbmZvLmZvcm1hdCk7CisgICAgYXV0byB1ID0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlOworICAgIGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhzdHJlYW1JbmZvLmZvcm1hdCwgJnUpOworICAgIHN0cmVhbS0+djNfMi51c2FnZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSh1KTsKKyAgICBzdHJlYW0tPnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKKyAgICBzdHJlYW0tPnYzXzIucm90YXRpb24gPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICBzdHJlYW0tPnYzXzIuaWQgPSAtMTsgLy8gSW52YWxpZCBzdHJlYW0gaWQKKyAgICBzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKKyAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSAwOworfQorCitiaW5kZXI6OlN0YXR1cyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCkgeworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpICB7CisgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7CisgICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtQnVmZmVyUHJvZHVjZXJzLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKKyAgICB9IGVsc2UgaWYgKChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgJiYgKCFkZWZlcnJlZENvbnN1bWVyKSkgeworICAgICAgICBBTE9HRSgiJXM6IE51bWJlciBvZiBjb25zdW1lcnMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiTm8gdmFsaWQgY29uc3VtZXJzLiIpOworICAgIH0KKworICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKKyAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7CisKKyAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgeworICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2VUeXBlID0gJWQuIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlVHlwZSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKSB7CisgICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBjYW1lcmFJZC5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOworICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTykgeworICAgICAgICAgICAgICAgIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCkgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogVHJ5IHRvIGNyZWF0ZSBhIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiBvbiBhIGRldmljZSIKKyAgICAgICAgICAgICAgICAiIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LiIsIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIGJpbmRlcjo6U3RhdHVzCiBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAogICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLCBib29sICplYXJseUV4aXQpIHsKLSAgICAvLyBUT0RPOiBodHRwOi8vYi8xNDgzMjkyOTggTW92ZSB0aGUgb3RoZXIgZGVwZW5kZW5jaWVzIGZyb20KLSAgICAvLyBDYW1lcmFEZXZpY2VDbGllbnQgaW50byBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLgotICAgIHJldHVybiBDYW1lcmFEZXZpY2VDbGllbnQ6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKHNlc3Npb25Db25maWd1cmF0aW9uLCBsb2dpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBkZXZpY2VJbmZvLCBnZXRNZXRhZGF0YSwgcGh5c2ljYWxDYW1lcmFJZHMsIHN0cmVhbUNvbmZpZ3VyYXRpb24sIGVhcmx5RXhpdCk7CisKKyAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7CisgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUsIGRldmljZUluZm8sIGxvZ2ljYWxDYW1lcmFJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKGVhcmx5RXhpdCA9PSBudWxscHRyKSB7CisgICAgICAgIFN0cmluZzggbXNnKCJlYXJseUV4aXQgbnVsbHB0ciIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgICplYXJseUV4aXQgPSBmYWxzZTsKKyAgICBhdXRvIHJldCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdD4gKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgLypvdXQqLyAmc3RyZWFtQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogRmFpbGVkIG1hcHBpbmcgb3BlcmF0aW5nIG1vZGUgJWQgcmVxdWVzdGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSwgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGJvb2wgaXNJbnB1dFZhbGlkID0gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0V2lkdGgoKSA+IDApICYmCisgICAgICAgICAgICAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSA+IDApICYmCisgICAgICAgICAgICAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRGb3JtYXQoKSA+IDApOworICAgIGF1dG8gb3V0cHV0Q29uZmlncyA9IHNlc3Npb25Db25maWd1cmF0aW9uLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisgICAgc2l6ZV90IHN0cmVhbUNvdW50ID0gb3V0cHV0Q29uZmlncy5zaXplKCk7CisgICAgc3RyZWFtQ291bnQgPSBpc0lucHV0VmFsaWQgPyBzdHJlYW1Db3VudCArIDEgOiBzdHJlYW1Db3VudDsKKyAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKKyAgICBzaXplX3Qgc3RyZWFtSWR4ID0gMDsKKyAgICBpZiAoaXNJbnB1dFZhbGlkKSB7CisgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10gPSB7ey8qc3RyZWFtSWQqLzAsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlOjpJTlBVVCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0V2lkdGgoKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkpLAorICAgICAgICAgICAgICAgIC8qdXNhZ2UqLyAwLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMH0sCisgICAgICAgICAgICAgICAgLypwaHlzaWNhbElkKi8gbnVsbHB0ciwgLypidWZmZXJTaXplKi8wfTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogb3V0cHV0Q29uZmlncykgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGJ1ZmZlclByb2R1Y2VycyA9CisgICAgICAgICAgICBpdC5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCk7CisgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IGl0LmlzRGVmZXJyZWQoKTsKKyAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChpdC5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOworICAgICAgICBzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzID0gYnVmZmVyUHJvZHVjZXJzLnNpemUoKTsKKyAgICAgICAgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCA9IGZhbHNlOworICAgICAgICBPdXRwdXRTdHJlYW1JbmZvIHN0cmVhbUluZm87CisKKyAgICAgICAgcmVzID0gY2hlY2tTdXJmYWNlVHlwZShudW1CdWZmZXJQcm9kdWNlcnMsIGRlZmVycmVkQ29uc3VtZXIsIGl0LmdldFN1cmZhY2VUeXBlKCkpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWRzLCBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZCk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWZlcnJlZENvbnN1bWVyKSB7CisgICAgICAgICAgICBzdHJlYW1JbmZvLndpZHRoID0gaXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ID0gaXQuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uZGF0YVNwYWNlID0gYW5kcm9pZF9kYXRhc3BhY2VfdDo6SEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgICAgICAgICAgYXV0byBzdXJmYWNlVHlwZSA9IGl0LmdldFN1cmZhY2VUeXBlKCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFOworICAgICAgICAgICAgaWYgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfQ09NUE9TRVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXBTdHJlYW1JbmZvKHN0cmVhbUluZm8sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKKyAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGJ1ZmZlclByb2R1Y2VyIDogYnVmZmVyUHJvZHVjZXJzKSB7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsRGV2aWNlSW5mbyA9IGdldE1ldGFkYXRhKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAoc3RyZWFtSW5mbywgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCA/IHBoeXNpY2FsRGV2aWNlSW5mbyA6IGRldmljZUluZm8gKTsKKworICAgICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgICAgIGlmICghaXNTdHJlYW1JbmZvVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBib29sIGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0oc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgYm9vbCBpc0hlaWNDb21wb3NpdGVTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNIZWljQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2UpOworICAgICAgICAgICAgICAgIGlmIChpc0RlcHRoQ29tcG9zaXRlU3RyZWFtIHx8IGlzSGVpY0NvbXBvc2l0ZVN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHRha2UgaW4gdG8gYWNjb3VudCB0aGF0IGNvbXBvc2l0ZSBzdHJlYW1zIGNhbiBoYXZlCisgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMuCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+IGNvbXBvc2l0ZVN0cmVhbXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlcHRoQ29tcG9zaXRlU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLCAmY29tcG9zaXRlU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mbywgJmNvbXBvc2l0ZVN0cmVhbXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgYWRkaW5nIGNvbXBvc2l0ZSBzdHJlYW1zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gaW50ZXJuYWwgc3RyZWFtcyBtZWFucyBjb21wb3NpdGUgc3RyZWFtIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgKmVhcmx5RXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db3VudCArPSBjb21wb3NpdGVTdHJlYW1zLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY29tcG9zaXRlU3RyZWFtIDogY29tcG9zaXRlU3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhjb21wb3NpdGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisKIH0KIAogfS8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgKaW5kZXggY2ZiOWYxNy4uNmNlMmNkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaApAQCAtMjMsNiArMjMsOSBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAKKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CisjaW5jbHVkZSA8ZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmg+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzEsNiArMzQsNDEgQEAKIAogY2xhc3MgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CiBwdWJsaWM6CisKKyAgICBzdGF0aWMgaW50NjRfdCBldWNsaWREaXN0U3F1YXJlKGludDMyX3QgeDAsIGludDMyX3QgeTAsIGludDMyX3QgeDEsIGludDMyX3QgeTEpOworCisgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKKyAgICAvLyBhIHdpZHRoIDw9IFJPVU5ESU5HX1dJRFRIX0NBUAorICAgIHN0YXRpYyBib29sIHJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLAorICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqIG91dFdpZHRoLCAvKm91dCovaW50MzJfdCogb3V0SGVpZ2h0KTsKKworICAgIC8vY2hlY2sgaWYgZm9ybWF0IGlzIG5vdCBjdXN0b20gZm9ybWF0CisgICAgc3RhdGljIGJvb2wgaXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpOworCisgICAgLy8gQ3JlYXRlIGEgU3VyZmFjZSBmcm9tIGFuIElHcmFwaGljQnVmZmVyUHJvZHVjZXIuIFJldHVybnMgZXJyb3IgaWYKKyAgICAvLyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyJ3MgcHJvcGVydHkgZG9lc24ndCBtYXRjaCB3aXRoIHN0cmVhbUluZm8KKyAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgY3JlYXRlU3VyZmFjZUZyb21HYnAoCisgICAgICAgIGNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm8mIHN0cmVhbUluZm8sIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQsCisgICAgICAgIHNwPFN1cmZhY2U+JiBzdXJmYWNlLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLAorICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworCisgICAgc3RhdGljIHZvaWQgbWFwU3RyZWFtSW5mbyhjb25zdCBjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIHBoeXNpY2FsQ2FtZXJhSWQgcGFzc2VkIGluIGlzIHNwcG9ydGVkIGJ5IHRoZSBjYW1lcmEKKyAgICAvLyBkZXZpY2UuCisgICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGh5c2ljYWxDYW1lcmFJZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywgY29uc3QgU3RyaW5nOCAmcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkKTsKKworICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjaGVja1N1cmZhY2VUeXBlKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsCisgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciwgaW50IHN1cmZhY2VUeXBlKTsKKworICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjaGVja09wZXJhdGluZ01vZGUoaW50IG9wZXJhdGluZ01vZGUsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7CisKICAgICAvLyB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgQUlETCBTZXNzaW9uQ29uZmlndXJhdGlvbiB0byBISURMCiAgICAgLy8gc3RyZWFtQ29uZmlndXJhdGlvbi4gQWxzbyBjaGVja3MgZm9yIHZhbGlkaXR5IG9mIFNlc3Npb25Db25maWd1cmF0aW9uIGFuZAogICAgIC8vIHJldHVybnMgYSBub24tb2sgYmluZGVyOjpTdGF0dXMgaWYgdGhlIHBhc3NlZCBpbiBzZXNzaW9uIGNvbmZpZ3VyYXRpb24KQEAgLTQxLDYgKzc5LDEwIEBACiAgICAgICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKICAgICAgICAgICAgIGJvb2wgKmVhcmx5RXhpdCk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDQ7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBST1VORElOR19XSURUSF9DQVAgPSAxOTIwOwogfTsKIAogfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTY1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmNwcApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2Vzc2lvblN0YXRzQnVpbGRlciIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uU3RhdHNCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgU2Vzc2lvblN0YXRzQnVpbGRlcjo6YWRkU3RyZWFtKGludCBpZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Mb2NrKTsKKyAgICBTdHJlYW1TdGF0cyBzdGF0czsKKyAgICBtU3RhdHNNYXAuZW1wbGFjZShpZCwgc3RhdHMpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2Vzc2lvblN0YXRzQnVpbGRlcjo6cmVtb3ZlU3RyZWFtKGludCBpZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Mb2NrKTsKKyAgICBtU3RhdHNNYXAuZXJhc2UoaWQpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBTZXNzaW9uU3RhdHNCdWlsZGVyOjpidWlsZEFuZFJlc2V0KGludDY0X3QqIHJlcXVlc3RDb3VudCwKKyAgICAgICAgaW50NjRfdCogZXJyb3JSZXN1bHRDb3VudCwgYm9vbCogZGV2aWNlRXJyb3IsCisgICAgICAgIHN0ZDo6bWFwPGludCwgU3RyZWFtU3RhdHM+ICpzdGF0c01hcCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Mb2NrKTsKKyAgICAqcmVxdWVzdENvdW50ID0gbVJlcXVlc3RDb3VudDsKKyAgICAqZXJyb3JSZXN1bHRDb3VudCA9IG1FcnJvclJlc3VsdENvdW50OworICAgICpkZXZpY2VFcnJvciA9IG1EZXZpY2VFcnJvcjsKKyAgICAqc3RhdHNNYXAgPSBtU3RhdHNNYXA7CisKKyAgICAvLyBSZXNldCBpbnRlcm5hbCBzdGF0ZXMKKyAgICBtUmVxdWVzdENvdW50ID0gMDsKKyAgICBtRXJyb3JSZXN1bHRDb3VudCA9IDA7CisgICAgbUNvdW50ZXJTdG9wcGVkID0gZmFsc2U7CisgICAgbURldmljZUVycm9yID0gZmFsc2U7CisgICAgZm9yIChhdXRvJiBzdHJlYW1TdGF0cyA6IG1TdGF0c01hcCkgeworICAgICAgICBzdHJlYW1TdGF0cy5zZWNvbmQubVJlcXVlc3RlZEZyYW1lQ291bnQgPSAwOworICAgICAgICBzdHJlYW1TdGF0cy5zZWNvbmQubURyb3BwZWRGcmFtZUNvdW50ID0gMDsKKyAgICAgICAgc3RyZWFtU3RhdHMuc2Vjb25kLm1Db3VudGVyU3RvcHBlZCA9IGZhbHNlOworICAgICAgICBzdHJlYW1TdGF0cy5zZWNvbmQubVN0YXJ0TGF0ZW5jeU1zID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgU2Vzc2lvblN0YXRzQnVpbGRlcjo6c3RhcnRDb3VudGVyKGludCBpZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Mb2NrKTsKKyAgICBtU3RhdHNNYXBbaWRdLm1Db3VudGVyU3RvcHBlZCA9IGZhbHNlOworfQorCit2b2lkIFNlc3Npb25TdGF0c0J1aWxkZXI6OnN0b3BDb3VudGVyKGludCBpZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Mb2NrKTsKKyAgICBtU3RhdHNNYXBbaWRdLm1Db3VudGVyU3RvcHBlZCA9IHRydWU7Cit9CisKK3ZvaWQgU2Vzc2lvblN0YXRzQnVpbGRlcjo6aW5jQ291bnRlcihpbnQgaWQsIGJvb2wgZHJvcHBlZCwgaW50MzJfdCBjYXB0dXJlTGF0ZW5jeU1zKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUxvY2spOworICAgIGF1dG8gaXQgPSBtU3RhdHNNYXAuZmluZChpZCk7CisgICAgaWYgKGl0ICE9IG1TdGF0c01hcC5lbmQoKSkgeworICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLm1Db3VudGVyU3RvcHBlZCkgeworICAgICAgICAgICAgIGl0LT5zZWNvbmQubVJlcXVlc3RlZEZyYW1lQ291bnQrKzsKKyAgICAgICAgICAgICBpZiAoZHJvcHBlZCkgeworICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLm1Ecm9wcGVkRnJhbWVDb3VudCsrOworICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNlY29uZC5tUmVxdWVzdGVkRnJhbWVDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgIC8vIFRoZSBjYXB0dXJlIGxhdGVuY3kgZm9yIHRoZSBmaXJzdCByZXF1ZXN0LgorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLm1TdGFydExhdGVuY3lNcyA9IGNhcHR1cmVMYXRlbmN5TXM7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTZXNzaW9uU3RhdHNCdWlsZGVyOjpzdG9wQ291bnRlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtTG9jayk7CisgICAgbUNvdW50ZXJTdG9wcGVkID0gdHJ1ZTsKKyAgICBmb3IgKGF1dG8mIHN0cmVhbVN0YXRzIDogbVN0YXRzTWFwKSB7CisgICAgICAgIHN0cmVhbVN0YXRzLnNlY29uZC5tQ291bnRlclN0b3BwZWQgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBTZXNzaW9uU3RhdHNCdWlsZGVyOjppbmNSZXN1bHRDb3VudGVyKGJvb2wgZHJvcHBlZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Mb2NrKTsKKyAgICBpZiAoIW1Db3VudGVyU3RvcHBlZCkgeworICAgICAgICBtUmVxdWVzdENvdW50ICsrOworICAgICAgICBpZiAoZHJvcHBlZCkgbUVycm9yUmVzdWx0Q291bnQrKzsKKyAgICB9Cit9CisKK3ZvaWQgU2Vzc2lvblN0YXRzQnVpbGRlcjo6b25EZXZpY2VFcnJvcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtTG9jayk7CisgICAgbURldmljZUVycm9yID0gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQzNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVklDRV9VVElMU19TRVNTSU9OX1NUQVRTX0JVSUxERVJfSAorI2RlZmluZSBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfU0VTU0lPTl9TVEFUU19CVUlMREVSX0gKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEhlbHBlciBjbGFzcyB0byBidWlsZCBzdHJlYW0gc3RhdHMKK3N0cnVjdCBTdHJlYW1TdGF0cyB7CisgICAgaW50NjRfdCBtUmVxdWVzdGVkRnJhbWVDb3VudDsKKyAgICBpbnQ2NF90IG1Ecm9wcGVkRnJhbWVDb3VudDsKKyAgICBib29sIG1Db3VudGVyU3RvcHBlZDsKKyAgICBpbnQzMl90IG1TdGFydExhdGVuY3lNczsKKworICAgIFN0cmVhbVN0YXRzKCkgOiBtUmVxdWVzdGVkRnJhbWVDb3VudCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIG1Ecm9wcGVkRnJhbWVDb3VudCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIG1Db3VudGVyU3RvcHBlZChmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICBtU3RhcnRMYXRlbmN5TXMoMCkge30KK307CisKKy8vIEhlbHBlciBjbGFzcyB0byBidWlsZCBzZXNzaW9uIHN0YXRzCitjbGFzcyBTZXNzaW9uU3RhdHNCdWlsZGVyIHsKK3B1YmxpYzoKKworICAgIHN0YXR1c190IGFkZFN0cmVhbShpbnQgc3RyZWFtSWQpOworICAgIHN0YXR1c190IHJlbW92ZVN0cmVhbShpbnQgc3RyZWFtSWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBzZXNzaW9uIHN0YXRpc3RpY3MgYW5kIHJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0ZXMuCisgICAgdm9pZCBidWlsZEFuZFJlc2V0KC8qb3V0Ki9pbnQ2NF90KiByZXF1ZXN0Q291bnQsCisgICAgICAgICAgICAvKm91dCovaW50NjRfdCogZXJyb3JSZXN1bHRDb3VudCwKKyAgICAgICAgICAgIC8qb3V0Ki9ib29sKiBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6Om1hcDxpbnQsIFN0cmVhbVN0YXRzPiAqc3RhdHNNYXApOworCisgICAgLy8gU3RyZWFtIHNwZWNpZmljIGNvdW50ZXIKKyAgICB2b2lkIHN0YXJ0Q291bnRlcihpbnQgc3RyZWFtSWQpOworICAgIHZvaWQgc3RvcENvdW50ZXIoaW50IHN0cmVhbUlkKTsKKyAgICB2b2lkIGluY0NvdW50ZXIoaW50IHN0cmVhbUlkLCBib29sIGRyb3BwZWQsIGludDMyX3QgY2FwdHVyZUxhdGVuY3lNcyk7CisKKyAgICAvLyBTZXNzaW9uIHNwZWNpZmljIGNvdW50ZXIKKyAgICB2b2lkIHN0b3BDb3VudGVyKCk7CisgICAgdm9pZCBpbmNSZXN1bHRDb3VudGVyKGJvb2wgZHJvcHBlZCk7CisgICAgdm9pZCBvbkRldmljZUVycm9yKCk7CisKKyAgICBTZXNzaW9uU3RhdHNCdWlsZGVyKCkgOiBtUmVxdWVzdENvdW50KDApLCBtRXJyb3JSZXN1bHRDb3VudCgwKSwKKyAgICAgICAgICAgICBtQ291bnRlclN0b3BwZWQoZmFsc2UpLCBtRGV2aWNlRXJyb3IoZmFsc2UpIHt9Citwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgaW50NjRfdCBtUmVxdWVzdENvdW50OworICAgIGludDY0X3QgbUVycm9yUmVzdWx0Q291bnQ7CisgICAgYm9vbCBtQ291bnRlclN0b3BwZWQ7CisgICAgYm9vbCBtRGV2aWNlRXJyb3I7CisgICAgLy8gTWFwIGZyb20gc3RyZWFtIGlkIHRvIHN0cmVhbSBzdGF0aXN0aWNzCisgICAgc3RkOjptYXA8aW50LCBTdHJlYW1TdGF0cz4gbVN0YXRzTWFwOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VSVklDRV9VVElMU19TRVNTSU9OX1NUQVRTX0JVSUxERVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCmluZGV4IGM0ZWZiYWEuLmRjMDc3M2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTE1LDI0ICsxNSwxMCBAQAogICAgICAgICAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCIsCiAgICAgXSwKIAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBwcm9kdWN0X3ZhcmlhYmxlczogewotICAgICAgICAgICAgICAgIG1hbGxvY19ub3Rfc3ZlbHRlOiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNjdWRvIGluY3JlYXNlcyBtZW1vcnkgZm9vdHByaW50LCBzbyBvbmx5IGVuYWJsZSBvbgotICAgICAgICAgICAgICAgICAgICAvLyBub24tc3ZlbHRlIGRldmljZXMuCi0gICAgICAgICAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbImxpYmNfc2N1ZG8iXSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICB9LAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAKLSAgICBpbml0X3JjOiBbIm1lZGlhc3djb2RlYy5yYyJdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDk2NjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNlcnZpY2UgbWVkaWEuc3djb2RlYyAvc3lzdGVtL2Jpbi9tZWRpYXN3Y29kZWMKLSAgICBjbGFzcyBtYWluCi0gICAgdXNlciBtZWRpYWNvZGVjCi0gICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQotICAgIHVwZGF0YWJsZQotICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKaW5kZXggMGIyNWQ2Mi4uMDNlMWU0MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCkBAIC0zNSwyMCArMzUsNiBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWwiLAogICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImJpb25pY19saWJjX3BsYXRmb3JtX2hlYWRlcnMiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KLSAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgIH0sCiAgICAgaW5pdF9yYzogWyJtZWRpYWV4dHJhY3Rvci5yYyJdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCA5OTkyZDFjLi43MWE1YmZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTM5LDIzICszOSwyMyBAQAogCiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvcigKICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklEYXRhU291cmNlPiYgcmVtb3RlU291cmNlLAotICAgICAgICBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCisgICAgICAgIGNvbnN0IDo6c3RkOjpvcHRpb25hbDwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCiAgICAgICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJTWVkaWFFeHRyYWN0b3I+KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBBTE9HVigiQEBAIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvciBmb3IgJXMiLCBtaW1lLmdldCgpLT5jX3N0cigpKTsKKyAgICBBTE9HVigiQEBAIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvciBmb3IgJXMiLCBtaW1lID8gbWltZS0+Y19zdHIoKSA6IG51bGxwdHIpOwogCiAgICAgc3A8RGF0YVNvdXJjZT4gbG9jYWxTb3VyY2UgPSBDcmVhdGVEYXRhU291cmNlRnJvbUlEYXRhU291cmNlKHJlbW90ZVNvdXJjZSk7CiAKICAgICBNZWRpYUJ1ZmZlcjo6dXNlU2hhcmVkTWVtb3J5KCk7CiAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZUZyb21TZXJ2aWNlKAogICAgICAgICAgICAgbG9jYWxTb3VyY2UsCi0gICAgICAgICAgICBtaW1lLmdldCgpID8gbWltZS5nZXQoKS0+Y19zdHIoKSA6IG51bGxwdHIpOworICAgICAgICAgICAgbWltZSA/IG1pbWUtPmNfc3RyKCkgOiBudWxscHRyKTsKIAogICAgIEFMT0dWKCJleHRyYWN0b3Igc2VydmljZSBjcmVhdGVkICVwICglcykiLAogICAgICAgICAgICAgZXh0cmFjdG9yLmdldCgpLAogICAgICAgICAgICAgZXh0cmFjdG9yID09IG51bGxwdHIgPyAiIiA6IGV4dHJhY3Rvci0+bmFtZSgpKTsKIAogICAgIGlmIChleHRyYWN0b3IgIT0gbnVsbHB0cikgewotICAgICAgICByZWdpc3Rlck1lZGlhRXh0cmFjdG9yKGV4dHJhY3RvciwgbG9jYWxTb3VyY2UsIG1pbWUuZ2V0KCkgPyBtaW1lLmdldCgpLT5jX3N0cigpIDogbnVsbHB0cik7CisgICAgICAgIHJlZ2lzdGVyTWVkaWFFeHRyYWN0b3IoZXh0cmFjdG9yLCBsb2NhbFNvdXJjZSwgbWltZSA/IG1pbWUtPmNfc3RyKCkgOiBudWxscHRyKTsKICAgICB9CiAgICAgKl9haWRsX3JldHVybiA9IGV4dHJhY3RvcjsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oCmluZGV4IDFiNDBiZjkuLjAwODFlN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oCkBAIC0zMyw3ICszMyw3IEBACiAKICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWFrZUV4dHJhY3RvcigKICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJRGF0YVNvdXJjZT4mIHNvdXJjZSwKLSAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPCA6OnN0ZDo6c3RyaW5nPiAmbWltZSwKKyAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpvcHRpb25hbDwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCiAgICAgICAgICAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SU1lZGlhRXh0cmFjdG9yPiogX2FpZGxfcmV0dXJuKTsKIAogICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtYWtlSURhdGFTb3VyY2UoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAppbmRleCBmMjE1NzRmLi5iN2I1MWE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKQEAgLTI4LDggKzI4LDYgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAotI2luY2x1ZGUgPGJpb25pYy9yZXNlcnZlZF9zaWduYWxzLmg+Ci0KIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgogI2luY2x1ZGUgIm1pbmlqYWlsLmgiCkBAIC01MCwxMCArNDgsNiBAQAogCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gRG8gbm90IGFzc2lzdCBwbGF0Zm9ybSBwcm9maWxlcnMgKHJlbGV2YW50IG9ubHkgb24gZGVidWcgYnVpbGRzKS4KLSAgICAvLyBPdGhlcndpc2UsIHRoZSBzaWduYWwgaGFuZGxlciBjYW4gdmlvbGF0ZSB0aGUgc2VjY29tcCBwb2xpY3kuCi0gICAgc2lnbmFsKEJJT05JQ19TSUdOQUxfUFJPRklMRVIsIFNJR19JR04pOwotCiAgICAgLy9iLzYyMjU1OTU5OiB0aGlzIGZvcmNlcyBsaWJ1dGlzLnNvIHRvIGRsb3BlbiB2ZW5kb3IgdmVyc2lvbiBvZiBsaWJ1dGlscy5zbwogICAgIC8vYmVmb3JlIG1pbmlqYWlsIGlzIG9uLiBUaGlzIGlzIGRpcnR5IGJ1dCByZXF1aXJlZCBzaW5jZSBzb21lIHN5c2NhbGxzIHN1Y2gKICAgICAvL2FzIHByZWFkNjQgYXJlIHVzZWQgYnkgbGlua2VyIGJ1dCBhcmVuJ3QgYWxsb3dlZCBpbiB0aGUgbWluaWphaWwuIEJ5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAppbmRleCA3NGI2M2Q1Li4zYTI3YTQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFsb2dzZXJ2aWNlIiwKIAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmYWFhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKK2NjX2Z1enogeworICAgIG5hbWU6ICJtZWRpYV9sb2dfZnV6emVyIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFsb2dzZXJ2aWNlIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhX2xvZ19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9SRUFETUUubWQgYi9zZXJ2aWNlcy9tZWRpYWxvZy9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OWU1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTAgQEAKKyMgRnV6emVyIGZvciBsaWJtZWRpYWxvZ3NlcnZpY2UKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGxpYm1lZGlhbG9nc2VydmljZSBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK3NlcnZpY2UgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworbWVkaWFsb2dzZXJ2aWNlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIFdyaXRlciBuYW1lIChwYXJhbWV0ZXIgbmFtZTogYHdyaXRlck5hbWVJZHhgKQorMi4gTG9nIHNpemUgKHBhcmFtZXRlciBuYW1lOiBgbG9nU2l6ZWApCiszLiBFbmFibGUgZHVtcCBiZWZvcmUgdW5yZ2lzdGVyIEFQSSAocGFyYW1ldGVyIG5hbWU6IGBzaG91bGREdW1wQmVmb3JlVW5yZWdpc3RlcmApCis1LiBzaXplIG9mIHN0cmluZyBmb3IgbG9nIGR1bXAgKHBhcmFtZXRlciBuYW1lOiBgbnVtYmVyT2ZMaW5lc2ApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgd3JpdGVyTmFtZUlkeGAgfCAwLiBgMGAgMS4gYDFgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgbG9nU2l6ZWAgfCBJbiB0aGUgcmFuZ2UgYDI1NiB0byA2NTUzNmAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBzaG91bGREdW1wQmVmb3JlVW5yZWdpc3RlcmAgfCAwLiBgMGAgMS4gYDFgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgbnVtYmVyT2ZMaW5lc2AgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gNjU1MzVgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgbWVkaWFfbG9nX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWVkaWFfbG9nX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21lZGlhX2xvZ19mdXp6ZXIvbWVkaWFfbG9nX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9mdXp6ZXIvbWVkaWFfbG9nX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9mdXp6ZXIvbWVkaWFfbG9nX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1MGQwZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9tZWRpYV9sb2dfZnV6emVyLmNwcApAQCAtMCwwICsxLDc2IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorCitjb25zdGV4cHIgY29uc3QgY2hhcioga1dyaXRlck5hbWVzWzJdID0geyJGYXN0TWl4ZXIiLCAiRmFzdENhcHR1cmUifTsKK2NvbnN0ZXhwciBzaXplX3Qga01pblNpemUgPSAweDEwMDsKK2NvbnN0ZXhwciBzaXplX3Qga01heFNpemUgPSAweDEwMDAwOworY29uc3RleHByIHNpemVfdCBrTG9nTWVtb3J5U2l6ZSA9IDQwMCAqIDEwMjQ7Citjb25zdGV4cHIgc2l6ZV90IGtNYXhOdW1MaW5lcyA9IFVTSFJUX01BWDsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1lZGlhTG9nRnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIGluaXQoKTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgICBwcml2YXRlOgorICAgIHNwPE1lbW9yeURlYWxlcj4gbU1lbW9yeURlYWxlciA9IG51bGxwdHI7CisgICAgc3A8TWVkaWFMb2dTZXJ2aWNlPiBtU2VydmljZSA9IG51bGxwdHI7Cit9OworCit2b2lkIE1lZGlhTG9nRnV6emVyOjppbml0KCkgeworICAgIHNldHVpZChBSURfTUVESUEpOworICAgIG1TZXJ2aWNlID0gbmV3IE1lZGlhTG9nU2VydmljZSgpOworICAgIG1NZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTWVkaWFMb2dGdXp6ZXIiLCBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKTsKK30KKwordm9pZCBNZWRpYUxvZ0Z1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgc2l6ZV90IHdyaXRlck5hbWVJZHggPQorICAgICAgICBmdXp6ZWREYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHN0ZDo6c2l6ZShrV3JpdGVyTmFtZXMpIC0gMSk7CisgICAgYm9vbCBzaG91bGREdW1wQmVmb3JlVW5yZWdpc3RlciA9IGZ1enplZERhdGFQcm92aWRlci5Db25zdW1lQm9vbCgpOworICAgIHNpemVfdCBsb2dTaXplID0gZnV6emVkRGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PihrTWluU2l6ZSwga01heFNpemUpOworICAgIHNwPElNZW1vcnk+IGxvZ0J1ZmZlciA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShsb2dTaXplKSk7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIHNpemVfdCBudW1iZXJPZkxpbmVzID0gZnV6emVkRGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBrTWF4TnVtTGluZXMpOworICAgIGZvciAoc2l6ZV90IGxpbmVJZHggPSAwOyBsaW5lSWR4IDwgbnVtYmVyT2ZMaW5lczsgKytsaW5lSWR4KSB7CisgICAgICAgIGFyZ3MuYWRkKHN0YXRpY19jYXN0PFN0cmluZzE2PihmdXp6ZWREYXRhUHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpKTsKKyAgICB9CisgICAgY29uc3QgY2hhciogZmlsZU5hbWUgPSAibG9nRHVtcEZpbGUiOworICAgIGludCBmZCA9IG1lbWZkX2NyZWF0ZShmaWxlTmFtZSwgTUZEX0FMTE9XX1NFQUxJTkcpOworICAgIGZ1enplZERhdGFQcm92aWRlci5Db25zdW1lRGF0YShsb2dCdWZmZXItPnVuc2VjdXJlUG9pbnRlcigpLCBsb2dCdWZmZXItPnNpemUoKSk7CisgICAgbVNlcnZpY2UtPnJlZ2lzdGVyV3JpdGVyKGxvZ0J1ZmZlciwgbG9nU2l6ZSwga1dyaXRlck5hbWVzW3dyaXRlck5hbWVJZHhdKTsKKyAgICBpZiAoc2hvdWxkRHVtcEJlZm9yZVVucmVnaXN0ZXIpIHsKKyAgICAgICAgbVNlcnZpY2UtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICBtU2VydmljZS0+dW5yZWdpc3RlcldyaXRlcihsb2dCdWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXJ2aWNlLT51bnJlZ2lzdGVyV3JpdGVyKGxvZ0J1ZmZlcik7CisgICAgICAgIG1TZXJ2aWNlLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBNZWRpYUxvZ0Z1enplciBtZWRpYUxvZ0Z1enplciA9IE1lZGlhTG9nRnV6emVyKCk7CisgICAgbWVkaWFMb2dGdXp6ZXIuaW5pdCgpOworICAgIG1lZGlhTG9nRnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IDkxNTkwZTEuLjNiYjcwZjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFtZXRyaWNzc2VydmljZSIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgIm1lZGlhbWV0cmljc19mbGFnc19kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCmluZGV4IGNjYTZiNDEuLjM0YmUwYjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogI2luY2x1ZGUgPHN5cy90aW1lcmZkLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogLy8gcHJvcGVydHkgdG8gZGlzYWJsZSBhdWRpbyBwb3dlciB1c2UgbWV0cmljcyBmZWF0dXJlLCBkZWZhdWx0IGlzIGVuYWJsZWQKICNkZWZpbmUgUFJPUF9BVURJT19NRVRSSUNTX0RJU0FCTEVEICJwZXJzaXN0Lm1lZGlhLmF1ZGlvX21ldHJpY3MucG93ZXJfdXNhZ2VfZGlzYWJsZWQiCkBAIC0yMDAsNiArMjAwLDM0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgQXVkaW9Qb3dlclVzYWdlOjpzYXZlQXNJdGVtc19sKAorICAgICAgICBpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbl9ucywgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wpCit7CisgICAgQUxPR1YoIiVzOiAoJSN4LCAlZCwgJWxsZCwgJWYpIiwgX19mdW5jX18sIGRldmljZSwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkdXJhdGlvbl9ucywgYXZlcmFnZV92b2wgKTsKKyAgICBpZiAoZHVyYXRpb25fbnMgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2tpcCBkdXJhdGlvbiAwIHVzYWdlCisgICAgfQorICAgIGlmIChkZXZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsgLy9pZ25vcmUgdW5rbm93biBkZXZpY2UKKyAgICB9CisKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGNvbnN0IGludDMyX3QgaW5wdXRfYml0ID0gZGV2aWNlICYgSU5QVVRfREVWSUNFX0JJVDsKKyAgICBpbnQzMl90IGRldmljZV9iaXRzID0gZGV2aWNlIF4gaW5wdXRfYml0OworCisgICAgd2hpbGUgKGRldmljZV9iaXRzICE9IDApIHsKKyAgICAgICAgaW50MzJfdCB0bXBfZGV2aWNlID0gZGV2aWNlX2JpdHMgJiAtZGV2aWNlX2JpdHM7IC8vIGdldCBsb3dlc3QgYml0CisgICAgICAgIGRldmljZV9iaXRzIF49IHRtcF9kZXZpY2U7ICAvLyBjbGVhciBsb3dlc3QgYml0CisgICAgICAgIHRtcF9kZXZpY2UgfD0gaW5wdXRfYml0OyAgICAvLyByZXN0b3JlIGlucHV0IGJpdAorICAgICAgICByZXQgPSBzYXZlQXNJdGVtX2wodG1wX2RldmljZSwgZHVyYXRpb25fbnMsIHR5cGUsIGF2ZXJhZ2Vfdm9sKTsKKworICAgICAgICBBTE9HVigiJXM6IGRldmljZSAlI3ggcmVjb3JkZWQsIHJlbWFpbmluZyBkZXZpY2VfYml0cyA9ICUjeCIsIF9fZnVuY19fLAorICAgICAgICAgICAgdG1wX2RldmljZSwgZGV2aWNlX2JpdHMpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCiB2b2lkIEF1ZGlvUG93ZXJVc2FnZTo6Y2hlY2tUcmFja1JlY29yZCgKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sIGJvb2wgaXNUcmFjaykKIHsKQEAgLTI0NSw3ICsyNzMsNyBAQAogICAgICAgICBBTE9HVigiZGV2aWNlID0gJXMgPT4gJWQiLCBkZXZpY2Vfc3RyaW5ncy5jX3N0cigpLCBkZXZpY2UpOwogICAgIH0KICAgICBzdGQ6OmxvY2tfZ3VhcmQgbChtTG9jayk7Ci0gICAgc2F2ZUFzSXRlbV9sKGRldmljZSwgZGV2aWNlVGltZU5zLCB0eXBlLCBkZXZpY2VWb2x1bWUpOworICAgIHNhdmVBc0l0ZW1zX2woZGV2aWNlLCBkZXZpY2VUaW1lTnMsIHR5cGUsIGRldmljZVZvbHVtZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb3dlclVzYWdlOjpjaGVja01vZGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0pCkBAIC0yNjIsNyArMjkwLDcgQEAKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKICAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZENhbGxOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIGR1cmF0aW9uTnM7Ci0gICAgICAgICAgICBzYXZlQXNJdGVtX2wobVByaW1hcnlEZXZpY2UsIGR1cmF0aW9uTnMsIFZPSUNFX0NBTExfVFlQRSwgbURldmljZVZvbHVtZSk7CisgICAgICAgICAgICBzYXZlQXNJdGVtc19sKG1QcmltYXJ5RGV2aWNlLCBkdXJhdGlvbk5zLCBWT0lDRV9DQUxMX1RZUEUsIG1EZXZpY2VWb2x1bWUpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtb2RlID09ICJBVURJT19NT0RFX0lOX0NBTEwiKSB7IC8vIGVudGVyaW5nIGNhbGwgbW9kZQogICAgICAgICBtU3RhcnRDYWxsTnMgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsgLy8gYWR2aXNvcnkgb25seQpAQCAtMzIxLDcgKzM0OSw3IEBACiAgICAgICAgIGlmIChkdXJhdGlvbk5zID4gMCkgewogICAgICAgICAgICAgbURldmljZVZvbHVtZSA9IChtRGV2aWNlVm9sdW1lICogZG91YmxlKG1Wb2x1bWVUaW1lTnMgLSBtRGV2aWNlVGltZU5zKSArCiAgICAgICAgICAgICAgICAgICAgIG1Wb2ljZVZvbHVtZSAqIGRvdWJsZShlbmREZXZpY2VOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIGR1cmF0aW9uTnM7Ci0gICAgICAgICAgICBzYXZlQXNJdGVtX2wobVByaW1hcnlEZXZpY2UsIGR1cmF0aW9uTnMsIFZPSUNFX0NBTExfVFlQRSwgbURldmljZVZvbHVtZSk7CisgICAgICAgICAgICBzYXZlQXNJdGVtc19sKG1QcmltYXJ5RGV2aWNlLCBkdXJhdGlvbk5zLCBWT0lDRV9DQUxMX1RZUEUsIG1EZXZpY2VWb2x1bWUpOwogICAgICAgICB9CiAgICAgICAgIC8vIHJlc2V0IHN0YXRpc3RpY3MKICAgICAgICAgbURldmljZVZvbHVtZSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmgKaW5kZXggNDQ2ZmY0Zi4uYjcwNWE2YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvUG93ZXJVc2FnZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuaApAQCAtODUsNiArODUsOCBAQAogICAgICAgICAgUkVRVUlSRVMobUxvY2spOwogICAgIHN0YXRpYyB2b2lkIHNlbmRJdGVtKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKTsKICAgICB2b2lkIGNvbGxlY3QoKTsKKyAgICBib29sIHNhdmVBc0l0ZW1zX2woaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb24sIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sKQorICAgICAgICAgUkVRVUlSRVMobUxvY2spOwogCiAgICAgQXVkaW9BbmFseXRpY3MgKiBjb25zdCBtQXVkaW9BbmFseXRpY3M7CiAgICAgY29uc3QgYm9vbCBtRGlzYWJsZWQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5jcHAKaW5kZXggYWE0NDQ0Ny4uNWQwNDRiYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmNwcApAQCAtNzYsNiArNzYsNyBAQAogICAgICAgICB7IkFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSIsICAgICAgICAgMUxMIDw8IDI3fSwKICAgICAgICAgeyJBVURJT19ERVZJQ0VfSU5fREVGQVVMVCIsICAgICAgICAgICAgICAgIDFMTCA8PCAyOH0sCiAgICAgICAgIC8vIFIgdmFsdWVzIGFib3ZlLgorICAgICAgICB7IkFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCIsICAgICAgICAgICAgMUxMIDw8IDI5fSwKICAgICB9OwogICAgIHJldHVybiBtYXA7CiB9CkBAIC0xMjEsNiArMTIyLDggQEAKICAgICAgICAgeyJBVURJT19ERVZJQ0VfT1VUX0VDSE9fQ0FOQ0VMTEVSIiwgICAgICAgICAgICAxTEwgPDwgMjl9LAogICAgICAgICB7IkFVRElPX0RFVklDRV9PVVRfREVGQVVMVCIsICAgICAgICAgICAgICAgICAgIDFMTCA8PCAzMH0sCiAgICAgICAgIC8vIFIgdmFsdWVzIGFib3ZlLgorICAgICAgICB7IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiLCAgICAgICAgICAgICAgIDFMTCA8PCAzMX0sCisgICAgICAgIHsiQVVESU9fREVWSUNFX09VVF9CTEVfU1BBRUtFUiIsICAgICAgICAgICAgICAgMUxMIDw8IDMyfSwKICAgICB9OwogICAgIHJldHVybiBtYXA7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0Yzg2NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplciIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NzZXJ2aWNlIiwKKyAgICAgICAgImxpYnBsYXRmb3JtcHJvdG9zIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhdHNsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFtZXRyaWNzIiwKKyAgICAgICAgInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9SRUFETUUubWQgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTM4MzBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NCBAQAorIyBGdXp6ZXIgZm9yIGxpYm1lZGlhbWV0cmljc3NlcnZpY2UKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGxpYm1lZGlhbWV0cmljc3NlcnZpY2UgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlCit1bmRlcnN0YW5kaW5nIG9mIHRoZSBzZXJ2aWNlIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK01lZGlhIE1ldHJpY3MgU2VydmljZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisxLiBNZWRpYSBNZXRyaWNzIEl0ZW0gTWFuaXB1bGF0aW9uIChtb2R1bGUgbmFtZTogYEl0ZW1gKQorMi4gTWVkaWEgTWV0cmljcyBUaW1lIE1hY2hpbmUgU3RvcmFnZSAobW9kdWxlIG5hbWU6IGBUaW1lTWFjaGluZVN0b3JhZ2VgKQorMy4gTWVkaWEgTWV0cmljcyBUcmFuc2FjdGlvbiBMb2cgKG1vZHVsZSBuYW1lOiBgVHJhbnNhY3Rpb25Mb2dgKQorNC4gTWVkaWEgTWV0cmljcyBBbmFseXRpY3MgQWN0aW9uIChtb2R1bGUgbmFtZTogYEFuYWx5dGljc0FjdGlvbmApCis1LiBNZWRpYSBNZXRyaWNzIEF1ZGlvIEFuYWx5dGljcyAobW9kdWxlIG5hbWU6IGBBdWRpb0FuYWx5dGljc2ApCis2LiBNZWRpYSBNZXRyaWNzIFRpbWVkIEFjdGlvbiAobW9kdWxlIG5hbWU6IGBUaW1lZEFjdGlvbmApCisKK3wgTW9kdWxlfCBWYWxpZCBJbnB1dCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgSXRlbWAgfCBLZXk6IGBzdGQ6OnN0cmluZ2AuIFZhbHVlczogYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAsIGBJTlQ2NF9NSU5gIHRvIGBJTlQ2NF9NQVhgLCBgc3RkOjpzdHJpbmdgLCBgZG91YmxlYCwgYHBhaXI8SU5UMzJfTUlOIHRvIElOVDMyX01BWCwgSU5UMzJfTUlOIHRvIElOVDMyX01BWD5gIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgVGltZU1hY2hpbmVTdG9yYWdlYCAgIHwgS2V5OiBgc3RkOjpzdHJpbmdgLiBWYWx1ZXM6IGBJTlQzMl9NSU5gIHRvIGBJTlQzMl9NQVhgLCBgSU5UNjRfTUlOYCB0byBgSU5UNjRfTUFYYCwgYHN0ZDo6c3RyaW5nYCwgYGRvdWJsZWAsIGBwYWlyPElOVDMyX01JTiB0byBJTlQzMl9NQVgsIElOVDMyX01JTiB0byBJTlQzMl9NQVg+YCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYFRyYW5zY2F0aW9uTG9nYCAgIHwgYG1lZGlhbWV0cmljczo6SXRlbWAgfCBgbWVkaWFtZXRyaWNzOjpJdGVtYCBjcmVhdGVkIGJ5IG9idGFpbmluZyB2YWx1ZXMgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBBbmFseXRpY3NBY3Rpb25gICAgfCBVUkw6IGBzdGQ6OnN0cmluZ2AgZW5kaW5nIHdpdGggLmV2ZW50LCBWYWx1ZTogYHN0ZDo6c3RyaW5nYCwgYWN0aW9uOiBBIGZ1bmN0aW9uIHwgVVJMIGFuZCBWYWx1ZXMgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIsIGEgcGxhY2Vob2xkZXIgZnVuY3Rpb24gd2FzIHBhc3NlZCBhcyBhY3Rpb258Cit8IGBBdWRpb0FuYWx5dGljc2AgICB8IGBtZWRpYW1ldHJpY3M6Okl0ZW1gIHwgYG1lZGlhbWV0cmljczo6SXRlbWAgY3JlYXRlZCBieSBvYnRhaW5pbmcgdmFsdWVzIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgVGltZWRBY3Rpb25gICAgfCB0aW1lOiBgc3RkOjpjaHJvbm86OnNlY29uZHNgLCBmdW5jdGlvbjogYHN0ZDo6ZnVuY3Rpb25gIHwgYHN0ZDo6Y2hyb25vOjpzZWNvbmRzYCA6IHZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyLCBgc3RkOjpmdW5jdGlvbmA6IGEgcGxhY2Vob2xkZXIgZnVuY3Rpb24gd2FzIHVzZWQuIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiMjU5NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgIkF1ZGlvVHlwZXMuaCIKKyNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIGxvdyB3YXRlciBtYXJrCitjb25zdGV4cHIgc2l6ZV90IGtMb2dJdGVtc0xvd1dhdGVyID0gMTsKKy8vIGhpZ2ggd2F0ZXIgbWFyaworY29uc3RleHByIHNpemVfdCBrTG9nSXRlbXNIaWdoV2F0ZXIgPSAyOworCitjbGFzcyBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIGludm9rZVN0YXJ0c1dpdGgoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlSW5zdGFudGlhdGUoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlUGFja2FnZUluc3RhbGxlckNoZWNrKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZUl0ZW1NYW5pcHVsYXRpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlSXRlbUV4cGFuc2lvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBpbnZva2VUaW1lTWFjaGluZVN0b3JhZ2UoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlVHJhbnNhY3Rpb25Mb2coY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlQW5hbHl0aWNzQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZUF1ZGlvQW5hbHl0aWNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZVRpbWVkQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworfTsKKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VTdGFydHNXaXRoKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6c3RhcnRzV2l0aChmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZUluc3RhbnRpYXRlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBzcCBtZWRpYU1ldHJpY3NTZXJ2aWNlID0gbmV3IE1lZGlhTWV0cmljc1NlcnZpY2UoKTsKKworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPG1lZGlhbWV0cmljczo6SXRlbT4gcmFuZG9tX2tleSgKKyAgICAgICAgICAgIG1lZGlhbWV0cmljczo6SXRlbTo6Y3JlYXRlKGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkpKTsKKyAgICAgICAgbWVkaWFNZXRyaWNzU2VydmljZS0+c3VibWl0KHJhbmRvbV9rZXkuZ2V0KCkpOworICAgICAgICByYW5kb21fa2V5LT5zZXRJbnQzMihmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgIG1lZGlhTWV0cmljc1NlcnZpY2UtPnN1Ym1pdChyYW5kb21fa2V5LmdldCgpKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8bWVkaWFtZXRyaWNzOjpJdGVtPiBhdWRpb3RyYWNrX2tleSgKKyAgICAgICAgICAgIG1lZGlhbWV0cmljczo6SXRlbTo6Y3JlYXRlKCJhdWRpb3RyYWNrIikpOworICAgICAgICBtZWRpYU1ldHJpY3NTZXJ2aWNlLT5zdWJtaXQoYXVkaW90cmFja19rZXkuZ2V0KCkpOworICAgICAgICBhdWRpb3RyYWNrX2tleS0+YWRkSW50MzIoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICAgICAgbWVkaWFNZXRyaWNzU2VydmljZS0+c3VibWl0KGF1ZGlvdHJhY2tfa2V5LmdldCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlUGFja2FnZUluc3RhbGxlckNoZWNrKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIE1lZGlhTWV0cmljc1NlcnZpY2U6OnVzZVVpZEZvclBhY2thZ2UoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZUl0ZW1NYW5pcHVsYXRpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworCisgICAgbWVkaWFtZXRyaWNzOjpJdGVtIGl0ZW0oZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgYWN0aW9uID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgMTYpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXkgPSBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpOworICAgICAgICBpZiAoZmRwLnJlbWFpbmluZ19ieXRlcygpIDwgMSB8fCBrZXkubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJbnQzMihrZXkuY19zdHIoKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgICAgIGl0ZW0uYWRkSW50MzIoa2V5LmNfc3RyKCksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGkzMiA9IDA7CisgICAgICAgICAgICAgICAgaXRlbS5nZXRJbnQzMihrZXkuY19zdHIoKSwgJmkzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEludDY0KGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSA0OiB7CisgICAgICAgICAgICAgICAgaXRlbS5hZGRJbnQ2NChrZXkuY19zdHIoKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNTogeworICAgICAgICAgICAgICAgIGludDY0X3QgaTY0ID0gMDsKKyAgICAgICAgICAgICAgICBpdGVtLmdldEludDY0KGtleS5jX3N0cigpLCAmaTY0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNjogeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RG91YmxlKGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZG91YmxlPigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNzogeworICAgICAgICAgICAgICAgIGl0ZW0uYWRkRG91YmxlKGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZG91YmxlPigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgODogeworICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gMDsKKyAgICAgICAgICAgICAgICBpdGVtLmdldERvdWJsZShrZXkuY19zdHIoKSwgJmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSA5OiB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRDU3RyaW5nKGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxMDogeworICAgICAgICAgICAgICAgIGNoYXIgKnMgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGl0ZW0uZ2V0Q1N0cmluZyhrZXkuY19zdHIoKSwgJnMpOworICAgICAgICAgICAgICAgIGlmIChzKSBmcmVlKHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxMTogeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgICAgICAgICAgICAgaXRlbS5nZXRTdHJpbmcoa2V5LmNfc3RyKCksICZzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTI6IHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldFJhdGUoa2V5LmNfc3RyKCksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTM6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGIgPSAwLCBoID0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IDA7CisgICAgICAgICAgICAgICAgaXRlbS5nZXRSYXRlKGtleS5jX3N0cigpLCAmYiwgJmgsICZkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTQ6IHsKKyAgICAgICAgICAgICAgICAodm9pZClpdGVtLmZpbHRlcihrZXkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDE1OiB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJyWzFdID0geyIifTsKKyAgICAgICAgICAgICAgICBhcnJbMF0gPSBjb25zdF9jYXN0PGNoYXIgKj4oa2V5LmNfc3RyKCkpOworICAgICAgICAgICAgICAgICh2b2lkKWl0ZW0uZmlsdGVyTm90KDEsIGFycik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDE2OiB7CisgICAgICAgICAgICAgICAgKHZvaWQpaXRlbS50b1N0cmluZygpLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQYXJjZWwgcDsKKyAgICBtZWRpYW1ldHJpY3M6Okl0ZW0gaXRlbTI7CisKKyAgICAodm9pZClpdGVtLndyaXRlVG9QYXJjZWwoJnApOworICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOyAgLy8gcmV3aW5kIGZvciByZWFkaW5nCisgICAgKHZvaWQpaXRlbTIucmVhZEZyb21QYXJjZWwocCk7CisKKyAgICBjaGFyICpieXRlRGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IGxlbmd0aCA9IDA7CisgICAgKHZvaWQpaXRlbS53cml0ZVRvQnl0ZVN0cmluZygmYnl0ZURhdGEsICZsZW5ndGgpOworICAgICh2b2lkKWl0ZW0yLnJlYWRGcm9tQnl0ZVN0cmluZyhieXRlRGF0YSwgbGVuZ3RoKTsKKyAgICBpZiAoYnl0ZURhdGEpIHsKKyAgICAgICAgZnJlZShieXRlRGF0YSk7CisgICAgfQorCisgICAgc3AgbWVkaWFNZXRyaWNzU2VydmljZSA9IG5ldyBNZWRpYU1ldHJpY3NTZXJ2aWNlKCk7CisgICAgbWVkaWFNZXRyaWNzU2VydmljZS0+c3VibWl0KCZpdGVtMik7Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlSXRlbUV4cGFuc2lvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW08MT4gaXRlbSgiRnV6ekl0ZW0iKTsKKyAgICBpdGVtLnNldFBpZChmZHAuQ29uc3VtZUludGVncmFsPGludDE2X3Q+KCkpLnNldFVpZChmZHAuQ29uc3VtZUludGVncmFsPGludDE2X3Q+KCkpOworCisgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICBpbnQzMl90IGkgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgIGl0ZW0uc2V0KHN0ZDo6dG9fc3RyaW5nKGkpLmNfc3RyKCksIChpbnQzMl90KWkpOworICAgIH0KKyAgICBpdGVtLnVwZGF0ZUhlYWRlcigpOworCisgICAgbWVkaWFtZXRyaWNzOjpJdGVtIGl0ZW0yOworICAgICh2b2lkKWl0ZW0yLnJlYWRGcm9tQnl0ZVN0cmluZyhpdGVtLmdldEJ1ZmZlcigpLCBpdGVtLmdldExlbmd0aCgpKTsKKworICAgIHNwIG1lZGlhTWV0cmljc1NlcnZpY2UgPSBuZXcgTWVkaWFNZXRyaWNzU2VydmljZSgpOworICAgIG1lZGlhTWV0cmljc1NlcnZpY2UtPnN1Ym1pdCgmaXRlbTIpOworfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVRpbWVNYWNoaW5lU3RvcmFnZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICBhdXRvIGl0ZW0gPSBzdGQ6Om1ha2Vfc2hhcmVkPG1lZGlhbWV0cmljczo6SXRlbT4oIkZ1enpLZXkiKTsKKyAgICBpbnQzMl90IGkzMiA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBpbnQ2NF90IGk2NCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICBkb3VibGUgZCA9IGZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxkb3VibGU+KCk7CisgICAgc3RkOjpzdHJpbmcgc3RyID0gZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKTsKKyAgICBzdGQ6OnBhaXI8aW50NjRfdCwgaW50NjRfdD4gcGFpcihmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICAoKml0ZW0pLnNldCgiaTMyIiwgaTMyKS5zZXQoImk2NCIsIGk2NCkuc2V0KCJkb3VibGUiLCBkKS5zZXQoInN0cmluZyIsIHN0cikuc2V0KCJyYXRlIiwgcGFpcik7CisKKyAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OlRpbWVNYWNoaW5lIHRpbWVNYWNoaW5lOworICAgIHRpbWVNYWNoaW5lLnB1dChpdGVtLCB0cnVlKTsKKworICAgIHRpbWVNYWNoaW5lLmdldCgiS2V5IiwgImkzMiIsICZpMzIsIC0xKTsKKworICAgIHRpbWVNYWNoaW5lLmdldCgiS2V5IiwgImk2NCIsICZpNjQsIC0xKTsKKworICAgIHRpbWVNYWNoaW5lLmdldCgiS2V5IiwgImRvdWJsZSIsICZkLCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleSIsICJzdHJpbmciLCAmc3RyLCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleS5pMzIiLCAmaTMyLCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleS5pNjQiLCAmaTY0LCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleS5kb3VibGUiLCAmZCwgLTEpOworCisgICAgc3RyLmNsZWFyKCk7CisgICAgdGltZU1hY2hpbmUuZ2V0KCJLZXkuc3RyaW5nIiwgJnN0ciwgLTEpOworfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVRyYW5zYWN0aW9uTG9nKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIGF1dG8gaXRlbSA9IHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpJdGVtPigiS2V5MSIpOworICAgICgqaXRlbSkKKyAgICAgICAgLnNldCgib25lIiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKQorICAgICAgICAuc2V0KCJ0d28iLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpCisgICAgICAgIC5zZXRUaW1lc3RhbXAoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6VHJhbnNhY3Rpb25Mb2cgdHJhbnNhY3Rpb25Mb2coCisgICAgICAgIGtMb2dJdGVtc0xvd1dhdGVyLCBrTG9nSXRlbXNIaWdoV2F0ZXIpOyAgLy8ga2VlcCBhdCBtb3N0IDIgaXRlbXMKKyAgICB0cmFuc2FjdGlvbkxvZy5zaXplKCk7CisKKyAgICB0cmFuc2FjdGlvbkxvZy5wdXQoaXRlbSk7CisgICAgdHJhbnNhY3Rpb25Mb2cuc2l6ZSgpOworCisgICAgYXV0byBpdGVtMiA9IHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpJdGVtPigiS2V5MiIpOworICAgICgqaXRlbTIpCisgICAgICAgIC5zZXQoInRocmVlIiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKQorICAgICAgICAuc2V0KCJbS2V5MV10aHJlZSIsIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSkKKyAgICAgICAgLnNldFRpbWVzdGFtcChmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgdHJhbnNhY3Rpb25Mb2cucHV0KGl0ZW0yKTsKKyAgICB0cmFuc2FjdGlvbkxvZy5zaXplKCk7CisKKyAgICBhdXRvIGl0ZW0zID0gc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6Okl0ZW0+KCJLZXkzIik7CisgICAgKCppdGVtMykKKyAgICAgICAgLnNldCgic2l4IiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKQorICAgICAgICAuc2V0KCJbS2V5MV1mb3VyIiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKSAgLy8gYWZmZWN0cyBLZXkxCisgICAgICAgIC5zZXQoIltLZXkxXWZpdmUiLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpICAvLyBhZmZlY3RzIGtleTEKKyAgICAgICAgLnNldFRpbWVzdGFtcChmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgdHJhbnNhY3Rpb25Mb2cucHV0KGl0ZW0zKTsKKyAgICB0cmFuc2FjdGlvbkxvZy5zaXplKCk7Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlQW5hbHl0aWNzQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIG1lZGlhbWV0cmljczo6QW5hbHl0aWNzQWN0aW9ucyBhbmFseXRpY3NBY3Rpb25zOworICAgIGJvb2wgYWN0aW9uID0gZmFsc2U7CisKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIGFuYWx5dGljc0FjdGlvbnMuYWRkQWN0aW9uKAorICAgICAgICAgICAgKGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkgKyBzdGQ6OnN0cmluZygiLmV2ZW50IikpLmNfc3RyKCksCisgICAgICAgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6OkFuYWx5dGljc0FjdGlvbnM6OkZ1bmN0aW9uPigKKyAgICAgICAgICAgICAgICBbJl0oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJikgeworICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwMiA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIHdoaWxlIChmZHAyLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIC8vIG1ha2UgYSB0ZXN0IGl0ZW0KKyAgICAgICAgYXV0byBpdGVtID0gc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6Okl0ZW0+KGZkcDIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAoKml0ZW0pLnNldCgiZXZlbnQiLCBmZHAyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKworICAgICAgICAvLyBnZXQgdGhlIGFjdGlvbnMgYW5kIGV4ZWN1dGUgdGhlbQorICAgICAgICBhdXRvIGFjdGlvbnMgPSBhbmFseXRpY3NBY3Rpb25zLmdldEFjdGlvbnNGb3JJdGVtKGl0ZW0pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmFjdGlvbiA6IGFjdGlvbnMpIHsKKyAgICAgICAgICAgIGFjdGlvbi0+b3BlcmF0b3IoKShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VBdWRpb0FuYWx5dGljcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpBdWRpb0FuYWx5dGljcyBhdWRpb0FuYWx5dGljczsKKworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgYXV0byBpdGVtID0gc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6Okl0ZW0+KGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGludDMyX3QgdHJhbnNhY3Rpb25VaWQgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7ICAvLyBhcmJpdHJhcnkKKyAgICAgICAgKCppdGVtKQorICAgICAgICAgICAgLnNldChmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSkKKyAgICAgICAgICAgIC5zZXQoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9BTExPV1VJRCwgdHJhbnNhY3Rpb25VaWQpCisgICAgICAgICAgICAuc2V0VWlkKHRyYW5zYWN0aW9uVWlkKQorICAgICAgICAgICAgLnNldFRpbWVzdGFtcChmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgICAgICBhdWRpb0FuYWx5dGljcy5zdWJtaXQoaXRlbSwgZmRwLkNvbnN1bWVCb29sKCkpOworICAgIH0KKworICAgIGF1ZGlvQW5hbHl0aWNzLmR1bXAoMTAwMCk7Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlVGltZWRBY3Rpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6VGltZWRBY3Rpb24gdGltZWRBY3Rpb247CisgICAgc3RkOjphdG9taWNfaW50IHZhbHVlID0gMDsKKworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgdGltZWRBY3Rpb24ucG9zdEluKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnZhbHVlXSB7ICsrdmFsdWU7IH0pOworICAgICAgICB0aW1lZEFjdGlvbi5zaXplKCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpbnZva2VTdGFydHNXaXRoKGRhdGEsIHNpemUpOworICAgIGludm9rZUluc3RhbnRpYXRlKGRhdGEsIHNpemUpOworICAgIGludm9rZVBhY2thZ2VJbnN0YWxsZXJDaGVjayhkYXRhLCBzaXplKTsKKyAgICBpbnZva2VJdGVtTWFuaXB1bGF0aW9uKGRhdGEsIHNpemUpOworICAgIGludm9rZUl0ZW1FeHBhbnNpb24oZGF0YSwgc2l6ZSk7CisgICAgaW52b2tlVGltZU1hY2hpbmVTdG9yYWdlKGRhdGEsIHNpemUpOworICAgIGludm9rZVRyYW5zYWN0aW9uTG9nKGRhdGEsIHNpemUpOworICAgIGludm9rZUFuYWx5dGljc0FjdGlvbihkYXRhLCBzaXplKTsKKyAgICBpbnZva2VBdWRpb0FuYWx5dGljcyhkYXRhLCBzaXplKTsKKyAgICBpbnZva2VUaW1lZEFjdGlvbihkYXRhLCBzaXplKTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplciBtZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOworICAgIG1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCmluZGV4IGEzNTE5ZDUuLmNkZjVhNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icApAQCAtMSwxMCArMSw1MyBAQAorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAicmVzb3VyY2VtYW5hZ2VyX2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VTdWJUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VQYXJjZWwuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbC5haWRsIiwKKyAgICBdLAorICAgIHBhdGg6ICJhaWRsIiwKK30KIAorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAicmVzb3VyY2VvYnNlcnZlcl9haWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXIuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUV2ZW50LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUZpbHRlci5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZVBhcmNlbC5haWRsIiwKKyAgICBdLAorICAgIHBhdGg6ICJhaWRsIiwKK30KIAotY2NfbGlicmFyeV9zaGFyZWQgeworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UiLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiOnJlc291cmNlbWFuYWdlcl9haWRsIiwKKyAgICBdLAorfQorCithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UiLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiOnJlc291cmNlb2JzZXJ2ZXJfYWlkbCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAogCiAgICAgc3JjczogWwogICAgICAgICAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAiLAorICAgICAgICAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuY3BwIiwKICAgICAgICAgIlNlcnZpY2VMb2cuY3BwIiwKICAgICBdLAogCkBAIC0xNyw2ICs2MCwxMCBAQAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICBdLAorCiAgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0yNSw1ICs3Miw0IEBACiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDNkMzZmOGUuLjI4OWNmZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KQEAgLTM2LDE4ICszNyw1NCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgIlJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiU2VydmljZUxvZy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vc3RhdGljCitzdGQ6Om11dGV4IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnNDb29raWVMb2NrOworLy9zdGF0aWMKK3VpbnRwdHJfdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpzQ29va2llQ291bnRlciA9IDA7CisvL3N0YXRpYworc3RkOjptYXA8dWludHB0cl90LCBzcDxEZWF0aE5vdGlmaWVyPiA+IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnNDb29raWVUb0RlYXRoTm90aWZpZXJNYXA7CisKK2NsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgRGVhdGhOb3RpZmllcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gJnNlcnZpY2UsCisgICAgICAgICAgICBpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKTsKKworICAgIHZpcnR1YWwgfkRlYXRoTm90aWZpZXIoKSB7fQorCisgICAgLy8gSW1wbGVtZW50IGRlYXRoIHJlY2lwaWVudAorICAgIHN0YXRpYyB2b2lkIEJpbmRlckRpZWRDYWxsYmFjayh2b2lkKiBjb29raWUpOworICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKCk7CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OndlYWtfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOworICAgIGludCBtUGlkOworICAgIGludDY0X3QgbUNsaWVudElkOworfTsKKwogRGVhdGhOb3RpZmllcjo6RGVhdGhOb3RpZmllcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gJnNlcnZpY2UsCiAgICAgICAgIGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpCiAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVBpZChwaWQpLCBtQ2xpZW50SWQoY2xpZW50SWQpIHt9CiAKIC8vc3RhdGljCiB2b2lkIERlYXRoTm90aWZpZXI6OkJpbmRlckRpZWRDYWxsYmFjayh2b2lkKiBjb29raWUpIHsKLSAgICBhdXRvIHRoaXogPSBzdGF0aWNfY2FzdDxEZWF0aE5vdGlmaWVyKj4oY29va2llKTsKLSAgICB0aGl6LT5iaW5kZXJEaWVkKCk7CisgICAgc3A8RGVhdGhOb3RpZmllcj4gbm90aWZpZXI7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7UmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6c0Nvb2tpZUxvY2t9OworICAgICAgICBhdXRvIGl0ID0gUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6c0Nvb2tpZVRvRGVhdGhOb3RpZmllck1hcC5maW5kKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihjb29raWUpKTsKKyAgICAgICAgaWYgKGl0ID09IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnNDb29raWVUb0RlYXRoTm90aWZpZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBub3RpZmllciA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIGlmIChub3RpZmllci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG5vdGlmaWVyLT5iaW5kZXJEaWVkKCk7CisgICAgfQogfQogCiB2b2lkIERlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoKSB7CkBAIC02MCw4ICs5NywyOCBAQAogCiAgICAgc2VydmljZS0+b3ZlcnJpZGVQaWQobVBpZCwgLTEpOwogICAgIC8vIHRoaXogaXMgZnJlZWQgaW4gdGhlIGNhbGwgYmVsb3csIHNvIGl0IG11c3QgYmUgbGFzdCBjYWxsIHJlZmVycmluZyB0aGl6Ci0gICAgc2VydmljZS0+cmVtb3ZlUmVzb3VyY2UobVBpZCwgbUNsaWVudElkLCBmYWxzZSk7CisgICAgc2VydmljZS0+cmVtb3ZlUmVzb3VyY2UobVBpZCwgbUNsaWVudElkLCBmYWxzZSAvKmNoZWNrVmFsaWQqLyk7Cit9CiAKK2NsYXNzIE92ZXJyaWRlUHJvY2Vzc0luZm9EZWF0aE5vdGlmaWVyIDogcHVibGljIERlYXRoTm90aWZpZXIgeworcHVibGljOgorICAgIE92ZXJyaWRlUHJvY2Vzc0luZm9EZWF0aE5vdGlmaWVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiAmc2VydmljZSwKKyAgICAgICAgICAgIGludCBwaWQpIDogRGVhdGhOb3RpZmllcihzZXJ2aWNlLCBwaWQsIDApIHt9CisKKyAgICB2aXJ0dWFsIH5PdmVycmlkZVByb2Nlc3NJbmZvRGVhdGhOb3RpZmllcigpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZCgpOworfTsKKwordm9pZCBPdmVycmlkZVByb2Nlc3NJbmZvRGVhdGhOb3RpZmllcjo6YmluZGVyRGllZCgpIHsKKyAgICAvLyBEb24ndCBjaGVjayBmb3IgcGlkIHZhbGlkaXR5IHNpbmNlIHdlIGtub3cgaXQncyBhbHJlYWR5IGRlYWQuCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5sb2NrKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBpcyBkZWFkIGFzIHdlbGwuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXJ2aWNlLT5yZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKG1QaWQpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KQEAgLTExNiw2ICsxNzMsNyBAQAogICAgICAgICBpbmZvLnVpZCA9IHVpZDsKICAgICAgICAgaW5mby5jbGllbnRJZCA9IGNsaWVudElkOwogICAgICAgICBpbmZvLmNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgaW5mby5jb29raWUgPSAwOwogICAgICAgICBpbmZvLnBlbmRpbmdSZW1vdmFsID0gZmFsc2U7CiAKICAgICAgICAgaW5kZXggPSBpbmZvcy5hZGQoY2xpZW50SWQsIGluZm8pOwpAQCAtMjY3LDYgKzMyNSwxMyBAQAogICAgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+IG9ic2VydmVyU2VydmljZSA9CisgICAgICAgICAgICBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKworICAgIGlmIChvYnNlcnZlclNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBzZXJ2aWNlLT5zZXRPYnNlcnZlclNlcnZpY2Uob2JzZXJ2ZXJTZXJ2aWNlKTsKKyAgICB9CiAgICAgLy8gVE9ETzogbWVkaWFzZXJ2ZXIgbWFpbigpIGlzIGFscmVhZHkgc3RhcnRpbmcgdGhlIHRocmVhZCBwb29sLAogICAgIC8vIG1vdmUgdGhpcyB0byBtZWRpYXNlcnZlciBtYWluKCkgd2hlbiBvdGhlciBzZXJ2aWNlcyBpbiBtZWRpYXNlcnZlcgogICAgIC8vIGFyZSBjb252ZXJ0ZWQgdG8gbmRrLXBsYXRmb3JtIGFpZGwuCkBAIC0yNzUsNiArMzQwLDExIEBACiAKIFJlc291cmNlTWFuYWdlclNlcnZpY2U6On5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCkge30KIAordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpzZXRPYnNlcnZlclNlcnZpY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyU2VydmljZT4mIG9ic2VydmVyU2VydmljZSkgeworICAgIG1PYnNlcnZlclNlcnZpY2UgPSBvYnNlcnZlclNlcnZpY2U7Cit9CisKIFN0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpjb25maWcoY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbD4mIHBvbGljaWVzKSB7CiAgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoImNvbmZpZyglcykiLCBnZXRTdHJpbmcocG9saWNpZXMpLnN0cmluZygpKTsKICAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CkBAIC0zNTMsMTEgKzQyMywxNiBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKLSAgICAgICAgQUxPR0UoIlJlamVjdGVkIGFkZFJlc291cmNlIGNhbGwgd2l0aCBpbnZhbGlkIHBpZC4iKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCwgdWlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHBpZCwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCk7CisgICAgICAgIHBpZCA9IGNhbGxpbmdQaWQ7CisgICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgfQogICAgIFJlc291cmNlSW5mb3MmIGluZm9zID0gZ2V0UmVzb3VyY2VJbmZvc0ZvckVkaXQocGlkLCBtTWFwKTsKICAgICBSZXNvdXJjZUluZm8mIGluZm8gPSBnZXRSZXNvdXJjZUluZm9Gb3JFZGl0KHVpZCwgY2xpZW50SWQsIGNsaWVudCwgaW5mb3MpOworICAgIFJlc291cmNlTGlzdCByZXNvdXJjZUFkZGVkOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgYXV0byAmcmVzID0gcmVzb3VyY2VzW2ldOwpAQCAtMzc5LDExICs0NTQsMjAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1lcmdlUmVzb3VyY2VzKGluZm8ucmVzb3VyY2VzW3Jlc1R5cGVdLCByZXMpOwogICAgICAgICB9CisgICAgICAgIC8vIEFkZCBpdCB0byB0aGUgbGlzdCBvZiBhZGRlZCByZXNvdXJjZXMgZm9yIG9ic2VydmVycy4KKyAgICAgICAgYXV0byBpdCA9IHJlc291cmNlQWRkZWQuZmluZChyZXNUeXBlKTsKKyAgICAgICAgaWYgKGl0ID09IHJlc291cmNlQWRkZWQuZW5kKCkpIHsKKyAgICAgICAgICAgIHJlc291cmNlQWRkZWRbcmVzVHlwZV0gPSByZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXJnZVJlc291cmNlcyhpdC0+c2Vjb25kLCByZXMpOworICAgICAgICB9CiAgICAgfQotICAgIGlmIChpbmZvLmRlYXRoTm90aWZpZXIgPT0gbnVsbHB0ciAmJiBjbGllbnQgIT0gbnVsbHB0cikgewotICAgICAgICBpbmZvLmRlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcihyZWY8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4oKSwgcGlkLCBjbGllbnRJZCk7Ci0gICAgICAgIEFJQmluZGVyX2xpbmtUb0RlYXRoKGNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSwKLSAgICAgICAgICAgICAgICBtRGVhdGhSZWNpcGllbnQuZ2V0KCksIGluZm8uZGVhdGhOb3RpZmllci5nZXQoKSk7CisgICAgaWYgKGluZm8uY29va2llID09IDAgJiYgY2xpZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaW5mby5jb29raWUgPSBhZGRDb29raWVBbmRMaW5rX2woY2xpZW50LT5hc0JpbmRlcigpLAorICAgICAgICAgICAgICAgIG5ldyBEZWF0aE5vdGlmaWVyKHJlZjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPigpLCBwaWQsIGNsaWVudElkKSk7CisgICAgfQorICAgIGlmIChtT2JzZXJ2ZXJTZXJ2aWNlICE9IG51bGxwdHIgJiYgIXJlc291cmNlQWRkZWQuZW1wdHkoKSkgeworICAgICAgICBtT2JzZXJ2ZXJTZXJ2aWNlLT5vblJlc291cmNlQWRkZWQodWlkLCBwaWQsIHJlc291cmNlQWRkZWQpOwogICAgIH0KICAgICBub3RpZnlSZXNvdXJjZUdyYW50ZWQocGlkLCByZXNvdXJjZXMpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CkBAIC0zOTgsOCArNDgyLDEwIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQocGlkKSkgewotICAgICAgICBBTE9HRSgiUmVqZWN0ZWQgcmVtb3ZlUmVzb3VyY2UgY2FsbCB3aXRoIGludmFsaWQgcGlkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoQkFEX1ZBTFVFKTsKKyAgICAgICAgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHBpZCwgY2FsbGluZ1BpZCk7CisgICAgICAgIHBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfQogICAgIHNzaXplX3QgaW5kZXggPSBtTWFwLmluZGV4T2ZLZXkocGlkKTsKICAgICBpZiAoaW5kZXggPCAwKSB7CkBAIC00MTUsNyArNTAxLDcgQEAKICAgICB9CiAKICAgICBSZXNvdXJjZUluZm8gJmluZm8gPSBpbmZvcy5lZGl0VmFsdWVBdChpbmRleCk7Ci0KKyAgICBSZXNvdXJjZUxpc3QgcmVzb3VyY2VSZW1vdmVkOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IGF1dG8gJnJlcyA9IHJlc291cmNlc1tpXTsKICAgICAgICAgY29uc3QgYXV0byByZXNUeXBlID0gc3RkOjp0dXBsZShyZXMudHlwZSwgcmVzLnN1YlR5cGUsIHJlcy5pZCk7CkBAIC00MjcsMTkgKzUxMywzMiBAQAogICAgICAgICAvLyBpZ25vcmUgaWYgd2UgZG9uJ3QgaGF2ZSBpdAogICAgICAgICBpZiAoaW5mby5yZXNvdXJjZXMuZmluZChyZXNUeXBlKSAhPSBpbmZvLnJlc291cmNlcy5lbmQoKSkgewogICAgICAgICAgICAgTWVkaWFSZXNvdXJjZVBhcmNlbCAmcmVzb3VyY2UgPSBpbmZvLnJlc291cmNlc1tyZXNUeXBlXTsKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQYXJjZWwgYWN0dWFsUmVtb3ZlZCA9IHJlczsKICAgICAgICAgICAgIGlmIChyZXNvdXJjZS52YWx1ZSA+IHJlcy52YWx1ZSkgewogICAgICAgICAgICAgICAgIHJlc291cmNlLnZhbHVlIC09IHJlcy52YWx1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb25MYXN0UmVtb3ZlZChyZXMsIGluZm8pOworICAgICAgICAgICAgICAgIGFjdHVhbFJlbW92ZWQudmFsdWUgPSByZXNvdXJjZS52YWx1ZTsKICAgICAgICAgICAgICAgICBpbmZvLnJlc291cmNlcy5lcmFzZShyZXNUeXBlKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBsaXN0IG9mIHJlbW92ZWQgcmVzb3VyY2VzIGZvciBvYnNlcnZlcnMuCisgICAgICAgICAgICBhdXRvIGl0ID0gcmVzb3VyY2VSZW1vdmVkLmZpbmQocmVzVHlwZSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gcmVzb3VyY2VSZW1vdmVkLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VSZW1vdmVkW3Jlc1R5cGVdID0gYWN0dWFsUmVtb3ZlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVyZ2VSZXNvdXJjZXMoaXQtPnNlY29uZCwgYWN0dWFsUmVtb3ZlZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKG1PYnNlcnZlclNlcnZpY2UgIT0gbnVsbHB0ciAmJiAhcmVzb3VyY2VSZW1vdmVkLmVtcHR5KCkpIHsKKyAgICAgICAgbU9ic2VydmVyU2VydmljZS0+b25SZXNvdXJjZVJlbW92ZWQoaW5mby51aWQsIHBpZCwgcmVzb3VyY2VSZW1vdmVkKTsKKyAgICB9CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZUNsaWVudChpbnQzMl90IHBpZCwgaW50NjRfdCBjbGllbnRJZCkgewotICAgIHJlbW92ZVJlc291cmNlKHBpZCwgY2xpZW50SWQsIHRydWUpOworICAgIHJlbW92ZVJlc291cmNlKHBpZCwgY2xpZW50SWQsIHRydWUgLypjaGVja1ZhbGlkKi8pOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTQ1MSw4ICs1NTAsMTAgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tWYWxpZCAmJiAhbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKLSAgICAgICAgQUxPR0UoIlJlamVjdGVkIHJlbW92ZVJlc291cmNlIGNhbGwgd2l0aCBpbnZhbGlkIHBpZC4iKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOworICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOwogICAgIH0KICAgICBzc2l6ZV90IGluZGV4ID0gbU1hcC5pbmRleE9mS2V5KHBpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewpAQCAtNDcyLDggKzU3MywxMSBAQAogICAgICAgICBvbkxhc3RSZW1vdmVkKGl0LT5zZWNvbmQsIGluZm8pOwogICAgIH0KIAotICAgIEFJQmluZGVyX3VubGlua1RvRGVhdGgoaW5mby5jbGllbnQtPmFzQmluZGVyKCkuZ2V0KCksCi0gICAgICAgICAgICBtRGVhdGhSZWNpcGllbnQuZ2V0KCksIGluZm8uZGVhdGhOb3RpZmllci5nZXQoKSk7CisgICAgcmVtb3ZlQ29va2llQW5kVW5saW5rX2woaW5mby5jbGllbnQtPmFzQmluZGVyKCksIGluZm8uY29va2llKTsKKworICAgIGlmIChtT2JzZXJ2ZXJTZXJ2aWNlICE9IG51bGxwdHIgJiYgIWluZm8ucmVzb3VyY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgbU9ic2VydmVyU2VydmljZS0+b25SZXNvdXJjZVJlbW92ZWQoaW5mby51aWQsIHBpZCwgaW5mby5yZXNvdXJjZXMpOworICAgIH0KIAogICAgIGluZm9zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CkBAIC01MDQsOCArNjA4LDEwIEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKGNhbGxpbmdQaWQpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVqZWN0ZWQgcmVjbGFpbVJlc291cmNlIGNhbGwgd2l0aCBpbnZhbGlkIGNhbGxpbmdQaWQuIik7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgIHBpZF90IGFjdHVhbENhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgYWN0dWFsIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBhY3R1YWxDYWxsaW5nUGlkKTsKKyAgICAgICAgICAgIGNhbGxpbmdQaWQgPSBhY3R1YWxDYWxsaW5nUGlkOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwgKnNlY3VyZUNvZGVjID0gTlVMTDsKICAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCAqbm9uU2VjdXJlQ29kZWMgPSBOVUxMOwpAQCAtNTc1LDEzICs2ODEsMTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgICpfYWlkbF9yZXR1cm4gPSByZWNsYWltSW50ZXJuYWwoY2xpZW50cyk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZWNsYWltSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICZjbGllbnRzKSB7CiAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBmYWlsZWRDbGllbnQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjbGllbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGxvZyA9IFN0cmluZzg6OmZvcm1hdCgicmVjbGFpbVJlc291cmNlIGZyb20gY2xpZW50ICVwIiwgY2xpZW50c1tpXS5nZXQoKSk7CisgICAgICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJyZWNsYWltUmVzb3VyY2UgZnJvbSBjbGllbnQgJXAiLCBjbGllbnRzW2ldLmdldCgpKTsKICAgICAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwogICAgICAgICBib29sIHN1Y2Nlc3M7CiAgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBjbGllbnRzW2ldLT5yZWNsYWltUmVzb3VyY2UoJnN1Y2Nlc3MpOwpAQCAtNTkyLDggKzcwNCw3IEBACiAgICAgfQogCiAgICAgaWYgKGZhaWxlZENsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICB7CkBAIC02MTgsNyArNzI5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBTdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6b3ZlcnJpZGVQaWQoCkBAIC02NTEsNiArNzYyLDgzIEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om92ZXJyaWRlUHJvY2Vzc0luZm8oCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICBpbnQgcGlkLAorICAgICAgICBpbnQgcHJvY1N0YXRlLAorICAgICAgICBpbnQgb29tU2NvcmUpIHsKKyAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgib3ZlcnJpZGVQcm9jZXNzSW5mbyhwaWQgJWQsIHByb2NTdGF0ZSAlZCwgb29tU2NvcmUgJWQpIiwKKyAgICAgICAgICAgIHBpZCwgcHJvY1N0YXRlLCBvb21TY29yZSk7CisgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOworCisgICAgLy8gT25seSBhbGxvdyB0aGUgb3ZlcnJpZGUgaWYgdGhlIGNhbGxlciBhbHJlYWR5IGNhbiBhY2Nlc3MgcHJvY2VzcyBzdGF0ZSBhbmQgb29tIHNjb3Jlcy4KKyAgICBpbnQgY2FsbGluZ1BpZCA9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKTsKKyAgICBpZiAoY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSAmJiAoY2FsbGluZ1BpZCAhPSBwaWQgfHwgIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoCisgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLkdFVF9QUk9DRVNTX1NUQVRFX0FORF9PT01fU0NPUkUiKSkpKSB7CisgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogb3ZlcnJpZGVQcm9jZXNzSW5mbyBtZXRob2QgZnJvbSBwaWQ9JWQiLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICB9CisKKyAgICBpZiAoY2xpZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGVfbChwaWQpOworCisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPm92ZXJyaWRlUHJvY2Vzc0luZm8ocGlkLCBwcm9jU3RhdGUsIG9vbVNjb3JlKSkgeworICAgICAgICAvLyBPdmVycmlkZSB2YWx1ZSBpcyByZWplY3RlZCBieSBQcm9jZXNzSW5mby4KKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgfQorCisgICAgdWludHB0cl90IGNvb2tpZSA9IGFkZENvb2tpZUFuZExpbmtfbChjbGllbnQtPmFzQmluZGVyKCksCisgICAgICAgICAgICBuZXcgT3ZlcnJpZGVQcm9jZXNzSW5mb0RlYXRoTm90aWZpZXIocmVmPFJlc291cmNlTWFuYWdlclNlcnZpY2U+KCksIHBpZCkpOworCisgICAgbVByb2Nlc3NJbmZvT3ZlcnJpZGVNYXAuZW1wbGFjZShwaWQsIFByb2Nlc3NJbmZvT3ZlcnJpZGV7Y29va2llLCBjbGllbnR9KTsKKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK3VpbnRwdHJfdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjphZGRDb29raWVBbmRMaW5rX2woCisgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciwgY29uc3Qgc3A8RGVhdGhOb3RpZmllcj4mIG5vdGlmaWVyKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre3NDb29raWVMb2NrfTsKKworICAgIHVpbnRwdHJfdCBjb29raWU7CisgICAgLy8gTmVlZCB0byBza2lwIGNvb2tpZSAwIChpZiBpdCB3cmFwcyBhcm91bmQpLiBSZXNvdXJjZUluZm8gaGFzIGNvb2tpZSBpbml0aWFsaXplZCB0byAwCisgICAgLy8gaW5kaWNhdGluZyB0aGUgZGVhdGggbm90aWZpZXIgaXMgbm90IGNyZWF0ZWQgeWV0LgorICAgIHdoaWxlICgoY29va2llID0gKytzQ29va2llQ291bnRlcikgPT0gMCk7CisgICAgQUlCaW5kZXJfbGlua1RvRGVhdGgoYmluZGVyLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksICh2b2lkKiljb29raWUpOworICAgIHNDb29raWVUb0RlYXRoTm90aWZpZXJNYXAuZW1wbGFjZShjb29raWUsIG5vdGlmaWVyKTsKKworICAgIHJldHVybiBjb29raWU7Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVtb3ZlQ29va2llQW5kVW5saW5rX2woCisgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciwgdWludHB0cl90IGNvb2tpZSkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzQ29va2llTG9ja307CisgICAgQUlCaW5kZXJfdW5saW5rVG9EZWF0aChiaW5kZXIuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwgKHZvaWQqKWNvb2tpZSk7CisgICAgc0Nvb2tpZVRvRGVhdGhOb3RpZmllck1hcC5lcmFzZShjb29raWUpOworfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUoaW50IHBpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGVfbChwaWQpOworfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGVfbChpbnQgcGlkKSB7CisgICAgYXV0byBpdCA9IG1Qcm9jZXNzSW5mb092ZXJyaWRlTWFwLmZpbmQocGlkKTsKKyAgICBpZiAoaXQgPT0gbVByb2Nlc3NJbmZvT3ZlcnJpZGVNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Qcm9jZXNzSW5mby0+cmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShwaWQpOworCisgICAgcmVtb3ZlQ29va2llQW5kVW5saW5rX2woaXQtPnNlY29uZC5jbGllbnQtPmFzQmluZGVyKCksIGl0LT5zZWNvbmQuY29va2llKTsKKworICAgIG1Qcm9jZXNzSW5mb092ZXJyaWRlTWFwLmVyYXNlKHBpZCk7Cit9CisKIFN0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjptYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoaW50MzJfdCBwaWQsIGludDY0X3QgY2xpZW50SWQpIHsKICAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgKICAgICAgICAgICAgICJtYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwocGlkICVkLCBjbGllbnRJZCAlbGxkKSIsCkBAIC02NTksOCArODQ3LDEwIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQocGlkKSkgewotICAgICAgICBBTE9HRSgiUmVqZWN0ZWQgbWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsIGNhbGwgd2l0aCBpbnZhbGlkIHBpZC4iKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOworICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOwogICAgIH0KICAgICBzc2l6ZV90IGluZGV4ID0gbU1hcC5pbmRleE9mS2V5KHBpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewpAQCAtNjgxLDYgKzg3MSwzOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZWNsYWltUmVzb3VyY2VzRnJvbUNsaWVudHNQZW5kaW5nUmVtb3ZhbChpbnQzMl90IHBpZCkgeworICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJyZWNsYWltUmVzb3VyY2VzRnJvbUNsaWVudHNQZW5kaW5nUmVtb3ZhbChwaWQgJWQpIiwgcGlkKTsKKyAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CisKKyAgICBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiBjbGllbnRzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7CisgICAgICAgICAgICBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOworICAgICAgICAgICAgcGlkID0gY2FsbGluZ1BpZDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlIDoge01lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0RybVNlc3Npb259KSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OworICAgICAgICAgICAgaWYgKGdldEJpZ2dlc3RDbGllbnRfbChwaWQsIHR5cGUsICZjbGllbnQsIHRydWUgLyogcGVuZGluZ1JlbW92YWxPbmx5ICovKSkgeworICAgICAgICAgICAgICAgIGNsaWVudHMuYWRkKGNsaWVudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWNsaWVudHMuZW1wdHkoKSkgeworICAgICAgICByZWNsYWltSW50ZXJuYWwoY2xpZW50cyk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIGJvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0UHJpb3JpdHlfbChpbnQgcGlkLCBpbnQqIHByaW9yaXR5KSB7CiAgICAgaW50IG5ld1BpZCA9IHBpZDsKIApAQCAtODA0LDcgKzEwMjYsOCBAQAogICAgICAgICBib29sIHBlbmRpbmdSZW1vdmFsT25seSkgewogICAgIHNzaXplX3QgaW5kZXggPSBtTWFwLmluZGV4T2ZLZXkocGlkKTsKICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRCaWdnZXN0Q2xpZW50X2w6IGNhbid0IGZpbmQgcmVzb3VyY2UgaW5mbyBmb3IgcGlkICVkIiwgcGlkKTsKKyAgICAgICAgQUxPR0VfSUYoIXBlbmRpbmdSZW1vdmFsT25seSwKKyAgICAgICAgICAgICAgICAgImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSBpbmZvIGZvciBwaWQgJWQiLCBwaWQpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC04MjgsNyArMTA1MSw5IEBACiAgICAgfQogCiAgICAgaWYgKGNsaWVudFRlbXAgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0QmlnZ2VzdENsaWVudF9sOiBjYW4ndCBmaW5kIHJlc291cmNlIHR5cGUgJXMgZm9yIHBpZCAlZCIsIGFzU3RyaW5nKHR5cGUpLCBwaWQpOworICAgICAgICBBTE9HRV9JRighcGVuZGluZ1JlbW92YWxPbmx5LAorICAgICAgICAgICAgICAgICAiZ2V0QmlnZ2VzdENsaWVudF9sOiBjYW4ndCBmaW5kIHJlc291cmNlIHR5cGUgJXMgZm9yIHBpZCAlZCIsCisgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHR5cGUpLCBwaWQpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggZWU5ODJiNy4uOWMyNjM2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBTkRST0lEX01FRElBX1JFU09VUkNFTUFOQUdFUlNFUlZJQ0VfSAogCiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgogCiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgpAQCAtMzMsNiArMzQsNyBAQAogCiBjbGFzcyBEZWF0aE5vdGlmaWVyOwogY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTsKK2NsYXNzIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOwogY2xhc3MgU2VydmljZUxvZzsKIHN0cnVjdCBQcm9jZXNzSW5mb0ludGVyZmFjZTsKIApAQCAtNDMsMTQgKzQ1LDE0IEBACiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYVJlc291cmNlUG9saWN5UGFyY2VsOwogCiB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6dHVwbGU8Ci0gICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUsIHN0ZDo6dmVjdG9yPGludDhfdD4+LAorICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlLCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4sCiAgICAgICAgIE1lZGlhUmVzb3VyY2VQYXJjZWw+IFJlc291cmNlTGlzdDsKIAogc3RydWN0IFJlc291cmNlSW5mbyB7CiAgICAgaW50NjRfdCBjbGllbnRJZDsKICAgICB1aWRfdCB1aWQ7CiAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKLSAgICBzcDxEZWF0aE5vdGlmaWVyPiBkZWF0aE5vdGlmaWVyOworICAgIHVpbnRwdHJfdCBjb29raWV7MH07CiAgICAgUmVzb3VyY2VMaXN0IHJlc291cmNlczsKICAgICBib29sIHBlbmRpbmdSZW1vdmFse2ZhbHNlfTsKIH07CkBAIC01OSwyMiArNjEsNiBAQAogdHlwZWRlZiBLZXllZFZlY3RvcjxpbnQ2NF90LCBSZXNvdXJjZUluZm8+IFJlc291cmNlSW5mb3M7CiB0eXBlZGVmIEtleWVkVmVjdG9yPGludCwgUmVzb3VyY2VJbmZvcz4gUGlkUmVzb3VyY2VJbmZvc01hcDsKIAotY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBEZWF0aE5vdGlmaWVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiAmc2VydmljZSwKLSAgICAgICAgICAgIGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpOwotCi0gICAgfkRlYXRoTm90aWZpZXIoKSB7fQotCi0gICAgLy8gSW1wbGVtZW50IGRlYXRoIHJlY2lwaWVudAotICAgIHN0YXRpYyB2b2lkIEJpbmRlckRpZWRDYWxsYmFjayh2b2lkKiBjb29raWUpOwotICAgIHZvaWQgYmluZGVyRGllZCgpOwotCi1wcml2YXRlOgotICAgIHN0ZDo6d2Vha19wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7Ci0gICAgaW50IG1QaWQ7Ci0gICAgaW50NjRfdCBtQ2xpZW50SWQ7Ci19OwogY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlclNlcnZpY2UgewogcHVibGljOgogICAgIHN0cnVjdCBTeXN0ZW1DYWxsYmFja0ludGVyZmFjZSA6IHB1YmxpYyBSZWZCYXNlIHsKQEAgLTk1LDYgKzgxLDggQEAKICAgICAgICAgICAgIGNvbnN0IHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiAmcHJvY2Vzc0luZm8sCiAgICAgICAgICAgICBjb25zdCBzcDxTeXN0ZW1DYWxsYmFja0ludGVyZmFjZT4gJnN5c3RlbVJlc291cmNlKTsKICAgICB2aXJ0dWFsIH5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCk7CisgICAgdm9pZCBzZXRPYnNlcnZlclNlcnZpY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+JiBvYnNlcnZlclNlcnZpY2UpOwogCiAgICAgLy8gSVJlc291cmNlTWFuYWdlclNlcnZpY2UgaW50ZXJmYWNlCiAgICAgU3RhdHVzIGNvbmZpZyhjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5UGFyY2VsPiYgcG9saWNpZXMpIG92ZXJyaWRlOwpAQCAtMTI1LDEyICsxMTMsMjcgQEAKICAgICAgICAgICAgIGludCBvcmlnaW5hbFBpZCwKICAgICAgICAgICAgIGludCBuZXdQaWQpIG92ZXJyaWRlOwogCisgICAgU3RhdHVzIG92ZXJyaWRlUHJvY2Vzc0luZm8oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICBpbnQgcHJvY1N0YXRlLAorICAgICAgICAgICAgaW50IG9vbVNjb3JlKSBvdmVycmlkZTsKKwogICAgIFN0YXR1cyBtYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoaW50MzJfdCBwaWQsIGludDY0X3QgY2xpZW50SWQpIG92ZXJyaWRlOwogCisgICAgU3RhdHVzIHJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKGludDMyX3QgcGlkKSBvdmVycmlkZTsKKwogICAgIFN0YXR1cyByZW1vdmVSZXNvdXJjZShpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkLCBib29sIGNoZWNrVmFsaWQpOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdDsKKyAgICBmcmllbmQgY2xhc3MgRGVhdGhOb3RpZmllcjsKKyAgICBmcmllbmQgY2xhc3MgT3ZlcnJpZGVQcm9jZXNzSW5mb0RlYXRoTm90aWZpZXI7CisKKyAgICAvLyBSZWNsYWltcyByZXNvdXJjZXMgZnJvbSB8Y2xpZW50c3wuIFJldHVybnMgdHJ1ZSBpZiByZWNsYWltIHN1Y2NlZWRlZAorICAgIC8vIGZvciBhbGwgY2xpZW50cy4KKyAgICBib29sIHJlY2xhaW1JbnRlcm5hbCgKKyAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICZjbGllbnRzKTsKIAogICAgIC8vIEdldHMgdGhlIGxpc3Qgb2YgYWxsIHRoZSBjbGllbnRzIHdobyBvd24gdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlLgogICAgIC8vIFJldHVybnMgZmFsc2UgaWYgYW55IGNsaWVudCBiZWxvbmdzIHRvIGEgcHJvY2VzcyB3aXRoIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZQpAQCAtMTcwLDYgKzE3MywxMiBAQAogICAgIC8vIEdldCBwcmlvcml0eSBmcm9tIHByb2Nlc3MncyBwaWQKICAgICBib29sIGdldFByaW9yaXR5X2woaW50IHBpZCwgaW50KiBwcmlvcml0eSk7CiAKKyAgICB2b2lkIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUoaW50IHBpZCk7CisKKyAgICB2b2lkIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGVfbChpbnQgcGlkKTsKKyAgICB1aW50cHRyX3QgYWRkQ29va2llQW5kTGlua19sKDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciwgY29uc3Qgc3A8RGVhdGhOb3RpZmllcj4mIG5vdGlmaWVyKTsKKyAgICB2b2lkIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciwgdWludHB0cl90IGNvb2tpZSk7CisKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBtUHJvY2Vzc0luZm87CiAgICAgc3A8U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2U+IG1TeXN0ZW1DQjsKQEAgLTE3OSw3ICsxODgsMTcgQEAKICAgICBib29sIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYzsKICAgICBpbnQzMl90IG1DcHVCb29zdENvdW50OwogICAgIDo6bmRrOjpTY29wZWRBSUJpbmRlcl9EZWF0aFJlY2lwaWVudCBtRGVhdGhSZWNpcGllbnQ7CisgICAgc3RydWN0IFByb2Nlc3NJbmZvT3ZlcnJpZGUgeworICAgICAgICB1aW50cHRyX3QgY29va2llOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OworICAgIH07CiAgICAgc3RkOjptYXA8aW50LCBpbnQ+IG1PdmVycmlkZVBpZE1hcDsKKyAgICBzdGQ6Om1hcDxwaWRfdCwgUHJvY2Vzc0luZm9PdmVycmlkZT4gbVByb2Nlc3NJbmZvT3ZlcnJpZGVNYXA7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc0Nvb2tpZUxvY2s7CisgICAgc3RhdGljIHVpbnRwdHJfdCBzQ29va2llQ291bnRlciBHVUFSREVEX0JZKHNDb29raWVMb2NrKTsKKyAgICBzdGF0aWMgc3RkOjptYXA8dWludHB0cl90LCBzcDxEZWF0aE5vdGlmaWVyPiA+IHNDb29raWVUb0RlYXRoTm90aWZpZXJNYXAKKyAgICAgICAgICAgIEdVQVJERURfQlkoc0Nvb2tpZUxvY2spOworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyU2VydmljZT4gbU9ic2VydmVyU2VydmljZTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2M2ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMzIwIEBACisvKioKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlUGFyY2VsLmg+CisKKyNpbmNsdWRlICJSZXNvdXJjZU9ic2VydmVyU2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhUmVzb3VyY2VQYXJjZWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYU9ic2VydmFibGVFdmVudDsKKworLy8gTWVkaWFPYnNlcnZhYmxlRXZlbnQgd2lsbCBiZSB1c2VkIGFzIHVpbnQ2NF90IGZsYWdzLgorc3RhdGljX2Fzc2VydChzaXplb2YoTWVkaWFPYnNlcnZhYmxlRXZlbnQpID09IHNpemVvZih1aW50NjRfdCkpOworCitzdGF0aWMgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlRXZlbnQ+IHNFdmVudHMgPSB7CisgICAgICAgIE1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprQnVzeSwKKyAgICAgICAgTWVkaWFPYnNlcnZhYmxlRXZlbnQ6OmtJZGxlLAorfTsKKworc3RhdGljIE1lZGlhT2JzZXJ2YWJsZVR5cGUgZ2V0T2JzZXJ2YWJsZVR5cGUoY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcmVzKSB7CisgICAgaWYgKHJlcy5zdWJUeXBlID09IE1lZGlhUmVzb3VyY2VTdWJUeXBlOjprVmlkZW9Db2RlYykgeworICAgICAgICBpZiAocmVzLnR5cGUgPT0gTWVkaWFSZXNvdXJjZVR5cGU6OmtOb25TZWN1cmVDb2RlYykgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMudHlwZSA9PSBNZWRpYVJlc291cmNlVHlwZTo6a1NlY3VyZUNvZGVjKSB7CisgICAgICAgICAgICByZXR1cm4gTWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE1lZGlhT2JzZXJ2YWJsZVR5cGU6OmtJbnZhbGlkOworfQorCisvL3N0YXRpYworc3RkOjptdXRleCBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6c0RlYXRoUmVjaXBpZW50TG9jazsKKy8vc3RhdGljCitzdGQ6Om1hcDx1aW50cHRyX3QsIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6RGVhdGhSZWNpcGllbnQ+ID4KK1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpzRGVhdGhSZWNpcGllbnRNYXA7CisKK3N0cnVjdCBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6RGVhdGhSZWNpcGllbnQgeworICAgIERlYXRoUmVjaXBpZW50KFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlKiBfc2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VPYnNlcnZlcj4mIF9vYnNlcnZlcikKKyAgICAgICAgOiBzZXJ2aWNlKF9zZXJ2aWNlKSwgb2JzZXJ2ZXIoX29ic2VydmVyKSB7fQorICAgIH5EZWF0aFJlY2lwaWVudCgpIHt9CisKKyAgICB2b2lkIGJpbmRlckRpZWQoKSB7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPnVucmVnaXN0ZXJPYnNlcnZlcihvYnNlcnZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSZXNvdXJjZU9ic2VydmVyU2VydmljZSogc2VydmljZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlT2JzZXJ2ZXI+IG9ic2VydmVyOworfTsKKworLy8gc3RhdGljCit2b2lkIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKSB7CisgICAgdWludHB0cl90IGlkID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGNvb2tpZSk7CisKKyAgICBBTE9HVygiT2JzZXJ2ZXIgJWxsZCBpcyBkZWFkIiwgKGxvbmcgbG9uZylpZCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8RGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudDsKKworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre3NEZWF0aFJlY2lwaWVudExvY2t9OworCisgICAgICAgIGF1dG8gaXQgPSBzRGVhdGhSZWNpcGllbnRNYXAuZmluZChpZCk7CisgICAgICAgIGlmIChpdCAhPSBzRGVhdGhSZWNpcGllbnRNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHJlY2lwaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVjaXBpZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVjaXBpZW50LT5iaW5kZXJEaWVkKCk7CisgICAgfQorfQorCisvL3N0YXRpYworc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPiBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPiBvYnNlcnZlclNlcnZpY2UgPQorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+KCk7CisgICAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IEFTZXJ2aWNlTWFuYWdlcl9hZGRTZXJ2aWNlKG9ic2VydmVyU2VydmljZS0+YXNCaW5kZXIoKS5nZXQoKSwKKyAgICAgICAgICAgIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpnZXRTZXJ2aWNlTmFtZSgpKTsKKyAgICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG9ic2VydmVyU2VydmljZTsKK30KKworUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6OlJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlKCkKKyAgICA6IG1EZWF0aFJlY2lwaWVudChBSUJpbmRlcl9EZWF0aFJlY2lwaWVudF9uZXcoQmluZGVyRGllZENhbGxiYWNrKSkge30KKworYmluZGVyX3N0YXR1c190IFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IGNoYXIqKiAvKmFyZ3MqLywgdWludDMyX3QgLypudW1BcmdzKi8pIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgeworICAgICAgICByZXN1bHQuZm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgICAgICJjYW4ndCBkdW1wIFJlc291cmNlTWFuYWdlclNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJSZXNvdXJjZU9ic2VydmVyU2VydmljZTogJXBcbiIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgUmVnaXN0ZXJlZCBPYnNlcnZlcnM6ICV6dVxuIiwgbU9ic2VydmVySW5mb01hcC5zaXplKCkpOworCisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bU9ic2VydmVyTG9ja307CisKKyAgICAgICAgZm9yIChhdXRvICZvYnNlcnZlciA6IG1PYnNlcnZlckluZm9NYXApIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBPYnNlcnZlciAlcDpcbiIsIG9ic2VydmVyLnNlY29uZC5iaW5kZXIuZ2V0KCkpOworICAgICAgICAgICAgZm9yIChhdXRvICZvYnNlcnZhYmxlIDogb2JzZXJ2ZXIuc2Vjb25kLmZpbHRlcnMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGVuYWJsZWRFdmVudHNTdHI7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvICZldmVudCA6IHNFdmVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3Qpb2JzZXJ2YWJsZS5ldmVudEZpbHRlciAmICh1aW50NjRfdClldmVudCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmFibGVkRXZlbnRzU3RyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRFdmVudHNTdHIuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkRXZlbnRzU3RyLmFwcGVuZCh0b1N0cmluZyhldmVudCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcob2JzZXJ2YWJsZS50eXBlKS5jX3N0cigpLCBlbmFibGVkRXZlbnRzU3RyLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE9LOworfQorCitTdGF0dXMgUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6OnJlZ2lzdGVyT2JzZXJ2ZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VPYnNlcnZlcj4mIGluX29ic2VydmVyLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVGaWx0ZXI+JiBpbl9maWx0ZXJzKSB7CisgICAgaWYgKChnZXRwaWQoKSAhPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCkpICYmCisgICAgICAgICAgICBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5SRUdJU1RFUl9NRURJQV9SRVNPVVJDRV9PQlNFUlZFUiIpKSA9PSBmYWxzZSkgeworICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgICAgICAgICAiY2FuJ3QgcmVnaXN0ZXJPYnNlcnZlciBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAorICAgICAgICAgICAgICAgIEFJQmluZGVyX2dldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoUEVSTUlTU0lPTl9ERU5JRUQpOworICAgIH0KKworICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciA9IGluX29ic2VydmVyLT5hc0JpbmRlcigpOworCisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bU9ic2VydmVyTG9ja307CisKKyAgICAgICAgaWYgKG1PYnNlcnZlckluZm9NYXAuZmluZCgodWludHB0cl90KWJpbmRlci5nZXQoKSkgIT0gbU9ic2VydmVySW5mb01hcC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEFMUkVBRFlfRVhJU1RTKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbl9maWx0ZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIG9ic2VydmVyIGluZm8uCisgICAgICAgIG1PYnNlcnZlckluZm9NYXAuZW1wbGFjZSgodWludHB0cl90KWJpbmRlci5nZXQoKSwKKyAgICAgICAgICAgICAgICBPYnNlcnZlckluZm97YmluZGVyLCBpbl9vYnNlcnZlciwgaW5fZmlsdGVyc30pOworCisgICAgICAgIC8vIEFkZCBvYnNlcnZlciB0byBvYnNlcnZhYmxlLT5zdWJzY3JpYmVycyBtYXAuCisgICAgICAgIGZvciAoYXV0byAmZmlsdGVyIDogaW5fZmlsdGVycykgeworICAgICAgICAgICAgZm9yIChhdXRvICZldmVudCA6IHNFdmVudHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoISgodWludDY0X3QpZmlsdGVyLmV2ZW50RmlsdGVyICYgKHVpbnQ2NF90KWV2ZW50KSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWVkaWFPYnNlcnZhYmxlRmlsdGVyIGtleXtmaWx0ZXIudHlwZSwgZXZlbnR9OworICAgICAgICAgICAgICAgIG1PYnNlcnZhYmxlVG9TdWJzY3JpYmVyc01hcFtrZXldLmVtcGxhY2UoKHVpbnRwdHJfdCliaW5kZXIuZ2V0KCksIGluX29ic2VydmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFkZCBkZWF0aCBiaW5kZXIgYW5kIGxpbmsuCisgICAgdWludHB0cl90IGNvb2tpZSA9ICh1aW50cHRyX3QpYmluZGVyLmdldCgpOworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre3NEZWF0aFJlY2lwaWVudExvY2t9OworICAgICAgICBzRGVhdGhSZWNpcGllbnRNYXAuZW1wbGFjZSgKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6bWFrZV9zaGFyZWQ8RGVhdGhSZWNpcGllbnQ+KHRoaXMsIGluX29ic2VydmVyKSk7CisgICAgfQorCisgICAgQUlCaW5kZXJfbGlua1RvRGVhdGgoYmluZGVyLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oY29va2llKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6OnVucmVnaXN0ZXJPYnNlcnZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU9ic2VydmVyPiYgaW5fb2JzZXJ2ZXIpIHsKKyAgICBpZiAoKGdldHBpZCgpICE9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKSkgJiYKKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLlJFR0lTVEVSX01FRElBX1JFU09VUkNFX09CU0VSVkVSIikpID09IGZhbHNlKSB7CisgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgICAgICJjYW4ndCB1bnJlZ2lzdGVyT2JzZXJ2ZXIgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICB9CisKKyAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIgPSBpbl9vYnNlcnZlci0+YXNCaW5kZXIoKTsKKworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21PYnNlcnZlckxvY2t9OworCisgICAgICAgIGF1dG8gaXQgPSBtT2JzZXJ2ZXJJbmZvTWFwLmZpbmQoKHVpbnRwdHJfdCliaW5kZXIuZ2V0KCkpOworICAgICAgICBpZiAoaXQgPT0gbU9ic2VydmVySW5mb01hcC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKE5BTUVfTk9UX0ZPVU5EKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBvYnNlcnZlciBmcm9tIG9ic2VydmFibGUtPnN1YnNjcmliZXJzIG1hcC4KKyAgICAgICAgZm9yIChhdXRvICZmaWx0ZXIgOiBpdC0+c2Vjb25kLmZpbHRlcnMpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byAmZXZlbnQgOiBzRXZlbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoKHVpbnQ2NF90KWZpbHRlci5ldmVudEZpbHRlciAmICh1aW50NjRfdClldmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1lZGlhT2JzZXJ2YWJsZUZpbHRlciBrZXl7ZmlsdGVyLnR5cGUsIGV2ZW50fTsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2YWJsZVRvU3Vic2NyaWJlcnNNYXBba2V5XS5lcmFzZSgodWludHB0cl90KWJpbmRlci5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICAvL1JlbW92ZSB0aGUgZW50cnkgaWYgdGhlcmUncyBubyBtb3JlIHN1YnNjcmliZXJzLgorICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2YWJsZVRvU3Vic2NyaWJlcnNNYXBba2V5XS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1PYnNlcnZhYmxlVG9TdWJzY3JpYmVyc01hcC5lcmFzZShrZXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBvYnNlcnZlciBpbmZvLgorICAgICAgICBtT2JzZXJ2ZXJJbmZvTWFwLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICAvLyBVbmxpbmsgYW5kIHJlbW92ZSBkZWF0aCBiaW5kZXIuCisgICAgdWludHB0cl90IGNvb2tpZSA9ICh1aW50cHRyX3QpYmluZGVyLmdldCgpOworICAgIEFJQmluZGVyX3VubGlua1RvRGVhdGgoYmluZGVyLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihjb29raWUpKTsKKworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre3NEZWF0aFJlY2lwaWVudExvY2t9OworICAgICAgICBzRGVhdGhSZWNpcGllbnRNYXAuZXJhc2UoY29va2llKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCit2b2lkIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpub3RpZnlPYnNlcnZlcnMoCisgICAgICAgIE1lZGlhT2JzZXJ2YWJsZUV2ZW50IGV2ZW50LCBpbnQgdWlkLCBpbnQgcGlkLCBjb25zdCBSZXNvdXJjZUxpc3QgJnJlc291cmNlcykgeworICAgIHN0cnVjdCBDYWxsZWVJbmZvIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU9ic2VydmVyPiBvYnNlcnZlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlUGFyY2VsPiBtb25pdG9yczsKKyAgICB9OworICAgIC8vIEJ1aWxkIGEgY29uc29saWRhdGVkIGxpc3Qgb2Ygb2JzZXJ2ZXJzIHRvIGNhbGwgd2l0aCB0aGVpciByZXNwZWN0aXZlIG9ic2VydmFibGVzLgorICAgIHN0ZDo6bWFwPHVpbnRwdHJfdCwgQ2FsbGVlSW5mbz4gY2FsbGVlTGlzdDsKKworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21PYnNlcnZlckxvY2t9OworCisgICAgICAgIGZvciAoYXV0byAmcmVzIDogcmVzb3VyY2VzKSB7CisgICAgICAgICAgICAvLyBTa2lwIGlmIHRoaXMgcmVzb3VyY2UgZG9lc24ndCBtYXAgdG8gYW55IG9ic2VydmFibGUgdHlwZS4KKyAgICAgICAgICAgIE1lZGlhT2JzZXJ2YWJsZVR5cGUgb2JzZXJ2YWJsZVR5cGUgPSBnZXRPYnNlcnZhYmxlVHlwZShyZXMuc2Vjb25kKTsKKyAgICAgICAgICAgIGlmIChvYnNlcnZhYmxlVHlwZSA9PSBNZWRpYU9ic2VydmFibGVUeXBlOjprSW52YWxpZCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFPYnNlcnZhYmxlRmlsdGVyIGtleXtvYnNlcnZhYmxlVHlwZSwgZXZlbnR9OworICAgICAgICAgICAgLy8gU2tpcCBpZiBubyBvbmUgc3Vic2NyaWJlZCB0byB0aGlzIG9ic2VydmFibGUuCisgICAgICAgICAgICBhdXRvIG9ic2VydmFibGVJdCA9IG1PYnNlcnZhYmxlVG9TdWJzY3JpYmVyc01hcC5maW5kKGtleSk7CisgICAgICAgICAgICBpZiAob2JzZXJ2YWJsZUl0ID09IG1PYnNlcnZhYmxlVG9TdWJzY3JpYmVyc01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzdWJzcmliZXJzLgorICAgICAgICAgICAgZm9yIChhdXRvICZzdWJzY3JpYmVyIDogb2JzZXJ2YWJsZUl0LT5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGNhbGxlZUl0ID0gY2FsbGVlTGlzdC5maW5kKHN1YnNjcmliZXIuZmlyc3QpOworICAgICAgICAgICAgICAgIGlmIChjYWxsZWVJdCA9PSBjYWxsZWVMaXN0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxlZUxpc3QuZW1wbGFjZShzdWJzY3JpYmVyLmZpcnN0LCBDYWxsZWVJbmZveworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5zZWNvbmQsIHt7b2JzZXJ2YWJsZVR5cGUsIHJlcy5zZWNvbmQudmFsdWV9fX0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxlZUl0LT5zZWNvbmQubW9uaXRvcnMucHVzaF9iYWNrKHtvYnNlcnZhYmxlVHlwZSwgcmVzLnNlY29uZC52YWx1ZX0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZpbmFsbHkgY2FsbCB0aGUgb2JzZXJ2ZXJzIGFib3V0IHRoZSBzdGF0dXMgY2hhbmdlLgorICAgIGZvciAoYXV0byAmY2FsbGVlSW5mbyA6IGNhbGxlZUxpc3QpIHsKKyAgICAgICAgY2FsbGVlSW5mby5zZWNvbmQub2JzZXJ2ZXItPm9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICBldmVudCwgdWlkLCBwaWQsIGNhbGxlZUluZm8uc2Vjb25kLm1vbml0b3JzKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6Om9uUmVzb3VyY2VBZGRlZCgKKyAgICAgICAgaW50IHVpZCwgaW50IHBpZCwgY29uc3QgUmVzb3VyY2VMaXN0ICZyZXNvdXJjZXMpIHsKKyAgICBub3RpZnlPYnNlcnZlcnMoTWVkaWFPYnNlcnZhYmxlRXZlbnQ6OmtCdXN5LCB1aWQsIHBpZCwgcmVzb3VyY2VzKTsKK30KKwordm9pZCBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6b25SZXNvdXJjZVJlbW92ZWQoCisgICAgICAgIGludCB1aWQsIGludCBwaWQsIGNvbnN0IFJlc291cmNlTGlzdCAmcmVzb3VyY2VzKSB7CisgICAgbm90aWZ5T2JzZXJ2ZXJzKE1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprSWRsZSwgdWlkLCBwaWQsIHJlc291cmNlcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU9ic2VydmVyU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmM1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU9ic2VydmVyU2VydmljZS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qKgorICoKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1JFU09VUkNFX09CU0VSVkVSX1NFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1JFU09VUkNFX09CU0VSVkVSX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuaD4KKyNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6SVJlc291cmNlT2JzZXJ2ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYU9ic2VydmFibGVGaWx0ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYU9ic2VydmFibGVQYXJjZWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYU9ic2VydmFibGVUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlRXZlbnQ7CisKK2NsYXNzIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIDogcHVibGljIEJuUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UgeworcHVibGljOgorCisgICAgc3RhdGljIGNoYXIgY29uc3QgKmdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnJlc291cmNlX29ic2VydmVyIjsgfQorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+IGluc3RhbnRpYXRlKCk7CisKKyAgICB2aXJ0dWFsIGlubGluZSBiaW5kZXJfc3RhdHVzX3QgZHVtcCgKKyAgICAgICAgICAgIGludCAvKmZkKi8sIGNvbnN0IGNoYXIqKiAvKmFyZ3MqLywgdWludDMyX3QgLypudW1BcmdzKi8pOworCisgICAgUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UoKTsKKyAgICB2aXJ0dWFsIH5SZXNvdXJjZU9ic2VydmVyU2VydmljZSgpIHt9CisKKyAgICAvLyBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UgaW50ZXJmYWNlCisgICAgU3RhdHVzIHJlZ2lzdGVyT2JzZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU9ic2VydmVyPiYgaW5fb2JzZXJ2ZXIsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVGaWx0ZXI+JiBpbl9maWx0ZXJzKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyB1bnJlZ2lzdGVyT2JzZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU9ic2VydmVyPiYgaW5fb2JzZXJ2ZXIpIG92ZXJyaWRlOworICAgIC8vIH5JUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UgaW50ZXJmYWNlCisKKyAgICAvLyBDYWxsZWQgYnkgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSB3aGVuIHJlc291cmNlcyBhcmUgYWRkZWQuCisgICAgdm9pZCBvblJlc291cmNlQWRkZWQoaW50IHVpZCwgaW50IHBpZCwgY29uc3QgUmVzb3VyY2VMaXN0ICZyZXNvdXJjZXMpOworCisgICAgLy8gQ2FsbGVkIGJ5IFJlc291cmNlTWFuYWdlclNlcnZpY2Ugd2hlbiByZXNvdXJjZXMgYXJlIHJlbW92ZWQuCisgICAgdm9pZCBvblJlc291cmNlUmVtb3ZlZChpbnQgdWlkLCBpbnQgcGlkLCBjb25zdCBSZXNvdXJjZUxpc3QgJnJlc291cmNlcyk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IE9ic2VydmVySW5mbyB7CisgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU9ic2VydmVyPiBvYnNlcnZlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlRmlsdGVyPiBmaWx0ZXJzOworICAgIH07CisgICAgc3RydWN0IERlYXRoUmVjaXBpZW50OworCisgICAgLy8gQmVsb3cgbWFwcyBhcmUgYWxsIGtleWVkIG9uIHRoZSBvYnNlcnZlcidzIGJpbmRlciBwdHIgdmFsdWUuCisgICAgdXNpbmcgT2JzZXJ2ZXJJbmZvTWFwID0gc3RkOjptYXA8dWludHB0cl90LCBPYnNlcnZlckluZm8+OworICAgIHVzaW5nIFN1YnNjcmliZXJNYXAgPSBzdGQ6Om1hcDx1aW50cHRyX3QsIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VPYnNlcnZlcj4+OworCisgICAgc3RkOjptdXRleCBtT2JzZXJ2ZXJMb2NrOworICAgIC8vIEJpbmRlci0+T2JzZXJ2ZXJJbmZvCisgICAgT2JzZXJ2ZXJJbmZvTWFwIG1PYnNlcnZlckluZm9NYXAgR1VBUkRFRF9CWShtT2JzZXJ2ZXJMb2NrKTsKKyAgICAvLyBPYnNlcnZhYmxlKDx0eXBlLGV2ZW50PiktPlN1YnNjcmliZXJzCisgICAgc3RkOjptYXA8TWVkaWFPYnNlcnZhYmxlRmlsdGVyLCBTdWJzY3JpYmVyTWFwPiBtT2JzZXJ2YWJsZVRvU3Vic2NyaWJlcnNNYXAKKyAgICAgICAgICAgIEdVQVJERURfQlkobU9ic2VydmVyTG9jayk7CisKKyAgICA6Om5kazo6U2NvcGVkQUlCaW5kZXJfRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OworCisgICAgLy8gQmluZGVyIGRlYXRoIGhhbmRsaW5nLgorICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNEZWF0aFJlY2lwaWVudExvY2s7CisgICAgc3RhdGljIHN0ZDo6bWFwPHVpbnRwdHJfdCwgc3RkOjpzaGFyZWRfcHRyPERlYXRoUmVjaXBpZW50Pj4gc0RlYXRoUmVjaXBpZW50TWFwCisgICAgICAgICAgICBHVUFSREVEX0JZKHNEZWF0aFJlY2lwaWVudExvY2spOworICAgIHN0YXRpYyB2b2lkIEJpbmRlckRpZWRDYWxsYmFjayh2b2lkKiBjb29raWUpOworCisgICAgdm9pZCBub3RpZnlPYnNlcnZlcnMoTWVkaWFPYnNlcnZhYmxlRXZlbnQgZXZlbnQsCisgICAgICAgICAgICBpbnQgdWlkLCBpbnQgcGlkLCBjb25zdCBSZXNvdXJjZUxpc3QgJnJlc291cmNlcyk7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBX1JFU09VUkNFX09CU0VSVkVSX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvVEVTVF9NQVBQSU5HCmluZGV4IDQxOGIxNTkuLjUyYWQ0NDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1RFU1RfTUFQUElORworKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9URVNUX01BUFBJTkcKQEAgLTUsNiArNSw5IEBACiAgICAgfSwKICAgICB7CiAgICAgICAgIm5hbWUiOiAiU2VydmljZUxvZ190ZXN0IgorICAgIH0sCisgICAgeworICAgICAgICJuYW1lIjogIlJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlX3Rlc3QiCiAgICAgfQogICBdCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuYWlkbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuYWlkbApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTBhNTBmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSwxMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFSZXNvdXJjZVBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWw7CisKKy8qKgorICogUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBpbnRlcmZhY2UgdGhhdCBrZWVwcyB0cmFjayBvZiBtZWRpYSByZXNvdXJjZQorICogb3duZWQgYnkgY2xpZW50cywgYW5kIHJlY2xhaW1zIHJlc291cmNlcyBiYXNlZCBvbiBjb25maWd1cmVkIHBvbGljaWVzCisgKiB3aGVuIG5lY2Vzc2FyeS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSB7CisgICAgY29uc3QgQHV0ZjhJbkNwcCBTdHJpbmcga1BvbGljeVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MKKyAgICAgICAgICAgID0gInN1cHBvcnRzLW11bHRpcGxlLXNlY3VyZS1jb2RlY3MiOworICAgIGNvbnN0IEB1dGY4SW5DcHAgU3RyaW5nIGtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYworICAgICAgICAgICAgPSAic3VwcG9ydHMtc2VjdXJlLXdpdGgtbm9uLXNlY3VyZS1jb2RlYyI7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIFJlc291cmNlTWFuYWdlclNlcnZpY2UgdG8gYWRvcHRlZCBwYXJ0aWN1bGFyIHBvbGljaWVzIHdoZW4KKyAgICAgKiBtYW5hZ2luZyB0aGUgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHBvbGljaWVzIGFuIGFycmF5IG9mIHBvbGljaWVzIHRvIGJlIGFkb3B0ZWQuCisgICAgICovCisgICAgdm9pZCBjb25maWcoaW4gTWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbFtdIHBvbGljaWVzKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGNsaWVudCB0byBhIHByb2Nlc3Mgd2l0aCBhIGxpc3Qgb2YgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHBpZCBwaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gdWlkIHVpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBjbGllbnRJZCBhbiBpZGVudGlmaWVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY2xpZW50IHdpdGhpbiB0aGUgcGlkLgorICAgICAqIEBwYXJhbSBjbGllbnQgaW50ZXJmYWNlIGZvciB0aGUgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSB0byBjYWxsIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiByZXNvdXJjZXMgdG8gYmUgYWRkZWQuCisgICAgICovCisgICAgdm9pZCBhZGRSZXNvdXJjZSgKKyAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICBpbnQgdWlkLAorICAgICAgICAgICAgbG9uZyBjbGllbnRJZCwKKyAgICAgICAgICAgIElSZXNvdXJjZU1hbmFnZXJDbGllbnQgY2xpZW50LAorICAgICAgICAgICAgaW4gTWVkaWFSZXNvdXJjZVBhcmNlbFtdIHJlc291cmNlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGxpc3RlZCByZXNvdXJjZXMgZnJvbSBhIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaWQgcGlkIGZyb20gd2hpY2ggdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgY2xpZW50SWQgd2l0aGluIHRoZSBwaWQgZnJvbSB3aGljaCB0aGUgbGlzdCBvZiByZXNvdXJjZXMgd2lsbCBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgcmVzb3VyY2VzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY2xpZW50LgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgbG9uZyBjbGllbnRJZCwgaW4gTWVkaWFSZXNvdXJjZVBhcmNlbFtdIHJlc291cmNlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHJlc291cmNlcyBmcm9tIGEgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHBpZCBwaWQgZnJvbSB3aGljaCB0aGUgY2xpZW50J3MgcmVzb3VyY2VzIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgY2xpZW50SWQgd2l0aGluIHRoZSBwaWQgdGhhdCB3aWxsIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmVDbGllbnQoaW50IHBpZCwgbG9uZyBjbGllbnRJZCk7CisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byByZWNsYWltIHJlc291cmNlIGZyb20gcHJvY2Vzc2VzIHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUKKyAgICAgKiBjYWxsaW5nIHByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxpbmdQaWQgcGlkIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiByZXNvdXJjZXMgdG8gYmUgcmVjbGFpbWVkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNsYWltIHdhcyBzdWNjZXNzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiByZWNsYWltUmVzb3VyY2UoaW50IGNhbGxpbmdQaWQsIGluIE1lZGlhUmVzb3VyY2VQYXJjZWxbXSByZXNvdXJjZXMpOworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIHBpZCBvZiBvcmlnaW5hbCBjYWxsaW5nIHByb2Nlc3Mgd2l0aCB0aGUgcGlkIG9mIHRoZSBwcm9jZXNzCisgICAgICogd2hvIGFjdHVhbGx5IHVzZSB0aGUgcmVxdWVzdGVkIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcmlnaW5hbFBpZCBwaWQgb2YgdGhlIG9yaWdpbmFsIGNhbGxpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gbmV3UGlkIHBpZCBvZiB0aGUgYWN0dWFsIHByb2Nlc3Mgd2hvIHVzZSB0aGUgcmVzb3VyY2VzLgorICAgICAqICAgICAgICByZW1vdmUgZXhpc3Rpbmcgb3ZlcnJpZGUgb24gb3JpZ2luYWxQaWQgaWYgbmV3UGlkIGlzIC0xLgorICAgICAqLworICAgIHZvaWQgb3ZlcnJpZGVQaWQoaW50IG9yaWdpbmFsUGlkLCBpbnQgbmV3UGlkKTsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSBwcm9jZXNzIHN0YXRlIGFuZCBPT00gc2NvcmUgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB3aXRoIHRoZQorICAgICAqIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBUaGlzIGlzIHVzZWQgYnkgbmF0aXZlIHNlcnZpY2UgcHJvY2Vzc2VzIHRvIHNwZWNpZnkKKyAgICAgKiB0aGVzZSB2YWx1ZXMgZm9yIFJlc291cmNlTWFuYWdlclNlcnZpY2UgdG8gdXNlLiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHVzdWFsbHkKKyAgICAgKiBnZXRzIHRoZXNlIHZhbHVlcyBmcm9tIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UsIGhvd2V2ZXIsIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UKKyAgICAgKiBkb2Vzbid0IHRyYWNrIG5hdGl2ZSBzZXJ2aWNlIHByb2Nlc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnQgYSB0b2tlbiBmb3IgdGhlIFJlc291cmNlTWFuYWdlclNlcnZpY2UgdG8gbGluayB0byB0aGUgY2FsbGVyIGFuZAorICAgICAqICAgICAgICAgICAgICByZWNlaXZlIG5vdGlmaWNhdGlvbiBpZiBpdCBnb2VzIGF3YXkuIFRoaXMgaXMgbmVlZGVkIGZvciBjbGVhcmluZworICAgICAqICAgICAgICAgICAgICB0aGUgb3ZlcnJpZGVzLgorICAgICAqIEBwYXJhbSBwaWQgcGlkIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHByb2NTdGF0ZSB0aGUgcHJvY2VzcyBzdGF0ZSB2YWx1ZSB0aGF0IFJlc291cmNlTWFuYWdlclNlcnZpY2Ugc2hvdWxkCisgICAgICogICAgICAgICAgICAgICAgICB1c2UgZm9yIHRoaXMgcGlkLgorICAgICAqIEBwYXJhbSBvb21TY29yZSB0aGUgb29tIHNjb3JlIHZhbHVlIHRoYXQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBzaG91bGQKKyAgICAgKiAgICAgICAgICAgICAgICAgIHVzZSBmb3IgdGhpcyBwaWQuCisgICAgICovCisgICAgdm9pZCBvdmVycmlkZVByb2Nlc3NJbmZvKAorICAgICAgICAgICAgSVJlc291cmNlTWFuYWdlckNsaWVudCBjbGllbnQsCisgICAgICAgICAgICBpbnQgcGlkLAorICAgICAgICAgICAgaW50IHByb2NTdGF0ZSwKKyAgICAgICAgICAgIGludCBvb21TY29yZSk7CisKKyAgICAvKioKKyAgICAgKiBNYXJrIGEgY2xpZW50IGZvciBwZW5kaW5nIHJlbW92YWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBwaWQgcGlkIGZyb20gd2hpY2ggdGhlIGNsaWVudCdzIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIHRoYXQgd2lsbCBiZSByZW1vdmVkLgorICAgICAqLworICAgIHZvaWQgbWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGludCBwaWQsIGxvbmcgY2xpZW50SWQpOworCisgICAgLyoqCisgICAgICogUmVjbGFpbSByZXNvdXJjZXMgZnJvbSBjbGllbnRzIHBlbmRpbmcgcmVtb3ZhbCwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIHBpZCBwaWQgZnJvbSB3aGljaCByZXNvdXJjZXMgd2lsbCBiZSByZWNsYWltZWQuCisgICAgICovCisgICAgdm9pZCByZWNsYWltUmVzb3VyY2VzRnJvbUNsaWVudHNQZW5kaW5nUmVtb3ZhbChpbnQgcGlkKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlci5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU9ic2VydmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyMDA5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlci5haWRsCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVFdmVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhT2JzZXJ2YWJsZVBhcmNlbDsKKworLyoqCisgKiBJUmVzb3VyY2VPYnNlcnZlciBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBvYnNlcnZhYmxlIHJlc291cmNlIHVwZGF0ZXMKKyAqIGZyb20gSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElSZXNvdXJjZU9ic2VydmVyIHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhbiBvYnNlcnZlZCByZXNvdXJjZSBpcyBncmFudGVkIHRvIGEgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IHRoZSBzdGF0dXMgY2hhbmdlIHRoYXQgaGFwcGVuZWQgdG8gdGhlIHJlc291cmNlLgorICAgICAqIEBwYXJhbSB1aWQgdWlkIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBpcyBhc3NvY2lhdGVkLgorICAgICAqIEBwYXJhbSBwaWQgcGlkIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBpcyBhc3NvY2lhdGVkLgorICAgICAqIEBwYXJhbSBvYnNlcnZhYmxlcyB0aGUgcmVzb3VyY2VzIHdob3NlIHN0YXR1cyBoYXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvblN0YXR1c0NoYW5nZWQoTWVkaWFPYnNlcnZhYmxlRXZlbnQgZXZlbnQsCisgICAgICAgIGludCB1aWQsIGludCBwaWQsIGluIE1lZGlhT2JzZXJ2YWJsZVBhcmNlbFtdIG9ic2VydmFibGVzKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY0Y2EwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU9ic2VydmVyU2VydmljZS5haWRsCkBAIC0wLDAgKzEsNDkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5JUmVzb3VyY2VPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhT2JzZXJ2YWJsZUZpbHRlcjsKKworLyoqCisgKiBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UgaW50ZXJmYWNlIGZvciByZWdpc3RlcmluZyBhbiBJUmVzb3VyY2VPYnNlcnZlcgorICogY2FsbGJhY2sgdG8gcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCBvYnNlcnZhYmxlIG1lZGlhIHJlc291cmNlcy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UgeworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgb24gdGhlIElSZXNvdXJjZU9ic2VydmVyU2VydmljZSB0byByZWNlaXZlCisgICAgICogc3RhdHVzIHVwZGF0ZXMgZm9yIG9ic2VydmFibGUgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBvYnNlcnZlciB0byByZWdpc3Rlci4KKyAgICAgKiBAcGFyYW0gZmlsdGVycyBhbiBhcnJheSBvZiBmaWx0ZXJzIGZvciByZXNvdXJjZXMgYW5kIGV2ZW50cyB0byByZWNlaXZlCisgICAgICogICAgICAgICAgICAgICAgdXBkYXRlcyBmb3IuCisgICAgICovCisgICAgdm9pZCByZWdpc3Rlck9ic2VydmVyKAorICAgICAgICAgICAgSVJlc291cmNlT2JzZXJ2ZXIgb2JzZXJ2ZXIsCisgICAgICAgICAgICBpbiBNZWRpYU9ic2VydmFibGVGaWx0ZXJbXSBmaWx0ZXJzKTsKKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLgorICAgICAqIFRoZSBvYnNlcnZlciB3aWxsIHN0b3AgcmVjZWl2aW5nIHRoZSBzdGF0dXMgdXBkYXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYnNlcnZlciB0aGUgb2JzZXJ2ZXIgdG8gdW5yZWdpc3Rlci4KKyAgICAgKi8KKyAgICB2b2lkIHVucmVnaXN0ZXJPYnNlcnZlcihJUmVzb3VyY2VPYnNlcnZlciBvYnNlcnZlcik7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRXZlbnQuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVFdmVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWIyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRXZlbnQuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBFbnVtcyBmb3IgbWVkaWEgb2JzZXJ2YWJsZSBldmVudHMuCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGFzIGJpdG1hc2tzIHRvIGluZGljYXRlIHRoZSBldmVudHMgdGhhdCB0aGUKKyAqIG9ic2VydmVyIGlzIGludGVyZXN0ZWQgaW4gaW4gdGhlIE1lZGlhT2JzZXJ2YWJsZUZpbHRlciBvYmplY3RzIHBhc3NlZCB0bworICogSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpyZWdpc3Rlck9ic2VydmVyKCkuCisgKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJsb25nIikKK2VudW0gTWVkaWFPYnNlcnZhYmxlRXZlbnQgeworICAgIC8qKgorICAgICAqIEEgbWVkaWEgcmVzb3VyY2UgaXMgZ3JhbnRlZCB0byBhIGNsaWVudCBhbmQgYmVjb21lcyBidXN5LgorICAgICAqLworICAgIGtCdXN5ID0gMSwKKworICAgIC8qKgorICAgICAqIEEgbWVkaWEgcmVzb3VyY2UgaXMgcmVsZWFzZWQgYnkgYSBjbGllbnQgYW5kIGJlY29tZXMgaWRsZS4KKyAgICAgKi8KKyAgICBrSWRsZSA9IDIsCisKKyAgICAvKioKKyAgICAgKiBBIGJpdG1hc2sgdGhhdCBjb3ZlcnMgYWxsIG9ic2VydmFibGUgZXZlbnRzIGRlZmluZWQuCisgICAgICovCisgICAga0FsbCA9IH4wLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUZpbHRlci5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUZpbHRlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjdlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRmlsdGVyLmFpZGwKQEAgLTAsMCArMSw0MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhT2JzZXJ2YWJsZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVFdmVudDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhbiBvYnNlcnZhYmxlIHJlc291cmNlIGFuZCBpdHMgYXNzb2NpYXRlZCBldmVudHMgdGhhdCB0aGUKKyAqIG9ic2VydmVyIGlzIGludGVyZXN0ZWQgaW4uCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIE1lZGlhT2JzZXJ2YWJsZUZpbHRlciB7CisgICAgLyoqCisgICAgICogVHlwZSBvZiB0aGUgb2JzZXJ2YWJsZSBtZWRpYSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBNZWRpYU9ic2VydmFibGVUeXBlIHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBFdmVudHMgdGhhdCB0aGUgb2JzZXJ2ZXIgaXMgaW50ZXJlc3RlZCBpbi4KKyAgICAgKgorICAgICAqIFRoaXMgZmllbGQgaXMgYSBiaXR3aXNlLU9SIG9mIHRoZSBldmVudHMgaW4gTWVkaWFPYnNlcnZhYmxlRXZlbnQuIElmIGEKKyAgICAgKiBwYXJ0aWN1bGFyIGV2ZW50J3MgYml0IGlzIHNldCwgaXQgbWVhbnMgdGhhdCB1cGRhdGVzIHNob3VsZCBiZSBzZW50IGZvcgorICAgICAqIHRoYXQgZXZlbnQuIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZXIgaXMgb25seSBpbnRlcmVzdGVkIGluIHJlY2VpdmluZworICAgICAqIHVwZGF0ZXMgd2hlbiBhIHJlc291cmNlIGJlY29tZXMgYXZhaWxhYmxlLCBpdCBzaG91bGQgb25seSBzZXQgJ2tJZGxlJy4KKyAgICAgKi8KKyAgICBNZWRpYU9ic2VydmFibGVFdmVudCBldmVudEZpbHRlcjsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVQYXJjZWwuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVQYXJjZWwuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIzM2UxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZVBhcmNlbC5haWRsCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVUeXBlOworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIGFuIG9ic2VydmFibGUgcmVzb3VyY2Ugd2hvc2Ugc3RhdHVzIGhhcyBjaGFuZ2VkLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBNZWRpYU9ic2VydmFibGVQYXJjZWwgeworICAgIC8qKgorICAgICAqIFR5cGUgb2YgdGhlIG9ic2VydmFibGUgbWVkaWEgcmVzb3VyY2UuCisgICAgICovCisgICAgTWVkaWFPYnNlcnZhYmxlVHlwZSB0eXBlOy8vID0gTWVkaWFPYnNlcnZhYmxlVHlwZTo6a0ludmFsaWQ7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgdW5pdHMgb2YgdGhlIG9ic2VydmFibGUgcmVzb3VyY2UgKG51bWJlciBvZiBjb2RlY3MsIGJ5dGVzIG9mCisgICAgICogZ3JhcGhpYyBtZW1vcnksIGV0Yy4pLgorICAgICAqLworICAgIGxvbmcgdmFsdWUgPSAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZVR5cGUuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVUeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMDJkYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVUeXBlLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogVHlwZSBlbnVtcyBvZiBvYnNlcnZhYmxlIG1lZGlhIHJlc291cmNlcy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIE1lZGlhT2JzZXJ2YWJsZVR5cGUgeworICAgIGtJbnZhbGlkID0gMCwKKworICAgIC8va1ZpZGVvU3RhcnQgPSAxMDAwLAorICAgIGtWaWRlb1NlY3VyZUNvZGVjID0gMTAwMCwKKyAgICBrVmlkZW9Ob25TZWN1cmVDb2RlYyA9IDEwMDEsCisKKyAgICAvL2tBdWRpb1N0YXJ0ID0gMjAwMCwKKworICAgIC8va0dyYXBoaWNNZW1vcnkgPSAzMDAwLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VQYXJjZWwuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlUGFyY2VsLmFpZGwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlUGFyY2VsLmFpZGwKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlUGFyY2VsLmFpZGwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlUG9saWN5UGFyY2VsLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbC5haWRsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbC5haWRsCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbC5haWRsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VTdWJUeXBlLmFpZGwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlVHlwZS5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VUeXBlLmFpZGwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlVHlwZS5haWRsCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVR5cGUuYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCmluZGV4IGI2YzU0OGMuLjMwOGVlOTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKQEAgLTMsMTIgKzMsMTIgQEAKICAgICBuYW1lOiAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0IiwKICAgICBzcmNzOiBbIlJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAiXSwKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGluY2x1ZGVfZGlyczogWwpAQCAtMTksMTcgKzE5LDE2IEBACiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJTZXJ2aWNlTG9nX3Rlc3QiLAogICAgIHNyY3M6IFsiU2VydmljZUxvZ190ZXN0LmNwcCJdLAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgaW5jbHVkZV9kaXJzOiBbCkBAIC00MCw1ICszOSwyOSBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdCIsCisgICAgc3JjczogWyJSZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0LmNwcCJdLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKKyAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjkzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlTWFuYWdlckNsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6SVJlc291cmNlTWFuYWdlckNsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhUmVzb3VyY2VQYXJjZWw7CisKK3N0YXRpYyBpbnQ2NF90IGdldElkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50KSB7CisgICAgcmV0dXJuIChpbnQ2NF90KSBjbGllbnQuZ2V0KCk7Cit9CisKK3N0cnVjdCBUZXN0UHJvY2Vzc0luZm8gOiBwdWJsaWMgUHJvY2Vzc0luZm9JbnRlcmZhY2UgeworICAgIFRlc3RQcm9jZXNzSW5mbygpIHt9CisgICAgdmlydHVhbCB+VGVzdFByb2Nlc3NJbmZvKCkge30KKworICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQgKnByaW9yaXR5KSB7CisgICAgICAgIC8vIEZvciB0ZXN0aW5nLCB1c2UgcGlkIGFzIHByaW9yaXR5LgorICAgICAgICAvLyBMb3dlciB0aGUgdmFsdWUgaGlnaGVyIHRoZSBwcmlvcml0eS4KKyAgICAgICAgKnByaW9yaXR5ID0gcGlkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZFBpZChpbnQgLyogcGlkICovKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBvdmVycmlkZVByb2Nlc3NJbmZvKAorICAgICAgICAgICAgaW50IC8qIHBpZCAqLywgaW50IC8qIHByb2NTdGF0ZSAqLywgaW50IC8qIG9vbVNjb3JlICovKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCAvKiBwaWQgKi8pIHsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFByb2Nlc3NJbmZvKTsKK307CisKK3N0cnVjdCBUZXN0U3lzdGVtQ2FsbGJhY2sgOgorICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2UgeworICAgIFRlc3RTeXN0ZW1DYWxsYmFjaygpIDoKKyAgICAgICAgbUxhc3RFdmVudCh7RXZlbnRUeXBlOjpJTlZBTElELCAwfSksIG1FdmVudENvdW50KDApIHt9CisKKyAgICBlbnVtIEV2ZW50VHlwZSB7CisgICAgICAgIElOVkFMSUQgICAgICAgICAgPSAtMSwKKyAgICAgICAgVklERU9fT04gICAgICAgICA9IDAsCisgICAgICAgIFZJREVPX09GRiAgICAgICAgPSAxLAorICAgICAgICBWSURFT19SRVNFVCAgICAgID0gMiwKKyAgICAgICAgQ1BVU0VUX0VOQUJMRSAgICA9IDMsCisgICAgICAgIENQVVNFVF9ESVNBQkxFICAgPSA0LAorICAgIH07CisKKyAgICBzdHJ1Y3QgRXZlbnRFbnRyeSB7CisgICAgICAgIEV2ZW50VHlwZSB0eXBlOworICAgICAgICBpbnQgYXJnOworICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0YXJ0VmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT04sIHVpZH07CisgICAgICAgIG1FdmVudENvdW50Kys7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG5vdGVTdG9wVmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT0ZGLCB1aWR9OworICAgICAgICBtRXZlbnRDb3VudCsrOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub3RlUmVzZXRWaWRlbygpIG92ZXJyaWRlIHsKKyAgICAgICAgbUxhc3RFdmVudCA9IHtFdmVudFR5cGU6OlZJREVPX1JFU0VULCAwfTsKKyAgICAgICAgbUV2ZW50Q291bnQrKzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdENwdXNldEJvb3N0KGJvb2wgZW5hYmxlKSBvdmVycmlkZSB7CisgICAgICAgIG1MYXN0RXZlbnQgPSB7ZW5hYmxlID8gRXZlbnRUeXBlOjpDUFVTRVRfRU5BQkxFIDogRXZlbnRUeXBlOjpDUFVTRVRfRElTQUJMRSwgMH07CisgICAgICAgIG1FdmVudENvdW50Kys7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBldmVudENvdW50KCkgeyByZXR1cm4gbUV2ZW50Q291bnQ7IH0KKyAgICBFdmVudFR5cGUgbGFzdEV2ZW50VHlwZSgpIHsgcmV0dXJuIG1MYXN0RXZlbnQudHlwZTsgfQorICAgIEV2ZW50RW50cnkgbGFzdEV2ZW50KCkgeyByZXR1cm4gbUxhc3RFdmVudDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGVzdFN5c3RlbUNhbGxiYWNrKCkge30KKworcHJpdmF0ZToKKyAgICBFdmVudEVudHJ5IG1MYXN0RXZlbnQ7CisgICAgc2l6ZV90IG1FdmVudENvdW50OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFN5c3RlbUNhbGxiYWNrKTsKK307CisKKworc3RydWN0IFRlc3RDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgeworICAgIFRlc3RDbGllbnQoaW50IHBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlKQorICAgICAgICA6IG1SZWNsYWltZWQoZmFsc2UpLCBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1QaWQsIGdldElkKHJlZjxUZXN0Q2xpZW50PigpKSk7CisgICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBTdGF0dXMgZ2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9ICJ0ZXN0X2NsaWVudCI7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgYm9vbCByZWNsYWltZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVjbGFpbWVkOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1SZWNsYWltZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkge30KKworcHJpdmF0ZToKKyAgICBib29sIG1SZWNsYWltZWQ7CisgICAgaW50IG1QaWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RDbGllbnQpOworfTsKKworc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDEgPSAzMDsKK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RVaWQxID0gMTAxMDsKKworc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDIgPSAyMDsKK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RVaWQyID0gMTAxMTsKKworc3RhdGljIGNvbnN0IGludCBrTG93UHJpb3JpdHlQaWQgPSA0MDsKK3N0YXRpYyBjb25zdCBpbnQga01pZFByaW9yaXR5UGlkID0gMjU7CitzdGF0aWMgY29uc3QgaW50IGtIaWdoUHJpb3JpdHlQaWQgPSAxMDsKKwordXNpbmcgRXZlbnRUeXBlID0gVGVzdFN5c3RlbUNhbGxiYWNrOjpFdmVudFR5cGU7Cit1c2luZyBFdmVudEVudHJ5ID0gVGVzdFN5c3RlbUNhbGxiYWNrOjpFdmVudEVudHJ5OworYm9vbCBvcGVyYXRvcj09IChjb25zdCBFdmVudEVudHJ5JiBsaHMsIGNvbnN0IEV2ZW50RW50cnkmIHJocykgeworICAgIHJldHVybiBsaHMudHlwZSA9PSByaHMudHlwZSAmJiBsaHMuYXJnID09IHJocy5hcmc7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfU1RBVFVTX1RSVUUoY29uZGl0aW9uKSBcCisgICAgRVhQRUNUX1RSVUUoKGNvbmRpdGlvbikuaXNPaygpICYmIChyZXN1bHQpKQorCisjZGVmaW5lIENIRUNLX1NUQVRVU19GQUxTRShjb25kaXRpb24pIFwKKyAgICBFWFBFQ1RfVFJVRSgoY29uZGl0aW9uKS5pc09rKCkgJiYgIShyZXN1bHQpKQorCitjbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UoKQorICAgICAgICA6IG1TeXN0ZW1DQihuZXcgVGVzdFN5c3RlbUNhbGxiYWNrKCkpLAorICAgICAgICAgIG1TZXJ2aWNlKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlTWFuYWdlclNlcnZpY2U+KAorICAgICAgICAgICAgICAgICAgbmV3IFRlc3RQcm9jZXNzSW5mbywgbVN5c3RlbUNCKSksCisgICAgICAgICAgbVRlc3RDbGllbnQxKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KGtUZXN0UGlkMSwgbVNlcnZpY2UpKSwKKyAgICAgICAgICBtVGVzdENsaWVudDIoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4oa1Rlc3RQaWQyLCBtU2VydmljZSkpLAorICAgICAgICAgIG1UZXN0Q2xpZW50Myg6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihrVGVzdFBpZDIsIG1TZXJ2aWNlKSkgeworICAgIH0KKworICAgIHNwPFRlc3RTeXN0ZW1DYWxsYmFjaz4gbVN5c3RlbUNCOworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1UZXN0Q2xpZW50MzsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyBib29sIGlzRXF1YWxSZXNvdXJjZXMoY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gJnJlc291cmNlczEsCisgICAgICAgICAgICBjb25zdCBSZXNvdXJjZUxpc3QgJnJlc291cmNlczIpIHsKKyAgICAgICAgLy8gY29udmVydCByZXNvdXJjZTEgdG8gUmVzb3VyY2VMaXN0CisgICAgICAgIFJlc291cmNlTGlzdCByMTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMxLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZyZXMgPSByZXNvdXJjZXMxW2ldOworICAgICAgICAgICAgY29uc3QgYXV0byByZXNUeXBlID0gc3RkOjp0dXBsZShyZXMudHlwZSwgcmVzLnN1YlR5cGUsIHJlcy5pZCk7CisgICAgICAgICAgICByMVtyZXNUeXBlXSA9IHJlczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcjEgPT0gcmVzb3VyY2VzMjsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBleHBlY3RFcVJlc291cmNlSW5mbyhjb25zdCBSZXNvdXJjZUluZm8gJmluZm8sCisgICAgICAgICAgICBpbnQgdWlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+ICZyZXNvdXJjZXMpIHsKKyAgICAgICAgRVhQRUNUX0VRKHVpZCwgaW5mby51aWQpOworICAgICAgICBFWFBFQ1RfRVEoY2xpZW50LCBpbmZvLmNsaWVudCk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxSZXNvdXJjZXMocmVzb3VyY2VzLCBpbmZvLnJlc291cmNlcykpOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcAppbmRleCA3MDI5MzVkLi5hMDI5ZDQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCkBAIC0xNiwxOTcgKzE2LDE3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0IgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RVdGlscy5oIgogI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWJvb2wgb3BlcmF0b3I9PSAoY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgbGhzLCBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByaHMpIHsKLSAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLnN1YlR5cGUgPT0gcmhzLnN1YlR5cGUgJiYKLSAgICAgICAgICAgIGxocy5pZCA9PSByaHMuaWQgJiYgbGhzLnZhbHVlID09IHJocy52YWx1ZTsKLX19fX0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6SVJlc291cmNlTWFuYWdlclNlcnZpY2U7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OwotCi1zdGF0aWMgaW50NjRfdCBnZXRJZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCkgewotICAgIHJldHVybiAoaW50NjRfdCkgY2xpZW50LmdldCgpOwotfQotCi1zdHJ1Y3QgVGVzdFByb2Nlc3NJbmZvIDogcHVibGljIFByb2Nlc3NJbmZvSW50ZXJmYWNlIHsKLSAgICBUZXN0UHJvY2Vzc0luZm8oKSB7fQotICAgIHZpcnR1YWwgflRlc3RQcm9jZXNzSW5mbygpIHt9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50ICpwcmlvcml0eSkgewotICAgICAgICAvLyBGb3IgdGVzdGluZywgdXNlIHBpZCBhcyBwcmlvcml0eS4KLSAgICAgICAgLy8gTG93ZXIgdGhlIHZhbHVlIGhpZ2hlciB0aGUgcHJpb3JpdHkuCi0gICAgICAgICpwcmlvcml0eSA9IHBpZDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlzVmFsaWRQaWQoaW50IC8qIHBpZCAqLykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFByb2Nlc3NJbmZvKTsKLX07Ci0KLXN0cnVjdCBUZXN0U3lzdGVtQ2FsbGJhY2sgOgotICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2UgewotICAgIFRlc3RTeXN0ZW1DYWxsYmFjaygpIDoKLSAgICAgICAgbUxhc3RFdmVudCh7RXZlbnRUeXBlOjpJTlZBTElELCAwfSksIG1FdmVudENvdW50KDApIHt9Ci0KLSAgICBlbnVtIEV2ZW50VHlwZSB7Ci0gICAgICAgIElOVkFMSUQgICAgICAgICAgPSAtMSwKLSAgICAgICAgVklERU9fT04gICAgICAgICA9IDAsCi0gICAgICAgIFZJREVPX09GRiAgICAgICAgPSAxLAotICAgICAgICBWSURFT19SRVNFVCAgICAgID0gMiwKLSAgICAgICAgQ1BVU0VUX0VOQUJMRSAgICA9IDMsCi0gICAgICAgIENQVVNFVF9ESVNBQkxFICAgPSA0LAotICAgIH07Ci0KLSAgICBzdHJ1Y3QgRXZlbnRFbnRyeSB7Ci0gICAgICAgIEV2ZW50VHlwZSB0eXBlOwotICAgICAgICBpbnQgYXJnOwotICAgIH07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0YXJ0VmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgewotICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT04sIHVpZH07Ci0gICAgICAgIG1FdmVudENvdW50Kys7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG5vdGVTdG9wVmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgewotICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT0ZGLCB1aWR9OwotICAgICAgICBtRXZlbnRDb3VudCsrOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBub3RlUmVzZXRWaWRlbygpIG92ZXJyaWRlIHsKLSAgICAgICAgbUxhc3RFdmVudCA9IHtFdmVudFR5cGU6OlZJREVPX1JFU0VULCAwfTsKLSAgICAgICAgbUV2ZW50Q291bnQrKzsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdENwdXNldEJvb3N0KGJvb2wgZW5hYmxlKSBvdmVycmlkZSB7Ci0gICAgICAgIG1MYXN0RXZlbnQgPSB7ZW5hYmxlID8gRXZlbnRUeXBlOjpDUFVTRVRfRU5BQkxFIDogRXZlbnRUeXBlOjpDUFVTRVRfRElTQUJMRSwgMH07Ci0gICAgICAgIG1FdmVudENvdW50Kys7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHNpemVfdCBldmVudENvdW50KCkgeyByZXR1cm4gbUV2ZW50Q291bnQ7IH0KLSAgICBFdmVudFR5cGUgbGFzdEV2ZW50VHlwZSgpIHsgcmV0dXJuIG1MYXN0RXZlbnQudHlwZTsgfQotICAgIEV2ZW50RW50cnkgbGFzdEV2ZW50KCkgeyByZXR1cm4gbUxhc3RFdmVudDsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+VGVzdFN5c3RlbUNhbGxiYWNrKCkge30KLQotcHJpdmF0ZToKLSAgICBFdmVudEVudHJ5IG1MYXN0RXZlbnQ7Ci0gICAgc2l6ZV90IG1FdmVudENvdW50OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFN5c3RlbUNhbGxiYWNrKTsKLX07Ci0KLQotc3RydWN0IFRlc3RDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgewotICAgIFRlc3RDbGllbnQoaW50IHBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlKQotICAgICAgICA6IG1SZWNsYWltZWQoZmFsc2UpLCBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9Ci0KLSAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewotICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1QaWQsIGdldElkKHJlZjxUZXN0Q2xpZW50PigpKSk7Ci0gICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOwotICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICBTdGF0dXMgZ2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9ICJ0ZXN0X2NsaWVudCI7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWNsYWltZWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUmVjbGFpbWVkOwotICAgIH0KLQotICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIG1SZWNsYWltZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkge30KLQotcHJpdmF0ZToKLSAgICBib29sIG1SZWNsYWltZWQ7Ci0gICAgaW50IG1QaWQ7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOwotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RDbGllbnQpOwotfTsKLQotc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDEgPSAzMDsKLXN0YXRpYyBjb25zdCBpbnQga1Rlc3RVaWQxID0gMTAxMDsKLQotc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDIgPSAyMDsKLXN0YXRpYyBjb25zdCBpbnQga1Rlc3RVaWQyID0gMTAxMTsKLQotc3RhdGljIGNvbnN0IGludCBrTG93UHJpb3JpdHlQaWQgPSA0MDsKLXN0YXRpYyBjb25zdCBpbnQga01pZFByaW9yaXR5UGlkID0gMjU7Ci1zdGF0aWMgY29uc3QgaW50IGtIaWdoUHJpb3JpdHlQaWQgPSAxMDsKLQotdXNpbmcgRXZlbnRUeXBlID0gVGVzdFN5c3RlbUNhbGxiYWNrOjpFdmVudFR5cGU7Ci11c2luZyBFdmVudEVudHJ5ID0gVGVzdFN5c3RlbUNhbGxiYWNrOjpFdmVudEVudHJ5OwotYm9vbCBvcGVyYXRvcj09IChjb25zdCBFdmVudEVudHJ5JiBsaHMsIGNvbnN0IEV2ZW50RW50cnkmIHJocykgewotICAgIHJldHVybiBsaHMudHlwZSA9PSByaHMudHlwZSAmJiBsaHMuYXJnID09IHJocy5hcmc7Ci19Ci0KLSNkZWZpbmUgQ0hFQ0tfU1RBVFVTX1RSVUUoY29uZGl0aW9uKSBcCi0gICAgRVhQRUNUX1RSVUUoKGNvbmRpdGlvbikuaXNPaygpICYmIChyZXN1bHQpKQotCi0jZGVmaW5lIENIRUNLX1NUQVRVU19GQUxTRShjb25kaXRpb24pIFwKLSAgICBFWFBFQ1RfVFJVRSgoY29uZGl0aW9uKS5pc09rKCkgJiYgIShyZXN1bHQpKQotCi1jbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QgOiBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RCYXNlIHsKIHB1YmxpYzoKLSAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCgpCi0gICAgICAgIDogbVN5c3RlbUNCKG5ldyBUZXN0U3lzdGVtQ2FsbGJhY2soKSksCi0gICAgICAgICAgbVNlcnZpY2UoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4oCi0gICAgICAgICAgICAgICAgICBuZXcgVGVzdFByb2Nlc3NJbmZvLCBtU3lzdGVtQ0IpKSwKLSAgICAgICAgICBtVGVzdENsaWVudDEoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4oa1Rlc3RQaWQxLCBtU2VydmljZSkpLAotICAgICAgICAgIG1UZXN0Q2xpZW50Mig6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihrVGVzdFBpZDIsIG1TZXJ2aWNlKSksCi0gICAgICAgICAgbVRlc3RDbGllbnQzKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KGtUZXN0UGlkMiwgbVNlcnZpY2UpKSB7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGJvb2wgaXNFcXVhbFJlc291cmNlcyhjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiAmcmVzb3VyY2VzMSwKLSAgICAgICAgICAgIGNvbnN0IFJlc291cmNlTGlzdCAmcmVzb3VyY2VzMikgewotICAgICAgICAvLyBjb252ZXJ0IHJlc291cmNlMSB0byBSZXNvdXJjZUxpc3QKLSAgICAgICAgUmVzb3VyY2VMaXN0IHIxOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlczEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gJnJlcyA9IHJlc291cmNlczFbaV07Ci0gICAgICAgICAgICBjb25zdCBhdXRvIHJlc1R5cGUgPSBzdGQ6OnR1cGxlKHJlcy50eXBlLCByZXMuc3ViVHlwZSwgcmVzLmlkKTsKLSAgICAgICAgICAgIHIxW3Jlc1R5cGVdID0gcmVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByMSA9PSByZXNvdXJjZXMyOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGNvbnN0IFJlc291cmNlSW5mbyAmaW5mbywKLSAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gJnJlc291cmNlcykgewotICAgICAgICBFWFBFQ1RfRVEodWlkLCBpbmZvLnVpZCk7Ci0gICAgICAgIEVYUEVDVF9FUShjbGllbnQsIGluZm8uY2xpZW50KTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFJlc291cmNlcyhyZXNvdXJjZXMsIGluZm8ucmVzb3VyY2VzKSk7Ci0gICAgfQorICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0KCkgOiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UoKSB7fQogCiAgICAgdm9pZCB2ZXJpZnlDbGllbnRzKGJvb2wgYzEsIGJvb2wgYzIsIGJvb2wgYzMpIHsKICAgICAgICAgVGVzdENsaWVudCAqY2xpZW50MSA9IHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPihtVGVzdENsaWVudDEuZ2V0KCkpOwpAQCAtNTIwLDYgKzM0MCwzMCBAQAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAogICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwogICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSB0cnVlOworCisgICAgICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSk7CisKKyAgICAgICAgICAgIC8vIGNsaWVudCBtYXJrZWQgZm9yIHBlbmRpbmcgcmVtb3ZhbCBnb3QgcmVjbGFpbWVkCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyKS5pc09rKCkpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBObyBtb3JlIGNsaWVudHMgbWFya2VkIGZvciByZW1vdmFsCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyKS5pc09rKCkpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOworCisgICAgICAgICAgICAvLyBjbGllbnQgbWFya2VkIGZvciBwZW5kaW5nIHJlbW92YWwgZ290IHJlY2xhaW1lZAorICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMikuaXNPaygpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDEgd2hpY2ggc3RpbGwgbGVmdAorICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCB0ZXN0UmVtb3ZlQ2xpZW50KCkgewpAQCAtODgxLDEyICs3MjUsNiBAQAogICAgICAgICBFWFBFQ1RfRVEoNHUsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKICAgICAgICAgRVhQRUNUX0VRKEV2ZW50VHlwZTo6Q1BVU0VUX0RJU0FCTEUsIG1TeXN0ZW1DQi0+bGFzdEV2ZW50VHlwZSgpKTsKICAgICB9Ci0KLSAgICBzcDxUZXN0U3lzdGVtQ2FsbGJhY2s+IG1TeXN0ZW1DQjsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1UZXN0Q2xpZW50MTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQyOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDM7CiB9OwogCiBURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGNvbmZpZykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0LmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkM2U3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvQm5SZXNvdXJjZU9ic2VydmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5SZXNvdXJjZU9ic2VydmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlUGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlVHlwZTsKKworI2RlZmluZSBCVVNZIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprQnVzeQorI2RlZmluZSBJRExFIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprSWRsZQorI2RlZmluZSBBTEwgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlRXZlbnQ6OmtBbGwKKworc3RydWN0IEV2ZW50VHJhY2tlciB7CisgICAgc3RydWN0IEV2ZW50IHsKKyAgICAgICAgZW51bSB7IE5vRXZlbnQsIEJ1c3ksIElkbGUgfSB0eXBlID0gTm9FdmVudDsKKyAgICAgICAgaW50IHVpZCA9IDA7CisgICAgICAgIGludCBwaWQgPSAwOworICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVQYXJjZWw+IG9ic2VydmFibGVzOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgRXZlbnQgTm9FdmVudDsKKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBNZWRpYU9ic2VydmFibGVQYXJjZWwmIG9ic2VydmFibGUpIHsKKyAgICAgICAgcmV0dXJuICJ7IiArIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnRvU3RyaW5nKG9ic2VydmFibGUudHlwZSkKKyAgICAgICAgKyAiLCAiICsgc3RkOjp0b19zdHJpbmcob2JzZXJ2YWJsZS52YWx1ZSkgKyAifSI7CisgICAgfQorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBFdmVudCYgZXZlbnQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXZlbnRTdHI7CisgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgeworICAgICAgICBjYXNlIEV2ZW50OjpCdXN5OgorICAgICAgICAgICAgZXZlbnRTdHIgPSAiQnVzeSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFdmVudDo6SWRsZToKKyAgICAgICAgICAgIGV2ZW50U3RyID0gIklkbGUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIk5vRXZlbnQiOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIG9ic2VydmFibGVTdHI7CisgICAgICAgIGZvciAoYXV0byAmb2JzZXJ2YWJsZSA6IGV2ZW50Lm9ic2VydmFibGVzKSB7CisgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTdHIuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG9ic2VydmFibGVTdHIgKz0gIiwgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9ic2VydmFibGVTdHIgKz0gdG9TdHJpbmcob2JzZXJ2YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJ7IiArIGV2ZW50U3RyICsgIiwgIiArIHN0ZDo6dG9fc3RyaW5nKGV2ZW50LnVpZCkgKyAiLCAiCisgICAgICAgICAgICAgICAgKyBzdGQ6OnRvX3N0cmluZyhldmVudC5waWQpICsgIiwgeyIgKyBvYnNlcnZhYmxlU3RyICsgIn19IjsKKyAgICB9CisKKyAgICBzdGF0aWMgRXZlbnQgQnVzeShpbnQgdWlkLCBpbnQgcGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVQYXJjZWw+JiBvYnNlcnZhYmxlcykgeworICAgICAgICByZXR1cm4geyBFdmVudDo6QnVzeSwgdWlkLCBwaWQsIG9ic2VydmFibGVzIH07CisgICAgfQorICAgIHN0YXRpYyBFdmVudCBJZGxlKGludCB1aWQsIGludCBwaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4mIG9ic2VydmFibGVzKSB7CisgICAgICAgIHJldHVybiB7IEV2ZW50OjpJZGxlLCB1aWQsIHBpZCwgb2JzZXJ2YWJsZXMgfTsKKyAgICB9CisKKyAgICAvLyBQb3AgMSBldmVudCBmcm9tIGZyb250LCB3YWl0IGZvciB1cCB0byB0aW1lb3V0VXMgaWYgZW1wdHkuCisgICAgY29uc3QgRXZlbnQmIHBvcChpbnQ2NF90IHRpbWVvdXRVcyA9IDApIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSAmJiB0aW1lb3V0VXMgPiAwKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHModGltZW91dFVzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gTm9FdmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9ICptRXZlbnRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUV2ZW50UXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVBvcHBlZEV2ZW50OworICAgIH0KKworICAgIC8vIFB1c2ggMSBldmVudCB0byBiYWNrLgorICAgIHZvaWQgYXBwZW5kKGNvbnN0IEV2ZW50JiBldmVudCkgeworICAgICAgICBBTE9HRCgiJXMiLCB0b1N0cmluZyhldmVudCkuY19zdHIoKSk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKworICAgICAgICBtRXZlbnRRdWV1ZS5wdXNoX2JhY2soZXZlbnQpOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgIEV2ZW50IG1Qb3BwZWRFdmVudDsKKyAgICBzdGQ6Omxpc3Q8RXZlbnQ+IG1FdmVudFF1ZXVlOworfTsKKworY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQ7CisKKy8vIE9wZXJhdG9ycyBmb3IgR1Rlc3QgbWFjcm9zLgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV2ZW50VHJhY2tlcjo6RXZlbnQmIGxocywgY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgcmhzKSB7CisgICAgcmV0dXJuIGxocy50eXBlID09IHJocy50eXBlICYmIGxocy51aWQgPT0gcmhzLnVpZCAmJiBsaHMucGlkID09IHJocy5waWQgJiYKKyAgICAgICAgICAgIGxocy5vYnNlcnZhYmxlcyA9PSByaHMub2JzZXJ2YWJsZXM7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIHN0ciwgY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgdikgeworICAgIHN0ciA8PCBFdmVudFRyYWNrZXI6OnRvU3RyaW5nKHYpOworICAgIHJldHVybiBzdHI7Cit9CisKK3N0cnVjdCBUZXN0T2JzZXJ2ZXIgOiBwdWJsaWMgQm5SZXNvdXJjZU9ic2VydmVyLCBwdWJsaWMgRXZlbnRUcmFja2VyIHsKKyAgICBUZXN0T2JzZXJ2ZXIoY29uc3QgY2hhciAqbmFtZSkgOiBtTmFtZShuYW1lKSB7fQorICAgIH5UZXN0T2JzZXJ2ZXIoKSA9IGRlZmF1bHQ7CisgICAgU3RhdHVzIG9uU3RhdHVzQ2hhbmdlZChNZWRpYU9ic2VydmFibGVFdmVudCBldmVudCwgaW50MzJfdCB1aWQsIGludDMyX3QgcGlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlUGFyY2VsPiYgb2JzZXJ2YWJsZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR0QoIiVzOiAlcyIsIG1OYW1lLmNfc3RyKCksIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGlmIChldmVudCA9PSBNZWRpYU9ic2VydmFibGVFdmVudDo6a0J1c3kpIHsKKyAgICAgICAgICAgIGFwcGVuZChCdXN5KHVpZCwgcGlkLCBvYnNlcnZhYmxlcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXBwZW5kKElkbGUodWlkLCBwaWQsIG9ic2VydmFibGVzKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKK307CisKK2NsYXNzIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlVGVzdCA6IHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UgeworcHVibGljOgorICAgIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlVGVzdCgpIDogUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RCYXNlKCksCisgICAgICAgIG1PYnNlcnZlclNlcnZpY2UoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+KCkpLAorICAgICAgICBtVGVzdE9ic2VydmVyMSg6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0T2JzZXJ2ZXI+KCJvYnNlcnZlcjEiKSksCisgICAgICAgIG1UZXN0T2JzZXJ2ZXIyKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RPYnNlcnZlcj4oIm9ic2VydmVyMiIpKSwKKyAgICAgICAgbVRlc3RPYnNlcnZlcjMoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdE9ic2VydmVyPigib2JzZXJ2ZXIzIikpIHsKKyAgICAgICAgbVNlcnZpY2UtPnNldE9ic2VydmVyU2VydmljZShtT2JzZXJ2ZXJTZXJ2aWNlKTsKKyAgICB9CisKKyAgICB2b2lkIHJlZ2lzdGVyT2JzZXJ2ZXJzKE1lZGlhT2JzZXJ2YWJsZUV2ZW50IGZpbHRlciA9IEFMTCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVGaWx0ZXI+IGZpbHRlcnMxLCBmaWx0ZXJzMiwgZmlsdGVyczM7CisgICAgICAgIGZpbHRlcnMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgZmlsdGVyfX07CisgICAgICAgIGZpbHRlcnMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgZmlsdGVyfX07CisgICAgICAgIGZpbHRlcnMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgZmlsdGVyfSwKKyAgICAgICAgICAgICAgICAgICB7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIGZpbHRlcn19OworCisgICAgICAgIC8vIG1UZXN0T2JzZXJ2ZXIxIG1vbml0b3JzIHNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgICAgIEVYUEVDVF9UUlVFKG1PYnNlcnZlclNlcnZpY2UtPnJlZ2lzdGVyT2JzZXJ2ZXIobVRlc3RPYnNlcnZlcjEsIGZpbHRlcnMxKS5pc09rKCkpOworCisgICAgICAgIC8vIG1UZXN0T2JzZXJ2ZXIyIG1vbml0b3JzIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgorICAgICAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIyLCBmaWx0ZXJzMikuaXNPaygpKTsKKworICAgICAgICAvLyBtVGVzdE9ic2VydmVyMyBtb25pdG9ycyBib3RoIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgorICAgICAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIzLCBmaWx0ZXJzMykuaXNPaygpKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+IG1PYnNlcnZlclNlcnZpY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RPYnNlcnZlcj4gbVRlc3RPYnNlcnZlcjE7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RPYnNlcnZlcj4gbVRlc3RPYnNlcnZlcjI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RPYnNlcnZlcj4gbVRlc3RPYnNlcnZlcjM7Cit9OworCitURVNUX0YoUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VUZXN0LCB0ZXN0UmVnaXN0ZXJPYnNlcnZlcikgeworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZUZpbHRlcj4gZmlsdGVyczE7CisgICAgU3RhdHVzIHN0YXR1czsKKworICAgIC8vIFJlZ2lzdGVyIHdpdGggZW1wdHkgb2JzZXJ2YWJsZXMgc2hvdWxkIGZhaWwuCisgICAgc3RhdHVzID0gbU9ic2VydmVyU2VydmljZS0+cmVnaXN0ZXJPYnNlcnZlcihtVGVzdE9ic2VydmVyMSwgZmlsdGVyczEpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIEJBRF9WQUxVRSk7CisKKyAgICAvLyBtVGVzdE9ic2VydmVyMSBtb25pdG9ycyBzZWN1cmUgdmlkZW8gY29kZWNzLgorICAgIGZpbHRlcnMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgQUxMfX07CisgICAgRVhQRUNUX1RSVUUobU9ic2VydmVyU2VydmljZS0+cmVnaXN0ZXJPYnNlcnZlcihtVGVzdE9ic2VydmVyMSwgZmlsdGVyczEpLmlzT2soKSk7CisKKyAgICAvLyBSZWdpc3RlciBkdXBsaWNhdGVzIHNob3VsZCBmYWlsLgorICAgIHN0YXR1cyA9IG1PYnNlcnZlclNlcnZpY2UtPnJlZ2lzdGVyT2JzZXJ2ZXIobVRlc3RPYnNlcnZlcjEsIGZpbHRlcnMxKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpLCBBTFJFQURZX0VYSVNUUyk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU9ic2VydmVyU2VydmljZVRlc3QsIHRlc3RVbnJlZ2lzdGVyT2JzZXJ2ZXIpIHsKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVGaWx0ZXI+IGZpbHRlcnMxOworICAgIFN0YXR1cyBzdGF0dXM7CisKKyAgICAvLyBVbnJlZ2lzdGVyIHdpdGhvdXQgcmVnaXN0ZXJpbmcgZmlyc3Qgc2hvdWxkIGZhaWwuCisgICAgc3RhdHVzID0gbU9ic2VydmVyU2VydmljZS0+dW5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIxKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpLCBOQU1FX05PVF9GT1VORCk7CisKKyAgICAvLyBtVGVzdE9ic2VydmVyMSBtb25pdG9ycyBzZWN1cmUgdmlkZW8gY29kZWNzLgorICAgIGZpbHRlcnMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgQUxMfX07CisgICAgRVhQRUNUX1RSVUUobU9ic2VydmVyU2VydmljZS0+cmVnaXN0ZXJPYnNlcnZlcihtVGVzdE9ic2VydmVyMSwgZmlsdGVyczEpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUobU9ic2VydmVyU2VydmljZS0+dW5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIxKS5pc09rKCkpOworCisgICAgLy8gVW5yZWdpc3RlciBhZ2FpbiBzaG91bGQgZmFpbC4KKyAgICBzdGF0dXMgPSBtT2JzZXJ2ZXJTZXJ2aWNlLT51bnJlZ2lzdGVyT2JzZXJ2ZXIobVRlc3RPYnNlcnZlcjEpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIE5BTUVfTk9UX0ZPVU5EKTsKK30KKworVEVTVF9GKFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlVGVzdCwgdGVzdEFkZFJlc291cmNlQmFzaWMpIHsKKyAgICByZWdpc3Rlck9ic2VydmVycygpOworCisgICAgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlUGFyY2VsPiBvYnNlcnZhYmxlczEsIG9ic2VydmFibGVzMiwgb2JzZXJ2YWJsZXMzOworICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9fTsKKyAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAxfX07CisgICAgb2JzZXJ2YWJsZXMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX0sCisgICAgICAgICAgICAgICAgICAge01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAxfX07CisKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgLy8gQWRkIHNlY3VyZSB2aWRlbyBjb2RlYy4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMxKSk7CisKKyAgICAvLyBBZGQgbm9uLXNlY3VyZSB2aWRlbyBjb2RlYy4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisKKyAgICAvLyBBZGQgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCisgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMykpOworCisgICAgLy8gQWRkIGFkZGl0aW9uYWwgYXVkaW8gY29kZWNzLCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLykpOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSk7CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMzKSk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU9ic2VydmVyU2VydmljZVRlc3QsIHRlc3RBZGRSZXNvdXJjZU11bHRpcGxlKSB7CisgICAgcmVnaXN0ZXJPYnNlcnZlcnMoKTsKKworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4gb2JzZXJ2YWJsZXMxLCBvYnNlcnZhYmxlczIsIG9ic2VydmFibGVzMzsKKyAgICBvYnNlcnZhYmxlczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAxfX07CisgICAgb2JzZXJ2YWJsZXMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgMX19OworICAgIG9ic2VydmFibGVzMyA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9LAorICAgICAgICAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgMX19OworCisgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworCisgICAgLy8gQWRkIG11bHRpcGxlIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgorICAgIC8vIE11bHRpcGxlIGVudHJpZXMgb2YgdGhlIHNhbWUgdHlwZSBzaG91bGQgYmUgbWVyZ2VkLCBjb3VudCBzaG91bGQgYmUgcHJvcGFnYXRlZCBjb3JyZWN0bHkuCisgICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCisgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCisgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLywgMyAvKmNvdW50Ki8pfTsKKyAgICBvYnNlcnZhYmxlczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAyfX07CisgICAgb2JzZXJ2YWJsZXMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgM319OworICAgIG9ic2VydmFibGVzMyA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDJ9LAorICAgICAgICAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgM319OworICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMykpOworfQorCitURVNUX0YoUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VUZXN0LCB0ZXN0UmVtb3ZlUmVzb3VyY2VCYXNpYykgeworICAgIHJlZ2lzdGVyT2JzZXJ2ZXJzKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVQYXJjZWw+IG9ic2VydmFibGVzMSwgb2JzZXJ2YWJsZXMyLCBvYnNlcnZhYmxlczM7CisgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX19OworICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDF9fTsKKyAgICBvYnNlcnZhYmxlczMgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAxfSwKKyAgICAgICAgICAgICAgICAgICB7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDF9fTsKKworICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAvLyBBZGQgc2VjdXJlIHZpZGVvIGNvZGVjIHRvIGNsaWVudDEuCisgICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGtUZXN0VWlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMxKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOworICAgIC8vIFJlbW92ZSBzZWN1cmUgdmlkZW8gY29kZWMuIG9ic2VydmVyIDEmMyBzaG91bGQgcmVjZWl2ZSB1cGRhdGVzLgorICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMxKSk7CisgICAgLy8gUmVtb3ZlIHNlY3VyZSB2aWRlbyBjb2RlYyBhZ2Fpbiwgc2hvdWxkIGhhdmUgbm8gZXZlbnQuCisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICAvLyBSZW1vdmUgY2xpZW50MSwgc2hvdWxkIGhhdmUgbm8gZXZlbnQuCisgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSkpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworCisgICAgLy8gQWRkIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMgdG8gY2xpZW50Mi4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgLy8gUmVtb3ZlIGNsaWVudDIsIG9ic2VydmVyIDImMyBzaG91bGQgcmVjZWl2ZSB1cGRhdGVzLgorICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDIpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKKyAgICAvLyBSZW1vdmUgbm9uLXNlY3VyZSBjb2RlYyBhZnRlciBjbGllbnQyIHJlbW92ZWQsIHNob3VsZCBoYXZlIG5vIGV2ZW50LgorICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MiksIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgLy8gUmVtb3ZlIGNsaWVudDIgYWdhaW4sIHNob3VsZCBoYXZlIG5vIGV2ZW50LgorICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDIpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKworICAgIC8vIEFkZCBzZWN1cmUgJiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcywgcGx1cyBhdWRpbyBjb2RlY3MgKHRoYXQncyBpZ25vcmVkKS4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMzKSk7CisgICAgLy8gUmVtb3ZlIG9uZSBhdWRpbyBjb2RlYywgc2hvdWxkIGhhdmUgbm8gZXZlbnQuCisgICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyl9OworICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgLy8gUmVtb3ZlIHRoZSBvdGhlciBhdWRpbyBjb2RlYyBhbmQgdGhlIHNlY3VyZSB2aWRlbyBjb2RlYywgb25seSBzZWN1cmUgdmlkZW8gY29kZWMKKyAgICAvLyByZW1vdmFsIHNob3VsZCBiZSByZXBvcnRlZC4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMSkpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKKyAgICAvLyBSZW1vdmUgY2xpZW50MyBlbnRpcmVseS4gTm9uLXNlY3VyZSB2aWRlbyBjb2RlYyByZW1vdmFsIHNob3VsZCBiZSByZXBvcnRlZC4KKyAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU9ic2VydmVyU2VydmljZVRlc3QsIHRlc3RSZW1vdmVSZXNvdXJjZU11bHRpcGxlKSB7CisgICAgcmVnaXN0ZXJPYnNlcnZlcnMoKTsKKworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4gb2JzZXJ2YWJsZXMxLCBvYnNlcnZhYmxlczIsIG9ic2VydmFibGVzMzsKKyAgICBvYnNlcnZhYmxlczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAxfX07CisgICAgb2JzZXJ2YWJsZXMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgMX19OworICAgIG9ic2VydmFibGVzMyA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9LAorICAgICAgICAgICAgICAgICAgICB7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDF9fTsKKworICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKworICAgIC8vIEFkZCBtdWx0aXBsZSBzZWN1cmUgJiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcywgcGx1cyBhdWRpbyBjb2RlY3MgKHRoYXQncyBpZ25vcmVkKS4KKyAgICAvLyAoUmVzb3VyY2VNYW5hZ2VyIHdpbGwgbWVyZ2UgdGhlc2UgaW50ZXJuYWxseS4pCisgICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCisgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLywgNCAvKmNvdW50Ki8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pfTsKKyAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBrVGVzdFVpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzKTsKKyAgICBvYnNlcnZhYmxlczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAxfX07CisgICAgb2JzZXJ2YWJsZXMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgNH19OworICAgIG9ic2VydmFibGVzMyA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9LAorICAgICAgICAgICAgICAgICAgICB7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDR9fTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMSkpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczMpKTsKKyAgICAvLyBSZW1vdmUgb25lIGF1ZGlvIGNvZGVjLCAyIHNlY3VyZSB2aWRlbyBjb2RlY3MgYW5kIDIgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgLy8gMSBzZWN1cmUgdmlkZW8gY29kZWMgcmVtb3ZhbCBhbmQgMiBub24tc2VjdXJlIHZpZGVvIGNvZGVjIHJlbW92YWxzIHNob3VsZCBiZSByZXBvcnRlZC4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovLCAyIC8qY291bnQqLyl9OworICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIHJlc291cmNlcyk7CisgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX19OworICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDJ9fTsKKyAgICBvYnNlcnZhYmxlczMgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAxfSwKKyAgICAgICAgICAgICAgICAgICAge01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAyfX07CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMzKSk7CisgICAgLy8gUmVtb3ZlIGNsaWVudDMgZW50aXJlbHkuIDIgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MgcmVtb3ZhbCBzaG91bGQgYmUgcmVwb3J0ZWQuCisgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworfQorCitURVNUX0YoUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VUZXN0LCB0ZXN0RXZlbnRGaWx0ZXJzKSB7CisgICAgLy8gUmVnaXN0ZXIgb2JzZXJ2ZXJzIHdpdGggZGlmZmVyZW50IGV2ZW50IGZpbHRlcnMuCisgICAgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlRmlsdGVyPiBmaWx0ZXJzMSwgZmlsdGVyczIsIGZpbHRlcnMzOworICAgIGZpbHRlcnMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgQlVTWX19OworICAgIGZpbHRlcnMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgSURMRX19OworICAgIGZpbHRlcnMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgSURMRX0sCisgICAgICAgICAgICAgICB7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIEJVU1l9fTsKKworICAgIC8vIG1UZXN0T2JzZXJ2ZXIxIG1vbml0b3JzIHNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgRVhQRUNUX1RSVUUobU9ic2VydmVyU2VydmljZS0+cmVnaXN0ZXJPYnNlcnZlcihtVGVzdE9ic2VydmVyMSwgZmlsdGVyczEpLmlzT2soKSk7CisKKyAgICAvLyBtVGVzdE9ic2VydmVyMiBtb25pdG9ycyBub24tc2VjdXJlIHZpZGVvIGNvZGVjcy4KKyAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIyLCBmaWx0ZXJzMikuaXNPaygpKTsKKworICAgIC8vIG1UZXN0T2JzZXJ2ZXIzIG1vbml0b3JzIGJvdGggc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgRVhQRUNUX1RSVUUobU9ic2VydmVyU2VydmljZS0+cmVnaXN0ZXJPYnNlcnZlcihtVGVzdE9ic2VydmVyMywgZmlsdGVyczMpLmlzT2soKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVQYXJjZWw+IG9ic2VydmFibGVzMSwgb2JzZXJ2YWJsZXMyOworICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9fTsKKyAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAxfX07CisKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisKKyAgICAvLyBBZGQgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCisgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworCisgICAgLy8gUmVtb3ZlIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgorICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzRhZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFJ1biB0ZXN0cyBpbiB0aGlzIGRpcmVjdG9yeS4KKyMKKworaWYgWyAiJFNZTkNfRklOSVNIRUQiICE9IHRydWUgXTsgdGhlbgorICBpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICAgIGV4aXQgLTEKKyAgZmkKKworICAjIGVuc3VyZSB3ZSBoYXZlIG1tCisgIC4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKKyAgbW0KKworICBlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKKyAgYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50ICYmIGFkYiBzeW5jCitmaQorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorCitlY2hvICJ0ZXN0aW5nIFJlc291cmNlTWFuYWdlclNlcnZpY2UiCisjYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0CithZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0CisKK2VjaG8gInRlc3RpbmcgU2VydmljZUxvZyIKKyNhZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L1NlcnZpY2VMb2dfdGVzdC9TZXJ2aWNlTG9nX3Rlc3QKK2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0L1NlcnZpY2VMb2dfdGVzdC9TZXJ2aWNlTG9nX3Rlc3QKKworZWNobyAidGVzdGluZyBSZXNvdXJjZU9ic2VydmVyU2VydmljZSIKKyNhZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlX3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdAorYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC9SZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKaW5kZXggMTczNDdhOS4uM2Q2ODIxYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icApAQCAtMiwxNiArMiwyNSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYXRyYW5zY29kaW5nc2VydmljZSIsCiAKLSAgICBzcmNzOiBbIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmNwcCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTaW11bGF0ZWRUcmFuc2NvZGVyLmNwcCIsCisgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhbmRyb2lkIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhdHJhbnNjb2RpbmciLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYXRyYW5zY29kaW5nIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKICAgICBdLApAQCAtMzEsOCArNDAsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAvLyBUT0RPKGhrdWFuZyk6IFVzZSBsaWJiaW5kZXJfbmRrCi0gICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliYmFzZSIsCkBAIC00NCwxOCArNTIsNiBAQAogICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAogICAgIF0sCiAKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogewotICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgotICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQogICAgIGluaXRfcmM6IFsibWVkaWF0cmFuc2NvZGluZy5yYyJdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL01lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuY3BwCmluZGV4IDgyZDQxNjEuLjY0ZGVmNWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuY3BwCkBAIC0xNiwxMyArMTYsMjIgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVRyYW5zY29kaW5nU2VydmljZSIKLSNpbmNsdWRlIDxNZWRpYVRyYW5zY29kaW5nU2VydmljZS5oPgorI2luY2x1ZGUgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmgiCisKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvcGVybWlzc2lvbl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGVyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdVaWRQb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgIlNpbXVsYXRlZFRyYW5zY29kZXIuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb25zdHJ1Y3RpbmcgYmluZGVyOjpTdGF0dXMgb2JqZWN0cyBmb3IgZXJyb3IgcmV0dXJucwpAQCAtMzEsMjMgKzQwLDE3IEBACiAgICAgICAgICAgICBlcnJvckNvZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVzOiVkOiAiIGVycm9yU3RyaW5nLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKSkKIAotLy8gQ2FuIE1lZGlhVHJhbnNjb2Rpbmcgc2VydmljZSB0cnVzdCB0aGUgY2FsbGVyIGJhc2VkIG9uIHRoZSBjYWxsaW5nIFVJRD8KLS8vIFRPRE8oaGt1YW5nKTogQWRkIE1lZGlhUHJvdmlkZXIncyBVSUQuCi1zdGF0aWMgYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCkgewotICAgIHN3aXRjaCAodWlkKSB7Ci0gICAgY2FzZSBBSURfUk9PVDogIC8vIHJvb3QgdXNlcgotICAgIGNhc2UgQUlEX1NZU1RFTToKLSAgICBjYXNlIEFJRF9TSEVMTDoKLSAgICBjYXNlIEFJRF9NRURJQTogIC8vIG1lZGlhc2VydmVyCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpNZWRpYVRyYW5zY29kaW5nU2VydmljZSgpCi0gICAgICA6IG1UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpKSB7CitNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6TWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVySW50ZXJmYWNlPiYgdHJhbnNjb2RlcikKKyAgICAgIDogbVVpZFBvbGljeShuZXcgVHJhbnNjb2RpbmdVaWRQb2xpY3koKSksCisgICAgICAgIG1SZXNvdXJjZVBvbGljeShuZXcgVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeSgpKSwKKyAgICAgICAgbVNlc3Npb25Db250cm9sbGVyKAorICAgICAgICAgICAgICAgIG5ldyBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyKHRyYW5zY29kZXIsIG1VaWRQb2xpY3ksIG1SZXNvdXJjZVBvbGljeSkpLAorICAgICAgICBtQ2xpZW50TWFuYWdlcihuZXcgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyKG1TZXNzaW9uQ29udHJvbGxlcikpIHsKICAgICBBTE9HVigiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgaXMgY3JlYXRlZCIpOworICAgIHRyYW5zY29kZXItPnNldENhbGxiYWNrKG1TZXNzaW9uQ29udHJvbGxlcik7CisgICAgbVVpZFBvbGljeS0+c2V0Q2FsbGJhY2sobVNlc3Npb25Db250cm9sbGVyKTsKKyAgICBtUmVzb3VyY2VQb2xpY3ktPnNldENhbGxiYWNrKG1TZXNzaW9uQ29udHJvbGxlcik7CiB9CiAKIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjp+TWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UoKSB7CkBAIC01Niw2ICs1OSwyMSBAQAogCiBiaW5kZXJfc3RhdHVzX3QgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogLyphcmdzKi8sIHVpbnQzMl90IC8qbnVtQXJncyovKSB7CiAgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICB1aWRfdCBjYWxsaW5nVWlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpOworICAgIHBpZF90IGNhbGxpbmdQaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50MzJfdCBwZXJtaXNzaW9uUmVzdWx0OworICAgIGlmIChBUGVybWlzc2lvbk1hbmFnZXJfY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb25SZXN1bHQpICE9IFBFUk1JU1NJT05fTUFOQUdFUl9TVEFUVVNfT0sgfHwKKyAgICAgICAgcGVybWlzc2lvblJlc3VsdCAhPSBQRVJNSVNTSU9OX01BTkFHRVJfUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgIHJlc3VsdC5mb3JtYXQoCisgICAgICAgICAgICAgICAgIlBlcm1pc3Npb24gRGVuaWFsOiAiCisgICAgICAgICAgICAgICAgImNhbid0IGR1bXAgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCksIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAKQEAgLTY0LDE0ICs4MiwyMiBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogCiAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOwotICAgIG1UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuZHVtcEFsbENsaWVudHMoZmQsIGFyZ3MpOworICAgIG1DbGllbnRNYW5hZ2VyLT5kdW1wQWxsQ2xpZW50cyhmZCwgYXJncyk7CisgICAgbVNlc3Npb25Db250cm9sbGVyLT5kdW1wQWxsU2Vzc2lvbnMoZmQsIGFyZ3MpOwogICAgIHJldHVybiBPSzsKIH0KIAogLy9zdGF0aWMKIHZvaWQgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVySW50ZXJmYWNlPiB0cmFuc2NvZGVyOworICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcudHJhbnNjb2Rpbmcuc2ltdWxhdGVkX3RyYW5zY29kZXIiLCBmYWxzZSkpIHsKKyAgICAgICAgdHJhbnNjb2RlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8U2ltdWxhdGVkVHJhbnNjb2Rlcj4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmFuc2NvZGVyID0gc3RkOjptYWtlX3NoYXJlZDxUcmFuc2NvZGVyV3JhcHBlcj4oKTsKKyAgICB9CisKICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+IHNlcnZpY2UgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8TWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+KCk7CisgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxNZWRpYVRyYW5zY29kaW5nU2VydmljZT4odHJhbnNjb2Rlcik7CiAgICAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9CiAgICAgICAgICAgICBBU2VydmljZU1hbmFnZXJfYWRkU2VydmljZShzZXJ2aWNlLT5hc0JpbmRlcigpLmdldCgpLCBnZXRTZXJ2aWNlTmFtZSgpKTsKICAgICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgewpAQCAtODAsMTE4ICsxMDYsMzEgQEAKIH0KIAogU3RhdHVzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpyZWdpc3RlckNsaWVudCgKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+JiBpbl9jbGllbnQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9vcFBhY2thZ2VOYW1lLCBpbnQzMl90IGluX2NsaWVudFVpZCwgaW50MzJfdCBpbl9jbGllbnRQaWQsCi0gICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewotICAgIGlmIChpbl9jbGllbnQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQ2xpZW50IGNhbiBub3QgYmUgbnVsbCIpOwotICAgICAgICAqX2FpZGxfcmV0dXJuID0ga0ludmFsaWRKb2JJZDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQpOwotICAgIH0KLQotICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKTsKLSAgICBpbnQzMl90IGNhbGxpbmdVaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7Ci0KLSAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkLiBPbmx5IHByaXZpbGVnZSBjYWxsZXIgY291bGQgZm9yd2FyZCB0aGUgdWlkIG9uIGFwcCBjbGllbnQncyBiZWhhbGYuCi0gICAgaWYgKGluX2NsaWVudFVpZCA9PSBVU0VfQ0FMTElOR19VSUQpIHsKLSAgICAgICAgaW5fY2xpZW50VWlkID0gY2FsbGluZ1VpZDsKLSAgICB9IGVsc2UgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7Ci0gICAgICAgIEFMT0dFKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6cmVnaXN0ZXJDbGllbnQgZmFpbGVkIChjYWxsaW5nIFBJRCAlZCwgY2FsbGluZyBVSUQgJWQpICIKLSAgICAgICAgICAgICAgInJlamVjdGVkICIKLSAgICAgICAgICAgICAgIihkb24ndCB0cnVzdCBjbGllbnRVaWQgJWQpIiwKLSAgICAgICAgICAgICAgaW5fY2xpZW50UGlkLCBpbl9jbGllbnRVaWQsIGluX2NsaWVudFVpZCk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX1BFUk1JU1NJT05fREVOSUVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW50cnVzdGVkIGNhbGxlciAoY2FsbGluZyBQSUQgJWQsIFVJRCAlZCkgdHJ5aW5nIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyIGNsaWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NsaWVudFBpZCwgaW5fY2xpZW50VWlkKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50UGlkLiBPbmx5IHByaXZpbGVnZSBjYWxsZXIgY291bGQgZm9yd2FyZCB0aGUgcGlkIG9uIGFwcCBjbGllbnQncyBiZWhhbGYuCi0gICAgaWYgKGluX2NsaWVudFBpZCA9PSBVU0VfQ0FMTElOR19QSUQpIHsKLSAgICAgICAgaW5fY2xpZW50UGlkID0gY2FsbGluZ1BpZDsKLSAgICB9IGVsc2UgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7Ci0gICAgICAgIEFMT0dFKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6cmVnaXN0ZXJDbGllbnQgY2xpZW50IGZhaWxlZCAoY2FsbGluZyBQSUQgJWQsIGNhbGxpbmcgVUlEICIKLSAgICAgICAgICAgICAgIiVkKSByZWplY3RlZCAiCi0gICAgICAgICAgICAgICIoZG9uJ3QgdHJ1c3QgY2xpZW50UGlkICVkKSIsCi0gICAgICAgICAgICAgIGluX2NsaWVudFBpZCwgaW5fY2xpZW50VWlkLCBpbl9jbGllbnRQaWQpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVudHJ1c3RlZCBjYWxsZXIgKGNhbGxpbmcgUElEICVkLCBVSUQgJWQpIHRyeWluZyB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlciBjbGllbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jbGllbnRQaWQsIGluX2NsaWVudFVpZCk7Ci0gICAgfQotCi0gICAgLy8gV2Uga25vdyB0aGUgY2xpZW50SWQgbXVzdCBiZSBlcXVhbCB0byBpdHMgcGlkIGFzIHdlIGFzc2lnbmVkIGNsaWVudCdzIHBpZCBhcyBpdHMgY2xpZW50SWQuCi0gICAgaW50MzJfdCBjbGllbnRJZCA9IGluX2NsaWVudFBpZDsKLQotICAgIC8vIENoZWNrcyBpZiB0aGUgY2xpZW50IGFscmVhZHkgcmVnaXN0ZXJzLgotICAgIGlmIChtVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmlzQ2xpZW50SWRSZWdpc3RlcmVkKGNsaWVudElkKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoRVJST1JfQUxSRUFEWV9FWElTVFMpOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBpbl9jYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2NsaWVudE5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9vcFBhY2thZ2VOYW1lLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKGluX2NhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJDbGllbnQgY2FsbGJhY2sgY2Fubm90IGJlIG51bGwhIik7CiAgICAgfQogCiAgICAgLy8gQ3JlYXRlcyB0aGUgY2xpZW50IGFuZCB1c2VzIGl0cyBwcm9jZXNzIGlkIGFzIGNsaWVudCBpZC4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPiBuZXdDbGllbnQgPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+KAotICAgICAgICAgICAgICAgICAgICBpbl9jbGllbnQsIGNsaWVudElkLCBpbl9jbGllbnRQaWQsIGluX2NsaWVudFVpZCwgaW5fb3BQYWNrYWdlTmFtZSk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5hZGRDbGllbnQoc3RkOjptb3ZlKG5ld0NsaWVudCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IG5ld0NsaWVudDsKKworICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KGluX2NhbGxiYWNrLCBpbl9jbGllbnROYW1lLCBpbl9vcFBhY2thZ2VOYW1lLCAmbmV3Q2xpZW50KTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSBrSW52YWxpZENsaWVudElkOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gbnVsbHB0cjsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoZXJyLCAiRmFpbGVkIHRvIGFkZCBjbGllbnQgdG8gVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIik7CiAgICAgfQogCi0gICAgQUxPR0QoIkFzc2lnbiBjbGllbnQ6ICVzIHBpZDogJWQsIHVpZDogJWQgd2l0aCBpZDogJWQiLCBpbl9vcFBhY2thZ2VOYW1lLmNfc3RyKCksIGluX2NsaWVudFBpZCwKLSAgICAgICAgICBpbl9jbGllbnRVaWQsIGNsaWVudElkKTsKLQotICAgICpfYWlkbF9yZXR1cm4gPSBjbGllbnRJZDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OnVucmVnaXN0ZXJDbGllbnQoaW50MzJfdCBjbGllbnRJZCwgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgQUxPR0QoInVucmVnaXN0ZXJDbGllbnQgaWQ6ICVkIiwgY2xpZW50SWQpOwotICAgIGludDMyX3QgY2FsbGluZ1VpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKLSAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7Ci0KLSAgICAvLyBPbmx5IHRoZSBjbGllbnQgd2l0aCBjbGllbnRJZCBvciB0aGUgdHJ1c3RlZCBjYWxsZXIgY291bGQgdW5yZWdpc3RlciB0aGUgY2xpZW50LgotICAgIGlmIChjYWxsaW5nUGlkICE9IGNsaWVudElkKSB7Ci0gICAgICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgewotICAgICAgICAgICAgQUxPR0UoIlVudHJ1c3RlZCBjYWxsZXIgKGNhbGxpbmcgUElEICVkLCBVSUQgJWQpIHRyeWluZyB0byAiCi0gICAgICAgICAgICAgICAgICAidW5yZWdpc3RlciBjbGllbnQgd2l0aCBpZDogJWQiLAotICAgICAgICAgICAgICAgICAgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgY2xpZW50SWQpOwotICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnRydXN0ZWQgY2FsbGVyIChjYWxsaW5nIFBJRCAlZCwgVUlEICVkKSB0cnlpbmcgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVucmVnaXN0ZXIgY2xpZW50IHdpdGggaWQ6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIGNsaWVudElkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpfYWlkbF9yZXR1cm4gPSAobVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5yZW1vdmVDbGllbnQoY2xpZW50SWQpID09IE9LKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbmV3Q2xpZW50OwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIFN0YXR1cyBNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6Z2V0TnVtT2ZDbGllbnRzKGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIEFMT0dEKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6Z2V0TnVtT2ZDbGllbnRzIik7Ci0gICAgKl9haWRsX3JldHVybiA9IG1UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuZ2V0TnVtT2ZDbGllbnRzKCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpzdWJtaXRSZXF1ZXN0KGludDMyX3QgLypjbGllbnRJZCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgLypyZXF1ZXN0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdKb2JQYXJjZWwqIC8qam9iKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogLypfYWlkbF9yZXR1cm4qLykgewotICAgIC8vIFRPRE8oaGt1YW5nKTogQWRkIGltcGxlbWVudGF0aW9uLgotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6Y2FuY2VsSm9iKGludDMyX3QgLyppbl9jbGllbnRJZCovLCBpbnQzMl90IC8qaW5fam9iSWQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIHsKLSAgICAvLyBUT0RPKGhrdWFuZyk6IEFkZCBpbXBsZW1lbnRhdGlvbi4KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OmdldEpvYldpdGhJZChpbnQzMl90IC8qaW5fam9iSWQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nSm9iUGFyY2VsKiAvKm91dF9qb2IqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIHsKLSAgICAvLyBUT0RPKGhrdWFuZyk6IEFkZCBpbXBsZW1lbnRhdGlvbi4KKyAgICAqX2FpZGxfcmV0dXJuID0gbUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaAppbmRleCBjYzY5NzI3Li40MjhmNzc3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL01lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9NZWRpYVRyYW5zY29kaW5nU2VydmljZS5oCkBAIC0xOSw0NCArMTksMzkgQEAKIAogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9Cbk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5NZWRpYVRyYW5zY29kaW5nU2VydmljZTsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ0pvYlBhcmNlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsOworY2xhc3MgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOworY2xhc3MgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjsKK2NsYXNzIFRyYW5zY29kZXJJbnRlcmZhY2U7CitjbGFzcyBVaWRQb2xpY3lJbnRlcmZhY2U7CitjbGFzcyBSZXNvdXJjZVBvbGljeUludGVyZmFjZTsKIAogY2xhc3MgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgOiBwdWJsaWMgQm5NZWRpYVRyYW5zY29kaW5nU2VydmljZSB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtJbnZhbGlkSm9iSWQgPSAtMTsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0ludmFsaWRTZXNzaW9uSWQgPSAtMTsKICAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0ludmFsaWRDbGllbnRJZCA9IC0xOwogCi0gICAgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UoKTsKKyAgICBNZWRpYVRyYW5zY29kaW5nU2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckludGVyZmFjZT4mIHRyYW5zY29kZXIpOwogICAgIHZpcnR1YWwgfk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlKCk7CiAKICAgICBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZSgpOwogCiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnRyYW5zY29kaW5nIjsgfQogCi0gICAgU3RhdHVzIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiYgaW5fY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fb3BQYWNrYWdlTmFtZSwgaW50MzJfdCBpbl9jbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5fY2xpZW50UGlkLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIHVucmVnaXN0ZXJDbGllbnQoaW50MzJfdCBjbGllbnRJZCwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgaW5fY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9jbGllbnROYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5fb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKICAgICBTdGF0dXMgZ2V0TnVtT2ZDbGllbnRzKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICBTdGF0dXMgc3VibWl0UmVxdWVzdChpbnQzMl90IGluX2NsaWVudElkLCBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIGluX3JlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdKb2JQYXJjZWwqIG91dF9qb2IsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0KLSAgICBTdGF0dXMgY2FuY2VsSm9iKGludDMyX3QgaW5fY2xpZW50SWQsIGludDMyX3QgaW5fam9iSWQsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0KLSAgICBTdGF0dXMgZ2V0Sm9iV2l0aElkKGludDMyX3QgaW5fam9iSWQsIFRyYW5zY29kaW5nSm9iUGFyY2VsKiBvdXRfam9iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQogICAgIHZpcnR1YWwgaW5saW5lIGJpbmRlcl9zdGF0dXNfdCBkdW1wKGludCAvKmZkKi8sIGNvbnN0IGNoYXIqKiAvKmFyZ3MqLywgdWludDMyX3QgLypudW1BcmdzKi8pOwogCiBwcml2YXRlOgpAQCAtNjQsNyArNTksMTAgQEAKIAogICAgIG11dGFibGUgc3RkOjptdXRleCBtU2VydmljZUxvY2s7CiAKLSAgICBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXImIG1UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFVpZFBvbGljeUludGVyZmFjZT4gbVVpZFBvbGljeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VQb2xpY3lJbnRlcmZhY2U+IG1SZXNvdXJjZVBvbGljeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcj4gbVNlc3Npb25Db250cm9sbGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG1DbGllbnRNYW5hZ2VyOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvU2ltdWxhdGVkVHJhbnNjb2Rlci5jcHAgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL1NpbXVsYXRlZFRyYW5zY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZWU4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL1NpbXVsYXRlZFRyYW5zY29kZXIuY3BwCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW11bGF0ZWRUcmFuc2NvZGVyIgorI2luY2x1ZGUgIlNpbXVsYXRlZFRyYW5zY29kZXIuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vc3RhdGljCitjb25zdCBjaGFyKiBTaW11bGF0ZWRUcmFuc2NvZGVyOjp0b1N0cmluZyhFdmVudDo6VHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBFdmVudDo6U3RhcnQ6CisgICAgICAgIHJldHVybiAiU3RhcnQiOworICAgIGNhc2UgRXZlbnQ6OlBhdXNlOgorICAgICAgICByZXR1cm4gIlBhdXNlIjsKKyAgICBjYXNlIEV2ZW50OjpSZXN1bWU6CisgICAgICAgIHJldHVybiAiUmVzdW1lIjsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuICIodW5rbm93bikiOworfQorCitTaW11bGF0ZWRUcmFuc2NvZGVyOjpTaW11bGF0ZWRUcmFuc2NvZGVyKCkgeworICAgIHN0ZDo6dGhyZWFkKCZTaW11bGF0ZWRUcmFuc2NvZGVyOjp0aHJlYWRMb29wLCB0aGlzKS5kZXRhY2goKTsKK30KKwordm9pZCBTaW11bGF0ZWRUcmFuc2NvZGVyOjpzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpIHsKKyAgICBtQ2FsbGJhY2sgPSBjYjsKK30KKwordm9pZCBTaW11bGF0ZWRUcmFuc2NvZGVyOjpzdGFydCgKKyAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiAvKmNsaWVudENhbGxiYWNrKi8pIHsKKyAgICBpZiAocmVxdWVzdC50ZXN0Q29uZmlnLmhhc192YWx1ZSgpICYmIHJlcXVlc3QudGVzdENvbmZpZy0+cHJvY2Vzc2luZ1RvdGFsVGltZU1zID4gMCkgeworICAgICAgICBtU2Vzc2lvblByb2Nlc3NpbmdUaW1lTXMgPSByZXF1ZXN0LnRlc3RDb25maWctPnByb2Nlc3NpbmdUb3RhbFRpbWVNczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBzZXNzaW9uIHslZH06IHByb2Nlc3NpbmdUaW1lOiAlbGxkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uSWQsCisgICAgICAgICAgKGxvbmcgbG9uZyltU2Vzc2lvblByb2Nlc3NpbmdUaW1lTXMpOworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlN0YXJ0LCBjbGllbnRJZCwgc2Vzc2lvbklkLCBbPV0geworICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vblN0YXJ0ZWQoY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBTaW11bGF0ZWRUcmFuc2NvZGVyOjpwYXVzZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSB7CisgICAgcXVldWVFdmVudChFdmVudDo6UGF1c2UsIGNsaWVudElkLCBzZXNzaW9uSWQsIFs9XSB7CisgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uUGF1c2VkKGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgU2ltdWxhdGVkVHJhbnNjb2Rlcjo6cmVzdW1lKAorICAgICAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIC8qcmVxdWVzdCovLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiAvKmNsaWVudENhbGxiYWNrKi8pIHsKKyAgICBxdWV1ZUV2ZW50KEV2ZW50OjpSZXN1bWUsIGNsaWVudElkLCBzZXNzaW9uSWQsIFs9XSB7CisgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uUmVzdW1lZChjbGllbnRJZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgIH0pOworfQorCit2b2lkIFNpbXVsYXRlZFRyYW5zY29kZXI6OnN0b3AoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlN0b3AsIGNsaWVudElkLCBzZXNzaW9uSWQsIG51bGxwdHIpOworfQorCit2b2lkIFNpbXVsYXRlZFRyYW5zY29kZXI6OnF1ZXVlRXZlbnQoRXZlbnQ6OlR5cGUgdHlwZSwgQ2xpZW50SWRUeXBlIGNsaWVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcnVubmFibGUpIHsKKyAgICBBTE9HVigiJXM6IHNlc3Npb24geyVsbGQsICVkfTogJXMiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpY2xpZW50SWQsIHNlc3Npb25JZCwKKyAgICAgICAgICB0b1N0cmluZyh0eXBlKSk7CisKKyAgICBhdXRvIGxvY2sgPSBzdGQ6OnNjb3BlZF9sb2NrKG1Mb2NrKTsKKworICAgIG1RdWV1ZS5wdXNoX2JhY2soe3R5cGUsIGNsaWVudElkLCBzZXNzaW9uSWQsIHJ1bm5hYmxlfSk7CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7Cit9CisKK3ZvaWQgU2ltdWxhdGVkVHJhbnNjb2Rlcjo6dGhyZWFkTG9vcCgpIHsKKyAgICBib29sIHJ1bm5pbmcgPSBmYWxzZTsKKyAgICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHJlbWFpbmluZ1VzKGtTZXNzaW9uRHVyYXRpb25Vcyk7CisgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBsYXN0UnVubmluZ1RpbWU7CisgICAgRXZlbnQgbGFzdFJ1bm5pbmdFdmVudDsKKworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgLy8gU2ltdWxhdGVkVHJhbnNjb2RlciBjdXJyZW50bHkgbGl2ZXMgaW4gdGhlIHRyYW5zY29kaW5nIHNlcnZpY2UsIGFzIGxvbmcgYXMKKyAgICAvLyBNZWRpYVRyYW5zY29kaW5nU2VydmljZSBpdHNlbGYuCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgZXZlbnQuCisgICAgICAgIHdoaWxlIChtUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKCFydW5uaW5nKSB7CisgICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KGxvY2spOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgcnVubmluZywgd2FpdCBmb3IgdGhlIHJlbWFpbmluZyBsaWZlIG9mIHRoaXMgc2Vzc2lvbi4gUmVwb3J0IGZpbmlzaCBpZiB0aW1lZCBvdXQuCisgICAgICAgICAgICBzdGQ6OmN2X3N0YXR1cyBzdGF0dXMgPSBtQ29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIHJlbWFpbmluZ1VzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25GaW5pc2gobGFzdFJ1bm5pbmdFdmVudC5jbGllbnRJZCwgbGFzdFJ1bm5pbmdFdmVudC5zZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEFkdmFuY2UgbGFzdCBydW5uaW5nIHRpbWUgYW5kIHJlbWFpbmluZyB0aW1lLiBUaGlzIGlzIG5lZWRlZCB0byBndWFyZAorICAgICAgICAgICAgICAgIC8vIGFnYWluc3QgYmFkIGV2ZW50cyAod2hpY2ggd2lsbCBiZSBpZ25vcmVkKSBvciBzcHVyaW91cyB3YWtldXBzLCBpbiB0aGF0CisgICAgICAgICAgICAgICAgLy8gY2FzZSB3ZSBkb24ndCB3YW50IHRvIHdhaXQgZm9yIHRoZSBzYW1lIHRpbWUgYWdhaW4uCisgICAgICAgICAgICAgICAgYXV0byBub3cgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdVcyAtPSAobm93IC0gbGFzdFJ1bm5pbmdUaW1lKTsKKyAgICAgICAgICAgICAgICBsYXN0UnVubmluZ1RpbWUgPSBub3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgdGhlIGV2ZW50cywgYWRqdXN0IHN0YXRlIGFuZCBzZW5kIHVwZGF0ZXMgdG8gY2xpZW50IGFjY29yZGluZ2x5LgorICAgICAgICB3aGlsZSAoIW1RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBFdmVudCBldmVudCA9ICptUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIG1RdWV1ZS5wb3BfZnJvbnQoKTsKKworICAgICAgICAgICAgQUxPR1YoIiVzOiBzZXNzaW9uIHslbGxkLCAlZH06ICVzIiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKWV2ZW50LmNsaWVudElkLAorICAgICAgICAgICAgICAgICAgZXZlbnQuc2Vzc2lvbklkLCB0b1N0cmluZyhldmVudC50eXBlKSk7CisKKyAgICAgICAgICAgIGlmICghcnVubmluZyAmJiAoZXZlbnQudHlwZSA9PSBFdmVudDo6U3RhcnQgfHwgZXZlbnQudHlwZSA9PSBFdmVudDo6UmVzdW1lKSkgeworICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGxhc3RSdW5uaW5nVGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgICAgICAgICAgICAgIGxhc3RSdW5uaW5nRXZlbnQgPSBldmVudDsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PSBFdmVudDo6U3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nVXMgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1TZXNzaW9uUHJvY2Vzc2luZ1RpbWVNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChydW5uaW5nICYmIChldmVudC50eXBlID09IEV2ZW50OjpQYXVzZSB8fCBldmVudC50eXBlID09IEV2ZW50OjpTdG9wKSkgeworICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdVcyAtPSAoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkgLSBsYXN0UnVubmluZ1RpbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGRpc2NhcmRpbmcgYmFkIGV2ZW50OiBzZXNzaW9uIHslbGxkLCAlZH06ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZXZlbnQuY2xpZW50SWQsIGV2ZW50LnNlc3Npb25JZCwgdG9TdHJpbmcoZXZlbnQudHlwZSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXZlbnQucnVubmFibGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgZXZlbnQucnVubmFibGUoKTsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvU2ltdWxhdGVkVHJhbnNjb2Rlci5oIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9TaW11bGF0ZWRUcmFuc2NvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyYmJhMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvU2ltdWxhdGVkVHJhbnNjb2Rlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfU0lNVUxBVEVEX1RSQU5TQ09ERVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1NJTVVMQVRFRF9UUkFOU0NPREVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGVySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogU2ltdWxhdGVkVHJhbnNjb2RlciBpcyBjdXJyZW50bHkgdXNlZCB0byBpbnN0YW50aWF0ZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZQorICogb24gc2VydmljZSBzaWRlIGZvciB0ZXN0aW5nLCBzbyB0aGF0IHdlIGNvdWxkIGFjdHVhbGx5IHRlc3QgdGhlIElQQyBjYWxscyBvZgorICogTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdG8gZXhwb3NlIGlzc3VlcyB0aGF0J3Mgb2JzZXJ2YWJsZSBvbmx5IG92ZXIgSVBDLgorICogU2ltdWxhdGVkVHJhbnNjb2RlciBpcyB1c2VkIHdoZW4gdXNlU2ltdWxhdGVkVHJhbnNjb2RlciBpbiBUcmFuc2NvZGluZ1Rlc3RDb25maWcKKyAqIGlzIHNldCB0byB0cnVlLgorICoKKyAqIFNpbXVsYXRlZFRyYW5zY29kZXIgc2ltdWxhdGVzIHNlc3Npb24gZXhlY3V0aW9uIGJ5IHJlcG9ydGluZyBmaW5pc2ggYWZ0ZXIga1Nlc3Npb25EdXJhdGlvblVzLgorICogU2Vzc2lvbiBsaWZlY3ljbGUgZXZlbnRzIGFyZSByZXBvcnRlZCB2aWEgcHJvZ3Jlc3MgdXBkYXRlcyB3aXRoIHNwZWNpYWwgcHJvZ3Jlc3MKKyAqIG51bWJlcnMgKGVxdWFsIHRvIHRoZSBFdmVudCdzIHR5cGUpLgorICovCitjbGFzcyBTaW11bGF0ZWRUcmFuc2NvZGVyIDogcHVibGljIFRyYW5zY29kZXJJbnRlcmZhY2UgeworcHVibGljOgorICAgIHN0cnVjdCBFdmVudCB7CisgICAgICAgIGVudW0gVHlwZSB7IE5vRXZlbnQsIFN0YXJ0LCBQYXVzZSwgUmVzdW1lLCBTdG9wLCBGaW5pc2hlZCwgRmFpbGVkIH0gdHlwZTsKKyAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkOworICAgICAgICBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZDsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHJ1bm5hYmxlOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1Nlc3Npb25EdXJhdGlvblVzID0gMTAwMDAwMDsKKworICAgIFNpbXVsYXRlZFRyYW5zY29kZXIoKTsKKworICAgIC8vIFRyYW5zY29kZXJJbnRlcmZhY2UKKyAgICB2b2lkIHNldENhbGxiYWNrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2U+JiBjYikgb3ZlcnJpZGU7CisgICAgdm9pZCBzdGFydChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spIG92ZXJyaWRlOworICAgIHZvaWQgcGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXN1bWUoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spIG92ZXJyaWRlOworICAgIHZvaWQgc3RvcChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSBvdmVycmlkZTsKKyAgICAvLyB+VHJhbnNjb2RlckludGVyZmFjZQorCitwcml2YXRlOgorICAgIHN0ZDo6d2Vha19wdHI8VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlPiBtQ2FsbGJhY2s7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxFdmVudD4gbVF1ZXVlIEdVQVJERURfQlkobUxvY2spOworCisgICAgLy8gTWluaW11bSB0aW1lIHNwZW50IG9uIHRyYW5zY29kZSB0aGUgdmlkZW8uIFRoaXMgaXMgdXNlZCBqdXN0IGZvciB0ZXN0aW5nLgorICAgIGludDY0X3QgbVNlc3Npb25Qcm9jZXNzaW5nVGltZU1zID0ga1Nlc3Npb25EdXJhdGlvblVzIC8gMTAwMDsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0b1N0cmluZyhFdmVudDo6VHlwZSB0eXBlKTsKKyAgICB2b2lkIHF1ZXVlRXZlbnQoRXZlbnQ6OlR5cGUgdHlwZSwgQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHJ1bm5hYmxlKTsKKyAgICB2b2lkIHRocmVhZExvb3AoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9TSU1VTEFURURfVFJBTlNDT0RFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL21haW5fbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9tYWluX21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlLmNwcAppbmRleCA3ZDg2MmU2Li4xNGM1NjhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL21haW5fbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvbWFpbl9tZWRpYXRyYW5zY29kaW5nc2VydmljZS5jcHAKQEAgLTE1LDggKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgogCiAjaW5jbHVkZSAiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaCIKIApAQCAtMjUsMTIgKzI0LDkgQEAKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikgewogICAgIExPRyhJTkZPKSA8PCAibWVkaWEgdHJhbnNjb2Rpbmcgc2VydmljZSBzdGFydGluZyI7CiAKLSAgICAvLyBUT0RPKGhrdWFuZyk6IFN0YXJ0IHRoZSBzZXJ2aWNlIHdpdGggbGliYmluZGVyX25kay4KICAgICBzdHJjcHkoYXJndlswXSwgIm1lZGlhLnRyYW5zY29kaW5nIik7Ci0gICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKLSAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgYW5kcm9pZDo6TWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAKLSAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKKyAgICBBQmluZGVyUHJvY2Vzc19zdGFydFRocmVhZFBvb2woKTsKKyAgICBBQmluZGVyUHJvY2Vzc19qb2luVGhyZWFkUG9vbCgpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGUwZTA0MGMuLjVhN2M0Y2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE5LDE3ICsxOSw0MSBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICBdLAorCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgIlRyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBBIiwKKyAgICAgICAgIlRyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBCIiwKKyAgICAgICAgIlRyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBDIiwKICAgICBdLAogfQogCi0vLyBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1bml0IHRlc3QKKy8vIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVuaXQgdGVzdCB1c2luZyBzaW11bGF0ZWQgdHJhbnNjb2RlcgogY2NfdGVzdCB7Ci0gICAgbmFtZTogIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzIiwKKyAgICBuYW1lOiAibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzIiwKICAgICBkZWZhdWx0czogWyJtZWRpYXRyYW5zY29kaW5nc2VydmljZV90ZXN0X2RlZmF1bHRzIl0sCiAKLSAgICBzcmNzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzLmNwcCJdLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBzcmNzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3NpbXVsYXRlZF90ZXN0cy5jcHAiXSwKK30KKworLy8gTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdW5pdCB0ZXN0IHVzaW5nIHJlYWwgdHJhbnNjb2RlcgorY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3JlYWxfdGVzdHMiLAorICAgIGRlZmF1bHRzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVhbF90ZXN0cy5jcHAiXSwKK30KKworLy8gTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdW5pdCB0ZXN0IHJlbGF0ZWQgdG8gcmVzb3VyY2UgbWFuYWdlbWVudAorY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Jlc291cmNlX3Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJtZWRpYXRyYW5zY29kaW5nc2VydmljZV90ZXN0X2RlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Jlc291cmNlX3Rlc3RzLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjY2VkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgIlNpbXVsYXRlZFRyYW5zY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgbWVkaWEgeworCit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudDsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjazsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWw7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdDsKKworY29uc3RleHByIGludDMyX3Qga0NsaWVudFVzZUNhbGxpbmdQaWQgPSBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OlVTRV9DQUxMSU5HX1BJRDsKKworY29uc3RleHByIHVpZF90IGtDbGllbnRVaWQgPSA1MDAwOworI2RlZmluZSBVSUQobikgKGtDbGllbnRVaWQgKyAobikpCisKK2NvbnN0ZXhwciBwaWRfdCBrQ2xpZW50UGlkID0gMTAwMDA7CisjZGVmaW5lIFBJRChuKSAoa0NsaWVudFBpZCArIChuKSkKKworY29uc3RleHByIGludDMyX3Qga0NsaWVudElkID0gMDsKKyNkZWZpbmUgQ0xJRU5UKG4pIChrQ2xpZW50SWQgKyAobikpCisKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50TmFtZSA9ICJUZXN0Q2xpZW50IjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50UGFja2FnZUEgPSAiY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2RpbmcudGVzdGFwcC5BIjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50UGFja2FnZUIgPSAiY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2RpbmcudGVzdGFwcC5CIjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50UGFja2FnZUMgPSAiY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2RpbmcudGVzdGFwcC5DIjsKKworY29uc3RleHByIGNvbnN0IGNoYXIqIGtUZXN0QWN0aXZpdHlOYW1lID0gIi9jb20uYW5kcm9pZC50ZXN0cy50cmFuc2NvZGluZy5NYWluQWN0aXZpdHkiOworCitzdGF0aWMgc3RhdHVzX3QgZ2V0VWlkRm9yUGFja2FnZShTdHJpbmcxNiBwYWNrYWdlTmFtZSwgdXNlcmlkX3QgdXNlcklkLCAvKmlub3V0Ki8gdWlkX3QmIHVpZCkgeworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBjOworICAgIHVpZCA9IHBjLmdldFBhY2thZ2VVaWQocGFja2FnZU5hbWUsIDApOworICAgIGlmICh1aWQgPD0gMCkgeworICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChwYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICh1c2VySWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHVzZXI6ICVkIiwgdXNlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aWQgPSBtdWx0aXVzZXJfZ2V0X3VpZCh1c2VySWQsIHVpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdHJ1Y3QgU2hlbGxIZWxwZXIgeworICAgIHN0YXRpYyBib29sIFJ1bkNtZChjb25zdCBzdGQ6OnN0cmluZyYgY21kU3RyKSB7CisgICAgICAgIGludCByZXQgPSBzeXN0ZW0oY21kU3RyLmNfc3RyKCkpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcnVuIGNtZDogJXMsIGV4aXRjb2RlICVkIiwgY21kU3RyLmNfc3RyKCksIHJldCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgU3RhcnQoY29uc3QgY2hhciogcGFja2FnZU5hbWUsIGNvbnN0IGNoYXIqIGFjdGl2aXR5TmFtZSkgeworICAgICAgICByZXR1cm4gUnVuQ21kKCJhbSBzdGFydCAtVyAiICsgc3RkOjpzdHJpbmcocGFja2FnZU5hbWUpICsgc3RkOjpzdHJpbmcoYWN0aXZpdHlOYW1lKSArCisgICAgICAgICAgICAgICAgICAgICAgIiAmPiAvZGV2L251bGwiKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBTdG9wKGNvbnN0IGNoYXIqIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHJldHVybiBSdW5DbWQoImFtIGZvcmNlLXN0b3AgIiArIHN0ZDo6c3RyaW5nKHBhY2thZ2VOYW1lKSk7CisgICAgfQorfTsKKworc3RydWN0IEV2ZW50VHJhY2tlciB7CisgICAgc3RydWN0IEV2ZW50IHsKKyAgICAgICAgZW51bSB7IE5vRXZlbnQsIFN0YXJ0LCBQYXVzZSwgUmVzdW1lLCBGaW5pc2hlZCwgRmFpbGVkIH0gdHlwZTsKKyAgICAgICAgaW50NjRfdCBjbGllbnRJZDsKKyAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQ7CisgICAgfTsKKworI2RlZmluZSBERUNMQVJFX0VWRU5UKGFjdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBFdmVudCBhY3Rpb24oaW50MzJfdCBjbGllbnRJZCwgaW50MzJfdCBzZXNzaW9uSWQpIHsgXAorICAgICAgICByZXR1cm4ge0V2ZW50OjphY3Rpb24sIGNsaWVudElkLCBzZXNzaW9uSWR9OyAgICAgICAgICAgXAorICAgIH0KKworICAgIERFQ0xBUkVfRVZFTlQoU3RhcnQpOworICAgIERFQ0xBUkVfRVZFTlQoUGF1c2UpOworICAgIERFQ0xBUkVfRVZFTlQoUmVzdW1lKTsKKyAgICBERUNMQVJFX0VWRU5UKEZpbmlzaGVkKTsKKyAgICBERUNMQVJFX0VWRU5UKEZhaWxlZCk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIEV2ZW50IE5vRXZlbnQgPSB7RXZlbnQ6Ok5vRXZlbnQsIDAsIDB9OworCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IEV2ZW50JiBldmVudCkgeworICAgICAgICBzdGQ6OnN0cmluZyBldmVudFN0cjsKKyAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7CisgICAgICAgIGNhc2UgRXZlbnQ6OlN0YXJ0OgorICAgICAgICAgICAgZXZlbnRTdHIgPSAiU3RhcnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRXZlbnQ6OlBhdXNlOgorICAgICAgICAgICAgZXZlbnRTdHIgPSAiUGF1c2UiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRXZlbnQ6OlJlc3VtZToKKyAgICAgICAgICAgIGV2ZW50U3RyID0gIlJlc3VtZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFdmVudDo6RmluaXNoZWQ6CisgICAgICAgICAgICBldmVudFN0ciA9ICJGaW5pc2hlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFdmVudDo6RmFpbGVkOgorICAgICAgICAgICAgZXZlbnRTdHIgPSAiRmFpbGVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJOb0V2ZW50IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInNlc3Npb24geyIgKyBzdGQ6OnRvX3N0cmluZyhldmVudC5jbGllbnRJZCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGV2ZW50LnNlc3Npb25JZCkgKyAifTogIiArIGV2ZW50U3RyOworICAgIH0KKworICAgIC8vIFBvcCAxIGV2ZW50IGZyb20gZnJvbnQsIHdhaXQgZm9yIHVwIHRvIHRpbWVvdXRVcyBpZiBlbXB0eS4KKyAgICBjb25zdCBFdmVudCYgcG9wKGludDY0X3QgdGltZW91dFVzID0gMCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobUxvY2spOworCisgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5lbXB0eSgpICYmIHRpbWVvdXRVcyA+IDApIHsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyh0aW1lb3V0VXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBtUG9wcGVkRXZlbnQgPSBOb0V2ZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gKm1FdmVudFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBtRXZlbnRRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtUG9wcGVkRXZlbnQ7CisgICAgfQorCisgICAgYm9vbCB3YWl0Rm9yU3BlY2lmaWNFdmVudEFuZFBvcChjb25zdCBFdmVudCYgdGFyZ2V0LCBzdGQ6Omxpc3Q8RXZlbnQ+KiBvdXRFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IDApIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKworICAgICAgICBhdXRvIHN0YXJ0VGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgICAgICBpbnQ2NF90IHJlbWFpbmluZ1VzID0gdGltZW91dFVzOworCisgICAgICAgIHN0ZDo6bGlzdDxFdmVudD46Oml0ZXJhdG9yIGl0OworICAgICAgICB3aGlsZSAoKChpdCA9IHN0ZDo6ZmluZChtRXZlbnRRdWV1ZS5iZWdpbigpLCBtRXZlbnRRdWV1ZS5lbmQoKSwgdGFyZ2V0KSkgPT0KKyAgICAgICAgICAgICAgICBtRXZlbnRRdWV1ZS5lbmQoKSkgJiYKKyAgICAgICAgICAgICAgIHJlbWFpbmluZ1VzID4gMCkgeworICAgICAgICAgICAgc3RkOjpjdl9zdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKHJlbWFpbmluZ1VzKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIGVsYXBzZWRUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkgLSBzdGFydFRpbWU7CisgICAgICAgICAgICByZW1haW5pbmdVcyA9IHRpbWVvdXRVcyAtIGVsYXBzZWRUaW1lLmNvdW50KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXQgPT0gbUV2ZW50UXVldWUuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqb3V0RXZlbnRzID0gc3RkOjpsaXN0PEV2ZW50PihtRXZlbnRRdWV1ZS5iZWdpbigpLCBzdGQ6Om5leHQoaXQpKTsKKyAgICAgICAgbUV2ZW50UXVldWUuZXJhc2UobUV2ZW50UXVldWUuYmVnaW4oKSwgc3RkOjpuZXh0KGl0KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFB1c2ggMSBldmVudCB0byBiYWNrLgorICAgIHZvaWQgYXBwZW5kKGNvbnN0IEV2ZW50JiBldmVudCwKKyAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2NvZGluZ0Vycm9yQ29kZSBlcnIgPSBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a05vRXJyb3IpIHsKKyAgICAgICAgQUxPR0QoIiVzIiwgdG9TdHJpbmcoZXZlbnQpLmNfc3RyKCkpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTG9jayk7CisKKyAgICAgICAgbUV2ZW50UXVldWUucHVzaF9iYWNrKGV2ZW50KTsKKyAgICAgICAgbUxhc3RFcnIgPSBlcnI7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlUHJvZ3Jlc3MoaW50IHByb2dyZXNzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIG1MYXN0UHJvZ3Jlc3MgPSBwcm9ncmVzczsKKyAgICAgICAgbVVwZGF0ZUNvdW50Kys7CisgICAgfQorCisgICAgaW50IGdldFVwZGF0ZUNvdW50KGludCogbGFzdFByb2dyZXNzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgICpsYXN0UHJvZ3Jlc3MgPSBtTGFzdFByb2dyZXNzOworICAgICAgICByZXR1cm4gbVVwZGF0ZUNvdW50OworICAgIH0KKworICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlIGdldExhc3RFcnJvcigpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1MYXN0RXJyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgRXZlbnQgbVBvcHBlZEV2ZW50OworICAgIHN0ZDo6bGlzdDxFdmVudD4gbUV2ZW50UXVldWU7CisgICAgVHJhbnNjb2RpbmdFcnJvckNvZGUgbUxhc3RFcnI7CisgICAgaW50IG1VcGRhdGVDb3VudCA9IDA7CisgICAgaW50IG1MYXN0UHJvZ3Jlc3MgPSAtMTsKK307CisKKy8vIE9wZXJhdG9ycyBmb3IgR1Rlc3QgbWFjcm9zLgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV2ZW50VHJhY2tlcjo6RXZlbnQmIGxocywgY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgcmhzKSB7CisgICAgcmV0dXJuIGxocy50eXBlID09IHJocy50eXBlICYmIGxocy5jbGllbnRJZCA9PSByaHMuY2xpZW50SWQgJiYgbGhzLnNlc3Npb25JZCA9PSByaHMuc2Vzc2lvbklkOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzdHIsIGNvbnN0IEV2ZW50VHJhY2tlcjo6RXZlbnQmIHYpIHsKKyAgICBzdHIgPDwgRXZlbnRUcmFja2VyOjp0b1N0cmluZyh2KTsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgY29uc3RleHByIGJvb2wgc3VjY2VzcyA9IHRydWU7CitzdGF0aWMgY29uc3RleHByIGJvb2wgZmFpbCA9IGZhbHNlOworCitzdHJ1Y3QgVGVzdENsaWVudENhbGxiYWNrIDogcHVibGljIEJuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRXZlbnRUcmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFRlc3RDbGllbnRDYWxsYmFjaz4geworICAgIFRlc3RDbGllbnRDYWxsYmFjayhjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSwgaW50MzJfdCBpZCkKKyAgICAgICAgICA6IG1DbGllbnRJZChpZCksIG1DbGllbnRQaWQoUElEKGlkKSksIG1DbGllbnRVaWQoVUlEKGlkKSksIG1QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkgeworICAgICAgICBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrICVkIGNyZWF0ZWQ6IHBpZCAlZCwgdWlkICVkIiwgaWQsIFBJRChpZCksIFVJRChpZCkpOworCisgICAgICAgIC8vIFVzZSBwYWNrYWdlIHVpZCBpZiB0aGF0J3MgYXZhaWxhYmxlLgorICAgICAgICB1aWRfdCBwYWNrYWdlVWlkOworICAgICAgICBpZiAoZ2V0VWlkRm9yUGFja2FnZShTdHJpbmcxNihwYWNrYWdlTmFtZSksIDAgLyp1c2VySWQqLywgcGFja2FnZVVpZCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DbGllbnRVaWQgPSBwYWNrYWdlVWlkOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+VGVzdENsaWVudENhbGxiYWNrKCkgeyBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrICVkIGRlc3Ryb3llZCIsIG1DbGllbnRJZCk7IH0KKworICAgIFN0YXR1cyBvcGVuRmlsZURlc2NyaXB0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIGluX2ZpbGVVcmksIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR0QoIkBAQCBvcGVuRmlsZURlc2NyaXB0b3I6ICVzIiwgaW5fZmlsZVVyaS5jX3N0cigpKTsKKyAgICAgICAgaW50IGZkOworICAgICAgICBpZiAoaW5fbW9kZSA9PSAidyIgfHwgaW5fbW9kZSA9PSAicnciKSB7CisgICAgICAgICAgICBpbnQga09wZW5GbGFnczsKKyAgICAgICAgICAgIGlmIChpbl9tb2RlID09ICJ3IikgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlLW9ubHksIGNyZWF0ZSBmaWxlIGlmIG5vbi1leGlzdGVudCwgdHJ1bmNhdGUgZXhpc3RpbmcgZmlsZS4KKyAgICAgICAgICAgICAgICBrT3BlbkZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUmVhZC1Xcml0ZSwgY3JlYXRlIGlmIG5vbi1leGlzdGVudCwgbm8gdHJ1bmNhdGUgKHNlcnZpY2Ugd2lsbCB0cnVuY2F0ZSBpZiBuZWVkZWQpCisgICAgICAgICAgICAgICAga09wZW5GbGFncyA9IE9fUkRXUiB8IE9fQ1JFQVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBVc2VyIFIrVyBwZXJtaXNzaW9uLgorICAgICAgICAgICAgY29uc3RleHByIGludCBrRmlsZU1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUjsKKyAgICAgICAgICAgIGZkID0gb3Blbihpbl9maWxlVXJpLmNfc3RyKCksIGtPcGVuRmxhZ3MsIGtGaWxlTW9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZCA9IG9wZW4oaW5fZmlsZVVyaS5jX3N0cigpLCBPX1JET05MWSk7CisgICAgICAgIH0KKyAgICAgICAgX2FpZGxfcmV0dXJuLT5zZXQoZmQpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nU3RhcnRlZChpbnQzMl90IGluX3Nlc3Npb25JZCkgb3ZlcnJpZGUgeworICAgICAgICBhcHBlbmQoRXZlbnRUcmFja2VyOjpTdGFydChtQ2xpZW50SWQsIGluX3Nlc3Npb25JZCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nUGF1c2VkKGludDMyX3QgaW5fc2Vzc2lvbklkKSBvdmVycmlkZSB7CisgICAgICAgIGFwcGVuZChFdmVudFRyYWNrZXI6OlBhdXNlKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdSZXN1bWVkKGludDMyX3QgaW5fc2Vzc2lvbklkKSBvdmVycmlkZSB7CisgICAgICAgIGFwcGVuZChFdmVudFRyYWNrZXI6OlJlc3VtZShtQ2xpZW50SWQsIGluX3Nlc3Npb25JZCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nRmluaXNoZWQoCisgICAgICAgICAgICBpbnQzMl90IGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nUmVzdWx0UGFyY2VsJiAvKiBpbl9yZXN1bHQgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgYXBwZW5kKEZpbmlzaGVkKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdGYWlsZWQoaW50MzJfdCBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdFcnJvckNvZGUgaW5fZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIGFwcGVuZChGYWlsZWQobUNsaWVudElkLCBpbl9zZXNzaW9uSWQpLCBpbl9lcnJvckNvZGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvbkF3YWl0TnVtYmVyT2ZTZXNzaW9uc0NoYW5nZWQoaW50MzJfdCAvKiBpbl9zZXNzaW9uSWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIGluX29sZEF3YWl0TnVtYmVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9uZXdBd2FpdE51bWJlciAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblByb2dyZXNzVXBkYXRlKGludDMyX3QgLyogaW5fc2Vzc2lvbklkICovLCBpbnQzMl90IGluX3Byb2dyZXNzKSBvdmVycmlkZSB7CisgICAgICAgIHVwZGF0ZVByb2dyZXNzKGluX3Byb2dyZXNzKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBTdGF0dXMgcmVnaXN0ZXJDbGllbnQoY29uc3QgY2hhciogcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+JiBzZXJ2aWNlKSB7CisgICAgICAgIC8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHVpZCBpZiB0aGUgcGFja2FnZSB1aWQgaXMgZm91bmQuCisgICAgICAgIHVpZF90IHVpZDsKKyAgICAgICAgaWYgKGdldFVpZEZvclBhY2thZ2UoU3RyaW5nMTYocGFja2FnZU5hbWUpLCAwIC8qdXNlcklkKi8sIHVpZCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DbGllbnRVaWQgPSB1aWQ7CisgICAgICAgIH0KKworICAgICAgICBBTE9HRCgicmVnaXN0ZXJpbmcgJXMgd2l0aCB1aWQgJWQiLCBwYWNrYWdlTmFtZSwgbUNsaWVudFVpZCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworICAgICAgICBTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBzZXJ2aWNlLT5yZWdpc3RlckNsaWVudChzaGFyZWRfZnJvbV90aGlzKCksIGtDbGllbnROYW1lLCBwYWNrYWdlTmFtZSwgJmNsaWVudCk7CisKKyAgICAgICAgbUNsaWVudCA9IHN0YXR1cy5pc09rKCkgPyBjbGllbnQgOiBudWxscHRyOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFN0YXR1cyB1bnJlZ2lzdGVyQ2xpZW50KCkgeworICAgICAgICBTdGF0dXMgc3RhdHVzOworICAgICAgICBpZiAobUNsaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQ2xpZW50LT51bnJlZ2lzdGVyKCk7CisgICAgICAgICAgICBtQ2xpZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxib29sIGV4cGVjdGF0aW9uID0gc3VjY2Vzcz4KKyAgICBib29sIHN1Ym1pdChpbnQzMl90IHNlc3Npb25JZCwgY29uc3QgY2hhciogc291cmNlRmlsZVBhdGgsIGNvbnN0IGNoYXIqIGRlc3RpbmF0aW9uRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHkgcHJpb3JpdHkgPSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICBpbnQgYml0cmF0ZUJwcyA9IC0xLCBpbnQgb3ZlcnJpZGVQaWQgPSAtMSwgaW50IG92ZXJyaWRlVWlkID0gLTEpIHsKKyAgICAgICAgY29uc3RleHByIGJvb2wgc2hvdWxkU3VjY2VlZCA9IChleHBlY3RhdGlvbiA9PSBzdWNjZXNzKTsKKyAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCByZXF1ZXN0OworICAgICAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbjsKKworICAgICAgICByZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gc291cmNlRmlsZVBhdGg7CisgICAgICAgIHJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aCA9IGRlc3RpbmF0aW9uRmlsZVBhdGg7CisgICAgICAgIHJlcXVlc3QucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgcmVxdWVzdC5jbGllbnRQaWQgPSAob3ZlcnJpZGVQaWQgPT0gLTEpID8gbUNsaWVudFBpZCA6IG92ZXJyaWRlUGlkOworICAgICAgICByZXF1ZXN0LmNsaWVudFVpZCA9IChvdmVycmlkZVVpZCA9PSAtMSkgPyBtQ2xpZW50VWlkIDogb3ZlcnJpZGVVaWQ7CisgICAgICAgIHJlcXVlc3QuY2xpZW50UGFja2FnZU5hbWUgPSAob3ZlcnJpZGVVaWQgPT0gLTEpID8gbVBhY2thZ2VOYW1lIDogIiI7CisgICAgICAgIGlmIChiaXRyYXRlQnBzID4gMCkgeworICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZWRWaWRlb1RyYWNrRm9ybWF0LmVtcGxhY2UoVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0KCkpOworICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZWRWaWRlb1RyYWNrRm9ybWF0LT5iaXRyYXRlQnBzID0gYml0cmF0ZUJwczsKKyAgICAgICAgfQorICAgICAgICBTdGF0dXMgc3RhdHVzID0gbUNsaWVudC0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIHNob3VsZFN1Y2NlZWQpOworICAgICAgICBpZiAoc2hvdWxkU3VjY2VlZCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBzZXNzaW9uSWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgJiYgKHJlc3VsdCA9PSBzaG91bGRTdWNjZWVkKSAmJgorICAgICAgICAgICAgICAgKCFzaG91bGRTdWNjZWVkIHx8IHNlc3Npb24uc2Vzc2lvbklkID09IHNlc3Npb25JZCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGJvb2wgZXhwZWN0YXRpb24gPSBzdWNjZXNzPgorICAgIGJvb2wgY2FuY2VsKGludDMyX3Qgc2Vzc2lvbklkKSB7CisgICAgICAgIGNvbnN0ZXhwciBib29sIHNob3VsZFN1Y2NlZWQgPSAoZXhwZWN0YXRpb24gPT0gc3VjY2Vzcyk7CisgICAgICAgIGJvb2wgcmVzdWx0OworICAgICAgICBTdGF0dXMgc3RhdHVzID0gbUNsaWVudC0+Y2FuY2VsU2Vzc2lvbihzZXNzaW9uSWQsICZyZXN1bHQpOworCisgICAgICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBzaG91bGRTdWNjZWVkKTsKKworICAgICAgICByZXR1cm4gc3RhdHVzLmlzT2soKSAmJiAocmVzdWx0ID09IHNob3VsZFN1Y2NlZWQpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxib29sIGV4cGVjdGF0aW9uID0gc3VjY2Vzcz4KKyAgICBib29sIGdldFNlc3Npb24oaW50MzJfdCBzZXNzaW9uSWQsIGNvbnN0IGNoYXIqIHNvdXJjZUZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXN0aW5hdGlvbkZpbGVQYXRoKSB7CisgICAgICAgIGNvbnN0ZXhwciBib29sIHNob3VsZFN1Y2NlZWQgPSAoZXhwZWN0YXRpb24gPT0gc3VjY2Vzcyk7CisgICAgICAgIGJvb2wgcmVzdWx0OworICAgICAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbjsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG1DbGllbnQtPmdldFNlc3Npb25XaXRoSWQoc2Vzc2lvbklkLCAmc2Vzc2lvbiwgJnJlc3VsdCk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIHNob3VsZFN1Y2NlZWQpOworICAgICAgICBpZiAoc2hvdWxkU3VjY2VlZCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgRVhQRUNUX0VRKHNlc3Npb24ucmVxdWVzdC5zb3VyY2VGaWxlUGF0aCwgc291cmNlRmlsZVBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgJiYgKHJlc3VsdCA9PSBzaG91bGRTdWNjZWVkKSAmJgorICAgICAgICAgICAgICAgKCFzaG91bGRTdWNjZWVkIHx8IChzZXNzaW9uLnNlc3Npb25JZCA9PSBzZXNzaW9uSWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID09IHNvdXJjZUZpbGVQYXRoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24ucmVxdWVzdC5kZXN0aW5hdGlvbkZpbGVQYXRoID09IGRlc3RpbmF0aW9uRmlsZVBhdGgpKTsKKyAgICB9CisKKyAgICBpbnQzMl90IG1DbGllbnRJZDsKKyAgICBwaWRfdCBtQ2xpZW50UGlkOworICAgIHVpZF90IG1DbGllbnRVaWQ7CisgICAgc3RkOjpzdHJpbmcgbVBhY2thZ2VOYW1lOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IG1DbGllbnQ7Cit9OworCitjbGFzcyBNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RCYXNlIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0QmFzZSgpIHsgQUxPR0koIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEJhc2UgY3JlYXRlZCIpOyB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RCYXNlKCkgeworICAgICAgICBBTE9HSSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0QmFzZSBkZXN0cm95ZWQiKTsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBOZWVkIHRocmVhZCBwb29sIHRvIHJlY2VpdmUgY2FsbGJhY2tzLCBvdGhlcndpc2Ugb25ld2F5IGNhbGxiYWNrcyBhcmUKKyAgICAgICAgLy8gc2lsZW50bHkgaWdub3JlZC4KKyAgICAgICAgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKCk7CisgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZSgibWVkaWEudHJhbnNjb2RpbmciKSk7CisgICAgICAgIG1TZXJ2aWNlID0gSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpmcm9tQmluZGVyKGJpbmRlcik7CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIG1lZGlhLnRyYXNjb2Rpbmcgc2VydmljZS4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1DbGllbnQxID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPihrQ2xpZW50UGFja2FnZUEsIDEpOworICAgICAgICBtQ2xpZW50MiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnRDYWxsYmFjaz4oa0NsaWVudFBhY2thZ2VCLCAyKTsKKyAgICAgICAgbUNsaWVudDMgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50Q2FsbGJhY2s+KGtDbGllbnRQYWNrYWdlQywgMyk7CisgICAgfQorCisgICAgU3RhdHVzIHJlZ2lzdGVyT25lQ2xpZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgeworICAgICAgICBBTE9HRCgicmVnaXN0ZXJpbmcgJXMgd2l0aCB1aWQgJWQiLCBjYWxsYmFjay0+bVBhY2thZ2VOYW1lLmNfc3RyKCksIGNhbGxiYWNrLT5tQ2xpZW50VWlkKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgICAgIG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChjYWxsYmFjaywga0NsaWVudE5hbWUsIGNhbGxiYWNrLT5tUGFja2FnZU5hbWUsICZjbGllbnQpOworCisgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBjYWxsYmFjay0+bUNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5tQ2xpZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZvaWQgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKSB7CisgICAgICAgIC8vIFJlZ2lzdGVyIDMgY2xpZW50cy4KKyAgICAgICAgRVhQRUNUX1RSVUUocmVnaXN0ZXJPbmVDbGllbnQobUNsaWVudDEpLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlZ2lzdGVyT25lQ2xpZW50KG1DbGllbnQyKS5pc09rKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWdpc3Rlck9uZUNsaWVudChtQ2xpZW50MykuaXNPaygpKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgbnVtYmVyIG9mIGNsaWVudHMuCisgICAgICAgIGludDMyX3QgbnVtT2ZDbGllbnRzOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPmdldE51bU9mQ2xpZW50cygmbnVtT2ZDbGllbnRzKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9HRShudW1PZkNsaWVudHMsIDMpOworICAgIH0KKworICAgIHZvaWQgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpIHsKKyAgICAgICAgLy8gVW5yZWdpc3RlciB0aGUgY2xpZW50cy4KKyAgICAgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnVucmVnaXN0ZXJDbGllbnQoKS5pc09rKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+dW5yZWdpc3RlckNsaWVudCgpLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1DbGllbnQzLT51bnJlZ2lzdGVyQ2xpZW50KCkuaXNPaygpKTsKKyAgICB9CisKKyAgICB2b2lkIGRlbGV0ZUZpbGUoY29uc3QgY2hhciogcGF0aCkgeyB1bmxpbmsocGF0aCk7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+IG1TZXJ2aWNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+IG1DbGllbnQxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+IG1DbGllbnQyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+IG1DbGllbnQzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9SRUFETUUudHh0IGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTQ2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1JFQURNRS50eHQKQEAgLTAsMCArMSw4IEBACittZWRpYXRyYW5zY29kaW5nc2VydmljZV9zaW11bGF0ZWRfdGVzdHM6CisJVGVzdHMgbWVkaWEgdHJhbnNjb2Rpbmcgc2VydmljZSB3aXRoIHNpbXVsYXRlZCB0cmFuc2NvZGVyLgorCittZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZWFsX3Rlc3RzOgorCVRlc3RzIG1lZGlhIHRyYW5zY29kaW5nIHNlcnZpY2Ugd2l0aCByZWFsIHRyYW5zY29kZXIuIFVzZXMgdGhlIHNhbWUgdGVzdCBhc3NldHMKKwlhcyB0aGUgTWVkaWFUcmFuc2NvZGVyIHVuaXQgdGVzdHMuIEJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0LCBwbGVhc2UgbWFrZSBzdXJlCisJdG8gcHVzaCB0aGUgdGVzdCBhc3NldHMgdG8gL3NkY2FyZDoKKwlhZGIgcHVzaCAkVE9QL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMgL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhOTRmYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMyBAQAorYW5kcm9pZF90ZXN0X2hlbHBlcl9hcHAgeworICAgIG5hbWU6ICJUcmFuc2NvZGluZ1VpZFBvbGljeV9UZXN0QXBwQSIsCisgICAgbWFuaWZlc3Q6ICJUZXN0QXBwQS54bWwiLAorICAgIHN0YXRpY19saWJzOiBbImFuZHJvaWR4LnRlc3QucnVsZXMiXSwKKyAgICBzZGtfdmVyc2lvbjogInRlc3RfY3VycmVudCIsCisgICAgc3JjczogWyJzcmMvKiovKi5qYXZhIl0sCit9CisKK2FuZHJvaWRfdGVzdF9oZWxwZXJfYXBwIHsKKyAgICBuYW1lOiAiVHJhbnNjb2RpbmdVaWRQb2xpY3lfVGVzdEFwcEIiLAorICAgIG1hbmlmZXN0OiAiVGVzdEFwcEIueG1sIiwKKyAgICBzdGF0aWNfbGliczogWyJhbmRyb2lkeC50ZXN0LnJ1bGVzIl0sCisgICAgc2RrX3ZlcnNpb246ICJ0ZXN0X2N1cnJlbnQiLAorICAgIHNyY3M6IFsic3JjLyoqLyouamF2YSJdLAorfQorCithbmRyb2lkX3Rlc3RfaGVscGVyX2FwcCB7CisgICAgbmFtZTogIlRyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBDIiwKKyAgICBtYW5pZmVzdDogIlRlc3RBcHBDLnhtbCIsCisgICAgc3RhdGljX2xpYnM6IFsiYW5kcm9pZHgudGVzdC5ydWxlcyJdLAorICAgIHNka192ZXJzaW9uOiAidGVzdF9jdXJyZW50IiwKKyAgICBzcmNzOiBbInNyYy8qKi8qLmphdmEiXSwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9UZXN0QXBwQS54bWwgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9UZXN0QXBwQS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmZjE3MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL1Rlc3RBcHBBLnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLnRlc3RhcHAuQSIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCIgPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IlRlc3RBcHBBIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2RpbmcuTWFpbkFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC50ZXN0cy50cmFuc2NvZGluZy5SZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvVGVzdEFwcEIueG1sIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvVGVzdEFwcEIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYWEzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9UZXN0QXBwQi54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0cy50cmFuc2NvZGluZy50ZXN0YXBwLkIiCisgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiID4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJUZXN0QXBwQiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLk1haW5BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvVGVzdEFwcEMueG1sIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvVGVzdEFwcEMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZGUzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9UZXN0QXBwQy54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0cy50cmFuc2NvZGluZy50ZXN0YXBwLkMiCisgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiID4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJUZXN0QXBwQyI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLk1haW5BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL3NyYy9jb20vYW5kcm9pZC90ZXN0cy90cmFuc2NvZGluZy9NYWluQWN0aXZpdHkuamF2YSBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL3NyYy9jb20vYW5kcm9pZC90ZXN0cy90cmFuc2NvZGluZy9NYWluQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzkxNjRkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvc3JjL2NvbS9hbmRyb2lkL3Rlc3RzL3RyYW5zY29kaW5nL01haW5BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2Rpbmc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogVGhpcyBpcyBhbiBlbXB0eSBhY3Rpdml0eSBmb3IgdGVzdGluZyB0aGUgVUlEIHBvbGljeSBvZiBtZWRpYSB0cmFuc2NvZGluZyBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgTWFpbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWFpbkFjdGl2aXR5IjsKKworICAgIC8vIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bGwgbGlmZXRpbWUuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAvLyBJbml0aWFsaXplIEFjdGl2aXR5IGFuZCBpbmZsYXRlIHRoZSBVSS4KKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYWZ0ZXIgb25DcmVhdGUgaGFzIGZpbmlzaGVkLCB1c2UgdG8gcmVzdG9yZSBVSSBzdGF0ZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIC8vIFJlc3RvcmUgVUkgc3RhdGUgZnJvbSB0aGUgc2F2ZWRJbnN0YW5jZVN0YXRlLgorICAgICAgICAvLyBUaGlzIGJ1bmRsZSBoYXMgYWxzbyBiZWVuIHBhc3NlZCB0byBvbkNyZWF0ZS4KKyAgICAgICAgLy8gV2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgQWN0aXZpdHkgaGFzIGJlZW4KKyAgICAgICAgLy8ga2lsbGVkIGJ5IHRoZSBzeXN0ZW0gc2luY2UgaXQgd2FzIGxhc3QgdmlzaWJsZS4KKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYmVmb3JlIHN1YnNlcXVlbnQgdmlzaWJsZSBsaWZldGltZXMKKyAgICAvLyBmb3IgYW4gYWN0aXZpdHkgcHJvY2Vzcy4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RhcnQoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdGFydCgpOworICAgICAgICAvLyBMb2FkIGNoYW5nZXMga25vd2luZyB0aGF0IHRoZSBBY3Rpdml0eSBoYXMgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIHZpc2libGUgd2l0aGluIHRoaXMgcHJvY2Vzcy4KKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB2aXNpYmxlIGxpZmV0aW1lLgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKyAgICAgICAgLy8gQXBwbHkgYW55IHJlcXVpcmVkIFVJIGNoYW5nZSBub3cgdGhhdCB0aGUgQWN0aXZpdHkgaXMgdmlzaWJsZS4KKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBhY3RpdmUgbGlmZXRpbWUuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIC8vIFJlc3VtZSBhbnkgcGF1c2VkIFVJIHVwZGF0ZXMsIHRocmVhZHMsIG9yIHByb2Nlc3NlcyByZXF1aXJlZAorICAgICAgICAvLyBieSB0aGUgQWN0aXZpdHkgYnV0IHN1c3BlbmRlZCB3aGVuIGl0IHdhcyBpbmFjdGl2ZS4KKyAgICB9CisKKyAgICAvLyBDYWxsZWQgdG8gc2F2ZSBVSSBzdGF0ZSBjaGFuZ2VzIGF0IHRoZQorICAgIC8vIGVuZCBvZiB0aGUgYWN0aXZlIGxpZmVjeWNsZS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgLy8gU2F2ZSBVSSBzdGF0ZSBjaGFuZ2VzIHRvIHRoZSBzYXZlZEluc3RhbmNlU3RhdGUuCisgICAgICAgIC8vIFRoaXMgYnVuZGxlIHdpbGwgYmUgcGFzc2VkIHRvIG9uQ3JlYXRlIGFuZAorICAgICAgICAvLyBvblJlc3RvcmVJbnN0YW5jZVN0YXRlIGlmIHRoZSBwcm9jZXNzIGlzCisgICAgICAgIC8vIGtpbGxlZCBhbmQgcmVzdGFydGVkIGJ5IHRoZSBydW4gdGltZS4KKyAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIC8vIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBhY3RpdmUgbGlmZXRpbWUuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gU3VzcGVuZCBVSSB1cGRhdGVzLCB0aHJlYWRzLCBvciBDUFUgaW50ZW5zaXZlIHByb2Nlc3NlcworICAgICAgICAvLyB0aGF0IGRvbid0IG5lZWQgdG8gYmUgdXBkYXRlZCB3aGVuIHRoZSBBY3Rpdml0eSBpc24ndAorICAgICAgICAvLyB0aGUgYWN0aXZlIGZvcmVncm91bmQgQWN0aXZpdHkuCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgdmlzaWJsZSBsaWZldGltZS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIC8vIFN1c3BlbmQgcmVtYWluaW5nIFVJIHVwZGF0ZXMsIHRocmVhZHMsIG9yIHByb2Nlc3NpbmcKKyAgICAgICAgLy8gdGhhdCBhcmVuJ3QgcmVxdWlyZWQgd2hlbiB0aGUgQWN0aXZpdHkgaXNuJ3QgdmlzaWJsZS4KKyAgICAgICAgLy8gUGVyc2lzdCBhbGwgZWRpdHMgb3Igc3RhdGUgY2hhbmdlcworICAgICAgICAvLyBhcyBhZnRlciB0aGlzIGNhbGwgdGhlIHByb2Nlc3MgaXMgbGlrZWx5IHRvIGJlIGtpbGxlZC4KKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgfQorCisgICAgLy8gU29tZXRpbWVzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBmdWxsIGxpZmV0aW1lLgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgLy8gQ2xlYW4gdXAgYW55IHJlc291cmNlcyBpbmNsdWRpbmcgZW5kaW5nIHRocmVhZHMsCisgICAgICAgIC8vIGNsb3NpbmcgZGF0YWJhc2UgY29ubmVjdGlvbnMgZXRjLgorICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9zcmMvY29tL2FuZHJvaWQvdGVzdHMvdHJhbnNjb2RpbmcvUmVzb3VyY2VQb2xpY3lUZXN0QWN0aXZpdHkuamF2YSBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL3NyYy9jb20vYW5kcm9pZC90ZXN0cy90cmFuc2NvZGluZy9SZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTJkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9zcmMvY29tL2FuZHJvaWQvdGVzdHMvdHJhbnNjb2RpbmcvUmVzb3VyY2VQb2xpY3lUZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0cy50cmFuc2NvZGluZzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5WaWRlb0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNMaXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PTlNFQ1VSRSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TRUNVUkUgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUlYID0gMjsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgVEFHOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUkFNRV9SQVRFID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElGUkFNRV9JTlRFUlZBTCA9IDEwOyAvLyAxMCBzZWNvbmRzIGJldHdlZW4gSS1mcmFtZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRSA9IE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9NUyA9IDUwMDA7CisKKyAgICBwcml2YXRlIFZlY3RvcjxNZWRpYUNvZGVjPiBtQ29kZWNzID0gbmV3IFZlY3RvcjxNZWRpYUNvZGVjPigpOworCisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q29kZWNDYWxsYmFjayBleHRlbmRzIE1lZGlhQ29kZWMuQ2FsbGJhY2sgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnB1dEJ1ZmZlckF2YWlsYWJsZShNZWRpYUNvZGVjIGNvZGVjLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uSW5wdXRCdWZmZXJBdmFpbGFibGUgIiArIGNvZGVjLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKAorICAgICAgICAgICAgICAgIE1lZGlhQ29kZWMgY29kZWMsIGludCBpbmRleCwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlICIgKyBjb2RlYy50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKE1lZGlhQ29kZWMgY29kZWMsIE1lZGlhQ29kZWMuQ29kZWNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25FcnJvciAiICsgY29kZWMudG9TdHJpbmcoKSArICIgZXJyb3JDb2RlICIgKyBlLmdldEVycm9yQ29kZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk91dHB1dEZvcm1hdENoYW5nZWQoTWVkaWFDb2RlYyBjb2RlYywgTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvbk91dHB1dEZvcm1hdENoYW5nZWQgIiArIGNvZGVjLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUNvZGVjLkNhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBUZXN0Q29kZWNDYWxsYmFjaygpOworCisgICAgcHJpdmF0ZSBNZWRpYUZvcm1hdCBnZXRUZXN0Rm9ybWF0KENvZGVjQ2FwYWJpbGl0aWVzIGNhcHMsIGJvb2xlYW4gc2VjdXJlUGxheWJhY2spIHsKKyAgICAgICAgVmlkZW9DYXBhYmlsaXRpZXMgdmNhcHMgPSBjYXBzLmdldFZpZGVvQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgIGludCB3aWR0aCA9IHZjYXBzLmdldFN1cHBvcnRlZFdpZHRocygpLmdldExvd2VyKCk7CisgICAgICAgIGludCBoZWlnaHQgPSB2Y2Fwcy5nZXRTdXBwb3J0ZWRIZWlnaHRzRm9yKHdpZHRoKS5nZXRMb3dlcigpOworICAgICAgICBpbnQgYml0cmF0ZSA9IHZjYXBzLmdldEJpdHJhdGVSYW5nZSgpLmdldExvd2VyKCk7CisKKyAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlVmlkZW9Gb3JtYXQoTUlNRSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQsIGNhcHMuY29sb3JGb3JtYXRzWzBdKTsKKyAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBiaXRyYXRlKTsKKyAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUsIEZSQU1FX1JBVEUpOworICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSV9GUkFNRV9JTlRFUlZBTCwgSUZSQU1FX0lOVEVSVkFMKTsKKyAgICAgICAgZm9ybWF0LnNldEZlYXR1cmVFbmFibGVkKENvZGVjQ2FwYWJpbGl0aWVzLkZFQVRVUkVfU2VjdXJlUGxheWJhY2ssIHNlY3VyZVBsYXliYWNrKTsKKyAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lZGlhQ29kZWNJbmZvIGdldFRlc3RDb2RlY0luZm8oYm9vbGVhbiBzZWN1cmVQbGF5YmFjaykgeworICAgICAgICAvLyBVc2UgYXZjIGRlY29kZXIgZm9yIHRlc3RpbmcuCisgICAgICAgIGJvb2xlYW4gaXNFbmNvZGVyID0gZmFsc2U7CisKKyAgICAgICAgTWVkaWFDb2RlY0xpc3QgbWNsID0gbmV3IE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0LkFMTF9DT0RFQ1MpOworICAgICAgICBmb3IgKE1lZGlhQ29kZWNJbmZvIGluZm8gOiBtY2wuZ2V0Q29kZWNJbmZvcygpKSB7CisgICAgICAgICAgICBpZiAoaW5mby5pc0VuY29kZXIoKSAhPSBpc0VuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvZGVjQ2FwYWJpbGl0aWVzIGNhcHM7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNhcHMgPSBpbmZvLmdldENhcGFiaWxpdGllc0ZvclR5cGUoTUlNRSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWN1cmVQbGF5YmFja1N1cHBvcnRlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLmlzRmVhdHVyZVN1cHBvcnRlZChDb2RlY0NhcGFiaWxpdGllcy5GRUFUVVJFX1NlY3VyZVBsYXliYWNrKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHNlY3VyZVBsYXliYWNrUmVxdWlyZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy5pc0ZlYXR1cmVSZXF1aXJlZChDb2RlY0NhcGFiaWxpdGllcy5GRUFUVVJFX1NlY3VyZVBsYXliYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoKHNlY3VyZVBsYXliYWNrICYmIHNlY3VyZVBsYXliYWNrU3VwcG9ydGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFzZWN1cmVQbGF5YmFjayAmJiAhc2VjdXJlUGxheWJhY2tSZXF1aXJlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VjdXJlUGxheWJhY2sgIiArIHNlY3VyZVBsYXliYWNrICsgIiB3aWxsIHVzZSAiICsgaW5mby5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNlY3VyZVBsYXliYWNrICIgKyBzZWN1cmVQbGF5YmFjayArICIgc2tpcCAiICsgaW5mby5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIG1pbWUgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGluZm87CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGFsbG9jYXRlQ29kZWNzKGludCBtYXgpIHsKKyAgICAgICAgQnVuZGxlIGV4dHJhcyA9IGdldEludGVudCgpLmdldEV4dHJhcygpOworICAgICAgICBpbnQgdHlwZSA9IFRZUEVfTk9OU0VDVVJFOworICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHR5cGUgPSBleHRyYXMuZ2V0SW50KCJ0ZXN0LXR5cGUiLCB0eXBlKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInR5cGUgaXM6ICIgKyB0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gc2hvdWxkU2tpcCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNlY3VyZVBsYXliYWNrOworICAgICAgICBpZiAodHlwZSA9PSBUWVBFX05PTlNFQ1VSRSB8fCB0eXBlID09IFRZUEVfTUlYKSB7CisgICAgICAgICAgICBzZWN1cmVQbGF5YmFjayA9IGZhbHNlOworICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8gaW5mbyA9IGdldFRlc3RDb2RlY0luZm8oc2VjdXJlUGxheWJhY2spOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFsbG9jYXRlQ29kZWNzKG1heCwgaW5mbywgc2VjdXJlUGxheWJhY2spOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaG91bGRTa2lwID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2hvdWxkU2tpcCkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9TRUNVUkUgfHwgdHlwZSA9PSBUWVBFX01JWCkgeworICAgICAgICAgICAgICAgIHNlY3VyZVBsYXliYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mbyBpbmZvID0gZ2V0VGVzdENvZGVjSW5mbyhzZWN1cmVQbGF5YmFjayk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZUNvZGVjcyhtYXgsIGluZm8sIHNlY3VyZVBsYXliYWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaG91bGRTa2lwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hvdWxkU2tpcCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAidGVzdCBza2lwcGVkIGFzIHRoZXJlJ3Mgbm8gc3VwcG9ydGVkIGNvZGVjLiIpOworICAgICAgICAgICAgZmluaXNoV2l0aFJlc3VsdChSRVNVTFRfT0spOworICAgICAgICB9CisKKyAgICAgICAgTG9nLmQoVEFHLCAiYWxsb2NhdGVDb2RlY3MgcmV0dXJuZWQgIiArIG1Db2RlY3Muc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIG1Db2RlY3Muc2l6ZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFsbG9jYXRlQ29kZWNzKGludCBtYXgsIE1lZGlhQ29kZWNJbmZvIGluZm8sIGJvb2xlYW4gc2VjdXJlUGxheWJhY2spIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpbmZvLmdldE5hbWUoKTsKKyAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgY2FwcyA9IGluZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yVHlwZShNSU1FKTsKKyAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gZ2V0VGVzdEZvcm1hdChjYXBzLCBzZWN1cmVQbGF5YmFjayk7CisgICAgICAgIE1lZGlhQ29kZWMgY29kZWMgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gbUNvZGVjcy5zaXplKCk7IGkgPCBtYXg7ICsraSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDcmVhdGUgY29kZWMgIiArIG5hbWUgKyAiICMiICsgaSk7CisgICAgICAgICAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjLmNyZWF0ZUJ5Q29kZWNOYW1lKG5hbWUpOworICAgICAgICAgICAgICAgIGNvZGVjLnNldENhbGxiYWNrKG1DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29uZmlndXJlIGNvZGVjICIgKyBmb3JtYXQpOworICAgICAgICAgICAgICAgIGNvZGVjLmNvbmZpZ3VyZShmb3JtYXQsIG51bGwsIG51bGwsIDApOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN0YXJ0IGNvZGVjICIgKyBmb3JtYXQpOworICAgICAgICAgICAgICAgIGNvZGVjLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgbUNvZGVjcy5hZGQoY29kZWMpOworICAgICAgICAgICAgICAgIGNvZGVjID0gbnVsbDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSU9FeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1lZGlhQ29kZWMuQ29kZWNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvZGVjRXhjZXB0aW9uIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoZS5nZXRFcnJvckNvZGUoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoY29kZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNlIGNvZGVjIik7CisgICAgICAgICAgICAgICAgICAgIGNvZGVjLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZWMgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaFdpdGhSZXN1bHQoaW50IHJlc3VsdCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2RlY3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2UgY29kZWMgIyIgKyBpKTsKKyAgICAgICAgICAgIG1Db2RlY3MuZ2V0KGkpLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBtQ29kZWNzLmNsZWFyKCk7CisgICAgICAgIHNldFJlc3VsdChyZXN1bHQpOworICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiYWN0aXZpdHkgZmluaXNoZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Vc2VDb2RlY3MoKSB7CisgICAgICAgIGludCBjdXJyZW50ID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoY3VycmVudCA9IDA7IGN1cnJlbnQgPCBtQ29kZWNzLnNpemUoKTsgKytjdXJyZW50KSB7CisgICAgICAgICAgICAgICAgbUNvZGVjcy5nZXQoY3VycmVudCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNZWRpYUNvZGVjLkNvZGVjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInVzZUNvZGVjcyBnb3QgQ29kZWNFeGNlcHRpb24gMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhlLmdldEVycm9yQ29kZSgpKSk7CisgICAgICAgICAgICBpZiAoZS5nZXRFcnJvckNvZGUoKSA9PSBNZWRpYUNvZGVjLkNvZGVjRXhjZXB0aW9uLkVSUk9SX1JFQ0xBSU1FRCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlbW92ZSBjb2RlYyAiICsgY3VycmVudCArICIgZnJvbSB0aGUgbGlzdCIpOworICAgICAgICAgICAgICAgIG1Db2RlY3MuZ2V0KGN1cnJlbnQpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQ29kZWNzLnJlbW92ZShjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBtR290UmVjbGFpbWVkRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtVXNlQ29kZWNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFRocmVhZCBtV29ya2VyVGhyZWFkOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtVXNlQ29kZWNzID0gdHJ1ZTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUdvdFJlY2xhaW1lZEV4Y2VwdGlvbiA9IGZhbHNlOworICAgIHByb3RlY3RlZCB2b2lkIHVzZUNvZGVjcygpIHsKKyAgICAgICAgbVdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGxvbmcgdGltZVNpbmNlU3RhcnRlZE1zID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAobVVzZUNvZGVjcyAmJiAodGltZVNpbmNlU3RhcnRlZE1zIDwgVElNRU9VVF9NUykpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9Vc2VDb2RlY3MoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MCAvKiBtaWxsaXMgKi8pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGltZVNpbmNlU3RhcnRlZE1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Hb3RSZWNsYWltZWRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiR290IGV4cGVjdGVkIHJlY2xhaW0gZXhjZXB0aW9uLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5pc2hXaXRoUmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtV29ya2VyVGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JTlNUQU5DRVMgPSAzMjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgVEFHID0gIlJlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5IjsKKworICAgICAgICBMb2cuZChUQUcsICJvbkNyZWF0ZSBjYWxsZWQuIik7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgaWYgKGFsbG9jYXRlQ29kZWNzKE1BWF9JTlNUQU5DRVMpID09IE1BWF9JTlNUQU5DRVMpIHsKKyAgICAgICAgICAgIC8vIGhhdmVuJ3QgcmVhY2hlZCB0aGUgbGltaXQgd2l0aCBNQVhfSU5TVEFOQ0VTLCBubyBuZWVkIHRvIHdhaXQgZm9yIHJlY2xhaW0gZXhjZXB0aW9uLgorICAgICAgICAgICAgLy9tV2FpdEZvclJlY2xhaW0gPSBmYWxzZTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRpZG4ndCBoaXQgcmVzb3VyY2UgbGltaXRhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgdXNlQ29kZWNzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBMb2cuZChUQUcsICJvbkRlc3Ryb3kgY2FsbGVkLiIpOworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBiY2RjN2Y3Li5lZGY2Nzc4Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTEzLDExICsxMywzNSBAQAogCiBtbQogCi1lY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisjIFB1c2ggdGhlIGZpbGVzIG9udG8gdGhlIGRldmljZS4KKy4gJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9wdXNoX2Fzc2V0cy5zaAogCi1hZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQgJiYgYWRiIHN5bmMKK2VjaG8gIls9PT09PT09PT09XSBpbnN0YWxsaW5nIHRlc3QgYXBwcyIKK2FkYiByb290CithZGIgaW5zdGFsbCAtdCAtciAtZyAtZCAkQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFUy9UcmFuc2NvZGluZ1VpZFBvbGljeV9UZXN0QXBwQS9hcm02NC9UcmFuc2NvZGluZ1VpZFBvbGljeV9UZXN0QXBwQS5hcGsKK2FkYiBpbnN0YWxsIC10IC1yIC1nIC1kICRBTkRST0lEX1RBUkdFVF9PVVRfVEVTVENBU0VTL1RyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBCL2FybTY0L1RyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBCLmFwaworYWRiIGluc3RhbGwgLXQgLXIgLWcgLWQgJEFORFJPSURfVEFSR0VUX09VVF9URVNUQ0FTRVMvVHJhbnNjb2RpbmdVaWRQb2xpY3lfVGVzdEFwcEMvYXJtNjQvVHJhbnNjb2RpbmdVaWRQb2xpY3lfVGVzdEFwcEMuYXBrCiAKLWVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCitlY2hvICJbPT09PT09PT09PV0gd2FpdGluZyBmb3IgZGV2aWNlIGFuZCBzeW5jIgorYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50ICYmIGFkYiBzeW5jCiAKLWVjaG8gInRlc3RpbmcgbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2UiCi1hZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzCitlY2hvICJbPT09PT09PT09PV0gcnVubmluZyBzaW11bGF0ZWQgdGVzdHMiCithZGIgc2hlbGwgc2V0cHJvcCBkZWJ1Zy50cmFuc2NvZGluZy5zaW11bGF0ZWRfdHJhbnNjb2RlciB0cnVlCithZGIgc2hlbGwga2lsbCAtOSBgcGlkIG1lZGlhLnRyYW5zY29kaW5nYAorI2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3NpbXVsYXRlZF90ZXN0cworYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3NpbXVsYXRlZF90ZXN0cworCitlY2hvICJbPT09PT09PT09PV0gcnVubmluZyByZWFsIHRlc3RzIgorYWRiIHNoZWxsIHNldHByb3AgZGVidWcudHJhbnNjb2Rpbmcuc2ltdWxhdGVkX3RyYW5zY29kZXIgZmFsc2UKK2FkYiBzaGVsbCBraWxsIC05IGBwaWQgbWVkaWEudHJhbnNjb2RpbmdgCisjYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZWFsX3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3JlYWxfdGVzdHMKK2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0L21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3JlYWxfdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVhbF90ZXN0cworCitlY2hvICJbPT09PT09PT09PV0gcnVubmluZyByZXNvdXJjZSB0ZXN0cyIKK2FkYiBzaGVsbCBraWxsIC05IGBwaWQgbWVkaWEudHJhbnNjb2RpbmdgCisjYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZXNvdXJjZV90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZXNvdXJjZV90ZXN0cworYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVzb3VyY2VfdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVzb3VyY2VfdGVzdHMKKworZWNobyAiWz09PT09PT09PT1dIHJlbW92aW5nIGRlYnVnIHByb3BlcnRpZXMiCithZGIgc2hlbGwgc2V0cHJvcCBkZWJ1Zy50cmFuc2NvZGluZy5zaW11bGF0ZWRfdHJhbnNjb2RlciBcIlwiCithZGIgc2hlbGwga2lsbCAtOSBgcGlkIG1lZGlhLnRyYW5zY29kaW5nYApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZWFsX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVhbF90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1MGQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVhbF90ZXN0cy5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QiCisKKyNpbmNsdWRlICJNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaCIKKworLyoKKyAqIFRlc3RzIG1lZGlhIHRyYW5zY29kaW5nIHNlcnZpY2Ugd2l0aCByZWFsIHRyYW5zY29kZXIuCisgKgorICogVXNlcyB0aGUgc2FtZSB0ZXN0IGFzc2V0cyBhcyB0aGUgTWVkaWFUcmFuc2NvZGVyIHVuaXQgdGVzdHMuIEJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0LAorICogcGxlYXNlIG1ha2Ugc3VyZSB0byBwdXNoIHRoZSB0ZXN0IGFzc2V0cyB0byAvc2RjYXJkOgorICoKKyAqIGFkYiBwdXNoICRUT1AvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvYXNzZXRzIC9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMKKyAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgbWVkaWEgeworCitjb25zdGV4cHIgaW50NjRfdCBrUGFkZGluZ1VzID0gNDAwMDAwOworY29uc3RleHByIGludDY0X3Qga1Nlc3Npb25XaXRoUGFkZGluZ1VzID0gMTAwMDAwMDAgKyBrUGFkZGluZ1VzOworY29uc3RleHByIGludDMyX3Qga0JpdFJhdGUgPSA4ICogMTAwMCAqIDEwMDA7ICAvLyA4TWJzCisKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrU2hvcnRTcmNQYXRoID0KKyAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrTG9uZ1NyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9sb25ndGVzdF8xNXMubXA0IjsKKworI2RlZmluZSBPVVRQQVRIKG5hbWUpICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VfIiAjbmFtZSAiLk1QNCIKKworY2xhc3MgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCA6IHB1YmxpYyBNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RCYXNlIHsKK3B1YmxpYzoKKyAgICBNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0KCkgeyBBTE9HSSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZXNvdXJjZVRlc3QgY3JlYXRlZCIpOyB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0KCkgeworICAgICAgICBBTE9HSSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZXNvdXJjZVRlc3QgZGVzdHJveWVkIik7CisgICAgfQorfTsKKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QsIFRlc3RJbnZhbGlkU291cmNlKSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiYmFkX2ZpbGVfdXJpIjsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoID0gT1VUUEFUSChUZXN0SW52YWxpZFNvdXJjZSk7CisgICAgZGVsZXRlRmlsZShkc3RQYXRoKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgc2Vzc2lvbi4KKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIG1DbGllbnQxLT5zdWJtaXQoMCwgc3JjUGF0aCwgZHN0UGF0aCwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsIGtCaXRSYXRlKSk7CisKKyAgICAvLyBDaGVjayBleHBlY3RlZCBlcnJvci4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGYWlsZWQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtFcnJvcklPKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QsIFRlc3RQYXNzdGhydSkgeworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoID0gT1VUUEFUSChUZXN0UGFzc3RocnUpOworICAgIGRlbGV0ZUZpbGUoZHN0UGF0aCk7CisKKyAgICAvLyBTdWJtaXQgb25lIHNlc3Npb24uCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgwLCBrU2hvcnRTcmNQYXRoLCBkc3RQYXRoKSk7CisKKyAgICAvLyBXYWl0IGZvciBzZXNzaW9uIHRvIGZpbmlzaC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMCkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCwgVGVzdFRyYW5zY29kZVZpZGVvKSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIGRzdFBhdGggPSBPVVRQQVRIKFRlc3RUcmFuc2NvZGVWaWRlbyk7CisgICAgZGVsZXRlRmlsZShkc3RQYXRoKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgc2Vzc2lvbi4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsIGtTaG9ydFNyY1BhdGgsIGRzdFBhdGgsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0JpdFJhdGUpKTsKKworICAgIC8vIFdhaXQgZm9yIHNlc3Npb24gdG8gZmluaXNoLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAwKSk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0LCBUZXN0VHJhbnNjb2RlVmlkZW9Qcm9ncmVzcykgeworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoID0gT1VUUEFUSChUZXN0VHJhbnNjb2RlVmlkZW9Qcm9ncmVzcyk7CisgICAgZGVsZXRlRmlsZShkc3RQYXRoKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgc2Vzc2lvbi4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsIGtMb25nU3JjUGF0aCwgZHN0UGF0aCwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQml0UmF0ZSkpOworCisgICAgLy8gV2FpdCBmb3Igc2Vzc2lvbiB0byBmaW5pc2guCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDApKTsKKworICAgIC8vIENoZWNrIHRoZSBwcm9ncmVzcyB1cGRhdGUgbWVzc2FnZXMgYXJlIHJlY2VpdmVkLiBGb3IgdGhpcyBjbGlwIChhcm91bmQgfjE1IHNlY29uZCBsb25nKSwKKyAgICAvLyBleHBlY3QgYXQgbGVhc3QgMTAgdXBkYXRlcywgYW5kIHRoZSBsYXN0IHVwZGF0ZSBzaG91bGQgYmUgMTAwLgorICAgIGludCBsYXN0UHJvZ3Jlc3M7CisgICAgRVhQRUNUX0dFKG1DbGllbnQxLT5nZXRVcGRhdGVDb3VudCgmbGFzdFByb2dyZXNzKSwgMTApOworICAgIEVYUEVDVF9FUShsYXN0UHJvZ3Jlc3MsIDEwMCk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7Cit9CisKKy8qCisgKiBUZXN0IGNhbmNlbCBpbW1lZGlhdGVseSBhZnRlciBzdGFydC4KKyAqLworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QsIFRlc3RDYW5jZWxJbW1lZGlhdGVseSkgeworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoMCA9IGtMb25nU3JjUGF0aDsKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoMSA9IGtTaG9ydFNyY1BhdGg7CisgICAgY29uc3QgY2hhciogZHN0UGF0aDAgPSBPVVRQQVRIKFRlc3RDYW5jZWxJbW1lZGlhdGVseV9TZXNzaW9uMCk7CisgICAgY29uc3QgY2hhciogZHN0UGF0aDEgPSBPVVRQQVRIKFRlc3RDYW5jZWxJbW1lZGlhdGVseV9TZXNzaW9uMSk7CisKKyAgICBkZWxldGVGaWxlKGRzdFBhdGgwKTsKKyAgICBkZWxldGVGaWxlKGRzdFBhdGgxKTsKKyAgICAvLyBTdWJtaXQgb25lIHNlc3Npb24sIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIG1DbGllbnQxLT5zdWJtaXQoMCwgc3JjUGF0aDAsIGRzdFBhdGgwLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwga0JpdFJhdGUpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigwLCBzcmNQYXRoMCwgZHN0UGF0aDApKTsKKworICAgIC8vIFRlc3QgY2FuY2VsIHNlc3Npb24gaW1tZWRpYXRlbHksIGdldFNlc3Npb24gc2hvdWxkIGZhaWwgYWZ0ZXIgY2FuY2VsLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWwoMCkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uPGZhaWw+KDAsICIiLCAiIikpOworCisgICAgLy8gU3VibWl0IG5ldyBzZXNzaW9uLCBuZXcgc2Vzc2lvbiBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkgYW5kIGZpbmlzaC4KKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIG1DbGllbnQxLT5zdWJtaXQoMSwgc3JjUGF0aDEsIGRzdFBhdGgxLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwga0JpdFJhdGUpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMSkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworfQorCisvKgorICogVGVzdCBjYW5jZWwgaW4gdGhlIG1pZGRsZSBvZiB0cmFuc2NvZGluZy4KKyAqLworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QsIFRlc3RDYW5jZWxXaGlsZVJ1bm5pbmcpIHsKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgY29uc3QgY2hhciogc3JjUGF0aDAgPSBrTG9uZ1NyY1BhdGg7CisgICAgY29uc3QgY2hhciogc3JjUGF0aDEgPSBrU2hvcnRTcmNQYXRoOworICAgIGNvbnN0IGNoYXIqIGRzdFBhdGgwID0gT1VUUEFUSChUZXN0Q2FuY2VsV2hpbGVSdW5uaW5nX1Nlc3Npb24wKTsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMSA9IE9VVFBBVEgoVGVzdENhbmNlbFdoaWxlUnVubmluZ19TZXNzaW9uMSk7CisKKyAgICBkZWxldGVGaWxlKGRzdFBhdGgwKTsKKyAgICBkZWxldGVGaWxlKGRzdFBhdGgxKTsKKyAgICAvLyBTdWJtaXQgdHdvIHNlc3Npb25zLCBzZXNzaW9uIDAgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LCBzZXNzaW9uIDEgc2hvdWxkIGJlIHF1ZXVlZC4KKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIG1DbGllbnQxLT5zdWJtaXQoMCwgc3JjUGF0aDAsIGRzdFBhdGgwLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwga0JpdFJhdGUpKTsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIG1DbGllbnQxLT5zdWJtaXQoMSwgc3JjUGF0aDEsIGRzdFBhdGgxLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwga0JpdFJhdGUpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigwLCBzcmNQYXRoMCwgZHN0UGF0aDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigxLCBzcmNQYXRoMSwgZHN0UGF0aDEpKTsKKworICAgIC8vIFNlc3Npb24gMCAobG9uZ3Rlc3QpIHNob3VsZG4ndCBmaW5pc2ggaW4gMSBzZWNvbmRzLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKDEwMDAwMDApLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworCisgICAgLy8gTm93IGNhbmNlbCBzZXNzaW9uIDAuIFNlc3Npb24gMSBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkgYW5kIGZpbmlzaC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsKDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbjxmYWlsPigwLCAiIiwgIiIpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMSkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCwgVGVzdFBhdXNlUmVzdW1lU2luZ2xlQ2xpZW50KSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgwID0ga0xvbmdTcmNQYXRoOworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgxID0ga1Nob3J0U3JjUGF0aDsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMCA9IE9VVFBBVEgoVGVzdFBhdXNlUmVzdW1lU2luZ2xlQ2xpZW50X1Nlc3Npb24wKTsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMSA9IE9VVFBBVEgoVGVzdFBhdXNlUmVzdW1lU2luZ2xlQ2xpZW50X1Nlc3Npb24xKTsKKyAgICBkZWxldGVGaWxlKGRzdFBhdGgwKTsKKyAgICBkZWxldGVGaWxlKGRzdFBhdGgxKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgb2ZmbGluZSBzZXNzaW9uLCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgwLCBzcmNQYXRoMCwgZHN0UGF0aDAsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQml0UmF0ZSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMCkpOworICAgIC8vIFRlc3QgZ2V0IHNlc3Npb24gYWZ0ZXIgc3RhcnRzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uKDAsIHNyY1BhdGgwLCBkc3RQYXRoMCkpOworCisgICAgLy8gU3VibWl0IG9uZSByZWFsdGltZSBzZXNzaW9uLgorICAgIEVYUEVDVF9UUlVFKAorICAgICAgICAgICAgbUNsaWVudDEtPnN1Ym1pdCgxLCBzcmNQYXRoMSwgZHN0UGF0aDEsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsLCBrQml0UmF0ZSkpOworCisgICAgLy8gT2ZmbGluZSBzZXNzaW9uIHNob3VsZCBwYXVzZS4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpQYXVzZShDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigwLCBzcmNQYXRoMCwgZHN0UGF0aDApKTsKKworICAgIC8vIFJlYWx0aW1lIHNlc3Npb24gc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LCBhbmQgcnVuIHRvIGZpbmlzaC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMSkpOworCisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbiBhZnRlciBmaW5pc2ggZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb248ZmFpbD4oMSwgIiIsICIiKSk7CisKKyAgICAvLyBUaGVuIG9mZmxpbmUgc2Vzc2lvbiBzaG91bGQgcmVzdW1lLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlJlc3VtZShDTElFTlQoMSksIDApKTsKKyAgICAvLyBUZXN0IGdldCBzZXNzaW9uIGFmdGVyIHJlc3VtZS4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigwLCBzcmNQYXRoMCwgZHN0UGF0aDApKTsKKworICAgIC8vIE9mZmxpbmUgc2Vzc2lvbiBzaG91bGQgZmluaXNoLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAwKSk7CisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbiBhZnRlciBmaW5pc2ggZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb248ZmFpbD4oMCwgIiIsICIiKSk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7Cit9CisKKy8qCisgKiBCYXNpYyB0ZXN0IGZvciBwYXVzZS9yZXN1bWUgd2l0aCB0d28gY2xpZW50cywgd2l0aCBvbmUgc2Vzc2lvbiBlYWNoLgorICogVG9wIGFwcCdzIHNlc3Npb24gc2hvdWxkIHByZWVtcHQgdGhlIG90aGVyIGFwcCdzIHNlc3Npb24uCisgKi8KK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0LCBUZXN0UGF1c2VSZXN1bWVNdWx0aUNsaWVudHMpIHsKKyAgICBBTE9HRCgiVGVzdFBhdXNlUmVzdW1lTXVsdGlDbGllbnRzIHN0YXJ0aW5nLi4uIik7CisKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6UnVuQ21kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1dBS0VVUCIpKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6UnVuQ21kKCJ3bSBkaXNtaXNzLWtleWd1YXJkIikpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQSkpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQikpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQykpOworCisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgwID0ga0xvbmdTcmNQYXRoOworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgxID0ga1Nob3J0U3JjUGF0aDsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMCA9IE9VVFBBVEgoVGVzdFBhdXNlUmVzdW1lTXVsdGlDbGllbnRzX0NsaWVudDApOworICAgIGNvbnN0IGNoYXIqIGRzdFBhdGgxID0gT1VUUEFUSChUZXN0UGF1c2VSZXN1bWVNdWx0aUNsaWVudHNfQ2xpZW50MSk7CisgICAgZGVsZXRlRmlsZShkc3RQYXRoMCk7CisgICAgZGVsZXRlRmlsZShkc3RQYXRoMSk7CisKKyAgICBBTE9HRCgiTW92aW5nIGFwcCBBIHRvIHRvcC4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUEsIGtUZXN0QWN0aXZpdHlOYW1lKSk7CisKKyAgICAvLyBTdWJtaXQgc2Vzc2lvbiB0byBDbGllbnQxLgorICAgIEFMT0dEKCJTdWJtaXR0aW5nIHNlc3Npb24gdG8gY2xpZW50MSAoYXBwIEEpIC4uLiIpOworICAgIEVYUEVDVF9UUlVFKAorICAgICAgICAgICAgbUNsaWVudDEtPnN1Ym1pdCgwLCBzcmNQYXRoMCwgZHN0UGF0aDAsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsLCBrQml0UmF0ZSkpOworCisgICAgLy8gQ2xpZW50MSdzIHNlc3Npb24gc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMCkpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQiB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VCLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworCisgICAgLy8gQ2xpZW50MSdzIHNlc3Npb24gc2hvdWxkIGNvbnRpbnVlIHRvIHJ1biwgc2luY2UgQ2xpZW50MiAoYXBwIEIpIGRvZXNuJ3QgaGF2ZSBhbnkgc2Vzc2lvbi4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcCgxMDAwMDAwKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKworICAgIC8vIFN1Ym1pdCBzZXNzaW9uIHRvIENsaWVudDIuCisgICAgQUxPR0QoIlN1Ym1pdHRpbmcgc2Vzc2lvbiB0byBjbGllbnQyIChhcHAgQikgLi4uIik7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgICAgICBtQ2xpZW50Mi0+c3VibWl0KDAsIHNyY1BhdGgxLCBkc3RQYXRoMSwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsIGtCaXRSYXRlKSk7CisKKyAgICAvLyBDbGllbnQxJ3Mgc2Vzc2lvbiBzaG91bGQgcGF1c2UsIGNsaWVudDIncyBzZXNzaW9uIHNob3VsZCBzdGFydC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpQYXVzZShDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMiksIDApKTsKKworICAgIC8vIENsaWVudDIncyBzZXNzaW9uIHNob3VsZCBmaW5pc2gsIHRoZW4gQ2xpZW50MSdzIHNlc3Npb24gc2hvdWxkIHJlc3VtZS4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgyKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlJlc3VtZShDTElFTlQoMSksIDApKTsKKworICAgIC8vIENsaWVudDEncyBzZXNzaW9uIHNob3VsZCBmaW5pc2guCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDApKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQSkpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQikpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQykpOworCisgICAgQUxPR0QoIlRlc3RQYXVzZVJlc3VtZU11bHRpQ2xpZW50cyBmaW5pc2hlZC4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZXNvdXJjZV90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Jlc291cmNlX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTBlODBiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZXNvdXJjZV90ZXN0cy5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVzb3VyY2VUZXN0IgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0FjdGl2aXR5TWFuYWdlci5oPgorCisjaW5jbHVkZSAiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgiCisKKy8qCisgKiBUZXN0cyBtZWRpYSB0cmFuc2NvZGluZyBzZXJ2aWNlIHdpdGggcmVhbCB0cmFuc2NvZGVyLgorICoKKyAqIFVzZXMgdGhlIHNhbWUgdGVzdCBhc3NldHMgYXMgdGhlIE1lZGlhVHJhbnNjb2RlciB1bml0IHRlc3RzLiBCZWZvcmUgcnVubmluZyB0aGUgdGVzdCwKKyAqIHBsZWFzZSBtYWtlIHN1cmUgdG8gcHVzaCB0aGUgdGVzdCBhc3NldHMgdG8gL3NkY2FyZDoKKyAqCisgKiBhZGIgcHVzaCAkVE9QL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL2Fzc2V0cyAvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzCisgKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIG1lZGlhIHsKKworY29uc3RleHByIGludDY0X3Qga1BhZGRpbmdVcyA9IDQwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtCaXRSYXRlID0gOCAqIDEwMDAgKiAxMDAwOyAgLy8gOE1icworCitjb25zdGV4cHIgY29uc3QgY2hhcioga0xvbmdTcmNQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNCI7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrUmVzb3VyY2VQb2xpY3lUZXN0QWN0aXZpdHkgPQorICAgICAgICAiL2NvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLlJlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5IjsKKworI2RlZmluZSBPVVRQQVRIKG5hbWUpICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VfIiAjbmFtZSAiLk1QNCIKKworLyoKKyAqIFRoZSBPT00gc2NvcmUgd2UncmUgZ29pbmcgdG8gYXNrIFJlc291cmNlTWFuYWdlciB0byB1c2UgZm9yIG91ciBuYXRpdmUgdHJhbnNjb2RpbmcKKyAqIHNlcnZpY2UuIFJlc291cmNlTWFuYWdlciBpc3N1ZXMgcmVjbGFpbXMgYmFzZWQgb24gdGhlc2Ugc2NvcmVzLiBJdCBnZXRzIHRoZSBzY29yZXMKKyAqIGZyb20gQWN0aXZpdHlNYW5hZ2VyU2VydmljZSwgd2hpY2ggZG9lc24ndCB0cmFjayBuYXRpdmUgc2VydmljZXMuIFRoZSB2YWx1ZXMgb2YgdGhlCisgKiBPT00gc2NvcmVzIGFyZSBkZWZpbmVkIGluOgorICogZnJhbWV3b3Jrcy9iYXNlL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUHJvY2Vzc0xpc3QuamF2YQorICogV2UgdXNlIFNFUlZJQ0VfQURKIHdoaWNoIGlzIGxvd2VyIHByaW9yaXR5IHRoYW4gYW4gYXBwIHBvc3NpYmx5IHZpc2libGUgdG8gdGhlCisgKiB1c2VyLCBidXQgaGlnaGVyIHByaW9yaXR5IHRoYW4gYSBjYWNoZWQgYXBwICh3aGljaCBjb3VsZCBiZSBraWxsZWQgd2l0aG91dCBkaXNydXB0aW9uCisgKiB0byB0aGUgdXNlcikuCisgKi8KK2NvbnN0ZXhwciBzdGF0aWMgaW50MzJfdCBTRVJWSUNFX0FESiA9IDUwMDsKKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5SZXNvdXJjZU1hbmFnZXJDbGllbnQ7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6SVJlc291cmNlTWFuYWdlclNlcnZpY2U7CisKKy8qCisgKiBQbGFjZWhvbGRlciBSZXNvdXJjZU1hbmFnZXJDbGllbnQgZm9yIHJlZ2lzdGVyaW5nIHByb2Nlc3MgaW5mbyBvdmVycmlkZQorICogd2l0aCB0aGUgSVJlc291cmNlTWFuYWdlclNlcnZpY2UuIFRoaXMgaXMgb25seSB1c2VkIGFzIGEgdG9rZW4gYnkgdGhlIHNlcnZpY2UKKyAqIHRvIGdldCBub3RpZmljYXRpb25zIGFib3V0IGJpbmRlciBkZWF0aCwgbm90IHVzZWQgZm9yIHJlY2xhaW1pbmcgcmVzb3VyY2VzLgorICovCitzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IDogcHVibGljIEJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKKyAgICBleHBsaWNpdCBSZXNvdXJjZU1hbmFnZXJDbGllbnQoKSA9IGRlZmF1bHQ7CisKKyAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIGdldE5hbWUoOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZSB7CisgICAgICAgIF9haWRsX3JldHVybi0+Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5SZXNvdXJjZU1hbmFnZXJDbGllbnQoKSA9IGRlZmF1bHQ7Cit9OworCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlckNsaWVudD4gZ1Jlc291cmNlTWFuYWdlckNsaWVudCA9CisgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlTWFuYWdlckNsaWVudD4oKTsKKwordm9pZCBUcmFuc2NvZGluZ0hlbHBlcl9zZXRQcm9jZXNzSW5mb092ZXJyaWRlKGludDMyX3QgcHJvY1N0YXRlLCBpbnQzMl90IG9vbVNjb3JlKSB7CisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKCJtZWRpYS5yZXNvdXJjZV9tYW5hZ2VyIikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gc2VydmljZSA9IElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpmcm9tQmluZGVyKGJpbmRlcik7CisgICAgaWYgKHNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgc2VydmljZS0+b3ZlcnJpZGVQcm9jZXNzSW5mbyhnUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LCBnZXRwaWQoKSwgcHJvY1N0YXRlLCBvb21TY29yZSk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gc2V0UHJvY2Vzc0luZm9PdmVycmlkZS4iKTsKKyAgICB9Cit9CisKK2NsYXNzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVzb3VyY2VUZXN0IDogcHVibGljIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEJhc2UgeworcHVibGljOgorICAgIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVzb3VyY2VUZXN0KCkgeyBBTE9HSSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZXNvdXJjZVRlc3QgY3JlYXRlZCIpOyB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYW5zY29kaW5nU2VydmljZVJlc291cmNlVGVzdCgpIHsKKyAgICAgICAgQUxPR0koIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVzb3VyY2VUZXN0IGRlc3Ryb3llZCIpOworICAgIH0KK307CisKKy8qKgorICogQmFzaWMgdGVzdGluZyBmb3IgaGFuZGxpbmcgcmVzb3VyY2UgbG9zdC4KKyAqCisgKiBUaGlzIHRlc3Qgc3RhcnRzIGEgdHJhbnNjb2Rpbmcgc2Vzc2lvbiAodGhhdCdzIHNvbWV3aGF0IGxvbmcgYW5kIHRha2VzIHNldmVyYWwgc2Vjb25kcyksCisgKiB0aGVuIGxhdW5jaGVzIGFuIGFjdGl2aXR5IHRoYXQgYWxsb2NhdGVzIHZpZGVvIGNvZGVjIGluc3RhbmNlcyB1bnRpbCBpdCBoaXRzIGluc3VmZmljaWVudAorICogcmVzb3VyY2UgZXJyb3IuIEJlY2F1c2UgdGhlIGFjdGl2aXR5IGlzIHJ1bm5pbmcgaW4gZm9yZWdyb3VuZCwKKyAqIFJlc291cmNlTWFuYWdlciB3b3VsZCByZWNsYWltIGNvZGVjcyBmcm9tIHRyYW5zY29kaW5nIHNlcnZpY2Ugd2hpY2ggc2hvdWxkCisgKiBjYXVzZSB0aGUgc2Vzc2lvbiB0byBiZSBwYXVzZWQuIFRoZSBhY3Rpdml0eSB3aWxsIGhvbGQgdGhlIGNvZGVjcyBmb3IgYSBmZXcgc2Vjb25kcworICogYmVmb3JlIHJlbGVhc2luZyB0aGVtLCBhbmQgdGhlIHRyYW5zY29kaW5nIHNlcnZpY2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVzdW1lCisgKiBhbmQgY29tcGxldGUgdGhlIHNlc3Npb24uCisgKgorICogTm90ZSB0aGF0IHRoaXMgdGVzdCBtdXN0IHJ1biBhcyByb290LiBXZSBuZWVkIHRvIHNpbXVsYXRlIHN1Ym1pdHRpbmcgYSByZXF1ZXN0IGZvciBhCisgKiBjbGllbnQge3VpZCxwaWR9IHJ1bm5pbmcgYXQgbG93ZXIgcHJpb3JpdHkuIEFzIGEgY21kIGxpbmUgdGVzdCwgaXQncyBub3QgZWFzeSB0byBnZXQgdGhlCisgKiBwaWQgb2YgYSBsaXZpbmcgYXBwLCBzbyB3ZSB1c2Ugb3VyIG93biB7dWlkLHBpZH0gdG8gc3VibWl0LiBIb3dldmVyLCBzaW5jZSB3ZSdyZSBhIG5hdGl2ZQorICogcHJvY2VzcywgUk0gZG9lc24ndCBoYXZlIG91ciBwcm9jIGluZm8gYW5kIHRoZSByZWNsYWltIHdpbGwgZmFpbC4gU28gd2UgbmVlZCB0byB1c2UKKyAqIFJNJ3Mgc2V0UHJvY2Vzc0luZm9PdmVycmlkZSB0byBvdmVycmlkZSBvdXIgcHJvYyBpbmZvLCB3aGljaCByZXF1aXJlcyBwZXJtaXNzaW9uICh1bmxlc3Mgcm9vdCkuCisgKi8KK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlc291cmNlVGVzdCwgVGVzdFJlc291cmNlTG9zdCkgeworICAgIEFMT0dEKCJUZXN0UmVzb3VyY2VMb3N0IHN0YXJ0aW5nLi4uLCBwaWQgJWQiLCA6OmdldHBpZCgpKTsKKworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHN1Ym1pdCB0aGUgcmVxdWVzdCB1c2luZyBvdXIgb3duIHt1aWQscGlkfS4gU2luY2Ugd2UncmUgYSBuYXRpdmUKKyAgICAvLyBwcm9jZXNzLCBSTSBkb2Vzbid0IGhhdmUgb3VyIHByb2MgaW5mbyBhbmQgdGhlIHJlY2xhaW0gd2lsbCBmYWlsLiBTbyB3ZSBuZWVkIHRvIHVzZQorICAgIC8vIFJNJ3Mgc2V0UHJvY2Vzc0luZm9PdmVycmlkZSB0byBvdmVycmlkZSBvdXIgcHJvYyBpbmZvLgorICAgIFRyYW5zY29kaW5nSGVscGVyX3NldFByb2Nlc3NJbmZvT3ZlcnJpZGUoQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1NFUlZJQ0UsIFNFUlZJQ0VfQURKKTsKKworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpSdW5DbWQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfV0FLRVVQIikpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpSdW5DbWQoIndtIGRpc21pc3Mta2V5Z3VhcmQiKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VBKSk7CisKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgY29uc3QgY2hhciogc3JjUGF0aDAgPSBrTG9uZ1NyY1BhdGg7CisgICAgY29uc3QgY2hhciogZHN0UGF0aDAgPSBPVVRQQVRIKFRlc3RQYXVzZVJlc3VtZU11bHRpQ2xpZW50c19DbGllbnQwKTsKKyAgICBkZWxldGVGaWxlKGRzdFBhdGgwKTsKKworICAgIEFMT0dEKCJNb3ZpbmcgYXBwIEEgdG8gdG9wLi4uIik7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0YXJ0KGtDbGllbnRQYWNrYWdlQSwga1Rlc3RBY3Rpdml0eU5hbWUpKTsKKworICAgIC8vIFN1Ym1pdCBzZXNzaW9uIHRvIENsaWVudDEuCisgICAgQUxPR0QoIlN1Ym1pdHRpbmcgc2Vzc2lvbiB0byBjbGllbnQxIChhcHAgQSkgLi4uIik7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgwLCBzcmNQYXRoMCwgZHN0UGF0aDAsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0JpdFJhdGUsIDo6Z2V0cGlkKCksIDo6Z2V0dWlkKCkpKTsKKworICAgIC8vIENsaWVudDEncyBzZXNzaW9uIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKworICAgIC8vIExhdW5jaCBSZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eSwgd2hpY2ggd2lsbCB0cnkgdG8gYWxsb2NhdGUgdXAgdG8gMzIKKyAgICAvLyBpbnN0YW5jZXMsIHdoaWNoIHNob3VsZCB0cmlnZ2VyIGluc3VmZmljaWVudCByZXNvdXJjZXMgb24gbW9zdCBkZXZpY2VzLgorICAgIC8vIChOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMgYSB2ZXJ5IGhpZ2ggbnVtYmVyIG9mCisgICAgLy8gcmVzb3VyY2UgaW5zdGFuY2VzLCBpbiB3aGljaCBjYXNlIHdlJ2xsIHNpbXBseSByZXF1aXJlIHRoYXQgdGhlIHNlc3Npb24gY29tcGxldGVzLikKKyAgICBBTE9HRCgiTGF1bmNoIFJlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5Li4uIik7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0YXJ0KGtDbGllbnRQYWNrYWdlQSwga1Jlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5KSk7CisKKyAgICAvLyBUaGUgYmFzaWMgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgY29tcGxldGUuIFdhaXQgZm9yIGZpbmlzaAorICAgIC8vIGV2ZW50IHRvIGNvbWUgYW5kIHBvcCB1cCBhbGwgZXZlbnRzIHJlY2VpdmVkLgorICAgIHN0ZDo6bGlzdDxFdmVudFRyYWNrZXI6OkV2ZW50PiBldmVudHM7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPndhaXRGb3JTcGVjaWZpY0V2ZW50QW5kUG9wKEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAwKSwgJmV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwMDAwMDApKTsKKworICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgMSBldmVudCwgaXQgbXVzdCBiZSBmaW5pc2ggKG90aGVyd2lzZSB3YWl0Rm9yU3BlY2lmaWNFdmVudEFuZFBvcAorICAgIC8vIHdvdWRsZG4ndCBwb3AgdXAgYW55dGhpbmcpLCBhbmQgd2UncmUgb2suCisgICAgLy8KKyAgICAvLyBUT0RPOiBJZiB0aGVyZSBpcyBvbmx5IDEgZXZlbnQgKGZpbmlzaCksIGFuZCBubyBwYXVzZS9yZXN1bWUgaGFwcGVuZWQsIHdlIG5lZWQKKyAgICAvLyB0byB2ZXJpZnkgdGhhdCB0aGUgUmVzb3VyY2VQb2xpY3lUZXN0QWN0aXZpdHkgYWN0dWFsbHkgd2FzIGFibGUgdG8gYWxsb2NhdGUKKyAgICAvLyBhbGwgMzIgaW5zdGFuY2VzIHdpdGhvdXQgaGl0dGluZyBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzLiBPdGhlcndpc2UsIGl0IGNvdWxkCisgICAgLy8gYmUgdGhhdCBSZXNvdXJjZU1hbmFnZXIgd2FzIG5vdCBhYmxlIHRvIHJlY2xhaW0gY29kZWNzIGZyb20gdGhlIHRyYW5zY29kaW5nCisgICAgLy8gc2VydmljZSBhdCBhbGwsIHdoaWNoIG1lYW5zIHRoZSByZXNvdXJjZSBtYW5hZ2VtZW50IGlzIGJyb2tlbi4KKyAgICBpZiAoZXZlbnRzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoZXZlbnRzLnNpemUoKSA+PSAzKTsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBmb3IgKGF1dG8mIGV2ZW50IDogZXZlbnRzKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGV2ZW50LCBFdmVudFRyYWNrZXI6OlBhdXNlKENMSUVOVCgxKSwgMCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IGV2ZW50cy5zaXplKCkgLSAyKSB7CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGV2ZW50LCBFdmVudFRyYWNrZXI6OlJlc3VtZShDTElFTlQoMSksIDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSBldmVudHMuc2l6ZSgpIC0gMSkgeworICAgICAgICAgICAgICAgIEVYUEVDVF9FUShldmVudCwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoZXZlbnQgPT0gRXZlbnRUcmFja2VyOjpQYXVzZShDTElFTlQoMSksIDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gRXZlbnRUcmFja2VyOjpSZXN1bWUoQ0xJRU5UKDEpLCAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUEpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9zaW11bGF0ZWRfdGVzdHMuY3BwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9zaW11bGF0ZWRfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmRhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3NpbXVsYXRlZF90ZXN0cy5jcHAKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEhlbHBlci5oIgorI2luY2x1ZGUgIlNpbXVsYXRlZFRyYW5zY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgbWVkaWEgeworCisvLyBOb3RlIHRoYXQgLTEgaXMgdmFsaWQgYW5kIG1lYW5zIHVzaW5nIGNhbGxpbmcgcGlkL3VpZCBmb3IgdGhlIHNlcnZpY2UuIEJ1dCBvbmx5IHByaXZpbGVnZSBjYWxsZXIKKy8vIGNvdWxkIHVzZSB0aGVtLiBUaGlzIHRlc3QgaXMgbm90IGEgcHJpdmlsZWdlIGNhbGxlci4KK2NvbnN0ZXhwciBpbnQzMl90IGtJbnZhbGlkQ2xpZW50UGlkID0gLTU7Citjb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZENsaWVudFVpZCA9IC0xMDsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrSW52YWxpZENsaWVudE5hbWUgPSAiIjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrSW52YWxpZENsaWVudE9wUGFja2FnZU5hbWUgPSAiIjsKKworY29uc3RleHByIGludDY0X3Qga1BhZGRpbmdVcyA9IDEwMDAwMDA7Citjb25zdGV4cHIgaW50NjRfdCBrU2Vzc2lvbldpdGhQYWRkaW5nVXMgPSBTaW11bGF0ZWRUcmFuc2NvZGVyOjprU2Vzc2lvbkR1cmF0aW9uVXMgKyBrUGFkZGluZ1VzOworCitjb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudE9wUGFja2FnZU5hbWUgPSAiVGVzdENsaWVudFBhY2thZ2UiOworCitjbGFzcyBNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QgOiBwdWJsaWMgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0QmFzZSB7CitwdWJsaWM6CisgICAgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0KCkgeyBBTE9HSSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZXNvdXJjZVRlc3QgY3JlYXRlZCIpOyB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QoKSB7CisgICAgICAgIEFMT0dJKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlc291cmNlVGVzdCBkZXN0cm95ZWQiKTsKKyAgICB9Cit9OworCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0UmVnaXN0ZXJOdWxsQ2xpZW50KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworCisgICAgLy8gUmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIG51bGwgY2FsbGJhY2suCisgICAgU3RhdHVzIHN0YXR1cyA9IG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChudWxscHRyLCBrQ2xpZW50TmFtZSwga0NsaWVudE9wUGFja2FnZU5hbWUsICZjbGllbnQpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFJlZ2lzdGVyQ2xpZW50V2l0aEludmFsaWRDbGllbnROYW1lKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworCisgICAgLy8gUmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIHRoZSBzZXJ2aWNlLgorICAgIFN0YXR1cyBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQobUNsaWVudDEsIGtJbnZhbGlkQ2xpZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbnZhbGlkQ2xpZW50T3BQYWNrYWdlTmFtZSwgJmNsaWVudCk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0UmVnaXN0ZXJDbGllbnRXaXRoSW52YWxpZENsaWVudFBhY2thZ2VOYW1lKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworCisgICAgLy8gUmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIHRoZSBzZXJ2aWNlLgorICAgIFN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KG1DbGllbnQxLCBrQ2xpZW50TmFtZSwga0ludmFsaWRDbGllbnRPcFBhY2thZ2VOYW1lLCAmY2xpZW50KTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QsIFRlc3RSZWdpc3Rlck9uZUNsaWVudCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKworICAgIFN0YXR1cyBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQobUNsaWVudDEsIGtDbGllbnROYW1lLCBrQ2xpZW50T3BQYWNrYWdlTmFtZSwgJmNsaWVudCk7CisgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgY2xpZW50LgorICAgIEVYUEVDVF9UUlVFKGNsaWVudCAhPSBudWxscHRyKTsKKworICAgIC8vIENoZWNrIHRoZSBudW1iZXIgb2YgQ2xpZW50cy4KKyAgICBpbnQzMl90IG51bU9mQ2xpZW50czsKKyAgICBzdGF0dXMgPSBtU2VydmljZS0+Z2V0TnVtT2ZDbGllbnRzKCZudW1PZkNsaWVudHMpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9HRShudW1PZkNsaWVudHMsIDEpOworCisgICAgLy8gVW5yZWdpc3RlciB0aGUgY2xpZW50LgorICAgIHN0YXR1cyA9IGNsaWVudC0+dW5yZWdpc3RlcigpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0UmVnaXN0ZXJDbGllbnRUd2ljZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKworICAgIFN0YXR1cyBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQobUNsaWVudDEsIGtDbGllbnROYW1lLCBrQ2xpZW50T3BQYWNrYWdlTmFtZSwgJmNsaWVudCk7CisgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgY2xpZW50LgorICAgIEVYUEVDVF9UUlVFKGNsaWVudCAhPSBudWxscHRyKTsKKworICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgYWdhaW4gYW5kIGV4cGVjdHMgZmFpbHVyZS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQxOworICAgIHN0YXR1cyA9IG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChtQ2xpZW50MSwga0NsaWVudE5hbWUsIGtDbGllbnRPcFBhY2thZ2VOYW1lLCAmY2xpZW50MSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworCisgICAgLy8gVW5yZWdpc3RlciB0aGUgY2xpZW50LgorICAgIHN0YXR1cyA9IGNsaWVudC0+dW5yZWdpc3RlcigpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0UmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMpIHsKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFNlc3Npb25JZEluZGVwZW5kZW5jZSkgeworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICAvLyBTdWJtaXQgMiByZXF1ZXN0cyBvbiBjbGllbnQxIGZpcnN0LgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMCwgInRlc3Rfc291cmNlX2ZpbGUiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMSwgInRlc3Rfc291cmNlX2ZpbGUiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlIikpOworCisgICAgLy8gU3VibWl0IDIgcmVxdWVzdHMgb24gY2xpZW50Miwgc2Vzc2lvbklkIHNob3VsZCBiZSBpbmRlcGVuZGVudCBmb3IgZWFjaCBjbGllbnQuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDItPnN1Ym1pdCgwLCAidGVzdF9zb3VyY2VfZmlsZSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGUiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDItPnN1Ym1pdCgxLCAidGVzdF9zb3VyY2VfZmlsZSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGUiKSk7CisKKyAgICAvLyBDYW5jZWwgYWxsIHNlc3Npb25zLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWwoMCkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWwoMSkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5jYW5jZWwoMCkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5jYW5jZWwoMSkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0U3VibWl0Q2FuY2VsU2Vzc2lvbnMpIHsKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgLy8gVGVzdCBzZXNzaW9uSWQgYXNzaWdubWVudC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsICJ0ZXN0X3NvdXJjZV9maWxlXzAiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMSwgInRlc3Rfc291cmNlX2ZpbGVfMSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGUiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgyLCAidGVzdF9zb3VyY2VfZmlsZV8yIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZSIpKTsKKworICAgIC8vIFRlc3Qgc3VibWl0IGJhZCByZXF1ZXN0IChubyB2YWxpZCBzb3VyY2VGaWxlUGF0aCkgZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdDxmYWlsPigwLCAiIiwgIiIpKTsKKworICAgIC8vIFRlc3Qgc3VibWl0IGJhZCByZXF1ZXN0IChubyB2YWxpZCBzb3VyY2VGaWxlUGF0aCkgZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdDxmYWlsPigwLCAic3JjIiwgImRzdCIsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMCwga0ludmFsaWRDbGllbnRQaWQsIGtJbnZhbGlkQ2xpZW50VWlkKSk7CisKKyAgICAvLyBUZXN0IGNhbmNlbCBub24tZXhpc3RlbnQgc2Vzc2lvbiBmYWlscy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsPGZhaWw+KDEwMCkpOworCisgICAgLy8gU2Vzc2lvbiAwIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseSBhbmQgZmluaXNoIGluIDIgc2Vjb25kcywgZm9sbG93ZWQgYnkgU2Vzc2lvbiAxIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAxKSk7CisKKyAgICAvLyBUZXN0IGNhbmNlbCB2YWxpZCBzZXNzaW9uSWQgaW4gcmFuZG9tIG9yZGVyLgorICAgIC8vIFRlc3QgY2FuY2VsIGZpbmlzaGVkIHNlc3Npb24gZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbCgyKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbDxmYWlsPigwKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbCgxKSk7CisKKyAgICAvLyBUZXN0IGNhbmNlbCBzZXNzaW9uIGFnYWluIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWw8ZmFpbD4oMSkpOworCisgICAgLy8gVGVzdCBubyBtb3JlIGV2ZW50cyBhcnJpdmluZyBhZnRlciBjYW5jZWwuCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdEdldFNlc3Npb25zKSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIC8vIFN1Ym1pdCAzIHJlcXVlc3RzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMCwgInRlc3Rfc291cmNlX2ZpbGVfMCIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMCIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDEsICJ0ZXN0X3NvdXJjZV9maWxlXzEiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzEiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgyLCAidGVzdF9zb3VyY2VfZmlsZV8yIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8yIikpOworCisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbnMgYnkgaWQuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb24oMiwgInRlc3Rfc291cmNlX2ZpbGVfMiIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMiIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigxLCAidGVzdF9zb3VyY2VfZmlsZV8xIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8xIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uKDAsICJ0ZXN0X3NvdXJjZV9maWxlXzAiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzAiKSk7CisKKyAgICAvLyBUZXN0IGdldCBzZXNzaW9uIGJ5IGludmFsaWQgaWQgZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb248ZmFpbD4oMTAwLCAiIiwgIiIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbjxmYWlsPigtMSwgIiIsICIiKSk7CisKKyAgICAvLyBUZXN0IGdldCBzZXNzaW9uIGFmdGVyIGNhbmNlbCBmYWlscy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsKDIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbjxmYWlsPigyLCAiIiwgIiIpKTsKKworICAgIC8vIFNlc3Npb24gMCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkgYW5kIGZpbmlzaCBpbiAyIHNlY29uZHMsIGZvbGxvd2VkIGJ5IFNlc3Npb24gMSBzdGFydC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMSkpOworCisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbiBhZnRlciBmaW5pc2ggZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb248ZmFpbD4oMCwgIiIsICIiKSk7CisKKyAgICAvLyBUZXN0IGdldCB0aGUgcmVtYWluaW5nIHNlc3Npb24gMS4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigxLCAidGVzdF9zb3VyY2VfZmlsZV8xIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8xIikpOworCisgICAgLy8gQ2FuY2VsIHJlbWFpbmluZyBzZXNzaW9uIDEuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbCgxKSk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QsIFRlc3RTdWJtaXRDYW5jZWxXaXRoT2ZmbGluZVNlc3Npb25zKSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIC8vIFN1Ym1pdCBzb21lIG9mZmxpbmUgc2Vzc2lvbnMgZmlyc3QuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgwLCAidGVzdF9zb3VyY2VfZmlsZV8wIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprVW5zcGVjaWZpZWQpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDEsICJ0ZXN0X3NvdXJjZV9maWxlXzEiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtVbnNwZWNpZmllZCkpOworCisgICAgLy8gU2Vzc2lvbiAwIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKworICAgIC8vIFN1Ym1pdCBtb3JlIHJlYWwtdGltZSBzZXNzaW9ucy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDIsICJ0ZXN0X3NvdXJjZV9maWxlXzIiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzIiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgzLCAidGVzdF9zb3VyY2VfZmlsZV8zIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8zIikpOworCisgICAgLy8gU2Vzc2lvbiAwIHNob3VsZCBwYXVzZSBpbW1lZGlhdGVseSBhbmQgc2Vzc2lvbiAyIHNob3VsZCBzdGFydC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpQYXVzZShDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDIpKTsKKworICAgIC8vIFNlc3Npb24gMiBzaG91bGQgZmluaXNoIGluIDIgc2Vjb25kcyBhbmQgc2Vzc2lvbiAzIHNob3VsZCBzdGFydC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMikpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMykpOworCisgICAgLy8gQ2FuY2VsIHNlc3Npb24gMyBub3cKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsKDMpKTsKKworICAgIC8vIFNlc3Npb24gMCBzaG91bGQgcmVzdW1lIGFuZCBmaW5pc2ggaW4gMiBzZWNvbmRzLCBmb2xsb3dlZCBieSBzZXNzaW9uIDEgc3RhcnQuCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6UmVzdW1lKENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAxKSk7CisKKyAgICAvLyBDYW5jZWwgcmVtYWluaW5nIHNlc3Npb24gMS4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsKDEpKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdENsaWVudFVzZUFmdGVyVW5yZWdpc3RlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKworICAgIC8vIFJlZ2lzdGVyIGEgY2xpZW50LCB0aGVuIHVucmVnaXN0ZXIuCisgICAgU3RhdHVzIHN0YXR1cyA9IG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChtQ2xpZW50MSwga0NsaWVudE5hbWUsIGtDbGllbnRPcFBhY2thZ2VOYW1lLCAmY2xpZW50KTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKworICAgIHN0YXR1cyA9IGNsaWVudC0+dW5yZWdpc3RlcigpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworCisgICAgLy8gVGVzdCB2YXJpb3VzIG9wZXJhdGlvbnMgb24gdGhlIGNsaWVudCwgc2hvdWxkIGZhaWwgd2l0aCBFUlJPUl9ESVNDT05ORUNURUQuCisgICAgVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsIHNlc3Npb247CisgICAgYm9vbCByZXN1bHQ7CisgICAgc3RhdHVzID0gY2xpZW50LT5nZXRTZXNzaW9uV2l0aElkKDAsICZzZXNzaW9uLCAmcmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKworICAgIHN0YXR1cyA9IGNsaWVudC0+Y2FuY2VsU2Vzc2lvbigwLCAmcmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKworICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCByZXF1ZXN0OworICAgIHN0YXR1cyA9IGNsaWVudC0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QsIFRlc3RUcmFuc2NvZGluZ1VpZFBvbGljeSkgeworICAgIEFMT0dEKCJUZXN0VHJhbnNjb2RpbmdVaWRQb2xpY3kgc3RhcnRpbmcuLi4iKTsKKworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpSdW5DbWQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfV0FLRVVQIikpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpSdW5DbWQoIndtIGRpc21pc3Mta2V5Z3VhcmQiKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VBKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VCKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VDKSk7CisKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQSB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VBLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworCisgICAgLy8gU3VibWl0IDMgcmVxdWVzdHMuCisgICAgQUxPR0QoIlN1Ym1pdHRpbmcgc2Vzc2lvbiB0byBjbGllbnQxIChhcHAgQSkgLi4uIik7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgwLCAidGVzdF9zb3VyY2VfZmlsZV8wIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8wIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMSwgInRlc3Rfc291cmNlX2ZpbGVfMSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMSIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDIsICJ0ZXN0X3NvdXJjZV9maWxlXzIiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzIiKSk7CisKKyAgICAvLyBTZXNzaW9uIDAgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMCkpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQiB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VCLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworCisgICAgLy8gU2Vzc2lvbiAwIHNob3VsZCBjb250aW51ZSBhbmQgZmluaXNoIGluIDIgc2Vjb25kcywgdGhlbiBzZXNzaW9uIDEgc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAxKSk7CisKKyAgICBBTE9HRCgiU3VibWl0dGluZyBzZXNzaW9uIHRvIGNsaWVudDIgKGFwcCBCKSAuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+c3VibWl0KDAsICJ0ZXN0X3NvdXJjZV9maWxlXzAiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzAiKSk7CisKKyAgICAvLyBDbGllbnQxJ3Mgc2Vzc2lvbiBzaG91bGQgcGF1c2UsIGNsaWVudDIncyBzZXNzaW9uIHNob3VsZCBzdGFydC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpQYXVzZShDTElFTlQoMSksIDEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMiksIDApKTsKKworICAgIEFMT0dEKCJNb3ZpbmcgYXBwIEEgYmFjayB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VBLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworCisgICAgLy8gQ2xpZW50MidzIHNlc3Npb24gc2hvdWxkIHBhdXNlLCBjbGllbnQxJ3Mgc2Vzc2lvbiAxIHNob3VsZCByZXN1bWUuCisgICAgRVhQRUNUX0VRKG1DbGllbnQyLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6UGF1c2UoQ0xJRU5UKDIpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6UmVzdW1lKENMSUVOVCgxKSwgMSkpOworCisgICAgLy8gQ2xpZW50MidzIHNlc3Npb24gMSBzaG91bGQgZmluaXNoIGluIDIgc2Vjb25kcywgdGhlbiBpdHMgc2Vzc2lvbiAyIHNob3VsZCBzdGFydC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMikpOworCisgICAgLy8gQWZ0ZXIgY2xpZW50MidzIHNlc3Npb25zIGZpbmlzaCwgY2xpZW50MSdzIHNlc3Npb24gc2hvdWxkIHJlc3VtZS4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMikpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlJlc3VtZShDTElFTlQoMiksIDApKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQSkpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQikpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQykpOworCisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGluZ1VpZFBvbGljeSBmaW5pc2hlZC4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3OTFmZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVW5pdCBUZXN0IGZvciBNZWRpYVRyYW5zY29kaW5nIFNlcnZpY2UuCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0IgotCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVRyYW5zY29kaW5nU2VydmljZS5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlcl9qbmkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgotI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIG1lZGlhIHsKLQotdXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Ci11c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5UcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ7Ci11c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOwotdXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ7Ci0KLWNvbnN0ZXhwciBpbnQzMl90IGtJbnZhbGlkQ2xpZW50SWQgPSAtNTsKLQotLy8gTm90ZSB0aGF0IC0xIGlzIHZhbGlkIGFuZCBtZWFucyB1c2luZyBjYWxsaW5nIHBpZC91aWQgZm9yIHRoZSBzZXJ2aWNlLiBCdXQgb25seSBwcml2aWxlZ2UgY2FsbGVyIGNvdWxkCi0vLyB1c2UgdGhlbS4gVGhpcyB0ZXN0IGlzIG5vdCBhIHByaXZpbGVnZSBjYWxsZXIuCi1jb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZENsaWVudFBpZCA9IC01OwotY29uc3RleHByIGludDMyX3Qga0ludmFsaWRDbGllbnRVaWQgPSAtNTsKLWNvbnN0ZXhwciBjb25zdCBjaGFyKiBrSW52YWxpZENsaWVudE9wUGFja2FnZU5hbWUgPSAiIjsKLQotY29uc3RleHByIGludDMyX3Qga0NsaWVudFVzZUNhbGxpbmdQaWQgPSAtMTsKLWNvbnN0ZXhwciBpbnQzMl90IGtDbGllbnRVc2VDYWxsaW5nVWlkID0gLTE7Ci1jb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudE9wUGFja2FnZU5hbWUgPSAiVGVzdENsaWVudCI7Ci0KLWNsYXNzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHVibGljOgotICAgIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdCgpIHsgQUxPR0QoIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdCBjcmVhdGVkIik7IH0KLQotICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZSgibWVkaWEudHJhbnNjb2RpbmciKSk7Ci0gICAgICAgIG1TZXJ2aWNlID0gSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpmcm9tQmluZGVyKGJpbmRlcik7Ci0gICAgICAgIGlmIChtU2VydmljZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIG1lZGlhLnRyYXNjb2Rpbmcgc2VydmljZS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIH5NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3QoKSB7IEFMT0dEKCJNZWRpYVRyYW5zY29kaW5naW5nU2VydmljZVRlc3QgZGVzdHJveWVkIik7IH0KLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+IG1TZXJ2aWNlID0gbnVsbHB0cjsKLX07Ci0KLXN0cnVjdCBUZXN0Q2xpZW50IDogcHVibGljIEJuVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50IHsKLSAgICBUZXN0Q2xpZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+JiBzZXJ2aWNlKSA6IG1TZXJ2aWNlKHNlcnZpY2UpIHsKLSAgICAgICAgQUxPR0QoIlRlc3RDbGllbnQgQ3JlYXRlZCIpOwotICAgIH0KLQotICAgIFN0YXR1cyBnZXROYW1lKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9ICJ0ZXN0X2NsaWVudCI7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdGaW5pc2hlZCgKLSAgICAgICAgICAgIGludDMyX3QgLyogaW5fam9iSWQgKi8sCi0gICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbCYgLyogaW5fcmVzdWx0ICovKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdGYWlsZWQoCi0gICAgICAgICAgICBpbnQzMl90IC8qIGluX2pvYklkICovLAotICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdFcnJvckNvZGUgLyppbl9lcnJvckNvZGUgKi8pIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICBTdGF0dXMgb25Bd2FpdE51bWJlck9mSm9ic0NoYW5nZWQoaW50MzJfdCAvKiBpbl9qb2JJZCAqLywgaW50MzJfdCAvKiBpbl9vbGRBd2FpdE51bWJlciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9uZXdBd2FpdE51bWJlciAqLykgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIFN0YXR1cyBvblByb2dyZXNzVXBkYXRlKGludDMyX3QgLyogaW5fam9iSWQgKi8sIGludDMyX3QgLyogaW5fcHJvZ3Jlc3MgKi8pIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkgeyBBTE9HSSgiVGVzdENsaWVudCBkZXN0cm95ZWQiKTsgfTsKLQotcHJpdmF0ZToKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlPiBtU2VydmljZTsKLX07Ci0KLVRFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3QsIFRlc3RSZWdpc3Rlck51bGxDbGllbnQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKLSAgICBpbnQzMl90IGNsaWVudElkID0gMDsKLSAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCwga0NsaWVudE9wUGFja2FnZU5hbWUsIGtDbGllbnRVc2VDYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NsaWVudFVzZUNhbGxpbmdQaWQsICZjbGllbnRJZCk7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOwotfQotCi1URVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0LCBUZXN0UmVnaXN0ZXJDbGllbnRXaXRoSW52YWxpZENsaWVudFBpZCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotICAgIEVYUEVDVF9UUlVFKGNsaWVudCAhPSBudWxscHRyKTsKLQotICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgc2VydmljZS4KLSAgICBpbnQzMl90IGNsaWVudElkID0gMDsKLSAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCwga0NsaWVudE9wUGFja2FnZU5hbWUsIGtDbGllbnRVc2VDYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ludmFsaWRDbGllbnRQaWQsICZjbGllbnRJZCk7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOwotfQotCi1URVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0LCBUZXN0UmVnaXN0ZXJDbGllbnRXaXRoSW52YWxpZENsaWVudFVpZCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotICAgIEVYUEVDVF9UUlVFKGNsaWVudCAhPSBudWxscHRyKTsKLQotICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgc2VydmljZS4KLSAgICBpbnQzMl90IGNsaWVudElkID0gMDsKLSAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCwga0NsaWVudE9wUGFja2FnZU5hbWUsIGtJbnZhbGlkQ2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NsaWVudFVzZUNhbGxpbmdQaWQsICZjbGllbnRJZCk7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOwotfQotCi1URVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0LCBUZXN0UmVnaXN0ZXJDbGllbnRXaXRoSW52YWxpZENsaWVudFBhY2thZ2VOYW1lKSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0gICAgRVhQRUNUX1RSVUUoY2xpZW50ICE9IG51bGxwdHIpOwotCi0gICAgLy8gUmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIHRoZSBzZXJ2aWNlLgotICAgIGludDMyX3QgY2xpZW50SWQgPSAwOwotICAgIFN0YXR1cyBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQoY2xpZW50LCBrSW52YWxpZENsaWVudE9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50VXNlQ2FsbGluZ1VpZCwga0NsaWVudFVzZUNhbGxpbmdQaWQsICZjbGllbnRJZCk7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOwotfQotCi1URVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0LCBUZXN0UmVnaXN0ZXJPbmVDbGllbnQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKLSAgICBFWFBFQ1RfVFJVRShjbGllbnQgIT0gbnVsbHB0cik7Ci0KLSAgICAvLyBSZWdpc3RlciB0aGUgY2xpZW50IHdpdGggdGhlIHNlcnZpY2UuCi0gICAgaW50MzJfdCBjbGllbnRJZCA9IDA7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChjbGllbnQsIGtDbGllbnRPcFBhY2thZ2VOYW1lLCBrQ2xpZW50VXNlQ2FsbGluZ1BpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbGllbnRVc2VDYWxsaW5nVWlkLCAmY2xpZW50SWQpOwotICAgIEFMT0dEKCJjbGllbnQgaWQgaXMgJWQiLCBjbGllbnRJZCk7Ci0gICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgY2xpZW50SWQuCi0gICAgRVhQRUNUX1RSVUUoY2xpZW50SWQgPiAwKTsKLQotICAgIC8vIENoZWNrIHRoZSBudW1iZXIgb2YgQ2xpZW50cy4KLSAgICBpbnQzMl90IG51bU9mQ2xpZW50czsKLSAgICBzdGF0dXMgPSBtU2VydmljZS0+Z2V0TnVtT2ZDbGllbnRzKCZudW1PZkNsaWVudHMpOwotICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOwotICAgIEVYUEVDVF9FUSgxLCBudW1PZkNsaWVudHMpOwotCi0gICAgLy8gVW5yZWdpc3RlciB0aGUgY2xpZW50LgotICAgIGJvb2wgcmVzOwotICAgIHN0YXR1cyA9IG1TZXJ2aWNlLT51bnJlZ2lzdGVyQ2xpZW50KGNsaWVudElkLCAmcmVzKTsKLSAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKLSAgICBFWFBFQ1RfVFJVRShyZXMpOwotfQotCi1URVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0LCBUZXN0VW5SZWdpc3RlckNsaWVudFdpdGhJbnZhbGlkQ2xpZW50SWQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKLSAgICBFWFBFQ1RfVFJVRShjbGllbnQgIT0gbnVsbHB0cik7Ci0KLSAgICAvLyBSZWdpc3RlciB0aGUgY2xpZW50IHdpdGggdGhlIHNlcnZpY2UuCi0gICAgaW50MzJfdCBjbGllbnRJZCA9IDA7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChjbGllbnQsIGtDbGllbnRPcFBhY2thZ2VOYW1lLCBrQ2xpZW50VXNlQ2FsbGluZ1VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbGllbnRVc2VDYWxsaW5nUGlkLCAmY2xpZW50SWQpOwotICAgIEFMT0dEKCJjbGllbnQgaWQgaXMgJWQiLCBjbGllbnRJZCk7Ci0gICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgY2xpZW50SWQuCi0gICAgRVhQRUNUX1RSVUUoY2xpZW50SWQgPiAwKTsKLQotICAgIC8vIENoZWNrIHRoZSBudW1iZXIgb2YgQ2xpZW50cy4KLSAgICBpbnQzMl90IG51bU9mQ2xpZW50czsKLSAgICBzdGF0dXMgPSBtU2VydmljZS0+Z2V0TnVtT2ZDbGllbnRzKCZudW1PZkNsaWVudHMpOwotICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOwotICAgIEVYUEVDVF9FUSgxLCBudW1PZkNsaWVudHMpOwotCi0gICAgLy8gVW5yZWdpc3RlciB0aGUgY2xpZW50IHdpdGggaW52YWxpZCBJRAotICAgIGJvb2wgcmVzOwotICAgIG1TZXJ2aWNlLT51bnJlZ2lzdGVyQ2xpZW50KGtJbnZhbGlkQ2xpZW50SWQsICZyZXMpOwotICAgIEVYUEVDVF9GQUxTRShyZXMpOwotCi0gICAgLy8gVW5yZWdpc3RlciB0aGUgdmFsaWQgY2xpZW50LgotICAgIG1TZXJ2aWNlLT51bnJlZ2lzdGVyQ2xpZW50KGNsaWVudElkLCAmcmVzKTsKLX0KLQotVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdCwgVGVzdFJlZ2lzdGVyQ2xpZW50VHdpY2UpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKLSAgICBFWFBFQ1RfVFJVRShjbGllbnQgIT0gbnVsbHB0cik7Ci0KLSAgICAvLyBSZWdpc3RlciB0aGUgY2xpZW50IHdpdGggdGhlIHNlcnZpY2UuCi0gICAgaW50MzJfdCBjbGllbnRJZCA9IDA7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChjbGllbnQsIGtDbGllbnRPcFBhY2thZ2VOYW1lLCBrQ2xpZW50VXNlQ2FsbGluZ1VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbGllbnRVc2VDYWxsaW5nUGlkLCAmY2xpZW50SWQpOwotICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGNsaWVudElkLgotICAgIEVYUEVDVF9UUlVFKGNsaWVudElkID4gMCk7Ci0KLSAgICAvLyBSZWdpc3RlciB0aGUgY2xpZW50IGFnYWluIGFuZCBleHBlY3RzIGZhaWx1cmUuCi0gICAgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCwga0NsaWVudE9wUGFja2FnZU5hbWUsIGtDbGllbnRVc2VDYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50VXNlQ2FsbGluZ1BpZCwgJmNsaWVudElkKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7Ci0KLSAgICAvLyBVbnJlZ2lzdGVyIHRoZSB2YWxpZCBjbGllbnQuCi0gICAgYm9vbCByZXM7Ci0gICAgbVNlcnZpY2UtPnVucmVnaXN0ZXJDbGllbnQoY2xpZW50SWQsICZyZXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCmluZGV4IDlkOWNhNjMuLjA1NGE4OTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgIDogU2luZ2xldG9uPEFBdWRpb0NsaWVudFRyYWNrZXI+KCkgewogfQogCi1zdGQ6OnN0cmluZyBBQXVkaW9DbGllbnRUcmFja2VyOjpkdW1wKCkgY29uc3Qgeworc3RkOjpzdHJpbmcgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6ZHVtcCgpIGNvbnN0IE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKICAgICBjb25zdCBib29sIGlzTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKICAgICAgICAgICAgIFt0aGlzXSgpLT5ib29sIHsgcmV0dXJuIG1Mb2NrLnRyeV9sb2NrKCk7IH0gLyogZiAqLywKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZpY2VTdHJlYW0gOiBzdHJlYW1zVG9DbG9zZSkgewogICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IHNlcnZpY2VTdHJlYW0tPmdldEhhbmRsZSgpOwogICAgICAgICAgICAgQUxPR1coImJpbmRlckRpZWQoKSBjbG9zZSBhYmFuZG9uZWQgc3RyZWFtIDB4JTA4WFxuIiwgaGFuZGxlKTsKLSAgICAgICAgICAgIGFhdWRpb1NlcnZpY2UtPmNsb3NlU3RyZWFtKGhhbmRsZSk7CisgICAgICAgICAgICBhYXVkaW9TZXJ2aWNlLT5hc0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKS5jbG9zZVN0cmVhbShoYW5kbGUpOwogICAgICAgICB9CiAgICAgICAgIC8vIG1TdHJlYW1zIHNob3VsZCBiZSBlbXB0eSBub3cKICAgICB9CkBAIC0yMDcsNyArMjA3LDcgQEAKIH0KIAogCi1zdGQ6OnN0cmluZyBBQXVkaW9DbGllbnRUcmFja2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmR1bXAoKSBjb25zdCB7CitzdGQ6OnN0cmluZyBBQXVkaW9DbGllbnRUcmFja2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmR1bXAoKSBjb25zdCBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAgICAgY29uc3QgYm9vbCBpc0xvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCiAgICAgICAgICAgICBbdGhpc10oKS0+Ym9vbCB7IHJldHVybiBtTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmgKaW5kZXggOTQzYjgwOS4uMmIzODYyMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuaApAQCAtMjEsMTAgKzIxLDExIEBACiAjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8c2V0PgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5oIgorI2luY2x1ZGUgPGFhdWRpby9JQUF1ZGlvQ2xpZW50Lmg+CiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKQEAgLTQ2LDcgKzQ3LDcgQEAKICAgICAgKi8KICAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJDbGllbnQocGlkX3QgcGlkLCBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJDbGllbnQocGlkX3QgcGlkLCBjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KTsKIAogICAgIHZvaWQgdW5yZWdpc3RlckNsaWVudChwaWRfdCBwaWQpOwogCkBAIC0xMTQsMTAgKzExNSwxMiBAQAogICAgIH07CiAKICAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1Mb2NrCi0gICAgYW5kcm9pZDo6c3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBnZXROb3RpZmljYXRpb25DbGllbnRfbChwaWRfdCBwaWQpOworICAgIGFuZHJvaWQ6OnNwPE5vdGlmaWNhdGlvbkNsaWVudD4gZ2V0Tm90aWZpY2F0aW9uQ2xpZW50X2wocGlkX3QgcGlkKQorICAgICAgICAgICAgUkVRVUlSRVMobUxvY2spOwogCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIHN0ZDo6bWFwPHBpZF90LCBhbmRyb2lkOjpzcDxOb3RpZmljYXRpb25DbGllbnQ+PiBtTm90aWZpY2F0aW9uQ2xpZW50czsKKyAgICBzdGQ6Om1hcDxwaWRfdCwgYW5kcm9pZDo6c3A8Tm90aWZpY2F0aW9uQ2xpZW50Pj4gbU5vdGlmaWNhdGlvbkNsaWVudHMKKyAgICAgICAgICAgIEdVQVJERURfQlkobUxvY2spOwogICAgIGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICptQUF1ZGlvU2VydmljZSA9IG51bGxwdHI7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAppbmRleCA5ZjM0MTUzLi40MDdmNmQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgLCBtRXhjbHVzaXZlU3RyZWFtcygpIHsKIH0KIAotc3RkOjpzdHJpbmcgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpkdW1wKCkgY29uc3Qgeworc3RkOjpzdHJpbmcgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpkdW1wKCkgY29uc3QgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogICAgIGludCBpbmRleCA9IDA7CiAKQEAgLTMwNiw2ICszMDYsNyBAQAogICAgICAgICAgICAgICAgIG1TaGFyZWRTdHJlYW1zLmVuZCgpKTsKIAogICAgICAgICBzZXJ2aWNlRW5kcG9pbnQtPmNsb3NlKCk7CisKICAgICAgICAgbVNoYXJlZENsb3NlQ291bnQrKzsKICAgICAgICAgQUxPR1YoIiVzKCVwKSBjbG9zZWQgZm9yIGRldmljZSAlZCIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBzZXJ2aWNlRW5kcG9pbnQuZ2V0KCksIHNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCmluZGV4IGFlNzc2YjEuLmIwN2JjZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgpAQCAtNzAsMTAgKzcyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KTsKIAogICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woCi0gICAgICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICBSRVFVSVJFUyhtRXhjbHVzaXZlTG9jayk7CiAKICAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IGZpbmRTaGFyZWRFbmRwb2ludF9sKAotICAgICAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKQorICAgICAgICAgICAgUkVRVUlSRVMobVNoYXJlZExvY2spOwogCiAgICAgdm9pZCBjbG9zZUV4Y2x1c2l2ZUVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKICAgICB2b2lkIGNsb3NlU2hhcmVkRW5kcG9pbnQoYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBzZXJ2aWNlRW5kcG9pbnQpOwpAQCAtODMsMjMgKzg3LDI1IEBACiAgICAgLy8gTG9jayBtU2hhcmVkTG9jayBiZWZvcmUgbUV4Y2x1c2l2ZUxvY2suCiAgICAgLy8gaXQgaXMgT0sgdG8gb25seSBsb2NrIG1FeGNsdXNpdmVMb2NrLgogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkTG9jazsKLSAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+PiAgbVNoYXJlZFN0cmVhbXM7CisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPj4gIG1TaGFyZWRTdHJlYW1zCisgICAgICAgICAgICBHVUFSREVEX0JZKG1TaGFyZWRMb2NrKTsKIAogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRXhjbHVzaXZlTG9jazsKLSAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPj4gICAgbUV4Y2x1c2l2ZVN0cmVhbXM7CisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4+ICAgIG1FeGNsdXNpdmVTdHJlYW1zCisgICAgICAgICAgICBHVUFSREVEX0JZKG1FeGNsdXNpdmVMb2NrKTsKIAotICAgIC8vIE1vZGlmaWVkIHVuZGVyIGEgbG9jay4KLSAgICBpbnQzMl90IG1FeGNsdXNpdmVTZWFyY2hDb3VudCA9IDA7IC8vIG51bWJlciBvZiB0aW1lcyB3ZSBTRUFSQ0hFRCBmb3IgYW4gZXhjbHVzaXZlIGVuZHBvaW50Ci0gICAgaW50MzJfdCBtRXhjbHVzaXZlRm91bmRDb3VudCAgPSAwOyAvLyBudW1iZXIgb2YgdGltZXMgd2UgRk9VTkQgYW4gZXhjbHVzaXZlIGVuZHBvaW50Ci0gICAgaW50MzJfdCBtRXhjbHVzaXZlT3BlbkNvdW50ICAgPSAwOyAvLyBudW1iZXIgb2YgdGltZXMgd2UgT1BFTkVEIGFuIGV4Y2x1c2l2ZSBlbmRwb2ludAotICAgIGludDMyX3QgbUV4Y2x1c2l2ZUNsb3NlQ291bnQgID0gMDsgLy8gbnVtYmVyIG9mIHRpbWVzIHdlIENMT1NFRCBhbiBleGNsdXNpdmUgZW5kcG9pbnQKLSAgICBpbnQzMl90IG1FeGNsdXNpdmVTdG9sZW5Db3VudCA9IDA7IC8vIG51bWJlciBvZiB0aW1lcyB3ZSBTVE9MRSBhbiBleGNsdXNpdmUgZW5kcG9pbnQKKyAgICAvLyBDb3VudHMgcmVsYXRlZCB0byBhbiBleGNsdXNpdmUgZW5kcG9pbnQuCisgICAgaW50MzJfdCBtRXhjbHVzaXZlU2VhcmNoQ291bnQgR1VBUkRFRF9CWShtRXhjbHVzaXZlTG9jaykgPSAwOyAvLyAjIFNFQVJDSEVECisgICAgaW50MzJfdCBtRXhjbHVzaXZlRm91bmRDb3VudCAgR1VBUkRFRF9CWShtRXhjbHVzaXZlTG9jaykgPSAwOyAvLyAjIEZPVU5ECisgICAgaW50MzJfdCBtRXhjbHVzaXZlT3BlbkNvdW50ICAgR1VBUkRFRF9CWShtRXhjbHVzaXZlTG9jaykgPSAwOyAvLyAjIE9QRU5FRAorICAgIGludDMyX3QgbUV4Y2x1c2l2ZUNsb3NlQ291bnQgIEdVQVJERURfQlkobUV4Y2x1c2l2ZUxvY2spID0gMDsgLy8gIyBDTE9TRUQKKyAgICBpbnQzMl90IG1FeGNsdXNpdmVTdG9sZW5Db3VudCBHVUFSREVEX0JZKG1FeGNsdXNpdmVMb2NrKSA9IDA7IC8vICMgU1RPTEVOCiAKICAgICAvLyBTYW1lIGFzIGFib3ZlIGJ1dCBmb3IgU0hBUkVEIGVuZHBvaW50cy4KLSAgICBpbnQzMl90IG1TaGFyZWRTZWFyY2hDb3VudCAgICA9IDA7Ci0gICAgaW50MzJfdCBtU2hhcmVkRm91bmRDb3VudCAgICAgPSAwOwotICAgIGludDMyX3QgbVNoYXJlZE9wZW5Db3VudCAgICAgID0gMDsKLSAgICBpbnQzMl90IG1TaGFyZWRDbG9zZUNvdW50ICAgICA9IDA7CisgICAgaW50MzJfdCBtU2hhcmVkU2VhcmNoQ291bnQgICAgR1VBUkRFRF9CWShtU2hhcmVkTG9jaykgPSAwOworICAgIGludDMyX3QgbVNoYXJlZEZvdW5kQ291bnQgICAgIEdVQVJERURfQlkobVNoYXJlZExvY2spID0gMDsKKyAgICBpbnQzMl90IG1TaGFyZWRPcGVuQ291bnQgICAgICBHVUFSREVEX0JZKG1TaGFyZWRMb2NrKSA9IDA7CisgICAgaW50MzJfdCBtU2hhcmVkQ2xvc2VDb3VudCAgICAgR1VBUkRFRF9CWShtU2hhcmVkTG9jaykgPSAwOwogCiAgICAgLy8gRm9yIGVhc2lseSBkaXNhYmxpbmcgdGhlIHN0ZWFsaW5nIG9mIGV4Y2x1c2l2ZSBzdHJlYW1zLgogICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBrU3RlYWxpbmdFbmFibGVkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAppbmRleCAxYzAzYjdmLi5hZDRiODMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCkBAIC0zMywyNSArMzMsMjEgQEAKIHVzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7CiB1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwogCi1BQXVkaW9NaXhlcjo6fkFBdWRpb01peGVyKCkgewotICAgIGRlbGV0ZVtdIG1PdXRwdXRCdWZmZXI7Ci19Ci0KIHZvaWQgQUF1ZGlvTWl4ZXI6OmFsbG9jYXRlKGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLCBpbnQzMl90IGZyYW1lc1BlckJ1cnN0KSB7CiAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKICAgICBtRnJhbWVzUGVyQnVyc3QgPSBmcmFtZXNQZXJCdXJzdDsKICAgICBpbnQzMl90IHNhbXBsZXNQZXJCdWZmZXIgPSBzYW1wbGVzUGVyRnJhbWUgKiBmcmFtZXNQZXJCdXJzdDsKLSAgICBtT3V0cHV0QnVmZmVyID0gbmV3IGZsb2F0W3NhbXBsZXNQZXJCdWZmZXJdOworICAgIG1PdXRwdXRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPGZsb2F0W10+KHNhbXBsZXNQZXJCdWZmZXIpOwogICAgIG1CdWZmZXJTaXplSW5CeXRlcyA9IHNhbXBsZXNQZXJCdWZmZXIgKiBzaXplb2YoZmxvYXQpOwogfQogCiB2b2lkIEFBdWRpb01peGVyOjpjbGVhcigpIHsKLSAgICBtZW1zZXQobU91dHB1dEJ1ZmZlciwgMCwgbUJ1ZmZlclNpemVJbkJ5dGVzKTsKKyAgICBtZW1zZXQobU91dHB1dEJ1ZmZlci5nZXQoKSwgMCwgbUJ1ZmZlclNpemVJbkJ5dGVzKTsKIH0KIAotaW50MzJfdCBBQXVkaW9NaXhlcjo6bWl4KGludCBzdHJlYW1JbmRleCwgRmlmb0J1ZmZlciAqZmlmbywgYm9vbCBhbGxvd1VuZGVyZmxvdykgeworaW50MzJfdCBBQXVkaW9NaXhlcjo6bWl4KGludCBzdHJlYW1JbmRleCwgc3RkOjpzaGFyZWRfcHRyPEZpZm9CdWZmZXI+IGZpZm8sIGJvb2wgYWxsb3dVbmRlcmZsb3cpIHsKICAgICBXcmFwcGluZ0J1ZmZlciB3cmFwcGluZ0J1ZmZlcjsKLSAgICBmbG9hdCAqZGVzdGluYXRpb24gPSBtT3V0cHV0QnVmZmVyOworICAgIGZsb2F0ICpkZXN0aW5hdGlvbiA9IG1PdXRwdXRCdWZmZXIuZ2V0KCk7CiAKICNpZiBBQVVESU9fTUlYRVJfQVRSQUNFX0VOQUJMRUQKICAgICBBVFJBQ0VfQkVHSU4oImFhTWl4Iik7CkBAIC0xMTcsNSArMTEzLDUgQEAKIH0KIAogZmxvYXQgKkFBdWRpb01peGVyOjpnZXRPdXRwdXRCdWZmZXIoKSB7Ci0gICAgcmV0dXJuIG1PdXRwdXRCdWZmZXI7CisgICAgcmV0dXJuIG1PdXRwdXRCdWZmZXIuZ2V0KCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuaAppbmRleCBkNWFiYzViLi4xYTEyMGYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmgKQEAgLTI1LDcgKzI1LDYgQEAKIGNsYXNzIEFBdWRpb01peGVyIHsKIHB1YmxpYzoKICAgICBBQXVkaW9NaXhlcigpIHt9Ci0gICAgfkFBdWRpb01peGVyKCk7CiAKICAgICB2b2lkIGFsbG9jYXRlKGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLCBpbnQzMl90IGZyYW1lc1BlckJ1cnN0KTsKIApAQCAtMzgsNyArMzcsNyBAQAogICAgICAqIEBwYXJhbSBhbGxvd1VuZGVyZmxvdyBpZiB0cnVlIHRoZW4gYWxsb3cgbWl4ZXIgdG8gYWR2YW5jZSByZWFkIGluZGV4IHBhc3QgdGhlIHdyaXRlIGluZGV4CiAgICAgICogQHJldHVybiBmcmFtZXMgcmVhZCBmcm9tIHRoaXMgc3RyZWFtCiAgICAgICovCi0gICAgaW50MzJfdCBtaXgoaW50IHN0cmVhbUluZGV4LCBhbmRyb2lkOjpGaWZvQnVmZmVyICpmaWZvLCBib29sIGFsbG93VW5kZXJmbG93KTsKKyAgICBpbnQzMl90IG1peChpbnQgc3RyZWFtSW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpGaWZvQnVmZmVyPiBmaWZvLCBib29sIGFsbG93VW5kZXJmbG93KTsKIAogICAgIGZsb2F0ICpnZXRPdXRwdXRCdWZmZXIoKTsKIApAQCAtNDcsNyArNDYsNyBAQAogcHJpdmF0ZToKICAgICB2b2lkIG1peFBhcnQoZmxvYXQgKmRlc3RpbmF0aW9uLCBmbG9hdCAqc291cmNlLCBpbnQzMl90IG51bUZyYW1lcyk7CiAKLSAgICBmbG9hdCAgICptT3V0cHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gbU91dHB1dEJ1ZmZlcjsKICAgICBpbnQzMl90ICBtU2FtcGxlc1BlckZyYW1lID0gMDsKICAgICBpbnQzMl90ICBtRnJhbWVzUGVyQnVyc3QgPSAwOwogICAgIGludDMyX3QgIG1CdWZmZXJTaXplSW5CeXRlcyA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDIyY2RiMzUuLjY5ZTU4ZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCkBAIC0zMiwyNiArMzIsMjYgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKICNkZWZpbmUgTUFYX1NUUkVBTVNfUEVSX1BST0NFU1MgICA4CisjZGVmaW5lIEFJRExfUkVUVVJOKHgpICpfYWlkbF9yZXR1cm4gPSAoeCk7IHJldHVybiBTdGF0dXM6Om9rKCk7CisKIAogdXNpbmcgYW5kcm9pZDo6QUF1ZGlvU2VydmljZTsKK3VzaW5nIGJpbmRlcjo6U3RhdHVzOwogCiBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlOjpBQXVkaW9TZXJ2aWNlKCkKLSAgICA6IEJuQUF1ZGlvU2VydmljZSgpIHsKKyAgICA6IEJuQUF1ZGlvU2VydmljZSgpLAorICAgICAgbUFkYXB0ZXIodGhpcykgewogICAgIG1BdWRpb0NsaWVudC5jbGllbnRVaWQgPSBnZXR1aWQoKTsgICAvLyBUT0RPIGNvbnNpZGVyIHVzaW5nIGdldGV1aWQoKQogICAgIG1BdWRpb0NsaWVudC5jbGllbnRQaWQgPSBnZXRwaWQoKTsKICAgICBtQXVkaW9DbGllbnQucGFja2FnZU5hbWUgPSBTdHJpbmcxNigiIik7CiAgICAgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS5zZXRBQXVkaW9TZXJ2aWNlKHRoaXMpOwogfQogCi1BQXVkaW9TZXJ2aWNlOjp+QUF1ZGlvU2VydmljZSgpIHsKLX0KLQogc3RhdHVzX3QgQUF1ZGlvU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CiAKQEAgLTcyLDE4ICs3MiwyMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KSB7CitTdGF0dXMgQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUFBdWRpb0NsaWVudD4gJmNsaWVudCkgewogICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnJlZ2lzdGVyQ2xpZW50KHBpZCwgY2xpZW50KTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1ib29sIEFBdWRpb1NlcnZpY2U6OmlzQ2FsbGVySW5TZXJ2aWNlKCkgewotICAgIHJldHVybiBtQXVkaW9DbGllbnQuY2xpZW50UGlkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAmJgotICAgICAgICBtQXVkaW9DbGllbnQuY2xpZW50VWlkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLX0KK1N0YXR1cworQUF1ZGlvU2VydmljZTo6b3BlblN0cmVhbShjb25zdCBTdHJlYW1SZXF1ZXN0ICZfcmVxdWVzdCwgU3RyZWFtUGFyYW1ldGVycyogX3BhcmFtc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CiAKLWFhdWRpb19oYW5kbGVfdCBBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgeworICAgIC8vIENyZWF0ZSB3cmFwcGVyIG9iamVjdHMgZm9yIHNpbXBsZSB1c2FnZSBvZiB0aGUgcGFyY2VsYWJsZXMuCisgICAgY29uc3QgQUF1ZGlvU3RyZWFtUmVxdWVzdCByZXF1ZXN0KF9yZXF1ZXN0KTsKKyAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIHBhcmFtc091dDsKKwogICAgIC8vIEEgbG9jayBpbiBpcyB1c2VkIHRvIG9yZGVyIHRoZSBvcGVuaW5nIG9mIGVuZHBvaW50cyB3aGVuIGFuCiAgICAgLy8gRVhDTFVTSVZFIGVuZHBvaW50IGlzIHN0b2xlbi4gV2Ugd2FudCB0aGUgb3JkZXIgdG8gYmU6CiAgICAgLy8gMSkgVGhyZWFkIEEgb3BlbnMgZXhjbHVzaXZlIE1NQVAgZW5kcG9pbnQKQEAgLTEwOCwxMyArMTExLDEzIEBACiAgICAgICAgIGlmIChjb3VudCA+PSBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUykgewogICAgICAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogZXhjZWVkZWQgbWF4IHN0cmVhbXMgcGVyIHByb2Nlc3MgJWQgPj0gJWQiLAogICAgICAgICAgICAgICAgICAgY291bnQsICBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUyk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChzaGFyaW5nTW9kZSAhPSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSAmJiBzaGFyaW5nTW9kZSAhPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgewogICAgICAgICBBTE9HRSgib3BlblN0cmVhbSgpOiB1bnJlY29nbml6ZWQgc2hhcmluZyBtb2RlID0gJWQiLCBzaGFyaW5nTW9kZSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQpOwogICAgIH0KIAogICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRQpAQCAtMTQ3LDI5ICsxNTAsMTI0IEBACiAKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIEFJRExfUkVUVVJOKHJlc3VsdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1TdHJlYW1UcmFja2VyLmFkZFN0cmVhbUZvckhhbmRsZShzZXJ2aWNlU3RyZWFtLmdldCgpKTsKICAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHBpZF90IHBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CiAgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKLSAgICAgICAgY29uZmlndXJhdGlvbk91dHB1dC5jb3B5RnJvbSgqc2VydmljZVN0cmVhbSk7CisgICAgICAgIHBhcmFtc091dC5jb3B5RnJvbSgqc2VydmljZVN0cmVhbSk7CisgICAgICAgICpfcGFyYW1zT3V0ID0gc3RkOjptb3ZlKHBhcmFtc091dCkucGFyY2VsYWJsZSgpOwogICAgICAgICAvLyBMb2cgb3BlbiBpbiBNZWRpYU1ldHJpY3MgYWZ0ZXIgd2UgaGF2ZSB0aGUgaGFuZGxlIGJlY2F1c2Ugd2UgbmVlZCB0aGUgaGFuZGxlIHRvCiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbWV0cmljcyBJRC4KICAgICAgICAgc2VydmljZVN0cmVhbS0+bG9nT3BlbihoYW5kbGUpOwogICAgICAgICBBTE9HVigiJXMoKTogcmV0dXJuIGhhbmRsZSA9IDB4JTA4WCIsIF9fZnVuY19fLCBoYW5kbGUpOwotICAgICAgICByZXR1cm4gaGFuZGxlOworICAgICAgICBBSURMX1JFVFVSTihoYW5kbGUpOwogICAgIH0KIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKICAgICAvLyBDaGVjayBwZXJtaXNzaW9uIGFuZCBvd25lcnNoaXAgZmlyc3QuCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiY2xvc2VTdHJlYW0oMHglMHgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUiLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOworICAgICAgICBBSURMX1JFVFVSTihBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpOwogICAgIH0KLSAgICByZXR1cm4gY2xvc2VTdHJlYW0oc2VydmljZVN0cmVhbSk7CisgICAgQUlETF9SRVRVUk4oY2xvc2VTdHJlYW0oc2VydmljZVN0cmVhbSkpOworfQorCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oaW50MzJfdCBzdHJlYW1IYW5kbGUsIEVuZHBvaW50KiBlbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKKworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImdldFN0cmVhbURlc2NyaXB0aW9uKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICB9CisgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgZW5kcG9pbnRQYXJjZWxhYmxlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5nZXREZXNjcmlwdGlvbihlbmRwb2ludFBhcmNlbGFibGUpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICplbmRwb2ludCA9IHN0ZDo6bW92ZShlbmRwb2ludFBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKKyAgICB9CisgICAgQUlETF9SRVRVUk4ocmVzdWx0KTsKK30KKworU3RhdHVzIEFBdWRpb1NlcnZpY2U6OnN0YXJ0U3RyZWFtKGludDMyX3Qgc3RyZWFtSGFuZGxlLCBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKKworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICB9CisgICAgQUlETF9SRVRVUk4oc2VydmljZVN0cmVhbS0+c3RhcnQoKSk7Cit9CisKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpwYXVzZVN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFJRExfUkVUVVJOKEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSk7CisgICAgfQorICAgIEFJRExfUkVUVVJOKHNlcnZpY2VTdHJlYW0tPnBhdXNlKCkpOworfQorCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6c3RvcFN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFJRExfUkVUVVJOKEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSk7CisgICAgfQorICAgIEFJRExfUkVUVVJOKHNlcnZpY2VTdHJlYW0tPnN0b3AoKSk7Cit9CisKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpmbHVzaFN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFJRExfUkVUVVJOKEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSk7CisgICAgfQorICAgIEFJRExfUkVUVVJOKHNlcnZpY2VTdHJlYW0tPmZsdXNoKCkpOworfQorCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZChpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCBjbGllbnRUaHJlYWRJZCwgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKl9haWRsX3JldHVybikgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lX3Y8YWF1ZGlvX3Jlc3VsdF90LCBzdGQ6OmRlY2F5X3Q8dHlwZW9mKCpfYWlkbF9yZXR1cm4pPj4pOworCisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBSURMX1JFVFVSTihBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpOworICAgIH0KKyAgICBpbnQzMl90IHByaW9yaXR5ID0gaXNDYWxsZXJJblNlcnZpY2UoKQorICAgICAgICA/IGtSZWFsVGltZUF1ZGlvUHJpb3JpdHlTZXJ2aWNlIDoga1JlYWxUaW1lQXVkaW9Qcmlvcml0eUNsaWVudDsKKyAgICBBSURMX1JFVFVSTihzZXJ2aWNlU3RyZWFtLT5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkLCBwcmlvcml0eSkpOworfQorCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGludDMyX3Qgc3RyZWFtSGFuZGxlLCBpbnQzMl90IGNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKKworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICB9CisgICAgQUlETF9SRVRVUk4oc2VydmljZVN0cmVhbS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkKSk7Cit9CisKK2Jvb2wgQUF1ZGlvU2VydmljZTo6aXNDYWxsZXJJblNlcnZpY2UoKSB7CisgICAgcmV0dXJuIG1BdWRpb0NsaWVudC5jbGllbnRQaWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpICYmCisgICAgICAgIG1BdWRpb0NsaWVudC5jbGllbnRVaWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0pIHsKQEAgLTIwNSw3NiArMzAzLDYgQEAKICAgICByZXR1cm4gc2VydmljZVN0cmVhbTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmdldFN0cmVhbURlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgYWF1ZGlvOjpBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgewotICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImdldFN0cmVhbURlc2NyaXB0aW9uKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZpY2VTdHJlYW0tPmdldERlc2NyaXB0aW9uKHBhcmNlbGFibGUpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6c3RhcnRTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZpY2VTdHJlYW0tPnN0YXJ0KCk7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpwYXVzZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+cGF1c2UoKTsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0b3BTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZpY2VTdHJlYW0tPnN0b3AoKTsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmZsdXNoU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5mbHVzaCgpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IC8qIHBlcmlvZE5hbm9zZWNvbmRzICovKSB7Ci0gICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICBpbnQzMl90IHByaW9yaXR5ID0gaXNDYWxsZXJJblNlcnZpY2UoKQotICAgICAgICA/IGtSZWFsVGltZUF1ZGlvUHJpb3JpdHlTZXJ2aWNlIDoga1JlYWxUaW1lQXVkaW9Qcmlvcml0eUNsaWVudDsKLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+cmVnaXN0ZXJBdWRpb1RocmVhZChjbGllbnRUaHJlYWRJZCwgcHJpb3JpdHkpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkKSB7Ci0gICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkKTsKLX0KLQogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0YXJ0Q2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKaW5kZXggY2FmNDhhNS4uN2MxYjc5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaApAQCAtMjQsNjkgKzI0LDcxIEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9DbGllbnQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhYXVkaW8vQm5BQXVkaW9TZXJ2aWNlLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0NvbW1vbi5oIgorI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oIgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKIAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU3RyZWFtVHJhY2tlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKyNkZWZpbmUgQUFVRElPX1NFUlZJQ0VfTkFNRSAgIm1lZGlhLmFhdWRpbyIKKwogY2xhc3MgQUF1ZGlvU2VydmljZSA6CiAgICAgcHVibGljIEJpbmRlclNlcnZpY2U8QUF1ZGlvU2VydmljZT4sCi0gICAgcHVibGljIEJuQUF1ZGlvU2VydmljZSwKLSAgICBwdWJsaWMgYWF1ZGlvOjpBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlCisgICAgcHVibGljIGFhdWRpbzo6Qm5BQXVkaW9TZXJ2aWNlCiB7CiAgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8QUF1ZGlvU2VydmljZT47CiAKIHB1YmxpYzoKICAgICBBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZSgpOworICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2UoKSA9IGRlZmF1bHQ7CisKKyAgICBhYXVkaW86OkFBdWRpb1NlcnZpY2VJbnRlcmZhY2UmIGFzQUF1ZGlvU2VydmljZUludGVyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BZGFwdGVyOworICAgIH0KIAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuIEFBVURJT19TRVJWSUNFX05BTUU7IH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpOworICAgIGJpbmRlcjo6U3RhdHVzIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphYXVkaW86OklBQXVkaW9DbGllbnQ+JiBjbGllbnQpIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBvcGVuU3RyZWFtKGNvbnN0IDo6YWF1ZGlvOjpTdHJlYW1SZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjphYXVkaW86OlN0cmVhbVBhcmFtZXRlcnMqIHBhcmFtc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICAvKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIGZyb20gQmluZGVyLiBJdCBjaGVja3MgZm9yIHBlcm1pc3Npb25zCi0gICAgICogYW5kIGNvbnZlcnRzIHRoZSBoYW5kbGUgcGFzc2VkIHRocm91Z2ggQmluZGVyIHRvIGEgc3RyZWFtIHBvaW50ZXIuCi0gICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgY2xvc2VTdHJlYW0oaW50MzJfdCBzdHJlYW1IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzCisgICAgZ2V0U3RyZWFtRGVzY3JpcHRpb24oaW50MzJfdCBzdHJlYW1IYW5kbGUsIDo6YWF1ZGlvOjpFbmRwb2ludCogZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0U3RyZWFtKGludDMyX3Qgc3RyZWFtSGFuZGxlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgcGF1c2VTdHJlYW0oaW50MzJfdCBzdHJlYW1IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHN0b3BTdHJlYW0oaW50MzJfdCBzdHJlYW1IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2hTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBmbHVzaFN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzCisgICAgcmVnaXN0ZXJBdWRpb1RocmVhZChpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCBjbGllbnRUaHJlYWRJZCwgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoaW50MzJfdCBzdHJlYW1IYW5kbGUsIGludDMyX3QgY2xpZW50VGhyZWFkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSk7CiAKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gVGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kcyBhcmUgb25seSBjYWxsZWQgZnJvbSB0aGUgc2VydmljZSBhbmQgTk9UIGJ5IEJpbmRlci4KQEAgLTEwMSw2ICsxMDMsMjkgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2VTdHJlYW0oc3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSk7CiAKIHByaXZhdGU6CisgICAgY2xhc3MgQWRhcHRlciA6IHB1YmxpYyBhYXVkaW86OkFBdWRpb0JpbmRlckFkYXB0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQWRhcHRlcihBQXVkaW9TZXJ2aWNlICpzZXJ2aWNlKQorICAgICAgICAgICAgICAgIDogYWF1ZGlvOjpBQXVkaW9CaW5kZXJBZGFwdGVyKHNlcnZpY2UpLAorICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uoc2VydmljZSkge30KKworICAgICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQgJmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLT5zdGFydENsaWVudChzdHJlYW1IYW5kbGUsIGNsaWVudCwgYXR0ciwgY2xpZW50SGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS0+c3RvcENsaWVudChzdHJlYW1IYW5kbGUsIGNsaWVudEhhbmRsZSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEFBdWRpb1NlcnZpY2UqIGNvbnN0IG1TZXJ2aWNlOworICAgIH07CisKKyAgICBBZGFwdGVyIG1BZGFwdGVyOwogCiAgICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xpZW50IGlzIHRoZSBhdWRpb3NlcnZlcgogICAgICAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKaW5kZXggY2VlZmU5My4uZmFlYTU4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCkBAIC0zOCw3ICszOCw3IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiAKLXN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IHsKK3N0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKIAogICAgIGNvbnN0IGJvb2wgaXNMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKApAQCAtMTgyLDExICsxODIsMTIgQEAKICAgICAgICAgICAgIDogQVVESU9fU09VUkNFX0RFRkFVTFQ7CiAgICAgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzOwogICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZCi0gICAgICAgICAgICB8IEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzayhwYXJhbXMtPmdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOworICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oQVVESU9fRkxBR19MT1dfTEFURU5DWQorICAgICAgICAgICAgICAgIHwgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZCi0gICAgICAgICAgICB8IEFBdWRpb0NvbnZlcnRfcHJpdmFjeVNlbnNpdGl2ZVRvQXVkaW9GbGFnc01hc2socGFyYW1zLT5pc1ByaXZhY3lTZW5zaXRpdmUoKSk7CisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihBVURJT19GTEFHX0xPV19MQVRFTkNZCisgICAgICAgICAgICAgICAgfCBBQXVkaW9Db252ZXJ0X3ByaXZhY3lTZW5zaXRpdmVUb0F1ZGlvRmxhZ3NNYXNrKHBhcmFtcy0+aXNQcml2YWN5U2Vuc2l0aXZlKCkpKTsKICAgICB9CiAgICAgcmV0dXJuIHsKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKaW5kZXggYTE3MWNiMC4uNzIwOTBjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgogI2luY2x1ZGUgImNvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oIgpAQCAtNDcsNyArNDksMTEgQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpID0gMDsKKyAgICAvKgorICAgICAqIFBlcmZvcm0gYW55IGNsZWFudXAgbmVjZXNzYXJ5IGJlZm9yZSBkZWxldGluZyB0aGUgc3RyZWFtLgorICAgICAqIFRoaXMgbWlnaHQgaW5jbHVkZSByZWxlYXNpbmcgYW5kIGNsb3NpbmcgaW50ZXJuYWwgc3RyZWFtcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSk7CiAKQEAgLTEzNyw3ICsxNDMsOCBAQAogICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4gZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICAgICAgbUxvY2tTdHJlYW1zOwotICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4gbVJlZ2lzdGVyZWRTdHJlYW1zOworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4gbVJlZ2lzdGVyZWRTdHJlYW1zCisgICAgICAgICAgICBHVUFSREVEX0JZKG1Mb2NrU3RyZWFtcyk7CiAKICAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY0VuZHBvaW50VGltZXN0YW1wOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCmluZGV4IDM3ZDEwNWIuLmJjNzY5ZjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCkBAIC0zNSwyMiArMzUsMTcgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIAotQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZTo6QUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCi0gICAgICAgIDogbVN0cmVhbUludGVybmFsQ2FwdHVyZShhdWRpb1NlcnZpY2UsIHRydWUpIHsKLSAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsQ2FwdHVyZTsKLX0KLQotQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKSB7Ci0gICAgZGVsZXRlIG1EaXN0cmlidXRpb25CdWZmZXI7CitBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlKEFBdWRpb1NlcnZpY2UmIGF1ZGlvU2VydmljZSkKKyAgICAgICAgOiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQoCisgICAgICAgICAgICAgICAgbmV3IEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlKGF1ZGlvU2VydmljZS5hc0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKSwgdHJ1ZSkpIHsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmU6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICBkZWxldGUgbURpc3RyaWJ1dGlvbkJ1ZmZlcjsKICAgICAgICAgaW50IGRpc3RyaWJ1dGlvbkJ1ZmZlclNpemVCeXRlcyA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1BlckJ1cnN0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0Qnl0ZXNQZXJGcmFtZSgpOwotICAgICAgICBtRGlzdHJpYnV0aW9uQnVmZmVyID0gbmV3IHVpbnQ4X3RbZGlzdHJpYnV0aW9uQnVmZmVyU2l6ZUJ5dGVzXTsKKyAgICAgICAgbURpc3RyaWJ1dGlvbkJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihkaXN0cmlidXRpb25CdWZmZXJTaXplQnl0ZXMpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNjcsOSArNjIsMTIgQEAKICAgICAgICAgaW50NjRfdCBtbWFwRnJhbWVzUmVhZCA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1JlYWQoKTsKIAogICAgICAgICAvLyBSZWFkIGF1ZGlvIGRhdGEgZnJvbSBzdHJlYW0gdXNpbmcgYSBibG9ja2luZyByZWFkLgotICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZWFkKG1EaXN0cmlidXRpb25CdWZmZXIsIGdldEZyYW1lc1BlckJ1cnN0KCksIHRpbWVvdXROYW5vcyk7CisgICAgICAgIHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPnJlYWQobURpc3RyaWJ1dGlvbkJ1ZmZlci5nZXQoKSwKKyAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgICAgICAgICAgQUxPR0QoIiVzKCkgcmVhZCgpIHJldHVybmVkIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAvLyBXZSBkbyBub3QgbmVlZCB0aGUgcmV0dXJuZWQgdmVjdG9yLgorICAgICAgICAgICAgKHZvaWQpIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6ZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgQUxPR1coImNhbGxiYWNrTG9vcCgpIHJlYWQgJWQgLyAlZCIsCkBAIC03OSw0OCArNzcsMTQgQEAKIAogICAgICAgICAvLyBEaXN0cmlidXRlIGRhdGEgdG8gZWFjaCBhY3RpdmUgc3RyZWFtLgogICAgICAgICB7IC8vIGJyYWNrZXRzIGFyZSBmb3IgbG9ja19ndWFyZAotCiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50U3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNSdW5uaW5nKCkgJiYgIWNsaWVudFN0cmVhbS0+aXNTdXNwZW5kZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1dyaXR0ZW4gPSAwOwotCiAgICAgICAgICAgICAgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHN0cmVhbVNoYXJlZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCAqPihjbGllbnRTdHJlYW0uZ2V0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2sgdGhlIEF1ZGlvRmlmbyB0byBwcm90ZWN0IGFnYWluc3QgY2xvc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2soc3RyZWFtU2hhcmVkLT5nZXRBdWRpb0RhdGFRdWV1ZUxvY2soKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZpZm9CdWZmZXIgKmZpZm8gPSBzdHJlYW1TaGFyZWQtPmdldEF1ZGlvRGF0YUZpZm9CdWZmZXJfbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8gIT0gbnVsbHB0cikgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIG9mZnNldCBiZXR3ZWVuIGZyYW1lUG9zaXRpb24gaW4gY2xpZW50J3Mgc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdnMgdGhlIHVuZGVybHlpbmcgTU1BUCBzdHJlYW0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RnJhbWVzV3JpdHRlbiA9IGZpZm8tPmdldFdyaXRlQ291bnRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSB0d28gaW5kaWNlcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGZyYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25PZmZzZXQgPSBtbWFwRnJhbWVzUmVhZCAtIGNsaWVudEZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGUgYnVmZmVyIHRvbyBmdWxsIHRvIHdyaXRlIGEgYnVyc3Q/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPmluY3JlbWVudFhSdW5Db3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZm8tPndyaXRlKG1EaXN0cmlidXRpb25CdWZmZXIsIGdldEZyYW1lc1BlckJ1cnN0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRGcmFtZXNXcml0dGVuID0gZmlmby0+Z2V0V3JpdGVDb3VudGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50RnJhbWVzV3JpdHRlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdGltZXN0YW1wIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRpb24gb2YgZGF0YSBiZWluZyB3cml0dGVuIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgYnVmZmVyLiBJdCBpcyBzZW50IHRvIHRoZSBjbGllbnQgYW5kIHVzZWQgaW4gdGhlIHRpbWluZyBtb2RlbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZGVjaWRlIHdoZW4gZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSB0byByZWFkLgotICAgICAgICAgICAgICAgICAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcChjbGllbnRGcmFtZXNXcml0dGVuLCBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+bWFya1RyYW5zZmVyVGltZSh0aW1lc3RhbXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT53cml0ZURhdGFJZlJvb20obW1hcEZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaXN0cmlidXRpb25CdWZmZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oCmluZGV4IDk3MWRhOWEuLjJjYTQzY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQUFVRElPX1NFUlZJQ0VfRU5EUE9JTlRfQ0FQVFVSRV9ICiAjZGVmaW5lIEFBVURJT19TRVJWSUNFX0VORFBPSU5UX0NBUFRVUkVfSAogCisjaW5jbHVkZSA8bWVtb3J5PgorCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaCIKIApAQCAtMjgsMTYgKzMwLDE0IEBACiBjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlIDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpOwotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKTsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlKCkgPSBkZWZhdWx0OwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIAotCiAgICAgdm9pZCAqY2FsbGJhY2tMb29wKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6Ci0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUgIG1TdHJlYW1JbnRlcm5hbENhcHR1cmU7Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgKm1EaXN0cmlidXRpb25CdWZmZXIgPSBudWxscHRyOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+ICBtRGlzdHJpYnV0aW9uQnVmZmVyOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCmluZGV4IDA4NDNlMGIuLjg1YjIwNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCkBAIC03MiwyNCArNzIsNDYgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOwotCiAgICAgY29weUZyb20ocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKSk7Ci0KLSAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IGdldEF1ZGlvQXR0cmlidXRlc0Zyb20odGhpcyk7Ci0KICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSByZXF1ZXN0LmdldFVzZXJJZCgpOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CiAgICAgbU1tYXBDbGllbnQucGFja2FnZU5hbWUuc2V0VG8oU3RyaW5nMTYoIiIpKTsKIAorICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CisKKyAgICAvLyBGTE9BVCBpcyBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IHRoZSBIQUwgc28gYXNrIGZvciBhIDI0LWJpdC4KKyAgICBib29sIGlzSGlnaFJlc1JlcXVlc3RlZCA9IGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICAgICAgICAgIHx8IGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgIGlmIChpc0hpZ2hSZXNSZXF1ZXN0ZWQpIHsKKyAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhlc2UgbG9ncyB3aGVuIGZpbmlzaGVkIGRlYnVnZ2luZy4KKyAgICAgICAgQUxPR0QoIiVzKCkgY2hhbmdlIGZvcm1hdCBmcm9tICVkIHRvIDI0X0JJVF9QQUNLRUQiLCBfX2Z1bmNfXywgYXVkaW9Gb3JtYXQpOworICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBvcGVuV2l0aEZvcm1hdChhdWRpb0Zvcm1hdCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBUT0RPIFRoZSBIQUwgYW5kIEF1ZGlvRmxpbmdlciBzaG91bGQgYmUgcmVjb21tZW5kaW5nIGEgZm9ybWF0IGlmIHRoZSBvcGVuIGZhaWxzLgorICAgIC8vICAgICAgQnV0IHRoYXQgcmVjb21tZW5kYXRpb24gaXMgbm90IHByb3BhZ2F0aW5nIGJhY2sgZnJvbSB0aGUgSEFMLgorICAgIC8vICAgICAgU28gZm9yIG5vdyBqdXN0IHRyeSBzb21ldGhpbmcgdmVyeSBsaWtlbHkgdG8gd29yay4KKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSAmJiBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgMjRfQklUIGZhaWxlZCwgcGVyaGFwcyBkdWUgdG8gZm9ybWF0LiBUcnkgYWdhaW4gd2l0aCAxNl9CSVQiLCBfX2Z1bmNfXyk7CisgICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHJlc3VsdCA9IG9wZW5XaXRoRm9ybWF0KGF1ZGlvRm9ybWF0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW5XaXRoRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOworCisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBnZXRBdWRpb0F0dHJpYnV0ZXNGcm9tKHRoaXMpOworCiAgICAgbVJlcXVlc3RlZERldmljZUlkID0gZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOwogCiAgICAgLy8gRmlsbCBpbiBjb25maWcKLSAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOwotICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCB8fCBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgfQogICAgIGNvbmZpZy5mb3JtYXQgPSBhdWRpb0Zvcm1hdDsKIAogICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoKTsKQEAgLTIyNiw3ICsyNDgsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpjbG9zZSgpIHsKK3ZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Y2xvc2UoKSB7CiAgICAgaWYgKG1NbWFwU3RyZWFtICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gTmVlZHMgdG8gYmUgZXhwbGljaXRseSBjbGVhcmVkIG9yIENUUyB3aWxsIGZhaWwgYnV0IGl0IGlzIG5vdCBjbGVhciB3aHkuCiAgICAgICAgIG1NbWFwU3RyZWFtLmNsZWFyKCk7CkBAIC0yMzUsOCArMjU3LDYgQEAKICAgICAgICAgLy8gRklYTUUgTWFrZSBjbG9zaW5nIHN5bmNocm9ub3VzLgogICAgICAgICBBdWRpb0Nsb2NrOjpzbGVlcEZvck5hbm9zKDEwMCAqIEFBVURJT19OQU5PU19QRVJfTUlMTElTRUNPTkQpOwogICAgIH0KLQotICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydFN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLApAQCAtMzgwLDMgKzQwMCwxOCBAQAogICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldENhcGFjaXR5SW5GcmFtZXMoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmdldEV4dGVybmFsUG9zaXRpb24odWludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKQoreworICAgIGlmICghbUV4dGVybmFsUG9zaXRpb25TdXBwb3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+Z2V0RXh0ZXJuYWxQb3NpdGlvbihwb3NpdGlvbkZyYW1lcywgdGltZU5hbm9zKTsKKyAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIC8vIGdldEV4dGVybmFsUG9zaXRpb24gaXMgbm90IHN1cHBvcnRlZC4gU2V0IG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkIGFzIGZhbHNlCisgICAgICAgIC8vIHNvIHRoYXQgdGhlIGNhbGwgd2lsbCBub3QgZ28gdG8gdGhlIEhBTCBuZXh0IHRpbWUuCisgICAgICAgIG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oCmluZGV4IDNkMTA4NjEuLjI0YjE2MWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKQEAgLTUwLDcgKzUwLDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKQEAgLTg1LDcgKzg1LDEyIEBACiAgICAgICAgIHJldHVybiBtSGFyZHdhcmVUaW1lT2Zmc2V0TmFub3M7CiAgICAgfQogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEV4dGVybmFsUG9zaXRpb24odWludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpOworCiBwcml2YXRlOgorCisgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW5XaXRoRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KTsKKwogICAgIE1vbm90b25pY0NvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNUcmFuc2ZlcnJlZDsKIAogICAgIC8vIEludGVyZmFjZSB0byB0aGUgQXVkaW9GbGluZ2VyIE1NQVAgc3VwcG9ydC4KQEAgLTEwMSw2ICsxMDYsOCBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gMDsgLy8gVE9ETyBnZXQgZnJvbSBIQUwKIAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkID0gdHJ1ZTsKKwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCmluZGV4IGJkYTRiOTAuLjRlNDYwMzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCkBAIC00MSwxMCArNDEsOSBAQAogCiAjZGVmaW5lIEJVUlNUU19QRVJfQlVGRkVSX0RFRkFVTFQgICAyCiAKLUFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6OkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQotICAgICAgICA6IG1TdHJlYW1JbnRlcm5hbFBsYXkoYXVkaW9TZXJ2aWNlLCB0cnVlKSB7Ci0gICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbFBsYXk7Ci19CitBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KEFBdWRpb1NlcnZpY2UmIGF1ZGlvU2VydmljZSkKKyAgICAgICAgOiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQoCisgICAgICAgICAgICAgICAgbmV3IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KGF1ZGlvU2VydmljZS5hc0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKSwgdHJ1ZSkpIHt9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4ocmVxdWVzdCk7CkBAIC05OSwxMCArOTgsMTEgQEAKIAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gTG9jayB0aGUgQXVkaW9GaWZvIHRvIHByb3RlY3QgYWdhaW5zdCBjbG9zZS4KLSAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKHN0cmVhbVNoYXJlZC0+Z2V0QXVkaW9EYXRhUXVldWVMb2NrKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIEZpZm9CdWZmZXIgKmZpZm8gPSBzdHJlYW1TaGFyZWQtPmdldEF1ZGlvRGF0YUZpZm9CdWZmZXJfbCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlmbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhzdHJlYW1TaGFyZWQtPmF1ZGlvRGF0YVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTaGFyZWRSaW5nQnVmZmVyPiBhdWRpb0RhdGFRdWV1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3RyZWFtU2hhcmVkLT5nZXRBdWRpb0RhdGFRdWV1ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWZvQnVmZmVyPiBmaWZvOworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9EYXRhUXVldWUgJiYgKGZpZm8gPSBhdWRpb0RhdGFRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpKSkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgb2Zmc2V0IGJldHdlZW4gZnJhbWVQb3NpdGlvbiBpbiBjbGllbnQncyBzdHJlYW0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZzIHRoZSB1bmRlcmx5aW5nIE1NQVAgc3RyZWFtLgpAQCAtMTQ1LDcgKzE0NSw5IEBACiAgICAgICAgIHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPndyaXRlKG1NaXhlci5nZXRPdXRwdXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSwgdGltZW91dE5hbm9zKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgICAgICAgICAgQUxPR0QoIiVzKCkgd3JpdGUoKSByZXR1cm5lZCBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEIiwgX19mdW5jX18pOworICAgICAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdGhlIHJldHVybmVkIHZlY3Rvci4KKyAgICAgICAgICAgICh2b2lkKSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJjYWxsYmFja0xvb3AoKSB3cm90ZSAlZCAvICVkIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaAppbmRleCA5ODFlNDMwLi4xNjBhMWRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCkBAIC00NSw3ICs0NSw2IEBACiAgICAgdm9pZCAqY2FsbGJhY2tMb29wKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6Ci0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkgIG1TdHJlYW1JbnRlcm5hbFBsYXk7IC8vIGZvciBwbGF5aW5nIG91dHB1dCBvZiBtaXhlcgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBtTGF0ZW5jeVR1bmluZ0VuYWJsZWQgPSBmYWxzZTsgLy8gVE9ETyBpbXBsZW1lbnQgdHVuaW5nCiAgICAgQUF1ZGlvTWl4ZXIgICAgICAgICAgICAgIG1NaXhlcjsgICAgLy8KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAppbmRleCBkYzIxODg2Li41MDFlOGMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKQEAgLTQwLDYgKzQwLDkgQEAKIC8vIFRoaXMgaXMgdGhlIG1heGltdW0gc2l6ZSBpbiBmcmFtZXMuIFRoZSBlZmZlY3RpdmUgc2l6ZSBjYW4gYmUgdHVuZWQgc21hbGxlciBhdCBydW50aW1lLgogI2RlZmluZSBERUZBVUxUX0JVRkZFUl9DQVBBQ0lUWSAgICg0OCAqIDgpCiAKK0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkKEF1ZGlvU3RyZWFtSW50ZXJuYWwgKnN0cmVhbUludGVybmFsKQorICAgIDogbVN0cmVhbUludGVybmFsKHN0cmVhbUludGVybmFsKSB7fQorCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmR1bXAoKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogCkBAIC04NCwyNCArODcsMzEgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpjbG9zZSgpIHsKLSAgICByZXR1cm4gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVsZWFzZUNsb3NlRmluYWwoKTsKK3ZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpjbG9zZSgpIHsKKyAgICBzdG9wU2hhcmluZ1RocmVhZCgpOworICAgIGdldFN0cmVhbUludGVybmFsKCktPnNhZmVSZWxlYXNlQ2xvc2UoKTsKIH0KIAogLy8gR2x1ZSBiZXR3ZWVuIEMgYW5kIEMrKyBjYWxsYmFja3MuCiBzdGF0aWMgdm9pZCAqYWF1ZGlvX2VuZHBvaW50X3RocmVhZF9wcm9jKHZvaWQgKmFyZykgewogICAgIGFzc2VydChhcmcgIT0gbnVsbHB0cik7CisgICAgQUxPR0QoIiVzKCkgY2FsbGVkIiwgX19mdW5jX18pOwogCi0gICAgLy8gVGhlIGNhbGxlciBwYXNzZWQgaW4gYSBzbWFydCBwb2ludGVyIHRvIHByZXZlbnQgdGhlIGVuZHBvaW50IGZyb20gZ2V0dGluZyBkZWxldGVkCi0gICAgLy8gd2hpbGUgdGhlIHRocmVhZCB3YXMgbGF1bmNoaW5nLgotICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gKmVuZHBvaW50Rm9yVGhyZWFkID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gKj4oYXJnKTsKLSAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IGVuZHBvaW50ID0gKmVuZHBvaW50Rm9yVGhyZWFkOwotICAgIGRlbGV0ZSBlbmRwb2ludEZvclRocmVhZDsgLy8gSnVzdCB1c2Ugc2NvcGVkIHNtYXJ0IHBvaW50ZXIuIERvbid0IG5lZWQgdGhpcyBhbnltb3JlLgorICAgIC8vIFByZXZlbnQgdGhlIHN0cmVhbSBmcm9tIGJlaW5nIGRlbGV0ZWQgd2hpbGUgYmVpbmcgdXNlZC4KKyAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGV4dHJhIHNhZmV0eS4gSXQgaXMgcHJvYmFibHkgbm90IG5lZWRlZCBiZWNhdXNlCisgICAgLy8gdGhpcyBjYWxsYmFjayBzaG91bGQgYmUgam9pbmVkIGJlZm9yZSB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KKyAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgKmVuZHBvaW50UHRyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkICo+KGFyZyk7CisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiBlbmRwb2ludChlbmRwb2ludFB0cik7CisgICAgLy8gQmFsYW5jZSB0aGUgaW5jU3Ryb25nKCkgaW4gc3RhcnRTaGFyaW5nVGhyZWFkX2woKS4KKyAgICBlbmRwb2ludC0+ZGVjU3Ryb25nKG51bGxwdHIpOworCiAgICAgdm9pZCAqcmVzdWx0ID0gZW5kcG9pbnQtPmNhbGxiYWNrTG9vcCgpOwogICAgIC8vIENsb3NlIG5vdyBzbyB0aGF0IHRoZSBIVyByZXNvdXJjZSBpcyBmcmVlZCBhbmQgd2UgY2FuIG9wZW4gYSBuZXcgZGV2aWNlLgogICAgIGlmICghZW5kcG9pbnQtPmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgZW5kcG9pbnQtPmNsb3NlKCk7CisgICAgICAgIEFMT0dEKCIlcygpIGNhbGwgc2FmZVJlbGVhc2VDbG9zZUZyb21DYWxsYmFjaygpIiwgX19mdW5jX18pOworICAgICAgICAvLyBSZWxlYXNlIGFuZCBjbG9zZSB1bmRlciBhIGxvY2sgd2l0aCBubyBjaGVjayBmb3IgY2FsbGJhY2sgY29sbGlzaW9ucy4KKyAgICAgICAgZW5kcG9pbnQtPmdldFN0cmVhbUludGVybmFsKCktPnNhZmVSZWxlYXNlQ2xvc2VGcm9tQ2FsbGJhY2soKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTEzLDM4ICsxMjMsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORAogICAgICAgICAgICAgICAgICAgICAgICAgICAvIGdldFNhbXBsZVJhdGUoKTsKICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwotICAgIC8vIFBhc3MgYSBzbWFydCBwb2ludGVyIHNvIHRoZSB0aHJlYWQgY2FuIGhvbGQgYSByZWZlcmVuY2UuCi0gICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiAqZW5kcG9pbnRGb3JUaHJlYWQgPSBuZXcgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPih0aGlzKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Y3JlYXRlVGhyZWFkKHBlcmlvZE5hbm9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2VuZHBvaW50X3RocmVhZF9wcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRGb3JUaHJlYWQpOworICAgIC8vIFByZXZlbnQgdGhpcyBvYmplY3QgZnJvbSBnZXR0aW5nIGRlbGV0ZWQgYmVmb3JlIHRoZSB0aHJlYWQgaGFzIGEgY2hhbmNlIHRvIGNyZWF0ZQorICAgIC8vIGl0cyBzdHJvbmcgcG9pbnRlci4gQXNzdW1lIHRoZSB0aHJlYWQgd2lsbCBjYWxsIGRlY1N0cm9uZygpLgorICAgIHRoaXMtPmluY1N0cm9uZyhudWxscHRyKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Y3JlYXRlVGhyZWFkX2wocGVyaW9kTmFub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgLy8gVGhlIHRocmVhZCBjYW4ndCBkZWxldGUgaXQgc28gd2UgaGF2ZSB0byBkbyBpdCBoZXJlLgotICAgICAgICBkZWxldGUgZW5kcG9pbnRGb3JUaHJlYWQ7CisgICAgICAgIHRoaXMtPmRlY1N0cm9uZyhudWxscHRyKTsgLy8gQmVjYXVzZSB0aGUgdGhyZWFkIHdvbid0IGRvIGl0LgogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgYWF1ZGlvOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OnN0b3BTaGFyaW5nVGhyZWFkKCkgewogICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5qb2luVGhyZWFkKE5VTEwpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGdldFN0cmVhbUludGVybmFsKCktPmpvaW5UaHJlYWQoTlVMTCk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OnN0YXJ0U3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzaGFyZWRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OnN0YXJ0U3RyZWFtKAorICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2hhcmVkU3RyZWFtLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpCisgICAgICAgIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgICAgIGlmICgrK21SdW5uaW5nU3RyZWFtQ291bnQgPT0gMSkgeyAvLyBhdG9taWMKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdGFydCgpOworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+c3lzdGVtU3RhcnQoKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgLS1tUnVubmluZ1N0cmVhbUNvdW50OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBzdGFydFNoYXJpbmdUaHJlYWRfbCgpOwogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnN5c3RlbVN0b3BGcm9tQXBwKCk7CiAgICAgICAgICAgICAgICAgICAgIC0tbVJ1bm5pbmdTdHJlYW1Db3VudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTgsNyArMTY5LDcgQEAKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIGlmICgtLW1SdW5uaW5nU3RyZWFtQ291bnQgPT0gMCkgeyAvLyBhdG9taWMKICAgICAgICAgICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOwotICAgICAgICAgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7CisgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+c3lzdGVtU3RvcEZyb21BcHAoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE3Myw3ICsxODQsNyBAQAogCiAgICAgaWYgKC0tbVJ1bm5pbmdTdHJlYW1Db3VudCA9PSAwKSB7IC8vIGF0b21pYwogICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOyAvLyB0aGUgc2hhcmluZyB0aHJlYWQgbG9ja3MgbUxvY2tTdHJlYW1zCi0gICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7CisgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnN5c3RlbVN0b3BGcm9tQXBwKCk7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IGJmYzE3NDQuLjgzNTc1NjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG11dGV4PgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgorCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50LmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCIKQEAgLTM1LDEyICszNywxNSBAQAogY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkIDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB7CiAKIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQoQXVkaW9TdHJlYW1JbnRlcm5hbCAqc3RyZWFtSW50ZXJuYWwpOworCisgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkKCkgPSBkZWZhdWx0OwogCiAgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOworICAgIHZvaWQgY2xvc2UoKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIG92ZXJyaWRlOwpAQCAtNTQsMTggKzU5LDE4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAqY2FsbGJhY2tMb29wKCkgPSAwOwogCi1wcm90ZWN0ZWQ6Ci0KICAgICBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TdHJlYW1JbnRlcm5hbDsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JbnRlcm5hbC5nZXQoKTsKICAgICB9OwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgICAgIHN0YXJ0U2hhcmluZ1RocmVhZF9sKCk7Citwcm90ZWN0ZWQ6CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RhcnRTaGFyaW5nVGhyZWFkX2woKSBSRVFVSVJFUyhtTG9ja1N0cmVhbXMpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgICAgIHN0b3BTaGFyaW5nVGhyZWFkKCk7CiAKLSAgICAvLyBwb2ludGVyIHRvIG9iamVjdCBzdGF0aWNhbGx5IGFsbG9jYXRlZCBpbiBzdWJjbGFzc2VzCi0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAgICAgKm1TdHJlYW1JbnRlcm5hbCA9IG51bGxwdHI7CisgICAgLy8gQW4gTU1BUCBzdHJlYW0gdGhhdCBpcyBzaGFyZWQgYnkgbXVsdGlwbGUgY2xpZW50cy4KKyAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbUludGVybmFsPiBtU3RyZWFtSW50ZXJuYWw7CiAKICAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICAgbUNhbGxiYWNrRW5hYmxlZHtmYWxzZX07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAppbmRleCA2NjNkYWUyLi43ZWRjMjVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KIAotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCiAjaW5jbHVkZSAiY29yZS9BdWRpb0dsb2JhbC5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgpAQCAtNDYsOCArNDUsNyBAQAogICovCiAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCi0gICAgICAgIDogbVVwTWVzc2FnZVF1ZXVlKG51bGxwdHIpCi0gICAgICAgICwgbVRpbWVzdGFtcFRocmVhZCgiQUFUaW1lIikKKyAgICAgICAgOiBtVGltZXN0YW1wVGhyZWFkKCJBQVRpbWUiKQogICAgICAgICAsIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAoKQogICAgICAgICAsIG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gLTE7CkBAIC01Niw2ICs1NCw4IEBACiB9CiAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSB7CisgICAgQUxPR0QoIiVzKCkgY2FsbGVkIiwgX19mdW5jX18pOworCiAgICAgLy8gTWF5IG5vdCBiZSBzZXQgaWYgb3BlbiBmYWlsZWQuCiAgICAgaWYgKG1NZXRyaWNzSWQuc2l6ZSgpID4gMCkgewogICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgICAgICB9CiAKLSAgICAgICAgbVVwTWVzc2FnZVF1ZXVlID0gbmV3IFNoYXJlZFJpbmdCdWZmZXIoKTsKKyAgICAgICAgbVVwTWVzc2FnZVF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxTaGFyZWRSaW5nQnVmZmVyPigpOwogICAgICAgICByZXN1bHQgPSBtVXBNZXNzYWdlUXVldWUtPmFsbG9jYXRlKHNpemVvZihBQXVkaW9TZXJ2aWNlTWVzc2FnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFVUVfVVBfQ0FQQUNJVFlfQ09NTUFORFMpOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtMTc5LDYgKzE3OSw4IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogCisgICAgLy8gVGhpcyB3aWxsIGNhbGwgc3RvcFRpbWVzdGFtcFRocmVhZCgpIGFuZCBhbHNvIHN0b3AgdGhlIHN0cmVhbSwKKyAgICAvLyBqdXN0IGluIGNhc2UgaXQgd2FzIG5vdCBhbHJlYWR5IHN0b3BwZWQuCiAgICAgc3RvcF9sKCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwpAQCAtMTk0LDEzICsxOTYsNiBAQAogICAgICAgICBtU2VydmljZUVuZHBvaW50LmNsZWFyKCk7IC8vIGVuZHBvaW50IHdpbGwgaG9sZCB0aGUgcG9pbnRlciBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgogICAgIH0KIAotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7Ci0gICAgICAgIHN0b3BUaW1lc3RhbXBUaHJlYWQoKTsKLSAgICAgICAgZGVsZXRlIG1VcE1lc3NhZ2VRdWV1ZTsKLSAgICAgICAgbVVwTWVzc2FnZVF1ZXVlID0gbnVsbHB0cjsKLSAgICB9Ci0KICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7CiAKICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKQEAgLTUxNCwxMiArNTA5LDggQEAKICAgICAgICAgQUxPR0UoIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlID0gbVVwTWVzc2FnZVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCkKLSAgICAgICAgLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7Ci0gICAgaW50MzJfdCBjYXBhY2l0eSA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpCi0gICAgICAgIC0+Z2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpOwogICAgIC8vIElzIGl0IGhhbGYgZnVsbCBvciBtb3JlCi0gICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZSA+PSAoY2FwYWNpdHkgLyAyKTsKKyAgICByZXR1cm4gbVVwTWVzc2FnZVF1ZXVlLT5nZXRGcmFjdGlvbmFsRnVsbG5lc3MoKSA+PSAwLjU7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6d3JpdGVVcE1lc3NhZ2VRdWV1ZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqY29tbWFuZCkgewpAQCAtNjA0LDE0ICs1OTUsMyBAQAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b25Wb2x1bWVDaGFuZ2VkKGZsb2F0IHZvbHVtZSkgewogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfVk9MVU1FLCB2b2x1bWUpOwogfQotCi1pbnQzMl90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjppbmNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpIHsKLSAgICByZXR1cm4gKyttQ2FsbGluZ0NvdW50OwotfQotCi1pbnQzMl90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkZWNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpIHsKLSAgICBpbnQzMl90IGNvdW50ID0gLS1tQ2FsbGluZ0NvdW50OwotICAgIC8vIEVhY2ggY2FsbCB0byBpbmNyZW1lbnQgc2hvdWxkIGJlIGJhbGFuY2VkIHdpdGggb25lIGNhbGwgdG8gZGVjcmVtZW50LgotICAgIGFzc2VydChjb3VudCA+PSAwKTsKLSAgICByZXR1cm4gY291bnQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAppbmRleCA5NGNjOTgwLi4wZjc1MmI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKQEAgLTIwLDEzICsyMCwxNSBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG11dGV4PgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ2xpZW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiAjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgiCisjaW5jbHVkZSAiY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIApAQCAtMjA4LDI1ICsyMTAsNiBAQAogICAgICAgICByZXR1cm4gbVN1c3BlbmRlZDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2VzIHRvIHRoZSBzdHJlYW0gYnkgQUF1ZGlvU2VydmljZS4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIHVuZGVyIGEgZ2xvYmFsIGxvY2sgaW4gQUF1ZGlvU3RyZWFtVHJhY2tlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdmFsdWUgYWZ0ZXIgdGhlIGluY3JlbWVudAotICAgICAqLwotICAgIGludDMyX3QgaW5jcmVtZW50U2VydmljZVJlZmVyZW5jZUNvdW50X2woKTsKLQotICAgIC8qKgotICAgICAqIEF0b21pY2FsbHkgZGVjcmVtZW50IHRoZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZXMgdG8gdGhlIHN0cmVhbSBieSBBQXVkaW9TZXJ2aWNlLgotICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGluY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudF9sKCkuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIGFmdGVyIHRoZSBkZWNyZW1lbnQKLSAgICAgKi8KLSAgICBpbnQzMl90IGRlY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudF9sKCk7Ci0KICAgICBib29sIGlzQ2xvc2VOZWVkZWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQ2xvc2VOZWVkZWQubG9hZCgpOwogICAgIH0KQEAgLTI0OSwxMSArMjMyLDEwIEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CiAKLSAgICAvLyBUaGVzZSBtdXN0IGJlIGNhbGxlZCB1bmRlciBtTG9jawotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlX2woKTsKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZV9sKCk7Ci0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcF9sKCk7Ci0gICAgdm9pZCBkaXNjb25uZWN0X2woKTsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjbG9zZV9sKCkgUkVRVUlSRVMobUxvY2spOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlX2woKSBSRVFVSVJFUyhtTG9jayk7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcF9sKCkgUkVRVUlSRVMobUxvY2spOworICAgIHZvaWQgZGlzY29ubmVjdF9sKCkgUkVRVUlSRVMobUxvY2spOwogCiAgICAgdm9pZCBzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpOwogCkBAIC0yODQsOCArMjY2LDggQEAKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkQ2xpZW50VGhyZWFkID0gSUxMRUdBTF9USFJFQURfSUQ7CiAKLSAgICBTaGFyZWRSaW5nQnVmZmVyKiAgICAgICBtVXBNZXNzYWdlUXVldWU7CiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlTG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2hhcmVkUmluZ0J1ZmZlcj4gbVVwTWVzc2FnZVF1ZXVlOwogCiAgICAgQUF1ZGlvVGhyZWFkICAgICAgICAgICAgbVRpbWVzdGFtcFRocmVhZDsKICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgb25lIHRocmVhZCB0byB0ZWxsIGFub3RoZXIgdGhyZWFkIHRvIGV4aXQuIFNvIGl0IG11c3QgYmUgYXRvbWljLgpAQCAtMzMxLDE4ICszMTMsMTcgQEAKICAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICBtSGFuZGxlID0gLTE7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUZsb3dpbmcgPSBmYWxzZTsKIAotICAgIC8vIFRoaXMgaXMgbW9kaWZpZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgotICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYWxsaW5nQ291bnQgPSAwOwotCi0gICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHN0cmVhbSB0aGF0IGlzIGJlaW5nIHJlZmVyZW5jZWQgYnkgYSBiaW5kZXIgY2FsbCBuZWVkcyB0byBjbG9zZWQuCi0gICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbUNsb3NlTmVlZGVke2ZhbHNlfTsKKyAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IGEgc3RyZWFtIHRoYXQgaXMgYmVpbmcgcmVmZXJlbmNlZCBieSBhIGJpbmRlciBjYWxsCisgICAgLy8gYW5kIG5lZWRzIHRvIGNsb3NlZC4KKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtQ2xvc2VOZWVkZWR7ZmFsc2V9OyAvLyBUT0RPIHJlbW92ZQogCiAgICAgLy8gVGhpcyBpbmRpY2F0ZSB0aGF0IGEgcnVubmluZyBzdHJlYW0gc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSBvZiBhbiBlcnJvciwKICAgICAvLyBmb3IgZXhhbXBsZSBhIGZ1bGwgbWVzc2FnZSBxdWV1ZS4gTm90ZSB0aGF0IHRoaXMgYXRvbWljIGlzIHVucmVsYXRlZCB0byBtQ2xvc2VOZWVkZWQuCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbVN1c3BlbmRlZHtmYWxzZX07CiAKK3Byb3RlY3RlZDoKICAgICAvLyBMb2NraW5nIG9yZGVyIGlzIGltcG9ydGFudC4KLSAgICAvLyBBbHdheXMgYWNxdWlyZSBtTG9jayBiZWZvcmUgYWNxdWlyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bUxvY2tTdHJlYW1zCisgICAgLy8gQWNxdWlyZSBtTG9jayBiZWZvcmUgYWNxdWlyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bUxvY2tTdHJlYW1zCiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbUxvY2s7IC8vIFByZXZlbnQgc3RhcnQvc3RvcC9jbG9zZSBldGNldGVyYSBmcm9tIGNvbGxpZGluZwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IDU0ZDdkMDYuLjU3ZGMxYWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CkBAIC0xNjIsNyArMTYzLDggQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0vLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigpCisvLyBHZXQgdGltZXN0YW1wIGZyb20gcHJlc2VudGF0aW9uIHBvc2l0aW9uLgorLy8gSWYgaXQgZmFpbHMsIGdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCkKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CiAKQEAgLTE3NCw3ICsxNzYsMTcgQEAKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBzZXJ2aWNlRW5kcG9pbnRNTUFQID0KICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOwogCi0gICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKKyAgICAvLyBEaXNhYmxlIHRoaXMgY29kZSB0ZW1wb3JhcmlseSBiZWNhdXNlIHRoZSBIQUwgaXMgbm90IHJldHVybmluZworICAgIC8vIGEgdXNlZnVsIHJlc3VsdC4KKyNpZiAwCisgICAgdWludDY0X3QgcG9zaXRpb247CisgICAgaWYgKHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEV4dGVybmFsUG9zaXRpb24oJnBvc2l0aW9uLCB0aW1lTmFub3MpID09IEFBVURJT19PSykgeworICAgICAgICBBTE9HRCgiJXMoKSBnZXRFeHRlcm5hbFBvc2l0aW9uKCkgc2F5cyBwb3MgPSAlIiBQUklpNjQgIiwgdGltZSA9ICUiIFBSSWk2NCwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcG9zaXRpb24sICp0aW1lTmFub3MpOworICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSAoaW50NjRfdCkgcG9zaXRpb247CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfSBlbHNlCisjZW5kaWYKICAgICBpZiAobUF0b21pY1N0cmVhbVRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKICAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNTdHJlYW1UaW1lc3RhbXAucmVhZCgpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCmluZGV4IDU5MDI2MTMuLjZiYTE3MjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXRvbWljPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NbWFwU3RyZWFtQ2FsbGJhY2suaD4KQEAgLTM0LDEwICszNSw4IEBACiAjaW5jbHVkZSAiVGltZXN0YW1wU2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgiCiAKLQogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLQogLyoqCiAgKiBUaGVzZSBjb3JyZXNwb25kcyB0byBhbiBFWENMVVNJVkUgbW9kZSBNTUFQIGNsaWVudCBzdHJlYW0uCiAgKiBJdCBoYXMgZXhjbHVzaXZlIHVzZSBvZiBvbmUgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nCkBAIC02OCw5ICs2Nyw5IEBACiAgICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgogICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgogICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlX2woKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2VfbCgpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wX2woKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcF9sKCkgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCAwMWIxYzJlLi5jNjY1Y2RhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMjQsOCArMjQsNiBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgotCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgpAQCAtNTQsMTkgKzUyLDI2IEBACiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAotc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6ZHVtcCgpIGNvbnN0IHsKK3N0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmR1bXAoKSBjb25zdCBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKKyAgICBjb25zdCBib29sIGlzTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKKyAgICAgICAgICAgIFt0aGlzXSgpLT5ib29sIHsgcmV0dXJuIGF1ZGlvRGF0YVF1ZXVlTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCisgICAgICAgICAgICA1MCAvKiB0aW1lcyAqLywKKyAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOworICAgIGlmICghaXNMb2NrZWQpIHsKKyAgICAgICAgcmVzdWx0IDw8ICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkIG1heSBiZSBkZWFkbG9ja2VkXG4iOworICAgIH0KKwogICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpOwogCi0gICAgYXV0byBmaWZvID0gbUF1ZGlvRGF0YVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCk7Ci0gICAgaW50MzJfdCByZWFkQ291bnRlciA9IGZpZm8tPmdldFJlYWRDb3VudGVyKCk7Ci0gICAgaW50MzJfdCB3cml0ZUNvdW50ZXIgPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKLSAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDEwKSA8PCB3cml0ZUNvdW50ZXI7Ci0gICAgcmVzdWx0IDw8IHN0ZDo6c2V0dygxMCkgPDwgcmVhZENvdW50ZXI7Ci0gICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg4KSA8PCAod3JpdGVDb3VudGVyIC0gcmVhZENvdW50ZXIpOworICAgIHJlc3VsdCA8PCBtQXVkaW9EYXRhUXVldWUtPmR1bXAoKTsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDgpIDw8IGdldFhSdW5Db3VudCgpOwogCisgICAgaWYgKGlzTG9ja2VkKSB7CisgICAgICAgIGF1ZGlvRGF0YVF1ZXVlTG9jay51bmxvY2soKTsKKyAgICB9CisKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCkBAIC0xMDUsNyArMTEwLDcgQEAKICAgICB9CiAgICAgaW50MzJfdCBjYXBhY2l0eUluRnJhbWVzID0gbnVtQnVyc3RzICogZnJhbWVzUGVyQnVyc3Q7CiAKLSAgICAvLyBGaW5hbCBzYW5pdHkgY2hlY2suCisgICAgLy8gRmluYWwgcmFuZ2UgY2hlY2suCiAgICAgaWYgKGNhcGFjaXR5SW5GcmFtZXMgPiBNQVhfRlJBTUVTX1BFUl9CVUZGRVIpIHsKICAgICAgICAgQUxPR0UoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgY2FsYyBjYXBhY2l0eSAlZCA+IG1heCAlZCIsCiAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsIE1BWF9GUkFNRVNfUEVSX0JVRkZFUik7CkBAIC0xNzgsOSArMTgzLDkgQEAKICAgICB9CiAKICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BdWRpb0RhdGFRdWV1ZUxvY2spOworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhdWRpb0RhdGFRdWV1ZUxvY2spOwogICAgICAgICAvLyBDcmVhdGUgYXVkaW8gZGF0YSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBmb3IgY2xpZW50LgotICAgICAgICBtQXVkaW9EYXRhUXVldWUgPSBuZXcgU2hhcmVkUmluZ0J1ZmZlcigpOworICAgICAgICBtQXVkaW9EYXRhUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNoYXJlZFJpbmdCdWZmZXI+KCk7CiAgICAgICAgIHJlc3VsdCA9IG1BdWRpb0RhdGFRdWV1ZS0+YWxsb2NhdGUoY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlcygpIGNvdWxkIG5vdCBhbGxvY2F0ZSBGSUZPIHdpdGggJWQgZnJhbWVzIiwKQEAgLTIwMywyNSArMjA4LDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmNsb3NlX2woKSAgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2VfbCgpOwotCi0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQXVkaW9EYXRhUXVldWVMb2NrKTsKLSAgICAgICAgZGVsZXRlIG1BdWRpb0RhdGFRdWV1ZTsKLSAgICAgICAgbUF1ZGlvRGF0YVF1ZXVlID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiAvKioKICAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgY3JlYXRlZCBieSB0aGlzIHNlcnZpY2UuCiAgKi8KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigKICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCiB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYXVkaW9EYXRhUXVldWVMb2NrKTsKICAgICBpZiAobUF1ZGlvRGF0YVF1ZXVlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR1coIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwpAQCAtMjczLDMgKzI2NiwzNyBAQAogICAgICpwb3NpdGlvbkZyYW1lcyA9IHBvc2l0aW9uOwogICAgIHJldHVybiByZXN1bHQ7CiB9CisKK3ZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6d3JpdGVEYXRhSWZSb29tKGludDY0X3QgbW1hcEZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWZmZXIsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50NjRfdCBjbGllbnRGcmFtZXNXcml0dGVuID0gMDsKKworICAgIC8vIExvY2sgdGhlIEF1ZGlvRmlmbyB0byBwcm90ZWN0IGFnYWluc3QgY2xvc2UuCisgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKGF1ZGlvRGF0YVF1ZXVlTG9jayk7CisKKyAgICBpZiAobUF1ZGlvRGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZm9CdWZmZXI+IGZpZm8gPSBtQXVkaW9EYXRhUXVldWUtPmdldEZpZm9CdWZmZXIoKTsKKyAgICAgICAgLy8gRGV0ZXJtaW5lIG9mZnNldCBiZXR3ZWVuIGZyYW1lUG9zaXRpb24gaW4gY2xpZW50J3Mgc3RyZWFtCisgICAgICAgIC8vIHZzIHRoZSB1bmRlcmx5aW5nIE1NQVAgc3RyZWFtLgorICAgICAgICBjbGllbnRGcmFtZXNXcml0dGVuID0gZmlmby0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgICAgIC8vIFRoZXJlIGFyZSB0d28gaW5kaWNlcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGZyYW1lLgorICAgICAgICBpbnQ2NF90IHBvc2l0aW9uT2Zmc2V0ID0gbW1hcEZyYW1lc1JlYWQgLSBjbGllbnRGcmFtZXNXcml0dGVuOworICAgICAgICBzZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7CisKKyAgICAgICAgLy8gSXMgdGhlIGJ1ZmZlciB0b28gZnVsbCB0byB3cml0ZSBhIGJ1cnN0PworICAgICAgICBpZiAoZmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKKyAgICAgICAgICAgIGluY3JlbWVudFhSdW5Db3VudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlmby0+d3JpdGUoYnVmZmVyLCBudW1GcmFtZXMpOworICAgICAgICB9CisgICAgICAgIGNsaWVudEZyYW1lc1dyaXR0ZW4gPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKKyAgICB9CisKKyAgICBpZiAoY2xpZW50RnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgLy8gVGhpcyB0aW1lc3RhbXAgcmVwcmVzZW50cyB0aGUgY29tcGxldGlvbiBvZiBkYXRhIGJlaW5nIHdyaXR0ZW4gaW50byB0aGUKKyAgICAgICAgLy8gY2xpZW50IGJ1ZmZlci4gSXQgaXMgc2VudCB0byB0aGUgY2xpZW50IGFuZCB1c2VkIGluIHRoZSB0aW1pbmcgbW9kZWwKKyAgICAgICAgLy8gdG8gZGVjaWRlIHdoZW4gZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSB0byByZWFkLgorICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKGNsaWVudEZyYW1lc1dyaXR0ZW4sIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworICAgICAgICBtYXJrVHJhbnNmZXJUaW1lKHRpbWVzdGFtcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCmluZGV4IGFiY2I3ODIuLjRmYWU1YjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKQEAgLTUyLDIzICs1MiwxNiBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZV9sKCkgb3ZlcnJpZGU7CisgICAgdm9pZCB3cml0ZURhdGFJZlJvb20oaW50NjRfdCBtbWFwRnJhbWVzUmVhZCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcyk7CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG11c3QgYmUgbG9ja2VkIHdoZW4gY2FsbGluZyBnZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKSBhbmQgd2hpbGUKLSAgICAgKiB1c2luZyB0aGUgRmlmb0J1ZmZlciBpdCByZXR1cm5zLgotICAgICAqLwotICAgIHN0ZDo6bXV0ZXggJmdldEF1ZGlvRGF0YVF1ZXVlTG9jaygpIHsKLSAgICAgICAgcmV0dXJuIG1BdWRpb0RhdGFRdWV1ZUxvY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbCB1bmRlciBnZXRBdWRpb0RhdGFRdWV1ZUxvY2soKS4KKyAgICAgKiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgdW5kZXIgZ2V0QXVkaW9EYXRhUXVldWVMb2NrKCkuCiAgICAgICogQHJldHVybgogICAgICAqLwotICAgIGFuZHJvaWQ6OkZpZm9CdWZmZXIgKmdldEF1ZGlvRGF0YUZpZm9CdWZmZXJfbCgpIHsgcmV0dXJuIChtQXVkaW9EYXRhUXVldWUgPT0gbnVsbHB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbHB0cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQXVkaW9EYXRhUXVldWUtPmdldEZpZm9CdWZmZXIoKTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxTaGFyZWRSaW5nQnVmZmVyPiBnZXRBdWRpb0RhdGFRdWV1ZV9sKCkKKyAgICAgICAgICAgIFJFUVVJUkVTKGF1ZGlvRGF0YVF1ZXVlTG9jaykgeworICAgICAgICByZXR1cm4gbUF1ZGlvRGF0YVF1ZXVlOworICAgIH0KIAogICAgIC8qIEtlZXAgYSByZWNvcmQgb2Ygd2hlbiBhIGJ1ZmZlciB0cmFuc2ZlciBjb21wbGV0ZWQuCiAgICAgICogVGhpcyBhbGxvd3MgZm9yIGEgbW9yZSBhY2N1cmF0ZSB0aW1pbmcgbW9kZWwuCkBAIC04OSw2ICs4MiwxMCBAQAogCiAgICAgY29uc3QgY2hhciAqZ2V0VHlwZVRleHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiU2hhcmVkIjsgfQogCisgICAgLy8gVGhpcyBpcyBwdWJsaWMgc28gdGhhdCB0aGUgdGhyZWFkIHNhZmV0eSBhbm5vdGF0aW9uLCBHVUFSREVEX0JZKCksCisgICAgLy8gQ2FuIHdvcmsgd2hlbiBhbm90aGVyIG9iamVjdCB0YWtlcyB0aGUgbG9jay4KKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICBhdWRpb0RhdGFRdWV1ZUxvY2s7CisKIHByb3RlY3RlZDoKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CkBAIC0xMDYsOCArMTAzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCk7CiAKIHByaXZhdGU6Ci0gICAgU2hhcmVkUmluZ0J1ZmZlciAgICAgICAgKm1BdWRpb0RhdGFRdWV1ZSA9IG51bGxwdHI7IC8vIHByb3RlY3RlZCBieSBtQXVkaW9EYXRhUXVldWVMb2NrCi0gICAgc3RkOjptdXRleCAgICAgICAgICAgICAgIG1BdWRpb0RhdGFRdWV1ZUxvY2s7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2hhcmVkUmluZ0J1ZmZlcj4gbUF1ZGlvRGF0YVF1ZXVlIEdVQVJERURfQlkoYXVkaW9EYXRhUXVldWVMb2NrKTsKIAogICAgIHN0ZDo6YXRvbWljPGludDY0X3Q+ICAgICBtVGltZXN0YW1wUG9zaXRpb25PZmZzZXQ7CiAgICAgc3RkOjphdG9taWM8aW50MzJfdD4gICAgIG1YUnVuQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCmluZGV4IDhlNjZiOTQuLjliYmJjNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCkBAIC05Niw3ICs5Niw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RkOjpzdHJpbmcgQUF1ZGlvU3RyZWFtVHJhY2tlcjo6ZHVtcCgpIGNvbnN0IHsKK3N0ZDo6c3RyaW5nIEFBdWRpb1N0cmVhbVRyYWNrZXI6OmR1bXAoKSBjb25zdCBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAgICAgY29uc3QgYm9vbCBpc0xvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCiAgICAgICAgICAgICBbdGhpc10oKS0+Ym9vbCB7IHJldHVybiBtSGFuZGxlTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmgKaW5kZXggZDEzMDFhMi4uNDM4NzBmYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaApAQCAtMTcsMTMgKzE3LDEzIEBACiAjaWZuZGVmIEFBVURJT19BQVVESU9fU1RSRUFNX1RSQUNLRVJfSAogI2RlZmluZSBBQVVESU9fQUFVRElPX1NUUkVBTV9UUkFDS0VSX0gKIAorI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9Db21tb24uaCIKLQogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAKIG5hbWVzcGFjZSBhYXVkaW8gewpAQCAtNzUsMTEgKzc1LDEwIEBACiAgICAgc3RhdGljIGFhdWRpb19oYW5kbGVfdCBidW1wSGFuZGxlKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgLy8gVHJhY2sgc3RyZWFtIHVzaW5nIGEgdW5pcXVlIGhhbmRsZSB0aGF0IHdyYXBzLiBPbmx5IHVzZSBwb3NpdGl2ZSBoYWxmLgotICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICBtSGFuZGxlTG9jazsKLSAgICAvLyBwcm90ZWN0ZWQgYnkgbUhhbmRsZUxvY2sKLSAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzSGFuZGxlID0gMDsKLSAgICAvLyBwcm90ZWN0ZWQgYnkgbUhhbmRsZUxvY2sKLSAgICBzdGQ6Om1hcDxhYXVkaW9faGFuZGxlX3QsIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+PiBtU3RyZWFtc0J5SGFuZGxlOworICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgIG1IYW5kbGVMb2NrOworICAgIGFhdWRpb19oYW5kbGVfdCAgICAgICAgICAgICAgIG1QcmV2aW91c0hhbmRsZSBHVUFSREVEX0JZKG1IYW5kbGVMb2NrKSA9IDA7CisgICAgc3RkOjptYXA8YWF1ZGlvX2hhbmRsZV90LCBhbmRyb2lkOjpzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4KKyAgICAgICAgICAgIG1TdHJlYW1zQnlIYW5kbGUgR1VBUkRFRF9CWShtSGFuZGxlTG9jayk7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCmluZGV4IGVkNzg5NWIuLjY4NDk2YWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcApAQCAtMzcsMTAgKzM3LDEzIEBACiAgICAgc2V0dXAoIkFBdWRpbyIpOwogfQogCi12b2lkIEFBdWRpb1RocmVhZDo6c2V0dXAoY29uc3QgY2hhciAqcHJlZml4KSB7Ci0gICAgLy8gbVRocmVhZCBpcyBhIHB0aHJlYWRfdCBvZiB1bmtub3duIHNpemUgc28gd2UgbmVlZCBtZW1zZXQoKS4KLSAgICBtZW1zZXQoJm1UaHJlYWQsIDAsIHNpemVvZihtVGhyZWFkKSk7CitBQXVkaW9UaHJlYWQ6On5BQXVkaW9UaHJlYWQoKSB7CisgICAgQUxPR0VfSUYocHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgbVRocmVhZCksCisgICAgICAgICAgICAiJXMoKSBkZXN0cnVjdG9yIHJ1bm5pbmcgaW4gdGhyZWFkIiwgX19mdW5jX18pOworICAgIEFMT0dFX0lGKG1IYXNUaHJlYWQsICIlcygpIHRocmVhZCBuZXZlciBqb2luZWQiLCBfX2Z1bmNfXyk7Cit9CiAKK3ZvaWQgQUF1ZGlvVGhyZWFkOjpzZXR1cChjb25zdCBjaGFyICpwcmVmaXgpIHsKICAgICAvLyBOYW1lIHRoZSB0aHJlYWQgd2l0aCBhbiBpbmNyZWFzaW5nIGluZGV4LCAicHJlZml4XyMiLCBmb3IgZGVidWdnaW5nLgogICAgIHVpbnQzMl90IGluZGV4ID0gbU5leHRUaHJlYWRJbmRleCsrOwogICAgIC8vIFdyYXAgdGhlIGluZGV4IHNvIHRoYXQgd2UgZG8gbm90IGhpdCB0aGUgMTYgY2hhciBsaW1pdApAQCAtNTcsNyArNjAsNyBAQAogICAgIH0KIH0KIAotLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBuZXcgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlVGhyZWFkKCkuCisvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIG5ldyB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVUaHJlYWRfbCgpLgogLy8gSXQgY29udmVydHMgdGhlICdDJyBmdW5jdGlvbiBjYWxsIHRvIGEgQysrIG1ldGhvZCBjYWxsLgogc3RhdGljIHZvaWQgKiBBQXVkaW9UaHJlYWRfaW50ZXJuYWxUaHJlYWRQcm9jKHZvaWQgKmFyZykgewogICAgIEFBdWRpb1RocmVhZCAqYWF1ZGlvVGhyZWFkID0gKEFBdWRpb1RocmVhZCAqKSBhcmc7CkBAIC05MCwxMyArOTMsMTggQEAKICAgICAgICAgQUxPR0UoInN0b3AoKSBidXQgbm8gdGhyZWFkIHJ1bm5pbmciKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHRocmVhZCBpcyB0cnlpbmcgdG8gc3RvcCBpdHNlbGYuCisgICAgaWYgKHB0aHJlYWRfZXF1YWwocHRocmVhZF9zZWxmKCksIG1UaHJlYWQpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGF0dGVtcHQgdG8gcHRocmVhZF9qb2luKCkgZnJvbSBsYXVuY2hlZCB0aHJlYWQhIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKwogICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgbnVsbHB0cik7Ci0gICAgbUhhc1RocmVhZCA9IGZhbHNlOwogICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgICBBTE9HRSgic3RvcCgpIC0gcHRocmVhZF9qb2luKCkgcmV0dXJuZWQgJWQgJXMiLCBlcnIsIHN0cmVycm9yKGVycikpOwogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycik7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAppbmRleCBkY2NlNjhhLi4wOGE4YTk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaApAQCAtNDYsNyArNDYsNyBAQAogCiAgICAgZXhwbGljaXQgQUF1ZGlvVGhyZWFkKGNvbnN0IGNoYXIgKnByZWZpeCk7CiAKLSAgICB2aXJ0dWFsIH5BQXVkaW9UaHJlYWQoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+QUF1ZGlvVGhyZWFkKCk7CiAKICAgICAvKioKICAgICAgKiBTdGFydCB0aGUgdGhyZWFkIHJ1bm5pbmcuCkBAIC03Myw3ICs3Myw3IEBACiAKICAgICBSdW5uYWJsZSAgICAqbVJ1bm5hYmxlID0gbnVsbHB0cjsKICAgICBib29sICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHB0aHJlYWRfdCAgICBtVGhyZWFkOyAvLyBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgorICAgIHB0aHJlYWRfdCAgICBtVGhyZWFkID0ge307CiAKICAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDMyX3Q+IG1OZXh0VGhyZWFkSW5kZXg7CiAgICAgY2hhciAgICAgICAgIG1OYW1lWzE2XTsgLy8gbWF4IGxlbmd0aCBmb3IgYSBwdGhyZWFkX25hbWUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDhiMWUyYzAuLjgwZjE3ZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5icApAQCAtMzcsNiArMzcsNyBAQAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XdGhyZWFkLXNhZmV0eSIsCiAgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCkBAIC01NSw2ICs1NiwxMSBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhYXVkaW8tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhYXVkaW9faW50ZXJuYWwiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCmluZGV4IGM0M2VkMjIuLjc4ZDQ4ODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiU2hhcmVkTWVtb3J5UHJveHkuaCIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKaW5kZXggMjQ1NDQ0Ni4uYzFkNGUxNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKQEAgLTE4LDYgKzE4LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaCIKQEAgLTMwLDggKzMyLDggQEAKIAogU2hhcmVkUmluZ0J1ZmZlcjo6flNoYXJlZFJpbmdCdWZmZXIoKQogeworICAgIG1GaWZvQnVmZmVyLnJlc2V0KCk7IC8vIHVzZXMgbVNoYXJlZE1lbW9yeQogICAgIGlmIChtU2hhcmVkTWVtb3J5ICE9IG51bGxwdHIpIHsKLSAgICAgICAgZGVsZXRlIG1GaWZvQnVmZmVyOwogICAgICAgICBtdW5tYXAobVNoYXJlZE1lbW9yeSwgbVNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzKTsKICAgICAgICAgbVNoYXJlZE1lbW9yeSA9IG51bGxwdHI7CiAgICAgfQpAQCAtNTgsMTYgKzYwLDE4IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gY29udmVydCBlcnJubyB0byBhIGJldHRlciBBQVVESU9fRVJST1I7CiAgICAgfQogCi0gICAgLy8gTWFwIHRoZSBmZCB0byBtZW1vcnkgYWRkcmVzc2VzLgotICAgIG1TaGFyZWRNZW1vcnkgPSAodWludDhfdCAqKSBtbWFwKDAsIG1TaGFyZWRNZW1vcnlTaXplSW5CeXRlcywKKyAgICAvLyBNYXAgdGhlIGZkIHRvIG1lbW9yeSBhZGRyZXNzZXMuIFVzZSBhIHRlbXBvcmFyeSBwb2ludGVyIHRvIGtlZXAgdGhlIG1tYXAgcmVzdWx0IGFuZCB1cGRhdGUKKyAgICAvLyBpdCB0byBgbVNoYXJlZE1lbW9yeWAgb25seSB3aGVuIG1tYXAgb3BlcmF0ZSBzdWNjZXNzZnVsbHkuCisgICAgdWludDhfdCogdG1wUHRyID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZURlc2NyaXB0b3IuZ2V0KCksIDApOwotICAgIGlmIChtU2hhcmVkTWVtb3J5ID09IE1BUF9GQUlMRUQpIHsKKyAgICBpZiAodG1wUHRyID09IE1BUF9GQUlMRUQpIHsKICAgICAgICAgQUxPR0UoImFsbG9jYXRlKCkgbW1hcCgpIGZhaWxlZCAlZCIsIGVycm5vKTsKICAgICAgICAgbUZpbGVEZXNjcmlwdG9yLnJlc2V0KCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gY29udmVydCBlcnJubyB0byBhIGJldHRlciBBQVVESU9fRVJST1I7CiAgICAgfQorICAgIG1TaGFyZWRNZW1vcnkgPSB0bXBQdHI7CiAKICAgICAvLyBHZXQgYWRkcmVzc2VzIGZvciBvdXIgY291bnRlcnMgYW5kIGRhdGEgZnJvbSB0aGUgc2hhcmVkIG1lbW9yeS4KICAgICBmaWZvX2NvdW50ZXJfdCAqcmVhZENvdW50ZXJBZGRyZXNzID0KQEAgLTc2LDcgKzgwLDcgQEAKICAgICAgICAgICAgIChmaWZvX2NvdW50ZXJfdCAqKSAmbVNoYXJlZE1lbW9yeVtTSEFSRURfUklOR0JVRkZFUl9XUklURV9PRkZTRVRdOwogICAgIHVpbnQ4X3QgKmRhdGFBZGRyZXNzID0gJm1TaGFyZWRNZW1vcnlbU0hBUkVEX1JJTkdCVUZGRVJfREFUQV9PRkZTRVRdOwogCi0gICAgbUZpZm9CdWZmZXIgPSBuZXcgRmlmb0J1ZmZlcihieXRlc1BlckZyYW1lLCBjYXBhY2l0eUluRnJhbWVzLAorICAgIG1GaWZvQnVmZmVyID0gc3RkOjptYWtlX3NoYXJlZDxGaWZvQnVmZmVySW5kaXJlY3Q+KGJ5dGVzUGVyRnJhbWUsIGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQ291bnRlckFkZHJlc3MsIHdyaXRlQ291bnRlckFkZHJlc3MsIGRhdGFBZGRyZXNzKTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQpAQCAtOTQsMyArOTgsMTkgQEAKICAgICByaW5nQnVmZmVyUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdCgxKTsKICAgICByaW5nQnVmZmVyUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKG1DYXBhY2l0eUluRnJhbWVzKTsKIH0KKworZG91YmxlIFNoYXJlZFJpbmdCdWZmZXI6OmdldEZyYWN0aW9uYWxGdWxsbmVzcygpIGNvbnN0IHsKKyAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICBpbnQzMl90IGNhcGFjaXR5ID0gbUZpZm9CdWZmZXItPmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKKyAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZSAvIChkb3VibGUpIGNhcGFjaXR5OworfQorCitzdGQ6OnN0cmluZyBTaGFyZWRSaW5nQnVmZmVyOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICBpbnQzMl90IHJlYWRDb3VudGVyID0gbUZpZm9CdWZmZXItPmdldFJlYWRDb3VudGVyKCk7CisgICAgaW50MzJfdCB3cml0ZUNvdW50ZXIgPSBtRmlmb0J1ZmZlci0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dygxMCkgPDwgd3JpdGVDb3VudGVyOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoMTApIDw8IHJlYWRDb3VudGVyOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoOCkgPDwgKHdyaXRlQ291bnRlciAtIHJlYWRDb3VudGVyKTsKKyAgICByZXR1cm4gcmVzdWx0LnN0cigpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5oCmluZGV4IDc5MTY5YmMuLmMzYTliYjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmgKQEAgLTE4LDggKzE4LDkgQEAKICNkZWZpbmUgQUFVRElPX1NIQVJFRF9SSU5HQlVGRkVSX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAKICNpbmNsdWRlICJmaWZvL0ZpZm9CdWZmZXIuaCIKQEAgLTQ3LDE1ICs0OCwyNSBAQAogICAgIHZvaWQgZmlsbFBhcmNlbGFibGUoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50UGFyY2VsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFJpbmdCdWZmZXJQYXJjZWxhYmxlICZyaW5nQnVmZmVyUGFyY2VsYWJsZSk7CiAKLSAgICBhbmRyb2lkOjpGaWZvQnVmZmVyICogZ2V0Rmlmb0J1ZmZlcigpIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXZhaWxhYmxlIGZyYW1lcyBhcyBhIGZyYWN0aW9uIG9mIHRoZSBjYXBhY2l0eS4KKyAgICAgKiBAcmV0dXJuIGZ1bGxuZXNzIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAgICAgKi8KKyAgICBkb3VibGUgZ2V0RnJhY3Rpb25hbEZ1bGxuZXNzKCkgY29uc3Q7CisKKyAgICAvLyBkdW1wOiB3cml0ZSMgcmVhZCMgYXZhaWxhYmxlCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkZpZm9CdWZmZXI+IGdldEZpZm9CdWZmZXIoKSB7CiAgICAgICAgIHJldHVybiBtRmlmb0J1ZmZlcjsKICAgICB9CiAKIHByaXZhdGU6CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICBtRmlsZURlc2NyaXB0b3I7Ci0gICAgYW5kcm9pZDo6Rmlmb0J1ZmZlciAgICAgICptRmlmb0J1ZmZlciA9IG51bGxwdHI7Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgICptU2hhcmVkTWVtb3J5ID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Rmlmb0J1ZmZlckluZGlyZWN0PiAgbUZpZm9CdWZmZXI7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICptU2hhcmVkTWVtb3J5ID0gbnVsbHB0cjsgLy8gbW1hcAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgbVNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzID0gMDsKKyAgICAvLyBzaXplIG9mIG1lbW9yeSB1c2VkIGZvciBkYXRhIHZzIGNvdW50ZXJzCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBtRGF0YU1lbW9yeVNpemVJbkJ5dGVzID0gMDsKICAgICBhbmRyb2lkOjpmaWZvX2ZyYW1lc190ICAgIG1DYXBhY2l0eUluRnJhbWVzID0gMDsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9BbmRyb2lkLmJwIGIvc2VydmljZXMvdHVuZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWQ4ZDQxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwMSBAQAorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAidHZfdHVuZXJfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kQ2FsbGJhY2suYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyU2VydmljZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckF0c2MzUGxwSW5mby5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhcGFiaWxpdGllcy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllcy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjU2V0dGluZ3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic1NldHRpbmdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTZXR0aW5ncy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU3RhdHVzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyU2VydmljZUZyb250ZW5kSW5mby5haWRsIiwKKyAgICBdLAorICAgIHBhdGg6ICJhaWRsIiwKK30KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZSIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICI6dHZfdHVuZXJfYWlkbCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnR1bmVyc2VydmljZSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJUdW5lclNlcnZpY2UuY3BwIiwKKyAgICAgICAgIlR1bmVyRnJvbnRlbmQuY3BwIgorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lckAxLjAiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQorCisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogIm1lZGlhdHVuZXIiLAorCisgICAgc3JjczogWworICAgICAgICAibWFpbl90dW5lcnNlcnZpY2UuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ0dW5lcnNlcnZpY2UiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAidHZfdHVuZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJtZWRpYXR1bmVyLnJjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9PV05FUlMgYi9zZXJ2aWNlcy90dW5lci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlYjhlOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK25jaGFsa29AZ29vZ2xlLmNvbQorcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQ1NTNiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5jcHAKQEAgLTAsMCArMSw0NjMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVyRnJvbnRlbmQiCisKKyNpbmNsdWRlICJUdW5lckZyb250ZW5kLmgiCisjaW5jbHVkZSAiVHVuZXJTZXJ2aWNlLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJBdHNjM1BscEluZm87Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEFuYWxvZ1NpZlN0YW5kYXJkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEFuYWxvZ1R5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzY01vZHVsYXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNCYW5kd2lkdGg7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNDb2RlUmF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM0RlbW9kT3V0cHV0Rm9ybWF0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzRmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjQW5uZXg7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY01vZHVsYXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY091dGVyRmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNTcGVjdHJhbEludmVyc2lvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzUGlsb3Q7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1JvbGxvZmY7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1NldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNTdGFuZGFyZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzVmNtTW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0QmFuZHdpZHRoOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRDb2RlcmF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0R3VhcmRJbnRlcnZhbDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0SGllcmFyY2h5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRQbHBNb2RlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0U3RhbmRhcmQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSW5uZXJGZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzQ29kZXJhdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNSb2xsb2ZmOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM1NldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzQ29kZXJhdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNNb2R1bGF0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzUm9sbG9mZjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1NldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0QmFuZHdpZHRoOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0Q29kZXJhdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0TW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidE1vZHVsYXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5UeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNldHRpbmdzOzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1R1bmVyRnJvbnRlbmQ6OlR1bmVyRnJvbnRlbmQoc3A8SVR1bmVyPiB0dW5lciwgaW50IGZyb250ZW5kSGFuZGxlKSB7CisgICAgbVR1bmVyID0gdHVuZXI7CisgICAgbUlkID0gVHVuZXJTZXJ2aWNlOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShmcm9udGVuZEhhbmRsZSk7CisKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgUmVzdWx0IHN0YXR1czsKKyAgICAgICAgbVR1bmVyLT5vcGVuRnJvbnRlbmRCeUlkKG1JZCwgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPElGcm9udGVuZD4mIGZyb250ZW5kKSB7CisgICAgICAgICAgICBtRnJvbnRlbmQgPSBmcm9udGVuZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlc3VsdDsKKyAgICAgICAgfSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICBtRnJvbnRlbmQgPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCitUdW5lckZyb250ZW5kOjp+VHVuZXJGcm9udGVuZCgpIHt9CisKK1N0YXR1cyBUdW5lckZyb250ZW5kOjpzZXRDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiB0dW5lckZyb250ZW5kQ2FsbGJhY2spIHsKKyAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAodHVuZXJGcm9udGVuZENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPElGcm9udGVuZENhbGxiYWNrPiBmcm9udGVuZENhbGxiYWNrID0gbmV3IEZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKTsKKyAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zZXRDYWxsYmFjayhmcm9udGVuZENhbGxiYWNrKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnR1bmUoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiAvKnNldHRpbmdzKi8pIHsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJGcm9udGVuZDo6c3RvcFR1bmUoKSB7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNjYW4oY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywgaW50IGZyb250ZW5kU2NhblR5cGUpIHsKKyAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBGcm9udGVuZFNldHRpbmdzIGZyb250ZW5kU2V0dGluZ3M7CisgICAgc3dpdGNoIChzZXR0aW5ncy5nZXRUYWcoKSkgeworICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6YW5hbG9nOgorICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5hbmFsb2coeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjphbmFsb2c+KCkuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAudHlwZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kQW5hbG9nVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjphbmFsb2c+KCkuc2lnbmFsVHlwZSksCisgICAgICAgICAgICAgICAgLnNpZlN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjphbmFsb2c+KCkuc2lmU3RhbmRhcmQpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kU2V0dGluZ3M6OmF0c2M6CisgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmF0c2MoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjphdHNjPigpLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2NNb2R1bGF0aW9uPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmF0c2M+KCkubW9kdWxhdGlvbiksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6YXRzYzM6CisgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmF0c2MzKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6YXRzYzM+KCkuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM0JhbmR3aWR0aD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjphdHNjMz4oKS5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5kZW1vZE91dHB1dEZvcm1hdCA9IHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNEZW1vZE91dHB1dEZvcm1hdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjphdHNjMz4oKS5kZW1vZE91dHB1dEZvcm1hdCksCisgICAgICAgICAgICAgICAgLnBscFNldHRpbmdzID0gZ2V0QXRzYzNQbHBTZXR0aW5ncyhzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjphdHNjMz4oKSksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6Y2FibGU6CisgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmR2YmMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpjYWJsZT4oKS5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjTW9kdWxhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpjYWJsZT4oKS5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuZmVjID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJbm5lckZlYz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpjYWJsZT4oKS5pbm5lckZlYyksCisgICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpjYWJsZT4oKS5zeW1ib2xSYXRlKSwKKyAgICAgICAgICAgICAgICAub3V0ZXJGZWMgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNPdXRlckZlYz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpjYWJsZT4oKS5vdXRlckZlYyksCisgICAgICAgICAgICAgICAgLmFubmV4ID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjQW5uZXg+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6Y2FibGU+KCkuYW5uZXgpLAorICAgICAgICAgICAgICAgIC5zcGVjdHJhbEludmVyc2lvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY1NwZWN0cmFsSW52ZXJzaW9uPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmNhYmxlPigpLnNwZWN0cmFsSW52ZXJzaW9uKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFNldHRpbmdzOjpkdmJzOgorICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5kdmJzKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZicz4oKS5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzTW9kdWxhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpkdmJzPigpLm1vZHVsYXRpb24pLAorICAgICAgICAgICAgICAgIC5jb2RlcmF0ZSA9IGdldER2YnNDb2RlUmF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmR2YnM+KCkuY29kZVJhdGUpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZicz4oKS5zeW1ib2xSYXRlKSwKKyAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1JvbGxvZmY+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZicz4oKS5yb2xsb2ZmKSwKKyAgICAgICAgICAgICAgICAucGlsb3QgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNQaWxvdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpkdmJzPigpLnBpbG90KSwKKyAgICAgICAgICAgICAgICAuaW5wdXRTdHJlYW1JZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmR2YnM+KCkuaW5wdXRTdHJlYW1JZCksCisgICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzU3RhbmRhcmQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZicz4oKS5zdGFuZGFyZCksCisgICAgICAgICAgICAgICAgLnZjbU1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNWY21Nb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmR2YnM+KCkudmNtKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFNldHRpbmdzOjpkdmJ0OgorICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5kdmJ0KHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZidD4oKS5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0VHJhbnNtaXNzaW9uTW9kZT4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpkdmJ0PigpLnRyYW5zbWlzc2lvbk1vZGUpLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRCYW5kd2lkdGg+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZidD4oKS5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpkdmJ0PigpLmNvbnN0ZWxsYXRpb24pLAorICAgICAgICAgICAgICAgIC5oaWVyYXJjaHkgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRIaWVyYXJjaHk+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZidD4oKS5oaWVyYXJjaHkpLAorICAgICAgICAgICAgICAgIC5ocENvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29kZXJhdGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZidD4oKS5ocENvZGVSYXRlKSwKKyAgICAgICAgICAgICAgICAubHBDb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidENvZGVyYXRlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmR2YnQ+KCkubHBDb2RlUmF0ZSksCisgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRHdWFyZEludGVydmFsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmR2YnQ+KCkuZ3VhcmRJbnRlcnZhbCksCisgICAgICAgICAgICAgICAgLmlzSGlnaFByaW9yaXR5ID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZidD4oKS5pc0hpZ2hQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRTdGFuZGFyZD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpkdmJ0PigpLnN0YW5kYXJkKSwKKyAgICAgICAgICAgICAgICAuaXNNaXNvID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZidD4oKS5pc01pc28sCisgICAgICAgICAgICAgICAgLnBscE1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRQbHBNb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmR2YnQ+KCkucGxwTW9kZSksCisgICAgICAgICAgICAgICAgLnBscElkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjpkdmJ0PigpLnBscElkKSwKKyAgICAgICAgICAgICAgICAucGxwR3JvdXBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6ZHZidD4oKS5wbHBHcm91cElkKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFNldHRpbmdzOjppc2RiczoKKyAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuaXNkYnMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjppc2Ricz4oKS5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJzPigpLnN0cmVhbUlkKSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWRUeXBlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjppc2Ricz4oKS5zdHJlYW1JZFR5cGUpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric01vZHVsYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6aXNkYnM+KCkubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric0NvZGVyYXRlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJzPigpLmNvZGVSYXRlKSwKKyAgICAgICAgICAgICAgICAuc3ltYm9sUmF0ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJzPigpLnN5bWJvbFJhdGUpLAorICAgICAgICAgICAgICAgIC5yb2xsb2ZmID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric1JvbGxvZmY+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6aXNkYnM+KCkucm9sbG9mZiksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6aXNkYnMzOgorICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5pc2RiczMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjppc2RiczM+KCkuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjppc2RiczM+KCkuc3RyZWFtSWQpLAorICAgICAgICAgICAgICAgIC5zdHJlYW1JZFR5cGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJzMz4oKS5zdHJlYW1JZFR5cGUpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJzMz4oKS5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM0NvZGVyYXRlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJzMz4oKS5jb2RlUmF0ZSksCisgICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjppc2RiczM+KCkuc3ltYm9sUmF0ZSksCisgICAgICAgICAgICAgICAgLnJvbGxvZmYgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM1JvbGxvZmY+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6aXNkYnMzPigpLnJvbGxvZmYpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJ0OgorICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5pc2RidCh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJ0PigpLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjppc2RidD4oKS5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidEJhbmR3aWR0aD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFNldHRpbmdzOjppc2RidD4oKS5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5tb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidE1vZGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6aXNkYnQ+KCkubW9kZSksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidENvZGVyYXRlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJ0PigpLmNvZGVSYXRlKSwKKyAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbCA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kU2V0dGluZ3M6OmlzZGJ0PigpLmd1YXJkSW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIC5zZXJ2aWNlQXJlYUlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRTZXR0aW5nczo6aXNkYnQ+KCkuc2VydmljZUFyZWFJZCksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNjYW4oCisgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLCBzdGF0aWNfY2FzdDxGcm9udGVuZFNjYW5UeXBlPihmcm9udGVuZFNjYW5UeXBlKSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKK1N0YXR1cyBUdW5lckZyb250ZW5kOjpzdG9wU2NhbigpIHsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJGcm9udGVuZDo6c2V0TG5iKGludCAvKmxuYkhhbmRsZSovKSB7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldExuYShib29sIC8qYkVuYWJsZSovKSB7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmNsb3NlKCkgeworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRTdGF0dXMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIC8qc3RhdHVzVHlwZXMqLywKKwkJc3RkOjp2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1cz4qIC8qX2FpZGxfcmV0dXJuKi8pIHsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCisvLy8vLy8vLy8vLy8vLy8gRnJvbnRlbmRDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitSZXR1cm48dm9pZD4gVHVuZXJGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25FdmVudChGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSkgeworICAgIEFMT0dEKCJGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50LCB0eXBlPSVkIiwgZnJvbnRlbmRFdmVudFR5cGUpOworICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uRXZlbnQoKGludClmcm9udGVuZEV2ZW50VHlwZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IFR1bmVyRnJvbnRlbmQ6OkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2UoCisgICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlIHR5cGUsIGNvbnN0IEZyb250ZW5kU2Nhbk1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgICBBTE9HRCgiRnJvbnRlbmRDYWxsYmFjazo6b25TY2FuTWVzc2FnZSwgdHlwZT0lZCIsIHR5cGUpOworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkxPQ0tFRDogeworICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaXNMb2NrZWQoKSkgeworICAgICAgICAgICAgICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpFTkQ6IHsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLmlzRW5kKCkpIHsKKyAgICAgICAgICAgICAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vblNjYW5TdG9wcGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpQUk9HUkVTU19QRVJDRU5UOiB7CisgICAgICAgICAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vblByb2dyZXNzKChpbnQpbWVzc2FnZS5wcm9ncmVzc1BlcmNlbnQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpGUkVRVUVOQ1k6IHsKKyAgICAgICAgICAgIGF1dG8gZiA9IG1lc3NhZ2UuZnJlcXVlbmNpZXMoKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGZyZXF1ZW5jaWVzKHN0ZDo6YmVnaW4oZiksIHN0ZDo6ZW5kKGYpKTsKKyAgICAgICAgICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uRnJlcXVlbmNpZXNSZXBvcnQoZnJlcXVlbmNpZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1lNQk9MX1JBVEU6IHsKKyAgICAgICAgICAgIGF1dG8gcyA9IG1lc3NhZ2Uuc3ltYm9sUmF0ZXMoKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN5bWJvbFJhdGVzKHN0ZDo6YmVnaW4ocyksIHN0ZDo6ZW5kKHMpKTsKKyAgICAgICAgICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU3ltYm9sUmF0ZXMoc3ltYm9sUmF0ZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6SElFUkFSQ0hZOiB7CisgICAgICAgICAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vbkhpZXJhcmNoeSgoaW50KW1lc3NhZ2UuaGllcmFyY2h5KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6QU5BTE9HX1RZUEU6IHsKKyAgICAgICAgICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2lnbmFsVHlwZSgoaW50KW1lc3NhZ2UuYW5hbG9nVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OlBMUF9JRFM6IHsKKyAgICAgICAgICAgIGF1dG8gcCA9IG1lc3NhZ2UucGxwSWRzKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBwbHBJZHMoc3RkOjpiZWdpbihwKSwgc3RkOjplbmQocCkpOworICAgICAgICAgICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25QbHBJZHMocGxwSWRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkdST1VQX0lEUzogeworICAgICAgICAgICAgYXV0byBnID0gbWVzc2FnZS5ncm91cElkcygpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZ3JvdXBJZHMoc3RkOjpiZWdpbihnKSwgc3RkOjplbmQoZykpOworICAgICAgICAgICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25Hcm91cElkcyhncm91cElkcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpJTlBVVF9TVFJFQU1fSURTOiB7CisgICAgICAgICAgICBhdXRvIGkgPSBtZXNzYWdlLmlucHV0U3RyZWFtSWRzKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzdHJlYW1JZHMoc3RkOjpiZWdpbihpKSwgc3RkOjplbmQoaSkpOworICAgICAgICAgICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25JbnB1dFN0cmVhbUlkcyhzdHJlYW1JZHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1RBTkRBUkQ6IHsKKyAgICAgICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkIHN0ZCA9IG1lc3NhZ2Uuc3RkKCk7CisgICAgICAgICAgICBpbnQgc3RhbmRhcmQ7CisgICAgICAgICAgICBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PSBGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzU3RkKSB7CisgICAgICAgICAgICAgICAgc3RhbmRhcmQgPSAoaW50KSBzdGQuc1N0ZCgpOworICAgICAgICAgICAgICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uRHZic1N0YW5kYXJkKHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0U3RkKSB7CisgICAgICAgICAgICAgICAgc3RhbmRhcmQgPSAoaW50KSBzdGQudFN0ZCgpOworICAgICAgICAgICAgICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uRHZic1N0YW5kYXJkKHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzaWZTdGQpIHsKKyAgICAgICAgICAgICAgICBzdGFuZGFyZCA9IChpbnQpIHN0ZC5zaWZTdGQoKTsKKyAgICAgICAgICAgICAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vbkFuYWxvZ1NpZlN0YW5kYXJkKHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkFUU0MzX1BMUF9JTkZPOiB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxGcm9udGVuZFNjYW5BdHNjM1BscEluZm8+IHBscEluZm9zID0gbWVzc2FnZS5hdHNjM1BscEluZm9zKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUdW5lckF0c2MzUGxwSW5mbz4gdHVuZXJQbHBJbmZvczsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxwSW5mb3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdXRvIGluZm8gPSBwbHBJbmZvc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQgcGxwSWQgPSAoaW50KSBpbmZvLnBscElkOworICAgICAgICAgICAgICAgIGJvb2wgbGxzID0gKGJvb2wpIGluZm8uYkxsc0ZsYWc7CisgICAgICAgICAgICAgICAgVHVuZXJBdHNjM1BscEluZm8gcGxwSW5mb3sKKyAgICAgICAgICAgICAgICAgICAgLnBscElkID0gcGxwSWQsCisgICAgICAgICAgICAgICAgICAgIC5sbHNGbGFnID0gbGxzLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdHVuZXJQbHBJbmZvcy5wdXNoX2JhY2socGxwSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vbkF0c2MzUGxwSW5mb3ModHVuZXJQbHBJbmZvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2hpZGxfdmVjPEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4gVHVuZXJGcm9udGVuZDo6Z2V0QXRzYzNQbHBTZXR0aW5ncygKKyAgICAgICAgY29uc3QgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgaW50IGxlbiA9IHNldHRpbmdzLnBscFNldHRpbmdzLnNpemUoKTsKKyAgICBoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IHBscHMgPSBoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+KGxlbik7CisgICAgLy8gcGFyc2UgUExQIHNldHRpbmdzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICB1aW50OF90IHBscElkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0ucGxwSWQpOworICAgICAgICBGcm9udGVuZEF0c2MzTW9kdWxhdGlvbiBtb2R1bGF0aW9uID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbj4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0ubW9kdWxhdGlvbik7CisgICAgICAgIEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGUgaW50ZXJsZWF2ZU1vZGUgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uaW50ZXJsZWF2ZU1vZGUpOworICAgICAgICBGcm9udGVuZEF0c2MzQ29kZVJhdGUgY29kZVJhdGUgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNDb2RlUmF0ZT4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uY29kZVJhdGUpOworICAgICAgICBGcm9udGVuZEF0c2MzRmVjIGZlYyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM0ZlYz4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uZmVjKTsKKyAgICAgICAgRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzIGZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncyB7CisgICAgICAgICAgICAgICAgLnBscElkID0gcGxwSWQsCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uLAorICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZSA9IGludGVybGVhdmVNb2RlLAorICAgICAgICAgICAgICAgIC5jb2RlUmF0ZSA9IGNvZGVSYXRlLAorICAgICAgICAgICAgICAgIC5mZWMgPSBmZWMsCisgICAgICAgIH07CisgICAgICAgIHBscHNbaV0gPSBmcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7CisgICAgfQorICAgIHJldHVybiBwbHBzOworfQorCitGcm9udGVuZER2YnNDb2RlUmF0ZSBUdW5lckZyb250ZW5kOjpnZXREdmJzQ29kZVJhdGUoY29uc3QgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSYgY29kZVJhdGUpIHsKKyAgICBGcm9udGVuZElubmVyRmVjIGlubmVyRmVjID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJbm5lckZlYz4oY29kZVJhdGUuZmVjKTsKKyAgICBib29sIGlzTGluZWFyID0gY29kZVJhdGUuaXNMaW5lYXI7CisgICAgYm9vbCBpc1Nob3J0RnJhbWVzID0gY29kZVJhdGUuaXNTaG9ydEZyYW1lczsKKyAgICB1aW50MzJfdCBiaXRzUGVyMTAwMFN5bWJvbCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2RlUmF0ZS5iaXRzUGVyMTAwMFN5bWJvbCk7CisgICAgRnJvbnRlbmREdmJzQ29kZVJhdGUgY29kZXJhdGUgeworICAgICAgICAgICAgLmZlYyA9IGlubmVyRmVjLAorICAgICAgICAgICAgLmlzTGluZWFyID0gaXNMaW5lYXIsCisgICAgICAgICAgICAuaXNTaG9ydEZyYW1lcyA9IGlzU2hvcnRGcmFtZXMsCisgICAgICAgICAgICAuYml0c1BlcjEwMDBTeW1ib2wgPSBiaXRzUGVyMTAwMFN5bWJvbCwKKyAgICB9OworICAgIHJldHVybiBjb2RlcmF0ZTsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkM2RkZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuaApAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJGcm9udGVuZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyRnJvbnRlbmQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZyb250ZW5kQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzQ29kZVJhdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRXZlbnRUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5NZXNzYWdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUZyb250ZW5kOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRnJvbnRlbmRDYWxsYmFjazsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SVR1bmVyOworCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVHVuZXJGcm9udGVuZCA6IHB1YmxpYyBCblR1bmVyRnJvbnRlbmQgeworCitwdWJsaWM6CisgICAgVHVuZXJGcm9udGVuZChzcDxJVHVuZXI+IHR1bmVyLCBpbnQgZnJvbnRlbmRIYW5kbGUpOworICAgIHZpcnR1YWwgflR1bmVyRnJvbnRlbmQoKTsKKyAgICBTdGF0dXMgc2V0Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4mIHR1bmVyRnJvbnRlbmRDYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHR1bmUoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHN0b3BUdW5lKCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNjYW4oY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywgaW50IGZyb250ZW5kU2NhblR5cGUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzdG9wU2NhbigpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRMbmIoaW50IGxuYkhhbmRsZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldExuYShib29sIGJFbmFibGUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRTdGF0dXMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0YXR1c1R5cGVzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1cz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICBzdHJ1Y3QgRnJvbnRlbmRDYWxsYmFjayA6IHB1YmxpYyBJRnJvbnRlbmRDYWxsYmFjayB7CisgICAgICAgIEZyb250ZW5kQ2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IHR1bmVyRnJvbnRlbmRDYWxsYmFjaykKKyAgICAgICAgICAgICAgICA6IG1UdW5lckZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKSB7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25TY2FuTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZSB0eXBlLCBjb25zdCBGcm9udGVuZFNjYW5NZXNzYWdlJiBtZXNzYWdlKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4gbVR1bmVyRnJvbnRlbmRDYWxsYmFjazsKKyAgICB9OworCitwcml2YXRlOgorICAgIGhpZGxfdmVjPEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4gZ2V0QXRzYzNQbHBTZXR0aW5ncygKKyAgICAgICAgICAgIGNvbnN0IFR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgRnJvbnRlbmREdmJzQ29kZVJhdGUgZ2V0RHZic0NvZGVSYXRlKGNvbnN0IFR1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGUmIGNvZGVSYXRlKTsKKyAgICBpbnQgbUlkOworICAgIHNwPElUdW5lcj4gbVR1bmVyOworICAgIHNwPElGcm9udGVuZD4gbUZyb250ZW5kOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkZST05URU5EX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiM2RlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMjI0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJTZXJ2aWNlIgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIlR1bmVyRnJvbnRlbmQuaCIKKyNpbmNsdWRlICJUdW5lclNlcnZpY2UuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3A8SVR1bmVyPiBUdW5lclNlcnZpY2U6Om1UdW5lcjsKKworVHVuZXJTZXJ2aWNlOjpUdW5lclNlcnZpY2UoKSB7fQorVHVuZXJTZXJ2aWNlOjp+VHVuZXJTZXJ2aWNlKCkge30KKwordm9pZCBUdW5lclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUdW5lclNlcnZpY2U+IHNlcnZpY2UgPQorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJTZXJ2aWNlPigpOworICAgIEFTZXJ2aWNlTWFuYWdlcl9hZGRTZXJ2aWNlKHNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIGdldFNlcnZpY2VOYW1lKCkpOworICAgIG1UdW5lciA9IElUdW5lcjo6Z2V0U2VydmljZSgpOworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBJVHVuZXIgc2VydmljZS4iKTsKKyAgICB9Cit9CisKK1N0YXR1cyBUdW5lclNlcnZpY2U6OmdldEZyb250ZW5kSWRzKHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBpZHMsIGludDMyX3QqIC8qIF9haWRsX3JldHVybiAqLykgeworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisgICAgaGlkbF92ZWM8RnJvbnRlbmRJZD4gZmVJZHM7CisgICAgUmVzdWx0IHJlczsKKyAgICBtVHVuZXItPmdldEZyb250ZW5kSWRzKFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RnJvbnRlbmRJZD4mIGZyb250ZW5kSWRzKSB7CisgICAgICAgIGZlSWRzID0gZnJvbnRlbmRJZHM7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIGlkcy0+cmVzaXplKGZlSWRzLnNpemUoKSk7CisgICAgc3RkOjpjb3B5KGZlSWRzLmJlZ2luKCksIGZlSWRzLmVuZCgpLCBpZHMtPmJlZ2luKCkpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmRJbmZvKAorICAgICAgICBpbnQzMl90IGZyb250ZW5kSGFuZGxlLCBUdW5lclNlcnZpY2VGcm9udGVuZEluZm8qIF9haWRsX3JldHVybikgeworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzOworICAgIEZyb250ZW5kSW5mbyBpbmZvOworICAgIGludCBmZUlkID0gZ2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoZnJvbnRlbmRIYW5kbGUpOworICAgIG1UdW5lci0+Z2V0RnJvbnRlbmRJbmZvKGZlSWQsIFsmXShSZXN1bHQgciwgY29uc3QgRnJvbnRlbmRJbmZvJiBmZUluZm8pIHsKKyAgICAgICAgaW5mbyA9IGZlSW5mbzsKKyAgICAgICAgcmVzID0gcjsKKyAgICB9KTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgVHVuZXJTZXJ2aWNlRnJvbnRlbmRJbmZvIHR1bmVySW5mbyA9IGNvbnZlcnRUb0FpZGxGcm9udGVuZEluZm8oZmVJZCwgaW5mbyk7CisgICAgKl9haWRsX3JldHVybiA9IHR1bmVySW5mbzsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRnJvbnRlbmQoCisgICAgICAgIGludDMyX3QgZnJvbnRlbmRIYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJGcm9udGVuZD4obVR1bmVyLCBmcm9udGVuZEhhbmRsZSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworVHVuZXJTZXJ2aWNlRnJvbnRlbmRJbmZvIFR1bmVyU2VydmljZTo6Y29udmVydFRvQWlkbEZyb250ZW5kSW5mbyhpbnQgZmVJZCwgRnJvbnRlbmRJbmZvIGhhbEluZm8pIHsKKyAgICBUdW5lclNlcnZpY2VGcm9udGVuZEluZm8gaW5mb3sKKyAgICAgICAgLmlkID0gZmVJZCwKKyAgICAgICAgLnR5cGUgPSAoaW50KWhhbEluZm8udHlwZSwKKyAgICAgICAgLm1pbkZyZXF1ZW5jeSA9IChpbnQpaGFsSW5mby5taW5GcmVxdWVuY3ksCisgICAgICAgIC5tYXhGcmVxdWVuY3kgPSAoaW50KWhhbEluZm8ubWF4RnJlcXVlbmN5LAorICAgICAgICAubWluU3ltYm9sUmF0ZSA9IChpbnQpaGFsSW5mby5taW5TeW1ib2xSYXRlLAorICAgICAgICAubWF4U3ltYm9sUmF0ZSA9IChpbnQpaGFsSW5mby5tYXhTeW1ib2xSYXRlLAorICAgICAgICAuYWNxdWlyZVJhbmdlID0gKGludCloYWxJbmZvLmFjcXVpcmVSYW5nZSwKKyAgICAgICAgLmV4Y2x1c2l2ZUdyb3VwSWQgPSAoaW50KWhhbEluZm8uZXhjbHVzaXZlR3JvdXBJZCwKKyAgICB9OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsSW5mby5zdGF0dXNDYXBzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGluZm8uc3RhdHVzQ2Fwcy5wdXNoX2JhY2soKGludCloYWxJbmZvLnN0YXR1c0NhcHNbaV0pOworICAgIH0KKworICAgIFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMgY2FwczsKKyAgICBzd2l0Y2ggKGhhbEluZm8udHlwZSkgeworICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6QU5BTE9HOiB7CisgICAgICAgICAgICBUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzIGFuYWxvZ0NhcHN7CisgICAgICAgICAgICAgICAgLnR5cGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmFuYWxvZ0NhcHMoKS50eXBlQ2FwLAorICAgICAgICAgICAgICAgIC5zaWZTdGFuZGFyZENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYW5hbG9nQ2FwcygpLnNpZlN0YW5kYXJkQ2FwLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmFuYWxvZ0NhcHM+KGFuYWxvZ0NhcHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkFUU0M6IHsKKyAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIGF0c2NDYXBzeworICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjQ2FwcygpLm1vZHVsYXRpb25DYXAsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6YXRzY0NhcHM+KGF0c2NDYXBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpBVFNDMzogeworICAgICAgICAgICAgVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzIGF0c2MzQ2Fwc3sKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5iYW5kd2lkdGhDYXAsCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLm1vZHVsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgLnRpbWVJbnRlcmxlYXZlTW9kZUNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLnRpbWVJbnRlcmxlYXZlTW9kZUNhcCwKKyAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLmNvZGVSYXRlQ2FwLAorICAgICAgICAgICAgICAgIC5kZW1vZE91dHB1dEZvcm1hdENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZGVtb2RPdXRwdXRGb3JtYXRDYXAsCisgICAgICAgICAgICAgICAgLmZlY0NhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZmVjQ2FwLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmF0c2MzQ2Fwcz4oYXRzYzNDYXBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpEVkJDOiB7CisgICAgICAgICAgICBUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMgY2FibGVDYXBzeworICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLm1vZHVsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLmZlY0NhcCwKKyAgICAgICAgICAgICAgICAuYW5uZXhDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YmNDYXBzKCkuYW5uZXhDYXAsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6Y2FibGVDYXBzPihjYWJsZUNhcHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkRWQlM6IHsKKyAgICAgICAgICAgIFR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzIGR2YnNDYXBzeworICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJzQ2FwcygpLm1vZHVsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGxvbmcpaGFsSW5mby5mcm9udGVuZENhcHMuZHZic0NhcHMoKS5pbm5lcmZlY0NhcCwKKyAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkuc3RhbmRhcmQsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6ZHZic0NhcHM+KGR2YnNDYXBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpEVkJUOiB7CisgICAgICAgICAgICBUdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllcyBkdmJ0Q2Fwc3sKKyAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS50cmFuc21pc3Npb25Nb2RlQ2FwLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGhDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuYmFuZHdpZHRoQ2FwLAorICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmNvbnN0ZWxsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmNvZGVyYXRlQ2FwLAorICAgICAgICAgICAgICAgIC5oaWVyYXJjaHlDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuaGllcmFyY2h5Q2FwLAorICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmd1YXJkSW50ZXJ2YWxDYXAsCisgICAgICAgICAgICAgICAgLmlzVDJTdXBwb3J0ZWQgPSAoYm9vbCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzVDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgLmlzTWlzb1N1cHBvcnRlZCA9IChib29sKWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuaXNNaXNvU3VwcG9ydGVkLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmR2YnRDYXBzPihkdmJ0Q2Fwcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6SVNEQlM6IHsKKyAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcyBpc2Ric0NhcHN7CisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzQ2FwcygpLm1vZHVsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2Ric0NhcHMoKS5jb2RlcmF0ZUNhcCwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjppc2Ric0NhcHM+KGlzZGJzQ2Fwcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6SVNEQlMzOiB7CisgICAgICAgICAgICBUdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzIGlzZGJzM0NhcHN7CisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzM0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAorICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnMzQ2FwcygpLmNvZGVyYXRlQ2FwLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJzM0NhcHM+KGlzZGJzM0NhcHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OklTREJUOiB7CisgICAgICAgICAgICBUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMgaXNkYnRDYXBzeworICAgICAgICAgICAgICAgIC5tb2RlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5tb2RlQ2FwLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGhDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmJhbmR3aWR0aENhcCwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkubW9kdWxhdGlvbkNhcCwKKyAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmNvZGVyYXRlQ2FwLAorICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5ndWFyZEludGVydmFsQ2FwLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJ0Q2Fwcz4oaXNkYnRDYXBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpbmZvLmNhcHMgPSBjYXBzOworICAgIHJldHVybiBpbmZvOworfQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmNjZDNlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmgKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUlNFUlZJQ0VfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyU2VydmljZUZyb250ZW5kSW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorCit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lclNlcnZpY2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZyb250ZW5kOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lclNlcnZpY2VGcm9udGVuZEluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SVR1bmVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFR1bmVyU2VydmljZSA6IHB1YmxpYyBCblR1bmVyU2VydmljZSB7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEudHVuZXIiOyB9CisgICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKTsKKyAgICBUdW5lclNlcnZpY2UoKTsKKyAgICB2aXJ0dWFsIH5UdW5lclNlcnZpY2UoKTsKKworICAgIHN0YXRpYyBpbnQgZ2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoaW50IHJlc291cmNlSGFuZGxlKSB7CisgICAgICAgIHJldHVybiAocmVzb3VyY2VIYW5kbGUgJiAweDAwZmYwMDAwKSA+PiAxNjsKKyAgICB9CisKKyAgICBTdGF0dXMgZ2V0RnJvbnRlbmRJZHMoc3RkOjp2ZWN0b3I8aW50MzJfdD4qIGlkcywgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0RnJvbnRlbmRJbmZvKGludDMyX3QgZnJvbnRlbmRIYW5kbGUsIFR1bmVyU2VydmljZUZyb250ZW5kSW5mbyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgb3BlbkZyb250ZW5kKAorICAgICAgICAgICAgaW50MzJfdCBmcm9udGVuZEhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8SVR1bmVyPiBtVHVuZXI7CisKKyAgICBUdW5lclNlcnZpY2VGcm9udGVuZEluZm8gY29udmVydFRvQWlkbEZyb250ZW5kSW5mbyhpbnQgZmVJZCwgRnJvbnRlbmRJbmZvIGhhbEluZm8pOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUlNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L09XTkVSUyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlYjhlOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di9PV05FUlMKQEAgLTAsMCArMSwyIEBACituY2hhbGtvQGdvb2dsZS5jb20KK3F1eGlhbmdmYW5nQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkMjBhOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZC5haWRsCkBAIC0wLDAgKzEsODUgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZyb250ZW5kQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU3RhdHVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJTZXJ2aWNlRnJvbnRlbmRJbmZvOworCisvKioKKyAqIFR1bmVyIEZyb250ZW5kIGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIHJlbGF0ZWQgb3BlcmF0aW9ucy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJVHVuZXJGcm9udGVuZCB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSBmcm9udGVuZCBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0dW5lckZyb250ZW5kQ2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgZnJvbnRlbmQgcmVsYXRlZCBpbmZvLgorICAgICAqLworICAgIHZvaWQgc2V0Q2FsbGJhY2soaW4gSVR1bmVyRnJvbnRlbmRDYWxsYmFjayB0dW5lckZyb250ZW5kQ2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogVHVuZXMgdGhlIGZyb250ZW5kIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBnaXZlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXR0aW5ncyB0aGUgc2V0dGluZ3MgdG8gdHVuZSB3aXRoLgorICAgICAqLworICAgIHZvaWQgdHVuZShpbiBUdW5lckZyb250ZW5kU2V0dGluZ3Mgc2V0dGluZ3MpOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgcHJldmlvdXMgdHVuaW5nLgorICAgICAqLworICAgIHZvaWQgc3RvcFR1bmUoKTsKKworICAgIC8qKgorICAgICAqIFNjYW4gdGhlIGZyb250ZW5kIHRvIHVzZSB0aGUgc2V0dGluZ3MgZ2l2ZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0dGluZ3MgdGhlIHNldHRpbmdzIHRvIHNjYW4gd2l0aC4KKyAgICAgKiBAcGFyYW0gZnJvbnRlbmRTY2FuVHlwZSBzY2FuIHdpdGggZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICB2b2lkIHNjYW4oaW4gVHVuZXJGcm9udGVuZFNldHRpbmdzIHNldHRpbmdzLCBpbiBpbnQgZnJvbnRlbmRTY2FuVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBwcmV2aW91cyBzY2FubmluZy4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3BTY2FuKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIExvdy1Ob2lzZSBCbG9jayBkb3duY29udmVydGVyIChMTkIpIGZvciBzYXRlbGxpdGUgZnJvbnRlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG5iSGFuZGxlIGxuYiBoYW5kbGUgaW4gdXNlLgorICAgICAqLworICAgIHZvaWQgc2V0TG5iKGluIGludCBsbmJIYW5kbGUpOworCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIERpc2FibGUgTG93IE5vaXNlIEFtcGxpZmllciAoTE5BKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiRW5hYmxlIGVuYWJsZSBMbmEgb3Igbm90LgorICAgICAqLworICAgIHZvaWQgc2V0TG5hKGluIGJvb2xlYW4gYkVuYWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgSVR1bmVyRnJvbnRlbmQgaW5zdGFuY2UuCisgICAgICovCisgICAgdm9pZCBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3RhdHVzZXMgb2YgdGhlIGZyb250ZW5kLgorICAgICAqLworICAgIFR1bmVyRnJvbnRlbmRTdGF0dXNbXSBnZXRTdGF0dXMoaW4gaW50W10gc3RhdHVzVHlwZXMpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kQ2FsbGJhY2suYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZENhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2MmMxNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZENhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSw5NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJBdHNjM1BscEluZm87CisKKy8qKgorICogVHVuZXJGcm9udGVuZENhbGxiYWNrIGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIGZyb250ZW5kIHJlbGF0ZWQgY2FsbGJhY2tzLgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElUdW5lckZyb250ZW5kQ2FsbGJhY2sgeworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgYSBuZXcgZXZlbnQgaGFwcGVuZWQgb24gdGhlIGZyb250ZW5kLgorICAgICAqLworICAgIHZvaWQgb25FdmVudChpbiBpbnQgZnJvbnRlbmRFdmVudFR5cGUpOworCisgICAgLyoqCisgICAgICogbm90aWZ5IGxvY2tlZCBtZXNzYWdlIHRvIGNsaWVudCBmcm9tIHRoZSBvbmdvaW5nIHNjYW4uCisgICAgICovCisgICAgdm9pZCBvbkxvY2tlZCgpOworCisgICAgLyoqCisgICAgICogbm90aWZ5IHNjYW4gc3RvcHBlZCBtZXNzYWdlIHRvIGNsaWVudCBmcm9tIHRoZSBvbmdvaW5nIHNjYW4uCisgICAgICovCisgICAgdm9pZCBvblNjYW5TdG9wcGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBub3RpZnkgcHJvZ3Jlc3MgbWVzc2FnZSB0byBjbGllbnQgZnJvbSB0aGUgb25nb2luZyBzY2FuLgorICAgICAqLworICAgIHZvaWQgb25Qcm9ncmVzcyhpbiBpbnQgcGVyY2VudCk7CisKKyAgICAvKioKKyAgICAgKiBub3RpZnkgRnJlcXVlbmNpZXMgbWVzc2FnZSB0byBjbGllbnQgZnJvbSB0aGUgb25nb2luZyBzY2FuLgorICAgICAqLworICAgIHZvaWQgb25GcmVxdWVuY2llc1JlcG9ydChpbiBpbnRbXSBmcmVxdWVuY3kpOworCisgICAgLyoqCisgICAgICogbm90aWZ5IFN5bWJvbFJhdGVzIG1lc3NhZ2UgdG8gY2xpZW50IGZyb20gdGhlIG9uZ29pbmcgc2Nhbi4KKyAgICAgKi8KKyAgICB2b2lkIG9uU3ltYm9sUmF0ZXMoaW4gaW50W10gcmF0ZXMpOworCisgICAgLyoqCisgICAgICogbm90aWZ5IEhpZXJhcmNoeSBtZXNzYWdlIHRvIGNsaWVudCBmcm9tIHRoZSBvbmdvaW5nIHNjYW4uCisgICAgICovCisgICAgdm9pZCBvbkhpZXJhcmNoeShpbiBpbnQgaGllcmFyY2h5KTsKKworICAgIC8qKgorICAgICAqIG5vdGlmeSBTaWduYWxUeXBlIG1lc3NhZ2UgdG8gY2xpZW50IGZyb20gdGhlIG9uZ29pbmcgc2Nhbi4KKyAgICAgKi8KKyAgICB2b2lkIG9uU2lnbmFsVHlwZShpbiBpbnQgc2lnbmFsVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBub3RpZnkgUGxwSWRzIG1lc3NhZ2UgdG8gY2xpZW50IGZyb20gdGhlIG9uZ29pbmcgc2Nhbi4KKyAgICAgKi8KKyAgICB2b2lkIG9uUGxwSWRzKGluIGludFtdIHBscElkcyk7CisKKyAgICAvKioKKyAgICAgKiBub3RpZnkgR3JvdXBJZHMgbWVzc2FnZSB0byBjbGllbnQgZnJvbSB0aGUgb25nb2luZyBzY2FuLgorICAgICAqLworICAgIHZvaWQgb25Hcm91cElkcyhpbiBpbnRbXSBncm91cElkcyk7CisKKyAgICAvKioKKyAgICAgKiBub3RpZnkgSW5wdXRTdHJlYW1JZHMgbWVzc2FnZSB0byBjbGllbnQgZnJvbSB0aGUgb25nb2luZyBzY2FuLgorICAgICAqLworICAgIHZvaWQgb25JbnB1dFN0cmVhbUlkcyhpbiBpbnRbXSBpbnB1dFN0cmVhbUlkcyk7CisKKyAgICAvKioKKyAgICAgKiBub3RpZnkgRHZic1N0YW5kYXJkIG1lc3NhZ2UgdG8gY2xpZW50IGZyb20gdGhlIG9uZ29pbmcgc2Nhbi4KKyAgICAgKi8KKyAgICB2b2lkIG9uRHZic1N0YW5kYXJkKGluIGludCBkdmJzU3RhbmRhbmRhcmQpOworCisgICAgLyoqCisgICAgICogbm90aWZ5IEFuYWxvZ1NpZlN0YW5kYXJkIG1lc3NhZ2UgdG8gY2xpZW50IGZyb20gdGhlIG9uZ29pbmcgc2Nhbi4KKyAgICAgKi8KKyAgICB2b2lkIG9uQW5hbG9nU2lmU3RhbmRhcmQoaW4gaW50IHNpZlN0YW5kYW5kYXJkKTsKKworICAgIC8qKgorICAgICAqIG5vdGlmeSBBdHNjM1BscEluZm9zIG1lc3NhZ2UgdG8gY2xpZW50IGZyb20gdGhlIG9uZ29pbmcgc2Nhbi4KKyAgICAgKi8KKyAgICB2b2lkIG9uQXRzYzNQbHBJbmZvcyhpbiBUdW5lckF0c2MzUGxwSW5mb1tdIGF0c2MzUGxwSW5mb3MpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclNlcnZpY2UuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJTZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwYjQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZyb250ZW5kOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJTZXJ2aWNlRnJvbnRlbmRJbmZvOworCisvKioKKyAqIFR1bmVyU2VydmljZSBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVR1bmVyU2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGZyb250ZW5kIElEcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBvcGVyYXRpb24uCisgICAgICovCisgICAgaW50IGdldEZyb250ZW5kSWRzKG91dCBpbnRbXSBpZHMpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGZyb250ZW5kJ3MgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbnRlbmRIYW5kbGUgdGhlIGhhbmRsZSBvZiB0aGUgZnJvbnRlbmQgZ3JhbnRlZCBieSBUUk0uCisgICAgICogQHJldHVybiB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGZyb250ZW5kLgorICAgICAqLworICAgIFR1bmVyU2VydmljZUZyb250ZW5kSW5mbyBnZXRGcm9udGVuZEluZm8oaW4gaW50IGZyb250ZW5kSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gYSBUdW5lciBGcm9udGVuZCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbnRlbmRIYW5kbGUgdGhlIGhhbmRsZSBvZiB0aGUgZnJvbnRlbmQgZ3JhbnRlZCBieSBUUk0uCisgICAgICogQHJldHVybiB0aGUgYWlkbCBpbnRlcmZhY2Ugb2YgdGhlIGZyb250ZW5kLgorICAgICAqLworICAgIElUdW5lckZyb250ZW5kIG9wZW5Gcm9udGVuZChpbiBpbnQgZnJvbnRlbmRIYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyQXRzYzNQbHBJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJBdHNjM1BscEluZm8uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY0OGE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyQXRzYzNQbHBJbmZvLmFpZGwKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBBdHNjMyBGcm9udGVuZCBQaHlzaWNhbCBMYXllciBQaXBlIEluZm8uCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyQXRzYzNQbHBJbmZvIHsKKyAgICBpbnQgcGxwSWQ7CisKKyAgICBib29sZWFuIGxsc0ZsYWc7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGJmMDRlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEFuYWxvZyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzIHsKKwkvKioKKyAgICAgKiBTaWduYWwgVHlwZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IHR5cGVDYXA7CisKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBJbnRlcmNoYW5nZSBGb3JtYXQgKFNJRikgY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBzaWZTdGFuZGFyZENhcDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmQwN2MzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogQW5hbG9nIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzIHsKKyAgICAvKioKKyAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IGZyZXF1ZW5jeTsKKworICAgIGludCBzaWduYWxUeXBlOworCisgICAgLyoqCisgICAgICogU3RhbmRhcmQgSW50ZXJjaGFuZ2UgRm9ybWF0IChTSUYpIHNldHRpbmcKKyAgICAgKi8KKyAgICBpbnQgc2lmU3RhbmRhcmQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5YmU3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEFUU0MzIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcyB7CisgICAgLyoqCisgICAgICogQmFuZHdpZHRoIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgYmFuZHdpZHRoQ2FwOworCisgICAgLyoqCisgICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IG1vZHVsYXRpb25DYXA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lSW50ZXJsZWF2ZU1vZGUgY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCB0aW1lSW50ZXJsZWF2ZU1vZGVDYXA7CisKKyAgICAvKioKKyAgICAgKiBDb2RlUmF0ZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGNvZGVSYXRlQ2FwOworCisgICAgLyoqCisgICAgICogRkVDIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgZmVjQ2FwOworCisgICAgLyoqCisgICAgICogRGVtb2R1bGF0b3IgT3V0cHV0IEZvcm1hdCBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGRlbW9kT3V0cHV0Rm9ybWF0Q2FwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjllMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBBdHNjMyBGcm9udGVuZCBQaHlzaWNhbCBMYXllciBQaXBlIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MgeworICAgIGludCBwbHBJZDsKKworICAgIGludCBtb2R1bGF0aW9uOworCisgICAgaW50IGludGVybGVhdmVNb2RlOworCisgICAgaW50IGNvZGVSYXRlOworCisgICAgLyoqCisgICAgICogRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIFR5cGUuCisgICAgICovCisgICAgaW50IGZlYzsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmYjhjNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOworCisvKioKKyAqIEF0c2MzIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MgeworICAgIC8qKgorICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKKyAgICAgKi8KKyAgICBpbnQgZnJlcXVlbmN5OworCisgICAgLyoqCisgICAgICogQmFuZHdpZHRoIG9mIHR1bmluZyBiYW5kLgorICAgICAqLworICAgIGludCBiYW5kd2lkdGg7CisKKyAgICBpbnQgZGVtb2RPdXRwdXRGb3JtYXQ7CisKKyAgICBUdW5lckZyb250ZW5kQXRzYzNQbHBTZXR0aW5nc1tdIHBscFNldHRpbmdzOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZjMmZjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSwyOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBBVFNDIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgbW9kdWxhdGlvbkNhcDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E4YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjU2V0dGluZ3MuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEF0c2MgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQXRzY1NldHRpbmdzIHsKKyAgICAvKioKKyAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IGZyZXF1ZW5jeTsKKworICAgIGludCBtb2R1bGF0aW9uOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjQ1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBDYWJsZShEVkJDKSBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMgeworICAgIC8qKgorICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBtb2R1bGF0aW9uQ2FwOworCisgICAgLyoqCisgICAgICogQ29kZSBSYXRlIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgY29kZVJhdGVDYXA7IC8vIGlubmVyIEZFQyB3aWxsIGNvbnZlcmdlIHRvIGNvZGVSYXRlCisKKyAgICAvKioKKyAgICAgKiBBbm5leCBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGFubmV4Q2FwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTg0ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw1NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBDYWJsZSBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzIHsKKyAgICAvKioKKyAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IGZyZXF1ZW5jeTsKKworICAgIGludCBtb2R1bGF0aW9uOworCisgICAgLyoqCisgICAgICogSW5uZXIgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIHR5cGUgYXMgc3BlY2lmaWVkIGluIEVUU0kgRU4gMzAwIDQ2OCBWMS4xNS4xCisgICAgICogYW5kIEVUU0kgRU4gMzAyIDMwNy0yIFYxLjEuMS4KKyAgICAgKi8KKyAgICBsb25nIGlubmVyRmVjOworCisgICAgLyoqCisgICAgICogU3ltYm9scyBwZXIgc2Vjb25kCisgICAgICovCisgICAgaW50IHN5bWJvbFJhdGU7CisKKyAgICAvKioKKyAgICAgKiBPdXRlciBGb3J3YXJkIEVycm9yIENvcnJlY3Rpb24gKEZFQykgVHlwZS4KKyAgICAgKi8KKyAgICBpbnQgb3V0ZXJGZWM7CisKKyAgICBpbnQgYW5uZXg7CisKKyAgICAvKioKKyAgICAgKiBTcGVjdHJhbCBJbnZlcnNpb24gVHlwZS4KKyAgICAgKi8KKyAgICBpbnQgc3BlY3RyYWxJbnZlcnNpb247Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWYzMWYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDg1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllczsKKworLyoqCisgKiBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIFVzZSBhIGdyb3VwIG9mIHZlY3RvcnMgYXMgdGhlIHdvcmthcm91bmQgZm9yIFVuaW9uIHN0cnVjdHVyZSB0aGF0IGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQKKyAqIGluIEFJREwgY3VycmVudGx5LgorICoKKyAqIENsaWVudCBtYXkgdXNlIEZyb250ZW5kSW5mby50eXBlIGFzIHRoZSBkaXNjcmltaW5hciB0byBjaGVjayB0aGUgY29ycmVzcG9uZGluZyB2ZWN0b3IuIElmCisgKiB0aGUgdmVjdG9yIGlzIG5vdCBudWxsLCBpdCBjb250YWlucyB2YWxpZCB2YWx1ZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMgeworICAgIC8qKgorICAgICAqIEFuYWxvZyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzIGFuYWxvZ0NhcHM7CisKKyAgICAvKioKKyAgICAgKiBBVFNDIEZyb250ZW5kIENhcGFiaWxpdGllcworICAgICAqLworICAgIFR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIGF0c2NDYXBzOworCisgICAgLyoqCisgICAgICogQVRTQzMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzIGF0c2MzQ2FwczsKKworICAgIC8qKgorICAgICAqIENhYmxlIEZyb250ZW5kIENhcGFiaWxpdGllcworICAgICAqLworICAgIFR1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcyBjYWJsZUNhcHM7CisKKyAgICAvKioKKyAgICAgKiBEVkJTIEZyb250ZW5kIENhcGFiaWxpdGllcworICAgICAqLworICAgIFR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzIGR2YnNDYXBzOworCisgICAgLyoqCisgICAgICogRFZCVCBGcm9udGVuZCBDYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllcyBkdmJ0Q2FwczsKKworICAgIC8qKgorICAgICAqIElTREItUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMgaXNkYnNDYXBzOworCisgICAgLyoqCisgICAgICogSVNEQi1TMyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzIGlzZGJzM0NhcHM7CisKKyAgICAvKioKKyAgICAgKiBJU0RCLVQgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzIGlzZGJ0Q2FwczsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0MzIyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcy5haWRsCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogRFZCUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcyB7CisgICAgLyoqCisgICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IG1vZHVsYXRpb25DYXA7CisKKyAgICAvKioKKyAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQorICAgICAqLworICAgIGxvbmcgY29kZVJhdGVDYXA7ICAvLyBpbm5lciBGRUMgd2lsbCBjb252ZXJnZSB0byBjb2RlUmF0ZQorCisgICAgLyoqCisgICAgICogU3ViIHN0YW5kYXJkcyBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IHN0YW5kYXJkOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGUuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliN2RlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwKQEAgLTAsMCArMSw0MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBEdmJzIEZyb250ZW5kIENvZGVSYXRlIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSB7CisgICAgLyoqCisgICAgICogSW5uZXIgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIHR5cGUgYXMgc3BlY2lmaWVkIGluIEVUU0kgRU4gMzAwIDQ2OCBWMS4xNS4xCisgICAgICogYW5kIEVUU0kgRU4gMzAyIDMwNy0yIFYxLjEuMS4KKyAgICAgKi8KKyAgICBsb25nIGZlYzsKKworICAgIGJvb2xlYW4gaXNMaW5lYXI7CisKKyAgICAvKioKKyAgICAgKiB0cnVlIGlmIGVuYWJsZSBzaG9ydCBmcmFtZQorICAgICAqLworICAgIGJvb2xlYW4gaXNTaG9ydEZyYW1lczsKKworICAgIC8qKgorICAgICAqIGJpdHMgbnVtYmVyIGluIDEwMDAgc3ltYm9sLiAwIGlmIHVzZSB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBpbnQgYml0c1BlcjEwMDBTeW1ib2w7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTRhNTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MuYWlkbApAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlOworCisvKioKKyAqIER2YnMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic1NldHRpbmdzIHsKKyAgICAvKioKKyAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IGZyZXF1ZW5jeTsKKworICAgIGludCBtb2R1bGF0aW9uOworCisgICAgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSBjb2RlUmF0ZTsKKworICAgIGludCBzeW1ib2xSYXRlOworCisgICAgLyoqCisgICAgICogUm9sbCBvZmYgdHlwZS4KKyAgICAgKi8KKyAgICBpbnQgcm9sbG9mZjsKKworICAgIC8qKgorICAgICAqIFBpbG90IG1vZGUuCisgICAgICovCisgICAgaW50IHBpbG90OworCisgICAgaW50IGlucHV0U3RyZWFtSWQ7CisKKyAgICBpbnQgc3RhbmRhcmQ7CisKKyAgICAvKioKKyAgICAgKiBWY20gbW9kZS4KKyAgICAgKi8KKyAgICBpbnQgdmNtOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2YxNmRkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBEVkJUIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBUcmFuc21pc3Npb24gTW9kZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IHRyYW5zbWlzc2lvbk1vZGVDYXA7CisKKyAgICAvKioKKyAgICAgKiBCYW5kd2lkdGggY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBiYW5kd2lkdGhDYXA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGVsbGF0aW9uIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgY29uc3RlbGxhdGlvbkNhcDsKKworICAgIC8qKgorICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGNvZGVSYXRlQ2FwOworCisgICAgLyoqCisgICAgICogSGllcmFyY2h5IFR5cGUgY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBoaWVyYXJjaHlDYXA7CisKKyAgICAvKioKKyAgICAgKiBHdWFyZCBJbnRlcnZhbCBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGd1YXJkSW50ZXJ2YWxDYXA7CisKKyAgICAvKioKKyAgICAgKiBUMiBTdXBwb3J0IGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBib29sZWFuIGlzVDJTdXBwb3J0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBNaXNvIFN1cHBvcnQgY2FwYWJpbGl0eQorICAgICAqLworICAgIGJvb2xlYW4gaXNNaXNvU3VwcG9ydGVkOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyMzk2YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBEdmJ0IEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZER2YnRTZXR0aW5ncyB7CisgICAgLyoqCisgICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egorICAgICAqLworICAgIGludCBmcmVxdWVuY3k7CisKKyAgICBpbnQgdHJhbnNtaXNzaW9uTW9kZTsKKworICAgIGludCBiYW5kd2lkdGg7CisKKyAgICBpbnQgY29uc3RlbGxhdGlvbjsKKworICAgIGludCBoaWVyYXJjaHk7CisKKyAgICAvKioKKyAgICAgKiBDb2RlIFJhdGUgZm9yIEhpZ2ggUHJpb3JpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBpbnQgaHBDb2RlUmF0ZTsKKworICAgIC8qKgorICAgICAqIENvZGUgUmF0ZSBmb3IgTG93IFByaW9yaXR5IGxldmVsCisgICAgICovCisgICAgaW50IGxwQ29kZVJhdGU7CisKKyAgICBpbnQgZ3VhcmRJbnRlcnZhbDsKKworICAgIGJvb2xlYW4gaXNIaWdoUHJpb3JpdHk7CisKKyAgICBpbnQgc3RhbmRhcmQ7CisKKyAgICBib29sZWFuIGlzTWlzbzsKKworICAgIC8qKgorICAgICAqIFBoeXNpY2FsIExheWVyIFBpcGUgKFBMUCkgbW9kZQorICAgICAqLworICAgIGludCBwbHBNb2RlOworCisgICAgLyoqCisgICAgICogUGh5c2ljYWwgTGF5ZXIgUGlwZSAoUExQKSBJZAorICAgICAqLworICAgIGludCBwbHBJZDsKKworICAgIC8qKgorICAgICAqIFBoeXNpY2FsIExheWVyIFBpcGUgKFBMUCkgR3JvdXAgSWQKKyAgICAgKi8KKyAgICBpbnQgcGxwR3JvdXBJZDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZGQ2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcy5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogSVNEQi1TMyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgbW9kdWxhdGlvbkNhcDsKKworICAgIC8qKgorICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGNvZGVSYXRlQ2FwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjM4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBJc2RiczMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MgeworICAgIC8qKgorICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKKyAgICAgKi8KKyAgICBpbnQgZnJlcXVlbmN5OworCisgICAgaW50IHN0cmVhbUlkOworCisgICAgaW50IHN0cmVhbUlkVHlwZTsKKworICAgIGludCBtb2R1bGF0aW9uOworCisgICAgaW50IGNvZGVSYXRlOworCisgICAgLyoqCisgICAgICogU3ltYm9scyBwZXIgc2Vjb25kCisgICAgICovCisgICAgaW50IHN5bWJvbFJhdGU7CisKKyAgICBpbnQgcm9sbG9mZjsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRmZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcy5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogSVNEQi1TIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcyB7CisgICAgLyoqCisgICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IG1vZHVsYXRpb25DYXA7CisKKyAgICAvKioKKyAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBjb2RlUmF0ZUNhcDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlOTA5MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsNDQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogSXNkYnMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncyB7CisgICAgLyoqCisgICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egorICAgICAqLworICAgIGludCBmcmVxdWVuY3k7CisKKyAgICBpbnQgc3RyZWFtSWQ7CisKKyAgICBpbnQgc3RyZWFtSWRUeXBlOworCisgICAgaW50IG1vZHVsYXRpb247CisKKyAgICBpbnQgY29kZVJhdGU7CisKKyAgICAvKioKKyAgICAgKiBTeW1ib2xzIHBlciBzZWNvbmQKKyAgICAgKi8KKyAgICBpbnQgc3ltYm9sUmF0ZTsKKworICAgIGludCByb2xsb2ZmOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Mjk1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSw0OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBJU0RCLVQgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBJU0RCLVQgTW9kZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IG1vZGVDYXA7CisKKyAgICAvKioKKyAgICAgKiBCYW5kd2lkdGggY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBiYW5kd2lkdGhDYXA7CisKKyAgICAvKioKKyAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgbW9kdWxhdGlvbkNhcDsKKworICAgIC8qKgorICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGNvZGVSYXRlQ2FwOworCisgICAgLyoqCisgICAgICogR3VhcmQgSW50ZXJ2YWwgY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBndWFyZEludGVydmFsQ2FwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFmM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBJc2RidCBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzIHsKKyAgICAvKioKKyAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IGZyZXF1ZW5jeTsKKworICAgIGludCBtb2R1bGF0aW9uOworCisgICAgaW50IGJhbmR3aWR0aDsKKworICAgIGludCBtb2RlOworCisgICAgaW50IGNvZGVSYXRlOworCisgICAgaW50IGd1YXJkSW50ZXJ2YWw7CisKKyAgICBpbnQgc2VydmljZUFyZWFJZDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzgyOTQxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsNTIgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnNTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzOworCisvKioKKyAqIEFuYWxvZyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCit1bmlvbiBUdW5lckZyb250ZW5kU2V0dGluZ3MgeworICAgIFR1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncyBhbmFsb2c7CisKKyAgICBUdW5lckZyb250ZW5kQXRzY1NldHRpbmdzIGF0c2M7CisKKyAgICBUdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncyBhdHNjMzsKKworICAgIFR1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzIGNhYmxlOworCisgICAgVHVuZXJGcm9udGVuZER2YnNTZXR0aW5ncyBkdmJzOworCisgICAgVHVuZXJGcm9udGVuZER2YnRTZXR0aW5ncyBkdmJ0OworCisgICAgVHVuZXJGcm9udGVuZElzZGJzU2V0dGluZ3MgaXNkYnM7CisKKyAgICBUdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MgaXNkYnMzOworCisgICAgVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MgaXNkYnQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFN0YXR1cy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWY5ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXMuYWlkbApAQCAtMCwwICsxLDI0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIFR1bmVyIEZyb250ZW5kIFN0YXR1cyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRTdGF0dXMge30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lclNlcnZpY2VGcm9udGVuZEluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lclNlcnZpY2VGcm9udGVuZEluZm8uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNiY2RjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyU2VydmljZUZyb250ZW5kSW5mby5haWRsCkBAIC0wLDAgKzEsNzcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM7CisKKy8qKgorICogRnJvbnRlbmRJbmZvIGludGVyZmFjZSB0aGF0IGNhcnJpZXMgdHVuZXIgZnJvbnRlbmQgaW5mb3JtYXRpb24uCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyU2VydmljZUZyb250ZW5kSW5mbyB7CisgICAgLyoqCisgICAgICogRnJvbnRlbmQgSWQKKyAgICAgKi8KKyAgICBpbnQgaWQ7CisKKyAgICAvKioKKyAgICAgKiBGcm9udGVuZCBUeXBlCisgICAgICovCisgICAgaW50IHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBNaW5pbXVtIEZyZXF1ZW5jeSBpbiBIZXJ0egorICAgICAqLworICAgIGludCBtaW5GcmVxdWVuY3k7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIEZyZXF1ZW5jeSBpbiBIZXJ0egorICAgICAqLworICAgIGludCBtYXhGcmVxdWVuY3k7CisKKyAgICAvKioKKyAgICAgKiBNaW5pbXVtIHN5bWJvbHMgcGVyIHNlY29uZAorICAgICAqLworICAgIGludCBtaW5TeW1ib2xSYXRlOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBzeW1ib2xzIHBlciBzZWNvbmQKKyAgICAgKi8KKyAgICBpbnQgbWF4U3ltYm9sUmF0ZTsKKworICAgIC8qKgorICAgICAqIFJhbmdlIGluIEhlcnR6CisgICAgICovCisgICAgaW50IGFjcXVpcmVSYW5nZTsKKworICAgIC8qKgorICAgICAqIEZyb250ZW5kcyBhcmUgYXNzaWduZWQgd2l0aCB0aGUgc2FtZSBleGNsdXNpdmVHcm91cElkIGlmIHRoZXkgY2FuJ3QKKyAgICAgKiBmdW5jdGlvbiBhdCBzYW1lIHRpbWUuIEZvciBpbnN0YW5jZSwgdGhleSBzaGFyZSBzYW1lIGhhcmR3YXJlIG1vZHVsZS4KKyAgICAgKi8KKyAgICBpbnQgZXhjbHVzaXZlR3JvdXBJZDsKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiBzdXBwb3J0ZWQgc3RhdHVzIHR5cGVzIHdoaWNoIGNsaWVudCBjYW4gaW5xdWlyeQorICAgICAqLworICAgIGludFtdIHN0YXR1c0NhcHM7CisKKyAgICAvKioKKyAgICAgKiBGcm9udGVuZCBDYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzIGNhcHM7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9tYWluX3R1bmVyc2VydmljZS5jcHAgYi9zZXJ2aWNlcy90dW5lci9tYWluX3R1bmVyc2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlN2E5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL21haW5fdHVuZXJzZXJ2aWNlLmNwcApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorCisjaW5jbHVkZSAiVHVuZXJTZXJ2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhcioqIGFyZ3YpIHsKKyAgICBBTE9HRCgiVHVuZXIgc2VydmljZSBzdGFydGluZyIpOworCisgICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS50dW5lciIpOworICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIEFMT0dEKCJTZXJ2aWNlTWFuYWdlcjogJXAiLCBzbS5nZXQoKSk7CisKKyAgICBUdW5lclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL21lZGlhdHVuZXIucmMgYi9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzQ3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjCkBAIC0wLDAgKzEsNiBAQAorc2VydmljZSBtZWRpYS50dW5lciAvc3lzdGVtL2Jpbi9tZWRpYXR1bmVyCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWEKKyAgICBncm91cCBtZWRpYQorICAgIGlvcHJpbyBydCA0CisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoIEhpZ2hQZXJmb3JtYW5jZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK